*** empty log message ***
[h316.git] / lib / hachti / src / matrix.asm
index 812fd23adcc4bfa378baa701728f35ee92f9b496..79202db70cfda21765c874647f29d132b434d348 100644 (file)
@@ -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
 * 
 * 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
 *               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.
 *               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
        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
+*  
 *  
 ********************************************************************************
 * 
 * 
 * 
 ********************************************************************************
-*
+* 
+* 
+*** 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
+* 
 *
 ********************************************************************************
 *