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 * WHICH 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 TO THE LOCATION
116 * DESIGNATED BY THE TARGET ADDRESS. SOURCE AND TARGET MAY BE THE SAME,
117 * THE SOURCE'S CONTENTS ARE NOT ALTERED.
120 * DAC MATRIX MATRIX TO APPLY
121 * DAC TARGET POINTER TO TARGET VECTOR
122 * DAC SOURCE VECTOR TO TRANSFORM
123 * DAC 0 FOR FORTRAN IV COMPATIBILITY
126 * M$APII: APPLY MATRIX TO PAIR OF INTEGERS AS VECTOR
128 * THIS ROUTINE USES TWO DISTINCT INTEGER POINTERS TO DESCRIBE A POINT.
129 * THE REST OF THE BEHAVIOR IS EXACTLY LIKE M$APL.
132 * DAC MATRIX MATRIX TO APPLY
133 * DAC XO X COORDINATE OF RESULT VECTOR
134 * DAC XO Y COORDINATE OF RESULT VECTOR
135 * DAC XI X COORDINATE OF ARGUMENT VECTOR
136 * DAC YI Y COORDINATE OF ARGUMENT VECTOR
137 * DAC 0 FOR FORTRAN IV COMPATIBILITY
140 * M$ROT: ROTATE MATRIX
142 * THIS ROUTINE TAKES A MATRIX AND ADDS A ROTATION TO IT.
143 * INTERNALLY, THE ROUTINE CREATES A ROTATION MATRIX AND THEN
144 * MULTIPLIES IT WITH THE ARGUMENT MATRIX. THE ROTATION IS SPECIFIED
145 * COUNTERCLOCKWISE FORWARD, ANGLE IN RADIANT.
146 * THE ANGLE ARGUMENT IS A SINGLE PRECISION FLOATING POINT NUMER
147 * TAKING TWO WORDS TO STORE.
150 * DAC MATRIX MATRIX TO MODIFY
151 * DAC ANGLE RADIANT ANGLE
152 * DAC 0 FOR FORTRAN IV COMPATIBILITY
155 * M$ROTI: ROTATE MATRIX
157 * WORKS LIKE M$ROT, BUT TAKES AN INTEGER DEGREE VALUE AS ARGUMENT.
160 * DAC MATRIX MATRIX TO MODIFY
161 * DAC ANGLE DEGREE ANGLE
162 * DAC 0 FOR FORTRAN IV COMPATIBILITY
165 * M$SCLE: SCALE MATRIX
167 * THIS ROUTINE WORKS SIMILAR TO M$ROT BUT SCALES THE ARGUMENT MATRIX.
168 * THE SCALE FACTOR IS A FLOATING POINT NUMBER. LIKE THE ROTATION ANGLE.
171 * DAC MATRIX MATRIX TO MODIFY
172 * DAC SCALE SCALE FACTOR
173 * DAC 0 FOR FORTRAN IV COMPATIBILITY
176 *********************************************************************************
179 * T$INIT: INITIALISE AFFINE TRANSFORM
182 * DAC TRANS POINTER TO AFFINE TRANSFORMATION (SEE ABOVE)
185 * T$SCLE: SCALE AFFINE TRANSFORMATION
187 * THIS SCALES THE MATRIX OF THE AFFINE TRANSFORMATION BY FACTOR SCALE.
188 * CALLS M$SCLE INTERNALLY.
191 * DAC TRANS TRANSFORMATION TO MODIFY
192 * DAC SCALE SCALE FACTOR
193 * DAC 0 FOR FORTRAN IV COMPATIBILITY
196 * T$TRAN: ADD RELOCATION TO AFFINE TRANSFORMATION
198 * THE OFFSET VECTOR IS FIRST PROCESSED BY THE TRANSFORMATION.
199 * THEN IT IS ADDED TO THE TRANSFORMATION'S TRANSLATION VECTOR.
202 * DAC TRANS TRANSFORMATION TO MODIFY
205 * DAC 0 FOR FORTRAN IV COMPATIBILITY
208 * T$ROT: ADD ROTATION TO AFFINE TRANSFORMATION
210 * ADDS ROTATION TO THE MATRIX OF THE AFFINE TRANSFORMATION.
211 * CALLS M$$ROT INTERNALLY.
214 * DAC TRANS TRANSFORMATION TO MODIFY
215 * DAC ANGLE ANGLE LIKE FOR M$ROT
216 * DAC 0 FOR FORTRAN IV COMPATIBILITY
219 * T$ROTI: ADD ROTATION TO AFFINE TRANSFORMATION
220 * USES AN INTEGER ARGUMENT INSTEAD OF FLOATING POINT RADIANT.
222 * ADDS ROTATION TO THE MATRIX OF THE AFFINE TRANSFORMATION.
223 * CALLS M$$ROTI INTERNALLY.
226 * DAC TRANS TRANSFORMATION TO MODIFY
227 * DAC ANGLE ANGLE LIKE FOR M$ROTI
228 * DAC 0 FOR FORTRAN IV COMPATIBILITY
231 * T$APII: APPLY AFFINE TRANSFORM TO PAIR OF INTEGERS AS VECTOR
233 * WORKS LIKE M$APII WHICH IS USED INTERNALLY.
236 * DAC TRANS TRANSFORMATION TO USE
237 * DAC XO X COORDINATE OF RESULT VECTOR
238 * DAC XO Y COORDINATE OF RESULT VECTOR
239 * DAC XI X COORDINATE OF ARGUMENT VECTOR
240 * DAC YI Y COORDINATE OF ARGUMENT VECTOR
241 * DAC 0 FOR FORTRAN IV COMPATIBILITY
244 * T$APLI: APPLY AFFINE TRANSFORM TO VECTOR
246 * WORKS LIKE M$APL WHICH IS USED INTERNALLY.
250 * DAC TARGET POINTER TO TARGET VECTOR
251 * DAC SOURCE POINTER TO INPUT VECTOR
252 * DAC 0 FOR FORTRAN IV COMPATIBILITY
256 ********************************************************************************
258 **** EXPORTED SYMBOLS
260 SUBR MATRIX,INIT JUST A FANCY LABEL
261 SUBR M$INIT,INIT INITIALISE MATRIX
262 SUBR M$MUL,MUL MATRIX MULTIPLICATION
263 SUBR M$APLI,APLI APPLY MATRIX TO INTEGER VECTOR
264 SUBR M$APII,APII APPLY MATRIX TO PAIR OF INTEGERS
265 SUBR M$ROT,ROT ADD ROTATION TO MATRIX
266 SUBR M$ROTI,ROTI ADD ROTATION TO MATRIX
267 SUBR M$SCLE,SCLE SCALE MATRIX
268 SUBR M$SCLI,SCLI SCALE MATRIX (INTEGER PERCENT)
270 SUBR T$INIT,AFIN INITIALISE AFFINE TRANSFORMATION
271 SUBR T$APLI,TPLI APPLY AFFINE TRANSFORM TO INTEGER VECTOR
272 SUBR T$APII,TPII APPLY AFFINE TRANSFORM TO PAIR OF INTEGERS
273 SUBR T$ROT,ROT ADD ROTATION TO AFFINE TRANSFORMATION
274 SUBR T$ROTI,ROTI ADD ROTATION TO AFFINE TRANSFORMATION
275 SUBR T$SCLE,SCLE SCALE AFFINE TRANSFORMATION
276 SUBR T$SCLI,SCLI SCALE AFFINE TRANSFORMATION (INTEGER PERCENT)
277 SUBR T$TRAN,TRAN ADD TRANSLATION TO AFFINE TRANSFORMATION
280 ********************************************************************************
283 REL RELOCATEABLE MODE
286 ********************************************************************************
289 *** T$TRAN - TRANSLATE
295 LDA* TRAN TRANSFORMATION POINTER
309 IRS TRAN FOR FORTRAN IV
313 DAC TMP3 STORE NEW X VALUE IN TMP3
314 DAC TMP4 STORE NEW Y VALUE IN TMP4
317 DAC 0 FOR FORTRAN IV COMPATIBILITY
330 ********************************************************************************
333 **** T$APLI - APPLY AFFINE TRANSFORMATION TO INTEGER VECTOR
335 * USED VARIABLES: ((TMP1) XOP,YOP,XP1,YP1,XP2,YP2),VECP
339 LDA* TPLI LOAD POINTER TO TRANSFORMATION
340 STA MPT STORE TO MATRIX POINTER
341 ADD =8 FORWARD TO VECTOR ADDRESS IN TRANSFORMATION
342 STA VECP VECTOR ADDRESS
345 LDA* TPLI POINTER TO RESULT VECTOR
349 LDA* TPLI POINTER TO INPUT VECTOR
355 JST APLI APPLY MATRIX
360 LDA* IOV PERFORM VECTOR ADDITION
372 ********************************************************************************
375 **** T$APII - APPLY AFFINE TRANSFORMATION TO PAIR OF INTEGERS
377 * USED VARIABLES: ((TMP1) XOP,YOP,XP1,YP1,XP2,YP2),VECP
380 ****************************************
384 LDA* TPII LOAD POINTER TO TRANSFORMATION
385 STA IMPT STORE TO MATRIX POINTER
386 ADD =8 FORWARD TO VECTOR ADDRESS IN TRANSFORMATION
387 STA VECP VECTOR ADDRESS
390 LDA* TPII POINTER TO RESULT X
394 LDA* TPII POINTER TO RESULT Y
398 LDA* TPII POINTER TO INPUT X
402 LDA* TPII POINTER TO INPUT Y
408 JST APII APPLY MATRIX
416 LDA* VECP PERFORM THE ADDITION
427 ********************************************************************************
430 **** INITIALIZE AFFINE TRANSFORMATION
434 STA AFI1 STORE ARGUMENT POINTER
435 LDX AFIN LOAD INTO INDEX REGISTER, TOO
436 IRS AFIN TALLY RETURN ADDRESS
442 STA 8,1 CLEAR FIRST VECTOR ELEMENT
443 STA 9,1 CLEAR SECOND VECTOR ELEMENT
445 JMP* AFIN RETURN TO CALLER
448 ********************************************************************************
451 **** INITIALIZE MATRIX
453 * THIS ROUTINE SHOULD BE IMPROVED BY SUPPLYING
454 * A FLOATING POINT 1.0 CONSTANT!
456 ****************************************
459 LDX* INIT LOAD INDEX REGISTER WITH ADDRESS OF MATRIX
460 IRS INIT CORRECT RETURN ADDRESS
463 STA 1,1 A11, LOWER BITS
468 STA 7,1 A22, LOWER BITS
470 LDA ONEF FLOATING POINT 1.0 CONSTANT
471 STA 0,1 A11, UPPER BITS
472 STA 6,1 A22, UPPER BITS
477 ********************************************************************************
480 **** MATRIX MULTIPLICATION
484 * | a11 a12 | | b11 b12 |
486 * | a21 a22 | | b21 b22 |
488 * | (a11*b11) (a21*b12) |
490 * | (a12*b21) (a22*b22) |
498 ****************************************
538 * a11 a12 b11 b12 a11*b11 a21*b12
539 * a21 a22 b21 b22 a12*b21 a22*b22
573 ********************************************************************************
578 SCLE DAC ** SCALE MATRIX
580 LDA* SCLE GET MATRIX BASE ADDRESS
598 IRS SCLE TALLY RETURN ADDRESS
632 ********************************************************************************
635 **** ADD ROTATION TO MATRIX
640 * | M11 M12 | | COS(X) -SIN(X)|
642 * | M21 M22 | | SIN( X) COS(X)|
644 * | M11*COS(X)+M12*SIN(X) M12*COS(X)-M11*SIN(X) |
646 * | M21*COS(X)+M22*SIN(X) M22*COS(X)-M21*SIN(X) |
652 * DAC 0 DON'T FORGET!
654 ****************************************
658 LDA* ROT GET MATRIX POINTER
659 STA R111 M11, FIRST COPY
660 STA R211 M11, SECOND COPY
661 STA R311 M11, THIRD COPY
685 CALL SIN FLOATING POINT SINE
686 RA1 DAC ** POINTER TO ANGLE
687 CALL H$22 SAVE TO TMP1
693 CALL H$22 STORE TO TMP3
696 *************************************
698 CALL COS FLOATING POINT COSINE
699 RA2 DAC ** POINTER TO ANGLE
700 CALL H$22 SAVE TO TMP2
706 CALL H$22 SAVE NEW M11 TO TMP3
712 * M12 = M12*COS(X)-M11*SIN(X)
719 CALL H$22 STORE TO TMP4
721 CALL L$22 LOAD COSINE
726 CALL S$22 SUBSTRACT !!
729 CALL H$22 SAVE TO NEW M12
732 CALL L$22 LOAD NEW M11 FROM TMP3
734 CALL H$22 AND SAVE TO NEW M11
738 * ******************************************
742 * M21*COS(X)+M22*SIN(X)
753 CALL H$22 STORE TO TMP3
755 CALL L$22 LOAD COSINE
761 CALL H$22 SAVE NEW M21 TO TMP3
766 * M22*COS(X)-M21*SIN(X)
774 CALL H$22 STORE TO TMP4
776 CALL L$22 LOAD COSINE
782 CALL H$22 SAVE TO NEW M22
784 CALL L$22 LOAD NEW M21 FROM TMP3
786 CALL H$22 AND SAVE TO NEW M21
794 ********************************************************************************
797 **** APPLY MATRIX TO PAIR OF INTEGERS
799 * SETS UP MATRIX POINTERS AND VECTOR POINTERS.
800 * THEN IT CALLS APL, THE REAL WORKING ROUTINE.
809 * DAC 0 DON'T FORGET!
811 * USED VARIABLES: (TMP1) XOP,YOP,XP1,YP1,XP2,YP2
813 ****************************************
817 LDA* APII POINTER TO MATRIX
825 IRS APII JUMP TO NEXT ARGUMENT (X)
827 LDA* APII LOAD X VALUE
828 STA XOP STORE TO X-POINTER
829 IRS APII JUMP TO NEXT ARGUMENT (Y)
830 LDA* APII LOAD Y VALUE
831 STA YOP STORE TO Y-POINTER
832 IRS APII CORRECT RETURN ADDRESS
834 LDA* APII LOAD X VALUE
835 STA XIP1 STORE TO X-POINTER
836 STA XIP2 STORE TO X-POINTER
837 IRS APII JUMP TO NEXT ARGUMENT (Y)
838 LDA* APII LOAD Y VALUE
839 STA YIP1 STORE TO Y-POINTER
840 STA YIP2 STORE TO Y-POINTER
841 IRS APII CORRECT RETURN ADDRESS
843 IRS APII FOR FORTRANIV COMPATIBILITY
844 JST APL CALL REAL ROUTINE
847 ********************************************************************************
850 **** APPLY MATRIX TO VECTOR
852 * SETS UP MATRIX POINTERS AND VECTOR POINTERS. THEN IT CALLS APL,
853 * THE REAL WORKING ROUTINE.
860 * DAC 0 DON'T FORGET!
862 * USED VARIABLES: (TMP1) XOP,YOP,XP1,YP1,XP2,YP2
864 ****************************************
893 JST APL CALL INTERNAL ROUTINE
897 ********************************************************************************
900 **** INTERNAL ROUTINE OF M$APL AND M$APII.
902 * ALL DATA IS SET UP BY THE BOTH USER ROUTINES ABOVE.
904 * USED VARIABLES: TMP1
906 ****************************************
910 CALL FLOAT LOAD SINGLE PRECISION FLOAT FROM 1-WORD INTEGER
912 CALL M$22 MULTIPLY FLOAT*FLOAT
914 CALL H$22 STORE FLOAT
922 JST RND ROUND AND CONVERT TO INTEGER
923 STA PA21 STORE NEW X VALUE INTO TEMPORARY LOCATION
938 JST RND NOW INTEGER IN AC
939 STA* YOP STORE NEW Y VALUE
944 JMP* APL RETURN TO CALLER.
947 ********************************************************************************
950 **** M$ROTI ROTATE MATRIX, USE INTEGER DEGREE ANGLE
953 LDA* ROTI GET MATRIX POINTER
954 STA MTA STORE TO ARGUMENT TO FINAL ROT
955 IRS ROTI NEXT ARGUMENT: ANGLE
959 JST RAD CONVERT INTEGER TO RADIANT
968 RTMP BSS 2 TEMPORARY VARIABLE
971 ********************************************************************************
974 **** M$SCLI - SCALE MATRIX, USE INTEGER PERCENT VALUE
977 LDA* SCLI GET MATRIX POINTER
978 STA MTSS STORE TO ARGUMENT TO FINAL ROT
979 IRS SCLI NEXT ARGUMENT: PERCENTS
981 LDA* SCLI LOAD PERCENTS
983 CALL FLOAT CONVERT TO FLOAT
985 CALL M$22 MULTIPLY WITH
1000 ********************************************************************************
1003 **** ROUND FLOAT TO INTEGER ROUTINE
1005 * THERE IS NO CORRECTLY WORKING ROUNDING ROUTINE IN THE LIBRARY.
1006 * SO THIS IS A WORKAROUND. ADDS 0.5 TO THE VALUE AND USES ONE
1007 * ONE OF THE TRUNCATE AND CONVERT ROUTINES.
1008 * THE ARGUMENT IS IN REGISTERS A/B, THE RESULT IS PUT INTO A.
1010 ****************************************
1015 CALL C$21 TRUNCATE TO INTEGER
1020 ********************************************************************************
1023 **** RAD - CONVERT ANGLE IN DEGREE TO RADIANT.
1025 * ENTER WITH INTEGER ANGLE IN A
1030 * DAC ANGLE POINTER TO ANGLE
1032 ****************************************
1043 ********************************************************************************
1049 HLF OCT '040100 CONSTANT 0.5
1051 ONEF OCT '040300 CONSTANT 1.0
1053 DEG OCT '036707 CONSTANT PI/180
1055 PERC OCT '036521 CONTANT 0.01
1059 ********************************************************************************
1064 TMP1 BSS '2 TEMPORARY 2-WORD VARIABLE
1068 VAP DAC ** TEMPORARY POINTER TO VECTOR
1069 XOP DAC ** OUTPUT VECTOR X POINTER
1070 YOP DAC ** OUTPUT VECTOR Y POINTER
1071 *VECP DAC ** VECTOR POINTER USED BY T$PII,T$PLI
1072 VECP EQU TMP2 VECTOR POINTER USED BY T$PII,T$PLI
1075 ********************************************************************************
1078 **** END OF THE LINE
1083 ********************************************************************************