Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; -------------------
- ; METROID source code
- ; -------------------
- ; MAIN PROGRAMMERS
- ; HAI YUKAMI
- ; ZARU SOBAJIMA
- ; GPZ SENGOKU
- ; N.SHIOTANI
- ; M.HOUDAI
- ; (C) 1986 NINTENDO
- ;
- ;Commented by Dirty McDingus (nmikstas@yahoo.com)
- ;Disassembled using TRaCER.
- ;Can be reassembled using Ophis.
- ;Last updated: 3/9/2010
- ;Title/end (memory page 0)
- .org $8000
- .include "MetroidDefines.txt"
- ;-------------------------------------[ Forward declarations ]--------------------------------------
- .alias startup $C01A
- .alias NMI $C0D9
- .alias ClearNameTables $C158
- .alias ClearNameTable0 $C16D
- .alias EraseAllSprites $C1A3
- .alias RemoveIntroSprites $C1BC
- .alias ClearRAM_33_DF $C1D4
- .alias PreparePPUProcess_ $C20E
- .alias ChooseRoutine $C27C
- .alias AddYToPtr02 $C2B3
- .alias Adiv16 $C2BF
- .alias Adiv8 $C2C0
- .alias Amul16 $C2C5
- .alias Amul8 $C2C6
- .alias ProcessPPUString $C30C
- .alias EraseTile $C328
- .alias WritePPUByte $C36B
- .alias PrepPPUPaletteString $C37E
- .alias TwosCompliment $C3D4
- .alias WaitNMIPass $C42C
- .alias ScreenOff $C439
- .alias WaitNMIPass_ $C43F
- .alias ScreenOn $C447
- .alias ExitSub $C45C
- .alias ScreenNmiOff $C45D
- .alias VBOffAndHorzWrite $C47D
- .alias NmiOn $C487
- .alias SetTimer $C4AA
- .alias ClearSamusStats $C578
- .alias InitEndGFX $C5D0
- .alias LoadSamusGFX $C5DC
- .alias InitGFX7 $C6D6
- .alias BankTable $CA30
- .alias ChooseEnding $CAF5
- .alias SilenceMusic $CB8E
- ;-----------------------------------------[ Start of code ]------------------------------------------
- MainTitleRoutine:
- L8000: lda TitleRoutine ;
- L8002: cmp #$15 ;If intro routines not running, branch.
- L8004: bcs ++ ;
- L8006: lda Joy1Change ;
- L8008: and #$10 ;if start has not been pressed, branch.
- L800A: beq + ;
- L800C: ldy #$00 ;
- L800E: sty SpareMemD1 ;Not accessed by game.
- L8010: sty SpareMemBB ;Not accessed by game.
- L8012: sty SpareMemB7 ;Accessed by unused routine.
- L8014: sty SpareMemB8 ;Accessed by unused routine.
- L8016: lda PPUCNT0ZP ;
- L8018: and #$FC ;Set name table to name table 0.
- L801A: sta PPUCNT0ZP ;
- L801C: lda #$1B ;If start pressed, load START/CONTINUE screen.
- L801E: sta TitleRoutine ;
- L8020: bne ++ ;Branch always.
- L8022:* jsr RemoveIntroSprites ;($C1BC)Remove sparkle and crosshair sprites from screen.
- L8025: lda TitleRoutine ;
- L8027:* jsr ChooseRoutine ;($C27C)Jump to proper routine below.
- L802A: .word InitializeAfterReset ;($8071)First routine after reset.
- L802C: .word DrawIntroBackground ;($80D0)Draws ground on intro screen.
- L802E: .word FadeInDelay ;($80F9)Sets up METROID fade in delay.
- L8030: .word METROIDFadeIn ;($812C)Fade METROID onto screen.
- L8032: .word LoadFlashTimer ;($8142)Load timer for METROID flash.
- L8034: .word FlashEffect ;($8109)Makes METROID flash.
- L8036: .word METROIDSparkle ;($814D)Top and bottom "sparkles" on METROID.
- L8038: .word METROIDFadeOut ;($8163)Fades METROID off the screen.
- L803A: .word Crosshairs ;($8182)Displays "crosshairs" effect on screen.
- L803C: .word MoreCrosshairs ;($81D1)Continue "crosshairs" effect.
- L803E: .word IncTitleRoutine ;($806E)Increment TitleRoutine.
- L8040: .word IncTitleRoutine ;($806E)Increment TitleRoutine.
- L8042: .word ChangeIntroNameTable ;($822E)Change from name table 0 to name table 1.
- L8044: .word MessageFadeIn ;($8243)Fade in intro sequence message.
- L8046: .word MessageFadeOut ;($8263)Fade out intro sequence message.
- L8048: .word DelayIntroReplay ;($8283)Set Delay time before intro sequence restarts.
- L804A: .word ClearSpareMem ;($8068)clears some memory addresses not used by game.
- L804C: .word PrepIntroRestart ;($82A3)Prepare to restart intro routines.
- L804E: .word TitleScreenOff ;($82ED)Turn screen off.
- L8050: .word TitleRoutineReturn ;($82F3)Rts.
- L8052: .word TitleRoutineReturn ;($82F3)Rts.
- L8054: .word StartContinueScreen ;($90BA)Displays START/Continue screen.
- L8056: .word ChooseStartContinue ;($90D7)player chooses between START and CONTINUE.
- L8058: .word LoadPasswordScreen ;($911A)Loads password entry screen.
- L805A: .word EnterPassword ;($9147)User enters password.
- L805C: .word DisplayPassword ;($9359)After game over, display password on screen.
- L805E: .word WaitForSTART ;($9394)Wait for START when showing password.
- L8060: .word StartContinueScreen ;($90BA)Displays START/Continue screen.
- L8062: .word GameOver ;($939E)Displays "GAME OVER".
- L8064: .word EndGame ;($9AA7)Show ending of the game.
- L8066: .word SetTimer ;($C4AA)Set delay timer.
- ;----------------------------------------[ Intro routines ]------------------------------------------
- ClearSpareMem:
- L8068: lda #$00 ;
- L806A: sta SpareMemCB ;Clears two memory addresses not used by the game.
- L806C: sta SpareMemC9 ;
- IncTitleRoutine:
- L806E: inc TitleRoutine ;Increment to next title routine.
- L8070: rts ;
- InitializeAfterReset:
- L8071: ldy #$02 ;Y=2.
- L8073: sty SpareMemCF ;Not accessed by game.
- L8075: sty SpareMemCC ;Not accessed by game.
- L8077: dey ;Y=1.
- L8078: sty SpareMemCE ;Not accessed by game.
- L807A: sty SpareMemD1 ;Not accessed by game.
- L807C: dey ;Y=0.
- L807D: sty SpareMemD0 ;Not accessed by game.
- L807F: sty SpareMemCD ;Not accessed by game.
- L8081: sty SpareMemD3 ;Not accessed by game.
- L8083: sty NARPASSWORD ;Set NARPASSWORD not active.
- L8086: sty SpareMemCB ;Not accessed by game.
- L8088: sty SpareMemC9 ;Not accessed by game.
- L808A: lda #$02 ;A=2.
- L808C: sta IntroMusicRestart ;Title rountines cycle twice before restart of music.
- L808E: sty SpareMemB7 ;Accessed by unused routine.
- L8090: sty SpareMemB8 ;Accessed by unused routine.
- L8092: sty PalDataIndex ;Reset index to palette data.
- L8094: sty ScreenFlashPalIndex ;Reset index into screen flash palette data.
- L8096: sty IntroStarOffset ;Reset index into IntroStarPntr table.
- L8098: sty FadeDataIndex ;Reset index into fade out palette data.
- L809A: sty $00 ;
- L809C: ldx #$60 ;Set $0000 to point to address $6000.
- L809E:* stx $01 ;
- L80A0: txa ;
- L80A1: and #$03 ;
- L80A3: asl ;
- L80A4: tay ;The following loop Loads the -->
- L80A5: sty $02 ;RAM with the following values: -->
- L80A7: lda RamValueTbl, y ;$6000 thru $62FF = #$00.
- L80AA: ldy #$00 ;$6300 thru $633F = #$C0.
- L80AC:* sta ($00), y ;$6340 thru $63FF = #$C4.
- L80AE: iny ;$6400 thru $66FF = #$00.
- L80AF: beq + ;$6700 thru $673F = #$C0.
- L80B1: cpy #$40 ;$6740 thru $67FF = #$C4.
- L80B3: bne - ;
- L80B5: ldy $02 ;
- L80B7: lda RamValueTbl+1, y ;
- L80BA: ldy #$40 ;
- L80BC: bpl - ;
- L80BE:* inx ;
- L80BF: cpx #$68 ;
- L80C1: bne --- ;
- L80C3: inc TitleRoutine ;Draw intro background next.
- L80C5: jmp LoadStarSprites ;($98AE)Loads stars on intro screen.
- ;The following table is used by the code above for writing values to RAM.
- RamValueTbl:
- L80C8: .byte $00, $00, $00, $00, $00, $00, $C0, $C4
- DrawIntroBackground:
- L80D0: LDA #$10 ;Intro music flag.
- L80D2: STA ABStatus ;Never accessed by game.
- L80D4: STA MultiSFXFlag ;Initiates intro music.
- L80D7: JSR ScreenOff ;($C439)Turn screen off.
- L80DA: JSR ClearNameTables ;($C158)Erase name table data.
- L80DD: LDX #$F4 ;Lower address of PPU information.
- L80DF: LDY #$82 ;Upper address of PPU information.
- L80E1: JSR PreparePPUProcess_ ;($C20E) Writes background of intro screen to name tables.
- L80E4: LDA #$01 ;
- L80E6: STA PalDataPending ;Prepare to load palette data.
- L80E8: STA SpareMemC5 ;Not accessed by game.
- L80EA: LDA PPUCNT0ZP ;
- L80EC: AND #$FC ;Switch to name table 0
- L80EE: STA PPUCNT0ZP ;
- L80F0: INC TitleRoutine ;Next routine sets up METROID fade in delay.
- L80F2: LDA #$00 ;
- L80F4: STA SpareMemD7 ;Not accessed by game.
- L80F6: JMP ScreenOn ;($C447)Turn screen on.
- FadeInDelay:
- L80F9: LDA PPUCNT0ZP ;
- L80FB: AND #$FE ;Switch to name table 0 or 2.
- L80FD: STA PPUCNT0ZP ;
- L80FF: LDA #$08 ;Loads Timer3 with #$08. Delays Fade in routine.-->
- L8101: STA Timer3 ;Delays fade in by 80 frames (1.3 seconds).
- L8103: LSR ;
- L8104: STA PalDataIndex ;Loads PalDataIndex with #$04
- L8106: INC TitleRoutine ;Increment to next routine.
- L8108: RTS ;
- FlashEffect:
- L8109: LDA FrameCount ;Every third frame, run change palette-->
- L810B: AND #$03 ;Creates METROID flash effect.
- L810D: BNE + ;
- L810F: LDA PalDataIndex ;Uses only the first three palette-->
- L8111: AND #$03 ;data sets in the flash routine.
- L8113: STA PalDataIndex ;
- L8115: JSR LoadPalData ;
- L8118: LDA Timer3 ;If Timer 3 has not expired, branch-->
- L811A: BNE + ;so routine will keep running.
- L811C: LDA PalDataIndex ;
- L811E: CMP #$04 ;Ensures the palette index is back at 0.
- L8120: BNE + ;
- L8122: INC TitleRoutine ;Increment to next routine.
- L8124: JSR LoadSparkleData ;($87AB) Loads data for next routine.
- L8127: LDA #$18 ;Sets Timer 3 for a delay of 240 frames-->
- L8129: STA Timer3 ;(4 seconds).
- L812B:* RTS ;
- METROIDFadeIn:
- L812C: LDA Timer3 ;
- L812E: BNE + ;
- L8130: LDA FrameCount ;Every 16th FrameCount, Change palette.-->
- L8132: AND #$0F ;Causes the fade in effect.
- L8134: BNE + ;
- L8136: JSR LoadPalData ;($8A8C)Load data into Palettes.
- L8139: BNE + ;
- L813B: LDA #$20 ;Set timer delay for METROID flash effect.-->
- L813D: STA Timer3 ;Delays flash by 320 frames (5.3 seconds).
- L813F: INC TitleRoutine ;
- L8141:* RTS ;
- LoadFlashTimer:
- L8142: LDA Timer3 ;If 320 frames have not passed, exit
- L8144: BNE - ;
- L8146: LDA #$08 ;
- L8148: STA Timer3 ;Stores a value of 80 frames in Timer3-->
- L814A: INC TitleRoutine ;(1.3 seconds).
- L814C: RTS ;
- METROIDSparkle:
- L814D: LDA Timer3 ;Wait until 3 seconds have passed since-->
- L814F: BNE ++ ;last routine before continuing.
- L8151: LDA IntroSpr0Complete ;Check if sparkle sprites are done moving.
- L8154: AND IntroSpr1Complete ;
- L8157: CMP #$01 ;Is sparkle routine finished? If so,-->
- L8159: BNE + ;go to next title routine, else continue-->
- L815B: INC TitleRoutine ;with sparkle routine.
- L815D: BNE ++ ;
- L815F:* JSR UpdateSparkleSprites ;($87CF)Update sparkle sprites on the screen.
- L8162:* RTS ;
- METROIDFadeOut:
- L8163: LDA FrameCount ;Wait until the frame count is a multiple-->
- L8165: AND #$07 ;of eight before proceeding.
- L8167: BNE ++ ;
- L8169: LDA FadeDataIndex ;If FadeDataIndex is less than #$04, keep-->
- L816B: CMP #$04 ;doing the palette changing routine.
- L816D: BNE + ;
- L816F: JSR LoadInitialSpriteData ;($8897)Load initial sprite values for crosshair routine.
- L8172: LDA #$08 ;
- L8174: STA Timer3 ;Load Timer3 with a delay of 80 frames(1.3 seconds).
- L8176: STA First4SlowCntr ;Set counter for slow sprite movement for 8 frames,
- L8178: LDA #$00 ;
- L817A: STA SecondCrosshairSprites ;Set SecondCrosshairSprites = #$00
- L817C: INC TitleRoutine ;Move to next routine
- L817E:* JSR DoFadeOut ;($8B5F)Fades METROID off the screen.
- L8181:* RTS ;
- Crosshairs:
- L8182: LDA FlashScreen ;Is it time to flash the screen white?-->
- L8184: BEQ + ;If not, branch.
- L8186: JSR FlashIntroScreen ;($8AA7)Flash screen white.
- L8189:* LDA Timer3 ;Wait 80 frames from last routine-->
- L818B: BNE ++++ ;before running this one.
- L818D: LDA IntroSpr0Complete ;
- L8190: AND IntroSpr1Complete ;Check if first 4 sprites have completed-->
- L8193: AND IntroSpr2Complete ;their movements. If not, branch.
- L8196: AND IntroSpr3Complete ;
- L8199: BEQ ++ ;
- L819B: LDA #$01 ;Prepare to flash screen and draw cross.
- L819D: CMP SecondCrosshairSprites ;Branch if second crosshair sprites are already-->
- L819F: BEQ + ;active.
- L81A1: INC SecondCrosshairSprites ;Indicates second crosshair sprites are active.
- L81A3: STA DrawCross ;Draw cross animation on screen.
- L81A5: STA FlashScreen ;Flash screen white.
- L81A7: LDA #$00 ;
- L81A9: STA CrossDataIndex ;Reset index to cross sprite data.
- L81AB:* AND IntroSpr4Complete ;
- L81AE: AND IntroSpr5Complete ;Check if second 4 sprites have completed-->
- L81AF: AND IntroSpr6Complete ;their movements. If not, branch.
- L81B4: AND IntroSpr7Complete ;
- L81B7: BEQ + ;
- L81B9: LDA #$01 ;Prepare to flash screen and draw cross.
- L81BB: STA DrawCross ;Draw cross animation on screen.
- L81BD: STA FlashScreen ;Flash screen white.
- L81BF: JSR LoadStarSprites ;($98AE)Loads stars on intro screen.
- L81C2: LDA #$00 ;
- L81C4: STA CrossDataIndex ;Reset index to cross sprite data.
- L81C6: INC TitleRoutine ;Do MoreCrosshairs next frame.
- L81C8: BNE ++ ;Branch always.
- L81CA:* JSR DrawCrosshairsSprites ;($88FE)Draw sprites that converge in center of screen.
- L81CD:* JSR DrawCrossSprites ;($8976)Draw cross sprites in middle of the screen.
- L81D0:* RTS ;
- MoreCrosshairs:
- L81D1: LDA FlashScreen ;Is it time to flash the screen white?-->
- L81D3: BEQ + ;If not, branch.
- L81D5: JSR DrawCrossSprites ;($8976)Draw cross sprites in middle of the screen.
- L81D8: JMP FlashIntroScreen ;($8AA7)Flash screen white.
- L81DB:* INC TitleRoutine ;ChangeIntroNameTable is next routine to run.
- L81DD: LDA #$60 ;
- L81DF: STA ObjectY ;
- L81E2: LDA #$7C ;These values are written into memory, but they are-->
- L81E4: STA ObjectX ;not used later in the title routine. This is the-->
- L81E7: LDA AnimResetIndex ;remnants of some abandoned code.
- L81EA: STA AnimIndex ;
- L81ED: RTS ;
- UnusedIntroRoutine1:
- L81EE: LDA #$01 ;
- L81F0: STA SpareMemBB ;
- L81F2: LDA #$04 ;
- L81F4: STA SpritePagePos ;
- L81F6: STA Joy1Change ;
- L81F8: STA Joy1Status ;Unused intro routine.
- L81FA: STA Joy1Retrig ;
- L81FC: LDA #$03 ;
- L81FE: STA ObjAction ;
- L8201: STA ScrollDir ;
- L8203: INC TitleRoutine ;
- L8205: RTS ;
- UnusedIntroRoutine2:
- L8206: LDA ObjAction ;
- L8209: CMP #$04 ;
- L820B: BNE + ;
- L820D: LDA #$00 ;
- L820F: STA ObjAction ;
- L8212: LDA #$0B ;Unused intro routine. It looks like this routine-->
- L8214: STA AnimResetIndex ;was going to be used to manipulate sprite objects.
- L8217: LDA #$0C ;
- L8219: STA AnimIndex ;
- L821C: LDA #$07 ;
- L821E: STA AnimFrame ;
- L8221: LDA #$08 ;
- L8223: STA Timer3 ;
- L8225: LDA #$00 ;
- L8227: STA SpareMemC9 ;Not accessed by game.
- L8229: STA SpareMemCB ;Not accessed by game.
- L822B: INC TitleRoutine ;
- L822D:* RTS ;
- ChangeIntroNameTable:
- L822E: LDA PPUCNT0ZP ;
- L8230: ORA #$01 ;Change to name table 1.
- L8232: STA PPUCNT0ZP ;
- L8234: INC TitleRoutine ;Next routine to run is MessageFadeIn.
- L8236: LDA #$08 ;
- L8238: STA Timer3 ;Set Timer3 for 80 frames(1.33 seconds).
- L823A: LDA #$06 ;Index to FadeInPalData.
- L823C: STA FadeDataIndex ;
- L823E: LDA #$00 ;
- L8240: STA SpareMemC9 ;Not accessed by game.
- L8242: RTS ;
- MessageFadeIn:
- L8243: LDA Timer3 ;Check if delay timer has expired. If not, branch-->
- L8245: BNE ++ ;to exit, else run this rouine.
- L8247: LDA FrameCount ;
- L8249: AND #$07 ;Perform next step of fade every 8th frame.
- L824B: BNE ++ ;
- L824D: LDA FadeDataIndex ;
- L824F: CMP #$0B ;Has end of fade in palette data been reached?-->
- L8251: BNE + ;If not, branch.
- L8253: LDA #$00 ;
- L8255: STA FadeDataIndex ;Clear FadeDataIndex.
- L8257: LDA #$30 ;
- L8259: STA Timer3 ;Set Timer3 to 480 frames(8 seconds).
- L825B: INC TitleRoutine ;Next routine is MessageFadeOut.
- L825D: BNE ++ ;Branch always.
- L825F:* JSR DoFadeOut ;($8B5F)Fade message onto screen.
- L8262:* RTS ;
- MessageFadeOut:
- L8263: LDA Timer3 ;Check if delay timer has expired. If not, branch-->
- L8265: BNE ++ ;to exit, else run this rouine.
- L8267: LDA FrameCount ;
- L8269: AND #$07 ;Perform next step of fade every 8th frame.
- L826B: BNE ++ ;
- L826D: LDA FadeDataIndex ;
- L826F: CMP #$05 ;Has end of fade out palette data been reached?-->
- L8271: BNE + ;If not, branch.
- L8273: LDA #$06 ;
- L8275: STA FadeDataIndex ;Set index to start of fade in data.
- L8277: LDA #$00 ;
- L8279: STA SpareMemCB ;Not accessed by game.
- L827B: INC TitleRoutine ;Next routine is DelayIntroReplay.
- L827D: BNE ++ ;Branch always.
- L827F:* JSR DoFadeOut ;($8B5F)Fade message off of screen.
- L8282:* RTS ;
- DelayIntroReplay:
- L8283: INC TitleRoutine ;Increment to next routine.
- L8285: LDA #$10 ;
- L8287: STA Timer3 ;Set Timer3 for a delay of 160 frames(2.6 seconds).
- L8289: RTS ;
- UnusedIntroRoutine3:
- L828A: LDA Timer3 ;
- L828C: BNE + ;
- L828E: LDA SpareMemB7 ;
- L8290: BNE + ;
- L8292: LDA SpareMemB8 ;
- L8294: AND #$0F ;Unused intro routine.
- L8296: BNE + ;
- L8298: LDA #$01 ;
- L829A: STA SpareMemD2 ;
- L829C: LDA #$10 ;
- L829E: STA Timer3 ;
- L82A0: INC TitleRoutine ;
- L82A2:* RTS ;
- PrepIntroRestart:
- L82A3: LDA Timer3 ;Check if delay timer has expired. If not, branch-->
- L82A5: BNE ++ ;to exit, else run this rouine.
- L82A7: STA SpareMemD2 ;Not accessed by game.
- L82A9: STA SpareMemBB ;Not accessed by game.
- L82AB: STA IsSamus ;Clear IsSamus memory address.
- L82AD: LDY #$1F ;
- L82AF:* STA ObjAction,Y ;
- L82B2: DEY ;Clear RAM $0300 thru $031F.
- L82B3: BPL - ;
- L82B5: LDA PPUCNT0ZP ;Change to name table 0.
- L82B7: AND #$FC ;
- L82B9: STA PPUCNT0ZP ;
- L82BB: INY ;Y=0.
- L82BC: STY SpareMemB7 ;Accessed by unused routine.
- L82BE: STY SpareMemB8 ;Accessed by unused routine.
- L82C0: STY PalDataIndex ;
- L82C2: STY ScreenFlashPalIndex ;Clear all index values from these addresses.
- L82C4: STY IntroStarOffset ;
- L82C6: STY FadeDataIndex ;
- L82C8: STY SpareMemCD ;Not accessed by game.
- L82CA: STY Joy1Change ;
- L82CC: STY Joy1Status ;Clear addresses that were going to be written to by an-->
- L82CE: STY Joy1Retrig ;unused intro routine.
- L82D0: STY SpareMemD7 ;Not accessed by game.
- L82D2: INY ;Y=1.
- L82D3: STY SpareMemCE ;Not accessed by game.
- L82D5: INY ;Y=2.
- L82D6: STY SpareMemCC ;Not accessed by game.
- L82D8: STY SpareMemCF ;Not accessed by game.
- L82DA: STY TitleRoutine ;Next routine sets up METROID fade in delay.
- L82DC: LDA IntroMusicRestart ;Check to see if intro music needs to be restarted.-->
- L82DE: BNE ++ ;Branch if not.
- L82E0: LDA #$10 ;
- L82E2: STA MultiSFXFlag ;Restart intro music.
- L82E5: LDA #$02 ;Set restart of intro music after another two cycles-->
- L82E7: STA IntroMusicRestart ;of the title routines.
- L82E9:* RTS ;
- L82EA:* DEC IntroMusicRestart ;One title routine cycle complete. Decrement intro-->
- L82EC: RTS ;music restart counter.
- TitleScreenOff:
- L82ED: JSR ScreenOff ;($C439)Turn screen off.
- L82F0: INC TitleRoutine ;Next routine is TitleRoutineReturn.
- L82F2: RTS ;This routine should not be reached.
- TitleRoutineReturn:
- L82F3: RTS ;Last title routine function. Should not be reached.
- ;The following data fills name table 0 with the intro screen background graphics.
- ;Information to be stored in attribute table 0.
- L82F4: .byte $23 ;PPU address high byte.
- L82F5: .byte $C0 ;PPU address low byte.
- L82F6: .byte $20 ;PPU string length.
- L82F7: .byte $00, $00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
- L8307: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
- L8317: .byte $23 ;PPU address high byte.
- L8318: .byte $E0 ;PPU address low byte.
- L8319: .byte $20 ;PPU string length.
- L831A: .byte $FF, $FF, $BF, $AF, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $00, $00, $00
- L832A: .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
- ;Writes row $22E0 (24th row from top).
- L833A: .byte $22 ;PPU address high byte.
- L833B: .byte $E0 ;PPU address low byte.
- L833C: .byte $20 ;PPU string length.
- L833D: .byte $FF, $FF, $FF, $FF, $FF, $8C, $FF, $FF, $FF, $FF, $FF, $8D, $FF, $FF, $8E, $FF
- L834D: .byte $FF, $FF, $FF, $FF, $FF, $8C, $FF, $FF, $FF, $FF, $FF, $8D, $FF, $FF, $8E, $FF
- ;Writes row $2300 (25th row from top).
- L835D: .byte $23 ;PPU address high byte.
- L835E: .byte $00 ;PPU address low byte.
- L835F: .byte $20 ;PPU string length.
- L8360: .byte $80, $81, $80, $81, $80, $81, $80, $81, $80, $81, $80, $81, $80, $81, $80, $81
- L8370: .byte $80, $81, $80, $81, $80, $81, $80, $81, $80, $81, $80, $81, $80, $81, $80, $81
- ;Writes row $2320 (26th row from top).
- L8380: .byte $23 ;PPU address high byte.
- L8381: .byte $20 ;PPU address low byte.
- L8382: .byte $20 ;PPU string length.
- L8383: .byte $82, $83, $82, $83, $82, $83, $82, $83, $82, $83, $82, $83, $82, $83, $82, $83
- L8393: .byte $82, $83, $82, $83, $82, $83, $82, $83, $82, $83, $82, $83, $82, $83, $82, $83
- ;Writes row $2340 (27th row from top).
- L83A3: .byte $23 ;PPU address high byte.
- L83A4: .byte $40 ;PPU address low byte.
- L83A5: .byte $20 ;PPU string length.
- L83A6: .byte $84, $85, $84, $85, $84, $85, $84, $85, $84, $85, $84, $85, $84, $85, $84, $85
- L83B6: .byte $84, $85, $84, $85, $84, $85, $84, $85, $84, $85, $84, $85, $84, $85, $84, $85
- ;Writes row $2360 (28th row from top).
- L83C6: .byte $23 ;PPU address high byte.
- L83C7: .byte $60 ;PPU address low byte.
- L83C8: .byte $20 ;PPU string length.
- L83C9: .byte $86, $87, $86, $87, $86, $87, $86, $87, $86, $87, $86, $87, $86, $87, $86, $87
- L83D9: .byte $86, $87, $86, $87, $86, $87, $86, $87, $86, $87, $86, $87, $86, $87, $86, $87
- ;Writes row $2380 (29th row from top).
- L83E9: .byte $23 ;PPU address high byte.
- L83EA: .byte $80 ;PPU address low byte.
- L83EB: .byte $20 ;PPU string length.
- L83EC: .byte $88, $89, $88, $89, $88, $89, $88, $89, $88, $89, $88, $89, $88, $89, $88, $89
- L83FC: .byte $88, $89, $88, $89, $88, $89, $88, $89, $88, $89, $88, $89, $88, $89, $88, $89
- ;Writes row $23A0 (Bottom row).
- L840C: .byte $23 ;PPU address high byte.
- L840D: .byte $A0 ;PPU address low byte.
- L840E: .byte $20 ;PPU string length.
- L840F: .byte $8A, $8B, $8A, $8B, $8A, $8B, $8A, $8B, $8A, $8B, $8A, $8B, $8A, $8B, $8A, $8B
- L841F: .byte $8A, $8B, $8A, $8B, $8A, $8B, $8A, $8B, $8A, $8B, $8A, $8B, $8A, $8B, $8A, $8B
- ;Writes some blank spaces in row $20A0 (6th row from top).
- L842F: .byte $20 ;PPU address high byte.
- L8430: .byte $A8 ;PPU address low byte.
- L8431: .byte $4F ;PPU string length.
- L8432: .byte $FF ;Since RLE bit set, repeat 16 blanks starting at $20A8.
- ;Writes METROID graphics in row $2100 (9th row from top).
- L8433: .byte $21 ;PPU address high byte.
- L8434: .byte $03 ;PPU address low byte.
- L8435: .byte $1C ;PPU string length.
- L8436: .byte $40, $5D, $56, $5D, $43, $40, $5D, $43, $40, $5D, $5D, $43, $40, $5D, $5D, $63
- L8446: .byte $62, $5D, $5D, $63, $40, $43, $40, $5D, $5D, $63, $1D, $16
- ;Writes METROID graphics in row $2120 (10th row from top).
- L8452: .byte $21 ;PPU address high byte.
- L8453: .byte $23 ;PPU address low byte.
- L8454: .byte $1A ;PPU string length.
- L8455: .byte $44, $50, $50, $50, $47, $44, $57, $58, $74, $75, $76, $77, $44, $57, $69, $47
- L8465: .byte $44, $57, $69, $47, $44, $47, $44, $68, $69, $47
- ;Writes METROID graphics in row $2140 (11th row from top).
- L846F: .byte $21 ;PPU address high byte.
- L8470: .byte $43 ;PPU address low byte.
- L8471: .byte $1A ;PPU string length.
- L8472: .byte $44, $41, $7E, $49, $47, $44, $59, $5A, $78, $79, $7A, $7B, $44, $59, $6D, $70
- L8482: .byte $44, $73, $72, $47, $44, $47, $44, $73, $72, $47
- ;Writes METROID graphics in row $2160 (12th row from top).
- L848C: .byte $21 ;PPU address high byte.
- L848D: .byte $63 ;PPU address low byte.
- L848E: .byte $1A ;PPU string length.
- L848F: .byte $44, $42, $7F, $4A, $47, $44, $5B, $5C, $FF, $44, $47, $FF, $44, $5B, $6F, $71
- L849F: .byte $44, $45, $46, $47, $44, $47, $44, $45, $46, $47
- ;Writes METROID graphics in row $2180 (13th row from top).
- L84A9: .byte $21 ;PPU address high byte.
- L84AA: .byte $83 ;PPU address low byte.
- L84AB: .byte $1A ;PPU string length.
- L84AC: .byte $44, $47, $FF, $44, $47, $44, $5F, $60, $FF, $44, $47, $FF, $44, $7D, $7C, $47
- L84BC: .byte $44, $6A, $6B, $47, $44, $47, $44, $6A, $6B, $47
- ;Writes METROID graphics in row $21A0 (14th row from top).
- L84C6: .byte $21 ;PPU address high byte.
- L84C7: .byte $A3 ;PPU address low byte.
- L84C8: .byte $1A ;PPU string length.
- L84C9: .byte $4C, $4F, $FF, $4C, $4F, $4C, $5E, $4F, $FF, $4C, $4F, $FF, $4C, $4D, $4E, $4F
- L84D9: .byte $66, $5E, $5E, $64, $4C, $4F, $4C, $5E, $5E, $64
- ;Writes METROID graphics in row $21C0 (15th row from top).
- L84E3: .byte $21 ;PPU address high byte.
- L84E4: .byte $C3 ;PPU address low byte.
- L84E5: .byte $1A ;PPU string length.
- L84E6: .byte $51, $52, $FF, $51, $52, $51, $61, $52, $FF, $51, $52, $FF, $51, $53, $54, $52
- L84F6: .byte $67, $61, $61, $65, $51, $52, $51, $61, $61, $65
- ;Writes PUSH START BUTTON in row $2220 (18th row from top).
- L8500: .byte $22 ;PPU address high byte.
- L8501: .byte $27 ;PPU address low byte.
- L8502: .byte $15 ;PPU string length.
- ; '_ P U S H _ S T A R T _ B U T T
- L8503: .byte $FF, $19, $1E, $1C, $11, $FF, $1C, $1D, $0A, $1B, $1D, $FF, $0B, $1E, $1D, $1D
- ; O N _ _ _'
- L8513: .byte $18, $17, $FF, $FF, $FF
- ;Writes C 1986 NINTENDO in row $2260 (20th row from top).
- L8518: .byte $22 ;PPU memory high byte.
- L8519: .byte $69 ;PPU memory low byte.
- L851A: .byte $12 ;PPU string length.
- ; 'C _ 1 9 8 6 _ N I N T E N D O _
- L851B: .byte $8F, $FF, $01, $09, $08, $06, $FF, $17, $12, $17, $1D, $0E, $17, $0D, $18, $FF
- ; _ _'
- L852B: .byte $FF, $FF
- ;The following data fills name table 1 with the intro screen background graphics.
- ;Information to be stored in attribute table 1.
- L852D: .byte $27 ;PPU memory high byte.
- L852E: .byte $C0 ;PPU memory low byte.
- L852F: .byte $20 ;PPU string length.
- L8530: .byte $00, $00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
- L8540: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
- ;Writes row $27E0 (24th row from top).
- L8550: .byte $27 ;PPU memory high byte.
- L8551: .byte $E0 ;PPU memory low byte.
- L8552: .byte $20 ;PPU string length.
- L8553: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $00, $00, $00
- L8563: .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
- ;Writes row $26E0 (24th row from top).
- L8573: .byte $26 ;PPU memory high byte.
- L8574: .byte $E0 ;PPU memory low byte.
- L8575: .byte $20 ;PPU string length.
- L8576: .byte $FF, $FF, $FF, $FF, $FF, $8C, $FF, $FF, $FF, $FF, $FF, $8D, $FF, $FF, $8E, $FF
- L8586: .byte $FF, $FF, $FF, $FF, $FF, $8C, $FF, $FF, $FF, $FF, $FF, $8D, $FF, $FF, $8E, $FF
- ;Writes row $2700 (25th row from top).
- L8595: .byte $27 ;PPU memory high byte.
- L8597: .byte $00 ;PPU memory low byte.
- L8598: .byte $20 ;PPU string length.
- L8599: .byte $80, $81, $80, $81, $80, $81, $80, $81, $80, $81, $80, $81, $80, $81, $80, $81
- L85A9: .byte $80, $81, $80, $81, $80, $81, $80, $81, $80, $81, $80, $81, $80, $81, $80, $81
- ;Writes row $2720 (26th row from top).
- L85B9: .byte $27 ;PPU memory high byte.
- L85BA: .byte $20 ;PPU memory low byte.
- L85BB: .byte $20 ;PPU string length.
- L85BC: .byte $82, $83, $82, $83, $82, $83, $82, $83, $82, $83, $82, $83, $82, $83, $82, $83
- L85CC: .byte $82, $83, $82, $83, $82, $83, $82, $83, $82, $83, $82, $83, $82, $83, $82, $83
- ;Writes row $2740 (27th row from top).
- L85DC: .byte $27 ;PPU memory high byte.
- L85DD: .byte $40 ;PPU memory low byte.
- L85DE: .byte $20 ;PPU string length.
- L85DF: .byte $84, $85, $84, $85, $84, $85, $84, $85, $84, $85, $84, $85, $84, $85, $84, $85
- L85EF: .byte $84, $85, $84, $85, $84, $85, $84, $85, $84, $85, $84, $85, $84, $85, $84, $85
- ;Writes row $2760 (28th row from top).
- L85FF: .byte $27 ;PPU memory high byte.
- L8600: .byte $60 ;PPU memory low byte.
- L8601: .byte $20 ;PPU string length.
- L8602: .byte $86, $87, $86, $87, $86, $87, $86, $87, $86, $87, $86, $87, $86, $87, $86, $87
- L8612: .byte $86, $87, $86, $87, $86, $87, $86, $87, $86, $87, $86, $87, $86, $87, $86, $87
- ;Writes row $2780 (29th row from top).
- L8622: .byte $27 ;PPU memory high byte.
- L8623: .byte $80 ;PPU memory low byte.
- L8624: .byte $20 ;PPU string length.
- L8625: .byte $88, $89, $88, $89, $88, $89, $88, $89, $88, $89, $88, $89, $88, $89, $88, $89
- L8635: .byte $88, $89, $88, $89, $88, $89, $88, $89, $88, $89, $88, $89, $88, $89, $88, $89
- ;Writes row $27A0 (bottom row).
- L8645: .byte $27 ;PPU memory high byte.
- L8646: .byte $A0 ;PPU memory low byte.
- L8647: .byte $20 ;PPU string length.
- L8648: .byte $8A, $8B, $8A, $8B, $8A, $8B, $8A, $8B, $8A, $8B, $8A, $8B, $8A, $8B, $8A, $8B
- L8658: .byte $8A, $8B, $8A, $8B, $8A, $8B, $8A, $8B, $8A, $8B, $8A, $8B, $8A, $8B, $8A, $8B
- ;Writes row $2480 (5th row from top).
- L8668: .byte $24 ;PPU memory high byte.
- L8669: .byte $88 ;PPU memory low byte.
- L866A: .byte $0F ;PPU string length.
- ; 'E M E R G E N C Y _ O R D E R'
- L866B: .byte $0E, $16, $0E, $1B, $10, $0E, $17, $0C, $22, $FF, $18, $1B, $0D, $0E, $1B
- ;Writes row $2500 (9th row from top).
- L867A: .byte $25 ;PPU memory high byte.
- L867B: .byte $04 ;PPU memory low byte.
- L867C: .byte $1C ;PPU string length.
- ; 'D E F E A T _ T H E _ M E T R 0
- L867D: .byte $0D, $0E, $0F, $0E, $0A, $1D, $FF, $1D, $11, $0E, $FF, $16, $0E, $1D, $1B, $18
- ; I D _ O F _ _ _ _ _ _ _'
- L868D: .byte $12, $0D, $FF, $18, $0F, $FF, $FF, $FF, $FF, $FF, $FF, $FF
- ;Writes row $2540 (11th row from top).
- L8699: .byte $25 ;PPU memory high byte.
- L869A: .byte $44 ;PPU memory low byte.
- L869B: .byte $1A ;PPU string length.
- ; 'T H E _ P L A N E T _ Z E B E T
- L869C: .byte $1D, $11, $0E, $FF, $19, $15, $0A, $17, $0E, $1D, $FF, $23, $0E, $0B, $0E, $1D
- ; H _ A N D _ _ _ _ _'
- L86AC: .byte $11, $FF, $0A, $17, $0D, $FF, $FF, $FF, $FF, $FF
- ;Writes row $2580 (13th row from top).
- L86B6: .byte $25 ;PPU memory high byte.
- L86B7: .byte $84 ;PPU memory low byte.
- L86B8: .byte $1A ;PPU string length.
- ; 'D E S T R O Y _ T H E _ M O T H
- L86B9: .byte $0D, $0E, $1C, $1D, $1B, $18, $22, $FF, $1D, $11, $0E, $FF, $16, $18, $1D, $11
- ; E R _ B R A I N _ _'
- L86C9: .byte $0E, $1B, $FF, $0B, $1B, $0A, $12, $17, $FF, $FF
- ;Writes row $25C0 (15th row from top).
- L86D3: .byte $25 ;PPU memory high byte.
- L86D4: .byte $C4 ;PPU memory low byte.
- L86D5: .byte $1A ;PPU string length.
- ; 'T H E _ M E C H A N I C A L _ L
- L86D6: .byte $1D, $11, $0E, $FF, $16, $0E, $0C, $11, $0A, $17, $12, $0C, $0A, $15, $FF, $15
- ; I F E _ V E I N _ _'
- L86E9: .byte $12, $0F, $0E, $FF, $1F, $0E, $12, $17, $FF, $FF
- ;Writes row $2620 (18th row from top).
- L86F0: .byte $26 ;PPU memory high byte.
- L86F1: .byte $27 ;PPU memory low byte.
- L86F2: .byte $15 ;PPU string length.
- ; 'G A L A X Y _ F E D E R A L _ P
- L86F3: .byte $10, $0A, $15, $0A, $21, $22, $FF, $0F, $0E, $0D, $0E, $1B, $0A, $15, $FF, $19
- ; O L I C E'
- L8703: .byte $18, $15, $12, $0C, $0E
- ;Writes row $2660 (20th row from top).
- L8708: .byte $26 ;PPU memory high byte.
- L8709: .byte $69 ;PPU memory low byte.
- L870A: .byte $12 ;PPU string length.
- ; '_ _ _ _ _ _ _ _ _ _ _ _ _ _ M 5
- L870B: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $16, $05
- ; 1 0'
- L871B: .byte $01, $00
- L871D: .byte $00 ;End PPU string write.
- ;The following data does not appear to be used.
- L871E: .byte $46, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
- L872E: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $20, $00, $00, $00, $00, $00, $00
- L873E: .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
- L874E: .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
- ;The following error message is diplayed if the player enters an incorrect password.
- ; 'E R R O R _ T R Y _ A G A I N'
- L8759: .byte $0E, $1B, $1B, $18, $1B, $FF, $1D, $1B, $22, $FF, $0A, $10, $0A, $12, $17
- ;If the error message above is not being displayed on the password
- ;screen, the following fifteen blanks spaces are used to cover it up.
- ; '_ _ _ _ _ _ _ _ _ _ _ _ _ _ _'
- L8768: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
- ;Not used.
- L8777: .byte $79, $87, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $00, $00, $02, $00
- L8787: .byte $00, $03, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $00, $00, $02, $00
- L8797: .byte $00, $03, $A1, $87, $A2, $87, $A5, $87, $A8, $87, $00, $18, $CC, $00, $18, $CD
- L87A7: .byte $00, $18, $CE, $00
- LoadSparkleData:
- L87AB: LDX #$0A ;
- L87AD:* LDA InitSparkleDataTbl,X ;
- L87B0: STA IntroSpr0YCoord,X ;Loads $6EA0 thru $6EAA with the table below.
- L87B3: STA IntroSpr1YCoord,X ;Loads $6EB0 thru $6EBA with the table below.
- L87B6: DEX ;
- L87B7: BPL - ;Loop until all values from table below are loaded.
- L87B9: LDA #$6B ;
- L87BB: STA IntroSpr1YCoord ;$6EA0 thru $6EAA = #$3C, #$C6, #$01, #$18, #$00,-->
- L87BE: LDA #$DC ;#$00, #$00, #$00, #$20, #$00, #$00, initial.
- L87C0: STA IntroSpr1XCoord ;$6EB0 thru $6EBA = #$6B, #$C6, #$01, #$DC, #$00,-->
- L87C3: RTS ;#$00, #$00, #$00, #$20, #$00, #$00, initial.
- ;Used by above routine to load Metroid initial sparkle data into $6EA0
- ;thru $6EAA and $6EB0 thru $6EBA.
- InitSparkleDataTbl:
- L87C4: .byte $3C, $C6, $01, $18, $00, $00, $00, $00, $20, $00, $00
- UpdateSparkleSprites:
- L87CF: LDX #$00 ;
- L87D1: JSR DoOneSparkleUpdate ;($87D6)Performs calculations on top sparkle sprite.
- L87D4: LDX #$10 ;Performs calculations on bottom sparkle sprite.
- DoOneSparkleUpdate:
- L87D6: JSR SparkleUpdate ;($87D9)Update sparkle sprite data.
- SparkleUpdate:
- L87D9: LDA IntroSpr0NextCntr,X ;If $6EA5 has not reached #$00, skip next routine.
- L87DC: BNE + ;
- L87DE: JSR DoSparkleSpriteCoord ;($881A)Update sparkle sprite screen position.
- L87E1:* LDA IntroSpr0Complete,X ;
- L87E4: BNE ++ ;If sprite is already done, skip routine.
- L87E6: DEC IntroSpr0NextCntr,X ;
- L87E9: LDA SparkleSpr0YChange,X ;
- L87EC: CLC ;
- L87ED: ADC IntroSpr0YCoord,X ;Updates sparkle sprite Y coord.
- L87F0: STA IntroSpr0YCoord,X ;
- L87F3: LDA SparkleSpr0XChange,X ;
- L87F6: CLC ;
- L87F7: ADC IntroSpr0XCoord,X ;Updates sparkle sprite X coord.
- L87FA: STA IntroSpr0XCoord,X ;
- L87FD: DEC IntroSpr0ChngCntr,X ;Decrement IntroSpr0ChngCntr. If 0, time to change-->
- L8800: BNE + ;sprite graphic.
- L8802: LDA IntroSpr0PattTbl,X ;
- L8805: EOR #$03 ;If IntroSpr0ChngCntr=$00, the sparkle sprite graphic is-->
- L8807: STA IntroSpr0PattTbl,X ;changed back and forth between pattern table-->
- L880A: LDA #$20 ;graphic $C6 and $C7. IntroSpr0ChngCntr is reset to #$20.
- L880C: STA IntroSpr0ChngCntr,X ;
- L880F: ASL ;
- L8810: EOR IntroSpr0Cntrl,X ;Flips pattern at $C5 in pattern table-->
- L8813: STA IntroSpr0Cntrl,X ;horizontally when displayed.
- L8816:* JMP WriteIntroSprite ;($887B)Transfer sprite info into sprite RAM.
- L8819:* RTS ;
- DoSparkleSpriteCoord:
- L881A: TXA ;
- L881B: JSR Adiv8 ;($C2C0)Y=0 when working with top sparkle sprite-->
- L881E: TAY ;and y=2 when working with bottom sparkle sprite.
- L881F: LDA SparkleAddressTbl,Y ;Base is $89AF.
- L8822: STA $00 ;When working with top sparkle sprite, E1,E0=$89B3-->
- L8824: LDA SparkleAddressTbl+1,Y ;and when botton sparkle sprite, E1,E0=$89E9.
- L8827: STA $01 ;
- L8829: LDY IntroSpr0Index,X ;Loads index for finding sparkle data (x=$00 or $10).
- L882C: LDA ($00),Y ;
- L882E: BPL + ;If data byte MSB is set, set $6EA9 to #$01 and move to-->
- L8830: LDA #$01 ;next index for sparkle sprite data.
- L8832: STA IntroSpr0ByteType,X ;
- L8835:* BNE + ;
- L8837: LDA #$01 ;If value is equal to zero, sparkle sprite-->
- L8839: STA IntroSpr0Complete,X ;processing is complete.
- L883C:* STA IntroSpr0NextCntr,X ;
- L883F: INY ;
- L8840: LDA ($00),y ;Get x/y position byte.
- L8842: DEC IntroSpr0ByteType,X ;If MSB of second byte is set, branch.
- L8845: BMI + ;
- L8847: LDA #$00 ;This code is run when the MSB of the first byte-->
- L8849: STA SparkleSpr0YChange,X ;is set. This allows the sprite to change X coord-->
- L884C: LDA ($00),Y ;by more than 7. Ensures Y coord does not change.
- L884E: BMI ++ ;
- L8850:* PHA ;Store value twice so X and Y-->
- L8851: PHA ;coordinates can be extracted.
- L8852: LDA #$00 ;
- L8854: STA IntroSpr0ByteType,X ;Set IntroSpr0ByteType to #$00 after processing.
- L8857: PLA ;
- L8858: JSR Adiv16 ;($C2BF)Move upper 4 bits to lower 4 bits.
- L885B: JSR NibbleSubtract ;($8871)Check if nibble to be converted to twos compliment.
- L885E: STA SparkleSpr0YChange,X ;Twos compliment stored if Y coord decreasing.
- L8861: PLA ;
- L8862: AND #$0F ;Discard upper 4 bits.
- L8864: JSR NibbleSubtract ;($8871)Check if nibble to be converted to twos compliment.
- L8867:* STA SparkleSpr0XChange,X ;Store amount to move spite in x direction.
- L886A: INC IntroSpr0Index,X ;
- L886D: INC IntroSpr0Index,X ;Add two to find index for next data byte.
- L8870: RTS ;
- NibbleSubtract:
- L8871: CMP #$08 ;If bit 3 is set, nibble is a negative number-->
- L8873: BCC + ;and lower three bits are converted to twos-->
- L8875: AND #$07 ;compliment for subtraction, else exit.
- L8877: JSR TwosCompliment ;($C3D4)Prepare for subtraction with twos compliment.
- L887A:* RTS ;
- WriteIntroSprite:
- L887B: LDA IntroSpr0YCoord,X ;
- L887E: SEC ;Subtract #$01 from first byte to get proper y coordinate.
- L887F: SBC #$01 ;
- L8881: STA Sprite04RAM,X ;
- L8884: LDA IntroSpr0PattTbl,X ;
- L8887: STA Sprite04RAM+1,X ;Load the four bytes for the-->
- L888A: LDA IntroSpr0Cntrl,X ;intro sprites into sprite RAM.
- L888D: STA Sprite04RAM+2,X ;
- L8890: LDA IntroSpr0XCoord,X ;
- L8893: STA Sprite04RAM+3,X ;
- L8896: RTS ;
- LoadInitialSpriteData:
- L8897: LDA #$20 ;
- L8899: STA Second4Delay ;Set delay for second 4 sprites to 32 frames.
- L889B: LDX #$3F ;Prepare to loop 64 times.
- L889D:* LDA Sprite0and4InitTbl,X ;Load data from tables below.
- L88A0: CMP $FF ;If #$FF, skip loading that byte and move to next item.
- L88A2: BEQ + ;
- L88A4: STA IntroSpr0YCoord,X ;Store initial values for sprites 0 thru 3.
- L88A7: STA IntroSpr4YCoord,X ;Store initial values for sprites 4 thru 7.
- L88AA:* DEX ;
- L88AB: BPL -- ;Loop until all data is loaded.
- L88AD: LDA #$B8 ;Special case for sprite 6 and 7.
- L88AF: STA IntroSpr6YCoord ;
- L88B2: STA IntroSpr7YCoord ;Change sprite 6 and 7 initial y position.
- L88B5: LDA #$16 ;
- L88B7: STA IntroSpr6YRise ;Change sprite 6 and 7 y displacement. The combination-->
- L88BA: STA IntroSpr7YRise ;of these two changes the slope of the sprite movement.
- L88BD: RTS ;
- ;The following tables are loaded into RAM as initial sprite control values for the crosshair sprites.
- Sprite0and4InitTbl:
- L88BE: .byte $20 ;Initial starting y screen position.
- L88BF: .byte $C5 ;Sprite pattern table index.
- L88C0: .byte $80 ;Sprite control byte.
- L88C1: .byte $00 ;Initial starting x screen position.
- L88C2: .byte $FF ;Not used.
- L88C3: .byte $FF ;Not used.
- L88C4: .byte $74 ;Intro sprite x total movement distance.
- L88C5: .byte $58 ;Intro sprite y total movement distance.
- L88C6: .byte $FF ;Not used.
- L88C7: .byte $FF ;Not used.
- L88C8: .byte $00 ;Sprite task complete idicator.
- L88C9: .byte $FF ;Not used.
- L88CA: .byte $1D ;x displacement of sprite movement(run).
- L88CB: .byte $0E ;y displacement of sprite movement(rise).
- L88CC: .byte $01 ;Change sprite x coord in positive direction.
- L88CD: .byte $01 ;Change sprite y coord in positive direction.
- Sprite1and5InitTbl:
- L88CE: .byte $20 ;Initial starting y screen position.
- L88CF: .byte $C5 ;Sprite pattern table index.
- L88D0: .byte $C0 ;Sprite control byte.
- L88D1: .byte $F8 ;Initial starting x screen position.
- L88D2: .byte $FF ;Not used.
- L88D3: .byte $FF ;Not used.
- L88D4: .byte $7C ;Intro sprite x total movement distance.
- L88D5: .byte $58 ;Intro sprite y total movement distance.
- L88D6: .byte $FF ;Not used.
- L88D7: .byte $FF ;Not used.
- L88D8: .byte $00 ;Sprite task complete idicator.
- L88D9: .byte $FF ;Not used.
- L88DA: .byte $1F ;x displacement of sprite movement(run).
- L88DB: .byte $0E ;y displacement of sprite movement(rise).
- L88DC: .byte $80 ;Change sprite x coord in negative direction.
- L88DD: .byte $01 ;Change sprite y coord in positive direction.
- Sprite2and6InitTbl:
- L88DE: .byte $C8 ;Initial starting y screen position.
- L88DF: .byte $C5 ;Sprite pattern table index.
- L88E0: .byte $00 ;Sprite control byte.
- L88E1: .byte $00 ;Initial starting x screen position.
- L88E2: .byte $FF ;Not used.
- L88E3: .byte $FF ;Not used.
- L88E4: .byte $74 ;Intro sprite x total movement distance.
- L88E5: .byte $60 ;Intro sprite y total movement distance.
- L88E6: .byte $FF ;Not used.
- L88E7: .byte $FF ;Not used.
- L88E8: .byte $00 ;Sprite task complete idicator.
- L88E9: .byte $FF ;Not used.
- L88EA: .byte $1D ;x displacement of sprite movement(run).
- L88EB: .byte $1A ;y displacement of sprite movement(rise).
- L88EC: .byte $01 ;Change sprite x coord in positive direction.
- L88ED: .byte $80 ;Change sprite y coord in negative direction.
- Sprite3and7InitTbl:
- L88EE: .byte $C8 ;Initial starting y screen position.
- L88EF: .byte $C5 ;Sprite pattern table index.
- L88F0: .byte $40 ;Sprite control byte.
- L88F1: .byte $F8 ;Initial starting x screen position.
- L88F2: .byte $FF ;Not used.
- L88F3: .byte $FF ;Not used.
- L88F4: .byte $7C ;Intro sprite x total movement distance.
- L88F5: .byte $60 ;Intro sprite y total movement distance.
- L88F6: .byte $FF ;Not used.
- L88F7: .byte $FF ;Not used.
- L88F8: .byte $00 ;Sprite task complete idicator.
- L88F9: .byte $FF ;Not used.
- L88FA: .byte $1F ;x displacement of sprite movement(run).
- L88FB: .byte $1A ;y displacement of sprite movement(rise).
- L88FC: .byte $80 ;Change sprite x coord in negative direction.
- L88FD: .byte $80 ;Change sprite y coord in negative direction.
- DrawCrosshairsSprites:
- L88FE: LDA First4SlowCntr ;
- L8900: BEQ + ;Has First4SlowCntr already hit 0? If so, branch.
- L8902: DEC First4SlowCntr ;
- L8904: BNE + ;Is First4SlowCntr now equal to 0? if not, branch.
- L8906: ASL IntroSpr0XRun ;
- L8909: ASL IntroSpr0YRise ;
- L890C: ASL IntroSpr1XRun ;
- L890F: ASL IntroSpr1YRise ;
- L8912: ASL IntroSpr2XRun ;
- L8915: ASL IntroSpr2YRise ;
- L8918: ASL IntroSpr3XRun ;Multiply the rise and run of the 8 sprites by 2.-->
- L891B: ASL IntroSpr3YRise ;This doubles their speed.
- L891E: ASL IntroSpr4XRun ;
- L8921: ASL IntroSpr4YRise ;
- L8924: ASL IntroSpr5XRun ;
- L8927: ASL IntroSpr5YRise ;
- L892A: ASL IntroSpr6XRun ;
- L892D: ASL IntroSpr6YRise ;
- L8930: ASL IntroSpr7XRun ;
- L8933: ASL IntroSpr7YRise ;
- L8936:* LDX #$00 ;
- L8938: JSR DoSpriteMovement ;($8963)Move sprite 0.
- L893B: LDX #$10 ;
- L893D: JSR DoSpriteMovement ;($8963)Move sprite 1.
- L8940: LDX #$20 ;
- L8942: JSR DoSpriteMovement ;($8963)Move sprite 2.
- L8945: LDX #$30 ;
- L8947: LDA Second4Delay ;Check to see if the delay to start movement of the second-->
- L8949: BEQ + ;4 sprites has ended. If so, start drawing those sprites.
- L894B: DEC Second4Delay ;
- L894D: BNE ++ ;
- L894F:* JSR DoSpriteMovement ;($8963)Move sprite 3.
- L8952: LDX #$40 ;
- L8954: JSR DoSpriteMovement ;($8963)Move sprite 4.
- L8957: LDX #$50 ;
- L8959: JSR DoSpriteMovement ;($8963)Move sprite 5.
- L895C: LDX #$60 ;
- L895E: JSR DoSpriteMovement ;($8963)Move sprite 6.
- L8961: LDX #$70 ;($8963)Move sprite 7.
- DoSpriteMovement:
- L8963:* LDA IntroSpr0Complete,X ;If the current sprite has finished-->
- L8966: BNE ++ ;its movements, exit this routine.
- L8968: JSR UpdateSpriteCoords ;($981E)Calculate new sprite position.
- L896B: BCS + ;If sprite not at final position, branch to move next frame.
- L896D: LDA #$01 ;Sprite movement complete.
- L896F: STA IntroSpr0Complete,X ;
- L8972:* JMP WriteIntroSprite ;($887B)Write sprite data to sprite RAM.
- L8975:* RTS ;
- DrawCrossSprites:
- L8976: LDA DrawCross ;If not ready to draw crosshairs,-->
- L8978: BEQ ++++ ;branch to exit.
- L897A: LDY CrossDataIndex ;
- L897C: CPY #$04 ;Check to see if at last index in table. If so, branch-->
- L897E: BCC + ;to draw cross sprites.
- L8980: BNE ++++ ;If beyond last index, branch to exit.
- L8982: LDA #$00 ;
- L8984: STA DrawCross ;If at last index, clear indicaor to draw cross sprites.
- L8986:* LDA CrossSpriteIndexTbl,Y ;
- L8989: STA $00 ;
- L898B: LDY #$00 ;Reset index into CrossSpriteDataTbl
- L898D:* LDX CrossSpriteDataTbl,Y ;Get offet into sprite RAM to load sprite.
- L8990: INY ;
- L8991:* LDA CrossSpriteDataTbl,Y ;Get sprite data byte.
- L8994: STA Sprite00RAM,X ;Store byte in sprite RAM.
- L8997: INX ;Move to next sprite RAM address.
- L8998: INY ;Move to next data byte in table.
- L8999: TXA ;
- L899A: AND #$03 ;Is new sprite position reached?-->
- L899C: BNE - ;if not, branch to load next sprite data byte.
- L899E: CPY $00 ;Has all the sprites been loaded for cross graphic?-->
- L89A0: BNE -- ;If not, branch to load next set of sprite data.
- L89A2: LDA FrameCount ;
- L89A4: LSR ;Increment index into CrossSpriteIndexTbl every-->
- L89A5: BCC + ;other frame. This updates the cross sprites-->
- L89A7: INC CrossDataIndex ;every two frames.
- L89A9:* RTS ;
- ;The following table tells the routine above how many data bytes to load from CrossSpriteDataTbl.
- ;The more data that is loaded, the bigger the cross that is drawn on the screen. The table below
- ;starts the cross out small, it then grows bigger and gets small again.
- CrossSpriteIndexTbl:
- L89AA: .byte $05, $19, $41, $19, $05
- ;The following table is used to find the data for the sparkle routine in the table below:
- SparkleAddressTbl:
- L89AF: .word TopSparkleDataTbl ;($89B3)Table for top sparkle data.
- L89B1: .word BottomSparkleDataTbl ;($89E9)Table for bottom sparkle data.
- ;The following two tables are the data tables for controlling the movement of the sparkle sprites
- ;in the title routine. Here's how thw data in the tables work: The first byte is a counter byte.
- ;It is loaded into a memory address and decremented every frame. Whilt that value is not 0, the
- ;second byte is used to change the sprite's x and y coordinates in the screen. The upper 4 bits
- ;of the second byte are amount to change the y coordinates every frame. If bit 7 is set, the
- ;y coordinates of the sprite are reduced every frame by the amount stored in bits 4,5 and 6. The
- ;lower 4 bits of the second byte are used to change the x coordinates of the sprite in the same
- ;manner. If bit 3 is set, the x coordinates of the sprite are reduced every frame by the amount
- ;stored in bits 0, 1 and 2.
- ;Special case: If MSB of the first byte is set(in the case of this data, the first byte is #$FF),
- ;The counter byte is set to only 1 frame and the second byte contains only x coordinates to move
- ;the sprite. The y coordinates do not change. This allows 8 bytes to move the x coordinate
- ;instead of only 4. This allows the sprite to "jump" across the edges of the letters. If the MSB
- ;of the second byte is set, the x coordinate of the sprite is decreased by the amount stored in
- ;the other seven bytes.
- TopSparkleDataTbl:
- L89B3: .byte $01, $00
- L89B5: .byte $01, $00
- L89B7: .byte $01, $01
- L89B9: .byte $06, $00
- L89BB: .byte $07, $01
- L89BD: .byte $10, $01
- L89BF: .byte $03, $01
- L89C1: .byte $01, $00
- L89C3: .byte $01, $01
- L89C5: .byte $01, $00
- L89C7: .byte $01, $01
- L89C9: .byte $01, $00
- L89CB: .byte $09, $01
- L89CD: .byte $04, $00
- L89CF: .byte $27, $01
- L89D1: .byte $01, $00
- L89D3: .byte $01, $00
- L89D5: .byte $06, $01
- L89D7: .byte $01, $00
- L89D9: .byte $15, $01
- L89DB: .byte $06, $00
- L89DD: .byte $01, $01
- L89DF: .byte $08, $01
- L89E1: .byte $0E, $02
- L89E3: .byte $02, $03
- L89E5: .byte $06, $04
- L89E7: .byte $00, $00
- BottomSparkleDataTbl:
- L89E9: .byte $01, $00
- L89EB: .byte $08, $09
- L89ED: .byte $01, $99
- L89EF: .byte $01, $09
- L89F1: .byte $01, $99
- L89F3: .byte $01, $09
- L89F5: .byte $01, $99
- L89F7: .byte $01, $09
- L89F9: .byte $01, $99
- L89FB: .byte $01, $09
- L89FD: .byte $01, $99
- L89FF: .byte $01, $09
- L8A01: .byte $01, $99
- L8A03: .byte $01, $09
- L8A05: .byte $01, $99
- L8A07: .byte $01, $09
- L8A09: .byte $01, $99
- L8A0B: .byte $01, $09
- L8A0D: .byte $01, $99
- L8A0F: .byte $01, $09
- L8A11: .byte $01, $99
- L8A13: .byte $01, $19
- L8A15: .byte $01, $11
- L8A17: .byte $01, $10
- L8A19: .byte $01, $11
- L8A1B: .byte $01, $10
- L8A1D: .byte $01, $11
- L8A1F: .byte $01, $10
- L8A21: .byte $01, $11
- L8A23: .byte $01, $10
- L8A25: .byte $01, $11
- L8A27: .byte $01, $10
- L8A29: .byte $01, $11
- L8A2B: .byte $01, $10
- L8A2D: .byte $01, $11
- L8A2F: .byte $01, $10
- L8A31: .byte $02, $11
- L8A33: .byte $01, $10
- L8A35: .byte $01, $11
- L8A37: .byte $10, $09
- L8A39: .byte $FF, $EF ;MSB of first byte set. move sprite x pos -17 pixles.
- L8A3B: .byte $11, $09
- L8A3D: .byte $FF, $F3 ;MSB of first byte set. move sprite x pos -13 pixles.
- L8A3F: .byte $1F, $09
- L8A41: .byte $FF, $EC ;MSB of first byte set. move sprite x pos -20 pixles.
- L8A43: .byte $0F, $09
- L8A45: .byte $FF, $ED ;MSB of first byte set. move sprite x pos -19 pixles.
- L8A47: .byte $16, $09
- L8A49: .byte $00, $00
- ;The following table is used by the DrawCrossSprites routine to draw the sprites on the screen that
- ;make up the cross that appears during the Crosshairs routine. The single byte is the index into
- ;the sprite RAM where the sprite data is to be written. The 4 bytes that follow it are the actual
- ;sprite data bytes.
- CrossSpriteDataTbl:
- L8A4B: .byte $10 ;Load following sprite data into Sprite04RAM.
- L8A4C: .byte $5A, $C0, $00, $79 ;Sprite data.
- L8A50: .byte $14 ;Load following sprite data into Sprite05RAM.
- L8A51: .byte $52, $C8, $00, $79 ;Sprite data.
- L8A55: .byte $18 ;Load following sprite data into Sprite06RAM.
- L8A56: .byte $5A, $C2, $40, $71 ;Sprite data.
- L8A5A: .byte $1C ;Load following sprite data into Sprite07RAM.
- L8A5B: .byte $5A, $C2, $00, $81 ;Sprite data.
- L8A5F: .byte $20 ;Load following sprite data into Sprite08RAM.
- L8A60: .byte $62, $C8, $80, $79 ;Sprite data.
- L8A64: .byte $14 ;Load following sprite data into Sprite05RAM.
- L8A65: .byte $52, $C9, $00, $79 ;Sprite data.
- L8A69: .byte $18 ;Load following sprite data into Sprite06RAM.
- L8A6A: .byte $5A, $C1, $00, $71 ;Sprite data.
- L8A6E: .byte $1C ;Load following sprite data into Sprite07RAM.
- L8A6F: .byte $5A, $C1, $00, $81 ;Sprite data.
- L8A73: .byte $20 ;Load following sprite data into Sprite08RAM.
- L8A74: .byte $62, $C9, $00, $79 ;Sprite data.
- L8A78: .byte $24 ;Load following sprite data into Sprite09RAM.
- L8A79: .byte $4A, $C8, $00, $79 ;Sprite data.
- L8A7D: .byte $28 ;Load following sprite data into Sprite0ARAM.
- L8A7E: .byte $5A, $C2, $40, $69 ;Sprite data.
- L8A82: .byte $2C ;Load following sprite data into Sprite0BRAM.
- L8A83: .byte $5A, $C2, $00, $89 ;Sprite data.
- L8A87: .byte $30 ;Load following sprite data into Sprite0CRAM.
- L8A88: .byte $6A, $C8, $80, $79 ;Sprite data.
- LoadPalData:
- L8A8C: lDY PalDataIndex ;
- L8A8E: LDA PalSelectTbl,Y ;Chooses which set of palette data-->
- L8A91: CMP #$FF ;to load from the table below.
- L8A93: BEQ + ;
- L8A95: STA PalDataPending ;Prepare to write palette data.
- L8A97: INC PalDataIndex ;
- L8A99:* RTS ;
- ;The table below is used by above routine to pick the proper palette.
- PalSelectTbl:
- L8A9A: .byte $02, $03, $04, $05, $06, $07, $08, $09, $0A, $0B, $0C, $0C, $FF
- FlashIntroScreen:
- L8AA7: LDY ScreenFlashPalIndex ;Load index into table below.
- L8AA9: LDA ScreenFlashPalTbl,Y ;Load palette data byte.
- L8AAC: CMP #$FF ;Has the end of the table been reached?-->
- L8AAE: BNE + ;If not, branch.
- L8AB0: LDA #$00 ;
- L8AB2: STA ScreenFlashPalIndex ;Clear screen flash palette index and reset-->
- L8AB4: STA FlashScreen ;screen flash control address.
- L8AB6: BEQ ++ ;Branch always.
- L8AB8:* STA PalDataPending ;Store palette change data.
- L8ABA: INC ScreenFlashPalIndex ;Increment index into table below.
- L8ABC:* RTS ;
- ScreenFlashPalTbl:
- L8ABD: .byte $11, $01, $11, $01, $11, $11, $01, $11, $01, $FF
- ;----------------------------------[ Intro star palette routines ]-----------------------------------
- StarPalSwitch:
- L8AC7: LDA FrameCount ;
- L8AC9: AND #$0F ;Change star palette every 16th frame.
- L8ACB: BNE + ;
- L8ACD: LDA PPUStrIndex ;
- L8AD0: BEQ ++ ;Is any other PPU data waiting? If so, exit.
- L8AD2:* RTS ;
- L8AD3:* LDA #$19 ;
- L8AD5: STA $00 ;Prepare to write to the sprite palette-->
- L8AD7: LDA #$3F ;starting at address $3F19.
- L8AD9: STA $01 ;
- L8ADB: LDA IntroStarOffset ;Use only first 3 bits of byte since the pointer-->
- L8ADD: AND #$07 ;table only has 8 entries.
- L8ADF: ASL ;*2 to find entry in IntroStarPntr table.
- L8AE0: TAY ;
- L8AE1: LDA IntroStarPntr,Y ;Stores starting address of palette data to write-->
- L8AE4: STA $02 ;into $02 and $03 from IntroStarPntr table.
- L8AE6: LDA IntroStarPntr+1,Y ;
- L8AE9: STA $03 ;
- L8AEB: INC IntroStarOffset ;Increment index for next palette change.
- L8AED: JSR PrepPPUPaletteString ;($C37E)Prepare and write new palette data.
- L8AF0: LDA #$1D ;
- L8AF2: STA $00 ;
- L8AF4: LDA #$3F ;Prepare another write to the sprite palette.-->
- L8AF6: STA $01 ;This tie starting at address $3F1D.
- L8AF8: INY ;
- L8AF9: JSR AddYToPtr02 ;($C2B3)Find new data base of palette data.
- L8AFC: JMP PrepPPUPaletteString ;($C37E)Prepare and write new palette data.
- ;The following table is a list of pointers into the table below. It contains
- ;the palette data for the twinkling stars in the intro scene. The palette data
- ;is changed every 16 frames by the above routine.
- IntroStarPntr:
- L8AFF: .word $8B0F, $8B19, $8B23, $8B2D, $8B37, $8B41, $8B4B, $8B55
- ;The following table contains the platette data that is changed in the intro
- ;scene to give the stars a twinkling effect. All entries in the table are
- ;non-repeating.
- IntroStarPal:
- L8B0F: .byte $03, $0F, $02, $13, $00, $03, $00, $34, $0F, $00
- L8B10: .byte $03, $06, $01, $23, $00, $03, $0F, $34, $09, $00
- L8B23: .byte $03, $16, $0F, $23, $00, $03, $0F, $24, $1A, $00
- L8B2D: .byte $03, $17, $0F, $13, $00, $03, $00, $04, $28, $00
- L8B37: .byte $03, $17, $01, $14, $00, $03, $10, $0F, $28, $00
- L8B41: .byte $03, $16, $02, $0F, $00, $03, $30, $0F, $1A, $00
- L8B4B: .byte $03, $06, $12, $0F, $00, $03, $30, $04, $09, $00
- L8B55: .byte $03, $0F, $12, $14, $00, $03, $10, $24, $0F, $00
- ;----------------------------------------------------------------------------------------------------
- DoFadeOut:
- L8B5F: LDY FadeDataIndex ;Load palette data from table below.
- L8B61: LDA FadeOutPalData,Y ;
- L8B64: CMP #$FF ;If palette data = #$FF, exit.
- L8B66: BEQ + ;
- L8B68: STA PalDataPending ;Store new palette data.
- L8B6A: INC FadeDataIndex ;
- L8B6C:* RTS ;
- FadeOutPalData:
- L8B6D: .byte $0D, $0E, $0F, $10, $01, $FF
- FadeInPalData:
- L8B73: .Byte $01, $10, $0F, $0E, $0D, $FF
- ;----------------------------------------[ Password routines ]---------------------------------------
- ProcessUniqueItems:
- L8B79: LDA NumberOfUniqueItems ;
- L8B7C: STA $03 ;Store NumberOfUniqueItems at $03.
- L8B7E: LDY #$00 ;
- L8B80: STY $04 ;Set $04 to #$00.
- L8B82:* LDY $04 ;Use $04 at index into unique itme list.
- L8B84: INY ;
- L8B85: LDA UniqueItemHistory-1,Y ;
- L8B88: STA $00 ;Load the two bytes representing the aquired-->
- L8B8A: INY ;Unique item and store them in $00 and $01.
- L8B8B: LDA UniqueItemHistory-1,Y ;
- L8B8E: STA $01 ;
- L8B90: STY $04 ;Increment $04 by two (load unique item complete).
- L8B92: JSR UniqueItemSearch ;($8B9C)Find unique item.
- L8B95: LDY $04 ;
- L8B97: CPY $03 ;If all unique items processed, return, else-->
- L8B99: BCC - ;branch to process next unique item.
- L8B9B: RTS ;
- UniqueItemSearch:
- L8B9C: LDX #$00 ;
- L8B9E:* TXA ;Transfer X to A(Item number).
- L8B9F: ASL ;Multiply by 2.
- L8BA0: TAY ;Store multiplied value in y.
- L8BA1: LDA ItemData,Y ;Load unique item reference starting at $9029(2 bytes).
- L8BA4: CMP $00 ;
- L8BA6: BNE + ;
- L8BA8: LDA ItemData+1,Y ;Get next byte of unique item.
- L8BAB: CMP $01 ;
- L8BAD: BEQ ++ ;If unique item found, branch to UniqueItemFound.
- L8BAF:* INX ;
- L8BB0: CPX #$3C ;If the unque item is a Zeebetite, return-->
- L8BB2: BCC -- ;else branch to find next unique item.
- L8BB4: RTS ;
- ;The following routine sets the item bits for aquired items in addresses $6988 thru $698E.-->
- ;Items 1 thru 7 masked in $6988, 8 thru 15 in $6989, etc.
- UniqueItemFound:
- L8BB5:* TXA ;
- L8BB6: JSR Adiv8 ;($C2C0)Divide by 8.
- L8BB9: STA $05 ;Shifts 5 MSBs to LSBs of item # and saves results in $05.
- L8BBB: JSR Amul8 ;($C2C6)Multiply by 8.
- L8BBE: STA $02 ;Restores 5 MSBs of item # and drops 3 LSBs; saves in $02.
- L8BC0: TXA ;
- L8BC1: SEC ;
- L8BC2: SBC $02 ;
- L8BC4: STA $06 ;Remove 5 MSBs and stores 3 LSBs in $06.
- L8BC6: LDX $05 ;
- L8BC8: LDA PasswordByte00,X ;
- L8BCB: LDY $06 ;
- L8BCD: ORA PasswordBitmaskTbl,Y ;
- L8BD0: STA PasswordByte00,X ;Masks each unique item in the proper item address-->
- L8BD3: RTS ;(addresses $6988 thru $698E).
- LoadUniqueItems:
- L8BD4: LDA #$00 ;
- L8BD6: STA NumberOfUniqueItems ;
- L8BD9: STA $05 ;$05 offset of password byte currently processing(0 thru 7).
- L8BDB: STA $06 ;$06 bit of password byte currently processing(0 thru 7).
- L8BDD: LDA #$3B ;
- L8BDF: STA $07 ;Maximum number of unique items(59 or #$3B).
- L8BE1: LDY $05 ;
- L8BE3: LDA PasswordByte00,Y ;
- L8BE6: STA $08 ;$08 stores contents of password byte currently processing.
- L8BE8: LDX #$00 ;
- L8BEA: STX $09 ;Stores number of unique items processed(#$0 thru #$3B).
- L8BEC: LDX $06 ;
- L8BEE: BEQ ++ ;If start of new byte, branch.
- L8BF0: LDX #$01 ;
- L8BF2: STX $02 ;
- L8BF4: CLC ;
- L8BF5:* ROR ;
- L8BF6: STA $08 ;This code does not appear to ever be executed.
- L8BF8: LDX $02 ;
- L8BFA: CPX $06 ;
- L8BFC: BEQ + ;
- L8BFE: INC $02 ;
- L8C00: JMP - ;
- ProcessNextItem:
- L8C03: LDY $05 ;Locates next password byte to process-->
- L8C05: LDA PasswordByte00,Y ;and loads it into $08.
- L8C08: STA $08 ;
- ProcessNewItemByte:
- L8C0A:* LDA $08 ;
- L8C0C: ROR ;Rotates next bit to be processed to the carry flag.
- L8C0D: STA $08 ;
- L8C0F: BCC + ;
- L8C11: JSR SamusHasItem ;($8C39)Store item in unique item history.
- L8C14:* LDY $06 ;If last bit of item byte has been-->
- L8C16: CPY #$07 ;checked, move to next byte.
- L8C18: BCS + ;
- L8C1A: INC $06 ;
- L8C1C: INC $09 ;
- L8C1E: LDX $09 ;If all 59 unique items have been-->
- L8C20: CPX $07 ;searched through, exit.
- L8C22: BCS ++ ;
- L8C24: JMP ProcessNewItemByte ;($8C0A)Repeat routine for next item byte.
- L8C27:* LDY #$00 ;
- L8C29: STY $06 ;
- L8C2B: INC $05 ;
- L8C2D: INC $09 ;
- L8C2F: LDX $09 ;If all 59 unique items have been-->
- L8C31: CPX $07 ;searched through, exit.
- L8C33: BCS + ;
- L8C35: JMP ProcessNextItem ;($8C03)Process next item.
- L8C38:* RTS ;
- SamusHasItem:
- L8C39: LDA $05 ;$05 becomes the upper part of the item offset-->
- L8C3B: JSR Amul8 ;while $06 becomes the lower part of the item offset.
- L8C3E: CLC ;
- L8C3F: ADC $06 ;
- L8C41: ASL ;* 2. Each item is two bytes in length.
- L8C42: TAY ;
- L8C43: LDA ItemData+1,Y ;
- L8C46: STA $01 ;$00 and $01 store the two bytes of-->
- L8C48: LDA ItemData,Y ;the unique item to process.
- L8C4B: STA $00 ;
- L8C4D: LDY NumberOfUniqueItems ;
- L8C50: STA UniqueItemHistory,Y ;Store the two bytes of the unique item-->
- L8C53: LDA $01 ;in RAM in the unique item history.
- L8C55: INY ;
- L8C56: STA UniqueItemHistory,Y ;
- L8C59: INY ;
- L8C5A: STY NumberOfUniqueItems ;Keeps a running total of unique items.
- L8C5D: RTS ;
- CheckPassword:
- L8C5E: JSR ConsolidatePassword ;($8F60)Convert password characters to password bytes.
- L8C61: JSR ValidatePassword ;($8DDE)Verify password is correct.
- L8C64: BCS + ;Branch if incorrect password.
- L8C66: JMP InitializeGame ;($92D4)Preliminary housekeeping before game starts.
- L8C69:* LDA MultiSFXFlag ;
- L8C6C: ORA #$01 ;Set IncorrectPassword SFX flag.
- L8C6E: STA MultiSFXFlag ;
- L8C71: LDA #$0C ;
- L8C73: STA Timer3 ;Set Timer3 time for 120 frames (2 seconds).
- L8C75: LDA #$18 ;
- L8C77: STA TitleRoutine ;Run EnterPassword routine.
- L8C79: RTS ;
- CalculatePassword:
- L8C7A: LDA #$00 ;
- L8C7C: LDY #$0F ;Clears values at addresses -->
- L8C7E:* STA PasswordByte00,Y ;$6988 thru $6997 and -->
- L8C81: STA PasswordChar00,Y ;$699A thru $69A9.
- L8C84: DEY ;
- L8C85: BPL - ;
- L8C87: JSR ProcessUniqueItems ;($8B79)Determine what items Samus has collected.
- L8C8A: LDA PasswordByte07 ;
- L8C8D: AND #$04 ;Check to see if mother brain has been defeated,-->
- L8C8F: BEQ + ;If so, restore mother brain, zeebetites and-->
- L8C91: LDA #$00 ;all missile doors in Tourian as punishment for-->
- L8C93: STA PasswordByte07 ;dying after mother brain defeated. Only reset in the-->
- L8C96: LDA PasswordByte06 ;password. Continuing without resetting will not-->
- L8C99: AND #$03 ;restore those items.
- L8C9B: STA PasswordByte06 ;
- L8C9E:* LDA InArea ;Store InArea in bits 0 thru 5 in-->
- L8CA0: AND #$3F ;address $6990.
- L8CA2: LDY JustInBailey ;
- L8CA5: BEQ + ;
- L8CA7: ORA #$80 ;Sets MSB of $6990 is Samus is suitless.
- L8CA9:* STA PasswordByte08 ;
- L8CAC: LDA SamusGear ;
- L8CAF: STA PasswordByte09 ;SamusGear stored in $6991.
- L8CB2: LDA MissileCount ;
- L8CB5: STA PasswordByte0A ;MissileCount stored in $6992.
- L8CB8: LDA #$00 ;
- L8CBA: STA $00 ;
- L8CBC: LDA KraidStatueStatus ;
- L8CBF: AND #$80 ;
- L8CC1: BEQ + ;If statue not up, branch.
- L8CC3: LDA $00 ;
- L8CC5: ORA #$80 ;Set bit 7 of $00-->
- L8CC7: STA $00 ;if Kraid statue up.
- L8CC9:* LDA KraidStatueStatus ;
- L8CCC: AND #$01 ;
- L8CCE: BEQ + ;Branch if Kraid not yet defeated.
- L8CD0: LDA $00 ;
- L8CD2: ORA #$40 ;Set bit 6 of $00-->
- L8CD4: STA $00 ;If Kraid defeated.
- L8CD6:* LDA RidleyStatueStatus ;
- L8CD9: AND #$80 ;
- L8CDB: BEQ + ;Branch if Ridley statue not up.
- L8CDD: LDA $00 ;
- L8CDF: ORA #$20 ;Set bit 5 of $00-->
- L8CE1: STA $00 ;if Ridley statue up.
- L8CE3:* LDA RidleyStatueStatus ;
- L8CE6: AND #$02 ;
- L8CE8: BEQ + ;Branch if Ridley not yet defeated.
- L8CEA: LDA $00 ;
- L8CEC: ORA #$10 ;Set bit 4 of $00-->
- L8CEE: STA $00 ;if Ridley defeated.
- L8CF0:* LDA $00 ;
- L8CF2: STA PasswordByte0F ;Stores statue statuses in 4 MSB at $6997.
- L8CF5: LDY #$03 ;
- L8CF7:* LDA SamusAge,Y ;Store SamusAge in $6993,-->
- L8CFA: STA PasswordByte0B,Y ;SamusAge+1 in $6994 and-->
- L8CFD: DEY ;SamusAe+2 in $6995.
- L8CFE: BPL - ;
- L8D00:* JSR $C000 ;
- L8D03: LDA RandomNumber1 ;
- L8D05: AND #$0F ;Store the value of $2E at $6998-->
- L8D07: BEQ - ;When any of the 4 LSB are set. (Does not-->
- L8D09: STA PasswordByte10 ;allow RandomNumber1 to be a multiple of 16).
- L8D0C: JSR PasswordChecksumAndScramble ;($8E17)Calculate checksum and scramble password.
- L8D0F: JMP LoadPasswordChar ;($8E6C)Calculate password characters.
- LoadPasswordData:
- L8D12: LDA NARPASSWORD ;If invincible Samus active, skip-->
- L8D15: BNE +++ ;further password processing.
- L8D17: JSR LoadUniqueItems ;($8BD4)Load unique items from password.
- L8D1A: JSR LoadTanksAndMissiles ;($8D3D)Calculate number of missiles from password.
- L8D1D: LDY #$00 ;
- L8D1F: LDA PasswordByte08 ;If MSB in PasswordByte08 is set,-->
- L8D22: AND #$80 ;Samus is not wearing her suit.
- L8D24: BEQ + ;
- L8D26: INY ;
- L8D27:* STY JustInBailey ;
- L8D2A: LDA PasswordByte08 ;Extract first 5 bits from PasswordByte08-->
- L8D2D: AND #$3F ;and use it to determine starting area.
- L8D2F: STA InArea ;
- L8D31: LDY #$03 ;
- L8D33:* LDA PasswordByte0B,Y ;Load Samus' age.
- L8D36: STA SamusAge,Y ;
- L8D39: DEY ;
- L8D3A: BPL - ;Loop to load all 3 age bytes.
- L8D3C:* RTS ;
- LoadTanksAndMissiles:
- L8D3D: LDA PasswordByte09 ;Loads Samus gear.
- L8D40: STA SamusGear ;Save Samus gear.
- L8D43: LDA PasswordByte0A ;Loads current number of missiles.
- L8D46: STA MissileCount ;Save missile count.
- L8D49: LDA #$00 ;
- L8D4B: STA $00 ;
- L8D4D: STA $02 ;
- L8D4F: LDA PasswordByte0F ;
- L8D52: AND #$80 ;If MSB is set, Kraid statue is up.
- L8D54: BEQ + ;
- L8D56: LDA $00 ;
- L8D58: ORA #$80 ;If Kraid statue is up, set MSB in $00.
- L8D5A: STA $00 ;
- L8D5C:* LDA PasswordByte0F ;
- L8D5F: AND #$40 ;If bit 6 is set, Kraid is defeated.
- L8D61: BEQ + ;
- L8D63: LDA $00 ;
- L8D65: ORA #$01 ;If Kraid is defeated, set LSB in $00.
- L8D67: STA $00 ;
- L8D69:* LDA $00 ;
- L8D6B: STA KraidStatueStatus ;Store Kraid status.
- L8D6E: LDA PasswordByte0F ;
- L8D71: AND #$20 ;If bit 5 is set, Ridley statue is up.
- L8D73: BEQ + ;
- L8D75: LDA $02 ;
- L8D77: ORA #$80 ;If Ridley statue is up, set MSB in $02.
- L8D79: STA $02 ;
- L8D7B:* LDA PasswordByte0F ;
- L8D7E: AND #$10 ;If bit 4 is set, Ridley is defeated.
- L8D80: BEQ + ;
- L8D82: LDA $02 ;
- L8D84: ORA #$02 ;If Ridley is defeated, set bit 1 of $02.
- L8D86: STA $02 ;
- L8D88:* LDA $02 ;
- L8D8A: STA RidleyStatueStatus ;Store Ridley status.
- L8D8D: LDA #$00 ;
- L8D8F: STA $00 ;
- L8D91: STA $02 ;
- L8D93: LDY #$00 ;
- L8D95:* LDA UniqueItemHistory+1,Y ;Load second byte of item and compare-->
- L8D98: AND #$FC ;the 6 MSBs to #$20. If it matches,-->
- L8D9A: CMP #$20 ;an energy tank has been found.
- L8D9C: BNE + ;
- L8D9E: INC $00 ;Increment number of energy tanks found.
- L8DA0: JMP IncrementToNextItem ;
- L8DA3:* CMP #$24 ;Load second byte of item and compare the 6 MSBs to-->
- L8DA5: BNE + ;#$24. If it matches, missiles have been found.
- L8DA7: INC $02 ;Increment number of missiles found.
- IncrementToNextItem:
- L8DA9:* INY ;
- L8DAA: INY ;Increment twice. Each item is 2 bytes.
- L8DAB: CPY #$84 ;7 extra item slots in unique item history.
- L8DAD: BCC --- ;Loop until all unique item history checked.
- L8DAF: LDA $00 ;
- L8DB1: CMP #$06 ;Ensure the Tank Count does not exceed 6-->
- L8DB3: BCC + ;tanks. Then stores the number of-->
- L8DB5: LDA #$06 ;energy tanks found in TankCount.
- L8DB7:* STA TankCount ;
- L8DBA: LDA #$00 ;
- L8DBC: LDY $02 ;
- L8DBE: BEQ ++ ;Branch if no missiles found.
- L8DC0: CLC ;
- L8DC1:* ADC #$05 ;
- L8DC3: DEY ;For every missile item found, this-->
- L8DC4: BNE - ;loop adds 5 missiles to MaxMissiles.
- L8DC6:* LDY KraidStatueStatus ;
- L8DC9: BEQ + ;
- L8DCB: ADC #$4B ;75 missiles are added to MaxMissiles-->
- L8DCD: BCS ++ ;if Kraid has been defeated and another-->
- L8DCF:* LDY RidleyStatueStatus ;75 missiles are added if the ridley-->
- L8DD2: BEQ ++ ;has been defeated.
- L8DD4: ADC #$4B ;
- L8DD6: BCC ++ ;
- L8DD8:* LDA #$FF ;If number of missiles exceeds 255, it stays at 255.
- L8DDA:* STA MaxMissiles ;
- L8DDD: RTS ;
- ValidatePassword:
- L8DDE: LDA NARPASSWORD ;
- L8DE1: BNE ++ ;If invincible Samus already active, branch.
- L8DE3: LDY #$0F ;
- L8DE5:* LDA PasswordChar00,Y ;
- L8DE8: CMP NARPASSWORDTbl,Y ;If NARPASSWORD was entered at the-->
- L8DEB: BNE + ;password screen, activate invincible-->
- L8DED: DEY ;Samus, else continue to process password.
- L8DEE: BPL - ;
- L8DF0: LDA #$01 ;
- L8DF2: STA NARPASSWORD ;
- L8DF5: BNE ++ ;
- L8DF7:* JSR UnscramblePassword ;($8E4E)Unscramble password.
- L8DFA: JSR PasswordChecksum ;($8E21)Calculate password checksum.
- L8DFD: CMP PasswordByte11 ;Verify proper checksum.
- L8E00: BEQ + ;
- L8E02: SEC ;If password is invalid, sets carry flag.
- L8E03: BCS ++ ;
- L8E05:* CLC ;If password is valid, clears carry flag.
- L8E06:* RTS ;
- ;The table below is used by the code above. It checks to see if NARPASSWORD has been entered.
- ;NOTE: any characters after the 16th character will be ignored if the first 16 characters
- ;match the values below.
- NARPASSWORDTbl:
- L8E07: .byte $17 ;N
- L8E08: .byte $0A ;A
- L8E09: .byte $1B ;R
- L8E0A: .byte $19 ;P
- L8E0B: .byte $0A ;A
- L8E0C: .byte $1C ;S
- L8E0D: .byte $1C ;S
- L8E0E: .byte $20 ;W
- L8E0F: .byte $18 ;O
- L8E10: .byte $1B ;R
- L8E11: .byte $0D ;D
- L8E12: .byte $00 ;0(or no entry).
- L8E13: .byte $00 ;0(or no entry).
- L8E14: .byte $00 ;0(or no entry).
- L8E15: .byte $00 ;0(or no entry).
- L8E16: .byte $00 ;0(or no entry).
- PasswordChecksumAndScramble:
- L8E17: JSR PasswordChecksum ;($8E21)Store the combined added value of-->
- L8E1A: STA PasswordByte11 ;addresses $6988 thu $6998 in $6999.
- L8E1D: JSR PasswordScramble ;($8E2D)Scramble password.
- L8E20: RTS ;
- PasswordChecksum:
- L8E21: LDY #$10 ;
- L8E23: LDA #$00 ;
- L8E25:* CLC ;Add the values at addresses-->
- L8E26: ADC PasswordByte00,Y ;$6988 thru $6998 together.
- L8E29: DEY ;
- L8E2A: BPL - ;
- L8E2C: RTS ;
- PasswordScramble:
- L8E2D: LDA PasswordByte10 ;
- L8E30: STA $02 ;
- L8E32:* LDA PasswordByte00 ;Store contents of $6988 in $00 for-->
- L8E35: STA $00 ;further processing after rotation.
- L8E37: LDX #$00 ;
- L8E39: LDY #$0F ;
- L8E3B:* ROR PasswordByte00,X ;Rotate right, including carry, all values in-->
- L8E3E: INX ;addresses $6988 thru $6997.
- L8E3F: DEY ;
- L8E40: BPL - ;
- L8E42: ROR $00 ;Rotate right $6988 to ensure the LSB-->
- L8E44: LDA $00 ;from address $6997 is rotated to the-->
- L8E46: STA PasswordByte00 ;MSB of $6988.
- L8E49: DEC $02 ;
- L8E4B: BNE -- ;Continue rotating until $02 = 0.
- L8E4D: RTS ;
- UnscramblePassword:
- L8E4E: LDA PasswordByte10 ;Stores random number used to scramble the password.
- L8E51: STA $02 ;
- L8E53:* LDA PasswordByte0F ;Preserve MSB that may have been rolled from $6988.
- L8E56: STA $00 ;
- L8E58: LDX #$0F ;
- L8E5A:* ROL PasswordByte00,X ;The following loop rolls left the first 16 bytes-->
- L8E5D: DEX ;of the password one time.
- L8E5E: BPL - ;
- L8E60: ROL $00 ;Rolls byte in $6997 to ensure MSB from $6988 is not lost.
- L8E62: LDA $00 ;
- L8E64: STA PasswordByte0F ;
- L8E67: DEC $02 ;
- L8E69: BNE -- ;Loop repeats the number of times decided by the random-->
- L8E6B: RTS ;number in $6998 to properly unscramble the password.
- ;The following code takes the 18 password bytes and converts them into 24 characters
- ;to be displayed to the player as the password. NOTE: the two MSBs will always be 0.
- LoadPasswordChar:
- L8E6C: LDY #$00 ;Password byte #$00.
- L8E6E: JSR SixUpperBits ;($8F2D)
- L8E71: STA PasswordChar00 ;Store results.
- L8E74: LDY #$00 ;Password bytes #$00 and #$01.
- L8E76: JSR TwoLowerAndFourUpper ;($8F33)
- L8E79: STA PasswordChar01 ;Store results.
- L8E7C: LDY #$01 ;Password bytes #$01 and #$02.
- L8E7E: JSR FourLowerAndTwoUpper ;($8F46)
- L8E81: STA PasswordChar02 ;Store results.
- L8E84: LDY #$02 ;Password byte #$02.
- L8E86: JSR SixLowerBits ;($8F5A)
- L8E89: STA PasswordChar03 ;Store results.
- L8E8C: LDY #$03 ;Password byte #$03.
- L8E8E: JSR SixUpperBits ;($8F2D)
- L8E91: STA PasswordChar04 ;Store results.
- L8E94: LDY #$03 ;Password bytes #$03 and #$04.
- L8E96: JSR TwoLowerAndFourUpper ;($8F33)
- L8E99: STA PasswordChar05 ;Store results.
- L8E9C: LDY #$04 ;Password bytes #$04 and #$05.
- L8E9E: JSR FourLowerAndTwoUpper ;($8F46)
- L8EA1: STA PasswordChar06 ;Store results.
- L8EA4: LDY #$05 ;Password byte #$05.
- L8EA6: JSR SixLowerBits ;($8F5A)
- L8EA9: STA PasswordChar07 ;Store results.
- L8EAC: LDY #$06 ;Password byte #$06.
- L8EAE: JSR SixUpperBits ;($8F2D)
- L8EB1: STA PasswordChar08 ;Store results.
- L8EB4: LDY #$06 ;Password bytes #$06 and #$07.
- L8EB6: JSR TwoLowerAndFourUpper ;($8F33)
- L8EB9: STA PasswordChar09 ;Store results.
- L8EBC: LDY #$07 ;Password bytes #$07 and #$08.
- L8EBE: JSR FourLowerAndTwoUpper ;($8F46)
- L8EC1: STA PasswordChar0A ;Store results.
- L8EC4: LDY #$08 ;Password byte #$08.
- L8EC6: JSR SixLowerBits ;($8F5A)
- L8EC9: STA PasswordChar0B ;Store results.
- L8ECC: LDY #$09 ;Password byte #$09.
- L8ECE: JSR SixUpperBits ;($8F2D)
- L8ED1: STA PasswordChar0C ;Store results.
- L8ED4: LDY #$09 ;Password bytes #$09 and #$0A.
- L8ED6: JSR TwoLowerAndFourUpper ;($8F33)
- L8ED9: STA PasswordChar0D ;Store results.
- L8EDC: LDY #$0A ;Password bytes #$0A and #$0B.
- L8EDE: JSR FourLowerAndTwoUpper ;($8F46)
- L8EE1: STA PasswordChar0E ;Store results.
- L8EE4: LDY #$0B ;Password byte #$0B.
- L8EE6: JSR SixLowerBits ;($8F5A)
- L8EE9: STA PasswordChar0F ;Store results.
- L8EEC: LDY #$0C ;Password byte #$0C.
- L8EEE: JSR SixUpperBits ;($8F2D)
- L8EF1: STA PasswordChar10 ;Store results.
- L8EF4: LDY #$0C ;Password bytes #$0C and #$0D.
- L8EF6: JSR TwoLowerAndFourUpper ;($8F33)
- L8EF9: STA PasswordChar11 ;Store results.
- L8EFC: LDY #$0D ;Password bytes #$0D and #$0E.
- L8EFE: JSR FourLowerAndTwoUpper ;($8F46)
- L8F01: STA PasswordChar12 ;Store results.
- L8F04: LDY #$0E ;Password byte #$0E.
- L8F06: JSR SixLowerBits ;($8F5A)
- L8F09: STA PasswordChar13 ;Store results.
- L8F0C: LDY #$0F ;Password byte #$0F.
- L8F0E: JSR SixUpperBits ;($8F2D)
- L8F11: STA PasswordChar14 ;Store results.
- L8F14: LDY #$0F ;Password bytes #$0F and #$10.
- L8F16: JSR TwoLowerAndFourUpper ;($8F33)
- L8F19: STA PasswordChar15 ;Store results.
- L8F1C: LDY #$10 ;Password bytes #$10 and #$11.
- L8F1E: JSR FourLowerAndTwoUpper ;($8F46)
- L8F21: STA PasswordChar16 ;Store results.
- L8F24: LDY #$11 ;Password byte #$11.
- L8F26: JSR SixLowerBits ;($8F5A)
- L8F29: STA PasswordChar17 ;Store results.
- L8F2C: RTS ;
- SixUpperBits:
- L8F2D: LDA PasswordByte00,Y ;Uses six upper bits to create a new byte.-->
- L8F30: LSR ;Bits are right shifted twice and two lower-->
- L8F31: LSR ;bits are discarded.
- L8F32: RTS ;
- TwoLowerAndFourUpper:
- L8F33: LDA PasswordByte00,Y ;
- L8F36: AND #$03 ;Saves two lower bits and stores them-->
- L8F38: JSR Amul16 ;($C2C5)in bits 4 and 5.
- L8F3B: STA $00 ;
- L8F3D: LDA PasswordByte01,Y ;Saves upper 4 bits and stores them-->
- L8F40: JSR Adiv16 ;($C2BF)bits 0, 1, 2 and 3.
- L8F43: ORA $00 ;Add two sets of bits together to make a byte-->
- L8F45: RTS ;where bits 6 and 7 = 0.
- FourLowerAndTwoUpper:
- L8F46: LDA PasswordByte00,Y ;
- L8F49: AND #$0F ;Keep lower 4 bits.
- L8F4B: ASL ;Move lower 4 bits to bits 5, 4, 3 and 2.
- L8F4C: ASL ;
- L8F4D: STA $00 ;
- L8F4F: LDA PasswordByte01,Y ;Move upper two bits-->
- L8F52: ROL ;to bits 1 and 0.
- L8F53: ROL ;
- L8F54: ROL ;
- L8F55: AND #$03 ;Add two sets of bits together to make a byte-->
- L8F57: ORA $00 ;where bits 6 and 7 = 0.
- L8F59: RTS ;
- SixLowerBits:
- L8F5A: LDA PasswordByte00,Y ;Discard bits 6 and 7.
- L8F5D: AND #$3F ;
- L8F5F: RTS
- ;The following routine converts the 24 user entered password characters into the 18 password
- ;bytes used by the program to store Samus' stats and unique item history.
- ConsolidatePassword:
- L8F60: LDY #$00 ;Password characters #$00 and #$01.
- L8F62: JSR SixLowerAndTwoUpper ;($8FF1)
- L8F65: STA PasswordByte00 ;Store results.
- L8F68: LDY #$01 ;Password characters #$01 and #$02.
- L8F6A: JSR FourLowerAndFiveThruTwo ;($9001)
- L8F6D: STA PasswordByte01 ;Store results.
- L8F70: LDY #$02 ;Password characters #$02 and #$03.
- L8F72: JSR TwoLowerAndSixLower ;($9011)
- L8F75: STA PasswordByte02 ;Store results.
- L8F78: LDY #$04 ;Password characters #$04 and #$05.
- L8F7A: JSR SixLowerAndTwoUpper ;($8FF1)
- L8F7D: STA PasswordByte03 ;Store results.
- L8F80: LDY #$05 ;Password characters #$05 and #$05.
- L8F82: JSR FourLowerAndFiveThruTwo ;($9001)
- L8F85: STA PasswordByte04 ;Store results.
- L8F88: LDY #$06 ;Password characters #$06 and #$07.
- L8F8A: JSR TwoLowerAndSixLower ;($9011)
- L8F8D: STA PasswordByte05 ;Store results.
- L8F90: LDY #$08 ;Password characters #$08 and #$09.
- L8F92: JSR SixLowerAndTwoUpper ;($8FF1)
- L8F95: STA PasswordByte06 ;Store results.
- L8F98: LDY #$09 ;Password characters #$09 and #$0A.
- L8F9A: JSR FourLowerAndFiveThruTwo ;($9001)
- L8F9D: STA PasswordByte07 ;Store results.
- L8FA0: LDY #$0A ;Password characters #$0A and #$0B.
- L8FA2: JSR TwoLowerAndSixLower ;($9011)
- L8FA5: STA PasswordByte08 ;Store results.
- L8FA8: LDY #$0C ;Password characters #$0C and #$0D.
- L8FAA: JSR SixLowerAndTwoUpper ;($8FF1)
- L8FAD: STA PasswordByte09 ;Store results.
- L8FB0: LDY #$0D ;Password characters #$0D and #$0E.
- L8FB2: JSR FourLowerAndFiveThruTwo ;($9001)
- L8FB5: STA PasswordByte0A ;Store results.
- L8FB8: LDY #$0E ;Password characters #$0E and #$0F.
- L8FBA: JSR TwoLowerAndSixLower ;($9011)
- L8FBD: STA PasswordByte0B ;Store results.
- L8FC0: LDY #$10 ;Password characters #$10 and #$11.
- L8FC2: JSR SixLowerAndTwoUpper ;($8FF1)
- L8FC5: STA PasswordByte0C ;Store results.
- L8FC8: LDY #$11 ;Password characters #$11 and #$12.
- L8FCA: JSR FourLowerAndFiveThruTwo ;($9001)
- L8FCD: STA PasswordByte0D ;Store results.
- L8FD0: LDY #$12 ;Password characters #$12 and #$13.
- L8FD2: JSR TwoLowerAndSixLower ;($9011)
- L8FD5: STA PasswordByte0E ;Store results.
- L8FD8: LDY #$14 ;Password characters #$15 and #$15.
- L8FDA: JSR SixLowerAndTwoUpper ;($8FF1)
- L8FDD: STA PasswordByte0F ;Store results.
- L8FE0: LDY #$15 ;Password characters #$15 and #$16.
- L8FE2: JSR FourLowerAndFiveThruTwo ;($9001)
- L8FE5: STA PasswordByte10 ;Store results.
- L8FE8: LDY #$16 ;Password characters #$16 and #$17.
- L8FEA: JSR TwoLowerAndSixLower ;($9011)
- L8FED: STA PasswordByte11 ;Store results.
- L8FF0: RTS ;
- SixLowerAndTwoUpper:
- L8FF1: LDA PasswordChar00,Y ;Remove upper two bits and transfer-->
- L8FF4: ASL ;lower six bits to upper six bits.
- L8FF5: ASL ;
- L8FF6: STA $00 ;
- L8FF8: LDA PasswordChar01,Y ;Move bits 4and 5 to lower two-->
- L8FFB: JSR Adiv16 ;($C2BF)bits and discard the rest.
- L8FFE: ORA $00 ;Combine the two bytes together.
- L9000: RTS ;
- FourLowerAndFiveThruTwo:
- L9001: LDA PasswordChar00,Y ;Take four lower bits and transfer-->
- L9004: JSR Amul16 ;($C2C5)them to upper four bits. Discard the rest.
- L9007: STA $00 ;
- L9009: LDA PasswordChar01,Y ;Remove two lower bits and transfer-->
- L900C: LSR ;bits 5 thru 2 to lower four bits.
- L900D: LSR ;
- L900E: ORA $00 ;Combine the two bytes together.
- L9010: RTS ;
- TwoLowerAndSixLower:
- L9011: LDA PasswordChar00,Y ;Shifts two lower bits to two higest bits-->
- L9014: ROR ;and discards the rest
- L9015: ROR ;
- L9016: ROR ;
- L9017: AND #$C0 ;
- L9019: STA $00 ;
- L901B: LDA PasswordChar01,Y ;Add six lower bits to previous results.
- L901E: ORA $00 ;
- L9020: RTS ;
- PasswordBitmaskTbl:
- L9021: .byte $01, $02, $04, $08, $10, $20, $40, $80
- ;The following table contains the unique items in the game. The two bytes can be deciphered
- ;as follows:IIIIIIXX XXXYYYYY. I = item type, X = X coordinate on world map, Y = Y coordinate
- ;on world map. The items have the following values of IIIIII:
- ;High jump = 000001
- ;Long beam = 000010 (Not considered a unique item).
- ;Screw attack = 000011
- ;Maru Mari = 000100
- ;Varia suit = 000101
- ;Wave beam = 000110 (Not considered a unique item).
- ;Ice beam = 000111 (Not considered a unique item).
- ;Energy tank = 001000
- ;Missiles = 001001
- ;Missile door = 001010
- ;Bombs = 001100
- ;Mother brain = 001110
- ;1st Zeebetite = 001111
- ;2nd Zeebetite = 010000
- ;3rd Zeebetite = 010001
- ;4th Zeebetite = 010010
- ;5th Zeebetite = 010011
- ItemData:
- L9029: .word $104E ;Maru Mari at coord 02,0E (Item 0)
- L902B: .word $264B ;Missiles at coord 12,0B (Item 1)
- L902D: .word $28E5 ;Red door to long beam at coord 07,05 (Item 2)
- L902F: .word $2882 ;Red door to Tourian elevator at coord 05,02 (Item 3)
- L9031: .word $2327 ;Energy tank at coord 19,07 (Item 4)
- L9033: .word $2B25 ;Red door to bombs at coord 1A,05 (Item 5)
- L9035: .word $0325 ;Bombs at coord 19,05 (Item 6)
- L9037: .word $2A69 ;Red door to ice beam at coord 13,09 (Item 7)
- L9039: .word $2703 ;Missiles at coord 18,03 (Item 8)
- L903B: .word $2363 ;Energy tank at coord 1B,03 (Item 9)
- L903D: .word $29E2 ;Red door to varia suit at coord 0F,02 (Item 10)
- L903F: .word $15E2 ;Varia suit at coord 0F,02 (Item 11)
- L9041: .word $212E ;Energy tank at coord 09,0E (Item 12)
- L9043: .word $264E ;Missiles at coord 12,0E (Item 13)
- L9045: .word $262F ;Missiles at coord 11,0F (Item 14)
- L9047: .word $2B4C ;Red door to ice beam at coord 1B,0C (Item 15)
- L9049: .word $276A ;Missiles at coord 1B,0A (Item 16)
- L904B: .word $278A ;Missiles at coord 1C,0A (Item 17)
- L904D: .word $278B ;Missiles at coord 1C,0B (Item 18)
- L904F: .word $276B ;Missiles at coord 1B,0B (Item 19)
- L9051: .word $274B ;Missiles at coord 1A,0B (Item 20)
- L9053: .word $268F ;Missiles at coord 14,0F (Item 21)
- L9055: .word $266F ;Missiles at coord 13,0F (Item 22)
- L9057: .word $2B71 ;Red door to high jump at coord 1C,11 (Item 23)
- L9059: .word $0771 ;High jump at coord 1B,11 (Item 24)
- L905B: .word $29F0 ;Red door to screw attack at coord 0E,10 (Item 25)
- L905D: .word $0DF0 ;Screw attack at coord 0D,1D (Item 26)
- L905F: .word $2676 ;Missiles at coord 13,16 (Item 27)
- L9061: .word $2696 ;Misslies at coord 14,16 (Item 28)
- L9063: .word $2A55 ;Red door to wave beam at coord 1C,15 (Item 29)
- L9065: .word $2353 ;Energy tank at coord 1A,13 (Item 30)
- L9067: .word $2794 ;Missiles at coord 1C,14 (Item 31)
- L9069: .word $28F5 ;Red door at coord 07,15 (Item 32)
- L906B: .word $2535 ;Missiles at coord 09,15 (Item 33)
- L906D: .word $2495 ;Missiles at coord 04,15 (Item 34)
- L906F: .word $28F6 ;Red door at coord 07,16 (Item 35)
- L9071: .word $2156 ;Energy tank at coord 0A,16 (Item 36)
- L9073: .word $28F8 ;Red door at coord 07,18 (Item 37)
- L9075: .word $287B ;Red door at coord 03,1B (Item 38)
- L9077: .word $24BB ;Missiles at coord 05,1B (Item 39)
- L9079: .word $2559 ;Missiles at coord 0A,19 (Item 40)
- L907B: .word $291D ;Red door to Kraid at coord 08,1D (Item 41)
- L907D: .word $211D ;Energy tank at coord 08,1D(Kraid's room) (Item 42)
- L907F: .word $2658 ;Missiles at coord 12,18 (Item 43)
- L9081: .word $2A39 ;Red door at coord 11,19 (Item 44)
- L9083: .word $2239 ;Energy tank at coord 11,19 (Item 45)
- L9085: .word $269E ;Missiles at coord 14,1E (Item 46)
- L9087: .word $2A1D ;purple door at coord 10,1D(Ridley's room) (Item 47)
- L9089: .word $21FD ;Energy tank at coord 0F,1D (Item 48)
- L908B: .word $271B ;Missile at coord 18,1B (Item 49)
- L908D: .word $2867 ;Orange door at coord 03,07 (Item 50)
- L908F: .word $2927 ;Red door at coord 09,07 (Item 51)
- L9091: .word $292B ;Red door at coord 0A,0B (Item 52)
- L9093: .word $3C00 ;1st Zeebetite in mother brain room (Item 53)
- L9095: .word $4000 ;2nd Zeebetite in mother brain room (Item 54)
- L9097: .word $4400 ;3rd Zeebetite in mother brain room (Item 55)
- L9099: .word $4800 ;4th Zeebetite in mother brain room (Item 56)
- L909B: .word $4C00 ;5th Zeebetite in mother brain room (Item 57)
- L909D: .word $3800 ;Mother brain (Item 58)
- ClearAll:
- L909F: jsr ScreenOff ;($C439)Turn screen off.
- L90A2: jsr ClearNameTables ;Turn off screen, clear sprites and name tables.
- L90A5: jsr EraseAllSprites ;
- L90A8: lda PPUCNT0ZP ;Set Name table address to $2000.
- L90AA: and #$FC ;
- L90AC: sta PPUCNT0ZP ;
- L90AE: lda #$00 ;
- L90B0: sta ScrollY ;Reset scroll offsets.
- L90B2: sta ScrollX ;
- L90B4: jsr WaitNMIPass ;($C42C)Wait for NMI to end.
- L90B7: jmp VBOffAndHorzWrite ;($C47D)Set PPU for horizontal write and turn off VBlank.
- StartContinueScreen:
- L90BA: jsr ClearAll ;($909F)Turn off screen, erase sprites and nametables.
- L90BD: ldx #$84 ;Low address for PPU write.
- L90BF: ldy #$99 ;High address for PPU write.
- L90C1: jsr PreparePPUProcess ;($9449)Clears screen and writes "START CONTINUE".
- L90C4: LDY #$00 ;
- L90C6: STY StartContinue ;Set selection sprite at START.
- L90C9: LDA #$0D ;
- L90CB: STA PalDataPending ;Change palette and title routine.
- L90CD: LDA #$16 ;Next routine is ChooseStartContinue.
- L90CF: STA TitleRoutine ;
- TurnOnDisplay:
- L90D1: JSR NMIOn ;($C487)Turn on the nonmaskable interrupt.
- L90D4: JMP ScreenOn ;($C447)Turn screen on.
- ChooseStartContinue:
- L90D7: LDA Joy1Change ;
- L90D9: AND #$30 ;Checks both select and start buttons.
- L90DB: CMP #$10 ;Check if START has been pressed.
- L90DD: BNE ++ ;Branch if START not pressed.
- L90DF: LDY StartContinue ;
- L90E2: BNE + ;if CONTINUE selected, branch.
- L90E4: JMP InitializeStats ;($932B)Zero out all stats.
- L90E7:* LDY #$17 ;Next routine is LoadPasswordScreen.
- L90E9: STY TitleRoutine ;
- L90EB:* CMP #$20 ;check if SELECT has been pressed.
- L90ED: BNE + ;Branch if SELECT not pressed.
- L90EF: LDA StartContinue ;
- L90F2: EOR #$01 ;Chooses between START and CONTINUE-->
- L90F4: STA StartContinue ;on game select screen.
- L90F7: LDA TriangleSFXFlag ;
- L90FA: ORA #$08 ;Set SFX flag for select being pressed.-->
- L90FC: STA TriangleSFXFlag ;Uses triangle channel.
- L90FF:* LDY StartContinue ;
- L9102: LDA StartContTbl,Y ;Get y pos of selection sprite.
- L9105: STA Sprite00RAM ;
- L9108: LDA #$6E ;Load sprite info for square selection sprite.
- L910A: STA Sprite00RAM+1 ;
- L910D: LDA #$03 ;
- L910F: STA Sprite00RAM+2 ;
- L9112: LDA #$50 ;Set data for selection sprite.
- L9114: STA Sprite00RAM+3 ;
- L9117: RTS ;
- StartContTbl:
- L9118: .byte $60 ;Y sprite position for START.
- L9119: .byte $78 ;Y sprite position for CONTINUE.
- LoadPasswordScreen:
- L911A: JSR ClearAll ;($909F)Turn off screen, erase sprites and nametables.
- L911D: LDX #$E3 ;Loads PPU with info to display-->
- L911F: LDY #$99 ;PASS WORD PLEASE.
- L9121: JSR PreparePPUProcess ;($9449)Load "PASSWORD PLEASE" on screen.
- L9124: JSR InitGFX7 ;($C6D6)Loads the font for the password.
- L9127: JSR DisplayInputCharacters ;($940B)Write password character to screen.
- L912A: LDA #$13 ;
- L912C: STA PalDataPending ;Change palette.
- L912E: LDA #$00 ;
- L9130: STA InputRow ;Sets character select cursor to-->
- L9133: STA InputColumn ;upper left character (0).
- L9136: STA Timer3 ;
- L9138: LDA #$00 ;
- L913A: STA PasswordCursor ;Sets password cursor to password character 0.
- L913D: LDY #$00 ;
- L913F: STY PasswordStat00 ;Appears to have no function.
- L9142: INC TitleRoutine ;
- L9144: JMP TurnOnDisplay ;($90D1)Turn on screen and NMI.
- EnterPassword:
- L9147: JSR EraseAllSprites ;($C1A3)Remove sprites from screen.
- L914A: LDA Joy1Change ;
- L914C: AND #$10 ;Check to see if START has been pressed.
- L914E: BEQ + ;If not, branch.
- L9150: JMP CheckPassword ;($8C5E)Check if password is correct.
- L9153:* LDX #$01 ;
- L9155: STX PPUDataPending ;Prepare to write the password screen data to PPU.
- L9157: LDX PPUStrIndex ;
- L915A: LDA #$21 ;Upper byte of PPU string.
- L915C: JSR WritePPUByte ;($C36B)Write byte to PPU.
- L915F: LDA #$A8 ;Lower byte of PPU string.
- L9161: JSR WritePPUByte ;($C36B)Write byte to PPU.
- L9164: LDA #$0F ;PPU string length.
- L9166: JSR WritePPUByte ;($C36B)Write byte to PPU.
- L9169: LDA Timer3 ;
- L916B: BEQ + ;
- L916D: LDA #$59 ;
- L916F: STA $02 ;Writes 'ERROR TRY AGAIN' on the screen-->
- L9171: LDA #$87 ;if Timer3 is anything but #$00.
- L9173: STA $03 ;
- L9175: JMP ++ ;
- L9178:* LDA #$68 ;
- L917A: STA $02 ;
- L917C: LDA #$87 ;
- L917E: STA $03 ;Writes the blank lines that cover-->
- L9180:* LDY #$00 ;the message 'ERROR TRY AGAIN'.
- L9182:* LDA ($02),Y ;
- L9184: JSR WritePPUByte ;
- L9187: INY ;
- L9188: CPY #$0F ;
- L918A: BNE - ;
- L918C: LDA Joy1Change ;If button A pressed, branch.
- L918E: BMI + ;
- L9190: JMP CheckBackspace ;($91FB)Check if backspace pressed.
- L9193:* LDA TriangleSFXFlag ;Initiate BombLaunch SFX if a character-->
- L9196: ORA #$01 ;has been written to the screen.
- L9198: STA TriangleSFXFlag ;
- L919B: LDA PasswordCursor ;
- L919E: CMP #$12 ;Check to see if password cursor is on-->
- L91A0: BCC + ;character 19 thru 24. If not, branch.
- L91A2: CLC ;
- L91A3: ADC #$3E ;Will equal #$50 thru #$55.
- L91A5: JMP LoadRowAndColumn ;($91BF)
- L91A8:* CMP #$0C ;Check to see if password cursor is on-->
- L91AA: BCC + ;character 13 thru 18. If not, branch.
- L91AC: CLC ;
- L91AD: ADC #$3D ;Will equal #$49 thru #$4E.
- L91AF: JMP LoadRowAndColumn ;($91BF)
- L91B2:* CMP #$06 ;Check to see if password cursor is on-->
- L91B4: BCC + ;character 7 thru 12. If not, branch.
- L91B6: CLC ;
- L91B7: ADC #$0A ;Will equal #$10 thru #$15.
- L91B9: JMP LoadRowAndColumn ;($91BF)
- L91BC:* CLC ;
- L91BD: ADC #$09 ;Will equal #$09 thru #$0E.
- LoadRowAndColumn:
- L91BF:* STA $06 ;
- L91C1: LDA InputRow ;
- L91C4: ASL ;*2. address pointer is two bytes.
- L91C5: TAY ;
- L91C6: LDA PasswordRowTbl,Y ;Store lower byte of row pointer.
- L91C9: STA $00 ;
- L91CB: LDA PasswordRowTbl+1,Y ;Store upper byte of row pointer.
- L91CE: STA $01 ;
- L91D0: LDY InputColumn ;Uses InputColumn value to find proper index-->
- L91D3: LDA ($00),Y ;of current character selected.
- L91D5: PHA ;Temp storage of A.
- L91D6: STA TileInfo0 ;Store value of current character slected.
- L91D9: LDA #$11 ;
- L91DB: STA TileSize ;
- L91DE: LDX $06 ;Replace password character tile with-->
- L91E0: LDY #$21 ;the one selected by the player.
- L91E2: JSR PrepareEraseTiles ;($9450)
- L91E5: LDX PasswordCursor ;
- L91E8: PLA ;Store the currently selected password character-->
- L91E9: STA PasswordChar00,X ;in the proper PasswordChar RAM location.
- L91EC: LDA PasswordCursor ;
- L91EF: CLC ;
- L91F0: ADC #$01 ;
- L91F2: CMP #$18 ;
- L91F4: BCC + ;Increment PasswordCursor. If at last character,-->
- L91F6: LDA #$00 ;loop back to the first character.
- L91F8:* STA PasswordCursor ;
- CheckBackspace:
- L91FB: LDA Joy1Change ;
- L91FD: AND #$40 ;If button B (backspace) has not-->
- L91FF: BEQ ++ ;been pressed, branch.
- L9201: LDA PasswordCursor ;
- L9204: SEC ;Subtract 1 from PasswordCursor. If-->
- L9205: SBC #$01 ;PasswordCursor is negative, load-->
- L9207: BCS + ;PasswordCursor with #$17 (last character).
- L9209: LDA #$17 ;
- L920B:* STA PasswordCursor ;
- L920E:* LDY PasswordStat00 ;Appears to have no function.
- L9211: LDA FrameCount ;
- L9213: AND #$08 ;If FrameCount bit 3 not set, branch.
- L9215: BEQ +++ ;
- L9217: LDA #$3F ;
- L9219: LDX PasswordCursor ;Load A with #$3F if PasswordCursor is on-->
- L921C: CPX #$0C ;character 0 thru 11, else load it with #$4F.
- L921E: BCC + ;
- L9220: LDA #$4F ;
- L9222:* STA Sprite01RAM ;Set Y-coord of password cursor sprite.
- L9225: LDA #$6E ;
- L9227: STA Sprite01RAM+1 ;Set pattern for password cursor sprite.
- L922A: LDA #$20 ;
- L922C: STA Sprite01RAM+2 ;Set attributes for password cursor sprite.
- L922F: LDA PasswordCursor ;If the password cursor is at the 12th-->
- L9232: CMP #$0C ;character or less, branch.
- L9234: BCC + ;
- L9236: SBC #$0C ;Calculate how many characters the password cursor-->
- L9238:* TAX ;is from the left if on the second row of password.
- L9239: LDA CursorPosTbl,X ;Load X position of PasswordCursor.
- L923C: STA Sprite01RAM+3 ;
- L923F:* LDX InputRow ;Load X and Y with row and column-->
- L9242: LDY InputColumn ;of current character selected.
- L9245: LDA Joy1Retrig ;
- L9247: AND #$0F ;If no directional buttons are in-->
- L9249: BEQ ++++++++++ ;retrigger mode, branch.
- L924B: PHA ;Temp storage of A.
- L924C: LDA TriangleSFXFlag ;Initiate BeepSFX when the player pushes-->
- L924F: ORA #$08 ;a button on the directional pad.
- L9251: STA TriangleSFXFlag ;
- L9254: PLA ;Restore A.
- L9255: LSR ;Put status of right directional button in carry bit.
- L9256: BCC +++ ;Branch if right button has not been pressed.
- L9258: INY ;
- L9259: CPY #$0D ;Increment Y(column). If Y is greater than #$0C,-->
- L925B: BNE ++ ;increment X(Row). If X is greater than #$04,-->
- L925D: INX ;set X to #$00(start back at top row) and store-->
- L925E: CPX #$05 ;new row in InputRow.
- L9260: BNE + ;
- L9262: LDX #$00 ;
- L9264:* STX InputRow ;
- L9267: LDY #$00 ;Store new column in InputColumn.
- L9269:* STY InputColumn ;
- L926C:* LSR ;Put status of left directional button in carry bit.
- L926D: BCC +++ ;Branch if left button has not been pressed.
- L926F: DEY ;
- L9270: BPL ++ ;Decrement Y(column). If Y is less than #$00,-->
- L9272: DEX ;Decrement X(row). If X is less than #$00,-->
- L9273: BPL + ;set X to #$04(last row) and store new row-->
- L9275: LDX #$04 ;in InputRow.
- L9277:* STX InputRow ;
- L927A: LDY #$0C ;Store new column in InputColumn.
- L927C:* STY InputColumn ;
- L927F:* LSR ;Put status of down directional button in carry bit.
- L9280: BCC ++ ;Branch if down button has not been pressed.
- L9282: INX ;
- L9283: CPX #$05 ;Increment X(row). if X is greater than #$04,-->
- L9285: BNE + ;set X to #$00(first row) and store new-->
- L9287: LDX #$00 ;row in InputRow.
- L9289:* STX InputRow ;
- L928C:* LSR ;Put status of up directional button in carry bit.
- L928D: BCC ++ ;Branch if up button has not been pressed.
- L928F: DEX ;
- L9290: BPL + ;Decrement X(row). if X is less than #$00,-->
- L9292: LDX #$04 ;set X to #$04(last row) and store new-->
- L9294:* STX InputRow ;row in InputRow.
- L9297:* LDA FrameCount ;
- L9299: AND #$08 ;If FrameCount bit 3 not set, branch.
- L929B: BEQ + ;
- L929D: LDA CharSelectYTbl,X ;Set Y-coord of character selection sprite.
- L92A0: STA Sprite02RAM ;
- L92A3: LDA #$6E ;Set pattern for character selection sprite.
- L92A5: STA Sprite02RAM+1 ;
- L92A8: LDA #$20 ;Set attributes for character selection sprite.
- L92AA: STA Sprite02RAM+2 ;
- L92AD: LDA CharSelectXTbl,Y ;Set x-Coord of character selection sprite.
- L92B0: STA Sprite02RAM+3 ;
- L92B3:* RTS ;
- ;The following data does not appear to be used in the program.
- L92B4: .byte $21, $20
- ;The following table is used to determine the proper Y position of the character
- ;selection sprite on password entry screen.
- CharSelectYTbl:
- L92B6: .byte $77, $87, $97, $A7, $B7
- ;The following table is used to determine the proper X position of the character
- ;selection sprite on password entry screen.
- CharSelectXTbl:
- L92BB: .byte $20, $30, $40, $50, $60, $70, $80, $90, $A0, $B0, $C0, $D0, $E0
- ;When the PasswordCursor is on the second row of the password, the following table is used
- ;to determine the proper x position of the password cursor sprite(password characters 12-23).
- CursorPosTbl:
- L92C8: .byte $48, $50, $58, $60, $68, $70, $80, $88, $90, $98, $A0, $A8
- InitializeGame:
- L92D4: JSR ClearRAM_33_DF ;($C1D4)Clear RAM.
- L92D7: JSR ClearSamusStats ;($C578)Reset Samus stats for a new game.
- L92DA: JSR LoadPasswordData ;($8D12)Load data from password.
- L92DD: LDY #$00 ;
- L92DF: STY SpritePagePos ;
- L92E1: STY PageIndex ;Clear object data.
- L92E3: STY ObjectCntrl ;
- L92E5: STY ObjectHi ;
- L92E8: JSR SilenceMusic ;($CB8E)Turn off music.
- L92EB: LDA #$5A ;
- L92ED: STA AnimFrame ;Set animframe index. changed by initializing routines.
- L92F0: LDX #$01 ;x is the index into the position tables below.
- L92F2: LDA InArea ;Load starting area.
- L92F4: AND #$0F ;
- L92F6: BNE + ;If in area other than Brinstar, get second item in tables.
- L92F8: DEX ;Starting in Brinstar. Get forst item in each table.
- L92F9:* LDA RestartYPosTbl,X ;
- L92FC: STA ObjectY ;Set Samus restart y position on screen.
- L92FF: LDA RestartXPosTbl,X ;
- L9302: STA ObjectX ;Set Samus restart x position on screen.
- L9305: INC SamusStat02 ;The combination of SamusStat02 and 03 keep track of how-->
- L9308: BNE + ;many times Samus has died and beaten the game as they are-->
- L930A: INC SamusStat03 ;incremented every time this routine is run, but they are-->
- L930D:* LDA #$01 ;not accessed anywhere else.
- L930F: STA MainRoutine ;Initialize starting area.
- L9311: JSR ScreenNmiOff ;($C45D)Turn off screen.
- L9314: JSR LoadSamusGFX ;($C5DC)Load Samus GFX into pattern table.
- L9317: JSR NmiOn ;($C487)Turn on the non-maskable interrupt.
- L931A: LDA InArea ;Load area Samus is to start in.
- L931C: AND #$0F ;
- L931E: TAY ;
- L931F: LDA BankTable,Y ;Change to proper memory page.
- L9322: STA SwitchPending ;
- L9324: RTS
- ;The following two tables are used to find Samus y and x positions on the screen after the game
- ;restarts. The third entry in each table are not used.
- RestartYPosTbl:
- L9325: .byte $64 ;Brinstar
- L9326: .byte $8C ;All other areas.
- L9327: .byte $5C ;Not used.
- RestartXPosTbl:
- L9328: .byte $78 ;Brinstar
- L9329: .byte $78 ;All other areas.
- L932A: .byte $5C ;Not used.
- InitializeStats:
- L932B: LDA #$00 ;
- L932D: STA SamusStat00 ;
- L9330: STA TankCount ;
- L9333: STA SamusGear ;
- L9336: STA MissileCount ;
- L9339: STA MaxMissiles ;
- L933C: STA KraidStatueStatus ;Set all of Samus' stats to 0 when starting new game.
- L933F: STA RidleyStatueStatus ;
- L9342: STA SamusAge ;
- L9345: STA SamusAge+1 ;
- L9348: STA SamusAge+2 ;
- L934B: STA SamusStat01 ;
- L934E: STA AtEnding ;
- L9351: STA JustInBailey ;
- L9354: LDA #$02 ;
- L9356: STA SwitchPending ;Prepare to switch to Brinstar memory page.
- L9358: RTS ;
- DisplayPassword:
- L9359: LDA Timer3 ;Wait for "GAME OVER" to be displayed-->
- L935B: BNE $9324 ;for 160 frames (2.6 seconds).
- L935D: JSR ClearAll ;($909F)Turn off screen, erase sprites and nametables.
- L9360: LDX #$7F ;Low byte of start of PPU data.
- L9362: LDY #$93 ;High byte of start of PPU data.
- L9364: JSR PreparePPUProcess ;($9449)Clears screen and writes "PASS WORD".
- L9367: JSR InitGFX7 ;($C6D6)Loads the font for the password.
- L936A: JSR CalculatePassword ;($8C7A)Calculates the password.
- L936D: JSR NmiOn ;($C487)Turn on the nonmaskable interrupt.
- L9370: JSR PasswordToScreen ;($93C6)Displays password on screen.
- L9373: JSR WaitNMIPass ;($C42C)Wait for NMI to end.
- L9376: LDA #$13 ;
- L9378: STA PalDataPending ;Change palette.
- L937A: INC TitleRoutine ;
- L937C: JMP ScreenOn ;($C447)Turn screen on.
- ;Information below is for above routine to display "PASS WORD" on the screen.
- L937F: .byte $21 ;PPU memory high byte.
- L9380: .byte $4B ;PPU memory low byte.
- L9381: .byte $09 ;PPU string length.
- ; 'P A S S _ W O R D'
- L9382: .byte $19, $0A, $1C, $1C, $FF, $20, $18, $1B, $0D
- ;Information to be stored in attribute table 0.
- L938B: .byte $23 ;PPU memory high byte.
- L938C: .byte $D0 ;PPU memory low byte.
- L938D: .byte $48 ;RLE bit set, repeat entry 8 times.
- L938E: .byte $00 ;Clears line below "PASS WORD".
- L938F: .byte $23 ;PPU memory high byte.
- L9390: .byte $D8 ;PPU memory low byte.
- L9391: .byte $60 ;RLE bit set, repeat entry 32 times.
- L9392: .byte $55 ;Turn color on to display password characters.
- L9393: .byte $00 ;End PPU string write.
- WaitForSTART:
- L9394: LDA Joy1Change ;Waits for START to be ressed proceed-->
- L9396: AND #$10 ;past the GAME OVER screen.
- L9398: BEQ + ;If start not pressed, branch.
- L939A: JMP CheckPassword ;($8C5E)Check if password is correct.
- L939D:* RTS ;
- GameOver:
- L939E: JSR ClearAll ;($909F)Turn off screen, erase sprites and nametables.
- L93A1: LDX #$B9 ;Low byte of start of PPU data.
- L93A3: LDY #$93 ;High byte of start of PPU data.
- L93A5: JSR PreparePPUProcess ;($9449)Clears screen and writes "GAME OVER".
- L93A8: JSR InitGFX7 ;($C6D6)Loads the font for the password.
- L93AB: JSR NmiOn ;($C487)Turn on the nonmaskable interrupt.
- L93AE: LDA #$10 ;Load Timer3 with a delay of 160 frames-->
- L93B0: STA Timer3 ;(2.6 seconds) for displaying "GAME OVER".
- L93B2: LDA #$19 ;Loads TitleRoutine with -->
- L93B4: STA TitleRoutine ;DisplayPassword.
- L93B6: JMP ScreenOn ;($C447)Turn screen on.
- ;Information below is for above routine to display "GAME OVER" on the screen.
- L93B9: .byte $21 ;PPU memory high byte.
- L93BA: .byte $8C ;PPU memory low byte.
- L93BB: .byte $09 ;PPU string length.
- ; 'G A M E _ O V E R'
- L93BC: .byte $10, $0A, $16, $0E, $FF, $18, $1F, $0E, $1B
- L93C4: .byte $00 ;End PPU string write.
- PasswordToScreen:
- L93C6: JSR WaitNMIPass ;($C42C)Wait for NMI to end.
- L93C9: LDY #$05 ;Index to find password characters(base=$699A).
- L93CB: JSR LoadPasswordTiles ;($93F9)Load tiles on screen.
- L93CE: LDX #$A9 ;PPU low address byte.
- L93D0: LDY #$21 ;PPU high address byte.
- L93D2: JSR PrepareEraseTiles ;($9450)Erase tiles on screen.
- L93D5: LDY #$0B ;Index to find password characters(base=$699A).
- L93D7: JSR LoadPasswordTiles ;($93F9)Load tiles on screen.
- L93DA: LDX #$B0 ;PPU low address byte.
- L93DC: LDY #$21 ;PPU high address byte.
- L93DE: JSR PrepareEraseTiles ;($9450)Erase tiles on screen.
- L93E1: LDY #$11 ;Index to find password characters(base=$699A).
- L93E3: JSR LoadPasswordTiles ;($93F9)Load tiles on screen.
- L93E6: LDX #$E9 ;PPU low address byte.
- L93E8: LDY #$21 ;PPU high address byte.
- L93EA: JSR PrepareEraseTiles ;($9450)Erase tiles on screen.
- L93ED: LDY #$17 ;Index to find password characters(base=$699A).
- L93EF: JSR LoadPasswordTiles ;($93F9)Load tiles on screen.
- L93F2: LDX #$F0 ;PPU low address byte.
- L93F4: LDY #$21 ;PPU high address byte.
- L93F6: JMP PrepareEraseTiles ;($9450)Erase tiles on screen.
- LoadPasswordTiles:
- L93F9: LDA #$16 ;Tiles to replace are one block-->
- L93FB: STA TileSize ;high and 6 blocks long.
- L93FE: LDX #$05 ;
- L9400:* LDA PasswordChar00,Y ;
- L9403: STA TileInfo0,X ;
- L9406: DEY ;Transfer password characters to-->
- L9407: DEX ;TileInfo addresses.
- L9408: BPL- ;
- L940A: RTS ;
- DisplayInputCharacters:
- L940B: LDA PPUStatus ;Clear address latches.
- L940E: LDY #$00 ;
- L9410: TYA ;Initially sets $00 an $01.
- L9411: STA $00 ;to #$00.
- L9413: STA $01 ;Also, initialy sets x and y to #$00.
- L9415:* ASL ;
- L9416: TAX ;
- L9417: LDA PasswordRowsTbl,X ;
- L941A: STA PPUAddress ;
- L941D: LDA PasswordRowsTbl+1,X ;Displays the list of characters -->
- L9420: sTA PPUAddress ;to choose from on the password-->
- L9423: LDX #$00 ;entry screen.
- L9425:* LDA PasswordRow0,Y ;Base is $99A2.
- L9428: STA PPUIOReg ;
- L942B: LDA #$FF ;Blank tile.
- L942D: STA PPUIOReg ;
- L9430: INY ;
- L9431: INX ;
- L9432: CPX #$0D ;13 characters in current row?
- L9434: BNE - ;if not, add another character.
- L9436: INC $01 ;
- L9438: LDA $01 ;
- L943A: CMP #$05 ;5 rows?
- L943C: BNE -- ;If not, go to next row.
- L943E: RTS ;
- ;The table below is used by the code above to determine the positions
- ;of the five character rows on the password entry screen.
- PasswordRowsTbl:
- L943F: .byte $21, $E4 ;
- L9441: .byte $22, $24 ;The two entries in each row are the upper and lower address-->
- L9443: .byte $22, $64 ;bytes to start writing to the name table, respectively.
- L9445: .byte $22, $A4 ;
- L9447: .byte $22, $E4 ;
- PreparePPUProcess:
- L9449: stx $00 ;Lower byte of pointer to PPU string
- L944B: sty $01 ;Upper byte of pointer to PPU string
- L944D: jmp ProcessPPUString ;($C30C)
- PrepareEraseTiles:
- L9450: STX $00 ;PPU low address byte
- L9452: STY $01 ;PPU high address byte
- L9454: LDX #$80 ;
- L9456: LDY #$07 ;
- L9458: STX $02 ;Address of byte where tile size-->
- L945A: STY $03 ;of tile to be erased is stored.
- L945C: JMP EraseTile ;($C328)Erase the selected tiles.
- ;---------------------------------------[ Unused intro routines ]------------------------------------
- ;The following routines are intro routines that are not used in this version of the game. It
- ;appears that the intro routine was originally going to be more complex with a more advanced
- ;sprite control mechanism and name table writing routines. The intro routines are a mess! In
- ;addition to unused routines, there are several unused memory addresses that are written to but
- ;never read.
- UnusedIntroRoutine4:
- L945F: STX PPUStrIndex ;
- L9462: LDA #$00 ;
- L9464: STA PPUDataString,X ;The following unused routine writes something to the-->
- L9467: LDA #$01 ;PPU string and prepares for a PPU write.
- L9469: STA PPUDataPending ;
- L946B: RTS ;
- UnusedIntroRoutine5:
- L946C: STA $05 ;
- L946E: AND #$F0 ;
- L9470: LSR ;
- L9471: LSR ;
- L9472: LSR ;
- L9473: LSR ;
- L9474: JSR + ;
- L9477: LDA $05 ;Unused intro routine. It looks like originally the-->
- L9479: AND #$0F ;title routines were going to write data to the name-->
- L947B:* STA PPUDataString,X ;tables in the middle of the title sequences.
- L947E: INX ;
- L947F: TXA ;
- L9480: CMP #$55 ;
- L9482: BCC ++ ;
- L9484: LDX PPUStrIndex ;
- L9487:* LDA #$00 ;
- L9489: STA PPUDataString,X ;
- L948C: BEQ - ;
- L948E:* RTS ;
- UnusedIntroRoutine6:
- L948F: TYA ;
- L9490: PHA ;
- L9491: JSR Amul16 ;($C2C5)Multiply by 16.
- L9494: TAY ;
- L9495: LDA $684B,Y ;
- L9498: STA $0B ;
- L949A: LDA $684A,Y ;
- L949D: STA $0A ;
- L949F: JSR UnusedIntroRoutine8 ;($94DA)
- L94A2: LDA $06 ;
- L94A4: STA $683D,X ;Another unused intro routine.
- L94A7: LDA $07 ;
- L94A9: STA $683C,X ;
- L94AC: PLA ;
- L94AD: TAY ;
- L94AE: RTS ;
- UnusedIntroRoutine7:
- L94AF: TYA ;
- L94B0: PHA ;
- L94B1: JSR Amul16 ;($C2C5)Multiply by 16.
- L94B4: TAY ;
- L94B5: LDA $684D,Y ;
- L94B8: STA $0B ;
- L94BA: LDA $684C,Y ;
- L94BD: STA $0A ;
- L94BF: JSR UnusedIntroRoutine8 ;($94DA)
- L94C2: LDA $06 ;
- L94C4: STA $6834,X ;
- L94C7: LDA $07 ;
- L94C9: STA $6833,X ;
- L94CC: LDA $6842,Y ;Another unused intro routine.
- L94CF: PHA ;
- L94D0: TXA ;
- L94D1: LSR ;
- L94D2: TAY ;
- L94D3: PLA ;
- L94D4: STA $6839,Y ;
- L94D7: PLA ;
- L94D8: TAY ;
- L94D9: RTS ;
- UnusedIntroRoutine8:
- L94DA: LDA #$FF ;
- L94DC: STA $01 ;
- L94DE: STA $02 ;
- L94E0: STA $03 ;
- L94E2: SEC ;
- L94E3:* LDA $0A ;
- L94E5: SBC #$E8 ;
- L94E7: STA $0A ;
- L94E9: LDA $0B ;
- L94EB: SBC #$03 ;
- L94ED: STA $0B ;
- L94EF: INC $03 ;
- L94F1: BCS - ;
- L94F3: LDA $0A ;
- L94F5: ADC #$E8 ;
- L94F7: STA $0A ;
- L94F9: LDA $0B ;
- L94FB: ADC #$03 ;
- L94FD: STA $0B ;
- L94FF: LDA $0A ;
- L9501:* SEC ;Unused intro routine. Looks like the intro routines may-->
- L9502:* SBC #$64 ;have had more complicated sprite control routines-->
- L9504: INC $02 ;that it does now.
- L9506: BCS - ;
- L9508: DEC $0B ;
- L950A: BPL -- ;
- L950C: ADC #$64 ;
- L950E: SEC ;
- L950F:* SBC #$0A ;
- L9511: INC $01 ;
- L9513: BCS - ;
- L9515: ADC #$0A ;
- L9517: STA $06 ;
- L9519: LDA $01 ;
- L951B: JSR Amul16 ;($C2C5)Multiply by 16.
- L951E: ORA $06 ;
- L9520: STA $06 ;
- L9522: LDA $03 ;
- L9524: JSR Amul16 ;($C2C5)Multiply by 16.
- L9527: ORA $02 ;
- L9529: STA $07 ;
- L952B: RTS ;
- ;Not used.
- L952C: .byte $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF, $FF
- L953C: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00
- L954C: .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
- L955C: .byte $00, $00, $00, $00
- ;--------------------------------------[ Palette data ]---------------------------------------------
- ;The following table points to the palette data
- ;used in the intro and ending portions of the game.
- PaletteColorsPointerTable:
- L9560: .word Palette00 ;($9586)
- L9562: .word Palette01 ;($95AA)
- L9564: .word Palette02 ;($95CE)
- L9566: .word Palette03 ;($95F2)
- L9568: .word Palette04 ;($9616)
- L956A: .word Palette05 ;($963A)
- L956C: .word Palette06 ;($965E)
- L956E: .word Palette07 ;($9682)
- L9570: .word Palette08 ;($96A6)
- L9572: .word Palette09 ;($96CA)
- L9574: .word Palette0A ;($96EE)
- L9576: .word Palette0B ;($9712)
- L9578: .word Palette0C ;($9736)
- L957A: .word Palette0D ;($975A)
- L957C: .word Palette0E ;($977E)
- L957E: .word Palette0F ;($97A2)
- L9580: .word Palette10 ;($97C6)
- L9582: .word Palette11 ;($97EA)
- L9584: .word Palette12 ;($97F2)
- Palette00:
- L9586: .byte $3F ;Upper byte of PPU palette adress.
- L9587: .byte $00 ;Lower byte of PPU palette adress.
- L9588: .byte $20 ;Palette data length.
- ;The following values are written to the background palette:
- L9589: .byte $0F, $28, $18, $08, $0F, $29, $1B, $1A, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F
- ;The following values are written to the sprite palette:
- L9599: .byte $0F, $16, $1A, $27, $0F, $37, $3A, $1B, $0F, $17, $31, $37, $0F, $32, $22, $12
- L95A9: .byte $00 ;End Palette01 info.
- Palette01:
- L95AA: .byte $3F ;Upper byte of PPU palette adress.
- L95AB: .byte $00 ;Lower byte of PPU palette adress.
- L96AC: .byte $20 ;Palette data length.
- ;The following values are written to the background palette:
- L95AD: .byte $0F, $28, $18, $08, $0F, $29, $1B, $1A, $0F, $35, $35, $04, $0F, $35, $14, $04
- ;The following values are written to the sprite palette:
- L95BD: .byte $0F, $16, $1A, $27, $0F, $37, $3A, $1B, $0F, $17, $31, $37, $0F, $32, $22, $12
- L95CD: .byte $00 ;End Palette02 info.
- Palette02:
- L95CE: .byte $3F ;Upper byte of PPU palette adress.
- L95CF: .byte $00 ;Lower byte of PPU palette adress.
- L95D0: .byte $20 ;Palette data length.
- ;The following values are written to the background palette:
- L95D1: .byte $0F, $28, $18, $08, $0F, $29, $1B, $1A, $0F, $39, $39, $09, $0F, $39, $29, $09
- ;The following values are written to the sprite palette:
- L95E1: .byte $0F, $16, $1A, $27, $0F, $37, $3A, $1B, $0F, $17, $31, $37, $0F, $32, $22, $12
- L95F1: .byte $00 ;End Palette03 info.
- Palette03:
- L95F2: .byte $3F ;Upper byte of PPU palette adress.
- L95F3: .byte $00 ;Lower byte of PPU palette adress.
- L95F4: .byte $20 ;Palette data length.
- ;The following values are written to the background palette:
- L95F5: .byte $0F, $28, $18, $08, $0F, $29, $1B, $1A, $0F, $36, $36, $06, $0F, $36, $15, $06
- ;The following values are written to the sprite palette:
- L9605: .byte $0F, $16, $1A, $27, $0F, $37, $3A, $1B, $0F, $17, $31, $37, $0F, $32, $22, $12
- L9615: .byte $00 ;End Palette04 info.
- Palette04:
- L9616: .byte $3F ;Upper byte of PPU palette adress.
- L9617: .byte $00 ;Lower byte of PPU palette adress.
- L9618: .byte $20 ;Palette data length.
- ;The following values are written to the background palette:
- L9619: .byte $0F, $28, $18, $08, $0F, $29, $1B, $1A, $0F, $27, $27, $12, $0F, $27, $21, $12
- ;The following values are written to the sprite palette:
- L9629: .byte $0F, $16, $1A, $27, $0F, $31, $20, $1B, $0F, $17, $31, $37, $0F, $32, $22, $12
- L9639: .byte $00 ;End Palette05 info.
- Palette05:
- L963A: .byte $3F ;Upper byte of PPU palette adress.
- L963B: .byte $00 ;Lower byte of PPU palette adress.
- L963C: .byte $20 ;Palette data length.
- ;The following values are written to the background palette:
- L963D: .byte $0F, $28, $18, $08, $0F, $29, $1B, $1A, $0F, $01, $01, $0F, $0F, $01, $0F, $0F
- ;The following values are written to the sprite palette:
- L964D: .byte $0F, $16, $1A, $27, $0F, $37, $3A, $1B, $0F, $17, $31, $37, $0F, $32, $22, $12
- L965D: .byte $00 ;End Palette06 info.
- Palette06:
- L965E: .byte $3F ;Upper byte of PPU palette adress.
- L965F: .byte $00 ;Lower byte of PPU palette adress.
- L9660: .byte $20 ;Palette data length.
- ;The following values are written to the background palette:
- L9661: .byte $0F, $28, $18, $08, $0F, $29, $1B, $1A, $0F, $01, $01, $0F, $0F, $01, $01, $0F
- ;The following values are written to the sprite palette:
- L9671: .byte $0F, $16, $1A, $27, $0F, $37, $3A, $1B, $0F, $17, $31, $37, $0F, $32, $22, $12
- L9681: .byte $00 ;End Palette07 info.
- Palette07:
- L9682: .byte $3F ;Upper byte of PPU palette adress.
- L9683: .byte $00 ;Lower byte of PPU palette adress.
- L9684: .byte $20 ;Palette data length.
- ;The following values are written to the background palette:
- L9685: .byte $0F, $28, $18, $08, $0F, $29, $1B, $1A, $0F, $02, $02, $01, $0F, $02, $02, $01
- ;The following values are written to the sprite palette:
- L9695: .byte $0F, $16, $1A, $27, $0F, $37, $3A, $1B, $0F, $17, $31, $37, $0F, $32, $22, $12
- L96A5: .byte $00 ;End Palette08 info.
- Palette08:
- L96A6: .byte $3F ;Upper byte of PPU palette adress.
- L96A7: .byte $00 ;Lower byte of PPU palette adress.
- L96A8: .byte $20 ;Palette data length.
- ;The following values are written to the background palette:
- L96A9: .byte $0F, $28, $18, $08, $0F, $29, $1B, $1A, $0F, $02, $02, $01, $0F, $02, $01, $01
- ;The following values are written to the sprite palette:
- L96B9: .byte $0F, $16, $1A, $27, $0F, $37, $3A, $1B, $0F, $17, $31, $37, $0F, $32, $22, $12
- L96C9: .byte $00 ;End Palette09 info.
- Palette09:
- L96CA: .byte $3F ;Upper byte of PPU palette adress.
- L96CB: .byte $00 ;Lower byte of PPU palette adress.
- L96CC: .byte $20 ;Palette data length.
- ;The following values are written to the background palette:
- L96CD: .byte $0F, $28, $18, $08, $0F, $29, $1B, $1A, $0F, $12, $12, $02, $0F, $12, $12, $02
- ;The following values are written to the sprite palette:
- L96DD: .byte $0F, $16, $1A, $27, $0F, $37, $3A, $1B, $0F, $17, $31, $37, $0F, $32, $22, $12
- L96ED: .byte $00 ;End Palette0A info.
- Palette0A:
- L96EE: .byte $3F ;Upper byte of PPU palette adress.
- L96EF: .byte $00 ;Lower byte of PPU palette adress.
- L96F0: .byte $20 ;Palette data length.
- ;The following values are written to the background palette:
- L96F1: .byte $0F, $28, $18, $08, $0F, $29, $1B, $1A, $0F, $11, $11, $02, $0F, $11, $02, $02
- ;The following values are written to the sprite palette:
- L9701: .byte $0F, $16, $1A, $27, $0F, $37, $3A, $1B, $0F, $17, $31, $37, $0F, $32, $22, $12
- L9711: .byte $00 ;End Palette0B info.
- Palette0B:
- L9712: .byte $3F ;Upper byte of PPU palette adress.
- L9713: .byte $00 ;Lower byte of PPU palette adress.
- L9714: .byte $20 ;Palette data length.
- ;The following values are written to the background palette:
- L9715: .byte $0F, $28, $18, $08, $0F, $29, $1B, $1A, $0F, $31, $31, $01, $0F, $31, $11, $01
- ;The following values are written to the sprite palette:
- L9716: .byte $0F, $16, $1A, $27, $0F, $37, $3A, $1B, $0F, $17, $31, $37, $0F, $32, $22, $12
- L9735: .byte $00 ;End Palette0C info.
- Palette0C:
- L9736: .byte $3F ;Upper byte of PPU palette adress.
- L9737: .byte $00 ;Lower byte of PPU palette adress.
- L9738: .byte $20 ;Palette data length.
- ;The following values are written to the background palette:
- L9739: .byte $0F, $28, $18, $08, $0F, $12, $30, $21, $0F, $27, $28, $29, $0F, $31, $31, $01
- ;The following values are written to the sprite palette:
- L9749: .byte $0F, $16, $2A, $27, $0F, $12, $30, $21, $0F, $27, $24, $2C, $0F, $15, $21, $38
- L9759: .byte $00 ;End Palette0D info.
- Palette0D:
- L975A: .byte $3F ;Upper byte of PPU palette adress.
- L975B: .byte $00 ;Lower byte of PPU palette adress.
- L975C: .byte $20 ;Palette data length.
- ;The following values are written to the background palette:
- L975D: .byte $0F, $28, $18, $08, $0F, $29, $1B, $1A, $0F, $12, $12, $01, $0F, $12, $02, $01
- ;The following values are written to the sprite palette:
- L975E: .byte $0F, $16, $1A, $27, $0F, $37, $3A, $1B, $0F, $17, $31, $37, $0F, $32, $22, $12
- L977D: .byte $00 ;End Palette0E info.
- Palette0E:
- L977E: .byte $3F ;Upper byte of PPU palette adress.
- L977F: .byte $00 ;Lower byte of PPU palette adress.
- L9780: .byte $20 ;Palette data length.
- ;The following values are written to the background palette:
- L9781: .byte $0F, $28, $18, $08, $0F, $29, $1B, $1A, $0F, $02, $02, $0F, $0F, $02, $01, $0F
- ;The following values are written to the sprite palette:
- L9791: .byte $0F, $16, $1A, $27, $0F, $37, $3A, $1B, $0F, $17, $31, $37, $0F, $32, $22, $12
- L97A1: .byte $00 ;End Palette0F info.
- Palette0F:
- L97A2: .byte $3F ;Upper byte of PPU palette adress.
- L97A3: .byte $00 ;Lower byte of PPU palette adress.
- L97A4: .byte $20 ;Palette data length.
- ;The following values are written to the background palette:
- L97A5: .byte $0F, $28, $18, $08, $0F, $29, $1B, $1A, $0F, $01, $01, $0F, $0F, $01, $0F, $0F
- ;The following values are written to the sprite palette:
- L97B5: .byte $0F, $16, $1A, $27, $0F, $37, $3A, $1B, $0F, $17, $31, $37, $0F, $32, $22, $12
- L97C5: .byte $00 ;End Palette10 info.
- Palette10:
- L97C6: .byte $3F ;Upper byte of PPU palette adress.
- L97C7: .byte $00 ;Lower byte of PPU palette adress.
- L97C8: .byte $20 ;Palette data length.
- ;The following values are written to the background palette:
- L97C9: .byte $30, $28, $18, $08, $30, $29, $1B, $1A, $30, $30, $30, $30, $30, $30, $30, $30
- ;The following values are written to the sprite palette:
- L97D9: .byte $30, $16, $1A, $27, $30, $37, $3A, $1B, $30, $17, $31, $37, $30, $32, $22, $12
- L97E9: .byte $00 ;End Palette11 info.
- Palette11:
- L97EA: .byte $3F ;Upper byte of PPU palette adress.
- L97EB: .byte $00 ;Lower byte of PPU palette adress.
- L97EC: .byte $04 ;Palette data length.
- ;The following values are written to the background palette:
- L97ED: .byte $0F, $30, $30, $21
- L98F1: .byte $00 ;End Palette12 info.
- Palette12:
- L97F2: .byte $3F ;Upper byte of PPU palette adress.
- L97F3: .byte $00 ;Lower byte of PPU palette adress.
- L97F4: .byte $10 ;Palette data length.
- ;The following values are written to the background palette:
- L97F5: .byte $0F, $30, $30, $0F, $0F, $2A, $2A, $21, $0F, $31, $31, $0F, $0F, $2A, $2A, $21
- L9805: .byte $00 ;End Palette13 data.
- EndGamePal0B:
- L9806: .byte $3F ;Upper byte of PPU palette adress.
- L9807: .byte $00 ;Lower byte of PPU palette adress.
- L9808: .byte $10 ;Palette data length.
- ;The following values are written to the background palette:
- L9809: .byte $0F, $2C, $2C, $2C, $0F, $2C, $2C, $2C, $0F, $2C, $2C, $2C, $0F, $2C, $2C, $2C
- EndGamePal0C:
- L9819: .byte $3F ;Upper byte of PPU palette adress.
- L981A: .byte $10 ;Lower byte of PPU palette adress.
- L981B: .byte $50 ;Palette data length.
- L981C: .byte $0F ;Repeat bit set. Fill sprite palette with #$0F.
- L981D: .byte $00 ;End EndGamePal0C data.
- UpdateSpriteCoords:
- L981E: LDA IntroSpr0XRun,X ;Load sprite run(sprite x component).
- L9821: JSR CalcDisplacement ;($9871)Calculate sprite displacement in x direction.
- L9824: LDY IntroSpr0XDir,X ;Get byte describing if sprite increasing or decreasing pos.
- L9827: BPL + ;
- L9829: EOR #$FF ;If MSB is set, sprite is decreasing position. convert-->
- L982B: CLC ;value in A (result from CalcDisplacement) to twos compliment.
- L982C: ADC #$01 ;
- L982E:* CLC ;
- L982F: ADC IntroSpr0XCoord,X ;Add change to sprite x coord.
- L9832: STA IntroSpr0XCoord,X ;
- L9835: SEC ;
- L9836: SBC IntroSpr0XChange,X ;Subtract total sprite movemnt value from current sprite x pos.
- L9839: PHP ;Transfer processor status to A.
- L983A: PLA ;
- L983B: EOR IntroSpr0XDir,X ;Eor carry bit with direction byte to see if sprite has-->
- L983E: LSR ;reached its end point.
- L983F: BCC++ ;Branch if sprite has reached the end of x movement.
- L9841: LDA IntroSpr0YRise,X ;Load sprite rise(sprite y component).
- L9844: JSR CalcDisplacement ;($9871)Calculate sprite displacement in y direction.
- L9847: LDY IntroSpr0YDir,X ;Get byte describing if sprite increasing or decreasing pos.
- L984A: BPL + ;
- L984C: EOR #$FF ;If MSB is set, sprite is decreasing position. convert-->
- L984E: CLC ;value in A (result from CalcDisplacement) to twos compliment.
- L984F: ADC #$01 ;
- L9851:* CLC ;
- L9852: ADC IntroSpr0YCoord,X ;Add change to sprite y coord.
- L9855: STA IntroSpr0YCoord,X ;
- L9858: SEC ;
- L9859: SBC IntroSpr0YChange,X ;Subtract total sprite movemnt value from current sprite y pos.
- L985C: PHP ;Transfer processor status to A.
- L985D: PLA ;
- L985E: EOR IntroSpr0YDir,X ;Eor carry bit with direction byte to see if sprite has-->
- L9861: LSR ;reached its end point.
- L9862: BCS ++ ;Branch if sprite has not reached the end of y movement.
- L9864:* LDA IntroSpr0YChange,X ;After sprite has reached its final position, this code-->
- L9867: STA IntroSpr0YCoord,X ;explicitly writes final the x and y coords to to sprite-->
- L986A: LDA IntroSpr0XChange,X ;position addresses to make sure the sprites don't-->
- L986D: STA IntroSpr0XCoord,X ;overshoot their mark.
- L9870:* RTS ;
- CalcDisplacement:
- L9871: STA $04 ;
- L9873: LDA #$08 ;Time division. The higher the number, the slower the sprite.
- L9875: STA $00 ;
- L9877:* LSR $04 ;
- L9879: BCC + ;
- L987B: LDA FrameCount ;
- L987D: AND $00 ;Calculate the change in the sprite position by taking the-->
- L987F: BNE + ;value in a and dividing it by the time division. The time-->
- L9881: INC $04 ;time division in this case is #$08.
- L9883:* LSR $00 ;
- L9885: BNE -- ;
- L9887: LDA $04 ;
- L9889: RTS ;Return A/time.
- ;This function decrements the y coordinate of the 40 intro star sprites.
- DecSpriteYCoord:
- L988A: LDA TitleRoutine ;
- L988C: CMP #$1D ;
- L988E: BCS ++ ;If the end game is playing, branch to exit.
- L9890: LDA SpriteLoadPending ;
- L9892: BEQ ++ ;If no sprite load is pending, branch to exit.
- L9894: LDA FrameCount ;
- L9896: LSR ;
- L9897: BCS ++ ;If not on an odd numbered frame, branch to exit.
- L9899: LDX #$9F ;
- L989B:* DEC IntroStarSprite00,X ;Decrement y coord of the intro star sprites.
- L989E: DEC Sprite18RAM,X ;Decrement y coord of 40 sprites.
- L98A1: DEX ;
- L98A2: DEX ;
- L98A3: DEX ;Move to next sprite.
- L98A4: DEX ;
- L98A5: CPX #$FF ;
- L98A7: BNE - ;Loop 40 times.
- L98A9: LDA #$00 ;
- L98AB: STA SpriteLoadPending ;Sprite RAM load complete.
- L98AD:* RTS ;
- LoadStarSprites:
- L98AE: LDY #$9F ;
- L98B0:* LDA IntroStarSprite00,Y ;
- L98B3: STA Sprite18RAM,Y ;Store RAM contents of $6E00 thru $6E9F -->
- L98B6: DEY ;in sprite RAM at locations $0260 thru $02FF.
- L98B7: CPY #$FF ;
- L98B9: BNE - ;
- L98BB: LDA #$00 ;
- L98BD: STA SpriteLoadPending ;Set $C8 to #$00.
- L98BF: RTS ;
- ;The following values are loaded into RAM $6E00 thru $6E9F in InitBank0
- ;routine. These values are then loaded into sprite RAM at $0260 thru $02FF
- ;in above routine. They are the stars in the title screen.
- IntroStarsData:
- L98C0: .byte $73, $CC, $22, $F2, $48, $CD, $63, $EE, $2A, $CE, $A2, $DC, $36, $CF, $E2, $C6
- L98D0: .byte $11, $CC, $23, $B7, $53, $CD, $63, $A0, $BB, $CE, $A2, $9A, $0F, $CF, $E2, $8B
- L98E0: .byte $85, $CC, $E2, $70, $9D, $CD, $A3, $6B, $A0, $CE, $63, $58, $63, $CF, $23, $4F
- L98F0: .byte $0A, $CC, $22, $39, $1F, $CD, $23, $2A, $7F, $CE, $A3, $1F, $56, $CF, $A2, $03
- L9900: .byte $4D, $CC, $E3, $AF, $3E, $CD, $63, $2B, $61, $CE, $E2, $4F, $29, $CF, $62, $6F
- L9910: .byte $8A, $CC, $23, $82, $98, $CD, $A3, $07, $AE, $CE, $E2, $CA, $B6, $CF, $63, $E3
- L9920: .byte $0F, $CC, $62, $18, $1F, $CD, $22, $38, $22, $CE, $A3, $5F, $53, $CF, $E2, $78
- L9930: .byte $48, $CC, $E3, $94, $37, $CD, $A3, $B3, $6F, $CE, $A3, $DC, $78, $CF, $22, $FE
- L9940: .byte $83, $CC, $62, $0B, $9F, $CD, $23, $26, $A0, $CE, $62, $39, $BD, $CF, $A2, $1C
- L9950: .byte $07, $CC, $E3, $A4, $87, $CD, $63, $5D, $5A, $CE, $62, $4F, $38, $CF, $23, $85
- ;Not used.
- L9960: .byte $3F, $00, $20, $02, $20, $1B, $3A, $02, $20, $21, $01, $02, $2C, $30, $27, $02
- L9970: .byte $26, $31, $17, $02, $16, $19, $27, $02, $16, $20, $27, $02, $16, $20, $11, $02
- L9980: .byte $01, $20, $21, $00
- L9984: .byte $21 ;PPU address high byte.
- L9985: .byte $8C ;PPU address low byte.
- L9986: .byte $05 ;PPU string length.
- ; 'S T A R T'
- L9987: .byte $1C, $1D, $0A, $1B, $1D
- L998C: .byte $21 ;PPU address high byte.
- L998D: .byte $EC ;PPU address low byte.
- L998E: .byte $08 ;PPU string length.
- ; 'C O N T I N U E'
- L998F: .byte $0C, $18, $17, $1D, $12, $17, $1E, $0E
- L9997: .byte $00 ;End PPU string write
- ;The following pointer table is used to find the start
- ;of each row on the password screen in the data below.
- PasswordRowTbl:
- L9998: .word PasswordRow0 ;($99A2)
- L999A: .word PasswordRow1 ;($99AF)
- L999C: .word PasswordRow2 ;($99BC)
- L999E: .word PasswordRow3 ;($99C9)
- L99A0: .word PasswordRow4 ;($99D6)
- ;The following data is used to load the name table With the password characters:
- PasswordRow0:
- L99A2: .byte $00 ;0
- L99A3: .byte $01 ;1
- L99A4: .byte $02 ;2
- L99A5: .byte $03 ;3
- L99A6: .byte $04 ;4
- L99A7: .byte $05 ;5
- L99A8: .byte $06 ;6
- L99A9: .byte $07 ;7
- L99AA: .byte $08 ;8
- L99AB: .byte $09 ;9
- L99AC: .byte $0A ;A
- L99AD: .byte $0B ;B
- L99AE: .byte $0C ;C
- PasswordRow1:
- L99AF: .byte $0D ;D
- L99B0: .byte $0E ;E
- L99B1: .byte $0F ;F
- L99B2: .byte $10 ;G
- L99B3: .byte $11 ;H
- L99B4: .byte $12 ;I
- L99B5: .byte $13 ;J
- L99B6: .byte $14 ;K
- L99B7: .byte $15 ;L
- L99B8: .byte $16 ;M
- L99B9: .byte $17 ;N
- L99BA: .byte $18 ;O
- L99BB: .byte $19 ;P
- PasswordRow2:
- L99BC: .byte $1A ;Q
- L99BD: .byte $1B ;R
- L99BE: .byte $1C ;S
- L99BF: .byte $1D ;T
- L99C0: .byte $1E ;U
- L99C1: .byte $1F ;V
- L99C2: .byte $20 ;W
- L99C3: .byte $21 ;X
- L99C4: .byte $22 ;Y
- L99C5: .byte $23 ;Z
- L99C6: .byte $24 ;a
- L99C7: .byte $25 ;b
- L99C8: .byte $26 ;c
- PasswordRow3:
- L99C9: .byte $27 ;d
- L99CA: .byte $28 ;e
- L99CB: .byte $29 ;f
- L99CC: .byte $2A ;g
- L99CD: .byte $2B ;h
- L99CE: .byte $2C ;i
- L99CF: .byte $2D ;j
- L99D0: .byte $2E ;k
- L99D1: .byte $2F ;l
- L99D2: .byte $30 ;m
- L99D3: .byte $31 ;n
- L99D4: .byte $32 ;o
- L99D5: .byte $33 ;p
- PasswordRow4:
- L99D6: .byte $34 ;q
- L99D7: .byte $35 ;r
- L99D8: .byte $36 ;s
- L99D9: .byte $37 ;t
- L99DA: .byte $38 ;u
- L99DB: .byte $39 ;v
- L99DC: .byte $3A ;w
- L99DD: .byte $3B ;x
- L99DE: .byte $3C ;y
- L99DF: .byte $3D ;z
- L99E0: .byte $3E ;?
- L99E1: .byte $3F ;-
- L99E2: .byte $FF ;Space
- ;Writes 'PASSWORD PLEASE' on name table 0 in row $2080 (5th row from top).
- L99E3: .byte $20 ;PPU address high byte.
- L99E4: .byte $88 ;PPU address low byte.
- L99E5: .byte $10 ;PPU string length.
- ; 'P A S S _ W O R D _ P L E A S E'
- L99E6: .byte $19, $0A, $1C, $1C, $FF, $20, $18, $1B, $0D, $FF, $19, $15, $0E, $0A, $1C, $0E
- ;Clears attribute table 0 starting at address $23C0.
- L99F6: .byte $23 ;PPU address high byte.
- L99F7: .byte $C0 ;PPU address low byte.
- L99F8: .byte $50 ;PPU string length.
- L99F9: .byte $00 ;Repeat bit set. Repeats entry 16 times.
- ;Writes to attribute table 0 starting at address $23D0.
- L99FA: .byte $23 ;PPU address high byte.
- L99FB: .byte $D0 ;PPU address low byte.
- L99FC: .byte $48 ;PPU string length.
- L99FD: .byte $55 ;Repeat bit set. Repeats entry 8 times.
- ;Writes to attribute table 0 starting at address $23D8.
- L99FE: .byte $23 ;PPU address high byte.
- L99FF: .byte $D8 ;PPU address low byte.
- L9A00: .byte $60 ;PPU string length.
- L9A01: .byte $FF ;Repeat bit set. Repeats entry 32 times.
- ;Writes to attribute table 0 starting at address $23DA.
- L9A02: .byte $23 ;PPU address high byte.
- L9A03: .byte $DA ;PPU address low byte.
- L9A04: .byte $44 ;PPU string length.
- L9A05: .byte $F0 ;Repeat bit set. Repeats entry 4 times.
- L9A06: .byte $00 ;End PPU string write.
- ;----------------------------------------[ Ending routines ]-----------------------------------------
- ;The following routine is accessed via the NMI routine every frame.
- NMIScreenWrite:
- L9A07: LDA TitleRoutine ;
- L9A09: CMP #$1D ;If titleRoutine not at end game, exit.
- L9A0B: BCC Exit100 ;
- L9A0D: JSR LoadCredits ;($9C45)Display end credits on screen.
- L9A10: LDA EndMsgWrite ;
- L9A12: BEQ + ;If not time to write end message, branch
- L9A14: CMP #$05 ;
- L9A16: BCS + ;If end message is finished being written, branch
- L9A18: ASL ;
- L9A19: TAY ;
- L9A1A: LDX EndMessageStringTbl0-2,Y ;Writes the end message on name table 0
- L9A1D: LDA EndMessageStringTbl0-1,Y ;
- L9A20: TAY ;
- L9A21: JSR PreparePPUProcess_ ;($C20E)Prepare to write to PPU.
- L9A24:* LDA HideShowEndMsg ;
- L9A26: BEQ Exit100 ;If not time to erase end message, branch
- L9A28: CMP #$05 ;
- L9A2A: BCS Exit100 ;If end message is finished being erased, branch
- L9A2C: ASL ;
- L9A2D: TAY ;
- L9A2E: LDX EndMessageStringTbl1-2,Y ;Erases the end message on name table 0
- L9A31: LDA EndMessageStringTbl1-1,Y ;
- L9A34: TAY ;
- L9A35: JMP PreparePPUProcess_ ;($C20E)Prepare to write to PPU.
- Exit100:
- L9A38: RTS ;Exit from above and below routines.
- Restart:
- L9A39: LDA Joy1Status ;
- L9A3B: AND #$10 ;If start has not been pressed, branch to exit.
- L9A3D: BEQ Exit100 ;
- L9A3F: LDY #$11 ;
- L9A41: LDA #$00 ;
- L9A43:* STA PasswordByte00,Y ;Erase PasswordByte00 thru PasswordByte11.
- L9A46: DEY ;
- L9A47: BPL - ;
- L9A49: INY ;Y = #$00.
- L9A4A:* STA UniqueItemHistory,Y ;
- L9A4D: INY ;Erase Unique item history.
- L9A4E: BNE - ;
- L9A50: LDA SamusGear ;
- L9A53: AND #$10 ;
- L9A55: BEQ + ;If Samus does not have Maru Mari, branch.-->
- L9A57: LDA #$01 ;Else load Maru Mari data into PasswordByte00.
- L9A59: STA PasswordByte00 ;
- L9A5C:* LDA SamusGear ;
- L9A5F: AND #$01 ;
- L9A61: BEQ + ;If Samus does not have bombs, branch.-->
- L9A63: LDA PasswordByte00 ;Else load bomb data into PasswordByte00.
- L9A66: ORA #$40 ;
- L9A68: STA PasswordByte00 ;
- L9A6B:* LDA SamusGear ;
- L9A6E: AND #$20 ;
- L9A70: BEQ + ;If Samus does not have varia suit, branch.-->
- L9A72: LDA #$08 ;Else load varia suit data into PasswordByte01.
- L9A74: STA PasswordByte01 ;
- L9A77:* LDA SamusGear ;
- L9A7A: AND #$02 ;
- L9A7C: BEQ + ;If Samus does not have high jump, branch.-->
- L9A7E: LDA #$01 ;Else load high jump data into PasswordByte03.
- L9A80: STA PasswordByte03 ;
- L9A83:* LDA SamusGear ;
- L9A86: AND #$10 ;If Samus does not have Maru Mari, branch.-->
- L9A88: BEQ + ;Else load screw attack data into PasswordByte03.-->
- L9A8A: LDA PasswordByte03 ;A programmer error? Should check for screw-->
- L9A8D: ORA #$04 ;attack data.
- L9A8F: STA PasswordByte03 ;
- L9A92:* LDA SamusGear ;
- L9A95: STA PasswordByte09 ;Store Samus gear data in PasswordByte09.
- L9A98: LDA #$00 ;
- L9A9A: LDY JustInBailey ;
- L9A9D: BEQ + ;If Samus is wearing suit, branch. Else-->
- L9A9F: LDA #$80 ;load suitless Samus data into PasswordByte08.
- L9AA1:* STA PasswordByte08 ;
- L9AA4: JMP InitializeGame ;($92D4)Clear RAM to restart game at beginning.
- EndGame:
- L9AA7: JSR LoadEndStarSprites ;($9EAA)Load stars in end scene onto screen.
- L9AAA: LDA IsCredits ;Skips palette change when rolling credits.
- L9AAC: BNE + ;
- L9AAE: LDA FrameCount ;
- L9AB0: AND #$0F ;Changes star palettes every 16th frame.
- L9AB2: BNE + ;
- L9AB4: INC PalDataPending ;
- L9AB6: LDA PalDataPending ;Reset palette data to #$01 after it-->
- L9AB8: CMP #$09 ;reaches #$09.
- L9ABA: BNE + ;
- L9ABC: LDA #$01 ;
- L9ABE: STA PalDataPending ;
- L9AC0:* LDA RoomPtr ;RoomPtr used in end of game to determine-->
- L9AC2: JSR ChooseRoutine ;($C27C)which subroutine to run below.
- L9AC5: .word LoadEndGFX ;($9AD5)Load end GFX to pattern tables.
- L9AC7: .word ShowEndSamus ;($9B1C)Show Samus and end message.
- L9AC9: .word EndSamusFlash ;($9B34)Samus flashes and changes.
- L9ACB: .word SamusWave ;($9B93)Samus waving in ending if suitless.
- L9ACD: .word EndFadeOut ;($9BCD)Fade out Samus in ending.
- L9ACF: .word RollCredits ;($9BFC)Rolls ending credits.
- L9AD1: .word Restart ;($9A39)Starts at beginning after game completed.
- L9AD3: .word ExitSub ;($C45C)Rts.
- LoadEndGFX:
- L9AD5: JSR ClearAll ;($909F)Turn off screen, erase sprites and nametables.
- L9AD8: JSR InitEndGFX ;($C5D0)Prepare to load end GFX.
- L9ADB: LDA #$04 ;
- L9ADD: LDY JustInBailey ;Checks if game was played as suitless-->
- L9AE0: BNE + ;Samus. If so, branch.
- L9AE2: LDA #$00 ;Loads SpritePointerIndex with #$00(suit on).
- L9AE4:* STA EndingType ;
- L9AE7: ASL ;Loads SpritePointerIndex with #$08(suitless).
- L9AE8: STA SpritePointerIndex ;
- L9AEA: LDX #$52 ;Loads the screen where Samus stands on-->
- L9AEC: LDY #$A0 ;the surface of the planet in end of game.
- L9AEE: JSR PreparePPUProcess_ ;($C20E)Prepare to write to PPU.
- L9AF1: JSR NmiOn ;($C487)Turn on non-maskable interrupt.
- L9AF4: LDA #$20 ;Initiate end game music.
- L9AF6: STA MultiSFXFlag ;
- L9AF9: LDA #$60 ;Loads Timer3 with a delay of 960 frames-->
- L9AFB: STA Timer3 ;(16 seconds).
- L9AFD: LDA #$36 ;#$36/#$03 = #$12. Number of sprites-->
- L9AFF: STA SpriteByteCounter ;used to draw end graphic of Samus.
- L9B01: LDA #$00 ;
- L9B03: STA SpriteAttribByte ;
- L9B05: STA ColorCntIndex ;
- L9B07: STA IsCredits ;The following values are-->
- L9B09: STA EndMsgWrite ;initialized to #$00.
- L9B0B: STA HideShowEndMsg ;
- L9B0D: STA CreditPageNumber ;
- L9B0F: LDA #$01 ;
- L9B11: STA PalDataPending ;Change palette.
- L9B13: LDA #$08 ;
- L9B15: STA ClrChangeCounter ;Initialize ClrChangeCounter with #$08.
- L9B17: INC RoomPtr ;
- L9B19: JMP ScreenOn ;($C447)Turn screen on.
- ShowEndSamus:
- L9B1C: JSR LoadEndSamusSprites ;($9C9A)Load end image of Samus.
- L9B1F: LDA Timer3 ;Once 960 frames (16 seconds) have expired,-->
- L9B21: BNE + ;Move to EndSamusFlash routine.
- L9B23: INC RoomPtr ;
- L9B25: RTS ;
- L9B26:* CMP #$50 ;After 160 frames have past-->
- L9B28: BNE + ;(2.6 seconds), write end message.
- L9B2A: INC EndMsgWrite ;
- L9B2C: RTS ;
- L9B2D:* CMP #$01 ;After 950 frames have past-->
- L9B2F: BNE + ;(15.8 seconds), erase end message.
- L9B31: INC HideShowEndMsg ;
- L9B33:* RTS ;
- EndSamusFlash:
- L9B34: LDA FrameCount ;If FrameCount not divisible by 32, branch.
- L9B36: AND #$1F ;
- L9B38: BNE +++ ;
- L9B3A: INC ColorCntIndex ;Every 32 frame, increment the ColorCntInex-->
- L9B3C: LDA ColorCntIndex ;value. Flashing Samus lasts for 512-->
- L9B3E: CMP #$08 ;frames (8.5 seconds).
- L9B40: BNE + ;
- L9B42: JSR ChooseEnding ;($CAF5)Choose which Samus ending to show.
- L9B45: JSR CalculatePassword ;($8C7A)Calculate game password.
- L9B48: LDA EndingType ;
- L9B4B: ASL ;When EndSamusFlash routine is half way-->
- L9B4C: STA SpritePointerIndex ;done, this code will calculate the-->
- L9B4E: LDA #$36 ;password and choose the proper ending.
- L9B50: STA SpriteByteCounter ;
- L9B52:* CMP #$10 ;
- L9B54: BNE ++ ;Once flashing Samus is compete, set Timer3-->
- L9B56: STA Timer3 ;for a 160 frame(2.6 seconds) delay.
- L9B58: LDY #$00 ;
- L9B5A: LDA EndingType ;
- L9B5D: CMP #$04 ;If one of the suitless Samus endings,-->
- L9B5F: BCC + ;increment sprite color for proper-->
- L9B61: INY ;color to be displayed and increment-->
- L9B62:* STY SpriteAttribByte ;RoomPtr and erase the sprites.
- L9B64: INC RoomPtr ;
- L9B66: JMP EraseAllSprites ;($C1A3)Clear all sprites off the screen.
- L9B69:* DEC ClrChangeCounter ;Decrement ClrChangeCounter.
- L9B6B: BNE + ;
- L9B6D: LDY ColorCntIndex ;
- L9B6F: LDA PalChangeTable,Y ;When ClrChangeCounter=#$00, fetch new-->
- L9B72: STA ClrChangeCounter ;ClrChangeCounter value. and increment-->
- L9B74: INC SpriteAttribByte ;sprite color.
- L9B76: LDA SpriteAttribByte ;
- L9B78: CMP #$03 ;
- L9B7A: BNE + ;
- L9B7C: LDA #$00 ;If sprite color=#$03, set sprite-->
- L9B7E: STA SpriteAttribByte ;color to #$00.
- L9B80:* JMP LoadEndSamusSprites ;($9C9A)Load end image of Samus.
- ;The following table is used by the above routine to load ClrChangeCounter. ClrChangeCounter
- ;decrements every frame, When ClrChangeCounter reaches zero, the sprite colors for Samus
- ;changes. This has the effect of making Samus flash. The flashing starts slow, speeds up,
- ;then slows down again.
- PalChangeTable:
- L9B83: .byte $08, $07, $06, $05, $04, $03, $02, $01, $01, $02, $03, $04, $05, $06, $07, $08
- SamusWave:
- L9B93: LDA Timer3 ;If 160 frame timer from previous routine-->
- L9B95: BNE + ;has not expired, branch(waves for 2.6 seconds).
- L9B97: LDA #$10 ;
- L9B99: STA Timer3 ;Load Timer3 with 160 frame delay-->
- L9B9B: LDA #$08 ;(2.6 seconds).
- L9B9D: STA PalDataPending ;Change palette
- L9B9F: INC RoomPtr ;Increment RoomPtr
- L9BA1: RTS ;
- L9BA2:* LDA EndingType ;If suitless Samus-->
- L9BA5: CMP #$04 ;ending, branch.
- L9BA7: BCS + ;
- L9BA9: JMP LoadEndSamusSprites ;($9C9A)
- L9BAC:* SBC #$04 ;If jumpsuit Samus ending,-->
- L9BAE: ASL ;WaveSpritePointer=#$00, if bikini-->
- L9BAF: ASL ;Samus ending, WaveSpritePointer=#$04.
- L9BB0: STA WaveSpritePointer ;
- L9BB2: LDA FrameCount ;
- L9BB4: AND #$08 ;Every eigth frame count, change wave sprite data.
- L9BB6: BNE + ;
- L9BB8: LDY #$10 ;Load WaveSpriteCounter with #$10(16 bytes of-->
- L9BBA: STY WaveSpriteCounter ;sprite data to be loaded).
- L9BBC: BNE ++ ;Branch always.
- L9BBE:* INC WaveSpritePointer ;
- L9BC0: INC WaveSpritePointer ;When bit 3 of FrameCount is not set,-->
- L9BC2: LDY #$10 ;Samus' waving hand is down.
- L9BC4: STY WaveSpriteCounter ;
- L9BC6:* LDA #$2D ;Load SpriteByteCounter in preparation for-->
- L9BC8: STA SpriteByteCounter ;refreshing Samus sprite bytes.
- L9BCA: JMP LoadWaveSprites ;($9C7F)Load sprites for waving Samus.
- EndFadeOut:
- L9BCD: LDA Timer3 ;If 160 frame delay from last routine has not-->
- L9BCF: BNE ++ ;yet expired, branch.
- L9BD1: LDA IsCredits ;
- L9BD3: BNE + ;Branch always.
- L9BD5: LDA #$08 ;*This code does not appear to be used.
- L9BD7: STA PalDataPending ;*Change palette.
- L9BD9: INC IsCredits ;*Increment IsCredits.
- L9BDB:* LDA FrameCount ;
- L9BDD: AND #$07 ;Every seventh frame, increment the palette info-->
- L9BDF: BNE + ;If PalDataPending is not equal to #$0C, keep-->
- L9BE1: INC PalDataPending ;incrementing every seventh frame until it does.-->
- L9BE3: LDA PalDataPending ;This creates the fade out effect.
- L9BE5: CMP #$0C ;
- L9BE7: BNE + ;
- L9BE9: LDA #$10 ;After fadeout complete, load Timer3 with 160 frame-->
- L9BEB: STA Timer3 ;delay(2.6 seconds) and increment RoomPtr.
- L9BED: INC RoomPtr ;
- L9BEF:* LDA EndingType ;
- L9BF2: CMP #$04 ;If suitless Samus ending, load hand wave sprites,-->
- L9BF4: BCS + ;else just load regular Samus sprites
- L9BF6: JMP LoadEndSamusSprites ;($9C9A)Load end image of Samus.
- L9BF9:* JMP LoadWaveSprites ;($9C7F)Load sprites for waving Samus.
- RollCredits:
- L9BFC: LDA Timer3 ;If 160 frame timer delay from previous-->
- L9BFE: BEQ + ;routine has expired, branch.
- L9C00: CMP #$02 ;If not 20 frames left in Timer3, branch to exit.
- L9C02: BNE ++++ ;
- L9C04: JSR ScreenOff ;($C439)When 20 frames left in Timer3,-->
- L9C07: JSR ClearNameTable0 ;($C16D)clear name table 0 and sprites.-->
- L9C0A: JSR EraseAllSprites ;($C1A3)prepares screen for credits.
- L9C0D: LDA #$0D ;
- L9C0F: STA PalDataPending ;Change to proper palette for credits.
- L9C11: JSR ScreenOn ;($C447)Turn screen on.
- L9C14: JMP WaitNMIPass_ ;($C43F)Wait for NMI to end.
- L9C17:* LDA CreditPageNumber ;If first page of credits has not started to-->
- L9C19: BNE + ;roll, start it now, else branch.
- L9C1B: INC CreditPageNumber ;
- L9C1D:* CMP #$06 ;If not at last page of credits, branch.
- L9C1F: BNE + ;
- L9C21: LDA ScrollY ;
- L9C23: CMP #$88 ;If last page of credits is not finished-->
- L9C25: BCC + ;scrolling, branch. Else increment to next-->
- L9C27: INC RoomPtr ;routine.
- L9C29: RTS ;
- L9C2A:* LDA FrameCount ;credits scroll up one position every 3 frames.
- L9C2C: AND #$03 ;
- L9C2E: BNE + ;Ready to scroll? If not, branch.
- L9C30: INC ScrollY ;
- L9C32: LDA ScrollY ;Load ScrollY and check it to see if its-->
- L9C34: CMP #$F0 ;position is at the very bottom on name table.-->
- L9C36: BNE + ;if not, branch.
- L9C38: INC CreditPageNumber ;
- L9C3A: LDA #$00 ;
- L9C3C: STA ScrollY ;When Scrolly is at bottom of the name table,-->
- L9C3E: LDA PPUCNT0ZP ;Swap to next name table(0 or 2) and increment-->
- L9C40: EOR #$02 ;CreditPageNumber.
- L9C42: STA PPUCNT0ZP ;
- L9C44:* RTS
- ;The following routine is checked every frame and is accessed via the NMIScreenWrite routine.
- ;The LoadCredits routine works like this: The Y scroll position is checked every frame. When
- ;it is in the first four positions of the current name table (0, 1, 2 or 3), or the four
- ;positions right after 127 (128, 129, 130 and 131), the routine will then load the ending
- ;credits into the positions on the name table that were just scrolled over. For example, If
- ;the scroll window is currently half way down name table 0, the LoadCredits routine will load
- ;the contents of the upper half of name table 0. Also, name table 0 contains odd numbered
- ;pages and name table 2 contains even numbered pages.
- LoadCredits:
- L9C45: LDY CreditPageNumber ;
- L9C47: BEQ ++++ ;If credits are not being displayed, exit.
- L9C49: CPY #$07 ;
- L9C4B: BCS ++++ ;If CreditPageNumber is higher than #$06, exit.
- L9C4D: LDX #$00 ;
- L9C4F: LDA ScrollY ;If ScrollY is less than #$80 (128), branch.
- L9C51: BPL + ;
- L9C53: INX ;Load X with sign bit (#$01) and remove-->
- L9C54: SEC ;sign bit from A.
- L9C55: SBC #$80 ;
- L9C57:* CMP #$04 ;
- L9C59: BCS +++ ;If ScrollY is not #$04, branch to exit.
- L9C5B: STA $01 ;Store #$00, #$01, #$02 or #$03 in address $01.
- L9C5D: DEY ;Y now contains CreditPageNumber - 1.
- L9C5E: TXA ;
- L9C5F: BNE + ;If ScrollY is #$80 (128) or greater, branch.
- L9C61: DEY ;Y now contains CreditPageNumber - 2.
- L9C62: BMI +++ ;If on Credit page less than two , branch to exit.
- L9C64: TYA ;
- L9C65: ASL ;Start with CreditPageNumber - 2-->
- L9C66: ASL ;* 8 + 4 + $01 * 2.
- L9C67: ASL ;This formula is used when ScrollY = 0, 1, 2 and 3.
- L9C68: ADC #$04 ;Result is index to find proper credits to load.
- L9C6A: BNE ++ ;Branch always.
- L9C6C:* TYA ;
- L9C6D: ASL ;Start with CreditPageNumber - 1-->
- L9C6E: ASL ;* 8 + $01 * 2.
- L9C6F: ASL ;This formula is used when ScrollY = 128,-->
- L9C70:* ADC $01 ;129, 130 and 131.
- L9C72: ASL ;Result is index to find proper credits to load.
- L9C73: TAY ;
- L9C74: LDX CreditsPointerTbl,Y ;Base is $A291. Lower byte of pointer to PPU string.
- L9C77: LDA CreditsPointerTbl+1,Y ;Upper byte of pointer to PPU string.
- L9C7A: TAY ;
- L9C7B: JMP PreparePPUProcess_ ;($C20E)Prepare to write to PPU.
- L9C7E:* RTS ;
- LoadWaveSprites:
- L9C7F: LDX WaveSpritePointer ;
- L9C81: LDA WavePointerTable,X ;
- L9C84: STA $00 ;Load pointer to wave sprite data-->
- L9C86: LDA WavePointerTable+1,X ;into addresses $00 and $01.
- L9C89: STA $01 ;
- L9C8B: LDX #$20 ;Offset for sprite RAM load.
- L9C8D: LDY #$00 ;
- L9C8F:* LDA ($00),Y ;
- L9C91: STA Sprite00RAM,X ;Load wave sprites into sprite RAM starting at-->
- L9C94: INX ;location $220 (Sprite08RAM).
- L9C95: INY ;
- L9C96: CPY WaveSpriteCounter ;Check to see if sprite RAM load complete.-->
- L9C98: BNE - ;If not, branch and load another byte.
- LoadEndSamusSprites:
- L9C9A: LDX #$30 ;Index for loading Samus sprite data into sprite RAM.
- L9C9C: LDY SpritePointerIndex ;
- L9C9E: LDA EndSamusAddrTbl,Y ;Base is $9D5A.
- L9CA1: STA $00 ;Load $00 and $01 with pointer to the sprite-->
- L9CA3: LDA EndSamusAddrTbl+1,Y ;data that shows Samus at the end of the game.
- L9CA6: STA $01 ;
- L9CA8: LDY #$00 ;
- L9CAA:* LDA ($00),Y ;Load sprite data starting at Sprite0CRAM.
- L9CAC: STA Sprite00RAM,X ;Load sprite Y-coord.
- L9CAF: INX ;
- L9CB0: INY ;Increment X and Y.
- L9CB1: LDA ($00),Y ;
- L9CB3: BPL + ;If sprite pattern byte MSB cleared, branch.
- L9CB5: AND #$7F ;
- L9CB7: STA Sprite00RAM,X ;Remove MSB and write sprite pattern data-->
- L9CBA: LDA SpriteAttribByte ;to sprite RAM.
- L9CBC: EOR #$40 ;
- L9CBE: BNE ++ ;
- L9CC0:* STA Sprite00RAM,X ;Writes sprite pattern byte to-->
- L9CC3: LDA SpriteAttribByte ;sprite RAM if its MSB is not set.
- L9CC5:* INX ;
- L9CC6: STA Sprite00RAM,X ;Writes sprite attribute byte to sprite RAM.
- L9CC9: INY ;
- L9CCA: INX ;Increment X and Y.
- L9CCB: LDA ($00),Y ;
- L9CCD: STA Sprite00RAM,X ;Load sprite X-coord.
- L9CD0: INY ;
- L9CD1: INX ;Increment X and Y.
- L9CD2: CPY SpriteByteCounter ;
- L9CD4: BNE --- ;Repeat until sprite load is complete.
- L9CD6: LDA RoomPtr ;
- L9CD8: CMP #$02 ;If not running the EndSamusFlash routine, branch.
- L9CDA: BCC ++ ;
- L9CDC: LDA ColorCntIndex ;
- L9CDE: CMP #$08 ;If EndSamusFlash routine is more than half-->
- L9CE0: BCC ++ ;way done, Check ending type for the Samus helmet-->
- L9CE2: LDA EndingType ;off ending. If not helmet off ending, branch.
- L9CE5: CMP #$03 ;
- L9CE7: BNE ++ ;
- L9CE9: LDY #$00 ;
- L9CEB: LDX #$00 ;
- L9CED:* LDA SamusHeadSpriteTble,Y ;The following code loads the sprite graphics-->
- L9CF0: STA Sprite00RAM,X ;when the helmet off ending is playing. The-->
- L9CF3: INY ;sprites below keep Samus head from flashing-->
- L9CF4: INX ;while the rest of her body does.
- L9CF5: CPY #$18 ;
- L9CF7: BNE - ;
- L9CF9:* RTS ;
- ;The following table is used by the routine above to keep Samus'
- ;head from flashing during the helmet off ending.
- SamusHeadSpriteTble:
- L9CFA: .byte $93, $36, $01, $70 ;Sprite00RAM
- L9CFE: .byte $93, $37, $01, $78 ;Sprite01RAM
- L9D02: .byte $93, $38, $01, $80 ;Sprite02RAM
- L9D06: .byte $9B, $46, $01, $70 ;Sprite03RAM
- L9D0A: .byte $9B, $47, $01, $78 ;Sprite04RAM
- L9D0E: .byte $9B, $48, $01, $80 ;Sprite05RAM
- ;The following table is a pointer table to the sprites that makes Samus wave in the end
- ;of the game when she is suitless. The top two pointers are for when she is in the jumpsuit
- ;and the bottom two pointers are for when she is in the bikini.
- WavePointerTable:
- L9D12: .word $9D1A ;Jumpsuit Samus hand up.
- L9D14: .word $9D2A ;Jumpsuit Samus hand down.
- L9D16: .word $9D3A ;Bikini Samus hand up.
- L9D18: .word $9D4A ;Bikini Samus hand down.
- ;Sprite data table used when Samus is in jumpsuit and her waving hand is up.
- JsHandUpTable:
- L9D1A: .byte $9B, $1F, $01, $80, $A3, $2F, $01, $80, $AB, $3F, $01, $80, $F4, $3F, $01, $80
- ;Sprite data table used when Samus is in jumpsuit and her waving hand is down.
- JsHandDownTable:
- L9D2A: .byte $9B, $2A, $01, $80, $9B, $2B, $01, $88, $A3, $3A, $01, $80, $AB, $3F, $01, $80
- ;Sprite data table used when Samus is in bikini and her waving hand is up.
- BkHandUpTable:
- L9D3A: .byte $9B, $0C, $01, $80, $A3, $1C, $01, $80, $AB, $3F, $01, $80, $F4, $3F, $01, $80
- ;Sprite data table used when Samus is in bikini and her waving hand is down.
- BkHandDownTable:
- L9D4A: .byte $9B, $4A, $01, $80, $9B, $4B, $01, $88, $A3, $4D, $01, $80, $AB, $3F, $01, $80
- EndSamusAddrTbl:
- L9D5A: .word NormalSamus ;($9D66)Pointer to end graphic of Samus wearing suit.
- L9D5C: .word BackTurnedSamus ;($9D9C)Pointer to end graphic of back turned Samus.
- L9D5E: .word FistRaisedSamus ;($9DD2)Pointer to end graphic of fist raised Samus.
- L9D60: .word HelmetOffSamus ;($9E08)Pointer to end graphic of helmet off Samus.
- L9D62: .word JumpsuitSamus ;($9E3E)Pointer to end graphic of jumpsuit Samus.
- L9D64: .word BikiniSamus ;($9E74)Pointer to end graphic of bikini Samus.
- ;The following three bytes are loaded into sprite RAM. The third byte (attribute byte) is
- ;not included. Instead, if the MSB of the second byte (pattern byte) is set, the pattern
- ;byte is flipped horizontally (mirror image). If pattern byte MSB is not set, the attribute
- ;byte is stored as #$00. This is done so the code can generate the flashing Samus effect at
- ;the end of the game.
- NormalSamus:
- L9D66: .byte $93, $00, $70
- L9D69: .byte $93, $01, $78
- L9D6C: .byte $93, $80, $80 ;Mirrored pattern at pattern table location $00.
- L9D6F: .byte $9B, $10, $70
- L9D72: .byte $9B, $11, $78
- L9D75: .byte $9B, $90, $80 ;Mirrored pattern at pattern table location $10.
- L9D78: .byte $A3, $20, $70
- L9D7B: .byte $A3, $21, $78
- L9D7E: .byte $A3, $22, $80
- L9D81: .byte $AB, $30, $70
- L9D84: .byte $AB, $31, $78
- L9D87: .byte $AB, $32, $80
- L9D8A: .byte $B3, $40, $70
- L9D8D: .byte $B3, $41, $78
- L9D90: .byte $B3, $C0, $80
- L9D93: .byte $BB, $50, $70
- L9D96: .byte $BB, $49, $78
- L9D99: .byte $BB, $D0, $80 ;Mirrored pattern at pattern table location $50.
- BackTurnedSamus:
- L9D9C: .byte $93, $02, $70
- L9D9F: .byte $93, $03, $78
- L9DA2: .byte $93, $04, $80
- L9DA5: .byte $9B, $12, $70
- L9DA8: .byte $9B, $13, $78
- L9DAB: .byte $9B, $14, $80
- L9DAE: .byte $A3, $05, $70
- L9DB1: .byte $A3, $06, $78
- L9DB4: .byte $A3, $07, $80
- L9DB7: .byte $AB, $15, $70
- L9DBA: .byte $AB, $16, $78
- L9DBD: .byte $AB, $17, $80
- L9DC0: .byte $B3, $08, $70
- L9DC3: .byte $B3, $09, $78
- L9DC6: .byte $B3, $88, $80 ;Mirrored pattern at pattern table location $08.
- L9DC9: .byte $BB, $18, $70
- L9DCC: .byte $BB, $19, $78
- L9DDF: .byte $BB, $98, $80 ;Mirrored pattern at pattern table location $18.
- FistRaisedSamus:
- L9DD2: .byte $93, $00, $70
- L9DD5: .byte $93, $01, $78
- L9DD8: .byte $93, $34, $80
- L9DDB: .byte $9B, $10, $70
- L9DDE: .byte $9B, $11, $78
- L9DE1: .byte $9B, $44, $80
- L9DE4: .byte $A3, $20, $70
- L9DE7: .byte $A3, $21, $78
- L9DEA: .byte $A3, $33, $80
- L9DED: .byte $AB, $30, $70
- L9DF0: .byte $AB, $31, $78
- L9DF3: .byte $AB, $43, $80
- L9DF6: .byte $B3, $40, $70
- L9DF9: .byte $B3, $41, $78
- L9DFC: .byte $B3, $C0, $80 ;Mirrored pattern at pattern table location $40.
- L9DFF: .byte $BB, $50, $70
- L9E02: .byte $BB, $49, $78
- L9E05: .byte $BB, $D0, $80 ;Mirrored pattern at pattern table location $50.
- HelmetOffSamus:
- L9E08: .byte $93, $0D, $70
- L9E0B: .byte $93, $0E, $78
- L9E0E: .byte $93, $0F, $80
- L9E11: .byte $9B, $35, $70
- L9E14: .byte $9B, $27, $78
- L9E17: .byte $9B, $28, $80
- L9E1A: .byte $A3, $20, $70
- L9E1D: .byte $A3, $21, $78
- L9E20: .byte $A3, $22, $80
- L9E23: .byte $AB, $30, $70
- L9E26: .byte $AB, $31, $78
- L9E29: .byte $AB, $32, $80
- L9E2C: .byte $B3, $40, $70
- L9E2F: .byte $B3, $41, $78
- L9E32: .byte $B3, $C0, $80 ;Mirrored pattern at pattern table location $40.
- L9E35: .byte $BB, $50, $70
- L9E38: .byte $BB, $49, $78
- L9E3B: .byte $BB, $D0, $80 ;Mirrored pattern at pattern table location $50.
- JumpsuitSamus:
- L9E3E: .byte $93, $0D, $70
- L9E41: .byte $93, $0E, $78
- L9E44: .byte $93, $0F, $80
- L9E47: .byte $9B, $1D, $70
- L9E4A: .byte $9B, $1E, $78
- L9E4D: .byte $A3, $2D, $70
- L9E50: .byte $A3, $2E, $78
- L9E53: .byte $AB, $3D, $70
- L9E56: .byte $AB, $3E, $78
- L9E59: .byte $B3, $08, $70
- L9E5C: .byte $B3, $4E, $78
- L9E5F: .byte $B3, $4F, $80
- L9E62: .byte $BB, $45, $70
- L9E65: .byte $BB, $3B, $78
- L9E68: .byte $BB, $51, $80
- L9E6B: .byte $9B, $29, $80
- L9E6E: .byte $A3, $39, $80
- L9E71: .byte $AB, $4C, $80
- BikiniSamus:
- L9E74: .byte $93, $0D, $70
- L9E77: .byte $93, $0E, $78
- L9E7A: .byte $93, $0F, $80
- L9E7D: .byte $9B, $0A, $70
- L9E80: .byte $9B, $0B, $78
- L9E83: .byte $A3, $1A, $70
- L9E86: .byte $A3, $1B, $78
- L9E89: .byte $AB, $3D, $70
- L9E8C: .byte $AB, $3E, $78
- L9E8F: .byte $B3, $08, $70
- L9E92: .byte $B3, $4E, $78
- L9E95: .byte $B3, $4F, $80
- L9E98: .byte $BB, $45, $70
- L9E9B: .byte $BB, $3B, $78
- L9E9E: .byte $BB, $51, $80
- L9EA1: .byte $9B, $2C, $80
- L9EA4: .byte $A3, $3C, $80
- L9EA7: .byte $AB, $4C, $80
- LoadEndStarSprites:
- L9EAA: LDY #$00 ;
- L9EAC:* LDA EndStarDataTable,Y ;
- L9EAF: STA Sprite1CRAM,Y ;Load the table below into sprite RAM-->
- L9EB2: INY ;starting at address $0270.
- L9EB3: CPY #$9C ;
- L9EB5: BNE - ;
- L9EB7: RTS
- ;Loaded into sprite RAM by routine above. Displays stars at the end of the game.
- EndStarDataTable:
- L9EB8: .byte $08, $23, $22, $10
- L9EBC: .byte $68, $23, $23, $60
- L9EC0: .byte $00, $23, $22, $60
- L9EC4: .byte $7F, $23, $23, $6A
- L9EC8: .byte $7F, $23, $22, $D4
- L9ECC: .byte $33, $23, $23, $B2
- L9ED0: .byte $93, $23, $22, $47
- L9ED4: .byte $B3, $23, $23, $95
- L9ED8: .byte $0B, $23, $22, $E2
- L9EDC: .byte $1C, $23, $23, $34
- L9EE0: .byte $84, $23, $22, $18
- L9EE4: .byte $B2, $23, $23, $EE
- L9EE8: .byte $40, $23, $22, $22
- L9EEC: .byte $5A, $23, $23, $68
- L9EF0: .byte $1A, $23, $22, $90
- L9EF4: .byte $AA, $23, $23, $22
- L9EF8: .byte $81, $24, $22, $88
- L9EFC: .byte $6A, $24, $23, $D0
- L9F00: .byte $A8, $24, $22, $A0
- L9F04: .byte $10, $24, $23, $70
- L9F08: .byte $15, $25, $22, $42
- L9F0C: .byte $4A, $25, $23, $7D
- L9F10: .byte $30, $25, $22, $50
- L9F14: .byte $5A, $25, $23, $49
- L9F18: .byte $50, $25, $22, $B9
- L9F1C: .byte $91, $25, $23, $B0
- L9F20: .byte $19, $25, $22, $C0
- L9F24: .byte $53, $25, $23, $BA
- L9F28: .byte $A4, $25, $22, $D6
- L9F2C: .byte $98, $25, $23, $1A
- L9F30: .byte $68, $25, $22, $0C
- L9F34: .byte $97, $25, $23, $EA
- L9F38: .byte $33, $25, $22, $92
- L9F3C: .byte $43, $25, $23, $65
- L9F40: .byte $AC, $25, $22, $4A
- L9F44: .byte $2A, $25, $23, $71
- L9F48: .byte $7C, $26, $22, $B2
- L9F4C: .byte $73, $26, $23, $E7
- L9F50: .byte $0C, $26, $22, $AA
- EndGamePalWrite:
- L9F54: LDA PalDataPending ;If no palette data pending, branch to exit.
- L9F56: BEQ ++ ;
- L9F58: CMP #$0C ;If PalDataPending has loaded last palette,-->
- L9F5A: BEQ ++ ;branch to exit.
- L9F5C: CMP #$0D ;Once end palettes have been cycled through,-->
- L9F5E: BNE + ;start over.
- L9F60: LDY #$00 ;
- L9F62: STY PalDataPending ;
- L9F64:* ASL ;* 2, pointer is two bytes.
- L9F65: TAY ;
- L9F66: LDA EndGamePalPntrTbl-1,Y ;High byte of PPU data pointer.
- L9F69: LDX EndGamePalPntrTbl-2,Y ;Low byte of PPU data pointer.
- L9F6C: TAY ;
- L9F6D: JSR PreparePPUProcess_ ;($C20E)Prepare to write data string to PPU.
- L9F70: LDA #$3F ;
- L9F72: STA PPUAddress ;
- L9F75: LDA #$00 ;
- L9F77: STA PPUAddress ;Set PPU address to $3F00.
- L9F7A: STA PPUAddress ;
- L9F7D: STA PPUAddress ;Set PPU address to $0000.
- L9F80:* RTS ;
- ;The following pointer table is used by the routine above to
- ;find the proper palette data during the EndGame routine.
- EndGamePalPntrTbl:
- L9F81: .word EndGamePal00 ;($9F9B)
- L9F83: .word EndGamePal01 ;($9FBF)
- L9F85: .word EndGamePal02 ;($9FCB)
- L9F87: .word EndGamePal03 ;($9FD7)
- L9F89: .word EndGamePal04 ;($9FE3)
- L9F8B: .word EndGamePal05 ;($9FEF)
- L9F8D: .word EndGamePal06 ;($9FFB)
- L9F8F: .word EndGamePal07 ;($A007)
- L9F91: .word EndGamePal08 ;($A013)
- L9F93: .word EndGamePal09 ;($A02E)
- L9F95: .word EndGamePal0A ;($A049)
- L9F97: .word EndGamePal0A ;($A049)
- L9F99: .word EndGamePal0B ;($9806)
- EndGamePal00:
- L9F9B: .byte $3F ;PPU address high byte.
- L9F9C: .byte $00 ;PPU address low byte.
- L9F9D: .byte $20 ;PPU string length.
- ;The following values are written to the background palette:
- L9F9E: .byte $0F, $21, $11, $02, $0F, $29, $1B, $1A, $0F, $27, $28, $29, $0F, $28, $18, $08
- ;The following values are written to the sprite palette:
- L9FAE: .byte $0F, $16, $19, $27, $0F, $36, $15, $17, $0F, $12, $21, $20, $0F, $35, $12, $16
- L9FBE: .byte $00 ;End EndGamePal00 data.
- EndGamePal01:
- L9FBF: .byte $3F ;PPU address high byte.
- L9FC0: .byte $18 ;PPU address low byte.
- L9FC1: .byte $08 ;PPU string length.
- ;The following values are written to the sprite palette starting at $3F18:
- L9FC2: .byte $0F, $10, $20, $30, $0F, $0F, $0F, $0F
- L9FCA: .byte $00 ;End EndGamePal01 data.
- EndGamePal02:
- L9FCB: .byte $3F ;PPU address high byte.
- L9FCC: .byte $18 ;PPU address low byte.
- L9FCD: .byte $08 ;PPU string length.
- ;The following values are written to the sprite palette starting at $3F18:
- L9FCE: .byte $0F, $12, $22, $32, $0F, $0B, $1B, $2B
- L9FD6: .byte $00 ;End EndGamePal02 data.
- EndGamePal03:
- L9FD7: .byte $3F ;PPU address high byte.
- L9FD8: .byte $18 ;PPU address low byte.
- L9FD9: .byte $08 ;PPU string length.
- ;The following values are written to the sprite palette starting at $3F18:
- L9FDA: .byte $0F, $14, $24, $34, $0F, $09, $19, $29
- L9FE2: .byte $00 ;End EndGamePal03 data.
- EndGamePal04:
- L9FE3: .byte $3F ;PPU address high byte.
- L9FE4: .byte $18 ;PPU address low byte.
- L9FE5: .byte $08 ;PPU string length.
- ;The following values are written to the sprite palette starting at $3F18:
- L9FE6: .byte $0F, $16, $26, $36, $0F, $07, $17, $27
- L9FEE: .byte $00 ;End EndGamePal04 data.
- EndGamePal05:
- L9FEF: .byte $3F ;PPU address high byte.
- L9FF0: .byte $18 ;PPU address low byte.
- L9FF1: .byte $08 ;PPU string length.
- ;The following values are written to the sprite palette starting at $3F18:
- L9FF2: .byte $0F, $18, $28, $38, $0F, $05, $15, $25
- L9FFA: .byte $00 ;End EndGamePal05 data.
- EndGamePal06:
- L9FFB: .byte $3F ;PPU address high byte.
- L9FFC: .byte $18 ;PPU address low byte.
- L9FFD: .byte $08 ;PPU string length.
- ;The following values are written to the sprite palette starting at $3F18:
- L9FFE: .byte $0F, $1A, $2A, $3A, $0F, $03, $13, $13
- LA006: .byte $00 ;End EndGamePal06 data.
- EndGamePal07:
- LA007: .byte $3F ;PPU address high byte.
- LA008: .byte $18 ;PPU address low byte.
- LA009: .byte $08 ;PPU string length.
- ;The following values are written to the sprite palette starting at $3F18:
- LA00A: .byte $0F, $1C, $2C, $3C, $0F, $01, $11, $21
- LA012: .byte $00 ;End EndGamePal07 data.
- EndGamePal08:
- LA013: .byte $3F ;PPU address high byte.
- LA014: .byte $0C ;PPU address low byte.
- LA015: .byte $04 ;PPU string length.
- ;The following values are written to the background palette starting at $3F0C:
- LA016: .byte $0F, $18, $08, $07
- LA01A: .byte $3F ;PPU address high byte.
- LA01B: .byte $10 ;PPU address low byte.
- LA01C: .byte $10 ;PPU string length.
- ;The following values are written to the sprite palette:
- LA01D: .byte $0F, $26, $05, $07, $0F, $26, $05, $07, $0F, $01, $01, $05, $0F, $13, $1C, $0C
- LA02D: .byte $00 ;End EndGamePal08 data.
- EndGamePal09:
- LA02E: .byte $3F ;PPU address high byte.
- LA02F: .byte $0C ;PPU address low byte.
- LA030: .byte $04 ;PPU string length.
- ;The following values are written to the background palette starting at $3F0C:
- LA031: .byte $0F, $08, $07, $0F
- LA035: .byte $3F ;PPU address high byte.
- LA036: .byte $10 ;PPU address low byte.
- LA037: .byte $10 ;PPU string length.
- ;The following values are written to the sprite palette:
- LA038: .byte $0F, $06, $08, $0F, $0F, $06, $08, $0F, $0F, $00, $10, $0F, $0F, $01, $0C, $0F
- LA048: .byte $00 ;End EndGamePal09 data.
- EndGamePal0A:
- LA049: .byte $3F ;PPU address high byte.
- LA04A: .byte $0C ;PPU address low byte.
- LA04B: .byte $44 ;PPU string length.
- LA04C: .byte $0F ;Repeat bit set. Fill background palette with #$0F-->
- ;starting at $0C.
- LA04D: .byte $3F ;PPU address high byte.
- LA04E: .byte $10 ;PPU address low byte.
- LA04F: .byte $50 ;PPU string length.
- LA050: .byte $0F ;Repeat bit set. Fill sprite palette with #$0F.
- LA051: .byte $00 ;End EndGamePal0A data.
- ;The following data writes the end game backgroud graphics.
- ;Writes ground graphics on name table 0 in row $2300 (25th row from top).
- LA052: .byte $23 ;PPU address high byte.
- LA053: .byte $00 ;PPU address low byte.
- LA054: .byte $20 ;PPU string length.
- LA055: .byte $30, $31, $30, $31, $30, $31, $30, $31, $30, $31, $30, $31, $30, $31, $30, $31
- LA065: .byte $30, $31, $30, $31, $30, $31, $30, $31, $30, $31, $30, $31, $30, $31, $30, $31
- ;Writes ground graphics on name table 0 in row $2320 (26th row from top).
- LA075: .byte $23 ;PPU address high byte.
- LA076: .byte $20 ;PPU address low byte.
- LA077: .byte $20 ;PPU string length.
- LA078: .byte $32, $33, $32, $33, $32, $33, $32, $33, $32, $33, $32, $33, $32, $33, $32, $33
- LA088: .byte $32, $33, $32, $33, $32, $33, $32, $33, $32, $33, $32, $33, $32, $33, $32, $33
- ;Writes ground graphics on name table 0 in row $2340 (27th row from top).
- LA098: .byte $23 ;PPU address high byte.
- LA099: .byte $40 ;PPU address low byte.
- LA09A: .byte $20 ;PPU string length.
- LA09B: .byte $34, $35, $34, $35, $34, $35, $34, $35, $34, $35, $34, $35, $34, $35, $34, $35
- LA0AB: .byte $34, $35, $34, $35, $34, $35, $34, $35, $34, $35, $34, $35, $34, $35, $34, $35
- ;Writes ground graphics on name table 0 in row $2360 (28th row from top).
- LA0BB: .byte $23 ;PPU address high byte.
- LA0BC: .byte $60 ;PPU address low byte.
- LA0BD: .byte $20 ;PPU string length.
- LA0BE: .byte $36, $37, $36, $37, $36, $37, $36, $37, $36, $37, $36, $37, $36, $37, $36, $37
- LA0CE: .byte $36, $37, $36, $37, $36, $37, $36, $37, $36, $37, $36, $37, $36, $37, $36, $37
- ;Writes ground graphics on name table 0 in row $2380 (29th row from top).
- LA0DE: .byte $23 ;PPU address high byte.
- LA0DF: .byte $80 ;PPU address low byte.
- LA0E0: .byte $20 ;PPU string length.
- LA0E1: .byte $38, $39, $38, $39, $38, $39, $38, $39, $38, $39, $38, $39, $38, $39, $38, $39
- LA0F1: .byte $38, $39, $38, $39, $38, $39, $38, $39, $38, $39, $38, $39, $38, $39, $38, $39
- ;Writes ground graphics on name table 0 in row $23A0 (bottom row).
- LA101: .byte $23 ;PPU address high byte.
- LA102: .byte $A0 ;PPU address low byte.
- LA103: .byte $20 ;PPU string length.
- LA104: .byte $3A, $3B, $3A, $3B, $3A, $3B, $3A, $3B, $3A, $3B, $3A, $3B, $3A, $3B, $3A, $3B
- LA114: .byte $3A, $3B, $3A, $3B, $3A, $3B, $3A, $3B, $3A, $3B, $3A, $3B, $3A, $3B, $3A, $3B
- ;Sets all color bits in attribute table 0 starting at $23F0.
- LA124: .byte $23 ;PPU address high byte.
- LA125: .byte $F0 ;PPU address low byte.
- LA126: .byte $50 ;PPU string length.
- LA127: .byte $FF ;Repeat bit set. Repeats entry 16 times.
- ;Writes credits on name table 2 in row $2820 (2nd row from top).
- LA128: .byte $28 ;PPU address high byte.
- LA129: .byte $2E ;PPU address low byte.
- LA12A: .byte $05 ;PPU string length.
- ; 'S T A F F'
- LA12B: .byte $1C, $1D, $0A, $0F, $0F
- ;Writes credits on name table 2 in row $28A0 (6th row from top).
- LA130: .byte $28 ;PPU address high byte.
- LA131: .byte $A8 ;PPU address low byte.
- LA132: .byte $13 ;PPU string length.
- ; 'S C E N A R I O _ W R I T T E N'
- LA133: .byte $1C, $0C, $0E, $17, $0A, $1B, $12, $18, $FF, $20, $1B, $12, $1D, $1D, $0E, $17
- ; '_ B Y'
- LA143: .byte $FF, $0B, $22
- ;Writes credits on name table 2 in row $28E0 (8th row from top).
- LA146: .byte $28 ;PPU address high byte.
- LA147: .byte $EE ;PPU address low byte.
- LA148: .byte $05 ;PPU string length.
- ; 'K A N O H'
- LA149: .byte $14, $0A, $17, $18, $11
- ;Writes credits on name table 2 in row $2960 (12th row from top).
- LA14E: .byte $29 ;PPU address high byte.
- LA14F: .byte $66 ;PPU address low byte.
- LA150: .byte $15 ;PPU string length.
- ; 'C H A R A C T E R _ D E S I G N'
- LA151: .byte $0C, $11, $0A, $1B, $0A, $0C, $1D, $0E, $1B, $FF, $0D, $0E, $1C, $12, $10, $17
- ; 'E D _ B Y'
- LA161: .byte $0E, $0D, $FF, $0B, $22
- ;Writes credits on name table 2 in row $29A0 (14th row from top).
- LA166: .byte $29 ;PPU address high byte.
- LA167: .byte $AC ;PPU address low byte.
- LA168: .byte $08 ;PPU string length.
- ; 'K I Y O T A K E'
- LA169: .byte $14, $12, $22, $18, $1D, $0A, $14, $0E
- ;Writes credits on name table 2 in row $2A20 (18th row from top).
- LA16A: .byte $2A ;PPU address high byte.
- LA16B: .byte $2B ;PPU address low byte.
- LA173: .byte $0C ;PPU string length.
- ; 'N E W _ M A T S U O K A'
- LA174: .byte $17, $0E, $20, $FF, $16, $0A, $1D, $1C, $1E, $18, $14, $0A
- ;Writes credits on name table 2 in row $2A60 (20th row from top).
- LA180: .byte $2A ;PPU address high byte.
- LA181: .byte $6C ;PPU address low byte.
- LA182: .byte $09 ;PPU string length.
- ; 'S H I K A M O T O'
- LA183: .byte $1C, $11, $12, $14, $0A, $16, $18, $1D, $18
- ;Writes credits on name table 2 in row $2AE0 (24th row from top).
- LA18C: .byte $2A ;PPU address high byte.
- LA18D: .byte $EC ;PPU address low byte.
- LA18E: .byte $08 ;PPU string length.
- ; 'M U S I C _ B Y'
- LA18F: .byte $16, $1E, $1C, $12, $0C, $FF, $0B, $22
- ;Writes credits on name table 2 in row $2B20 (26th row from top)
- LA197: .byte $2B ;PPU address high byte.
- LA198: .byte $2B ;PPU address low byte.
- LA199: .byte $0A ;PPU string length.
- ; 'H I P _ T A N A K A'
- LA19A: .byte $11, $12, $19, $FF, $1D, $0A, $17, $0A, $14, $0A
- ;Writes credits on name table 2 in row $2BA0 (bottom row).
- LA1A4: .byte $2B ;PPU address high byte.
- LA1A5: .byte $A7 ;PPU address low byte.
- LA1A6: .byte $12 ;PPU string length.
- ; '_ M A I N _ P R O G R A M M E R'
- LA1A7: .byte $FF, $16, $0A, $12, $17, $FF, $19, $1B, $18, $10, $1B, $0A, $16, $16, $0E, $1B
- ; 'S _'
- LA1B7: .byte $1C, $FF
- LA1B9: .byte $00 ;End PPU string write.
- ;The following pointer table is accessed by the NMIScreenWrite routine.
- ;It is used to locate the start of the PPU strings below.
- EndMessageStringTbl0:
- LA1BA: .word $A1C2, $A1EB, $A20F, $A240
- ;Writes end message on name table 0 in row $2060 (4th row from top).
- LA1C2: .byte $20 ;PPU address high byte.
- LA1C3: .byte $6D ;PPU address low byte.
- LA1C4: .byte $08 ;PPU string length.
- ; 'G R E A T _ ! !'
- LA1C5: .byte $10, $1B, $0E, $0A, $1D, $FF, $3F, $3F
- ;Writes end message on name table 0 in row $20C0 (7th row from top).
- LA1CD: .byte $20 ;PPU address high byte.
- LA1CE: .byte $C3 ;PPU address low byte.
- LA1CF: .byte $1A ;PPU string length.
- ; 'Y O U _ F U L F I L E D _ Y O U'
- LA1D0: .byte $22, $18, $1E, $FF, $0F, $1E, $15, $0F, $12, $15, $0E, $0D, $FF, $22, $18, $1E
- ; 'R _ M I S S I O N .'
- LA1E0: .byte $1B, $FF, $16, $12, $1C, $1C, $12, $18, $17, $07
- LA1EA: .byte $00 ;End PPU string write.
- ;Writes end message on name table 0 in row $2100 (9th row from top).
- LA1EB: .byte $21 ;PPU address high byte.
- LA1EC: .byte $03 ;PPU address low byte.
- LA1ED: .byte $17 ;PPU string length.
- ; 'I T _ W I L L _ R E V I V E _ P'
- LA1EE: .byte $12, $1D, $FF, $20, $12, $15, $15, $FF, $1B, $0E, $1F, $12, $1F, $0E, $FF, $19
- ; 'E A C E _ I N'
- LA1FE: .byte $0E, $0A, $0C, $0E, $FF, $12, $17
- ;Writes end message on name table 0 in row $2140 (11th row from top).
- LA205: .byte $21 ;PPU address high byte.
- LA206: .byte $42 ;PPU address low byte.
- LA207: .byte $06 ;PPU string length.
- ; 'S P A C E .'
- LA208: .byte $1C, $19, $0A, $0C, $0E, $07
- LA209: .byte $00 ;End PPU string write.
- ;Writes end message on name table 0 in row $2180 (13th row from top).
- LA20F: .byte $21 ;PPU address high byte.
- LA210: .byte $83 ;PPU address low byte.
- LA211: .byte $18 ;PPU string length.
- ; 'B U T , I T _ M A Y _ B E _ I N'
- LA212: .byte $0B, $1E, $1D, $00, $12, $1D, $FF, $16, $0A, $22, $FF, $0B, $0E, $FF, $12, $17
- ; 'V A D E D _ B Y'
- LA222: .byte $1F, $0A, $0D, $0E, $0D, $FF, $0B, $22
- ;Writes end message on name table 0 in row $21C0 (15th row from top).
- LA22A: .byte $21 ;PPU address high byte.
- LA22B: .byte $C2 ;PPU address low byte.
- LA22C: .byte $12 ;PPU string length.
- ; 'T H E _ O T H E R _ M E T R O I'
- LA22D: .byte $1D, $11, $0E, $FF, $18, $1D, $11, $0E, $1B, $FF, $16, $0E, $1D, $1B, $18, $12
- ; 'D .'
- LA23D: .byte $0D, $07
- LA23F: .byte $00 ;End PPU string write.
- ;Writes end message on name table 0 in row $2200 (18th row from top).
- LA240: .byte $22 ;PPU address high byte.
- LA241: .byte $03 ;PPU address low byte.
- LA242: .byte $18 ;PPU string length.
- ; 'P R A Y _ F O R _ A _ T R U E _'
- LA243: .byte $19, $1B, $0A, $22, $FF, $0F, $18, $1B, $FF, $0A, $FF, $1D, $1B, $1E, $0E, $FF
- ; 'P E A C E _ I N'
- LA253: .byte $19, $0E, $0A, $0C, $0E, $FF, $12, $17
- ;Writes end message on name table 0 in row $2240 (19th row from top).
- LA25B: .byte $22 ;PPU address high byte.
- LA25C: .byte $42 ;PPU address low byte.
- LA25D: .byte $06 ;PPU string length.
- ; 'S P A C E !'
- LA25E: .byte $1C, $19, $0A, $0C, $0E, $3F
- LA25F: .byte $00 ;End PPU string write.
- ;The following pointer table is accessed by the NMIScreenWrite routine.
- ;It is used to locate the start of the PPU strings below.
- EndMessageStringTbl1:
- LA265: .word $A26D, $A276, $A27F, $A288
- ;Erases end message on name table 0 in row $2060 (4th row from top).
- LA26D: .byte $20 ;PPU address high byte.
- LA26E: .byte $6D ;PPU address low byte.
- LA26F: .byte $48 ;PPU string length.
- LA270: .byte $FF ;Repeat bit set. Repeats entry 8 times.
- ;Erases end message on name table 0 in row $20C0 (7th row from top).
- LA271: .byte $20 ;PPU address high byte.
- LA272: .byte $C3 ;PPU address low byte.
- LA273: .byte $5A ;PPU string length.
- LA274: .byte $FF ;Repeat bit set. Repeats entry 26 times.
- LA275: .byte $00 ;End PPU string write.
- ;Erases end message on name table 0 in row $2100 (9th row from top).
- LA276: .byte $21 ;PPU address high byte.
- LA277: .byte $03 ;PPU address low byte.
- LA278: .byte $57 ;PPU string length.
- LA279: .byte $FF ;Repeat bit set. Repeats entry 23 times.
- ;Erases end message on name table 0 in row $2140 (11th row from top).
- LA27A: .byte $21 ;PPU address high byte.
- LA27B: .byte $42 ;PPU address low byte.
- LA27C: .byte $4A ;PPU string length.
- LA27D: .byte $FF ;Repeat bit set. Repeats entry 10 times.
- LA27E: .byte $00 ;End PPU string write.
- ;Erases end message on name table 0 in row $2180 (13th row from top).
- LA27F: .byte $21 ;PPU address high byte.
- LA280: .byte $83 ;PPU address low byte.
- LA281: .byte $58 ;PPU string length.
- LA282: .byte $FF ;Repeat bit set. Repeats entry 24 times.
- ;Erases end message on name table 0 in row $21C0 (15th row from top).
- LA283: .byte $21 ;PPU address high byte.
- LA284: .byte $C2 ;PPU address low byte.
- LA285: .byte $52 ;PPU string length.
- LA286: .byte $FF ;Repeat bit set. Repeats entry 12 times.
- LA287: .byte $00 ;End PPU string write.
- ;Erases end message on name table 0 in row $2200 (18th row from top).
- LA288: .byte $22 ;PPU address high byte.
- LA289: .byte $03 ;PPU address low byte.
- LA28A: .byte $58 ;PPU string length.
- LA28B: .byte $FF ;Repeat bit set. Repeats entry 24 times.
- ;Erases end message on name table 0 in row $2240 (19th row from top).
- LA28C: .byte $22 ;PPU address high byte.
- LA28D: .byte $42 ;PPU address low byte.
- LA28E: .byte $4A ;PPU string length.
- LA28F: .byte $FF ;Repeat bit set. Repeats entry 10 times.
- LA290: .byte $00 ;End PPU string write
- ;The following table is used by the LoadCredits routine to load the end credits on the screen.
- CreditsPointerTbl:
- LA291: .word $A2E9, $A2FB, $A31A, $A31B, $A32D, $A339, $A34F, $A362, $A375, $A384, $A39F, $A3AA
- LA2A9: .word $A3C8, $A3D8, $A3F1, $A412, $A417, $A426, $A442, $A46B, $A470, $A493, $A49C, $A4AD
- LA2C1: .word $A4BD, $A4CD, $A4D2, $A4D7, $A4DC, $A4E1, $A4E6, $A4EB, $A4EF, $A4F0, $A508, $A51A
- LA2D9: .word $A51F, $A524, $A51F, $A524, $A538, $A53D, $A538, $A53D
- ;Writes credits on name table 0 in row $2020 (2nd row from top).
- LA2E9: .byte $20 ;PPU address high byte.
- LA2EA: .byte $2C ;PPU address low byte.
- LA2EB: .byte $0A ;PPU string length.
- ; 'H A I _ Y U K A M I'
- LA2EC: .byte $11, $0A, $12, $FF, $22, $1E, $14, $0A, $16, $12
- ;Clears attribute table 0 starting at $23C0.
- LA2F6: .byte $23 ;PPU address high byte.
- LA2F7: .byte $C0 ;PPU address low byte.
- LA2F8: .byte $60 ;PPU string length.
- LA2F9: .byte $00 ;Repeat bit set. Repeats entry 32 times.
- LA2FA: .byte $00 ;End PPU string write.
- ;Writes credits on name table 0 in row $2060 (4th row from top)
- LA2FB: .byte $20 ;PPU address high byte.
- LA2FC: .byte $6A ;PPU address low byte.
- LA2FD: .byte $0D ;PPU string length.
- ; 'Z A R U _ S O B A J I M A'
- LA2FE: .byte $23, $0A, $1B, $1E, $FF, $1C, $18, $0B, $0A, $13, $12, $16, $0A
- ;Writes credits on name table 0 in row $20A0 (6th row from top).
- LA30B: .byte $20 ;PPU address high byte.
- LA30C: .byte $AB ;PPU address low byte.
- LA30D: .byte $0B ;PPU string length.
- ; 'G P Z _ S E N G O K U'
- LA30E: .byte $10, $19, $23, $FF, $1C, $0E, $17, $10, $18, $14, $1E
- LA319: .byte $00 ;End PPU string write.
- LA31A: .byte $00 ;End PPU string write.
- ;Writes credits on name table 0 in row $2160 (12th row from top).
- LA31B: .byte $21 ;PPU address high byte.
- LA31C: .byte $6A ;PPU address low byte.
- LA31D: .byte $0A ;PPU string length.
- ; 'N . S H I O T A N I'
- LA31E: .byte $17, $07, $1C, $11, $12, $18, $1D, $0A, $17, $12
- ;Clears attribute table 0 starting at $23E0
- LA328: .byte $23 ;PPU address high byte.
- LA329: .byte $E0 ;PPU address low byte.
- LA32A: .byte $60 ;PPU string length.
- LA32B: .byte $00 ;Repeat bit set. Repeats entry 32 times.
- LA32C: .byte $00 ;End PPU string write.
- ;Writes credits on name table 0 in row $21E0 (16th row from top).
- LA32D: .byte $21 ;PPU address high byte.
- LA32E: .byte $EB ;PPU address low byte.
- LA32F: .byte $08 ;PPU string length.
- ; 'M . H O U D A I'
- LA330: .byte $16, $07, $11, $18, $1E, $0D, $0A, $12
- LA338: .byte $00 ;End PPU string write.
- ;Writes credits on name table 0 in row $22A0 (22nd row from top).
- LA339: .byte $22 ;PPU address high byte.
- LA33A: .byte $A7 ;PPU address low byte.
- LA33B: .byte $12 ;PPU string length.
- ; 'S P E C I A L _ T H A N K S _ _ '
- LA33C: .byte $1C, $19, $0E, $0C, $12, $0A, $15, $FF, $1D, $11, $0A, $17, $14, $1C, $FF, $FF
- ; 'T O'
- LA34C: .byte $1D, $18
- LA34E: .byte $00 ;End PPU string write.
- ;Writes credits on name table 0 in row $22E0 (24nd row from top).
- LA34F: .byte $22 ;PPU address high byte.
- LA350: .byte $EC ;PPU address low byte.
- LA351: .byte $08 ;PPU string length.
- ; 'K E N _ Z U R I'
- LA352: .byte $14, $0E, $17, $FF, $23, $1E, $1B, $12
- ;Writes credits on name table 0 in row $2320 (26nd row from top).
- LA35A: .byte $23 ;PPU address high byte.
- LA35B: .byte $2E ;PPU address low byte.
- LA35C: .byte $04 ;PPU string length.
- ; 'S U M I'
- LA35D: .byte $1C, $1E, $16, $12
- LA361: .byte $00 ;End PPU string write.
- ;Writes credits on name table 0 in row $2360 (28nd row from top).
- LA362: .byte $23 ;PPU address high byte.
- LA363: .byte $6C ;PPU address low byte.
- LA364: .byte $07 ;PPU string length.
- ; 'I N U S A W A'
- LA365: .byte $12, $17, $1E, $1C, $0A, $20, $0A
- ;Writes credits on name table 0 in row $23A0 (bottom row).
- LA36C: .byte $23 ;PPU address high byte.
- LA36D: .byte $AD ;PPU address low byte.
- LA36E: .byte $05 ;PPU string length.
- ; 'K A C H O'
- LA36F: .byte $14, $0A, $0C, $11, $18
- LA374: .byte $00 ;End PPU string write.
- ;Writes credits on name table 2 in row $2820 (2nd row from top).
- LA375: .byte $28 ;PPU address high byte.
- LA376: .byte $28 ;PPU address low byte.
- LA377: .byte $4E ;PPU string length.
- LA378: .byte $FF ;Repeat bit set. Repeats entry 14 times.
- ;Writes credits on name table 2 in row $2860 (4th row from top).
- LA379: .byte $28 ;PPU address high byte.
- LA37A: .byte $6C ;PPU address low byte.
- LA37B: .byte $07 ;PPU string length.
- ; 'H Y A K K A N'
- LA37C: .byte $11, $22, $0A, $14, $14, $0A, $17
- LA383: .byte $00 ;End PPU string write.
- ;Writes credits on name table 2 in row $28A0 (6th row from top).
- LA384: .byte $28 ;PPU address high byte.
- LA385: .byte $A8 ;PPU address low byte.
- LA386: .byte $13 ;PPU string length.
- ; '_ _ _ _ _ G O Y A K E _ _ _ _ _'
- LA387: .byte $FF, $FF, $FF, $FF, $FF, $10, $18, $22, $0A, $14, $0E, $FF, $FF, $FF, $FF, $FF
- ; '_ _ _'
- LA397: .byte $FF, $FF, $FF
- ;Writes credits on name table 2 in row $28E0 (8th row from top).
- LA39A: .byte $28 ;PPU address high byte.
- LA39B: .byte $E8 ;PPU address low byte.
- LA39C: .byte $4F ;PPU string length.
- LA39D: .byte $FF ;Repeat bit set. Repeats entry 15 times.
- LA39E: .byte $00 ;End PPU string write.
- ;Writes credits on name table 2 in row $2920 (10th row from top).
- LA39F: .byte $29 ;PPU address high byte.
- LA3A0: .byte $2C ;PPU address low byte.
- LA3A1: .byte $07 ;PPU string length.
- ; 'H A R A D A _'
- LA3A2: .byte $11, $0A, $1B, $0A, $0D, $0A, $FF
- LA3A9: .byte $00 ;End PPU string write.
- ;Writes credits on name table 2 in row $2960 (12th row from top).
- LA3AA: .byte $29 ;PPU address high byte.
- LA3AB: .byte $66 ;PPU address low byte.
- LA3AC: .byte $16 ;PPU string length.
- ; '_ _ _ _ _ _ _ P E N P E N _ _ _'
- LA3AD: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $19, $0E, $17, $19, $0E, $17, $FF, $FF, $FF
- ; '_ _ _ _ _ _'
- LA3BD: .byte $FF, $FF, $FF, $FF, $FF, $FF
- ;Writes credits on name table 2 in row $29A0 (14th row from top).
- LA3C3: .byte $29 ;PPU address high byte.
- LA3C4: .byte $A8 ;PPU address low byte.
- LA3C5: .byte $4F ;PPU string length.
- LA3C6: .byte $FF ;Repeat bit set. Repeats entry 15 times.
- LA3C7: .byte $00 ;End PPU string write.
- ;Writes credits on name table 2 in row $29E0 (16th row from top).
- LA3C8: .byte $29 ;PPU address high byte.
- LA3C9: .byte $EA ;PPU address low byte.
- LA3CA: .byte $0C ;PPU string length.
- ; 'C O N V E R T E D _ B Y'
- LA3CB: .byte $0C, $18, $17, $1F, $0E, $1B, $1D, $0E, $0D, $FF, $0B, $22
- LA3D7: .byte $00 ;End PPU string write.
- ;Writes credits on name table 2 in row $2A20 (18th row from top).
- LA3D8: .byte $2A ;PPU address high byte.
- LA3D9: .byte $26 ;PPU address low byte.
- LA3DA: .byte $11 ;PPU string length.
- ; '_ _ _ _ _ T . N A R I H I R O _'
- LA3DB: .byte $FF, $FF, $FF, $FF, $FF, $1D, $07, $17, $0A, $1B, $12, $11, $12, $1B, $18, $FF
- ; '_'
- LA3EB: .byte $FF
- ;Writes credits on name table 2 in row $2A60 (20th row from top).
- LA3EC: .byte $2A ;PPU address high byte.
- LA3ED: .byte $67 ;PPU address low byte.
- LA3EE: .byte $51 ;PPU string length.
- LA3EF: .byte $FF ;Repeat bit set. Repeats entry 17 times.
- LA3F0: .byte $00 ;End PPU string write.
- ;Writes credits on name table 2 in row $2AE0 (24th row from top).
- LA3F1: .byte $2A ;PPU address high byte.
- LA3F2: .byte $EB ;PPU address low byte.
- LA3F3: .byte $0B ;PPU string length.
- ; 'A S S I S T E D _ B Y'
- LA3F4: .byte $0A, $1C, $1C, $12, $1C, $1D, $0E, $0D, $FF, $0B, $22
- ;Writes credits on name table 2 in row $2B20 (26th row from top).
- LA3FF: .byte $2B ;PPU address high byte.
- LA400: .byte $28 ;PPU address low byte.
- LA401: .byte $0F ;PPU string length.
- ; '_ _ _ M A K O T O _ K A N O H'
- LA402: .byte $FF, $FF, $FF, $16, $0A, $14, $18, $1D, $18, $FF, $14, $0A, $17, $18, $11
- LA411: .byte $00 ;End PPU string write.
- ;Writes credits on name table 2 in row $2BA0 (bottom row).
- LA412: .byte $2B ;PPU address high byte.
- LA413: .byte $A6 ;PPU address low byte.
- LA414: .byte $53 ;PPU string length.
- LA415: .byte $FF ;Repeat bit set. Repeats entry 19 times.
- LA416: .byte $00 ;End PPU string write.
- ;Writes credits on name table 0 in row $2020 (2nd row from the top).
- LA417: .byte $20 ;PPU address high byte.
- LA418: .byte $2B ;PPU address low byte.
- LA419: .byte $0B ;PPU string length.
- ; 'D I R E C T E D _ B Y'
- LA41A: .byte $0D, $12, $1B, $0E, $0C, $1D, $0E, $0D, $FF, $0B, $22
- LA425: .byte $00 ;End PPU string write.
- ;Writes credits on name table 0 in row $2060 (4th row from the top).
- LA426: .byte $20 ;PPU address high byte.
- LA427: .byte $67 ;PPU address low byte.
- LA428: .byte $14 ;PPU string length.
- ; '_ _ _ _ _ Y A M A M O T O _ _ _'
- LA429: .byte $FF, $FF, $FF, $FF, $FF, $22, $0A, $16, $0A, $16, $18, $1D, $18, $FF, $FF, $FF
- ; '_ _ _ _'
- LA439: .byte $FF, $FF, $FF, $FF
- ;Writes credits on name table 0 in row $20A0 (6th row from the top).
- LA43D: .byte $20 ;PPU address high byte.
- LA43E: .byte $AA ;PPU address low byte.
- LA43F: .byte $4E ;PPU string length.
- LA440: .byte $FF ;Repeat bit set. Repeats entry 14 times.
- LA441: .byte $00 ;End PPU string write.
- ;Writes credits on name table 0 in row $2120 (10th row from the top).
- LA442: .byte $21 ;PPU address high byte.
- LA443: .byte $27 ;PPU address low byte.
- LA444: .byte $11 ;PPU string length.
- ; '_ _ C H I E F _ D I R E C T O R'
- LA445: .byte $FF, $FF, $0C, $11, $12, $0E, $0F, $FF, $0D, $12, $1B, $0E, $0C, $1D, $18, $1B
- ; '_'
- LA455: .byte $FF
- ;Writes credits on name table 0 in row $2160 (12th row from the top).
- LA456: .byte $21 ;PPU address high byte.
- LA457: .byte $68 ;PPU address low byte.
- LA458: .byte $11 ;PPU string length.
- ; '_ _ S A T O R U _ O K A D A _ _'
- LA459: .byte $FF, $FF, $1C, $0A, $1D, $18, $1B, $1E, $FF, $18, $14, $0A, $0D, $0A, $FF, $FF
- ; '_'
- LA469: .byte $FF
- LA46A: .byte $00 ;End PPU string write.
- ;Writes credits on name table 0 in row $21E0 (16th row from the top).
- LA46B: .byte $21 ;PPU address high byte.
- LA46C: .byte $E6 ;PPU address low byte.
- LA46D: .byte $58 ;PPU string length.
- LA46E: .byte $FF ;Repeat bit set. Repeats entry 24 times.
- LA46F: .byte $00 ;End PPU string write.
- ;Writes credits on name table 0 in row $2220 (18th row from the top).
- LA470: .byte $22 ;PPU address high byte.
- LA471: .byte $2B ;PPU address low byte.
- LA472: .byte $10 ;PPU string length.
- ; 'P R O D U C E D _ B Y _ _ _ _ _'
- LA473: .byte $19, $1B, $18, $0D, $1E, $0C, $0E, $0D, $FF, $0B, $22, $FF, $FF, $FF, $FF, $FF
- ;Writes credits on name table 0 in row $2260 (20th row from the top).
- LA483: .byte $22 ;PPU address high byte.
- LA484: .byte $6A ;PPU address low byte.
- LA485: .byte $0C ;PPU string length.
- ; 'G U N P E I _ Y O K O I'
- LA486: .byte $10, $1E, $17, $19, $0E, $12, $FF, $22, $18, $14, $18, $12
- LA492: .byte $00 ;End PPU string write.
- ;Writes credits on name table 0 in row $22A0 (22nd row from the top).
- LA493: .byte $22 ;PPU address high byte.
- LA494: .byte $A6 ;PPU address low byte.
- LA495: .byte $53 ;PPU string length.
- LA496: .byte $FF ;Repeat bit set. Repeats entry 19 times.
- ;Writes credits on name table 0 in row $22E0 (24th row from the top).
- LA497: .byte $22 ;PPU address high byte.
- LA498: .byte $E8 ;PPU address low byte.
- LA499: .byte $4F ;PPU string length.
- LA49A: .byte $FF ;Repeat bit set. Repeats entry 15 times.
- LA49B: .byte $00 ;End PPU string write.
- ;Writes credits on name table 0 in row $2320 (26th row from the top).
- LA49C: .byte $23 ;PPU address high byte.
- LA49D: .byte $29 ;PPU address low byte.
- LA49E: .byte $4D ;PPU string length.
- LA49F: .byte $FF ;Repeat bit set. Repeats entry 13 times.
- ;Writes credits on name table 0 in row $2340 (27th row from the top).
- LA4A0: .byte $23 ;PPU address high byte.
- LA4A1: .byte $4B ;PPU address low byte.
- LA4A2: .byte $09 ;PPU string length.
- ; 'C O P Y R I G H T'
- LA4A3: .byte $0C, $18, $19, $22, $1B, $12, $10, $11, $1D
- LA4AC: .byte $00 ;End PPU string write.
- ;Writes credits on name table 0 in row $2360 (28th row from the top).
- LA4AD: .byte $23 ;PPU address high byte.
- LA4AE: .byte $6B ;PPU address low byte.
- LA4AF: .byte $4A ;PPU string length.
- LA4B0: .byte $FF ;Repeat bit set. Repeats entry 10 times.
- ;Writes credits on name table 0 in row $2380 (29th row from the top).
- LA4B1: .byte $23 ;PPU address high byte.
- LA4B2: .byte $8E ;PPU address low byte.
- LA4B3: .byte $04 ;PPU string length.
- ; '1 9 8 6'
- LA4B4: .byte $01, $09, $08, $06
- ;Writes credits on name table 0 in row $23A0 (bottom row).
- LA4B8: .byte $23 ;PPU address high byte.
- LA4B9: .byte $A8 ;PPU address low byte.
- LA4BA: .byte $4F ;PPU string length.
- LA4BB: .byte $FF ;Repeat bit set. Repeats entry 10 times.
- LA4BC: .byte $00 ;End PPU string write.
- ;Writes credits on name table 2 in row $2800 (top row)
- LA4BD: .byte $28 ;PPU address high byte.
- LA4BE: .byte $0C ;PPU address low byte.
- LA4BF: .byte $08 ;PPU string length.
- ; 'N I N T E N D O'
- LA4C0: .byte $17, $12, $17, $1D, $0E, $17, $0D, $18
- ;Writes credits on name table 2 in row $2860 (4th row from top).
- LA4C8: .byte $28 ;PPU address high byte.
- LA4C9: .byte $66 ;PPU address low byte.
- LA4CA: .byte $51 ;PPU string length.
- LA4CB: .byte $FF ;Repeat bit set. Repeats entry 17 times.
- LA4CC: .byte $00 ;End PPU string write.
- ;Writes credits on name table 2 in row $28A0 (6th row from top).
- LA4CD: .byte $28 ;PPU address high byte.
- LA4CE: .byte $AA ;PPU address low byte.
- LA4CF: .byte $4C ;PPU string length.
- LA4D0: .byte $FF ;Repeat bit set. Repeats entry 12 times.
- LA4D1: .byte $00 ;End PPU string write.
- ;Writes credits on name table 2 in row $2920 (10th row from top).
- LA4D2: .byte $29 ;PPU address high byte.
- LA4D3: .byte $26 ;PPU address low byte.
- LA4D4: .byte $5B ;PPU string length.
- LA4D5: .byte $FF ;Repeat bit set. Repeats entry 27 times.
- LA4D6: .byte $00 ;End PPU string write.
- ;Writes credits on name table 2 in row $2960 (12th row from top).
- LA4D7: .byte $29 ;PPU address high byte.
- LA4D8: .byte $67 ;PPU address low byte.
- LA4D9: .byte $52 ;PPU string length.
- LA4DA: .byte $FF ;Repeat bit set. Repeats entry 18 times.
- LA4DB: .byte $00 ;End PPU string write.
- ;Writes credits on name table 2 in row $29E0 (16th row from top).
- LA4DC: .byte $29 ;PPU address high byte.
- LA4DD: .byte $E6 ;PPU address low byte.
- LA4DE: .byte $54 ;PPU string length.
- LA4DF: .byte $FF ;Repeat bit set. Repeats entry 20 times.
- LA4E0: .byte $00 ;End PPU string write.
- ;Writes credits on name table 2 in row $2A20 (18th row from top).
- LA4E1: .byte $2A ;PPU address high byte.
- LA4E2: .byte $28 ;PPU address low byte.
- LA4E3: .byte $55 ;PPU string length.
- LA4E4: .byte $FF ;Repeat bit set. Repeats entry 21 times.
- LA4E5: .byte $00 ;End PPU string write.
- ;Writes credits on name table 2 in row $2AE0 (24th row from top).
- LA4E6: .byte $2A ;PPU address high byte.
- LA4E7: .byte $E6 ;PPU address low byte.
- LA4E8: .byte $50 ;PPU string length.
- LA4E9: .byte $FF ;Repeat bit set. Repeats entry 16 times.
- LA4EA: .byte $00 ;End PPU string write.
- ;Writes credits on name table 2 in row $2B20 (26th row from top).
- LA4EB: .byte $2B ;PPU address high byte.
- LA4EC: .byte $29 ;PPU address low byte.
- LA4ED: .byte $4E ;PPU string length.
- LA4EE: .byte $FF ;Repeat bit set. Repeats entry 14 times.
- LA4EF: .byte $00 ;End PPU string write.
- ;Writes the top half of 'The End' on name table 0 in row $2020 (2nd row from top).
- LA4F0: .byte $20 ;PPU address high byte.
- LA4F1: .byte $26 ;PPU address low byte.
- LA4F2: .byte $14 ;PPU string length.
- LA4F3: .byte $FF, $FF, $FF, $FF, $FF, $24, $25, $26, $27, $FF, $FF, $2C, $2D, $2E, $2F, $FF
- LA503: .byte $FF, $FF, $FF, $FF
- LA507: .byte $00 ;End PPU string write.
- ;Writes the bottom half of 'The End' on name table 0 in row $2040 (3rd row from top).
- LA508: .byte $20 ;PPU address high byte.
- LA509: .byte $4B ;PPU address low byte.
- LA50A: .byte $0A ;PPU string length.
- LA50B: .byte $28, $29, $2A, $2B, $FF, $FF, $02, $03, $04, $05
- ;Writes credits on name table 0 in row $2060 (4th row from top).
- LA515: .byte $20 ;PPU address high byte.
- LA516: .byte $6A ;PPU address low byte.
- LA517: .byte $4C ;PPU string length.
- LA518: .byte $FF ;Repeat bit set. Repeats entry 12 times.
- LA519: .byte $00 ;End PPU string write.
- ;Writes credits on name table 0 in row $2120 (10th row from top).
- LA51A: .byte $21 ;PPU address high byte.
- LA51B: .byte $26 ;PPU address low byte.
- LA51C: .byte $53 ;PPU string length.
- LA51D: .byte $FF ;Repeat bit set. Repeats entry 19 times.
- LA51E: .byte $00 ;End PPU string write.
- ;Writes credits on name table 0 in row $2160 (12th row from top).
- LA51F: .byte $21 ;PPU address high byte.
- LA520: .byte $6A ;PPU address low byte.
- LA521: .byte $4C ;PPU string length.
- LA522: .byte $FF ;Repeat bit set. Repeats entry 12 times.
- LA523: .byte $00 ;End PPU string write.
- ;Writes credits on name table 0 in row $2180 (13th row from top).
- LA524: .byte $21 ;PPU address high byte.
- LA525: .byte $88 ;PPU address low byte.
- LA526: .byte $11 ;PPU string length.
- ; '_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _'
- LA527: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
- ; '_'
- LA537: .byte $FF
- ;Writes credits on name table 0 in row $2220 (18th row from top).
- LA538: .byte $22 ;PPU address high byte.
- LA539: .byte $26 ;PPU address low byte.
- LA53A: .byte $4B ;PPU string length.
- LA53B: .byte $FF ;Repeat bit set. Repeats entry 11 times.
- LA53C: .byte $00 ;End PPU string write.
- LA53D: .byte $00 ;End PPU block write.
- ;-------------------------------------------[ World map ]--------------------------------------------
- WorldMap:
- LA53E: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
- LA54E: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
- LA55E: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $08, $FF, $08, $FF, $FF
- LA56E: .byte $FF, $FF, $FF, $FF, $08, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
- LA57E: .byte $FF, $FF, $FF, $2C, $2B, $27, $15, $15, $16, $14, $13, $04, $FF, $06, $08, $0A
- LA58E: .byte $1A, $29, $29, $28, $2E, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $08, $FF
- LA59E: .byte $FF, $0E, $FF, $01, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $06, $FF, $03, $1F, $23
- LA5AE: .byte $25, $24, $26, $20, $1E, $1F, $21, $21, $07, $22, $1D, $1B, $21, $20, $04, $FF
- LA5BE: .byte $FF, $10, $FF, $0E, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $06, $FF, $06, $FF, $FF
- LA5CE: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $02, $FF
- LA5DE: .byte $FF, $10, $FF, $0B, $FF, $FF, $08, $0A, $1A, $29, $28, $04, $FF, $06, $FF, $FF
- LA5EE: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $08, $0A, $1A, $29, $29, $28, $04, $FF
- LA5FE: .byte $FF, $10, $FF, $0B, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $06, $FF, $06, $FF, $FF
- LA60E: .byte $FF, $FF, $08, $FF, $FF, $FF, $08, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $06, $FF
- LA61E: .byte $FF, $10, $FF, $0F, $11, $13, $14, $14, $13, $12, $0D, $03, $00, $05, $0C, $0E
- LA62E: .byte $0E, $0D, $10, $0C, $0F, $0D, $10, $0C, $0E, $1B, $0F, $0E, $0F, $0D, $04, $FF
- LA63E: .byte $FF, $10, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $0C, $06, $FF, $06, $FF, $FF
- LA64E: .byte $FF, $FF, $11, $FF, $FF, $FF, $06, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $08, $FF
- LA65E: .byte $FF, $10, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $0C, $06, $FF, $06, $FF, $FF
- LA66E: .byte $FF, $FF, $11, $0A, $1A, $28, $04, $FF, $06, $FF, $FF, $FF, $FF, $FF, $06, $FF
- LA67E: .byte $FF, $10, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $0C, $06, $FF, $06, $FF, $FF
- LA68E: .byte $FF, $FF, $08, $FF, $FF, $FF, $08, $FF, $08, $1B, $06, $19, $19, $2A, $0B, $FF
- LA69E: .byte $FF, $0F, $04, $03, $02, $05, $06, $07, $08, $09, $0A, $06, $FF, $03, $12, $14
- LA6AE: .byte $15, $14, $07, $16, $15, $13, $0B, $FF, $0C, $07, $19, $19, $19, $2A, $0E, $FF
- LA6BE: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $06, $FF, $08, $FF, $FF
- LA6CE: .byte $FF, $FF, $FF, $FF, $FF, $FF, $01, $FF, $0A, $1B, $04, $0F, $06, $2A, $0E, $FF
- LA6DE: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $06, $FF, $06, $FF, $FF
- LA6EE: .byte $FF, $FF, $FF, $FF, $FF, $FF, $02, $FF, $06, $FF, $FF, $FF, $FF, $FF, $09, $FF
- LA6FE: .byte $FF, $08, $17, $09, $14, $13, $18, $12, $14, $19, $13, $04, $FF, $08, $1D, $1F
- LA70E: .byte $06, $1F, $19, $1E, $1E, $1C, $03, $28, $29, $29, $29, $2B, $29, $2A, $0E, $FF
- LA71E: .byte $FF, $FF, $FF, $FF, $FF, $FF, $06, $FF, $FF, $FF, $FF, $08, $FF, $08, $1D, $1F
- LA72E: .byte $1E, $19, $07, $19, $19, $2C, $06, $06, $2B, $2B, $1A, $1A, $1A, $2A, $0B, $FF
- LA73E: .byte $FF, $FF, $FF, $FF, $FF, $FF, $06, $FF, $0B, $FF, $FF, $0B, $FF, $06, $07, $04
- LA74E: .byte $0F, $10, $0B, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $09, $FF
- LA75E: .byte $FF, $FF, $FF, $FF, $FF, $FF, $06, $FF, $07, $17, $18, $0C, $FF, $08, $21, $25
- LA76E: .byte $25, $22, $03, $21, $25, $20, $00, $27, $2C, $2C, $06, $04, $0F, $10, $0E, $FF
- LA77E: .byte $FF, $FF, $FF, $FF, $FF, $FF, $03, $1C, $07, $17, $18, $0C, $FF, $0A, $21, $23
- LA78E: .byte $25, $22, $03, $21, $24, $24, $24, $23, $23, $06, $24, $25, $22, $11, $2D, $FF
- LA79E: .byte $FF, $FF, $FF, $FF, $FF, $FF, $08, $01, $07, $17, $18, $0C, $FF, $09, $FF, $FF
- LA7AE: .byte $FF, $06, $06, $FF, $FF, $FF, $FF, $FF, $FF, $07, $26, $25, $22, $0B, $2D, $FF
- LA7BE: .byte $FF, $0B, $FF, $FF, $FF, $FF, $FF, $02, $0B, $FF, $FF, $08, $FF, $0A, $12, $14
- LA7CE: .byte $13, $03, $12, $15, $13, $0D, $12, $14, $06, $14, $18, $15, $19, $07, $09, $FF
- LA7DE: .byte $FF, $09, $17, $1C, $10, $19, $18, $03, $13, $10, $18, $0C, $FF, $06, $FF, $FF
- LA7EE: .byte $FF, $09, $04, $0F, $10, $0B, $FF, $FF, $08, $12, $16, $16, $16, $13, $0E, $FF
- LA7FE: .byte $FF, $0A, $17, $1C, $1C, $1C, $18, $03, $13, $19, $12, $0B, $FF, $00, $FF, $FF
- LA80E: .byte $0B, $08, $12, $19, $19, $07, $FF, $FF, $08, $05, $FF, $FF, $FF, $FF, $06, $FF
- LA81E: .byte $FF, $05, $FF, $FF, $0B, $FF, $FF, $08, $FF, $FF, $FF, $FF, $0B, $FF, $FF, $FF
- LA82E: .byte $FF, $06, $FF, $FF, $FF, $FF, $FF, $05, $06, $01, $FF, $FF, $FF, $FF, $0B, $FF
- LA83E: .byte $FF, $05, $FF, $FF, $07, $17, $18, $04, $13, $14, $14, $16, $0C, $FF, $05, $FF
- LA84E: .byte $FF, $05, $0F, $18, $17, $18, $19, $29, $05, $02, $FF, $FF, $FF, $FF, $05, $FF
- LA85E: .byte $FF, $05, $FF, $FF, $08, $FF, $FF, $05, $FF, $0B, $10, $18, $0D, $FF, $0A, $20
- LA86E: .byte $22, $0D, $25, $26, $26, $26, $1D, $0E, $0E, $03, $23, $24, $24, $15, $07, $FF
- LA87E: .byte $FF, $05, $FF, $FF, $23, $17, $18, $06, $22, $0C, $FF, $0B, $0E, $FF, $0B, $FF
- LA88E: .byte $FF, $04, $FF, $FF, $FF, $FF, $05, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $08, $FF
- LA89E: .byte $FF, $23, $22, $1A, $13, $10, $14, $1C, $16, $06, $21, $0C, $0E, $FF, $0A, $1C
- LA8AE: .byte $1D, $03, $20, $21, $21, $22, $06, $23, $0F, $28, $27, $27, $27, $19, $07, $FF
- LA8BE: .byte $FF, $0B, $FF, $1E, $1F, $20, $20, $20, $0F, $15, $21, $24, $0E, $FF, $04, $FF
- LA8CE: .byte $FF, $FF, $FF, $FF, $FF, $FF, $04, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $08, $FF
- LA8DE: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $1D, $1B, $17, $18, $0C, $FF, $04, $11
- LA8EE: .byte $10, $12, $13, $14, $14, $15, $03, $1C, $1E, $1E, $1F, $1F, $1F, $1D, $07, $FF
- LA8FE: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $0B, $FF, $0C, $16
- LA90E: .byte $18, $17, $18, $17, $0F, $17, $17, $1A, $1A, $17, $1B, $1B, $17, $19, $09, $FF
- LA91E: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
- LA91F: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
- CopyMap:
- LA93E: LDA #$3E ;
- LA940: STA $00 ;
- LA942: LDA #$A5 ;
- LA944: STA $01 ;
- LA946: LDA #$00 ;
- LA948: STA $02 ;
- LA94A: LDA #$70 ;Loads contents of world map into -->
- LA94C: STA $03 ;RAM at addresses $7000 thru $73FF.
- LA94E: LDX #$04 ;
- LA950:* LDY #$00 ;
- LA952:* LDA ($00),Y ;
- LA954: STA ($02),Y ;
- LA956: INY ;
- LA957: BNE - ;
- LA959: INC $01 ;
- LA95B: INC $03 ;
- LA95D: DEX ;
- LA95E: BNE -- ;
- LA960: RTS ;
- ;Unused tile patterns.
- LA961: .byte $00, $40, $90, $D0, $08, $5C, $0C, $00, $00, $C0, $70, $F8, $FC, $F4, $FC, $10
- LA962: .byte $22, $56, $03, $2B, $74, $37, $0D, $3F, $5F, $7D, $7F, $7F, $5F, $3F, $0F, $68
- LA981: .byte $F6, $BC, $5E, $3C, $DE, $7C, $F0, $FC, $DE, $FE, $FE, $FE, $FE, $FC, $F0, $00
- LA991: .byte $00, $7F, $80, $80, $FF, $7F, $00, $00, $7F, $80, $7F, $FF, $FF, $7F, $00, $00
- LA9A1: .byte $00, $FC, $01, $03, $FF, $FE, $00, $00, $FE, $03, $FF, $FF, $FF, $FE, $00, $00
- LA9B1: .byte $10, $20, $20, $00, $20, $00, $00, $3C, $42, $81, $81, $81, $81, $42, $3C, $7F
- LA9C1: .byte $7F, $3F, $1F, $80, $0F, $08, $88, $12, $80, $C0, $E0, $E0, $EF, $E8, $E8, $FC
- LA9D1: .byte $FC, $FC, $F8, $1C, $DC, $58, $5C, $48, $04, $0C, $18, $1C, $DC, $18, $1C, $0F
- LA9E1: .byte $00, $9F, $3F, $7F, $DB, $00, $00, $E0, $E0, $FF, $FF, $FF, $DB, $00, $00, $DC
- LA9F1: .byte $18, $EC, $F4, $F8, $6C, $00, $00, $1C, $18, $FC, $FC, $FC, $6C, $00, $00, $FF
- LAA01: .byte $FF, $C0, $C0, $CF, $CB, $CC, $CC, $00, $00, $1F, $3F, $3F, $38, $3B, $3B, $FC
- LAA11: .byte $FC, $0C, $0C, $CC, $4C, $CC, $CC, $00, $04, $EC, $FC, $FC, $3C, $BC, $BC, $CB
- LAA21: .byte $CF, $C0, $C0, $FF, $FF, $00, $00, $3B, $30, $3F, $1F, $7F, $FF, $00, $00, $4C
- LAA31: .byte $CC, $0C, $0C, $FC, $FC, $00, $00, $3C, $3C, $FC, $EC, $FC, $FC, $00, $00, $FE
- LAA41: .byte $82, $82, $82, $82, $FE, $00, $00, $00, $7E, $56, $56, $7E, $FE, $00, $00, $20
- LAA51: .byte $00, $00, $18, $20, $00, $00, $18, $1C, $F7, $3C, $18, $1C, $F7, $3C, $18, $E2
- LAA61: .byte $80, $10, $20, $00, $00, $80, $00, $E2, $98, $2C, $5E, $7E, $3C, $98, $00, $7E
- LAA71: .byte $00, $7E, $00, $7E, $00, $7E, $00, $6E, $00, $6E, $00, $6E, $00, $6E, $00, $10
- LAA81: .byte $F4, $08, $04, $C5, $24, $23, $05, $E8, $F8, $0E, $E6, $F7, $37, $2E, $FD, $00
- LAA91: .byte $5F, $20, $48, $D7, $88, $18, $80, $3F, $3F, $E0, $C7, $CF, $B8, $98, $7F, $F8
- LAAA1: .byte $10, $10, $10, $D7, $08, $00, $EF, $F8, $10, $30, $B7, $F7, $30, $DF, $EF, $FF
- LAAB1: .byte $00, $08, $08, $EF, $08, $10, $EF, $FF, $00, $18, $DB, $FF, $38, $F7, $EF, $FF
- LAAC1: .byte $7F, $3F, $5F, $4F, $07, $03, $01, $00, $B0, $C0, $E0, $F0, $F8, $FC, $FE, $FE
- LAAD1: .byte $FE, $FE, $FA, $FA, $FE, $FE, $FE, $00, $1A, $06, $0A, $1A, $3E, $7E, $FE, $01
- LAAE1: .byte $03, $07, $4F, $5F, $27, $7F, $00, $FF, $FF, $FF, $FF, $FF, $E7, $FF, $00, $7E
- LAAF1: .byte $BE, $DA, $EA, $F6, $CA, $FC, $00, $FE, $FE, $FA, $FA, $FE, $CE, $FE, $00, $CF
- LAB01: .byte $BF, $70, $60, $C4, $C8, $C0, $C0, $47, $BF, $70, $27, $4B, $57, $5F, $DF, $CC
- LAB11: .byte $F4, $38, $18, $0C, $0C, $0C, $0C, $CC, $F4, $38, $98, $CC, $EC, $EC, $EC, $C0
- LAB21: .byte $C0, $60, $70, $BF, $CF, $00, $00, $DF, $CF, $67, $70, $BF, $4F, $00, $00, $0C
- LAB31: .byte $0C, $18, $38, $F4, $CC, $00, $00, $EC, $CC, $98, $38, $F4, $CC, $00, $00, $FF
- LAB41: .byte $FF, $C0, $DF, $D0, $D0, $DF, $C0, $00, $00, $3F, $3F, $35, $35, $20, $3F, $FC
- LAB51: .byte $FC, $0C, $EC, $2C, $2C, $EC, $0C, $00, $04, $FC, $FC, $5C, $5C, $1C, $FC, $FF
- LAB61: .byte $00, $00, $E4, $00, $CF, $00, $00, $7F, $00, $00, $E3, $00, $BF, $00, $00, $FC
- LAB71: .byte $00, $00, $F9, $00, $87, $00, $00, $FC, $00, $00, $F7, $00, $67, $00, $00, $FE
- LAB81: .byte $02, $02, $02, $FE, $00, $00, $7F, $00, $FE, $0E, $FE, $FE, $00, $00, $00, $7F
- LAB91: .byte $40, $40, $40, $7F, $00, $00, $FE, $00, $3F, $30, $3F, $7F, $00, $00, $00, $40
- LABA1: .byte $40, $40, $7F, $00, $00, $00, $FF, $3F, $30, $3F, $7F, $00, $00, $FF, $FF, $02
- LABB1: .byte $02, $02, $FE, $00, $00, $00, $FF, $FE, $0E, $FE, $FE, $00, $00, $FF, $FF, $FF
- LABC1: .byte $FF, $C0, $D0, $C0, $C0, $C0, $C0, $00, $00, $3F, $27, $3F, $3F, $3F, $3F, $FC
- LABD1: .byte $FC, $0C, $4C, $0C, $0C, $0C, $0C, $00, $04, $FC, $9C, $FC, $FC, $FC, $FC, $C0
- LABE1: .byte $C0, $D0, $C0, $FF, $FF, $00, $00, $3F, $3F, $27, $3F, $3F, $7F, $00, $00, $0C
- LABF1: .byte $0C, $4C, $0C, $FC, $FC, $00, $00, $FC, $FC, $9C, $FC, $FC, $FC, $00, $00
- ;------------------------------------------[ Area music data ]---------------------------------------
- ;There are 3 control bytes associated with the music data and the rest are musical note indexes.
- ;If the byte has the binary format 1011xxxx ($Bx), then the byte is an index into the corresponding
- ;musical notes table and is used to set the note length until it is set by another note length
- ;byte. The lower 4 bits are the index into the note length table. Another control byte is the loop
- ;and counter btye. The loop and counter byte has the format 11xxxxxx. Bits 0 thru 6 contain the
- ;number of times to loop. The third control byte is #$FF. This control byte marks the end of a loop
- ;and decrements the loop counter. If #$00 is found in the music data, the music has reached the end.
- ;A #$00 in any of the different music channel data segments will mark the end of the music. The
- ;remaining bytes are indexes into the MusicNotesTbl and should only be even numbers as there are 2
- ;bytes of data per musical note.
- EndSQ1Data:
- LAC00: .byte $C2 ;
- LAC01: .byte $B4 ;7/8 seconds +
- LAc02: .byte $2A ;A3 |
- LAC03: .byte $30 ;C4 | Repeat 2 times.
- LAC04: .byte $2E ;B3 |
- LAC05: .byte $2C ;A#3 +
- LAC06: .byte $FF ;
- LAC07: .byte $2A ;A3
- LAC08: .byte $2A ;A3
- LAC09: .byte $C2 ;
- LAC0A: .byte $B0 ;1/4 seconds +
- LAC0B: .byte $3C ;F#4 |
- LAC0C: .byte $42 ;A4 |
- LAC0D: .byte $4C ;D5 |
- LAC0E: .byte $54 ;F#5 |
- LAC0F: .byte $B2 ;7/32 seconds |
- LAC10: .byte $5A ;A5 |
- LAC11: .byte $56 ;G5 |
- LAC12: .byte $54 ;F#5 |
- LAC13: .byte $B4 ;7/8 seconds |
- LAC14: .byte $4C ;D5 |
- LAC15: .byte $B0 ;1/4 seconds |
- LAC16: .byte $38 ;E4 | Repeat 2 times.
- LAC17: .byte $3C ;F#4 |
- LAC18: .byte $3E ;G4 |
- LAC19: .byte $42 ;A4 |
- LAC1A: .byte $B2 ;7/32 seconds |
- LAC1B: .byte $4C ;D5 |
- LAC1C: .byte $42 ;A4 |
- LAC1D: .byte $B0 ;1/4 seconds |
- LAC1E: .byte $56 ;G5 |
- LAC1F: .byte $54 ;F#5 |
- LAC20: .byte $4C ;D5 |
- LAC21: .byte $42 ;A4 |
- LAC22: .byte $B3 ;7/16 seconds |
- LAC23: .byte $3E ;G4 |
- LAC24: .byte $4C ;D5 +
- LAC25: .byte $FF ;
- LAC26: .byte $C2 ;
- LAC27: .byte $B3 ;7/16 seconds +
- LAC28: .byte $4A ;C#5 |
- LAC29: .byte $B2 ;7/32 seconds |
- LAC2A: .byte $4C ;D5 |
- LAC2B: .byte $42 ;A4 |
- LAC2C: .byte $54 ;F#5 |
- LAC2D: .byte $50 ;E5 |
- LAC2E: .byte $56 ;G5 |
- LAC2F: .byte $54 ;F#5 |
- LAC30: .byte $B1 ;7/64 seconds |
- LAC31: .byte $50 ;E5 |
- LAC32: .byte $4C ;D5 | Repeat 2 times.
- LAC33: .byte $44 ;A#4 |
- LAC34: .byte $3E ;G4 |
- LAC35: .byte $B2 ;7/32 seconds |
- LAC36: .byte $3C ;F#4 |
- LAC37: .byte $4C ;D5 |
- LAC38: .byte $B1 ;7/64 seconds |
- LAC39: .byte $40 ;Ab4 |
- LAC3A: .byte $46 ;B4 |
- LAC3B: .byte $B2 ;7/32 seconds |
- LAC3C: .byte $50 ;E5 |
- LAC3D: .byte $4C ;D5 |
- LAC3E: .byte $50 ;E5 +
- LAC3F: .byte $FF ;
- LAC40: .byte $C4 ;
- LAC41: .byte $B3 ;7/16 seconds +
- LAC42: .byte $2A ;A3 |
- LAC43: .byte $30 ;C4 | Repeat 4 times.
- LAC44: .byte $2E ;B3 |
- LAC45: .byte $2C ;A#3 +
- LAC46: .byte $FF ;
- LAC47: .byte $B4 ;7/8 seconds
- LAC48: .byte $34 ;D4
- LAC49: .byte $B3 ;7/16 seconds
- LAC4A: .byte $38 ;E4
- LAC4B: .byte $3E ;G4
- LAC4C: .byte $B4 ;7/8 seconds
- LAC4D: .byte $3C ;F#4
- LAC4E: .byte $B3 ;7/16 seconds
- LAC4F: .byte $3E ;G4
- LAC50: .byte $44 ;A#4
- LAC51: .byte $B5 ;1 13/16 seconds
- LAC52: .byte $34 ;D4
- LAC53: .byte $B1 ;7/64 seconds
- LAC54: .byte $2A ;A3
- LAC55: .byte $B6 ;21/32 seconds
- LAC56: .byte $1C ;D3
- LAC57: .byte $B2 ;7/32 seconds
- LAC58: .byte $02 ;No sound
- LAC59: .byte $B5 ;1 13/16 seconds
- LAC5A: .byte $26 ;G3
- LAC5B: .byte $B1 ;7/64 seconds
- LAC5C: .byte $24 ;F#3
- LAC5D: .byte $B8 ;21/64 seconds
- LAC5E: .byte $06 ;D2
- LAC5F: .byte $12 ;A2
- LAC60: .byte $1C ;D3
- LAC61: .byte $B9 ;9/32 seconds
- LAC62: .byte $02 ;No sound
- LAC63: .byte $B8 ;21/64 seconds
- LAC64: .byte $24 ;F#3
- LAC65: .byte $2A ;A3
- LAC66: .byte $34 ;D4
- LAC67: .byte $B9 ;9/32 seconds
- LAC68: .byte $02 ;No sound
- LAC69: .byte $B5 ;1 13/16 seconds
- LAC6A: .byte $38 ;E4
- LAC6B: .byte $B1 ;7/64 seconds
- LAC6C: .byte $2C ;A#3
- LAC6D: .byte $B3 ;7/16 seconds
- LAC6E: .byte $26 ;G3
- LAC6F: .byte $2A ;A3
- LAC70: .byte $B5 ;1 13/16 seconds
- LAC71: .byte $2A ;A3
- LAC72: .byte $B1 ;7/64 seconds
- LAC73: .byte $02 ;No sound
- LAC74: .byte $B8 ;21/64 seconds
- LAC75: .byte $26 ;G3
- LAC76: .byte $24 ;F#3
- LAC77: .byte $1C ;D3
- LAC78: .byte $B9 ;9/32 seconds
- LAC79: .byte $02 ;No sound
- LAC7A: .byte $B8 ;21/64 seconds
- LAC7B: .byte $20 ;E3
- LAC7C: .byte $1C ;D3
- LAC7D: .byte $20 ;E3
- LAC7E: .byte $B9 ;9/32 seconds
- LAC7F: .byte $02 ;No sound
- LAC80: .byte $B4 ;7/8 seconds
- LAC81: .byte $1C ;D3
- LAC82: .byte $B8 ;21/64 seconds
- LAC83: .byte $26 ;G3
- LAC84: .byte $2C ;A#3
- LAC85: .byte $34 ;D4
- LAC86: .byte $B9 ;9/32 seconds
- LAC87: .byte $02 ;No sound
- LAC88: .byte $B8 ;21/64 seconds
- LAC89: .byte $3E ;G4
- LAC8A: .byte $44 ;A#4
- LAC8B: .byte $4C ;D5
- LAC8C: .byte $B9 ;9/32 seconds
- LAC8D: .byte $02 ;No sound
- LAC8E: .byte $C8 ;
- LAC8F: .byte $B0 ;1/4 seconds +
- LAC90: .byte $3C ;F#4 |
- LAC91: .byte $42 ;A4 |
- LAC92: .byte $3C ;F#4 |
- LAC93: .byte $42 ;A4 |
- LAC94: .byte $42 ;A4 |
- LAC95: .byte $46 ;B4 |
- LAC96: .byte $42 ;A4 |
- LAC97: .byte $46 ;B4 | Repeat 8 times.
- LAC98: .byte $4C ;D5 |
- LAC99: .byte $50 ;E5 |
- LAC9A: .byte $4C ;D5 |
- LAC9B: .byte $50 ;E5 |
- LAC9C: .byte $50 ;E5 |
- LAC9D: .byte $54 ;F#5 |
- LAC9E: .byte $50 ;E5 |
- LAC9F: .byte $54 ;F#5 +
- LACA0: .byte $FF ;
- LACA1: .byte $C2 ;
- LACA2: .byte $B4 ;7/8 seconds +
- LACA3: .byte $2A ;A3 |
- LACA4: .byte $B3 ;7/16 seconds |
- LACA5: .byte $34 ;D4 |
- LACA6: .byte $B5 ;1 13/16 seconds|
- LACA7: .byte $32 ;C#4 |
- LACA8: .byte $B1 ;7/64 seconds |
- LACA9: .byte $2E ;B3 | Repeat 2 times.
- LACAA: .byte $B4 ;7/8 seconds |
- LACAB: .byte $2A ;A3 |
- LACAC: .byte $B3 ;7/16 seconds |
- LACAD: .byte $1C ;D3 |
- LACAE: .byte $B5 ;1 13/16 seconds|
- LACAF: .byte $26 ;G3 |
- LACB0: .byte $B1 ;7/64 seconds |
- LACB1: .byte $24 ;F#3 +
- LACB2: .byte $FF ;
- LACB3: .byte $B4 ;7/8 seconds
- LACB4: .byte $2A ;A3
- LACB5: .byte $B8 ;21/64 seconds
- LACB6: .byte $18 ;C3
- LACB7: .byte $26 ;G3
- LACB8: .byte $30 ;C4
- LACB9: .byte $B9 ;9/32 seconds
- LACBA: .byte $02 ;No sound
- LACBB: .byte $B8 ;21/64 seconds
- LACBC: .byte $1C ;D3
- LACBD: .byte $26 ;G3
- LACBE: .byte $30 ;C4
- LACBF: .byte $B9 ;9/32 seconds
- LACC0: .byte $02 ;No sound
- LACC1: .byte $B4 ;7/8 seconds
- LACC2: .byte $34 ;D4
- LACC3: .byte $B8 ;21/64 seconds
- LACC4: .byte $3A ;F4
- LACC5: .byte $30 ;C4
- LAcc6: .byte $26 ;G3
- LACC7: .byte $B9 ;9/32 seconds
- LACC8: .byte $02 ;No sound
- LACC9: .byte $B8 ;21/64 seconds
- LACCA: .byte $3E ;G4
- LACCB: .byte $38 ;E4
- LACCC: .byte $30 ;C4
- LACCD: .byte $B9 ;9/32 seconds
- LACCE: .byte $02 ;No sound
- LACCF: .byte $B4 ;7/8 seconds
- LACD0: .byte $34 ;D4
- LACD1: .byte $B2 ;7/32 seconds
- LACD2: .byte $1C ;D3
- LACD3: .byte $2A ;A3
- LACD4: .byte $26 ;G3
- LACD5: .byte $30 ;C4
- LACD6: .byte $C2 ;
- LACD7: .byte $B0 ;1/4 seconds +
- LACD8: .byte $38 ;E4 |
- LACD9: .byte $38 ;E4 |
- LACDA: .byte $38 ;E4 |
- LACDB: .byte $02 ;No sound |
- LACDC: .byte $02 ;No sound |
- LACDD: .byte $02 ;No sound |
- LACDE: .byte $38 ;E4 |
- LACDF: .byte $38 ;E4 | Repeat 2 times.
- LACE0: .byte $38 ;E4 |
- LACE1: .byte $02 ;No sound |
- LACE2: .byte $38 ;E4 |
- LACE3: .byte $38 ;E4 |
- LACE4: .byte $38 ;E4 |
- LACE5: .byte $38 ;E4 |
- LACE6: .byte $38 ;E4 |
- LACE7: .byte $02 ;No sound +
- LACE8: .byte $FF ;
- LACE9: .byte $B4 ;7/8 seconds
- LACEA: .byte $38 ;E4
- LACEB: .byte $B2 ;7/32 seconds
- LACEC: .byte $02 ;No sound
- LACED: .byte $B0 ;1/4 seconds
- LACEE: .byte $1C ;D3
- LACEF: .byte $02 ;No sound
- LACF0: .byte $1C ;D3
- LACF1: .byte $1C ;D3
- LACF2: .byte $B2 ;7/32 seconds
- LACF3: .byte $06 ;D2
- LACF4: .byte $00 ;End of end music.
- EndTriangleData:
- LACF5: .byte $CA ;
- LACF6: .byte $B0 ;1/4 seconds +
- LACF7: .byte $2A ;A3 |
- LACF8: .byte $2A ;A3 |
- LACF9: .byte $2A ;A3 |
- LACFA: .byte $02 ;No sound |
- LACFB: .byte $02 ;No sound |
- LACFC: .byte $02 ;No sound |
- LACFD: .byte $2A ;A3 | Repeat 10 times.
- LACFE: .byte $2A ;A3 |
- LACFF: .byte $2A ;A3 |
- LAD00: .byte $02 ;No sound |
- LAD01: .byte $2A ;A3 |
- LAD02: .byte $2A ;A3 |
- LAD03: .byte $2A ;A3 |
- LAD04: .byte $2A ;A3 |
- LAD05: .byte $2A ;A3 |
- LAD06: .byte $02 ;No sound +
- LAD07: .byte $FF ;
- LAD08: .byte $C2 ;
- LAD09: .byte $B2 ;7/32 seconds +
- LAD0A: .byte $34 ;D4 |
- LAD0B: .byte $34 ;D4 |
- LAD0C: .byte $32 ;C#4 |
- LAD0D: .byte $32 ;C#4 |
- LAD0E: .byte $2E ;B3 |
- LAD0f: .byte $2E ;B3 |
- LAD10: .byte $2A ;A3 |
- LAD11: .byte $2A ;A3 | Repeat 2 times.
- LAD12: .byte $26 ;G3 |
- LAD13: .byte $26 ;G3 |
- LAD14: .byte $24 ;F#3 |
- LAD15: .byte $24 ;F#3 |
- LAD16: .byte $20 ;E3 |
- LAD17: .byte $20 ;E3 |
- LAD18: .byte $2A ;A3 |
- LAD19: .byte $2A ;A3 +
- LAD1A: .byte $FF ;
- LAD1B: .byte $C2 ;
- LAD1C: .byte $26 ;G3 +
- LAD1D: .byte $26 ;G3 |
- LAD1E: .byte $24 ;F#3 |
- LAD1F: .byte $24 ;F#3 |
- LAD20: .byte $30 ;C4 |
- LAD21: .byte $30 ;C4 |
- LAD22: .byte $2E ;B3 |
- LAD23: .byte $2E ;B3 | Repeat 2 times.
- LAD24: .byte $2C ;A#3 |
- LAD25: .byte $2C ;A#3 |
- LAD26: .byte $2A ;A3 |
- LAD27: .byte $2A ;A3 |
- LAD28: .byte $28 ;Ab3 |
- LAD29: .byte $28 ;Ab3 |
- LAD2A: .byte $2A ;A3 |
- LAD2B: .byte $2A ;A3 +
- LAD2C: .byte $FF ;
- LAD2D: .byte $C8 ;
- LAD2E: .byte $B0 ;1/4 seconds +
- LAD2F: .byte $1C ;D3 |
- LAD30: .byte $1C ;D3 |
- LAD31: .byte $1C ;D3 |
- LAD32: .byte $02 ;No sound |
- LAD33: .byte $02 ;No sound |
- LAD34: .byte $02 ;No sound |
- LAD35: .byte $1C ;D3 | Repeat 8 times.
- LAD36: .byte $1C ;D3 |
- LAD37: .byte $1C ;D3 |
- LAD38: .byte $02 ;No sound |
- LAD39: .byte $1C ;D3 |
- LAD3A: .byte $1C ;D3 |
- LAD3B: .byte $1C ;D3 |
- LAD3C: .byte $1C ;D3 |
- LAD3D: .byte $1C ;D3 |
- LAD3E: .byte $02 ;No sound +
- LAD3F: .byte $FF ;
- LAD40: .byte $D8 ;
- LAD41: .byte $BA ;1/32 seconds +
- LAD42: .byte $64 ;D6 |
- LAD43: .byte $02 ;No sound |
- LAD44: .byte $64 ;D6 |
- LAD45: .byte $02 ;No sound |
- LAD46: .byte $B9 ;9/32 seconds |
- LAD47: .byte $02 ;No sound |
- LAD48: .byte $BA ;1/32 Seconds |
- LAD49: .byte $72 ;A6 |
- LAD4A: .byte $02 ;No sound |
- LAD4B: .byte $72 ;A6 |
- LAD4C: .byte $02 ;No sound |
- LAD4D: .byte $B9 ;9/32 seconds | Repeat 24 times.
- LAD4E: .byte $02 ;No sound |
- LAD4F: .byte $BA ;1/32 seconds |
- LAD50: .byte $7C ;D7 |
- LAD51: .byte $02 ;No sound |
- LAD52: .byte $7C ;D7 |
- LAD53: .byte $02 ;No sound |
- LAD54: .byte $B9 ;9/32 seconds |
- LAD55: .byte $02 ;No sound |
- LAD56: .byte $BA ;1/32 seconds |
- LAD57: .byte $72 ;A6 |
- LAD58: .byte $02 ;No sound |
- LAD59: .byte $72 ;A6 |
- LAD5A: .byte $02 ;No sound |
- LAD5B: .byte $B9 ;9/32 seconds |
- LAD5C: .byte $02 ;No sound +
- LAD5D: .byte $FF ;
- LAD5E: .byte $C4 ;
- LAD5F: .byte $B1 ;7/64 seconds +
- LAD60: .byte $34 ;D4 |
- LAD61: .byte $34 ;D4 |
- LAD62: .byte $34 ;D4 |
- LAD63: .byte $34 ;D4 |
- LAD64: .byte $02 ;No sound |
- LAD65: .byte $24 ;F#3 |
- LAD66: .byte $24 ;F#3 |
- LAD67: .byte $24 ;F#3 |
- LAD68: .byte $20 ;E3 |
- LAD69: .byte $20 ;E3 |
- LAD6A: .byte $20 ;E3 |
- LAD6B: .byte $20 ;E3 |
- LAD6C: .byte $2A ;A3 |
- LAD6D: .byte $2A ;A3 |
- LAD6E: .byte $2A ;A3 |
- LAD6F: .byte $2A ;A3 | Repeat 4 times.
- LAD70: .byte $02 ;No sound |
- LAD71: .byte $24 ;F#3 |
- LAD72: .byte $24 ;F#3 |
- LAD73: .byte $24 ;F#3 |
- LAD74: .byte $24 ;F#3 |
- LAD75: .byte $24 ;F#3 |
- LAD76: .byte $24 ;F#3 |
- LAD77: .byte $24 ;F#3 |
- LAD78: .byte $B8 ;21/64 seconds |
- LAD79: .byte $26 ;G3 |
- LAD7A: .byte $1C ;D3 |
- LAD7B: .byte $20 ;E3 |
- LAD7C: .byte $B9 ;9/32 seconds |
- LAD7D: .byte $02 ;No sound |
- LAD7E: .byte $B8 ;21/64 seconds |
- LAD7F: .byte $2C ;A#3 |
- LAD80: .byte $2A ;A3 |
- LAD81: .byte $26 ;G3 |
- LAD82: .byte $B9 ;9/32 seconds |
- LAD83: .byte $02 ;No sound +
- LAD84: .byte $FF ;
- LAD85: .byte $C3 ;
- LAD86: .byte $B0 ;1/4 seconds +
- LAD87: .byte $34 ;D4 |
- LAD88: .byte $34 ;D4 |
- LAD89: .byte $34 ;D4 |
- LAD8A: .byte $02 ;No sound |
- LAD8B: .byte $02 ;No sound |
- LAD8C: .byte $02 ;No sound |
- LAD8D: .byte $34 ;D4 |
- LAD8E: .byte $34 ;D4 |
- LAD8F: .byte $34 ;D4 |
- LAD90: .byte $02 ;No sound |
- LAD91: .byte $34 ;D4 |
- LAD92: .byte $34 ;D4 |
- LAD93: .byte $34 ;D4 |
- LAD94: .byte $34 ;D4 | Repeat 3 times.
- LAD95: .byte $34 ;D4 |
- LAD96: .byte $02 ;No sound |
- LAD97: .byte $2C ;A#3 |
- LAD98: .byte $2C ;A#3 |
- LAD99: .byte $2C ;A#3 |
- LAD9A: .byte $02 ;No sound |
- LAD9B: .byte $02 ;No sound |
- LAD9C: .byte $02 ;No sound |
- LAD9D: .byte $2C ;A#3 |
- LAD9E: .byte $2C ;A#3 |
- LAD9F: .byte $30 ;C4 |
- LADA0: .byte $02 ;No sound |
- LADA1: .byte $30 ;C4 |
- LADA2: .byte $30 ;C4 |
- LADA3: .byte $30 ;C4 |
- LADA4: .byte $30 ;C4 |
- LADA5: .byte $30 ;C4 |
- LADA6: .byte $02 ;No sound +
- LADA7: .byte $FF ;
- LADA8: .byte $C2 ;
- LADA9: .byte $1C ;D3 +
- LADAA: .byte $1C ;D3 |
- LADAB: .byte $1C ;D3 |
- LADAC: .byte $02 ;No sound |
- LADAD: .byte $02 ;No sound |
- LADAE: .byte $02 ;No sound |
- LADAF: .byte $1C ;D3 | Repeat 2 times.
- LADB0: .byte $1C ;D3 |
- LADB1: .byte $1C ;D3 |
- LADB2: .byte $02 ;No sound |
- LADB3: .byte $1C ;D3 |
- LADB4: .byte $1C ;D3 |
- LADB5: .byte $1C ;D3 |
- LADB6: .byte $1C ;D3 |
- LADB7: .byte $1C ;D3 |
- LADB8: .byte $02 ;No sound +
- LADB9: .byte $FF ;
- LADBA: .byte $B4 ;7/8 seconds
- LADBB: .byte $1C ;D3
- LADBC: .byte $B2 ;7/32 seconds
- LADBD: .byte $02 ;No sound
- LADBE: .byte $B0 ;1/4 seconds
- LADBF: .byte $1C ;D3
- LADC0: .byte $02 ;No sound
- LADC1: .byte $1C ;D3
- LADC2: .byte $1C ;D3
- LADC3: .byte $B2 ;7/32 seconds
- LADC4: .byte $1C ;D3
- EndSQ2Data:
- LADC5: .byte $C2 ;
- LADC6: .byte $B4 ;7/8 seconds +
- LADC7: .byte $20 ;E3 |
- LADC8: .byte $2A ;A3 | Repeat 2 times.
- LADC9: .byte $28 ;Ab3 |
- LADCA: .byte $26 ;G3 +
- LADCB: .byte $FF ;
- LADCC: .byte $20 ;E3
- LADCD: .byte $20 ;E3
- LADCE: .byte $C2 ;
- LADCF: .byte $B0 ;1/4 seconds +
- LADD0: .byte $34 ;D4 |
- LADD1: .byte $3C ;F#4 |
- LADD2: .byte $42 ;A4 |
- LADD3: .byte $4C ;D5 |
- LADD4: .byte $B2 ;7/32 seconds |
- LADD5: .byte $54 ;F#5 |
- LADD6: .byte $50 ;E5 |
- LADD7: .byte $4C ;D5 |
- LADD8: .byte $B3 ;7/16 seconds |
- LADD9: .byte $42 ;A4 | Repeat 2 times.
- LADDA: .byte $3C ;F#4 |
- LADDB: .byte $B3 ;7/16 seconds |
- LADDC: .byte $46 ;B4 |
- LADDD: .byte $B2 ;7/32 seconds |
- LADDE: .byte $34 ;D4 |
- LADDF: .byte $B1 ;7/64 seconds |
- LADE0: .byte $4C ;D5 |
- LADE1: .byte $B0 ;1/4 seconds |
- LADE2: .byte $42 ;A4 |
- LADE3: .byte $3C ;F#4 |
- LADE4: .byte $B3 ;7/16 seconds |
- LADE5: .byte $38 ;E4 |
- LADE6: .byte $46 ;B4 +
- LADE7: .byte $FF ;
- LADE8: .byte $C2 ;
- LADE9: .byte $B3 ;7/16 seconds +
- LADEA: .byte $38 ;E4 |
- LADEB: .byte $B2 ;7/32 seconds |
- LADEC: .byte $3C ;F#4 |
- LADED: .byte $34 ;D4 |
- LADEE: .byte $34 ;D4 |
- LADEF: .byte $30 ;C4 |
- LADF0: .byte $38 ;E4 |
- LADF1: .byte $34 ;D4 |
- LADF2: .byte $44 ;A#4 | Repeat 2 times.
- LADF3: .byte $38 ;E4 |
- LADF4: .byte $34 ;D4 |
- LADF5: .byte $42 ;A4 |
- LADF6: .byte $B1 ;7/64 seconds |
- LADF7: .byte $3A ;F4 |
- LADF8: .byte $40 ;Ab4 |
- LADF9: .byte $B2 ;7/32 seconds |
- LADFA: .byte $46 ;B4 |
- LADFB: .byte $3E ;G4 |
- LADFC: .byte $3E ;G4 +
- LADFD: .byte $FF ;
- LADFE: .byte $C4 ;
- LADFF: .byte $B2 ;7/32 seconds +
- LAE00: .byte $3C ;F#4 |
- LAE01: .byte $42 ;A4 |
- LAE02: .byte $4C ;D5 |
- LAE03: .byte $42 ;A4 | Repeat 4 times.
- LAE04: .byte $3E ;G4 |
- LAE05: .byte $42 ;A4 |
- LAE06: .byte $4C ;D5 |
- LAE07: .byte $3E ;G4 +
- LAE08: .byte $FF ;
- LAE09: .byte $C2 ;
- LAE0A: .byte $72 ;A6 +
- LAE0B: .byte $6E ;G6 |
- LAE0C: .byte $6C ;F#6 |
- LAE0D: .byte $68 ;E6 |
- LAE0E: .byte $6E ;G6 |
- LAE0F: .byte $6C ;F#6 |
- LAE10: .byte $64 ;D6 |
- LAE11: .byte $68 ;E6 +
- LAE12: .byte $FF ;
- LAE13: .byte $B4 ;7/8 seconds
- LAE14: .byte $4C ;D5
- LAE15: .byte $B3 ;7/16 seconds
- LAE16: .byte $56 ;G5
- LAE17: .byte $50 ;E5
- LAE18: .byte $B4 ;7/8 seconds
- LAE19: .byte $54 ;F#5
- LAE1A: .byte $B3 ;7/16 seconds
- LAE1B: .byte $56 ;G5
- LAE1C: .byte $5C ;A#5
- LAE1D: .byte $B4 ;7/8 seconds
- LAE1E: .byte $4C ;D5
- LAE1F: .byte $B3 ;7/16 seconds
- LAE20: .byte $50 ;E5
- LAE21: .byte $56 ;G5
- LAE22: .byte $B4 ;7/8 seconds
- LAE23: .byte $54 ;F#5
- LAE24: .byte $B3 ;7/16 seconds
- LAE25: .byte $56 ;G5
- LAE26: .byte $5C ;A#5
- LAE27: .byte $C4 ;
- LAE28: .byte $B1 ;7/64 seconds +
- LAE29: .byte $5A ;A5 |
- LAE2A: .byte $42 ;A4 |
- LAE2B: .byte $56 ;G5 |
- LAE2C: .byte $42 ;A4 |
- LAE2D: .byte $54 ;F#5 |
- LAE2E: .byte $42 ;A4 |
- LAE2F: .byte $50 ;E5 | Repeat 4 times.
- LAE30: .byte $42 ;A4 |
- LAE31: .byte $56 ;G5 |
- LAE32: .byte $3E ;G4 |
- LAE33: .byte $54 ;F#5 |
- LAE34: .byte $3E ;G4 |
- LAE35: .byte $4C ;D5 |
- LAE36: .byte $3E ;G4 |
- LAE37: .byte $50 ;E5 |
- LAE38: .byte $3E ;G4 +
- LAE39: .byte $FF ;
- LAE3A: .byte $C8 ;
- LAE3B: .byte $B0 ;1/4 seconds +
- LAE3C: .byte $3C ;F#4 |
- LAE3D: .byte $3E ;G4 |
- LAE3E: .byte $3C ;F#4 |
- LAE3F: .byte $3E ;G4 |
- LAE40: .byte $42 ;A4 |
- LAE41: .byte $46 ;B4 |
- LAE42: .byte $42 ;A4 | Repeat 8 times.
- LAE43: .byte $46 ;B4 |
- LAE44: .byte $4C ;D5 |
- LAE45: .byte $50 ;E5 |
- LAE46: .byte $4C ;D5 |
- LAE47: .byte $50 ;E5 |
- LAE48: .byte $50 ;E5 |
- LAE49: .byte $54 ;F#5 |
- LAE4A: .byte $50 ;E5 |
- LAE4B: .byte $54 ;F#5 +
- LAE4C: .byte $FF ;
- LAE4D: .byte $C3 ;
- LAE4E: .byte $B0 ;1/4 seconds +
- LAE4F: .byte $42 ;A4 |
- LAE50: .byte $42 ;A4 |
- LAE51: .byte $42 ;A4 |
- LAE52: .byte $02 ;No sound |
- LAE53: .byte $02 ;No sound |
- LAE54: .byte $02 ;No sound |
- LAE55: .byte $42 ;A4 |
- LAE56: .byte $42 ;A4 |
- LAE57: .byte $42 ;A4 |
- LAE58: .byte $02 ;No sound |
- LAE59: .byte $42 ;A4 |
- LAE5A: .byte $42 ;A4 |
- LAE5B: .byte $42 ;A4 |
- LAE5C: .byte $42 ;A4 |
- LAE5D: .byte $42 ;A4 | Repeat 3 times.
- LAE5E: .byte $02 ;No sound |
- LAE5F: .byte $3A ;F4 |
- LAE60: .byte $3A ;F4 |
- LAE61: .byte $3A ;F4 |
- LAE62: .byte $02 ;No sound |
- LAE63: .byte $02 ;No sound |
- LAE64: .byte $02 ;No sound |
- LAE65: .byte $3A ;F4 |
- LAE66: .byte $3A ;F4 |
- LAE67: .byte $3E ;G4 |
- LAE68: .byte $02 ;No sound |
- LAE69: .byte $3E ;G4 |
- LAE6A: .byte $3E ;G4 |
- LAE6B: .byte $3E ;G4 |
- LAE6C: .byte $3E ;G4 |
- LAE6D: .byte $3E ;G4 |
- LAE6E: .byte $02 ;No sound +
- LAE6F: .byte $FF ;
- LAE70: .byte $C2 ;
- LAE71: .byte $42 ;A4 +
- LAE72: .byte $42 ;A4 |
- LAE73: .byte $42 ;A4 |
- LAE74: .byte $02 ;No sound |
- LAE75: .byte $02 ;No sound |
- LAE76: .byte $02 ;No sound |
- LAE77: .byte $42 ;A4 |
- LAE78: .byte $42 ;A4 | Repeat 2 times.
- LAE79: .byte $42 ;A4 |
- LAE7A: .byte $02 ;No sound |
- LAE7B: .byte $42 ;A4 |
- LAE7C: .byte $42 ;A4 |
- LAE7D: .byte $42 ;A4 |
- LAE7E: .byte $42 ;A4 |
- LAE7F: .byte $42 ;A4 |
- LAE80: .byte $02 ;No sound +
- LAE81: .byte $FF ;
- LAE82: .byte $B4 ;7/8 seconds
- LAE83: .byte $2A ;A3
- LAE84: .byte $B2 ;7/32 seconds
- LAE85: .byte $02 ;No sound
- LAE86: .byte $B0 ;1/4 seconds
- LAE87: .byte $2A ;A3
- LAE88: .byte $02 ;No sound
- LAE89: .byte $2A ;A3
- LAE8A: .byte $2A ;A3
- LAE8B: .byte $B2 ;7/32 seconds
- LAE8C: .byte $2A ;A3
- LAE8D: .byte $00 ;End of end music.
- EndNoiseData:
- LAE8E: .byte $CA ;
- LAE8F: .byte $B0 ;1/4 seconds +
- LAE90: .byte $04 ;Drumbeat 01 |
- LAE91: .byte $04 ;Drumbeat 01 |
- LAE92: .byte $04 ;Drumbeat 01 |
- LAE93: .byte $01 ;Drumbeat 00 |
- LAE94: .byte $01 ;Drumbeat 00 |
- LAE95: .byte $01 ;Drumbeat 00 |
- LAE96: .byte $04 ;Drumbeat 01 |
- LAE97: .byte $04 ;Drumbeat 01 | Repeat 10 times.
- LAE98: .byte $04 ;Drumbeat 01 |
- LAE99: .byte $01 ;Drumbeat 00 |
- LAE9A: .byte $04 ;Drumbeat 01 |
- LAE9B: .byte $04 ;Drumbeat 01 |
- LAE9C: .byte $04 ;Drumbeat 01 |
- LAE9D: .byte $04 ;Drumbeat 01 |
- LAE9E: .byte $04 ;Drumbeat 01 |
- LAE9F: .byte $01 ;Drumbeat 00 +
- LAEA0: .byte $FF ;
- LAEA1: .byte $D8 ;
- LAEA2: .byte $B2 ;7/32 seconds +
- LAEA3: .byte $04 ;Drumbeat 01 | Repeat 24 times.
- LAEA4: .byte $07 ;Drumbeat 02 +
- LAEA5: .byte $FF ;
- LAEA6: .byte $C4 ;
- LAEA7: .byte $B0 ;1/4 seconds +
- LAEA8: .byte $04 ;Drumbeat 01 |
- LAEA9: .byte $04 ;Drumbeat 01 |
- LAEAA: .byte $04 ;Drumbeat 01 |
- LAEAB: .byte $01 ;Drumbeat 00 |
- LAEAC: .byte $01 ;Drumbeat 00 |
- LAEAD: .byte $01 ;Drumbeat 00 |
- LAEAE: .byte $04 ;Drumbeat 01 | Repeat 4 times.
- LAEAF: .byte $04 ;Drumbeat 01 |
- LAEB0: .byte $04 ;Drumbeat 01 |
- LAEB1: .byte $01 ;Drumbeat 00 |
- LAEB2: .byte $04 ;Drumbeat 01 |
- LAEB3: .byte $04 ;Drumbeat 01 |
- LAEB4: .byte $04 ;Drumbeat 01 |
- LAEB5: .byte $04 ;Drumbeat 01 |
- LAEB6: .byte $04 ;Drumbeat 01 |
- LAEB7: .byte $01 ;Drumbeat 00 +
- LAEB8: .byte $FF ;
- LAEB9: .byte $C8 ;
- LAEBA: .byte $B1 ;7/64 seconds +
- LAEBB: .byte $04 ;Drumbeat 01 |
- LAEBC: .byte $B0 ;1/4 seconds |
- LAEBD: .byte $04 ;Drumbeat 01 |
- LAEBE: .byte $04 ;Drumbeat 01 |
- LAEBF: .byte $B1 ;7/64 seconds |
- LAEC0: .byte $04 ;Drumbeat 01 |
- LAEC1: .byte $B0 ;1/4 seconds |
- LAEC2: .byte $04 ;Drumbeat 01 |
- LAEC3: .byte $04 ;Drumbeat 01 | Repeat 8 times.
- LAEC4: .byte $B1 ;7/64 seconds |
- LAEC5: .byte $04 ;Drumbeat 01 |
- LAEC6: .byte $B0 ;1/4 seconds |
- LAEC7: .byte $04 ;Drumbeat 01 |
- LAEC8: .byte $04 ;Drumbeat 01 |
- LAEC9: .byte $B1 ;7/64 seconds |
- LAECA: .byte $07 ;Drumbeat 02 |
- LAECB: .byte $B0 ;1/4 seconds |
- LAECC: .byte $04 ;Drumbeat 01 |
- LAECD: .byte $04 ;Drumbeat 01 +
- LAECE: .byte $FF ;
- LAECF: .byte $D0 ;
- LAED0: .byte $B2 ;7/32 seconds + Repeat 16 times.
- LAED1: .byte $04 ;Drumbeat01 +
- LAED2: .byte $FF ;
- LAED3: .byte $E0 ;
- LAED4: .byte $B1 ;7/64 seconds +
- LAED5: .byte $04 ;Drumbeat 01 | Repeat 32 times.
- LAED6: .byte $04 ;Drumbeat 01 +
- LAED7: .byte $FF ;
- LAED8: .byte $E0 ;
- LAED9: .byte $B0 ;1/4 seconds +
- LAEDA: .byte $04 ;Drumbeat 01 |
- LAEDB: .byte $04 ;Drumbeat 01 |
- LAEDC: .byte $B1 ;7/64 seconds |
- LAEDD: .byte $07 ;Drumbeat 02 | Repeat 32 times.
- LAEDE: .byte $B0 ;1/4 seconds |
- LAEDF: .byte $0A ;Drumbeat 03 |
- LAEE0: .byte $04 ;Drumbeat 01 |
- LAEE1: .byte $B1 ;7/64 seconds |
- LAEE2: .byte $07 ;Drumbeat 02 +
- LAEE3: .byte $FF ;
- LAEE4: .byte $C8 ;
- LAEE5: .byte $B0 ;1/4 seconds +
- LAEE6: .byte $04 ;Drumbeat 01 |
- LAEE7: .byte $04 ;Drumbeat 01 |
- LAEE8: .byte $04 ;Drumbeat 01 |
- LAEE9: .byte $01 ;Drumbeat 00 |
- LAEEA: .byte $01 ;Drumbeat 00 |
- LAEEB: .byte $01 ;Drumbeat 00 |
- LAEEC: .byte $04 ;Drumbeat 01 | Repeat 8 times.
- LAEED: .byte $04 ;Drumbeat 01 |
- LAEEE: .byte $04 ;Drumbeat 01 |
- LAEEF: .byte $01 ;Drumbeat 00 |
- LAEF0: .byte $04 ;Drumbeat 01 |
- LAEF1: .byte $04 ;Drumbeat 01 |
- LAEF2: .byte $04 ;Drumbeat 01 |
- LAEF3: .byte $04 ;Drumbeat 01 |
- LAEF4: .byte $04 ;Drumbeat 01 |
- LAEF5: .byte $01 ;Drumbeat 00 +
- LAEF6: .byte $FF ;
- LAEF7: .byte $B4 ;7/8 seconds
- LAEF8: .byte $07 ;Drumbeat 02
- LAEF9: .byte $B2 ;7/32 seconds
- LAEFA: .byte $01 ;Drumbeat 00
- LAEFB: .byte $B0 ;1/4 seconds
- LAEFC: .byte $07 ;Drumbeat 02
- LAEFD: .byte $01 ;Drumbeat 00
- LAEFE: .byte $07 ;Drumbeat 02
- LAEFF: .byte $07 ;Drumbeat 02
- LAF00: .byte $B2 ;7/32 seconds
- LAF01: .byte $07 ;Drumbeat 02
- LAF02: .byte $00 ;End of end music.
- ;Unused tile patterns.
- LAF03: .byte $80, $40, $20, $10, $88, $00, $00, $00, $00, $00, $00, $00, $80, $04, $00, $02
- LAF13: .byte $02, $00, $00, $00, $00, $07, $03, $03, $03, $01, $00, $00, $00, $84, $C4, $42
- LAF23: .byte $62, $21, $31, $11, $11, $80, $C0, $C0, $E0, $E0, $F0, $F0, $F0, $00, $00, $00
- LAF33: .byte $00, $00, $00, $00, $01, $00, $00, $00, $00, $01, $01, $03, $03, $11, $11, $31
- LAF43: .byte $21, $63, $62, $C4, $84, $F0, $F0, $F0, $E0, $E0, $E0, $C0, $80, $01, $13, $16
- LAF53: .byte $2C, $78, $B3, $EC, $F0, $07, $1F, $1E, $3C, $78, $F0, $E0, $00, $08, $10, $20
- LAF63: .byte $40, $80, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $82, $CC, $4E
- LAF73: .byte $4C, $40, $4C, $4C, $4C, $82, $CC, $CE, $CC, $C0, $CC, $CC, $CC, $00, $00, $00
- LAF83: .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
- LAF93: .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
- LAFA3: .byte $01, $03, $06, $0C, $18, $00, $00, $00, $00, $00, $01, $03, $07, $0F, $3C, $E0
- LAFB3: .byte $84, $08, $30, $60, $E0, $00, $02, $1F, $7A, $F4, $C8, $98, $10, $19, $31, $33
- LABC3: .byte $63, $63, $67, $E7, $E7, $06, $0E, $0C, $1C, $1C, $18, $18, $18, $C0, $C0, $80
- LAFD3: .byte $80, $80, $00, $00, $00, $30, $30, $60, $60, $60, $E0, $E0, $E0, $C7, $C7, $C7
- LAFE3: .byte $C7, $C7, $C7, $C7, $C7, $38, $38, $38, $38, $38, $38, $38, $38, $20, $20, $20
- LAFF3: .byte $20, $20, $20, $20, $20, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $C0
- IntroSQ2Data:
- LB000: .byte $C2 ;
- LB001: .byte $B4 ;7/8 seconds +
- LB002: .byte $64 ;D6 |
- LB003: .byte $74 ;A#6 |
- LB004: .byte $6A ;F6 |
- LB005: .byte $02 ;No sound | Repeat 2 times.
- LB006: .byte $64 ;D6 |
- LB007: .byte $78 ;C7 |
- LB008: .byte $74 ;A#6 |
- LB009: .byte $02 ;No sound +
- LB00A: .byte $FF ;
- LB00B: .byte $C2 ;
- LB00C: .byte $B2 ;7/32 seconds +
- LB00D: .byte $72 ;A6 |
- LB00E: .byte $5A ;A5 |
- LB00F: .byte $6E ;G6 |
- LB010: .byte $56 ;G5 |
- LB011: .byte $6C ;F#6 |
- LB012: .byte $54 ;F#5 |
- LB013: .byte $68 ;E6 | Repeat 2 times.
- LB014: .byte $50 ;E5 |
- LB015: .byte $6E ;G6 |
- LB016: .byte $56 ;G5 |
- LB017: .byte $6C ;F#6 |
- LB018: .byte $54 ;F#5 |
- LB019: .byte $68 ;E6 |
- LB01A: .byte $50 ;E5 |
- LB01B: .byte $64 ;D6 |
- LB01C: .byte $4C ;D5 +
- LB01D: .byte $FF ;
- LB01E: .byte $C4 ;
- LB01F: .byte $72 ;A6 +
- LB020: .byte $5A ;A5 |
- LB021: .byte $6E ;G6 |
- LB022: .byte $5A ;A5 |
- LB023: .byte $6C ;F#6 |
- LB024: .byte $5A ;A5 |
- LB025: .byte $68 ;E6 |
- LB026: .byte $5A ;A5 | Repeat 4 times.
- LB027: .byte $6E ;G6 |
- LB028: .byte $56 ;G5 |
- LB029: .byte $6C ;F#6 |
- LB02A: .byte $56 ;G5 |
- LB02B: .byte $68 ;E6 |
- LB02C: .byte $56 ;G5 |
- LB02D: .byte $64 ;D6 |
- LB02E: .byte $56 ;G5 +
- LB02F: .byte $FF ;
- LB030: .byte $B2 ;7/32 seconds
- LB031: .byte $5A ;A5
- LB032: .byte $B1 ;7/64 seconds
- LB033: .byte $42 ;A4
- LB034: .byte $B2 ;7/32 seconds
- LB035: .byte $56 ;G5
- LB036: .byte $B1 ;7/64 seconds
- LB037: .byte $42 ;A4
- LB038: .byte $B2 ;7/32 seconds
- LB039: .byte $54 ;F#5
- LB03A: .byte $B1 ;7/64 seconds
- LB03B: .byte $42 ;A4
- LB03C: .byte $B2 ;7/32 seconds
- LB03D: .byte $50 ;E5
- LB03E: .byte $B1 ;7/64 seconds
- LB03F: .byte $42 ;A4
- LB040: .byte $B2 ;7/32 seconds
- LB041: .byte $5A ;A5
- LB042: .byte $B1 ;7/64 seconds
- LB043: .byte $42 ;A4
- LB044: .byte $B2 ;7/32 seconds
- LB045: .byte $56 ;G5
- LB046: .byte $B1 ;7/64 seconds
- LB047: .byte $42 ;A4
- LB048: .byte $B2 ;7/32 seconds
- LB049: .byte $52 ;F5
- LB04A: .byte $B1 ;7/64 seconds
- LB04B: .byte $42 ;A4
- LB04C: .byte $B2 ;7/32 seconds
- LB04D: .byte $50 ;E5
- LB04E: .byte $B1 ;7/64 seconds
- LB04F: .byte $42 ;A4
- LB050: .byte $B2 ;7/32 seconds
- LB051: .byte $5A ;A5
- LB052: .byte $B1 ;7/64 seconds
- LB053: .byte $44 ;A#4
- LB054: .byte $B2 ;7/32 seconds
- LB055: .byte $56 ;G5
- LB056: .byte $B1 ;7/64 seconds
- LB057: .byte $44 ;A#4
- LB058: .byte $B2 ;7/32 seconds
- LB059: .byte $52 ;F5
- LB05A: .byte $B1 ;7/64 seconds
- LB05B: .byte $44 ;A#4
- LB05C: .byte $B2 ;7/32 seconds
- LB05D: .byte $56 ;G5
- LB05E: .byte $B1 ;7/64 seconds
- LB05F: .byte $44 ;A#4
- LB060: .byte $C4 ;
- LB061: .byte $5A ;A5 +
- LB062: .byte $50 ;E5 | Repeat 4 times.
- LB063: .byte $46 ;B4 +
- LB064: .byte $FF ;
- LB065: .byte $C3 ;
- LB066: .byte $58 ;Ab5 +
- LB067: .byte $50 ;E5 | Repeat 3 times.
- LB068: .byte $46 ;B4 +
- LB069: .byte $FF ;
- LB06A: .byte $58 ;Ab5
- LB06B: .byte $50 ;E5
- LB06C: .byte $B0 ;1/4 seconds
- LB06D: .byte $46 ;B4
- LB06E: .byte $02 ;No sound
- LB06F: .byte $E0 ;
- LB070: .byte $B6 ;21/32 seconds +
- LB071: .byte $1C ;D3 | Repeat 32 times.
- LB072: .byte $B2 ;7/32 seconds |
- LB073: .byte $02 ;No sound +
- LB074: .byte $FF ;
- LB075: .byte $00 ;End intro music.
- IntroTriangleData:
- LB076: .byte $D0
- LB077: .byte $B6 ;21/32 seconds +
- LB078: .byte $2A ;A3 |
- LB079: .byte $B1 ;7/64 seconds | Repeat 16 times.
- LB07A: .byte $2A ;A3 |
- LB07B: .byte $B1 ;7/64 seconds |
- LB07C: .byte $02 ;No sound +
- LB07D: .byte $FF ;
- LB07E: .byte $B4 ;7/8 seconds
- LB07F: .byte $4C ;D5
- LB080: .byte $60 ;C6
- LB081: .byte $5E ;B5
- LB082: .byte $5C ;A#5
- LB083: .byte $54 ;F#5
- LB084: .byte $60 ;C6
- LB085: .byte $5C ;A#5
- LB086: .byte $56 ;G5
- LB087: .byte $C2 ;
- LB088: .byte $34 ;D4 +
- LB089: .byte $48 ;C5 |
- LB08A: .byte $46 ;B4 |
- LB08B: .byte $44 ;A#4 | Repeat 2 times.
- LB08C: .byte $3C ;F#4 |
- LB08D: .byte $48 ;C5 |
- LB08E: .byte $44 ;A#4 |
- LB08F: .byte $3E ;G4 +
- LB090: .byte $FF ;
- LB091: .byte $C2 ;
- LB092: .byte $B2 ;7/32 seconds +
- LB093: .byte $34 ;D4 |
- LB094: .byte $B1 ;7/64 seconds | Repeat 2 times.
- LB095: .byte $42 ;A4 |
- LB096: .byte $B5 ;1 13/16 seconds|
- LB097: .byte $4C ;D5 +
- LB098: .byte $FF ;
- LB099: .byte $C2 ;
- LB09A: .byte $B2 ;7/32 seconds +
- LB09B: .byte $2C ;A#3 |
- LB09C: .byte $B1 ;7/64 seconds | Repeat 2 times.
- LB09D: .byte $3A ;F4 |
- LB09E: .byte $B5 ;1 13/16 seconds|
- LB09F: .byte $48 ;C5 +
- LB0A0: .byte $FF ;
- LB0A1: .byte $C2 ;
- LB0A2: .byte $B2 ;7/32 seconds +
- LB0A3: .byte $1E ;D#3 |
- LB0A4: .byte $B1 ;7/64 seconds | Repeat 2 times.
- LB0A5: .byte $2C ;A#3 |
- LB0A6: .byte $B5 ;1 13/16 seconds|
- LB0A7: .byte $36 ;D#4 +
- LB0A8: .byte $FF ;
- LB0A9: .byte $C4 ;
- LB0AA: .byte $B2 ;7/32 seconds +
- LB0AB: .byte $20 ;E3 |
- LB0AC: .byte $B1 ;7/64 seconds | Repeat 4 times.
- LB0AD: .byte $2E ;B3 |
- LB0AE: .byte $B5 ;1 13/16 seconds|
- LB0AF: .byte $38 ;E4 +
- LB0B0: .byte $FF ;
- LB0B1: .byte $E0 ;
- LB0B2: .byte $B6 ;21/32 seconds +
- LB0B3: .byte $2A ;A3 |
- LB0B4: .byte $B1 ;7/64 seconds | Repeat 32 times.
- LB0B5: .byte $2A ;A3 |
- LB0B6: .byte $B1 ;7/64 seconds |
- LB0B7: .byte $02 ;No sound +
- LB0B8: .byte $FF ;
- IntroSQ1Data:
- LB0B9: .byte $D0 ;
- LB0BA: .byte $B6 ;21/32 seconds +
- LB0BB: .byte $06 ;D2 | Repeat 16 times.
- LB0BC: .byte $B2 ;7/32 seconds |
- LB0BD: .byte $02 ;No sound +
- LB0BE: .byte $FF ;
- LB0BF: .byte $C8 ;
- LB0C0: .byte $B4 ;7/8 seconds + Repeat 8 times.
- LB0C1: .byte $02 ;No sound +
- LB0C2: .byte $FF ;
- LB0C3: .byte $B2 ;7/32 seconds
- LB0C4: .byte $24 ;F#3
- LB0C5: .byte $26 ;G3
- LB0C6: .byte $2A ;A3
- LB0C7: .byte $2E ;B3
- LB0C8: .byte $34 ;D4
- LB0C9: .byte $38 ;E4
- LB0CA: .byte $3C ;F#4
- LB0CB: .byte $3E ;G4
- LB0CC: .byte $B6 ;21/32 seconds
- LB0CD: .byte $42 ;A4
- LB0CE: .byte $B1 ;7/64 seconds
- LB0CF: .byte $3E ;G4
- LB0D0: .byte $3C ;F#4
- LB0D1: .byte $B6 ;21/32 seconds
- LB0D2: .byte $3E ;G4
- LB0D3: .byte $B1 ;7/64 seconds
- LB0D4: .byte $3C ;F#4
- LB0D5: .byte $38 ;E4
- LB0D6: .byte $B6 ;21/32 seconds
- LB0D7: .byte $34 ;D4
- LB0D8: .byte $B2 ;7/32 seconds
- LB0D9: .byte $42 ;A4
- LB0DA: .byte $B4 ;7/8 seconds
- LB0DB: .byte $4C ;D5
- LB0DC: .byte $B3 ;7/16 seconds
- LB0DD: .byte $44 ;A#4
- LB0DE: .byte $42 ;A4
- LB0DF: .byte $3E ;G4
- LB0E0: .byte $3C ;F#4
- LB0E1: .byte $B6 ;21/32 seconds
- LB0E2: .byte $38 ;E4
- LB0E3: .byte $B2 ;7/32 seconds
- LB0E4: .byte $3C ;F#4
- LB0E5: .byte $B6 ;21/32 seconds
- LB0E6: .byte $42 ;A4
- LB0E7: .byte $B2 ;7/32 seconds
- LB0E8: .byte $4C ;D5
- LB0E9: .byte $B6 ;21/32 seconds
- LB0EA: .byte $38 ;E4
- LB0EB: .byte $B2 ;7/32 seconds
- LB0EC: .byte $3C ;F#4
- LB0ED: .byte $B4 ;7/8 seconds
- LB0EE: .byte $34 ;D4
- LB0EF: .byte $B3 ;7/16 seconds
- LB0F0: .byte $2A ;A3
- LB0F1: .byte $2E ;B3
- LB0F2: .byte $34 ;D4
- LB0F3: .byte $38 ;E4
- LB0F4: .byte $B6 ;21/32 seconds
- LB0F5: .byte $34 ;D4
- LB0F6: .byte $B2 ;7/32 seconds
- LB0F7: .byte $2C ;A#3
- LB0F8: .byte $B4 ;7/8 seconds
- LB0F9: .byte $26 ;G3
- LB0FA: .byte $B5 ;1 13/16 seconds
- LB0FB: .byte $38 ;E4
- LB0FC: .byte $3C ;F#4
- LB0FD: .byte $42 ;A4
- LB0FE: .byte $4C ;D5
- LB0FF: .byte $34 ;D4
- LB100: .byte $3A ;F4
- LB101: .byte $48 ;C5
- LB102: .byte $42 ;A4
- LB103: .byte $36 ;D#4
- LB104: .byte $3E ;G4
- LB105: .byte $4C ;D5
- LB106: .byte $44 ;A#4
- LB107: .byte $42 ;A4
- LB108: .byte $38 ;E4
- LB109: .byte $2E ;B3
- LB10A: .byte $38 ;E4
- LB10B: .byte $40 ;Ab4
- LB10C: .byte $38 ;E4
- LB10D: .byte $2E ;B3
- LB10E: .byte $38 ;E4
- LB10F: .byte $E0 ;
- LB110: .byte $B6 ;21/32 seconds +
- LB111: .byte $06 ;D2 | Repeat 32 times.
- LB112: .byte $B2 ;7/32 seconds |
- LB113: .byte $02 ;No sound +
- LB114: .byte $FF ;
- IntroNoiseIndexData:
- LB115: .byte $D0 ;
- LB116: .byte $B4 ;7/8 Seconds + Repeat 16 times.
- LB117: .byte $04 ;Drumbeat 01 +
- LB118: .byte $FF ;
- LB119: .byte $CC ;
- LB11A: .byte $B2 ;7/32 Seconds +
- LB11B: .byte $04 ;Drumbeat 01 |
- LB11C: .byte $04 ;Drumbeat 01 |
- LB11D: .byte $B5 ;1 13/16 Seconds|
- LB11E: .byte $07 ;Drumbeat 02 |
- LB11F: .byte $B0 ;1/4 Seconds |
- LB120: .byte $04 ;Drumbeat 01 | Repeat 12 times.
- LB121: .byte $04 ;Drumbeat 01 |
- LB122: .byte $B6 ;21/32 Seconds |
- LB123: .byte $04 ;Drumbeat 01 |
- LB124: .byte $B1 ;7/64 Seconds |
- LB125: .byte $04 ;Drumbeat 01 |
- LB126: .byte $04 ;Drumbeat 01 +
- LB127: .byte $FF ;
- LB128: .byte $CA ;
- LB129: .byte $B1 ;7/64 Seconds +
- LB12A: .byte $04 ;Drumbeat 01 |
- LB12B: .byte $04 ;Drumbeat 01 |
- LB12C: .byte $04 ;Drumbeat 01 | Repeat 10 times.
- LB12D: .byte $07 ;Drumbeat 02 |
- LB12E: .byte $04 ;Drumbeat 01 |
- LB12F: .byte $04 ;Drumbeat 01 +
- LB130: .byte $FF ;
- LB131: .byte $E0 ;
- LB132: .byte $B4 ;7/8 Seconds + Repeat 32 times.
- LB133: .byte $04 ;Drumbeat 01 +
- LB134: .byte $FF ;
- ;Unused tile patterns.
- LB135: .byte $E0, $E0, $F0, $00, $00, $00, $00, $00, $00, $00, $00, $21, $80, $40, $02, $05
- LB145: .byte $26, $52, $63, $00, $00, $00, $06, $07, $67, $73, $73, $FF, $AF, $2F, $07, $0B
- LB155: .byte $8D, $A7, $B1, $00, $00, $00, $00, $00, $80, $80, $80, $F8, $B8, $F8, $F8, $F0
- LB165: .byte $F0, $F8, $FC, $00, $00, $00, $00, $00, $00, $00, $00, $07, $07, $07, $07, $07
- LB175: .byte $03, $03, $01, $00, $00, $00, $00, $00, $00, $00, $80, $FF, $C7, $83, $03, $C7
- LB185: .byte $CF, $FE, $EC, $00, $30, $78, $F8, $30, $00, $01, $12, $F5, $EA, $FB, $FD, $F9
- LB195: .byte $1E, $0E, $44, $07, $03, $03, $01, $01, $E0, $10, $48, $2B, $3B, $1B, $5A, $D0
- LB1A5: .byte $D1, $C3, $C3, $3B, $3B, $9B, $DA, $D0, $D0, $C0, $C0, $2C, $23, $20, $20, $30
- LB1B5: .byte $98, $CF, $C7, $00, $00, $00, $00, $00, $00, $00, $30, $1F, $80, $C0, $C0, $60
- LB1C5: .byte $70, $FC, $C0, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $00
- LB1D5: .byte $00, $00, $00, $80, $80, $C0, $78, $4C, $C7, $80, $80, $C4, $A5, $45, $0B, $1B
- LB1E5: .byte $03, $03, $00, $3A, $13, $31, $63, $C3, $83, $03, $04, $E6, $E6, $C4, $8E, $1C
- LB1F5: .byte $3C, $18, $30, $E8, $E8, $C8, $90, $60, $00, $00, $00
- ;------------------------------------------[ Sound Engine ]------------------------------------------
- ;SFXdata. The top four entries are used by the noise music player for drum beats.
- LB200: .byte $00 ;Base for drum beat music data.
- DrumBeat00SFXData:
- LB201: .byte $10, $01, $18 ;Noise channel music data #$01.
- DrumBeat01SFXData:
- LB204: .byte $00, $01, $38 ;Noise channel music data #$04.
- DrumBeat02SFXData:
- LB207: .byte $01, $02, $40 ;Noise channel music data #$07.
- DrumBeat03SFXData:
- LB20A: .byte $00, $09, $58 ;Noise channel music data #$0A.
- GamePausedSFXData:
- LB20D: .byte $80, $7F, $80, $48
- ScrewAttSFXData:
- LB211: .byte $35, $7F, $00, $B0
- MissileLaunchSFXData:
- LB215: .byte $19, $7F, $0E, $A0
- BombExplodeSFXData:
- LB219: .byte $0D, $7F, $0F, $08
- SamusWalkSFXData:
- LB21D: .byte $16, $7F, $0B, $18
- SpitFlameSFXData:
- LB221: .byte $13, $7F, $0E, $F8
- SamusHitSQ1SQ2SFXData:
- LC225: .byte $C1, $89, $02, $0F
- BossHitSQ2SFXData:
- LB229: .byte $34, $BA, $E0, $05
- BossHitSQ1SFXData:
- LB22D: .byte $34, $BB, $CE, $05
- IncorrectPasswordSQ1SFXData:
- LB231: .byte $B6, $7F, $00, $C2
- IncorrectPasswordSQ2SFXData:
- LB235: .byte $B6, $7F, $04, $C2
- TimeBombTickSFXData:
- LB239: .byte $17, $7F, $66, $89
- EnergyPickupSFXData:
- LB23D: .byte $89, $7F, $67, $18
- MissilePickupSFXData:
- LB241: .byte $8B, $7F, $FD, $28
- MetalSFXData:
- LB245: .byte $02, $7F, $A8, $F8
- LongRangeShotSFXData:
- LB249: .byte $D7, $83, $58, $F8
- ShortRangeShotSFXData:
- LB24D: .byte $D6, $82, $58, $F8
- JumpSFXData:
- LB251: .byte $95, $8C, $40, $B9
- EnemyHitSFXData:
- LB255: .byte $1D, $9A, $20, $8F
- BugOutOFHoleSFXData:
- LB259: .byte $16, $8D, $E0, $42
- WaveBeamSFXData:
- LB25D: .byte $19, $7F, $6F, $40
- IceBeamSFXData:
- LB261: .byte $18, $7F, $80, $40
- BombLaunch1SFXData:
- LB265: .byte $07, $7F, $40, $28
- BombLaunch2SFXData:
- LB269: .byte $07, $7F, $45, $28
- SamusToBallSFXData:
- LB26D: .byte $7F, $7F, $DD, $3B
- MetroidHitSFXData:
- LB26E: .byte $7F, $7F, $FF, $98
- SamusDieSFXData:
- LB275: .byte $7F, $7F, $40, $08
- SamusBeepSFXData:
- LB279: .byte $09, $7F, $30, $48
- BigEnemyHitSFXData:
- LB27D: .byte $03, $7F, $42, $18
- StatueRaiseSFXData:
- LB281: .byte $03, $7F, $11, $09
- DoorSFXData:
- LB285: .byte $7F, $7F, $30, $B2
- ;The following table is used by the CheckSFXFlag routine. The first two bytes of each row
- ;are the address of the pointer table used for handling SFX and music routines for set flags.
- ;The second pair of bytes is the address of the routine to next jump to if no SFX or music
- ;flags were found. The final byte represents what type of channel is currently being
- ;processed: 0=Noise, 1=SQ1, 3=Triangle, 4=Multiple channels.
- ChooseNextSFXRoutineTbl:
- LB289: .word $B2BB, $B322 ;Noise init SFX (1st).
- LB28D: .byte $00
- LB28E: .word $B2CB, $B4EE ;Noise continue SFX (2nd).
- LB292: .byte $00
- LB293: .word $B2DB, $B330 ;SQ1 init SFX (5th).
- LB297: .byte $01
- LB298: .word $B2EB, $B4EE ;SQ2 continue SFX (6th).
- LB29C: .byte $01
- LB29D: .word $B2FB, $B344 ;Triangle init SFX (7th).
- LB2A1: .byte $03
- LB2A2: .word $B30B, $B4EE ;Triangle continue SFX (8th).
- LB2A6: .byte $03
- LB2A7: .word $BC06, $B35C ;Multi init SFX (3rd).
- LB2AB: .byte $04
- LB2AC: .word $BC16, $B364 ;Multi continue SFX (4th).
- LB2B0: .byte $04
- LB2B1: .word $BC26, $BC4B ;temp flag Music (10th).
- LB2B5: .byte $00
- LB2B6: .word $BC26, $BC3D ;Music (9th).
- LB2BA: .byte $00
- ;The tables below contain addresses for SFX handling routines.
- ;Noise Init SFX handling routine addresses:
- LB2BB: .word $B4EE ;No sound.
- LB2BD: .word $B52B ;Screw attack init SFX.
- LB2BF: .word $B56E ;Missile launch init SFX.
- LB2C1: .word $B583 ;Bomb explode init SFX.
- LB2C3: .word $B598 ;Samus walk init SFX.
- LB2C5: .word $B50F ;Spit flame init SFX.
- LB2C7: .word $B4EE ;No sound.
- LB2C9: .word $B4EE ;No sound.
- ;Noise Continue SFX handling routine addresses:
- LB2CB: .word $B4EE ;No sound.
- LB2CD: .word $B539 ;Screw attack continue SFX.
- LB2CF: .word $B57B ;Missile launch continue SFX.
- LB2D1: .word $B58A ;Bomb explode continue SFX.
- LB2D3: .word $B58A ;Samus walk continue SFX.
- LB2D5: .word $B516 ;Spit flame continue SFX.
- LB2D7: .word $B4EE ;No sound.
- LB2D9: .word $B4EE ;No sound.
- ;SQ1 Init SFX handling routine addresses:
- LB2DB: .word $B6CD ;Missile pickup init SFX.
- LB2DD: .word $B6E7 ;Energy pickup init SFX.
- LB2DF: .word $B735 ;Metal init SFX.
- LB2E1: .word $B716 ;Bullet fire init SFX.
- LB2E3: .word $B73C ;Bird out of hole init SFX.
- LB2E5: .word $B710 ;Enemy hit init SFX.
- LB2E7: .word $B703 ;Samus jump init SFX.
- LB2E9: .word $B77A ;Wave beam init SFX.
- ;SQ1 Continue SFX handling routine addresses:
- LB2EB: .word $B6B0 ;Missile pickup continue SFX.
- LB2ED: .word $B6D3 ;Energy pickup continue SFX.
- LB2EF: .word $B6ED ;Metal continue SFX.
- LB2F1: .word $B74F ;Bullet fire continue SFX.
- LB2F3: .word $B6ED ;Bird out of hole continue SFX.
- LB2F5: .word $B6ED ;Enemy hit continue SFX.
- LB2F7: .word $B6ED ;Samus jump continue SFX.
- LB2F9: .word $B781 ;Wave beam continue SFX.
- ;Triangle init handling routine addresses:
- LB2FB: .word $B8D2 ;Samus die init SFX.
- LB2FD: .word $B7AC ;Door open close init SFX.
- LB2FF: .word $B8A7 ;Metroid hit init SFX.
- LB301: .word $B921 ;Statue raise init SFX.
- LB303: .word $B7D9 ;Beep init SFX.
- LB305: .word $B7EF ;Big enemy hit init SFX.
- LB307: .word $B834 ;Samus to ball init SFX.
- LB309: .word $B878 ;Bomb launch init SFX.
- ;Triangle continue handling routine addresses:
- LB30B: .word $B8ED ;Samus die continue SFX.
- LB30E: .word $B7CB ;Door open close continue SFX.
- LB30F: .word $B8B1 ;Metroid hit continue SFX.
- LB311: .word $B940 ;Statue raise continue SFX.
- LB313: .word $B7E7 ;Beep continue SFX.
- LB315: .word $B80E ;Big enemy hit continue SFX.
- LB317: .word $B84F ;Samus to ball continue SFX.
- LB319: .word $B87F ;Bomb launch continue SFX.
- LoadNoiseSFXInitFlags:
- LB31B: LDA NoiseSFXFlag ;Load A with Noise init SFX flags, (1st SFX cycle).
- LB31E: LDX #$89 ;Lower address byte in ChooseNextSFXRoutineTbl.
- LB320: BNE GotoSFXCheckFlags ;Branch always.
- LoadNoiseSFXContFlags:
- LB322: LDA NoiseContSFX ;Load A with Noise continue flags, (2nd SFX cycle).
- LB325: LDX #$8E ;Lower address byte in ChooseNextSFXRoutineTbl.
- LB327: BNE GotoSFXCheckFlags ;Branch always.
- LoadSQ1SFXInitFlags:
- LB329: LDA SQ1SFXFlag ;Load A with SQ1 init flags, (5th SFX cycle).
- LB32C: LDX #$93 ;Lower address byte in ChooseNextSFXRoutineTbl.
- LB32E: BNE GotoSFXCheckFlags ;Branch always.
- LoadSQ1SFXContFlags:
- LB330: LDA SQ1ContSFX ;Load A with SQ1 continue flags, (6th SFX cycle).
- LB333: LDX #$98 ;Lower address byte in ChooseNextSFXRoutineTbl.
- LB335: BNE GotoSFXCheckFlags ;Branch always.
- GotoSFXCheckFlags:
- LB337: JSR CheckSFXFlag ;($B4BD)Checks to see if SFX flags set.
- LB33A: JMP ($00E2) ;if no flag found, Jump to next SFX cycle,-->
- ;else jump to specific SFX handling routine.
- LoadSTriangleSFXInitFlags:
- LB33D: LDA TriangleSFXFlag ;Load A with Triangle init flags, (7th SFX cycle).
- LB340: LDX #$9D ;Lower address byte in ChooseNextSFXRoutineTbl.
- LB342: BNE GotoSFXCheckFlags ;Brach always.
- LoadTriangleSFXContFlags:
- LB344: LDA TriangleContSFX ;Load A with Triangle continue flags, (8th SFX cycle).
- LB347: LDX #$A2 ;Lower address byte in ChooseNextSFXRoutineTbl.
- LB349: BNE GotoSFXCheckFlags ;Branch always.
- LoadMultiSFXInitFlags:
- LB34B: LDA MultiSFXFlag ;Load A with Multi init flags, (3rd SFX cycle).
- LB34E: LDX #$A7 ;Lower address byte in ChooseNextSFXRoutineTbl.
- LB350: JSR CheckSFXFlag ;($B4BD)Checks to see if SFX or music flags set.
- LB353: JSR FindMusicInitIndex ;($BC53)Find bit containing music init flag.
- LB356: JSR Add8 ;($BC64)Add 8 to MusicInitIndex.
- LB359: JMP ($00E2) ;If no flag found, Jump to next SFX cycle,-->
- ;else jump to specific SFX handling subroutine.
- LoadMultiSFXContFlags:
- LB35C: LDA MultiContSFX ;Load A with $68C flags (4th SFX cycle).
- LB35F: LDX #$AC ;Lower address byte in ChooseNextSFXRoutineTbl.
- LB361: JMP GotoSFXCheckFlags ;($B337)Checks to see if SFX or music flags set.
- LoadSQ1Flags:
- LB364: JSR LoadSQ1SFXInitFlags ;($B329)Check for SQ1 init flags.
- LB367: RTS ;
- LoadSQ1ChannelSFX: ;Used to determine which sound registers to change-->
- LB368: LDA #$00 ;($4000 - $4003) - SQ1.
- LB36A: BEQ + ;Branch always.
- LoadTriangleChannelSFX: ;Used to determine which sound registers to change-->
- LB36C: LDA #$08 ;($4008 - $400B) - Triangle.
- LB36E: BNE + ;Branch always.
- LoadNoiseChannelSFX: ;Used to determine which sound registers to change-->
- LB370: LDA #$0C ;($400C - $400F) - Noise.
- LB372: BNE + ;Branch always.
- LoadSQ2ChannelSFX: ;Used to determine which sound registers to change-->
- LB374: LDA #$04 ;($4004 - $4007) - SQ2.
- LoadSFXData:
- LB376:* STA $E0 ;Lower address byte of desired APU control register.
- LB378: LDA #$40 ;
- LB37A: STA $E1 ;Upper address byte of desired APU control register.
- LB37C: STY $E2 ;Lower address byte of data to load into sound channel.
- LB37E: LDA #$B2 ;
- LB380: STA $E3 ;Upper address byte of data to load into sound channel.
- LB382: LDY #$00 ;Starting index for loading four byte sound data.
- LoadSFXRegisters:
- LB384:* LDA ($E2),Y ;Load A with SFX data byte.
- LB386: STA ($E0),Y ;Store A in SFX register.
- LB388: INY ;
- LB389: TYA ;The four registers associated with each sound-->
- LB38A: CMP #$04 ;channel are loaded one after the other (the loop-->
- LB38C: BNE - ;repeats four times).
- LB38E: RTS ;
- PauseSFX:
- LB38F:* INC SFXPaused ;SFXPaused=#$01
- LB392: JSR ClearSounds ;($B43E)Clear sound registers of data.
- LB395: STA PauseSFXStatus ;PauseSFXStatus=#$00
- LB398: RTS ;
- LB399:* LDA SFXPaused ;Has SFXPaused been set? if not, branch
- LB39C: BEQ -- ;
- LB39E: LDA PauseSFXStatus ;For the first #$12 frames after the game has been-->
- LB3A1: CMP #$12 ;paused, play GamePaused SFX. If paused for #$12-->
- LB3A3: BEQ ++ ;frames or more, branch to exit.
- LB3A5: AND #$03 ;
- LB3A7: CMP #$03 ;Every fourth frame, repeat GamePaused SFX
- LB3A9: BNE + ;
- LB3AB: LDY #$0D ;Lower address byte of GamePaused SFX data(Base=$B200)
- LB3AD: JSR LoadSQ1ChannelSFX ;($B368) Load GamePaused SFX data.
- LB3B0:* INC PauseSFXStatus ;
- LB3B3:* RTS ;
- ;----------------------------------[ Sound Engine Entry Point ]-----------------------------------
- ;NOTES:
- ;SFX take priority over music.
- ;
- ;There are 10 SFX cycles run every time the sound engine subroutine is called. The cycles
- ;search for set sound flags in the following registers in order:
- ;$680, $688, $684, $68C, $681, $689, $683, $68B, $65D, $685
- ;
- ;The sound channels are assigned SFX numbers. Those SFX numbers are:
- ;Noise=0, sq1=1, sq2=2, triangle=3, Multi=4
- ;The sound channels are assigned music numbers. Those music numbers are:
- ;SQ1=0, SQ2=1, Triangle=2, Noise=3
- SoundEngine:
- LB3B4: LDA #$C0 ;Set APU to 5 frame cycle, disable frame interrupt.
- LB3B6: STA APUCommonCntrl1 ;
- LB3B9: LDA NoiseSFXFlag ;is bit zero is set in NoiseSFXFlag(Silence-->
- LB3BC: LSR ;music)? If yes, branch.
- LB3BD: BCS ++ ;
- LB3BF: LDA MainRoutine ;
- LB3C1: CMP #$05 ;Is game paused? If yes, branch.
- LB3C3: BEQ --- ;
- LB3C5: LDA #$00 ;Clear SFXPaused when game is running.
- LB3C7: STA SFXPaused ;
- LB3CA: JSR LoadNoiseSFXInitFlags ;($B31B)Check noise SFX flags.
- LB3CD: JSR LoadMultiSFXInitFlags ;($B34B)Check multichannel SFX flags.
- LB3D0: JSR LoadSTriangleSFXInitFlags ;($B33D)Check triangle SFX flags.
- LB3D3: JSR LoadMusicTempFlags ;($BC36)Check music flags.
- ClearSFXFlags:
- LB3D6:* LDA #$00 ;
- LB3D8: STA NoiseSFXFlag ;
- LB3DB: STA SQ1SFXFlag ;
- LB3DE: STA SQ2SFXFlag ;Clear all SFX flags.
- LB3E1: STA TriangleSFXFlag ;
- LB3E4: STA MultiSFXFlag ;
- LB3E7: STA MusicInitFlag ;
- LB3EA: RTS ;
- LB3EB:* JSR InitializeSoundAddresses ;($B404)Prepare to start playing music.
- LB3EE: BEQ -- ;Branch always.
- CheckRepeatMusic:
- LB3F0: LDA MusicRepeat ;
- LB3F3: BEQ + ;If music is supposed to repeat, reset music,-->
- LB3F5: LDA CurrentMusic ;flags else branch to exit.
- LB3F8: STA CurrentMusicRepeat ;
- LB3FB: RTS ;
- CheckMusicFlags:
- LB3FC: LDA CurrentMusic ;Loads A with current music flags and compares it-->
- LB3FF: CMP CurrentSFXFlags ;with current SFX flags. If both are equal,-->
- LB402: BEQ ++ ;just clear music counters, else clear everything.
- InitializeSoundAddresses: ;
- LB404:* JSR ClearMusicAndSFXAddresses ;($B41D)Jumps to all subroutines needed to reset-->
- LB407: JSR ClearSounds ;($B43E)all sound addresses in order to start-->
- LB40A:* JSR ClearSpecialAddresses ;($B40E)playing music.
- LB40D: RTS ;
- ClearSpecialAddresses:
- LB40E: LDA #$00 ;
- LB410: STA TriangleCounterCntrl ;Clears addresses used for repeating music,-->
- LB413: STA SFXPaused ;pausing music and controlling triangle length.
- LB416: STA CurrentMusicRepeat ;
- LB419: STA MusicRepeat ;
- LB41C: RTS ;
- ClearMusicAndSFXAddresses: ;
- LB41D: LDA #$00 ;
- LB41F: STA SQ1InUse ;
- LB422: STA SQ2InUse ;
- LB425: STA TriangleInUse ;
- LB428: STA WriteMultiChannelData ;
- LB42B: STA NoiseContSFX ;Clears any SFX or music-->
- LB42E: STA SQ1ContSFX ;currently being played.
- LB431: STA SQ2ContSFX ;
- LB434: STA TriangleContSFX ;
- LB437: STA MultiContSFX ;
- LB43A: STA CurrentMusic ;
- LB43D: RTS ;
- ClearSounds: ;
- LB43E: LDA #$10 ;
- LB440: STA SQ1Cntrl0 ;
- LB443: STA SQ2Cntrl0 ;
- LB446: STA NoiseCntrl0 ;Clears all sounds that might be in-->
- LB449: LDA #$00 ;The sound channel registers.
- LB44B: STA TriangleCntrl0 ;
- LB44E: STA DMCCntrl1 ;
- LB451: RTS ;
- SelectSFXRoutine:
- LB452: LDX ChannelType ;
- LB455: STA NoiseSFXLength,X ;Stores frame length of SFX in corresponding address.
- LB458: TXA ;
- LB459: BEQ ++ ;Branch if SFX uses noise channel.
- LB45B: CMP #$01 ;
- LB45D: BEQ + ;Branch if SFX uses SQ1 channel.
- LB45F: CMP #$02 ;
- LB461: BEQ MusicBranch00 ;Branch if SFX uses SQ2 channel.
- LB463: CMP #$03 ;
- LB465: BEQ MusicBranch01 ;Branch if SFX uses triangle wave.
- LB467: RTS ;Exit if SFX routine uses no channels.
- LB468:* JSR LoadSQ1ChannelSFX ;($B368)Prepare to load SQ1 channel with data.
- LB46B: BEQ ++ ;Branch always.
- MusicBranch00: ;
- LB46D: JSR LoadSQ2ChannelSFX ;($B374)Prepare to load SQ2 channel with data.
- LB470: BEQ ++ ;Branch always.
- MusicBranch01: ;
- LB472: JSR LoadTriangleChannelSFX ;($B36C)Prepare to load triangle channel with data.
- LB475: BEQ ++ ;Branch always.
- LB477:* JSR LoadNoiseChannelSFX ;($B370)Prepare to load noise channel with data.
- LB47A:* JSR UpdateContFlags ;($B493)Set continuation flags for this SFX.
- LB47D: TXA ;
- LB47E: STA NoiseInUse,X ;Indicate sound channel is in use.
- LB481: LDA #$00 ;
- LB483: STA ThisNoiseFrame,X ;
- LB486: STA NoiseSFXData,X ;Clears all the following addresses before going-->
- LB489: STA MultiSFXData,X ;to the proper SFX handling routine.
- LB48C: STA ScrewAttackSFXData,X ;
- LB48F: STA WriteMultiChannelData ;
- LB492: RTS ;
- UpdateContFlags:
- LB493:* LDX ChannelType ;Loads X register with sound channel just changed.
- LB496: LDA NoiseContSFX,X ;Clear existing continuation SFX-->
- LB499: AND #$00 ;flags for that channel.
- LB49B: ORA CurrentSFXFlags ;Load new continuation flags.
- LB49E: STA NoiseContSFX,X ;Save results.
- LB4A1: RTS ;
- ClearCurrentSFXFlags:
- LB4A2: LDA #$00 ;Once SFX has completed, this block clears the-->
- LB4A4: STA CurrentSFXFlags ;SFX flag from the current flag register.
- LB4A7: BEQ - ;
- IncrementSFXFrame:
- LB4A9: LDX ChannelType ;Load SFX channel number.
- LB4AC: INC ThisNoiseFrame,X ;increment current frame to play on given channel.
- LB4AF: LDA ThisNoiseFrame,X ;Load current frame to play on given channel.
- LB4B2: CMP NoiseSFXLength,X ;Check to see if current frame is last frame to play.
- LB4B5: BNE + ;
- LB4B7: LDA #$00 ;If current frame is last frame,-->
- LB4B9: STA ThisNoiseFrame,X ;reset current frame to 0.
- LB4BC:* RTS ;
- ;The CheckSFXFlag routine loads E0 thru E3 with the below values:
- ;1st SFX cycle $E0=#$BB,$E1=#$B2,$E2=#$22,$E3=#$B3. Base address=$B289
- ;2nd SFX cycle $E0=#$CB,$E1=#$B2,$E2=#$EE,$E3=#$B4. Base address=$B28E
- ;3rd SFX cycle $E0=#$06,$E1=#$BC,$E2=#$5C,$E3=#$B3. Base address=$B2A7
- ;4th SFX cycle $E0=#$16,$E1=#$BC,$E2=#$64,$E3=#$B3. Base address=$B2AC
- ;5th SFX cycle $E0=#$DB,$E1=#$B2,$E2=#$30,$E3=#$B3. Base address=$B293
- ;6th SFX cycle $E0=#$EB,$E1=#$B2,$E2=#$EE,$E3=#$B4. Base address=$B298
- ;7th SFX cycle $E0=#$FB,$E1=#$B2,$E2=#$44,$E3=#$B3. Base address=$B29D
- ;8th SFX cycle $E0=#$0B,$E1=#$B3,$E2=#$EE,$E3=#$B4. Base address=$B2A2
- ;9th SFX cycle $E0=#$26,$E1=#$BC,$E2=#$3D,$E3=#$BC. Base address=$B2B6
- ;10th SFX cycle $E0=#$26,$E1=#$BC,$E2=#$4B,$E3=#$BC. Base address=$B2B1
- CheckSFXFlag:
- LB4BD: STA CurrentSFXFlags ;Store any set flags in $064D.
- LB4C0: STX $E4 ;
- LB4C2: LDY #$B2 ;
- LB4C4: STY $E5 ;
- LB4C6: LDY #$00 ;Y=0 for counting loop ahead.
- LB4C8:* LDA ($E4),Y ;
- LB4CA: STA $00E0,Y ;See table above for values loaded into $E0-->
- LB4CD: INY ;thru $E3 during this loop.
- LB4CE: TYA ;
- LB4CF: CMP #$04 ;Loop repeats four times to load the values.
- LB4D1: BNE - ;
- LB4D3: LDA ($E4),Y ;
- LB4D5: STA ChannelType ;#$00=SQ1,#$01=SQ2,#$02=Triangle,#$03=Noise
- LB4D8: LDY #$00 ;Set y to 0 for counting loop ahead.
- LB4DA: LDA CurrentSFXFlags ;
- LB4DD: PHA ;Push current SFX flags on stack.
- LB4DE:* ASL CurrentSFXFlags ;
- LB4E1: BCS + ;This portion of the routine loops a maximum of-->
- LB4E3: INY ;eight times looking for any SFX flags that have-->
- LB4E4: INY ;been set in the current SFX cycle. If a flag-->
- LB4E5: TYA ;is found, Branch to SFXFlagFound for further-->
- LB4E6: CMP #$10 ;processing, if no flags are set, continue to-->
- LB4E8: BNE - ;next SFX cycle.
- RestoreSFXFlags:
- LB4EA: PLA ;
- LB4EB: STA CurrentSFXFlags ;Restore original data in CurrentSFXFlags.
- LB4EE: RTS ;
- SFXFlagFound: ;
- LB4EF:* LDA ($E0),Y ;This routine stores the starting address of the-->
- LB4F1: STA $E2 ;specific SFX handling routine for the SFX flag-->
- LB4F3: INY ;found. The address is stored in registers-->
- LB4F4: LDA ($E0),Y ;$E2 and $E3.
- LB4F6: STA $E3 ;
- LB4F8: JMP RestoreSFXFlags ;($B4EA)Restore original data in CurrentSFXFlags.
- ;-----------------------------------[ SFX Handling Routines ]---------------------------------------
- ;The following table is used by the SpitFlamesSFXContinue routine to change the volume-->
- ;on the SFX. It starts out quiet, then becomes louder then goes quiet again.
- SpitFlamesTbl:
- LB4FB: .byte $12, $13, $14, $15, $16, $17, $18, $19, $1A, $1B, $1C, $1D, $1B, $1A, $19, $17
- LB50B: .byte $16, $15, $14, $12
- SpitFlameSFXStart:
- LB50F: LDA #$14 ;Number of frames to play sound before a change.
- LB511: LDY #$21 ;Lower byte of sound data start address(base=$B200).
- LB513: JMP SelectSFXRoutine ;($B452)Setup registers for SFX.
- SpitFlameSFXContinue:
- LB516: JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB519: BNE + ;If more frames to process, branch.
- LB51B: JMP EndNoiseSFX ;($B58F)End SFX.
- LB51E:* LDY NoiseSFXData ;
- LB521: LDA $B4FB,Y ;Load data from table above and store in NoiseCntrl0.
- LB524: STA NoiseCntrl0 ;
- LB527: INC NoiseSFXData ;Increment to next entry in data table.
- LB52A: RTS
- ScrewAttackSFXStart:
- LB52B: LDA #$05 ;Number of frames to play sound before a change.
- LB52D: LDY #$11 ;Lower byte of sound data start address(base=$B200).
- LB52F: JSR SelectSFXRoutine ;($B452)Setup registers for SFX.
- LB532: LDA $B213 ;#$00.
- LB535: STA NoiseSFXData ;Clear NoiseSFXData.
- LB538:* RTS ;
- ScrewAttackSFXContinue:
- LB539: LDA ScrewAttackSFXData ;Prevents period index from being incremented until-->
- LB53C: CMP #$02 ;after the tenth frame of the SFX.
- LB53E: BEQ + ;Branch if not ready to increment.
- LB540: JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB543: BNE - ;
- LB545: INC ScrewAttackSFXData ;Increment every fifth frame.
- LB548: RTS ;
- LB549:* JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB54C: BNE IncrementPeriodIndex ;Start increasing period index after first ten frames.
- LB54E: DEC NoiseSFXData ;
- LB551: DEC NoiseSFXData ;Decrement NoiseSFXData by three every fifth frame.
- LB554: DEC NoiseSFXData ;
- LB557: INC MultiSFXData ;Increment MultiSFXData. When it is equal to #$0F-->
- LB55A: LDA MultiSFXData ;end screw attack SFX. MultiSFXData does not-->
- LB55D: CMP #$0F ;appear to be linked to multi SFX channels in-->
- LB55F: BNE -- ;this routine.
- LB561: JMP EndNoiseSFX ;($B58F)End SFX.
- IncrementPeriodIndex:
- LB564: INC NoiseSFXData ;Incrementing the period index has the effect of-->
- LB567: LDA NoiseSFXData ;lowering the frequency of the noise SFX.
- LB56A: STA NoiseCntrl2 ;
- LB56D: RTS ;
- MissileLaunchSFXStart:
- LB56E: LDA #$18 ;Number of frames to play sound before a change.
- LB570: LDY #$15 ;Lower byte of sound data start address(base=$B200).
- LB572: JSR GotoSelectSFXRoutine ;($B587)Prepare to setup registers for SFX.
- LB575: LDA #$0A ;
- LB577: STA NoiseSFXData ;Start increment index for noise channel at #$0A.
- LB57A: RTS ;
- MissileLaunchSFXContine:
- LB57B: JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB57E: BNE IncrementPeriodIndex ;
- LB580: JMP EndNoiseSFX ;($B58F)End SFX.
- BombExplodeSFXStart:
- LB583: LDA #$30 ;Number of frames to play sound before a change.
- LB585: LDY #$19 ;Lower byte of sound data start address(base=$B200).
- GotoSelectSFXRoutine:
- LB587:* JMP SelectSFXRoutine ;($B452)Setup registers for SFX.
- ;The following routine is used to continue BombExplode and SamusWalk SFX.
- NoiseSFXContinue:
- LB58A: JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB58D: BNE MusicBranch02 ;If more frames to process, branch to exit.
- EndNoiseSFX:
- LB58F: JSR ClearCurrentSFXFlags ;($B4A2)Clear all SFX flags.
- LB592: LDA #$10 ;
- LB594: STA NoiseCntrl0 ;disable envelope generator(sound off).
- MusicBranch02:
- LB597: RTS ;Exit for multiple routines.
- SamusWalkSFXStart:
- LB598: LDA NoiseContSFX ;If MissileLaunch, SamusWalk or SpitFire SFX are-->
- LB59B: AND #$34 ;already being played, branch to exit.
- LB59D: BNE MusicBranch02 ;
- LB59F: LDA #$03 ;Number of frames to play sound before a change.
- LB5A1: LDY #$1D ;Lower byte of sound data start address(base=$B200).
- LB5A3: BNE - ;Branch always.
- MultiSFXInit:
- LB5A5: STA MultiSFXLength ;
- LB5A8: JSR LoadSQ2ChannelSFX ;($B374)Set SQ2 SFX data.
- LB5AB: JSR UpdateContFlags ;($B493)Set continue SFX flag.
- LB5AE: LDA #$01 ;
- LB5B0: STA SQ1InUse ;Disable music from using SQ1 and SQ2 while-->
- LB5B3: LDA #$02 ;SFX are playing.
- LB5B5: STA SQ2InUse ;
- LB5B8: LDA #$00 ;
- LB5BA: STA SQ1ContSFX ;
- LB5BD: STA SQ1SFXData ;
- LB5C0: STA SQ1SQ2SFXData ;Clear all listed memory addresses.
- LB5C3: STA SQ1SFXPeriodLow ;
- LB5C6: STA ThisMultiFrame ;
- LB5C9: STA WriteMultiChannelData ;
- LB5CC: RTS ;
- EndMultiSFX:
- LB5CD: LDA #$10 ;
- LB5CF: STA SQ1Cntrl0 ;Disable SQ1 envelope generator(sound off).
- LB5D2: STA SQ2Cntrl0 ;Disable SQ2 envelope generator(sound off).
- LB5D5: LDA #$7F ;
- LB5D7: STA SQ1Cntrl1 ;Disable SQ1 sweep.
- LB5DA: STA SQ2Cntrl1 ;Disable SQ2 sweep.
- LB5DD: JSR ClearCurrentSFXFlags ;($B4A2)Clear all SFX flags.
- LB5E0: LDA #$00 ;
- LB5E2: STA SQ1InUse ;
- LB5E5: STA SQ2InUse ;Allows music player to use SQ1 and SQ2 channels.
- LB5E8: INC WriteMultiChannelData ;
- LB5EB: RTS ;
- BossHitSFXStart:
- LB5EC: LDY #$2D ;Low byte of SQ1 sound data start address(base=$B200).
- LB5EE: JSR LoadSQ1ChannelSFX ;($B368)Set SQ1 SFX data.
- LB5F1: LDY #$29 ;Low byte of SQ2 sound data start address(base=$B200).
- LB5F3: JMP MultiSFXInit ;($B5A5)Initiate multi channel SFX.
- BossHitSFXContinue:
- LB5F6: INC SQ1SFXData ;Increment index to data in table below.
- LB5F9: LDY SQ1SFXData ;
- LB5FC: LDA $B63C,Y ;
- LB5FF: STA SQ1Cntrl0 ;Load SQ1Cntrl0 and SQ2Cntrl0 from table below.
- LB602: STA SQ2Cntrl0 ;
- LB605: LDA SQ1SFXData ;
- LB608: CMP #$14 ;After #$14 frames, end SFX.
- LB60A: BEQ ++ ;
- LB60C: CMP #$06 ;After six or more frames of SFX, branch.
- LB60E: BCC + ;
- LB610: LDA RandomNumber1 ;
- LB612: ORA #$10 ;Set bit 5.
- LB614: AND #$7F ;Randomly set bits 7, 3, 2, 1 and 0.
- LB616: STA SQ1SFXPeriodLow ;Store in SQ1 period low.
- LB619: ROL ;
- LB61A: STA SQ1SQ2SFXData ;
- LB61D: JMP WriteSQ1SQ2PeriodLow ;($B62C)Write period low data to SQ1 and SQ2.
- LB620:* INC SQ1SQ2SFXData ;
- LB623: INC SQ1SQ2SFXData ;Increment SQ1 and SQ2 period low by two.
- LB626: INC SQ1SFXPeriodLow ;
- LB629: INC SQ1SFXPeriodLow ;
- WriteSQ1SQ2PeriodLow:
- LB62C: LDA SQ1SQ2SFXData ;
- LB62F: STA SQ2Cntrl2 ;Write new SQ1 and SQ2 period lows to SQ1 and SQ2-->
- LB632: LDA SQ1SFXPeriodLow ;channels.
- LB635: STA SQ1Cntrl2 ;
- LB638: RTS ;
- LB639:* JMP EndMultiSFX ;($B5CD)End SFX.
- BossHitSFXDataTbl:
- LB63C: .byte $38, $3D, $3F, $3F, $3F, $3F, $3F, $3D, $3B, $39, $3B, $3D, $3F, $3D, $3B, $39
- LB64C: .byte $3B, $3D, $3F, $39
- SamusHitSFXContinue:
- LB650: JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB653: BNE + ;If more SFX frames to process, branch.
- LB655: JMP EndMultiSFX ;($B5CD)End SFX.
- LB658:* LDY #$25 ;Low byte of SQ1 sound data start address(base=$B200).
- LB65A: JSR LoadSQ1ChannelSFX ;($B368)Set SQ1 SFX data.
- LB65D: LDA RandomNumber1 ;
- LB65F: AND #$0F ;Randomly set last four bits of SQ1 period low.
- LB661: STA SQ1Cntrl2 ;
- LB664: LDY #$25 ;Low byte of SQ2 sound data start address(base=$B200).
- LB666: JSR LoadSQ2ChannelSFX ;($B374)Set SQ2 SFX data.
- LB669: LDA RandomNumber1 ;
- LB66B: LSR ;Multiply random number by 4.
- LB66C: LSR ;
- LB66D: AND #$0F ;
- LB66F: STA SQ2Cntrl2 ;Randomly set bits 2 and 3 of SQ2 period low.
- LB672: RTS ;
- SamusHitSFXStart:
- LB673: LDY #$25 ;Low byte of SQ1 sound data start address(base=$B200).
- LB675: JSR LoadSQ1ChannelSFX ;($B368)Set SQ1 SFX data.
- LB678: LDA RandomNumber1 ;
- LB67A: AND #$0F ;Randomly set last four bits of SQ1 period low.
- LB67C: STA SQ1Cntrl2 ;
- LB67F: CLC ;
- LB680: LDA RandomNumber1 ;Randomly set last three bits of SQ2 period low+1.
- LB682: AND #$03 ;
- LB684: ADC #$01 ;Number of frames to play sound before a change.
- LB686: LDY #$25 ;Low byte of SQ2 sound data start address(base=$B200).
- LB688: JSR MultiSFXInit ;($B5A5)Initiate multi channel SFX.
- LB68B: LDA RandomNumber1 ;
- LB68D: LSR ;Multiply random number by 4.
- LB68E: LSR ;
- LB68F: AND #$0F ;
- LB691: STA SQ2Cntrl2 ;Randomly set bits 2 and 3 of SQ2 period low.
- LB694:* RTS ;
- IncorrectPasswordSFXStart:
- LB695: LDY #$31 ;Low byte of SQ1 sound data start address(base=$B200).
- LB697: JSR LoadSQ1ChannelSFX ;($B368)Set SQ1 SFX data.
- LB69A: LDA #$20 ;Number of frames to play sound before a change.
- LB69C: LDY #$35 ;Low byte of SQ2 sound data start address(base=$B200).
- LB69E: JMP MultiSFXInit ;($B5A5)Initiate multi channel SFX.
- IncorrectPasswordSFXContinue:
- LB6A1: JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB6A4: BNE - ;If more frames to process, branch to exit.
- LB6A6: JMP EndMultiSFX ;($B5CD)End SFX.
- ;The following table is used by the below routine to load SQ1Cntrl2 data in the
- ;MissilePickupSFXContinue routine.
- MissilePickupSFXTbl:
- LB6A9: .byte $BD, $8D, $7E, $5E, $46, $3E, $00
- MissilePickupSFXContinue:
- LB6B0: JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB6B3: BNE MusicBranch03 ;If more frames to process, branch to exit.
- LB6B5: LDY SQ1SFXData ;
- LB6B8: LDA MissilePickupSFXTbl,Y ;Load SFX data from table above.
- LB6BB: BNE + ;
- LB6BD: JMP EndSQ1SFX ;($B6F2)SFX completed.
- LB6C0:* STA SQ1Cntrl2 ;
- LB6C3: LDA $B244 ;#$28.
- LB6C6: STA SQ1Cntrl3 ;load SQ1Cntrl3 with #$28.
- LB6C9: INC SQ1SFXData ;Increment index to data table above every 5 frames.
- MusicBranch03:
- LB6CC: RTS ;Exit from multiple routines.
- MissilePickupSFXStart:
- LB6CD: LDA #$05 ;Number of frames to play sound before a change.
- LB6CF: LDY #$41 ;Lower byte of sound data start address(base=$B200).
- LB6D1: BNE +++ ;Branch always.
- EnergyPickupSFXContinue:
- LB6D3: JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB6D6: BNE MusicBranch03 ;If more frames to process, branch to exit.
- LB6D8: INC SQ1SFXData ;
- LB6DB: LDA SQ1SFXData ;Every six frames, reload SFX info. Does it-->
- LB6DE: CMP #$03 ;three times for a total of 18 frames.
- LB6E0: BEQ + ;
- LB6E2: LDY #$3D ;
- LB6E4: JMP LoadSQ1ChannelSFX ;($B368)Set SQ1 SFX data.
- EnergyPickupSFXStart:
- LB6E7: LDA #$06 ;Number of frames to play sound before a change.
- LB6E9: LDY #$3D ;Lower byte of sound data start address(base=$B200).
- LB6EB: BNE +++ ;Branch always.
- ;The following continue routine is used by the metal, out of hole,
- ;enemy hit and the Samus jump SFXs.
- SQ1SFXContinue:
- LB6ED: JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB6F0: BNE MusicBranch03 ;
- EndSQ1SFX:
- LB6F2:* LDA #$10 ;
- LB6F4: STA SQ1Cntrl0 ;Disable envelope generator(sound off).
- LB6F7: LDA #$00 ;
- LB6F9: STA SQ1InUse ;Allows music to use SQ1 channel.
- LB6FC: JSR ClearCurrentSFXFlags ;($B4A2)Clear all SFX flags.
- LB6FF: INC WriteMultiChannelData ;Allows music routines to load SQ1 and SQ2 music.
- LB702: RTS ;
- SamusJumpSFXStart:
- LB703: LDA CurrentMusic ;If escape music is playing, exit without playing-->
- LB706: CMP #$04 ;Samus jump SFX.
- LB708: BEQ MusicBranch03 ;
- LB70A: LDA #$0C ;Number of frames to play sound before a change.
- LB70C: LDY #$51 ;Lower byte of sound data start address(base=$B200).
- LB70E: BNE SelectSFX1 ;Branch always.
- EnemyHitSFXStart:
- LB710: LDA #$08 ;Number of frames to play sound before a change.
- LB712: LDY #$55 ;Lower byte of sound data start address(base=$B200).
- LB714: BNE SelectSFX1 ;Branch always.
- BulletFireSFXStart:
- LB716: LDA HasBeamSFX ;
- LB719: LSR ;If Samus has ice beam, branch.
- LB71A: BCS +++++ ;
- LB71C: LDA SQ1ContSFX ;If MissilePickup, EnergyPickup, BirdOutOfHole-->
- LB71F: AND #$CC ;or EnemyHit SFX already playing, branch to exit.
- LB721: BNE MusicBranch03 ;
- LB723: LDA HasBeamSFX ;
- LB726: ASL ;If Samus has long beam, branch.
- LB727: BCS + ;
- LB729: LDA #$03 ;Number of frames to play sound before a change.
- LB72B: LDY #$4D ;Lower byte of sound data start address(base=$B200).
- LB72D: BNE SelectSFX1 ;Branch always (Plays ShortBeamSFX).
- HasLongBeamSFXStart:
- LB72F:* LDA #$07 ;Number of frames to play sound before a change.
- LB731: LDY #$49 ;Lower byte of sound data start address(base=$B200).
- LB733: BNE SelectSFX1 ;Branch always.
- MetalSFXStart:
- LB735: LDA #$0B ;Number of frames to play sound before a change.
- LB737: LDY #$45 ;Lower byte of sound data start address(base=$B200).
- SelectSFX1:
- LB739:* JMP SelectSFXRoutine ;($B452)Setup registers for SFX.
- BirdOutOfHoleSFXStart:
- LB73C: LDA CurrentMusic ;If escape music is playing, use this SFX to make-->
- LB73F: CMP #$04 ;the bomb ticking sound, else play regular SFX.
- LB741: BEQ + ;
- LB743: LDA #$16 ;Number of frames to play sound before a change.
- LB745: LDY #$59 ;Lower byte of sound data start address(base=$B200).
- LB747: BNE SelectSFX1 ;Branch always.
- LB749:* LDA #$07 ;Number of frames to play sound before a change.
- LB74B: LDY #$39 ;Lower byte of sound data start address(base=$B200).
- LB74D: BNE SelectSFX1 ;Branch always.
- BulletFireSFXContinue:
- LB74F: LDA HasBeamSFX ;
- LB752: LSR ;If Samus has ice beam, branch.
- LB753: BCS +++ ;
- LB755: JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB758: BNE + ;If more frames to process, branch to exit.
- LB75A: JMP EndSQ1SFX ;($B6F2)If SFX finished, jump.
- LB75D:* RTS ;
- HasIceBeamSFXStart:
- LB75E:* LDA #$07 ;Number of frames to play sound before a change.
- LB760: LDY #$61 ;Lower byte of sound data start address(base=$B200).
- LB762: JMP SelectSFXRoutine ;($B452)Setup registers for SFX.
- HasIceBeamSFXContinue:
- LB765:* JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB768: BNE + ;If more frames to process, branch.
- LB76A: JMP EndSQ1SFX ;($B6F2)If SFX finished, jump.
- LB76D:* LDA SQ1SFXData ;
- LB770: AND #$01 ;Determine index for IceBeamSFXDataTbl below.
- LB772: TAY ;
- LB773: LDA IceBeamSFXDataTbl,Y ;Loads A with value from IceBeamSFXDataTbl below.
- LB776: BNE ++ ;
- IceBeamSFXDataTbl:
- LB778: .byte $93 ;Ice beam SFX period low data.
- LB779: .byte $81 ;
- WaveBeamSFXStart:
- LB77A: LDA #$08 ;Number of frames to play sound before a change.
- LB77C: LDY #$5D ;Lower byte of sound data start address(base=$B200).
- LB77E: JMP SelectSFXRoutine ;($B452)Setup registers for SFX.
- WaveBeamSFXContinue:
- LB781: JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB784: BNE + ;If more frames to process, branch.
- LB786: LDY SQ1SQ2SFXData ;
- LB789: INC SQ1SQ2SFXData ;Load wave beam SFXDisable/enable envelope length-->
- LB78C: LDA WaveBeamSFXDisLngthTbl,Y ;data from WaveBeamSFXDisableLengthTbl.
- LB78F: STA SQ1Cntrl0 ;
- LB792: BNE MusicBranch10 ;If at end of WaveBeamSFXDisableLengthTbl, end SFX.
- LB794: JMP EndSQ1SFX ;($B6F2)If SFX finished, jump.
- LB797:* LDA SQ1SFXData
- LB79A: AND #$01 ;
- LB79C: TAY ;Load wave beam SFX period low data from-->
- LB79D: LDA WaveBeamSFXPeriodLowTbl,Y ;WaveBeamSFXPeriodLowTbl.
- LoadSQ1PeriodLow:
- LB7A0:* STA SQ1Cntrl2 ;Change the period low data for SQ1 channel.
- LB7A3: INC SQ1SFXData ;
- MusicBranch10:
- LB7A6: RTS ;Exit for multiple routines.
- WaveBeamSFXPeriodLowTbl:
- LB7A7: .byte $58 ;Wave beam SFX period low data.
- LB7A8: .byte $6F ;
- WaveBeamSFXDisLngthTbl:
- LB7A9: .byte $93 ;
- LB7AA: .byte $91 ;Wave beam SFX Disable/enable envelope length data.
- LB7AB: .byte $00 ;
- DoorOpenCloseSFXStart:
- LB7AC: LDA $B287 ;#$30.
- LB7AF: STA TrianglePeriodLow ;Set triangle period low data byte.
- LB7B2: LDA $B288 ;#$B2.
- LB7B5: AND #$07 ;Set triangle period high data byte.
- LB7B7: STA TrianglePeriodHigh ;#$B7.
- LB7BA: LDA #$0F ;
- LB7BC: STA TriangleChangeLow ;Change triangle channel period low every frame by #$0F.
- LB7BF: LDA #$00 ;
- LB7C1: STA TriangleChangeHigh ;No change in triangle channel period high.
- LB7C4: LDA #$1F ;Number of frames to play sound before a change.
- LB7C6: LDY #$85 ;Lower byte of sound data start address(base=$B200).
- LB7C8: JMP SelectSFXRoutine ;($B452)Setup registers for SFX.
- DoorOpenCloseSFXContinue:
- LB7CB: JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB7CE: BNE + ;
- LB7D0: JMP EndTriangleSFX ;($B896)End SFX.
- LB7D3:* JSR DecreaseTrianglePeriods ;($B98C)Decrease periods.
- LB7D6: JMP WriteTrianglePeriods ;($B869)Save new periods.
- BeepSFXStart:
- LB7D9: LDA TriangleContSFX ;If BombLaunchSFX is already playing, branch-->
- LB7DC: AND #$80 ;without playing BeepSFX.
- LB7DE: BNE MusicBranch10 ;
- LB7E0: LDA #$03 ;Number of frames to play sound before a change.
- LB7E2: LDY #$79 ;Lower byte of sound data start address(base=$B200).
- LB7E4: JMP SelectSFXRoutine ;($B452)Setup registers for SFX.
- BeepSFXContinue:
- LB7E7: JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB7EA: BNE MusicBranch10 ;If more frames to process, branch to exit.
- LB7EC: JMP EndTriangleSFX ;($B896)End SFX.
- BigEnemyHitSFXStart:
- LB7EF: LDA #$12 ;Increase triangle low period by #$12 every frame.
- LB7F1: STA TriangleChangeLow ;
- LB7F4: LDA #$00 ;
- LB7F6: STA TriangleChangeHigh ;Does not change triangle period high.
- LB7F9: LDA $B27F ;#$42.
- LB7FC: STA TrianglePeriodLow ;Save new triangle period low data.
- LB7FF: LDA $B280 ;#$18.
- LB802: AND #$07 ;#$1F.
- LB804: STA TrianglePeriodHigh ;Save new triangle period high data.
- LB807: LDA #$0A ;Number of frames to play sound before a change.
- LB809: LDY #$7D ;Lower byte of sound data start address(base=$B200).
- LB80B: JMP SelectSFXRoutine ;($B452)Setup registers for SFX.
- BigEnemyHitSFXContinue:
- LB80E: JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB811: BNE + ;If more frames to process, branch
- LB813: JMP EndTriangleSFX ;($B896)End SFX
- LB816:* JSR IncreaseTrianglePeriods ;($B978)Increase periods.
- LB819: LDA RandomNumber1 ;
- LB81B: AND #$3C ;
- LB81D: STA TriangleSFXData ;
- LB820: LDA TrianglePeriodLow ;Randomly set or clear bits 2, 3, 4 and 5 in-->
- LB823: AND #$C3 ;triangle channel period low.
- LB825: ORA TriangleSFXData ;
- LB828: STA TriangleCntrl2 ;
- LB82B: LDA TrianglePeriodHigh ;
- LB82E: ORA #$40 ;Set 4th bit in triangle channel period high.
- LB830: STA TriangleCntrl3 ;
- LB833: RTS ;
- SamusToBallSFXStart:
- LB834: LDA #$08 ;Number of frames to play sound before a change.
- LB836: LDY #$6D ;Lower byte of sound data start address(base=$B200).
- LB838: JSR SelectSFXRoutine ;($B452)Setup registers for SFX.
- LB83B: LDA #$05 ;
- LB83D: STA PercentDifference ;Stores percent difference. In this case 5 = 1/5 = 20%.
- LB840: LDA $B26F ;#$DD.
- LB843: STA TrianglePeriodLow ;Save new triangle period low data.
- LB846: LDA $B270 ;#$3B.
- LB849: AND #$07 ;#$02.
- LB84B: STA TrianglePeriodHigh ;Save new triangle period high data.
- LB84E: RTS ;
- SamusToBallSFXContinue:
- LB84F: JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB852: BNE + ;If more frames to process, branch.
- LB854: JMP EndTriangleSFX ;($B896)End SFX.
- LB857:* JSR DivideTrianglePeriods ;($B9A0)reduces triangle period low by 20% each frame.
- LB85A: LDA TriangleLowPercentage ;
- LB85D: STA TriangleChangeLow ;Store new values to change triangle periods.
- LB860: LDA TriangleHighPercentage ;
- LB863: STA TriangleChangeHigh ;
- LB866: JSR DecreaseTrianglePeriods ;($B98C)Decrease periods.
- WriteTrianglePeriods:
- LB869: LDA TrianglePeriodLow ;Write TrianglePeriodLow to triangle channel.
- LB86C: STA TriangleCntrl2 ;
- LB86F: LDA TrianglePeriodHigh ;
- LB872: ORA #$08 ;Write TrianglePeriodHigh to triangle channel.
- LB874: STA TriangleCntrl3 ;
- LB877: RTS ;
- BombLaunchSFXStart:
- LB878: LDA #$04 ;Number of frames to play sound before a change.
- LB87A: LDY #$65 ;Lower byte of sound data start address(base=$B200).
- LB87C: JMP SelectSFXRoutine ;($B452)Setup registers for SFX.
- BombLaunchSFXContinue:
- LB87F: JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB882: BNE MusicBranch04 ;If more frames to process, branch to exit.
- LB884: INC TriangleSFXData ;
- LB887: LDA TriangleSFXData ;After four frames, load second part of SFX.
- LB88A: CMP #$02 ;
- LB88C: BNE + ;
- LB88E: JMP EndTriangleSFX ;($B896)End SFX.
- LB891:* LDY #$69 ;Lower byte of sound data start address(base=$B200).
- LB893: JMP LoadTriangleChannelSFX ;($B36C)Prepare to load triangle channel with data.
- EndTriangleSFX:
- LB896: LDA #$00 ;
- LB898: STA TriangleCntrl0 ;clear TriangleCntr0(sound off).
- LB89B: STA TriangleInUse ;Allows music to use triangle channel.
- LB89E: LDA #$18 ;
- LB8A0: STA TriangleCntrl3 ;Set length index to #$03.
- LB8A3: JSR ClearCurrentSFXFlags ;($B4A2)Clear all SFX flags.
- MusicBranch04:
- LB8A6: RTS ;Exit from for multiple routines.
- MetroidHitSFXStart:
- LB8A7: LDA #$03 ;Number of frames to play sound before a change.
- LB8A9: LDY #$71 ;Lower byte of sound data start address(base=$B200).
- LB8AB: JSR SelectSFXRoutine ;($B452)Setup registers for SFX.
- LB8AE: JMP RndTrianglePeriods ;($B8C3)MetroidHit SFX has several different sounds.
- MetroiHitSFXContinue:
- LB8B1: JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB8B4: BEQ + ;
- LB8B6: INC TriangleSFXData ;
- LB8B9: LDA TriangleSFXData ;Randomize triangle periods nine times throughout-->
- LB8BC: CMP #$09 ;the course of the SFX.
- LB8BE: BNE MusicBranch04 ;If SFX not done, branch.
- LB8C0: JMP EndTriangleSFX ;($B896)End SFX.
- RndTrianglePeriods:
- LB8C3:* LDA RandomNumber1 ;Randomly set or reset bits 7, 4, 2 and 1 of-->
- LB8C5: ORA #$6C ;triangle channel period low.
- LB8C7: STA TriangleCntrl2 ;
- LB8CA: AND #$01 ;
- LB8CC: ORA #$F8 ;Randomly set or reset last bit of triangle-->
- LB8CE: STA TriangleCntrl3 ;channel period high.
- LB8D1: RTS ;
- SamusDieSFXStart:
- LB8D2: JSR InitializeSoundAddresses ;($B404)Clear all sound addresses.
- LB8D5: LDA #$0E ;Number of frames to play sound before a change.
- LB8D7: LDY #$75 ;Lower byte of sound data start address(base=$B200).
- LB8D9: JSR SelectSFXRoutine ;($B452)Setup registers for SFX.
- LB8DC: LDA #$15 ;Decrease triangle SFX periods by 4.8% every frame.
- LB8DE: STA PercentDifference ;
- LB8E1: LDA $B277 ;#$40.
- LB8E4: STA TrianglePeriodLow ;
- LB8E7: LDA #$00 ;Initial values of triangle periods.
- LB8E9: STA TrianglePeriodHigh ;
- LB8EC:* RTS ;
- SamusDieSFXContinue:
- LB8ED: JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB8F0: BNE + ;
- LB8F2: LDA #$20 ;Store change in triangle period low.
- LB8F4: STA TriangleChangeLow ;
- LB8F7: LDA #$00 ;
- LB8F9: STA TriangleChangeHigh ;No change in triangle period high.
- LB8FC: JSR DecreaseTrianglePeriods ;($B98C)Decrease periods.
- LB8FF: INC TriangleSFXData ;
- LB902: LDA TriangleSFXData ;
- LB905: CMP #$06 ;
- LB907: BNE - ;If more frames to process, branch to exit.
- LB909: JMP EndTriangleSFX ;($B896)End SFX.
- LB90C:* JSR DivideTrianglePeriods ;($B9A0)reduces triangle period low.
- LB90F: LDA TriangleLowPercentage ;
- LB912: STA TriangleChangeLow ;Update triangle periods.
- LB915: LDA TriangleHighPercentage ;
- LB918: STA TriangleChangeHigh ;
- LB91B: JSR IncreaseTrianglePeriods ;($B978)Increase periods.
- LB91E: JMP WriteTrianglePeriods ;($B869)Save new periods.
- StatueRaiseSFXStart:
- LB921: LDA $B283 ;#$11.
- LB924: STA TrianglePeriodLow ;Save period low data.
- LB927: LDA $B284 ;#$09.
- LB92A: AND #$07 ;
- LB92C: STA TrianglePeriodHigh ;Store last three bits in $B284.
- LB92F: LDA #$00 ;
- LB931: STA TriangleChangeHigh ;No change in Triangle period high.
- LB934: LDA #$0B ;
- LB936: STA TriangleChangeLow ;
- LB939: LDA #$06 ;Number of frames to play sound before a change.
- LB93B: LDY #$81 ;Lower byte of sound data start address(base=$B200).
- LB93D: JMP SelectSFXroutine ;($B452)Setup registers for SFX.
- StatueRaiseSFXContinue:
- LB940: JSR IncrementSFXFrame ;($B4A9)Get next databyte to process in SFX.
- LB943: BNE ++ ;
- LB945: INC TriangleSFXData ;Increment TriangleSFXData every 6 frames.
- LB948: LDA TriangleSFXData ;
- LB94B: CMP #$09 ;When TriangleSFXData = #$09, end SFX.
- LB94D: BNE + ;
- LB94F: JMP EndTriangleSFX ;($B896)End SFX.
- LB952:* LDA TriangleChangeLow ;
- LB955: PHA ;Save triangle periods.
- LB956: LDA TriangleChangeHigh ;
- LB959: PHA ;
- LB95A: LDA #$25 ;
- LB95C: STA TriangleChangeLow ;
- LB95F: LDA #$00 ;No change in triangle period high.
- LB961: STA TriangleChangeHigh ;
- LB964: JSR IncreaseTrianglePeriods ;($B978)Increase periods.
- LB967: PLA ;
- LB968: STA TriangleChangeHigh ;Restore triangle periods.
- LB96B: PLA ;
- LB96C: STA TriangleChangeLow ;
- LB96F: JMP WriteTrianglePeriods ;($B869)Save new periods.
- LB972:* JSR DecreaseTrianglePeriods ;($B98C)Decrease periods.
- LB975: JMP WriteTrianglePeriods ;($B869)Save new periods.
- IncreaseTrianglePeriods:
- LB978: CLC
- LB979: LDA TrianglePeriodLow ;
- LB97C: ADC TriangleChangeLow ;Calculate new TrianglePeriodLow.
- LB97F: STA TrianglePeriodLow ;
- LB982: LDA TrianglePeriodHigh ;
- LB985: ADC TriangleChangeHigh ;Calculate new TrianglePeriodHigh.
- LB988: STA TrianglePeriodHigh ;
- LB98B: RTS ;
- DecreaseTrianglePeriods:
- LB98C: SEC
- LB98D: LDA TrianglePeriodLow ;
- LB990: SBC TriangleChangeLow ;Calculate new TrianglePeriodLow.
- LB993: STA TrianglePeriodLow ;
- LB996: LDA TrianglePeriodHigh ;
- LB999: SBC TriangleChangeHigh ;Calculate new TrianglePeriodHigh.
- LB99C: STA TrianglePeriodHigh ;
- LB99F: RTS ;
- DivideTrianglePeriods:
- LB9A0: LDA TrianglePeriodLow ;
- LB9A3: PHA ;Store TrianglePeriodLow and TrianglePeriodHigh.
- LB9A4: LDA TrianglePeriodHigh ;
- LB9A7: PHA ;
- LB9A8: LDA #$00 ;
- LB9AA: STA DivideData ;
- LB9AD: LDX #$10 ;
- LB9AF: ROL TrianglePeriodLow ;
- LB9B2: ROL TrianglePeriodHigh ;
- LB9B5:* ROL DivideData ;The following routine takes the triangle period-->
- LB9B8: LDA DivideData ;high and triangle period low values and reduces-->
- LB9BB: CMP PercentDifference ;them by a certain percent. The percent is-->
- LB9BE: BCC + ;determined by the value stored in-->
- LB9C0: SBC PercentDifference ;PercentDifference. If PercentDifference=#$05,-->
- LB9C3: STA DivideData ;then the values will be reduced by 20%(1/5).-->
- LB9C6:* ROL TrianglePeriodLow ;If PercentDifference=#$0A,Then the value will-->
- LB9C9: ROL TrianglePeriodHigh ;be reduced by 10%(1/10), etc. This function is-->
- LB9CC: DEX ;basically a software emulation of a sweep function.
- LB9CD: BNE -- ;
- LB9CF: LDA TrianglePeriodLow ;
- LB9D2: STA TriangleLowPercentage ;
- LB9D5: LDA TrianglePeriodHigh ;
- LB9D8: STA TriangleHighPercentage ;
- LB9DB: PLA ;
- LB9DC: STA TrianglePeriodHigh ;Restore TrianglePerodLow and TrianglePeriodHigh.
- LB9DF: PLA ;
- LB9E0: STA TrianglePeriodLow ;
- LB9E3: RTS ;
- ;--------------------------------------[ End SFX routines ]-------------------------------------
- SetVolumeAndDisableSweep:
- LB9E4: LDA #$7F ;
- LB9E6: STA MusicSQ1Sweep ;Disable sweep generator on SQ1 and SQ2.
- LB9E9: STA MusicSQ2Sweep ;
- LB9EC: STX SQ1DutyEnvelope ;Store duty cycle and volume data for SQ1 and SQ2.
- LB9EF: STY SQ2DutyEnvelope ;
- LB9F2: RTS ;
- ResetVolumeIndex:
- LB9F3: LDA SQ1MusicFrameCount ;If at the beginning of a new SQ1 note, set-->
- LB9F6: CMP #$01 ;SQ1VolumeIndex = #$01.
- LB9F8: BNE + ;
- LB9FA: STA SQ1VolumeIndex ;
- LB9FD:* LDA SQ2MusicFrameCount ;
- LBA00: CMP #$01 ;If at the beginning of a new SQ2 note, set-->
- LBA02: BNE + ;SQ2VolumeIndex = #$01.
- LBA04: STA SQ2VolumeIndex ;
- LBA07:* RTS ;
- LoadSQ1SQ2Periods:
- LBA08: LDA WriteMultiChannelData ;If a Multi channel data does not need to be-->
- LBA0B: BEQ + ;loaded, branch to exit.
- LBA0D: LDA #$00 ;
- LBA0F: STA WriteMultiChannelData ;Clear multi channel data write flag.
- LBA12: LDA MusicSQ1Sweep ;
- LBA15: STA SQ1Cntrl1 ;
- LBA18: LDA MusicSQ1PeriodLow ;
- LBA1B: STA SQ1Cntrl2 ;Loads SQ1 channel addresses $4001, $4002, $4003.
- LBA1E: LDA MusicSQ1PeriodHigh ;
- LBA21: STA SQ1Cntrl3 ;
- LBA24: LDA MusicSQ2Sweep ;
- LBA27: STA SQ2Cntrl1 ;
- LBA2A: LDA MusicSQ2PeriodLow ;
- LBA2D: STA SQ2Cntrl2 ;Loads SQ2 channel addresses $4005, $4006, $4007.
- LBA30: LDA MusicSQ2PeriodHigh ;
- LBA33: STA SQ2Cntrl3 ;
- LBA36:* RTS ;
- LoadSQ1SQ2Channels:
- LBA37: LDX #$00 ;Load SQ1 channel data.
- LBA39: JSR WriteSQCntrl0 ;($BA41)Write Cntrl0 data.
- LBA3C: INX ;Load SQ2 channel data.
- LBA3D: JSR WriteSQCntrl0 ;($BA41)Write Cntrl0 data.
- LBA40: RTS ;
- WriteSQCntrl0:
- LBA41: LDA SQ1VolumeCntrl,X ;Load SQ channel volume data. If zero, branch to exit.
- LBA44: BEQ +++++ ;
- LBA46: STA VolumeCntrlAddress ;
- LBA48: JSR LoadSQ1SQ2Periods ;($BA08)Load SQ1 and SQ2 control information.
- LBA4B: LDA SQ1VolumeData,X ;
- LBA4E: CMP #$10 ;If sound channel is not currently-->
- LBA50: BEQ +++++++ ;playing sound, branch.
- LBA52: LDY #$00 ;
- LBA54:* DEC VolumeCntrlAddress ;Desired entry in VolumeCntrlAdressTbl.
- LBA56: BEQ + ;
- LBA58: INY ;*2(2 byte address to find voulume control data).
- LBA59: INY ;
- LBA5A: BNE - ;Keep decrementing until desired address is found.
- LBA5C:* LDA VolumeCntrlAddressTbl,Y ;Base is $BCB0.
- LBA5F: STA $EC ;Volume data address low byte.
- LBA61: LDA VolumeCntrlAddressTbl+1,Y ;Base is $BCB1.
- LBA64: STA $ED ;Volume data address high byte.
- LBA66: LDY SQ1VolumeIndex,X ;Index to desired volume data.
- LBA69: LDA ($EC),Y ;Load desired volume for current channel into-->
- LBA6B: STA Cntrl0Data ;Cntrl0Data.
- LBA6D: CMP #$FF ;If last entry in volume table is #$FF, restore-->
- LBA6F: BEQ MusicBranch05 ;volume to its original level after done reading-->
- LBA71: CMP #$F0 ;Volume data. If #$F0 is last entry, turn sound-->
- LBA73: BEQ MusicBranch06 ;off on current channel until next note.
- LBA75: LDA SQ1DutyEnvelope,X ;Remove duty cycle data For current channel and-->
- LBA78: AND #$F0 ;add this frame of volume data and store results-->
- LBA7A: ORA Cntrl0Data ;in Cntrl0Data.
- LBA7C: TAY ;
- LBA7D:* INC SQ1VolumeIndex,X ;Increment Index to volume data.
- LBA80:* LDA SQ1InUse,X ;If SQ1 or SQ2(depends on loop iteration) in use,-->
- LBA83: BNE + ;branch to exit, else write SQ(1 or 2)Cntrl0.
- LBA85: TXA ;
- LBA86: BEQ ++ ;If currently on SQ1, branch to write SQ1 data.
- WriteSQ2Cntrl0: ;
- LBA88: STY SQ2Cntrl0 ;Write SQ2Cntrl0 data.
- LBA8B:* RTS ;
- WriteSQ1Cntrl0: ;
- LBA8C:* STY SQ1Cntrl0 ;Write SQ1Cntrl0 data.
- LBA8F: RTS ;
- MusicBranch05:
- LBA90: LDY SQ1DutyEnvelope,X ;Restore original volume of sound channel.
- LBA93: BNE --- ;Branch always.
- MusicBranch06:
- LBA95: LDY #$10 ;Disable envelope generator and set volume to 0.
- LBA97: BNE --- ;Branch always.
- LBA99:* LDY #$10 ;Disable envelope generator and set volume to 0.
- LBA9B: BNE ----- ;Branch always.
- GotoCheckRepeatMusic:
- LBA9D:* JSR CheckRepeatMusic ;($B3F0)Resets music flags if music repeats.
- LBAA0: RTS ;
- GotoLoadSQ1SQ2Channels:
- LBAA1:* JSR LoadSQ1SQ2Channels ;($BA37)Load SQ1 and SQ2 channel data.
- LBAA4: RTS ;
- LoadCurrentMusicFrameData:
- LBAA5: JSR ResetVolumeIndex ;($B9F3)Reset index if at the beginning of a new note.
- LBAA8: LDA #$00 ;
- LBAAA: TAX ;X = #$00.
- LBAAB: STA ThisSoundChannel ;(#$00, #$04, #$08 or #$0C).
- LBAAE: BEQ ++ ;
- LBAB0:* TXA ;
- LBAB1: LSR ;
- LBAB2: TAX ;Increment to next sound channel(1,2 or 3).
- ;
- IncrementToNextChannel: ;
- LBAB3: INX ;
- LBAB4: TXA ;
- LBAB5: CMP #$04 ;If done with four sound channels, branch to load-->
- LBAB7: BEQ -- ;sound channel SQ1 SQ2 data.
- LBAB9: LDA ThisSoundChannel ;Add 4 to the least significant byte of the current-->
- LBABC: CLC ;sound channel start address. This moves to next-->
- LBABD: ADC #$04 ;sound channel address ranges to process.
- LBABF: STA ThisSoundChannel ;
- LBAC2:* TXA ;
- LBAC3: ASL ;*2(two bytes for sound channel info base address).
- LBAC4: TAX ;
- LBAC5: LDA SQ1LowBaseByte,X ;
- LBAC8: STA $E6 ;Load sound channel info base address into $E6-->
- LBACA: LDA SQ1HighBaseByte,X ;and $E7. ($E6=low byte, $E7=high byte).
- LBACD: STA $E7 ;
- LBACF: LDA SQ1HighBaseByte,X ;If no data for this sound channel, branch-->
- LBAD2: BEQ -- ;to find data for next sound channel.
- LBAD4: TXA ;
- LBAD5: LSR ;/2. Determine current sound channel (0,1,2 or3).
- LBAD6: TAX ;
- LBAD7: DEC SQ1MusicFrameCount,X ;Decrement the current sound channel frame count-->
- LBADA: BNE IncrementToNextChannel ;If not zero, branch to check next channel, else-->
- ;load the next set of sound channel data.
- LoadNextChannelIndexData:
- LBADC: LDY SQ1MusicIndexIndex,X ;Load current channel index to music data index.
- LBADF: INC SQ1MusicIndexIndex,X ;Increment current channel index to music data index.
- LBAE2: LDA ($E6),Y ;
- LBAE4: BEQ ---- ;Branch if music has reached the end.
- LBAE6: TAY ;Transfer music data index to Y (base=$BE77) .
- LBAE7: CMP #$FF ;
- LBAE9: BEQ + ;At end of loop? If yes, branch.
- LBAEB: AND #$C0 ;
- LBAED: CMP #$C0 ;At beginnig of new loop? if yes, branch.
- LBAEF: BEQ ++ ;
- LBAF1: JMP LoadMusicChannel ;($BB1C)Load music data into channel.
- RepeatMusicLoop:
- LBAF4:* LDA SQ1RepeatCounter,X ;If loop counter has reached zero, branch to exit.
- LBAF7: BEQ ++ ;
- LBAF9: DEC SQ1RepeatCounter,X ;Decrement loop counter.
- LBAFC: LDA SQ1LoopIndex,X ;Load loop index for proper channel and store it in-->
- LBAFF: STA SQ1MusicIndexIndex,X ;music index index address.
- LBB02: BNE ++ ;Branch unless music has reached the end.
- StartNewMusicLoop:
- LBB04:* TYA ;
- LBB05: AND #$3F ;Remove last six bits of loop controller and save-->
- LBB07: STA SQ1RepeatCounter,X ;in repeat counter addresses. # of times to loop.
- LBB0A: DEC SQ1RepeatCounter,X ;Decrement loop counter.
- LBB0D: LDA SQ1MusicIndexIndex,X ;Store location of loop start in loop index address.
- LBB10: STA SQ1LoopIndex,X ;
- LBB13:* JMP LoadNextChannelIndexData ;($BADC)Load next channel index data.
- LBB16:* JMP LoadNoiseChannelMusic ;($BBDE)Load data for noise channel music.
- LBB19:* JMP LoadTriangleCntrl0 ;($BBB7)Load Cntrl0 byte of triangle channel.
- LoadMusicChannel:
- LBB1C: TYA ;
- LBB1D: AND #$B0 ;
- LBB1F: CMP #$B0 ;Is data byte music note length data? If not, branch.
- LBB21: BNE + ;
- LBB23: TYA ;
- LBB24: AND #$0F ;Separate note length data.
- LBB26: CLC ;
- LBB27: ADC NoteLengthTblOffset ;Find proper note lengths table for current music.
- LBB2A: TAY ;
- LBB2B: LDA NoteLengths0Tbl,Y ;(Base is $BEF7)Load note length and store in-->
- LBB2E: STA SQ1FrameCountInit,X ;frame count init address.
- LBB31: TAY ;Y now contains note length.
- LBB32: TXA ;
- LBB33: CMP #$02 ;If loading Triangle channel data, branch.
- LBB35: BEQ - ;
- LoadSoundDataIndexIndex:
- LBB37: LDY SQ1MusicIndexIndex,X ;Load current index to sound data index.
- LBB3A: INC SQ1MusicIndexIndex,X ;Increment music index index address.
- LBB3D: LDA ($E6),Y ;Load index to sound channel music data.
- LBB3F: TAY ;
- LBB40:* TXA ;
- LBB41: CMP #$03 ;If loading Noise channel data, branch.
- LBB43: BEQ --- ;
- LBB45: PHA ;Push music channel number on stack(0, 1 or 2).
- LBB46: LDX ThisSoundChannel ;
- LBB49: LDA MusicNotesTbl+1,Y ;(Base=$BE78)Load A with music channel period low data.
- LBB4C: BEQ + ;If data is #$00, skip period high and low loading.
- LBB4E: STA MusicSQ1PeriodLow,X ;Store period low data in proper period low address.
- LBB51: LDA MusicNotesTbl,Y ;(Base=$BE77)Load A with music channel period high data.
- LBB54: ORA #$08 ;Ensure minimum index length of 1.
- LBB56: STA MusicSQ1PeriodHigh,X ;Store period high data in proper period high address.
- LBB59:* TAY ;
- LBB5A: PLA ;Pull stack and restore channel number to X.
- LBB5B: TAX ;
- LBB5C: TYA ;
- LBB5D: BNE + ;If period information was present, branch.
- NoPeriodInformation:
- LBB5F: LDA #$00 ;Turn off channel volume since no period data present.
- LBB61: STA Cntrl0Data ;
- LBB63: TXA ;
- LBB64: CMP #$02 ;If loading triangle channel data, branch.
- LBB66: BEQ ++ ;
- LBB68: LDA #$10 ;Turn off volume and disable env. generator(SQ1,SQ2).
- LBB6A: STA Cntrl0Data ;
- LBB6C: BNE ++ ;Branch always.
- PeriodInformationFound:
- LBB6E:* LDA SQ1DutyEnvelope,X ;Store channel duty cycle and volume info in $EA.
- LBB71: STA Cntrl0Data ;
- LBB73:* TXA ;
- LBB74: DEC SQ1InUse,X ;
- LBB77: CMP SQ1InUse,X ;If SQ1 or SQ2 are being used by SFX routines, branch.
- LBB7A: BEQ +++ ;
- LBB7C: INC SQ1InUse,X ;Restore not in use status of SQ1 or SQ2.
- LBB7F: LDY ThisSoundChannel ;
- LBB82: TXA ;
- LBB83: CMP #$02 ;If loading triangle channel data, branch.
- LBB85: BEQ + ;
- LBB87: LDA SQ1VolumeCntrl,X ;If $062E or $062F has volume data, skip writing-->
- LBB8A: BNE ++ ;Cntrl0Data to SQ1 or SQ2.
- LBB8C:* LDA Cntrl0Data ;
- LBB8E: STA SQ1Cntrl0,Y ;Write Cntrl0Data.
- LBB91:* LDA Cntrl0Data ;
- LBB93: STA SQ1VolumeData,X ;Store volume data index to volume data.
- LBB96: LDA MusicSQ1PeriodLow,Y ;
- LBB99: STA SQ1Cntrl2,Y ;
- LBB9C: LDA MusicSQ1PeriodHigh,Y ;Write data to three sound channel addresses.
- LBB9F: STA SQ1Cntrl3,Y ;
- LBBA2: LDA MusicSQ1Sweep,X ;
- LBBA5: STA SQ1Cntrl1,Y ;
- LoadNewMusicFrameCount:
- LBBA8: LDA SQ1FrameCountInit,X ;Load new music frame count and store it in music-->
- LBBAB: STA SQ1MusicFrameCount,X ;frame count address.
- LBBAE: JMP IncrementToNextChannel ;($BAB3)Move to next sound channel.
- SQ1SQ2InUse:
- LBBB1:* INC SQ1InUse,X ;Restore in use status of SQ1 or SQ1.
- LBBB4: JMP LoadNewMusicFrameCount ;($BBA8)Load new music frame count.
- LoadTriangleCntrl0:
- LBBB7: LDA TriangleCounterCntrl ;
- LBBBA: AND #$0F ;If lower bits set, branch to play shorter note.
- LBBBC: BNE ++ ;
- LBBBE: LDA TriangleCounterCntrl ;
- LBBC1: AND #$F0 ;If upper bits are set, branch to play longer note.
- LBBC3: BNE + ;
- LBBC5: TYA ;
- LBBC6: JMP AddTriangleLength ;($BBCD)Calculate length to play note.
- LBBC9:* LDA #$FF ;Disable length cntr(play until triangle data changes).
- LBBCB: BNE + ;Branch always.
- AddTriangleLength:
- LBBCD: CLC ;
- LBBCE: ADC #$FF ;Add #$FF(Effectively subtracts 1 from A).
- LBBD0: ASL ;*2.
- LBBD1: ASL ;*2.
- LBBD2: CMP #$3C ;
- LBBD4: BCC + ;If result is greater than #$3C, store #$3C(highest-->
- LBBD6: LDA #$3C ;triangle linear count allowed).
- LBBD8:* STA TriLinearCount ;
- LBBDB:* JMP LoadSoundDataIndexIndex ;($BB37)Load index to sound data index.
- LoadNoiseChannelMusic:
- LBBDE: LDA NoiseContSFX ;
- LBBE1: AND #$FC ;If playing any Noise SFX, branch to exit.
- LBBE3: BNE + ;
- LBBE5: LDA $B200,Y ;
- LBBE8: STA NoiseCntrl0 ;Load noise channel with drum beat SFX starting-->
- LBBEB: LDA $B201,Y ;at address B201. The possible values of Y are-->
- LBBEE: STA NoiseCntrl2 ;#$01, #$04, #$07 or #$0A.
- LBBF1: LDA $B202,Y ;
- LBBF4: STA NoiseCntrl3 ;
- LBBF7:* JMP LoadNewMusicFrameCount ;($BBA8)Load new music frame count.
- ;The following table is used by the InitializeMusic routine to find the index for loading
- ;addresses $062B thru $0637. Base is $BD31.
- InitMusicIndexTbl:
- LBBFA: .byte $41 ;Ridley area music.
- LBBFB: .byte $8F ;Tourian music.
- LBBFC: .byte $34 ;Item room music.
- LBBFD: .byte $27 ;Kraid area music.
- LBBFE: .byte $1A ;Norfair music.
- LBBFF: .byte $0D ;Escape music.
- LBC00: .byte $00 ;Mother brain music.
- LBC01: .byte $82 ;Brinstar music.
- LBC02: .byte $68 ;Fade in music.
- LBC03: .byte $75 ;Power up music.
- LBC04: .byte $4E ;End music.
- LBC05: .byte $5B ;Intro music.
- ;The tables below contain addresses for SFX and music handling routines.
- ;Multi channel Init SFX and music handling routine addresses:
- LBC06: .word $BC80 ;Fade in music.
- LBC08: .word $BC7A ;Power up music.
- LBC0A: .word $BC86 ;End game music.
- LBC0C: .word $BC7A ;Intro music.
- LBC0E: .word $B4EE ;No sound.
- LBC10: .word $B673 ;Samus hit init SFX.
- LBC12: .word $B5EC ;Boss hit init SFX.
- LBC14: .word $B695 ;Incorrect password init SFX.
- ;Multi channel continue SFX handling routine addresses:
- LBC16: .word $B4EE ;No sound.
- LBC18: .word $B4EE ;No sound.
- LBC1A: .word $B4EE ;No sound.
- LBC1C: .word $B4EE ;No sound.
- LBC1E: .word $B4EE ;No sound.
- LBC20: .word $B650 ;Samus hit continue SFX.
- LBC22: .word $B5F6 ;Boss hit continue SFX.
- LBC24: .word $B6A1 ;Incorrect password continue SFX.
- ;Music handling routine addresses:
- LBC26: .word $BC83 ;Ridley area music.
- LBC28: .word $BC77 ;Tourian music.
- LBC2A: .word $BC77 ;Item room music.
- LBC2C: .word $BC77 ;Kraid area music.
- LBC2E: .word $BC80 ;Norfair music.
- LBC30: .word $BC7D ;Escape music.
- LBC32: .word $BC77 ;Mother brain music.
- LBC34: .word $BC80 ;Brinstar music.
- ;-----------------------------------[ Entry point for music routines ]--------------------------------
- LoadMusicTempFlags:
- LBC36: LDA CurrentMusicRepeat ;Load A with temp music flags, (9th SFX cycle).
- LBC39: LDX #$B6 ;Lower address byte in ChooseNextSFXRoutineTbl.
- LBC3B: BNE + ;Branch always.
- LoadMusicInitFlags:
- LBC3D: LDA MusicInitFlag ;Load A with Music flags, (10th SFX cycle).
- LBC40: LDX #$B1 ;Lower address byte in ChooseNextSFXRoutineTbl.
- LBC42:* JSR CheckSFXFlag ;($B4BD)Checks to see if SFX or music flags set.
- LBC45: JSR FindMusicInitIndex ;($BC53)Find bit containing music init flag.
- LBC48: JMP ($00E2) ;If no flag found, Jump to next SFX cycle,-->
- ;else jump to specific SFX handling subroutine.
- ContinueMusic: ;11th and last SFX cycle.
- LBC4B: LDA CurrentMusic ;
- LBC4E: BEQ +++ ;Branch to exit of no music playing.
- LBC50: JMP LoadCurrentMusicFrameData ;($BAA5)Load info for current frame of music data.
- ;MusicInitIndex values correspond to the following music:
- ;#$00=Ridley area music, #$01=Tourian music, #$02=Item room music, #$03=Kraid area music,
- ;#$04=Norfair music, #$05=Escape music, #$06=Mother brain music, #$07=Brinstar music,
- ;#$08=Fade in music, #$09=Power up music, #$0A=End game music, #$0B=Intro music.
- FindMusicInitIndex:
- LBC53: LDA #$FF ;Load MusicInitIndex with #$FF.
- LBC55: STA MusicInitIndex ;
- LBC58: LDA CurrentSFXFlags ;
- LBC5B: BEQ ++ ;Branch to exit if no SFX flags set for Multi SFX.
- LBC5D:* INC MusicInitIndex ;
- LBC60: ASL ;Shift left until bit flag is in carry bit.
- LBC61: BCC - ;Loop until SFX flag found. Store bit-->
- LBC63:* RTS ;number of music in MusicInitIndex.
- ;The following routine is used to add eight to the music index when looking for music flags
- ;in the MultiSFX address.
- Add8:
- LBC64: LDA MusicInitIndex ;
- LBC67: CLC ;
- LBC68: ADC #$08 ;Add #$08 to MusicInitIndex.
- LBC6A: STA MusicInitIndex ;
- LBC6D: RTS ;
- LBC6E: LDA CurrentMusic ;
- LBC71: ORA #$F0 ;This code does not appear to be used in this page.
- LBC73: STA CurrentMusic ;
- LBC76:* RTS ;
- Music00Start:
- LBC77: JMP Music00Init ;($BCAA)Initialize music 00.
- Music01Start:
- LBC7A: JMP Music01Init ;($BCA4)Initialize music 01.
- Music02Start:
- LBC7D: JMP Music02Init ;($BC9A)Initialize music 02.
- Msic03Start:
- LBC80: JMP Music03Init ;($BC96)Initialize music 03.
- Music04Start:
- LBC83: JMP Music04Init ;($BC89)Initialize music 04.
- Music05Start:
- LBC86: JMP Music05Init ;($BC9E)Initialize music 05.
- Music04Init:
- LBC89: LDA #$B3 ;Duty cycle and volume data for SQ1 and SQ2.
- XYMusicInit:
- LBC8B:* TAX ;Duty cycle and volume data for SQ1.
- LBC8C: TAY ;Duty cycle and volume data for SQ2.
- LBC8D:* JSR SetVolumeAndDisableSweep ;($B9E4)Set duty cycle and volume data for SQ1 and SQ2.
- LBC90: JSR InitializeMusic ;($BF19)Setup music registers.
- LBC93: JMP LoadCurrentMusicFrameData ;($BAA5)Load info for current frame of music data.
- Music03Init:
- LBC96: LDA #$34 ;Duty cycle and volume data for SQ1 and SQ2.
- LBC98: BNE -- ;Branch always
- Music02Init:
- LBC9A: LDA #$F4 ;Duty cycle and volume data for SQ1 and SQ2.
- LBC9C: BNE -- ;Branch always
- Music05Init:
- LBC9E: LDX #$F5 ;Duty cycle and volume data for SQ1.
- LBCA0: LDY #$F6 ;Duty cycle and volume data for SQ2.
- LBCA2: BNE - ;Branch always
- Music01Init:
- LBCA4: LDX #$B6 ;Duty cycle and volume data for SQ1.
- LBCA6: LDY #$F6 ;Duty cycle and volume data for SQ2.
- LBCA8: BNE - ;Branch always
- Music00Init:
- LBCAA: LDX #$92 ;Duty cycle and volume data for SQ1.
- LBCAC: LDY #$96 ;Duty cycle and volume data for SQ2.
- LBCAE: BNE - ;Branch always
- ;The following address table provides starting addresses of the volume data tables below:
- VolumeCntrlAddressTbl:
- LBCB0: .word $BCBA, $BCC5, $BCCF, $BCDA, $BD03
- VolumeDataTbl1:
- LBCBA: .byte $01, $02, $02, $03, $03, $04, $05, $06, $07, $08, $FF
- VolumeDataTbl2:
- LBCC5: .byte $02, $04, $05, $06, $07, $08, $07, $06, $05, $FF
- VolumeDataTbl3:
- LBCCF: .byte $00, $0D, $09, $07, $06, $05, $05, $05, $04, $04, $FF
- VolumeDataTbl4:
- LBCDA: .byte $02, $06, $07, $07, $07, $06, $06, $06, $06, $05, $05, $05, $04, $04, $04, $03
- LBCEA: .byte $03, $03, $03, $02, $03, $03, $03, $03, $03, $02, $02, $02, $02, $02, $02, $02
- LBCFA: .byte $02, $02, $02, $01, $01, $01, $01, $01, $F0
- VolumeDataTbl5:
- LBD03: .byte $0A, $0A, $09, $08, $07, $06, $05, $04, $03, $02, $07, $07, $06, $05, $04, $04
- LBD13: .byte $03, $02, $02, $02, $05, $05, $05, $04, $03, $02, $02, $02, $01, $01, $04, $04
- LBD23: .byte $03, $02, $01, $02, $02, $01, $01, $01, $02, $02, $02, $01, $01, $F0
- ;The init music table loads addresses $062B thru $0637 with the initial data needed to play the
- ;selected music. The data for each entry in the table have the following format:
- ;.byte $xx, $xx, $xx, $xx, $xx : .word $xxxx, $xxxx, $xxxx, $xxxx.
- ;The first five bytes have the following functions:
- ;Byte 0=index to proper note length table. Will be either #$00, #$0B or #$17.
- ;Byte 1=Repeat music byte. #$00=no repeat, any other value and the music repeats.
- ;Byte 2=Controls length counter for triangle channel.
- ;Byte 3=Volume control byte for SQ1.
- ;Byte 4=Volume control byte for SQ2.
- ;Address 0=Base address of SQ1 music data.
- ;Address 1=Base address of SQ2 music data.
- ;Address 2=Base address of triangle music data.
- ;Address 3=Base address of noise music data.
- InitMusicTbl:
- ;Mother brain music(not used this memory page).
- LBD31: .byte $0B, $FF, $F5, $00, $00
- LBD36: .word $0100, $0300, $0500, $0000
- ;Escape music(not used this memory page).
- LBD3E: .byte $0B, $FF, $00, $02, $02
- LBD43: .word $0100, $0300, $0500, $0700
- ;Norfair music(not used this memory page).
- LBD4B: .byte $0B, $FF, $F0, $04, $04
- LBD50: .word $0100, $0300, $0500, $0700
- ;Kraid area music(not used this memory page).
- LBD58: .byte $00, $FF, $F0, $00, $00
- LBD5D: .word $0100, $0300, $0500, $0000
- ;Item room music.
- LBD65: .byte $0B, $FF, $03, $00, $00
- LBD6A: .word $BDDA, $BDDC, $BDCD, $0000
- ;Ridley area music(not used this memory page).
- LBD72: .byte $0B, $FF, $F0, $01, $01
- LBD77: .word $0100, $0300, $0500, $0000
- ;End game music
- LBD7F: .byte $17, $00, $00, $02, $01
- LBD84: .word $AC00, $ADC5, $ACF5, $AE8E
- ;Intro music
- LBD8C: .byte $17, $00, $F0, $02, $05
- LBD91: .word $B0B9, $B000, $B076, $B115
- ;Fade in music
- LBD99: .byte $0B, $00, $F0, $02, $00
- LBD9E: .word $BE3E, $BE1D, $BE36, $0000
- ;Power up music
- LBDA6: .byte $00, $00, $F0, $01, $00
- LBDAB: .word $BDF7, $BE0D, $BE08, $0000
- ;Brinstar music(not used this memory page).
- LBDB3: .byte $0B, $FF, $00, $02, $03
- LBDB8: .word $0100, $0300, $0500, $0700
- ;Tourian music
- LBDC0: .byte $0B, $FF, $03, $00, $00
- LBDC5: .word $BE59, $BE47, $BE62, $0000
- ItemRoomTriangleIndexData:
- LBDCD: .byte $C8 ;
- LBDCE: .byte $B0 ;3/32 seconds +
- LBDCF: .byte $38 ;E3 |
- LBDD0: .byte $3A ;F3 |
- LBDD1: .byte $3C ;F#3 |
- LBDD2: .byte $3E ;G3 |
- LBDD3: .byte $40 ;Ab3 | Repeat 8 times
- LBDD4: .byte $3E ;G3 |
- LBDD5: .byte $3C ;F#3 |
- LBDD6: .byte $3A ;F3 |
- LBDD7: .byte $B6 ;1 3/16 seconds |
- LBDD8: .byte $02 ;no sound +
- LBDD9: .byte $FF ;
- ItemRoomSQ1IndexData:
- LBDDA: .byte $B8 ;1/4 seconds
- LBDDB: .byte $02 ;No sound
- ItemRoomSQ2IndexData:
- LBDDC: .byte $B3 ;3/4 seconds
- LBDDD: .byte $02 ;No sound
- LBDDE: .byte $B2 ;3/8 seconds
- LBDDF: .byte $74 ;A#6
- LBDE0: .byte $02 ;No sound
- LBDE1: .byte $6A ;F5
- LBDE2: .byte $02 ;No sound
- LBDE3: .byte $72 ;A6
- LBDE4: .byte $02 ;No sound
- LBDE5: .byte $62 ;C#5
- LBDE6: .byte $B4 ;1 1/2 seconds
- LBDE7: .byte $02 ;No sound
- LBDE8: .byte $B2 ;3/8 seconds
- LBDE9: .byte $60 ;C5
- LBDEA: .byte $02 ;No sound
- LBDEB: .byte $6C ;F#5
- LBDEC: .byte $02 ;No sound
- LBDED: .byte $76 ;B6
- LBDEE: .byte $B3 ;3/4 seconds
- LBDEF: .byte $02 ;No sound
- LBDF0: .byte $B2 ;3/8 seconds
- LBDF1: .byte $7E ;F6
- LBDF2: .byte $02 ;No sound
- LBDF3: .byte $7C ;D6
- LBDF4: .byte $B3 ;3/4 seconds
- LBDF5: .byte $02 ;No sound
- LBDF6: .byte $00 ;End item room music.
- PowerUpSQ1IndexData:
- LBDF7: .byte $B3 ;1/2 seconds
- LBDF8: .byte $48 ;C4
- LBDF9: .byte $42 ;A4
- LBDFA: .byte $B2 ;1/4 seconds
- LBDFB: .byte $3E ;G3
- LBDFC: .byte $38 ;E3
- LBDFD: .byte $30 ;C3
- LBDFE: .byte $38 ;E3
- LBDFF: .byte $4C ;D4
- LBE00: .byte $44 ;A#4
- LBE01: .byte $3E ;G3
- LBE02: .byte $36 ;D#3
- LBE03: .byte $C8 ;
- LBE04: .byte $B0 ;1/16 seconds +
- LBE05: .byte $38 ;E3 | Repeat 8 times
- LBE06: .byte $3C ;F#3 +
- LBE07: .byte $FF
- PowerUpTriangleIndexData:
- LBE08: .byte $B4 ;1 second
- LBE09: .byte $2C ;A#3
- LBE0A: .byte $2A ;A3
- LBE0B: .byte $1E ;D#2
- LBE0C: .byte $1C ;D2
- PowerUpSQ2IndexData:
- LBE0D: .byte $B2 ;1/4 seconds
- LBE0E: .byte $22 ;F2
- LBE0F: .byte $2C ;A#3
- LBE10: .byte $30 ;C3
- LBE11: .byte $34 ;D3
- LBE12: .byte $38 ;E3
- LBE13: .byte $30 ;C3
- LBE14: .byte $26 ;G2
- LBE15: .byte $30 ;C3
- LBE16: .byte $3A ;F3
- LBE17: .byte $34 ;D3
- LBE18: .byte $2C ;A#3
- LBE19: .byte $26 ;G2
- LBE1A: .byte $B4 ;1 second
- LBE1B: .byte $2A ;A3
- LBE1C: .byte $00 ;End power up music.
- FadeInSQ2IndexData:
- LBE1D: .byte $C4
- LBE1E: .byte $B0 ;3/32 seconds +
- LBE1F: .byte $3E ;G3 | Repeat 4 times
- LBE20: .byte $30 ;C3 +
- LBE21: .byte $FF ;
- LBE22: .byte $C4 ;
- LBE23: .byte $42 ;A4 + Repeat 4 times
- LBE24: .byte $30 ;C3 +
- LBE25: .byte $FF ;
- LBE26: .byte $C4 ;
- LBE27: .byte $3A ;F3 + Repeat 4 times
- LBE28: .byte $2C ;A#3 +
- LBE29: .byte $FF ;
- LBE2A: .byte $C4 ;
- LBE2B: .byte $38 ;E3 + Repeat 4 times
- LBE2C: .byte $26 ;G2 +
- LBE2D: .byte $FF ;
- LBE2E: .byte $C4 ;
- LBE2F: .byte $34 ;D3 + Repeat 4 times
- LBE30: .byte $20 ;E2 +
- LBE31: .byte $FF ;
- LBE32: .byte $E0 ;
- LBE33: .byte $34 ;D3 + Repeat 32 times
- LBE34: .byte $24 ;F#2 +
- LBE35: .byte $FF ;
- FadeInTriangleIndexData:
- LBE36: .byte $B3 ;3/4 seconds
- LBE37: .byte $36 ;D#3
- LBE38: .byte $34 ;D3
- LBE39: .byte $30 ;C3
- LBE3A: .byte $2A ;A3
- LBE3B: .byte $B4 ;1 1/2 seconds
- LBE3C: .byte $1C ;D2
- LBE3D: .byte $1C ;D2
- FadeInSQ1IndexData:
- LBE3E: .byte $B3 ;3/4 seconds
- LBE3F: .byte $34 ;D3
- LBE40: .byte $3A ;F3
- LBE41: .byte $34 ;D3
- LBE42: .byte $30 ;C3
- LBE43: .byte $B4 ;1 1/2 seconds
- LBE44: .byte $2A ;A3
- LBE45: .byte $2A ;A3
- LBE46: .byte $00 ;End fade in music.
- TourianSQ2IndexData:
- LBE47: .byte $B4 ;1 1/2 seconds
- LBE48: .byte $12 ;A2
- LBE49: .byte $B3 ;3/4 seconds
- LBE4A: .byte $10 ;Ab1
- LBE4B: .byte $18 ;C2
- LBE4C: .byte $16 ;B2
- LBE4D: .byte $0A ;F1
- LBE4E: .byte $B4 ;1 1/2 seconds
- LBE4F: .byte $14 ;A#2
- LBE50: .byte $12 ;A2
- LBE51: .byte $B3 ;3/4 seconds
- LBE52: .byte $10 ;Ab1
- LBE53: .byte $06 ;D1
- LBE54: .byte $0E ;G1
- LBE55: .byte $04 ;C#1
- LBE56: .byte $B4 ;1 1/2 seconds
- LBE57: .byte $0C ;F#1
- LBE58: .byte $00 ;End Tourian music.
- TourianSQ1IndexData:
- LBE59: .byte $E0 ;
- LBE5A: .byte $B0 ;3/32 seconds +
- LBE5B: .byte $54 ;F#4 |
- LBE5C: .byte $4E ;D#4 |
- LBE5D: .byte $48 ;C4 | Repeat 32 times
- LBE5E: .byte $42 ;A4 |
- LBE5F: .byte $48 ;C4 |
- LBE60: .byte $4E ;D#4 +
- LBE61: .byte $FF ;
- TourianTriangleIndexData:
- LBE62: .byte $E0 ;
- LBE63: .byte $B3 ;3/4 seconds +
- LBE64: .byte $02 ;No sound |
- LBE65: .byte $B0 ;3/32 seconds |
- LBE66: .byte $3C ;F#3 |
- LBE67: .byte $40 ;Ab3 |
- LBE68: .byte $44 ;A#4 |
- LBE69: .byte $4A ;C#4 |
- LBE6A: .byte $4E ;D#4 |
- LBE6B: .byte $54 ;F#4 |
- LBE6C: .byte $58 ;Ab4 | Repeat 32 times
- LBE6D: .byte $5C ;A#5 |
- LBE6E: .byte $62 ;C#5 |
- LBE6F: .byte $66 ;D#5 |
- LBE70: .byte $6C ;F#5 |
- LBE71: .byte $70 ;Ab5 |
- LBE72: .byte $74 ;A#6 |
- LBE73: .byte $7A ;C#6 |
- LBE74: .byte $B3 ;3/4 seconds |
- LBE75: .byte $02 ;No sound +
- LBE76: .byte $FF
- ;The following table contains the musical notes used by the music player. The first byte is
- ;the period high information(3 bits) and the second byte is the period low information(8 bits).
- ;The formula for figuring out the frequency is as follows: 1790000/16/(hhhllllllll + 1)
- MusicNotesTbl:
- LBE77: .byte $07 ;55.0Hz (A1) Index #$00 (Not used)
- LBE78: .byte $F0 ;
- LBE79: .byte $00 ;No sound Index #$02
- LBE7A: .byte $00 ;
- LBE7B: .byte $06 ;69.3Hz (C#2) Index #$04
- LBE7C: .byte $4E ;
- LBE7D: .byte $05 ;73.4Hz (D2) Index #$06
- LBE7E: .byte $F3 ;
- LBE7F: .byte $05 ;82.4Hz (E2) Index #$08
- LBE80: .byte $4D ;
- LBE81: .byte $05 ;87.3Hz (F2) Index #$0A
- LBE82: .byte $01 ;
- LBE83: .byte $04 ;92.5Hz (F#2) Index #$0C
- LBE84: .byte $B9 ;
- LBE85: .byte $04 ;98.0Hz (G2) Index #$0E
- LBE86: .byte $75 ;
- LBE87: .byte $04 ;103.8Hz (Ab2) Index #$10
- LBE88: .byte $35 ;
- LBE89: .byte $03 ;110.0Hz (A2) Index #$12
- LBE8A: .byte $F8 ;
- LBE8B: .byte $03 ;116.5Hz (A#2) Index #$14
- LBE8C: .byte $BF ;
- LBE8D: .byte $03 ;123.5Hz (B2) Index #$16
- LBE8E: .byte $89 ;
- LBE8F: .byte $03 ;130.7Hz (C3) Index #$18
- LBE90: .byte $57 ;
- LBE91: .byte $03 ;138.5Hz (C#3) Index #$1A
- LBE92: .byte $27 ;
- LBE93: .byte $02 ;146.8Hz (D3) Index #$1C
- LBE94: .byte $F9 ;
- LBE95: .byte $02 ;155.4Hz (D#3) Index #$1E
- LBE96: .byte $CF ;
- LBE97: .byte $02 ;164.8Hz (E3) Index #$20
- LBE98: .byte $A6 ;
- LBE99: .byte $02 ;174.5Hz (F3) Index #$22
- LBE9A: .byte $80 ;
- LBE9B: .byte $02 ;184.9Hz (F#3) Index #$24
- LBE9C: .byte $5C ;
- LBE9D: .byte $02 ;196.0Hz (G3) Index #$26
- LBE9E: .byte $3A ;
- LBE9F: .byte $02 ;207.6Hz (Ab3) Index #$28
- LBEA0: .byte $1A ;
- LBEA1: .byte $01 ;219.8Hz (A3) Index #$2A
- LBEA2: .byte $FC ;
- LBEA3: .byte $01 ;233.1Hz (A#3) Index #$2C
- LBEA4: .byte $DF ;
- LBEA5: .byte $01 ;247.0Hz (B3) Index #$2E
- LBEA6: .byte $C4 ;
- LBEA7: .byte $01 ;261.4Hz (C4) Index #$30
- LBEA8: .byte $AB ;
- LBEA9: .byte $01 ;276.9Hz (C#4) Index #$32
- LBEAA: .byte $93 ;
- LBEAB: .byte $01 ;293.6Hz (D4) Index #$34
- LBEAC: .byte $7C ;
- LBEAD: .byte $01 ;310.8Hz (D#4) Index #$36
- LBEAE: .byte $67 ;
- LBEAF: .byte $01 ;330.0Hz (E4) Index #$38
- LBEB0: .byte $52 ;
- LBEB1: .byte $01 ;349.6Hz (F4) Index #$3A
- LBEB2: .byte $3F ;
- LBEB3: .byte $01 ;370.4Hz (F#4) Index #$3C
- LBEB4: .byte $2D ;
- LBEB5: .byte $01 ;392.5Hz (G4) Index #$3E
- LBEB6: .byte $1C ;
- LBEB7: .byte $01 ;415.9Hz (Ab4) Index #$40
- LBEB8: .byte $0C ;
- LBEB9: .byte $00 ;440.4Hz (A4) Index #$42
- LBEBA: .byte $FD ;
- LBEBB: .byte $00 ;468.1Hz (A#4) Index #$44
- LBEBC: .byte $EE ;
- LBEBD: .byte $00 ;495.0Hz (B4) Index #$46
- LBEBE: .byte $E1 ;
- LBEBF: .byte $00 ;525.2Hz (C5) Index #$48
- LBEC0: .byte $D4 ;
- LBEC1: .byte $00 ;556.6Hz (C#5) Index #$4A
- LBEC2: .byte $C8 ;
- LBEC3: .byte $00 ;588.8Hz (D5) Index #$4C
- LBEC4: .byte $BD ;
- LBEC5: .byte $00 ;625.0Hz (D#5) Index #$4E
- LBEC6: .byte $B2 ;
- LBEC7: .byte $00 ;662.0Hz (E5) Index #$50
- LBEC8: .byte $A8 ;
- LBEC9: .byte $00 ;699.2Hz (F5) Index #$52
- LBECA: .byte $9F ;
- LBECB: .byte $00 ;740.9Hz (F#5) Index #$54
- LBECC: .byte $96 ;
- LBECD: .byte $00 ;787.9Hz (G5) Index #$56
- LBECE: .byte $8D ;
- LBECF: .byte $00 ;834.9Hz (Ab5) Index #$58
- LBED0: .byte $85 ;
- LBED1: .byte $00 ;880.9HZ (A5) Index #$5A
- LBED2: .byte $7E ;
- LBED3: .byte $00 ;940.1Hz (A#5) Index #$5C
- LBED4: .byte $76 ;
- LBED5: .byte $00 ;990.0Hz (B5) Index #$5E
- LBED6: .byte $70 ;
- LBED7: .byte $00 ;1055Hz (C6) Index #$60
- LBED8: .byte $69 ;
- LBED9: .byte $00 ;1118Hz (C#6) Index #$62
- LBEDA: .byte $63 ;
- LBEDB: .byte $00 ;1178Hz (D6) Index #$64
- LBEDC: .byte $5E ;
- LBEDD: .byte $00 ;1257Hz (D#6) Index #$66
- LBEDE: .byte $58 ;
- LBEDF: .byte $00 ;1332Hz (E6) Index #$68
- LBEE0: .byte $53 ;
- LBEE1: .byte $00 ;1398Hz (F6) Index #$6A
- LBEE2: .byte $4F ;
- LBEE3: .byte $00 ;1492Hz (F#6) Index #$6C
- LBEE4: .byte $4A ;
- LBEE5: .byte $00 ;1576Hz (G6) Index #$6E
- LBEE6: .byte $46 ;
- LBEE7: .byte $00 ;1670Hz (Ab6) Index #$70
- LBEE8: .byte $42 ;
- LBEE9: .byte $00 ;1776Hz (A6) Index #$72
- LBEEA: .byte $3E ;
- LBEEB: .byte $00 ;1896Hz (A#6) Index #$74
- LBEEC: .byte $3A ;
- LBEED: .byte $00 ;1998Hz (B6) Index #$76
- LBEEE: .byte $37 ;
- LBEEF: .byte $00 ;2111Hz (C7) Index #$78
- LBEF0: .byte $34 ;
- LBEF1: .byte $00 ;2238Hz (C#7) Index #$7A
- LBEF2: .byte $31 ;
- LBEF3: .byte $00 ;2380Hz (D7) Index #$7C
- LBEF4: .byte $2E ;
- LBEF5: .byte $00 ;2796Hz (F7) Index #$7E
- LBEF6: .byte $27 ;
- ;The following tables are used to load the music frame count addresses ($0640 thru $0643). The
- ;larger the number, the longer the music will play a solid note. The number represents how
- ;many frames the note will play. There is a small discrepancy in time length because the
- ;Nintendo runs at 60 frames pers second and I am using 64 frames per second to make the
- ;numbers below divide more evenly.
- ;Used by power up music and Kraid area music.
- NoteLengths0Tbl:
- LBEF7: .byte $04 ;About 1/16 seconds ($B0)
- LBEF8: .byte $08 ;About 1/8 seconds ($B1)
- LBEF9: .byte $10 ;About 1/4 seconds ($B2)
- LBEFA: .byte $20 ;About 1/2 seconds ($B3)
- LBEFB: .byte $40 ;About 1 seconds ($B4)
- LBEFC: .byte $18 ;About 3/8 seconds ($B5)
- LBEFD: .byte $30 ;About 3/4 seconds ($B6)
- LBEFE: .byte $0C ;About 3/16 seconds ($B7)
- LBEFF: .byte $0B ;About 11/64 seconds ($B8)
- LBF00: .byte $05 ;About 5/64 seconds ($B9)
- LBF01: .byte $02 ;About 1/32 seconds ($BA)
- ;Used by item room, fade in, Brinstar music, Ridley area music, Mother brain music,
- ;escape music, Norfair music and Tourian music.
- NoteLengths1Tbl:
- LBF02: .byte $06 ;About 3/32 seconds ($B0)
- LBF03: .byte $0C ;About 3/16 seconds ($B1)
- LBF04: .byte $18 ;About 3/8 seconds ($B2)
- LBF05: .byte $30 ;About 3/4 seconds ($B3)
- LBF06: .byte $60 ;About 1 1/2 seconds ($B4)
- LBF07: .byte $24 ;About 9/16 seconds ($B5)
- LBF08: .byte $48 ;About 1 3/16 seconds ($B6)
- LBF09: .byte $12 ;About 9/32 seconds ($B7)
- LBF0A: .byte $10 ;About 1/4 seconds ($B8)
- LBF0B: .byte $08 ;About 1/8 seconds ($B9)
- LBF0C: .byte $03 ;About 3/64 seconds ($BA)
- ;Used by intro and end game music.
- NoteLengths2Tbl:
- LBF0D: .byte $10 ;About 1/4 seconds ($B0)
- LBF0E: .byte $07 ;About 7/64 seconds ($B1)
- LBF0F: .byte $0E ;About 7/32 seconds ($B2)
- LBF10: .byte $1C ;About 7/16 seconds ($B3)
- LBF11: .byte $38 ;About 7/8 seconds ($B4)
- LBF12: .byte $70 ;About 1 13/16 seconds ($B5)
- LBF13: .byte $2A ;About 21/32 seconds ($B6)
- LBF14: .byte $54 ;About 1 5/16 seconds ($B7)
- LBF15: .byte $15 ;About 21/64 seconds ($B8)
- LBF16: .byte $12 ;About 9/32 seconds ($B9)
- LBF17: .byte $02 ;About 1/32 seconds ($BA)
- LBF18: .byte $03 ;About 3/64 seconds ($BB)
- InitializeMusic:
- LBF19: JSR CheckMusicFlags ;($B3FC)Check to see if restarting current music.
- LBF1C: LDA CurrentSFXFlags ;Load current SFX flags and store CurrentMusic address.
- LBF1F: STA CurrentMusic ;
- LBF22: LDA MusicInitIndex ;
- LBF25: TAY ;
- LBF26: LDA InitMusicIndexTbl,Y ;($BBFA)Find index for music in InitMusicInitIndexTbl.
- LBF29: TAY ;
- LBF2A: LDX #$00 ;
- LBF2C:* LDA InitMusicTbl,Y ;Base is $BD31.
- LBF2F: STA NoteLengthTblOffset,X ;
- LBF32: INY ;The following loop repeats 13 times to-->
- LBF33: INX ;load the initial music addresses -->
- LBF34: TXA ;(registers $062B thru $0637).
- LBF35: CMP #$0D ;
- LBF37: BNE - ;
- LBF39: LDA #$01 ;Resets addresses $0640 thru $0643 to #$01.-->
- LBF3B: STA SQ1MusicFrameCount ;These addresses are used for counting the-->
- LBF3E: STA SQ2MusicFrameCount ;number of frames music channels have been playing.
- LBF41: STA TriangleMusicFrameCount ;
- LBF44: STA NoiseMusicFrameCount ;
- LBF47: LDA #$00 ;
- LBF49: STA SQ1MusicIndexIndex ;
- LBF4C: STA SQ2MusicIndexIndex ;Resets addresses $0638 thru $063B to #$00.-->
- LBF4F: STA TriangleMusicIndexIndex ;These are the index to find sound channel data index.
- LBF52: STA NoiseMusicIndexIndex ;
- LBF55: RTS ;
- ;Not used.
- LBF56: .byte $10, $07, $0E, $1C, $38, $70, $2A, $54, $15, $12, $02, $03, $20, $2C, $B4, $AD
- LBF66: .byte $4D, $06, $8D, $8D, $06, $AD, $5E, $06, $A8, $B9, $2A, $BC, $A8, $A2, $00, $B9
- LBF76: .byte $61, $BD, $9D, $2B, $06, $C8, $E8, $8A, $C9, $0D, $D0, $F3, $A9, $01, $8D, $40
- LBF86: .byte $06, $8D, $41, $06, $8D, $42, $06, $8D, $43, $06, $A9, $00, $8D, $38, $06, $8D
- LBF96: .byte $39, $06, $8D, $3A, $06, $8D, $3B, $06, $60, $FF, $00, $00, $00, $00, $00, $00
- LBFA6: .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
- ;----------------------------------------------[ RESET ]--------------------------------------------
- RESET:
- LBFB0: SEI ;Disables interrupt.
- LBFB1: CLD ;Sets processor to binary mode.
- LBFB2: LDX #$00 ;
- LBFB4: STX PPUControl0 ;Clear PPU control registers.
- LBFB7: STX PPUControl1 ;
- LBFBA:* LDA PPUStatus ;
- LBFBD: BPL - ;Wait for VBlank.
- LBFBF:* LDA PPUStatus ;
- LBFC2: BPL - ;
- LBFC4: ORA #$FF ;
- LBFC6: STA MMC1Reg0 ;Reset MMC1 chip.-->
- LBFC9: STA MMC1Reg1 ;(MSB is set).
- LBFCC: STA MMC1Reg2 ;
- LBFCF: STA MMC1Reg3 ;
- LBFD2: JMP Startup ;($C01A)Does preliminry housekeeping.
- ;Not used.
- LBFD5: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00
- LBFE5: .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
- LBFF5: .byte $00, $00, $00, $00, $00
- ;----------------------------------------[ Interrupt vectors ]--------------------------------------
- LBFFA: .word NMI ;($C0D9)NMI vector.
- LBFFC: .word RESET ;($FFB0)Reset vector.
- LBFFE: .word RESET ;($FFB0)IRQ vector.
Add Comment
Please, Sign In to add comment