X-Git-Url: http://gitweb.hachti.de/?a=blobdiff_plain;f=lib%2Fhachti%2Fsrc%2Fmatrix.asm;h=79202db70cfda21765c874647f29d132b434d348;hb=eabafccaa9119c64c3964f25035a71579de18ddd;hp=812fd23adcc4bfa378baa701728f35ee92f9b496;hpb=6f7368dad80457b5dd8f72bf3cf6cc661e36904b;p=h316.git diff --git a/lib/hachti/src/matrix.asm b/lib/hachti/src/matrix.asm index 812fd23..79202db 100644 --- a/lib/hachti/src/matrix.asm +++ b/lib/hachti/src/matrix.asm @@ -91,7 +91,7 @@ * M= | | * | 0.0 1.0 | * -* WICH RESULTS TO THE IDENTITY TRANSFORMATION. +* WHICH RESULTS TO THE IDENTITY TRANSFORMATION. * * JST M$INIT * DAC MATRIX POINTER TO A MATRIX @@ -112,24 +112,29 @@ * * THIS ROUTINE CONVERTS THE VECTOR ELEMENTS TO FLOATING POINT VALUES, * APPLIES THE TRANSFORMATION TO THEM AND ROUNDS THE RESULTS BACK TO -* INTEGER VALUES. THEN IT SAVES THE NEW VECTOR IN THE PLACE OF THE -* OLD VECTOR. +* INTEGER VALUES. THEN IT SAVES THE NEW VECTOR TO THE LOCATION +* DESIGNATED BY THE TARGET ADDRESS. SOURCE AND TARGET MAY BE THE SAME, +* THE SOURCE'S CONTENTS ARE NOT ALTERED. * * JST M$APLI * DAC MATRIX MATRIX TO APPLY -* DAC VECTOR VECTOR TO TRANSFORM +* DAC TARGET POINTER TO TARGET VECTOR +* DAC SOURCE VECTOR TO TRANSFORM * DAC 0 FOR FORTRAN IV COMPATIBILITY * * * M$APII: APPLY MATRIX TO PAIR OF INTEGERS AS VECTOR * -* THIS ROUTINE USES TWO DISTINCT INTEGER POINTERS INSTEAD OF ONE VECTOR -* POINTER. THE REST OF THE BEHAVIOR IS EXACTLY LIKE M$APL. +* THIS ROUTINE USES TWO DISTINCT INTEGER POINTERS TO DESCRIBE A POINT. +* THE REST OF THE BEHAVIOR IS EXACTLY LIKE M$APL. * -* JST M$APLI +* JST M$APII * DAC MATRIX MATRIX TO APPLY -* DAC X X COORDINATE OF ARGUMENT VECTOR -* DAC Y Y COORDINATE OF ARGUMENT VECTOR +* DAC XO X COORDINATE OF RESULT VECTOR +* DAC XO Y COORDINATE OF RESULT VECTOR +* DAC XI X COORDINATE OF ARGUMENT VECTOR +* DAC YI Y COORDINATE OF ARGUMENT VECTOR +* DAC 0 FOR FORTRAN IV COMPATIBILITY * * * M$ROT: ROTATE MATRIX @@ -146,6 +151,17 @@ * DAC ANGLE RADIANT ANGLE * DAC 0 FOR FORTRAN IV COMPATIBILITY * +* +* M$ROTI: ROTATE MATRIX +* +* WORKS LIKE M$ROT, BUT TAKES AN INTEGER DEGREE VALUE AS ARGUMENT. +* +* JST M$ROTI +* DAC MATRIX MATRIX TO MODIFY +* DAC ANGLE DEGREE ANGLE +* DAC 0 FOR FORTRAN IV COMPATIBILITY +* +* * M$SCLE: SCALE MATRIX * * THIS ROUTINE WORKS SIMILAR TO M$ROT BUT SCALES THE ARGUMENT MATRIX. @@ -156,7 +172,87 @@ * DAC SCALE SCALE FACTOR * DAC 0 FOR FORTRAN IV COMPATIBILITY * -* +* +********************************************************************************* +* +* +* T$INIT: INITIALISE AFFINE TRANSFORM +* +* JST T$INIT +* DAC TRANS POINTER TO AFFINE TRANSFORMATION (SEE ABOVE) +* +* +* T$SCLE: SCALE AFFINE TRANSFORMATION +* +* THIS SCALES THE MATRIX OF THE AFFINE TRANSFORMATION BY FACTOR SCALE. +* CALLS M$SCLE INTERNALLY. +* +* JST T$SCLE +* DAC TRANS TRANSFORMATION TO MODIFY +* DAC SCALE SCALE FACTOR +* DAC 0 FOR FORTRAN IV COMPATIBILITY +* +* +* T$TRAN: ADD RELOCATION TO AFFINE TRANSFORMATION +* +* THE OFFSET VECTOR IS FIRST PROCESSED BY THE TRANSFORMATION. +* THEN IT IS ADDED TO THE TRANSFORMATION'S TRANSLATION VECTOR. +* +* JST T$TRAN +* DAC TRANS TRANSFORMATION TO MODIFY +* DAC XOFF X OFFSET +* DAC YOFF Y OFFSET +* DAC 0 FOR FORTRAN IV COMPATIBILITY +* +* +* T$ROT: ADD ROTATION TO AFFINE TRANSFORMATION +* +* ADDS ROTATION TO THE MATRIX OF THE AFFINE TRANSFORMATION. +* CALLS M$$ROT INTERNALLY. +* +* JST T$ROT +* DAC TRANS TRANSFORMATION TO MODIFY +* DAC ANGLE ANGLE LIKE FOR M$ROT +* DAC 0 FOR FORTRAN IV COMPATIBILITY +* +* +* T$ROTI: ADD ROTATION TO AFFINE TRANSFORMATION +* USES AN INTEGER ARGUMENT INSTEAD OF FLOATING POINT RADIANT. +* +* ADDS ROTATION TO THE MATRIX OF THE AFFINE TRANSFORMATION. +* CALLS M$$ROTI INTERNALLY. +* +* JST T$ROTI +* DAC TRANS TRANSFORMATION TO MODIFY +* DAC ANGLE ANGLE LIKE FOR M$ROTI +* DAC 0 FOR FORTRAN IV COMPATIBILITY +* +* +* T$APII: APPLY AFFINE TRANSFORM TO PAIR OF INTEGERS AS VECTOR +* +* WORKS LIKE M$APII WHICH IS USED INTERNALLY. +* +* JST T$APII +* DAC TRANS TRANSFORMATION TO USE +* DAC XO X COORDINATE OF RESULT VECTOR +* DAC XO Y COORDINATE OF RESULT VECTOR +* DAC XI X COORDINATE OF ARGUMENT VECTOR +* DAC YI Y COORDINATE OF ARGUMENT VECTOR +* DAC 0 FOR FORTRAN IV COMPATIBILITY +* +* +* T$APLI: APPLY AFFINE TRANSFORM TO VECTOR +* +* WORKS LIKE M$APL WHICH IS USED INTERNALLY. +* +* JST T$APLI +* DAC TRANS +* DAC TARGET POINTER TO TARGET VECTOR +* DAC SOURCE POINTER TO INPUT VECTOR +* DAC 0 FOR FORTRAN IV COMPATIBILITY +* +* +* ******************************************************************************** * **** EXPORTED SYMBOLS @@ -167,10 +263,19 @@ SUBR M$APLI,APLI APPLY MATRIX TO INTEGER VECTOR SUBR M$APII,APII APPLY MATRIX TO PAIR OF INTEGERS SUBR M$ROT,ROT ADD ROTATION TO MATRIX + SUBR M$ROTI,ROTI ADD ROTATION TO MATRIX SUBR M$SCLE,SCLE SCALE MATRIX + SUBR M$SCLI,SCLI SCALE MATRIX (INTEGER PERCENT) * - SUBR A$INIT,AFIN INITIALISE AFFINE TRANSFORMATION -* + SUBR T$INIT,AFIN INITIALISE AFFINE TRANSFORMATION + SUBR T$APLI,TPLI APPLY AFFINE TRANSFORM TO INTEGER VECTOR + SUBR T$APII,TPII APPLY AFFINE TRANSFORM TO PAIR OF INTEGERS + SUBR T$ROT,ROT ADD ROTATION TO AFFINE TRANSFORMATION + SUBR T$ROTI,ROTI ADD ROTATION TO AFFINE TRANSFORMATION + SUBR T$SCLE,SCLE SCALE AFFINE TRANSFORMATION + SUBR T$SCLI,SCLI SCALE AFFINE TRANSFORMATION (INTEGER PERCENT) + SUBR T$TRAN,TRAN ADD TRANSLATION TO AFFINE TRANSFORMATION +* * ******************************************************************************** * @@ -179,7 +284,148 @@ * * ******************************************************************************** -* +* +* +*** T$TRAN - TRANSLATE +* +* +* ABS +* ORG '4000 +TRAN DAC ** ENTRY. + LDA* TRAN TRANSFORMATION POINTER + STA TPT + ADD =8 + STA VECP + IRS TRAN +* + LDA* TRAN X OFFSET + STA XOFP + IRS TRAN +* + LDA* TRAN Y OFFSET + STA YOFP + IRS TRAN +* + IRS TRAN FOR FORTRAN IV +* + JST APII FIXME! +TPT DAC ** + DAC TMP3 STORE NEW X VALUE IN TMP3 + DAC TMP4 STORE NEW Y VALUE IN TMP4 +XOFP DAC ** +YOFP DAC ** + DAC 0 FOR FORTRAN IV COMPATIBILITY +* + LDA* VECP + ADD TMP3 + STA* VECP + IRS VECP + LDA* VECP + ADD TMP4 + STA* VECP +* + JMP* TRAN RETURN. +* +* +******************************************************************************** +* +* +**** T$APLI - APPLY AFFINE TRANSFORMATION TO INTEGER VECTOR +* +* USED VARIABLES: ((TMP1) XOP,YOP,XP1,YP1,XP2,YP2),VECP +* +TPLI DAC ** ENTRY. +* + LDA* TPLI LOAD POINTER TO TRANSFORMATION + STA MPT STORE TO MATRIX POINTER + ADD =8 FORWARD TO VECTOR ADDRESS IN TRANSFORMATION + STA VECP VECTOR ADDRESS + IRS TPLI +* + LDA* TPLI POINTER TO RESULT VECTOR + STA IOV + IRS TPLI +* + LDA* TPLI POINTER TO INPUT VECTOR + STA IIV + IRS TPLI +* + IRS TPLI +* + JST APLI APPLY MATRIX +MPT DAC ** +IOV DAC ** +IIV DAC ** +* + LDA* IOV PERFORM VECTOR ADDITION + ADD* VECP + STA* IOV + IRS VECP + IRS IOV + LDA* IOV + ADD* VECP + STA* IOV +* + JMP* TPLI +* +* +******************************************************************************** +* +* +**** T$APII - APPLY AFFINE TRANSFORMATION TO PAIR OF INTEGERS +* +* USED VARIABLES: ((TMP1) XOP,YOP,XP1,YP1,XP2,YP2),VECP +* +* +**************************************** +* +TPII DAC ** ENTRY. +* + LDA* TPII LOAD POINTER TO TRANSFORMATION + STA IMPT STORE TO MATRIX POINTER + ADD =8 FORWARD TO VECTOR ADDRESS IN TRANSFORMATION + STA VECP VECTOR ADDRESS + IRS TPII +* + LDA* TPII POINTER TO RESULT X + STA RXP + IRS TPII +* + LDA* TPII POINTER TO RESULT Y + STA RYP + IRS TPII +* + LDA* TPII POINTER TO INPUT X + STA IXP + IRS TPII +* + LDA* TPII POINTER TO INPUT Y + STA IYP + IRS TPII +* + IRS TPII +* + JST APII APPLY MATRIX +IMPT DAC ** +RXP DAC ** +RYP DAC ** +IXP DAC ** +IYP DAC ** + DAC 0 +* + LDA* VECP PERFORM THE ADDITION + ADD* RXP + STA* RXP + IRS VECP + LDA* VECP + ADD* RYP + STA* RYP +* + JMP* TPII RETURN +* +* +******************************************************************************** +* * **** INITIALIZE AFFINE TRANSFORMATION * @@ -211,24 +457,20 @@ AFI1 DAC ** * INIT DAC ** LDX* INIT LOAD INDEX REGISTER WITH ADDRESS OF MATRIX - LDA* INIT LOAD MATRIX ADDRESS - STA IM11 STORE POINTER TO FIRST ELEMENT (A11) - ADD =6 IM12,IM21 ARE NOT TO BE INITIALISED WITH FP DATA - STA IM22 STORE POINTER TO FOURTH ELEMENT (A22) IRS INIT CORRECT RETURN ADDRESS * CRA INITIALISE + STA 1,1 A11, LOWER BITS STA 2,1 A12 STA 3,1 STA 4,1 A21 - STA 5,1 - CALL FLOAT GENERATE FLOATING POINT 1.0 - DAC ONE CONSTANT INTEGER 1 - CALL H$22 STORE FLOATING POINT -IM11 DEC 0 - CALL H$22 -IM22 DEC 0 -* + STA 5,1 + STA 7,1 A22, LOWER BITS +* + LDA ONEF FLOATING POINT 1.0 CONSTANT + STA 0,1 A11, UPPER BITS + STA 6,1 A22, UPPER BITS +* JMP* INIT RETURN. * * @@ -334,34 +576,55 @@ PC22 DEC 0 **** SCALE MATRIX * SCLE DAC ** SCALE MATRIX - LDX* SCLE * LDA* SCLE GET MATRIX BASE ADDRESS STA SM11 STA TM11 - ADD =6 + ADD =2 + STA SM12 + STA TM12 + ADD =2 + STA SM21 + STA TM21 + ADD =2 STA SM22 STA TM22 IRS SCLE LDA* SCLE - STA SX - STA SY + STA S1 + STA S2 + STA S3 + STA S4 IRS SCLE TALLY RETURN ADDRESS IRS SCLE AGAIN * CALL L$22 -SM11 DAC 0 +SM11 DAC ** CALL M$22 -SX DAC 0 +S1 DAC ** CALL H$22 -TM11 DAC 0 +TM11 DAC ** * CALL L$22 -SM22 DAC 0 +SM12 DAC ** CALL M$22 -SY DAC 0 +S2 DAC ** CALL H$22 -TM22 DAC 0 +TM12 DAC ** +* + CALL L$22 +SM21 DAC ** + CALL M$22 +S3 DAC ** + CALL H$22 +TM21 DAC ** +* + CALL L$22 +SM22 DAC ** + CALL M$22 +S4 DAC ** + CALL H$22 +TM22 DAC ** * JMP* SCLE * @@ -539,10 +802,14 @@ R412 DAC ** * CALL: * JST M$APII * DAC MATRIX -* DAC X -* DAC Y +* DAC XO +* DAC YO +* DAC XI +* DAC YI * DAC 0 DON'T FORGET! * +* USED VARIABLES: (TMP1) XOP,YOP,XP1,YP1,XP2,YP2 +* **************************************** * APII DAC ** @@ -558,13 +825,21 @@ APII DAC ** IRS APII JUMP TO NEXT ARGUMENT (X) * LDA* APII LOAD X VALUE - STA XP1 STORE TO X-POINTER - STA XP2 STORE TO X-POINTER + STA XOP STORE TO X-POINTER + IRS APII JUMP TO NEXT ARGUMENT (Y) + LDA* APII LOAD Y VALUE + STA YOP STORE TO Y-POINTER + IRS APII CORRECT RETURN ADDRESS +* + LDA* APII LOAD X VALUE + STA XIP1 STORE TO X-POINTER + STA XIP2 STORE TO X-POINTER IRS APII JUMP TO NEXT ARGUMENT (Y) LDA* APII LOAD Y VALUE - STA YP1 STORE TO Y-POINTER - STA YP2 STORE TO Y-POINTER + STA YIP1 STORE TO Y-POINTER + STA YIP2 STORE TO Y-POINTER IRS APII CORRECT RETURN ADDRESS +* IRS APII FOR FORTRANIV COMPATIBILITY JST APL CALL REAL ROUTINE JMP* APII @@ -580,9 +855,12 @@ APII DAC ** * CALL: * JST M$APLI * DAC MATRIX -* DAC VECTOR +* DAC TARGET +* DAC SOURCE * DAC 0 DON'T FORGET! * +* USED VARIABLES: (TMP1) XOP,YOP,XP1,YP1,XP2,YP2 +* **************************************** * APLI DAC ** @@ -598,12 +876,19 @@ APLI DAC ** IRS APLI * LDA* APLI - STA XP1 - STA XP2 + STA XOP AOA - STA YP1 - STA YP2 + STA YOP IRS APLI +* + LDA* APLI + STA XIP1 + STA XIP2 + AOA + STA YIP1 + STA YIP2 + IRS APLI +* IRS APLI JST APL CALL INTERNAL ROUTINE JMP* APLI RETURN. @@ -616,18 +901,20 @@ APLI DAC ** * * ALL DATA IS SET UP BY THE BOTH USER ROUTINES ABOVE. * +* USED VARIABLES: TMP1 +* **************************************** * APL DAC ** * CALL FLOAT LOAD SINGLE PRECISION FLOAT FROM 1-WORD INTEGER -XP1 DAC 0 +XIP1 DAC 0 CALL M$22 MULTIPLY FLOAT*FLOAT MP11 DAC 0 CALL H$22 STORE FLOAT DAC TMP1 CALL FLOAT -YP1 DAC 0 +YIP1 DAC 0 CALL M$22 MP12 DAC 0 CALL A$22 @@ -636,27 +923,81 @@ MP12 DAC 0 STA PA21 STORE NEW X VALUE INTO TEMPORARY LOCATION **** CALL FLOAT -XP2 DAC 0 +XIP2 DAC 0 CALL M$22 MP21 DAC 0 CALL H$22 DAC TMP1 * CALL FLOAT -YP2 DAC 0 +YIP2 DAC 0 CALL M$22 MP22 DAC 0 CALL A$22 DAC TMP1 JST RND NOW INTEGER IN AC - STA* YP1 STORE NEW Y VALUE + STA* YOP STORE NEW Y VALUE * LDA PA21 - STA* XP1 + STA* XOP +* JMP* APL RETURN TO CALLER. * * ******************************************************************************** +* +* +**** M$ROTI ROTATE MATRIX, USE INTEGER DEGREE ANGLE +* +ROTI DAC ** + LDA* ROTI GET MATRIX POINTER + STA MTA STORE TO ARGUMENT TO FINAL ROT + IRS ROTI NEXT ARGUMENT: ANGLE + LDA* ROTI LOAD ANGLE + IRS ROTI + IRS ROTI + JST RAD CONVERT INTEGER TO RADIANT + CALL H$22 + DAC RTMP + JST ROT +MTA DAC ** + DAC RTMP + DAC 0 + JMP* ROTI +* +RTMP BSS 2 TEMPORARY VARIABLE +* +* +******************************************************************************** +* +* +**** M$SCLI - SCALE MATRIX, USE INTEGER PERCENT VALUE +* +SCLI DAC ** + LDA* SCLI GET MATRIX POINTER + STA MTSS STORE TO ARGUMENT TO FINAL ROT + IRS SCLI NEXT ARGUMENT: PERCENTS +* + LDA* SCLI LOAD PERCENTS + STA SA1 STORE + CALL FLOAT CONVERT TO FLOAT +SA1 DAC ** + CALL M$22 MULTIPLY WITH + DAC PERC FACTOR 0.01 + IRS SCLI + IRS SCLI + CALL H$22 + DAC RTMP +* + JST SCLE +MTSS DAC ** + DAC RTMP + DAC 0 +* + JMP* SCLI RETURN +* +* +******************************************************************************** * * **** ROUND FLOAT TO INTEGER ROUTINE @@ -679,22 +1020,57 @@ RND DAC ** ******************************************************************************** * * +**** RAD - CONVERT ANGLE IN DEGREE TO RADIANT. +* +* ENTER WITH INTEGER ANGLE IN A +* +* CALL: +* +* JST RAD +* DAC ANGLE POINTER TO ANGLE +* +**************************************** +* +RAD DAC ** + STA AN1 + CALL FLOAT +AN1 DAC ** + CALL M$22 + DAC DEG + JMP* RAD +* +* +******************************************************************************** +* +* **** CONSTANTS * ONE DEC 1 HLF OCT '040100 CONSTANT 0.5 OCT '000000 +ONEF OCT '040300 CONSTANT 1.0 + OCT '000000 +DEG OCT '036707 CONSTANT PI/180 + OCT '076432 +PERC OCT '036521 CONTANT 0.01 + OCT '165605 * * ******************************************************************************** * +* **** VARIABLES * TMP1 BSS '2 TEMPORARY 2-WORD VARIABLE TMP2 BSS '2 " " " TMP3 BSS '2 " " " -TMP4 BSS '2 " " " -* +TMP4 BSS '2 " " " +VAP DAC ** TEMPORARY POINTER TO VECTOR +XOP DAC ** OUTPUT VECTOR X POINTER +YOP DAC ** OUTPUT VECTOR Y POINTER +*VECP DAC ** VECTOR POINTER USED BY T$PII,T$PLI +VECP EQU TMP2 VECTOR POINTER USED BY T$PII,T$PLI +* * ******************************************************************************** *