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
147 * DAC 0 FOR FORTRAN IV COMPATIBILITY
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
157 * DAC 0 FOR FORTRAN IV COMPATIBILITY
160 ********************************************************************************
162 **** EXPORTED SYMBOLS
164 SUBR MATRIX,INIT JUST A FANCY LABEL
165 SUBR M$INIT,INIT INITIALISE MATRIX
166 SUBR M$MUL,MUL MATRIX MULTIPLICATION
167 SUBR M$APLI,APLI APPLY MATRIX TO INTEGER VECTOR
168 SUBR M$APII,APII APPLY MATRIX TO PAIR OF INTEGERS
169 SUBR M$ROT,ROT ADD ROTATION TO MATRIX
170 SUBR M$SCLE,SCLE SCALE MATRIX
172 SUBR A$INIT,AFIN INITIALISE AFFINE TRANSFORMATION
175 ********************************************************************************
178 REL RELOCATEABLE MODE
181 ********************************************************************************
184 **** INITIALIZE AFFINE TRANSFORMATION
188 STA AFI1 STORE ARGUMENT POINTER
189 LDX AFIN LOAD INTO INDEX REGISTER, TOO
190 IRS AFIN TALLY RETURN ADDRESS
196 STA 8,1 CLEAR FIRST VECTOR ELEMENT
197 STA 9,1 CLEAR SECOND VECTOR ELEMENT
199 JMP* AFIN RETURN TO CALLER
202 ********************************************************************************
205 **** INITIALIZE MATRIX
207 * THIS ROUTINE SHOULD BE IMPROVED BY SUPPLYING
208 * A FLOATING POINT 1.0 CONSTANT!
210 ****************************************
213 LDX* INIT LOAD INDEX REGISTER WITH ADDRESS OF MATRIX
214 LDA* INIT LOAD MATRIX ADDRESS
215 STA IM11 STORE POINTER TO FIRST ELEMENT (A11)
216 ADD =6 IM12,IM21 ARE NOT TO BE INITIALISED WITH FP DATA
217 STA IM22 STORE POINTER TO FOURTH ELEMENT (A22)
218 IRS INIT CORRECT RETURN ADDRESS
225 CALL FLOAT GENERATE FLOATING POINT 1.0
226 DAC ONE CONSTANT INTEGER 1
227 CALL H$22 STORE FLOATING POINT
235 ********************************************************************************
238 **** MATRIX MULTIPLICATION
242 * | a11 a12 | | b11 b12 |
244 * | a21 a22 | | b21 b22 |
246 * | (a11*b11) (a21*b12) |
248 * | (a12*b21) (a22*b22) |
256 ****************************************
296 * a11 a12 b11 b12 a11*b11 a21*b12
297 * a21 a22 b21 b22 a12*b21 a22*b22
331 ********************************************************************************
336 SCLE DAC ** SCALE MATRIX
339 LDA* SCLE GET MATRIX BASE ADDRESS
349 IRS SCLE TALLY RETURN ADDRESS
369 ********************************************************************************
372 **** ADD ROTATION TO MATRIX
377 * | M11 M12 | | COS(X) -SIN(X)|
379 * | M21 M22 | | SIN( X) COS(X)|
381 * | M11*COS(X)+M12*SIN(X) M12*COS(X)-M11*SIN(X) |
383 * | M21*COS(X)+M22*SIN(X) M22*COS(X)-M21*SIN(X) |
389 * DAC 0 DON'T FORGET!
391 ****************************************
395 LDA* ROT GET MATRIX POINTER
396 STA R111 M11, FIRST COPY
397 STA R211 M11, SECOND COPY
398 STA R311 M11, THIRD COPY
422 CALL SIN FLOATING POINT SINE
423 RA1 DAC ** POINTER TO ANGLE
424 CALL H$22 SAVE TO TMP1
430 CALL H$22 STORE TO TMP3
433 *************************************
435 CALL COS FLOATING POINT COSINE
436 RA2 DAC ** POINTER TO ANGLE
437 CALL H$22 SAVE TO TMP2
443 CALL H$22 SAVE NEW M11 TO TMP3
449 * M12 = M12*COS(X)-M11*SIN(X)
456 CALL H$22 STORE TO TMP4
458 CALL L$22 LOAD COSINE
463 CALL S$22 SUBSTRACT !!
466 CALL H$22 SAVE TO NEW M12
469 CALL L$22 LOAD NEW M11 FROM TMP3
471 CALL H$22 AND SAVE TO NEW M11
475 * ******************************************
479 * M21*COS(X)+M22*SIN(X)
490 CALL H$22 STORE TO TMP3
492 CALL L$22 LOAD COSINE
498 CALL H$22 SAVE NEW M21 TO TMP3
503 * M22*COS(X)-M21*SIN(X)
511 CALL H$22 STORE TO TMP4
513 CALL L$22 LOAD COSINE
519 CALL H$22 SAVE TO NEW M22
521 CALL L$22 LOAD NEW M21 FROM TMP3
523 CALL H$22 AND SAVE TO NEW M21
531 ********************************************************************************
534 **** APPLY MATRIX TO PAIR OF INTEGERS
536 * SETS UP MATRIX POINTERS AND VECTOR POINTERS.
537 * THEN IT CALLS APL, THE REAL WORKING ROUTINE.
544 * DAC 0 DON'T FORGET!
546 ****************************************
550 LDA* APII POINTER TO MATRIX
558 IRS APII JUMP TO NEXT ARGUMENT (X)
560 LDA* APII LOAD X VALUE
561 STA XP1 STORE TO X-POINTER
562 STA XP2 STORE TO X-POINTER
563 IRS APII JUMP TO NEXT ARGUMENT (Y)
564 LDA* APII LOAD Y VALUE
565 STA YP1 STORE TO Y-POINTER
566 STA YP2 STORE TO Y-POINTER
567 IRS APII CORRECT RETURN ADDRESS
568 IRS APII FOR FORTRANIV COMPATIBILITY
569 JST APL CALL REAL ROUTINE
572 ********************************************************************************
575 **** APPLY MATRIX TO VECTOR
577 * SETS UP MATRIX POINTERS AND VECTOR POINTERS. THEN IT CALLS APL,
578 * THE REAL WORKING ROUTINE.
584 * DAC 0 DON'T FORGET!
586 ****************************************
608 JST APL CALL INTERNAL ROUTINE
612 ********************************************************************************
615 **** INTERNAL ROUTINE OF M$APL AND M$APII.
617 * ALL DATA IS SET UP BY THE BOTH USER ROUTINES ABOVE.
619 ****************************************
623 CALL FLOAT LOAD SINGLE PRECISION FLOAT FROM 1-WORD INTEGER
625 CALL M$22 MULTIPLY FLOAT*FLOAT
627 CALL H$22 STORE FLOAT
635 JST RND ROUND AND CONVERT TO INTEGER
636 STA PA21 STORE NEW X VALUE INTO TEMPORARY LOCATION
651 JST RND NOW INTEGER IN AC
652 STA* YP1 STORE NEW Y VALUE
656 JMP* APL RETURN TO CALLER.
659 ********************************************************************************
662 **** ROUND FLOAT TO INTEGER ROUTINE
664 * THERE IS NO CORRECTLY WORKING ROUNDING ROUTINE IN THE LIBRARY.
665 * SO THIS IS A WORKAROUND. ADDS 0.5 TO THE VALUE AND USES ONE
666 * ONE OF THE TRUNCATE AND CONVERT ROUTINES.
667 * THE ARGUMENT IS IN REGISTERS A/B, THE RESULT IS PUT INTO A.
669 ****************************************
674 CALL C$21 TRUNCATE TO INTEGER
679 ********************************************************************************
685 HLF OCT '040100 CONSTANT 0.5
689 ********************************************************************************
693 TMP1 BSS '2 TEMPORARY 2-WORD VARIABLE
699 ********************************************************************************
707 ********************************************************************************