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 >
Wrap
Assembly Source File
|
1985-02-10
|
5KB
|
188 lines
; 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$êÇÆ É