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
/
CPMUG001.ARK
/
SPACE.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
16KB
|
1,288 lines
;
; SPACEWAR FOR IMSAI 8080 AND TEKTRONIX 4013 (9600 BAUD).
;
; COPYRIGHT (C) 1977
; BY JEFFREY L. ZURKOW
;
;
ORG 100H
;
;
DI
LXI H,0
DAD SP
SHLD SPSAVE
LXI SP,STACK
LDA 70Q
STA SAVE71
LHLD 71Q
SHLD SAVE72
MVI A,0C3H
STA 70Q
LXI H,INT7
SHLD 71Q
RESTART:
DI
MVI C,ESC
CALL TYOUT
MVI C,FF
CALL TYOUT
IN 0FFH
ANI 1
JZ RS1
MVI C,ESC
CALL TYOUT
MVI C,112
CALL TYOUT
RS1: MVI A,1
OUT 8 ;ENABLE TEKTRONIX IN AND OUT INTERRUPTS
XRA A
STA BUFSW
STA TLIFE1
STA RSTAR1
STA RSTAR2
STA HIT1
STA HIT2
STA MTHRUST1
STA MTHRUST2
STA VTHETA1
STA VTHETA2
LXI H,BUF1
SHLD OUTBUF
SHLD BPOINT
MVI M,0
INX H
MVI M,13
LXI H,BUF2
SHLD CURBUF
LXI H,BUF3
SHLD MIDBUF
MVI M,13
MVI A,PI/2
STA THETA1
MVI A,3*PI/2
STA THETA2
LXI H,32 * X1INIT
SHLD X1
SHLD T1X
LXI H,32 * Y1INIT
SHLD Y1
SHLD T1Y
LXI H,32 * X2INIT
SHLD X2
LXI H,32 * Y2INIT
SHLD Y2
LXI H,0
SHLD VX1
SHLD VY1
SHLD VX2
SHLD VY2
EI
JMP START
;
;
SAVE71: DB 0
SAVE72: DW 0
BPOINT: DW 0
;
; GLOBAL EQUATES
; ====== =======
;
;
TEKSTAT EQU 3
TEKDATA EQU 2
PI EQU 200Q
THRUST EQU 0FH ;MAIN THRUST MAGNITUDE
TSPEED EQU 09H ;TORPEDO SPEED
TLIFE EQU 20H ;TORPEDO LIFETIME
ESC EQU 27
FF EQU 12
FRATE EQU 07H
RRATE EQU 01H
DELTA EQU 0FFH
EXRATE EQU 03H
SMAX EQU 14
X1INIT EQU 150
Y1INIT EQU 150
X2INIT EQU 875
Y2INIT EQU 640
THETA0 EQU PI/2
DELAY EQU 100
SIZE EQU 3
;
;
;
;
; KEYBOARD SHIP CONTROL CHARACTERS
; ======== ==== ======= ==========
;
;
LEFT1C EQU 'A'
RT1C EQU 'S'
FOR1C EQU 'D'
TORP1C EQU 'F'
;
LEFT2C EQU 'J'
RT2C EQU 'K'
FOR2C EQU 'L'
TORP2C EQU ';'
;
CTRLC EQU 03
;
;
;
; OUTPUT BUFFER STUFF
; ====== ====== =====
;
;
BUFSW: DB 0
OUTBUF: DW 0
MIDBUF: DW 0
CURBUF: DW 0
;
;
;
;
;
;
START: LHLD CURBUF
ST0: CALL SHIP1
CALL TORP1
CALL SHIP2
CALL TORP2
MVI M,13
;
LXI H,RATE
INR M
;
DI
LHLD CURBUF
XCHG
LHLD MIDBUF
SHLD CURBUF
XCHG
SHLD MIDBUF
MVI A,1
STA BUFSW
EI
;
;
; ROTATION INTEGRATORS
;
LDA RATE
ANI RRATE
JNZ ST1
;
LDA THETA1
MOV B,A
LDA VTHETA1
ADD B
STA THETA1
;
LDA THETA2
MOV B,A
LDA VTHETA2
ADD B
STA THETA2
;
ST1: LHLD X1
XCHG
LHLD VX1
DAD D
MOV A,H
ANI 7FH
MOV H,A
SHLD X1
;
LHLD Y1
XCHG
LHLD VY1
DAD D
MOV A,H
ANI 7FH
MOV H,A
SHLD Y1
;
LHLD VX2
XCHG
LHLD X2
DAD D
MOV A,H
ANI 7FH
MOV H,A
SHLD X2
;
LHLD VY2
XCHG
LHLD Y2
DAD D
MOV A,H
ANI 7FH
MOV H,A
SHLD Y2
;
LDA TLIFE1
ORA A
JZ ST2
LHLD T1X
XCHG
LHLD VT1X
DAD D
MOV A,H
ANI 7FH
MOV H,A
SHLD T1X
;
LHLD T1Y
XCHG
LHLD VT1Y
DAD D
MOV A,H
ANI 7FH
MOV H,A
SHLD T1Y
;
JMP ST2A
;
;
ST2: LHLD X1
SHLD T1X
LHLD Y1
SHLD T1Y
;
;
ST2A: LDA TLIFE2
ORA A
JZ ST2B
LHLD T2X
XCHG
LHLD VT2X
DAD D
MOV A,H
ANI 7FH
MOV H,A
SHLD T2X
;
LHLD T2Y
XCHG
LHLD VT2Y
DAD D
MOV A,H
ANI 7FH
MOV H,A
SHLD T2Y
JMP ST3A
;
ST2B: LHLD X2
SHLD T2X
LHLD Y2
SHLD T2Y
;
;
ST3A: LDA RATE
ANI EXRATE
JNZ ST4
LDA HIT2
ORA A
JZ ST3B
LXI H,DELAY2
DCR M
JZ RESTART
LXI H,RSTAR2
MOV A,M
CPI SMAX*4
JNC ST3B
INR A
MOV M,A
;
ST3B: LDA HIT1
ORA A
JZ ST4
LXI H,DELAY2
DCR M
JZ RESTART
LXI H,RSTAR1
MOV A,M
CPI SMAX*4
JNC ST4
INR A
MOV M,A
;
ST4: LDA TLIFE1
ORA A
JZ ST6
LHLD X2
XCHG
LHLD T1X
CALL NBRHD
JNZ ST5
LHLD Y2
XCHG
LHLD T1Y
CALL NBRHD
JNZ ST5
XRA A
STA TLIFE1
CALL KILL2
;
ST5: LHLD X1
XCHG
LHLD T1X
CALL NBRHD
JNZ ST6
LHLD Y1
XCHG
LHLD T1Y
CALL NBRHD
JNZ ST6
XRA A
STA TLIFE1
CALL KILL1
;
ST6: LDA TLIFE2
ORA A
JZ ST8
LHLD X1
XCHG
LHLD T2X
CALL NBRHD
JNZ ST7
LHLD Y1
XCHG
LHLD T2Y
CALL NBRHD
JNZ ST7
XRA A
STA TLIFE2
CALL KILL1
;
ST7: LHLD X2
XCHG
LHLD T2X
CALL NBRHD
JNZ ST8
LHLD Y2
XCHG
LHLD T2Y
CALL NBRHD
JNZ ST8
XRA A
STA TLIFE2
CALL KILL2
;
ST8: LHLD X1
XCHG
LHLD X2
CALL NBRHD
JNZ ST9
LHLD Y1
XCHG
LHLD Y2
CALL NBRHD
JNZ ST9
CALL KILL1
CALL KILL2
;
ST9: JMP START
;
;
;
;
KILL1: LDA HIT1
ORA A
RNZ
STA MTHRUST1
INR A
STA HIT1
STA RSTAR1
MVI A,DELAY
STA DELAY2
RET
;
;
KILL2: LDA HIT2
ORA A
RNZ
STA MTHRUST2
INR A
STA HIT2
STA RSTAR2
MVI A,DELAY
STA DELAY2
RET
;
;
;
;
LEAVE: DI
LHLD SPSAVE
SPHL
MVI A,13
CALL TYOUT
MVI A,10
CALL TYOUT
LDA SAVE71
STA 70Q
LHLD SAVE72
SHLD 71Q
XRA A
OUT 8
RET
;
;
;
;
NBRHD: MOV A,L
SUB E
MOV L,A
MOV A,H
SBB D
MOV H,A
JP NB1
CMA
MOV H,A
MOV A,L
CMA
MOV L,A
INX H
NB1: LXI D,NOT DELTA
MOV A,D
ANA H
MOV H,A
MOV A,E
ANA L
ORA H
RET
;
;
;
;
; POINT
; =====
;
; POINT GENERATES A POINT FROM POLAR COORDINATES, WITH ORIGIN
; AT (X,Y) AND THE WHOLE COORDINATE SYSTEM ROTATED BY THETA
; ABOUT THE ORIGIN. CALL POINT WITH THE RADIUS IN B,
; THE ANGLE IN C, AND HL POINTING TO THE MEMORY BUFFER WHERE
; THE RESULTS ARE TO BE PUT. ON RETURN, THE BUFFER WILL CONTAIN
; FIVE NEW BYTES, STARTING AT THE PREVIOUS (HL): 4 BYTES ARE
; THE TEK 4013 COORDINATES OF THE FINAL POINT, Y FIRST,
; AND THE FIFTH IS A ZERO BYTE TO ALLOW PROPER SETTLING TIME FOR
; THE VECTOR GENERATOR IN THE 4013. HL WILL POINT TO THE BYTE
; AFTER THE NUL (ZERO) BYTE.
;
;
POINT: PUSH H ;SAVE BUFFER ADDRESS
LDA THETA ;GET SHIP ANGLE
ADD C ;ADD ANGLE FOR THIS POINT
MOV C,A
PUSH B ;SAVE RADIUS (R) AND NEW ANGLE
CALL SIN
POP B ;GET R AGAIN (SIN CLOBBERED B)
PUSH B ; BUT LEAVE IT ON STACK.
MOV E,A ;PUT SINE IN E FOR MULTIPLIER
CALL MUL ;THIS GETS R*SIN(THETA+PHI) IN HL
CALL SHIFT ;THIS SCALES THE RESULT
XCHG ;NOW ADD Y
LHLD Y
DAD D
MOV A,H
RLC
JC ERASE1
CALL TEKY ;CONVERT TO 4013 FORMAT
POP B
XCHG ;SAVE RESULT
POP H ;GET BUFFER ADDRESS
MOV M,D ;SAVE FIRST BYTE
INX H
MOV M,E ;SAVE SECOND BYTE
INX H
PUSH H
PUSH B
MOV A,C
CALL COS ;GET COSINE(THETA+PHI)
POP B ;GET R AGAIN
MOV E,A ;SET UP FOR MULTIPLY
CALL MUL
CALL SHIFT
XCHG
LHLD X
DAD D
MOV A,H
RLC
JC ERASE2
CALL TEKX
XCHG
POP H
MOV M,D
INX H
MOV M,E
INX H
XRA A
; MOV M,A
; INX H
; MOV M,A
; INX H
ORA A
RET
ERASE1: POP B
ERASE2: POP H
STC
RET
;
;
;
;
SHIP1: PUSH H
LDA THETA1
STA THETA
LHLD X1
SHLD X
LHLD Y1
SHLD Y
LHLD VX1
SHLD VX
LHLD VY1
SHLD VY
LDA MTHRUST1
ORA A
JZ SHP1B
LDA RATE
ANI FRATE
JNZ SHP1B
MVI A,THRUST
STA MAG
CALL RESOLVE
LHLD VX
SHLD VX1
LHLD VY
SHLD VY1
;
SHP1B: LDA T1GO
ORA A
JZ SHP1C
XRA A
STA T1GO
MVI A,TLIFE
STA TLIFE1
CALL FIRE
LHLD VX
SHLD VT1X
LHLD VY
SHLD VT1Y
;
LHLD X
SHLD T1X
LHLD Y
SHLD T1Y
SHP1C: POP H
;
LDA HIT1
ORA A
LDA RSTAR1
JNZ STARB
;
PUSH H
MVI M,29
INX H
MVI B,5*SIZE
MVI C,0
CALL POINT
JC BLANK1
MVI B,4*SIZE
MVI C,200Q
LDA MTHRUST1
ORA A
JZ SHP1A
MVI B,6*SIZE
SHP1A: CALL POINT
JC BLANK1
MVI M,29
INX H
MVI B,5*SIZE
MVI C,9AH
CALL POINT
JC BLANK1
MVI B,5*SIZE
MVI C,66H
CALL POINT
JC BLANK1
POP B ;CLEAR STACK
RET
BLANK1: POP H
RET
;
;
;
;
SHIP2: PUSH H
LDA THETA2
STA THETA
LHLD X2
SHLD X
LHLD Y2
SHLD Y
LHLD VX2
SHLD VX
LHLD VY2
SHLD VY
LDA MTHRUST2
ORA A
JZ SHP2A
LDA RATE
ANI FRATE
JNZ SHP2A
MVI A,THRUST
STA MAG
CALL RESOLVE
LHLD VX
SHLD VX2
LHLD VY
SHLD VY2
;
SHP2A: LDA T2GO
ORA A
JZ SHP2B
XRA A
STA T2GO
MVI A,TLIFE
STA TLIFE2
CALL FIRE
LHLD VX
SHLD VT2X
LHLD VY
SHLD VT2Y
;
LHLD X
SHLD T2X
LHLD Y
SHLD T2Y
;
SHP2B: POP H
LDA HIT2
ORA A
LDA RSTAR2
JNZ STARB
PUSH H
MVI M,29
INX H
MVI B,5*SIZE
MVI C,0
CALL POINT
JC BLANK2
MVI B,5*SIZE
MVI C,66H
CALL POINT
JC BLANK2
MVI B,5*SIZE
MVI C,9AH
CALL POINT
JC BLANK2
MVI B,5*SIZE
MVI C,0
CALL POINT
JC BLANK2
LDA MTHRUST2
ORA A
JZ SHP2C
MVI M,29
INX H
MVI B,3*SIZE
MVI C,PI
CALL POINT
JC BLANK2
MVI B,5*SIZE
MVI C,PI
CALL POINT
JC BLANK2
SHP2C: POP B
RET
BLANK2: POP H
RET
;
;
;
;
TORP1: MVI M,29
INX H
PUSH H
LHLD T1Y
CALL TEKY
XCHG
POP H
MOV M,D
INX H
MOV M,E
INX H
PUSH H
LHLD T1X
CALL TEKX
XCHG
POP H
MOV M,D
INX H
MOV M,E
INX H
MVI M,0
INX H
MVI M,0
INX H
MOV M,E
INX H
RET
;
;
;
;
;
TORP2: MVI M,29
INX H
PUSH H
LHLD T2Y
CALL TEKY
XCHG
POP H
MOV M,D
INX H
MOV M,E
INX H
PUSH H
LHLD T2X
CALL TEKX
XCHG
POP H
MOV M,D
INX H
MOV M,E
INX H
XRA A
MOV M,A
INX H
MOV M,A
INX H
MOV M,E
INX H
RET
;
;
;
;
;
STARB: PUSH H
STA RSTAR
MVI M,29
INX H
MVI C,0
CALL STARB1
MVI C,PI
CALL STARB1
MVI M,29
INX H
MVI C,5*PI/4
CALL STARB1
MVI C,PI/4
CALL STARB1
MVI M,29
INX H
MVI C,PI/2
CALL STARB1
MVI C,3*PI/2
CALL STARB1
MVI M,29
INX H
MVI C,7*PI/4
CALL STARB1
MVI C,3*PI/4
CALL STARB1
POP B
RET
;
STARB1: LDA RSTAR
MOV B,A
CALL POINT
RNC
POP B
POP H
RET
;
;
;
;
;
;
INT7: PUSH PSW
PUSH H
IN TEKSTAT
ANI 2
JNZ INPUT
LHLD BPOINT
MOV A,M
CPI 13
JZ BUFEND
OUT TEKDATA
INX H
SHLD BPOINT
;
EXIT7: POP H
POP PSW
EI
RET
;
BUFEND: LDA BUFSW
ORA A
JZ BUFEN1
PUSH D
XRA A
STA BUFSW
LHLD MIDBUF
XCHG
LHLD OUTBUF
SHLD MIDBUF
XCHG
SHLD OUTBUF
POP D
;
BUFEN1: LHLD OUTBUF
MOV A,M
OUT TEKDATA
INX H
SHLD BPOINT
LXI H,TLIFE1
MOV A,M
ORA A
JZ BUFEN2
DCR A
MOV M,A
;
BUFEN2: INX H
MOV A,M
ORA A
JZ EXIT7
DCR A
MOV M,A
JMP EXIT7
;
INPUT: IN TEKDATA
ANI 7FH
CPI CTRLC
JZ LEAVE
MOV H,A
LDA HIT1
ORA A
MOV A,H
JNZ INP1
LXI H,VTHETA1
CPI LEFT1C
JZ LEFT
CPI RT1C
JZ RIGHT
LXI H,MTHRUST1
CPI FOR1C
JZ FORWD
CPI TORP1C
JZ FIRE1
INP1: MOV H,A
LDA HIT2
ORA A
MOV A,H
JNZ INP2
LXI H,VTHETA2
CPI LEFT2C
JZ LEFT
CPI RT2C
JZ RIGHT
LXI H,MTHRUST2
CPI FOR2C
JZ FORWD
CPI TORP2C
JZ FIRE2
;
INP2: JMP EXIT7
;
LEFT: INR M
JMP EXIT7
;
RIGHT: DCR M
JMP EXIT7
;
FORWD: MOV A,M
ANI 1
XRI 1
MOV M,A
JMP EXIT7
;
FIRE1: LDA TLIFE1
ORA A
JNZ EXIT7
INR A
STA T1GO
JMP EXIT7
;
;
FIRE2: LDA TLIFE2
ORA A
JNZ EXIT7
INR A
STA T2GO
JMP EXIT7
;
;
;
;
FIRE: LDA THETA
PUSH PSW
CALL COS
MOV E,A
PUSH D
MVI B,5*SIZE
CALL MUL
CALL SHIFT
XCHG
LHLD X
DAD D
SHLD X
POP D
MVI B,TSPEED
CALL MUL
CALL SHIFT
XCHG
LHLD VX
DAD D
SHLD VX
POP PSW
CALL SIN
MOV E,A
PUSH D
MVI B,5*SIZE
CALL MUL
CALL SHIFT
XCHG
LHLD Y
DAD D
SHLD Y
POP D
MVI B,TSPEED
CALL MUL
CALL SHIFT
XCHG
LHLD VY
DAD D
SHLD VY
RET
;
;
;
;
;
RESOLVE:
LDA THETA
PUSH PSW
CALL COS
MOV E,A
LDA MAG
MOV B,A
CALL MUL
MOV E,H
MVI D,0
MOV A,H
RLC
JNC FORW1
MVI D,0FFH
FORW1: LHLD VX
DAD D
SHLD VX
POP PSW
CALL SIN
MOV E,A
LDA MAG
MOV B,A
CALL MUL
MOV E,H
MVI D,0
MOV A,H
RLC
JNC FORW2
MVI D,0FFH
FORW2: LHLD VY
DAD D
SHLD VY
RET
;
;
;
;
SHIFT: MOV A,L
RRC
RRC
ANI 3FH
MOV L,A
MOV A,H
RRC
RRC
ANI 0C0H
ORA L
MOV L,A
MOV A,H
RLC
RRC
RAR
RLC
RRC
RAR
MOV H,A
RET
;
RSTAR DB 0
RSTAR1 DB 0
RSTAR2 DB 0
HIT1: DB 0
HIT2: DB 0
T1GO DB 0
T2GO DB 0
DELAY2 DB 0
Y1 DW 390*32
X1 DW 514*32
Y DW 390*32
X DW 514*32
VX DW 0
VY DW 0
THETA DB 0
THETA1 DB 0
THETA2 DB 0
VTHETA1 DB 0
VTHETA2 DB 0
MTHRUST1 DB 0
MTHRUST2 DB 0
VX1 DW 0
VY1 DW 0
VX2 DW 0
VY2 DW 0
X2 DW 400*32
Y2 DW 250*32
T1X DW 0
T1Y DW 0
VT1X DW 0
VT1Y DW 0
T2X DW 0
T2Y DW 0
VT2X DW 0
VT2Y DW 0
TLIFE1 DB 0
TLIFE2 DB 0
RATE DB 0
MAG DB 0
SPSAVE DW 0
BUF1 DS 150
BUF2 DS 150
BUF3 DS 150
STACK DS 256
;
;
;
;
; MULTIPLICATION ROUTINE
; ============== =======
;
;
; THIS ROUTINE USES BOOTH'S ALGORITHM TO MULTIPLY
; TWO 8-BIT TWO'S-COMPLEMENT NUMBERS AND GENERATE
; A 16-BIT TWO'S-COMPLEMENT PRODUCT. ARGUMENTS
; ARE PASSED IN B AND E, AND THE PRODUCT IS RETURNED
; IN HL. ALL REGISTERS AND FLAGS ARE CLOBBERED
; EXCEPT E. ON RETURN, C IS ZERO, E IS INTACT, AND
; THE SIGN BIT OF E HAS BEEN EXTENDED THROUGH D.
;
;
;
MUL: LXI H,0 ;CLEAR PRODUCT
MOV A,E ;GET MULTIPLICAND
MVI D,0 ;CLEAR HIGH BYTE OF MULTIPLICAND
RLC ;TEST MULTIPLICAND SIGN BIT
JNC POS
MVI D,0FFH ;IF NEGATIVE, EXTEND SIGN BIT THRU D
POS:
;
ORA A ;CLEAR CARRY=B(-1)
MVI C,8 ;STEP COUNT
MOV A,B ;GET MULTIPLIER
RAL ;SET UP TO BEGIN WITH BIT 7
;
LOOP: JC HBS ;JUMP IF B(K)=1
RLC ;TEST B(K-1)
MOV B,A ;SAVE ROTATED MULTIPLIER
JC LBS ;JUMP IF B(K-1)=0
;
NEXT: DCR C ;DECREMENT STEP COUNT
RZ ;FINISHED IF C=0
DAD H ;SHIFT PRODUCT LEFT ONE PLACE
MOV A,B ;GET MULTIPLIER AGAIN
RRC ;RESTORE CARRY CHANGED BY DAD INSTR.
MOV A,B ;ONCE AGAIN GET MULTIPLIER
JMP LOOP
;
HBS: RLC ;TEST B(K-1)
MOV B,A ;SAVE ROTATED MULTIPLIER
JC NEXT ;JUMP IF B(K)=B(K-1)=1
MOV A,L ;SUBTRACT MULTIPLICAND FROM PARTIAL PRODUCT
SUB E
MOV L,A
MOV A,H
SBB D
MOV H,A
JMP NEXT
;
LBS: DAD D ;ADD MULTIPLICAND TO PARTIAL PRODUCT
JMP NEXT
;
;
;
;
;
;
;
;
; SINE AND COSINE ROUTINE
; =======================
;
;
; THIS ROUTINE FINDS SIN(X) AND COS(X) BY A TABLE
; LOOK-UP. ARGUMENTS ARE PASSED IN A AND VALUES
; RETURNED THERE. THE VALUE RETURNED IS AN EIGHT-
; BIT NUMBER IN TWO'S COMPLEMENT FORM, SUCH THAT
; SIN(0) YIELDS 7F HEX AND SIN(PI/2) YIELDS FF.
; ANGLES ARE REPRESENTED AS BINARY FRACTIONS OF
; 2 PI; THAT IS, PI=80H, PI/2 = 40H, AND SO FORTH.
; THERE ARE SEPARATE ENTRY POINTS FOR SINE AND
; COSINE. THE TABLE USED IS ONLY FOR THE FIRST
; QUADRANT AND CONTAINS 8-BIT UNSIGNED VALUES OF
; SIN(X). ONE BIT OF PRECISION IS LOST WHEN THESE
; ARE CONVERTED TO SIGNED 8-BIT NUMBERS.
;
;
; SINE TABLE
; ==========
;
SINES: DB 000H,006H,00CH,013H,019H,01FH,025H,02CH
DB 032H,038H,03EH,044H,04AH,050H,056H,05CH
DB 062H,067H,06DH,073H,078H,07EH,083H,086H
DB 08EH,093H,098H,09DH,0A2H,0A7H,0ACH,0B0H
DB 0B5H,0B9H,0BDH,0C2H,0C6H,0CAH,0CDH,0D1H
DB 0D5H,0D8H,0DBH,0DEH,0E2H,0E4H,0E7H,0EAH
DB 0ECH,0EFH,0F1H,0F3H,0F5H,0F6H,0F8H,0FAH
DB 0FBH,0FCH,0FDH,0FEH,0FFH,0FFH,0FFH,0FFH
DB 0FFH
;
;
;
;
; COSINE ENTRY POINT
; ====== ===== =====
;
COS: ADI 100Q
;
;
; SINE ENTRY POINT
; ==== ===== =====
;
;
SIN: MVI C,1 ;CLEAR FLAG
MOV B,A ;SAVE ARGUMENT
RLC ;TEST BIT 7
JC Q34 ;SET- QUADRANT 3 OR 4
RLC ;TEST BIT 6
MOV A,B ;GET ARGUMENT BACK
JNC Q1 ;JUMP IF 1ST QUADRANT
MVI A,200Q ;BIT 6 SET- 2ND QUADRANT
SUB B ;TAKE SIN(PI-X)
Q1: LXI H,SINES ;GET START OF SINE TABLE
MVI D,0 ;GET OFFSET IN DE
MOV E,A
DAD D ;GET ENTRY ADDRESS
MOV A,M ;GET VALUE FROM TABLE
ORA A ;CLEAR CARRY
RAR ;DIVIDE BY TWO
DCR C ;TEST FLAG
RZ ;RETURN IF RESULT POSITIVE
CMA ;NEGATE RESULT
INR A
RET
;
Q34: MVI C,2 ;SET FLAG
RLC ;TEST BIT 6
MOV A,B ;GET ARGUMENT BACK
JC Q4 ;JUMP IF 4TH QUADRANT
SUI 200Q ;SUBTRACT PI FROM ARGUMENT
JMP Q1 ;NOW TREAT AS FIRST QUADRANT
;
Q4: CMA ;NEGATE ARGUMENT
INR A
JMP Q1
;
;
;
;
;
;
;
; OUTPUT CHARACTER TO SCOPE
; ====== ========= == =====
;
; CALL WITH CHARACTER IN C.
; CLOBBERS A AND FLAGS.
;
;
TYOUT: IN TEKSTAT
RRC
JNC TYOUT
MOV A,C
OUT TEKDATA
RET
;
;
;
;
; TEKX AND TEKY
; =============
;
; THESE ROUTINES TAKE A 10-BIT QUANTITY IN HL, CONVERT IT
; TO TEKTRONIX 4013 COORDINATES, AND LEAVE THE TWO RESULTING
; BYTES IN H AND L. TEKY APPENDS THE PROPER HIGH-ORDER
; OCTAL DIGIT (IN EACH BYTE) FOR Y-COORDINATES, AND
; TEKX DOES THE SAME FOR X-COORDINATES.
;
;
;
TEKX: MVI B,40H
DB 11H
TEKY: MVI B,60H
MOV C,H
MOV A,H
RRC
RRC
ANI 1FH
ORI 20H
MOV H,A
MOV A,L
RLC
RLC
RLC
ANI 7
MOV L,A
MOV A,C
RLC
RLC
RLC
ANI 18H
ORA L
ORA B
MOV L,A
RET
;
;
;
;
;
;
;
END