mirror of
https://github.com/dschmenk/LightCycles.git
synced 2024-06-10 03:29:33 +00:00
1090 lines
16 KiB
NASM
Executable File
1090 lines
16 KiB
NASM
Executable File
;*
|
|
;* Light Cycles 3D
|
|
;*
|
|
KEYBD = $C000 ; Keyboard addresses
|
|
KEYSTRB = $C010
|
|
SPEAKER = $C030
|
|
GCSTROBE = $C070
|
|
GC0 = $C064
|
|
GC1 = $C065
|
|
GCPB1 = $C061
|
|
GCPB2 = $C062
|
|
STPTRL = $06
|
|
STPTRH = $07
|
|
STPTR = STPTRL
|
|
ANGLE = $08
|
|
SCANIDX = $08
|
|
SCANLN = $09
|
|
VIEWPORT = $0A
|
|
XVIEWF = $20
|
|
XVIEWI = $21
|
|
YVIEWF = $22
|
|
YVIEWI = $23
|
|
CH = $24
|
|
CV = $25
|
|
TBAS1L = $28
|
|
TBAS1H = $29
|
|
TBAS1 = TBAS1L
|
|
TBAS2L = $2A
|
|
TBAS2H = $2B
|
|
TBAS2 = TBAS2L
|
|
INVFLAG = $32
|
|
S_FRACL = $1A
|
|
S_FRACH = $1B
|
|
S_INT = $1C
|
|
T_FRACL = $1D
|
|
T_FRACH = $1E
|
|
T_INT = $1F
|
|
DS_FRACL= $4E
|
|
DS_FRACH= $3A
|
|
DS_INT = $3B
|
|
DT_FRACL= $4F
|
|
DT_FRACH= $3C
|
|
DT_INT = $3D
|
|
S_MIDFL = $50
|
|
S_MIDFH = $51
|
|
S_MIDI = $52
|
|
T_MIDFL = $53
|
|
T_MIDFH = $54
|
|
T_MIDI = $55
|
|
SRCMASK = $60
|
|
DSTMASK = $61
|
|
DVSR = $F8 ; and $F9
|
|
DVDND = $FA ; and $FB
|
|
QUADRNT = $FC
|
|
SIGN = $FD
|
|
TMP = $FE ; and $FF
|
|
GBASL = $26 ; GR ZP addresses
|
|
GBASH = $27
|
|
GBASE = GBASL
|
|
GPAGE = $2F
|
|
GCLR = $30
|
|
BLACK = $00 ; GR colors
|
|
MAGENTA = $11
|
|
DRKBLU = $22
|
|
PURPLE = $33
|
|
DRKGRN = $44
|
|
GREY = $55
|
|
MEDBLU = $66
|
|
LGTBLU = $77
|
|
BROWN = $88
|
|
ORANGE = $99
|
|
GRAY = $AA
|
|
PINK = $BB
|
|
LGTGRN = $CC
|
|
YELLOW = $DD
|
|
AQUA = $EE
|
|
WHITE = $FF
|
|
HORIZON = 16
|
|
VIEWBOT = 19 ; Bottom viewport
|
|
VIEWTOP = 09
|
|
GCMAX = 127 ; Max value for game controller
|
|
;GCXPOS = $F0
|
|
;GCYPOS = $F1
|
|
;GCBTTNS = $F2
|
|
GCBTTN1 = $80 ; Game controller
|
|
GCBTTN2 = $40
|
|
GCLIMITDLY = 15
|
|
MAP = $A000 ; Arena map
|
|
P1CLR = DRKGRN;LGTGRN
|
|
P1TLCLR = LGTGRN;DRKGRN
|
|
P2CLR = BROWN;PURPLE
|
|
P2TLCLR = PURPLE;BROWN
|
|
FULLBOOST = $F0
|
|
* = $1000
|
|
!SOURCE "intro.asm"
|
|
!SOURCE "drawview.asm"
|
|
!SOURCE "utils.asm"
|
|
;*
|
|
;* Main game loop
|
|
;*
|
|
GAMELOOP
|
|
LDA #$00 ; Clear player status
|
|
STA PSTATUS
|
|
;*
|
|
;* Calculate angle and distance^2 between players
|
|
;*
|
|
LDA P2XF
|
|
SEC
|
|
SBC P1XF
|
|
TAY
|
|
LDA P2XI
|
|
SBC P1XI
|
|
TAX
|
|
TYA
|
|
LDY #$00 ; Assume no X coord flip
|
|
CPX #$80
|
|
BCC +
|
|
JSR NEG
|
|
LDY #$3F
|
|
+ STY QUADRNT
|
|
STA DVSR
|
|
STX DVSR+1
|
|
TXA
|
|
JSR MUL8X8 ; Calc triangle edge (a*a)
|
|
PHA
|
|
TXA
|
|
PHA
|
|
LDA P2YF
|
|
SEC
|
|
SBC P1YF
|
|
TAY
|
|
LDA P2YI
|
|
SBC P1YI
|
|
TAX
|
|
TYA
|
|
LDY #$00 ; Assume no Y coord flip
|
|
CPX #$80
|
|
BCC +
|
|
JSR NEG
|
|
LDY #$7F
|
|
+ STA DVDND
|
|
STX DVDND+1
|
|
TYA
|
|
EOR QUADRNT
|
|
STA QUADRNT
|
|
TXA
|
|
JSR MUL8X8 ; Calc triangle edge (b*b)
|
|
STA TMP
|
|
STX TMP+1
|
|
PLA
|
|
TAX
|
|
PLA
|
|
CLC
|
|
ADC TMP
|
|
STA TMP
|
|
TXA
|
|
LDX #$00
|
|
ADC TMP+1
|
|
STA PPDIST
|
|
BNE + ; Convert distance^2 (c*c) to size for rendering
|
|
LDX #$08 ; Less than 16 tiles away (16*16=256)
|
|
LDA TMP
|
|
- DEX
|
|
LSR
|
|
BNE -
|
|
+ STX PPSIZE
|
|
LDX #$00 ; Assume no octant flip
|
|
LDA DVDND ; Calc tan() in first octant for precision
|
|
CMP DVSR
|
|
LDA DVDND+1
|
|
SBC DVSR+1
|
|
BCC +
|
|
LDA DVDND ; Flip octant
|
|
LDX DVSR ; Swap divisor <-> dividend
|
|
STA DVSR
|
|
STX DVDND
|
|
LDA DVDND+1
|
|
LDX DVSR+1
|
|
STA DVSR+1
|
|
STX DVDND+1
|
|
LDX #$80
|
|
+ STX SIGN ; Use SIGN to save octant flip flag
|
|
LDX DVSR+1 ; Divide 8.8 by 8.0 to get 8.8 result
|
|
LDA DVSR ; Convert divisor to 8.0
|
|
ASL ; Round up
|
|
BCC +
|
|
INX
|
|
+ STX DVSR
|
|
LDA #$00
|
|
STA DVSR+1
|
|
JSR DIV
|
|
CPX #$00
|
|
BEQ +
|
|
LDA #$10 ; On the diagonal
|
|
BNE ++
|
|
+ LDX #$FE
|
|
SRCHTAN INX ; Scan tan() table LSBs for matching angle
|
|
INX
|
|
CMP TAN_TBL,X
|
|
BEQ +
|
|
BCS SRCHTAN ; Less than, reload MSB and keep searching
|
|
+ TXA
|
|
LSR ; Convert index to angle
|
|
LDX SIGN
|
|
BPL ++
|
|
STA TMP ; Reflect octant
|
|
LDA #$20
|
|
SEC
|
|
SBC TMP
|
|
++ EOR QUADRNT ; Reflect into correct quadrant
|
|
STA PPANGLE
|
|
;*
|
|
;* Update rythm based on player-to-player distance
|
|
;*
|
|
LDA DRYTHM
|
|
CLC
|
|
ADC #$01
|
|
CMP PPDIST
|
|
BCC +
|
|
LDA #$00
|
|
LSR VTONE
|
|
BNE +
|
|
LDX #$02
|
|
STX VTONE
|
|
+ STA DRYTHM
|
|
;*
|
|
;* Render views
|
|
;*
|
|
LDA P1ANGLE
|
|
STA ANGLE
|
|
LDA P1XF
|
|
STA XVIEWF
|
|
LDA P1XI
|
|
STA XVIEWI
|
|
LDA P1YF
|
|
STA YVIEWF
|
|
LDA P1YI
|
|
STA YVIEWI
|
|
LDA #$02
|
|
SEC
|
|
SBC P1TURBO
|
|
STA MTONE
|
|
LDA #VIEWTOP
|
|
JSR DRAWVIEW
|
|
LDA P2CYCLE
|
|
STA GCLR
|
|
LDA P1ANGLE
|
|
SEC
|
|
SBC PPANGLE
|
|
AND #$7F
|
|
TAX
|
|
LDA #VIEWTOP
|
|
JSR DRAWENEMY
|
|
LDA P2ANGLE
|
|
STA ANGLE
|
|
LDA P2XF
|
|
STA XVIEWF
|
|
LDA P2XI
|
|
STA XVIEWI
|
|
LDA P2YF
|
|
STA YVIEWF
|
|
LDA P2YI
|
|
STA YVIEWI
|
|
LDA #$02
|
|
SEC
|
|
SBC P2TURBO
|
|
STA MTONE
|
|
LDA #VIEWBOT
|
|
JSR DRAWVIEW
|
|
LDA P1CYCLE
|
|
STA GCLR
|
|
LDA P2ANGLE
|
|
SEC
|
|
SBC PPANGLE
|
|
CLC
|
|
ADC #$40 ; Flip angle to opposite direction
|
|
AND #$7F
|
|
TAX
|
|
LDA #VIEWBOT
|
|
JSR DRAWENEMY
|
|
JSR GSWAP
|
|
;*
|
|
;* AI player update
|
|
;*
|
|
AI1 LDA P1MAN
|
|
BNE AI2
|
|
; BEQ +
|
|
; JMP AI2
|
|
;+
|
|
LDX P1XI
|
|
LDY P1YI
|
|
JSR MAPWTS ; Calc best direction based on map
|
|
LDY P2ANGLE
|
|
LDX #$00
|
|
LDA COS_TBL,Y
|
|
ASL
|
|
BCC +
|
|
DEX
|
|
CLC
|
|
+ ADC P2XF
|
|
TXA
|
|
ADC P2XI
|
|
SEC
|
|
SBC P1XI
|
|
PHA
|
|
LDX #$00
|
|
LDA SIN_TBL,Y
|
|
ASL
|
|
BCC +
|
|
DEX
|
|
CLC
|
|
+ ADC P2YF
|
|
TXA
|
|
ADC P2YI
|
|
SEC
|
|
SBC P1YI
|
|
TAY
|
|
PLA
|
|
TAX
|
|
; LDA P2XF
|
|
; CMP P1XF
|
|
; LDA P2XI
|
|
; SBC P1XI
|
|
; TAX
|
|
; LDA P2YF
|
|
; CMP P1YF
|
|
; LDA P2YI
|
|
; SBC P1YI
|
|
; TAY
|
|
JSR ENMYWT ; Calc best dir based on enemy relative pos
|
|
LDA P1ANGLE ; Default to current angle
|
|
LSR
|
|
LSR
|
|
LSR
|
|
LSR
|
|
LSR
|
|
TAY
|
|
EOR #$02 ; Don't allow 180 degree turns
|
|
TAX
|
|
LDA #$00
|
|
STA AIMOVE,X
|
|
LDA AIMOVE,Y
|
|
LDX #$03
|
|
- CMP AIMOVE,X ; Select highest weighted direction
|
|
BCS +
|
|
TXA
|
|
TAY
|
|
LDA AIMOVE,X
|
|
+ DEX
|
|
BPL -
|
|
TYA ; Convert to angle
|
|
ASL
|
|
ASL
|
|
ASL
|
|
ASL
|
|
ASL
|
|
; CMP P1ANGLE
|
|
; BEQ +
|
|
STA P1ANGLE
|
|
; LDA #$80
|
|
; STA P1XF
|
|
; STA P1YF
|
|
+ LDY #$00
|
|
LDX PPSIZE ; Turbo when enemy is close
|
|
; DEX
|
|
BEQ +
|
|
INY
|
|
+ STY P1TURBO
|
|
; LDX #5
|
|
; LDY #23
|
|
; JSR GOTOXY
|
|
; LDA AIMOVE+0
|
|
; JSR PUTA
|
|
; LDA #' '
|
|
; JSR PUTC
|
|
; LDA AIMOVE+1
|
|
; JSR PUTA
|
|
; LDA #' '
|
|
; JSR PUTC
|
|
; LDA AIMOVE+2
|
|
; JSR PUTA
|
|
; LDA #' '
|
|
; JSR PUTC
|
|
; LDA AIMOVE+3
|
|
; JSR PUTA
|
|
; LDA #'='
|
|
; JSR PUTC
|
|
; LDA P1ANGLE
|
|
; JSR PUTA
|
|
AI2 LDA P2MAN
|
|
BNE READKBD
|
|
; BEQ +
|
|
; JMP READKBD
|
|
;+
|
|
LDX P2XI
|
|
LDY P2YI
|
|
JSR MAPWTS ; Calc best direction based on map
|
|
LDY P1ANGLE
|
|
LDX #$00
|
|
LDA COS_TBL,Y
|
|
ASL
|
|
BCC +
|
|
DEX
|
|
CLC
|
|
+ ADC P1XF
|
|
TXA
|
|
ADC P1XI
|
|
SEC
|
|
SBC P2XI
|
|
PHA
|
|
LDX #$00
|
|
LDA SIN_TBL,Y
|
|
ASL
|
|
BCC +
|
|
DEX
|
|
CLC
|
|
+ ADC P1YF
|
|
TXA
|
|
ADC P1YI
|
|
SEC
|
|
SBC P2YI
|
|
TAY
|
|
PLA
|
|
TAX
|
|
; LDA P1XF
|
|
; CMP P2XF
|
|
; LDA P1XI
|
|
; SBC P2XI
|
|
; TAX
|
|
; LDA P1YF
|
|
; CMP P2YF
|
|
; LDA P1YI
|
|
; SBC P2YI
|
|
; TAY
|
|
JSR ENMYWT ; Calc best dir based on enemy relative pos
|
|
LDA P2ANGLE ; Default to current angle
|
|
LSR
|
|
LSR
|
|
LSR
|
|
LSR
|
|
LSR
|
|
TAY
|
|
EOR #$02 ; Don't allow 180 degree turns
|
|
TAX
|
|
LDA #$00
|
|
STA AIMOVE,X
|
|
LDA AIMOVE,Y
|
|
LDX #$03
|
|
- CMP AIMOVE,X ; Select highest weighted direction
|
|
BCS +
|
|
TXA
|
|
TAY
|
|
LDA AIMOVE,X
|
|
+ DEX
|
|
BPL -
|
|
TYA ; Convert to angle
|
|
ASL
|
|
ASL
|
|
ASL
|
|
ASL
|
|
ASL
|
|
; CMP P2ANGLE
|
|
; BEQ +
|
|
STA P2ANGLE
|
|
; LDA #$80
|
|
; STA P2XF
|
|
; STA P2YF
|
|
+ LDY #$00
|
|
LDX PPSIZE ; Turbo when enemy is close
|
|
; DEX
|
|
BEQ +
|
|
INY
|
|
+ STY P2TURBO
|
|
; LDX #25
|
|
; LDY #23
|
|
; JSR GOTOXY
|
|
; LDA AIMOVE+0
|
|
; JSR PUTA
|
|
; LDA #' '
|
|
; JSR PUTC
|
|
; LDA AIMOVE+1
|
|
; JSR PUTA
|
|
; LDA #' '
|
|
; JSR PUTC
|
|
; LDA AIMOVE+2
|
|
; JSR PUTA
|
|
; LDA #' '
|
|
; JSR PUTC
|
|
; LDA AIMOVE+3
|
|
; JSR PUTA
|
|
; LDA #'='
|
|
; JSR PUTC
|
|
; LDA P2ANGLE
|
|
; JSR PUTA
|
|
;*
|
|
;* Get player input and update position
|
|
;*
|
|
READKBD LDA KEYBD
|
|
BMI +
|
|
JMP READPDL
|
|
+ BIT KEYSTRB
|
|
CMP #$9B ; ESC key?
|
|
BNE +
|
|
- LDA KEYBD ; Pause
|
|
BPL -
|
|
BIT KEYSTRB
|
|
CMP #$D1 ; Quit
|
|
BNE +
|
|
LDA #$03
|
|
STA PSTATUS
|
|
RTS
|
|
+ LDX USEPDLS
|
|
BEQ +
|
|
JMP READPDL
|
|
+ LDX P1MAN
|
|
BEQ ++
|
|
CMP #$C1 ; A key
|
|
BNE +
|
|
LDA P1ANGLE
|
|
SEC
|
|
SBC #$20
|
|
AND #$7F
|
|
STA P1ANGLE
|
|
; LDA #$80
|
|
; STA P1XF
|
|
; STA P1YF
|
|
BNE READPDL
|
|
+ CMP #$C4 ; D key
|
|
BNE +
|
|
LDA P1ANGLE
|
|
CLC
|
|
ADC #$20
|
|
AND #$7F
|
|
STA P1ANGLE
|
|
; LDA #$80
|
|
; STA P1XF
|
|
; STA P1YF
|
|
BNE READPDL
|
|
+ CMP #$D3 ; S key
|
|
BNE ++
|
|
LDA P1TURBO
|
|
EOR #$01
|
|
STA P1TURBO
|
|
BPL READPDL
|
|
++ LDX P2MAN
|
|
BEQ READPDL
|
|
CMP #$CA ; J key
|
|
BNE +
|
|
LDA P2ANGLE
|
|
SEC
|
|
SBC #$20
|
|
AND #$7F
|
|
STA P2ANGLE
|
|
; LDA #$80
|
|
; STA P2XF
|
|
; STA P2YF
|
|
BNE READPDL
|
|
+ CMP #$CC ; L key
|
|
BNE +
|
|
LDA P2ANGLE
|
|
CLC
|
|
ADC #$20
|
|
AND #$7F
|
|
STA P2ANGLE
|
|
; LDA #$80
|
|
; STA P2XF
|
|
; STA P2YF
|
|
BNE READPDL
|
|
+ CMP #$CB ; K key
|
|
BNE READPDL
|
|
LDA P2TURBO
|
|
EOR #$01
|
|
STA P2TURBO
|
|
READPDL JSR GCREAD
|
|
PHA
|
|
LDA USEPDLS
|
|
BNE +
|
|
PLA
|
|
JMP CHKBOOST
|
|
+ LDA P1MAN ; Check for player 1 AI
|
|
BEQ +
|
|
LDA #$00
|
|
STA P1TURBO
|
|
PLA
|
|
PHA
|
|
BPL ++
|
|
INC P1TURBO
|
|
BNE ++
|
|
+ LDY #GCMAX/2
|
|
++ LDA P2MAN ; Check for player 2 AI
|
|
BEQ +
|
|
LDA #$00
|
|
STA P2TURBO
|
|
PLA
|
|
ASL
|
|
BPL ++
|
|
INC P2TURBO
|
|
BNE ++
|
|
+ LDX #GCMAX/2
|
|
PLA
|
|
++ JSR UPDTPDL
|
|
TYA
|
|
SEC
|
|
SBC #GCMAX/16
|
|
CLC
|
|
ADC P1ANGLE
|
|
AND #$7F
|
|
STA P1ANGLE
|
|
TXA
|
|
SEC
|
|
SBC #GCMAX/16
|
|
CLC
|
|
ADC P2ANGLE
|
|
AND #$7F
|
|
STA P2ANGLE
|
|
CHKBOOST LDA P1TURBO
|
|
BEQ ++
|
|
LDA P1BOOST
|
|
BEQ +
|
|
SEC
|
|
SBC #$08
|
|
STA P1BOOST
|
|
LDX #3
|
|
LDY #21
|
|
JSR UPDTBST
|
|
LDA #$01
|
|
+ STA P1TURBO
|
|
++ LDA P2TURBO
|
|
BEQ P1MOVE
|
|
LDA P2BOOST
|
|
BEQ +
|
|
SEC
|
|
SBC #$08
|
|
STA P2BOOST
|
|
LDX #22
|
|
LDY #21
|
|
JSR UPDTBST
|
|
LDA #$01
|
|
+ STA P2TURBO
|
|
;*
|
|
;* Update player 1
|
|
;*
|
|
P1MOVE LDY P1ANGLE
|
|
LDA P1TURBO
|
|
LSR
|
|
LDX #$00
|
|
LDA COS_TBL,Y
|
|
BPL + ; Sign extend into X
|
|
DEX
|
|
+ BCS + ; Turbo active?
|
|
CMP #$80
|
|
ROR
|
|
+ CLC
|
|
ADC P1XF
|
|
STA P1XF
|
|
TXA
|
|
ADC P1XI
|
|
STA P1XI
|
|
LDA P1TURBO
|
|
LSR
|
|
LDX #$00
|
|
LDA SIN_TBL,Y
|
|
BPL + ; Sign extend into X
|
|
DEX
|
|
+ BCS + ; Turbo active?
|
|
CMP #$80
|
|
ROR
|
|
+ CLC
|
|
ADC P1YF
|
|
STA P1YF
|
|
TXA
|
|
ADC P1YI
|
|
STA P1YI
|
|
;*
|
|
;* Update player 2
|
|
;*
|
|
P2MOVE LDY P2ANGLE
|
|
LDA P2TURBO
|
|
LSR
|
|
LDX #$00
|
|
LDA COS_TBL,Y
|
|
BPL + ; Sign extend into X
|
|
DEX
|
|
+ BCS + ; Turbo active?
|
|
CMP #$80
|
|
ROR
|
|
+ CLC
|
|
ADC P2XF
|
|
STA P2XF
|
|
TXA
|
|
ADC P2XI
|
|
STA P2XI
|
|
LDA P2TURBO
|
|
LSR
|
|
LDX #$00
|
|
LDA SIN_TBL,Y
|
|
BPL + ; Sign extend into X
|
|
DEX
|
|
+ BCS + ; Turbo active?
|
|
CMP #$80
|
|
ROR
|
|
+ CLC
|
|
ADC P2YF
|
|
STA P2YF
|
|
TXA
|
|
ADC P2YI
|
|
STA P2YI
|
|
;*
|
|
;* Check for collision
|
|
;*
|
|
;LDA P2YI
|
|
CMP P1YI
|
|
BNE UPDTAIL1
|
|
LDA P2XI
|
|
CMP P1XI
|
|
BNE UPDTAIL1
|
|
LDA #$03
|
|
STA PSTATUS
|
|
;*
|
|
;* Update map with tails
|
|
;*
|
|
UPDTAIL1 LDX P1XI ; Player 1 tail
|
|
LDY P1YI
|
|
CPX P1XPREV
|
|
BNE +
|
|
CPY P1YPREV
|
|
BEQ UPDTAIL2
|
|
+ STX P1XPREV
|
|
STY P1YPREV
|
|
INC P1HEAD
|
|
LDA P1HEAD
|
|
AND LENTAIL
|
|
TAX
|
|
PHA
|
|
LDY P1XTAIL,X
|
|
LDA P1YTAIL,X
|
|
TAX
|
|
LDA MAP_TBLL,X
|
|
STA TMP
|
|
LDA MAP_TBLH,X
|
|
STA TMP+1
|
|
TXA ; Which color to clear to
|
|
LSR
|
|
TYA
|
|
ADC #$00
|
|
; LDA P1XTAIL,X ; Which color to clear to
|
|
; EOR P1YTAIL,X
|
|
LSR
|
|
LDA #GREY
|
|
BCS +
|
|
LDA #DRKBLU
|
|
+ STA (TMP),Y ; Clear map
|
|
PLA
|
|
TAX
|
|
LDA P1XI
|
|
CMP #$40
|
|
BCS DEREZ1
|
|
STA P1XTAIL,X
|
|
TAY
|
|
LDA P1YI
|
|
CMP #$40
|
|
BCS DEREZ1
|
|
STA P1YTAIL,X
|
|
TAX
|
|
LDA MAP_TBLL,X
|
|
STA TMP
|
|
LDA MAP_TBLH,X
|
|
STA TMP+1
|
|
LDA (TMP),Y
|
|
CMP #DRKBLU
|
|
BEQ +
|
|
CMP #GREY
|
|
BEQ +
|
|
DEREZ1 LDA #$01 ; Uh, oh. Player 1 derez!
|
|
ORA PSTATUS
|
|
STA PSTATUS
|
|
BNE UPDTAIL2
|
|
+ LDA #P1TLCLR
|
|
STA (TMP),Y
|
|
UPDTAIL2 LDX P2XI ; Player 2 tail
|
|
LDY P2YI
|
|
CPX P2XPREV
|
|
BNE +
|
|
CPY P2YPREV
|
|
BEQ CHKSTAT
|
|
+ STX P2XPREV
|
|
STY P2YPREV
|
|
INC P2HEAD
|
|
LDA P2HEAD
|
|
AND LENTAIL
|
|
TAX
|
|
PHA
|
|
LDY P2XTAIL,X
|
|
LDA P2YTAIL,X
|
|
TAX
|
|
LDA MAP_TBLL,X
|
|
STA TMP
|
|
LDA MAP_TBLH,X
|
|
STA TMP+1
|
|
TXA ; Which color to clear to
|
|
LSR
|
|
TYA
|
|
ADC #$00
|
|
; LDA P2XTAIL,X ; Which color to clear to
|
|
; EOR P2YTAIL,X
|
|
LSR
|
|
LDA #GREY
|
|
BCS +
|
|
LDA #DRKBLU
|
|
+ STA (TMP),Y ; Clear map
|
|
PLA
|
|
TAX
|
|
LDA P2XI
|
|
CMP #$40
|
|
BCS DEREZ2
|
|
STA P2XTAIL,X
|
|
TAY
|
|
LDA P2YI
|
|
CMP #$40
|
|
BCS DEREZ2
|
|
STA P2YTAIL,X
|
|
TAX
|
|
LDA MAP_TBLL,X
|
|
STA TMP
|
|
LDA MAP_TBLH,X
|
|
STA TMP+1
|
|
LDA (TMP),Y
|
|
CMP #DRKBLU
|
|
BEQ +
|
|
CMP #GREY
|
|
BEQ +
|
|
DEREZ2 LDA #$02 ; Uh, oh. Player 2 derez!
|
|
ORA PSTATUS
|
|
STA PSTATUS
|
|
BNE GAMEOVER
|
|
+ LDA #P2TLCLR
|
|
STA (TMP),Y
|
|
CHKSTAT LDA PSTATUS
|
|
BNE GAMEOVER
|
|
INC FRAMENUM
|
|
LDA FRAMENUM
|
|
LSR
|
|
AND #$03
|
|
TAX
|
|
LDA P1CYCLE+1,X
|
|
STA P1CYCLE
|
|
LDA P2CYCLE+1,X
|
|
STA P2CYCLE
|
|
; LDX #19
|
|
; LDY #23
|
|
; JSR GOTOXY
|
|
; LDA FRAMENUM
|
|
; JSR PUTA
|
|
JMP GAMELOOP
|
|
GAMEOVER RTS
|
|
;*
|
|
;* Calc best direction based on map
|
|
;*
|
|
MAPWTS LDA #$00
|
|
STA AIMOVE+0
|
|
STA AIMOVE+1
|
|
STA AIMOVE+2
|
|
STA AIMOVE+3
|
|
TYA
|
|
PHA
|
|
TXA
|
|
PHA
|
|
TYA
|
|
TAX
|
|
LDA MAP_TBLL,X
|
|
STA TMP
|
|
LDA MAP_TBLH,X
|
|
STA TMP+1 ; Check map for obstacles
|
|
PLA
|
|
PHA
|
|
TAY
|
|
INY ; Check +X
|
|
CPY #$40
|
|
BCS ++ ; Off map
|
|
LDA (TMP),Y
|
|
CMP #DRKBLU
|
|
BEQ +
|
|
CMP #GREY
|
|
BNE ++ ; Some kind of obstacle
|
|
+ LDA #$04
|
|
STA AIMOVE+0
|
|
INY ; Check ++X
|
|
CPY #$40
|
|
BCS ++ ; Off map
|
|
LDA (TMP),Y
|
|
CMP #DRKBLU
|
|
BEQ +
|
|
CMP #GREY
|
|
BNE ++ ; Some kind of obstacle
|
|
+ LDA #$05
|
|
STA AIMOVE+0
|
|
++ PLA
|
|
PHA
|
|
TAY
|
|
DEY ; Check -X
|
|
BMI ++ ; Off map
|
|
LDA (TMP),Y
|
|
CMP #DRKBLU
|
|
BEQ +
|
|
CMP #GREY
|
|
BNE ++ ; Some kind of obstacle
|
|
+ LDA #$04
|
|
STA AIMOVE+2
|
|
DEY ; Check --X
|
|
BMI ++ ; Off map
|
|
LDA (TMP),Y
|
|
CMP #DRKBLU
|
|
BEQ +
|
|
CMP #GREY
|
|
BNE ++ ; Some kind of obstacle
|
|
+ LDA #$05
|
|
STA AIMOVE+2
|
|
++ PLA
|
|
TAY
|
|
PLA
|
|
PHA
|
|
TAX
|
|
INX ; Check +Y
|
|
CPX #$40
|
|
BCS ++
|
|
LDA MAP_TBLL,X
|
|
STA TMP
|
|
LDA MAP_TBLH,X
|
|
STA TMP+1
|
|
LDA (TMP),Y
|
|
CMP #DRKBLU
|
|
BEQ +
|
|
CMP #GREY
|
|
BNE ++ ; Some kind of obstacle
|
|
+ LDA #$04
|
|
STA AIMOVE+1
|
|
INX ; Check ++Y
|
|
CPX #$40
|
|
BCS ++
|
|
LDA MAP_TBLL,X
|
|
STA TMP
|
|
LDA MAP_TBLH,X
|
|
STA TMP+1
|
|
LDA (TMP),Y
|
|
CMP #DRKBLU
|
|
BEQ +
|
|
CMP #GREY
|
|
BNE ++ ; Some kind of obstacle
|
|
+ LDA #$05
|
|
STA AIMOVE+1
|
|
++ PLA
|
|
TAX
|
|
DEX ; Check -Y
|
|
BMI ++
|
|
LDA MAP_TBLL,X
|
|
STA TMP
|
|
LDA MAP_TBLH,X
|
|
STA TMP+1
|
|
LDA (TMP),Y
|
|
CMP #DRKBLU
|
|
BEQ +
|
|
CMP #GREY
|
|
BNE ++ ; Some kind of obstacle
|
|
+ LDA #$04
|
|
STA AIMOVE+3
|
|
DEX ; Check --Y
|
|
BMI ++
|
|
LDA MAP_TBLL,X
|
|
STA TMP
|
|
LDA MAP_TBLH,X
|
|
STA TMP+1
|
|
LDA (TMP),Y
|
|
CMP #DRKBLU
|
|
BEQ +
|
|
CMP #GREY
|
|
BNE ++ ; Some kind of obstacle
|
|
+ LDA #$05
|
|
STA AIMOVE+3
|
|
++ RTS
|
|
;*
|
|
;* Calc best direction based on relative enemy poition
|
|
;*
|
|
ENMYWT TXA
|
|
BEQ ++
|
|
BMI +
|
|
INC AIMOVE+0 ; Enemy to the right
|
|
INC AIMOVE+0
|
|
BNE ++
|
|
+ INC AIMOVE+2 ; Enemy to the left
|
|
INC AIMOVE+2
|
|
++ TYA
|
|
BEQ ++
|
|
BMI +
|
|
INC AIMOVE+1 ; Enemy above
|
|
INC AIMOVE+1
|
|
RTS
|
|
+ INC AIMOVE+3 ; Enemy below
|
|
INC AIMOVE+3
|
|
++ RTS
|
|
;*
|
|
;* Player variables
|
|
;*
|
|
PSTATUS !BYTE $00 ; Player alive status
|
|
PPANGLE !BYTE $00 ; Player-to-player angle
|
|
PPDIST !BYTE $00 ; Player-to=player distance^2
|
|
PPSIZE !BYTE $00 ; Player-to-player size
|
|
LENTAIL !BYTE $0F ; Tail length
|
|
P1MAN !BYTE $01 ; Human/AI
|
|
P1ANGLE !BYTE $00 ; Direction
|
|
P1XF !BYTE $00 ; Position
|
|
P1XI !BYTE $00
|
|
P1YF !BYTE $00
|
|
P1YI !BYTE $00
|
|
P1TURBO !BYTE $00
|
|
P1BOOST !BYTE $F0
|
|
P1XPREV !BYTE $FF
|
|
P1YPREV !BYTE $FF
|
|
P1HEAD !BYTE $00 ; Tail list - set length for easy/med/hard
|
|
P1XTAIL !FILL 256
|
|
P1YTAIL !FILL 256
|
|
P1CYCLE !BYTE P1CLR,GRAY,P1CLR,WHITE,P1CLR
|
|
P2MAN !BYTE $01 ; Human/AI
|
|
P2ANGLE !BYTE $00 ; Direction
|
|
P2XF !BYTE $00 ; Position
|
|
P2XI !BYTE $00
|
|
P2YF !BYTE $00
|
|
P2YI !BYTE $00
|
|
P2TURBO !BYTE $00
|
|
P2BOOST !BYTE $F0
|
|
P2XPREV !BYTE $FF
|
|
P2YPREV !BYTE $FF
|
|
P2HEAD !BYTE $00 ; Tail list - set length for easy/med/hard
|
|
P2XTAIL !FILL 256
|
|
P2YTAIL !FILL 256
|
|
P2CYCLE !BYTE P2CLR,GRAY,P2CLR,WHITE,P2CLR
|
|
;*
|
|
;* AI best move weights
|
|
;*
|
|
AIMOVE !BYTE $00,$00,$00,$00
|
|
;*
|
|
;* Working variables
|
|
;*
|
|
USEPDLS !BYTE $00
|
|
CURPAGE !BYTE $01
|
|
PGBASE !BYTE $08,$04
|
|
FRAMENUM !BYTE $00
|
|
DRYTHM !BYTE $00
|
|
VTONE !BYTE $01
|
|
VDLY !BYTE $01
|
|
MTONE !BYTE $01
|
|
MDLY !BYTE $01
|
|
;*
|
|
;* Background walls - set each wall quadrant to a different color
|
|
;*
|
|
WALLS !BYTE PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK
|
|
!BYTE YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW
|
|
!BYTE YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW,YELLOW
|
|
!BYTE AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA
|
|
!BYTE AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA,AQUA
|
|
!BYTE ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE
|
|
!BYTE ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE,ORANGE
|
|
!BYTE PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK,PINK
|
|
;*
|
|
;* Map row addresses
|
|
;*
|
|
MAP_TBLL !BYTE $00,$40,$80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0
|
|
!BYTE $00,$40,$80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0
|
|
!BYTE $00,$40,$80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0
|
|
!BYTE $00,$40,$80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0
|
|
MAP_TBLH !BYTE $00+>MAP,$00+>MAP,$00+>MAP,$00+>MAP,$01+>MAP,$01+>MAP,$01+>MAP,$01+>MAP,$02+>MAP,$02+>MAP,$02+>MAP,$02+>MAP,$03+>MAP,$03+>MAP,$03+>MAP,$03+>MAP
|
|
!BYTE $04+>MAP,$04+>MAP,$04+>MAP,$04+>MAP,$05+>MAP,$05+>MAP,$05+>MAP,$05+>MAP,$06+>MAP,$06+>MAP,$06+>MAP,$06+>MAP,$07+>MAP,$07+>MAP,$07+>MAP,$07+>MAP
|
|
!BYTE $08+>MAP,$08+>MAP,$08+>MAP,$08+>MAP,$09+>MAP,$09+>MAP,$09+>MAP,$09+>MAP,$0A+>MAP,$0A+>MAP,$0A+>MAP,$0A+>MAP,$0B+>MAP,$0B+>MAP,$0B+>MAP,$0B+>MAP
|
|
!BYTE $0C+>MAP,$0C+>MAP,$0C+>MAP,$0C+>MAP,$0D+>MAP,$0D+>MAP,$0D+>MAP,$0D+>MAP,$0E+>MAP,$0E+>MAP,$0E+>MAP,$0E+>MAP,$0F+>MAP,$0F+>MAP,$0F+>MAP,$0F+>MAP
|
|
;*
|
|
;* Text/GR screen row addresses
|
|
;*
|
|
TXT_TBLL ; TXT/GR row pointers
|
|
!BYTE <$000,<$080,<$100,<$180,<$200,<$280,<$300,<$380
|
|
!BYTE <$028,<$0A8,<$128,<$1A8,<$228,<$2A8,<$328,<$3A8
|
|
!BYTE <$050,<$0D0,<$150,<$1D0,<$250,<$2D0,<$350,<$3D0
|
|
TXT_TBLH ; TXT/GR row pointers
|
|
!BYTE >$000,>$080,>$100,>$180,>$200,>$280,>$300,>$380
|
|
!BYTE >$028,>$0A8,>$128,>$1A8,>$228,>$2A8,>$328,>$3A8
|
|
!BYTE >$050,>$0D0,>$150,>$1D0,>$250,>$2D0,>$350,>$3D0
|
|
!SOURCE "grnd_st.asm"
|
|
!SOURCE "sincos.asm"
|
|
!SOURCE "tan.asm"
|
|
!WORD $FFFF ; Make sure tan() table search stops here
|
|
|