The title bank contains code and data used for the title screen, password entry, game-over password display, and the game's endings. ; ------------------- ; 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 ;Hosted on wiki.metroidconstruction.com, with possible additions by wiki contributors. ;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.