; ; SYSTEM FUNCTIONS MODULE ; COPYRIGHT 1976 D. KRUGLINSKI ; SYSTEM CALL, MOVE, ACCELERATION, RANDOM ; MSTRT EQU 0C00H ;LOAD ADDRESS ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; MACROS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; COMPLEMENT HL COMHL MACRO MOV A,H CMA MOV H,A MOV A,L CMA MOV L,A INX H ENDM ; LOAD HL INDEXED (BC=BASE) LDBLX MACRO OFSET PUSH D LXI H,OFSET DAD B MOV E,M INX H MOV D,M XCHG POP D ENDM ; STORE HL INDEXED (BC=BASE) SDBLX MACRO OFSET PUSH D XCHG LXI H,OFSET DAD B MOV M,E INX H MOV M,D POP D ENDM ; LOAD REG INDEXED (BC=BASE) ; HL DESTROYED LOADX MACRO REG,OFSET LXI H,OFSET DAD B MOV REG,M ENDM ; STORE REG INDEXED (BC=BASE) ; HL DESTROYED STORX MACRO REG,OFSET LXI H,OFSET DAD B MOV M,REG ENDM ; ORG 38H ;RST 7 ADDRESS JMP SYSCL ORG MSTRT ;LOAD ADDRESS ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; SYSTEM CALL FUNCTION ; ENTERED ON RST 7 FOLLOWED BY FUNCTION # ; DESTROYS HL ONLY ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SYSCL: POP H ;GET CALL # ADDR INX H PUSH H ;RETURN ADDRESS DCX H ;CALL # ADDRESS PUSH D ;SAVE DE MOV E,M MVI D,0 ;CALL # IN DE LXI H,CALTB ;CALL TABLE BASE DAD D DAD D ;ADD # MOV E,M INX H MOV D,M XCHG ;ADDR IN HL POP D ;RESTORE DE PCHL ;JUMP TO SUBROUTINE CALTB: DW MOVE DW ACCEL DW RAND DW 0 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; GENERAL PURPOSE MOVE FUNCTION ; ASSUMES FIRST OBJECT BLOCK LOCATIONS AS FOLLOWS: ; 0 X(N) ; 1 ; 2 X(N-1) ; 3 ; 4 X ACCELERATION ; 5 ; 6 Y(N) ; 7 ; 8 Y(N-1) ; 9 ; A Y ACCELERATION ; B ; C POINTER TO 'MBEAM' INSTR ; D ; CALL: SCALL 0 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MOVE: PUSH B ;SAVE BC CALL MOV1 ;UPDATE X CALL MOV1 ;UPDATE Y LDAX B ;INST PNTR IN DE MOV E,A INX B LDAX B MOV D,A INX D ;X COORD ADDRESS POP B ;ORIG BC (TOP OF LIST) LOADX A,1 ;X(N) H.O. ADI 80H ;ZERO AT SCREEN CENTER STAX D ;X COORD INX D ;Y COORD ADDR LOADX A,7 ;Y(N) H.O. ADI 80H ;ZERO AT SCREEN CENTER STAX D ;Y COORD RET ; UPDATE EITHER X OR Y MOV1: PUSH B ;SAVE BC FOR X(N) LDAX B ;X(N) TO DE MOV E,A INX B LDAX B MOV D,A INX B ;-X(N-1) TO HL LDAX B ; AND DE TO NEW X(N-1) CMA MOV L,A MOV A,E STAX B INX B LDAX B CMA MOV H,A MOV A,D STAX B INX H DAD D ;HL+DE+DE TO HL DAD D INX B ;XACC TO DE LDAX B MOV E,A INX B LDAX B MOV D,A DAD D ;HL+XACC TO HL POP D ;BC FOR X(N) MOV A,L ;HL TO NEW X(N) STAX D INX D MOV A,H STAX D INX B ;SETUP FOR NEXT BYTE RET ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ORBITAL ACCELERATION LOOKUP FUNCTION ; 1024-VALUE VERSION (2 BYTES/VALUE) ; CALL: SCALL 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ATAB EQU 0E00H ;LOCATION OF ACC TABLE XN SET 0 XACC SET 4 YN SET 6 YACC SET 0AH ; ADJUST X & Y FOR TABLE LOOKUP & SET SHIFT COUNT ACCEL: MVI A,3 STA SHCNT ;SET SHIFT COUNT (6 SHIFTS) LDBLX XN ;X VALUE MOV A,H STA HOXN ;SAVE H.O. X CPI 0 JP POSX ;ABS VALUE X COMHL POSX: XCHG ;IN DE LDBLX YN ;Y VALUE MOV A,H STA HOYN ;SAVE H.O. Y CPI 0 JP POSY ;ABS VALUE OF Y COMHL POSY: MOV A,H ;IN HL ORA D ;COMBINE H.O. X & Y CPI 40H JP GETAD ;JUMP IF > OR = 40H DAD H ;DOUBLE Y IN HL XCHG DAD H ;DOUBLE X IN DE XCHG LDA SHCNT DCR A STA SHCNT ;DECREMENT SHIFT COUNT JNZ POSY ;LOOP IF > 0 ; COMPUTE XACC TABLE OFFSET FROM X & Y (IN DE) GETAD: MOV A,D ;H.O. X RRC RRC RRC RRC ;ROTATE RIGHT 4 MOV E,A ANI 7H MOV D,A ;H.O. TABLE OFFSET MOV A,E ANI 0C0H MOV E,A MOV A,H ;H.O. Y RRC ANI 3EH ORA E MOV E,A ;L.O. TABLE OFFSET PUSH D ;SAVE OFFSET FOR LATER CALL RETRV ;GET ACC VAULE ; MAKE XACC SIGN AGREE WITH -X COORD LDA HOXN ;H.O. X VALUE CPI 0 ;TEST SIGN JM XMINS COMHL ;POS - COMP XACC XMINS: SDBLX XACC ;STORE IN OBJ BLK ; COMPUTE YACC TABLE OFFSET FROM XACC OFFSET POP H ;XACC OFFSET IN HL MOV A,L RRC RRC RRC MOV E,A ANI 7H MOV D,A ;H.O. TABLE OFFSET MOV A,E ANI 0C0H MOV E,A MOV A,L ANI 0C0H ORA H RLC RLC RLC ORA E MOV E,A ;L.O. OFFSET CALL RETRV ;GET YACC VALUE ; MAKE YACC SIGN AGREE WITH -Y COORD LDA HOYN CPI 0 JM YMINS COMHL YMINS: SDBLX YACC ;STORE YACC IN OBJ BLK RET ;RETURN TO CALLING PROGRAM ; ; SUBROUTINE TO RESTORE ACC VALUE FROM TABLE TO HL ; AND ADJUST ACC BY SHIFT COUNT ; INPUT: OFFSET IN DE RETRV: LXI H,ATAB ;TABLE BASE DAD D ;ADD OFFSET MOV E,M INX H MOV D,M ;DATA IN DE PUSH B LDA SHCNT ;SAVE SHIFT COUNT IN B MOV B,A CPI 0 JZ EXIT ;SHIFT COUNT=0 ; SHIFT DE RIGHT 2 (DE < 1000) MOV A,D RRC RRC MOV D,A MOV A,E RRC RRC PUSH PSW ;SAVE CARRY FOR ROUNDING ANI 3FH ORA D MOV E,A MVI D,0 ; DECREMENT & TEST SHIFT COUNT LOOP: DCR B JZ ROUND ;DONE SHIFTING ; SHIFT E RIGHT 2 (D=0) POP PSW ;SANE STACK MOV A,E RRC RRC PUSH PSW ;SAVE CARRY ANI 3FH MOV E,A JMP LOOP ROUND: POP PSW ;RESTORE CARRY FROM LAST SFT MOV A,E ;L.O. ACC ACI 0 ;ROUND MOV E,A ;RESTORE E EXIT: XCHG ;ACC IN HL POP B ;RESTORE INDEX REG RET ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; RANDOM NUMBER FUNCTION ; GENERATES A NEW RANDOM NUMBER IN A AND 'RND' ; CALL: SCALL 2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; RAND: LXI H,RND MOV A,M CPI 0 JNZ RANSKP INR A RANSKP: MOV M,A STC ANI 8EH ;FEEDBACK MASK,CLEAR CARRY JPE CLEAR ;XOR FEEDBACK BITS CMC ;SET CARRY IF XOR TRUE CLEAR: MOV A,M ;RESTORE RND RAL ;SHIFT IN CARRY MOV M,A ;IN MEMORY RET ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; WORKING STORAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RND: DB 23H ;RANDOM NUMBER HOXN: DB 0 ;H.O. X VALUE HOYN: DB 0 ;H.O. Y VALUE SHCNT: DB 0 ;ACC SHIFT COUNT END