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

HOME  

 ROMHACK 2009