 |
;----------------------------------------------------
; Do addition (3 bytes)
;----------------------------------------------------
CLC ; Clear carry for addition
SED ; Set decimal mode
LDA Score,Y ; Get player's score
ADC L5478,X ; Add bonus
STA Score,Y ; Save player's new score
LDA Score1,Y ; Get player's score
ADC L5487,X ; Add bonus
STA Score1,Y ; Save player's new score
LDA Score2,Y ; Get player's score
ADC L5496,X ; Add bonus
STA Score2,Y ; Save player's new score
;----------------------------------------------------
; Print updated score
;----------------------------------------------------
CLD ; Clear Decimal Mode
LDX PlayerNumber ; Get Player Number
JSR L463A ; Print Player's Score
LDX PlayerNumber ; Get Player Number
LDA L54A5,X ; Get Score offset (0,3)
TAX ; X = Score offset (0,3)
LDA HiScore2
L5419: CMP Score2,X
BCC L5432
BNE L5449
LDA HiScore1
CMP Score1,X
BCC L5432
BNE L5449
LDA HiScore0
CMP Score,X
BCS L5449
L5432: LDA Score,X
STA HiScore0
LDA Score1,X
STA HiScore1
LDA Score2,X
STA HiScore2
LDX #$02 ; Set to Print High Score
JSR L463A ; Print High Score
;----------------------------------------------------
; Check if bonus life is awarded for score level
;----------------------------------------------------
L5449: LDA Bonus ; Check bonus threshold
BEQ L5475 ; No bonus level so leave
LDX PlayerNumber ;
LDY L54A5,X ;
LDA Score2,Y ;
CMP Bonus+1,X ; Is score greater than threshold?
BCC L5475 ; No, so leave
CLC ;
SED ;
LDA Bonus+1,X ;
ADC Bonus ;
STA Bonus+1,X ;
CLD ; Clear Decimal Mode
LDA #$02
JSR L51CE ; Play Sound
LDX PlayerNumber ; Check which player is playing
INC Player1Lives,X ; Award bonus life
JSR L4BF7 ; Print BEGA and LUNA lives
L5475: PLA ; Get X Register
TAX ; Restore X Register
RTS ; Return
;----------------------------------------------------
; Score Bonuses (by column)
;----------------------------------------------------
; Value = 50,100,150,200,400,800,1600,1000,...
;----------------------------------------------------
L5478: .BYTE $50,$00,$50,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
L5487: .BYTE $00,$01,$01,$02,$04,$08,$16,$10,$00,$00,$00,$00,$00,$00,$00
L5496: .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
;----------------------------------------------------
; Score Offset
;----------------------------------------------------
L54A5: .BYTE $00 ; Player1
.BYTE $03 ; Player2
;----------------------------------------------------
; Play LaserDisc Video Sequence
;----------------------------------------------------
; A = Video Sequence number (0-46)
;----------------------------------------------------
L54A7: STA Ptr2_LO ; Save Video Sequence Number (0-46)
LDA #$00 ; A = 00
STA SearchStatus ; Clear Search status
STA STICK0 ; Clear ?
STA ErrorHEX ; Clear LDP HEX Error Count
STA ErrorNAK ; Clear LDP NAK Error Count
STA LDPError ; Clear LDP Unrecognized Byte Count
;----------------------------------------------------
; Setup SEARCH Data
;----------------------------------------------------
L54BA: LDA #$56 ; Command = CLEAR_ALL ($56)
STA SEARCHBuf0 ; Save command in BufferOut
LDA #$43 ; Command = SEARCH ($43)
STA PTRIG2 ; Save command in BufferOut
ASL Ptr2_LO ; Multiply Video Sequence Number by 2
LDX Ptr2_LO ; X = index
LDA LCD12,X ; Get Frame Number pointer
STA Ptr1_LO ; Setup pointer
LDA LCD13,X ; Get Frame Number pointer
STA Ptr1_HI ; Setup pointer
;----------------------------------------------------
; Get Frame Number from Table ($027F-$0283)
;----------------------------------------------------
LDY #$04 ; 5 digits to copy from table
L54D4: LDA (Ptr1_LO),Y ; Get digit from table
STA PTRIG3,Y ; Save digit into $027F-$0283
DEY ; Go to next digit in number
BPL L54D4 ; Loop until all 5 digits copied
;----------------------------------------------------
; Setup REPEAT Data
;----------------------------------------------------
LDA #$40 ; Command = ENTER ($40)
STA REPEATBuf0 ; Save command in BufferOut
LDA #$44 ; Command = REPEAT ($44)
STA REPEATBuf1 ; Save command in BufferOut
LDX Ptr2_LO ; X = index
LDA LCD70,X ; Get Frame Number pointer
STA Ptr1_LO ; Setup pointer
LDA LCD71,X ; Get Frame Number pointer
STA Ptr1_HI ; Setup pointer
;----------------------------------------------------
; Get Frame Number from Table ($0286-$028A)
;----------------------------------------------------
LDY #$04 ; 5 digits to copy from table
L54F4: LDA (Ptr1_LO),Y ; Get digit from table
STA REPEATBuf2,Y ; Save digit into $0286-$028A
DEY ; Go to next digit in number
BPL L54F4 ; Loop until all 5 digits copied
;----------------------------------------------------
; Add ENTER and EOL marker to command string
;----------------------------------------------------
LDA #$40 ; Command = ENTER ($40)
STA STRIG3+4 ; Save command in BufferOut
STA STRIG3+5 ; Save command in BufferOut
LDA #$FF ; FF = End Buffer Marker
STA STRIG3+6 ; Mark End of BufferOut
JSR L510E ; Send SEARCH/REPEAT data to LDPlayer
LDA #$01 ;
STA Serial7 ;
RTS ; Return
;----------------------------------------------------
; unused?
;----------------------------------------------------
LDA #$00
STA Ptr1_HI
STA Ptr2_LO
STA Ptr2_HI
LDY #$08
L551C: LSR Ptr2_HI+1
BCC L552D
CLC
LDA Ptr2_LO
ADC Ptr1_LO
STA Ptr2_LO
LDA Ptr2_HI
ADC Ptr1_HI
STA Ptr2_HI
L552D: ASL Ptr1_LO
ROL Ptr1_HI
DEY
BNE L551C
RTS
;----------------------------------------------------
; Update Scoring Overlay
;----------------------------------------------------
L5535: JSR L4BA4 ;
JSR L45C1 ; Print "HI 1UP/2UP" overlay screen
LDA NumPlayers ; How many players?
BEQ L5545 ; One player so skip ahead
LDX #$01 ; Setup printing of Player2 score
JSR L463A ; Print Player2 score
L5545: LDX #$00 ; Setup printing of Player1 score
JSR L463A ; Print Player1 score
LDX #$02 ; Setup printing of HI Score
JSR L463A ; Print HI Score
JSR L4BF7 ; Print BEGA and LUNA lives
RTS ; Return
;----------------------------------------------------
; Print Number of Points scored (unused)
;----------------------------------------------------
STX Ptr1_LO ;
LDA L55C9,Y ;
TAY ;
LDA PADDL4
BNE L5565
LDA #$06
CLC
ADC Ptr1_LO
BNE L5575
L5565: CMP #$01
BNE L5570
LDA #$03
CLC
ADC Ptr1_LO
BNE L5575
L5570: LDA #$00
CLC
ADC Ptr1_LO
L5575: CPX #$06
BNE L55A1
TAX
LDA L55D2,X
STA L29A3,Y
INX
LDA L55D2,X
STA L29A4,Y
INX
LDA L55D2,X
STA L29A5,Y
;----------------------------------------------------
; Print "PTS" for points
;----------------------------------------------------
LDA L55CF ; Char = 'P'
STA L29A6,Y ; Print 'P'
LDA L55D0 ; Char = 'T'
STA L29A7,Y ; Print 'T'
LDA L55D1 ; Char = 'S'
STA L29A8,Y ; Print 'S'
RTS ; Return
;----------------------------------------------------
;
;----------------------------------------------------
L55A1: TAX
LDA L55D2,X
STA L28A3,Y
INX
LDA L55D2,X
STA L28A4,Y
INX
LDA L55D2,X
STA L28A5,Y
LDA L55CF
STA L28A6,Y
LDA L55D0
STA L28A7,Y
LDA L55D1
STA L28A8,Y
RTS ; Return
;----------------------------------------------------
; unknown data
;----------------------------------------------------
L55C9: .BYTE $02,$0B,$14,$94,$8B,$82
;----------------------------------------------------
; Point Text "PTS"
;----------------------------------------------------
L55CF: .BYTE $1A ; 'P'
L55D0: .BYTE $1E ; 'T'
L55D1: .BYTE $1D ; 'S'
;----------------------------------------------------
; unknown data
;----------------------------------------------------
L55D2: .BYTE $00,$06,$01,$02,$01,$01
.BYTE $02,$06,$01,$03,$01,$01
.BYTE $03,$06,$01
;----------------------------------------------------
; Check Continue Feature
;----------------------------------------------------
L55E1: LDA L04DA ; Have we continued once yet?
BEQ L55EC ; No, so check for Continuous Play
LDA #$00 ;
STA L04DA ;
RTS ; Return
;----------------------------------------------------
; Check for Continuous Play
;----------------------------------------------------
L55EC: LDA L1002 ; Get DIP Bank 2
AND #$04 ; Check Sw3, Continuous Play
BEQ L55F4 ; Jump ahead for continuous play
RTS ; No continue so leave
;----------------------------------------------------
; Continuous Play Selected
;----------------------------------------------------
L55F4: JSR L719E ; Screen Transition, Fill from outside in
LDA #$58 ; Video Sequence = ? (Frame xxxxx)
JSR L54A7 ; Play LaserDisc video sequence
L55FC: JSR L71B8 ; Screen Transition, Clear from inside out
LDA SearchStatus ; Check LDP search status
CMP #$01 ;
BEQ L5612 ;
CMP #$02 ;
BEQ L5612 ;
LDX #$01 ; Delay Count = 1
JSR L4BD2 ; Run programmable Delay
JMP L55FC
L5612: JSR L71D0 ; Clear Sprite Bank 1 & 2 (2800-281F,2BE0-2BFF)
JSR L71DE ; Clear Sprite Bank 3 & 4 (3800-381F,3BE0-3BFF)
LDX #$00
TXA
L561B: STA L3A00,X
STA L3B00,X
STA L3E00,X
STA L3F00,X
DEX
BNE L561B
LDA #$08
STA L04BD
LDA #$3F ; Set Flash text for 6.3 seconds
STA FlashTime ; Set FlashTimer
LDA Credits ; Get number of Credits
BEQ L563C ; No credits left, so prompt for coins
JMP L569A ; Prompt player to press start button
;----------------------------------------------------
; Prompt to insert more coins
;----------------------------------------------------
L563C: LDX FlashTime ; X = Flash rate timer for text
LDA L04BD ; ?
STA L3B10 ; ?
LDA #$00 ; ?
STA L3F10 ; ?
;----------------------------------------------------
; Update screen with flashing text message
;----------------------------------------------------
L564A: LDA L1003 ; Check Vertical Blanking Pulse
BPL L564A ; Don't update screen until we're in blanking area
TXA ; Save flash rate timer
PHA ; Push flash rate time onto stack
LDX #$E0 ; Message = " " ($57E0)
LDY #$57 ; Message = " " ($57E0)
AND #$30 ; Check if it's time to flash text
BEQ L565D ; Yes, so erase text this time
;----------------------------------------------------
; "TO CONTINUE THE GAME AT
; THE STAGE YOU LEFT OFF
; INSERT COINS FOR MORE"
;----------------------------------------------------
LDX #$4E ; Message = "TO CONTINUE THE GAME AT" ($574E)
LDY #$57 ; Message = "TO CONTINUE THE GAME AT" ($574E)
L565D: JSR L4831 ; Print Text Message
LDA Credits ; Check if any credits have been awarded
BEQ L5687 ; No credits so continue to flash message
;----------------------------------------------------
; Credit inserted so award lives
;----------------------------------------------------
JSR L56FD
LDA L1002 ; Get DIP bank 2
EOR #$FF ; Toggle all bits
AND #$03 ; Get DIP Sw1-2 Number of Begas
TAY ; Y = DIP Sw1-2 Number of Begas
LDA L4529,Y ; Get initial Number of Lives from table
LDY PlayerNumber ; Find out which player is continuing
STA Player1Lives,Y ; Restore the players total lives
LDA #$01 ;
STA CDTMV3 ;
JSR L4FC1 ; Deduct 1 Credit
LDX #$FF ;
TXS ;
JMP L40B1 ; Return to Main Game Loop
;----------------------------------------------------
;
;----------------------------------------------------
L5687: PLA ; Get FlashTimer
TAX ; X = FlashTimer
DEX ; Decrement FlashTimer
BPL L564A ; FlashTimer still running so loop back
DEC L04BD
LDA L04BD
CMP #$01
BNE L563C ; Go back and prompt to insert coins
JSR L459A ; Erase Video Screen
RTS ; Return
;----------------------------------------------------
; Prompt to press button to continue
;----------------------------------------------------
L569A: JSR L4F2E ;
L569D: LDX FlashTime ;
LDA L04BD ;
STA L3B10
LDA #$00
STA L3F10
;----------------------------------------------------
; Update screen with flashing text message
;----------------------------------------------------
L56AB: LDA L1003 ; Check Horizontal Blanking Pulse
BPL L56AB ; Don't update screen until we're in blanking area
TXA ; Save flast rate timer
PHA ; Push flash rate time onto stack
LDX #$E0 ; Message = " " ($57E0)
LDY #$57 ; Message = " " ($57E0)
AND #$30 ; Check if it's time to flash text
BEQ L56BE ; Yes, so erase text this time
;----------------------------------------------------
; "TO CONTINUE THE GAME AT
; THE STAGE YOU LEFT OFF
; PUSH START BUTTON"
;----------------------------------------------------
LDX #$99 ; Message = "TO CONTINUE THE GAME AT" ($5799)
LDY #$57 ; Message = "TO CONTINUE THE GAME AT" ($5799)
L56BE: JSR L4831 ; Print Text Message
LDA L1001 ; Get Switch Inputs
AND #$20 ; Check Player1 button
BNE L56EA ; Player1 button not pressed, skip ahead
;----------------------------------------------------
; Button pressed so deduct credit and award lives
;----------------------------------------------------
JSR L56FD ;
LDA L1002 ; Get DIP bank 2
EOR #$FF ; Toggle all bits
AND #$03 ; Get DIP Sw1-2 Number of Begas
TAY ; Y = DIP Sw1-2 Number of Begas
LDA L4529,Y ; Get initial Number of Lives from table
LDY PlayerNumber ; Find out which player is continuing
STA Player1Lives,Y ; Restore that players total lives
LDA #$01
STA CDTMV3
JSR L4FC1 ; Deduct 1 Credit
LDX #$FF ;
TXS ;
JMP L40B1 ; Return to Main Game Loop
L56EA: PLA ; Get FlashTimer
TAX ; X = FlashTimer
DEX ; Decrement FlashTimer
BPL L56AB
DEC L04BD
LDA L04BD
CMP #$01
BNE L569D
JSR L459A ; Erase Video Screen
RTS ; Return
;----------------------------------------------------
; Score routine?
;----------------------------------------------------
L56FD: LDA PlayerNumber ; Which player is playing?
BEQ L5705 ; Player1 is playing so do Player1
JMP L5726 ; Jump ahead and do Player2
;----------------------------------------------------
; Copy Player1's Score
;----------------------------------------------------
L5705: JSR L459A ; Erase Video Screen
LDA Score ;
STA Ptr1_LO ;
LDA Score1 ;
STA Ptr1_HI ;
LDA Score2 ;
STA Ptr2_LO ;
JSR L5211 ; Check if Player is "GREATEST PLAYER"
;----------------------------------------------------
; Reset Player1's Score to 00000
;----------------------------------------------------
LDA #$00 ; Score = 0
STA Score ; Reset score
STA Score1 ; Reset score
STA Score2 ; Reset score
RTS ; Return
;----------------------------------------------------
;
;----------------------------------------------------
L5726: JSR L459A ; Erase Video Screen
LDA P2Score
STA Ptr1_LO
LDA P2Score1
STA Ptr1_HI
LDA P2Score2
STA Ptr2_LO
JSR L5211 ; Check if Player is "GREATEST PLAYER"
LDX #$00
STX L1000
NOP
NOP
;----------------------------------------------------
; Reset Player2's Score to 00000
;----------------------------------------------------
LDA #$00 ; Score = 0
STA P2Score ; Reset score
STA P2Score1 ; Reset score
STA P2Score2 ; Reset score
RTS ; Return
;----------------------------------------------------
; Continue Text Messages
;----------------------------------------------------
L574E: .WORD $3A44
.BYTE $1E,$19,$00,$0D,$19,$18,$1E,$13,$18,$1F,$0F,$00 ; "TO CONTINUE THE GAME AT"
.BYTE $1E,$12,$0F,$00,$11,$0B,$17,$0F,$00,$0B,$1E,$FE
L5768: .WORD $3A84
.BYTE $1E,$12,$0F,$00,$1D,$1E,$0B,$11,$0F,$00,$23,$19 ; "THE STAGE YOU LEFT OFF"
.BYTE $1F,$00,$16,$0F,$10,$1E,$00,$19,$10,$10,$FE
L5781: .WORD $3AC5
.BYTE $13,$18,$1D,$0F,$1C,$1E,$00,$0D,$19,$13,$18,$1D ; "INSERT COINS FOR MORE"
.BYTE $00,$10,$19,$1C,$00,$17,$19,$1C,$0F,$FF
L5799: .WORD $3A44
.BYTE $1E,$19,$00,$0D,$19,$18,$1E,$13,$18,$1F,$0F,$00 ; "TO CONTINUE THE GAME AT"
.BYTE $1E,$12,$0F,$00,$11,$0B,$17,$0F,$00,$0B,$1E,$FE
L57B3: .WORD $3A84
.BYTE $1E,$12,$0F,$00,$1D,$1E,$0B,$11,$0F,$00,$23,$19 ; "THE STAGE YOU LEFT OFF"
.BYTE $1F,$00,$16,$0F,$10,$1E,$00,$19,$10,$10,$FE
L57CC: .WORD $3AC5
.BYTE $1A,$1F,$1D,$12,$00,$1D,$1E,$0B,$1C,$1E,$00,$0C ; "PUSH START BUTTON"
.BYTE $1F,$1E,$1E,$19,$18,$FF
L57E0: .WORD $3A44
.BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; " "
.BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.BYTE $00,$00,$00,$00,$00,$00,$FE
L5801: .WORD $3A84
.BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; " "
.BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.BYTE $00,$00,$00,$FE
L581F: .WORD $3AC5
.BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; " "
.BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.BYTE $00,$00,$00,$FF
;----------------------------------------------------
; Machine has tilted
;----------------------------------------------------
L583D: JSR L459A ; Erase Video Screen
LDA #$09 ;
STA L1003 ;
LDX #$B3 ; Message = "TILT" ($58B3)
LDY #$58 ; Message = "TILT" ($58B3)
JSR L4831 ; Print Text Message
;----------------------------------------------------
; Delay for 6.38 seconds
;----------------------------------------------------
LDX #$FF ; Set delay = 4.25s
JSR L588C ; Run Programmable Delay
LDX #$80 ; Set delay = 2.13s
JSR L588C ; Run Programmable Delay
LDA Credits ; Get number of Credits
BEQ L5877 ; No credits left so skip ahead
JSR L4FC1 ; Deduct 1 Credit
LDA Credits ; Get number of credits
BEQ L5877 ; That was the last credit so skip ahead
LDX #$01
STX VTIMR4
DEX ; Status = Game Over (X=00)
STX GameStatus ; Update Game Status due to TILT
STX L1004
LDA #$08
STA L1003
JMP L4E3F ; Give instructions wait for START BUTTON
;----------------------------------------------------
; No credits left, return to Attract Mode
;----------------------------------------------------
L5877: LDX #$00 ; A = 00
STX CoinFlag ; Clear CoinFlag so instructions aren't shown
STX GameStatus ; Game Status = Game Over
STX L1004 ;
DEX ;
TXS ;
LDA #$08 ;
STA L1003 ;
JMP L403C ; Go back to Attract Mode
;----------------------------------------------------
; Programmable Delay
;----------------------------------------------------
; Delay time = X * 16.6ms
;----------------------------------------------------
L588C: LDA L1003 ; Check verticle blanking (60Hz)
BPL L588C ; Wait for verticle blanking start
L5891: LDA L1003 ; Check verticle blanking
BMI L5891 ; Wait for verticle blanking end
DEX ; Decrement delay value
BPL L588C ; Loop until delay complete
RTS ; Return
;----------------------------------------------------
; Error Text Messages
;----------------------------------------------------
L589A: .WORD $398A ; location on screen
.BYTE $0E,$13,$1D,$0D,$00,$0F,$1C,$1C,$19,$1C,$FF ; "DISC ERROR"
L58A7: .WORD $396A ; location on screen
.BYTE $16,$0E,$1A,$00,$0F,$1C,$1C,$19,$1C,$FF ; "LDP ERROR"
L58B3: .WORD $39AD ; location on screen
.BYTE $1E,$13,$16,$1E,$FF ; "TILT"
;----------------------------------------------------
; Do Bega's Horizontal Movement
;----------------------------------------------------
L58BA: LDA MasterReg ; Check MasterReg for Explosion (b7)
BPL L58C1 ; No explosion so skip ahead
JMP L5BA5 ; Go update Bega Explosion
L58C1: ASL A ; Check MasterReg for beginning stage (b6)
BPL L58C7 ; Bega under joystick control so skip ahead
JMP L59D1 ; Print STAGE Information Screen
;----------------------------------------------------
; Check Joystick Left/Right
;----------------------------------------------------
L58C7: LDA L1000 ; Get Joystick data
EOR #$FF ; Toggle all bits
AND #$0C ; Test only Left and Right Joystick
BNE L58D3 ; If pressed then go check them
JMP L5973 ; Neither are pressed so skip ahead
L58D3: AND #$08 ; Test for Right joystick press
BNE L592B ; Right pressed so jump ahead
;----------------------------------------------------
; Joystick LEFT pressed
;----------------------------------------------------
LDA BegaXPos1L ; Get Bega's X Position
CMP #$10 ; Is it at far left?
BCS L58E0 ; No, so continue
JMP L5973 ; No left movement so leave
L58E0: LDA L0093 ; Check attachments
CMP #$FF ; Is a person attached to Bega?
BEQ L58FB ; No so skip ahead
LDA BegaXPos1L ; Get Bega's X Position
CMP #$18 ; Is it 24?
BCS L58EF ; Yes, so continue
JMP L5973 ; Just leave
L58EF: LDA POKADR ;
CMP #$FF ;
BEQ L58FB ;
LDA BegaXPos1L ;
CMP #$28 ;
BCC L5973 ;
;----------------------------------------------------
; Move 6 sprites that make up Bega to the LEFT
;----------------------------------------------------
L58FB: LDX #$05 ; 6 sprites make up BEGA
L58FD: LDA BegaXPos1L,X ; Get sprite x position
SEC ; Clear carry
SBC L5C51 ; Subtract left movement
STA BegaXPos1L,X ; Save sprite x position
DEX ; Next sprite in BEGA
BPL L58FD ; Loop until all sprites moved
LDX #$05
L590A: LDA L009C,X
AND #$F0
BNE L5916
LDA #$FE
AND L009C,X
STA L009C,X
L5916: DEX
BPL L590A
LDA MasterReg
AND #$30
BEQ L5922
JMP L5973
L5922: LDA #$FD
AND MasterReg
STA MasterReg
JMP L5973
;----------------------------------------------------
; Joystick RIGHT Pressed
;----------------------------------------------------
L592B: LDA BegaXPos1L ; Get Bega's X Position
CMP #$D1 ; Is it at far right?
BCS L5962 ; Yes, so skip ahead
LDA L0094
CMP #$FF
BEQ L5949
LDA BegaXPos1L
CMP #$C9
BCS L5962
LDA POKADR+1 ;
CMP #$FF ;
BEQ L5949 ;
LDA BegaXPos1L ;
CMP #$B9 ;
BCS L5962
;----------------------------------------------------
; Move 6 sprites that make up Bega to the RIGHT
;----------------------------------------------------
L5949: LDX #$05 ; 6 sprites make up BEGA
L594B: LDA BegaXPos1L,X ; Get sprite x position
CLC ; Clear carry
ADC L5C51 ; Add right movement
STA BegaXPos1L,X ; Save sprite x position
DEX ; Next sprite in BEGA
BPL L594B ; Loop until all sprites moved
LDA MasterReg
AND #$30
BNE L5962
LDA #$02
ORA MasterReg
STA MasterReg
L5962: LDX #$05
L5964: LDA L009C,X
AND #$F0
L5968: BNE L5970
LDA #$01
ORA L009C,X
STA L009C,X
L5970: DEX
BPL L5964
;----------------------------------------------------
;
;----------------------------------------------------
L5973: LDA MasterReg ; Check which Bega to show
AND #$20 ; Is it Barrier Bega?
BEQ L597C ; No, so skip ahead
JMP L5B66 ; Show Barrier Bega
L597C: LDA MasterReg ; Check which Bega to show
AND #$10 ; Is it Normal Bega?
BEQ L5985 ; No, so skip ahead
JMP L5B3C ; Show Normal Bega
L5985: LDA MasterReg
AND #$02
ASL A
ORA #$01
LDX #$05
L598E: STA ICPTHZ,X
DEX
BPL L598E
LDA VNTD ; Check Bega glow seqeunce
BNE L59AD ; Sequence not done, so jump to Bega Glow
;----------------------------------------------------
;
;----------------------------------------------------
LDA #$02 ; A = 2
STA VNTD ; Reset Bega Glow sequence
LDA MasterReg ;
AND #$01 ;
EOR #$01 ;
TAX ;
LDA #$FE
AND MasterReg
STA MasterReg
TXA
ORA MasterReg
STA MasterReg
;----------------------------------------------------
; Bega's lights will "GLOW"
;----------------------------------------------------
L59AD: LDA SysTimer ; Check time on System Timer
AND #$03 ; Do this every 66.6ms
BNE L59B6 ; Not time yet, so skip Bega Glow
DEC VNTD ;
L59B6: LDA MasterReg ; Get Bega Glow state
AND #$03 ; Glow state = 0-3
ASL A ; Multiply by 2 to get Glow Bega pointer
TAY ; Y = pointer to Bega Blow
LDA L5C52,Y ; Get Bega Glow pointer
STA Ptr1_LO ; Set Bega Glow pointer
LDA L5C53,Y ; Get Bega Glow pointer
STA Ptr1_HI ; Set Bega Glow pointer
;----------------------------------------------------
; Update 6 sprites with new Bega GLOW picture
;----------------------------------------------------
LDY #$05 ; 6 sprites to update
L59C8: LDA (Ptr1_LO),Y ; Get Bega Glow sprite picture
STA BegaPic,Y ; Set Bega sprite picture
DEY ; Index to next sprite
BPL L59C8 ; Loop until all 6 sprites updated
RTS ; Return
;----------------------------------------------------
; Beginning STAGE: Information Screen
;----------------------------------------------------
L59D1: LDA VNTD ;
BNE L59D9 ;
LDA #$01 ;
STA VNTD ;
L59D9: LDA SysTimer ; Check time on System Timer
AND #$01
BNE L59E2
DEC VNTD
L59E2: BEQ L59E5
RTS
L59E5: LDA MasterReg
AND #$3F
BNE L5A17
;----------------------------------------------------
; Add Y step increment
;----------------------------------------------------
LDX #$05 ; 6 sprites to update
L59ED: CLC ;
LDA BegaYPos1L,X ;
ADC L5C50 ;
STA BegaYPos1L,X ;
DEX ;
BPL L59ED ;
;----------------------------------------------------
; Slide BEGA into starting position
;----------------------------------------------------
LDA BegaYPos1L ;
CMP #$B8 ;
BCS L59FF ;
RTS ;
L59FF: LDA #$06 ; Sound = 6
JSR L51CE ; Play Sound
LDX #$05
LDY #$75
L5A08: STY BegaPic,X
DEY
DEX
BPL L5A08
LDA #$41
STA MasterReg
LDA #$10
STA VNTD
RTS
L5A17: LDX #$05 ; Loop = 6 sprites update
L5A19: LDA L5C88,X ; Get picture
STA BegaPic,X ; Set Bega sprite picture
DEX ; Next picture
BPL L5A19 ; Loop until all 6 sprites updated
LDA #$00
STA MasterReg
;----------------------------------------------------
; Print STAGE Number to screen
;----------------------------------------------------
LDX #$23 ; Message = "STAGE" ($4D23)
LDY #$4D ; Message = "STAGE" ($4D23)
JSR L4831 ; Print Text Message
LDA Level
ASL A
TAX
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 L3993 ; 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 L3992 ; Print STAGE Number (tens place)
;----------------------------------------------------
; Print "Player 1" or "Player 2"
;----------------------------------------------------
LDA NumPlayers ; Is this a two player game?
BEQ L5A69 ; No, so no need to print which player
LDX #$50 ; Message = "PLAYER" ($4D50)
LDY #$4D ; Message = "PLAYER" ($4D50)
|