home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG035.ARK / ROTATE.ASM < prev    next >
Assembly Source File  |  1985-02-10  |  5KB  |  188 lines

  1. ; 16 JULY 79; ADD 'DCR A' SO ANGLE 1 IS 15  DEG,NOT 30 DEG.
  2. ;  :--ALSO MODIFY 'SINTABL' ADRESS TO 4000H.
  3. ; 4 APR: PATCHES BY MOSHELL.
  4. ;
  5. ; ROTATE - BY JIM MCCRAE.
  6. ;
  7. ; THIS PROGRAM USES TWO TABLES, 'Z*SIN'AND 'Z*COS'.
  8. ; THE 'Z*SIN' TABLE CONSISTS OF 64 PARTS, OF 24 BYTES EACH,REPRESENTING
  9. ; 1*SIN(ANGLE) FOR ANGLE 1,2,...24 (EACH INCREMENT=15 DEGREES).
  10. ; THE 'Z*COS' TABLE IS SIMILARLY LAID OUT. THESE TABLES
  11. ; WERE BUILT USING A BASIC WITH 'POKE' FEATURE.
  12. ;
  13. CODE    EQU    0FFH
  14. LASTEL    EQU    80H
  15. COLOR    EQU    0FH
  16. PUT    EQU    5000H
  17. OBJR    EQU    5006H
  18. OBJW    EQU    5009H
  19. SINTBL    EQU    4000H
  20. *      ROTATE ROUTINE - ROTATES AN OBJECT ABOUT A
  21. *         GIVEN AXIS. CALLS ROUTINE 'TRIG' TO PERFORM
  22. *      TRIG FUNCTIONS VIA TABLE LOOKUP.
  23. *
  24.     ORG    2CD0H
  25. *
  26. *
  27.     DCR    A    ;THIS IS BECAUSE 'A=1' MEANS
  28.             ;ROTATE 15 DEG,BUT THAT'S ENTRY
  29.             ;ZERO IN THE TABLE.
  30.     STA    THETA    ;SAVE ANGLE OF ROTATION
  31.     INR    E    ;GET NEXT OBJECT ELEMENT
  32.     CALL    OBJR
  33. *   NEXT 2 ELEMENTS ARE AXIS OF ROTATION COORDS.
  34.     STA    XORG
  35.     INR    E
  36.     CALL    OBJR
  37.     STA    YORG
  38. *   NOW READY FOR CONVERSION
  39. COORDS    SUB    A    ;A <- 0
  40.     STA    FLAGS    ;ZERO OUT SIGN FLAGS
  41.     INR    E    ;NEXT ELEMENT SHOULD BE AN X
  42.     CALL    OBJR
  43.     CPI    CODE    ;CHECK FOR SPECIAL CODE ELEMENT
  44.     JZ    CODON
  45. *   GET XORG-X TO PASS TO TRIG ROUTINE
  46.     PUSH    H    ;WE'LL WIPE OUT H-L
  47.     LXI    H,XORG
  48.     SUB    M    ;A <- X - X-AXIS
  49. *   NEED TO MAKE SURE RESULT IS POSITIVE
  50.     JP    NONEED    ;IF IT'S + WE'RE OK
  51.     JZ    NONEED    ;  LIKE WISE IF IT'S 0
  52. *   FALL THROUGH IF NEED TO GET 2'S COMPLEMENT OF RESULT
  53.     CMA
  54.     INR    A
  55. *   HERE WE SET A FLAG BIT SO WE'LL REMEMBER X IS NEGATIVE
  56.     MOV    B,A    ;SAVE A
  57.     MVI    A,1
  58.     STA    FLAGS    ;BIT 0 OF FLAGS BELONGS TO X-COORD
  59.     MOV    A,B    ;RESTORE A
  60. *
  61. NONEED    MVI    H,0    ;CLEAR HI 8 BITS OF H-L FOR TRIG
  62.     MOV    L,A    ;TRIG EXPECTS COORD IN L
  63.     CALL    TRIG    
  64. *   NOW HAVE X*SIN IN B, X*COS IN C
  65. *   DO THE SAME WITH Y COORD
  66.     INR    E
  67.     CALL    OBJR
  68.     PUSH    D    ;CAN'T LOSE OBJECT & ELEMENT #'S
  69.     PUSH    B    ;SAVE RESULTS (WILL POP TO D-E)
  70.     LXI    H,YORG
  71.     SUB    M    ;A <- Y - Y-AXIS
  72.     JP    NONED2
  73.     JZ    NONED2
  74. *  COMPLEMENT Y - Y-AXIS
  75.     CMA
  76.     INR    A
  77. *   SET BIT 1 OF FLAGS TO INDICATE Y IS NEGATIVE
  78.     MOV    D,A    ;TEMPORARY SAVE FOR A
  79.     LDA    FLAGS
  80.     ORI    2    ;DON'T WANT TO WIPE OUT BIT 0
  81.     STA    FLAGS
  82.     MOV    A,D    ;RESTORE A
  83. *
  84. NONED2    MVI    H,0    ;ALL SAME AS ABOVE FOR X
  85.     MOV     L,A
  86.     CALL    TRIG
  87. *  WE NOW HAVE EVERYTHING WE NEED TO ROTATE THE POINT
  88.     POP    D    ;THIS PUTS X TRIG VALUES IN D-E
  89. *  NOW HAVE B <= Y*SIN, C <= Y*COS, D <= X*SIN, E <= X*COS
  90. ;
  91. ; MOSHELL'S PATCH: IF X WAS NEG,NEGATE D AND E NOW.
  92. ;
  93.     LDA    FLAGS
  94.     RRC        ;PUT X-SIGN INTO CARRY
  95.     STA    FLAGS    ;AND GET Y-FLAG READY.
  96.     JNC    XOK
  97. ;
  98. ; X TERMS MUST BE INVERTED.
  99. ;
  100.     SUB    A
  101.     SUB    D    ;A=-D
  102.     MOV    D,A    ;D=-D
  103.     SUB    A
  104.     SUB    E
  105.     MOV    E,A    ;E=-E
  106. XOK:    LDA    FLAGS
  107.     RRC
  108.     JNC    YOK
  109. ;
  110. ; Y TERMS MUST BE INVERTED.
  111. ;
  112.     SUB    A
  113.     SUB    B
  114.     MOV    B,A    ;B=-B
  115.     SUB    A
  116.     SUB    C
  117.     MOV    C,A    ;C=-C
  118. ;
  119. ;
  120. YOK:    MOV    A,E    ;A=X*COS
  121.     ADD    B    ;A=X*COS+Y*SIN
  122.     LXI    H,XORG
  123.     ADD    M
  124.     MOV    B,A    ;B=XORG+X*COS+Y*SIN
  125. ;
  126. ; FIGURE Y'=YORG+(Y*COS-X*SIN)
  127. ;
  128.     MOV    A,C    ;A=Y*COS
  129.     SUB    D    ;A=Y*COS-X*SIN
  130.     INX    H    ;POINT TO YORG
  131.     ADD    M
  132.     MOV    C,A    ;C=YORG+(C*COS-X*SIN)
  133. *  WE'RE NOW READY TO CALL PUT; NEW COORDS ARE IN B-C
  134. PUTIT    POP    D    ;GET OBJECT ELEMENT POINTER
  135.     POP    H    ;  & PIXEL COLOR
  136.     MOV    D,H    ;PUT WANTS COLOR IN D
  137.     CALL    PUT
  138.     MOV    D,L    ;RESTORE OBJECT # IN D
  139.     JMP    COORDS    ;GET MORE COORDINATES & ROTATE EM
  140. *
  141. *  HANDLER FOR SPECIAL CODE ELEMENTS(PRECEDED BY 'FF')
  142. CODON    INR    E    ;GET THE CODE ELEMENT
  143.     CALL    OBJR
  144.     CPI    LASTEL    ;LAST ELEMENT OF OBJECT ?
  145.     RZ    ;WE'RE WITHIN A CALL TO
  146.         ;'SHOWONE' SO A RETURN IS CALLED FOR.
  147.     CPI    COLOR    ;CHANGE OF COLOR ?
  148.     JNC    COORDS    ;IF NOT WE IGNORE IT
  149.     MOV    H,A    ;IF NEW COLOR SAVE IT
  150.     JMP    COORDS      ; & CONTINUE
  151. *
  152. *   TRIG ROUTINE - USES COORDINATE PASSED IN L AS OFFSET INTO
  153. *      TABLE OF COORD*SIN AND COORD*COS VALUES.
  154. *
  155. TRIG    PUSH    D    ;WE'LL WIPE OUT D-E
  156.     PUSH    B    ;NEED TO USE B-C
  157.     DAD    H    ;H-L <- H-L*2
  158.     PUSH    H
  159.     DAD    H    ;H-L <- H-L*4
  160.     POP    B    ;B-C <- H-L*2
  161.     DAD    B    ;H-L <- H-L*6
  162.     DAD    H    ;H-L <- H-L*12
  163.     DAD    H    ;H-L <- H-L*24, THAT'S WHAT WE WANT
  164. *  HERE WE MASK IN THE ANGLE VALUE FOR OFFSET WITHIN COORD SPACE
  165.     LDA    THETA
  166.     MOV    C,A
  167.     MVI    B,0
  168.     DAD    B    ;NOW THE ANGLE OFFSET IS ADDED INTO TABLE @
  169.     POP    B    ;RESTORE B-C
  170. *  NOW WE PUT TOGETHER ADDRESS IN TABLE AND GET THE VALUES
  171.     LXI    D,SINTBL
  172.     DAD    D
  173.     MOV    B,M    ;WE HAVE SIN*COORD IN B NOW
  174. *   TO GET COSINE VALUE WE OFFSET BY TABLE LENGTH INTO COS TABLE
  175.     LXI    D,1536
  176.     DAD    D
  177.     MOV    C,M
  178.     POP    D    ;RESTORE D-E 
  179.     RET        ;WE'RE ALL DONE
  180. THETA    DB    0
  181. XORG    DB    0
  182. YORG    DB    0
  183. FLAGS    DB    0
  184. BLE
  185.     LXI    D,1536
  186.     DAD    D
  187.     MOV    C,M
  188.     POP    D$ÆI$ä$üÆÆA    !A¬¬¬¬¬¬á@Æ$ÆI$ë"!$ÆH$I$ÆI Æ"!    $ÉæA$êÇÆ    É HäHÉÉäAA"I @Éé$BH!    $!D$ÉHëÇ$