00001. ; Super Mario Bros. 3 Full Disassembly by Southbird 2012 00002. ; For more info, see http://www.sonicepoch.com/sm3mix/ 00003. ; 00004. ; PLEASE INCLUDE A CREDIT TO THE SOUTHBIRD DISASSEMBLY 00005. ; AND THE ABOVE LINK SOMEWHERE IN YOUR WORKS :) 00006. ; 00007. ; Original disassembler source generated by DCC6502 version v1.4 00008. ; (With labels, comments, and some syntax corrections for nesasm by Southbird) 00009. ; For more info about DCC6502, e-mail veilleux@ameth.org 00010. ; 00011. ; This source file last updated: 2012-03-28 13:51:54.652889989 -0500 00012. ; Distribution package date: Fri Apr 6 23:46:16 UTC 2012 00013. ;--------------------------------------------------------------------------- 00014.  00015. ; Some constants specific to title screen; they don't really match up with the gameplay 00016. FALL_NORMAL = 5 ; Normal fall rate added to 'Y' 00017. FALL_TAILWAG = 1 ; Adjusted fall rate for when wagging raccoon tail 00018. FALL_OBJECT = 4 ; Fall rate for objects 00019.  00020. FALLRATE_TAILWAGMAX = 8 ; Maximum Y velocity falling rate when wagging raccoon tail 00021. FALLRATE_MAX = $40 ; Maximum Y velocity falling rate 00022. FALLRATE_OBJECTMAX = $60 ; Maximum Y velocity falling rate of an object 00023.  00024. Cinematic_ToadAndKing: 00025.    LDA Cine_ToadKing 00026.    LSR A 00027.    BNE PRG024_A03A ; If Cine_ToadKing > 1, jump to PRG024_A03A 00028.  00029.    LDX #$00 ; X = 0 00030.  00031.    JSR Level_PrepareNewObject 00032.  00033.    ; Disable timer and animations 00034.    LDA #$81  00035.    STA Level_TimerEn 00036.  00037.    ; CineKing_Timer = $20 00038.    LDA #$20 00039.    STA CineKing_Timer 00040.  00041.    ; Initialize VRAM address for Toad and King Cinematic Dialog Box 00042.    LDA #$28 00043.    STA ToadTalk_VH 00044.    LDA #$86 00045.    STA ToadTalk_VL 00046.  00047.    ; Initialize character counter 00048.    LDA #$00 00049.    STA ToadTalk_CPos 00050.  00051.    LDA #168 00052.    STA <Objects_X 00053.  00054.    LDA #$60 ; A = $60 00055.  00056.    LDY World_Num ; Y = World_Num 00057.  00058.    CPY #$01 00059.    BNE PRG024_A033 ; If World_Num <> 1 (World 2), jump to PRG024_A033 00060.  00061.    LDA #$20 ; A = $20 00062.  00063. PRG024_A033: 00064.    STA King_Y 00065.  00066.    INC Cine_ToadKing ; Cine_ToadKing = 2 00067.    RTS ; Return 00068.  00069. PRG024_A03A: 00070.  00071.    ; Keep the Player halted 00072.    LDA #$02 00073.    STA Player_HaltTick 00074.  00075.    LDA Player_HaltGame 00076.    BNE PRG024_A04A ; If gameplay is halted, jump to PRG024_A04A 00077.  00078.    JSR King_Animate ; Do King's animation logic 00079.    JSR King_DoDialog ; Do King's dialog 00080.  00081. PRG024_A04A: 00082.    JMP PRG024_A39D ; Jump to PRG024_A39D 00083.  00084.  00085. King_DoDialog: 00086.    ; Load font patterns 00087.    LDA #$5E 00088.    STA PatTable_BankSel+1 00089.  00090.    LDA <CineKing_DialogState 00091.    JSR DynJump 00092.  00093.    ; THESE MUST FOLLOW DynJump FOR THE DYNAMIC JUMP TO WORK!! 00094.    .word TAndK_DrawDiagBox ; 0: Draw the dialog box 00095.    .word TAndK_DoToadText ; 1: Do the text 00096.    .word TAndK_WaitPlayerButtonA ; 2: Wait for Player to push 'A' 00097.  00098.    ; Patterns that make up the rows of the dialog box 00099. DiagBox_R1: .byte $94, $90, $90, $90, $90, $90, $90, $90, $90, $90, $90, $90, $90, $90, $90, $90, $90, $90, $90, $90, $90, $96 00100. DiagBox_R2: .byte $92, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $93 00101. DiagBox_R3: .byte $95, $91, $91, $91, $91, $91, $91, $91, $91, $91, $91, $91, $91, $91, $91, $91, $91, $91, $91, $91, $91, $97 00102.  00103. DiagBox_RowOffs: 00104.    .byte (DiagBox_R1 - DiagBox_R1), (DiagBox_R2 - DiagBox_R1), (DiagBox_R2 - DiagBox_R1), (DiagBox_R2 - DiagBox_R1) 00105.    .byte (DiagBox_R2 - DiagBox_R1), (DiagBox_R2 - DiagBox_R1), (DiagBox_R2 - DiagBox_R1), (DiagBox_R3 - DiagBox_R1) 00106. DiagBox_RowOffs_End 00107.  00108. TAndK_DrawDiagBox: 00109.    LDA CineKing_Timer  00110.    BNE PRG024_A119 ; If CineKing_Timer has not expired, jump to PRG024_A119 (RTS) 00111.  00112.    LDA King_Y 00113.    CMP #90 00114.    BLT PRG024_A119 ; If King is higher than pixel line 90, jump to PRG024_A119 (RTS) 00115.  00116.    LDX Graphics_BufCnt ; X = buffer count 00117.  00118.    ; Set current VRAM address  00119.    LDA ToadTalk_VH 00120.    STA Graphics_Buffer,X 00121.    LDA ToadTalk_VL 00122.    STA Graphics_Buffer+1,X 00123.  00124.    ; Jump to next video row 00125.    ADD #$20 ; 32 bytes to next row 00126.    STA ToadTalk_VL 00127.    BCC PRG024_A0CD 00128.    INC ToadTalk_VH ; Apply carry 00129. PRG024_A0CD: 00130.  00131.    LDA #(DiagBox_R2 - DiagBox_R1) ; run count per row 00132.    STA Graphics_Buffer+2,X 00133.    STA <Temp_Var1 ; -> Temp_Var1 00134.  00135.    LDY ToadTalk_CPos ; Y = current dialog box row 00136.    LDA DiagBox_RowOffs,Y 00137.    TAY ; Y = offset to this row index 00138.  00139. PRG024_A0DB: 00140.    ; Store next pattern in dialog box 00141.    LDA DiagBox_R1,Y 00142.    STA Graphics_Buffer+3,X 00143.  00144.    INY ; Y++ (next pattern for dialog box) 00145.    INX ; X++ (next index in graphics buffer) 00146.  00147.    DEC <Temp_Var1 ; Temp_Var1-- 00148.    BNE PRG024_A0DB ; While Temp_Var1 > 0, loop! 00149.  00150.    ; Insert terminator 00151.    LDA #$00 00152.    STA Graphics_Buffer+3,X 00153.  00154.    ; X += 3 00155.    INX 00156.    INX 00157.    INX 00158.    STX Graphics_BufCnt 00159.  00160.    INC ToadTalk_CPos ; Next row 00161.  00162.    LDA ToadTalk_CPos 00163.    CMP #(DiagBox_RowOffs_End - DiagBox_RowOffs) 00164.    BLT PRG024_A119 ; If row count < 8, jump to PRG024_A119 00165.  00166.    ; Dialog box is complete 00167.  00168.    LDA #$00 ; A = 0 ("The King has been transformed!") 00169.  00170.    LDY Map_Objects_IDs 00171.    BNE PRG024_A105 ; If the "HELP!" bubble is still present (haven't been on airship yet), jump to PRG024_A105 00172.  00173.    LDA #(KingHelpMsg2 - KingHelpMsg1) ; ("Get the magic wand back from little koopa!") 00174.  00175. PRG024_A105: 00176.    STA ToadTalk_CPos ; Set proper character position 00177.  00178.    ; Initialize VRAM address for Toad and King Cinematic Dialog Box Text 00179.    LDA #$28 00180.    STA ToadTalk_VH 00181.    LDA #$a7 00182.    STA ToadTalk_VL 00183.  00184.    ; CineKing_Timer = $10 00185.    LDA #$10 00186.    STA CineKing_Timer 00187.  00188.    INC <CineKing_DialogState ; CineKing_DialogState = 1 00189.  00190. PRG024_A119: 00191.    RTS ; Return 00192.  00193.    ; English: "Oh,it's terrible!" / "The King has been" / "transformed!" / "Please find the" / "Magic Wand so we can" / "change him back" 00194. KingHelpMsg1: 00195.    ; O h , i t ' s t e r r i b l e ! 00196.    .byte $BE, $D7, $9A, $D8, $CD, $AB, $CC, $FE, $CD, $D4, $CB, $CB, $D8, $D1, $DB, $D4, $EA, $FE, $FE, $FE 00197.  00198.    ; T h e K i n g h a s b e e n 00199.    .byte $C3, $D7, $D4, $FE, $BA, $D8, $DD, $D6, $FE, $D7, $D0, $CC, $FE, $D1, $D4, $D4, $DD, $FE, $FE, $FE 00200.  00201.    ; t r a n s f o r m e d ! 00202.    .byte $CD, $CB, $D0, $DD, $CC, $D5, $DE, $CB, $DC, $D4, $D3, $EA, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE 00203.  00204.    ; P l e a s e f i n d t h e 00205.    .byte $BF, $DB, $D4, $D0, $CC, $D4, $FE, $D5, $D8, $DD, $D3, $FE, $CD, $D7, $D4, $FE, $FE, $FE, $FE, $FE 00206.  00207.    ; M a g i c W a n d s o w e c a n 00208.    .byte $BC, $D0, $D6, $D8, $D2, $FE, $C6, $D0, $DD, $D3, $FE, $CC, $DE, $FE, $81, $D4, $FE, $D2, $D0, $DD 00209.  00210.    ; c h a n g e h i m b a c k . 00211.    .byte $D2, $D7, $D0, $DD, $D6, $D4, $FE, $D7, $D8, $DC, $FE, $D1, $D0, $D2, $DA, $E9, $FE, $FE, $FE, $FE 00212.  00213.    ; English: "Hurry! Hurry!" / "Get the Magic Wand" / "back from Little" / "Koopa." 00214. KingHelpMsg2: 00215.    ; H u r r y ! H u r r y ! 00216.    .byte $B7, $CE, $CB, $CB, $8C, $EA, $FE, $B7, $CE, $CB, $CB, $8C, $EA, $FE, $FE, $FE, $FE, $FE, $FE, $FE 00217.  00218.    ; G e t t h e M a g i c W a n d 00219.    .byte $B6, $D4, $CD, $FE, $CD, $D7, $D4, $FE, $BC, $D0, $D6, $D8, $D2, $FE, $C6, $D0, $DD, $D3, $FE, $FE 00220.  00221.    ; b a c k f r o m L i t t l e 00222.    .byte $D1, $D0, $D2, $DA, $FE, $D5, $CB, $DE, $DC, $FE, $BB, $D8, $CD, $CD, $DB, $D4, $FE, $FE, $FE, $FE 00223.  00224.    ; K o o p a . 00225.    .byte $BA, $DE, $DE, $DF, $D0, $E9, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE 00226.  00227.    ; 00228.    .byte $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE 00229.  00230.    ; 00231.    .byte $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE 00232.  00233. TAndK_DoToadText: 00234.    LDA CineKing_Timer 00235.    BNE PRG024_A260 ; If the timer is not expired, jump to PRG024_A260 00236.  00237.    LDY ToadTalk_CPos ; Y = dialog message character position 00238.  00239.    LDA KingHelpMsg1,Y ; Get next character of message 00240.  00241.    LDY Graphics_BufCnt ; Y = graphics buffer counter 00242.    STA Graphics_Buffer+3,Y ; Store into buffer 00243.  00244.    ; Insert one character into graphics buffer 00245.    LDA ToadTalk_VH 00246.    STA Graphics_Buffer,Y ; address high 00247.    LDA #$01  00248.    STA Graphics_Buffer+2,Y ; run length 00249.    LSR A 00250.    STA Graphics_Buffer+4,Y ; terminator 00251.    TYA 00252.    ADD #$04 00253.    STA Graphics_BufCnt ; count 00254.    LDA ToadTalk_VL 00255.    STA Graphics_Buffer+1,Y ; address low 00256.  00257.    INC ToadTalk_CPos ; Next character in message 00258.    INC ToadTalk_VL ; Next VRAM byte 00259.    AND #$1f ; Get current column 00260.    CMP #$1a  00261.    BNE PRG024_A25B ; If we're not in column 26, jump to PRG024_A25B 00262.  00263.    ; Line break! 00264.  00265.    LDA ToadTalk_VL 00266.    ADC #$0b ; Add enough bytes to get to next row 00267.    STA ToadTalk_VL 00268.    BCC PRG024_A250 00269.    INC ToadTalk_VH ; Apply carry 00270. PRG024_A250: 00271.  00272.    CMP #$67  00273.    BNE PRG024_A25B ; If we haven't reached the last character, jump to PRG024_A25B 00274.  00275.    INC <CineKing_DialogState ; CineKing_DialogState = 2 00276.  00277.    LDA #$00 00278.    STA ToadTalk_CPos 00279.  00280. PRG024_A25B: 00281.    ; Reset tick counter for next character 00282.    LDA #$04 00283.    STA CineKing_Timer 00284.  00285. PRG024_A260: 00286.    RTS ; Return 00287.  00288.  00289. TAndK_WaitPlayerButtonA: 00290.    LDA <Pad_Input 00291.    BPL PRG024_A282 ; If Player is not pushing 'A', jump to PRG024_A282 (RTS) 00292.  00293.    LDA Map_Objects_IDs 00294.    BEQ PRG024_A27A ; If the "HELP!" bubble is gone, jump to PRG024_A27A 00295.  00296.    ; Level_JctCtl = 3 (switch to airship) 00297.    LDA #$03 00298.    STA Level_JctCtl 00299.  00300.    ; No more "HELP!" bubble... 00301.    LDA #MAPOBJ_EMPTY 00302.    STA Map_Objects_IDs 00303.  00304.    ; Airship is in town now! 00305.    LDA #MAPOBJ_AIRSHIP 00306.    STA Map_Objects_IDs+1 00307.  00308.    RTS ; Return 00309.  00310.  00311. PRG024_A27A: 00312.    ; Standard exit to map 00313.    LDA #$00 00314.    STA Map_ReturnStatus 00315.    INC Level_ExitToMap 00316.  00317. PRG024_A282: 00318.    RTS ; Return 00319.  00320.    ; Sets PatTable_BankSel+5 by world 1-7 00321. King_PatTableByWorld: 00322.    .byte $27, $27, $27, $26, $26, $26, $27 00323.  00324.    ; Sets King's sprite palette select by world 1-7 00325. King_PalByWorld: 00326.    .byte SPR_PAL2, SPR_PAL2, SPR_PAL3, SPR_PAL2, SPR_PAL2, SPR_PAL2, SPR_PAL2 00327.  00328.    ; Number of King's patterns (sprites) by world 1-7 00329. King_NumPatsByWorld: 00330.    .byte (King_W1Pat0 - King_W1Pat1), (King_W2Pat1 - King_W2Pat0), (King_W3Pat0 - King_W3Pat1), (King_W4Pat0 - King_W4Pat1) 00331.    .byte (King_W5Pat1 - King_W5Pat0), (King_W6Pat1 - King_W6Pat0), (King_W7Pat0 - King_W7Pat1) 00332.  00333.    ; King sprite data offset by world and frame (Left = 0, Right = 1) 00334. King_SprDataOffByWorldAndFrame: 00335.    .byte (King_W1YOff - King_SprDataYOff), (King_W1YOff - King_SprDataYOff) ; World 1 00336.    .byte (King_W2YOff - King_SprDataYOff), (King_W2YOff - King_SprDataYOff) ; World 2 00337.    .byte (King_W3YOff0 - King_SprDataYOff), (King_W3YOff1 - King_SprDataYOff) ; World 3 00338.    .byte (King_W4YOff - King_SprDataYOff), (King_W4YOff - King_SprDataYOff) ; World 4 00339.    .byte (King_W5YOff - King_SprDataYOff), (King_W5YOff - King_SprDataYOff) ; World 5 00340.    .byte (King_W6YOff - King_SprDataYOff), (King_W6YOff - King_SprDataYOff) ; World 6 00341.    .byte (King_W7YOff0 - King_SprDataYOff), (King_W7YOff1 - King_SprDataYOff) ; World 7 00342.  00343.    ; Y offset (from King_Y) per King sprite (must be parallel with King_SprDataX) 00344. King_SprDataYOff: 00345. King_W1YOff: .byte $09, $10, $10, $10, $20, $20, $20 00346. King_W7YOff1: .byte $02, $10, $10, $20, $20 00347. King_W7YOff0: .byte $03, $10, $10, $20, $20 00348. King_W6YOff: .byte $00, $16, $16 00349. King_W5YOff: .byte $EA, $F0, $F0, $F0, $00, $00, $00 00350. King_W4YOff: .byte $0B, $10, $10, $10, $20, $20, $20 00351. King_W2YOff: .byte $00, $00, $00 00352. King_W3YOff1: .byte $0D, $10, $10, $20, $20, $20 00353. King_W3YOff0: .byte $0E, $10, $10, $20, $20, $20 00354.  00355.    ; X per King sprite (must be parallel with King_SprDataYOff) 00356. King_SprDataX: 00357. King_W1X: .byte $D7, $CC, $D4, $DC, $CC, $D4, $DC 00358. King_W7X1: .byte $CC, $C8, $D0, $C8, $D0 00359. King_W7X2: .byte $CC, $C8, $D0, $C8, $D0 00360. King_W6X: .byte $C8, $C8, $D0 00361. King_W5X: .byte $D4, $D0, $D8, $E0, $D0, $D8, $E0 00362. King_W4X: .byte $D2, $D0, $D8, $E0, $D0, $D8, $E0 00363. King_W2X: .byte $CC, $C8, $D0 00364. King_W3X1: .byte $D3, $D0, $D8, $D0, $D8, $E0 00365. King_W3X0: .byte $D1, $D0, $D8, $D0, $D8, $E0 00366.  00367. King_SprPatOffByWorldAndFrame: 00368.    .byte (King_W1Pat0 - King_SprPats), (King_W1Pat1 - King_SprPats) ; World 1 00369.    .byte (King_W2Pat0 - King_SprPats), (King_W2Pat1 - King_SprPats) ; World 2 00370.    .byte (King_W3Pat0 - King_SprPats), (King_W3Pat1 - King_SprPats) ; World 3 00371.    .byte (King_W4Pat0 - King_SprPats), (King_W4Pat1 - King_SprPats) ; World 4 00372.    .byte (King_W5Pat0 - King_SprPats), (King_W5Pat1 - King_SprPats) ; World 5 00373.    .byte (King_W6Pat0 - King_SprPats), (King_W6Pat1 - King_SprPats) ; World 6 00374.    .byte (King_W7Pat0 - King_SprPats), (King_W7Pat1 - King_SprPats) ; World 7 00375.  00376. King_SprPats: 00377. King_W1Pat1: .byte $E1, $E3, $E5, $E7, $E9, $EB 00378. King_W1Pat0: .byte $E1, $ED, $E5, $E7, $EF, $EB 00379. King_W7Pat1: .byte $F1, $F3, $F5, $F7 00380. King_W7Pat0: .byte $F9, $D5, $FD, $FF 00381. King_W6Pat0: .byte $C1, $C3 00382. King_W6Pat1: .byte $C5, $C7 00383. King_W5Pat0: .byte $DB, $DD, $DF, $E1, $E3, $E5 00384. King_W5Pat1: .byte $DB, $E7, $E9, $E1, $EB, $ED 00385. King_W4Pat1: .byte $D5, $CB, $CD, $D7, $D9, $D3 00386. King_W4Pat0: .byte $C9, $CB, $CD, $CF, $D1, $D3 00387. King_W2Pat0: .byte $D9, $DB 00388. King_W2Pat1: .byte $DD, $DF 00389. King_W3Pat1: .byte $CB, $CD, $CF, $D1, $D3 00390. King_W3Pat0: .byte $C1, $C3, $C5, $C7, $C9 00391.  00392.    ; World 6 King is a seal juggling a crown (indexed by CineKing_Frame2) 00393. King_W6Crown_YOff: .byte $06, $04, $0A, $09, $09, $02, $04, $06 00394. King_W6Crown_Pattern: .byte -5, -3, -3, -5, -3, -3, -5, -5 00395. King_W6Crown_Attr:  00396.    .byte SPR_PAL3, SPR_PAL3, SPR_PAL3 | SPR_VFLIP, SPR_PAL3 | SPR_VFLIP, SPR_PAL3 | SPR_HFLIP | SPR_VFLIP 00397.    .byte SPR_PAL3 | SPR_HFLIP, SPR_PAL3, SPR_PAL3 00398.  00399. PRG024_A36C: 00400.    .byte $30, $40, $50, $60 00401.  00402.    ; Sprites that make up the yelling Toad 00403. KingToad_Sprites: 00404.    .byte $80, $00, $01, $B8 00405.    .byte $80, $00, $01, $B0 00406.    .byte $80, $00, $01, $A8 00407.    .byte $70, $00, $01, $B8 00408.    .byte $70, $00, $01, $B0 00409.    .byte $70, $00, $01, $A8 00410. KingToad_Sprites_End 00411.  00412. KingToad_Patterns: 00413. ToadFrame0: .byte $A1, $A3, $A5, $A7, $A9, $AB 00414. ToadFrame1: .byte $B9, $BB, $71, $BD, $BF, $71 00415. ToadFrame2: .byte $AD, $AF, $B1, $B3, $B5, $B7 00416.  00417. KingToad_PatOffset: 00418.    .byte (ToadFrame0 - KingToad_Patterns), (ToadFrame1 - KingToad_Patterns), (ToadFrame2 - KingToad_Patterns) 00419.  00420. PRG024_A39D: 00421.    ; Load yelling Toad's graphics 00422.    LDA #$2a 00423.    STA PatTable_BankSel+4 00424.  00425.    ; Copy in the sprites for yelling Toad 00426.    LDY #(KingToad_Sprites_End - KingToad_Sprites - 1) 00427. PRG024_A3A4: 00428.    LDA KingToad_Sprites,Y 00429.    STA Sprite_RAM+$40,Y 00430.  00431.    DEY ; Y-- 00432.    BPL PRG024_A3A4 ; While Y >= 0, loop 00433.  00434.    LDY Objects_Frame ; Y = yelling Toad's frame 00435.    LDX KingToad_PatOffset,Y ; X = base offset into patterns for this frame 00436.  00437.    ; Patch the patterns on the yelling Toad for the current frame 00438.    LDY #((KingToad_Sprites_End - KingToad_Sprites - 1) & ~3) 00439. PRG024_A3B5: 00440.    LDA KingToad_Patterns,X 00441.    STA Sprite_RAM+$41,Y 00442.  00443.    INX ; X++ (index to next patch pattern) 00444.  00445.    ; Y -= 4 (previous sprite) 00446.    DEY 00447.    DEY 00448.    DEY 00449.    DEY 00450.  00451.    BPL PRG024_A3B5 ; While Y >= 0, loop 00452.  00453.    LDY World_Num ; Y = World_Num 00454.  00455.    ; Set King's pattern table 00456.    LDA King_PatTableByWorld,Y 00457.    STA PatTable_BankSel+5  00458.  00459.    ; King's Y -> Temp_Var1 00460.    LDA King_Y 00461.    STA <Temp_Var1 00462.  00463.    ; King's palette select -> Temp_Var2 00464.    LDA King_PalByWorld,Y 00465.    STA <Temp_Var2 00466.  00467.    ; King's number of patterns (sprites) -> Temp_Var4 and 5 00468.    LDA King_NumPatsByWorld,Y 00469.    STA <Temp_Var4 00470.    STA <Temp_Var5 00471.  00472.    TYA ; A = Y (World_Num) 00473.    ASL A ; A = World_Num * 2 00474.    ORA CineKing_Frame ; OR'd King's frame (0 or 1) 00475.    PHA ; Save value 00476.    TAY ; -> 'Y' 00477.  00478.    LDX King_SprDataOffByWorldAndFrame,Y ; X = root index of King Sprite data 00479.    LDY #$60 ; Y = $60 00480. PRG024_A3E8: 00481.    ; Set King Sprite Y 00482.    LDA <Temp_Var1 00483.    ADD King_SprDataYOff,X 00484.    STA Sprite_RAM,Y 00485.  00486.    ; Set King Sprite Attributes 00487.    LDA <Temp_Var2 00488.    STA Sprite_RAM+$02,Y 00489.  00490.    ; Set King Sprite X 00491.    LDA King_SprDataX,X 00492.    STA Sprite_RAM+$03,Y 00493.  00494.    INX ; X++ (next King sprite data) 00495.  00496.    ; Y += 4 (Next King sprite) 00497.    INY 00498.    INY 00499.    INY 00500.    INY 00501.  00502.    DEC <Temp_Var4 ; Temp_Var4-- 00503.    BPL PRG024_A3E8 ; While Temp_Var4 >= 0, loop 00504.  00505.    PLA ; Restore A = (World_Num * 2) | CineKing_Frame 00506.    TAY ; -> 'Y' 00507.  00508.    ; Copy in all the King sprite patterns 00509.    LDX King_SprPatOffByWorldAndFrame,Y ; X = root index of King Sprite patterns 00510.    LDY #$64 ; Y = $64 00511. PRG024_A40C: 00512.    LDA King_SprPats,X 00513.    STA Sprite_RAM+$01,Y 00514.  00515.    INX ; X++ (next King Sprite pattern index) 00516.  00517.    ; Y += 4 (next King Sprite) 00518.    INY 00519.    INY 00520.    INY 00521.    INY 00522.  00523.    DEC <Temp_Var5 ; Temp_Var5-- 00524.    BNE PRG024_A40C ; While Temp_Var5 <> 0, loop 00525.  00526.    LDY World_Num 00527.    CPY #$05 00528.    BEQ PRG024_A48A ; If World_Num = 5 (World 6), jump to PRG024_A48A 00529.  00530.    ; Not World 6... 00531.  00532.    ; Just put a stationary crown there 00533.    LDA #$fb 00534.    STA Sprite_RAM+$61 00535.    LDA #$02 00536.    STA Sprite_RAM+$62 00537.  00538.    CPY #$06 00539.    BNE PRG024_A439 ; If World_Num <> 6 (World 7), jump to PRG024_A439 00540.  00541.    ; World 7 only... 00542.  00543.    ; Set piranha's body palette to 3 00544.    LDA #SPR_PAL3 00545.    STA Sprite_RAM+$6E 00546.    STA Sprite_RAM+$72 00547.  00548.    RTS ; Return 00549.  00550. PRG024_A439: 00551.    CPY #$01 00552.    BNE PRG024_A4A1 ; If World_Num <> 1 (World 2), jump to PRG024_A4A1 (RTS) 00553.  00554.    ; World 2 only... 00555.  00556.    ; Crown on the floor  00557.    LDA #$80 00558.    STA Sprite_RAM+$60 00559.  00560.    ; Temp_Var4 = CineKing_DialogState 00561.    LDA <CineKing_DialogState 00562.    STA <Temp_Var4 00563.  00564.    ; Temp_Var3 = $10 00565.    LDA #$10 00566.    STA <Temp_Var3 00567.  00568.    LDY #$80 ; Y = $80 00569. PRG024_A44C: 00570.    LDA <Temp_Var4 00571.    BEQ PRG024_A466 ; If Temp_Var4 (CineKing_DialogState) = 0, jump to PRG024_A466 00572.  00573.    LDX #$03 ; X = 3 00574.  00575.    CMP #$00 00576.    BNE PRG024_A45B ; Jump (technically always) to PRG024_A45B 00577.  00578.    LDA ToadTalk_CPos 00579.    LSR A 00580.    TAX ; X = ToadTalk_CPos / 2 00581.  00582. PRG024_A45B: 00583.    LDA <Temp_Var3 00584.    CMP #$20 00585.    BLT PRG024_A466 ; If Temp_Var3 < $20, jump to PRG024_A466 00586.  00587.    CMP PRG024_A36C,X 00588.    BLT PRG024_A47E ; If Temp_Var3 < PRG024_A36C[X], jump to PRG024_A47E 00589.  00590. PRG024_A466: 00591.  00592.    ; Set web sprite Y 00593.    LDA <Temp_Var3 00594.    STA Sprite_RAM,Y 00595.  00596.    ; Set web sprite pattern 00597.    LDA #$d7 00598.    STA Sprite_RAM+$01,Y 00599.  00600.    ; Set web sprite attribute 00601.    LDA <Temp_Var2 00602.    STA Sprite_RAM+$02,Y 00603.  00604.    ; Set web sprite X 00605.    LDA #$d0 00606.    STA Sprite_RAM+$03,Y 00607.  00608.    ; Y += 4 (next sprite) 00609.    INY 00610.    INY 00611.    INY 00612.    INY 00613.  00614. PRG024_A47E: 00615.  00616.    ; Temp_Var3 += $10 00617.    LDA <Temp_Var3 00618.    ADD #$10 00619.    STA <Temp_Var3 00620.  00621.    CMP <Temp_Var1  00622.    BLT PRG024_A44C ; While Temp_Var3 < Temp_Var1, loop! 00623.  00624.    RTS ; Return 00625.  00626. PRG024_A48A: 00627.    LDY <CineKing_Frame2 00628.  00629.    ; Set crown sprite Y 00630.    LDA <Temp_Var1 ; King Sprite Y 00631.    ADD King_W6Crown_YOff,Y 00632.    STA Sprite_RAM+$60 00633.  00634.    ; Set crown sprite pattern 00635.    LDA King_W6Crown_Pattern,Y 00636.    STA Sprite_RAM+$61 00637.  00638.    ; Set crown sprite attributes 00639.    LDA King_W6Crown_Attr,Y 00640.    STA Sprite_RAM+$62 00641.  00642. PRG024_A4A1: 00643.    RTS ; Return 00644.  00645.    ; Performs animation logic for the king 00646. King_Animate: 00647.    LDA <Counter_1 00648.    AND #$07 00649.    BNE PRG024_A4B2 ; 6:7 ticks, jump to PRG024_A4B2 00650.  00651.    ; Loop the panicking Toad's frame 2 to 0 00652.    DEC Objects_Frame 00653.    BPL PRG024_A4B2 00654.    LDA #$02 00655.    STA Objects_Frame 00656.  00657. PRG024_A4B2: 00658.    LDA World_Num 00659.    JSR DynJump 00660.  00661.    ; THESE MUST FOLLOW DynJump FOR THE DYNAMIC JUMP TO WORK!! 00662.    .word King_W1347 ; World 1 King (Dog scratching ear) 00663.    .word King_W2 ; World 2 King (Spider with crown on floor) 00664.    .word King_W1347 ; World 3 King (Hunched green creature) 00665.    .word King_W1347 ; World 4 King (Dinosaur) 00666.    .word King_W5 ; World 5 King (Albatross) 00667.    .word King_W6 ; World 6 King (Seal juggling crown) 00668.    .word King_W1347 ; World 7 King (Fire Piranha) 00669.  00670. W6Seal_Frames: .byte $01, $01, $01, $00, $00, $00, $00, $01 00671. W6Crown_Frames: .byte $00, $01, $02, $03, $04, $05, $00, $01 00672.  00673. King_W6: 00674.    LDA <Counter_1 00675.    LSR A 00676.    LSR A 00677.    LSR A 00678.    AND #$07 00679.    TAY ; Y = 0 to 7 by counter 00680.  00681.    ; Set seal's frame 00682.    LDA W6Seal_Frames,Y 00683.    STA CineKing_Frame 00684.  00685.    ; Set seal juggled crown frame 00686.    LDA W6Crown_Frames,Y 00687.    STA <CineKing_Frame2 00688.  00689.    RTS ; Return 00690.  00691. King_YDelta: .byte $01, -$01, $01 00692. King_W2_YLimit: .byte $70, $68 00693.  00694. King_W2: 00695.    JSR King_W1347 ; Do animation like other kings 00696.  00697.    LDA King_Y 00698.    CMP #$68 00699.    BGE PRG024_A4FD ; If King_Y >= $68, jump to PRG024_A4FD  00700.  00701.    INC King_Y ; King_Y++ 00702.  00703.    RTS ; Return 00704.  00705. PRG024_A4FD: 00706.    LDA <Counter_1 00707.    AND #$03  00708.    BNE PRG024_A519 ; 3:4 ticks, jump to PRG024_A519 00709.  00710.    LDY <CineKing_Var ; Y = CineKing_Var (0/1 as spider walks up and down) 00711.  00712.    ; King spider moves up or down 00713.    LDA King_Y 00714.    ADD King_YDelta,Y 00715.    STA King_Y 00716.  00717.    CMP King_W2_YLimit,Y 00718.    BNE PRG024_A519 ; If King has not hit Y limit in this direction, jump to PRG024_A519 00719.  00720.    ; Reverse direction 00721.    TYA 00722.    EOR #$01 00723.    STA <CineKing_Var 00724.  00725. PRG024_A519: 00726.    RTS ; Return 00727.  00728. PRG024_A51A: 00729.    .byte %00100100 ; World 1 00730.    .byte %00001000 ; World 2 00731.    .byte %00101000 ; World 3 00732.    .byte %00101000 ; World 4 00733.    .byte %00010000 ; World 5 00734.    .byte %00000000 ; World 6 00735.    .byte %00010000 ; World 7 00736.     00737. King_W1347: 00738.    LDY World_Num ; Y = World_Num 00739.  00740.    LDA <Counter_1 00741.    AND PRG024_A51A,Y ; Mask counter by value from PRG024_A51A 00742.    BEQ PRG024_A52D ; If this is the tick to fire on, jump to PRG024_A52D 00743.  00744.    LDA #$01 ; A = 1 (frame) 00745.  00746. PRG024_A52D: 00747.    STA CineKing_Frame ; Set king frame 00748.  00749.    RTS ; Return 00750.  00751. King_W5: 00752.    JSR King_W1347 ; Do animation like other kings 00753.  00754.    TAY ; Y = King frame 00755.  00756.    LDA <Counter_1 00757.    AND #$03  00758.    BNE PRG024_A545 ; 3:4 ticks, jump to PRG024_A545 00759.  00760.    LDA King_Y 00761.    ADD King_YDelta+1,Y 00762.    STA King_Y 00763.  00764. PRG024_A545: 00765.    RTS ; Return 00766.  00767.  00768. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 00769. ;;;;;;;;;;;;;;;;;;;;; BEGIN UNUSED COPY/PASTED CODE ;;;;;;;;;;;;;;;;;;;;; 00770. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 00771.  00772. ; The following are copied fragments from PRG022 ... THEY DO NOT BELONG HERE 00773. ; They also are in the wrong address space (PRG024 is $Axxx, PRG022 is $Cxxx) 00774. ; My guess... massive copy/paste error? :D 00775.  00776. ; $A546 00777.    STA <Temp_Var11 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00778.  00779. PRG024_A548: ; <-- originally PRG022_C548 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00780.    LDA Background_Tiles,X ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00781.    STA [BonusText_BaseL],Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00782.  00783.    INY ; Y++ (next tile, DANGEROUS) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00784.  00785.    DEC <Temp_Var11 ; Temp_Var11-- (repeat) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00786.    BPL PRG024_A548 ; While Temp_Var11 >= 0, loop! ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00787.  00788.    INC <Temp_Var12 ; Temp_Var12++ ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00789.  00790.    JMP PRG022_C51E ; Jump to PRG022_C51E (is what this should be) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00791.  00792.  00793. ; Player_BonusTiles_Big: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00794.    .byte TILE15_BRICKBG, TILE15_PLAYERBIG_TOPM, TILE15_PLAYERBIG_TOPR ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00795.    .byte TILE15_PLAYERBIG_HEADL, TILE15_PLAYERBIG_HEADM, TILE15_PLAYERBIG_HEADR ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00796.    .byte TILE15_PLAYERBIG_TORL, TILE15_PLAYERBIG_TORM, TILE15_PLAYERBIG_TORR ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00797.    .byte TILE15_PLAYERBIG_BOTL, TILE15_PLAYERBIG_BOTM, TILE15_PLAYERBIG_BOTR ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00798.  00799. ; Player_BonusTiles_Raccoon: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00800.    .byte TILE15_BRICKBG, TILE15_PLAYERRAC_TOPM, TILE15_PLAYERRAC_TOPR ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00801.    .byte TILE15_PLAYERBIG_HEADL, TILE15_PLAYERBIG_HEADM, TILE15_PLAYERBIG_HEADR ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00802.    .byte TILE15_PLAYERBIG_TORL, TILE15_PLAYERBIG_TORM, TILE15_PLAYERBIG_TORR ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00803.    .byte TILE15_PLAYERBIG_RACL, TILE15_PLAYERBIG_RACM, TILE15_PLAYERBIG_BOTR ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00804.  00805. ; Player_BonusTiles_Small: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00806.    .byte TILE15_BRICKBG, TILE15_BRICKBG, TILE15_BRICKBG ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00807.    .byte TILE15_BRICKBG, TILE15_BRICKBG, TILE15_BRICKBG ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00808.    .byte TILE15_BRICKBG, TILE15_PLAYERSM_TOP, TILE15_BRICKBG ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00809.    .byte TILE15_BRICKBG, TILE15_PLAYERSM_BOTTOM, TILE15_BRICKBG ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00810.  00811. ; PlayerSuit_ToIndex: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00812.    .byte PLAYERSUIT_BIG ; 0 (Default when all else fails) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00813.    .byte PLAYERSUIT_RACCOON ; 1 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00814.    .byte PLAYERSUIT_SMALL ; 2 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00815.  00816. ; PlayerSuit_TileBaseIndex: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00817.    .byte (Player_BonusTiles_Big - Player_BonusTiles_Big) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00818.    .byte (Player_BonusTiles_Raccoon - Player_BonusTiles_Big) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00819.    .byte (Player_BonusTiles_Small - Player_BonusTiles_Big) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00820.  00821. ; LoadLevel_BonusPlayer: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00822.  00823.    ; This loop tries to match the Player's power up with an index ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00824.    ; If nothing else, X = 0, which uses "Big" ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00825.    LDX #(PlayerSuit_ToIndex_End - PlayerSuit_ToIndex - 1) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00826.    LDY Player_Current ; Y = Player_Current ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00827.    LDA World_Map_Power,Y ; Get current Player's power ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00828. PRG024_A589: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00829.    CMP PlayerSuit_ToIndex,X ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00830.    BEQ PRG024_A591 ; If this is the Player's current power up, jump to PRG024_A591 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00831.  00832.    DEX ; X-- ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00833.    BNE PRG024_A589 ; While X > 0, loop! ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00834.  00835. PRG024_A591: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00836.  00837.    ; Get starting tile for Player ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00838.    LDA PlayerSuit_TileBaseIndex,X ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00839.    TAX ; -> 'X' ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00840.  00841.    ; Temp_Var3 = 0 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00842.    LDA #$00 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00843.    STA <Temp_Var3 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00844.  00845.    LDY TileAddr_Off ; Y = TileAddr_Off ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00846.  00847. PRG024_A59C: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00848.    ; Temp_Var1 = 2 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00849.    LDA #$02 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00850.    STA <Temp_Var1 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00851.  00852. PRG024_A5A0: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00853.    ; Get tile for Player -> grid ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00854.    LDA Player_BonusTiles_Big,X ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00855.    STA [BonusText_BaseL],Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00856.  00857.    INY ; Y++ (next grid tile, DANGEROUS!) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00858.    INX ; X++ (next Player tile) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00859.  00860.    INC <Temp_Var3 ; Temp_Var3++ ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00861.    DEC <Temp_Var1 ; Temp_Var1-- ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00862.  00863.    BPL PRG024_A5A0 ; While Temp_Var1 >= 0, loop ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00864.  00865.    ; Go to next row of tiles ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00866.    LDA TileAddr_Off ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00867.    ADD #16 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00868.    STA TileAddr_Off ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00869.    TAY ; -> 'Y' ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00870.  00871.    LDA <Temp_Var3 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00872.    CMP #(Player_BonusTiles_Raccoon - Player_BonusTiles_Big) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00873.    BNE PRG024_A59C ; If we have more tiles to go, loop! ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00874.  00875.    RTS ; Return ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00876.  00877. ; BonusUNKTALL_Tiles: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00878.    .byte TILE15_UNKTALL_UL, TILE15_UNKTALL_UR ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00879.    .byte TILE15_UNKTALL_R1L, TILE15_UNKTALL_R1R ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00880.    .byte TILE15_UNKTALL_R2L, TILE15_UNKTALL_R2R ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00881.    .byte TILE15_UNKTALL_LL, TILE15_UNKTALL_LR ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00882.  00883. ; LoadLevel_UNKTALL: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00884.    LDX #$00 ; X = 0 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00885.    LDY TileAddr_Off ; Y = TileAddr_Off ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00886.  00887. PRG024_A5CB: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00888.    ; Temp_Var1 = 1 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00889.    LDA #$01 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00890.    STA <Temp_Var1 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00891.  00892. PRG024_A5CF: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00893.    LDA BonusUNKTALL_Tiles,X ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00894.    STA [BonusText_BaseL],Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00895.  00896.    INY ; Y++ (next grid tile, DANGEROUS!) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00897.    INX ; X++ ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00898.  00899.    DEC <Temp_Var1 ; Temp_Var1-- ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00900.    BPL PRG024_A5CF ; While Temp_Var1 >= 0, loop ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00901.  00902.    ; Next tile row ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00903.    LDA TileAddr_Off ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00904.    ADD #16 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00905.    STA TileAddr_Off ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00906.    TAY ; -> 'Y' ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00907.  00908.    CPX #(BonusUNKTALL_Tiles_End - BonusUNKTALL_Tiles) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00909.    BNE PRG024_A5CB ; While X < number of tiles, loop! ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00910.  00911.    RTS ; Return ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00912.  00913.  00914. ; LoadLevel_Border: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00915.    LDY TileAddr_Off ; Y = TileAddr_Off ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00916.  00917.    ; Border upper left ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00918.    LDA #TILE15_BORDER_UL ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00919.    STA [BonusText_BaseL],Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00920.  00921.    ; Run of 14 middle tiles ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00922. PRG024_A5F0: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00923.    INY ; Y++ ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00924.  00925.    LDA #TILE15_BORDER_UM ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00926.    STA [BonusText_BaseL],Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00927.  00928.    CPY #$0f ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00929.    BNE PRG024_A5F0 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00930.  00931.    ; Border upper right ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00932.    LDA #TILE15_BORDER_UR ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00933.    STA [BonusText_BaseL],Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00934.  00935. PRG024_A5FD: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00936.    INY ; Y++ ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00937.    TYA ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00938.    AND #$0f ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00939.    BNE PRG024_A607 ; If not time to place left border, jump to PRG024_A607 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00940.  00941.    LDA #TILE15_BORDER_ML ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00942.    BNE PRG024_A60D ; Jump (technically always) to PRG024_A60D ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00943.  00944. PRG024_A607: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00945.    CMP #$0f ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00946.    BNE PRG024_A5FD ; If not time to place right border, jump to PRG024_A5FD ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00947.  00948.    LDA #TILE15_BORDER_MR ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00949.  00950. PRG024_A60D: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00951.    STA [BonusText_BaseL],Y ; Store appropriate middle border ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00952.  00953.    CPY #$9f ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00954.    BNE PRG024_A5FD ; If Y <> $9F, loop! ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00955.  00956.    INY ; Y++ ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00957.  00958.    ; Lower left border ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00959.    LDA #TILE15_BORDER_LL ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00960.    STA [BonusText_BaseL],Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00961.  00962.    ; Run of 14 middle tiles ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00963. PRG024_A618: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00964.    INY ; Y++ ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00965.  00966.    LDA #TILE15_BORDER_LM ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00967.    STA [BonusText_BaseL],Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00968.  00969.    CPY #$af ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00970.    BNE PRG024_A618 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00971.  00972.    ; Lower right border ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00973.    LDA #TILE15_BORDER_LR ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00974.    STA [BonusText_BaseL],Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00975.  00976.    RTS ; Return ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00977.  00978. ; QBoxOrange_Tiles: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00979.    .byte $C9, $CA, $CB, $CC ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00980.  00981. ; LoadLevel_QBoxOrange: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00982.    LDX #$00 ; X = 0 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00983.    LDY TileAddr_Off ; Y = TileAddr_Off ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00984. PRG024_A62F: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00985.  00986.    ; Temp_Var1 = 1 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00987.    LDA #$01 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00988.    STA <Temp_Var1 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00989.  00990. PRG024_A633: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00991.  00992.    ; Add prize box tile ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00993.    LDA QBoxOrange_Tiles,X ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00994.    STA [BonusText_BaseL],Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00995.  00996.    INY ; Y++ (next tile, DANGEROUS) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00997.    INX ; X++ (next prize box tile) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 00998.  00999.    DEC <Temp_Var1 ; Temp_Var1-- ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01000.    BPL PRG024_A633 ; While Temp_Var1 >= 0, loop! ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01001.  01002.    ; Next row ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01003.    LDA TileAddr_Off ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01004.    ADD #16 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01005.    STA TileAddr_Off ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01006.    TAY ; -> 'Y' ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01007.  01008.    CPX #(QBoxOrange_Tiles_End - QBoxOrange_Tiles) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01009.    BNE PRG024_A62F ; While tiles to go, loop! ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01010.  01011.    RTS ; Return ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01012.  01013. ; QBoxBlue_Tiles: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01014.    .byte $87, $88, $89, $8A ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01015.  01016.  01017. ; LoadLevel_QBoxBlue: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01018.    LDX #$00 ; X = 0 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01019.    LDY TileAddr_Off ; Y = TileAddr_Off ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01020. PRG024_A656: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01021.  01022.    ; Temp_Var1 = 1 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01023.    LDA #$01 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01024.    STA <Temp_Var1 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01025.  01026. PRG024_A65A: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01027.  01028.    ; Add prize box tile ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01029.    LDA QBoxBlue_Tiles,X ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01030.    STA [BonusText_BaseL],Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01031.  01032.    INY ; Y++ (next tile, DANGEROUS) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01033.    INX ; X++ (next prize box tile) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01034.  01035.    DEC <Temp_Var1 ; Temp_Var1-- ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01036.    BPL PRG024_A65A ; While Temp_Var1 >= 0, loop! ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01037.  01038.    ; Next row ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01039.    LDA TileAddr_Off ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01040.    ADD #16 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01041.    STA TileAddr_Off ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01042.    TAY ; -> 'Y' ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01043.  01044.    CPX #(QBoxBlue_Tiles_End - QBoxBlue_Tiles) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01045.    BNE PRG024_A656 ; While tiles to go, loop! ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01046.  01047.    RTS ; Return ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01048.  01049.  01050. ;LoadLevel_BonusFloor: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01051.  01052.    ; Temp_Var1 = 1 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01053.    LDA #$01 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01054.    STA <Temp_Var1 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01055.  01056.    LDY TileAddr_Off ; Y = TileAddr_Off ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01057.  01058. PRG024_A67B: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01059.    LDA LL_ShapeDef ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01060.    AND #$0f ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01061.    TAX ; X = lower 4 bits of LL_ShapeDef ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01062.  01063. PRG024_A681: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01064.    LDA #TILE15_BRICKFLOOR ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01065.    STA [Map_Tile_AddrL],Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01066.  01067.    INY ; Y++ (NOT SAFE!) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01068.  01069.    DEX ; X-- ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01070.    BPL PRG024_A681 ; While X >= 0, loop ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01071.  01072.    ; Next row ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01073.    LDA TileAddr_Off ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01074.    ADD #16 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01075.    STA TileAddr_Off ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01076.    TAY ; -> 'Y' ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01077.  01078.    DEC <Temp_Var1 ; Temp_Var1-- ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01079.    BPL PRG024_A67B ; While Temp_Var1 >= 0, loop ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01080.  01081.    RTS ; Return ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01082.  01083. ; FIXME: Anyone want to claim this? ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01084. ; $C698 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01085.  01086.    ; Y += 16 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01087.    TYA ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01088.    ADD #16 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01089.    TAY ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01090.  01091.    LDA <BonusText_BaseH ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01092.    ADC #$00 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01093.    STA <BonusText_BaseH ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01094.  01095.    RTS ; Return ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01096.  01097. ; FIXME: Anyone want to claim this? ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01098. ; $C6A4 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01099.    LDA <Temp_Var6 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01100.    STA <BonusText_BaseH ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01101.  01102.    LDY TileAddr_Off ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01103.    INY ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01104.    TYA ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01105.    AND #$0f ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01106.    BNE PRG024_A6E2 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01107.  01108.    LDY #$00 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01109.  01110.    LDA <Temp_Var15 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01111.    AND #$10 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01112.    BEQ PRG024_A6BA ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01113.  01114.    INY ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01115.  01116. PRG024_A6BA: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01117.    STY <Temp_Var10 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01118.  01119.    LDA <BonusText_BaseL ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01120.    ADD #$b0 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01121.    STA <BonusText_BaseL ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01122.    LDA <BonusText_BaseH ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01123.    ADC <Temp_Var10 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01124.    STA <BonusText_BaseH ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01125.    STA <Temp_Var6 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01126.  01127.    LDA <Temp_Var16 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01128.    AND #$f0 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01129.    LSR A ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01130.    LSR A ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01131.    LSR A ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01132.    TAY ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01133.  01134.    INY ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01135.    INY ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01136.  01137.    LDA Tile_Mem_Addr+1,Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01138.    STA <Temp_Var5 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01139.  01140.    INC <Temp_Var5 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01141.  01142.    LDA TileAddr_Off ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01143.    AND #$f0 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01144.    TAY ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01145.  01146. PRG024_A6E2: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01147.    STY TileAddr_Off ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01148.    RTS ; Return ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01149.  01150.  01151. ; BonusGame_HostDraw: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01152.    LDA Bonus_GameHost ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01153.    JSR DynJump ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01154.  01155.    ; THESE MUST FOLLOW DynJump FOR THE DYNAMIC JUMP TO WORK!! ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01156.    .word HostToad_Draw ; 0: Standard Toad Host ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01157.    .word HostTroopa_DrawWithGameBits ; 1: (Unused, glitched) Koopa Troopa Host w/ (unused, glitched) large [?] and card ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01158.    .word HostTroopa_Draw ; 2: (Unused, glitched) Koopa Troopa Host w/o the other thing ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01159.    .word HostHammerBro_Draw ; 3: (Unused, glitched) Hammer Bro Host ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01160.  01161. ; HostToad_Draw: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01162.    JSR HostToad_DrawSprites ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01163.    RTS ; Return ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01164.  01165. ; HostTroopa_DrawWithGameBits: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01166.    JSR HostTroopa_DrawSprites ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01167.  01168.    LDA #$3f ; <-- denotes starting tile, for other prize boxes?? ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01169.    JSR Draw_KTPrizeGameBox ; Draw the Koopa Troopa "Prize" Game box and the prize ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01170.  01171.    RTS ; Return ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01172.  01173. ; HostTroopa_Draw: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01174.    JSR HostTroopa_DrawSprites ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01175.    RTS ; Return ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01176.  01177. ; HostHammerBro_Draw: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01178.    JSR HostHammerBro_DrawSprites ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01179.    RTS ; Return ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01180.  01181. ; HostToad_SpriteYs: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01182.    .byte $60, $60, $60, $60, $70, $70, $70, $70, $80, $80, $80 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01183.  01184. ; HostToad_SpriteXs: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01185.    .byte $C0, $C8, $D0, $D8, $C0, $C8, $D0, $D8, $C0, $C8, $D0 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01186.  01187. ; HostToad_DrawSprites: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01188.  01189.    ; Temp_Var11 = $95 (starting pattern of Toad Host sprites) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01190.    LDA #$95 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01191.    STA <Temp_Var11 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01192.  01193.    LDY #$00 ; Y = 0 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01194.    LDX #(HostToad_SpriteYs_End - HostToad_SpriteYs - 1) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01195. PRG024_A727: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01196.  01197.    ; Set Sprite Y of this sprite of the Toad Host ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01198.    LDA HostToad_SpriteYs,X ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01199.    STA Sprite_RAM+$10,Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01200.  01201.    INY ; Y++ (next sprite RAM byte) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01202.  01203.    ; Set pattern of this sprite of the Toad Host ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01204.    LDA <Temp_Var11 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01205.    STA Sprite_RAM+$10,Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01206.  01207.    INY ; Y++ (next sprite RAM byte) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01208.  01209.    ; Set palette of this sprite of the Toad Host ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01210.    LDA #SPR_PAL0 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01211.    STA Sprite_RAM+$10,Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01212.  01213.    INY ; Y++ (next sprite RAM byte) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01214.  01215.    ; Set Sprite X of this sprite of the Toad Host ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01216.    LDA HostToad_SpriteXs,X ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01217.    STA Sprite_RAM+$10,Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01218.  01219.    INY ; Y++ (next sprite RAM byte) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01220.  01221.    ; Temp_Var11 -= 2 (two patterns backward) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01222.    DEC <Temp_Var11 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01223.    DEC <Temp_Var11 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01224.  01225.    DEX ; X-- ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01226.    BPL PRG024_A727 ; While X >= 0, loop ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01227.  01228.    RTS ; Return ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01229.  01230. ; HostTroopa_SpriteYs: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01231.    .byte $60, $60, $60, $70, $70, $70, $70, $80, $80, $80 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01232. ; HostTroopa_SpriteYs_End ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01233.  01234. ; HostTroopa_SpriteXs: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01235.    .byte $C0, $C8, $D0, $C0, $C8, $D0, $D8, $C8, $D0, $D8 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01236.  01237. ; HostTroopa_DrawSprites: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01238.    ; Temp_Var11 = $99 (starting pattern of Koopa Troopa Host sprites) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01239.    LDA #$99 ; WRONG! Should be $A9, then he'll display correctly :D ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01240.    STA <Temp_Var11 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01241.  01242.    LDY #$00 ; Y = 0 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01243.    LDX #(HostTroopa_SpriteYs_End - HostTroopa_SpriteYs - 1) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01244. PRG024_A765: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01245.  01246.    ; Set Sprite Y of this sprite of the Koopa Troopa Host ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01247.    LDA HostTroopa_SpriteYs,X ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01248.    STA Sprite_RAM+$10,Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01249.  01250.    INY ; Y++ (next sprite RAM byte) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01251.  01252.    ; Set pattern of this sprite of the Koopa Troopa Host ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01253.    LDA <Temp_Var11 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01254.    STA Sprite_RAM+$10,Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01255.  01256.    INY ; Y++ (next sprite RAM byte) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01257.  01258.    ; Set palette of this sprite of the Koopa Troopa Host ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01259.    LDA #SPR_PAL0 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01260.    STA Sprite_RAM+$10,Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01261.  01262.    INY ; Y++ (next sprite RAM byte) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01263.  01264.    ; Set Sprite X of this sprite of the Koopa Troopa Host ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01265.    LDA HostTroopa_SpriteXs,X ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01266.    STA Sprite_RAM+$10,Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01267.  01268.    INY ; Y++ (next sprite RAM byte) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01269.  01270.    ; Temp_Var11 -= 2 (two patterns backward) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01271.    DEC <Temp_Var11 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01272.    DEC <Temp_Var11 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01273.  01274.    DEX ; X-- ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01275.    BPL PRG024_A765 ; While X >= 0, loop ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01276.  01277.    RTS ; Return ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01278.  01279.  01280. ; HostHammerBro_SpriteYs: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01281.    .byte $60, $60, $60, $70, $70, $70, $70, $80, $80, $80, $80 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01282.  01283. ; HostHammerBro_SpriteXs: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01284.    .byte $C0, $C8, $D0, $C0, $C8, $D0, $D8, $C0, $C8, $D0, $D8 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01285.  01286.  01287. ; HostHammerBro_DrawSprites: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01288.    ; Temp_Var11 = $AF (starting pattern of Koopa Troopa Host sprites) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01289.    LDA #$AF ; WRONG! Should be $BF, then he'll display correctly :D ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01290.    STA <Temp_Var11 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01291.  01292.    LDY #$00 ; Y = 0 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01293.    LDX #(HostHammerBro_SpriteYs_End - HostHammerBro_SpriteYs - 1) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01294. PRG024_A7A5: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01295.    ; Set Sprite Y of this sprite of the Hammer Bro Host ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01296.    LDA HostHammerBro_SpriteYs,X ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01297.    STA Sprite_RAM+$10,Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01298.  01299.    INY ; Y++ (next sprite RAM byte) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01300.  01301.    ; Set pattern of this sprite of the Hammer Bro Host ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01302.    LDA <Temp_Var11 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01303.    STA Sprite_RAM+$10,Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01304.  01305.    INY ; Y++ (next sprite RAM byte) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01306.  01307.    ; Set palette of this sprite of the Hammer Bro Host ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01308.    LDA #SPR_PAL0 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01309.    STA Sprite_RAM+$10,Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01310.  01311.    INY ; Y++ (next sprite RAM byte) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01312.  01313.    ; Set Sprite X of this sprite of the Hammer Bro Host ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01314.    LDA HostHammerBro_SpriteXs,X ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01315.    STA Sprite_RAM+$10,Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01316.  01317.    INY ; Y++ (next sprite RAM byte) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01318.  01319.    ; Temp_Var11 -= 2 (two patterns backward) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01320.    DEC <Temp_Var11 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01321.    DEC <Temp_Var11 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01322.  01323.    DEX ; X-- ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01324.    BPL PRG024_A7A5 ; While X >= 0, loop ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01325.    RTS ; Return ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01326.  01327. ; BonusGameBox_SpriteYs: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01328.    .byte $70, $70, $70, $70, $80, $80, $80, $80 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01329.  01330. ; BonusGameBox_SpriteXs: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01331.    .byte $70, $78, $80, $88, $70, $78, $80, $88 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01332.  01333. ; Bonus_KTPrizeFlipBits: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01334.    .byte SPR_HFLIP, $00 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01335.  01336. ; Bonus_KTPrizePattern: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01337.    .byte $21, $25, $23, $27 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01338.  01339.    ; Draws the box and the "prize" for Koopa Troopa's "Prize" Game ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01340. ; Draw_KTPrizeGameBox: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01341.    STA <Temp_Var11 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01342.  01343.  01344.    ; Draw the game box first ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01345.  01346.    LDX #(BonusGameBox_SpriteYs_End - BonusGameBox_SpriteYs - 1) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01347. PRG024_A7E1: ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01348.  01349.    ; Set Sprite Y of this sprite ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01350.    LDA BonusGameBox_SpriteYs,X ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01351.    STA Sprite_RAM+$10,Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01352.  01353.    INY ; Y++ (next sprite RAM byte) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01354.  01355.    ; Set pattern of this sprite ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01356.    LDA <Temp_Var11 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01357.    STA Sprite_RAM+$10,Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01358.  01359.    INY ; Y++ (next sprite RAM byte) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01360.  01361.    ; Set palette of this sprite ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01362.    LDA #SPR_PAL0 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01363.    STA Sprite_RAM+$10,Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01364.  01365.    INY ; Y++ (next sprite RAM byte) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01366.  01367.    ; Set Sprite X of this sprite ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01368.    LDA BonusGameBox_SpriteXs,X ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01369.    STA Sprite_RAM+$10,Y ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01370.  01371.    INY ; Y++ (next sprite RAM byte) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01372.  01373.    ; Temp_Var11 -= 2 (two patterns backward) ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01374.    DEC <Temp_Var11 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01375.    DEC <Temp_Var11 ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01376.  01377.    DEX ; X-- ; UNUSED COPY FROM PRG022, DELETE DON'T MODIFY 01378.  01379. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 01380. ;;;;;;;;;;;;;;;;;;;;; END UNUSED COPY/PASTED CODE ;;;;;;;;;;;;;;;;;;;;; 01381. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 01382.  01383.  01384. Debug_DownUp: .byte 1, -1 ; Add 1 or subtract 1 from current world on debug menu 01385.  01386. ; $A802 01387.    .byte $02, $FF, $00, $01 01388.  01389. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 01390. ; GraphicsBuf_Prep_And_WaitVSyn2 01391. ; 01392. ; This subroutine takes Graphics_Queue and loads and address 01393. ; from Video_Upd_Table2 into the Video_Upd_Addr, then waits for 01394. ; a VBlank cycle to occur via reading the VBlank_Tick after 01395. ; force-setting it to zero. This gets the system into a state 01396. ; where it can actually apply the update! 01397. ; 01398. ; See also GraphicsBuf_Prep_And_WaitVSync in PRG030 01399. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 01400. GraphicsBuf_Prep_And_WaitVSyn2: 01401.    LDA <Graphics_Queue 01402.    ASL A  01403.    TAY ; Y = Graphics_Queue << 1 01404.  01405.    ; Get the address where the video update data is 01406.    LDA Video_Upd_Table2,Y 01407.    STA <Video_Upd_AddrL 01408.    LDA Video_Upd_Table2+1,Y 01409.    STA <Video_Upd_AddrH  01410.  01411.    LDA #$01  01412.    STA <VBlank_TickEn ; Enable the VBlank tick 01413.    LDA #$00  01414.    STA <VBlank_Tick ; Force VBlank_Tick = 0, so we know when a VBlank has occurred 01415.  01416.    ; Waiting for VBlank... 01417. PRG024_A81C: 01418.    LDA <VBlank_Tick 01419.    BPL PRG024_A81C 01420.  01421.    LDA #$00  01422.    STA <VBlank_TickEn ; Disable the VBlank 01423.  01424.    CLI ; Enable further masked interrupts 01425.    RTS ; Return 01426.  01427.  01428. IntIRQ_TitleEnding: 01429.    STA MMC3_IRQENABLE 01430.  01431.    ; Some kind of delay loop? 01432.    LDX #$04 ; X = 4 01433. PRG024_A82B: 01434.    NOP ; ? 01435.    DEX ; X-- 01436.    BNE PRG024_A82B ; While X > 0, loop 01437.  01438.    LDA PPU_STAT 01439.  01440.    LDY #$0b 01441.    LDA #$00 01442.    STY PPU_VRAM_ADDR 01443.    STA PPU_VRAM_ADDR 01444.  01445.    LDA PPU_VRAM_DATA 01446.  01447.    LDA <PPU_CTL1_Copy  01448.    ORA <PPU_CTL1_Mod ; Combine bits from PPU_CTL1_Copy into PPU_CTL1_Mod 01449.    STA PPU_CTL1 ; Stored to the register! 01450.  01451.    LDA PPU_STAT 01452.  01453.    ; H-Scroll locked at 0 01454.    LDA #$00 01455.    STA PPU_SCROLL 01456.  01457.    ; V-Scroll locked at $EF 01458.    LDA #$ef 01459.    STA PPU_SCROLL 01460.  01461.    STA MMC3_IRQDISABLE 01462.  01463.    JMP IntIRQ_Finish_NoDis ; Jump to IntIRQ_Finish_NoDis 01464.  01465. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  01466. ; Video_Misc_Updates2 01467. ; 01468. ; This routine is responsible for arbitrary video updates 01469. ; 01470. ; Loads data as specified from table Video_Upd_Table2 in PRG024 (see Video_Upd_Table in PRG030 for format!) 01471. ; Cloned in its entirety in PRG026 (i.e. Video_Misc_Updates) 01472. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  01473. Video_Misc_Updates2: 01474.    LDY #$00 ; Start at offset 0 01475.    LDA [Video_Upd_AddrL],Y ; Get next byte from data 01476.    BNE PRG024_A860 ; If not $00 (terminator), process it @ PRG024_A860 01477.    RTS ; Return 01478.  01479. PRG024_A860: 01480.    LDX PPU_STAT ; Flush video 01481.  01482.    STA PPU_VRAM_ADDR ; Store byte into video address high 01483.    INY ; Y++ 01484.    LDA [Video_Upd_AddrL],Y ; Get next byte 01485.    STA PPU_VRAM_ADDR ; Store byte into video address low 01486.  01487.    INY ; Y++ 01488.    LDA [Video_Upd_AddrL],Y ; Get next byte... 01489.  01490.    ASL A ; Its uppermost bit dictates whether to use horizontal (1B) or vertical (32B) advancement 01491.    PHA ; Save A 01492.  01493.    LDA <PPU_CTL1_Copy ; Get PPU_CTL1 settings 01494.    ORA #$04 ; Set PPU update vertical (each write advances by 32) 01495.    BCS PRG024_A879 ; If bit 7 was set, jump to PRG026_B2B2 01496.    AND #$fb ; Otherwise, use horizontal updates! (clears vertical bit) 01497.  01498. PRG024_A879: 01499.    STA PPU_CTL1 ; Update PPU_CTL1 01500.    STA <PPU_CTL1_Copy ; Update PPU_CTL1_Copy 01501.  01502.    PLA ; Restore A 01503.  01504.    ASL A ; Check next bit... 01505.    BCC PRG024_A885 ; If not set, jump to PRG026_B2BE 01506.    ORA #$02 ; Otherwise, remaining value gets bit 1 set (forces skip of first increment) 01507.    INY ; Y++  01508.  01509. PRG024_A885: 01510.    ; Restore remainder of byte read (6-bits for value) 01511.    LSR A 01512.    LSR A 01513.    TAX ; Keep it in X 01514.  01515.    ; The following will continuously write bytes from the stream 01516.    ; directly into the PPU 'X+1' times 01517. PRG024_A888: 01518.    BCS PRG024_A88B ; If carry set, jump to PRG026_B2C4 01519.    INY ; Y++ 01520.  01521. PRG024_A88B: 01522.    LDA [Video_Upd_AddrL],Y ; Get next byte 01523.    STA PPU_VRAM_DATA ; Store into PPU 01524.    DEX ; X-- 01525.    BNE PRG024_A888 ; While X <> 0, loop!  01526.  01527.    ; This advances the current position of the pointer so 'Y' can go 01528.    ; back to zero and we begin again... 01529.    INY ; Y++ 01530.    TYA ; A = Y 01531.    ADD <Video_Upd_AddrL 01532.    STA <Video_Upd_AddrL 01533.    LDA <Video_Upd_AddrH 01534.    ADC #$00  01535.    STA <Video_Upd_AddrH ; Entire video address value has 'Y' added to it 01536.    JMP Video_Misc_Updates2 ; Jump back to start to process next command or terminate! 01537.  01538. Title_Obj_InitIdx: .byte $02, $00, $01, $03, $04, $05 ; Indexes into Title_ObjStates, inits to state 1 in this order 01539. Title_ObjInitIdx_Time: .byte $03, $03, $06, $12, $11, $00 ; Timing values to delay the next Title_ObjInitIdx 01540.  01541. Do_Title_Screen: ; $A8AF 01542.    JSR Sprite_RAM_Clear ; Clear Sprite RAM Copy 01543.    JSR Reset_PPU_Clear_Nametables 01544.  01545.    ; Basically just hiding everything 01546.    LDA #$00 01547.    STA PPU_CTL1 01548.    STA PPU_CTL2 01549.  01550.    ; Clear the first 245 bytes of RAM 01551.    LDX #$f5 ; X = 245 01552. PRG024_A8BF: 01553.    LDA #$00 ; A = $00 01554.    STA <Temp_Var1,X ; Clear this byte 01555.    DEX ; X-- 01556.    BNE PRG024_A8BF ; Loop... 01557.  01558.  01559.    ; Clearing memory used by various title screen objects 01560.    LDX #(Title_ObjFrame - Title_MLAccelCnt + 6) 01561. PRG024_A8C8: 01562.    LDA #$00 ; A = 0 01563.    STA Title_MLAccelCnt,X ; Clear this byte 01564.    DEX ; X-- 01565.    BPL PRG024_A8C8 ; Loop while X >= 0... 01566.  01567.    ; Set Mario and Luigi's lives to 4 01568.    LDA #$04 01569.    STA Player_Lives 01570.    STA Player_Lives+1 01571.  01572.    LDA #$ff 01573.    STA <Title_ObjInitIdx ; Title_ObjInitIdx = $FF (Should be 0 - 5, does this have an early increment or something?) 01574.  01575.    ; Set Mario and Luigi's Y position to 160 01576.    LDA #160 01577.    STA <Title_ObjY 01578.    STA <Title_ObjY+1 01579.  01580.    LDA #240 01581.    STA <Title_ObjX ; Set Mario's X coordinate to 240 01582.  01583.    LDA #$00 01584.    STA <Title_ObjX+1 ; Set Luigi's X coordinate to 0 01585.  01586.    ; Set Mario and Luigi to "Big" power level 01587.    LDA #$01 01588.    STA <Title_ObjMLPower  01589.    STA <Title_ObjMLPower+1  01590.  01591.    LDA #$88 01592.    STA Random_Pool ; Seed the randomizer 01593.  01594.    LDA #%00101000 01595.    STA PPU_CTL1 ; use 8x16 sprites, sprites use PT2 01596.    STA <PPU_CTL1_Copy ; Sync with PPU_CTL1_Copy 01597.  01598.    JSR Title_Display_Curtain ; Put up the curtain! 01599.  01600.    ; Load the palette and checkerboard floor pattern 01601.    LDA #$01 ; A = 1 01602.    ASL A ; A = 2 01603.    TAY ; Y = 2 (Palette + Checkerboard floor) 01604.    LDA Video_Upd_Table2,Y 01605.    STA <Video_Upd_AddrL 01606.    LDA Video_Upd_Table2+1,Y 01607.    STA <Video_Upd_AddrH 01608.    JSR Video_Misc_Updates2 01609.  01610.    ; Some kind of hardware thing perhaps 01611.    LDA #$00 01612.    STA PPU_VRAM_ADDR 01613.    STA PPU_VRAM_ADDR 01614.    LDA #$10  01615.    STA PPU_VRAM_ADDR 01616.    STA PPU_VRAM_ADDR 01617.    LDA #$00  01618.    STA PPU_VRAM_ADDR 01619.    STA PPU_VRAM_ADDR 01620.    LDA #$10  01621.    STA PPU_VRAM_ADDR  01622.    STA PPU_VRAM_ADDR  01623.  01624.    ; Wait for V-Blank to end 01625. PRG024_A930: 01626.    LDA PPU_STAT 01627.    AND #$80  01628.    BNE PRG024_A930  01629.  01630.    LDA #%10101000 01631.    STA PPU_CTL1 ; Generate VBlank Resets, use 8x16 sprites, sprites use PT2 01632.    STA <PPU_CTL1_Copy ; Keep PPU_CTL1_Copy in sync! 01633.  01634.    LDA #%00011110 01635.    STA <PPU_CTL2_Copy ; Setup for: No BG or sprite clipping, show BG and sprites 01636.  01637.    LDA #53 01638.    STA <Title_Ticker ; Set Title_Ticker = 53 (initial delay prior to curtain raise) 01639.  01640. PRG024_A946: 01641.    ; Used for VSync 01642.    JSR GraphicsBuf_Prep_And_WaitVSyn2 01643.  01644.    LDA <Pad_Input 01645.    AND #PAD_START 01646.    BEQ PRG024_A955 ; If Player is NOT pressing Start, jump to PRG024_A955 01647.  01648.    ; Player pressed START -- skips rest of intro, if any 01649.    LDA #$06  01650.    STA <Title_State ; Title_State = 6  01651.    BEQ PRG024_A959 ; Jump technically never?? to skip title ticker 01652.  01653. PRG024_A955:  01654.    DEC <Title_Ticker ; Decrement title tick counter 01655.    BPL PRG024_A946 ; If >= 0, loop... 01656.  01657. PRG024_A959: 01658.    ; Title_Ticker = 0... 01659.  01660.    ; Used for VSync 01661.    JSR GraphicsBuf_Prep_And_WaitVSyn2 01662.  01663.    ; There are 6 objects on the title screen that need their states set; if this value hits 6, we're done with that 01664.    LDY <Title_ObjInitIdx ; Y = Title_ObjInitIdx 01665.    CPY #$06  01666.    BGE PRG024_A976 ; If Title_ObjInitIdx >= 6, jump to PRG024_A976 01667.  01668.    ; Title_ObjInitIdx < 6... (more objects to go yet) 01669.  01670.    ; Waiting for event timer to run out 01671.    DEC <Title_ObjInitDly ; Title_ObjInitDly-- 01672.    BNE PRG024_A976 ; If Title_ObjInitDly > 0, jump to PRG024_A976 01673.  01674.    ; Load next delay for object init 01675.    ; Title_ObjInitIdx is 0 to 5 01676.    LDA Title_ObjInitIdx_Time,Y 01677.    STA <Title_ObjInitDly ; Title_ObjInitDly = Title_ObjInitIdx_Time[Title_ObjInitIdx] 01678.  01679.    LDA Title_Obj_InitIdx,Y 01680.    TAY ; Y = Title_Obj_InitIdx[Title_ObjInitIdx] 01681.  01682.    LDA #$01  01683.    STA Title_ObjStates,Y ; Title_ObjStates[Y] = 1 Set title screen object to state 1 01684.  01685.    ; Doing next object... 01686.    INC <Title_ObjInitIdx ; Title_ObjInitIdx++ 01687.  01688. PRG024_A976: 01689.    JSR Title_DoState ; Do whatever this state of the title screen does 01690.  01691.    ; Title_ResetTrig is the trigger to reset the title screen 01692.    LDA <Title_ResetTrig 01693.    BEQ PRG024_A980 ; If Title_ResetTrig = 0, jump to PRG024_A980 01694.  01695.    JMP Do_Title_Screen ; Reset title screen... 01696.  01697. PRG024_A980: 01698.    ; Reset trigger is not set... 01699.  01700.    LDA <Title_State 01701.    CMP #$05  01702.    BNE PRG024_A959 ; If Title_State <> 5, jump to PRG024_A959 01703.  01704.    ; When Title_State = 5, we're about to finish and go off to the map! 01705.  01706.    ; Performs a clearing loop starting from World_Map_Y + $80 ($F5) down and through 01707.    LDX #$80 ; Clearing $80 bytes 01708.    LDA #$00 ; Clear value 01709. PRG024_A98A: 01710.    STA <World_Map_Y,X ; Clear this byte 01711.    DEX ; X-- 01712.    BPL PRG024_A98A ; X >= 0, loop! 01713.  01714.    RTS ; Return 01715.  01716. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 01717. ; Title_Display_Curtain 01718. ; 01719. ; You know that nifty "bowser" curtain  01720. ; on the title screen? Here it is... 01721. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 01722. Title_Display_Curtain: 01723.    LDA PPU_STAT ; read PPU status to reset the high/low latch 01724.  01725.    ; Set VRAM_ADDR to $2000 (Nametable 0) 01726.    LDA #$20 01727.    STA PPU_VRAM_ADDR 01728.    LDA #$00 01729.    STA PPU_VRAM_ADDR 01730.  01731.    LDX #$02 ; X = 2 (performs loop twice) 01732.    LDA #$08 ; A = 8 (the Bowser curtain tile) 01733. PRG024_A9A1: 01734.    LDY #$ff ; Y = $FF (fill count) 01735. PRG024_A9A3: 01736.    STA PPU_VRAM_DATA ; Write $08/$09 to this byte in the VRAM 01737.    EOR #$01 ; Toggle between $08/$09 01738.    DEY ; Y-- 01739.    BNE PRG024_A9A3 ; Loop while Y not zero 01740.    STA PPU_VRAM_DATA ; One more write since we come up one short 01741.    EOR #$01 ; And its cooresponding flip 01742.    DEX ; X-- 01743.  BPL PRG024_A9A1 ; Loop while X >= 0... 01744.  01745.    RTS ; Return! 01746.  01747.  01748. Title_DoState: 01749.  01750.    ; Clear the queues for Mario/Luigi 01751.    LDA #$00 01752.    STA <Title_ObjMLQueue 01753.    STA <Title_ObjMLQueue+1 01754.  01755.    LDA <Title_State  01756.    JSR DynJump ; Dynamically jump based on Title_State... 01757.  01758.    ; THESE MUST FOLLOW DynJump FOR THE DYNAMIC JUMP TO WORK!! 01759.    .word TitleState_CurtainRaise ; 00 - Curtain raise 01760.    .word TitleState_OpeningSequence ; 01 - Opening sequence (updates Mario/Luigi's action scripts, the title screen objects, makes the big '3' glow...) 01761.    .word Title_PrepForMenu ; 02 - Prepares some variables before going into 1P/2P menu mode 01762.    .word Title_Do1P2PMenu ; 03 - Runs the 1P/2P menu with the koopas 01763.    .word Title_PrepForWorldMap ; 04 - Final data initialization before going to world map 01764.    .word Title_DoNothing ; 05 - just RTS, bootstraps world map 01765.    .word Title_IntroSkip ; 06 - Skip intro sequence (cleanly jump to 1P/2P menu) 01766.    .word Title_DebugMenu ; 07 - Debug menu 01767.  01768. TitleState_CurtainRaise: 01769.    LDY #$01 ; Y = 1 01770.  01771. PRG024_A9D1: 01772.    ; Moving curtain up... 01773.    INC <Vert_Scroll ; Vert_Scroll++ 01774.    LDA <Vert_Scroll  01775.    CMP #208 01776.    BEQ Title_LoadGraphics ; If Vert_Scroll = 208, jump to Title_LoadGraphics 01777.  01778.    ; Still haven't risen all the way... 01779.  01780.    CMP #78  01781.    BNE PRG024_A9E4 ; If Vert_Scroll <> 78, jump to PRG024_A9E4 01782.  01783.    ; Special stuff when curtain (Vert_Scroll) hits 78 01784.    LDA #$40 01785.    STA <Title_ObjMLStop ; Title_ObjMLStop = $40 (holds Mario/Luigi in place at first so they get a "running start") 01786.    STA Title_MLHoldTick ; Title_MLHoldTick = $40 (ticks until they are released) 01787.  01788. PRG024_A9E4: 01789.    DEY ; Y-- 01790.    BPL PRG024_A9D1 ; If Y >= 0, jump to PRG024_A9D1 01791.  01792.    LDA <Title_ObjMLStop 01793.    BEQ PRG024_A9EE ; If Title_ObjMLStop = 0, jump to PRG024_A9EE (i.e. don't call Title_UpdateAllObjs) 01794.    JSR Title_UpdateAllObjs ; Update all objects! 01795.  01796. PRG024_A9EE: 01797.    LDA <Pad_Input 01798.    AND #PAD_START 01799.    BEQ PRG024_A9F8 ; If Player is NOT pressing start, jump to PRG024_A9F8 (RTS) 01800.  01801.    LDA #$06  01802.    STA <Title_State ; Title_State = 6 (skip intro) 01803.  01804. PRG024_A9F8: 01805.    RTS ; Return 01806.  01807. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 01808. ; Title_LoadGraphics 01809. ; 01810. ; Loads several items from Video_Upd_Table2 in PRG025 01811. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 01812. Title_LoadGraphics: 01813.    LDA #$02 01814.    STA <Title_EventIndex ; Title_EventIndex = $02 (first action taken [load the logo] and continue doing stuff!) 01815.  01816.    LDA #$08 01817.    STA <Title_EventGrafX ; Title_EventGrafX = $08 (first item to load from Video_Upd_Table2 in PRG025, up to item $23; see Title_LoadSMB3) 01818.  01819.    INC <Title_State ; Next title state... 01820.  01821.    LDA #$00  01822.    STA <Title_ObjMLStop ; Title_ObjMLStop = 0 (releases Mario and Luigi) 01823.  01824.    RTS ; Return 01825.  01826.  01827. ; This is Mario and Luigi's "action script", which is a simple script to 01828. ; dictate their actions on the title screen... 01829. ; NOTE: The other objects are mostly autonomous, not scripted. They respond to 01830. ; hardcoded values, timers, or flags from this, but that's it... 01831. ; 01832. ; Format: 01833. ; [DELAY][QUEUE] 01834. ; 01835. ; Where: 01836. ; [DELAY] is normally a tick count until the next event, EXCEPT: 01837. ; 01838. ; Mario's script: 01839. ; - $FE to increment Title_State and reset Title_MActScriptPos 01840. ; - $FF to set Title_EventIndex to the value that follows it 01841. ; 01842. ; Luigi's script: 01843. ; - $FF is like Mario's $FE, i.e. Title_LActScriptPos = 0, but does not change Title_State 01844. ; [QUEUE] is normally a value pumped into Title_MActScriptDirSet (buffer) and Title_ObjMLQueue (acted upon), 01845. ; except for the prior $FE and $FF values as follows: 01846. ; - For [CMD] $FE (Mario) or $FF (Luigi), it is not used (since Title_MActScriptPos is set to zero) 01847. ; - For [CMD] $FF (Mario), it is the Title_EventIndex value to set 01848.  01849. ; Mario's action script 01850. Title_MActionScript: 01851.    .byte $4C, $02, $14, $00, $20, $04, $03, $00, $FF, $03, $BD, $00, $30, $08, $17, $80 01852.    .byte $05, $00, $23, $82, $02, $00, $25, $80, $20, $00, $35, $01, $05, $10, $04, $01 01853.    .byte $05, $00, $04, $01, $05, $00, $04, $01, $05, $00, $04, $01, $05, $00, $04, $01 01854.    .byte $50, $00, $42, $02, $01, $80, $12, $02, $05, $01, $20, $00, $10, $01, $05, $20 01855.    .byte $20, $01, $05, $40, $C0, $00, $02, $02, $10, $00, $36, $41, $38, $42, $60, $00 01856.    .byte $60, $51, $FF, $08, $10, $00, $FE, $00 01857.  01858. ; Luigi's action script 01859. Title_LActionScript: 01860.    .byte $2C, $01, $50, $80, $F0, $01, $90, $00, $70, $00, $10, $02, $10, $22, $09, $00 01861.    .byte $15, $02, $34, $00, $02, $42, $90, $00, $65, $01, $F0, $00, $FF 01862.  01863. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 01864. ; Title_3Glow 01865. ; 01866. ; Constantly pushes a palette adjustment into the 01867. ; graphics buffer to enable the big '3' on the title 01868. ; screen to glow... 01869. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 01870. Title_3Glow: 01871.    DEC <Title_Ticker ; Title_Ticker-- 01872.    BPL PRG024_AAA9 ; If Title_Ticker >= 0, jump to PRG024_AAA9 (RTS) 01873.  01874.    LDA #$04  01875.    STA <Title_Ticker ; Title_Ticker = 4 01876.  01877.    LDY <Title_3GlowIndex ; Y = current 3glow index 01878.    LDA Title_3GlowColors,Y ; Get the cooresponding color 01879.  01880.    STA Graphics_Buffer+3 ; Put that into the graphics buffer 01881.  01882.    ; Address the palette 01883.    LDA #$3f  01884.    STA Graphics_Buffer 01885.    LDA #$0e  01886.    STA Graphics_Buffer+1 01887.  01888.    ; 1 byte and terminator 01889.    LDA #$01  01890.    STA Graphics_Buffer+2  01891.    LDA #$00  01892.    STA Graphics_Buffer+4  01893.  01894.    ; Title_3GlowIndex goes from 0 - 7, round and round 01895.    INC <Title_3GlowIndex 01896.    LDA <Title_3GlowIndex 01897.    AND #$07  01898.    STA <Title_3GlowIndex 01899.  01900. PRG024_AAA9: 01901.    RTS ; Return 01902.  01903.    ; These are the color values used by Title_3Glow for the big '3' 01904. Title_3GlowColors: 01905.    .byte $27, $17, $07, $17, $27, $37, $37, $27 01906.  01907.  01908. TitleState_OpeningSequence: 01909.  01910.    ; Update Mario's action script 01911.    DEC <Title_MActScriptDelay ; Title_MActScriptDelay-- 01912.    LDA <Title_MActScriptDelay 01913.    CMP #$ff 01914.    BNE PRG024_AABD ; If ticks remain, jump to PRG024_AABD 01915.  01916.    JSR Title_MAS_DoNextEvent ; Performs an event or sets the Mario action queue 01917.  01918. PRG024_AABD: 01919.  01920.    ; Update Luigi's action script 01921.    DEC <Title_LActScriptDelay ; Title_LActScriptDelay-- 01922.    LDA <Title_LActScriptDelay  01923.    CMP #$ff  01924.    BNE PRG024_AAC8 ; If ticks remain, jump to PRG024_AAC8 01925.  01926.    JSR Title_LAS_DoNextEvent ; Performs an event or sets the Luigi action queue 01927.  01928. PRG024_AAC8: 01929.  01930.    ; Copy MLDir settings in... 01931.    LDA <Title_MActScriptDirSet 01932.    STA <Title_ObjMLDir  01933.    LDA <Title_LActScriptDirSet 01934.    STA <Title_ObjMLDir+1  01935.  01936.    JSR Title_DoEvent ; Perform current title screen events 01937.    JSR Title_UpdateAllObjs ; Update all title screen objects 01938.  01939.    LDA <Title_3GlowFlag 01940.    BEQ PRG024_AADD ; If not glowing, jump to PRG024_AADD 01941.  01942.    JSR Title_3Glow ; Make the big '3' glow! 01943.  01944. PRG024_AADD: 01945.    LDA <Pad_Input  01946.    AND #PAD_START 01947.     01948.    BEQ PRG024_AAF3 ; If Player is not pressing START, jump to PRG024_AAF3 01949.  01950.    ; Player pressed start... 01951.    LDA <Title_UnusedFlag 01952.    BNE PRG024_AAED ; If Title_UnusedFlag is set, jump to PRG024_AAED 01953.  01954.    LDA #$06 01955.    STA <Title_State 01956.    BNE PRG024_AAF3 ; Title_State = 6 (skip) 01957.  01958. PRG024_AAED: 01959.    INC <Title_State ; Next title state... 01960.  01961.    LDA #$07 01962.    STA <Graphics_Queue ; Graphics_Queue = 7 (load the 1P/2P select menu) 01963.  01964. PRG024_AAF3: 01965.    RTS ; Return 01966.  01967.  01968. Title_IntroSkip: 01969.    LDA #$00  01970.    STA <Vert_Scroll ; Vert_Scroll = 0 01971.  01972.    ; Disable display a second 01973.    LDA #$00 01974.    STA PPU_CTL1 01975.    STA PPU_CTL2 01976.  01977.    ; This will load the title graphics in reverse, $22 to $6 01978.    LDA #$22  01979.    STA <Title_EventGrafX ; Title_EventGrafX = $22 (TitleScreen_Part27) 01980.  01981. PRG024_AB04: 01982.    LDA <Title_EventGrafX 01983.    ASL A  01984.    TAY ; Y = Title_EventGrafX << 1 (2 byte index) 01985.  01986.    ; Get address, store into [Video_Upd_AddrH][Video_Upd_AddrL] 01987.    LDA Video_Upd_Table2,Y 01988.    STA <Video_Upd_AddrL  01989.    LDA Video_Upd_Table2+1,Y 01990.    STA <Video_Upd_AddrH  01991.  01992.    JSR Video_Misc_Updates2 ; Load those graphics! 01993.  01994.    DEC <Title_EventGrafX ; Title_EventGrafX-- 01995.  01996.    LDA <Title_EventGrafX 01997.    CMP #$06  01998.    BGE PRG024_AB04 ; If Title_EventGrafX >= 6, loop! 01999.  02000.    LDA #%00011000 02001.    STA <PPU_CTL2_Copy ; Show BG + sprites 02002.  02003.    LDA #$02  02004.    STA <Title_State ; Title_State = 2 (prep for 1P/2P menu) 02005.    RTS ; Return 02006.  02007.  02008. Title_MAS_DoNextEvent: 02009.    LDA #$00  02010.    STA <Title_MActScriptDirSet ; Clear Title_MActScriptDirSet  02011.    STA <Title_ObjMLQueue ; Clear Mario's action queue 02012.  02013.    LDY <Title_MActScriptPos ; Get current position in action script 02014.    LDA Title_MActionScript,Y ; Get byte from action script 02015.  02016.    CMP #$ff  02017.    BEQ Title_MAS_CmdFF ; If equal to $FF (set Title_EventIndex), jump to Title_MAS_CmdFF 02018.  02019.    CMP #$fe  02020.    BEQ Title_MAS_CmdFE ; If equal to $FE, jump to Title_MAS_CmdFE 02021.  02022.    ; Not $FF or $FE... 02023.  02024.    ; Otherwise, just a tick delay 02025.    STA <Title_MActScriptDelay ; Store into Title_MActScriptDelay 02026.    INY ; Y++ 02027.  02028.    LDA Title_MActionScript,Y ; Get next byte 02029.    STA <Title_MActScriptDirSet ; Store into Title_MActScriptDirSet 02030.    STA <Title_ObjMLQueue ; ... and into the Queue 02031.  02032.    ; Two bytes read, so Title_MActScriptPos += 2 02033.    INC <Title_MActScriptPos 02034.    INC <Title_MActScriptPos 02035.    RTS ; Return...! 02036.  02037. Title_MAS_CmdFF: 02038.    ; Action script command $FF (set Title_EventIndex)... 02039.  02040.    INY  02041.    LDA Title_MActionScript,Y ; Get next byte 02042.    STA <Title_EventIndex ; Store this into Title_EventIndex 02043.  02044.    ; Title_MActScriptPos += 2 02045.    INC <Title_MActScriptPos 02046.    INC <Title_MActScriptPos 02047.  02048.    LDA #$00 02049.    STA <Title_MActScriptDelay ; Title_MActScriptPos = 0 02050.  02051.    RTS ; Return 02052.  02053. Title_MAS_CmdFE: 02054.    ; Action script command $FE (increment Title_State, reset Title_MActScriptPos)... 02055.  02056.    INC <Title_State ; Next title state... 02057.  02058.    LDA #$00 02059.    STA <Title_MActScriptPos ; Set Title_MActScriptPos = 0 02060.  02061.    RTS ; Return 02062.  02063.  02064. Title_LAS_DoNextEvent: 02065.    LDA #$00 02066.    STA <Title_LActScriptDirSet ; Clear Title_LActScriptDirSet  02067.    STA <Title_ObjMLQueue+1 ; Clear Luigi's action queue 02068.  02069.    LDY <Title_LActScriptPos ; Get current position in action script 02070.    LDA Title_LActionScript,Y ; Get byte from action script 02071.  02072.    CMP #$ff 02073.    BEQ Title_LAS_CmdFF ; If equal to $FF (set Title_EventIndex), jump to Title_LAS_CmdFF 02074.  02075.     02076.    ; Otherwise, just a tick delay 02077.    STA <Title_LActScriptDelay ; Store into Title_LActScriptDelay 02078.    INY ; Y++ 02079.  02080.    LDA Title_LActionScript,Y ; Get next byte 02081.    STA <Title_LActScriptDirSet ; Store into Title_LActScriptDirSet 02082.    STA <Title_ObjMLQueue+1 ; ... and into the Queue 02083.  02084.    ; Two bytes read, so Title_LActScriptPos += 2 02085.    INC <Title_LActScriptPos 02086.    INC <Title_LActScriptPos 02087.    RTS ; Return...! 02088.  02089.  02090. Title_LAS_CmdFF: 02091.  02092.    ; Title_LActScriptPos = 0 02093.    LDA #$00 02094.    STA <Title_LActScriptPos 02095.  02096.    RTS ; Return 02097.  02098.     02099. Title_DoEvent: 02100.    LDA <Title_EventIndex ; Get Title_EventIndex 02101.    JSR DynJump ; Dynamically jump based on the value of Title_EventIndex... 02102.  02103.    ; THESE MUST FOLLOW DynJump FOR THE DYNAMIC JUMP TO WORK!! 02104.    .word Title_DoNothing ; 00 - Do nothing 02105.    .word Title_DoNothing ; 01 - Do nothing (never used I don't think!) 02106.    .word Title_LoadSMB3 ; 02 - Load title screen into the nametable 02107.    .word Title_Drop ; 03 - "Drops" the logo onto the screen 02108.    .word Title_LogoShakeUp ; 04 - Logo shake up 02109.    .word Title_LogoShakeDown ; 05 - Logo shake down, and check if we're done doing that 02110.    .word Title_InitObjects ; 06 - Prepare all title screen objects 02111.    .word Title_PalFadeIn ; 07 - Palette fade in 02112.    .word Title_DrawMenu ; 08 - Adds the 1P/2P select menu to the title screen 02113.    .word Title_DoNothing ; 09 - Do nothing, we're done! 02114.     02115. Title_DoNothing: 02116.    RTS  02117.  02118. ; Title_LoadSMB3 02119. ; 02120. ; This loads the title screen, specifically items $08 thru $23 of Video_Upd_Table2 02121. ; The title screen is too complex to be loaded in one shot, so it's done over 02122. ; several frames, in pieces 02123. Title_LoadSMB3: 02124.  02125.    ; Queue next item to load 02126.    LDA <Title_EventGrafX 02127.    STA Graphics_Queue  02128.  02129.    ; Increment Title_EventGrafX 02130.    INC <Title_EventGrafX  02131.  02132.     02133.    LDA <Title_EventGrafX  02134.    CMP #$23 02135.    BNE PRG024_ABAC ; If not at item $23 yet, keep going... 02136.  02137.    ; We're done, stop doing background event! 02138.    LDA #$00  02139.    STA <Title_EventIndex 02140.  02141. PRG024_ABAC: 02142.    RTS ; Return 02143.  02144.  02145. ; Title_Drop 02146. ; 02147. ; The logo comes falling down... 02148. Title_Drop: 02149.    LDY #$04 02150.  02151.    ; Basically drops logo 4 pixels at a time, with a precise safety catch! 02152. PRG024_ABAF: 02153.    DEC <Vert_Scroll 02154.    LDA <Vert_Scroll 02155.    BEQ PRG024_ABB9 ; If Vert_Scroll = 0, jump to PRG024_ABB9 02156.    DEY ; Y-- 02157.    BPL PRG024_ABAF ; If Y >= 0, loop! 02158.  02159.    RTS ; Return 02160.  02161. PRG024_ABB9: 02162.    ; The logo has landed! 02163.  02164.    LDA #$10  02165.    STA <Title_Ticker ; Title_Ticker = $10 02166.  02167.    INC <Title_EventIndex ; Perform next event... 02168.    RTS ; Return... 02169.  02170. ; Title_LogoShakeUp 02171. ; 02172. ; Shake the logo up, go to the next state 02173. Title_LogoShakeUp: 02174.  02175.    ; Subtract 2 from Vert_Scroll 02176.    LDA <Vert_Scroll 02177.    SUB #$02  02178.    STA <Vert_Scroll 02179.  02180.    INC <Title_EventIndex ; Shake down next 02181.    RTS ; Return! 02182.  02183. ; Title_LogoShakeDown 02184. ; 02185. ; Shake the logo down, go to the previous state,  02186. ; or see if we're done yet... 02187. Title_LogoShakeDown: 02188.  02189.    ; Add 2 to Vert_Scroll 02190.    LDA <Vert_Scroll 02191.    ADD #$02  02192.    STA <Vert_Scroll 02193.  02194.    DEC <Title_EventIndex ; Shake up next 02195.  02196.    DEC <Title_Ticker ; Title_Ticker-- 02197.    BPL PRG024_ABE3 ; If we're not done yet, jump to PRG024_ABE3 (no change, shake away) 02198.  02199.    ; Shaking is complete! 02200.    INC <Title_EventIndex 02201.    INC <Title_EventIndex ; Title_EventIndex += 2 (to make up for the decrement above), moving on to object init... 02202.  02203.    LDA #$03  02204.    STA <Title_EventGrafX ; Title_EventGrafX = 3 (to fade in the palette, starting with Video_Upd_Table2 item $03) 02205.  02206.    LDA #$02  02207.    STA <Title_Ticker ; Title_Ticker = 2 02208.  02209. PRG024_ABE3: 02210.    RTS ; Return 02211.  02212.  02213. ; Title_InitObjects 02214. ; 02215. ; Queues the title screen objects to prepare themselves for appearing 02216. Title_InitObjects: 02217.    DEC <Title_Ticker ; Title_Ticker-- 02218.    BPL PRG024_ABF6 ; If Title_Ticker >= 0, do nothing yet... 02219.  02220.    ; Preparing to initialize objects that fall in the beginning... 02221.    LDA #$00 02222.    STA <Title_ObjInitIdx ; Title_ObjInitIdx = 0 02223.  02224.    LDA #$01 02225.    STA <Title_ObjInitDly ; Title_ObjInitDly = 1 02226.  02227.    INC <Title_EventIndex ; On to the next event (the palette fade-in) 02228.  02229.    LDA #$16 02230.    STA <Title_Ticker ; Title_Ticker = 16 02231.  02232. PRG024_ABF6: 02233.    RTS ; Return 02234.  02235.  02236. ; Title_PalFadeIn 02237. ; 02238. ; Loads palette colors to produce a "fade in" effect,  02239. ; specifically items $03 thru $06 of Video_Upd_Table2 02240. Title_PalFadeIn: 02241.    DEC <Title_Ticker ; Title_Ticker-- 02242.    BPL PRG024_AC0F ; If Title_Ticker >= 0, do nothing yet... 02243.  02244.    LDA #$04 02245.    STA <Title_Ticker ; Title_Ticker = 4 02246.  02247.    LDA <Title_EventGrafX  02248.    STA <Graphics_Queue ; Graphics_Queue = Title_EventGrafX 02249.    CMP #$06  02250.    BNE PRG024_AC10 ; If not at item $06 yet, keep going... 02251.  02252.    ; Done with the fade in! 02253.    LDA #$00  02254.    STA <Title_EventIndex ; Stop doing anything 02255.  02256.    LDA #$01  02257.    STA <Title_3GlowFlag ; Title_3GlowFlag = 1 02258.  02259. PRG024_AC0F: 02260.    RTS ; Return 02261.  02262. PRG024_AC10: 02263.    INC <Title_EventGrafX ; Next palette fade 02264.    RTS ; Return  02265.  02266.  02267. ; Title_DrawMenu 02268. ; 02269. ; Loads in the tiles for the 1/2 PLAYER GAME and Nintendo copyright 02270. Title_DrawMenu: 02271.    LDA #$07 02272.    STA <Graphics_Queue 02273.    INC <Title_EventIndex ; Do next thing (which is actually nothing; on purpose??) 02274.    RTS ; Return... 02275.  02276. Title_PrepForMenu: 02277.  02278.    ; Clear objects 1-4 states 02279.    LDA #$00 02280.    STA <Title_ObjStates+1 02281.    STA <Title_ObjStates+2  02282.    STA <Title_ObjStates+3  02283.    STA <Title_ObjStates+4  02284.  02285.    ; Set object 0's state to 1 (this is the leader koopa, he starts first, brings in the next) 02286.    LDA #$01 02287.    STA <Title_ObjStates 02288.  02289.    ; This is the counter for when to reset the title sequence 02290.    LDA #20 02291.    STA <Title_ResetCnt ; Title_ResetCnt = 20 02292.  02293.    ; This is the "fine" part of the reset count; when it goes to zero, it decrements Title_ResetCnt 02294.    LDA #60 02295.    STA <Title_ResetCnt2 ; Title_ResetCnt2 = 60 02296.  02297.    INC <Title_State ; Next title state... 02298.    RTS ; Return 02299.  02300. Title_Menu_1P2PCursorY: 02301.    .byte 151, 167 ; Y position for the 1P/2P select cursor 02302.  02303. Title_Do1P2PMenu: 02304.    LDA <Controller2 02305.    AND #(PAD_A | PAD_B) 02306.    CMP #(PAD_A | PAD_B)  02307.    BNE PRG024_AC42 ; If Player 2 is not holding A+B, jump to PRG024_AC42 02308.  02309.    ; NOTE: This probably WAS the debug menu activation... 02310.    NOP 02311.    NOP 02312.    NOP 02313.    NOP 02314.    NOP 02315.  02316. PRG024_AC42: 02317.    ; Title_ResetCnt and Title_ResetCnt2 gang together to form a large countdown timer 02318.  02319.    DEC <Title_ResetCnt2 ; Title_ResetCnt2-- 02320.    BNE PRG024_AC52 ; If <> 0, jump to PRG024_AC52 02321.  02322.    LDA #96 02323.    STA <Title_ResetCnt2 ; Title_ResetCnt2 = 96 02324.  02325.    DEC <Title_ResetCnt ; Title_ResetCnt-- 02326.    BNE PRG024_AC52 ; If <> 0, jump to PRG024_AC52 02327.  02328.    ; Title_ResetCnt and Title_ResetCnt2 have reached zero! 02329.    ; Trigger the reset! 02330.    LDA #$ff 02331.    STA <Title_ResetTrig ; Title_ResetTrig = $ff 02332.  02333. PRG024_AC52: 02334.    JSR Title_Menu_UpdateKoopas ; Update and draw koopas 02335.  02336.    LDA <Pad_Input  02337.    AND #PAD_SELECT 02338.    BEQ PRG024_AC6B ; If Player is not pressing SELECT, jump to PRG024_AC6B 02339.  02340.    LDA #SND_MAPPATHMOVE  02341.    STA Sound_QMap ; "Path move" sound (in this case, the "bleep" for the menu) 02342.  02343.    ; Basically makes sure that the value of Total_Players is 0 or 1  02344.    INC Total_Players 02345.    LDA Total_Players 02346.    AND #$01  02347.    STA Total_Players 02348.  02349. PRG024_AC6B: 02350.    LDY Total_Players ; Y = Total_Players (0 or 1) 02351.    LDA Title_Menu_1P2PCursorY,Y ; Get proper Y value for where cursor is at 02352.    STA Sprite_RAM+$F0 ; Store into sprite 02353.  02354.    LDA #$df  02355.    STA Sprite_RAM+$F1 ; Store pattern value into sprite 02356.  02357.    LDA #$00  02358.    STA Sprite_RAM+$F2 ; Store attribute value into sprite 02359.  02360.    LDA #72 02361.    STA Sprite_RAM+$F3 ; Store X value into sprite 02362.  02363.    JSR Title_3Glow ; Keep the big '3' glowing! 02364.  02365.    LDA <Pad_Input  02366.    AND #PAD_START 02367.    BEQ PRG024_ACBA ; If Player is not pressing START, jump to PRG024_ACBA (RTS) 02368.  02369.    LDA #SND_LEVELCOIN  02370.    STA Sound_QLevel1 ; Play coin sound (in this case, selected and begin!) 02371.  02372.    LDA Sprite_RAM+$F0 ; Get Y value of title screen cursor sprite 02373.    STA <Title_EventGrafX ; Reuse as a temp... 02374.  02375. PRG024_AC96: 02376.    JSR GraphicsBuf_Prep_And_WaitVSyn2 02377.  02378.    INC <Title_ResetCnt ; Title_ResetCnt++ 02379.  02380.    LDY #$f8 ; Y = $f8 (hide title screen cursor) 02381.  02382.    LDA <Title_ResetCnt 02383.    AND #$18  02384.    BEQ PRG024_ACA5 ; Periodically jump to PRG024_ACA5 02385.  02386.    LDY <Title_EventGrafX ; Y = reappear title screen cursor 02387.  02388. PRG024_ACA5: 02389.    STY Sprite_RAM+$F0 ; Set it! 02390.  02391.    JSR Title_3Glow ; Make the big '3' glow! 02392.  02393.    LDA SndCur_Level1 02394.    BNE PRG024_AC96 ; If the "gling" sound has not ended, loop! 02395.  02396.    INC <Title_State ; Title_State++ 02397.  02398.    ; World_Num = 0 (World 1) 02399.    LDA #$00 02400.    STA World_Num 02401.  02402.    ; Debug_Flag = 0 (no debug mode) 02403.    STA Debug_Flag 02404.  02405. PRG024_ACBA: 02406.    RTS ; Return 02407.  02408. Title_PrepForWorldMap: 02409.    LDA #$00 02410.    STA World_Map_Power ; Mario starts as small on world map 02411.    STA World_Map_Power+1 ; Luigi starts as small on world map 02412.    INC Total_Players ; Total_Players should be 1/2, not 0/1 02413.    INC <Title_State ; Next title state... 02414.    RTS ; Return 02415.  02416. Title_DebugMenu: 02417.    JSR Title_Menu_UpdateKoopas ; Update the koopas 02418.  02419.    LDA <Controller2 02420.    AND #$c1  02421.    CMP #$c1  02422.    BNE PRG024_ACD7 ; If Player 2 is NOT hitting A+B+Right (credits jump), jump to PRG024_ACD7 02423.  02424.    JMP Ending_Credits ; Jump to credits 02425.  02426. PRG024_ACD7: 02427.    LDA <Controller2 02428.    AND #$c4  02429.    CMP #$c4  02430.    BNE PRG024_ACE2 ; If Player 2 is NOT hitting A+B+Down (jump to Princess rescue), jump to PRG024_ACE2 02431.  02432.    JMP Rescue_Princess ; Jump to princess rescue 02433.  02434. PRG024_ACE2: 02435.    LDA <Pad_Input 02436.    AND #(PAD_UP | PAD_DOWN) 02437.    BEQ PRG024_ACFB ; If Player is not pressing Up or Down, jump to PRG024_ACFB 02438.  02439.    LSR A 02440.    LSR A 02441.    LSR A 02442.    TAX ; X = 0 (Down) or 1 (Up) 02443.  02444.    ; Properly add or subtract from world depending on direction pressed, 02445.    ; and loop around so it never leaves World 1 - 8 (0-7) 02446.    LDA World_Num_Debug 02447.    ADD Debug_DownUp,X 02448.    AND #$07  02449.    STA World_Num_Debug 02450.  02451.    JMP PRG024_AD9C ; Jump to PRG024_AD9C 02452.  02453. PRG024_ACFB: 02454.    LDA <Pad_Input  02455.    AND #PAD_SELECT 02456.    BEQ PRG024_AD0C ; If Player is not pressing SELECT, jump to PRG024_AD0C 02457.  02458.    ; Basically makes sure that the value of Total_Players is 0 or 1  02459.    INC Total_Players 02460.    LDA Total_Players 02461.    AND #$01  02462.    STA Total_Players 02463.  02464. PRG024_AD0C: 02465.    LDY Total_Players ; Y = Total_Players (0 or 1) 02466.    LDA Title_Menu_1P2PCursorY,Y ; Get proper Y value for where cursor is at 02467.    STA Sprite_RAM+$F0 ; Store into sprite 02468.  02469.    LDA #$df  02470.    STA Sprite_RAM+$F1 ; Store pattern value into sprite 02471.  02472.    LDA #$00  02473.    STA Sprite_RAM+$F2 ; Store attribute value into sprite 02474.  02475.    LDA #72 02476.    STA Sprite_RAM+$F3 ; Store X value into sprite 02477.  02478.    LDA <Pad_Input 02479.    AND #PAD_A 02480.    BEQ PRG024_AD54 ; If Player is not pressing A, jump to PRG024_AD54 02481.  02482.    LDA Player_Lives 02483.    CMP #99 02484.    BEQ PRG024_AD3A ; If Player_Lives = 99, jump to PRG024_AD3A 02485.  02486.    ; Otherwise, 5 more lives 02487.    LDA Player_Lives 02488.    ADD #$05  02489.    STA Player_Lives 02490.  02491. PRG024_AD3A: 02492.  02493.    ; Updates number of lives 02494.    LDA #$21  02495.    STA Graphics_Buffer 02496.    LDA #$14  02497.    STA Graphics_Buffer+1 ; VRAM Address $2114 02498.  02499.    LDA #$01  02500.    STA Graphics_Buffer+2 ; 1 byte 02501.  02502.    LDA Player_Lives  02503.    STA Graphics_Buffer+3 ; Number of lives direct 02504.  02505.    LDA #$00  02506.    STA Graphics_Buffer+4 ; Terminator 02507.  02508. PRG024_AD54: 02509.    LDA <Pad_Input  02510.    AND #PAD_START 02511.    BEQ PRG024_AD9C ; If Player is NOT pressing START, jump to PRG024_AD9C 02512.  02513.    LDA #$80  02514.    STA Debug_Flag ; Activate debug functions 02515.  02516.    LDA #$04 02517.    STA <Title_State ; Title_State = 4 (prep for world map) 02518.  02519.    ; Quick loop to set up Mario and Luigi with the lives start and world map power 02520.    LDX Total_Players ; X = Total_Players 02521.    LDY Player_Lives ; Y = Player_Lives 02522. PRG024_AD69: 02523.    TYA ; A = Player_Lives 02524.    STA Player_Lives,X ; Store to this player 02525.    LDA #$00  02526.    STA World_Map_Power,X ; This player starts small on world map 02527.    DEX ; X-- 02528.    BPL PRG024_AD69 ; While X >= 0, loop... 02529.  02530.    LDA World_Num_Debug 02531.    STA World_Num ; Transfer the selected world to the game's world variable 02532.  02533.    ; Fills entire inventory of Mario and Luigi with P-Wings first 02534.    LDX #$1b 02535.    LDA #$08  02536. PRG024_AD7F: 02537.    STA Inventory_Items,X  02538.    STA Inventory_Items2,X  02539.    DEX ; X-- 02540.    BPL PRG024_AD7F ; While X >= 0, loop... 02541.  02542.    ; Fill beginning of inventory with one of everything 02543.    LDX #$0d  02544.  02545.    ; Give second warp whistle 02546.    LDA #$0c 02547.    STA Inventory_Items,X 02548.    STA Inventory_Items2,X 02549. PRG024_AD92: 02550.    TXA 02551.    STA Inventory_Items-1,X 02552.    STA Inventory_Items2-1,X 02553.    DEX ; X-- 02554.    BNE PRG024_AD92 ; While X <> 0, loop! (Don't want 0 because of the "-1" indexing) 02555.  02556. PRG024_AD9C: 02557.  02558.    ; Draw the world select cursor 02559.    LDA World_Num_Debug 02560.    ASL A  02561.    ASL A  02562.    ASL A  02563.    ASL A  02564.    ADD #$30  02565.    STA Sprite_RAM+$50 02566.    LDA #$6f  02567.    STA Sprite_RAM+$51 02568.    LDA #$00  02569.    STA Sprite_RAM+$52 02570.    LDA #$20  02571.    STA Sprite_RAM+$53 02572.  02573.    RTS ; Return 02574.  02575.  02576. T_SP_Off .func \1-Title_SpritePattern ; "Title SpritePattern Offset" 02577.  02578.    ; Index into Title_SpritePattern for all of Mario/Luigi's complex frames 02579. Title_SpritePatternIndex: 02580.    .byte T_SP_Off(T_SP_00), T_SP_Off(T_SP_01), T_SP_Off(T_SP_02), T_SP_Off(T_SP_03) 02581.    .byte T_SP_Off(T_SP_04), T_SP_Off(T_SP_05), T_SP_Off(T_SP_06), T_SP_Off(T_SP_07) 02582.    .byte T_SP_Off(T_SP_08), T_SP_Off(T_SP_09), T_SP_Off(T_SP_0A), T_SP_Off(T_SP_0B) 02583.    .byte T_SP_Off(T_SP_0C), T_SP_Off(T_SP_0D), T_SP_Off(T_SP_0E), T_SP_Off(T_SP_0F) 02584.    .byte T_SP_Off(T_SP_10), T_SP_Off(T_SP_11), T_SP_Off(T_SP_12), T_SP_Off(T_SP_13) 02585.    .byte T_SP_Off(T_SP_14), T_SP_Off(T_SP_15), T_SP_Off(T_SP_16), T_SP_Off(T_SP_17) 02586.    .byte T_SP_Off(T_SP_18), T_SP_Off(T_SP_19), T_SP_Off(T_SP_1A), T_SP_Off(T_SP_1B) 02587.  02588.    ; Block of patterns, based on offsets from Title_SpritePatternIndex 02589.    ; For use with Mario/Luigi's sprites 02590. Title_SpritePattern: 02591. T_SP_00: .byte $01, $03, $F1, $05, $07, $F1 02592. T_SP_01: .byte $0B, $0D, $F1, $0F, $29, $F1 02593. T_SP_02: .byte $2D, $2F, $F1, $19, $1B, $F1 02594. T_SP_03: .byte $01, $03, $F1, $05, $07, $09 02595. T_SP_04: .byte $0B, $0D, $F1, $0F, $29, $2B 02596. T_SP_05: .byte $2D, $2F, $F1, $19, $1B, $1D 02597. T_SP_06: .byte $31, $33, $F1, $35, $37, $F1 02598. T_SP_07: .byte $31, $33, $F1, $35, $37, $39 02599. T_SP_08: .byte $01, $03, $F1, $05, $07, $39 02600. T_SP_09: .byte $01, $03, $F1, $05, $07, $3B 02601. T_SP_0A: .byte $25, $25, $F1, $27, $27, $F1 02602. T_SP_0B: .byte $31, $33, $F1, $35, $37, $F1 02603. T_SP_0C: .byte $29, $2B, $F1, $2D, $2F, $F1 02604. T_SP_0D: .byte $27, $19, $F1, $1D, $1F, $F1 02605. T_SP_0E: .byte $01, $03, $F1, $05, $07, $09 02606. T_SP_0F: .byte $01, $03, $F1, $0B, $0D, $0F 02607. T_SP_10: .byte $01, $03, $F1, $21, $23, $25 02608. T_SP_11: .byte $F1, $F1, $F1, $05, $07, $F1 02609. T_SP_12: .byte $F1, $F1, $F1, $01, $03, $F1 02610. T_SP_13: .byte $F1, $F1, $F1, $21, $23, $F1 02611. T_SP_14: .byte $19, $1B, $F1, $1D, $21, $F1 02612. T_SP_15: .byte $19, $1B, $F1, $1D, $21, $23 02613. T_SP_16: .byte $01, $03, $05, $07, $09, $0B 02614. T_SP_17: .byte $0D, $0F, $F1, $11, $13, $F1 02615. T_SP_18: .byte $F1, $F1, $F1, $F1, $F1, $F1 02616. T_SP_19: .byte $25, $27, $F1, $29, $2B, $F1 02617. T_SP_1A: .byte $2D, $2F, $F1, $19, $1B, $F1 02618. T_SP_1B: .byte $31, $33, $F1, $35, $37, $F1 02619.  02620.    ; Specify proper VROM page for Title_ObjMLSprite sprite index 02621. Title_SpriteVROMPage: 02622.    .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $45 02623.    .byte $02, $02, $02, $02, $02, $03, $03, $03, $03, $03, $7F, $7F, $00, $13, $13, $13 02624.  02625.  02626.    ; Walking animation sprite frames 02627.    ; Values per frame (0 - 3, +4 for each power level they are) 02628. Title_ObjMLWalkSprite: 02629.    .byte $11, $12, $11, $12 ; Small  02630.    .byte $00, $01, $02, $01 ; Big 02631.    .byte $03, $04, $05, $04 ; Leaf Raccoon 02632.    .byte $1A, $1B, $1A, $1B ; The Princess 02633.  02634.    ; Duck sprite frames 02635. Title_ObjMLDuckSprite: 02636.    .byte $12 ; Small (no duck sprite) 02637.    .byte $06 ; Big 02638.    .byte $07 ; Leaf Raccoon 02639.  02640.    ; Skid sprite frames 02641. Title_ObjMLSkidSprite: 02642.    .byte $13 ; Small 02643.    .byte $0C ; Big / Leaf Raccoon 02644.  02645.    ; Leaf raccoon tail wag animation sprite frames 02646. Title_ObjMLTailWagSprite: 02647.    .byte $09, $03, $08 02648.  02649.    ; Carrying item while walking 02650. Title_ObjMLCarrySprite: 02651.    .byte $0E, $0F, $10, $0E 02652.  02653.    ; Powering down (shrinking) animation 02654. Title_ObjMarioPowerDown: 02655.    .byte $11, $0B, $11, $0B, $11, $0B, $02, $0B, $02, $0B, $02, $0B 02656.  02657.    ; Initial X positions of Mario and Luigi 02658. Title_ObjInitX: 02659.    .byte $F0, $00 02660.  02661.    ; Initial sprite flags of Mario and Luigi 02662. Title_ObjInitFlags: 02663.    .byte $00, SPR_HFLIP 02664.  02665.  02666. ; Title_UpdateAllObjs 02667. ;  02668. ; This routine updates ALL of the objects on the title screen; Mario and Luigi 02669. ; and the assorted other things that appear on there. Handles all of the 02670. ; related logic as well. Pretty much the driving force of all the action! 02671. ; 02672. ; ... except for the final koopa troopas who march across, they're a 02673. ; different bit of code... 02674. Title_UpdateAllObjs: 02675.    JSR PRG024_SpriteClear ; Clear all sprites 02676.  02677.    ; The first byte of Title_MLAccelCnt constantly subtracts $90, discarding any of the low 4 bits 02678.    ; This provides a slow, semi-natural acceleration for the Bros on the title screen 02679.    LDA Title_MLAccelCnt 02680.    AND #$f0  02681.    SUB #$90  02682.    STA Title_MLAccelCnt 02683.  02684.    LDA #$10  02685.    STA <Title_ObjMLSprRAMOff ; Mario's sprite RAM starts at Sprite_RAM + $10 02686.  02687.    LDA #$28  02688.    STA <Title_ObjMLSprRAMOff+1 ; Luigi's sprite RAM starts at Sprite_RAM + $28 02689.  02690.    LDX #$01 02691.  02692. PRG024_AEDD: 02693.    STX <Title_CurMLIndex ; Store current index 02694.  02695.    LDA <Title_ObjMLStop 02696.    BEQ PRG024_AF0C ; If Title_ObjMLStop = 0, jump to PRG024_AF0C 02697.  02698.    LDA #$08  02699.  02700.    LDY Title_MLHoldTick 02701.    BEQ PRG024_AEEF ; If Title_MLHoldTick = 0, jump to PRG024_AEEF 02702.  02703.    DEC Title_MLHoldTick ; Otherwise, decrement Title_MLHoldTick 02704.  02705.    ; Initialize Mario and Luigi title screen objects! 02706.  02707.    LDA #$00 02708. PRG024_AEEF: 02709.    ; Set the initial X velocity (zero) 02710.    STA <Title_ObjXVel,X  02711.  02712.    ; Set the initial X coordinates 02713.    LDA Title_ObjInitX,X  02714.    STA <Title_ObjX,X  02715.  02716.    ; Set the initial Y coordinate (160) 02717.    LDA #160 02718.    STA <Title_ObjY,X 02719.  02720.    ; Set the initial flags 02721.    LDA Title_ObjInitFlags,X 02722.    STA <Title_ObjMLFlags,X  02723.  02724.    JSR Title_AnimateMarioLuigi ; Animate Mario/Luigi 02725.    JSR Title_DrawMarioLuigi ; Draw Mario/Luigi 02726.   02727.    LDA #$00  02728.    STA <Title_ObjXVel,X ; Zero Mario/Luigi's X velocity 02729.    JMP PRG024_AF3D ; Jump to PRG024_AF3D 02730.  02731. PRG024_AF0C: 02732.    ; When Title_ObjMLStop = 0... 02733.  02734.    JSR Title_MLXAccel ; Update and apply X velocities of Mario/Luigi 02735.    JSR Title_ML_DoGravity ; Update and apply Y velocities of Mario/Luigi 02736.    JSR Title_AnimateMarioLuigi ; Animate Mario/Luigi 02737.    JSR Title_MLDetermineSpriteVis ; Determine what "slivers" of Mario/Luigi sprites are visible 02738.    JSR Title_MarioDoPoof ; Update and draw the "poof" 02739.  02740.    LDA Title_MarioPoof 02741.    BNE PRG024_AF23 ; If Mario is doing the "powerup poof", jump to PRG024_AF23 02742.  02743.    ; Otherwise, draw Mario and Luigi in the standard way! 02744.    JSR Title_DrawMarioLuigi 02745.  02746. PRG024_AF23: 02747.    LDA <Title_XPosHi,X  02748.    BEQ PRG024_AF3D ; If the "high" component of the X position is zero, jump to PRG024_AF3D 02749.    BPL PRG024_AF33 ; If it is greater than zero, jump to PRG024_AF33 02750.  02751.    ; The XHi is less than zero... 02752.  02753.    LDA <Title_ObjX,X ; Get the X coordinate 02754.    CMP #-64 02755.    BGE PRG024_AF3D ; If the X coordinate is >= -64, jump to PRG024_AF3D 02756.  02757.    ; Don't let the X coordinate go below -64 02758.    LDA #$c0 02759.    BNE PRG024_AF3B ; Jump (technically always) to PRG024_AF3B 02760.  02761. PRG024_AF33: 02762.  02763.    ; The XHi is greater than zero... 02764.  02765.    LDA <Title_ObjX,X 02766.    CMP #64 02767.    BLT PRG024_AF3D ; If the X coordinate is less than 64, jump to PRG024_AF3D 02768.  02769.    ; Don't let the X coordinate go above 64 off the right side of the screen 02770.    LDA #63 02771.  02772. PRG024_AF3B: 02773.    STA <Title_ObjX,X ; Update the X coordinate 02774.  02775. PRG024_AF3D: 02776.    DEX ; X-- (Process Mario after Luigi) 02777.    BPL PRG024_AEDD ; If X >= 0, loop! 02778.  02779.  02780.    ; Done processing Mario and Luigi 02781.  02782.    JSR Title_UpdateOtherObjs ; Update the "other", minor objects! 02783.  02784.    RTS ; Return 02785.  02786.  02787.    ; Quick and dirty sprite RAM "clear" function (pushes the Y component out of visible range) 02788. PRG024_SpriteClear: 02789.    LDY #$1c 02790.    LDA #$f8 02791.  02792. PRG024_AF48: 02793.    STA Sprite_RAM,Y 02794.    STA Sprite_RAM+$20,Y 02795.    STA Sprite_RAM+$40,Y 02796.    STA Sprite_RAM+$60,Y 02797.    STA Sprite_RAM+$80,Y 02798.    STA Sprite_RAM+$A0,Y 02799.    STA Sprite_RAM+$C0,Y 02800.    STA Sprite_RAM+$E0,Y 02801.    DEY  02802.    DEY  02803.    DEY  02804.    DEY  02805.    BPL PRG024_AF48 02806.  02807.    RTS ; Return 02808.     02809. PRG024_AF67: 02810.    .byte -1, 0, 1 02811.  02812.    ; Values added to Title_MLAccelCnt 02813. Title_MLAccelFactors: 02814.    .byte $60, $E0, $70 ; $E0 is most common, directly affects their ability to accelerate 02815.  02816. ; Title_MLXAccel 02817. ; 02818. ; Figures out Mario/Luigi's X acceleration and applies it 02819. Title_MLXAccel: 02820.    ; X is 0/1, Mario/Luigi 02821.  02822.    LDY #$02 ; Y = 2 02823.    LDA <Title_ObjXVel,X ; Get Mario/Luigi's X velocity 02824.    BPL PRG024_AF7A ; If velocity is >= 0, jump to PRG024_AF7A 02825.  02826.    ; Otherwise, negate it (get the absolute value) 02827.    NEG 02828.  02829.    LDY #$01 ; Also, Y = 1 02830.  02831. PRG024_AF7A: 02832.    BNE PRG024_AF7D ; If velocity is non-zero, jump to PRG024_AF7D 02833.  02834.    ; X velocity is zero 02835.    TAY ; Y = A (which is zero) 02836.  02837. PRG024_AF7D: 02838.    ; At this point, Y is a standard direction value -- 0 = Not moving, 1 = Leftward, 2 = Rightward 02839.  02840.    STA <Temp_Var15 ; Store velocity into Temp_Var15 02841.    STY <Title_ObjMLMoveDir,X ; Store movement direction into Title_ObjMLMoveDir 02842.  02843.    LDY #$18 ; Y = $18 02844.    LDA <Title_ObjMLDir,X ; Get the direction vector value 02845.    AND #$40 ; Check bit 6 (FIXME??) 02846.    BEQ PRG024_AF8B ; If not set, jump to PRG024_AF8B 02847.  02848.    LDY #$28 ; Y = $28 02849.  02850. PRG024_AF8B: 02851.    STY <Temp_Var14 ; Store Y -> Temp_Var14 02852.  02853.    LDY #$00 ; Y = 0 02854.    LDA <Title_ObjMLDir,X ; Get direction vector 02855.    AND #$03 ; Check for bit 0 or 1 (left/right) 02856.    BNE PRG024_AFA1 ; If either is set, jump to PRG024_AFA1 02857.  02858.    ; Neither left nor right bits are set in vector 02859.    LDA <Title_ObjYVelChng,X ; Get Y velocity change 02860.    BNE PRG024_AFE9 ; If there's been a Y change, jump to PRG024_AFE9 02861.  02862.    LDA <Title_ObjXVel,X ; Get the X velocity 02863.    BEQ PRG024_AFE9 ; If zero, jump to PRG024_AFE9 02864.    BMI PRG024_AFBB ; If < 0, jump to PRG024_AFBB 02865.    BPL PRG024_AFD3 ; If > 0, jump to PRG024_AFD3 02866.  02867. PRG024_AFA1: 02868.    INY 02869.    INY ; Y += 2 (Y = 2) 02870.  02871.    AND <Title_ObjMLMoveDir,X ; Check if movement direction's corresponding bit is set in the Title_ObjMLDir direction vector 02872.    BNE PRG024_AFB5 ; If it is, jump to PRG024_AFB5 02873.  02874.    DEY ; Y-- (Y = 1) 02875.  02876.    LDA <Temp_Var15 ; Get velocity 02877.    CMP <Temp_Var14  02878.    BEQ PRG024_AFE9 ; If velocity equals key value ($18 or $28), jump to PRG024_AFE9 02879.    BLS PRG024_AFB5 ; If less, jump to PRG024_AFB5 02880.  02881.    LDA <Title_ObjYVelChng,X 02882.    BNE PRG024_AFE9 ; If there's a Y velocity change, jump to PRG024_AFE9 02883.  02884.    DEY ; Otherwise, Y-- (Y = 0) 02885.  02886. PRG024_AFB5: 02887.    LDA <Title_ObjMLDir,X 02888.    AND #$01  02889.    BNE PRG024_AFD3 ; If bit 1 (left) is set in the direction vector, jump to PRG024_AFD3 02890.  02891. PRG024_AFBB: 02892.    LDA #$00  02893.    SUB Title_MLAccelFactors,Y ; A = -Title_MLAccelFactors[Y] (negates values compared to the routine at PRG024_AFD3) 02894.    STA <Temp_Var1 ; Store into Temp_Var1 02895.  02896.    LDA PRG024_AF67,Y ;  02897.    EOR #$ff ; A = PRG024_AF67[Y] ^ $FF  02898.    STA <Temp_Var2 ; Store into Temp_Var2 02899.  02900.    LDA <Temp_Var1  02901.    BNE PRG024_AFDD ; If Temp_Var1 is non-zero, jump to PRG024_AFDD (never false??) 02902.  02903.    ; NOTE: I don't think the following two lines of code can ever be reached 02904.    INC <Temp_Var2 ; Temp_Var2++ 02905.    JMP PRG024_AFDD ; Jump to PRG024_AFDD 02906.  02907. PRG024_AFD3: 02908.    LDA Title_MLAccelFactors,Y ; A = Title_MLAccelFactors[Y] 02909.    STA <Temp_Var1 ; Store into Temp_Var1 02910.  02911.    LDA PRG024_AF67,Y ; A = PRG024_AF67[Y] 02912.    STA <Temp_Var2 ; Store into Temp_Var2 02913.  02914. PRG024_AFDD: 02915.  02916.    ; High-precision adding here... 02917.    LDA <Temp_Var1  02918.    ADD Title_MLAccelCnt ; Title_MLAccelCnt += Temp_Var1 02919.  02920.    LDA <Title_ObjXVel,X ; Get X velocity 02921.    ADC <Temp_Var2 ; Add Temp_Var2, including carry from above operation 02922.    STA <Title_ObjXVel,X ; Store result back... 02923.  02924. PRG024_AFE9: 02925.    JSR Title_AddVel_toPos ; Apply the X velocity 02926.    RTS ; Return... 02927.  02928.    .byte $D0, $CE, $CC, $CA, $CA, $CA 02929.  02930. PRG024_AFF3: .byte $C8 ; Just a constant (base Y velocity for the queue function) 02931. PRG024_AFF4: .byte $00, $02, $04, $08 ; Loaded by X velocity "whole" part (reduction in that Y velocity based on X speed) 02932.  02933.  02934.  02935. ; Title_ML_DoGravity 02936. ; 02937. ; Handles applying appropriate "fall" rates and the Y velocity of Mario/Luigi 02938. ; Also processes queue event $80 02939. Title_ML_DoGravity: 02940.  02941.    LDA <Title_ObjMLQueue,X  02942.    AND #$80  02943.    STA <Temp_Var1 ; Temp_Var1 = Title_ObjMLQueue & $80 02944.    BEQ PRG024_B023 ; If bit 7 not set, jump to PRG024_B023 02945.  02946.    ; Begin queue event $80 02947.  02948.    LDA <Title_ObjYVelChng,X 02949.    BNE PRG024_B023 ; If there's a Y velocity change, jump to PRG024_B023 02950.  02951.    LDA <Title_ObjXVel,X ; Get X velocity -> A 02952.    BPL PRG024_B00D ; If >= 0, jump to PRG024_B00D 02953.  02954.    ; Otherwise, negate it! (Get absolute value) 02955.    NEG 02956.  02957. PRG024_B00D: 02958.    LSR A 02959.    LSR A 02960.    LSR A 02961.    LSR A  02962.    TAY ; Y = X velocity >> 4 (the upper "whole" part of this 4.4FP number) 02963.    LDA PRG024_AFF3 ; A = $C8 (unnecessary constant memory load?) 02964.    SUB PRG024_AFF4,Y ; Variable subtracted value (faster the X velocity is, the less of a Y velocity we end up with) 02965.    STA <Title_ObjYVel,X ; Store result as Y velocity 02966.  02967.    LDA #$01  02968.    STA <Title_ObjYVelChng,X ; Indicate a Y velocity change 02969.    LDA #$00 02970.    STA <Title_ObjMLTailTick,X ; Zero out the tail wagging 02971.  02972.    ; End of queue event $80 02973.  02974.  02975. PRG024_B023: 02976.    LDA <Title_ObjYVelChng,X 02977.    BEQ PRG024_B053 ; If no Y velocity change, jump to PRG024_B053 02978.  02979.    LDY #FALL_NORMAL ; Y = FALL_NORMAL (normal falling rate) 02980.  02981.    LDA <Title_ObjYVel,X ; Get the Y velocity 02982.    CMP #-32  02983.    BGS PRG024_B037 ; If Y velocity >= -32, jump to PRG024_B037 02984.  02985.    LDA <Title_ObjMLDir,X ; Get the direction vector 02986.    AND #$80  02987.    BEQ PRG024_B037 ; If bit 7 (tail wagging) is not set, jump to PRG024_B037 02988.  02989.    LDY #FALL_TAILWAG ; Y = FALL_TAILWAG (slower falling rate when wagging raccoon tail) 02990.  02991. PRG024_B037: 02992.    TYA ; A = Y (1 or 5) 02993.    ADD <Title_ObjYVel,X  02994.    STA <Title_ObjYVel,X ; Title_ObjYVel += Y (1 or 5) 02995.  02996.    LDA <Title_ObjMLPower,X  02997.    CMP #$02  02998.    BNE PRG024_B053 ; If Mario/Luigi's power level is not 2 (leaf raccoon), jump to PRG024_B053 02999.  03000.    ; Leaf raccoon only... 03001.    LDA <Title_ObjMLDir,X 03002.    AND #$80  03003.    BEQ PRG024_B053 ; If direction vector bit 7 is not set, jump to PRG024_B053 03004.  03005.    LDA <Title_ObjYVel,X  03006.    CMP #FALLRATE_TAILWAGMAX  03007.    BLS PRG024_B053 ; If Y velocity < FALLRATE_TAILWAGMAX, jump to PRG024_B053 03008.  03009.    ; Prevent Y velocity from being any greater than FALLRATE_TAILWAGMAX 03010.    ; Allows tail wagging to not affect when moving upward 03011.    LDA #FALLRATE_TAILWAGMAX 03012.    STA <Title_ObjYVel,X 03013.  03014. PRG024_B053: 03015.    JSR Title_MLYAccel ; Apply Y velocity 03016.  03017.    LDA <Title_YPosHi,X ; Get the most significant byte of the Y position 03018.    BEQ PRG024_B060 ; If = 0, jump to PRG024_B060 03019.  03020.    ; Otherwise, forces Y velocity to $20 (?) 03021.    LDA #$20  03022.    STA <Title_ObjYVel,X 03023.    BNE PRG024_B070 ; Jump (technically always) to PRG024_B070 (RTS) 03024.  03025. PRG024_B060: 03026.    LDA <Title_ObjY,X 03027.    CMP #160 03028.    BLT PRG024_B070 ; If Object Y is less than 160, jump to PRG024_B070 (RTS) 03029.  03030.    ; This prevents the objects from falling beneath the 160 line on the title screen (pseudo-detection of "solid" floor) 03031.    LDA #160 03032.    STA <Title_ObjY,X ; Prevent object Y from being >= 160 03033.  03034.    ; Zero out the Y velocity and change 03035.    LDA #$00  03036.    STA <Title_ObjYVelChng,X 03037.    STA <Title_ObjYVel,X  03038.  03039. PRG024_B070: 03040.    RTS ; Return 03041.  03042.  03043. ; Title_AddVel_toPos 03044. ; 03045. ; This adds the X or Y velocity to an extended precision X or Y position storage 03046. ; to enable the velocity to operate as a 4.4 fixed point value, with 03047. ; a 20.4 bit X position coordinate... 03048. Title_AddVel_toPos: 03049.    ; X is 0-7, objects X velocity 03050.    ; X is 8-15, objects Y velocity 03051.  03052.    ; Going to perform a faux 16-bit shift 4 bits to the left on the X velocity 03053.  03054.    LDA <Title_ObjXVel,X ; Get velocity of Mario/Luigi 03055.    PHA ; Save it 03056.  03057.    ; Produce the lower half 03058.    ASL A 03059.    ASL A 03060.    ASL A 03061.    ASL A 03062.    STA <Temp_Var12 ; Temp_Var12 = velocity << 4 (multiplied by 16) 03063.  03064.    LDY #$00 ; Y = 0 03065.    PLA ; Restore A (as velocity) 03066.  03067.    ; Produce the upper half 03068.    LSR A 03069.    LSR A 03070.    LSR A 03071.    LSR A 03072.    CMP #$08  03073.    BLT PRG024_B088 ; If (velocity >> 4) < 8, jump to PRG024_B088 (detects a negative source value, because there's on ASR type instruction) 03074.  03075.    ; (velocity >> 4) >= 8 ... (velocity is negative) 03076.    DEY ; Y-- (Y = -1) 03077.    ORA #$f0 ; Simulates carrying the negative sign bit across the value, like an ASR instruction would 03078.  03079. PRG024_B088:  03080.    STA <Temp_Var11 ; Store resultant value into Temp_Var11 03081.  03082.    ; Register 'Y' also contains an additional level of high bits  03083.    ; (i.e. is zero if this is positive, $FF if negative, carrying the sign across) 03084.    STY <Temp_Var13 ; Y -> Temp_Var13 03085.  03086.    ; So essentially what happened at this point is that the X velocity 03087.    ; has become a 24-bit value, shifted up 4 bits from its original 03088.    ; [Temp_Var13][Temp_Var11][Temp_Var12] = XVel << 4 03089.  03090.    ; Title_XPosFrac works as an fractional accumulator 03091.    LDA <Title_XPosFrac,X 03092.    ADD <Temp_Var12 03093.    STA <Title_XPosFrac,X ; Title_XPosFrac += Temp_Var12 03094.  03095.    ; ... which, as it overflows, provides a carry into the "whole" part 03096.    LDA <Title_ObjX,X 03097.    ADC <Temp_Var11  03098.    STA <Title_ObjX,X ; Title_ObjX += Temp_Var11 + Carry 03099.  03100.    ; ... and if that overflows, the carry goes into the "high" part... 03101.    LDA <Title_XPosHi,X  03102.    ADC <Temp_Var13  03103.    STA <Title_XPosHi,X ; Further precision of the X position stored here 03104.  03105.    RTS ; Return... 03106.  03107.  03108. ; Title_MLYAccel 03109. ; 03110. ; Figures out Mario/Luigi's Y acceleration and applies it (including "gravity", and max fall rate) 03111. Title_MLYAccel: 03112.    LDA <Title_ObjYVel,X 03113.    BMI Title_ApplyYVel ; If Y velocity is negative, jump to Title_ApplyYVel 03114.  03115.    CMP #FALLRATE_MAX 03116.    BLS Title_ApplyYVel ; If Y velocity is less than FALLRATE_MAX, jump to Title_ApplyYVel 03117.  03118.    ; Prevent Y velocity from being greater than FALLRATE_MAX 03119.    ; This defines the maximum fall speed! 03120.    LDA #FALLRATE_MAX  03121.    STA <Title_ObjYVel,X 03122.  03123. Title_ApplyYVel: 03124.  03125.    ; NOTE: The "minor" objects also use code starting HERE (they have different fall/max rates) 03126.  03127.    TXA ; X (object index) -> A 03128.    PHA ; Save A 03129.  03130.    ; The index gets an offset added to it; this allows reuse of the velocity 03131.    ; precision adding function as X or Y velocity... relies on all pertinent values 03132.    ; to be exactly the same bytes apart... 03133.    ADD #(Title_ObjYVel - Title_ObjXVel) 03134.    TAX ; X = (object index) + 8 03135.  03136.    JSR Title_AddVel_toPos ; Apply Y velocity 03137.  03138.    PLA ; Restore A 03139.    TAX ; Restore X back to the index value 03140.  03141.    RTS ; Return 03142.  03143. PRG024_B0B8: 03144.    .byte $07, $06, $05, $04, $03, $02, $01, $01, $01 03145.  03146. ; Title_AnimateMarioLuigi 03147. ; 03148. ; This lengthy routine is what translates movement hints and velocities 03149. ; into animations for our favorite little plumbers... 03150. Title_AnimateMarioLuigi: 03151.    ; Input object is assumed to be 0 (Mario) or 1 (Luigi) 03152.  03153.    ; Absolute value of this object's X velocity 03154.    LDA <Title_ObjXVel,X 03155.    BPL PRG024_B0CA ; If X velocity is positive, jump to PRG024_B0CA 03156.  03157.    ; Otherwise, negate it 03158.    NEG 03159. PRG024_B0CA: 03160.  03161.    ; Shift velocity down 3 times (divide by 8) 03162.    LSR A 03163.    LSR A 03164.    LSR A 03165.    TAY ; Y = X vel absolute magnitude / 8 03166.  03167.    ; Animation speed will change based on the velocity 03168.    INC <Title_ObjMLDirTicks,X ; Increment animation ticks 03169.    LDA <Title_ObjMLDirTicks,X ; Get it -> A 03170.    CMP PRG024_B0B8,Y ; Compare it against the value in Y 03171.    BMI PRG024_B0E7 ; If it hasn't overflowed yet, jump down to PRG024_B0E7 03172.  03173.    ; Animation ticks meet or exceed the value in Y! 03174.  03175.    LDA #$00 03176.    STA <Title_ObjMLDirTicks,X ; Reset the ticks 03177.  03178.    INC <Title_ObjMLAnimFrame,X ; Increment the frame 03179.  03180.    ; Cap the frame 0-3 03181.    LDA <Title_ObjMLAnimFrame,X 03182.    CMP #$04  03183.    BMI PRG024_B0E7  03184.    LDA #$00  03185.    STA <Title_ObjMLAnimFrame,X 03186.  03187. PRG024_B0E7: 03188.    LDA <Title_ObjMLDir,X 03189.    AND #$03  03190.    BNE PRG024_B0F5 ; If Mario/Luigi is moving left or right, jump to PRG024_B0F5 03191.  03192.    LDA <Title_ObjXVel,X 03193.    BNE PRG024_B0F5 ; If X velocity <> 0, jump to PRG024_B0F5 03194.  03195.    ; If Title_ObjMLDir & 3 = 0 and x velocity = 0, force frame to 2 (standing) 03196.    LDA #$02 03197.    STA <Title_ObjMLAnimFrame,X  03198.  03199. PRG024_B0F5: 03200.  03201.    ; Store flags value into Temp_Var1 03202.    LDA <Title_ObjMLFlags,X 03203.    STA <Temp_Var1 03204.  03205.    LDA <Title_ObjMLDir,X 03206.    AND #$03 03207.    BEQ PRG024_B109 03208.  03209.    ; If animation is 1, 2, or 3... 03210.    LDY #$00  03211.    AND #$02  03212.    BNE PRG024_B107 ; If it's specifically 2, jump to PRG024_B107 03213.  03214.    LDY #SPR_HFLIP ; Otherwise, Y = SPR_HFLIP 03215.  03216. PRG024_B107: 03217.    STY <Title_ObjMLFlags,X ; Update flags value 03218.  03219. PRG024_B109: 03220.    LDA <Title_ObjMLFlags,X  03221.    EOR <Temp_Var1  03222.    STA <Temp_Var1 ; Store only the difference in flags -> Temp_Var1 03223.  03224.    ; Mario/Luigi's current power offsets their default frame value (+4 for each power level) 03225.    LDA <Title_ObjMLPower,X 03226.    ASL A  03227.    ASL A  03228.    ORA <Title_ObjMLAnimFrame,X 03229.  03230.    TAY ; frame -> Y 03231.    LDA Title_ObjMLWalkSprite,Y ; Get the proper sprite frame (actual system sprite drawer) 03232.    STA <Title_ObjMLSprite,X ; Make this the next sprite to display 03233.  03234.    LDA <Title_ObjXVel,X  03235.    ADD #$01  03236.    CMP #$03  03237.    BLT PRG024_B135 ; If X Vel + 1 < 3, jump to PRG024_B135 03238.  03239.    ; If the directions conflict, do skid 03240.    LDA <Title_ObjMLMoveDir,X 03241.    AND <Title_ObjMLDir,X  03242.    BEQ PRG024_B135 ; If Title_ObjMLMoveDir & Title_ObjMLDir = 0 (moving one way, facing the other), jump to PRG024_B135 (no skid) 03243.  03244.    ; Use the skid frame! 03245.    LDY <Title_ObjMLPower,X ; Y = power level 03246.    BEQ PRG024_B130 ; If Title_ObjMLPower = 0 (small), jump to PRG024_B130 03247.    LDY #$01 ; Otherwise, Y = 1 (same skid for Big or Leaf Raccoon) 03248. PRG024_B130: 03249.    LDA Title_ObjMLSkidSprite,Y ; Get the skid sprite 03250.    STA <Title_ObjMLSprite,X ; Make this the next sprite to display 03251.  03252. PRG024_B135: 03253.  03254.    LDA <Title_ObjMLDir,X 03255.    AND #$04  03256.    BEQ PRG024_B156 ; If the direction is not downward, jump to PRG024_B156 03257.  03258.    ; Direction downward, i.e. need to duck!Title_DrawMarioLuigi 03259.    LDY <Title_ObjMLPower,X  03260.    LDA Title_ObjMLDuckSprite,Y ; Get appropriate sprite by power level 03261.    STA <Title_ObjMLSprite,X ; Make this the next sprite to display 03262.  03263.    LDA <Title_ObjMLQueue,X 03264.    AND #$04  03265.    BEQ PRG024_B156 ; If not time for Luigi's rebound off Mario, jump to PRG024_B156 03266.  03267.    ; This does Luigi's rebound off Mario 03268.  03269.    ; In short, Y is 0 if Luigi, 1 if Mario (opposite the usual order) 03270.    LDY #$00 ; Y = 0 03271.    TXA ; A = X (player index, 0/1) 03272.    BNE PRG024_B14E ; If player index is not zero, jump to PRG024_B14E 03273.    INY ; Otherwise increment Y 03274. PRG024_B14E: 03275.  03276.    LDA #-96 ; Luigi's bounce velocity 03277.    STA Title_ObjYVelChng,Y ; Store the change in velocity 03278.    STA Title_ObjYVel,Y ; And set the velocity 03279.  03280. PRG024_B156: 03281.    LDA <Title_ObjMLDir,X  03282.    AND #$08  03283.    BEQ PRG024_B160 ; If the direction is not upward, jump to PRG024_B160 03284.  03285.    ; Direction upward, look upward 03286.    LDA #$17 ; The "looking upward" sprite 03287.    STA <Title_ObjMLSprite,X ; Make this the next sprite to display 03288.  03289. PRG024_B160: 03290.    LDA <Title_ObjYVelChng,X 03291.    BEQ PRG024_B19A ; If no change in Y velocity, jump to PRG024_B19A 03292.    LDA <Title_ObjMLPower,X  03293.    BEQ PRG024_B19A ; If power level = 0 (small), jump to PRG024_B19A 03294.  03295.    CMP #$02 03296.    BNE PRG024_B190 ; If not leaf raccoon, jump to PRG024_B190 03297.  03298.    ; Leaf raccoon with change in Y velocity... 03299.  03300.    LDA #$15 ; Sprite to display (fist pump upward, leaf raccoon version) 03301.  03302.    LDY <Title_ObjYVel,X 03303.    BMI PRG024_B198 ; If Y velocity is negative, jump to PRG024_B198 03304.  03305.    LDA <Title_ObjMLTailTick,X 03306.    BEQ PRG024_B17B ; If tail tick = 0, jump to PRG024_B17B 03307.  03308.    DEC <Title_ObjMLTailTick,X ; Decrement tail tick 03309.    JMP PRG024_B185 ; Jump to PRG024_B185... 03310.  03311. PRG024_B17B: 03312.    ; Tail ticker has hit zero! 03313.  03314.    LDA <Title_ObjMLDir,X 03315.    AND #$80  03316.    BEQ PRG024_B185 ; If not wagging tail, jump to PRG024_B185 03317.  03318.    LDA #10 03319.    STA <Title_ObjMLTailTick,X ; Title_ObjMLTailTick = 10 03320.  03321. PRG024_B185: 03322.    ; Y = Title_ObjMLTailTick / 4 03323.    LDA <Title_ObjMLTailTick,X 03324.    LSR A  03325.    LSR A  03326.    TAY 03327.  03328.    LDA Title_ObjMLTailWagSprite,Y ; Get proper tail wag frame as the next frame to display 03329.    JMP PRG024_B198 ; Jump to PRG024_B198 03330.  03331. PRG024_B190: 03332.    ; Change in Y velocity, NOT leaf raccoon 03333.  03334.    LDA #$14 ; Sprite to display (fist pump upward, non-leaf raccoon version) 03335.  03336.    LDY <Title_ObjYVel,X  03337.    BMI PRG024_B198 ; If Y velocity < 0, jump to PRG024_B198 (i.e. do the fist pump) 03338.  03339.    LDA #$00 ; Otherwise, do the first walk frame (fall frame) 03340.  03341. PRG024_B198: 03342.    STA <Title_ObjMLSprite,X ; Make whatever 'A' turned out to be the next frame to display! 03343.  03344. PRG024_B19A: 03345.    ; No change in Y velocity, or power level is 0 (small) 03346.  03347.    LDA <Title_ObjMLKickTick,X 03348.    BEQ PRG024_B1A4 ; If not currently "kicking", jump to PRG024_B1A4 03349.  03350.    DEC <Title_ObjMLKickTick,X ; Decrement the kick tick 03351.  03352.    LDA #$0d ; Kick sprite 03353.    STA <Title_ObjMLSprite,X ; Make this the next sprite to display 03354.  03355. PRG024_B1A4: 03356.    LDA <Title_ObjMLBonkTick,X  03357.    BEQ PRG024_B1AE ; If not being "bonked", jump to PRG024_B1AE 03358.  03359.    DEC <Title_ObjMLBonkTick,X ; Decrement bonk ticks 03360.  03361.    LDA #$16 ; Bonk sprite 03362.    STA <Title_ObjMLSprite,X ; Make this the next sprite to display 03363.  03364. PRG024_B1AE: 03365.    TXA  03366.    BNE PRG024_B1C9 ; If Luigi, jump to PRG024_B1C9 03367.  03368.    ; Only Mario gets to do the "power down" animation... 03369.    LDA <Title_ObjMPowerDown 03370.    BEQ PRG024_B1C9 ; If not doing the animation, jump to PRG024_B1C9 03371.  03372.    ; Use Title_ObjMPowerDown / 4 to determine the appropriate sprite 03373.    LSR A 03374.    LSR A 03375.    TAY 03376.    LDA Title_ObjMarioPowerDown,Y 03377.    STA <Title_ObjMLSprite ; Make this the next sprite to display 03378.  03379.    ; Mario's power level winds up at 0 (small) if the shrinkage sprite is at $11 03380.    ; Probably just so the right patterns are loaded is all... 03381.    LDY #$00 ; Power level 0 (small) 03382.    CMP #$11  03383.    BEQ PRG024_B1C5  03384.    LDY #$01 ; Power level 1 (Big)  03385.  03386. PRG024_B1C5: 03387.    STY <Title_ObjMLPower ; Change power level 03388.    DEC <Title_ObjMPowerDown ; Decrement the power down counter 03389.  03390. PRG024_B1C9: 03391.    LDA <Title_ObjMLHold,X  03392.    BNE PRG024_B1D5 ; If holding something, jump to PRG024_B1D5 03393.  03394.    ; Activates the "hold" 03395.    LDA <Title_ObjMLQueue,X 03396.    AND #$20  03397.    BEQ PRG024_B204 ; If not time to begin carrying, jump to PRGO24_B204 03398.  03399.    STA <Title_ObjMLHold,X ; Start carrying! 03400.  03401. PRG024_B1D5: 03402.  03403.    ; Gets frame -> Y, unless no Y velocity change, in which case Y = 0 03404.    LDY <Title_ObjMLAnimFrame,X  03405.    LDA <Title_ObjYVelChng,X 03406.    BEQ PRG024_B1DD  03407.    LDY #$00  03408. PRG024_B1DD: 03409.    LDA Title_ObjMLCarrySprite,Y ; Holding something, change frame to appropriate "carry" frame alternate 03410.    STA <Title_ObjMLSprite,X ; Make this the next sprite to display 03411.  03412.    LDA <Temp_Var1 ; Get sprite flags (stored LONG ago...) 03413.    BEQ PRG024_B1EA ; If zero, jump to PRG024_B1EA 03414.  03415.    LDA #$08  03416.    STA <Title_ObjMLBonkTick,X ; Title_ObjMLBonkTick = 8 03417.  03418. PRG024_B1EA: 03419.    LDA <Title_ObjMLBonkTick,X 03420.    BEQ PRG024_B1F4 03421.    DEC <Title_ObjMLBonkTick,X ; Decrement bonk ticks 03422.  03423.    LDA #$0a ; Face-forward sprite frame 03424.    STA <Title_ObjMLSprite,X ; Make this the next sprite frame to display 03425.  03426. PRG024_B1F4: 03427.    LDA <Title_ObjMLQueue,X  03428.    AND #$40  03429.    BEQ PRG024_B204 ; If not doing clear carrying/bonk, do kick, jump to PRG024_B204 03430.  03431.    ; Clear carrying/bonk, do kick 03432.  03433.    LDA #$00  03434.    STA <Title_ObjMLHold,X ; Clear the carrying flag 03435.    STA <Title_ObjMLBonkTick,X ; Clear the bonk tick 03436.  03437.    LDA #10 03438.    STA <Title_ObjMLKickTick,X ; Title_ObjMLKickTick = 10 03439.  03440. PRG024_B204: 03441.    RTS ; Return 03442.  03443.  03444.    ; Defines offsets of 16, 8, or 0 for sprite while building 03445. Title_SpriteOffX: 03446.    .byte 16, 8, 0 03447.  03448.    ; Per-power level offset to the VROM page 03449. Title_SpriteVROMPwrOff: 03450.    .byte $50 ; 0 Small 03451.    .byte $54 ; 1 Big 03452.    .byte $00 ; 2 Leaf Raccoon 03453.  03454. ; Title_DrawMarioLuigi 03455. ; 03456. ; Not literally "draw", of course, but set up their hardware 03457. ; sprites in Sprite_RAM to be "drawn"... 03458. Title_DrawMarioLuigi: 03459.    ; Input object is assumed to be 0 (Mario) or 1 (Luigi) 03460.  03461.    LDY <Title_ObjMLSprite,X ; Get the sprite to display 03462.    LDA Title_SpriteVROMPage,Y ; Get appropriate VROM page for this sprite index 03463.  03464.    ; VROM pages 0 - 3 are power-up based and an offset is added depending on the bro's power levels 03465.    CMP #$04 03466.    BGE PRG024_B21E ; If VROM page >= 4, jump to PRG024_B21E 03467.  03468.    STA <Temp_Var1 ; Store VROM Page in Temp_Var1 03469.    LDY <Title_ObjMLPower,X ; Power level -> Y 03470.    LDA Title_SpriteVROMPwrOff,Y ; Get VROM page offset for this power level 03471.    ADD <Temp_Var1 ; Add Temp_Var1 03472.  03473. PRG024_B21E: 03474.    STA PatTable_BankSel+2,X ; Set this VROM page (first quarter of sprite VROM) 03475.  03476.    LDA #$00  03477.    STA <Temp_Var12 ; Clear Temp_Var12 03478.  03479.    LDA <Title_ObjMLPower,X  03480.    BNE PRG024_B232 ; If power level > 0 (small), jump to PRG024_B232 03481.  03482.    LDA <Title_ObjMLDir,X  03483.    AND #$10  03484.    BEQ PRG024_B232 ; If Title_ObjMLDir does not want to set sprite priority bit, jump to PRG024_B232 03485.  03486.    ; This will set BG priority over the sprite 03487.    ASL A ; AND $10 means we're $10 before, and $20 after 03488.    STA <Temp_Var12 ; Temp_Var12 = $20 (sprite priority bit) 03489.  03490. PRG024_B232:  03491.    ; Store Y coordinate -> <Temp_Var15 03492.    LDA <Title_ObjY,X 03493.    STA <Temp_Var15  03494.  03495.    ; Store X coordinate -> <Temp_Var16 03496.    LDA <Title_ObjX,X 03497.    STA <Temp_Var16 03498.  03499.    ; Store flags -> Temp_Var14  03500.    LDA <Title_ObjMLFlags,X  03501.    STA <Temp_Var14  03502.  03503.    ; Store Title_ObjMLSprVis -> Temp_Var13 03504.    LDA <Title_ObjMLSprVis,X 03505.    STA <Temp_Var13  03506.   03507.    LDY <Title_ObjMLSprite,X ; Get the sprite index again 03508.    LDA Title_SpritePatternIndex,Y ; Get the appropriate sprite tile index (CHECKME?)  03509.    STA <Temp_Var1 ; Store into Temp_Var1 03510.  03511.    LDA <Title_ObjMLSprRAMOff,X ; Get Mario/Luigi's sprite RAM offset 03512.    PHA ; Save 'A' (Title_ObjMLSprRAMOff) 03513.  03514.    TAX ; X = Title_ObjMLSprRAMOff 03515.    LDY #$02 ; Y = 2 03516.  03517.    ; Loop begin... 03518. PRG024_B24F: 03519.    TYA ; A = 2 (loop counter, Mario/Luigi are 2-3 sprites across [top vs bottom]) 03520.    PHA ; Save 'A'  03521.  03522.    LDY <Temp_Var1 ; Y = sprite tile index 03523.  03524.    LDA Title_SpritePattern,Y ; Get tile for this sprite index 03525.    STA Sprite_RAM+$0D,X ; Set pattern number of sprite 03526.  03527.    LDA Title_SpritePattern + 3,Y ; Get next tile for this sprite index 03528.    STA Sprite_RAM+$01,X ; Set pattern number of adjacent sprite 03529.  03530.    PLA ; Restore 'A' 03531.    TAY ; Y = A (amounts to sprite offset of 0 @ 2, 8 @ 1, 16 @ 0) 03532.  03533.    LDA <Temp_Var14 ; Get flags value 03534.    AND #%11000000 ; Only caring about the horizontal / vertical flip 03535.    ORA <Title_CurMLIndex ; Set appropriate palette by using the index value, which works out 03536.    ORA <Temp_Var12 ; 0 or $20 (choosing priority) 03537.  03538.    ; Apply same "byte 2" to both sprites 03539.    STA Sprite_RAM+$02,X  03540.    STA Sprite_RAM+$0E,X  03541.  03542.    ; Only set the Y coordinates if this part of the sprite is visible (as determined by Title_MLDetermineSpriteVis) 03543.    ; If the carry is set by the shift, we know NOT to draw this "sliver" of the sprite 03544.    ASL <Temp_Var13 ; Shift Title_ObjMLSprVis value left (updates Temp_Var13) 03545.    BCS PRG024_B27E ; If bit 7 was set, jump to PRG024_B27E 03546.  03547.    ; Optionally skipped part... 03548.  03549.    LDA <Temp_Var15 ; Get Y coordinate 03550.    STA Sprite_RAM+$0C,X ; Set Y coordinate of sprite 03551.    ADD #16 03552.    STA Sprite_RAM,X ; Set Y coordinate of adjacent sprite, 16 pixels beneath the one above 03553.  03554. PRG024_B27E: 03555.  03556.    LDA <Temp_Var16 ; Get X coordinate 03557.    ADD Title_SpriteOffX,Y ; Add offset of 16, 8, or 0 as appropriate by 'Y' 03558.    STA Sprite_RAM+$03,X ; Store X coordinate 03559.    STA Sprite_RAM+$0F,X ; Store X coordinate 03560.  03561.    INX 03562.    INX 03563.    INX 03564.    INX ; X += 4 03565.  03566.    INC <Temp_Var1 ; Increment the sprite tile index 03567.    DEY ; Decrement Y 03568.    BPL PRG024_B24F ; As long as Y >= 0, loop 03569.  03570.    PLA ; Restore 'A' (Title_ObjMLSprRAMOff) 03571.    TAX ; X = A 03572.  03573.    LDA <Temp_Var14 ; Get flags 03574.    AND #%01000000  03575.    BEQ PRG024_B2C3 ; If not horizontally flipped, jump to PRG024_B2C3 03576.  03577.    ; This mirrors the sprite layout horizontally 03578.  03579.    ; Reverse pattern index 03580.    LDA Sprite_RAM+$01,X 03581.    PHA  03582.    LDA Sprite_RAM+$05,X 03583.    STA Sprite_RAM+$01,X 03584.    PLA  03585.    STA Sprite_RAM+$05,X 03586.  03587.    ; Reverse X coordinates 03588.    LDA Sprite_RAM+$0B,X 03589.    ADD #-24 03590.    STA Sprite_RAM+$0B,X 03591.    STA Sprite_RAM+$17,X 03592.  03593.    LDA Sprite_RAM+$D,X 03594.    PHA  03595.    LDA Sprite_RAM+$11,X 03596.    STA Sprite_RAM+$D,X 03597.    PLA  03598.    STA Sprite_RAM+$11,X 03599.  03600. PRG024_B2C3: 03601.    LDA Sprite_RAM+$01,X 03602.    CMP Sprite_RAM+$05,X 03603.    BNE PRG024_B2DE ; If the first and second patterns are NOT the same, jump to PRG024_B2DE 03604.  03605.    ; When the first and second patterns are the same, this is assumed to be a "mirrored" sprite 03606.    ; (Think the "going down pipe" or "tail swing" face-forward frames) 03607.  03608.    LDA Sprite_RAM+$0E,X ; Take attributes of this sprite 03609.    AND #%10111111 ; Keep everything EXCEPT the horizontal flip bit 03610.    STA Sprite_RAM+$02,X ; Update both top  03611.    STA Sprite_RAM+$0E,X ; ... and bottom 03612.  03613.    ORA #%01000000 ; Set the horizontal flip 03614.    STA Sprite_RAM+$06,X ; Update the other side 03615.    STA Sprite_RAM+$12,X ; Ditto 03616.  03617. PRG024_B2DE: 03618.    LDY <Title_CurMLIndex ; Y = Mario [0] or Luigi [1] 03619.    LDA Title_ObjMLSprite,Y ; Get their current sprite index 03620.    CMP #$0d  03621.    BNE PRG024_B307 ; If current sprite is not $0D (kicking outward), jump to PRG024_B307 03622.  03623.    ; The kicking sprite needs one of the sprites in front for the outward foot! 03624.    LDA Sprite_RAM,X  03625.    STA Sprite_RAM+$14,X ; Match the Y coordinate 03626.  03627.    ; Facing left, foot is to the left 03628.    LDA #-8 ; A = -8 03629.  03630.    ; This refers to whether Mario / Luigi is horizontally flipped, but seems wrong? 03631.    ; Should only check if NOT h-flipped? 03632.  03633.    LDY <Temp_Var14 ; Y = Flags 03634.    BEQ PRG024_B2F6 ; If flags = 0 (?? this is unlikely?), jump to PRG024_B2F6 03635.  03636.    ; Facing right, foot is to the right 03637.    LDA #16 ; A = 16 03638.  03639. PRG024_B2F6: 03640.    ADD Sprite_RAM+$0F,X ; Apply X offset 03641.    STA Sprite_RAM+$17,X ; Duplicate result 03642.  03643.    LDA #$1b ; Foot pattern 03644.    STA Sprite_RAM+$15,X ; Set it 03645.  03646.    ; Duplicate attribute settings 03647.    LDA Sprite_RAM+$0E,X 03648.    STA Sprite_RAM+$16,X 03649.  03650. PRG024_B307: 03651.    LDY #$05 ; Y = 5 (loop through all five sprites for Mario/Luigi) 03652.  03653. PRG024_B309: 03654.    LDA Sprite_RAM+$01,X ; Get pattern 03655.    CMP #$f1  03656.    BNE PRG024_B317 ; If pattern is not $F1, jump to PRG024_B317 03657.  03658.    ; Pattern $F1 is used as a disable: 03659.    LDA #$f8  03660.    STA Sprite_RAM,X ; Forces this sprite's Y into oblivion, making it invisible 03661.    BNE PRG024_B324 ; Jump (technically always) to PRG024_B324 03662.  03663. PRG024_B317: 03664.    LDA <Title_CurMLIndex  03665.    BEQ PRG024_B324 ; If Mario, jump to PRG024_B324 03666.  03667.    ; Otherwise, add $40 (Luigi is using second VROM bank) 03668.    LDA Sprite_RAM+$01,X 03669.    ADD #$40 03670.    STA Sprite_RAM+$01,X 03671.  03672. PRG024_B324: 03673.    INX 03674.    INX 03675.    INX 03676.    INX ; X += 4 (next sprite) 03677.    DEY ; Y-- 03678.    BPL PRG024_B309 ; Loop while Y >= 0 03679.  03680.     03681.    LDX <Title_CurMLIndex ; Leaving with 'X' set to what it entered with! 03682.    RTS ; Return 03683.  03684.  03685.    ; XOff and XHiOff are basically 16-bit values when put together 03686.  03687. Title_MLSpriteVis_XHiOff: 03688.    .byte 0, 0, 0 ; Not H-Flipped 03689.    .byte 0, 0, $FF ; H-Flipped ($FF represents a full set of sign bits, for the corresponding '-8' in XOff) 03690.  03691. Title_MLSpriteVis_XOff: 03692.    .byte 0, 8, 16 ; Not H-Flipped 03693.    .byte 0, 8, -8 ; H-Flipped 03694.  03695. Title_MLSpriteVis_BitVal: 03696.    ; Bit vals to mark which slivers NOT to display 03697.    .byte $80, $40, $20 ; Not H-Flipped 03698.    .byte $80, $40, $20 ; H-Flipped 03699.  03700. ; Title_MLDetermineSpriteVis 03701. ; 03702. ; This function determines which "slivers" of the Player sprite are invisible, by checking if they 03703. ; cross screen boundaries (which will make them invisible), to prevent sprites "wrapping" around 03704. ; the screen, due to the limit of the 'X' part of the sprite coordinate... 03705. Title_MLDetermineSpriteVis: 03706.    LDA #$00 ; A = 0 03707.    STA <Title_ObjMLSprVis,X ; Clear Title_ObjMLSprVis 03708.  03709.    LDY #$02 ; Y = 2 (not H-flipped) 03710.  03711.    LDA <Title_ObjMLFlags,X ; Get flags -> 'A' 03712.    AND #SPR_HFLIP 03713.    BEQ PRG024_B34E ; If not flipped horizontally, jump to PRG024_B34E 03714.  03715.    LDY #$05 ; Y = 5 (H-flipped) 03716.  03717.    ; This will loop 5, 4, 3 (H-flipped) OR 2, 1, 0 (not H-flipped) 03718. PRG024_B34E: 03719.  03720.    ; 16-bit + 16-bit add here [Title_XPosHi][Title_ObjX] += [XHiOff][XOff] 03721.    LDA <Title_ObjX,X ; Get object's X position 03722.    ADD Title_MLSpriteVis_XOff,Y ; A += Title_MLSpriteVis_XOff[Y] 03723.    LDA <Title_XPosHi,X ; Get object's "high" part of the X value 03724.    ADC Title_MLSpriteVis_XHiOff,Y ; A += Title_MLSpriteVis_XHiOff[Y], with carry from previous op 03725.  03726.    BEQ PRG024_B362 ; If the X pos high value added with the Title_MLSpriteVis_XHiOff[Y] value is zero, jump to PRG024_B362 03727.  03728.    ; Otherwise, set a bit 03729.    LDA <Title_ObjMLSprVis,X 03730.    ORA Title_MLSpriteVis_BitVal,Y  03731.    STA <Title_ObjMLSprVis,X ; Title_ObjMLSprVis |= Title_MLSpriteVis_BitVal[Y] 03732.  03733. PRG024_B362: 03734.    DEY ; Y-- 03735.    BMI PRG024_B369 ; If Y < 0, jump to PRG024_B369 (RTS) 03736.  03737.    CPY #$02  03738.    BNE PRG024_B34E ; If Y <> 2, jump to PRG024_B34E 03739.  03740. PRG024_B369: 03741.    RTS ; Return 03742.  03743.  03744.    ; Patterns of the "poof" sprites, per frame of poofing 03745. Title_Poof_Patterns: .byte $87, $85, $83, $81 03746.  03747. ; Title_MarioDoPoof 03748. ;  03749. ; Handles doing Mario's (only) "poof" effect after catching the leaf 03750. Title_MarioDoPoof: 03751.    ; X is index of Mario/Luigi 03752.  03753.    TXA ; X -> A 03754.    BNE PRG024_B3C2 ; If index is not zero (i.e. Luigi), jump to PRG024_B3C2 (RTS) 03755.  03756.    ; Mario only! 03757.  03758.    LDA Title_MarioPoof 03759.    BEQ PRG024_B3C2 ; If the power-up "poof" effect is not occurring, jump to PRG024_B3C2 (RTS) 03760.  03761.    DEC Title_MarioPoof ; Title_MarioPoof-- 03762.  03763.    AND #%1100 03764.    LSR A  03765.    LSR A  03766.    TAY ; Y is now only bits 2 and 3 from Title_MarioPoof (provides 4 frames) 03767.  03768.    ; Get pattern -> Temp_Var2 03769.    LDA Title_Poof_Patterns,Y 03770.    STA <Temp_Var2 03771.  03772.    LDY <Title_ObjMLSprRAMOff ; Get the offset into Sprite_RAM for Mario 03773.  03774.    LDA #%11000000 03775.    STA <Temp_Var1 ; Sprite attributes in Temp_Var1 (H and V flip right now) 03776.  03777. PRG024_B389: 03778.    LDA <Title_ObjY ; Get Mario's Y 03779.    ADD #$08 ; +8 03780.    STA Sprite_RAM,Y ; Store as sprite's Y 03781.  03782.    LDA <Temp_Var2  03783.    STA Sprite_RAM+$01,Y ; Store poof pattern into sprite 03784.  03785.    LDA <Temp_Var1 03786.    STA Sprite_RAM+$02,Y ; Store current attributes 03787.  03788.    LDA <Title_ObjX  03789.    STA Sprite_RAM+$03,Y ; Store sprite X coordinate 03790.  03791.    LDA <Temp_Var1 03792.    AND #$f0  03793.    BEQ PRG024_B3AF ; If the upper 4 bits of the attribute are zero, jump to PRG024_B3AF 03794.  03795.    ; Otherwise, add 8 to the sprite's X 03796.    LDA Sprite_RAM+$03,Y 03797.    ADD #$08  03798.    STA Sprite_RAM+$03,Y 03799.  03800. PRG024_B3AF: 03801.    INY 03802.    INY 03803.    INY 03804.    INY ; Y += 4 (go to next sprite) 03805.  03806.    LDA <Temp_Var1  03807.    SUB #$c0  03808.    STA <Temp_Var1 ; Temp_Var1 -= $C0 03809.    BCS PRG024_B389 ; Loop once... 03810.  03811.    ; Ensure that there's no active velocity being applied! 03812.    LDA #$00 03813.    STA <Title_ObjYVel 03814.    STA <Title_ObjXVel 03815.  03816. PRG024_B3C2: 03817.    RTS ; Return 03818.  03819.  03820. Title_UpdateOtherObjs: 03821.    LDX #$05 ; X = 5 (for the 6 title screen objects) 03822.  03823. PRG024_B3C5: 03824.    LDA <Title_ObjStates,X 03825.    BEQ PRG024_B3D6 ; If object state = 0 (inactive), jump to PRG024_B3D6 03826.  03827.    CMP #$01 03828.    BNE PRG024_B3D3 ; If object state <> 1, jump to PRG024_B3D3 03829.  03830.    JSR Title_UpdateObjState1 ; Perform state 1 duty of this object 03831.    JMP PRG024_B3D6 ; Jump to PRG024_B3D6 03832.  03833. PRG024_B3D3: 03834.    ; Object state > 1 03835.    JSR Title_UpdateObj ; Perform post-state 1 duty of this object 03836.  03837. PRG024_B3D6: 03838.    LDA Title_ObjVar,X 03839.    BEQ PRG024_B3DE ; If this object's ObjVar = 0, jump to PRG024_B3DE 03840.    DEC Title_ObjVar,X ; Otherwise, decrement it 03841.  03842. PRG024_B3DE: 03843.    DEX ; X-- (next object) 03844.    BPL PRG024_B3C5 ; If X >= 0, jump to PRG024_B3C5 03845.  03846.    RTS ; Return... 03847.  03848.    ; Starting X coordinates for the different map objects 03849. Title_ObjStartX: 03850.    .byte $D0 ; 0 = Starman 03851.    .byte $20 ; 1 = Mushroom 03852.    .byte $60 ; 2 = Super Leaf 03853.    .byte $43 ; 3 = Goomba 03854.    .byte $B0 ; 4 = Buzzy Beatle 03855.    .byte $78 ; 5 = Koopa shell 03856.     03857. Title_UpdateObjState1: 03858.    ; X is the title screen object index, 0-5 03859.  03860.    ; Store object's starting X coordinate 03861.    LDA Title_ObjStartX,X 03862.    STA <Title_ObjX+2,X 03863.  03864.    ; All object's start at Y pos = 0 03865.    LDA #$00  03866.    STA <Title_ObjY+2,X 03867.  03868.    ; Clear the object's velocities and state values 03869.    LDA #$00 03870.    STA <Title_ObjXVel+2,X 03871.    STA <Title_ObjYVel+2,X 03872.    INC <Title_ObjStates,X 03873.  03874.    TXA ; A = X (object index) 03875.    JSR DynJump ; Jump dynamically based on object's index 03876.  03877.    ; THESE MUST FOLLOW DynJump FOR THE DYNAMIC JUMP TO WORK!! 03878.    .word Title_ObjS1_None ; 0 - Starman 03879.    .word Title_ObjS1_None ; 1 - Mushroom 03880.    .word Title_ObjS1_Leaf ; 2 - Super leaf 03881.    .word Title_ObjS1_Goomba ; 3 - Goomba  03882.    .word Title_ObjS1_None ; 4 - Buzzy Beatle 03883.    .word Title_ObjS1_None ; 5 - Koopa shell 03884.  03885. Title_ObjS1_None: 03886.    RTS 03887.  03888. Title_ObjS1_Leaf: 03889.  03890.    ; Clear velocity (again?) and Title_ObjVar2 (used as swing determination) 03891.    LDA #$00  03892.    STA <Title_ObjXVel+2,X 03893.    STA Title_ObjVar2,X  03894.  03895.    LDA #$10 03896.    STA Title_ObjVar,X ; Title_ObjVar = $10 03897.  03898.    LDA #$04  03899.    STA <Title_ObjYVel+2,X ; Leaf's Y velocity = 4 03900.  03901.    RTS ; Return 03902.  03903. Title_ObjS1_Goomba: 03904.  03905.    ; Title_ObjVar2 is used as a tick counter delaying the start to the goomba's move 03906.    LDA #185  03907.    STA Title_ObjVar2,X ; Title_ObjVar2 = 185 03908.  03909.    RTS ; Return 03910.  03911. Title_UpdateObj: 03912.    TXA ; 'X' is the object index, but DynJump uses 'A' 03913.    JSR DynJump ; Dynamically jump... 03914.  03915.    ; THESE MUST FOLLOW DynJump FOR THE DYNAMIC JUMP TO WORK!! 03916.    .word Title_DoStarman 03917.    .word Title_DoMushroom 03918.    .word Title_DoLeaf  03919.    .word Title_DoGoomba 03920.    .word Title_DoBuzzyBeatle 03921.    .word Title_DoKoopaShell  03922.  03923. Title_DoStarman: 03924.    JSR Title_ObjCommonXYVel ; Handle velocity standard 03925.    BNE PRG024_B43E ; If object did not fall below line 176, jump to PRG024_B43E 03926.  03927.    ; Otherwise... 03928.    LDA #$20 03929.    STA <Title_ObjXVel+2,X ; X velocity set to $20 (initial bounce, bounces away) 03930.    LDA #-80 03931.    STA <Title_ObjYVel+2,X ; Y velocity set to -80 (bounce) 03932.  03933. PRG024_B43E: 03934.    JSR Title_ObjDraw ; Draw the starman! 03935.    JMP Title_ObjCommonFinale ; Do common finale code 03936.  03937. Title_DoMushroom: 03938.    JSR Title_ObjCommonXYVel ; Handle velocity standard 03939.    BNE PRG024_B44D ; If didn't hit ground, jump to PRG024_B44D 03940.  03941.    ; Otherwise begin moving after hitting ground 03942.    LDA #$f0  03943.    STA <Title_ObjXVel+2,X 03944.  03945. PRG024_B44D: 03946.    JSR Title_ObjDraw ; Draw the mushroom! 03947.    JMP Title_ObjCommonFinale ; Do common finale code 03948.  03949. Title_Leaf_XVelAdj: .byte 2, -2 ; X velocity applied to leaf 03950. Title_Leaf_XVelLimit: .byte 32, -32 ; X velocity limits for leaf to swing the other way 03951. Title_Leaf_YVel: .byte 10, -10, 8 ; Y velocities assigned for leaf swinging 03952.  03953. Title_DoLeaf: 03954.    LDA Title_ObjVar,X 03955.    BEQ PRG024_B472 ; If = 0, jump to PRG024_B472 03956.  03957.    JSR Title_ApplyYVelFall ; Apply Y velocities 03958.  03959.    INC <Title_ObjYVel+2,X ; YVel++ 03960.  03961.    LDA <Title_ObjYVel+2,X 03962.    CMP #$00  03963.    BEQ PRG024_B46D ; If YVel = 0, jump to PRG024_B46D 03964.    JMP PRG024_B49B ; Otherwise, jump to PRG024_B49B 03965.  03966. PRG024_B46D: 03967.    ; YVel = 0 03968.  03969.    ; Title_ObjVar is never actually used, just cleared?? 03970.    LDA #$00 03971.    STA Title_ObjVar,X ; Clear Title_ObjVar 03972.  03973. PRG024_B472: 03974.  03975.    ; Bit 0 of Title_ObjVar2 determines the current "swing" direction of the leaf 03976.    LDA Title_ObjVar2,X 03977.    AND #$01 ; Only using 0/1 03978.    TAY ; Y = A 03979.  03980.    ; XVel += Title_Leaf_XVelAdj[Y] 03981.    LDA <Title_ObjXVel+2,X 03982.    ADD Title_Leaf_XVelAdj,Y 03983.    STA <Title_ObjXVel+2,X 03984.  03985.    CMP Title_Leaf_XVelLimit,Y 03986.    BNE PRG024_B488 ; If not equal to Title_Leaf_XVelLimit[Y], jump to PRG024_B488 03987.  03988.    INC Title_ObjVar2,X ; Title_ObjVar2++ (just perpetually adds and loops, but only bit 0 is used) 03989.  03990. PRG024_B488: 03991.    LDA <Title_ObjXVel+2,X 03992.    BPL PRG024_B48D ; If XVel >= 0, jump to PRG024_B48D 03993.  03994.    INY ; Y++ (1 or 2) 03995.  03996. PRG024_B48D: 03997.    LDA Title_Leaf_YVel,Y 03998.    ADD #$06  03999.    STA <Title_ObjYVel+2,X ; YVel = Title_Leaf_YVel[Y] + 6 04000.  04001.    JSR Title_ObjXVelApply ; Apply X Velocity 04002.    JSR Title_ApplyYVelFall ; Apply Y Velocity 04003.  04004. PRG024_B49B: 04005.    LDA #SPR_HFLIP ; A = SPR_HFLIP 04006.    LDY <Title_ObjXVel+2,X ; Y = XVel 04007.    BEQ PRG024_B4A7 ; If XVel = 0, jump to PRG024_B4A7 04008.  04009.    BPL PRG024_B4A5 ; If X velocity > 0, jump to PRG024_B4A5 04010.    LDA #$00 ; A = 0 04011.  04012. PRG024_B4A5: 04013.    STA <Title_ObjFlags,X 04014.  04015. PRG024_B4A7: 04016.    JSR Title_ObjDraw ; Draw the leaf! 04017.  04018.    LDA <Title_ObjY+2,X 04019.    AND #$f0 ; Only considering the most significant bits 04020.    CMP #$50 04021.    BNE PRG024_B4BF ; If the Y position is not in the vicinity of $50, jump to PRG024_B4BF 04022.  04023.    ; When the leaf hits a certain Y level, the title screen assumes they've connected 04024.    ; and gives it to him; no actual object detection is performed... 04025.  04026.    LDA #$00  04027.    STA <Title_ObjStates,X ; Object state = 0 (clear) 04028.  04029.    LDA #$13  04030.    STA Title_MarioPoof ; Title_MarioPoof = $13  04031.  04032.    LDA #$02 04033.    STA <Title_ObjMLPower ; Mario is now leaf raccoon! 04034.  04035. PRG024_B4BF: 04036.    RTS ; Return 04037.  04038.  04039. Title_DoGoomba: 04040.    JSR Title_ObjCommonXYVel ; Handle velocity standard 04041.    BNE PRG024_B500 ; If Goomba hasn't hit the floor yet, jump to PRG024_B500 04042.  04043.    ; Title_ObjVar2 is used as a tick counter 04044.    LDA Title_ObjVar2,X 04045.    BEQ PRG024_B4D0 ; If Title_ObjVar2 = 0, jump to PRG024_B4D0 04046.  04047.    ; Otherwise, still waiting for the ticks to run out so the goomba can move... 04048.    DEC Title_ObjVar2,X ; Title_ObjVar2-- 04049.    JMP Title_ObjDraw ; Just draw... 04050.  04051. PRG024_B4D0: 04052.    LDA <Title_ObjX+2,X 04053.    CMP #$30  04054.    BGE PRG024_B4FC ; If goomba is still to the right of X = $30, jump to PRG024_B4FC 04055.  04056.  04057.    ; Goomba has hit its "death" position! 04058.    LDA Title_ObjVar,X  04059.    BNE PRG024_B4E0 ; If Title_ObjVar <> 0, jump to PRG024_B4E0 04060.  04061.  04062.    ; Title_ObjVar is used as a counter for the goomba's death... 04063.    ; Otherwise, load Title_ObjVar with $10 04064.    LDA #$10  04065.    STA Title_ObjVar,X ; Title_ObjVar = $10 04066.  04067. PRG024_B4E0:  04068.    CMP #$01  04069.    BNE PRG024_B4E8 ; If Title_ObjVar <> 1, jump to PRG024_B4E8 04070.  04071.    ; Title_ObjVar = 1... 04072.    LDA #$00  04073.    STA <Title_ObjStates,X ; Set state = 0 (remove) 04074.  04075. PRG024_B4E8: 04076.  04077.    ; Basically if goomba has crossed his death point and hasn't  04078.    ; stopped moving yet, it's about to die... 04079.    LDA <Title_ObjXVel+2,X 04080.    BEQ PRG024_B4F4 ; If X Velocity = 0, jump to PRG024_B4F4 04081.  04082.    ; Mario's "stomping" on the goomba 04083.    LDA #$00  04084.    STA <Title_ObjXVel+2,X ; GOOMBA'S X velocity = 0 04085.    LDA #-48 04086.    STA <Title_ObjYVel ; MARIO's Y velocity = -48 04087.  04088. PRG024_B4F4: 04089.    LDA #$01  04090.    STA Title_ObjFrame,X ; ObjFrame = 1 (use "squished" frame) 04091.  04092.    JMP Title_ObjDraw ; Draw goomba... 04093.  04094. PRG024_B4FC: 04095.    LDA #-8 04096.    STA <Title_ObjXVel+2,X ; Goomba X Velocity = -8 (march left) 04097.  04098. PRG024_B500: 04099.    LDA <Counter_1  04100.    AND #$08 ; Only interested in a tic counter firing every 8th tick 04101.    ASL A  04102.    ASL A  04103.    ASL A ; Shift the value up 3 (makes $00, $40) 04104.    STA <Title_ObjFlags,X ; Set the object flags (Goomba's "walk" is horizontal flipping of his sprite) 04105.    JMP Title_ObjDraw ; Draw goomba... 04106.  04107.  04108. Title_DoBuzzyBeatle: 04109.  04110.    ; Title_ObjVar2 is used as a flag to indicate the buzzy was hit whe non-zero 04111.    LDA Title_ObjVar2,X  04112.    BNE PRG024_B51D ; If <> 0, jump to PRG024_B51D 04113.  04114.    LDA <Title_ObjX+2,X ; Buzzy beatle 04115.    SUB <Title_ObjX+7 ; Koopa shell 04116.    CMP #16  04117.    BGE PRG024_B543 ; If the distance between the buzzy beatle and koopa shell is >= 16, jump to PRG024_B543 04118.  04119.    INC Title_ObjVar2,X ; Otherwise, Title_ObjVar2 = 1 04120.  04121. PRG024_B51D: 04122.    ; Buzzy beatle shell was hit 04123.  04124.    LDA <Title_ObjXVel+2,X 04125.    BNE PRG024_B52D ; If X velocity is non-zero, jump to PRG024_B52D 04126.  04127.    LDA #16  04128.    STA <Title_ObjXVel+2,X ; X velocity = 16 04129.  04130.    LDA #-64 04131.    STA <Title_ObjYVel+2,X ; Y velocity = -64 04132.  04133.    LDA #$80  04134.    STA <Title_ObjFlags,X ; Vertically flipped 04135.  04136. PRG024_B52D: 04137.    ; Buzzy beatle shell is flying away... 04138.  04139.    ; Y velocity += FALL_OBJECT ("gravity") 04140.    LDA <Title_ObjYVel+2,X 04141.    ADD #FALL_OBJECT 04142.    STA <Title_ObjYVel+2,X 04143.  04144.    ; X/Y velocities 04145.    JSR Title_ObjXVelApply  04146.    JSR Title_ApplyYVelFall  04147.  04148.    LDA <Title_YPosHi+2,X 04149.    BEQ PRG024_B553 ; If "high" part of Y position is zero, jump to PRG024_B553 04150.  04151.    ; Otherwise, set state = 0 (remove) 04152.    LDA #$00 04153.    STA <Title_ObjStates,X 04154.    RTS ; Return 04155.  04156.  04157. PRG024_B543: 04158.    JSR Title_ObjCommonXYVel ; Handle velocity standard 04159.    BNE PRG024_B553 ; If buzzy beatle shell hasn't hit the floor yet, jump to PRG024_B553 04160.  04161.    LDA #$20  04162.    SUB <Title_ObjYVel+2,X  04163.    BLT PRG024_B551 ; As long as y velocity is less than $20, jump to PRG024_B551 04164.  04165.    LDA #$00 ; Set Y velocity to zero 04166.  04167. PRG024_B551: 04168.    STA <Title_ObjYVel+2,X ; Update Y Vel 04169.  04170. PRG024_B553: 04171.    JMP Title_ObjDraw ; Draw buzzy beatle shell... 04172.  04173.  04174. Title_DoKoopaShell: 04175.    LDA <Title_ObjStates,X 04176.    SUB #$02  04177.    JSR DynJump ; Jump based on state - 2 (because state 0 is "removed", state 1 is init, so we're at least in state 2) 04178.  04179.    ; THESE MUST FOLLOW DynJump FOR THE DYNAMIC JUMP TO WORK!! 04180.    .word KS_BonkMario_HitFloor ; 0 - Bonks Mario in the head, hits the floor 04181.    .word KS_Kick_LuigiCatch ; 1 - Mario kicks the shell, and Luigi catches it 04182.    .word KS_LuigiKick_MarioCatch ; 2 - Luigi kicks the shell, Mario catches it 04183.    .word KS_MarioCarry_KickWrapAround ; 3 - Mario holds the shell, kicks it out, shell wraps around screen 04184.    .word KS_HitMario ; 4 - Hit Mario, causing him to power down 04185.  04186. KS_BonkMario_HitFloor: 04187.    JSR Title_ObjCommonXYVel 04188.    BNE PRG024_B575 ; If koopa shell hasn't hit the floor yet, jump to PRG024_B575 04189.  04190.    INC <Title_ObjStates,X ; Go to next state 04191.  04192.    LDA #$00  04193.    STA <Title_ObjXVel+2,X ; X velocity = 0 04194.    BEQ PRG024_B589 ; Jump (technically always) to PRG024_B589 04195.  04196. PRG024_B575: 04197.    LDA <Title_ObjY+2,X 04198.    CMP #144 04199.    BLT PRG024_B589 ; If koopa shell Y position is less than $90, jump to PRG024_B589 04200.  04201.    ; Shell Y pos >= 144... (shell bonks Mario on the head) 04202.  04203.    LDA <Title_ObjXVel+2,X 04204.    BNE PRG024_B589 ; If the X velocity is not zero, jump to PRG024_B589 04205.  04206.    LDA #$e8  04207.    STA <Title_ObjXVel+2,X ; XVel = $E8 04208.    STA <Title_ObjYVel+2,X ; YVel = $E8 04209.  04210.    LDA #$10 04211.    STA <Title_ObjMLBonkTick ; Title_ObjMLBonkTick = $10 (Mario got bonked on the head) 04212.  04213. PRG024_B589: 04214.    JMP KS_SpinAnimAndDraw ; Shell common end code.. 04215.  04216.  04217. KS_Kick_LuigiCatch: 04218.    JSR Title_ObjCommonXYVel ; Handle velocity standard 04219.  04220.    LDA <Title_ObjMLQueue 04221.    AND #$10  04222.    BEQ PRG024_B59D ; If Title_ObjMLQueue bit 4 was not set (kick shell), jump to PRG024_B59D 04223.  04224.    LDA #10  04225.    STA <Title_ObjMLKickTick ; Title_ObjMLKickTick = 10 (puts his foot out!) 04226.    LDA #$30  04227.    STA <Title_ObjXVel+2,X ; X velocity = $30 04228.  04229. PRG024_B59D: 04230.    LDA <Title_XPosHi+2,X  04231.    BEQ PRG024_B5A5 ; If the "high" part of the X position is zero, jump to PRG024_B5A5 04232.  04233.    ; Otherwise, X Velocity = 0 (stop shell) 04234.    LDA #$00  04235.    STA <Title_ObjXVel+2,X 04236.  04237. PRG024_B5A5: 04238.    LDA <Title_ObjMLHold+1 04239.    BEQ PRG024_B5AB ; If Luigi is not holding the shell, jump to PRG024_B5AB 04240.  04241.    ; Otherwise... 04242.    INC <Title_ObjStates,X ; Next state... 04243.  04244. PRG024_B5AB: 04245.    JMP KS_SpinAnimAndDraw ; Shell common end code.. 04246.  04247.  04248. KS_LuigiKick_MarioCatch: 04249.    LDA <Title_ObjMLHold+1 04250.    BEQ PRG024_B5BB ; If Luigi is NOT holding the shell, jump to PRG024_B5BB 04251.  04252.    LDA #-48 04253.    STA <Title_ObjXVel+2,X ; X Velocity = -48 04254.    LDY #$01 ; Luigi carries the shell 04255.    JMP KS_ShellCarry ; Do KS_ShellCarry 04256.  04257. PRG024_B5BB: 04258.    ; Luigi is not holding the shell... 04259.  04260.    JSR Title_ObjCommonXYVel ; Handle velocity standard 04261.  04262.    LDA <Title_ObjX+2,X 04263.    CMP #56 04264.    BGE PRG024_B5D0 ; If the shell's X position is >= 56, jump to PRG024_B5D0 04265.  04266.    LDA <Title_ObjXVel+2,X 04267.    BEQ PRG024_B5D0 ; If the shell's X velocity is zero, jump to PRG024_B5D0 04268.  04269.    LDA #$00  04270.    STA <Title_ObjXVel+2,X ; Shell's X velocity = 0 04271.    LDA #-48 04272.    STA <Title_ObjYVel ; MARIO's Y velocity = -48 04273.  04274. PRG024_B5D0: 04275.    LDA <Title_ObjMLHold 04276.    BEQ PRG024_B5D6 ; If Mario is not holding it, jump to PRG024_B5D6 04277.  04278.    INC <Title_ObjStates,X ; Next state.. 04279.  04280. PRG024_B5D6: 04281.    JMP KS_SpinAnimAndDraw ; Shell common end code... 04282.  04283.  04284. KS_MarioCarry_KickWrapAround: 04285.    LDA <Title_ObjMLHold 04286.    BEQ PRG024_B5E2 ; If Mario is NOT holding the shell, jump to PRG024_B5E2 04287.  04288.    LDY #$00 ; Mario carries the shell 04289.    JMP KS_ShellCarry ; Do KS_ShellCarry 04290.  04291. PRG024_B5E2: 04292.    JSR Title_ObjCommonXYVel ; Handle velocity standard 04293.  04294.    LDA #48 04295.    STA <Title_ObjXVel+2,X ; X velocity = 48 04296.  04297.    LDA <Title_XPosHi+2,X  04298.    BEQ PRG024_B5FD ; If "high" part of X position is zero, jump to PRG024_B5FD 04299.  04300.    ; Otherwise, shell's X position (including "high") amount to -16 (wrap around the screen!) 04301.    LDA #$ff  04302.    STA <Title_XPosHi+2,X  04303.    LDA #-16 04304.    STA <Title_ObjX+2,X 04305.  04306.    LDA #48 04307.    STA Title_ObjVar,X ; Title_ObjVar = 48 (just puts in a delay until actually checking if Mario was hit) 04308.  04309.    INC <Title_ObjStates,X ; Next state... 04310.    RTS ; Return! 04311.  04312.  04313. PRG024_B5FD: 04314.    JMP KS_SpinAnimAndDraw ; Shell common end code... 04315.  04316. KS_HitMario: 04317.    LDA Title_ObjVar,X 04318.    BNE PRG024_B627 ; If ObjVar <> 0, jump to PRG024_B627 04319.  04320.    LDA <Title_ObjMPowerDown 04321.    BNE PRG024_B621 ; If Mario is powering down, jump to  04322.  04323.    JSR Title_ObjCommonXYVel ; Handle velocity standard 04324.  04325.    LDA <Title_XPosHi+2,X  04326.    BNE PRG024_B621 ; If shell's X "high" part is non-zero, jump to PRG024_B621 04327.  04328.    LDA <Title_ObjMLPower  04329.    BEQ PRG024_B621 ; If Mario's power level is 0 (small), jump to PRG024_B621 04330.  04331.    LDA <Title_ObjX 04332.    SUB <Title_ObjX+2,X 04333.    CMP #16 04334.    BGE PRG024_B621 ; If the shell greater than 16 pixels away from Mario, jump to PRG024_B621 04335.  04336.    LDA #44 04337.    STA <Title_ObjMPowerDown ; Title_ObjMPowerDown = 44 (power down Mario!) 04338.  04339. PRG024_B621: 04340.    JSR Title_ObjCommonFinale ; Do common finale code 04341.    JSR KS_SpinAnimAndDraw ; Shell common end code... 04342.  04343. PRG024_B627: 04344.    RTS ; Return 04345.  04346. KS_SpinAnimAndDraw: 04347.    LDA <Title_ObjXVel+2,X 04348.    BEQ PRG024_B642 ; If shell's X velocity = 0, jump to PRG024_B642 04349.  04350.    LDA <Title_ObjMPowerDown 04351.    BNE PRG024_B642 ; If Mario is currently powering down, jump to PRG024_B642 04352.  04353.    ; Otherwise, shell is moving, do spin! 04354.    LDA <Counter_1 04355.    AND #$06 ; A = Counter_1 & 6 04356.    PHA ; Save 'A' 04357.  04358.    LSR A ; Shift right 1 (0 - 3) 04359.    STA Title_ObjFrame,X ; Store as frame 04360.    PLA ; Retore 'A' 04361.  04362.    AND #$04 ; Just bit 2... 04363.    ASL A  04364.    ASL A  04365.    ASL A  04366.    ASL A ; Becomes 0 or $40 (horizontal flip) 04367.    STA <Title_ObjFlags,X ; Store as flag 04368.  04369. PRG024_B642: 04370.    JMP Title_ObjDraw ; Draw objects and don't come back  04371.  04372. KS_Carry_Xoff: 04373.    .byte -12, -10, -6, -2, 2, 6, 10, 12 ; When carrier not horizontally flipped 04374.    .byte 12, 10, 6, 2, -2, -6, -10, -12 ; When carrier is horizontally flipped 04375.  04376. KS_ShellCarry: 04377.    ; 'Y' specifies the "carrier" (0 = Mario, 1 = Luigi) 04378.  04379.    ; Koopa shell's X and XHi coordinate is same as carrier's  04380.    LDA Title_ObjX,Y 04381.    STA <Title_ObjX+2,X  04382.    LDA Title_XPosHi,Y 04383.    STA <Title_XPosHi+2,X 04384.     04385.    ; Koopa shell's Y position = carrier's Y + 13 04386.    LDA Title_ObjY,Y 04387.    ADD #13 04388.    STA <Title_ObjY+2,X 04389.  04390.    LDA Title_ObjMLFlags,Y ; Get carrier's flags (specifically, we're only checking "zero" or "non-zero", even more specifically, "(not) horizontally flipped") 04391.  04392.    PHP ; Save processor status (so it's not effected by the "bonk" load) 04393.    LDA Title_ObjMLBonkTick,Y ; Get bonk ticks 04394.    PLP ; Restore processor status 04395.  04396.    PHA ; Save 'A' (bonk ticks) 04397.    BEQ PRG024_B675 ; If flags = 0, jump to PRG024_B675 04398.  04399.    ADD #$08 ; Otherwise, add 8 to the "bonk ticks" (use reversed values from KS_Carry_Xoff) 04400.  04401. PRG024_B675: 04402.    TAY ; Y = bonk ticks (+8) 04403.    LDA KS_Carry_Xoff,Y ; Get KS_Carry_Xoff[Y] 04404.    BPL PRG024_B67D ; If not negative, jump to PRG024_B67D 04405.  04406.    DEC <Title_XPosHi+2,X ; Otherwise, shell's "high" X position-- (put to the left of Mario) 04407.  04408. PRG024_B67D: 04409.    ADD <Title_ObjX+2,X  04410.    STA <Title_ObjX+2,X ; Add X offset to shell's X 04411.    BCC PRG024_B686 ; If it hasn't overflowed, jump to PRG024_B686 04412.  04413.    ; Otherwise, "high" X position increments 04414.    INC <Title_XPosHi+2,X  04415.  04416. PRG024_B686: 04417.    PLA ; Restore 'A' (bonk ticks) 04418.    BNE PRG024_B68C ; If bonk ticks are non-zero, jump to PRG024_B68C 04419.    JMP Title_ObjDraw ; Draw shell... 04420.  04421. PRG024_B68C: 04422.    LDA #$00  04423.    JMP PRG024_B6F1 ; Hijacks Title_ObjDraw, using sprite zero instead! (for display priority) 04424.  04425. ; Title_ObjCommonXYVel 04426. ; 04427. ; A common, reusable function for objects which applies their gravity 04428. ; and X/Y velocities, and prevents them from going below YPos 176 04429. Title_ObjCommonXYVel: 04430.  04431.    ; Add FALL_OBJECT to this object's Y velocity 04432.    LDA <Title_ObjYVel+2,X 04433.    ADD #FALL_OBJECT 04434.    STA <Title_ObjYVel+2,X 04435.  04436.    JSR Title_ApplyYVelFall ; Update and apply Y velocity 04437.    JSR Title_ObjXVelApply ; Apply X velocity 04438.  04439.    ; Prevents Y position from falling beneath 176 04440.    LDA <Title_ObjY+2,X 04441.    AND #$f0  04442.    CMP #176 04443.    BNE PRG024_B6A8  04444.  04445.    STA <Title_ObjY+2,X 04446.  04447. PRG024_B6A8: 04448.    RTS ; Return 04449.  04450.    ; For both of these, the first value is used if the object is off to the right, 04451.    ; otherwise the second value for when they are off to the left 04452. Title_ObjXLimit: .byte -16, 48 ; Limits for how far off the side of the screen they can go 04453. Title_ObjXLimitHi: .byte $FF, $00 ; Respective 16-bit sign extensions 04454.  04455.  04456.    ; Common finale for minor objects 04457. Title_ObjCommonFinale: 04458.  04459.    LDY #$00 ; Y = 0 04460.    LDA <Title_XPosHi+2,X ; A = "high" part of the X position of this object 04461.    BEQ PRG024_B6C7 ; If its zero, jump to PRG024_B6C7 04462.    BPL PRG024_B6B6 ; If it is > 0 (off the right side), jump to PRG024_B6B6 04463.  04464.    INY ; If it is < 0 (off the left side), Y = 1 04465.  04466. PRG024_B6B6: 04467.    ; There is a "high" part of the X coordinate in use... 04468.  04469.    LDA <Title_ObjX+2,X ; Get the X coordinate 04470.    ADD Title_ObjXLimit,Y ; Add an appropriate extreme value 04471.  04472.    ; 16-bit propogation 04473.    LDA <Title_XPosHi+2,X  04474.    ADC Title_ObjXLimitHi,Y 04475.  04476.    BEQ PRG024_B6C7 ; If there hasn't been an overflow, jump to PRG024_B6C7 04477.  04478.    ; Otherwise, set this object's state to zero (removing it)  04479.    LDA #$00  04480.    STA <Title_ObjStates,X 04481.  04482. PRG024_B6C7: 04483.    RTS ; Return 04484.  04485.    ; Showing "default" usage per object, but Title_ObjFrane can alter which one is used 04486. Title_ObjPatterns: 04487.    .byte $F9, $F9 ; 0 = Starman 04488.    .byte $F5, $F5 ; 1 = Mushroom 04489.    .byte $F1, $F3 ; 2 = Super Leaf 04490.    .byte $FB, $FD ; 3 = Goomba 04491.    .byte $FF, $FF  04492.    .byte $DD, $DD ; 4 = Buzzy Beatle 04493.    .byte $D5, $D5 ; 5 = Koopa shell 04494.  04495.    ; Auxillary patterns (accessed by "Title_ObjFrame" values) 04496.    .byte $D7, $D9 04497.    .byte $DB, $DB 04498.    .byte $D7, $D9 04499.  04500.    ; Each of these tables contains one value per object index (0-5) 04501. Title_ObjPatOff: .byte $00, $02, $04, $06, $0A, $0C ; Root offset per object for Title_ObjPatterns 04502. Title_ObjSprRAMOff: .byte $40, $48, $50, $68, $60, $58 ; Offset into Sprite_RAM per object 04503. Title_ObjPal: .byte $03, $00, $00, $02, $02, $03 ; Paletter per object 04504.  04505. ; Title_ObjDraw 04506. ; 04507. ; Not literally "draw", of course, but set up their hardware 04508. ; sprites in Sprite_RAM to be "drawn"... 04509. Title_ObjDraw: 04510.    LDA Title_ObjSprRAMOff,X ; Get the offset into Sprite_RAM 04511.  04512. PRG024_B6F1: 04513.    PHA ; Save this value 04514.  04515.    LDA Title_ObjPal,X  04516.    STA <Temp_Var3 ; Temp_Var3 = this object's palette index 04517.  04518.    LDA Title_ObjFrame,X 04519.    ASL A  04520.    ADD Title_ObjPatOff,X ; Use the pattern specified in Title_ObjPatOff + 2 * Title_ObjFrame 04521.    TAY ; Y = A (the pattern value) 04522.  04523.    ; Temp_Var1 and Temp_Var2 hold the first and second pattern value for this object 04524.    LDA Title_ObjPatterns,Y  04525.    STA <Temp_Var1  04526.    LDA Title_ObjPatterns+1,Y 04527.    STA <Temp_Var2  04528.  04529.    PLA ; Restore 'A' (Sprite_RAM offset) 04530.    TAY ; Y = A 04531.  04532.    ; Set the Y position of the object to its first/second sprites 04533.    LDA <Title_ObjY+2,X 04534.    STA Sprite_RAM,Y 04535.    STA Sprite_RAM+$04,Y 04536.  04537.    ; Set the X position of object to its first/second sprites (8 pixels apart) 04538.    LDA <Title_ObjX+2,X 04539.    STA Sprite_RAM+$03,Y 04540.    ADD #$08  04541.    STA Sprite_RAM+$07,Y 04542.  04543.    ; Store the attributes for both sprites 04544.    LDA <Temp_Var3 ; Get the selected palette value 04545.    ORA <Title_ObjFlags,X ; Apply the other flags 04546.    STA Sprite_RAM+$02,Y 04547.    STA Sprite_RAM+$06,Y 04548.  04549.    LDA <Temp_Var1 ; Get first pattern value of this object 04550.    PHA ; Save 'A' 04551.    STA Sprite_RAM+$01,Y ; Store pattern for first sprite 04552.  04553.    LDA <Temp_Var2 ; Get second pattern value of this object 04554.    STA Sprite_RAM+$05,Y ; Store pattern for second sprite 04555.   04556.    LDA <Title_ObjFlags,X 04557.    BEQ PRG024_B742 ; If this object's flags value = 0, jump to PRG024_B742 04558.  04559.    ; Otherwise, reverse the patterns 04560.    ; NOTE: This is making the assumption that the only value stored in ObjFlags 04561.    ; is one to horizontally flip the sprite!! 04562.    LDA <Temp_Var2  04563.    STA Sprite_RAM+$01,Y 04564.    LDA <Temp_Var1  04565.    STA Sprite_RAM+$05,Y 04566.  04567. PRG024_B742: 04568.    PLA ; Restore 'A' (first pattern) 04569.    CMP <Temp_Var2 04570.    BNE PRG024_B754 ; If it's not the same as the second pattern, jump to PRG024_B754 04571.  04572.    ; Otherwise, flip the sprites 04573.    LDA Sprite_RAM+$02,Y 04574.    AND #$bf ; Keep everything but the horizontal flip flag  04575.    STA Sprite_RAM+$02,Y 04576.  04577.    ORA #SPR_HFLIP ; Apply the horizontal flip flag 04578.    STA Sprite_RAM+$06,Y 04579.  04580. PRG024_B754: 04581.    ; NOTE: The 1P/2P menu koopas hijack code here to take advantage of disabling their sprites! 04582.  04583.    LDA <Title_XPosHi+2,X 04584.    BEQ PRG024_B75D ; If the "high" part of the X coordinate is zero, jump to PRG024_B75D 04585.  04586.    ; Otherwise, disable the first sprite sprite by setting its Y value out of range 04587.    LDA #$f8  04588.    STA Sprite_RAM,Y 04589.  04590. PRG024_B75D: 04591.  04592.    ; Take the object's X coordinate, add 8, and if there's been a carry OR the "high" part  04593.    ; of the X coordinate is otherwise non-zero, disable the second half of the sprite 04594.    LDA <Title_ObjX+2,X 04595.    ADD #$08  04596.    LDA #$00  04597.    ADC <Title_XPosHi+2,X 04598.    BEQ PRG024_B76D  04599.  04600.    ; Disable the second sprite 04601.    LDA #$f8  04602.    STA Sprite_RAM+$04,Y 04603.  04604. PRG024_B76D: 04605.    RTS ; Return 04606.  04607.  04608. Title_ObjXVelApply:  04609.    INX  04610.    INX ; X += 2 (going to use A Mario/Luigi included function, which uses a larger index span... objects start at index 2) 04611.  04612.    JSR Title_AddVel_toPos ; Apply X velocity as is 04613.  04614.    DEX  04615.    DEX ; X -= 2 (restoring objects to their local index) 04616.    RTS ; Return 04617.  04618.  04619. Title_ApplyYVelFall: 04620.    ; X is 0-5, an index to one of the "minor" objects 04621.  04622.    LDA <Title_ObjYVel+2,X 04623.    BMI PRG024_B782 ; If object's Y velocity < 0, jump to PRG024_B782 04624.  04625.    CMP #FALLRATE_OBJECTMAX 04626.    BLS PRG024_B782 ; If object's Y velocity < FALLRATE_OBJECTMAX, jump to PRG024_B782 04627.  04628.    ; Prevent objects from falling faster than FALLRATE_OBJECTMAX  04629.    LDA #$60 04630.    STA <Title_ObjYVel+2,X 04631.  04632. PRG024_B782: 04633.    INX  04634.    INX ; X += 2 (going to use A Mario/Luigi included function, which uses a larger index span... objects start at index 2) 04635.  04636.    JSR Title_ApplyYVel ; Apply Y velocity 04637.  04638.    DEX  04639.    DEX ; X -= 2 (restoring objects to their local index) 04640.    RTS ; Return 04641.  04642. Title_Menu_Koopa_SpriteRAMOff: .byte $00, $20, $40, $60 ; Offsets into Sprite_RAM per menu koopa 04643.  04644. Title_Menu_UpdateKoopas: 04645.    JSR PRG024_SpriteClear ; Clear all sprites 04646.  04647.    LDX #$03 04648.  04649. PRG024_B793: 04650.    LDA <Title_ObjStates,X 04651.    BEQ PRG024_B7A4 ; If this object's state = 0, jump to PRG024_B7A4 04652.  04653.    CMP #$01  04654.    BNE PRG024_B7A1 ; If this object's state <> 1, jump to PRG024_B7A1 04655.  04656.    ; State 1: Initialize this koopa 04657.    JSR Title_Menu_InitKoopa 04658.    JMP PRG024_B7A4 ; Jump down to PRG024_B7A4 04659.  04660. PRG024_B7A1: 04661.    ; Other states: Just update! 04662.    JSR Title_Menu_UpdateKoopa 04663.  04664. PRG024_B7A4: 04665.    DEX ; X-- 04666.    BPL PRG024_B793 ; If X >= 0, loop! 04667.  04668.    RTS ; Return 04669.  04670.  04671. ; Title_Menu_InitKoopa 04672. ; 04673. ; Initializes the data for one of the 1P/2P koopas 04674. ; that march along (with the one fast straggler) 04675. Title_Menu_InitKoopa: 04676.    INC <Title_ObjStates,X ; Increment this object's state 04677.  04678.    ; Set this object's XHi / X position to -16 04679.    LDA #$ff 04680.    STA <Title_XPosHi+2,X 04681.    LDA #-16 04682.    STA <Title_ObjX+2,X 04683.  04684.    LDA #8 ; Most of the menu koopas run at X Velocity 8 04685.    CPX #$03 04686.    BNE PRG024_B7BA ; If X <> 3 (the straggler koopa), jump to PRG024_B7BA 04687.  04688.    LDA #18 ; The straggler koopa runs at X velocity 18 04689.  04690. PRG024_B7BA: 04691.    STA <Title_ObjXVel+2,X ; Set this koopa's velocity 04692.    RTS ; Return 04693.  04694.  04695.    ; Y offsets per sprite of the koopa 04696. Title_Menu_Koopa_SprYOff: 04697.    .byte -32, -16, 0 04698.  04699.    ; This defines an X coordinate per-menu koopa of when to signal the 04700.    ; next koopa (unless zero, which means "never", used for the straggler) 04701.    ; Hence, $90 is "late" for the straggler 04702. Title_Menu_Koopa_SignalX: 04703.    .byte $20, $20, $90, $00 04704.  04705.    ; Attributes set per frame of koopa 04706. Title_Menu_Koopa_Attr: 04707.    .byte $42, $43, $42 ; First sprite of koopas 04708.    .byte $42, $42, $42 ; Second sprite of koopas 04709.  04710.    ; Patterns set first sprite per frame of koopa 04711. Title_Menu_Koopa_Patterns1: 04712.    .byte $B1, $E5, $E9 ; First frame of koopas 04713.    .byte $B1, $E5, $EF ; Second frame of koopas 04714.  04715.    ; Patterns set second sprite per frame of koopa 04716. Title_Menu_Koopa_Patterns2: 04717.    .byte $E1, $E3, $E7 ; First frame of koopas 04718.    .byte $E1, $EB, $ED ; Second frame of koopas 04719.  04720.  04721. ; Title_Menu_UpdateKoopa 04722. ; 04723. ; Updates and "draws" the menu koopas 04724. Title_Menu_UpdateKoopa: 04725.    JSR Title_ObjXVelApply ; Koopas only need X velocity! 04726.    JSR Title_ObjCommonFinale ; Do common finale code 04727.  04728.    LDA <Title_XPosHi+2,X 04729.    BNE PRG024_B7F1 ; If the "high" part of the koopa's X position is zero, jump to PRG024_B7F1 04730.  04731.    ; This signals the next menu koopa to come marching in when the current leader 04732.    ; hits a particular coordinate to do so... 04733.    LDA Title_Menu_Koopa_SignalX,X 04734.    BEQ PRG024_B7F1 ; If Title_Menu_Koopa_SignalX[X] = 0, jump to PRG024_B7F1 (do nothing) 04735.  04736.    CMP <Title_ObjX+2,X 04737.    BGE PRG024_B7F1 ; If Title_Menu_Koopa_SignalX[X] >= the koopa's X position, jump to PRG024_B7F1 04738.  04739.    INX ; Next koopa 04740.  04741.    LDA <Title_ObjStates,X  04742.    BNE PRG024_B7F0 ; If this koopa's state <> 0, jump to PRG024_B7F0 (only signal once!) 04743.  04744.    INC <Title_ObjStates,X ; Move next koopa to next state 04745.  04746. PRG024_B7F0: 04747.    DEX ; Back to this koopa 04748.  04749. PRG024_B7F1: 04750.    LDA <Counter_1 04751.    LSR A  04752.    LSR A ; A = Counter_1 >> 2 04753.  04754.    CPX #$03  04755.    BEQ PRG024_B7FA ; If we're on the straggler koopa, jump to PRG024_B7FA 04756.  04757.    LSR A ; Otherwise, shift one more time... (slightly slower than the straggler)  04758.  04759. PRG024_B7FA: 04760.    AND #$01 ; Only looking for 0/1 pattern 04761.    BEQ PRG024_B800 ; If 0, jump to PRG024_B800 04762.    LDA #$03 ; Otherwise, change to 3 (thus 0 or 3) 04763.  04764. PRG024_B800: 04765.    STA Title_ObjFrame,X ; Set frame as 0 or 3 04766.  04767.    STX <Temp_Var3 ; Store koopa index into Temp_Var3 04768.  04769.    LDA <Title_ObjX+2,X  04770.    STA <Temp_Var1 ; Store koopa X pos into Temp_Var1 04771.  04772.    LDA Title_ObjFrame,X 04773.    STA <Temp_Var2 ; Store koopa frame into Temp_Var2 04774.  04775.    LDY Title_Menu_Koopa_SpriteRAMOff,X ; Get Sprite_RAM offset for this koopa -> 'Y' 04776.  04777.    LDX #$02 ; X = 2 (sprites to build) 04778.  04779. PRG024_B813: 04780.    LDA #186 ; A = 186 04781.    ADD Title_Menu_Koopa_SprYOff,X ; A += Title_Menu_Koopa_SprYOff[X] 04782.    STA Sprite_RAM,Y ; Store Y coordinate into first sprite 04783.    STA Sprite_RAM+$04,Y ; Store Y coordinate into second sprite 04784.  04785.    TXA ; A = X (sprite to build loop counter) 04786.    PHA ; Save 'A' 04787.  04788.    ADD <Temp_Var2 ; Add the frame (0 or 3) to 'A' 04789.    TAX ; X = A 04790.  04791.    ; Setup the patterns 04792.    LDA Title_Menu_Koopa_Patterns1,X ; Get first pattern for this koopa 04793.    STA Sprite_RAM+$01,Y ; Store pattern value 04794.    LDA Title_Menu_Koopa_Patterns2,X ; Get second pattern for this koopa 04795.    STA Sprite_RAM+$05,Y ; Store pattern value 04796.  04797.    LDX <Temp_Var3 ; X = koopa index 04798.    JSR PRG024_B754 ; Disable first and/or second sprite if off-screen 04799.  04800.    PLA ; Restore 'A' (sprite to build loop counter) 04801.    TAX ; X = A 04802.  04803.    ; Attributes set per sprite of koopa 04804.    LDA Title_Menu_Koopa_Attr,X 04805.    STA Sprite_RAM+$02,Y  04806.    LDA Title_Menu_Koopa_Attr+3,X 04807.    STA Sprite_RAM+$06,Y  04808.  04809.    LDA <Temp_Var1 04810.    STA Sprite_RAM+$03,Y ; Store X position for first sprite of the koopa 04811.  04812.    ADD #$08 ; Sprite X += 8 04813.    STA Sprite_RAM+$07,Y ; Store X position for second sprite of the koopa 04814.  04815.    TYA  04816.    ADD #$08  04817.    TAY ; Y += 8 (next two sprites over) 04818.  04819.    DEX ; X-- 04820.    BPL PRG024_B813 ; If X >= 0, loop! 04821.  04822.    LDX <Temp_Var3 ; Restore koopa index to 'X' 04823.    RTS ; Return..! 04824.  04825.  04826. Rescue_Princess: 04827.    ; NOTE: Debug menu jump to princess rescue jumps here 04828.  04829.    ; Princess housing block graphics 04830.    LDA #$5c 04831.    STA PatTable_BankSel 04832.  04833.    ; Princess housing background graphics 04834.    LDA #$5e 04835.    STA PatTable_BankSel+1 04836.  04837.    JSR Reset_PPU_Clear_Nametables 04838.  04839.    ; Disable display 04840.    LDA #$00 04841.    STA PPU_CTL1 04842.    STA PPU_CTL2 04843.  04844.    ; Disable raster effects 04845.    LDA #$80 04846.    STA Raster_Effect 04847.  04848.    ; Clears RAM $00-$F5 04849.    LDX #$f5 ; X = $F5 04850. PRG024_B876: 04851.    LDA #$00 04852.    STA <Temp_Var1,X 04853.  04854.    DEX ; X-- 04855.    BNE PRG024_B876 ; While X <> 0, loop! 04856.  04857.    ; Scroll at lowest point 04858.    LDA #$ef 04859.    STA <Vert_Scroll 04860.  04861.    LDA #%00101000 ; use 8x16 sprites, sprites use PT2 (NOTE: No VBlank trigger!) 04862.    STA PPU_CTL1  04863.    STA <PPU_CTL1_Copy ; Keep PPU_CTL1_Copy in sync! 04864.  04865.    ; Entry $55 of Video_Upd_Table2 04866.    LDA #$55 04867.    ASL A 04868.    TAY 04869.  04870.    ; Load base address of graphics 04871.    LDA Video_Upd_Table2,Y 04872.    STA <Video_Upd_AddrL  04873.    LDA Video_Upd_Table2+1,Y 04874.    STA <Video_Upd_AddrH  04875.  04876.    JSR Video_Misc_Updates2 ; Load those graphics! 04877.  04878.    LDA #%10101000 ; In addition to anything else specified by PPU_CTL1_Mod, Generate VBlank Resets, use 8x16 sprites, sprites use PT2 04879.    STA PPU_CTL1 ; Set above settings 04880.    STA <PPU_CTL1_Copy ; Keep PPU_CTL1_Copy in sync! 04881.  04882. PRG024_B8A0: 04883.    JSR GraphicsBuf_Prep_And_WaitVSyn2 ; VSync 04884.  04885.    JSR Ending_ChamberScene ; Do the Princess Chamber scene, up through the Fade Out 04886.  04887.    LDA <Ending_State 04888.    CMP #$07 04889.    BNE PRG024_B8A0 ; If Princess Chamber scene is still going on, loop! 04890.  04891.    JMP Ending_Credits ; Jump to credits 04892.  04893.  04894. Ending_ChamberScene: 04895.    JSR PRG024_SpriteClear ; Clear sprites 04896.  04897.    LDA #$10  04898.    STA <Title_ObjMLSprRAMOff ; Mario's sprite RAM starts at Sprite_RAM + $10 04899.  04900.    LDA #$28  04901.    STA <Title_ObjMLSprRAMOff+1 ; Princess's sprite RAM starts at Sprite_RAM + $28 04902.  04903.    LDX #$02 ; X = 2 04904. PRG024_B8BC: 04905.    LDA <Ending_Timer,X 04906.    BEQ PRG024_B8C2 ; If this ending timer = 0, jump to PRG024_B8C2 04907.  04908.    DEC <Ending_Timer,X ; Otherwise, decrement it 04909.  04910. PRG024_B8C2: 04911.    DEX ; X-- 04912.    BPL PRG024_B8BC ; While X >= 0, loop 04913.  04914.    JSR Ending_DoChamberScene ; Perform actions for the Princess's Chamber 04915.  04916.    ; Title_CurMLIndex = 0 04917.    LDX #$00 04918.    STX <Title_CurMLIndex 04919.  04920.    JSR Title_DrawMarioLuigi ; Draws Mario officially, but may be modified after this to Luigi 04921.  04922.    LDA Player_Current 04923.    BEQ PRG024_B8E6 ; If Player is Mario, jump to PRG024_B8E6 04924.  04925.    ; Luigi only... 04926.  04927.    ; This is meant to colorize the Player as Luigi, but I think the loop condition is wrong 04928.    ; Seems to work anyway. Sort of a Schroedinbug without the fact that it will stop working 04929.    ; just because I pointed it out... 04930.    LDY #$24 ; Y = $24 04931. PRG024_B8D6: 04932.    ; Use the Luigi palette 04933.    LDA Sprite_RAM+$02,Y 04934.    ORA #SPR_PAL2 04935.    STA Sprite_RAM+$02,Y 04936.  04937.    ; Y -= 4 (previous sprite) 04938.    DEY 04939.    DEY 04940.    DEY 04941.    DEY 04942.  04943.    CMP <Title_ObjMLSprRAMOff ; I think this is a mistake! Will compare to the attribute value! 04944.    BPL PRG024_B8D6 ; While ??, loop 04945.  04946. PRG024_B8E6: 04947.  04948.    ; Title_CurMLIndex = 1 04949.    INX ; X = 1 04950.    STX <Title_CurMLIndex 04951.  04952.    JSR Title_DrawMarioLuigi ; Actually draws the Princess 04953.  04954.    RTS ; Return 04955.  04956. Ending_DoChamberScene: 04957.    LDA <Ending_State 04958.    JSR DynJump 04959.  04960.    ; THESE MUST FOLLOW DynJump FOR THE DYNAMIC JUMP TO WORK!! 04961.    .word Ending_Init ; 0: Prepare the Princess chamber scene 04962.    .word Ending_FadeIn ; 1: Fade in 04963.    .word Ending_MarioAppears ; 2: Mario appears, music starts 04964.    .word Ending_LightsOn ; 3: Lights come on, Princess stands up 04965.    .word Ending_WalkToCenter ; 4: Mario and Princess walk to the center 04966.    .word Ending_PrincessSpeech ; 5: Princess's departing message 04967.    .word Ending_FadeOut ; 6: Fade out 04968.  04969. Ending_Init: 04970.    ; Set Mario's X 04971.    LDA #32 04972.    STA <Title_ObjX 04973.  04974.    ; Set Princess's X 04975.    LDA #200 04976.    STA <Title_ObjX+1 04977.  04978.    ; Set both Y = 160 04979.    LDA #160 04980.    STA <Title_ObjY 04981.    STA <Title_ObjY+1 04982.  04983.    ; Mario standing 04984.    LDA #$18 04985.    STA <Title_ObjMLSprite 04986.  04987.    ; Princess sobbing 04988.    LDA #$19 04989.    STA <Title_ObjMLSprite+1 04990.  04991.    ; Mario turned to face, Princess turned away 04992.    LDA #SPR_HFLIP 04993.    STA <Title_ObjMLFlags 04994.    STA <Title_ObjMLFlags+1 04995.  04996.    ; Super Mario 04997.    LDA #$01 04998.    STA <Title_ObjMLPower 04999.  05000.    ; Set first ending timer to $0F 05001.    LDA #$0f 05002.    STA <Ending_Timer 05003.  05004.    INC <Ending_State ; Ending_State = 1 05005.  05006.    ; Initialize the princess speech dialog box 05007.  05008.    ; EndText_CPos = 0 05009.    LDA #$00 05010.    STA <EndText_CPos 05011.  05012.    ; EndText_VH = $29 05013.    LDA #$29 05014.    STA <EndText_VH 05015.  05016.    ; EndText_VL = $48 05017.    LDA #$48 05018.    STA <EndText_VL 05019.  05020.    RTS ; Return 05021.  05022. Ending_FadeIn: 05023.    LDA <Ending_Timer 05024.    BNE PRG024_B93D ; If the first ending timer has not expired, jump to PRG024_B93D 05025.  05026.    INC <Ending_State ; Ending_State = 2 05027.  05028.    ; Set first ending timer to $30 05029.    LDY #$30 05030.    STY <Ending_Timer 05031.  05032. PRG024_B93D: 05033.  05034.  05035.    ; Ending timer was init'ed to $F (15) so ... 05036.    LSR A 05037.    LSR A ; Ending timer / 4 05038.    ADD #$56 ; ... run command scripts $59, $58, $57, $56 (the "fade in" effect) 05039.  05040.    STA Graphics_Queue ; Execute appropriate scripe 05041.  05042.    RTS ; Return 05043.  05044. Ending_MarioAppears: 05045.    LDA <Ending_Timer 05046.    CMP #$01 05047.    BNE PRG024_B959 ; If ending timer does not have one tick left, jump to PRG024_B959 05048.  05049.    ; Mario standing there 05050.    LDA #$02 05051.    STA <Title_ObjMLSprite 05052.  05053.    ; Set ending timer 2 = $80 05054.    LDA #$80 05055.    STA <Ending_Timer+1 05056.  05057.    ; Play finale music 05058.    LDA #MUS2A_ENDING 05059.    STA Sound_QMusic2 05060.  05061. PRG024_B959: 05062.    LDA <Ending_Timer+1 05063.    CMP #$01 05064.    BNE PRG024_B965 ; If second ending timer does not have one tick left, jump to PRG024_B965 05065.  05066.    ; Set first ending timer = $13 05067.    LDA #$13 05068.    STA <Ending_Timer 05069.  05070.    INC <Ending_State ; Ending_State = 3 05071.  05072. PRG024_B965: 05073.    RTS ; Return 05074.  05075.    ; The "lights on" effect palette levels 05076. Ending_LightsOnPalSet: 05077.    .byte $0F, $35, $30, $3B 05078.    .byte $0F, $23, $35, $3B 05079.    .byte $0F, $11, $3C, $3B 05080.    .byte $0F, $1C, $2C, $3B 05081.    .byte $0F, $0C, $1C, $3B 05082.  05083. Ending_LightsOn: 05084.    LDA <Ending_Timer 05085.    BEQ PRG024_B9BB ; If ending timer has expired, jump to PRG024_B9BB 05086.  05087.    ; Second ending timer = $30 05088.    LDY #$30 05089.    STY <Ending_Timer+1 05090.  05091.    AND #%00001100 05092.    TAY ; Y = 0, 4, 8, 12 (Ending_LightsOnPalSet level offset) 05093.  05094.    LDX Graphics_BufCnt ; X = current graphics buffer count 05095.    TXA 05096.    ADD #$07 05097.    STA Graphics_BufCnt ; Make room for 7 bytes 05098.  05099.    ; VRAM High/Low (for palette) 05100.    LDA #$3f 05101.    STA Graphics_Buffer,X 05102.    LDA #$04 05103.    STA Graphics_Buffer+1,X 05104.  05105.    ; Run length of 4 05106.    LDA #$04 05107.    STA Graphics_Buffer+2,X 05108.  05109.    ; Terminator 05110.    LDA #$00 05111.    STA Graphics_Buffer+7,X 05112.  05113.    ; The four palette colors for the "lights on" effect 05114.    LDA Ending_LightsOnPalSet,Y 05115.    STA Graphics_Buffer+3,X 05116.    LDA Ending_LightsOnPalSet+1,Y 05117.    STA Graphics_Buffer+4,X 05118.    LDA Ending_LightsOnPalSet+2,Y 05119.    STA Graphics_Buffer+5,X 05120.    LDA Ending_LightsOnPalSet+3,Y 05121.    STA Graphics_Buffer+6,X 05122.  05123. PRG024_B9BB: 05124.    LDA <Ending_Timer+1 05125.    BNE PRG024_B9C9 ; If second ending timer has not expired, jump to PRG024_B9C9 (RTS) 05126.  05127.    INC <Ending_State ; Ending_State = 4 05128.  05129.    ; First ending timer = $80 05130.    LDA #$80 05131.    STA <Ending_Timer 05132.  05133.    ; Princess stands up 05134.    LDA #$1a 05135.    STA <Title_ObjMLSprite+1 05136.  05137. PRG024_B9C9: 05138.    RTS ; Return 05139.  05140.  05141. Ending_WalkToCenter: 05142.    LDA <Ending_Timer 05143.    BEQ PRG024_B9D7 ; If first ending timer has not expired, jump to PRG024_B9D7 05144.  05145.    CMP #$60 05146.    BGE PRG024_B9D6 ; If ending timer >= $60, jump to PRG024_B9D6 (RTS) 05147.  05148.    ; Princess turns around 05149.    LDA #$00 05150.    STA <Title_ObjMLFlags+1 05151.  05152. PRG024_B9D6: 05153.    RTS ; Return 05154.  05155. PRG024_B9D7: 05156.    LDA <Title_ObjX 05157.    CMP #104 05158.    BLT PRG024_B9EC ; If Mario's X < 104, jump to PRG024_B9EC 05159.  05160.    ; Mario stands 05161.    LDA #$02 05162.    STA <Title_ObjMLSprite 05163.  05164.    ; Princess stands 05165.    LDA #$1a 05166.    STA <Title_ObjMLSprite+1 05167.  05168.    INC <Ending_State ; Ending_State = 5 05169.  05170.    ; First Ending Timer = $B0 05171.    LDA #$b0 05172.    STA <Ending_Timer 05173.  05174.    RTS ; Return 05175.  05176. PRG024_B9EC: 05177.  05178.    ; Second ending timer = $50 05179.    LDA #$50 05180.    STA <Ending_Timer+1 05181.  05182.    ; Mario steps to the right 05183.    INC <Title_ObjX 05184.  05185.    ; Princess steps to the left 05186.    DEC <Title_ObjX+1 05187.  05188.    LDA <Counter_1 05189.    AND #%00001100 05190.    LSR A 05191.    LSR A 05192.    TAY ; Y = 0 to 3 05193.  05194.    ; Set Mario's walk frame 05195.    LDA Title_ObjMLWalkSprite+4,Y 05196.    STA <Title_ObjMLSprite  05197.  05198.    ; Set Princess's walk frame 05199.    LDA Title_ObjMLWalkSprite+12,Y 05200.    STA <Title_ObjMLSprite+1 05201.  05202.    RTS ; Return 05203.  05204.  05205. Ending_PrincessSpeech: 05206.    LDA <Ending_Timer 05207.    BNE PRG024_BA0D ; If timer not expired, jump to PRG024_BA0D (RTS) 05208.  05209.    JMP PRG024_BA2B ; Otherwise, jump to PRG024_BA2B 05210.  05211. PRG024_BA0D: 05212.    RTS ; Return 05213.  05214.  05215. Ending_FadeOut: 05216.    LDA <Ending_Timer 05217.    BNE PRG024_BA19 ; If first ending timer has not expired, jump to PRG024_BA19 05218.  05219.    LDA <Ending_Timer+1 05220.    BNE PRG024_BA18 ; If second ending timer has not expired, jump to PRG024_BA18 (RTS) 05221.  05222.    INC <Ending_State ; Ending_State = 7 05223.  05224. PRG024_BA18: 05225.    RTS ; Return 05226.  05227. PRG024_BA19: 05228.  05229.    ; Ending timer was init'ed to $F (15) so ... 05230.    LSR A 05231.    LSR A ; Ending timer / 4 05232.    STA <Temp_Var1 ; Temp_Var1 = 0 to 3 05233.  05234.    ; Execute $5A, $59, $58, $57 (fade out) 05235.    LDA #$5a 05236.    SUB <Temp_Var1 05237.    STA Graphics_Queue 05238.  05239.    ; Second ending timer = $10 05240.    LDA #$10 05241.    STA Ending_Timer+1 05242.  05243.    RTS ; Return 05244.  05245. PRG024_BA2B: 05246.    LDA <EndText_State 05247.    JSR DynJump 05248.  05249.    ; THESE MUST FOLLOW DynJump FOR THE DYNAMIC JUMP TO WORK!! 05250.    .word EndText_DrawDiagBox ; 0: Draw the dialog box 05251.    .word EndText_DoPrincessText ; 1: Do the text 05252.    .word EndText_Wait ; 2: Waits for timer to expire, then advances Ending_State 05253.  05254.  05255. PDiagBox_R1: .byte $94, $90, $90, $90, $90, $90, $90, $90, $90, $90, $90, $90, $90, $90, $90, $90, $96 05256. PDiagBox_R2: .byte $92, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $FE, $93 05257. PDiagBox_R3: .byte $95, $91, $91, $91, $91, $91, $91, $91, $91, $91, $91, $91, $91, $91, $91, $91, $97 05258.  05259. PDiagBox_RowOffs: 05260.    .byte (PDiagBox_R1 - PDiagBox_R1), (PDiagBox_R2 - PDiagBox_R1), (PDiagBox_R2 - PDiagBox_R1), (PDiagBox_R2 - PDiagBox_R1) 05261.    .byte (PDiagBox_R2 - PDiagBox_R1), (PDiagBox_R2 - PDiagBox_R1), (PDiagBox_R2 - PDiagBox_R1), (PDiagBox_R3 - PDiagBox_R1) 05262. PDiagBox_RowOffs_End 05263.  05264.  05265. EndText_DrawDiagBox: 05266.  05267.    LDX Graphics_BufCnt ; X = buffer count 05268.  05269.    ; Set current VRAM address  05270.    LDA <EndText_VH 05271.    STA Graphics_Buffer,X 05272.    LDA <EndText_VL  05273.    STA Graphics_Buffer+1,X 05274.  05275.    ADD #$20 ; 32 bytes to next row 05276.    STA <EndText_VL 05277.    BCC PRG024_BA87 05278.    INC <EndText_VH ; Apply carry 05279. PRG024_BA87: 05280.    LDA #(PDiagBox_R2 - PDiagBox_R1) ; run count per row 05281.    STA Graphics_Buffer+2,X 05282.    STA <Temp_Var1 ; -> Temp_Var1 05283.  05284.    LDY <EndText_CPos ; Y = current dialog box row 05285.    LDA PDiagBox_RowOffs,Y 05286.    TAY ; Y = offset to this row index 05287.  05288. PRG024_BA94: 05289.    ; Store next pattern in dialog box 05290.    LDA PDiagBox_R1,Y 05291.    STA Graphics_Buffer+3,X 05292.  05293.    INY ; Y++ (next pattern for dialog box) 05294.    INX ; X++ (next index in graphics buffer) 05295.  05296.    DEC <Temp_Var1 ; Temp_Var1-- 05297.    BNE PRG024_BA94 ; While Temp_Var1 > 0, loop! 05298.  05299.    ; Insert terminator 05300.    LDA #$00 05301.    STA Graphics_Buffer+3,X 05302.  05303.    ; X += 3 05304.    INX 05305.    INX 05306.    INX 05307.    STX Graphics_BufCnt 05308.  05309.    INC <EndText_CPos ; Next row 05310.  05311.    LDA <EndText_CPos 05312.    CMP #(PDiagBox_RowOffs_End - PDiagBox_RowOffs) 05313.    BLT PRG024_BAC8 ; If rows to go, jump to PRG024_BAC8 (RTS) 05314.  05315.    LDY #$00 ; Y = 0 05316.  05317.    ; This basically just amounts to a zero; kind of strange? 05318.    LDA PRG024_BB23,Y 05319.    STA <EndText_CPos 05320.  05321.    ; EndText_VH = $92 05322.    LDA #$29 05323.    STA <EndText_VH 05324.  05325.    ; EndText_VL = $69 05326.    LDA #$69 05327.    STA <EndText_VL 05328.  05329.    ; EndText_Timer = $10 05330.    LDA #$10 05331.    STA <EndText_Timer 05332.  05333.    INC <EndText_State ; EndText_State = 1 05334.  05335. PRG024_BAC8: 05336.    RTS ; Return 05337.  05338.    ; English: "Thank you. But" / "our Princess is" / "in another" / "castle!...Just" / "kidding! Ha ha" / "ha! Bye bye." 05339. EndText: 05340.  05341.    ; T h a n k y o u . B u t 05342.    .byte $C3, $D7, $D0, $DD, $DA, $FE, $8C, $DE, $CE, $E9, $FE, $B1, $CE, $CD, $FE 05343.  05344.    ; o u r P r i n c e s s i s  05345.    .byte $DE, $CE, $CB, $FE, $BF, $CB, $D8, $DD, $D2, $D4, $CC, $CC, $FE, $D8, $CC 05346.  05347.    ; i n a n o t h e r  05348.    .byte $D8, $DD, $FE, $D0, $DD, $DE, $CD, $D7, $D4, $CB, $FE, $FE, $FE, $FE, $FE 05349.  05350.    ; c a s t l e ! . . . J u s t 05351.    .byte $D2, $D0, $CC, $CD, $DB, $D4, $EA, $E9, $E9, $E9, $B9, $CE, $CC, $CD, $FE 05352.  05353.    ; k i d d i n g ! H a h a  05354.    .byte $DA, $D8, $D3, $D3, $D8, $DD, $D6, $EA, $FE, $B7, $D0, $FE, $D7, $D0, $FE 05355.  05356.    ; h a ! B y e b y e . 05357.    .byte $D7, $D0, $EA, $FE, $B1, $8C, $D4, $FE, $D1, $8C, $D4, $E9, $FE, $FE, $FE 05358.  05359. PRG024_BB23: 05360.    ; Terminator 05361.    .byte $00 05362.  05363. EndText_DoPrincessText: 05364.    LDA <EndText_Timer 05365.    BNE PRG024_BB70 ; If the timer is not expired, jump to PRG024_BB70 (RTS) 05366.  05367.    LDX Graphics_BufCnt ; X = current graphics buffer count 05368.  05369.    LDY <EndText_CPos ; Y = dialog message character position 05370.  05371.    ; Insert one character into graphics buffer 05372.    LDA <EndText_VH 05373.    STA Graphics_Buffer,X ; address high 05374.    LDA #$01  05375.    STA Graphics_Buffer+2,X ; run length 05376.    LDA EndText,Y 05377.    STA Graphics_Buffer+3,X ; Next character from Princess speech 05378.    LDA #$00 05379.    STA Graphics_Buffer+4,X ; terminator 05380.  05381.    ; Update Graphics_BufCnt 05382.    TXA 05383.    ADD #$04 05384.    STA Graphics_BufCnt 05385.  05386.    ; VRAM low address 05387.    LDA <EndText_VL 05388.    STA Graphics_Buffer+1,X 05389.  05390.    INC <EndText_CPos ; Next character in message 05391.    INC <EndText_VL ; Next VRAM byte 05392.  05393.    AND #$1f ; Get current column 05394.    CMP #$17 05395.    BNE PRG024_BB6C ; If we're not in column 23, jump to PRG024_BB6C 05396.  05397.    ; Line break! 05398.  05399.    LDA <EndText_VL  05400.    ADC #$10 ; Add enough bytes to get to next row 05401.    STA <EndText_VL  05402.    BCC PRG024_BB62 05403.    INC <EndText_VH ; Apply carry 05404. PRG024_BB62: 05405.  05406.    CMP #$29 05407.    BNE PRG024_BB6C ; If we haven't reached the last character, jump to PRG024_BB6C 05408.  05409.    INC <EndText_State ; EndText_State = 2 05410.  05411.    ; Second ending timer = $4A 05412.    LDA #$4a 05413.    STA <Ending_Timer+1 05414.  05415. PRG024_BB6C: 05416.  05417.    ; First ending timer = $0B 05418.    LDA #$0b 05419.    STA <Ending_Timer 05420.  05421. PRG024_BB70: 05422.    RTS ; Return 05423.  05424.  05425. EndText_Wait: 05426.    LDA <Ending_Timer+1 05427.    BNE PRG024_BB7B ; If second ending timer has not expired, jump to PRG024_BB7B (RTS) 05428.  05429.    ; First ending timer = $0F 05430.    LDA #$0f 05431.    STA <Ending_Timer 05432.  05433.    INC <Ending_State ; Ending_State = 6 05434.  05435. PRG024_BB7B: 05436.    RTS ; Return 05437.  05438. Ending_Credits: 05439.    ; Debug menu credits jump here 05440.  05441.    ; Curtain and floor top 05442.    LDA #$7c 05443.    STA PatTable_BankSel 05444.  05445.    ; Rest of floor 05446.    LDA #$76 05447.    STA PatTable_BankSel+1 05448.  05449.    ; Disable display 05450.    LDA #$00 05451.    STA PPU_CTL2 05452.  05453.    ; Clear everything 05454.    JSR Sprite_RAM_Clear 05455.    JSR Reset_PPU_Clear_Nametables 05456.  05457.    ; Stop Update_Select activity temporarily 05458.    LDA #$01 05459.    STA UpdSel_Disable 05460.  05461.    ; Raster_Effect = $20 (Title/Ending style) 05462.    LDA #$20 05463.    STA Raster_Effect 05464.  05465.    ; Clears a lot of page 0 RAM 05466.    LDX #$f4 ; X = $F4 05467. PRG024_BB9D: 05468.    LDA #$00 05469.    STA <Temp_Var1,X 05470.  05471. PRG024_BBA1: 05472.    DEX ; X-- 05473.  05474.    ; Range between $6B-$75 is not cleared ... mainly protecting sound engine I think 05475.  05476.    CPX #Music_Base_L 05477.    BLT PRG024_BBAA ; If X < Music_Base_L, jump to PRG024_BBAA 05478.  05479.    CPX #World_Map_Y 05480.    BLT PRG024_BBA1 ; If X < World_Map_Y, jump to PRG024_BBA1 05481.  05482. PRG024_BBAA: 05483.    CPX #-1 05484.    BNE PRG024_BB9D ; While X >= 0, loop! 05485.  05486.    ; This clears some of the title screen area memory 05487.    LDX #$15 ; X = $15 05488. PRG024_BBB0: 05489.    LDA #$00 05490.    STA Title_MLAccelCnt,X 05491.  05492.    DEX ; X-- 05493.    BPL PRG024_BBB0 ; While X >= 0, loop 05494.  05495.    JSR Title_Display_Curtain ; Put up the curtain! 05496.  05497.    ; Push in the Checkerboard floor 05498.    LDA #$23 05499.    ASL A 05500.    TAY 05501.    LDA Video_Upd_Table2,Y 05502.    STA <Video_Upd_AddrL 05503.    LDA Video_Upd_Table2+1,Y 05504.    STA <Video_Upd_AddrH 05505.    JSR Video_Misc_Updates2 05506.  05507.    ; Set scroll at lowest point (technically, curtain fully raised) 05508.    LDA #$ef 05509.    STA <Vert_Scroll 05510.  05511.    ; Clip sprites/BG, show sprites/BG, and enable intensity 05512.    LDA #%00011110 05513.    STA <PPU_CTL2_Copy 05514.  05515.    ; Resume Update_Select activity 05516.    LDA #$00 05517.    STA UpdSel_Disable 05518.  05519.    ; Curtain extension 05520.    LDA #$24 05521.    STA Graphics_Queue 05522.  05523.    JSR GraphicsBuf_Prep_And_WaitVSyn2 05524.  05525.  05526.    ; This will push graphics command sets $5C, $5D, and $5E 05527.  05528.    ; Title_EventGrafX = $5C 05529.    LDA #$5c 05530.    STA <Title_EventGrafX  05531.  05532.    ; Title_Ticker = 5 05533.    LDA #$05 05534.    STA <Title_Ticker 05535. PRG024_BBE9: 05536.    JSR GraphicsBuf_Prep_And_WaitVSyn2 ; Push out graphics or just VSync 05537.  05538.    DEC <Title_Ticker 05539.    BPL PRG024_BBE9 ; If Title_Ticker >= 0, loop! 05540.  05541.    ; Title_Ticker = 3 05542.    LDA #$03 05543.    STA <Title_Ticker 05544.  05545.    ; Queue next event 05546.    LDA <Title_EventGrafX 05547.    STA Graphics_Queue 05548.  05549.    INC <Title_EventGrafX ; Title_EventGrafX++ 05550.  05551.    LDA <Title_EventGrafX 05552.    CMP #$5f 05553.    BNE PRG024_BBE9 ; While Title_EventGrafX <> $5F, loop! 05554.  05555.    ; Ending2_TimerH = $F 05556.    LDA #$0f 05557.    STA <Ending2_TimerH 05558.  05559.    ; Ending2_TimerL = $16 05560.    LDA #$16 05561.    STA <Ending2_TimerL 05562.  05563.    ; Commit the dynamic graphics buffer 05564.    LDA #$00 05565.    STA <Title_EventGrafX 05566.  05567. PRG024_BC0D: 05568.    JSR GraphicsBuf_Prep_And_WaitVSyn2 05569.  05570.    LDA <Title_EventGrafX 05571.    BNE PRG024_BC21 ; If Title_EventGrafX <> 0 (curtain at the bottom), jump to PRG024_BC21 05572.  05573.    ; Lowering curtain 05574.    LDA <Vert_Scroll 05575.    SUB #$01 05576.    STA <Vert_Scroll 05577.  05578.    CMP #$3f 05579.    BNE PRG024_BC21 ; If Vert_Scroll <> $3F (curtain all the way down), jump to PRG024_BC21 05580.  05581.    INC <Title_EventGrafX ; Title_EventGrafX = 1 (flags curtain at the bottom) 05582.  05583. PRG024_BC21: 05584.  05585.    ; Ending2_TimerL-- 05586.    LDA <Ending2_TimerL 05587.    SUB #$01 05588.    STA <Ending2_TimerL 05589.    BCS PRG024_BC0D ; If Ending2_TimerL didn't underflow, loop 05590.  05591.    ; Ending2_TimerL = $16 05592.    LDA #$16 05593.    STA <Ending2_TimerL 05594.  05595.    DEC <Ending2_TimerH ; Ending2_TimerH-- 05596.    BPL PRG024_BC0D ; While Ending2_TimerH >= 0, loop 05597.  05598. PRG024_BC32: 05599.    JSR GraphicsBuf_Prep_And_WaitVSyn2 ; Probably mainly for VSync 05600.  05601.    JSR Ending2_DoEndPic ; Update and draw end picture per world 05602.  05603.    LDA <Ending2_CurWorld 05604.    CMP #$08 05605.    BNE PRG024_BC32 ; While Ending2_CurWorld <> 8, loop! 05606.  05607.    ; Ending2_CurWorld = 0 05608.    LDA #$00 05609.    STA <Ending2_CurWorld 05610.  05611.    LDY #$44 ; Y = $44 (all sprites used in ending) 05612. PRG024_BC44: 05613.  05614.    ; Clear this sprite 05615.    LDA #$f8 05616.    STA Sprite_RAM,Y 05617.  05618.    ; Y -= 4 (previous sprite) 05619.    DEY 05620.    DEY 05621.    DEY 05622.    DEY 05623.  05624.    BPL PRG024_BC44 ; While Y >= 0, loop 05625.  05626. PRG024_BC4F: 05627.    JSR GraphicsBuf_Prep_And_WaitVSyn2 ; V Sync  05628.  05629.    DEC <Vert_Scroll ; Vert_Scroll-- (lowering curtain for finale) 05630.  05631.    LDA <Vert_Scroll 05632.    CMP #$3f 05633.    BNE PRG024_BC4F ; While curtain not completely lowered, loop! 05634.  05635.    ; Title_Ticker = $55 05636.    LDA #$55 05637.    STA <Title_Ticker 05638.  05639. PRG024_BC5E: 05640.    JSR GraphicsBuf_Prep_And_WaitVSyn2 ; Vsync 05641.  05642.    DEC <Title_Ticker ; Title_Ticker-- 05643.    BPL PRG024_BC5E ; While Title_Ticker >= 0, loop 05644.  05645.    ; Load graphics for "THE END" 05646.    LDA #$1b 05647.    STA PatTable_BankSel+5 05648.  05649.    ; Copy in sprite bytes to form THE END 05650.    LDY #(Ending2_THEEND_End - Ending2_THEEND - 1) 05651. PRG024_BC6C: 05652.    LDA Ending2_THEEND,Y 05653.    STA Sprite_RAM,Y 05654.  05655.    DEY ; Y-- 05656.    BPL PRG024_BC6C ; While Y >= 0, loop 05657.  05658.    ; Title_Ticker = 3 05659.    LDA #$03 05660.    STA <Title_Ticker 05661.  05662.    ; Title_EventGrafX = 3 (going to cycle through all palettes for THE END to fade in) 05663.    LDA #$03 05664.    STA <Title_EventGrafX 05665.  05666.    ; Graphics_Queue = $5B 05667.    LDA #$5b 05668.    STA Graphics_Queue 05669.  05670. PRG024_BC82: 05671.    JSR GraphicsBuf_Prep_And_WaitVSyn2 ; V Sync 05672.  05673.    DEC <Title_Ticker ; Title_Ticker-- 05674.    BNE PRG024_BC82 ; While Title_Ticker <> 0, loop 05675.  05676.    DEC <Title_EventGrafX ; Title_EventGrafX-- 05677.    BMI PRG024_BCAE ; If Title_EventGrafX < 0, jump to PRG024_BCAE 05678.  05679.    ; Title_Ticker = 3 05680.    LDA #$03 05681.    STA <Title_Ticker 05682.  05683.    ; Set attribute on all THE END sprites 05684.    LDA <Title_EventGrafX 05685.    STA Sprite_RAM+$02 05686.    STA Sprite_RAM+$06 05687.    STA Sprite_RAM+$0A 05688.    STA Sprite_RAM+$0E 05689.    STA Sprite_RAM+$12 05690.    STA Sprite_RAM+$16 05691.    STA Sprite_RAM+$1A 05692.    STA Sprite_RAM+$1E 05693.  05694.    JMP PRG024_BC82 ; Jump to PRG024_BC82 (loop) 05695.  05696. PRG024_BCAE: 05697.    JSR GraphicsBuf_Prep_And_WaitVSyn2 ; V Sync 05698.  05699.    LDA <Pad_Input  05700.    AND #PAD_START 05701.    BEQ PRG024_BCAE ; While Player has not pressed START, loop 05702.  05703.    ; Stop music 05704.    LDA #MUS1_STOPMUSIC 05705.    STA Sound_QMusic1 05706.  05707.    JSR GraphicsBuf_Prep_And_WaitVSyn2 ; V Sync 05708.  05709.    ; Disable display 05710.    LDA #$00 05711.    STA PPU_CTL2 05712.    STA PPU_CTL1 05713.  05714.    ; Map_Unused7992 = 0 (used only in dead code it seems) 05715.    LDA #$00 05716.    STA Map_Unused7992 05717.  05718.    ; Temp_Var1 = 0 05719.    LDY #$00 05720.    STY <Temp_Var1 05721.  05722.    ; Temp_Var2 = $7F 05723.    LDA #$7f 05724.    STA <Temp_Var2 05725.  05726.    ; Clearing RAM $7FFF through $6000 05727. PRG024_BCD4: 05728.    LDA #$00 05729.    STA [Temp_Var1],Y 05730.  05731.    DEY ; Y-- 05732.    BNE PRG024_BCD4 ; While Y <> 0 (come full circle), loop 05733.  05734.    DEC <Temp_Var2 ; Temp_Var2-- (previous page of RAM) 05735.  05736.    LDA <Temp_Var2 05737.    CMP #$5f 05738.    BNE PRG024_BCD4 ; While Temp_Var2 <> $5F, loop 05739.  05740.  05741.    ; P-Wings for everybody! 05742.    LDX #$01 ; X = 1 05743.    LDY #(Inventory_Cards - Inventory_Items - 1) 05744. PRG024_BCE7: 05745.  05746.    LDA #(Inventory_Cards - Inventory_Items - 1) 05747.    STA <Temp_Var1 05748.  05749.    LDA #$08 ; A = 8 (P-Wing) 05750. PRG024_BCED: 05751.    STA Inventory_Items,Y ; Here's another P-Wing 05752.  05753.    DEY ; Y-- 05754.  05755.    DEC <Temp_Var1 ; Temp_Var1-- 05756.    BPL PRG024_BCED ; While Temp_Var1 >= 0, loop 05757.  05758.    DEX ; X-- 05759.    BMI PRG024_BD01 ; If X < 0, jump to PRG024_BD01 05760.  05761.    LDA #(Inventory_Cards - Inventory_Items - 1) 05762.    ADD #(Inventory_Items2 - Inventory_Items) 05763.  05764.    TAY ; Reset 'Y' 05765.    JMP PRG024_BCE7 ; Loop 05766.  05767. PRG024_BD01: 05768.  05769.  05770.    ; Clear $07FF - $0000, excluding $01xx 05771.    LDY #$07 05772.    JSR Clear_RAM_thru_ZeroPage 05773.  05774.    ; Reset_Latch = $5A (magic value that prevents reset vector from being run) 05775.    LDA #$5a 05776.    STA Reset_Latch 05777.  05778.    ; N-Spade appears every 80,000 points, but the leading zero is fake, so 8000 05779.  05780.    ; Middle byte of the N-Spade score 05781.    LDA #HIGH(8000) 05782.    STA Map_NSpade_NextScore+1 05783.  05784.    ; Lowest byte of the N-Spade score 05785.    LDA #LOW(8000) 05786.    STA Map_NSpade_NextScore+2 05787.  05788.    ; If they jumped a little earlier, they could've included the N-Spade score init, strangely 05789.    JMP PRG030_845A ; Jump to PRG030_845A 05790.  05791.    ; THE END sprites 05792. Ending2_THEEND: 05793.    .byte $60, $F1, $03, $60 05794.    .byte $60, $F3, $03, $68 05795.    .byte $60, $F5, $03, $70 05796.    .byte $60, $F7, $03, $78 05797.    .byte $60, $F9, $03, $80 05798.    .byte $60, $FB, $03, $88 05799.    .byte $60, $FD, $03, $90 05800.    .byte $60, $FF, $03, $98 05801. Ending2_THEEND_End 05802.  05803. Do_Ending2_IntCmd: 05804.    DEC <Ending2_IntCmd ; Ending2_IntCmd-- (because it is zero based, and zero is "Do nothing") 05805.    LDA <Ending2_IntCmd 05806.    JSR DynJump 05807.  05808.    ; THESE MUST FOLLOW DynJump FOR THE DYNAMIC JUMP TO WORK!! 05809.    .word Ending2_ClearScreen 05810.    .word Ending2_CommitPicture 05811.   05812. Ending2_DoEndPic: 05813.    ; Ending2_IntCmd = 0 (disable interrupt routine command) 05814.    LDA #$00 05815.    STA <Ending2_IntCmd 05816.  05817.    LDA <Ending2_PicState 05818.    JSR DynJump 05819.  05820.    ; THESE MUST FOLLOW DynJump FOR THE DYNAMIC JUMP TO WORK!! 05821.    .word Ending2_CurtainRaise ; 0: Raise the curtain back up 05822.    .word Ending2_PrepClear ; 1: Prepare for screen clear 05823.    .word Ending2_SetFlag1 ; 2: Sets Ending2_IntCmd = 1 and waits for interrupt context (which will call Do_Ending2_IntCmd) 05824.    .word Ending2_PrepEndPic ; 3: Load up the Ending_CmdBuffer, set starting VRAM address for world end picture 05825.    .word Ending2_SetFlag2 ; 4: Sets Ending2_IntCmd = 2 and waits for interrupt context (which will call Do_Ending2_IntCmd) 05826.    .word Ending2_SeriesQueue ; 5: Queue a series of Graphics_Command (Ending2_QueueCmd++ until Ending2_QCmdEnd) 05827.    .word Ending2_AddSprites ; 6: Add sprites that are part of the end picture 05828.    .word Ending2_FadeIn ; 7: Fade in the palette 05829.    .word Ending2_Wait ; 8: Wait on current world picture 05830.    .word Ending2_FadeOut ; 9: Fade out the palette 05831.  05832. Ending2_CurtainRaise: 05833.    LDY #$01 ; Y = 1 (two stabs at curtain being fully raised) 05834. PRG024_BD62: 05835.    INC <Vert_Scroll ; Vert_Scroll++ (raising the curtain) 05836.  05837.    LDA <Vert_Scroll 05838.    CMP #$ef 05839.    BEQ PRG024_BD6E ; If curtain is fully raised, jump to PRG024_BD6E 05840.  05841.    DEY ; Y-- 05842.    BPL PRG024_BD62 ; While Y >= 0, loop 05843.  05844.    RTS ; Return 05845.  05846. PRG024_BD6E: 05847.    INC <Ending2_PicState ; Ending2_PicState = 1 05848.    RTS ; Return 05849.  05850. Ending2_PrepClear: 05851.    ; Set Ending2_PicVRAMH/L 05852.    LDA #$28 05853.    STA <Ending2_PicVRAMH 05854.    LDA #$60 05855.    STA <Ending2_PicVRAML 05856.  05857.    ; Ending2_ClearLen = $14 05858.    LDA #$14 05859.    STA <Ending2_ClearLen 05860.  05861.    ; Ending2_ClearPat = $5C 05862.    LDA #$5c 05863.    STA <Ending2_ClearPat 05864.  05865.    INC <Ending2_PicState ; Ending2_PicState = 2 05866.  05867.    RTS ; Return 05868.  05869. Ending2_SetFlag1: 05870.    ; Ending2_IntCmd = 1 05871.    LDA #$01 05872.    STA <Ending2_IntCmd 05873.  05874.    RTS ; Return 05875.  05876.  05877. Ending2_ClearScreen: 05878.    LDA <Ending2_PicVRAMH 05879.    CMP #$2b 05880.    BEQ PRG024_BDBB ; If Ending2_PicVRAMH = $2b, jump to Ending2_PicVRAMH 05881.  05882.    LDA PPU_STAT 05883.  05884.    ; Set VRAM Address to Ending2_PicVRAMH/L 05885.    LDA <Ending2_PicVRAMH 05886.    STA PPU_VRAM_ADDR 05887.    LDA <Ending2_PicVRAML 05888.    STA PPU_VRAM_ADDR 05889.  05890.    LDY #$1f ; Y = $1F 05891.    LDA <Ending2_ClearPat ; Get the clearing pattern 05892. PRG024_BDA0: 05893.    STA PPU_VRAM_DATA ; Store pattern 05894.  05895.    DEY ; Y-- 05896.    BPL PRG024_BDA0 ; While Y >= 0, loop 05897.  05898.    DEC <Ending2_ClearLen ; Ending2_ClearLen-- 05899.    BPL PRG024_BDB7 ; If Ending2_ClearLen >= 0, jump to PRG024_BDB7 05900.  05901.    ; Set Ending2_PicVRAMH  05902.    LDA #$2b 05903.    STA <Ending2_PicVRAMH 05904.    LDA #$c8 05905.    STA <Ending2_PicVRAML 05906.  05907.    ; Ending2_ClearLen = 4 05908.    LDA #$04 05909.    STA <Ending2_ClearLen 05910.  05911.    RTS ; Return 05912.  05913. PRG024_BDB7: 05914.    JSR Ending2_PicVRAM_NextLineWrap 05915.  05916.    RTS ; Return 05917.  05918. PRG024_BDBB: 05919.    LDA PPU_STAT 05920.  05921.    ; Set VRAM Address to Ending2_PicVRAMH/L 05922.    LDA <Ending2_PicVRAMH 05923.    STA PPU_VRAM_ADDR 05924.    LDA <Ending2_PicVRAML 05925.    STA PPU_VRAM_ADDR 05926.  05927.    LDY #$07 ; Y = $07 05928.    LDA #$aa ; Pattern $AA 05929. PRG024_BDCC: 05930.    STA PPU_VRAM_DATA ; Store pattern 05931.  05932.    DEY ; Y-- 05933.    BPL PRG024_BDCC ; While Y >= 0, loop 05934.  05935.    DEC <Ending2_ClearLen ; Ending2_ClearLen---- 05936.    BPL PRG024_BDD8 ; If Ending2_ClearLen >= 0, jump to PRG024_BDD8 05937.  05938.    INC <Ending2_PicState ; Ending2_PicState++ 05939.  05940. PRG024_BDD8: 05941.  05942.    ; Ending2_PicVRAML += 8 05943.    LDA <Ending2_PicVRAML 05944.    ADD #$08 05945.    STA <Ending2_PicVRAML 05946.  05947.    RTS ; Return 05948.  05949. Ending2_PrepEndPic: 05950.    LDY <Ending2_CurWorld ; Y = current world we're depicting 05951.  05952.    ; Temp_Var2/1 hold the address to the end world picture 05953.    LDA EndPicByWorld_H,Y 05954.    STA <Temp_Var2 05955.    LDA EndPicByWorld_L,Y 05956.    STA <Temp_Var1 05957.  05958.    LDY #$00 ; Y = 0 (EndPic command index) 05959.    LDX #$00 ; X = 0 (Ending_CmdBuffer index) 05960. PRG024_BDF0: 05961.    ; Next command byte -> Temp_Var16 05962.    LDA [Temp_Var1],Y 05963.    STA <Temp_Var16  05964.  05965.    AND #$80 05966.    BEQ PRG024_BE02 ; If bit 7 is NOT set, jump to PRG024_BE02 05967.  05968.    ; Bit 7 set... 05969.  05970.    ; Clear bit 7 05971.    LDA <Temp_Var16 05972.    AND #$7f 05973.    STA <Temp_Var16 05974.  05975.    ; Store byte into buffer 05976.    STA Ending_CmdBuffer,X 05977.    INX ; X++ (next buffer byte) 05978.  05979. PRG024_BE02: 05980.  05981.    ; Bit 7 not set (or just continued) 05982.  05983.    ; Store byte into buffer 05984.    LDA <Temp_Var16  05985.    STA Ending_CmdBuffer,X 05986.    INX ; X++ (next buffer byte) 05987.  05988.    INY ; Y++ (next EndPic command byte) 05989.  05990.    CPX #$c1 05991.    BLT PRG024_BDF0 ; While buffer index < $C1, loop! 05992.  05993.    ; Buffer filled... 05994.  05995.    LDY <Ending2_CurWorld ; Y = current world we're depicting 05996.  05997.    ; Set starting VRAM address 05998.    LDA EndPic_VRAMStart_H,Y 05999.    STA <Ending2_PicVRAMH 06000.    LDA EndPic_VRAMStart_L,Y 06001.    STA <Ending2_PicVRAML 06002.  06003.    INC <Ending2_PicState ; Ending2_PicState = 4 06004.  06005.    ; Ending2_ClearLen = $B 06006.    LDA #$0b 06007.    STA <Ending2_ClearLen 06008.  06009.    ; Ending2_QCmdEnd = 0 06010.    LDA #$00 06011.    STA <Ending2_QCmdEnd 06012.  06013.    RTS ; Return 06014.  06015. Ending2_SetFlag2: 06016.    ; Ending2_IntCmd = 2 06017.    LDA #$02 06018.    STA <Ending2_IntCmd 06019.  06020.    RTS ; Return 06021.  06022.  06023. PRG024_BE29: 06024.    .byte $2A, $2E, $32, $36, $3A, $3E, $44, $49 06025. PRG024_BE31: 06026.    .byte $2D, $31, $35, $39, $3D, $43, $48, $4C 06027.  06028. Ending2_CommitPicture: 06029.    LDA PPU_STAT  06030.  06031.    ; Set VRAM Address to Ending2_PicVRAMH/L 06032.    LDA <Ending2_PicVRAMH 06033.    STA PPU_VRAM_ADDR 06034.    LDA <Ending2_PicVRAML 06035.    STA PPU_VRAM_ADDR 06036.  06037.    LDX #$0f ; X = 4 06038.    LDY <Ending2_QCmdEnd ; Y = Ending2_QCmdEnd 06039. PRG024_BE4A: 06040.  06041.    ; Buffer -> PPU_VRAM_DATA 06042.    LDA Ending_CmdBuffer,Y 06043.    STA PPU_VRAM_DATA 06044.  06045.    INY ; Y++ 06046.    DEX ; X-- 06047.    BPL PRG024_BE4A ; While X >= 0, loop 06048.  06049.    STY <Ending2_QCmdEnd ; Update Ending2_QCmdEnd 06050.  06051.    JSR Ending2_PicVRAM_NextLineWrap ; Next line 06052.  06053.    DEC <Ending2_ClearLen ; Ending2_ClearLen-- 06054.    BPL PRG024_BE6B ; If Ending2_ClearLen >= 0, jump to PRG024_BE6B (RTS) 06055.  06056.    INC <Ending2_PicState ; Ending2_PicState++ 06057.  06058.    LDX <Ending2_CurWorld ; X = current world we're depicting 06059.  06060.    LDA PRG024_BE29,X 06061.    STA <Ending2_QueueCmd 06062.  06063.    LDA PRG024_BE31,X 06064.    STA <Ending2_QCmdEnd 06065.  06066. PRG024_BE6B: 06067.    RTS ; Return 06068.  06069. Ending2_SeriesQueue: 06070.    ; Execute next command 06071.    LDA <Ending2_QueueCmd 06072.    STA <Graphics_Queue 06073.  06074.    CMP <Ending2_QCmdEnd 06075.    BNE PRG024_BE76 ; If this is not the last series command to execute, jump to PRG024_BE76 06076.  06077.    ; Last command executed! 06078.    INC <Ending2_PicState ; Ending2_PicState = 6 06079.  06080. PRG024_BE76: 06081.    INC <Ending2_QueueCmd ; Ending2_QueueCmd++ 06082.  06083.    RTS ; Return 06084.  06085. Ending2_AddSprites: 06086.  06087.    ; Clear ending sprites 06088.    LDA #$f8 06089.    STA Sprite_RAM+$24 06090.    STA Sprite_RAM+$28 06091.    STA Sprite_RAM+$2C 06092.    STA Sprite_RAM+$30 06093.    STA Sprite_RAM+$34 06094.    STA Sprite_RAM+$38 06095.    STA Sprite_RAM+$3C 06096.    STA Sprite_RAM+$40 06097.    STA Sprite_RAM+$44 06098.  06099.    LDY <Ending2_CurWorld ; Y = current world we're depicting 06100.  06101.    ; Load pattern tables required for this world picture sprites 06102.    LDA Ending2_EndPicPatTable2,Y 06103.    STA PatTable_BankSel+2 06104.    LDA Ending2_EndPicPatTable3,Y 06105.    STA PatTable_BankSel+3 06106.    LDA Ending2_EndPicPatTable4,Y 06107.    STA PatTable_BankSel+4 06108.    LDA Ending2_EndPicPatTable5,Y 06109.    STA PatTable_BankSel+5 06110.  06111.    ; Load starting address for sprite list 06112.    LDA Ending2_EndPicSpriteListH,Y 06113.    STA <Temp_Var2 06114.    LDA Ending2_EndPicSpriteListL,Y 06115.    STA <Temp_Var1 06116.  06117.    ; Load length of sprite list 06118.    LDA Ending2_EndPicSpriteListLen,Y 06119.    TAY 06120.  06121.    ; Copy sprite data in 06122. PRG024_BEBE: 06123.    LDA [Temp_Var1],Y 06124.    STA Sprite_RAM,Y 06125.  06126.    DEY ; Y-- 06127.    BPL PRG024_BEBE ; While Y >= 0, loop 06128.  06129.    INC <Ending2_PicState ; Ending2_PicState = 7 06130.  06131.    ; Ending2_FadeTimer = 3 06132.    LDA #$03 06133.    STA <Ending2_FadeTimer 06134.  06135.    ; Ending2_QueueCmd = $26 06136.    LDA #$26 06137.    STA <Ending2_QueueCmd 06138.  06139.    RTS ; Return 06140.  06141.  06142. Ending2_FadeIn: 06143.    DEC <Ending2_FadeTimer ; Ending2_FadeTimer-- 06144.    BPL PRG024_BEFB ; If Ending2_FadeTimer >= 0, jump to PRG024_BEFB (RTS) 06145.  06146.    ; Reload Ending2_FadeTimer = 3 06147.    LDA #$03 06148.    STA <Ending2_FadeTimer 06149.  06150.    ; Queue graphics command 06151.    LDA <Ending2_QueueCmd 06152.    STA Graphics_Queue 06153.  06154.    CMP #$2a 06155.    BNE PRG024_BEF9 ; If Ending2_QueueCmd <> $2A, jump to PRG024_BEF9 06156.  06157.    INC <Ending2_PicState ; Ending2_PicState = 8 06158.  06159.    ; Queue the full palette (fade in is common) 06160.    LDA <Ending2_CurWorld ; A = current world we're depicting 06161.    ADD #$4d 06162.    STA Graphics_Queue 06163.  06164.    ; Ending2_TimerH = $F 06165.    LDA #$0f 06166.    STA <Ending2_TimerH 06167.  06168.    ; Ending2_TimerL = $16 06169.    LDA #$16 06170.    STA <Ending2_TimerL 06171.  06172.    ; Ending2_QueueCmd = $06 06173.    LDA #(Ending2_FadeOutQs_End - Ending2_FadeOutQs - 1) 06174.    STA <Ending2_QueueCmd 06175.  06176.    RTS ; Return 06177.  06178. PRG024_BEF9: 06179.    INC <Ending2_QueueCmd ; Ending2_QueueCmd++ 06180.  06181. PRG024_BEFB: 06182.    RTS ; Return 06183.  06184. Ending2_Wait: 06185.    ; Ending2_TimerL-- 06186.    LDA <Ending2_TimerL 06187.    SUB #$01 06188.    STA <Ending2_TimerL 06189.    BCS PRG024_BF13 ; If Ending2_TimerL >= 0, jump to PRG024_BF13 (RTS) 06190.  06191.    ; Ending2_TimerL = $16 06192.    LDA #$16 06193.    STA <Ending2_TimerL 06194.  06195.    DEC <Ending2_TimerH ; Ending2_TimerH-- 06196.    BPL PRG024_BF13 ; If Ending2_TimerH >= 0, jump to PRG024_BF13 (RTS) 06197.  06198.    INC <Ending2_PicState ; Ending2_PicState = 9 06199.  06200.    ; Ending2_FadeTimer = 3 06201.    LDA #$03 06202.    STA <Ending2_FadeTimer 06203.  06204. PRG024_BF13: 06205.    RTS ; Return 06206.  06207.    ; Fade out command queues 06208. Ending2_FadeOutQs: 06209.    .byte $25, $26, $27, $28, $28, $28, $28 06210. Ending2_FadeOutQs_End 06211.     06212. Ending2_FadeOut: 06213.    DEC <Ending2_FadeTimer 06214.    BPL PRG024_BF37 ; If Ending2_FadeTimer >= 0, jump to PRG024_BF37 (RTS) 06215.  06216.    ; Ending2_FadeTimer = 3 06217.    LDA #$03 06218.    STA <Ending2_FadeTimer 06219.  06220.    LDX <Ending2_QueueCmd ; X = Ending2_QueueCmd (current index) 06221.  06222.    ; Queue next fade command 06223.    LDA Ending2_FadeOutQs,X 06224.    STA Graphics_Queue 06225.  06226.    CMP #$25 06227.    BNE PRG024_BF35 ; If current queue command <> $25, jump to PRG024_BF35 06228.  06229.    ; Restart ending picture generation 06230.    LDA #$01 06231.    STA <Ending2_PicState ; Ending2_PicState = 1 06232.  06233.    INC <Ending2_CurWorld ; Ending2_CurWorld++ (display next world in series) 06234.  06235. PRG024_BF35: 06236.    DEC <Ending2_QueueCmd ; Ending2_QueueCmd-- 06237.  06238. PRG024_BF37: 06239.    RTS ; Return 06240.  06241.  06242. ; FIXME: Anybody want to claim this?? 06243. ; Seems to be called by dead code, would advance to next row or wrap around; maybe a clearing routine? 06244. Ending2_PicVRAM_NextLineWrap: 06245.  06246.    ; Add 32 to VRAM address for next row 06247.    LDA <Ending2_PicVRAML 06248.    ADD #32 06249.    STA <Ending2_PicVRAML 06250.    LDA <Ending2_PicVRAMH 06251.    ADC #$00 06252.    STA <Ending2_PicVRAMH 06253.  06254.    CMP #$28 06255.    BGE PRG024_BF5D ; If VRAM High address >= $28, jump to PRG024_BF5D (RTS) 06256.  06257.    CMP #$23 06258.    BLT PRG024_BF5D ; If VRAM High address < $23, jump to PRG024_BF5D (RTS) 06259.  06260.    LDA <Ending2_PicVRAML 06261.    CMP #$c0 06262.    BLT PRG024_BF5D ; If VRAM Low address < $C0, jump to PRG024_BF5D (RTS) 06263.  06264.    ; This will wrap the VRAM address to the top (???) 06265.  06266.    ; Ending2_PicVRAMH = $28 06267.    LDA #$28 06268.    STA <Ending2_PicVRAMH 06269.  06270.    ; Column on top row 06271.    LDA <Ending2_PicVRAML 06272.    AND #$1f 06273.    STA <Ending2_PicVRAML 06274.  06275. PRG024_BF5D: 06276.    RTS ; Return 06277.  06278.    ; PatTable_BankSel+X values (sprite pattern tables) loaded per "world" of ending picture 06279. Ending2_EndPicPatTable2: .byte $57, $53, $51, $00, $43, $02, $44, $54 06280. Ending2_EndPicPatTable3: .byte $00, $04, $00, $76, $76, $76, $04, $76 06281. Ending2_EndPicPatTable4: .byte $57, $4E, $1A, $1A, $00, $0B, $00, $00 06282. Ending2_EndPicPatTable5: .byte $4F, $4F, $00, $00, $4F, $4F, $4F, $00 06283.  06284.    ; Split address, parallel tables for the starting address of the end picture sprite lists for each world 06285. Ending2_EndPicSpriteListH:  06286.    .byte HIGH(Ending2_EndPicSprites1) 06287.    .byte HIGH(Ending2_EndPicSprites2) 06288.    .byte HIGH(Ending2_EndPicSprites3) 06289.    .byte HIGH(Ending2_EndPicSprites4) 06290.    .byte HIGH(Ending2_EndPicSprites5) 06291.    .byte HIGH(Ending2_EndPicSprites6) 06292.    .byte HIGH(Ending2_EndPicSprites7) 06293.    .byte HIGH(Ending2_EndPicSprites8) 06294.  06295. Ending2_EndPicSpriteListL: 06296.    .byte LOW(Ending2_EndPicSprites1) 06297.    .byte LOW(Ending2_EndPicSprites2) 06298.    .byte LOW(Ending2_EndPicSprites3) 06299.    .byte LOW(Ending2_EndPicSprites4) 06300.    .byte LOW(Ending2_EndPicSprites5) 06301.    .byte LOW(Ending2_EndPicSprites6) 06302.    .byte LOW(Ending2_EndPicSprites7) 06303.    .byte LOW(Ending2_EndPicSprites8) 06304.  06305.    ; Length of the sprite list per world - 1 (or last index, if you prefer) 06306. Ending2_EndPicSpriteListLen:  06307.    .byte (Ending2_EndPicSprites1_End - Ending2_EndPicSprites1 - 1) 06308.    .byte (Ending2_EndPicSprites2_End - Ending2_EndPicSprites2 - 1) 06309.    .byte (Ending2_EndPicSprites3_End - Ending2_EndPicSprites3 - 1) 06310.    .byte (Ending2_EndPicSprites4_End - Ending2_EndPicSprites4 - 1) 06311.    .byte (Ending2_EndPicSprites5_End - Ending2_EndPicSprites5 - 1) 06312.    .byte (Ending2_EndPicSprites6_End - Ending2_EndPicSprites6 - 1) 06313.    .byte (Ending2_EndPicSprites7_End - Ending2_EndPicSprites7 - 1) 06314.    .byte (Ending2_EndPicSprites8_End - Ending2_EndPicSprites8 - 1) 06315.  06316. Ending2_EndPicSprites1: 06317.    .byte $81, $19, $00, $B0 06318.    .byte $81, $1B, $00, $B8 06319.    .byte $91, $1D, $00, $B0 06320.    .byte $91, $21, $00, $B8 06321.    .byte $B1, $EB, $01, $B8 06322.    .byte $B1, $EB, $41, $C0 06323.    .byte $B1, $D9, $01, $80 06324.    .byte $B1, $DB, $41, $88 06325.    .byte $B1, $D9, $01, $90 06326.    .byte $B1, $DB, $41, $98 06327. Ending2_EndPicSprites1_End 06328.  06329. Ending2_EndPicSprites2: 06330.    .byte $79, $1B, $40, $38 06331.    .byte $79, $19, $40, $40 06332.    .byte $99, $67, $01, $50 06333.    .byte $B1, $65, $01, $70 06334.    .byte $A9, $85, $01, $88 06335.    .byte $A9, $87, $01, $90 06336.    .byte $B9, $A5, $01, $88 06337.    .byte $B9, $A7, $01, $90 06338.    .byte $91, $8D, $02, $A8 06339.    .byte $91, $8F, $02, $B0 06340.    .byte $99, $B1, $02, $D0 06341.    .byte $99, $B3, $02, $D8 06342.    .byte $A9, $B5, $02, $D0 06343.    .byte $A9, $B7, $02, $D8 06344. Ending2_EndPicSprites2_End 06345.  06346. Ending2_EndPicSprites3: 06347.    .byte $3F, $B1, $01, $30 06348.    .byte $3F, $B1, $41, $38 06349.    .byte $47, $B5 06350.  06351.    ; List continued in PRG025 06352.  06353.  06354.  06355.