1 * MATRIX - AFFINE TRANSFORM SUPPORT PACKAGE
9 * 0.1 - INITIAL REVISION (22.12.2007
14 * THIS LIBRARY PROVIDES AFFINE TRANSFORMATION ROUTINES TO
15 * PLOTTING ROUTINES AND OTHER SOFTWARE.
18 * DATA REPRESENTATION:
21 * MATRIX FORMAT: | A11 A12 |
25 * A11-A22 ARE SINGLE PRECISION FLOAT VALUES COMPLIANT TO THE
26 * HONEYWELL MATHEMATICAL LIBARAY. EVERY VALUE USES TWO
27 * 16 BIT MACHINE WORDS.
28 * IF A MATRIX IS USED AS A DAC ARGUMENT, A POINTER TO THE FIRST
29 * ELEMENT, A11, HAS TO BE USED.
32 * VECTOR FORMAT: | A1 |
36 * A1 AND A2 ARE SIGNED INTEGER VALUES. EVERY VALUE USES ONE
37 * 16 BIT MACHINE WORD.
38 * IF A VECTOR IS USED AS A DAC ARGUMENT, A POINTER TO THE FIRST
39 * ELEMENT, A1, HAS TO BE USED.
42 * AFFINE TRANSFORM FORMAT:
44 * AN AFFINE TRANSFORM CONSISTS OF A MATRIX FOR ROTATING AND SCALING
45 * AND A VECTOR VOR RELOCATION OF THE RESULT.
46 * A VECTOR IS TRANSFORMED BY FIRST MULTIPLYING THE MATRIX WITH IT
47 * AND THEN ADDING THE RELOCATION VECTOR:
49 * | A11 A12 | | VI1 | | VT1 |
50 * VO = MT * VI + VT = | | * | | + | |
51 * | A21 A22 | | VI2 | | VT2 |
53 * | VI1*A11 + VI2*A12 + VT1 |
55 * | VI1*A21 + VI2*A22 + VT2 |
57 * MT AND VT ARE THE TRANSFORMATION MATRIX AND VECTOR, VI THE INPUT
58 * VECTOR, VO THE RESULT VECTOR.
60 * AN AFFINE TRANSFORM IS STORED AS A CONCATENATION OF A MATRIX AND
61 * A VECTOR. HERE IS THE MEMORY LAYOUT:
74 * FOR EVERY TRANSFORMATION, '12 WORDS HAVE TO BE RESERVED.
75 * IN AN APPLICATION, A TRANFORMATION VARIABLE COULD BE
82 *********************************************************************************
86 * M$INIT: INITIALISE MATRIX TO IDENTITY
88 * THE MATRIX ARGUMENT IS SET TO
94 * WICH RESULTS TO THE IDENTITY TRANSFORMATION.
97 * DAC MATRIX POINTER TO A MATRIX
101 * M$MUL: MATRIX MULTIPLICATION
104 * DAC TARGET POINTER TO TARGET MATRIX
105 * DAC MATRIX1 POINTER TO LEFT MATRIX
106 * DAC MATRIX2 POINTER TO RIGHT MATRIX
107 * DAC 0 FOR FORTRAN IV COMPATIBILITY
111 * M$APLI: APPLY MATRIX TO VECTOR
113 * THIS ROUTINE CONVERTS THE VECTOR ELEMENTS TO FLOATING POINT VALUES,
114 * APPLIES THE TRANSFORMATION TO THEM AND ROUNDS THE RESULTS BACK TO
115 * INTEGER VALUES. THEN IT SAVES THE NEW VECTOR IN THE PLACE OF THE
119 * DAC MATRIX MATRIX TO APPLY
120 * DAC VECTOR VECTOR TO TRANSFORM
121 * DAC 0 FOR FORTRAN IV COMPATIBILITY
124 * M$APII: APPLY MATRIX TO PAIR OF INTEGERS AS VECTOR
126 * THIS ROUTINE USES TWO DISTINCT INTEGER POINTERS INSTEAD OF ONE VECTOR
127 * POINTER. THE REST OF THE BEHAVIOR IS EXACTLY LIKE M$APL.
130 * DAC MATRIX MATRIX TO APPLY
131 * DAC X X COORDINATE OF ARGUMENT VECTOR
132 * DAC Y Y COORDINATE OF ARGUMENT VECTOR
135 * M$ROT: ROTATE MATRIX
137 * THIS ROUTINE TAKES A MATRIX AND ADDS A ROTATION TO IT.
138 * INTERNALLY, THE ROUTINE CREATES A ROTATION MATRIX AND THEN
139 * MULTIPLIES IT WITH THE ARGUMENT MATRIX. THE ROTATION IS SPECIFIED
140 * COUNTERCLOCKWISE FORWARD, ANGLE IN RADIANT.
141 * THE ANGLE ARGUMENT IS A SINGLE PRECISION FLOATING POINT NUMER
142 * TAKING TWO WORDS TO STORE.
145 * DAC MATRIX MATRIX TO MODIFY
146 * DAC ANGLE RADIANT ANGLE
149 * M$SCLE: SCALE MATRIX
151 * THIS ROUTINE WORKS SIMILAR TO M$ROT BUT SCALES THE ARGUMENT MATRIX.
152 * THE SCALE FACTOR IS A FLOATING POINT NUMBER. LIKE THE ROTATION ANGLE.
155 * DAC MATRIX MATRIX TO MODIFY
156 * DAC SCALE SCALE FACTOR
159 ********************************************************************************
161 **** EXPORTED SYMBOLS
163 SUBR MATRIX,INIT JUST A FANCY LABEL
164 SUBR M$INIT,INIT INITIALISE MATRIX
165 SUBR M$MUL,MUL MATRIX MULTIPLICATION
166 SUBR M$APLI,APLI APPLY MATRIX TO INTEGER VECTOR
167 SUBR M$APII,APII APPLY MATRIX TO PAIR OF INTEGERS
168 SUBR M$ROT,ROT ADD ROTATION TO MATRIX
169 SUBR M$SCLE,SCLE SCALE MATRIX
171 SUBR A$INIT,AFIN INITIALISE AFFINE TRANSFORMATION
174 ********************************************************************************
177 REL RELOCATEABLE MODE
180 ********************************************************************************
183 **** INITIALIZE AFFINE TRANSFORMATION
187 STA AFI1 STORE ARGUMENT POINTER
188 LDX AFIN LOAD INTO INDEX REGISTER, TOO
189 IRS AFIN TALLY RETURN ADDRESS
195 STA 8,1 CLEAR FIRST VECTOR ELEMENT
196 STA 9,1 CLEAR SECOND VECTOR ELEMENT
198 JMP* AFIN RETURN TO CALLER
201 ********************************************************************************
204 **** INITIALIZE MATRIX
206 * THIS ROUTINE SHOULD BE IMPROVED BY SUPPLYING
207 * A FLOATING POINT 1.0 CONSTANT!
209 ****************************************
212 LDX* INIT LOAD INDEX REGISTER WITH ADDRESS OF MATRIX
213 LDA* INIT LOAD MATRIX ADDRESS
214 STA IM11 STORE POINTER TO FIRST ELEMENT (A11)
215 ADD =6 IM12,IM21 ARE NOT TO BE INITIALISED WITH FP DATA
216 STA IM22 STORE POINTER TO FOURTH ELEMENT (A22)
217 IRS INIT CORRECT RETURN ADDRESS
224 CALL FLOAT GENERATE FLOATING POINT 1.0
225 DAC ONE CONSTANT INTEGER 1
226 CALL H$22 STORE FLOATING POINT
234 ********************************************************************************
237 **** MATRIX MULTIPLICATION
241 * | a11 a12 | | b11 b12 |
243 * | a21 a22 | | b21 b22 |
245 * | (a11*b11) (a21*b12) |
247 * | (a12*b21) (a22*b22) |
255 ****************************************
295 * a11 a12 b11 b12 a11*b11 a21*b12
296 * a21 a22 b21 b22 a12*b21 a22*b22
330 ********************************************************************************
335 SCLE DAC ** SCALE MATRIX
338 LDA* SCLE GET MATRIX BASE ADDRESS
348 IRS SCLE TALLY RETURN ADDRESS
367 ********************************************************************************
372 * THIS ROUTINE IS NOT YET FINISHED!
374 ****************************************
377 IRS ROT TALLY RETURN ADDRESS
381 ********************************************************************************
384 **** APPLY MATRIX TO PAIR OF INTEGERS
386 * SETS UP MATRIX POINTERS AND VECTOR POINTERS.
387 * THEN IT CALLS APL, THE REAL WORKING ROUTINE.
394 * DAC 0 DON'T FORGET!
396 ****************************************
419 JST APL CALL REAL ROUTINE
422 ********************************************************************************
425 **** APPLY MATRIX TO VECTOR
427 * SETS UP MATRIX POINTERS AND VECTOR POINTERS. THEN IT CALLS APL,
428 * THE REAL WORKING ROUTINE.
434 * DAC 0 DON'T FORGET!
436 ****************************************
458 JST APL CALL INTERNAL ROUTINE
462 ********************************************************************************
465 **** INTERNAL ROUTINE OF M$APL AND M$APII.
467 * ALL DATA IS SET UP BY THE BOTH USER ROUTINES ABOVE.
469 ****************************************
473 CALL FLOAT LOAD SINGLE PRECISION FLOAT FROM 1-WORD INTEGER
475 CALL M$22 MULTIPLY FLOAT*FLOAT
477 CALL H$22 STORE FLOAT
485 JST RND ROUND AND CONVERT TO INTEGER
486 STA PA21 STORE NEW X VALUE INTO TEMPORARY LOCATION
501 JST RND NOW INTEGER IN AC
502 STA* YP1 STORE NEW Y VALUE
506 JMP* APL RETURN TO CALLER.
509 ********************************************************************************
512 **** ROUND FLOAT TO INTEGER ROUTINE
514 * THERE IS NO CORRECTLY WORKING ROUNDING ROUTINE IN THE LIBRARY.
515 * SO THIS IS A WORKAROUND. ADDS 0.5 TO THE VALUE AND USES ONE
516 * ONE OF THE TRUNCATE AND CONVERT ROUTINES.
517 * THE ARGUMENT IS IN REGISTERS A/B, THE RESULT IS PUT INTO A.
519 ****************************************
524 CALL C$21 TRUNCATE TO INTEGER
529 ********************************************************************************
535 HLF OCT '040100 CONSTANT 0.5
539 ********************************************************************************
543 TMP BSS '10 SOME SPACE
546 ********************************************************************************
554 ********************************************************************************