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 ********************************************************************************
370 **** ADD ROTATION TO MATRIX
375 * | M11 M12 | | COS(X) -SIN(X)|
377 * | M21 M22 | | SIN( X) COS(X)|
379 * | M11*COS(X)+M12*SIN(X) M12*COS(X)-M11*SIN(X) |
381 * | M21*COS(X)+M22*SIN(X) M22*COS(X)-M21*SIN(X) |
387 * DAC 0 DON'T FORGET!
389 ****************************************
393 LDA* ROT GET MATRIX POINTER
394 STA R111 M11, FIRST COPY
395 STA R211 M11, SECOND COPY
412 CALL SINX1 FLOATING POINT SINE
413 RA1 DAC ** POINTER TO ANGLE
416 CALL H$22 SAVE TO TMP1
420 CALL H$22 STORE TO TMP3
422 CALL COSX1 FLOATING POINT COSINE
423 RA2 DAC ** POINTER TO ANGLE
424 CALL H$22 SAVE TO TMP2
430 CALL H$22 SAVE NEW M11 TO TMP3
437 CALL H$22 STORE TO TMP4
439 CALL L$22 LOAD COSINE
444 CALL H$22 SAVE TO NEW M12
446 CALL L$22 LOAD NEW M11 FROM TMP3
447 CALL H$22 AND SAVE TO NEW M11
454 CALL H$22 STORE TO TMP3
456 CALL H$22 LOAD COSINE
462 CALL H$22 SAVE NEW M11 TO TMP3
469 CALL H$22 STORE TO TMP4
471 CALL L$22 LOAD COSINE
476 CALL H$22 SAVE TO NEW M12
478 CALL L$22 LOAD NEW M11 FROM TMP3
479 CALL H$22 AND SAVE TO NEW M11
486 ********************************************************************************
489 **** APPLY MATRIX TO PAIR OF INTEGERS
491 * SETS UP MATRIX POINTERS AND VECTOR POINTERS.
492 * THEN IT CALLS APL, THE REAL WORKING ROUTINE.
499 * DAC 0 DON'T FORGET!
501 ****************************************
524 JST APL CALL REAL ROUTINE
527 ********************************************************************************
530 **** APPLY MATRIX TO VECTOR
532 * SETS UP MATRIX POINTERS AND VECTOR POINTERS. THEN IT CALLS APL,
533 * THE REAL WORKING ROUTINE.
539 * DAC 0 DON'T FORGET!
541 ****************************************
563 JST APL CALL INTERNAL ROUTINE
567 ********************************************************************************
570 **** INTERNAL ROUTINE OF M$APL AND M$APII.
572 * ALL DATA IS SET UP BY THE BOTH USER ROUTINES ABOVE.
574 ****************************************
578 CALL FLOAT LOAD SINGLE PRECISION FLOAT FROM 1-WORD INTEGER
580 CALL M$22 MULTIPLY FLOAT*FLOAT
582 CALL H$22 STORE FLOAT
590 JST RND ROUND AND CONVERT TO INTEGER
591 STA PA21 STORE NEW X VALUE INTO TEMPORARY LOCATION
606 JST RND NOW INTEGER IN AC
607 STA* YP1 STORE NEW Y VALUE
611 JMP* APL RETURN TO CALLER.
614 ********************************************************************************
617 **** ROUND FLOAT TO INTEGER ROUTINE
619 * THERE IS NO CORRECTLY WORKING ROUNDING ROUTINE IN THE LIBRARY.
620 * SO THIS IS A WORKAROUND. ADDS 0.5 TO THE VALUE AND USES ONE
621 * ONE OF THE TRUNCATE AND CONVERT ROUTINES.
622 * THE ARGUMENT IS IN REGISTERS A/B, THE RESULT IS PUT INTO A.
624 ****************************************
629 CALL C$21 TRUNCATE TO INTEGER
634 ********************************************************************************
640 HLF OCT '040100 CONSTANT 0.5
644 ********************************************************************************
648 TMP1 BSS '2 TEMPORARY 2-WORD VARIABLE
654 ********************************************************************************
662 ********************************************************************************