 |
;----------------------------------------------------
; 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 |