home *** CD-ROM | disk | FTP | other *** search
- ; 16 JULY 79; ADD 'DCR A' SO ANGLE 1 IS 15 DEG,NOT 30 DEG.
- ; :--ALSO MODIFY 'SINTABL' ADRESS TO 4000H.
- ; 4 APR: PATCHES BY MOSHELL.
- ;
- ; ROTATE - BY JIM MCCRAE.
- ;
- ; THIS PROGRAM USES TWO TABLES, 'Z*SIN'AND 'Z*COS'.
- ; THE 'Z*SIN' TABLE CONSISTS OF 64 PARTS, OF 24 BYTES EACH,REPRESENTING
- ; 1*SIN(ANGLE) FOR ANGLE 1,2,...24 (EACH INCREMENT=15 DEGREES).
- ; THE 'Z*COS' TABLE IS SIMILARLY LAID OUT. THESE TABLES
- ; WERE BUILT USING A BASIC WITH 'POKE' FEATURE.
- ;
- CODE EQU 0FFH
- LASTEL EQU 80H
- COLOR EQU 0FH
- PUT EQU 5000H
- OBJR EQU 5006H
- OBJW EQU 5009H
- SINTBL EQU 4000H
- * ROTATE ROUTINE - ROTATES AN OBJECT ABOUT A
- * GIVEN AXIS. CALLS ROUTINE 'TRIG' TO PERFORM
- * TRIG FUNCTIONS VIA TABLE LOOKUP.
- *
- ORG 2CD0H
- *
- *
- DCR A ;THIS IS BECAUSE 'A=1' MEANS
- ;ROTATE 15 DEG,BUT THAT'S ENTRY
- ;ZERO IN THE TABLE.
- STA THETA ;SAVE ANGLE OF ROTATION
- INR E ;GET NEXT OBJECT ELEMENT
- CALL OBJR
- * NEXT 2 ELEMENTS ARE AXIS OF ROTATION COORDS.
- STA XORG
- INR E
- CALL OBJR
- STA YORG
- * NOW READY FOR CONVERSION
- COORDS SUB A ;A <- 0
- STA FLAGS ;ZERO OUT SIGN FLAGS
- INR E ;NEXT ELEMENT SHOULD BE AN X
- CALL OBJR
- CPI CODE ;CHECK FOR SPECIAL CODE ELEMENT
- JZ CODON
- * GET XORG-X TO PASS TO TRIG ROUTINE
- PUSH H ;WE'LL WIPE OUT H-L
- LXI H,XORG
- SUB M ;A <- X - X-AXIS
- * NEED TO MAKE SURE RESULT IS POSITIVE
- JP NONEED ;IF IT'S + WE'RE OK
- JZ NONEED ; LIKE WISE IF IT'S 0
- * FALL THROUGH IF NEED TO GET 2'S COMPLEMENT OF RESULT
- CMA
- INR A
- * HERE WE SET A FLAG BIT SO WE'LL REMEMBER X IS NEGATIVE
- MOV B,A ;SAVE A
- MVI A,1
- STA FLAGS ;BIT 0 OF FLAGS BELONGS TO X-COORD
- MOV A,B ;RESTORE A
- *
- NONEED MVI H,0 ;CLEAR HI 8 BITS OF H-L FOR TRIG
- MOV L,A ;TRIG EXPECTS COORD IN L
- CALL TRIG
- * NOW HAVE X*SIN IN B, X*COS IN C
- * DO THE SAME WITH Y COORD
- INR E
- CALL OBJR
- PUSH D ;CAN'T LOSE OBJECT & ELEMENT #'S
- PUSH B ;SAVE RESULTS (WILL POP TO D-E)
- LXI H,YORG
- SUB M ;A <- Y - Y-AXIS
- JP NONED2
- JZ NONED2
- * COMPLEMENT Y - Y-AXIS
- CMA
- INR A
- * SET BIT 1 OF FLAGS TO INDICATE Y IS NEGATIVE
- MOV D,A ;TEMPORARY SAVE FOR A
- LDA FLAGS
- ORI 2 ;DON'T WANT TO WIPE OUT BIT 0
- STA FLAGS
- MOV A,D ;RESTORE A
- *
- NONED2 MVI H,0 ;ALL SAME AS ABOVE FOR X
- MOV L,A
- CALL TRIG
- * WE NOW HAVE EVERYTHING WE NEED TO ROTATE THE POINT
- POP D ;THIS PUTS X TRIG VALUES IN D-E
- * NOW HAVE B <= Y*SIN, C <= Y*COS, D <= X*SIN, E <= X*COS
- ;
- ; MOSHELL'S PATCH: IF X WAS NEG,NEGATE D AND E NOW.
- ;
- LDA FLAGS
- RRC ;PUT X-SIGN INTO CARRY
- STA FLAGS ;AND GET Y-FLAG READY.
- JNC XOK
- ;
- ; X TERMS MUST BE INVERTED.
- ;
- SUB A
- SUB D ;A=-D
- MOV D,A ;D=-D
- SUB A
- SUB E
- MOV E,A ;E=-E
- XOK: LDA FLAGS
- RRC
- JNC YOK
- ;
- ; Y TERMS MUST BE INVERTED.
- ;
- SUB A
- SUB B
- MOV B,A ;B=-B
- SUB A
- SUB C
- MOV C,A ;C=-C
- ;
- ;
- YOK: MOV A,E ;A=X*COS
- ADD B ;A=X*COS+Y*SIN
- LXI H,XORG
- ADD M
- MOV B,A ;B=XORG+X*COS+Y*SIN
- ;
- ; FIGURE Y'=YORG+(Y*COS-X*SIN)
- ;
- MOV A,C ;A=Y*COS
- SUB D ;A=Y*COS-X*SIN
- INX H ;POINT TO YORG
- ADD M
- MOV C,A ;C=YORG+(C*COS-X*SIN)
- * WE'RE NOW READY TO CALL PUT; NEW COORDS ARE IN B-C
- PUTIT POP D ;GET OBJECT ELEMENT POINTER
- POP H ; & PIXEL COLOR
- MOV D,H ;PUT WANTS COLOR IN D
- CALL PUT
- MOV D,L ;RESTORE OBJECT # IN D
- JMP COORDS ;GET MORE COORDINATES & ROTATE EM
- *
- * HANDLER FOR SPECIAL CODE ELEMENTS(PRECEDED BY 'FF')
- CODON INR E ;GET THE CODE ELEMENT
- CALL OBJR
- CPI LASTEL ;LAST ELEMENT OF OBJECT ?
- RZ ;WE'RE WITHIN A CALL TO
- ;'SHOWONE' SO A RETURN IS CALLED FOR.
- CPI COLOR ;CHANGE OF COLOR ?
- JNC COORDS ;IF NOT WE IGNORE IT
- MOV H,A ;IF NEW COLOR SAVE IT
- JMP COORDS ; & CONTINUE
- *
- * TRIG ROUTINE - USES COORDINATE PASSED IN L AS OFFSET INTO
- * TABLE OF COORD*SIN AND COORD*COS VALUES.
- *
- TRIG PUSH D ;WE'LL WIPE OUT D-E
- PUSH B ;NEED TO USE B-C
- DAD H ;H-L <- H-L*2
- PUSH H
- DAD H ;H-L <- H-L*4
- POP B ;B-C <- H-L*2
- DAD B ;H-L <- H-L*6
- DAD H ;H-L <- H-L*12
- DAD H ;H-L <- H-L*24, THAT'S WHAT WE WANT
- * HERE WE MASK IN THE ANGLE VALUE FOR OFFSET WITHIN COORD SPACE
- LDA THETA
- MOV C,A
- MVI B,0
- DAD B ;NOW THE ANGLE OFFSET IS ADDED INTO TABLE @
- POP B ;RESTORE B-C
- * NOW WE PUT TOGETHER ADDRESS IN TABLE AND GET THE VALUES
- LXI D,SINTBL
- DAD D
- MOV B,M ;WE HAVE SIN*COORD IN B NOW
- * TO GET COSINE VALUE WE OFFSET BY TABLE LENGTH INTO COS TABLE
- LXI D,1536
- DAD D
- MOV C,M
- POP D ;RESTORE D-E
- RET ;WE'RE ALL DONE
- THETA DB 0
- XORG DB 0
- YORG DB 0
- FLAGS DB 0
- BLE
- LXI D,1536
- DAD D
- MOV C,M
- POP D $ÆI$ä$üÆÆA !A ¬¬¬¬¬¬á @Æ$ÆI$ë"!$ÆH$I $ÆI Æ"! $ÉæA$êÇÆ É