 |
;----------------------------------------------------
; Disassembly of the file Bega's Battle ROMs
; by Jeff Kulczycki, August 20, 2002
;----------------------------------------------------
; 6502 Microprocessor
;----------------------------------------------------
; RAM VARIABLES
;----------------------------------------------------
; Address Description
;----------------------------------------------------
; 0081 Player1 Lives
; 0082 Player2 Lives
; 0083 MasterRegister
; .0-1 Bega Glow state (0-3)
; .2
; .3
; .4-5 Bega Barrier state?
; .6
; .7
; 0084 Unknown
; 0093 joy
; 0094 joy
; 0219 Credits
; 021A Coin Count
; 0251 unknown 25
; 0252 unknown 25
; 04BD Joystick direction
; 1000 Input Bank
; .0 Down joystick
; .1 Up joystick
; .2 Left joystick
; .3 Right joystick
; .4 S3 Service Sw?
; .5 S2 "Barrier"
; .6 S1 "Teleport"?
; .7 Tile
; 1001 .4 Player2 button
; .5 Player1 button
; .6 Coin slot1
; .7 Coin slot2
; 1002 DIP Switch 2
; .0-.1 Sw1-2 Number of Begas
; .2 Sw3 0=Continuous,1=Not
; .3-.4 Sw4-5 Bonus Threshold
; .5 Sw6 0=Hard, 1=Normal
; .6 Sw7 0=Upright,1=Cockpit // Factory Diagnosis
; .7 Sw8 0=Diagnostics,1=Normal
; 1003 Vertical Blanking input?
; 1004 Sound Board
; 1005 Sound Board
; 1007 unknown
;----------------------------------------------------
; Address 1006/1007
;----------------------------------------------------
; .......1 6850 UART Read: Receive data reg full
; ......1. 6850 UART Read: Xmit data reg empty
; .....1.. 6850 UART Read: Data carrier detect (or has been down)
; ....1... 6850 UART Read: Clear to send
; ...1.... 6850 UART Read: Framing error
; ..1..... 6850 UART Read: Receiver overrun
; .1...... 6850 UART Read: Parity error
; 1....... 6850 UART Read: Interrupt request
;----------------------------------------------------
; 0000-0FFF ZeroPage RAM
; 1000-1FFF Hardware Inputs/Outputs
; 1800-1837 Video Color RAM
; 2000-201F unknown
; 2020-23FF Screen1 Text 32x30 (Tiles)
; 2400-27FF Screen1 Character Bank register
; 2800-281F Sprite Bank1 (8 sprites)
; 2820-2BDF Screen2 Text 32x30 (Tiles)
; 2BE0-2BFF Sprite Bank2 (8 sprites)
; 2C00-2FFF Screen2 Character Bank register
; 3000-301F unknown
; 3020-33FF Screen3 Text 32x30 (Tiles)
; 3400-37FF Screen3 Character Bank register
; 3800-381F Sprite Bank3 (8 sprites)
; 3820-3BDF Screen4 Text 32x30 (Tiles)
; 3BE0-3BFF Sprite Bank4 (8 sprites)
; 3C00-3FFF Screen4 Character Bank register
; 4000-DFFF Program ROM
;----------------------------------------------------
; Char $8C - $9F hit bonuses 200,400,800,1000,1600
; Note: BPL Branch if bit7 is clear
; 3800 = properties
; 3801 = character number
; 3802 = y coord
; 3803 = x coord
;
; Start of code
;
ORG $4000
;----------------------------------------------------
; Interrupt Routines
;----------------------------------------------------
L4000: JMP L4D64 ; Check for Coins
L4003: JMP L4009 ; Start Program
L4006: JMP L4FD2 ; Check for LDPlayer Errors
;----------------------------------------------------
; Start program
;----------------------------------------------------
L4009: SEI ; Enable Interrupts
CLD ; Clear Decimal Mode
LDX #$FF
TXS
LDA #$00
STA L1000
STA L0200
STA L1001
JSR L43C2
JSR L43B4
LDA #$01
STA L0200
LDA #$00
STA VTIMR4
JSR L4501 ; Determine number of Begas
;----------------------------------------------------
; Delay Time for Startup
;----------------------------------------------------
LDY #$0F ; Delay Loop Y = 15
L402E: LDX #$3F ; Delay X = 63
JSR L4BD2 ; Run Programmable Delay
DEY ; Continue delay loop
BNE L402E ; Loop until Y = 0
;----------------------------------------------------
; unknown
;----------------------------------------------------
LDA #$03 ;
STA L1000 ;
CLI ; Disable interrupts
;----------------------------------------------------
; Attract Mode
;----------------------------------------------------
L403C: JSR L4098 ; Show instructions if credit awarded
L403F: JSR L459A ; Erase Video Screen
JSR L4098 ; Show instructions if credit awarded
JSR L719E ; Screen Transition, Fill from outside in
JSR L4098 ; Show instructions if credit awarded
LDA #$2D ; Video Sequence = Attract Mode (Frame 43901)
JSR L54A7 ; Play LaserDisc video sequence
;----------------------------------------------------
; Wait for SEARCH to complete or PLAY to complete
;----------------------------------------------------
L4050: LDA SearchStatus ; Check LDP search status
CMP #$01 ; Is attract footage playing?
BEQ L4066 ; Yes, so skip to the next section
CMP #$02 ; Is attract footage SEARCH complete?
BEQ L4066 ; Yes, so skip to the next section
LDX #$01 ; Delay X = 1
JSR L4BD2 ; Run Programmable Delay
JSR L4098 ; Show instructions if credit awarded
JMP L4050 ; Loop back and wait for SEARCH complete
;----------------------------------------------------
; Clear screen and wait for LDPlayer to finish playing
;----------------------------------------------------
L4066: JSR L71B8 ; Screen Transition, Clear from inside out
L4069: LDA SearchStatus ; Check LDP search status
CMP #$02 ; Have we finished playing Attract footage?
BEQ L407B ; Yes, so now we show High Scores
LDX #$01 ; Delay = 1
JSR L4BD2 ; Run Programmable Delay
JSR L4098 ; Show instructions if credit awarded
JMP L4069 ; Loop back and wait
;----------------------------------------------------
; High Score Screen during Attract Mode
;----------------------------------------------------
L407B: JSR L4496 ; Print High Scores
LDA #$2E ; Video Sequence = High Score Mode (Frame 46344)
JSR L54A7 ; Play LaserDisc video sequence
;----------------------------------------------------
; Wait for High Score footage to play
;----------------------------------------------------
L4083: LDA SearchStatus ; Check LDP search status
CMP #$02 ; Have we finished playing High Score footage?
BEQ L4095 ; Yes, so loop back and repeat Attract Mode
LDX #$01 ; Delay = 1
JSR L4BD2 ; Run Programmable Delay
JSR L4098 ; Show instructions if credit awarded
JMP L4083 ; Loop back here until High Score footage has completed
L4095: JMP L403C ; Loop back and repeat Attract Mode
;----------------------------------------------------
; Show Instructions if Credit Awarded
;----------------------------------------------------
L4098: LDA CoinFlag ; Check for Instruction Mode/Credit Awarded
BEQ L40A0 ; No credits inserted so skip ahead
JMP L4E3F ; Give instructions wait for START BUTTON
L40A0: RTS ; Return
;----------------------------------------------------
; Start Game
;----------------------------------------------------
L40A1: JSR L4501 ; Determine number of Begas
JSR L452D ; Initialize variables
LDA #$01 ;
STA VIMIRQ ;
LDA #$00 ;
STA PADDL1 ;
;----------------------------------------------------
; Main Game Loop
;----------------------------------------------------
L40B1: LDA #$00 ; Sound = 0
JSR L51CE ; Play Sound
JSR L6992 ; level setup?
;----------------------------------------------------
; Check if game has been tilted
;----------------------------------------------------
L40B9: LDA L1000 ; Get Joystick input
AND L1000 ; Was TILT alarmed?
BMI L40C4 ; No, so skip ahead
JMP L583D ; Machine has tilted, print error
L40C4: LDA L1003 ; Check verticle blanking
BPL L40B9 ; Loop here until we enter verticle blanking
;----------------------------------------------------
; VERTICLE BLANKING AREA (1003 = 80h)
;----------------------------------------------------
; Here we do all the screen and game updates
;----------------------------------------------------
; Check Laser Sprites (009C-00A1)
;----------------------------------------------------
LDY #$05 ; 5 Lasers to check
L40CB: LDA L009C,Y ; Check process status
BPL L40D6 ; Process not running, check next
CMP #$FF ; Is process complete?
BEQ L40D6 ; Yes, check next process
BNE L40E7 ; Process finished do updates
L40D6: DEY ; Go to next process
BPL L40CB ; Loop until all processes checked
;----------------------------------------------------
; No shots fired
;----------------------------------------------------
LDA MasterReg
BMI L40E7
LDA SearchStatus ; Check LDP search status
CMP #$02 ; Are we in the middle of a SEARCH?
BNE L40E7 ; No, so refresh sprite data
JMP L40B1 ; Else, return to main game loop
;----------------------------------------------------
; Update Sprites and System Timer
;----------------------------------------------------
L40E7: JSR L47D0 ; Update Sprites
INC SysTimer ; Increment System Timer low byte (0-64)
LDA SysTimer ; Check System Timer low byte
AND #$3F ; Does System Timer = 64
BNE L40FA ; No, so skip ahead
INC SysTimer+1 ; Increment System Timer High byte
INC L04BB
;----------------------------------------------------
; Pseudo-random Number Generator
;----------------------------------------------------
; Reads a byte from a certain memory range ($4000-$47FF)
; then adds the previous random number and $3BFB (raster
; line Y-position) to it, returning the new random number
; in the accumulator. The next byte in the memory range
; is read on the next execution of this routine.
;----------------------------------------------------
L40FA: INC RandSeed ; Increment seed ROM pointer
BCC L4100 ; Check if carry is set
INC RandSeed+1 ; Increment seed ROM pointer+1
L4100: LDA RandSeed+1 ; Get seed ROM pointer
AND #$07 ; Set bounds ($4000-$4700)
L4104: ORA #$40 ; Set bounds ($4000-$4700)
STA RandSeed+1 ; Limit seed ROM pointer+1
INC Random ; Increment the random number
LDA L1000 ; Mix the number with any joystick presses
ADC Random ; Add previous random number
LDY RandSeed ; Use seed ROM pointer
ADC (RandSeed),Y ; Add ROM data byte to random number
ADC L3BFB ; Add Y-raster position(?)
STA Random ; Save random number
;----------------------------------------------------
; Check if game has been TILTed
;----------------------------------------------------
L411B: LDA L1000 ; Get Joystick input
AND L1000 ; Was TILT alarmed?
BMI L4126 ; No, so skip ahead
JMP L583D ; Machine has tilted, print error
L4126: LDA L1003 ; Check verticle blanking
BMI L411B ; Loop here until we leave verticle blanking
;----------------------------------------------------
; Game Mechanics
;----------------------------------------------------
JSR L45D7 ; Print "1UP" or "2UP"
JSR L58BA ; Do Bega's Left/Right Movement
JSR L5E23 ; LUNA/JOE movements
JSR L6325 ; Girder Updates
JSR L4891 ; Handle FIRE button
JSR L690F
JSR L6D6E
LDA CDTMA1+1
BEQ L4153
L4145: LDA LifeLost ; Check if player died
BNE L4156 ; Player died so go handle death
LDA #$41 ; Return address = $4152
PHA ; Put return address on stack
LDA #$52 ; Return address = $4152
PHA ; Put return address on stack
JMP (L00CF) ; Jump to routine
;----------------------------------------------------
; Return here after Jump Routine
;----------------------------------------------------
L4153: JMP L40B9 ; Loop back and check for tilt
;----------------------------------------------------
; Player died so handle death
;----------------------------------------------------
L4156: LDA #$FF ; Use default Color Palette
JSR L720B ; Setup Color Palette
LDA #$00 ; Reset death marker
STA LifeLost ; Clear out player died marker
LDA GameStatus ; Check Game Status
BNE L4168 ; Game still running so skip ahead
JMP L403C ; Game ended, so back to Attract Mode
L4168: LDA NumPlayers ; How many players?
BNE L417C ; Two players so skip ahead
;----------------------------------------------------
; Check for Player1 GAME OVER
;----------------------------------------------------
LDA Player1Lives ; Get Player1 lives
BMI L41E2 ; No lives left so do GAME OVER
LDA #$01 ;
STA CDTMV3 ;
JSR L459A ; Erase Video Screen
JMP L40B1 ; Return to Main Game Loop
L417C: LDX PlayerNumber ; Get Player Number
BNE L41AE ; Player2 so skip ahead
;----------------------------------------------------
; Handle Player 1
;----------------------------------------------------
LDA Player1Lives ; Check Player 1 playing
AND Player2Lives ; Check Player 2 playing
BMI L41E2 ; Nobody playing so skip ahead
LDA Player2Lives ;
BPL L4196 ;
LDA #$01 ;
STA CDTMV3 ;
JSR L459A ; Erase Video Screen
JMP L40B1 ; Return to Main Game Loop
L4196: LDA Player1Lives ;
BPL L419D ;
JSR L425A ; Do Player1 "GAME OVER"
L419D: LDA #$01 ; Set for Player2
STA PlayerNumber ; Switch to Player2
STA CDTMV3 ;
JSR L470B ; Swap Player1/2 Data
JSR L459A ; Erase Video Screen
JMP L40B1 ; Return to Main Game Loop
;----------------------------------------------------
; Handle Player 2
;----------------------------------------------------
L41AE: LDA Player2Lives ; Check Player 1 playing
LDA Player2Lives ; Check Player 1 playing
AND Player1Lives ; Check Player 2 playing
BMI L41E2 ; Nobody playing so skip ahead
LDA Player1Lives ;
BPL L41C5 ;
LDA #$01 ;
STA CDTMV3 ;
JSR L459A ; Erase Video Screen
JMP L40B1 ; Return to Main Game Loop
;----------------------------------------------------
; Check for Player2 GAME OVER
;----------------------------------------------------
L41C5: LDA Player2Lives ; Get Player2 lives
BPL L41CF ; Game not over, so skip ahead
;----------------------------------------------------
; Player2 GAME OVER
;----------------------------------------------------
JSR L42C3 ; Player2 GAME OVER
JSR L459A ; Erase Video Screen
L41CF: LDA #$00 ; Set for Player1
STA PlayerNumber ; Switch to Player1
LDA #$01
STA CDTMV3
JSR L470B ; Swap Player1/2 Data
JSR L459A ; Erase Video Screen
JMP L40B1 ; Return to Main Game Loop
;----------------------------------------------------
; Player1 GAME OVER
;----------------------------------------------------
L41E2: JSR L4329 ; Player1 GAME OVER
LDA #$00 ; Status = Game Over
STA GameStatus ; Update Game Status
;----------------------------------------------------
; Check for Player1 High Score
;----------------------------------------------------
LDA Score ; Get Score byte 0
STA Ptr1_LO ; Save copy of score byte 0
LDA Score1 ; Get Score byte 1
STA Ptr1_HI ; Save copy of score byte 1
LDA Score2 ; Get Score byte 2
STA Ptr2_LO ; Save copy of score byte 2
JSR L5211 ; Check if Player1 is "GREATEST PLAYER"
;----------------------------------------------------
; Check for Player2 High Score
;----------------------------------------------------
LDA P2Score ; Get Score byte 0
STA Ptr1_LO ; Save copy of score byte 0
LDA P2Score1 ; Get Score byte 1
STA Ptr1_HI ; Save copy of score byte 1
LDA P2Score2 ; Get Score byte 2
STA Ptr2_LO ; Save copy of score byte 2
JSR L5211 ; Check if Player2 is "GREATEST PLAYER"
;----------------------------------------------------
; Return to Attract Mode or Instruction Screen
;----------------------------------------------------
LDA Credits ; Get number of credits
NOP ; pause
NOP ; pause
BEQ L421D ; No credits so erase screen and loop back to Attract Mode
LDA #$00 ; Status = Game Over
STA GameStatus ; Update Game Status
JMP L4E3F ; Give instructions wait for START BUTTON
L421D: JSR L459A ; Erase Video Screen
L4220: JMP L403C ; Go back to Attract Mode
;----------------------------------------------------
; Print "GAME START"
;----------------------------------------------------
LDX #$9B ; Message = "GAME START" ($439B)
LDY #$43 ; Message = "GAME START" ($439B)
JSR L4831 ; Print Text Message
L422A: LDA #$03 ; Sound = #3
JSR L51CE ; Play Sound
L422F: LDX #$1F ; Delay = 31
JSR L4BD2 ; Run Programmable Delay
JSR L71EC ; Erase Sprite RAM (3800-3FFF)
RTS ; Return
;----------------------------------------------------
; Print "PLAYER 1 GAME START"
;----------------------------------------------------
LDX #$85 ; Message = "PLAYER 1" ($4385)
LDY #$43 ; Message = "PLAYER 1" ($4385)
JSR L4831 ; Print Text Message
LDX #$9B ; Message = "GAME START" ($439B)
LDY #$43 ; Message = "GAME START" ($439B)
JSR L4831 ; Print Text Message
JMP L422A ; Go play sound then delay
;----------------------------------------------------
; Print "PLAYER 2 GAME START"
;----------------------------------------------------
LDX #$90 ; Message = "PLAYER 2" ($4390)
LDY #$43 ; Message = "PLAYER 2" ($4390)
JSR L4831 ; Print Text Message
LDX #$9B ; Message = "GAME START" ($439B)
LDY #$43 ; Message = "GAME START" ($439B)
JSR L4831 ; Print Text Message
JMP L422A ; Go play sound then delay
;----------------------------------------------------
; Player 1 GAME OVER (similar to below)
;----------------------------------------------------
L425A: JSR L55E1 ; Check for Continue Feature
JSR L719E ; Screen Transition, Fill from outside in
JSR L71D0 ; Clear Sprite Bank 1 & 2 (2800-281F,2BE0-2BFF)
JSR L71DE ; Clear Sprite Bank 3 & 4 (3800-381F,3BE0-3BFF)
;----------------------------------------------------
; Erase Video RAM ($3A00-$3FFF)
;----------------------------------------------------
LDX #$00 ;
TXA ;
L4269: STA L3A00,X ;
STA L3B00,X ;
STA L3E00,X ;
STA L3F00,X ;
DEX ;
BNE L4269 ;
;----------------------------------------------------
; Play ending video sequence, print "GAME OVER"
;----------------------------------------------------
LDA #$14 ; Video Sequence = ? (Frame xxxxx)
JSR L54A7 ; Play LaserDisc video sequence
INC PrintDelay ; Enable print delay between characters
LDX #$85 ; Message = "PLAYER 1" ($4385)
LDY #$43 ; Message = "PLAYER 1" ($4385)
JSR L4831 ; Print Text Message
INC PrintDelay ; Enable print delay between characters
LDX #$A8 ; Message = "GAME OVER" ($43A8)
LDY #$43 ; Message = "GAME OVER" ($43A8)
JSR L4831 ; Print Text Message
LDA #$00 ; Sound = #0
JSR L51CE ; Play Sound
L4296: LDA SearchStatus ; Check LDP search status
CMP #$01
BEQ L42A9
CMP #$02
BEQ L42A9
LDX #$01
JSR L4BD2 ; Run Programmable Delay
JMP L4296
L42A9: JSR L71B8 ; Screen Transition, Clear from inside out
;----------------------------------------------------
; Wait for SEARCH complete
;----------------------------------------------------
L42AC: LDA SearchStatus ; Check LDP search status
CMP #$02
BEQ L42BB
LDX #$01 ; Delay = 1
JSR L4BD2 ; Run Programmable Delay
JMP L42AC
L42BB: LDX #$80 ; Delay = 128
JSR L4BD2 ; Run Programmable Delay
JMP L422F
;----------------------------------------------------
; Player 2 GAME OVER
;----------------------------------------------------
L42C3: JSR L55E1 ; Check for Continue Feature
JSR L719E ; Screen Transition, Fill from outside in
JSR L71D0 ; Clear Sprite Bank 1 & 2 (2800-281F,2BE0-2BFF)
;----------------------------------------------------
; Erase Video RAM ($3A00-$3FFF)
;----------------------------------------------------
LDX #$00
TXA
L42CF: STA L3A00,X
STA L3B00,X
STA L3E00,X
STA L3F00,X
DEX
BNE L42CF
;----------------------------------------------------
; Play ending video sequence, print "GAME OVER"
;----------------------------------------------------
LDA #$14 ; Video Sequence = ? (Frame xxxxx)
JSR L54A7 ; Play LaserDisc video sequence
INC PrintDelay ; Enable print delay between characters
LDX #$90 ; Message = "PLAYER 2" ($4390)
LDY #$43 ; Message = "PLAYER 2" ($4390)
JSR L4831 ; Print Text Message
INC PrintDelay ; Enable print delay between characters
LDX #$A8 ; Message = "GAME OVER" ($43A8)
LDY #$43 ; Message = "GAME OVER" ($43A8)
JSR L4831 ; Print Text Message
LDA #$00
JSR L51CE ; Play Sound
L42FC: LDA SearchStatus ; Check LDP search status
CMP #$01
BEQ L430F
CMP #$02
BEQ L430F
LDX #$01
JSR L4BD2 ; Run Programmable Delay
JMP L42FC
L430F: JSR L71B8 ; Screen Transition, Clear from inside out
;----------------------------------------------------
; Wait for SEARCH complete
;----------------------------------------------------
L4312: LDA SearchStatus ; Check LDP search status
CMP #$02
BEQ L4321
LDX #$01 ; Delay = 1
JSR L4BD2 ; Run Programmable Delay
JMP L4312
L4321: LDX #$80 ; Delay = 128
JSR L4BD2 ; Run Programmable Delay
JMP L422F
;----------------------------------------------------
; One Player Game: GAME OVER
;----------------------------------------------------
L4329: JSR L55E1 ; Check for Continue Feature
JSR L719E ; Screen Transition, Fill from outside in
JSR L71D0 ; Clear Sprite Bank 1 & 2 (2800-281F,2BE0-2BFF)
;----------------------------------------------------
; Erase Video RAM ($3A00-$3FFF)
;----------------------------------------------------
LDX #$00
TXA
L4335: STA L3A00,X
STA L3B00,X
STA L3E00,X
STA L3F00,X
DEX
BNE L4335
;----------------------------------------------------
; Play ending video sequence, print "GAME OVER"
;----------------------------------------------------
LDA #$14 ; Video Sequence = ? (Frame xxxxx)
JSR L54A7 ; Play LaserDisc video sequence
INC PrintDelay ; Enable print delay between characters
LDX #$A8 ; Message = "GAME OVER" ($43A8)
LDY #$43 ; Message = "GAME OVER" ($43A8)
JSR L4831 ; Print Text Message
LDA #$00
JSR L51CE ; Play Sound
L4358: LDA SearchStatus ; Check LDP search status
CMP #$01
BEQ L436B
CMP #$02
BEQ L436B
LDX #$01
JSR L4BD2 ; Run Programmable Delay
JMP L4358
L436B: JSR L71B8 ; Screen Transition, Clear from inside out
;----------------------------------------------------
; Wait for SEARCH complete
;----------------------------------------------------
L436E: LDA SearchStatus ; Check LDP search status
CMP #$02
BEQ L437D
LDX #$01 ; Delay = 1
JSR L4BD2 ; Run Programmable Delay
JMP L436E
L437D: LDX #$80 ; Delay = 128
JSR L4BD2 ; Run Programmable Delay
JMP L422F
;----------------------------------------------------
; Text Messages
;----------------------------------------------------
L4385: .WORD $39CD ; location on screen
.BYTE $1A,$16,$0B,$23,$0F,$1C,$00,$02,$FF ; "PLAYER 1"
L4390: .WORD $39CD ; location on screen
.BYTE $1A,$16,$0B,$23,$0F,$1C,$00,$03,$FF ; "PLAYER 2"
L439B: .WORD $3A0C ; location on screen
.BYTE $11,$0B,$17,$0F,$00,$1D,$1E,$0B,$1C,$1E,$FF ; "GAME START"
L43A8: .WORD $3A0C ; location on screen
.BYTE $11,$0B,$17,$0F,$00,$19,$20,$0F,$1C,$FF ; "GAME OVER"
;----------------------------------------------------
; unknown
;----------------------------------------------------
L43B4: LDA #$00 ; A = No Sound
STA L1004 ; Write to Sound Chip
L43B9: LDA #$80 ;
STA VBREAK ;
STA L1001 ;
RTS ; Return
;----------------------------------------------------
; clear Video Screen, erase RAM $0001-$00E1
;----------------------------------------------------
L43C2: JSR L459A ; Erase Video Screen
LDA #$00 ; A = $00
TAX ; Set Loop = 0
L43C8: STA Ptr1_LO,X ; Erase $0001-$00E1
INX ; Go to next byte
CPX #$E1 ; Have we erased all bytes?
BNE L43C8 ; No, loop back until all bytes erased
;----------------------------------------------------
; clear $0200-$04FF
;----------------------------------------------------
TAX ; A = 0, X = 0
L43D0: STA L0200,X ; Erase $0200-$02FF
STA L0300,X ; Erase $0300-$03FF
STA L0400,X ; Erase $0400-$04FF
INX ; Go to next byte
BNE L43D0 ; Loop back until all bytes erased
;----------------------------------------------------
; Initialize Serial Comm Port
;----------------------------------------------------
LDA #$03 ; UART Master Reset
STA L1006 ; Send UART Master Reset
LDA #$96 ; 8 bit,NO parity,1 stopbit, Clock 32x, Enable Rx Interrupt
STA L1006 ; Set UART Control Register
LDA L1007 ; Read UART Status Register
;----------------------------------------------------
; Initialize Interrupt Vectors
;----------------------------------------------------
; Vector1 $4000 Check for Coins
; Vector2 $4003 Start Program
; Vector3 $4006 Check for LDPlayer Errors
;----------------------------------------------------
LDA #$40 ; Vector1 = $4000
STA Vector1_HI ; Set Address High Byte $4000
STA Vector2_HI ; Set Address High Byte $4003
STA Vector3_HI ; Set Address High Byte $4006
LDA #$00 ; Vector1 = $4000
STA Vector1_LO ; Set Address Low Byte $4000
LDA #$03 ; Vector2 = $4003
STA Vector2_LO ; Set Address Low Byte $4003
LDA #$06 ; Vector3 = $4006
STA Vector3_LO ; Set Address Low Byte $4006
;----------------------------------------------------
; Set Top Score to 13950
;----------------------------------------------------
LDA #$01 ; TopScore = 13950
STA HiScore2 ; Write TopScore
LDA #$39 ; TopScore = 13950
STA HiScore1 ; Write TopScore
LDA #$50 ; TopScore = 13950
STA HiScore0 ; Write TopScore
;----------------------------------------------------
; Initialize Dummy Info for High Score Table
;----------------------------------------------------
LDX #$36 ; 54 bytes to copy (27 score,27 initials)
L440E: LDA L4460,X ; Get Dummy High Score info from ROM
STA HiScore3,X ; Save Dummy High Score info
DEX ; Go to next byte
BPL L440E ; Loop until entire table is written
;----------------------------------------------------
; Copy Default Color Data into Video Color RAM
;----------------------------------------------------
LDY #$00 ; Loop = 0
L4419: LDA L4428,Y ; Get default Color RAM Data
STA L1800,Y ; Write to Video Color RAM
INY ; Go to next byte
CPY #$38 ; All 56 bytes copied?
BNE L4419 ; Loop until all 56 bytes are copied
INC Level ; Go to next level
RTS ; Return
;----------------------------------------------------
; Default Video Color RAM
;----------------------------------------------------
L4428: .BYTE $FF,$F1,$C7,$C0,$3F,$38,$07,$00
.BYTE $FF,$F8,$FF,$C0,$D5,$9B,$90,$00
.BYTE $FF,$F8,$FF,$C0,$D5,$9B,$90,$00
.BYTE $FF,$F8,$FF,$C0,$D5,$9B,$90,$00
.BYTE $FF,$F8,$FF,$C0,$3F,$9B,$49,$00
.BYTE $FF,$F8,$FF,$C0,$3F,$9B,$49,$00
.BYTE $FF,$F8,$FF,$C0,$3F,$9B,$49,$00
;----------------------------------------------------
; Dummy High Scores (3 bytes each)
;----------------------------------------------------
L4460: .BYTE $50,$39,$01 ; 13950 (1)
.BYTE $00,$14,$01 ; 11400 (2)
.BYTE $50,$83,$00 ; 8350 (3)
.BYTE $00,$62,$00 ; 6200 (4)
.BYTE $00,$50,$00 ; 5000 (5)
.BYTE $50,$41,$00 ; 4150 (6)
.BYTE $00,$36,$00 ; 3600 (7)
.BYTE $00,$28,$00 ; 2800 (8)
.BYTE $50,$98,$00 ; 9850 (-)
;----------------------------------------------------
; Dummy High Score Initials
;----------------------------------------------------
.BYTE $19,$0B,$1E ; OAT (1)
.BYTE $12,$0D,$19 ; HEO (2)
.BYTE $0C,$0F,$15 ; BEK (3)
.BYTE $0C,$13,$19 ; BIO (4)
.BYTE $0B,$0F,$18 ; AEN (5)
.BYTE $0E,$0B,$0C ; DAB (6)
.BYTE $1C,$1D,$0F ; RSE (7)
.BYTE $12,$0F,$18 ; HEN (8)
.BYTE $00,$00,$00 ;---- (-)
;----------------------------------------------------
; Print High Scores
;----------------------------------------------------
L4496: JSR L459A ; Erase Video Screen
LDX #$6D ; Message = "(C) DATA EAST USA INC 1983" ($4C6D)
L449B: LDY #$4C ; Message = "(C) DATA EAST USA INC 1983" ($4C6D)
JSR L4831 ; Print Text Message
L44A0: LDX #$B9 ; Message = "TODAYS GREATEST" ($4CB9)
LDY #$4C ; Message = "TODAYS GREATEST" ($4CB9)
JSR L4831 ; Print Text Message
LDA #$C7 ; Setup screen position ($38C7)
STA Ptr1_LO ; Save screen position ($38C7)
LDA #$38 ; Setup screen position ($38C7)
STA Ptr1_HI ; Save screen position ($38C7)
LDX #$00 ; Loop for initials
L44B1: LDY #$00 ; Loop used for indexing
LDA L0251,X ; Get first initial
STA (Ptr1_LO),Y ; Print first initial
INY ; Go to next initial
LDA L0252,X ; Get middle initial
STA (Ptr1_LO),Y ; Print middle initial
INY ; Go to next initial
LDA L0253,X ; Get middle initial
STA (Ptr1_LO),Y ; Print middle initial
CLC ; Clear carry
LDA Ptr1_LO ; Get text position
ADC #$41 ; Skip 1 line (65 characters)
STA Ptr1_LO ; Save text position
LDA Ptr1_HI ; Get text position
ADC #$00 ; Add carry
STA Ptr1_HI ; Save text position
INX ; Get next players initials
INX ; Get next players initials
INX ; Get next players initials
CPX #$18 ; Check for 8 players (8*3=24)
BCC L44B1 ; Loop back until all 8 players printed
;----------------------------------------------------
; Print Scores 1 thru 8
;----------------------------------------------------
LDX #$03 ; Score 1
JSR L463A ; Print score
LDX #$04 ; Score 2
JSR L463A ; Print score
LDX #$05 ; Score 3
JSR L463A ; Print score
LDX #$06 ; Score 4
JSR L463A ; Print score
LDX #$07 ; Score 5
JSR L463A ; Print score
LDX #$08 ; Score 6
JSR L463A ; Print score
LDX #$09 ; Score 7
JSR L463A ; Print score
LDX #$0A ; Score 8
JSR L463A ; Print score
RTS ; Return
;----------------------------------------------------
; Assign Initial Number of Begas (lives)
;----------------------------------------------------
L4501: LDA L1002 ; Get DIP Bank 2
L4504: EOR #$FF ; Toggle all bits
TAY ; Y = DIP Bank 2
AND #$03 ; Get DIP Sw1-2
TAX ; X = DIP Sw1-2
LDA L4529,X ; Get Number of Lives from table
STA Player1Lives ; Save Player1 lives
STA Player2Lives ; Save Player2 lives
;----------------------------------------------------
; Setup Bonus Begas score threshold
;----------------------------------------------------
TYA ; Get DIP Bank 2
LSR A ; Isolate sw4,5
LSR A ; Isolate sw4,5
LSR A ; Isolate sw4,5
AND #$03 ; Isolate sw4,5
TAX ; X = sw4,5
LDA L4525,X ; Get Bonus Threshold from table
STA Bonus ; Save Bonus Threshold
STA Bonus+1 ; Save Bonus Threshold
STA Bonus+2 ; Save Bonus Threshold
RTS ; Return
;----------------------------------------------------
; Initial Begas (lives) and Bonus Begas
;----------------------------------------------------
L4525: .BYTE 2, 5, 3, 0 ; 20K,30K,40K,50K Points
L4529: .BYTE 2, 4, 3, 5 ; 2,3,4,5 Initial Lives
;----------------------------------------------------
; Initialize variables, Initialize "swap" variables
;----------------------------------------------------
; Swap variables are temporary variables that hold
; the player's variables while the other player is
; playing.
;----------------------------------------------------
L452D: LDA #$FF ; A = $FF
STA Level ; Initial value = $FF
STA Level_swap ; Initial value = $FF
STA Lunas ; Initial value = $FF
STA Lunas_swap ; Initial value = $FF
STA STARP_swap ; Initial value = $FF
STA STARP ; Initial value = $FF
STA STMCUR_swap ; Initial value = $FF
STA STMCUR ; Initial value = $FF
STA VVTP+1 ; Initial value = $FF
STA STMTAB ; Initial value = $FF
STA RUNSTK+1 ; Initial value = $FF
STA TOPSTK ; Initial value = $FF
STA TOPSTK+1 ; Initial value = $FF
STA MEOLFLG ; Initial value = $FF
STA STARP+1 ; Initial value = $FF
STA RUNSTK ; Initial value = $FF
STA L0093 ; Initial value = $FF
STA L0094 ; Initial value = $FF
STA POKADR ; Initial value = $FF
STA POKADR+1 ; Initial value = $FF
STA L0097 ; Initial value = $FF
STA L0098 ; Initial value = $FF
STA L0099 ; Initial value = $FF
STA L009A ; Initial value = $FF
STA L00A7 ; Initial value = $FF
STA L00A8 ; Initial value = $FF
STA L00A9 ; Initial value = $FF
STA L00AA ; Initial value = $FF
STA L00AB ; Initial value = $FF
STA L00AC ; Initial value = $FF
LDA #$00 ; A = $00
STA PlayerNumber ; Initial value = $00
STA CDTMV3 ; Initial value = $00
STA CDTMV3_swap ; Initial value = $00
STA VVBLKD ; Initial value = $00
STA VVBLKD_swap ; Initial value = $00
STA CDTMV5_swap ; Initial value = $00
STA CDTMV5 ; Initial value = $00
STA CDTMA1+1 ; Initial value = $00
STA CDTMA2 ; Initial value = $00
STA CDTMA2+1 ; Initial value = $00
STA CDTMF3 ; Initial value = $00
STA L04D8 ; Initial value = $00
STA L04D9 ; Initial value = $00
STA L04DA ; Initial value = $00 (reset Continue Option)
RTS ; Return
;----------------------------------------------------
; Erase all Video RAM, Screen and Sprites (2000-3FFF)
;----------------------------------------------------
L459A: LDA #$00 ; Address low $2000
STA Ptr1_LO ; Setup address to erase
LDA #$20 ; Address high $2000
STA Ptr1_HI ; Setup address to erase
LDX #$20 ; 32 blocks of 256 to erase (2K)
L45A4: LDY #$00 ; Loop = 0
LDA #$00 ; A = $00
L45A8: STA (Ptr1_LO),Y ; Clear address location
INY ; Next location
BNE L45A8 ; Loop for 256 bytes to clear
INC Ptr1_HI ; Increment address pointer
DEX ; More blocks to erase
BNE L45A4 ; Loop until all blocks are erased
;----------------------------------------------------
; Erase Bank1 Sprite Work Area (7 sprites,$11-$2C)
;----------------------------------------------------
LDA #$00 ; Loop = 28 (4 x 7 sprites)
LDX #$1B ; Clear with $00
L45B6: STA Sprite1_Prop,X ; Erase sprite work area
DEX ; Go to next location
BPL L45B6 ; Loop back until all 7 sprites erased
LDA #$08 ;
STA L1003 ;
RTS ; Return
;----------------------------------------------------
; Print "HI 1UP/2UP" overlay screen
;----------------------------------------------------
L45C1: LDA #$66 ; Char ="H" (RED)
STA L3843 ; Print "H"
LDA #$67 ; Char ="I" (RED)
STA L3844 ; Print "I"
JSR L4609 ; Print "1UP"
LDA NumPlayers ; Get number of players
BEQ L45D6 ; Only 1 player so skip ahead
JSR L4619 ; Print "2UP"
L45D6: RTS ; Return
;----------------------------------------------------
; Print "1UP" or "2UP"
;----------------------------------------------------
L45D7: LDA NumPlayers ; Get number of players
BEQ L4628 ; Only 1 player so skip altogether
LDA SysTimer ; Check time on System Timer
AND #$3F ; Do we need to blink 1UP/2UP message?
BNE L4600 ; Time to print it, skip ahead
LDA PlayerNumber ; Get player number
BNE L45F4 ; Player 2 so skip ahead
;----------------------------------------------------
; Erase "1UP"
;----------------------------------------------------
LDA #$00 ; A = blank
STA L3881 ; Erase character
STA L3882 ; Erase character
STA L3883 ; Erase character
RTS ; Return
;----------------------------------------------------
; Erase "2UP"
;----------------------------------------------------
L45F4: LDA #$00 ; A = blank
STA L38C1 ; Erase character
STA L38C2 ; Erase character
STA L38C3 ; Erase character
RTS ; ReturnReturn
;----------------------------------------------------
; Check Player 1 or 2
;----------------------------------------------------
L4600: CMP #$0F ; Check lives
BNE L4628 ; No lives left so leave
LDA PlayerNumber ; Which player is playing?
BNE L4619 ; Player 2, so print "2UP"
;----------------------------------------------------
; Print "1UP"
;----------------------------------------------------
L4609: LDA #$02 ; Char = '1'
STA L3881 ; Print character
LDA #$1F ; Char = 'U'
STA L3882 ; Print character
LDA #$1A ; Char = 'P'
STA L3883 ; Print character
RTS ; Return
;----------------------------------------------------
; Print "2UP"
;----------------------------------------------------
L4619: LDA #$03 ; Char = '2'
STA L38C1 ; Print character
LDA #$1F ; Char = 'U'
STA L38C2 ; Print character
LDA #$1A ; Char = 'P'
STA L38C3 ; Print character
L4628: RTS ; Return
;----------------------------------------------------
; Text message "HI-SCORE" (UNUSED)
;----------------------------------------------------
L4629: .WORD $3849
.BYTE $12,$13,$25,$1D,$0D,$19,$1C,$0F,$FE ; "HI-SCORE"
L4634: .WORD $3859
.BYTE $2D,$2E,$2F,$FF ; "???"
;----------------------------------------------------
; Print Score to display
;----------------------------------------------------
L463A: JMP L4693 ; Print Score to display
;----------------------------------------------------
; Print Score to display (UNUSED)
;----------------------------------------------------
; X = Which score to print (0-10)
;----------------------------------------------------
; 0 Player1 score (Score thru Score+2)
; 1 Player2 score (Score+2 thru Score+4)
; 2 HI score (Score+5 thru Score+7)
; 3-10 8 High Scores (Score+8 thru Score+31)
;----------------------------------------------------
LDY L528F,X ; Set index to correct score byte
TYA ; Save index
LDY L46FF,X ; Y = Index to Screen location
TAX ; X = Index to score bytes to print
;----------------------------------------------------
; X = Index to score bytes to print (3 bytes/6 digits)
; Y = Index to Screen location
;----------------------------------------------------
LDA L46E9,Y ; Get location on screen for score
STA Ptr1_LO ; Save as pointer LO
LDA L46EA,Y ; Get location on screen for score
STA Ptr1_HI ; Save as pointer HI
LDY #$00 ; Start printing at first spot
;----------------------------------------------------
; Remove leading zeros from score
;----------------------------------------------------
L4651: LDA Score,X ; Get score byte
LSR A ; Isolate upper digit
LSR A ; Isolate upper digit
LSR A ; Isolate upper digit
LSR A ; Isolate upper digit
CLC ; Clear carry
ADC #$01 ; Add +1 to create character
CMP #$01 ; Check for leading zeros
BNE L467F ; No more leading zeros, so print number
INY ; Skip character spot if it's a zero
LDA Score,X ; Get score byte
AND #$0F ; Isolate digit
CLC ; Clear carry
ADC #$01 ; Add +1 to create character
CMP #$01 ; Check for leading zeros
BNE L468A ; No more zeros, so print number
DEX ; Go to next score byte
INY ; Skip character spot if it's a zero
CPY #$06 ; Have we checked all 6 digits?
BNE L4651 ; No, loop back until all digits checked for zero
DEY ; Move back one spot
BNE L468A ; Print at least 1 zero, so skip ahead
;----------------------------------------------------
; Leading zeros now gone, so print remaining score
;----------------------------------------------------
L4675: LDA Score,X ; Get score byte
LSR A ; Isolate upper digit
LSR A ; Isolate upper digit
LSR A ; Isolate upper digit
LSR A ; Isolate upper digit
CLC ; Clear carry
ADC #$01 ; Add +1 to create character
L467F: STA (Ptr1_LO),Y ; Print number to screen
INY ; Move to next spot on screen
LDA Score,X ; Get score byte
AND #$0F ; Isolate digit
CLC ; Clear carry
ADC #$01 ; Add +1 to create character
L468A: STA (Ptr1_LO),Y ; Print number to screen
DEX ; Go to next score byte
INY ; Move to next spot on screen
CPY #$06 ; Have we printed all 6 digits?;
BNE L4675 ; No, loop back until all digits printed;
RTS ; Return
;----------------------------------------------------
; Print Score to display
;----------------------------------------------------
; X = Which score to print (0-10)
;----------------------------------------------------
; 0 Player1 score (Score thru Score+2)
; 1 Player2 score (Score+2 thru Score+4)
; 2 HI score (Score+5 thru Score+7)
; 3-10 8 High Scores (Score+8 thru Score+31)
;----------------------------------------------------
L4693: LDY L528F,X ; Set index to correct score byte
TYA ; Save index
LDY L46FF,X ; Y = Index to Screen location
TAX ; X = Index to score bytes to print
;----------------------------------------------------
; X = Index to score bytes to print (3 bytes/6 digits)
; Y = Index to Screen location
;----------------------------------------------------
L469B: LDA L46E9,Y ; Get location on screen for score
STA Ptr1_LO ; Save as pointer LO
LDA L46EA,Y ; Get location on screen for score
STA Ptr1_HI ; Save as pointer HI
LDY #$00 ; Start printing at first spot
;----------------------------------------------------
; Remove leading zeros from score
;----------------------------------------------------
L46A7: LDA Score,X ; Get score byte
LSR A ; Isolate upper digit
LSR A ; Isolate upper digit
LSR A ; Isolate upper digit
LSR A ; Isolate upper digit
CLC ; Clear carry
ADC #$01 ; Add +1 to create character
CMP #$01 ; Check for leading zeros
BNE L46D5 ; No more leading zeros, so print number
INY ; Skip character spot if it's a zero
LDA Score,X ; Get score byte
AND #$0F ; Isolate digit
CLC ; Clear carry
ADC #$01 ; Add +1 to create character
CMP #$01 ; Check for leading zeros
BNE L46E0 ; No more zeros, so print number
DEX ; Go to next score byte
INY ; Skip character spot if it's a zero
CPY #$06 ; Have we checked all 6 digits?
BNE L46A7 ; No, loop back until all digits checked for zero
DEY ; Move back one spot
BNE L46E0 ; Print at least 1 zero, so skip ahead
;----------------------------------------------------
; Leading zeros now gone, so print remaining score
;----------------------------------------------------
L46CB: LDA Score,X ; Get score byte
LSR A ; Isolate upper digit
LSR A ; Isolate upper digit
LSR A ; Isolate upper digit
LSR A ; Isolate upper digit
CLC ; Clear carry
ADC #$01 ; Add +1 to create character
L46D5: STA (Ptr1_LO),Y ; Print number to screen
INY ; Move to next spot on screen
LDA Score,X ; Get score byte
AND #$0F ; Isolate digit
CLC ; Clear carry
ADC #$01 ; Add +1 to create character
L46E0: STA (Ptr1_LO),Y ; Print number to screen
DEX ; Go to next score byte
INY ; Move to next spot on screen
CPY #$06 ; Have we printed all 6 digits?
BNE L46CB ; No, loop back until all digits printed
RTS ; Return
;----------------------------------------------------
; Screen Location to print Scores
;----------------------------------------------------
L46E9: .WORD $38A1,$38E1,$3861,$38CB,$390C,$394D
.WORD $398E,$39CF,$3A10,$3A51,$3A92
;----------------------------------------------------
; Index to Screen Locations to print Scores
;----------------------------------------------------
L46FF: .BYTE $00,$02,$04,$06,$08,$0A,$0C,$0E,$10,$12,$14,$16
;----------------------------------------------------
; Swap Player 1 and Player 2 Data pointers
;----------------------------------------------------
L470B: LDA Level ; Swap Player Data
LDX Level_swap ; Swap Player Data
STA Level_swap ; Swap Player Data
STX Level ; Swap Player Data
LDA VVBLKD ; Swap Player Data
LDX VVBLKD_swap ; Swap Player Data
STA VVBLKD_swap ; Swap Player Data
STX VVBLKD ; Swap Player Data
LDA CDTMV3 ; Swap Player Data
LDX CDTMV3_swap ; Swap Player Data
STA CDTMV3_swap ; Swap Player Data
STX CDTMV3 ; Swap Player Data
LDA CDTMV5_swap ; Swap Player Data
LDX CDTMV5 ; Swap Player Data
STA CDTMV5 ; Swap Player Data
STX CDTMV5_swap ; Swap Player Data
LDA Lunas ; Swap Player Data
LDX Lunas_swap ; Swap Player Data
STA Lunas_swap ; Swap Player Data
STX Lunas ; Swap Player Data
LDA STARP_swap ; Swap Player Data
LDX STARP ; Swap Player Data
STA STARP ; Swap Player Data
STX STARP_swap ; Swap Player Data
LDA STMCUR_swap ; Swap Player Data
LDX STMCUR ; Swap Player Data
STA STMCUR ; Swap Player Data
STX STMCUR_swap ; Swap Player Data
LDA VVTP+1 ; Swap Player Data
LDX STMTAB ; Swap Player Data
STA STMTAB ; Swap Player Data
STX VVTP+1 ; Swap Player Data
LDA RUNSTK+1 ; Swap Player Data
LDX TOPSTK ; Swap Player Data
STA TOPSTK ; Swap Player Data
STX RUNSTK+1 ; Swap Player Data
LDA TOPSTK+1 ; Swap Player Data
LDX MEOLFLG ; Swap Player Data
STA MEOLFLG ; Swap Player Data
STX TOPSTK+1 ; Swap Player Data
LDA STARP+1 ; Swap Player Data
LDX RUNSTK ; Swap Player Data
STA RUNSTK ; Swap Player Data
STX STARP+1 ; Swap Player Data
LDA L0093 ; Swap Player Data
LDX L0097 ; Swap Player Data
STA L0097 ; Swap Player Data
STX L0093 ; Swap Player Data
LDA L0094 ; Swap Player Data
LDX L0098 ; Swap Player Data
STA L0098 ; Swap Player Data
STX L0094 ; Swap Player Data
LDA POKADR ; Swap Player Data
LDX L0099 ; Swap Player Data
STA L0099 ; Swap Player Data
STX POKADR ; Swap Player Data
LDA POKADR+1 ; Swap Player Data
LDX L009A ; Swap Player Data
STA L009A ; Swap Player Data
STX POKADR+1 ; Swap Player Data
LDA L00A7 ; Swap Player Data
LDX L00A8 ; Swap Player Data
STA L00A8 ; Swap Player Data
STX L00A7 ; Swap Player Data
LDA L00A9 ; Swap Player Data
LDX L00AA ; Swap Player Data
STA L00AA ; Swap Player Data
STX L00A9 ; Swap Player Data
LDA L00AB ; Swap Player Data
LDX L00AC ; Swap Player Data
STA L00AC ; Swap Player Data
STX L00AB ; Swap Player Data
LDA CDTMA1+1 ; Swap Player Data
LDX CDTMA2 ; Swap Player Data
STA CDTMA2 ; Swap Player Data
STX CDTMA1+1 ; Swap Player Data
LDA CDTMA2+1 ; Swap Player Data
LDX CDTMF3 ; Swap Player Data
STA CDTMF3 ; Swap Player Data
STX CDTMA2+1 ; Swap Player Data
LDA L04D8 ; Swap Player Data
LDX L04D9 ; Swap Player Data
STA L04D9 ; Swap Player Data
STX L04D8 ; Swap Player Data
RTS ; Return
;----------------------------------------------------
; Refresh All Sprites
;----------------------------------------------------
L47D0: LDX #$06 ; 7 sprites per bank (8 sprites available)
L47D2: LDY L4829,X ; Get Sprite Index
;----------------------------------------------------
; Update Sprites Bank 1
;----------------------------------------------------
LDA Sprite1_Prop,X ; Get Properties byte
STA L2800,Y ; Save sprite properties
LDA Sprite1_Char,X ; Get Character number
STA L2801,Y ; Save sprite character number
LDA Sprite1_Y,X ; Get Y Coordinate
STA L2802,Y ; Save sprite Y coordinate
LDA Sprite1_X,X ; Get X Coordinate
STA L2803,Y ; Save sprite X coordinate
;----------------------------------------------------
; Update Sprites Bank 2
;----------------------------------------------------
LDA Sprite2_Prop,X ; Get Properties byte
STA L2BE0,Y ; Save sprite properties
LDA Sprite2_Char,X ; Get Character number
STA L2BE1,Y ; Save sprite character number
LDA Sprite2_Y,X ; Get Y Coordinate
STA L2BE2,Y ; Save sprite Y coordinate
LDA Sprite2_X,X ; Get X Coordinate
STA L2BE3,Y ; Save sprite X coordinate
;----------------------------------------------------
; Update Sprites Bank 3
;----------------------------------------------------
LDA Sprite3_Prop,X ; Get Properties byte
STA L3800,Y ; Save sprite properties
LDA Sprite3_Char,X ; Get Character number
STA L3801,Y ; Save sprite character number
LDA Sprite3_Y,X ; Get Y Coordinate
STA L3802,Y ; Save sprite Y coordinate
LDA Sprite3_X,X ; Get X Coordinate
STA L3803,Y ; Save sprite X coordinate
;----------------------------------------------------
; Update Sprites Bank 4
;----------------------------------------------------
LDA Sprite4_Prop,X ; Get Properties byte
STA L3BE0,Y ; Save sprite properties
LDA Sprite4_Char,X ; Get Character number
STA L3BE1,Y ; Save sprite character number
LDA Sprite4_Y,X ; Get Y Coordinate
STA L3BE2,Y ; Save sprite Y coordinate
LDA Sprite4_X,X ; Get X Coordinate
STA L3BE3,Y ; Save sprite X coordinate
DEX ; Go to next sprite
BPL L47D2 ; Loop back until all 7 sprites per bank are updated
RTS ; Return
;----------------------------------------------------
; Sprite Indexes
;----------------------------------------------------
L4829: .BYTE $00,$04,$08,$0C,$10,$14,$18,$1C
;----------------------------------------------------
; Print Text Message
;----------------------------------------------------
; XY = Message Text Address
;----------------------------------------------------
L4831: STX Ptr1_LO ; Message Text pointer
STY Ptr1_HI ; Message Text pointer
L4835: LDY #$00 ; Y = loop
STY TRAMSZ ; Save loop
LDA (Ptr1_LO),Y ; Get Screen location
STA Ptr2_LO ; Setup pointer to screen location
INY ; Get high byte
LDA (Ptr1_LO),Y ; Get Screen location
STA Ptr2_HI ; Setup pointer to screen location
L4842: INY ; Go to start of text
L4843: LDA (Ptr1_LO),Y ; Get text character
;----------------------------------------------------
; Check for Text Control Codes
;----------------------------------------------------
CMP #$FF ; Check for END OF TEXT control code
BEQ L488B ; Skip ahead and handle control code
CMP #$FE ; Check for NEXT MESSAGE control code
BEQ L4868 ; Skip ahead and handle control code
CMP #$FD ; Check for CARRIAGE RETURN control code
BEQ L4878 ; Skip ahead and handle control code
STY Ptr2_HI+1 ; Save pointer to text character in ROM
LDY TRAMSZ ; Get screen position
STA (Ptr2_LO),Y ; Print character to screen
INC TRAMSZ ; Loop to next character
LDY Ptr2_HI+1 ; Get pointer to text character in ROM
LDA PrintDelay ; Print with delay between chraracters?
BEQ L4842 ; No, so loop back without delay between character
LDX #$0A ; Delay = 10
JSR L4BD2 ; Run Programmable Delay between characters
JMP L4842 ; Loop back and print next character
;----------------------------------------------------
; Control Code $FE: NEXT MESSAGE
;----------------------------------------------------
L4868: INY ; Go to the next byte in ROM (next message)
CLC ; Clear carry
TYA ; A = number of byte in previous message
ADC Ptr1_LO ; Add previous length to point to next message
STA Ptr1_LO ; Save new message starting point
LDA Ptr1_HI ; Get previous pointer to old message
ADC #$00 ; Add previous length to point to next message
STA Ptr1_HI ; Save new message starting point
JMP L4835 ; Return and beginning printing the new message
;----------------------------------------------------
; Control Code $FD: CARRIAGE RETURN
;----------------------------------------------------
L4878: CLC ; Clear carry
LDA Ptr2_LO ; Get original text starting position
ADC #$20 ; Skip to next line (add 32)
STA Ptr2_LO ; Save new text position
LDA Ptr2_HI ; Get original text starting position
ADC #$00 ; Skip to next line
STA Ptr2_HI ; Save new text position
LDA #$00 ; Text Loop = 0
STA TRAMSZ ; Start text at beginning of line
BEQ L4842 ; Text remaining, so go print on new line
;----------------------------------------------------
; Control Code $FF: END OF TEXT
;----------------------------------------------------
L488B: LDA #$00 ; No delay
STA PrintDelay ; Cancel delay between characters
RTS ; Return
;----------------------------------------------------
; Handle FIRE Button
;----------------------------------------------------
L4891: LDA DMASK ; Check fire function
CMP #$01 ; Is fire allowed on this level?
BNE L4899 ; Yes, so go check fire button
RTS ; Not allowed so just leave
;----------------------------------------------------
; Check repetition of shot
;----------------------------------------------------
L4899: LDA L00D2 ; Is another shot allowed yet?
BEQ L48A0 ; Yes, so allow fire button
JMP L4948 ; No shot available, so skip ahead
;----------------------------------------------------
; Check for Continuous FIRE feature
;----------------------------------------------------
L48A0: LDA GameStatus ; Check Game Status
BEQ L48CC ; Game Over, so just do continuous firing
LDA L1002 ; Get DIP bank 2
AND #$18 ; Check Continuous Firing
BNE L48B4 ; No Continuous Firing, so skip ahead
;----------------------------------------------------
; Do Continuous FIRE (no bonus)
;----------------------------------------------------
LDA L1000 ; Get Joystick input
EOR #$40 ; Automatically press S1 for continuous fire
JMP L48B9 ; Skip ahead
;----------------------------------------------------
; Check FIRE Button
;----------------------------------------------------
L48B4: LDA L1000 ; Get Joystick input
EOR L00D3 ; Compare to Joystick previous state
L48B9: AND #$40 ; Check if S1 switch has changed state
BEQ L48C4 ; No change in state of switch so skip ahead
;----------------------------------------------------
; Fire Button has changed state
;----------------------------------------------------
LDA L1000 ; Get Joystick input
AND #$40 ; Check S1 switch
BEQ L48CC ; Button has been pressed so skip ahead
L48C4: LDA L1000 ; Get Joystick input
STA L00D3 ; Move current Joystick state to previous state
JMP L4948 ; Skip Fire routine
;----------------------------------------------------
; Fire Button has been pressed
;----------------------------------------------------
L48CC: LDA L1000 ; Get Joystick input
STA L00D3 ; Move current Joystick state to previous state
LDA MasterReg
AND #$F0
BNE L4948
;----------------------------------------------------
; Setup Fire repeat time (slow or fast)
;----------------------------------------------------
LDA L1002 ; Get DIP bank 2
AND #$18 ; Check Continuous Fire setting
BNE L48E5 ; No Continuous Fire, so use Fast Repeat Time
LDA #$18 ; Fire Repeat Time = 24 (slow)
STA L00D1 ; Save Fire Repeat Time
JMP L48E9 ; Skip ahead
L48E5: LDA #$0A ; Fire Repeat Time = 10 (fast)
STA L00D1 ; Save Fire Repeat Time
;----------------------------------------------------
; Check Process List (009C-00A1)
;----------------------------------------------------
L48E9: LDY #$00 ;
LDX #$05 ; 5 Processes to check
L48ED: LDA L009C,X ; Check process status
AND #$F0 ; Is this shot in progress?
BNE L48F4 ; No, so skip ahead
INY ; Count number of shots in progress
L48F4: DEX ; Check next shot
BPL L48ED ; Loop until all shots checked
;----------------------------------------------------
; Find open shot
;----------------------------------------------------
LDX L4B9B,Y ; Get index (1,3,5,7,9)
LDA #$00
STA POKMSK
L48FE: LDA DAUX1,X
CMP #$FF
BNE L490E
LDA L0300,X
CMP #$FF
BNE L490E
INC POKMSK
L490E: DEX
BPL L48FE
CPY POKMSK
BCS L4948
JSR L4A98
LDA #$18
STA L0300,X
STA DAUX1,X
LDA #$02
STA HATABS+4,X
CLC ; Clear carry
LDA BegaXPos1L ; Get Bega's X position
ADC #$0C ; Start laser in horizontal center of Bega (add 12)
STA LaserXPos,X ; Save laser's X position
LDA #$01
STA L00D2
;----------------------------------------------------
; Check Laser Sprite (009C-00A1)
;----------------------------------------------------
LDY #$05 ; 5 Processes to check
L4933: LDA L009C,Y ; Check process status
AND #$F0
BNE L493D ; No, so check next process
JSR L4A5F ; add joe and luna?
L493D: DEY ; Go to next process
BPL L4933 ; Loop until all processes checked
JSR L4AB0 ;
;----------------------------------------------------
; Play Sound
;----------------------------------------------------
LDA #$01 ;
JSR L51CE ; Play Sound
;----------------------------------------------------
; Check Fire Repeat Timer
;----------------------------------------------------
L4948: LDA L00D1 ; Get fire repeat timer
BEQ L4954 ; Timer not running so skip ahead
DEC L00D1 ; Decrement Fire Repeat Timer
BNE L4954 ; Fire Repeat Timer not expired yet, so skip ahead
LDA #$00 ; Timer expired, allow shot
STA L00D2 ; Allow new shot
;----------------------------------------------------
; Move Laser up the screen
;----------------------------------------------------
L4954: LDA #$09 ;
STA POKMSK ;
L4958: LDX POKMSK ;
LDA DAUX1,X ;
CMP #$FF
BNE L4964
JMP L4A57
L4964: LDA L0300 ,X
BPL L496C
JMP L49D8
L496C: ASL A
TAY
LDA L4AC8,Y
STA Ptr1_LO
LDA L4AC9,Y
STA Ptr1_HI
LDA HATABS+4,X
ASL A
TAY
LDA L4AFE,Y
STA Ptr2_LO
LDA L4AFF,Y
STA Ptr2_HI
LDY L0300,X
CLC
LDA (Ptr2_LO),Y
ADC LaserXPos,X
STA APPMHI+1
AND #$F8
LSR A
LSR A
LSR A
CLC
ADC Ptr1_LO
STA Ptr1_LO
LDA #$00
ADC Ptr1_HI
STA Ptr1_HI
LDA L0300 ,X
CMP #$18
BNE L49AD
LDA #$02 ;
BNE L49AF ;
L49AD: AND #$01 ;
L49AF: ASL A
TAY
LDA L4B55,Y ;
STA Ptr2_LO ;
LDA L4B56,Y ;
STA Ptr2_HI ;
DEC L0300,X
LDA APPMHI+1
AND #$07
ASL A
TAY
TAX
LDA (Ptr2_LO),Y
LDY #$00
STA (Ptr1_LO),Y
TXA
TAY
INY
LDA (Ptr2_LO),Y
CMP #$FF
BEQ L49D8
LDY #$01
STA (Ptr1_LO),Y
L49D8: LDX POKMSK
LDA L0300 ,X
BPL L49F6
CMP #$FF
BEQ L4A04
AND #$7F
SEC
SBC DAUX1,X
BNE L4A04
LDA #$FF
STA DAUX1,X
STA L0300 ,X
JMP L4A57
L49F6: SEC
LDA DAUX1,X
SBC L0300 ,X
CMP #$0B
BCS L4A04
JMP L4A57
L4A04: LDA DAUX1,X
ASL A
TAY
LDA L4AC8,Y
STA Ptr1_LO
LDA L4AC9,Y
STA Ptr1_HI
LDA HATABS+4,X
ASL A
TAY
LDA L4AFE,Y
STA Ptr2_LO
LDA L4AFF,Y
STA Ptr2_HI
LDY DAUX1,X
CLC
LDA (Ptr2_LO),Y
ADC LaserXPos,X
STA APPMHI+1
AND #$F8
LSR A
LSR A
LSR A
CLC
ADC Ptr1_LO
STA Ptr1_LO
LDA #$00
ADC Ptr1_HI
STA Ptr1_HI
DEC DAUX1,X
LDA APPMHI+1
AND #$07
ASL A
TAX
LDA L4B8B,X
LDY #$00
STA (Ptr1_LO),Y
LDA L4B8C,X
CMP #$FF
BEQ L4A57
INY
STA (Ptr1_LO),Y
L4A57: DEC POKMSK
BMI L4A5E
JMP L4958
L4A5E: RTS ; Return
;----------------------------------------------------
; add joe and luna? (No upper nibble set in process)
;----------------------------------------------------
; Y = Process number (0-5)
;----------------------------------------------------
L4A5F: TYA ; Get Laser Number
PHA ; Save it on stack
JSR L4A98 ;
LDA #$18 ;
STA L0300 ,X ;
STA DAUX1,X ;
LDA L009C,Y ;
AND #$02 ;
LSR A ;
STA HATABS+4,X ;
TXA
PHA
LDX #$00
CPY L0093
BEQ L4A88
INX
CPY L0094
BEQ L4A88
INX
CPY POKADR
BEQ L4A88
INX
L4A88: CLC
LDA L4BA0,X
ADC BegaXPos1L
TAY
PLA
TAX
TYA
STA LaserXPos,X
PLA ; Get Process Number from stack
TAY ; Put it back into Y for the loop
RTS ; Return to loop
;----------------------------------------------------
; unknown process stuff
;----------------------------------------------------
L4A98: LDX #$00
L4A9A: LDA DAUX1,X
CMP #$FF
BNE L4AAA
LDA L0300 ,X
CMP #$FF
BNE L4AAA
BEQ L4AAF
L4AAA: INX
CPX #$0A
BNE L4A9A
L4AAF: RTS ; Return
;----------------------------------------------------
; unknown process stuff
;----------------------------------------------------
L4AB0: LDA #$13 ;
ORA MasterReg ;
STA MasterReg ;
LDX #$05 ;
L4AB8: LDA L009C,X ;
AND #$F0 ;
BNE L4AC4 ;
LDA #$10 ;
ORA L009C,X ;
STA L009C,X ;
L4AC4: DEX ;
BPL L4AB8 ;
RTS ; Return
;----------------------------------------------------
; unknown data
;----------------------------------------------------
L4AC8: .BYTE $20
L4AC9: .BYTE $28,$40,$28,$60,$28,$80,$28,$A0
.BYTE $28,$C0,$28,$E0,$28,$00,$29,$20
.BYTE $29,$40,$29,$60,$29,$80,$29,$A0
.BYTE $29,$C0,$29,$E0,$29,$00,$2A,$20
.BYTE $2A,$40,$2A,$60,$2A,$80,$2A,$A0
.BYTE $2A,$C0,$2A,$E0,$2A,$00,$2B,$20
.BYTE $2B,$40,$2B,$60,$2B
;----------------------------------------------------
; unknown data pointers
;----------------------------------------------------
L4AFE: .WORD $4B04,$4B1F,$4B3A
;----------------------------------------------------
; Sprite X position data
;----------------------------------------------------
L4B04: .BYTE $08,$08,$08,$07,$07,$06,$06,$05,$04
.BYTE $04,$03,$02,$01,$00,$00,$FF,$FF,$FE
.BYTE $FE,$FD,$FD,$FE,$FE,$FF,$00,$00,$00
L4B1F: .BYTE $F8,$F8,$F8,$F9,$F9,$FA,$FA,$FB,$FC
.BYTE $FC,$FD,$FE,$FF,$00,$00,$01,$01,$02
.BYTE $02,$03,$03,$02,$02,$01,$00,$00,$00
L4B3A: .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00
.BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00
.BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00
;----------------------------------------------------
; unknown data pointers
;----------------------------------------------------
L4B55: .WORD $4B5B,$4B6B,$4B7B
;----------------------------------------------------
; Sprite X position data
;----------------------------------------------------
L4B5B: .BYTE $11,$FF,$13,$14,$15,$16,$17,$18
.BYTE $19,$1A,$1B,$1C,$1D,$1E,$2F,$20
L4B6B: .BYTE $21,$FF,$23,$24,$25,$26,$27,$28
.BYTE $29,$2A,$2B,$2C,$2D,$2E,$3F,$30
L4B7B: .BYTE $01,$FF,$03,$04,$05,$06,$07,$08
.BYTE $09,$0A,$0B,$0C,$0D,$0E,$0F,$10
;----------------------------------------------------
; unknown data
;----------------------------------------------------
L4B8B: .BYTE $00
L4B8C .BYTE $FF,$00,$00,$00,$00,$00,$00,$00
.BYTE $00,$00,$00,$00,$00,$00,$00
;----------------------------------------------------
; Shot data, indexed process number
;----------------------------------------------------
L4B9B: .BYTE $01,$03,$05,$07,$09
;----------------------------------------------------
; unknown data
;----------------------------------------------------
L4BA0: .BYTE $F4,$24,$E4,$34
;----------------------------------------------------
; erase screen?
;----------------------------------------------------
L4BA4: LDX #$06 ; 6 Columns to erase
LDA #$00 ; A = 00 <SPACE>
L4BA8: STA L3820,X ; Erase screen 3820-3826
STA L3840,X ; Erase screen 3840-3846
STA L3860,X ; Erase screen 3860-3866
STA L3880,X ; Erase screen 3880-3886
STA L38A0,X ; Erase screen 38A0-38A6
STA L3839,X ; Erase screen 3839-383F
STA L3859,X ; Erase screen 3859-385F
STA L3879,X ; Erase screen 3879-387F
STA L3899,X ; Erase screen 3899-389F
LDY NumPlayers ; Check for Player2 data
BEQ L4BCE ; Only one player so skip ahead
STA L38C0,X ; Erase Player2 screen 38C0-38C6
STA L38E0,X ; Erase Player2 screen 38E0-38E6
L4BCE: DEX ; Decrement loop
BPL L4BA8 ; Loop until all characters erased
RTS ; Return
;----------------------------------------------------
; Programmable Delay
; - with tilt check and serial monitor -
;----------------------------------------------------
; Delay time = X * 16.6ms
;----------------------------------------------------
L4BD2: LDA L1003 ; Check Verticle Blanking
BPL L4BD2 ; Wait here for the Verticle Blanking
;----------------------------------------------------
; Check if game has been tilted
;----------------------------------------------------
LDA L1000 ; Get Joystick input
AND L1000 ; Was TILT alarmed?
BMI L4BE2 ; No, so skip ahead
JMP L583D ; Machine has tilted, print error
L4BE2: LDA VTIMR4
BEQ L4BEB
TXA ; A = X location
PHA ; Push A
PLA ; Pull A
TAX ; A = X
L4BEB: LDA L1003
BMI L4BEB
JSR L51A4 ; serial Xmit?
DEX
BNE L4BD2
RTS ; Return
;----------------------------------------------------
; Print BEGA and LUNA lives
;----------------------------------------------------
; Print "BEGA"
;----------------------------------------------------
L4BF7: LDX #$0C ; Char = 'B'
STX L3859 ; Print character
LDX #$0F ; Char = 'E'
STX L385A ; Print character
LDX #$11 ; Char = 'G'
STX L385B ; Print character
LDX #$0B ; Char = 'A'
STX L385C ; Print character
;----------------------------------------------------
; Print "LUNA"
;----------------------------------------------------
LDX #$16 ; Char = 'L'
STX L3879 ; Print character
LDX #$1F ; Char = 'U'
STX L387A ; Print character
LDX #$18 ; Char = 'N'
STX L387B ; Print character
LDX #$0B ; Char = 'A'
STX L387C ; Print character
;----------------------------------------------------
; Print "STAGE"
;----------------------------------------------------
LDX #$6C ; Char = STAGE
STX L3899 ; Print character
INX ; Char = STAGE
STX L389A ; Print character
INX ; Char = STAGE
STX L389B ; Print character
INX ; Char = STAGE
STX L389C ; Print character
;----------------------------------------------------
; Print Lives
;----------------------------------------------------
LDY PlayerNumber ; Which player is playing
LDA Player1Lives,Y ; Get that player's lives
CLC ; Clear carry
ADC #$02 ; Create number character
STA L385E ; Display number of lives
;----------------------------------------------------
; Print Lunas
;---------------------------------------------------
LDA Lunas ; Get number of Lunas
CLC ; Clear carry
ADC #$02 ; Create number character
STA L387E ; Display number of Lunas
;----------------------------------------------------
; Print STAGE Number to screen
;---------------------------------------------------
LDA Level ; Get Level Number (0-49)
ASL A ; Multiply by 2
TAX ; Index to level
LDA LB200,X ; Get Level address
STA Ptr1_LO ; Save address
LDA LB201,X ; Get Level address
STA Ptr1_HI ; Save address
LDY VVBLKD ; Y = 0,1,2
LDA (Ptr1_LO),Y ; Get STAGE Number
TAY ; Temporarily save STAGE number
AND #$0F ; Get one's place digit
CLC ; Clear carry
ADC #$01 ; Make printable character
STA L389E ; Print STAGE Number (one's place)
TYA ; Retrieve STAGE number
LSR A ; Move digits over
LSR A ; Move digits over
LSR A ; Move digits over
LSR A ; Move digits over
CLC ; Clear carry
ADC #$01 ; Make printable character
STA L389D ; Print STAGE Number (tens place)
RTS ; Return
;----------------------------------------------------
; Text Messages
;----------------------------------------------------
L4C6D: .WORD $3B84 ; location on screen
.BYTE $68,$00,$0E,$0B,$1E,$0B,$00,$0F,$0B,$1D,$1E,$00,$1F,$1D
.BYTE $0B,$00,$13,$18,$0D,$00,$02,$0A,$09,$04,$FF ; "(C) DATA EAST USA INC 1983"
L4C88: .WORD $C2C3 ; location on screen
.BYTE $0C,$19,$18,$1F,$1D,$00,$00,$00,$10,$19,$1C ; "BONUS FOR EVERY PTS"
.BYTE $00,$0F,$20,$0F,$1C,$23,$00,$00,$00,$00,$00,$00
.BYTE $1A,$1E,$1D,$FE
.WORD $C2A8 ; location on screen
.BYTE $1C,$1D,$FE ; "RS"
.WORD $C2C8 ; location on screen
.BYTE $1E,$1F,$FE ; "TU"
.WORD $C6A8 ; location on screen
.BYTE $01,$01,$FE ; "00"
.WORD $C6C8 ; location on screen
.BYTE $01,$01,$FF ; "00"
L4CB9: .WORD $3888 ; location on screen
.BYTE $1E,$19,$0E,$0B,$23,$1D,$00,$11,$1C,$0F,$0B,$1E,$0F,$1D,$1E,$FE ; "TODAYS GREATEST"
.WORD $38C5 ; location on screen
.BYTE $02,$FE ; "1"
.WORD $3906 ; location on screen
.BYTE $03,$FE ; "2"
.WORD $3947 ; location on screen
.BYTE $04,$FE ; "3"
.WORD $3988 ; location on screen
.BYTE $05,$FE ; "4"
.WORD $39C9 ; location on screen
.BYTE $06,$FE ; "5"
.WORD $3A0A ; location on screen
.BYTE $07,$FE ; "6"
.WORD $3A4B ; location on screen
.BYTE $08,$FE ; "7"
.WORD $3A8C ; location on screen
.BYTE $09,$FF ; "8"
L4CEB: .WORD $3AC2 ; location on screen
.BYTE $11,$1C,$0F,$0B,$1E,$00,$1A,$16,$0B,$23,$0F,$1C,$65,$FE ; "GREAT PLAYER!"
L4CFB: .WORD $3B02 ; location on screen
.BYTE $1C,$0F,$11,$13,$1D,$1E,$0F,$1C,$00,$23,$19,$1F,$1C,$00,$13 ; "REGISTER YOUR INITIAL BELOW"
.BYTE $18,$13,$1E,$13,$0B,$16,$00,$0C,$0F,$16,$19,$21,$FE
L4D19: .WORD $3B4A ; location on screen
.BYTE $25,$00,$0B,$25,$0B,$25,$0B,$FF ; "- A-A-A"
L4D23: .WORD $398C ; location on screen
.BYTE $1D,$1E,$0B,$11,$0F,$FE ; "STAGE"
L4D2B: .WORD $3A0B ; location on screen
.BYTE $11,$0B,$17,$0F,$00,$1C,$0F,$0B,$0E,$23,$FF ; "GAME READY"
L4D38: .WORD $398C ; location on screen
.BYTE $00,$00,$00,$00,$00,$00,$00,$00,$FE ; " "
L4D43: .WORD $3A0B ; location on screen
.BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FF ; " "
L4D50: .WORD $390C ; location on screen
.BYTE $1A,$16,$0B,$23,$0F,$1C,$FF ; "PLAYER"
L4D59: .WORD $390C ; location on screen
.BYTE $00,$00,$00,$00,$00,$00,$00,$00,$FF ; " "
;----------------------------------------------------
; Interrupt routine 1 - Check for Coins
;----------------------------------------------------
L4D64: PHA ; Save A Register
TXA ; Move X
PHA ; Save X Register
TYA ; Move Y
PHA ; Save Y Register
CLD ; Clear Decimal Mode
LDA L0200 ; In Diagnostic Mode?
BEQ L4DE3 ; Yes, so leave interrupt
JSR L4E18 ; Delay for Xms
LDA L1001 ; Get inputs
AND #$C0 ; Check coin input
BEQ L4DE3 ; No coins so leave interrupt
;----------------------------------------------------
; Debounce Coin Slot Inputs
;----------------------------------------------------
STA VINTER+1 ; Mark which slot has coin
JSR L4E18 ; Delay for Xms
LDA L1001 ; Get Coin Input
AND VINTER+1 ; Is Coin Input still active?
BEQ L4DE3 ; No, so leave
JSR L4E18 ; Delay for Xms
LDA L1001 ; Get Coin Input
AND VINTER+1 ; Is Coin Input still active?
BEQ L4DE3 ; No, so leave
JSR L4E18 ; Delay for Xms
LDA L1001 ; Get Coin Input
AND VINTER+1 ; Is Coin Input still active?
BEQ L4DE3 ; No, so leave
;----------------------------------------------------
; Coin registered successfully, Check Coin(s)/Credit
;----------------------------------------------------
INC CoinCount ; Increment coin count
LDA #$19 ; Coin Count sound
STA L1004 ; Send to sound chip
LDY #$00 ; Y = 0
LDX #$00 ; X = 0
LDA L1001 ; Get Button inputs
EOR #$FF ; Toggle data
AND #$0F ; Isolate DIP Switch 1
ASL VINTER+1 ; Which chute has coin?
BCC L4DB7 ; Right coin chute, so skip ahead
LSR A ; Isolate DIP1 sw3-4, left coin chute
LSR A ; Isolate DIP1 sw3-4
L4DB7: AND #$03 ; 1 Coin/1 Credit?
BEQ L4DEC ; Yes, so skip ahead
INX ; X = 1
CMP #$02 ; 1 Coins/2 Credits?
BEQ L4DEC ; Yes, so skip ahead
INX ; X = 2
CMP #$01 ; 3 Coins/1 Credit?
BEQ L4DD3 ; Yes, so check for 3 coins
;----------------------------------------------------
; 2 Coins/1 Credit
;----------------------------------------------------
INX ; X = 3
LDA CoinCount ; Get number of coins
CMP #$02 ; Do we have at least 2 coin?
BCC L4DE3 ; No, so leave
DEC CoinCount ; Subtract 1 Coin
JMP L4DEC ; Award Credit
;----------------------------------------------------
; 3 Coins/1 Credit
;----------------------------------------------------
L4DD3: LDA CoinCount ; Get number of coins?
CMP #$03 ; Do we have at least 3 coins?
BCC L4DE3 ; No, so leave
DEC CoinCount ; Subtract 1 Coin
DEC CoinCount ; Subtract 1 Coin
JMP L4DEC ; Award Credit
;----------------------------------------------------
; Leave Coin Debounce Interrupt
;----------------------------------------------------
L4DE3: STA L1001 ; Clear coin slot input
PLA ; Restore Y Register
TAY ; Move Y
PLA ; Restore X Register
TAX ; Move X
PLA ; Restore A Register
RTI ; Return from interrupt
;----------------------------------------------------
; Award Credit
;----------------------------------------------------
; X = 0,1,2,3 Coin scenario
;----------------------------------------------------
L4DEC: LDA Credits ; Get Credits
SED ; Set Decimal Mode
CLC ; Clear Carry
ADC L4E2F,X ; Award proper credits
CMP L4E37,Y ; More than 9 credits?
BCC L4E01 ; Yes, so 9 is the max
LDA #$00 ; A = 0 (coin blocker)
STA L1000 ; Clear coin inputs
LDA L4E37,Y ; Get max number of credits
L4E01: STA Credits ; Save credits
CLD ; Clear Decimal Mode
DEC CoinCount ; Subtract 1 coin
LDA GameStatus ; Check Game Status
ORA CoinFlag ; Also check Coin Status Flag
BNE L4DE3 ; Game in progress so don't acknowledge credit
LDA #$01 ; 1 = Credit has been awarded
STA CoinFlag ; Notify Main Loop that credit has been awarded
JMP L4DE3 ; Leave Interrupt
;----------------------------------------------------
; Delay for Xms
;----------------------------------------------------
L4E18: LDX #$80 ; Delay = 128
L4E1A: LDA (L0000,X) ; Waste time
LDA (L0000,X) ; Waste time
LDA (L0000,X) ; Waste time
DEX ; Decrement delay
BNE L4E1A ; Delay not finished so wait
RTS ; Return when done
;----------------------------------------------------
; Delay -- unused
;----------------------------------------------------
LDX #$E7 ; Delay = 231
L4E26: LDA Vector3_HI ; Waste time
LDA Vector3_HI ; Waste time
NOP ; Waste time
DEX ; Decrement delay
BNE L4E26 ; Delay not finished so wait
RTS ; Return when done
;----------------------------------------------------
; Coin Data
;----------------------------------------------------
L4E2F: .BYTE 1, 2, 1, 1 ; credits awarded
.BYTE 6, 8, 3, 1
L4E37: .BYTE 9, 9, 9, 9 ; Max credits
.BYTE 9, 9, 9, 9
;----------------------------------------------------
; Give instructions wait for START BUTTON
;----------------------------------------------------
L4E3F: JSR L4EF2 ; Display user instructions/credits
JSR L4F78 ; Display number of credits on the screen
LDA SearchStatus ; Check LDP search status
CMP #$02 ;
BNE L4E6D ; Check for P1 or P2 selection
L4E4C: JSR L719E ; Screen Transition, Fill from outside in
LDA #$2E ; Video Sequence = High Score Mode (Frame 46344)
JSR L54A7 ; Play LaserDisc video sequence
L4E54: LDA SearchStatus ; Check LDP search status
CMP #$01
BEQ L4E67
CMP #$02
BEQ L4E67
LDX #$01
JSR L4BD2 ; Run Programmable Delay
JMP L4E54
L4E67: JSR L71D0 ; Clear Sprite Bank 1 & 2 (2800-281F,2BE0-2BFF)
JSR L71B8 ; Screen Transition, Clear from inside out
;----------------------------------------------------
; Wait for Player1 or Player2 button
;----------------------------------------------------
L4E6D: LDA L1001 ; Get switch inputs
AND #$20 ; Check Player1 button
BEQ L4E8D ; Player1 button pressed, skip ahead
LDA L1001 ; Get switch inputs
AND #$10 ; Check Player2 button
BEQ L4EAB ; Player2 button pressed, skip ahead
JSR L4EF2 ; Display user instructions/credits
LDX #$01 ; Delay Count = 1
JSR L4BD2 ; Run programmable Delay
LDA SearchStatus ; Check LDP search status
CMP #$02 ;
BEQ L4E4C ;
L4E8A: JMP L4E6D ; Loop back and wait for P1 or P2
;----------------------------------------------------
; Player1 button pressed
;----------------------------------------------------
L4E8D: JSR L4FC1 ; Deduct 1 Credit
LDA #$00 ; 1 player
STA NumPlayers ; Save number of players
STA CDTMV3 ;
STA VIMIRQ ;
LDA #$01 ; Status = Start Game
STA GameStatus ; Update Game Status
LDA #$00 ; A = 00
STA CoinFlag ; Clear CoinFlag once instructions are done
JSR L459A ; Erase Video Screen
JMP L4ED8 ; Jump ahead and continue
;----------------------------------------------------
; Player2 button pressed
;----------------------------------------------------
L4EAB: LDA Credits ; Get Credits
CMP #$02 ; Are there at least 2 credits?
BCS L4EB5 ; Yes, so skip ahead
JMP L4E8A ; Not enough credits, go back
L4EB5: JSR L4FC1 ; Deduct 1 Credit
JSR L4FC1 ; Deduct 1 Credit
LDA #$01 ; 2 players
STA NumPlayers ; Save number of players
LDA #$00
STA CDTMV3
STA CDTMV3_swap
STA VIMIRQ
LDA #$01 ; Status = Start Game
STA GameStatus ; Update Game Status
LDA #$00
STA VTIMR4
JSR L459A ; Erase Video Screen
;----------------------------------------------------
; Reset Score to 00000
;----------------------------------------------------
L4ED8: LDX #$05 ; 5 score bytes to reset
LDA #$00 ; A = 00
L4EDC: STA Score,X ; Reset score byte to 00
DEX ; Go to next byte
BPL L4EDC ; Loop back until score reset to 00000
LDA #$03 ;
STA L1000 ;
LDX #$FF ;
TXS ;
LDA #$2E ; Video Sequence = High Score Mode (Frame 46344)
JSR L54A7 ; Play LaserDisc video sequence
JMP L40A1 ; Go Start Game
;----------------------------------------------------
; Update display with user instructions
;----------------------------------------------------
L4EF2: LDA L3927 ; Check for message "PUSH START BUTTON"
CMP L4F8F ; Has message already been displayed?
BEQ L4F2E ; Yes, so skip ahead
JSR L459A ; Erase Video Screen
JSR L71D0 ; Clear Sprite Bank 1 & 2 (2800-281F,2BE0-2BFF)
JSR L71EC ; Erase Sprite RAM (3800-3FFF)
JSR L719E ; Screen Transition, Fill from outside in
LDA #$2E ; Video Sequence = High Score Mode (Frame 46344)
JSR L54A7 ; Play LaserDisc video sequence
L4F0B: LDA SearchStatus ; Check LDP search status
CMP #$01 ;
BEQ L4F1E ;
CMP #$02 ;
BEQ L4F1E ;
LDX #$01 ; Delay Count = 1
JSR L4BD2 ; Run programmable Delay
JMP L4F0B ;
L4F1E: JSR L71B8 ; Screen Transition, Clear from inside out
;----------------------------------------------------
; Display "PUSH START BUTTON" on screen
;----------------------------------------------------
LDY #$00 ; Loop = 0
L4F23: LDA L4F8F,Y ; Get Message character
STA L3927,Y ; Write character to display
INY ; Next character
CPY #$11 ; Have we printed all characters?
BNE L4F23 ; Loop until whole message is displayed
;----------------------------------------------------
; Check credits for 1 or 2 player game
;----------------------------------------------------
L4F2E: LDA Credits ; Get number of credits
CMP #$02 ; Are there at least 2 credits?
BCS L4F4C ; Yes, so skip ahead
;----------------------------------------------------
; Display "ONLY 1 PLAYER" on screen
;----------------------------------------------------
L4F35: LDA L3987 ; Check for message "ONLY 1 PLAYER"
CMP L4FA0 ; Has message already been displayed?
BEQ L4F6B ; Yes, so skip ahead
LDY #$00 ; Loop = 0
L4F3F: LDA L4FA0,Y ; Get Message character
STA L3987,Y ; Write character to display
INY ; Next character
CPY #$0D ; Have we printed all characters?
BNE L4F3F ; Loop until whole message is displayed
BEQ L4F6B ; Jump ahead and display credits
L4F4C: LDA L1002 ; Get DIP bank 2
AND #$40 ; Check Sw7 Upright or Cockpit
BEQ L4F56 ; Upright version, so allow 2 players
JMP L4F35 ; Cockpit version, 1 player allowed
;----------------------------------------------------
; Display "1 OR 2 PLAYERS" on screen
;----------------------------------------------------
L4F56: LDA L3987 ; Check for message "1 OR 2 PLAYERS"
CMP L4FAD ; Has message already been displayed?
BEQ L4F6B ; Yes, so skip ahead
LDY #$00 ; Loop = 0
L4F60: LDA L4FAD,Y ; Get Message character
STA L3987,Y ; Write character to display
INY ; Next character
CPY #$0E ; Have we printed all characters?
BNE L4F60 ; Loop until whole message is displayed
;----------------------------------------------------
; Display "CREDIT" on screen
;----------------------------------------------------
L4F6B: LDY #$00 ; Loop = 0
L4F6D: LDA L4FBB,Y ; Get Message character
STA L39EB,Y ; Write character to display
INY ; Next character
CPY #$06 ; Have we printed all characters?
BNE L4F6D ; Loop until whole message is displayed
;----------------------------------------------------
; Display number of credits on screen
;----------------------------------------------------
L4F78: LDA Credits ; Get number of credits
LSR A ; Go to ten's spot
LSR A ; Go to ten's spot
LSR A ; Go to ten's spot
LSR A ; Go to ten's spot
TAX ; A = Ten's credits
INX ; Create character
STX L39F2 ; Write to credit ten's spot
LDA Credits ; Get number of credits
AND #$0F ; Isolate one's spot
TAX ; A = One's credits
INX ; Create character
STX L39F3 ; Write to credit one's spot
RTS ; Return
;----------------------------------------------------
; Text strings to screen ASC(x + 54)
;----------------------------------------------------
L4F8F: .BYTE $1A,$1F,$1D,$12,$00,$1D,$1E,$0B ; "PUSH START BUTTON"
.BYTE $1C,$1E,$00,$0C,$1F,$1E,$1E,$19,$18
L4FA0: .BYTE $19,$18,$16,$23,$00,$02,$00,$1A ; "ONLY 1 PLAYER"
.BYTE $16,$0B,$23,$0F,$1C
L4FAD: .BYTE $02,$00,$19,$1C,$00,$03,$00 ; "1 OR 2 PLAYERS"
.BYTE $1A,$16,$0B,$23,$0F,$1C,$1D
L4FBB: .BYTE $0D,$1C,$0F,$0E,$13,$1E ; "CREDIT"
;----------------------------------------------------
; Deduct 1 Credit
;----------------------------------------------------
L4FC1: SED ; Set Decimal Mode
SEC ; Set Carry
LDA Credits ; Get Credits
SBC #$01 ; Subtract 1 credit
STA Credits ; Save Credits
CLD ; Clear Decimal Mode
LDA #$03 ; reset
STA L1000 ; reset
RTS ; Return
;----------------------------------------------------
; Check LDPlayer Repsonse for Errors (IRQ_Interrupt)
;----------------------------------------------------
L4FD2: PHA ; Save A Register
TXA ; Move X
PHA ; Save X Register
TYA ; Move Y
PHA ; Save Y Register
CLD ; Clear Decimal Mode
LDA Serial7 ;
BNE L4FE0 ;
JMP L5102 ; Exit Interrupt Routine
;----------------------------------------------------
; Setup Timeout to wait for receive data
;----------------------------------------------------
L4FE0: LDA #$00 ; Timer = 0
STA RecTimeout ; Reset Timeout
STA RecTimeout+1 ; Reset Timeout
L4FE8: INC RecTimeout ; Increment timer while waiting
BNE L4FF5 ; Timer not rolled, skip ahead
INC RecTimeout+1 ; Increment timer while waiting
LDA RecTimeout+1 ; Check timer
BEQ L4FFC ; Timer timed out, byte must be received
L4FF5: LDA L1006 ; Get UART Status Register
AND #$01 ; Check if Receive Data Reg full
BEQ L4FE8 ; No data received, loop back to timeout
;----------------------------------------------------
; Check if command was accepted (ERROR HEX)
;----------------------------------------------------
L4FFC: LDA L1007 ; Get serial data byte (LDP Status Byte)
CMP #$02 ; Was response ERROR HEX ($02)?
BNE L502F ; No, so skip ahead and check other codes
INC ErrorHEX ; Count this as an error
LDA ErrorHEX ; Check how many errors we have had
CMP #$04 ; Has command been rejected 4 times?
BCC L501A ; Not yet so skip ahead
;----------------------------------------------------
; Print LDP Error Message
;----------------------------------------------------
L500D: JSR L459A ; Erase Video Screen
LDX #$A7 ; Message = "LDP ERROR" ($58A7)
LDY #$58 ; Message = "LDP ERROR" ($58A7)
JSR L4831 ; Print Text Message
L5017: JMP L5017 ; Stop here
;----------------------------------------------------
;
;----------------------------------------------------
L501A: LDA #$00
STA HOLD3
LDA #$01
STA STICK0
STA Serial7
LDA #$41
STA L1007
JMP L5102 ; Exit Interrupt Routine
;----------------------------------------------------
; Check for Not Acknowledged (NAK)
;----------------------------------------------------
L502F: CMP #$0B ; Was response NOT ACKNOWLEDGE ($0B)?
BNE L505D ; No, so skip ahead
INC ErrorNAK ; Count number of times we get NAK
LDA ErrorNAK ; Check how many times we get error
CMP #$04 ; Have we got 4 errors?
BCC L5040 ; Not yet so skip ahead
JMP L500D ; Print "LDP ERROR"
;----------------------------------------------------
;
;----------------------------------------------------
L5040: LDA #$00
STA HOLD3
LDA STICK0
BNE L504D
JMP L5102 ; Exit Interrupt Routine
L504D: LDA #$00
L504F: STA STICK0
LDA #$01
STA Serial7
JSR L510E ; Send SEARCH/REPEAT data to LDPlayer
JMP L5102 ; Exit Interrupt Routine
;----------------------------------------------------
; Check for Acknowledged (ACK)
;----------------------------------------------------
L505D: CMP #$0A ; Was response ACKNOWLEDGE ($0A)?
BNE L507E ; No, so skip ahead
LDA #$00
STA HOLD3
LDA STICK0
BNE L506E
JMP L5102 ; Exit Interrupt Routine
L506E: LDA Serial7
CMP #$02
BNE L5078
JMP L5102 ; Exit Interrupt Routine
L5078: JSR L510E ; Send SEARCH/REPEAT data to LDPlayer
JMP L5102 ; Exit Interrupt Routine
;----------------------------------------------------
; Check for SEARCH COMPLETE
;----------------------------------------------------
L507E: CMP #$01 ; Was response COMPLETION ($01)?
BNE L5097 ; No, so skip ahead
LDA Serial7
CMP #$02
BNE L5102 ; Exit Interrupt Routine
INC SearchStatus ; Mark SEACH COMPLETE
LDA #$01
STA Serial7
JSR L510E ; Send SEARCH/REPEAT data to LDPlayer
JMP L5102 ; Exit Interrupt Routine
;----------------------------------------------------
; Check for Bad Frame Search
;----------------------------------------------------
L5097: CMP #$05 ; Was response NOT TARGET ($05)?
BNE L50F2 ; No, so skip ahead
LDA Serial7
CMP #$02
BNE L5102 ; Exit Interrupt Routine
INC SearchStatus ;
LDA SearchStatus ; Check LDP search status
CMP #$02
BNE L50B7
LDA #$01
STA Serial7
JSR L510E ; Send SEARCH/REPEAT data to LDPlayer
JMP L5102 ; Exit Interrupt Routine
L50B7: INC VKEYBD+1 ; Count number of times we get error
LDA VKEYBD+1 ; Check how many times we get error
CMP #$04 ; Have we got 4 errors?
BCC L50CE ; Not yet so skip ahead
;----------------------------------------------------
; Print LaserDisc Error Message
;----------------------------------------------------
JSR L459A ; Erase Video Screen
LDX #$9A ; Message = "DISC ERROR" ($589A)
LDY #$58 ; Message = "DISC ERROR" ($589A)
JSR L4831 ; Print Text Message
L50CB: JMP L50CB ; Stop here
;----------------------------------------------------
;
;----------------------------------------------------
L50CE: LDX #$05
L50D0: INC PTRIG2,X
LDA PTRIG2,X
CMP #$3A
BNE L50E2
LDA #$30
STA PTRIG2,X
DEX
BPL L50D0
L50E2: LDA #$01
STA STICK0
STA Serial7
LDA #$41
STA L1007
JMP L5102 ; Exit Interrupt Routine
;----------------------------------------------------
; LDP Status byte not recognized
;----------------------------------------------------
L50F2: INC LDPError ; Byte not recognized, count it as an error
LDA LDPError ; Check how many errors we've had
CMP #$04 ; Have we had more than 4 errors?
BCC L50FF ; No, so we're ok to skip ahead
JMP L500D ; Print "LDP ERROR"
L50FF: JMP L504D ; Jump back and ...
;----------------------------------------------------
; Exit Interrupt Routine
;----------------------------------------------------
L5102: LDA L1007 ;
STA L1002 ;
PLA ; Restore Y Register
TAY ; Move Y
PLA ; Restore X Register
TAX ; Move X
PLA ; Restore A Register
RTI ; Return from Interrupt
;----------------------------------------------------
; Send SEARCH/REPEAT data to LDPlayer
;----------------------------------------------------
L510E: LDA HOLD3 ; Check for SEARCH or REPEAT
BEQ L5134 ; skip ahead and do REPEAT
LDY #$00 ;
L5115: LDA HOLD3 ;
BEQ L5134
LDA L1003 ; Check verticle blanking
BPL L5115 ; Loop here until we enter verticle blanking
;----------------------------------------------------
; Pause in between sending SEARCH/REPEAT commands
;----------------------------------------------------
L511F: LDA L1003 ; Check verticle blanking
BMI L511F ; Loop here until we leave verticle blanking
DEY
BNE L5115
LDX #$00 ; Loop = 0 bytes
;----------------------------------------------------
; Begin Serial Data Xmit
;----------------------------------------------------
STX STICK0 ; Save byte number counter
LDX #$01 ;
STX Serial7 ;
JMP L5134 ; Start sending bytes
L5134: LDX STICK0 ; Get byte number
BNE L513E ; Not our first byte so skip header
LDA #$00 ;
STA VKEYBD+1 ;
L513E: LDA SEARCHBuf0,X ; Get byte from BufferOut
CMP #$FF ; Is this the last byte?
BNE L514D ; No, so skip ahead
LDA #$00
STA Serial7
JMP L51A3 ; Last byte so leave
L514D: INC STICK0 ;
INC HOLD3 ;
;----------------------------------------------------
; Reset Xmit Timer
;----------------------------------------------------
LDA #$00 ; Timer = $0000
STA XmitTimeoutLo ; Reset Timer low byte
STA XmitTimeoutHi ; Reset Timer high byte
;----------------------------------------------------
; Start timeout, wait for transmit buffer empty
;----------------------------------------------------
L515B: INC XmitTimeoutLo ;
BNE L5168 ;
INC XmitTimeoutHi ;
LDA XmitTimeoutHi ;
BEQ L516F ;
L5168: LDA L1006 ; Get UART Status Register
AND #$02 ; Check if Xmit Data Reg Empty
BEQ L515B ; Register not empty, loop back
;----------------------------------------------------
; Send out serial byte
;----------------------------------------------------
L516F: LDA SEARCHBuf0,X ; Get serial byte command
STA L1007 ;
LDX #$03 ;
CMP #$43 ; Was last command SEARCH ($43)?
BEQ L51A0 ; Yes, so
INX ; Go to next serial byte
CMP #$44 ; Was last command REPEAT ($44)?
BEQ L51A0 ; Yes, so
CMP #$40 ; Was last command ENTER ($40)?
BNE L51A3
LDA Serial7
CMP #$01
L5189: BEQ L51A3
DEC Serial7
LDA Serial7
CMP #$02
BNE L51A3
LDA #$00 ; Timer = $00
STA SUBTimer ; Reset timer
STA SUBTimer+1 ; Reset timer
JMP L51A3 ; Finished
L51A0: STX Serial7 ;
L51A3: RTS ; Finished so return
;----------------------------------------------------
; Increment SUB Timer
;----------------------------------------------------
L51A4: LDA Serial7 ;
CMP #$02 ;
BNE L51CD ;
CLC ; Clear carry
LDA SUBTimer ; Get SUB Timer LO byte
ADC #$01 ; Add 1 to SUB Timer
STA SUBTimer ; Save new timer value
LDA SUBTimer+1 ; Get HI byte of timer
ADC #$00 ; Add carry to high byte
STA SUBTimer+1 ; Save HI byte of SUB Timer
CMP #$2F ; Is timer greater than 3.3 minutes?
BCC L51CD ; Not yet so just leave
;----------------------------------------------------
; SUB Timer expired so Reset Xmit stuff?
;----------------------------------------------------
LDA #$00 ;
STA STICK0 ;
LDA #$01 ;
STA Serial7 ;
JSR L510E ; Send SEARCH/REPEAT data to LDPlayer
L51CD: RTS ; Return
;----------------------------------------------------
; Play 1 of 48 Different Sounds
;----------------------------------------------------
; A = Sound Number X = Duration?
;----------------------------------------------------
L51CE: STX VTIMR2 ;
LDX GameStatus ; Check Game Status
BEQ L51DD ; Game Over so suppress sounds
TAX ; Which sound number (0-47)
LDA L51E1,X ; Get musical note
STA L1004 ; Write note to sound chip
L51DD: LDX VTIMR2 ;
RTS ; Return
;----------------------------------------------------
; Sound Note Data (LOW to HIGH)
;----------------------------------------------------
L51E1: .BYTE $00,$1A,$02,$03,$04,$05,$06,$07,$08,$FF,$0A,$0B
.BYTE $0C,$0D,$0E,$0F,$10,$11,$12,$13,$14,$15,$16,$17
.BYTE $18,$19,$1A,$1B,$1C,$1D,$1E,$1F,$20,$21,$22,$23
.BYTE $24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F
;----------------------------------------------------
; Check if Player is "GREATEST PLAYER"
;----------------------------------------------------
L5211: JSR L5270 ; Calculate Players Ranking
LDA Ranking ; Get ranking
CMP #$08 ; Is score in the top 8?
BCS L526F ; No, so leave
JSR L529B ; Insert Initials
JSR L44A0 ;
LDX #$EB ; Message = "GREAT PLAYER!" ($4CEB)
LDY #$4C ; Message = "GREAT PLAYER!" ($4CEB)
JSR L4831 ; Print Text Message
LDX Ranking
LDA L528F,X
STA Ranking
LDA #$00
STA Ptr2_HI+1
L5235: LDX #$01 ; Delay Count = 1
JSR L4BD2 ; Run programmable Delay
LDA L1000 ; Read Inputs
STA WARMST ; Save Inputs to buffer
AND #$0F ; Isolate Joystick input
STA L04BD ; Save Joystick direction to buffer
LDA WARMST ; Check button inputs
AND #$60 ; Isolate TELEPORT and BARRIER buttons
LSR A ; Shift bits
STA WARMST ; Save TELEPORT and BARRIER buttons
LDA L1001 ; Get Button inputs
AND #$30 ; Check Player1/2 Buttons
ASL A ; Shift bits into place
ASL A ; Shift bits into place
ORA WARMST ; Combine all buttons
ORA L04BD ; Combine button data with joystick direction data
STA WARMST ; Save combined Joystick data byte
JSR L52F0 ; Debounce Joystick?
LDA Ptr2_HI+1 ; Get Joystick (debounced)
AND #$7F ; Isolate joystick data
CMP #$03 ; Check if UP/DOWN pressed
BCC L5235
JSR L459A ; Erase Video Screen
JSR L4496 ; Print High Scores
LDX #$7F ;
JSR L4BD2 ;
L526F: RTS ; Return
;----------------------------------------------------
; Get Players Ranking in the "Greatest Players"
;----------------------------------------------------
L5270: LDX #$07 ; 7 high scores to check
L5272: LDY L528F,X ;
SEC ;
LDA Ptr1_LO ; Get player's score 0
SBC HiScore1,Y ; Compare player's score to high scores
LDA Ptr1_HI ; Get player's score 1
SBC HiScore2,Y ; Compare player's score to high scores
LDA Ptr2_LO ; Get player's score 2
SBC HiScore3,Y ; Compare player's score to high scores
BCC L528A ; Score is less than so put ranking here
DEX ;
BPL L5272 ;
L528A: INX ; Add 1 to ranking
STX Ranking ; Save Player ranking
RTS ; Return
;----------------------------------------------------
; Score
;----------------------------------------------------
L528F: .BYTE 2, 5, 8, 11, 14, 17
.BYTE 20, 23, 26, 29, 32, 35
;----------------------------------------------------
; Insert New Player's Initials into High Scores
;----------------------------------------------------
L529B: LDX #$07 ;
L529D: LDY L528F,X ;
CPX Ranking ;
BCC L52D1 ;
CPX #$FF ;
BEQ L52D1 ;
LDA L0251,Y ;
STA L0254,Y
LDA L0250,Y
STA L0253,Y
LDA L024F,Y
STA L0252,Y
LDA HiScore3,Y
STA VPIRQ+1,Y
LDA HiScore2,Y
STA VPIRQ,Y
LDA HiScore1,Y
STA HiScore3+1,Y
DEX
JMP L529D
;----------------------------------------------------
; Copy Initials to correct spot
;----------------------------------------------------
L52D1: INX ;
LDY L528F,X ;
LDA Ptr2_LO ;
STA HiScore3,Y
LDA Ptr1_HI
STA HiScore2,Y
LDA Ptr1_LO
STA HiScore1,Y
LDA #$25 ; Char = "-"
STA L0251,Y ; Print dash for initials
STA L0250,Y ; Print dash for initials
STA L024F,Y ; Print dash for initials
RTS ; Return
;----------------------------------------------------
; debounce?
;----------------------------------------------------
L52F0: LDA Ptr2_HI+1
BMI L5308
LDA #$10
STA CMCMD
LDA #$00
STA TRAMSZ
STA POKMSK
LDA Ptr2_HI+1
ORA #$80
STA Ptr2_HI+1
LDA #$FF
STA DOSVEC
L5308: ASL A
TAX
LDA L53A1,X
STA DOSVEC+1
LDA L53A2,X
STA DOSINI
LDA Ranking
ASL A
STA DOSINI+1
ASL A
CLC
ADC DOSINI+1
STX DOSINI+1
CLC
ADC DOSINI+1
TAX
LDA L53A7,X
STA DOSINI+1
LDA L53A8,X
STA APPMHI
INC POKMSK
LDA POKMSK
AND #$3F
BNE L533A
DEC CMCMD
BEQ L5386
L533A: LDA WARMST
AND #$03
EOR BOOT
BEQ L5374
LDA WARMST
AND #$03
STA BOOT
CMP #$03
BEQ L5374
CMP #$01
BEQ L535B
CMP #$02
BEQ L5357
JMP L5374
L5357: DEC TRAMSZ
DEC TRAMSZ
L535B: INC TRAMSZ
LDX #$1A
LDA TRAMSZ
BMI L5369
CMP #$1B
BCC L536B
LDX #$00
L5369: STX TRAMSZ
L536B: LDA TRAMSZ
CLC
ADC #$0B
LDY #$00
STA (DOSVEC+1),Y
L5374: LDA WARMST
AND #$20
STA DOSINI
EOR DOSVEC
BEQ L539C
LDA DOSVEC
BNE L539C
LDA DOSINI
STA DOSVEC
L5386: INC Ptr2_HI+1
LDY Ranking
LDA TRAMSZ
CLC
ADC #$0B
STA L024F,Y
INC Ranking
LDA Ptr2_HI+1
AND #$7F
STA Ptr2_HI+1
L539C: LDA DOSINI
STA DOSVEC
RTS
;----------------------------------------------------
; Screen Locations for High Scores
;----------------------------------------------------
L53A1: .WORD $3B4C,$3B4E,$3B50,$40C7,$40C8,$40C9,$4108
.WORD $4109,$410A,$4149,$414A,$414B,$418A,$418B
.WORD $418C,$41CB,$41CC,$41CD,$420C,$420D,$420E
.WORD $424D,$424E,$424F,$428E,$428F,$4290
;----------------------------------------------------
; Add Bonus to Score
;----------------------------------------------------
; A = BONUS, 0 = 50
; 1 = 100
; 2 = 150
; 3 = 200
; 4 = 400
; 5 = 800
; 6 = 1600
; 7 = 1000
;----------------------------------------------------
L53D7: STA Ptr1_LO ; Save Bonus number (0-14)
TXA ;
PHA ;
LDA GameStatus ; Check Game Status
BNE L53E3 ; Game in progress so allow bonus
JMP L5475 ; Game Over, so no bonus
L53E3: LDX PlayerNumber ; Get Player Number
LDY L54A5,X ; Y = Score offset (0,3)
LDX Ptr1_LO ; X = Bonus (0-14)
NEXT PAGE 
|