 |
;----------------------------------------------------
; 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)
JSR L4831 ; Print Text Message
CLC ; Clear carry
LDA PlayerNumber ; Determine which player is playing
ADC #$02 ; Char = "1" or "2"
STA L3913 ; Print "1" or "2" to screen
;----------------------------------------------------
; Check if opening video has already been played
;----------------------------------------------------
L5A69: LDA CDTMA1+1 ;
BNE L5AC7 ;
LDX #$00 ;
STX FlashTime ;
;----------------------------------------------------
; Flash game play instructions for stage
; "RESCUE LUNA!"
;----------------------------------------------------
L5A73: LDA SearchStatus ; Get FlashText status
CMP #$02 ;
BEQ L5A97 ;
LDX #$CB ; Message = " " ($5DCB) Erase instructions
LDY #$5D ; Message = " " ($5DCB) Erase instructions
INC FlashTime ; Increment flash text timer
LDA FlashTime ; Get flash rate timer for text
AND #$30 ; Check if it's time to flash text
BEQ L5A8C ; Yes, so erase text this time
LDX #$F4 ; Message = "TOUCH TO RESCUE LUNA!" ($5CF4)
LDY #$5C ; Message = "TOUCH TO RESCUE LUNA!" ($5CF4)
L5A8C: JSR L4831 ; Print Text Message
LDX #$01 ; Delay Count = 1
JSR L4BD2 ; Run programmable Delay
JMP L5A73
; Continue to flash instructions
;----------------------------------------------------
; Erase Instructions and Play Video Sequence
;----------------------------------------------------
L5A97: LDX #$CB ; Message = " " ($5DCB) Erase instructions
LDY #$5D ; Message = " " ($5DCB) Erase instructions
JSR L4831 ; Print Text Message
JSR L719E ; Screen Transition, Fill from outside in
LDA #$15 ; Video Sequence = Instructions? (Frame 6798)
JSR L54A7 ; Play LaserDisc video sequence
LDA #$01 ;
STA CDTMA1+1
;
;----------------------------------------------------
; Wait for video sequence to complete
;----------------------------------------------------
L5AAB: LDA SearchStatus ; Check LDP search status
CMP #$01
;
BEQ L5ABE ;
CMP #$02
;
BEQ L5ABE ;
LDX #$01 ; Delay Count = 1
JSR L4BD2 ; Run programmable Delay
JMP L5AAB
;
;----------------------------------------------------
; Clean up screen and return
;----------------------------------------------------
L5ABE: JSR L71D0 ; Clear Sprite Bank 1 & 2 (2800-281F,2BE0-2BFF)
JSR L71B8 ; Screen Transition, Clear from inside out
JMP L5B26
; Erase screen then return
;----------------------------------------------------
; Flash Instructions WITHOUT playing video sequence
;----------------------------------------------------
L5AC7: LDX #$00 ; Flasthime = 00
STX FlashTime ; Reset message flash time
L5ACC: LDX #$CB ; Message = " " ($5DCB) Erase instructions
LDY #$5D ; Message = " " ($5DCB) Erase instructions
LDA FlashTime ; Get flash rate timer for text
AND #$30 ; Check if it's time to flash text
BEQ L5B19 ; Yes, so erase text this time
LDA Level ; Check Level
BEQ L5AF5 ; Go print LUNA instructions (STAGE1)
LDA CDTMA2+1
BNE L5B19
LDA Lunas ; Get number of Lunas
BMI L5B19
LDA Level ; Get level
CMP #$01 ; Are we at the JOE Level (STAGE2)?
BEQ L5B06 ; Yes, so print JOE instructions
LDA Level ; Get level
CMP #$04 ; Are we at the SONY level (STAGE5)?
BEQ L5B11 ; Yes, so print SONY instructions
BNE L5B19
L5AF5: LDA Lunas ; Get number of Lunas
CMP #$FF
BEQ L5AFF
CMP #$08 ; Do we already have 8 Lunas?
BCS L5B26 ; Yes, so skip instructions
;----------------------------------------------------
; LUNA Instructions
;----------------------------------------------------
L5AFF: LDX #$F4 ; Message = "TOUCH TO RESCUE LUNA!" ($5CF4)
LDY #$5C ; Message = "TOUCH TO RESCUE LUNA!" ($5CF4)
JMP L5B19
; Go print instructions
;----------------------------------------------------
; JOE Instructions
;----------------------------------------------------
L5B06: LDA VVTP+1
BEQ L5B26
LDX #$3F ; Message = "TOUCH TO RESCUE JOE !" ($5D3F)
LDY #$5D ; Message = "TOUCH TO RESCUE JOE !" ($5D3F)
JMP L5B19
; Go print instructions
;----------------------------------------------------
; SONY Instructions
;----------------------------------------------------
L5B11: LDA STMCUR_swap ;
BEQ L5B26 ;
LDX #$84 ; Message = "TOUCH TO RESCUE SONY !" ($5D84)
LDY #$5D ; Message = "TOUCH TO RESCUE SONY !" ($5D84)
L5B19: JSR L4831 ; Print Text Message
LDX #$01 ; Delay Count = 1
JSR L4BD2 ; Run programmable Delay
;----------------------------------------------------
; Loop back and flash text
;----------------------------------------------------
INC FlashTime ; Increment Flash time
BNE L5ACC ; Loop back until flash time expires
;----------------------------------------------------
; Erase Text Instructions from screen
;----------------------------------------------------
L5B26: LDX #$CB ; Message = " " ($5DCB) Erase instructions
LDY #$5D ; Message = " " ($5DCB) Erase instructions
JSR L4831 ; Print Text Message
LDX #$38 ; Message = " " ($4D38) Erase STAGE
LDY #$4D ; Message = " " ($4D38) Erase STAGE
JSR L4831 ; Print Text Message
LDX #$59 ; Message = " " ($4D59) Erase PLAYER
LDY #$4D ; Message = " " ($4D59) Erase PLAYER
JSR L4831 ; Print Text Message
RTS ; Return
;----------------------------------------------------
; Update Bega Glow sequence in MasterReg
;----------------------------------------------------
L5B3C: LDA MasterReg
AND #$03
BEQ L5B61
CMP #$03
BEQ L5B50
LDA SysTimer ; Check time on System Timer
AND #$07 ;
BNE L5B4F ;
DEC MasterReg ;
L5B4F: RTS ;
;----------------------------------------------------
; Update 6 sprites to Normal Bega
;----------------------------------------------------
L5B50: LDX #$05 ;
LDY #$01 ;
L5B54: LDA L5CA0,X ;
STA BegaPic,X ;
STY ICPTHZ,X ;
DEX ;
BPL L5B54 ;
DEC MasterReg ;
RTS ; Return
;----------------------------------------------------
;
;----------------------------------------------------
L5B61: LDA #$00 ;
STA MasterReg ;
RTS ;
;----------------------------------------------------
; Show Barrier Bega
;----------------------------------------------------
L5B66: LDA MasterReg ;
AND #$30 ;
CMP #$30 ;
BEQ L5B71 ;
JMP L5C43
;----------------------------------------------------
; Show Barrier Bega
;----------------------------------------------------
L5B71: LDA SysTimer ; Check time on System Timer
AND #$03 ; Are we shooting?
BEQ L5B79 ; Yes
RTS
;----------------------------------------------------
; Find next sequence for Bega Barrier picture
;----------------------------------------------------
L5B79: LDA BarrierPic ; Get Bega Barrier picture sequence
ASL A ; Multiply by 2
TAY ; Create an index
LDA L5C5A,Y ; Get Barrier picture pointer
STA Ptr1_LO ; Save pointer
LDA L5C5B,Y ; Get Barrier picture pointer
STA Ptr1_HI ; Save pointer
AND Ptr1_LO ; Check if this is the last in the sequence
CMP #$FF ; Is this the last picture?
BEQ L5BA0 ; Yes, so just skip ahead
INC BarrierPic ; Go to the next picture in the sequence
;----------------------------------------------------
; Update Bega Barrier picture
;----------------------------------------------------
LDY #$05 ; Loop = 6 sprites update
LDX #$01
L5B95: LDA (Ptr1_LO),Y ; Get picture
STA BegaPic,Y ; Set Bega sprite picture
STX ICPTHZ,X
DEY ; Next picture
BPL L5B95 ; Loop until all 6 sprites updated
RTS ; Return
;----------------------------------------------------
; Restart barrier sequence
;----------------------------------------------------
L5BA0: LDA #$00 ; Restart barrier sequence
STA MasterReg ; Save barrier sequence
RTS ; Return
;----------------------------------------------------
;
;----------------------------------------------------
L5BA5: LDA MasterReg
AND #$7F ; Have we finished exploding?
BNE L5BBE ; No, so continue exploding
LDX PlayerNumber ; Which player is playing?
DEC Player1Lives,X ; Done exploding so player loses a life
LDA #$01
STA VNTD
INC MasterReg ; Erase Bega explosion
LDA #$03 ; Sound = 3
JSR L51CE ; Play Sound
JSR L4BF7 ; Print BEGA and LUNA lives
L5BBE: LDA SysTimer ; Check time on System Timer
AND #$03
BEQ L5BC6
RTS
L5BC6: DEC VNTD
BEQ L5BCB
RTS
L5BCB: LDA #$02
STA VNTD
;----------------------------------------------------
; Update Bega's sprite pictures
;----------------------------------------------------
LDA MasterReg ; Get Explode sequence
AND #$7F ; Isolate Explode sprite sequence
ASL A ; Turn it into a pointer
TAX ; Index to correct Explode sequence
LDA L5C72,X ; Get Bega Explode picture pointer
STA Ptr1_LO
LDA L5C73,X
STA Ptr1_HI
LDY #$05
L5BE1: LDA (Ptr1_LO),Y
STA BegaPic,Y
LDA #$01
STA ICPTHZ,Y
DEY
BPL L5BE1
LDY #$05
;----------------------------------------------------
; Scatter Bits in X Direction
;----------------------------------------------------
L5BF0: CLC ; Clear carry
LDA L5C44,Y ; Get Y scatter direction/speed
ADC BegaXPos1L,Y ; Move explosion in the Y direction
CMP #$10 ; Is X position < 16
BCS L5BFD ; Yes, so check other boundary
LDA #$10 ;
L5BFD: CMP #$F0 ; Is X position > 240
BCC L5C03 ; No
LDA #$F0 ;
L5C03: STA BegaXPos1L,Y ;
;----------------------------------------------------
; Scatter Bits in Y Direction
;----------------------------------------------------
CLC ; Clear carry
LDA L5C4A,Y ; Get Y scatter direction/speed
ADC BegaYPos1L,Y ; Move explosion in the Y direction
CMP #$20 ; If Y position < 32
BCS L5C13 ;
LDA #$20 ;
L5C13: STA BegaYPos1L,Y ;
DEY ;
BPL L5BF0 ;
;----------------------------------------------------
; Cycle thru explostion pictures
;----------------------------------------------------
INC MasterReg ; Go to next explode picture
LDA MasterReg ; Get explode picture
AND #$7F ; Isolate Explode sprite sequence
CMP #$0B ; Have we completed the explosion sequence?
BEQ L5C24 ; Yes, so skip ahead
RTS ; Return for another round
;----------------------------------------------------
; Bega Explosion Complete
;----------------------------------------------------
L5C24: LDA #$00 ;
STA MasterReg ;
LDX #$05 ;
LDA #$00 ;
L5C2C: STA ICPTHZ,X ;
STA BegaPic,X ;
DEX ;
BPL L5C2C ;
LDA #$01 ; Set death marker
STA LifeLost ; Indicate to Main Loop that player died
JSR L47D0 ; Update Sprites
JSR L71DE ; Clear Sprite Bank 3 & 4 (3800-381F,3BE0-3BFF)
LDX #$25 ;
JSR L4BD2 ; Run Programmable Delay
L5C43: RTS ; Return
;----------------------------------------------------
; Bega Explosion Sprite Scatter Directions X
;----------------------------------------------------
L5C44: .BYTE $FC,$04 ;--4, +4
.BYTE $FA,$06 ;--6, +6
.BYTE $FC,$04 ;--4, +4,
;----------------------------------------------------
; Bega Explosion Sprite Scatter Directions Y
;----------------------------------------------------
L5C4A: .BYTE $F8,$F8 ;--8, -8
.BYTE $FC,$FC ;--4, -4
.BYTE $00,$00 ; +0, +0
;----------------------------------------------------
; Y Movement Step Increment
;----------------------------------------------------
L5C50: .BYTE $02 ; Y Step = 2
;----------------------------------------------------
; X Movement Step Increment
;----------------------------------------------------
L5C51: .BYTE $02 ; X Step = 2
;----------------------------------------------------
; Bega Sprite Pointers (Bega Glow)
;----------------------------------------------------
L5C52: .WORD $5C88,$5C8E,$5C94,$5C9A
;----------------------------------------------------
; Bega Sprite Pointers (Bega Barrier)
;----------------------------------------------------
L5C5A: .WORD $5CA6,$5CAC,$5CB2,$5CAC,$5CB2,$5CAC
.WORD $5CB2,$5CAC,$5CB2,$5CAC,$5CA6,$FFFF
;----------------------------------------------------
; Bega Sprite Pointers (Bega Explode)
;----------------------------------------------------
L5C72: .WORD $5CB8,$5CB8,$5CBE,$5CC4,$5CCA,$5CD0
.WORD $5CD6,$5CDC,$5CE2,$5CE8,$5CEE
;----------------------------------------------------
; Bega Sprite Assignments (Bega Glow)
;----------------------------------------------------
L5C88: .BYTE $28,$29,$2A,$2B,$2C,$2D ; Bega Glow 1
L5C8E: .BYTE $2E,$2F,$30,$31,$32,$33 ; Bega Glow 2
L5C94: .BYTE $29,$28,$2B,$2A,$2D,$2C ; Bega Glow 3
L5C9A: .BYTE $2F,$2E,$31,$30,$33,$32 ; Bega Glow 4
;----------------------------------------------------
; Bega Sprite Assignments (Bega Normal)
;----------------------------------------------------
L5CA0: .BYTE $34,$35,$36,$37,$38,$39 ; Bega Normal
;----------------------------------------------------
; Bega Sprite Assignments (Bega Barrier)
;----------------------------------------------------
L5CA6: .BYTE $46,$47,$48,$49,$4A,$4B ; Bega Barrier 1
.BYTE $4C,$4D,$4E,$4F,$50,$51 ; Bega Barrier 2
.BYTE $52,$53,$54,$55,$56,$57 ; Bega Barrier 3
;----------------------------------------------------
; Bega Sprite Assignments (Bega Explode)
;----------------------------------------------------
L5CB8: .BYTE $58,$29,$2A,$2B,$2C,$2D ; Bega Explode 1
.BYTE $58,$59,$2A,$2B,$2C,$2D ; Bega Explode 2
.BYTE $5E,$59,$5A,$2B,$2C,$2D ; Bega Explode 3
.BYTE $5E,$5F,$5A,$5B,$5C,$2D ; Bega Explode 4
.BYTE $64,$5F,$60,$5B,$5C,$2D ; Bega Explode 5
.BYTE $64,$65,$60,$61,$5C,$5D ; Bega Explode 6
.BYTE $64,$65,$66,$61,$62,$5D ; Bega Explode 7
.BYTE $64,$65,$66,$67,$62,$63 ; Bega Explode 8
.BYTE $64,$65,$66,$67,$68,$63 ; Bega Explode 9
.BYTE $64,$65,$66,$67,$68,$69 ; Bega Explode 10
;----------------------------------------------------
; Level Instructions for Gameplay
;----------------------------------------------------
L5CF4: .WORD $3A44 ; "TOUCH TO RESCUE LUNA !"
.BYTE $1E,$19,$1F,$0D,$12,$00,$1E,$19,$00,$1C
.BYTE $0F,$1D,$0D,$1F,$0F,$00,$16,$1F,$18,$0B,$00,$65
.BYTE $FE
L5D0D: .WORD $3A84 ; "ONLY SHE CAN CALL OTHER"
.BYTE $19,$18,$16,$23,$00,$1D,$12,$0F,$00,$0D,$0B,$18,$00
.BYTE $0D,$0B,$16,$16,$00,$19,$1E,$12,$0F,$1C,$FE
L5D27: .WORD $3AC4 ; "FIGHERS TO YOUR SIDE"
.BYTE $10,$13,$11,$12,$1E,$0F,$1C,$1D,$00,$1E,$19,$00,$23,$19,$1F
.BYTE $1C,$00,$1D,$13,$0E,$0F,$FF
L5D3F: .WORD $3A44 ; "TOUCH TO RESCUE JOE !"
.BYTE $1E,$19,$1F,$0D,$12,$00,$1E,$19,$00,$1C,$0F
.BYTE $1D,$0D,$1F,$0F,$00,$14,$19,$0F,$00,$65,$FE
L5D57: .WORD $3A84
.BYTE $14,$19,$0F,$00,$13,$1D,$00,$1E,$12,$0F,$00 ; "JOE IS THE GUARDIAN OF"
.BYTE $11,$1F,$0B,$1C,$0E,$13,$0B,$18,$00,$19,$10
.BYTE $FE
L5D7X: .WORD $3AC5
.BYTE $1E,$12,$0F,$00,$80,$81,$82,$83,$84 ; "THE PKBARRIER BUTTON"
.BYTE $85,$00,$0C,$1F,$1E,$1E,$19,$18,$FF
L5D84: .WORD $3A44 ; "TOUCH TO RESCUE SONY !"
.BYTE $1E,$19,$1F,$0D,$12,$00,$1E,$19,$00,$1C,$0F,$1D,$0D
.BYTE $1F,$0F,$00,$1D,$19,$18,$23,$00,$65,$FE
L5D9D: .WORD $3A84
.BYTE $1D,$19,$18,$23,$00,$13,$1D,$00,$1E,$12,$0F,$00 ; "SONY IS THE GUARDIAN OF"
.BYTE $11,$1F,$0B,$1C,$0E,$13,$0B,$18,$00,$19,$10,$FE
L5DB7: .WORD $3AC5
.BYTE $1E,$12,$0F,$00,$86,$87,$88,$89,$8A,$8B,$00,$0C,$1F,$1E ; "THE TELEPORT BUTTON"
.BYTE $1E,$19,$18,$FF
L5DCB: .WORD $3A44
.BYTE $00,$00,$00,$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,$00,$00,$FE
L5DEB: .WORD $3A84
.BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; " "
.BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FE
L5E06: .WORD $3AC4
.BYTE $00,$00,$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,$FF
;----------------------------------------------------
; LUNA Movement Updates
;----------------------------------------------------
; A =
;----------------------------------------------------
L5E23: CMP #$40 ;
BNE L5E2A ;
JMP L5F43 ;
L5E2A: LDA L009B ;
CMP #$FF ;
BEQ L5E3B
BPL L5E35
JMP L6099 ; LUNA hit bottom?
L5E35: ASL A
BPL L5E3B
JMP L5F43
L5E3B: LDA Lunas ; Get number of LUNA's
CMP #$FF
BNE L5E42
RTS
L5E42: LDA Level
BNE L5E48
RTS
L5E48: LDA L009B
AND #$30
CMP #$20
BEQ L5E8A
LDA L00A5
AND #$01
TAX
CLC
LDA L614C,X
ADC L00A6
STA L00A6
CMP #$E0
BCS L5E86
CMP #$0A
BCC L5E80
CMP #$D0
BCS L5E8A
CLC
ADC #$30
CMP BegaXPos1R
BCC L5E80
LDA L00A6
CMP #$18
BCC L5E8A
SEC
SBC #$18
CMP BegaXPos1R
BCS L5E86
JMP L5E8A
L5E80: LDA #$01
STA L00A5
BNE L5E8A
L5E86: LDA #$00
STA L00A5
L5E8A: LDA L00A6
AND #$F8
LSR A
LSR A
LSR A
STA POKMSK
DEC POKMSK
CLC
LDA #$40
ADC POKMSK
STA Ptr1_LO
LDA #$00
ADC #$3B
STA Ptr1_HI
CLC
LDA #$60
ADC POKMSK
STA Ptr2_LO
LDA #$00
ADC #$3B
STA Ptr2_HI
CLC
LDA #$80
ADC POKMSK
STA Ptr2_HI+1
LDA #$00
L5EB8: ADC #$3B
STA TRAMSZ
CLC
LDA #$A0
ADC POKMSK
STA CMCMD
LDA #$00
ADC #$3B
STA WARMST
L5EC9: LDA L00A6
AND #$06
LSR A
STA POKMSK
ASL A
ASL A
CLC
ADC POKMSK
TAX
LDA L009B
BEQ L5EE2
CMP #$FF
BEQ L5EE2
AND #$20
BNE L5F01
L5EE2: LDY #$00
STY L009B
L5EE6: LDA L614E,X
STA (Ptr1_LO),Y
LDA L6162,X
STA (Ptr2_LO),Y
LDA L6176,X
STA (Ptr2_HI+1),Y
LDA L618A,X
STA (CMCMD),Y
INX
INY
CPY #$05
BNE L5EE6
RTS
L5F01: LDA L009B
AND #$10
BNE L5F08
RTS
L5F08: LDA SysTimer ; Check time on System Timer
AND #$03
BEQ L5F10
RTS
L5F10: LDA HATABS+15
ASL A
ASL A
CLC
ADC HATABS+15
TAX
LDY #$00
INC HATABS+15
L5F1F: LDA L619E,X
BEQ L5F3C
STA (Ptr1_LO),Y
LDA L61DB,X
STA (Ptr2_LO),Y
LDA L6217,X
STA (Ptr2_HI+1),Y
LDA L6253,X
STA (CMCMD),Y
INX
INY
CPY #$05
BNE L5F1F
RTS
L5F3C: LDA #$00
STA L009B
JMP L5EC9
;----------------------------------------------------
; LUNA Movement Updates
;----------------------------------------------------
L5F43: LDA L009B
AND #$30
BNE L5F5E
LDA Lunas
CMP #$FF
BEQ L5F5E
CMP #$08
BCC L5F54
RTS
L5F54: LDA Level
BEQ L5F5E
LDA #$FF
STA L009B
RTS
L5F5E: LDA L009B
AND #$20
BNE L5FB7
L5F64: LDA MasterReg
AND #$F0
BEQ L5F6B
RTS
;----------------------------------------------------
; Reset for new Random LUNA movement
;----------------------------------------------------
L5F6B: LDA Random ; Get Random Number
AND #$0F ; Random number between 0-15
STA L00A2 ; Save as Movement Pattern (0-15)
LDA #$00 ; A = 0
STA L00A3 ; Clear movement pointer
LDA L00A2 ; Clear movement pointer
ASL A
TAX
LDA LBF42,X
STA Ptr1_LO
LDA LBF43,X
STA Ptr1_HI
LDY #$01
LDA (Ptr1_LO),Y ; Get 8
STA L00A4 ; Save 8 in counter step
LDA #$01
STA SpritePic1
STA SpritePic2
LDA #$76
STA Sprite3_Char ;
LDA #$77
STA Sprite3a_Char
LDX L00A2
;----------------------------------------------------
; Start LUNA at top of screen
;----------------------------------------------------
LDA Random ; Get Random Number between 48-79
AND #$1F ; Start with number between 0-31
CLC ; Clear carry
ADC #$30 ; Adjust number between 48-79
STA Sprite3_X ; Start LUNA at X location between 48-79
STA Sprite3a_X ; Set X for LUNA sprite(2)
LDA #$00 ; Y location = 0
STA Sprite3_Y ; Start LUNA at the top of the screen
LDA #$10 ; Y locatoin = 32
STA Sprite3a_Y ; Put sprite(2) right below sprite(1)
LDA #$60
STA L009B
LDA #$09 ; Sound = #9
JSR L51CE ; Play Sound
L5FB7: LDA L009B
AND #$10
BEQ L5FC0
JMP L6064 ; Skip all LUNA movements
L5FC0: LDA L00A2 ; Get which movement pattern we're using
ASL A ; Create an index
TAX ; X = index to movement pattern
;----------------------------------------------------
; Setup Pointer to LUNA Movement Pattern
;----------------------------------------------------
LDA LBF42,X ;
STA Ptr1_LO ;
LDA LBF43,X ;
STA Ptr1_HI ;
LDY L00A3 ;
LDA (Ptr1_LO),Y ; Get LUNA pattern (21,8,f
TAX ; X = pattern position
LDA LB100,X ; Get pattern movement
BPL L5FE0 ; LUNA Moving left, skip ahead
LDA #$01 ; LUNA Picture facing LEFT
STA SpritePic1 ; Update LUNA picture
STA SpritePic2 ; Update LUNA picture
BNE L5FE6 ; Go to movement
L5FE0: LDA #$05 ; LUNA Picture facing RIGHT
STA SpritePic1 ; Update LUNA picture
STA SpritePic2 ; Update LUNA picture
;----------------------------------------------------
; Update LUNA's X Coordinate
;----------------------------------------------------
L5FE6: CLC ; Clear carry for addition
LDA Sprite3_X ; Get sprite(1) x coordinate
ADC LB100,X ; Adjust x movement (add/subtract)
STA Sprite3_X ; Save new sprite x coordinate
CLC ; Clear carry for addition
LDA Sprite3a_X ; Get sprite(2) x coordinate
ADC LB100,X ; Adjust x movement (add/subtract)
STA Sprite3a_X ; Save new sprite x coordinate
;----------------------------------------------------
; Update LUNA's Y Coordinate
;----------------------------------------------------
CLC ; Clear carry for addition
LDA Sprite3_Y ; Get sprite(1) y coordinate
ADC LB000,X ; Add y position
STA Sprite3_Y ; Save sprite y coordinate
CLC ; Clear carry for addition
LDA Sprite3a_Y ; Get sprite(2) y coordinate
ADC LB000,X ; Add y position
STA Sprite3a_Y ; Save sprite y coordinate
;----------------------------------------------------
; Move a set distance in current direction
;----------------------------------------------------
DEC L00A4 ; Count down number of moves in that direction
BNE L6015 ; Not done moving in that direction so skip ahead
INC L00A3 ; Increment movement pointer
INC L00A3 ; Increment movement pointer
LDY L00A3 ;
INY ;
LDA (Ptr1_LO),Y ;
L6013: STA L00A4 ;
;----------------------------------------------------
; Check X position for edge of screen
;----------------------------------------------------
L6015: LDA Sprite3_X ; Get X position
CMP #$04 ; Are we past far left of screen?
BCC L604D ; No, so skip ahead
CMP #$EC ; Are we past far right of screen?
BCS L604D ; No, so skip ahead
;----------------------------------------------------
; Check if LUNA was caught
;----------------------------------------------------
LDA Sprite3_Y ; Check LUNA Y Position
CMP #$E0 ; Has LUNA passed bottom of screen?
BCS L604D ; Yes, so skip ahead
LDA MasterReg
AND #$F0
BNE L604C
LDA Sprite3_X ; Get LUNA X position
SEC ; Set Carry
SBC BegaXPos2R ; Compare to Bega's X position
CLC ; Clear carry
ADC #$10 ; Add 16
CMP #$20 ; Are we close enough to her?
BCS L604C ; No catch, so leave
LDA Sprite3_Y ; Get LUNA Y position
SEC ; Set Carry
SBC FKDEF ; Compare to Bega's Y position
CLC ; Clear carry
ADC #$10 ; Add 16
CMP #$20 ; Are we close enough to her?
BCS L604C ; No catch, so leave
;----------------------------------------------------
; LUNA was caught
;----------------------------------------------------
LDA #$70 ; Erase LUNA
STA L009B ; Save LUNA status
INC Lunas ; Increment number of Lunas caught
JSR L4BF7 ; Print BEGA and LUNA lives
L604C: RTS ; Return
;----------------------------------------------------
; Erase LUNA from screen
;----------------------------------------------------
L604D: LDA #$00 ; A = 0
STA SpritePic1 ; Clear LUNA sprite(1) pic
STA Sprite3_Char ; Clear LUNA sprite(1) prop
STA Sprite3_X ; Clear LUNA sprite(1) X
STA Sprite3_Y ; Clear LUNA sprite(1) Y
STA SpritePic2 ; Clear LUNA sprite(2) pic
STA Sprite3a_Char ; Clear LUNA sprite(2) prop
STA Sprite3a_X ; Clear LUNA sprite(2) X
STA Sprite3a_Y ; Clear LUNA sprite(2) Y
LDA #$40 ;
STA L009B ; Save LUNA status
RTS ; Return
;----------------------------------------------------
;
;----------------------------------------------------
L6064: LDA L009B ;
AND #$0F ;
BNE L6085 ;
LDA #$02 ; Sound = 2
JSR L51CE ; Play Sound
LDA #$72 ;
STA L009B ;
LDA #$01 ;
STA SpritePic1 ;
LDA #$23 ;
STA Sprite3_Char ;
LDA #$00 ;
STA SpritePic2 ;
;----------------------------------------------------
; Award 200 points for LUNA catch
;----------------------------------------------------
LDA #$03 ; Bonus = 200
JSR L53D7 ; Add Bonus to Score
RTS ; Return
;----------------------------------------------------
;
;----------------------------------------------------
L6085: LDA SysTimer ; Check time on System Timer
AND #$0F ; Do this every 16 ticks
BEQ L608D ; if 16 ticks has expired then skip ahead
RTS ; Else, leave
L608D: DEC L009B ;
LDA L009B ;
AND #$0F
BNE L6098
JMP L604D
L6098: RTS
L6099: LDA L009B
AND #$7F
BNE L60B2
LDA #$04 ; Sound = #4
JSR L51CE ; Play Sound
LDA #$81 ;
STA L009B ;
DEC Lunas ; Player died, lose one Lunas?
JSR L4BF7 ; Print BEGA and LUNA lives
LDA #$01 ;
STA HATABS+15 ;
L60B2: LDA SysTimer ; Check time on System Timer
AND #$07
BEQ L60BA
RTS
L60BA: DEC HATABS+15
BEQ L60C0
RTS
L60C0: LDA #$04
STA HATABS+15
LDA L00A6
L60C7: LSR A
LSR A
LSR A
STA POKMSK
DEC POKMSK
CLC
LDA #$40
ADC POKMSK
STA Ptr1_LO
LDA #$00
ADC #$3B
STA Ptr1_HI
CLC
LDA #$60
ADC POKMSK
STA Ptr2_LO
LDA #$00
ADC #$3B
STA Ptr2_HI
CLC
LDA #$80
ADC POKMSK
STA Ptr2_HI+1
LDA #$00
ADC #$3B
STA TRAMSZ
CLC
LDA #$A0
ADC POKMSK
STA CMCMD
LDA #$00
ADC #$3B
STA WARMST
CLC
LDA #$A0
ADC POKMSK
STA BOOT
LDA #$00
ADC #$3B
STA DOSVEC
LDA L009B
AND #$7F
STA POKMSK
ASL A
ASL A
CLC
ADC POKMSK
TAX
LDY #$00
L611D: LDA L628F,X
STA (Ptr1_LO),Y
LDA L62AD,X
STA (Ptr2_LO),Y
LDA L62CB,X
STA (Ptr2_HI+1),Y
LDA L62E9,X
STA (CMCMD),Y
LDA L6307,X
STA (BOOT),Y
INX
INY
CPY #$05
BNE L611D
INC L009B
LDA L009B
AND #$7F
CMP #$06
BEQ L6147
RTS ; Return
L6147: LDA #$FF
STA L009B
RTS
L614C: INC LFF02,X
JSR L2221
.BYTE $FF,$FF
BIT L2E2D
.BYTE $FF,$FF
SEC
AND LFF3A,Y
.BYTE $FF,$44
EOR BegaPic+3
.BYTE $FF
L6162: .BYTE $FF,$23
BIT ICBAHZ
.BYTE $FF,$FF,$2F
BMI L619C
.BYTE $FF,$FF,$3B,$3C
AND LFFFF,X
.BYTE $47
PHA
EOR #$FF
L6176: .BYTE $FF
ROL ICPTHZ
PLP
.BYTE $FF,$FF,$32,$33
.BYTE $34,$FF,$FF
ROL L403F,X
.BYTE $FF,$FF
LSR A
.BYTE $4B
JMP LFFFF
AND #$2A
.BYTE $2B,$FF,$FF
AND LTEMP,X
.BYTE $37,$FF,$FF
EOR (CRITIC,X)
.BYTE $43,$FF,$FF
EOR L4F4E
.BYTE $FF
L619E: .BYTE $FF
BVC L61F2
.BYTE $FF,$FF,$FF
CLI
EOR LFFFF,Y
.BYTE $FF
RTS
ADC (FPTR2+1,X)
.BYTE $FF,$FF
CLI
EOR LFFFF,Y
.BYTE $FF
RTS
ADC (FPTR2+1,X)
.BYTE $FF,$FF
CLI
EOR LFFFF,Y
.BYTE $FF
RTS
ADC (FPTR2+1,X)
.BYTE $FF,$FF
CLI
EOR LFFFF,Y
.BYTE $FF
RTS
ADC (FPTR2+1,X)
.BYTE $FF,$FF
CLI
EOR LFFFF,Y
.BYTE $FF
RTS
ADC (FPTR2+1,X)
.BYTE $FF,$FF
BVC L6229
.BYTE $FF,$FF
BRK
L61DB: .BYTE $FF,$52,$53,$FF
.BYTE $FF,$FF,$5A,$5B
.BYTE $FF,$FF,$FF,$62
.BYTE $63,$FF,$FF,$FF
.BYTE $5A,$5B,$FF,$FF
.BYTE $FF,$62,$63
L61F2: .BYTE $FF,$FF,$FF,$5A
.BYTE $5B,$FF,$FF,$FF
.BYTE $62,$63,$FF,$FF
.BYTE $FF,$5A,$5B,$FF
.BYTE $FF,$FF,$62,$63
.BYTE $FF,$FF,$FF,$5A
.BYTE $5B,$FF,$FF,$FF
.BYTE $62,$63,$FF,$FF
.BYTE $FF,$52,$53,$FF
.BYTE $FF
L6217: .BYTE $FF,$54
EOR FPTR2+1,X
.BYTE $FF,$FF,$5C
EOR LFFFF,X
.BYTE $FF,$64
ADC FPTR2+1
.BYTE $FF,$FF,$5C
EOR LFFFF,X
.BYTE $FF,$64
ADC FPTR2+1
.BYTE $FF,$FF,$5C
EOR LFFFF,X
.BYTE $FF,$64
ADC FPTR2+1
.BYTE $FF,$FF,$5C
EOR LFFFF,X
.BYTE $FF,$64
ADC FPTR2+1
.BYTE $FF,$FF,$5C
EOR LFFFF,X
.BYTE $FF,$64
ADC FPTR2+1
.BYTE $FF,$FF,$54
EOR FPTR2+1,X
.BYTE $FF
L6253: .BYTE $FF
LSR Sprite3_Y,X
.BYTE $FF,$FF,$FF
LSR LFF5F,X
.BYTE $FF,$FF
ROR MLTTMP+1
.BYTE $FF,$FF,$FF
LSR LFF5F,X
.BYTE $FF,$FF
ROR MLTTMP+1
.BYTE $FF,$FF,$FF
LSR LFF5F,X
.BYTE $FF,$FF
ROR MLTTMP+1
.BYTE $FF,$FF,$FF
LSR LFF5F,X
.BYTE $FF,$FF
ROR MLTTMP+1
.BYTE $FF,$FF,$FF
LSR LFF5F,X
.BYTE $FF,$FF
ROR MLTTMP+1
.BYTE $FF,$FF,$FF
LSR Sprite3_Y,X
.BYTE $FF,$FF
L628F: .BYTE $FF
PLA
ADC #$FF
.BYTE $FF,$FF
PLA
ADC #$FF
.BYTE $FF,$FF,$72,$73
.BYTE $FF,$FF,$FF,$7C
ADC LFFFF,X
.BYTE $FF
STX VVTP+1
.BYTE $FF,$FF,$FF,$FF
.BYTE $FF,$FF,$FF
L62AD: .BYTE $FF
ROR A
.BYTE $6B,$FF,$FF,$FF
ROR A
.BYTE $6B,$FF,$FF,$FF
.BYTE $74
ADC FPTR2+1,X
.BYTE $FF,$FF
ROR LFF7F,X
.BYTE $FF,$FF
DEY
.BYTE $89,$FF,$FF,$FF
.BYTE $FF,$FF,$FF,$FF
L62CB: .BYTE $FF
JMP (LFF6D)
.BYTE $FF,$FF
JMP (LFF6D)
.BYTE $FF,$FF
ROR DELTAC,X
.BYTE $FF,$FF,$FF,$80
STA (FPTR2+1,X)
.BYTE $FF,$FF
TXA
.BYTE $8B,$FF,$FF,$FF
.BYTE $FF,$FF,$FF,$FF
L62E9: .BYTE $FF
ROR LFF6F
.BYTE $FF,$FF
ROR LFF6F
.BYTE $FF,$FF
SEI
ADC LFFFF,Y
.BYTE $FF,$82,$83,$FF
.BYTE $FF,$FF
STY LFF8D
.BYTE $FF,$FF,$FF,$FF
.BYTE $FF,$FF
L6307: .BYTE $FF
BVS L637B
.BYTE $FF,$FF,$FF
BVS L6380
.BYTE $FF,$FF,$FF,$7A
.BYTE $7B,$FF,$FF,$FF
STY Lunas
.BYTE $FF,$FF,$FF
DEY
.BYTE $8F,$FF,$FF,$FF
.BYTE $FF,$FF,$FF,$FF
;----------------------------------------------------
; Unknown sprite series update (girders?)
; Check all 5 lasers for collision
;----------------------------------------------------
L6325: LDX #$05 ; Loop = 5 sprite to update
;----------------------------------------------------
; Beginning of update loop (0-5;009C-00A1)
;----------------------------------------------------
L6327: TXA ; Get loop value
PHA ; Save loop to stack
LDA L009C,X ; Check girder status
CMP #$FF ; FF = Girder in use
BNE L6332 ; skip ahead if there is an available girder
JMP L6738 ; Jump ahead and decrement Loop
L6332: LDA L009C,X
BPL L6339
JMP L6652
L6339: ASL A ; Multiply by 2
BPL L633F
JMP L63A4
L633F: STX POKMSK
;----------------------------------------------------
; loop 0093-0096
;----------------------------------------------------
LDY #$03
L6343: LDA L0093,Y
CMP POKMSK
BEQ L6350
DEY
BPL L6343
JMP L6738 ; Jump ahead and decrement Loop
L6350: LDA L6741,Y
STA APPMHI+1
LDA L009C,X
AND #$0C
LSR A
TAY
LDA L009C,X
AND #$01
ASL A
ASL A
ORA #$01
STA SpritePic1,Y
STA SpritePic2,Y
LDA #$C8
STA Sprite3_Y,Y
LDA #$D8
STA Sprite3a_Y,Y
CLC
LDA BegaXPos1L
ADC APPMHI+1
STA Sprite3_X,Y
L637B: CLC
LDA BegaXPos1L
ADC APPMHI+1
L6380: STA Sprite3a_X,Y
LDA L009C,X
AND #$20
BEQ L638C
JMP L65F7
L638C: LDA L009C,X
AND #$10
BEQ L6395
JMP L65D1
L6395: LDA L67C9,X
STA Sprite3_Char,Y
LDA L67CF,X
STA Sprite3a_Char,Y
JMP L6738 ; Jump ahead and decrement Loop
L63A4: LDA L009B
AND #$F0
BEQ L63AD
JMP L6738 ; Jump ahead and decrement Loop
L63AD: LDA L009C,X
AND #$30
BNE L63CA
JSR L68E9
CPY #$FF
BNE L63BD
JMP L6738 ; Jump ahead and decrement Loop
L63BD: TXA
ASL A
TAY
LDA VVTP+1,Y
CMP #$FF
BEQ L63CA
JMP L6738 ; Jump ahead and decrement Loop
L63CA: LDA L009C,X
AND #$20
BEQ L63D3
JMP L643C
L63D3: LDA Random ; Get Random Number
AND #$0F ; Random number between 0-15
STA L00A2
LDA #$00
STA L00A3
LDA L00A2
ASL A
TAY
LDA LBF42,Y
STA Ptr1_LO
LDA LBF43,Y
STA Ptr1_HI
LDY #$01
LDA (Ptr1_LO),Y
STA L00A4
JSR L68E9
TYA
ASL A
ASL A
ORA L009C,X
STA L009C,X
TYA
ASL A
TAY
LDA #$01
STA SpritePic1,Y
STA SpritePic2,Y
LDA L67D5,X
STA Sprite3_Char,Y
LDA L67DB,X
STA Sprite3a_Char,Y
STY POKMSK
LDY L00A2
;----------------------------------------------------
; Start sprite at top of screen in random X location
;----------------------------------------------------
LDA Random ; Get Random Number (between 48-79)
AND #$1F ; First pick a number between 0-31
CLC ; Clear carry
ADC #$30 ; Adjust number between 48-79
LDY POKMSK ; Which sprite are we updating?
STA Sprite3_X,Y ; Set random X position between 48-79
STA Sprite3a_X,Y ; Set random X position between 48-79
LDA #$00 ; Start sprite at top of screen
STA Sprite3_Y,Y ; Set Y position = 0
LDA #$10 ; Start second sprite just below first one
STA Sprite3a_Y,Y ; Set Y position = 10
LDA #$60
ORA L009C,X
STA L009C,X
LDA #$09 ; Sound = 9
JSR L51CE ; Play Sound
L643C: LDA L009C,X
AND #$10
BEQ L6445
JMP L652A
L6445: LDA L00A2
ASL A
TAY
LDA LBF42,Y
STA Ptr1_LO
LDA LBF43,Y
STA Ptr1_HI
LDY L00A3
LDA (Ptr1_LO),Y
TAY
LDA LB100,Y
BPL L646D
LDA L009C,X
AND #$0C
LSR A
TAY
LDA #$01
STA SpritePic1,Y
STA SpritePic2,Y
BNE L647B
L646D: LDA L009C,X
AND #$0C
LSR A
TAY
LDA #$05
STA SpritePic1,Y
STA SpritePic2,Y
L647B: STY POKMSK
LDY L00A3
LDA (Ptr1_LO),Y
STA APPMHI+1
TAY
CLC
LDA LB100,Y
LDY POKMSK
ADC Sprite3_X,Y
STA Sprite3_X,Y
LDY APPMHI+1
CLC
LDA LB100,Y
LDY POKMSK
ADC Sprite3a_X,Y
STA Sprite3a_X,Y
LDY APPMHI+1
CLC
LDA LB000,Y
LDY POKMSK
ADC Sprite3_Y,Y
STA Sprite3_Y,Y
LDY APPMHI+1
CLC
LDA LB000,Y
LDY POKMSK
ADC Sprite3a_Y,Y
STA Sprite3a_Y,Y
DEC L00A4
BNE L64C9
INC L00A3
INC L00A3
LDY L00A3
INY
LDA (Ptr1_LO),Y
STA L00A4
L64C9: LDA L009C,X
AND #$0C
LSR A
TAY ; Get girder number
;----------------------------------------------------
; Check JOE's X Coordinate for edge of screen
;----------------------------------------------------
LDA Sprite3_X,Y ; Get X position
CMP #$04 ; Are we past far left of screen?
BCC L6509 ; No, so skip ahead
CMP #$EC ; Are we past far right of screen?
BCS L6509 ; No, so skip ahead
;----------------------------------------------------
; Check if JOE was caught
;----------------------------------------------------
LDA Sprite3_Y,Y ; Check JOE Y Position
CMP #$E0 ; Has JOE passed bottom of screen?
BCS L6509 ; Yes, so skip ahead
LDA Sprite3_X,Y ; Get JOE X position
SEC ; Set Carry
SBC BegaXPos2R ; Compare to Bega's X position
CLC ; Clear carry
ADC #$10 ; Add 16
CMP #$20 ; Are we close enough to him?
BCS L6506 ; No catch, so skip ahead
LDA Sprite3_Y,Y ; Get JOE Y position
SEC ; Set Carry
SBC FKDEF ; Compare to Bega's Y position
CLC ; Clear carry
ADC #$10 ; Add 16
CMP #$20 ; Are we close enough to him?
BCS L6506 ; No catch, so skip ahead
;----------------------------------------------------
; girder WAS HIT (or JOE was caught)
;----------------------------------------------------
LDA #$70 ;
ORA L009C,X ;
STA L009C,X ;
TXA ;
ASL A ;
TAX ;
INC VVTP+1,X ;
L6506: JMP L6738 ; Jump ahead and decrement Loop
;----------------------------------------------------
; Erase Girder once it falls off the bottom of the screen
;----------------------------------------------------
L6509: LDA #$00
STA SpritePic1,Y
STA Sprite3_Char,Y
STA Sprite3_X,Y
STA Sprite3_Y,Y
STA SpritePic2,Y
STA Sprite3a_Char,Y
STA Sprite3a_X,Y
STA Sprite3a_Y,Y
LDA #$40
STA L009C,X
JMP L6738 ; Jump ahead and decrement Loop
;----------------------------------------------------
;
;----------------------------------------------------
L652A: LDA L009C,X
AND #$03
BNE L6558
LDA #$02
JSR L51CE ; Play Sound
LDA #$03
ORA L009C,X
STA L009C,X
AND #$0C
LSR A
TAY
LDA #$01
STA SpritePic1,Y
LDA L68DD,X
STA Sprite3_Char,Y
LDA #$00
STA SpritePic2,Y
;----------------------------------------------------
; Award Bonus
;----------------------------------------------------
LDA L68E3,X ; Get Bonus value
JSR L53D7 ; Add Bonus to Score
JMP L6738 ; Jump ahead and decrement Loop
L6558: LDA SysTimer ; Check time on System Timer
AND #$1F
L655D: BEQ L6562
JMP L6738 ; Jump ahead and decrement Loop
;----------------------------------------------------
;
;----------------------------------------------------
L6562: LDA L009C,X
L6564: AND #$0C
LSR A
TAY
DEC L009C,X
LDA L009C,X
AND #$03
BEQ L6573
JMP L6738 ; Jump ahead and decrement Loop
;----------------------------------------------------
;
;----------------------------------------------------
L6573: LDA #$00
STA SpritePic1,Y
STA Sprite3_Char,Y
STA Sprite3_X,Y
STA Sprite3_Y,Y
STA SpritePic2,Y
STA Sprite3a_Char,Y
STA Sprite3a_X,Y
STA Sprite3a_Y,Y
LDX #$05
LDA #$FF
L6591: STA L009C,X
DEX
BPL L6591
STA L0093
STA L0094
STA POKADR
STA POKADR+1
LDY #$00
STY POKMSK
L65A2: LDA L009C,Y
CMP #$FF
BNE L65C8
TYA
ASL A
TAX
LDA VVTP+1,X
CMP #$FF
BEQ L65C8
JSR L6CEF
TXA
AND #$01
ASL A
STA Ptr1_LO
LDA POKMSK
AND #$03
INC POKMSK
ASL A
ASL A
ORA Ptr1_LO
STA L009C,Y
L65C8: INY
CPY #$06
BNE L65A2
PLA
JMP L6325
L65D1: LDA MasterReg
AND #$F0
BEQ L65EE
LDA #$01
STA SpritePic1,Y
STA SpritePic2,Y
LDA L67E1,X
STA Sprite3_Char,Y
LDA L67E7,X
STA Sprite3a_Char,Y
JMP L6738 ; Jump ahead and decrement Loop
L65EE: LDA #$0E
AND L009C,X
STA L009C,X
JMP L6738 ; Jump ahead and decrement Loop
;----------------------------------------------------
;
;----------------------------------------------------
L65F7: LDA L009C,X
AND #$30
CMP #$30
BEQ L6602
JMP L6738 ; Jump ahead and decrement Loop
;----------------------------------------------------
; Check to see if it's time to update sprite's picture
;----------------------------------------------------
L6602: LDA SysTimer ; Check time on System Timer
AND #$03
BEQ L660C
JMP L6738 ; Jump ahead and decrement Loop
;----------------------------------------------------
; Update Sprite Picture
;----------------------------------------------------
L660C: LDA SeriesNumber,X
ASL A
TAX
;----------------------------------------------------
; Sprite Data Series 1
;----------------------------------------------------
LDA L6745,X ; Get Sprite Data series pointer LO
STA Ptr1_LO ; Creat pointer to data series
LDA L6746,X ; Get Sprite Data series pointer HI
STA Ptr1_HI ; Creat pointer to data series
;----------------------------------------------------
; Sprite Data Series 2
;----------------------------------------------------
LDA L6761,X ; Get Sprite Data series pointer LO
STA Ptr2_LO ; Creat pointer to data series
LDA L6762,X ; Get Sprite Data series pointer HI
STA Ptr2_HI ; Creat pointer to data series
;----------------------------------------------------
; Check for end of series
;----------------------------------------------------
LDA Ptr1_LO ; Check for end of series
AND Ptr1_HI ; End of series marker is $FFFF
CMP #$FF ; Is this the end of the series?
BEQ L6647 ; Yes, so skip ahead
;----------------------------------------------------
; Go to next picture in series
;----------------------------------------------------
LDX POKMSK ; Which series are we using?
INC SeriesNumber,X ; Find that series and go to next picture
TYA ;
TAX ;
LDY POKMSK ; Y = Picture number within series
LDA (Ptr1_LO),Y ; Get picture
STA Sprite3_Char,X ; Update sprite with picture
LDA (Ptr2_LO),Y ; Get picture
STA Sprite3a_Char,X ; Update sprite with picture
LDA #$01
STA SpritePic1,X
STA SpritePic2,X
JMP L6738 ; Jump ahead and decrement Loop
L6647: LDX POKMSK
LDA #$0E
AND L009C,X
STA L009C,X
JMP L6738 ; Jump ahead and decrement Loop
L6652: LDA L009C,X
AND #$C0
CMP #$C0
BNE L665D
JMP L6738 ; Jump ahead and decrement Loop
L665D: LDA SeriesNumber,X
BNE L6674
LDA #$04 ; Sound = #4
JSR L51CE ; Play Sound
TXA
TAY
ASL A
TAX
DEC VVTP+1,X
TYA
TAX
LDA #$11
STA SeriesNumber,X
L6674: LDA SysTimer ; Check time on System Timer
AND #$03
BEQ L667E
JMP L6738 ; Jump ahead and decrement Loop
L667E: DEC SeriesNumber,X
AND #$0F
BEQ L6688
JMP L6738 ; Jump ahead and decrement Loop
L6688: LDA #$02
ORA SeriesNumber,X
STA SeriesNumber,X
AND #$F0
LSR A
LSR A
LSR A
TAY
LDA L677B,Y
STA Ptr1_LO
LDA L677C,Y
STA Ptr1_HI
LDA L6795,Y
STA Ptr2_LO
LDA L6796,Y
STA Ptr2_HI
LDA L67AF,Y
STA Ptr2_HI+1
LDA L67B0,Y
STA TRAMSZ
TXA
TAY
LDA L009C,X
AND #$0C
LSR A
TAX
LDA (Ptr1_LO),Y
STA Sprite3_Char,X
LDA (Ptr2_LO),Y
STA Sprite3a_Char,X
LDA (Ptr2_HI+1),Y
STA SpritePic1,X
STA SpritePic2,X
INC Sprite3_Y,X
INC Sprite3a_Y,X
CLC
LDA SeriesNumber,Y
ADC #$10
STA SeriesNumber,Y
AND #$F0
CMP #$D0
BEQ L66E0
JMP L6738 ; Jump ahead and decrement Loop
L66E0: LDA #$FF
STA L009C,Y
LDA #$00
STA SpritePic1,X
STA SpritePic2,X
STA Sprite3_Char,X
STA Sprite3a_Char,X
STA Sprite3_X,X
STA Sprite3a_X,X
STA Sprite3_Y,X
STA Sprite3a_Y,X
TYA
TAX
LDY #$00
CPX L0093
BEQ L670A
INY
CPX L0094
BEQ L670A
INY
CPX POKADR
BEQ L670A
INY
L670A: CPY #$02
BCC L6716
LDA #$FF
STA L0093,Y
JMP L6738 ; Jump ahead and decrement Loop
L6716: CPY #$00
BNE L6729
LDA POKADR
CMP #$FF
BEQ L6735
STA L0093
LDA #$FF
STA POKADR ; get luna?
JMP L6738 ; Jump ahead and decrement Loop
L6729: LDA POKADR+1
CMP #$FF
BEQ L6735
STA L0094
LDA #$FF
STA POKADR+1
L6735: JMP L6738 ; Jump ahead and decrement Loop
;----------------------------------------------------
; Decrement Loop
;----------------------------------------------------
L6738: PLA ; Retreive Loop from stack
TAX ; X = Loop (0-5)
DEX ; Decrement loop
BMI L6740 ; Loop is finished so leave
JMP L6327 ; Go back until loop is complete
L6740: RTS ; Return
;----------------------------------------------------
; unknown data
;----------------------------------------------------
L6741: .BYTE $F0,$20,$E0,$30
;----------------------------------------------------
; unknown Sprite Series Pointers
;----------------------------------------------------
L6745: .WORD $67ED,$67F9,$6805,$67F9,$6805,$67F9,$6805,$67F9
.WORD $6805,$67F9,$6805,$67F9,$67C9
.WORD $FFFF ; End Marker
L6761: .WORD $67F3,$67FF,$680B,$67FF,$680B,$67FF,$680B,$67FF
.WORD $680B,$67FF,$680B,$67FF,$67CF
L677B: .WORD $67C9,$6811,$681D,$6829,$6835,$6841,$684D,$6859
.WORD $6865,$6871,$687D,$6889,$6895
L6795: .WORD $67CF,$6817,$6823,$682F,$683B,$6847,$6853,$685F
.WORD $686B,$6877,$6883,$688F,$689B
L67AF: .WORD $68A1,$68A1,$68A6,$68AB,$68B0,$68B5,$68BA,$68BF
.WORD $68C4,$68C9,$68CE,$68D3,$68D8
;----------------------------------------------------
; Sprite picture series
;----------------------------------------------------
L67C9: .BYTE $82,$8E,$A6,$BE,$9A,$B2
L67CF: .BYTE $83,$8F,$A7,$BF,$9B,$B3
L67D5: .BYTE $80,$8C,$A4,$BC,$98,$B0
L67DB: .BYTE $81,$8D,$A5,$BD,$99,$B1
L67E1: .BYTE $84,$90,$A8,$C0,$9C,$B4
L67E7: .BYTE $85,$91,$A9,$C1,$9D,$B5
L67ED: .BYTE $8A,$96,$AE,$C7,$A2,$BA
L67F3: .BYTE $8B,$97,$AF,$C8,$A3,$BB
L67F9: .BYTE $7C,$7C,$7C,$7C,$7C,$7C
L67FF: .BYTE $7D,$7D,$7D,$7D,$7D,$7D
L6805: .BYTE $7E,$7E,$7E,$7E,$7E,$7E
L680B: .BYTE $7F,$7F,$7F,$7F,$7F,$7F
L6811: .BYTE $83,$8F,$A7,$BF,$9B,$B3
L6817: .BYTE $82,$8E,$A6,$BE,$9A,$B2
L681D: .BYTE $83,$8F,$A7,$BF,$9B,$B3
L6823: .BYTE $82,$8E,$A6,$BE,$9A,$B2
L6829: .BYTE $83,$8F,$A7,$BF,$9B,$B3
L682F: .BYTE $82,$8E,$A6,$BE,$9A,$B2
L6835: .BYTE $83,$8F,$A7,$BF,$9B,$B3
L683B: .BYTE $82,$8E,$A6,$BE,$9A,$B2
L6841: .BYTE $78,$78,$78,$78,$78,$78
L6847: .BYTE $79,$79,$79,$79,$79,$79
L684D: .BYTE $78,$78,$78,$78,$78,$78
L6853: .BYTE $79,$79,$79,$79,$79,$79
L6859: .BYTE $78,$78,$78,$78,$78,$78
L685F: .BYTE $79,$79,$79,$79,$79,$79
L6865: .BYTE $78,$78,$78,$78,$78,$78
L686B: .BYTE $79,$79,$79,$79,$79,$79
L6871: .BYTE $7A,$7A,$7A,$7A,$7A,$7A
L6877: .BYTE $7B,$7B,$7B,$7B,$7B,$7B
L687D: .BYTE $7A,$7A,$7A,$7A,$7A,$7A
L6883: .BYTE $7B,$7B,$7B,$7B,$7B,$7B
L6889: .BYTE $7A,$7A,$7A,$7A,$7A,$7A
L688F: .BYTE $7B,$7B,$7B,$7B,$7B,$7B
L6895: .BYTE $7A,$7A,$7A,$7A,$7A,$7A
L689B: .BYTE $7B,$7B,$7B,$7B,$7B,$7B
L68A1: .BYTE $03,$03,$03,$03,$03,$07
L68A7: .BYTE $07,$07,$07,$07,$03,$03
L68AD: .BYTE $03,$03,$03,$07,$07,$07
L68B3: .BYTE $07,$07,$01,$01,$01,$01
L68B9: .BYTE $01,$05,$05,$05,$05,$05
L68BF: .BYTE $01,$01,$01,$01,$01,$05
L68C5: .BYTE $05,$05,$05,$05,$01,$01
L68CB: .BYTE $01,$01,$01,$05,$05,$05
L68D1: .BYTE $05,$05,$01,$01,$01,$01
L68D7: .BYTE $01,$05,$05,$05,$05,$05
L68DD: .BYTE $24,$24,$25,$25,$27,$27
L68E3: .BYTE $04,$04,$05,$05,$06,$06
;----------------------------------------------------
; unknown
;----------------------------------------------------
L68E9: LDY #$03
STY POKMSK
L68ED: LDY #$05
L68EF: LDA POKMSK
ASL A
ASL A
STA APPMHI+1
LDA L009C,Y
CMP #$FF
BEQ L6902
AND #$0C
CMP APPMHI+1
BEQ L6908
L6902: DEY
BPL L68EF
LDY POKMSK
RTS
L6908: DEC POKMSK
BPL L68ED
LDY #$FF
RTS
;----------------------------------------------------
; Shot fired (called from main loop)
;----------------------------------------------------
L690F: LDA L009C ;
AND #$F0 ;
BEQ L6917 ;
BNE L697D ;
L6917: LDA MasterReg ;
AND #$F0
BEQ L691F
BNE L697D
L691F: LDA GameStatus ; Check Game Status
BNE L692D
LDA SysTimer+1
AND #$07
BNE L6936
BEQ L6957
L692D: LDA L1000 ; Get Joystick inputs
EOR #$FF ; Invert all bits
AND #$20 ; Check Barrier button (S2)
BNE L6957
L6936: LDA SysTimer ; Check time on System Timer
AND #$20
BNE L697D
LDX #$80
STX L38B9
INX
STX L38BA
INX
STX L38BB
INX
STX L38BC
INX
STX L38BD
INX
STX L38BE
RTS
L6957: LDA #$07 ; Sound = #7
JSR L51CE ; Play Sound
LDA #$30
ORA MasterReg
STA MasterReg
LDA #$00 ; Start at first sprite picture
STA BarrierPic ; Reset the barrier picture sequence for Bega
LDX #$06
L6969: LDA L009B,X
AND #$F0
BNE L697A
LDA #$30
ORA L009B,X
STA L009B,X
LDA #$00
STA HATABS+15,X
L697A: DEX
BPL L6969
L697D: LDA #$00
STA L38B9
STA L38BA
STA L38BB
STA L38BC
STA L38BD
STA L38BE
RTS ; Return
;----------------------------------------------------
; Level Setup (kiwi)
;----------------------------------------------------
L6992: LDA #$00 ;
STA VVBLKD ;
LDA CDTMV3 ; Have we completed level?
BEQ L699F ; Yes so go to next level
JMP L69FE ;
L699F: INC Level ; Next level
JSR L719E ; Screen Transition, Fill from outside in
;----------------------------------------------------
; Play introduction video for level
;----------------------------------------------------
L69A5: LDA Level ; Get level
ASL A ; Multiply by 2
TAX ; X = index into address table
LDA LB3EA,X ; Get data address (LOW)
STA Ptr1_LO ; Save address in pointer
LDA LB3EB,X ; Get data address (HIGH)
STA Ptr1_HI ; Save address in pointer + 1
LDY VVBLKD ; Get byte index (0-2)
LDA (Ptr1_LO),Y ; Get Video Sequence byte
;----------------------------------------------------
; Check for $FE and $FF in video pointer
;----------------------------------------------------
CMP #$FE ; Are we at the next level?
BEQ L6A01 ; Yes jump ahead for data address 2
CMP #$FF ; Is there a video sequence for this level?
BNE L69C4 ; Yes, so skip ahead and play sequence
JMP L6C1C ; No video sequence so go do default
L69C4: JSR L54A7 ; Play LaserDisc video sequence
L69C7: LDA SearchStatus ; Check LDP search status
CMP #$01
BEQ L69DA
CMP #$02
BEQ L69DA
LDX #$01
JSR L4BD2 ; Run Programmable Delay
JMP L69C7
L69DA: JSR L71D0 ; Clear Sprite Bank 1 & 2 (2800-281F,2BE0-2BFF)
JSR L71EC ; Erase Sprite RAM (3800-3FFF)
JSR L71B8 ; Screen Transition, Clear from inside out
L69E3: LDA SearchStatus ; Check LDP search status
CMP #$02
BEQ L69F2
LDX #$01 ; Delay Count = 1
JSR L4BD2 ; Run programmable Delay
JMP L69E3
L69F2: JSR L719E ; Screen Transition, Fill from outside in
LDA CDTMA1+1
BNE L69FE
LDA #$01 ; Video Sequence = Intro? (Frame 5130)
BNE L6A24 ; Go play video sequence
L69FE: JSR L719E ; Screen Transition, Fill from outside in
;----------------------------------------------------
; Get data address 2
;----------------------------------------------------
L6A01: LDA #$00 ;
STA CDTMV3 ;
LDA Level ; Get level
ASL A ; Multiply by 2
TAX ; X = index into address table
LDA LB4DF,X ; Get data address (LOW)
STA Ptr1_LO ; Save address in pointer
LDA LB4E0,X ; Get data address (HIGH)
STA Ptr1_HI ; Save address in pointer + 1
LDY VVBLKD ; Get byte index (0-2)
LDA (Ptr1_LO),Y ; Get data byte
CMP #$FE ; Have we reached a level warp?
BNE L6A24 ; No, so play this sequence
INC Level ; Go to next level
JMP L69A5 ; Jump back and load address 3
L6A24: JSR L54A7 ; Play LaserDisc video sequence
L6A27: LDA SearchStatus ; Check LDP search status
CMP #$01
BEQ L6A3A
CMP #$02
BEQ L6A3A
LDX #$01 ; Delay Count = 1
JSR L4BD2 ; Run programmable Delay
JMP L6A27
L6A3A: JSR L71D0 ; Clear Sprite Bank 1 & 2 (2800-281F,2BE0-2BFF)
JSR L71EC ; Erase Sprite RAM (3800-3FFF)
JSR L71B8 ; Screen Transition, Clear from inside out
LDX #$06
LDA #$FF
L6A47: STA L009B,X
DEX
BPL L6A47
LDY #$40
LDX Level
CPX #$0C
BNE L6A5B
LDA Lunas
BPL L6A5B
STY L009B
L6A5B: LDA #$00
STA L04BD
LDX #$05
L6A62: TXA
ASL A
TAY
LDA VVTP+1,Y
BMI L6A77
INC L04BD
LDA L04BD
CMP #$02
BNE L6A77
JMP L6ACD
L6A77: DEX
BPL L6A62
;----------------------------------------------------
; Assign Processes based on Level
;----------------------------------------------------
LDY #$40 ; Y = Process Start Code
LDX Level ; Get Level
BNE L6A85 ; Past Level 0, so skip ahead
;----------------------------------------------------
; Level 0 Process
;----------------------------------------------------
LDA #$40 ; A = Process Start Code
STA L009B ; Start Process9B
;----------------------------------------------------
; Level 1 Process
;----------------------------------------------------
L6A85: CPX #$01
BNE L6A8F
LDA VVTP+1
BPL L6A8F
STY L009C ; Start Process9C
;----------------------------------------------------
; Level 13 Process
;----------------------------------------------------
L6A8F: CPX #$0D
BNE L6A99
LDA VVTP+1
BPL L6A99
STY L009C ; Start Process9C
;----------------------------------------------------
; Level 4 Process
;----------------------------------------------------
L6A99: CPX #$04
BNE L6AA3
LDA STMCUR_swap
BPL L6AA3
STY L009D ; Start Process9D
;----------------------------------------------------
; Level 14 Process
;----------------------------------------------------
L6AA3: CPX #$0E
BNE L6AAF
LDA STMCUR_swap
BPL L6AAF
STY L009D ; Start Process9D
BNE L6AAF
;----------------------------------------------------
; Level 5 Process
;----------------------------------------------------
L6AAF: CPX #$05
BNE L6AB9
LDA STARP+1
BPL L6AB9
STY L009F ; Start Process9F
;----------------------------------------------------
; Level 6 Process
;----------------------------------------------------
L6AB9: CPX #$06
BNE L6AC3
LDA STARP+1
BPL L6AC3
STY L009F ; Start Process9F
;----------------------------------------------------
; Level 9 Process
;----------------------------------------------------
L6AC3: CPX #$09
BNE L6ACD
LDA RUNSTK+1
BPL L6ACD
STY L00A0 ; Start ProcessA0
;----------------------------------------------------
;
;----------------------------------------------------
L6ACD: LDX #$FF ; X = Cancel Process Code (FF)
STX L0093 ; Cancel Process93
STX L0094 ; Cancel Process94
STX L0095 ; Cancel Process95
STX L0096 ; Cancel Process96
LDY #$00
STY POKMSK
L6ADB: LDA L009C,Y ; L009C-L00A0
CMP #$FF
BNE L6B01
TYA
ASL A
TAX
LDA VVTP+1,X
CMP #$FF
BEQ L6B01
JSR L6CEF
TXA
AND #$01
ASL A
STA Ptr1_LO
LDA POKMSK
AND #$03
INC POKMSK
ASL A
ASL A
ORA Ptr1_LO
STA L009C,Y
L6B01: INY
CPY #$06
BNE L6ADB
JSR L5535 ; Update Scoring Overlay
;----------------------------------------------------
; Erase Bank1 Sprites (7 sprites)
;----------------------------------------------------
LDX #$1B ; Loop = 28 (4 x 7 sprites)
LDA #$00 ; Clear with $00
L6B0D: STA Sprite1_Prop,X ; Erase sprite properties
STA Sprite1_Char,X ; Erase sprite character
STA Sprite1_Y,X ; Erase sprite Y coordinate
STA Sprite1_X,X ; Erase sprite X coordinate
DEX ; Go to next sprite
BPL L6B0D ; Loop until all 7 sprites erased
;----------------------------------------------------
; Point to Level Data
;----------------------------------------------------
LDA Level ; Get Level number
ASL A ; Mulitply by 2
TAY ; Index based on Level
LDA LB2F5,Y ; Get address where level data is stored
STA Ptr1_LO ; Save address
LDA LB2F6,Y ; Get address where level data is stored
STA Ptr1_HI ; Save address
;----------------------------------------------------
; Create "Jump Routine" for level
;----------------------------------------------------
LDY VVBLKD ; Point to routine number (0,1,2)
LDA (Ptr1_LO),Y ; Get routine number
STA CDTMA1 ; Save routine number
ASL A ; Multiply by 2
TAY ; Create index to routine address
LDA L6CA7,Y ; Get routine address LO
STA L00CF ; Setup routine address
LDA L6CA8,Y ; Get routine address HI
STA L00D0 ; Setup routine address
LDY CDTMA1 ; Y = Routine number
LDA L6CD7,Y ; Get Sound Code
JSR L51CE ; Go play sound
LDA CDTMA1 ; Get routine number
JSR L720B ; Setup Color Palette for routine
;----------------------------------------------------
;
;----------------------------------------------------
LDX #$0D ;
L6B4C: LDA #$00 ;
STA L041C,X ;
NEXT PAGE
|