Site Map | Contact Info | Home  
  
 Home
 Products
 ROMHACK Toolbox
 Ordering Info
 Code Disassembly
  Bega's Battle
  Cliffhanger
  Thayer's Quest
 My Gameroom
 Links

 

 

Page1

Page2 

Page3 

Page4 

Page5 

Page6 

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