.include "symbols.inc" .include "locals.inc" .segment "PRG" ;=============================================================================== ; Reset ; ; Global: ; Initializes the NES hardware and game RAM, validates the warm-start ; signature, initializes game-specific state, and transfers control to the ; remainder of the reset path at CPU $C07F. ; ; Parameters: ; None. ; ; Returns: ; Does not return. Execution continues in the preserved PRG region. ; ; PRG offsets: $0000-$007E ; CPU range: $C000-$C07E ; Size: $007F bytes ;=============================================================================== Reset: lda #$00 ; CPU:$C000 PRG:0000 A9 00 sta PPUCTRL ; CPU:$C002 PRG:0002 8D 00 20 sta PPUMASK ; CPU:$C005 PRG:0005 8D 01 20 WaitForVBlankSet: lda PPUSTATUS ; CPU:$C008 PRG:0008 AD 02 20 bpl WaitForVBlankSet ; CPU:$C00B PRG:000B 10 FB WaitForVBlankClear: lda PPUSTATUS ; CPU:$C00D PRG:000D AD 02 20 bmi WaitForVBlankClear ; CPU:$C010 PRG:0010 30 FB WaitForSecondVBlank: lda PPUSTATUS ; CPU:$C012 PRG:0012 AD 02 20 bpl WaitForSecondVBlank ; CPU:$C015 PRG:0015 10 FB sei ; CPU:$C017 PRG:0017 78 cld ; CPU:$C018 PRG:0018 D8 ldx #$FF ; CPU:$C019 PRG:0019 A2 FF txs ; CPU:$C01B PRG:001B 9A ldx #$12 ; CPU:$C01C PRG:001C A2 12 lda #$00 ; CPU:$C01E PRG:001E A9 00 ClearZeroPage: sta $00,x ; CPU:$C020 PRG:0020 95 00 inx ; CPU:$C022 PRG:0022 E8 bne ClearZeroPage ; CPU:$C023 PRG:0023 D0 FB ldx #$02 ; CPU:$C025 PRG:0025 A2 02 CheckSavedSignature: lda $07FA,x ; CPU:$C027 PRG:0027 BD FA 07 cmp $C082,x ; CPU:$C02A PRG:002A DD 82 C0 bne InitializeMemory ; CPU:$C02D PRG:002D D0 05 dex ; CPU:$C02F PRG:002F CA bpl CheckSavedSignature ; CPU:$C030 PRG:0030 10 F5 bmi SavedSignatureValid ; CPU:$C032 PRG:0032 30 43 InitializeMemory: ldx #$00 ; CPU:$C034 PRG:0034 A2 00 txa ; CPU:$C036 PRG:0036 8A ClearZeroPageAndStackPage: sta $00,x ; CPU:$C037 PRG:0037 95 00 sta $0700,x ; CPU:$C039 PRG:0039 9D 00 07 inx ; CPU:$C03C PRG:003C E8 bne ClearZeroPageAndStackPage ; CPU:$C03D PRG:003D D0 F8 lda #$32 ; CPU:$C03F PRG:003F A9 32 sta $15 ; CPU:$C041 PRG:0041 85 15 InitializeBlockLoop: lda #$32 ; CPU:$C043 PRG:0043 A9 32 jsr $D6DE ; CPU:$C045 PRG:0045 20 DE D6 lda #$00 ; CPU:$C048 PRG:0048 A9 00 sta $46 ; CPU:$C04A PRG:004A 85 46 jsr $C579 ; CPU:$C04C PRG:004C 20 79 C5 dec $15 ; CPU:$C04F PRG:004F C6 15 bne InitializeBlockLoop ; CPU:$C051 PRG:0051 D0 F0 ldx #$0E ; CPU:$C053 PRG:0053 A2 0E CopyInitializationData: lda $C085,x ; CPU:$C055 PRG:0055 BD 85 C0 sta $0629,x ; CPU:$C058 PRG:0058 9D 29 06 dex ; CPU:$C05B PRG:005B CA bpl CopyInitializationData ; CPU:$C05C PRG:005C 10 F7 ldx #$04 ; CPU:$C05E PRG:005E A2 04 ClearLocalVariables: lda #$00 ; CPU:$C060 PRG:0060 A9 00 sta $03,x ; CPU:$C062 PRG:0062 95 03 dex ; CPU:$C064 PRG:0064 CA bpl ClearLocalVariables ; CPU:$C065 PRG:0065 10 F9 lda #$00 ; CPU:$C067 PRG:0067 A9 00 jsr $D6DE ; CPU:$C069 PRG:0069 20 DE D6 ldx #$02 ; CPU:$C06C PRG:006C A2 02 CopySavedSignature: lda $C082,x ; CPU:$C06E PRG:006E BD 82 C0 sta $07FA,x ; CPU:$C071 PRG:0071 9D FA 07 dex ; CPU:$C074 PRG:0074 CA bpl CopySavedSignature ; CPU:$C075 PRG:0075 10 F7 SavedSignatureValid: lda #$1E ; CPU:$C077 PRG:0077 A9 1E sta $01 ; CPU:$C079 PRG:0079 85 01 lda #$90 ; CPU:$C07B PRG:007B A9 90 sta $00 ; CPU:$C07D PRG:007D 85 00 ; Decoded PRG block $007F-$046A. EnterMainInitialization: jmp MainInitialization ; CPU:$C07F PRG:007F 4C D4 F1 WarmStartSignature: .byte "HAL" ; CPU:$C082 PRG:0082 48 41 4C ResetInitializationData: .byte $00, $00, $00, $01, $00, $00, $00, $00 ; CPU:$C083 PRG:0083 00 00 00 01 00 00 00 00 .byte $01, $00, $00, $00, $05, $02, $00 ; CPU:$C08B PRG:008B 01 00 00 00 05 02 00 ;=============================================================================== ; NmiHandler ; ; Global: ; Reachable game-engine routine identified during recursive Pass-1 tracing. ; ; Local: ; Performs the control flow beginning at CPU $C094; detailed semantics are ; refined as its RAM and table dependencies are traced. ; ; Parameters: ; Caller-defined register and global RAM state. ; ; Returns: ; Routine-specific result; register preservation remains provisional. ; ; PRG offset: $0094 ; CPU address: $C094 ;=============================================================================== NmiHandler: pha ; CPU:$C092 PRG:0092 48 txa ; CPU:$C093 PRG:0093 8A pha ; CPU:$C094 PRG:0094 48 tya ; CPU:$C095 PRG:0095 98 pha ; CPU:$C096 PRG:0096 48 lda #$00 ; CPU:$C097 PRG:0097 A9 00 sta $2003 ; CPU:$C099 PRG:0099 8D 03 20 lda #$02 ; CPU:$C09C PRG:009C A9 02 sta $4014 ; CPU:$C09E PRG:009E 8D 14 40 lda PpuBufferReadOffset ; CPU:$C0A1 PRG:00A1 A5 52 cmp PpuBufferWriteOffset ; CPU:$C0A3 PRG:00A3 C5 53 beq NmiHandler_Block ; CPU:$C0A5 PRG:00A5 F0 03 jsr FlushPpuCommandPreserved ; CPU:$C0A7 PRG:00A7 20 7C C1 NmiHandler_Block: jsr UpdatePpuTransferSources ; CPU:$C0AA PRG:00AA 20 0D D6 jsr BuildFrameOam ; CPU:$C0AD PRG:00AD 20 98 D7 inc FrameCounter ; CPU:$C0B0 PRG:00B0 E6 19 lda #$20 ; CPU:$C0B2 PRG:00B2 A9 20 sta $2006 ; CPU:$C0B4 PRG:00B4 8D 06 20 lda #$00 ; CPU:$C0B7 PRG:00B7 A9 00 sta $2006 ; CPU:$C0B9 PRG:00B9 8D 06 20 lda #$00 ; CPU:$C0BC PRG:00BC A9 00 sta $2005 ; CPU:$C0BE PRG:00BE 8D 05 20 sta $2005 ; CPU:$C0C1 PRG:00C1 8D 05 20 jsr UpdateAudioFrame ; CPU:$C0C4 PRG:00C4 20 F7 FF lda #$01 ; CPU:$C0C7 PRG:00C7 A9 01 sta NmiCompletedFlag ; CPU:$C0C9 PRG:00C9 85 02 lda RenderingDisabledFlag ; CPU:$C0CB PRG:00CB A5 16 beq NmiHandler_Block_3 ; CPU:$C0CD PRG:00CD F0 20 NmiHandler_Block_1: lda $2002 ; CPU:$C0CF PRG:00CF AD 02 20 bmi NmiHandler_Block_1 ; CPU:$C0D2 PRG:00D2 30 FB ldx #$04 ; CPU:$C0D4 PRG:00D4 A2 04 ldy #$C6 ; CPU:$C0D6 PRG:00D6 A0 C6 NmiHandler_Block_2: dey ; CPU:$C0D8 PRG:00D8 88 bne NmiHandler_Block_2 ; CPU:$C0D9 PRG:00D9 D0 FD dex ; CPU:$C0DB PRG:00DB CA bne NmiHandler_Block_2 ; CPU:$C0DC PRG:00DC D0 FA lda PpuControlBase ; CPU:$C0DE PRG:00DE A5 18 ora PpuControlShadow ; CPU:$C0E0 PRG:00E0 05 00 sta $2000 ; CPU:$C0E2 PRG:00E2 8D 00 20 lda PpuScrollX ; CPU:$C0E5 PRG:00E5 A5 17 sta $2005 ; CPU:$C0E7 PRG:00E7 8D 05 20 lda #$00 ; CPU:$C0EA PRG:00EA A9 00 sta $2005 ; CPU:$C0EC PRG:00EC 8D 05 20 NmiHandler_Block_3: pla ; CPU:$C0EF PRG:00EF 68 tay ; CPU:$C0F0 PRG:00F0 A8 pla ; CPU:$C0F1 PRG:00F1 68 tax ; CPU:$C0F2 PRG:00F2 AA pla ; CPU:$C0F3 PRG:00F3 68 rti ; CPU:$C0F4 PRG:00F4 40 ;=============================================================================== ; IrqHandler ; ; Global: ; Reachable game-engine routine identified during recursive Pass-1 tracing. ; ; Local: ; Performs the control flow beginning at CPU $C0F7; detailed semantics are ; refined as its RAM and table dependencies are traced. ; ; Parameters: ; Caller-defined register and global RAM state. ; ; Returns: ; Routine-specific result; register preservation remains provisional. ; ; PRG offset: $00F7 ; CPU address: $C0F7 ;=============================================================================== IrqHandler: jmp IrqHandler ; CPU:$C0F5 PRG:00F5 4C F7 C0 ;=============================================================================== ; DisableNmi ; ; Global: ; Reachable game-engine routine identified during recursive Pass-1 tracing. ; ; Local: ; Performs the control flow beginning at CPU $C0FA; detailed semantics are ; refined as its RAM and table dependencies are traced. ; ; Parameters: ; Caller-defined register and global RAM state. ; ; Returns: ; Routine-specific result; register preservation remains provisional. ; ; PRG offset: $00FA ; CPU address: $C0FA ;=============================================================================== DisableNmi: lda PpuControlShadow ; CPU:$C0F8 PRG:00F8 A5 00 and #$7F ; CPU:$C0FA PRG:00FA 29 7F DisableNmi_Block: sta $2000 ; CPU:$C0FC PRG:00FC 8D 00 20 sta PpuControlShadow ; CPU:$C0FF PRG:00FF 85 00 rts ; CPU:$C101 PRG:0101 60 ;=============================================================================== ; EnableNmi ; ; Global: ; Reachable game-engine routine identified during recursive Pass-1 tracing. ; ; Local: ; Performs the control flow beginning at CPU $C104; detailed semantics are ; refined as its RAM and table dependencies are traced. ; ; Parameters: ; Caller-defined register and global RAM state. ; ; Returns: ; Routine-specific result; register preservation remains provisional. ; ; PRG offset: $0104 ; CPU address: $C104 ;=============================================================================== EnableNmi: lda PpuControlShadow ; CPU:$C102 PRG:0102 A5 00 ora #$80 ; CPU:$C104 PRG:0104 09 80 bne DisableNmi_Block ; CPU:$C106 PRG:0106 D0 F4 ;=============================================================================== ; SetPpuControl ; ; Global: ; Reachable game-engine routine identified during recursive Pass-1 tracing. ; ; Local: ; Performs the control flow beginning at CPU $C10A; detailed semantics are ; refined as its RAM and table dependencies are traced. ; ; Parameters: ; Caller-defined register and global RAM state. ; ; Returns: ; Routine-specific result; register preservation remains provisional. ; ; PRG offset: $010A ; CPU address: $C10A ;=============================================================================== SetPpuControl: lda #$00 ; CPU:$C108 PRG:0108 A9 00 SetPpuControl_Block: pha ; CPU:$C10A PRG:010A 48 jsr WaitForFrame ; CPU:$C10B PRG:010B 20 65 F4 pla ; CPU:$C10E PRG:010E 68 sta $2001 ; CPU:$C10F PRG:010F 8D 01 20 rts ; CPU:$C112 PRG:0112 60 ;=============================================================================== ; SetPpuMask ; ; Global: ; Reachable game-engine routine identified during recursive Pass-1 tracing. ; ; Local: ; Performs the control flow beginning at CPU $C115; detailed semantics are ; refined as its RAM and table dependencies are traced. ; ; Parameters: ; Caller-defined register and global RAM state. ; ; Returns: ; Routine-specific result; register preservation remains provisional. ; ; PRG offset: $0115 ; CPU address: $C115 ;=============================================================================== SetPpuMask: lda PpuMaskShadow ; CPU:$C113 PRG:0113 A5 01 bne SetPpuControl_Block ; CPU:$C115 PRG:0115 D0 F3 ;=============================================================================== ; WaitForFrameAndSetPpuMask ; ; Global: ; Reachable game-engine routine identified during recursive Pass-1 tracing. ; ; Local: ; Performs the control flow beginning at CPU $C119; detailed semantics are ; refined as its RAM and table dependencies are traced. ; ; Parameters: ; Caller-defined register and global RAM state. ; ; Returns: ; Routine-specific result; register preservation remains provisional. ; ; PRG offset: $0119 ; CPU address: $C119 ;=============================================================================== WaitForFrameAndSetPpuMask: jsr BuildPpuCommand ; CPU:$C117 PRG:0117 20 54 C1 ldy #$00 ; CPU:$C11A PRG:011A A0 00 WaitForFrameAndSetPpuMask_Block: lda $0057,y ; CPU:$C11C PRG:011C B9 57 00 sta $0300,x ; CPU:$C11F PRG:011F 9D 00 03 inx ; CPU:$C122 PRG:0122 E8 iny ; CPU:$C123 PRG:0123 C8 cpy PpuCommandLength ; CPU:$C124 PRG:0124 C4 56 bne WaitForFrameAndSetPpuMask_Block ; CPU:$C126 PRG:0126 D0 F4 stx PpuBufferWriteOffset ; CPU:$C128 PRG:0128 86 53 rts ; CPU:$C12A PRG:012A 60 ;=============================================================================== ; CopyBytesToPpuBuffer ; ; Global: ; Reachable game-engine routine identified during recursive Pass-1 tracing. ; ; Local: ; Performs the control flow beginning at CPU $C12D; detailed semantics are ; refined as its RAM and table dependencies are traced. ; ; Parameters: ; Caller-defined register and global RAM state. ; ; Returns: ; Routine-specific result; register preservation remains provisional. ; ; PRG offset: $012D ; CPU address: $C12D ;=============================================================================== CopyBytesToPpuBuffer: lda #$57 ; CPU:$C12B PRG:012B A9 57 ldy #$00 ; CPU:$C12D PRG:012D A0 00 ;=============================================================================== ; AppendBytesToPpuBuffer ; ; Global: ; Reachable game-engine routine identified during recursive Pass-1 tracing. ; ; Local: ; Performs the control flow beginning at CPU $C131; detailed semantics are ; refined as its RAM and table dependencies are traced. ; ; Parameters: ; Caller-defined register and global RAM state. ; ; Returns: ; Routine-specific result; register preservation remains provisional. ; ; PRG offset: $0131 ; CPU address: $C131 ;=============================================================================== AppendBytesToPpuBuffer: sta PpuSourcePtrLo ; CPU:$C12F PRG:012F 85 21 sty PpuSourcePtrHi ; CPU:$C131 PRG:0131 84 22 txa ; CPU:$C133 PRG:0133 8A pha ; CPU:$C134 PRG:0134 48 ldy #$02 ; CPU:$C135 PRG:0135 A0 02 ;=============================================================================== ; AppendLengthPrefixedPpuData ; ; Global: ; Reachable game-engine routine identified during recursive Pass-1 tracing. ; ; Local: ; Performs the control flow beginning at CPU $C139; detailed semantics are ; refined as its RAM and table dependencies are traced. ; ; Parameters: ; Caller-defined register and global RAM state. ; ; Returns: ; Routine-specific result; register preservation remains provisional. ; ; PRG offset: $0139 ; CPU address: $C139 ;=============================================================================== AppendLengthPrefixedPpuData: lda (PpuSourcePtrLo),y ; CPU:$C137 PRG:0137 B1 21 clc ; CPU:$C139 PRG:0139 18 adc #$03 ; CPU:$C13A PRG:013A 69 03 sta Temp12 ; CPU:$C13C PRG:013C 85 12 ldx PpuBufferWriteOffset ; CPU:$C13E PRG:013E A6 53 ldy #$00 ; CPU:$C140 PRG:0140 A0 00 AppendLengthPrefixedPpuData_Block: lda (PpuSourcePtrLo),y ; CPU:$C142 PRG:0142 B1 21 sta $0300,x ; CPU:$C144 PRG:0144 9D 00 03 inx ; CPU:$C147 PRG:0147 E8 iny ; CPU:$C148 PRG:0148 C8 cpy Temp12 ; CPU:$C149 PRG:0149 C4 12 bne AppendLengthPrefixedPpuData_Block ; CPU:$C14B PRG:014B D0 F5 stx PpuBufferWriteOffset ; CPU:$C14D PRG:014D 86 53 pla ; CPU:$C14F PRG:014F 68 tax ; CPU:$C150 PRG:0150 AA rts ; CPU:$C151 PRG:0151 60 ;=============================================================================== ; BuildPpuCommand ; ; Global: ; Builds a PPU command-buffer entry from the pending command address/length. ; ; Local: ; Formats the PPU command (address high byte with $20 prefix, address low ; byte, length) and writes it into the command buffer at $0300. ; ; Parameters: ; PpuCommandAddressLo/Hi ($55/$54), PpuCommandLength ($56), ; PpuBufferWriteOffset ($53). ; ; Returns: ; PpuBufferWriteOffset advanced; command bytes appended to $0300 buffer. ; ; PRG offset: $0154 ; CPU address: $C154 ;=============================================================================== BuildPpuCommand: ldx PpuBufferWriteOffset ; CPU:$C152 PRG:0152 A6 53 lda #$00 ; CPU:$C154 PRG:0154 A9 00 sta Temp12 ; CPU:$C156 PRG:0156 85 12 lda PpuCommandAddressLo ; CPU:$C158 PRG:0158 A5 55 asl a ; CPU:$C15A PRG:015A 0A asl a ; CPU:$C15B PRG:015B 0A asl a ; CPU:$C15C PRG:015C 0A asl a ; CPU:$C15D PRG:015D 0A rol Temp12 ; CPU:$C15E PRG:015E 26 12 asl a ; CPU:$C160 PRG:0160 0A ;=============================================================================== ; AppendPpuAddressAndLength ; ; Global: ; Reachable game-engine routine identified during recursive Pass-1 tracing. ; ; Local: ; Performs the control flow beginning at CPU $C163; detailed semantics are ; refined as its RAM and table dependencies are traced. ; ; Parameters: ; Caller-defined register and global RAM state. ; ; Returns: ; Routine-specific result; register preservation remains provisional. ; ; PRG offset: $0163 ; CPU address: $C163 ;=============================================================================== AppendPpuAddressAndLength: rol Temp12 ; CPU:$C161 PRG:0161 26 12 ora PpuCommandAddressHi ; CPU:$C163 PRG:0163 05 54 pha ; CPU:$C165 PRG:0165 48 lda Temp12 ; CPU:$C166 PRG:0166 A5 12 ora #$20 ; CPU:$C168 PRG:0168 09 20 sta $0300,x ; CPU:$C16A PRG:016A 9D 00 03 inx ; CPU:$C16D PRG:016D E8 pla ; CPU:$C16E PRG:016E 68 sta $0300,x ; CPU:$C16F PRG:016F 9D 00 03 inx ; CPU:$C172 PRG:0172 E8 lda PpuCommandLength ; CPU:$C173 PRG:0173 A5 56 sta $0300,x ; CPU:$C175 PRG:0175 9D 00 03 inx ; CPU:$C178 PRG:0178 E8 rts ; CPU:$C179 PRG:0179 60 ;=============================================================================== ; FlushPpuCommandPreserved ; ; Global: ; Flushes the PPU command buffer while preserving the X and Y registers. ; ; Local: ; Saves X/Y, calls PreserveXYAndFinalizePpuCommand to walk the $0300 command ; buffer and write pending PPU updates, then restores X/Y. ; ; Parameters: ; PpuBufferReadOffset/WriteOffset ($52/$53). ; ; Returns: ; X and Y preserved; PPU command buffer drained. ; ; PRG offset: $017C ; CPU address: $C17C ;=============================================================================== FlushPpuCommandPreserved: tya ; CPU:$C17A PRG:017A 98 pha ; CPU:$C17B PRG:017B 48 txa ; CPU:$C17C PRG:017C 8A pha ; CPU:$C17D PRG:017D 48 jsr PreserveXYAndFinalizePpuCommand ; CPU:$C17E PRG:017E 20 88 C1 pla ; CPU:$C181 PRG:0181 68 tax ; CPU:$C182 PRG:0182 AA pla ; CPU:$C183 PRG:0183 68 tay ; CPU:$C184 PRG:0184 A8 rts ; CPU:$C185 PRG:0185 60 ;=============================================================================== ; PreserveXYAndFinalizePpuCommand ; ; Global: ; Reachable game-engine routine identified during recursive Pass-1 tracing. ; ; Local: ; Performs the control flow beginning at CPU $C188; detailed semantics are ; refined as its RAM and table dependencies are traced. ; ; Parameters: ; Caller-defined register and global RAM state. ; ; Returns: ; Routine-specific result; register preservation remains provisional. ; ; PRG offset: $0188 ; CPU address: $C188 ;=============================================================================== PreserveXYAndFinalizePpuCommand: ldx PpuBufferReadOffset ; CPU:$C186 PRG:0186 A6 52 lda $0300,x ; CPU:$C188 PRG:0188 BD 00 03 inx ; CPU:$C18B PRG:018B E8 sta PpuDestinationHi ; CPU:$C18C PRG:018C 85 50 sta $2006 ; CPU:$C18E PRG:018E 8D 06 20 ;=============================================================================== ; FlushPpuCommandBuffer ; ; Global: ; Reachable game-engine routine identified during recursive Pass-1 tracing. ; ; Local: ; Performs the control flow beginning at CPU $C193; detailed semantics are ; refined as its RAM and table dependencies are traced. ; ; Parameters: ; Caller-defined register and global RAM state. ; ; Returns: ; Routine-specific result; register preservation remains provisional. ; ; PRG offset: $0193 ; CPU address: $C193 ;=============================================================================== FlushPpuCommandBuffer: lda $0300,x ; CPU:$C191 PRG:0191 BD 00 03 inx ; CPU:$C194 PRG:0194 E8 sta $2006 ; CPU:$C195 PRG:0195 8D 06 20 ldy $0300,x ; CPU:$C198 PRG:0198 BC 00 03 inx ; CPU:$C19B PRG:019B E8 FlushPpuCommandBuffer_Block: lda $0300,x ; CPU:$C19C PRG:019C BD 00 03 inx ; CPU:$C19F PRG:019F E8 sta $2007 ; CPU:$C1A0 PRG:01A0 8D 07 20 dey ; CPU:$C1A3 PRG:01A3 88 bne FlushPpuCommandBuffer_Block ; CPU:$C1A4 PRG:01A4 D0 F6 lda PpuDestinationHi ; CPU:$C1A6 PRG:01A6 A5 50 cmp #$3F ; CPU:$C1A8 PRG:01A8 C9 3F bne FlushPpuCommandBuffer_Block_1 ; CPU:$C1AA PRG:01AA D0 10 lda #$3F ; CPU:$C1AC PRG:01AC A9 3F sta $2006 ; CPU:$C1AE PRG:01AE 8D 06 20 lda #$00 ; CPU:$C1B1 PRG:01B1 A9 00 sta $2006 ; CPU:$C1B3 PRG:01B3 8D 06 20 sta $2006 ; CPU:$C1B6 PRG:01B6 8D 06 20 sta $2006 ; CPU:$C1B9 PRG:01B9 8D 06 20 FlushPpuCommandBuffer_Block_1: stx PpuBufferReadOffset ; CPU:$C1BC PRG:01BC 86 52 cpx PpuBufferWriteOffset ; CPU:$C1BE PRG:01BE E4 53 bne PreserveXYAndFinalizePpuCommand ; CPU:$C1C0 PRG:01C0 D0 C4 rts ; CPU:$C1C2 PRG:01C2 60 FlushPpuCommandBuffer_Block_2: lda #$20 ; CPU:$C1C3 PRG:01C3 A9 20 sta $F2 ; CPU:$C1C5 PRG:01C5 85 F2 jsr $C527 ; CPU:$C1C7 PRG:01C7 20 27 C5 jsr $C539 ; CPU:$C1CA PRG:01CA 20 39 C5 lda #$FF ; CPU:$C1CD PRG:01CD A9 FF sta $CD ; CPU:$C1CF PRG:01CF 85 CD lda #$AD ; CPU:$C1D1 PRG:01D1 A9 AD sta SpawnCommandPointerLo ; CPU:$C1D3 PRG:01D3 85 23 lda #$C4 ; CPU:$C1D5 PRG:01D5 A9 C4 sta SpawnCommandPointerHi ; CPU:$C1D7 PRG:01D7 85 24 lda #$80 ; CPU:$C1D9 PRG:01D9 A9 80 sta $91 ; CPU:$C1DB PRG:01DB 85 91 sta $0488 ; CPU:$C1DD PRG:01DD 8D 88 04 lda #$70 ; CPU:$C1E0 PRG:01E0 A9 70 sta $9A ; CPU:$C1E2 PRG:01E2 85 9A jsr InitializeParticleSlots ; CPU:$C1E4 PRG:01E4 20 4A CD lda #$00 ; CPU:$C1E7 PRG:01E7 A9 00 sta $41 ; CPU:$C1E9 PRG:01E9 85 41 sta $C9 ; CPU:$C1EB PRG:01EB 85 C9 sta $CA ; CPU:$C1ED PRG:01ED 85 CA sta $BA ; CPU:$C1EF PRG:01EF 85 BA sta $C5 ; CPU:$C1F1 PRG:01F1 85 C5 sta $C8 ; CPU:$C1F3 PRG:01F3 85 C8 jsr InitializeAudio ; CPU:$C1F5 PRG:01F5 20 A5 F4 ldx #$13 ; CPU:$C1F8 PRG:01F8 A2 13 FlushPpuCommandBuffer_Block_3: lda #$FF ; CPU:$C1FA PRG:01FA A9 FF sta $0530,x ; CPU:$C1FC PRG:01FC 9D 30 05 lda #$F0 ; CPU:$C1FF PRG:01FF A9 F0 sta $04A4,x ; CPU:$C201 PRG:0201 9D A4 04 dex ; CPU:$C204 PRG:0204 CA bpl FlushPpuCommandBuffer_Block_3 ; CPU:$C205 PRG:0205 10 F3 FlushPpuCommandBuffer_Block_4: jsr $F470 ; CPU:$C207 PRG:0207 20 70 F4 jsr UpdateGameplayObjects ; CPU:$C20A PRG:020A 20 91 E6 lda $C5 ; CPU:$C20D PRG:020D A5 C5 bne FlushPpuCommandBuffer_Block_5 ; CPU:$C20F PRG:020F D0 03 jsr UpdateSpecialObjectSystem ; CPU:$C211 PRG:0211 20 F9 C6 FlushPpuCommandBuffer_Block_5: lda FrameCounter ; CPU:$C214 PRG:0214 A5 19 lsr a ; CPU:$C216 PRG:0216 4A bcs FlushPpuCommandBuffer_Block_6 ; CPU:$C217 PRG:0217 B0 03 jmp RunGameplayFrame_Block_8 ; CPU:$C219 PRG:0219 4C D0 C2 FlushPpuCommandBuffer_Block_6: lda $C5 ; CPU:$C21C PRG:021C A5 C5 beq RunGameplayFrame ; CPU:$C21E PRG:021E F0 05 dec $C5 ; CPU:$C220 PRG:0220 C6 C5 jmp RunGameplayFrame_Block_8 ; CPU:$C222 PRG:0222 4C D0 C2 ;=============================================================================== ; RunGameplayFrame ; ; Global: ; Reachable game-engine routine identified during recursive Pass-1 tracing. ; ; Local: ; Performs the control flow beginning at CPU $C227; detailed semantics are ; refined as its RAM and table dependencies are traced. ; ; Parameters: ; Caller-defined register and global RAM state. ; ; Returns: ; Routine-specific result; register preservation remains provisional. ; ; PRG offset: $0227 ; CPU address: $C227 ;=============================================================================== RunGameplayFrame: lda PpuScrollX ; CPU:$C225 PRG:0225 A5 17 bne RunGameplayFrame_Block ; CPU:$C227 PRG:0227 D0 06 lda PpuControlBase ; CPU:$C229 PRG:0229 A5 18 eor #$01 ; CPU:$C22B PRG:022B 49 01 sta PpuControlBase ; CPU:$C22D PRG:022D 85 18 RunGameplayFrame_Block: dec PpuScrollX ; CPU:$C22F PRG:022F C6 17 lda $0488 ; CPU:$C231 PRG:0231 AD 88 04 beq RunGameplayFrame_Block_2 ; CPU:$C234 PRG:0234 F0 15 inc $0488 ; CPU:$C236 PRG:0236 EE 88 04 lda $0488 ; CPU:$C239 PRG:0239 AD 88 04 cmp #$F0 ; CPU:$C23C PRG:023C C9 F0 bcc RunGameplayFrame_Block_1 ; CPU:$C23E PRG:023E 90 05 lda #$00 ; CPU:$C240 PRG:0240 A9 00 sta $0488 ; CPU:$C242 PRG:0242 8D 88 04 RunGameplayFrame_Block_1: lda $BD ; CPU:$C245 PRG:0245 A5 BD beq RunGameplayFrame_Block_2 ; CPU:$C247 PRG:0247 F0 02 inc $91 ; CPU:$C249 PRG:0249 E6 91 RunGameplayFrame_Block_2: ldx #$07 ; CPU:$C24B PRG:024B A2 07 RunGameplayFrame_Block_3: lda $055D,x ; CPU:$C24D PRG:024D BD 5D 05 bmi RunGameplayFrame_Block_4 ; CPU:$C250 PRG:0250 30 19 inc $0567,x ; CPU:$C252 PRG:0252 FE 67 05 lda $0567,x ; CPU:$C255 PRG:0255 BD 67 05 cmp #$F8 ; CPU:$C258 PRG:0258 C9 F8 bne RunGameplayFrame_Block_4 ; CPU:$C25A PRG:025A D0 0F lda #$FF ; CPU:$C25C PRG:025C A9 FF sta $055D,x ; CPU:$C25E PRG:025E 9D 5D 05 lda #$F0 ; CPU:$C261 PRG:0261 A9 F0 sta $057B,x ; CPU:$C263 PRG:0263 9D 7B 05 lda #$00 ; CPU:$C266 PRG:0266 A9 00 sta $05CE ; CPU:$C268 PRG:0268 8D CE 05 RunGameplayFrame_Block_4: dex ; CPU:$C26B PRG:026B CA bpl RunGameplayFrame_Block_3 ; CPU:$C26C PRG:026C 10 DF ldx #$13 ; CPU:$C26E PRG:026E A2 13 RunGameplayFrame_Block_5: lda $0530,x ; CPU:$C270 PRG:0270 BD 30 05 bmi RunGameplayFrame_Block_6 ; CPU:$C273 PRG:0273 30 12 inc $0490,x ; CPU:$C275 PRG:0275 FE 90 04 lda $0490,x ; CPU:$C278 PRG:0278 BD 90 04 cmp #$F8 ; CPU:$C27B PRG:027B C9 F8 bcc RunGameplayFrame_Block_6 ; CPU:$C27D PRG:027D 90 08 lda #$F0 ; CPU:$C27F PRG:027F A9 F0 sta $04A4,x ; CPU:$C281 PRG:0281 9D A4 04 sta $0530,x ; CPU:$C284 PRG:0284 9D 30 05 RunGameplayFrame_Block_6: dex ; CPU:$C287 PRG:0287 CA bpl RunGameplayFrame_Block_5 ; CPU:$C288 PRG:0288 10 E6 lda PpuScrollX ; CPU:$C28A PRG:028A A5 17 and #$07 ; CPU:$C28C PRG:028C 29 07 bne RunGameplayFrame_Block_8 ; CPU:$C28E PRG:028E D0 3E ldx $88 ; CPU:$C290 PRG:0290 A6 88 dex ; CPU:$C292 PRG:0292 CA bmi RunGameplayFrame_Block_8 ; CPU:$C293 PRG:0293 30 39 lda #$00 ; CPU:$C295 PRG:0295 A9 00 sta $3E ; CPU:$C297 PRG:0297 85 3E lda #$01 ; CPU:$C299 PRG:0299 A9 01 jsr InitializeOrQueueObject ; CPU:$C29B PRG:029B 20 DE D6 inc $C9 ; CPU:$C29E PRG:029E E6 C9 lda $C9 ; CPU:$C2A0 PRG:02A0 A5 C9 and #$1F ; CPU:$C2A2 PRG:02A2 29 1F bne RunGameplayFrame_Block_7 ; CPU:$C2A4 PRG:02A4 D0 14 inc $CA ; CPU:$C2A6 PRG:02A6 E6 CA lda $CA ; CPU:$C2A8 PRG:02A8 A5 CA cmp #$0A ; CPU:$C2AA PRG:02AA C9 0A bne RunGameplayFrame_Block_7 ; CPU:$C2AC PRG:02AC D0 0C lda #$02 ; CPU:$C2AE PRG:02AE A9 02 sta $CA ; CPU:$C2B0 PRG:02B0 85 CA ldy $BA ; CPU:$C2B2 PRG:02B2 A4 BA iny ; CPU:$C2B4 PRG:02B4 C8 tya ; CPU:$C2B5 PRG:02B5 98 and #$03 ; CPU:$C2B6 PRG:02B6 29 03 sta $BA ; CPU:$C2B8 PRG:02B8 85 BA RunGameplayFrame_Block_7: ldx $CA ; CPU:$C2BA PRG:02BA A6 CA lda SpawnPatternIndexTable,x ; CPU:$C2BC PRG:02BC BD BF C3 asl a ; CPU:$C2BF PRG:02BF 0A tay ; CPU:$C2C0 PRG:02C0 A8 lda SpawnPatternHandlerTable,y ; CPU:$C2C1 PRG:02C1 B9 B5 C3 sta DispatchPointerLo ; CPU:$C2C4 PRG:02C4 85 25 lda $C3B6,y ; CPU:$C2C6 PRG:02C6 B9 B6 C3 sta DispatchPointerHi ; CPU:$C2C9 PRG:02C9 85 26 jsr DispatchSpawnPattern ; CPU:$C2CB PRG:02CB 20 B2 C3 RunGameplayFrame_Block_8: ldx #$07 ; CPU:$C2CE PRG:02CE A2 07 RunGameplayFrame_Block_9: lda $055D,x ; CPU:$C2D0 PRG:02D0 BD 5D 05 bmi RunGameplayFrame_Block_10 ; CPU:$C2D3 PRG:02D3 30 18 jsr $CECE ; CPU:$C2D5 PRG:02D5 20 CE CE lda $05CD ; CPU:$C2D8 PRG:02D8 AD CD 05 beq RunGameplayFrame_Block_10 ; CPU:$C2DB PRG:02DB F0 10 dec $05CD ; CPU:$C2DD PRG:02DD CE CD 05 inc $05CE ; CPU:$C2E0 PRG:02E0 EE CE 05 txa ; CPU:$C2E3 PRG:02E3 8A pha ; CPU:$C2E4 PRG:02E4 48 lda $0559 ; CPU:$C2E5 PRG:02E5 AD 59 05 jsr InitializeOrQueueObject ; CPU:$C2E8 PRG:02E8 20 DE D6 pla ; CPU:$C2EB PRG:02EB 68 tax ; CPU:$C2EC PRG:02EC AA RunGameplayFrame_Block_10: jsr $CE2F ; CPU:$C2ED PRG:02ED 20 2F CE dex ; CPU:$C2F0 PRG:02F0 CA bpl RunGameplayFrame_Block_9 ; CPU:$C2F1 PRG:02F1 10 DD ldx #$13 ; CPU:$C2F3 PRG:02F3 A2 13 RunGameplayFrame_Block_11: lda $0530,x ; CPU:$C2F5 PRG:02F5 BD 30 05 bmi RunGameplayFrame_Block_14 ; CPU:$C2F8 PRG:02F8 30 1B lda $C5 ; CPU:$C2FA PRG:02FA A5 C5 bne RunGameplayFrame_Block_13 ; CPU:$C2FC PRG:02FC D0 14 jsr $C9B6 ; CPU:$C2FE PRG:02FE 20 B6 C9 lda $04A4,x ; CPU:$C301 PRG:0301 BD A4 04 cmp #$02 ; CPU:$C304 PRG:0304 C9 02 bcs RunGameplayFrame_Block_12 ; CPU:$C306 PRG:0306 B0 03 jsr ReflectObjectYVelocity ; CPU:$C308 PRG:0308 20 4F CA RunGameplayFrame_Block_12: cmp #$D8 ; CPU:$C30B PRG:030B C9 D8 bcc RunGameplayFrame_Block_13 ; CPU:$C30D PRG:030D 90 03 jsr ReflectObjectYVelocity ; CPU:$C30F PRG:030F 20 4F CA RunGameplayFrame_Block_13: jsr $CB1C ; CPU:$C312 PRG:0312 20 1C CB RunGameplayFrame_Block_14: lda FrameCounter ; CPU:$C315 PRG:0315 A5 19 and #$07 ; CPU:$C317 PRG:0317 29 07 lsr a ; CPU:$C319 PRG:0319 4A tay ; CPU:$C31A PRG:031A A8 lda $C9DD,y ; CPU:$C31B PRG:031B B9 DD C9 pha ; CPU:$C31E PRG:031E 48 lda FrameCounter ; CPU:$C31F PRG:031F A5 19 lsr a ; CPU:$C321 PRG:0321 4A txa ; CPU:$C322 PRG:0322 8A bcc RunGameplayFrame_Block_15 ; CPU:$C323 PRG:0323 90 06 sta Temp12 ; CPU:$C325 PRG:0325 85 12 lda #$13 ; CPU:$C327 PRG:0327 A9 13 sbc Temp12 ; CPU:$C329 PRG:0329 E5 12 RunGameplayFrame_Block_15: asl a ; CPU:$C32B PRG:032B 0A asl a ; CPU:$C32C PRG:032C 0A tay ; CPU:$C32D PRG:032D A8 pla ; CPU:$C32E PRG:032E 68 sta $02B1,y ; CPU:$C32F PRG:032F 99 B1 02 lda $04A4,x ; CPU:$C332 PRG:0332 BD A4 04 sta $02B0,y ; CPU:$C335 PRG:0335 99 B0 02 lda $0490,x ; CPU:$C338 PRG:0338 BD 90 04 sta $02B3,y ; CPU:$C33B PRG:033B 99 B3 02 lda #$00 ; CPU:$C33E PRG:033E A9 00 sta $02B2,y ; CPU:$C340 PRG:0340 99 B2 02 dex ; CPU:$C343 PRG:0343 CA bpl RunGameplayFrame_Block_11 ; CPU:$C344 PRG:0344 10 AF lda $05CE ; CPU:$C346 PRG:0346 AD CE 05 cmp #$14 ; CPU:$C349 PRG:0349 C9 14 bcc RunGameplayFrame_Block_16 ; CPU:$C34B PRG:034B 90 20 inc $47 ; CPU:$C34D PRG:034D E6 47 lda #$00 ; CPU:$C34F PRG:034F A9 00 jsr InitializeOrQueueObject ; CPU:$C351 PRG:0351 20 DE D6 dec $47 ; CPU:$C354 PRG:0354 C6 47 lda #$10 ; CPU:$C356 PRG:0356 A9 10 sta $F2 ; CPU:$C358 PRG:0358 85 F2 inc $C8 ; CPU:$C35A PRG:035A E6 C8 jsr $D3ED ; CPU:$C35C PRG:035C 20 ED D3 jsr $C527 ; CPU:$C35F PRG:035F 20 27 C5 dec $C8 ; CPU:$C362 PRG:0362 C6 C8 ldx #$64 ; CPU:$C364 PRG:0364 A2 64 jsr $F45E ; CPU:$C366 PRG:0366 20 5E F4 lda #$20 ; CPU:$C369 PRG:0369 A9 20 sta $F2 ; CPU:$C36B PRG:036B 85 F2 RunGameplayFrame_Block_16: ldx #$F0 ; CPU:$C36D PRG:036D A2 F0 lda $0488 ; CPU:$C36F PRG:036F AD 88 04 beq RunGameplayFrame_Block_17 ; CPU:$C372 PRG:0372 F0 02 ldx #$88 ; CPU:$C374 PRG:0374 A2 88 RunGameplayFrame_Block_17: stx $0200 ; CPU:$C376 PRG:0376 8E 00 02 stx $0204 ; CPU:$C379 PRG:0379 8E 04 02 sta $0203 ; CPU:$C37C PRG:037C 8D 03 02 clc ; CPU:$C37F PRG:037F 18 adc #$08 ; CPU:$C380 PRG:0380 69 08 sta $0207 ; CPU:$C382 PRG:0382 8D 07 02 lda FrameCounter ; CPU:$C385 PRG:0385 A5 19 and #$03 ; CPU:$C387 PRG:0387 29 03 sta $0202 ; CPU:$C389 PRG:0389 8D 02 02 sta $0206 ; CPU:$C38C PRG:038C 8D 06 02 ldx #$E3 ; CPU:$C38F PRG:038F A2 E3 stx $0201 ; CPU:$C391 PRG:0391 8E 01 02 inx ; CPU:$C394 PRG:0394 E8 stx $0205 ; CPU:$C395 PRG:0395 8E 05 02 lda $88 ; CPU:$C398 PRG:0398 A5 88 bmi RunGameplayFrame_Block_18 ; CPU:$C39A PRG:039A 30 03 jmp FlushPpuCommandBuffer_Block_4 ; CPU:$C39C PRG:039C 4C 09 C2 RunGameplayFrame_Block_18: jsr SortOrInitializeRecords ; CPU:$C39F PRG:039F 20 79 C5 lda #$01 ; CPU:$C3A2 PRG:03A2 A9 01 sta $F0 ; CPU:$C3A4 PRG:03A4 85 F0 jsr WaitForFrame ; CPU:$C3A6 PRG:03A6 20 65 F4 lda #$02 ; CPU:$C3A9 PRG:03A9 A9 02 sta $F2 ; CPU:$C3AB PRG:03AB 85 F2 jmp $F36A ; CPU:$C3AD PRG:03AD 4C 6A F3 ;=============================================================================== ; DispatchSpawnPattern ; ; Global: ; Reachable game-engine routine identified during recursive Pass-1 tracing. ; ; Local: ; Performs the control flow beginning at CPU $C3B2; detailed semantics are ; refined as its RAM and table dependencies are traced. ; ; Parameters: ; Caller-defined register and global RAM state. ; ; Returns: ; Routine-specific result; register preservation remains provisional. ; ; PRG offset: $03B2 ; CPU address: $C3B2 ;=============================================================================== DispatchSpawnPattern: jmp ($0025) ; CPU:$C3B0 PRG:03B0 6C 25 00 SpawnPatternHandlerTable: .word SpawnFromCommandStream ; CPU:$C3B3 PRG:03B3 C9 C3 .word SpawnAtRandomPosition ; CPU:$C3B5 PRG:03B5 F7 C3 .word SpawnPatternNone ; CPU:$C3B7 PRG:03B7 3E C4 .word InitializeSpecialObject ; CPU:$C3B9 PRG:03B9 5F C4 .word SpawnPatternNoneAlt ; CPU:$C3BB PRG:03BB 5E C4 SpawnPatternIndexTable: .byte $00, $00, $02, $02, $02, $02, $02, $04, $03, $01 ; CPU:$C3BD PRG:03BD 00 00 02 02 02 02 02 04 03 01 ;=============================================================================== ; SpawnFromCommandStream ; ; Global: ; Reachable game-engine routine identified during recursive Pass-1 tracing. ; ; Local: ; Performs the control flow beginning at CPU $C3C9; detailed semantics are ; refined as its RAM and table dependencies are traced. ; ; Parameters: ; Caller-defined register and global RAM state. ; ; Returns: ; Routine-specific result; register preservation remains provisional. ; ; PRG offset: $03C9 ; CPU address: $C3C9 ;=============================================================================== SpawnFromCommandStream: ldy #$00 ; CPU:$C3C7 PRG:03C7 A0 00 lda (SpawnCommandPointerLo),y ; CPU:$C3C9 PRG:03C9 B1 23 inc SpawnCommandPointerLo ; CPU:$C3CB PRG:03CB E6 23 bne SpawnFromCommandStream_Block ; CPU:$C3CD PRG:03CD D0 02 inc SpawnCommandPointerHi ; CPU:$C3CF PRG:03CF E6 24 SpawnFromCommandStream_Block: tax ; CPU:$C3D1 PRG:03D1 AA beq SpawnFromCommandStream_Block_2 ; CPU:$C3D2 PRG:03D2 F0 20 asl a ; CPU:$C3D4 PRG:03D4 0A asl a ; CPU:$C3D5 PRG:03D5 0A asl a ; CPU:$C3D6 PRG:03D6 0A sta SpawnPixelPosition ; CPU:$C3D7 PRG:03D7 85 15 lda #$00 ; CPU:$C3D9 PRG:03D9 A9 00 sta SpawnParameter ; CPU:$C3DB PRG:03DB 85 14 txa ; CPU:$C3DD PRG:03DD 8A and #$C0 ; CPU:$C3DE PRG:03DE 29 C0 cmp #$80 ; CPU:$C3E0 PRG:03E0 C9 80 bne SpawnFromCommandStream_Block_1 ; CPU:$C3E2 PRG:03E2 D0 06 jsr AllocateEffectObject ; CPU:$C3E4 PRG:03E4 20 6B C4 jmp SpawnFromCommandStream ; CPU:$C3E7 PRG:03E7 4C C9 C3 SpawnFromCommandStream_Block_1: cmp #$00 ; CPU:$C3EA PRG:03EA C9 00 bne SpawnFromCommandStream_Block_2 ; CPU:$C3EC PRG:03EC D0 06 jsr $C486 ; CPU:$C3EE PRG:03EE 20 86 C4 jmp SpawnFromCommandStream ; CPU:$C3F1 PRG:03F1 4C C9 C3 SpawnFromCommandStream_Block_2: rts ; CPU:$C3F4 PRG:03F4 60 ;=============================================================================== ; SpawnAtRandomPosition ; ; Global: ; Reachable game-engine routine identified during recursive Pass-1 tracing. ; ; Local: ; Performs the control flow beginning at CPU $C3F7; detailed semantics are ; refined as its RAM and table dependencies are traced. ; ; Parameters: ; Caller-defined register and global RAM state. ; ; Returns: ; Routine-specific result; register preservation remains provisional. ; ; PRG offset: $03F7 ; CPU address: $C3F7 ;=============================================================================== SpawnAtRandomPosition: jsr GetRandomValue ; CPU:$C3F5 PRG:03F5 20 B3 F1 and #$7F ; CPU:$C3F8 PRG:03F8 29 7F cmp #$04 ; CPU:$C3FA PRG:03FA C9 04 bcc SpawnRandomObject ; CPU:$C3FC PRG:03FC 90 0C cmp #$18 ; CPU:$C3FE PRG:03FE C9 18 bcs SpawnRandomObject ; CPU:$C400 PRG:0400 B0 08 asl a ; CPU:$C402 PRG:0402 0A asl a ; CPU:$C403 PRG:0403 0A asl a ; CPU:$C404 PRG:0404 0A sta SpawnPixelPosition ; CPU:$C405 PRG:0405 85 15 jsr AllocateEffectObject ; CPU:$C407 PRG:0407 20 6B C4 ;=============================================================================== ; SpawnRandomObject ; ; Global: ; Spawns a gameplay object at a randomized screen position. ; ; Local: ; Picks a random Y position in the valid band, snaps it to a 32-pixel grid, ; derives a spawn parameter from random state and the spawn selector table, ; allocates a gameplay-object slot, then retries (optionally reflecting Y ; velocity) until the object is placed or the slot pool is exhausted. ; ; Parameters: ; RandomState ($1B), SpawnSelector ($BA), SpawnSelectorAdjustmentTable. ; ; Returns: ; A gameplay object allocated and initialized; X = slot ($00-$13) or $FF if ; the pool is full. ; ; PRG offset: $040C ; CPU address: $C40C ;=============================================================================== SpawnRandomObject: jsr GetRandomValue ; CPU:$C40A PRG:040A 20 B3 F1 and #$3F ; CPU:$C40D PRG:040D 29 3F cmp #$02 ; CPU:$C40F PRG:040F C9 02 bcc SpawnRandomObject_Block ; CPU:$C411 PRG:0411 90 24 cmp #$18 ; CPU:$C413 PRG:0413 C9 18 bcs SpawnRandomObject_Block ; CPU:$C415 PRG:0415 B0 20 asl a ; CPU:$C417 PRG:0417 0A asl a ; CPU:$C418 PRG:0418 0A asl a ; CPU:$C419 PRG:0419 0A sta SpawnPixelPosition ; CPU:$C41A PRG:041A 85 15 jsr GetRandomValue ; CPU:$C41C PRG:041C 20 B3 F1 and #$3F ; CPU:$C41F PRG:041F 29 3F ldx $BA ; CPU:$C421 PRG:0421 A6 BA adc SpawnSelectorAdjustmentTable,x ; CPU:$C423 PRG:0423 7D 3A C4 sta SpawnParameter ; CPU:$C426 PRG:0426 85 14 jsr $C486 ; CPU:$C428 PRG:0428 20 86 C4 jsr GetRandomValue ; CPU:$C42B PRG:042B 20 B3 F1 lsr a ; CPU:$C42E PRG:042E 4A bcc SpawnRandomObject ; CPU:$C42F PRG:042F 90 D9 jsr ReflectObjectYVelocity ; CPU:$C431 PRG:0431 20 4F CA jmp SpawnRandomObject ; CPU:$C434 PRG:0434 4C 0C C4 SpawnRandomObject_Block: rts ; CPU:$C437 PRG:0437 60 SpawnSelectorAdjustmentTable: .byte $20, $30, $40, $60 ; CPU:$C438 PRG:0438 20 30 40 60 ;=============================================================================== ; SpawnPatternNone ; ; Global: ; Reachable game-engine routine identified during recursive Pass-1 tracing. ; ; Local: ; Performs the control flow beginning at CPU $C43E; detailed semantics are ; refined as its RAM and table dependencies are traced. ; ; Parameters: ; Caller-defined register and global RAM state. ; ; Returns: ; Routine-specific result; register preservation remains provisional. ; ; PRG offset: $043E ; CPU address: $C43E ;=============================================================================== SpawnPatternNone: jsr GetRandomValue ; CPU:$C43C PRG:043C 20 B3 F1 and #$CF ; CPU:$C43F PRG:043F 29 CF bne SpawnAtRandomPosition ; CPU:$C441 PRG:0441 D0 B2 ldy $89 ; CPU:$C443 PRG:0443 A4 89 iny ; CPU:$C445 PRG:0445 C8 bne SpawnAtRandomPosition ; CPU:$C446 PRG:0446 D0 AD lda #$E6 ; CPU:$C448 PRG:0448 A9 E6 sta $9B ; CPU:$C44A PRG:044A 85 9B lda RandomState ; CPU:$C44C PRG:044C A5 1B and #$7F ; CPU:$C44E PRG:044E 29 7F adc #$40 ; CPU:$C450 PRG:0450 69 40 sta $92 ; CPU:$C452 PRG:0452 85 92 lda #$80 ; CPU:$C454 PRG:0454 A9 80 sta $89 ; CPU:$C456 PRG:0456 85 89 lda #$00 ; CPU:$C458 PRG:0458 A9 00 sta $80 ; CPU:$C45A PRG:045A 85 80 ;=============================================================================== ; SpawnPatternNoneAlt ; ; Global: ; Reachable game-engine routine identified during recursive Pass-1 tracing. ; ; Local: ; Performs the control flow beginning at CPU $C45E; detailed semantics are ; refined as its RAM and table dependencies are traced. ; ; Parameters: ; Caller-defined register and global RAM state. ; ; Returns: ; Routine-specific result; register preservation remains provisional. ; ; PRG offset: $045E ; CPU address: $C45E ;=============================================================================== SpawnPatternNoneAlt: rts ; CPU:$C45C PRG:045C 60 ;=============================================================================== ; InitializeSpecialObject ; ; Global: ; Reachable game-engine routine identified during recursive Pass-1 tracing. ; ; Local: ; Performs the control flow beginning at CPU $C45F; detailed semantics are ; refined as its RAM and table dependencies are traced. ; ; Parameters: ; Caller-defined register and global RAM state. ; ; Returns: ; Routine-specific result; register preservation remains provisional. ; ; PRG offset: $045F ; CPU address: $C45F ;=============================================================================== InitializeSpecialObject: jsr SpawnRandomObject ; CPU:$C45D PRG:045D 20 0C C4 jsr GetRandomValue ; CPU:$C460 PRG:0460 20 B3 F1 and #$7F ; CPU:$C463 PRG:0463 29 7F sta $0508,x ; CPU:$C465 PRG:0465 9D 08 05 rts ; CPU:$C468 PRG:0468 60 ;=============================================================================== ; AllocateEffectObject ; ; Global: ; Allocates and initializes an entry in the eight-slot effect-object pool. ; ; Local: ; Searches slots 7 through 0 for a negative state byte. If a free slot is ; found, marks it active, clears its X position, and applies the requested ; spawn position to its Y-position field. ; ; Parameters: ; SpawnPixelPosition ($15) = initial effect-object position. ; ; Returns: ; X = allocated slot, $00-$07. If the pool is full, X returns as $FF and no ; pool fields are changed. ; ; Clobbers: ; A and X. ; ; PRG offsets: $046B-$0485 ; CPU range: $C46B-$C485 ;=============================================================================== AllocateEffectObject: ldx #$07 ; CPU:$C469 PRG:0469 A2 07 @FindFreeSlot: lda EffectObjectState,x ; CPU:$C46B PRG:046B BD 5D 05 bmi @InitializeSlot ; CPU:$C46E PRG:046E 30 04 dex ; CPU:$C470 PRG:0470 CA bpl @FindFreeSlot ; CPU:$C471 PRG:0471 10 F8 rts ; CPU:$C473 PRG:0473 60 @InitializeSlot: lda #$01 ; CPU:$C474 PRG:0474 A9 01 sta EffectObjectState,x ; CPU:$C476 PRG:0476 9D 5D 05 lda #$00 ; CPU:$C479 PRG:0479 A9 00 sta EffectObjectPosX,x ; CPU:$C47B PRG:047B 9D 67 05 lda SpawnPixelPosition ; CPU:$C47E PRG:047E A5 15 sta EffectObjectPosY,x ; CPU:$C480 PRG:0480 9D 7B 05 rts ; CPU:$C483 PRG:0483 60 ;=============================================================================== ; AllocateGameplayObject ; ; Global: ; Allocates and initializes an entry in the twenty-slot gameplay-object pool. ; ; Local: ; Searches slots 19 through 0 for a negative lifecycle-state byte. On ; success, initializes the slot state and clears its movement/parameter ; fields before copying the requested spawn parameters into the position ; fields. ; ; Parameters: ; SpawnParameter ($14) = high X-position or horizontal spawn parameter. ; SpawnPixelPosition ($15) = initial Y-position in pixel units. ; ; Returns: ; X = allocated slot, $00-$13. If the pool is full, X returns as $FF and no ; pool fields are changed. ; ; Clobbers: ; A and X. ; ; PRG offsets: $0486-$04AC ; CPU range: $C486-$C4AC ;=============================================================================== AllocateGameplayObject: ldx #$13 ; CPU:$C484 PRG:0484 A2 13 @FindFreeSlot: lda GameplayObjectState,x ; CPU:$C486 PRG:0486 BD 30 05 bmi @InitializeSlot ; CPU:$C489 PRG:0489 30 04 dex ; CPU:$C48B PRG:048B CA bpl @FindFreeSlot ; CPU:$C48C PRG:048C 10 F8 rts ; CPU:$C48E PRG:048E 60 @InitializeSlot: lda #$00 ; CPU:$C48F PRG:048F A9 00 sta GameplayObjectState,x ; CPU:$C491 PRG:0491 9D 30 05 sta GameplayObjectPosX,x ; CPU:$C494 PRG:0494 9D 90 04 sta GameplayObjectVelocityX,x ; CPU:$C497 PRG:0497 9D F4 04 sta GameplayObjectParameter,x ; CPU:$C49A PRG:049A 9D 08 05 sta GameplayObjectVelocityY,x ; CPU:$C49D PRG:049D 9D E0 04 lda SpawnParameter ; CPU:$C4A0 PRG:04A0 A5 14 sta GameplayObjectPosXHi,x ; CPU:$C4A2 PRG:04A2 9D 1C 05 lda SpawnPixelPosition ; CPU:$C4A5 PRG:04A5 A5 15 sta GameplayObjectPosY,x ; CPU:$C4A7 PRG:04A7 9D A4 04 rts ; CPU:$C4AA PRG:04AA 60 ; Round spawn command stream ; ; Command data consumed by SpawnFromCommandStream ($C3C9) to initialize ; round objects. Each command byte: top 3 bits give the spawn Y position, ; bits 7-6 select object type (%10 = effect object via AllocateEffectObject, ; %00 = gameplay object via AllocateGameplayObject), and any other value ; terminates the stream. ; ; PRG offsets: $04AD-$0526 ; CPU range: $C4AD-$C526 ;=============================================================================== RoundSpawnCommandStream: .byte $00, $00, $09, $00, $08, $8C, $00, $07 ; CPU:$C4AB PRG:04AB 00 00 09 00 08 8C 00 07 .byte $18, $00, $18, $00, $19, $00, $1A, $00 ; CPU:$C4B3 PRG:04B3 18 00 18 00 19 00 1A 00 .byte $84, $94, $1A, $00, $1A, $00, $1A, $00 ; CPU:$C4BB PRG:04BB 84 94 1A 00 1A 00 1A 00 .byte $0B, $12, $00, $0C, $13, $00, $0D, $14 ; CPU:$C4C3 PRG:04C3 0B 12 00 0C 13 00 0D 14 .byte $00, $14, $00, $00, $90, $00, $07, $00 ; CPU:$C4CB PRG:04CB 00 14 00 00 90 00 07 00 .byte $07, $8C, $96, $00, $08, $00, $09, $00 ; CPU:$C4D3 PRG:04D3 07 8C 96 00 08 00 09 00 .byte $00, $18, $00, $17, $00, $16, $00, $00 ; CPU:$C4DB PRG:04DB 00 18 00 17 00 16 00 00 .byte $00, $00, $00, $00, $8A, $90, $00, $00 ; CPU:$C4E3 PRG:04E3 00 00 00 00 8A 90 00 00 .byte $00, $08, $00, $09, $98, $00, $0A, $00 ; CPU:$C4EB PRG:04EB 00 08 00 09 98 00 0A 00 .byte $00, $00, $86, $8A, $15, $00, $14, $00 ; CPU:$C4F3 PRG:04F3 00 00 86 8A 15 00 14 00 .byte $8E, $13, $00, $00, $03, $0D, $00, $0D ; CPU:$C4FB PRG:04FB 8E 13 00 00 03 0D 00 0D .byte $0E, $00, $0C, $0D, $00, $0D, $19, $00 ; CPU:$C503 PRG:0503 0E 00 0C 0D 00 0D 19 00 .byte $86, $92, $00, $00, $98, $00, $00, $0A ; CPU:$C50B PRG:050B 86 92 00 00 98 00 00 0A .byte $12, $00, $09, $13, $00, $08, $14, $00 ; CPU:$C513 PRG:0513 12 00 09 13 00 08 14 00 .byte $07, $15, $00, $07, $16, $00, $07, $00 ; CPU:$C51B PRG:051B 07 15 00 07 16 00 07 00 .byte $00, $00 ; CPU:$C523 PRG:0523 00 00 ;=============================================================================== ; AdvanceRoundSeed ; ; Global: ; Advances the RAM value at RoundSeedValue using a deterministic multiply step. ; ; Local: ; Refreshes the source value, doubles it in memory, then forms ten times the refreshed value modulo 256. ; ; Parameters: ; Round seed/source state in RoundSeedValue. ; ; Returns: ; RoundSeedValue contains the advanced byte value. ; ; PRG offsets: $0527-$0538 ; CPU range: $C527-$C538 ;=============================================================================== AdvanceRoundSeed: jsr UpdateRoundSeedSource ; CPU:$C525 PRG:0525 20 E2 D0 asl RoundSeedValue ; CPU:$C528 PRG:0528 0E 59 05 lda RoundSeedValue ; CPU:$C52B PRG:052B AD 59 05 asl a ; CPU:$C52E PRG:052E 0A asl a ; CPU:$C52F PRG:052F 0A adc RoundSeedValue ; CPU:$C530 PRG:0530 6D 59 05 sta RoundSeedValue ; CPU:$C533 PRG:0533 8D 59 05 rts ; CPU:$C536 PRG:0536 60 ;=============================================================================== ; FindSortedRecordPosition ; ; Global: ; Finds the insertion position for the current five-byte record. ; ; Local: ; Walks up to 50 five-byte records at SortedRecordTable, comparing bytes from high to low against the current record at $0003-$0007. ; ; Parameters: ; Current five-byte record at $0003-$0007. ; ; Returns: ; A and RecordIndex identify the selected position; $43/$49/$4A receive derived values. ; ; PRG offsets: $0539-$0578 ; CPU range: $C539-$C578 ;=============================================================================== FindSortedRecordPosition: lda #$00 ; CPU:$C537 PRG:0537 A9 00 sta RecordIndex ; CPU:$C539 PRG:0539 85 12 FindSortedRecordPosition_Block: lda RecordIndex ; CPU:$C53B PRG:053B A5 12 asl a ; CPU:$C53D PRG:053D 0A asl a ; CPU:$C53E PRG:053E 0A adc RecordIndex ; CPU:$C53F PRG:053F 65 12 sta RecordPtrLo ; CPU:$C541 PRG:0541 85 1D lda #$07 ; CPU:$C543 PRG:0543 A9 07 sta RecordPtrHi ; CPU:$C545 PRG:0545 85 1E ldy #$04 ; CPU:$C547 PRG:0547 A0 04 FindSortedRecordPosition_Block_1: lda (RecordPtrLo),y ; CPU:$C549 PRG:0549 B1 1D cmp CurrentRecord,y ; CPU:$C54B PRG:054B D9 03 00 bcc FindSortedRecordPosition_Block_3 ; CPU:$C54E PRG:054E 90 11 bne FindSortedRecordPosition_Block_2 ; CPU:$C550 PRG:0550 D0 05 dey ; CPU:$C552 PRG:0552 88 bpl FindSortedRecordPosition_Block_1 ; CPU:$C553 PRG:0553 10 F4 bmi FindSortedRecordPosition_Block_3 ; CPU:$C555 PRG:0555 30 0A FindSortedRecordPosition_Block_2: inc RecordIndex ; CPU:$C557 PRG:0557 E6 12 lda RecordIndex ; CPU:$C559 PRG:0559 A5 12 cmp #$32 ; CPU:$C55B PRG:055B C9 32 bne FindSortedRecordPosition_Block ; CPU:$C55D PRG:055D D0 DC dec RecordIndex ; CPU:$C55F PRG:055F C6 12 FindSortedRecordPosition_Block_3: inc RecordIndex ; CPU:$C561 PRG:0561 E6 12 lda RecordIndex ; CPU:$C563 PRG:0563 A5 12 pha ; CPU:$C565 PRG:0565 48 sta SelectedRecordIndex ; CPU:$C566 PRG:0566 85 43 ldy #$0A ; CPU:$C568 PRG:0568 A0 0A jsr DivideOrScaleRecordValue ; CPU:$C56A PRG:056A 20 7C D7 sta ScaledRecordValue ; CPU:$C56D PRG:056D 85 4A lda SelectedRecordIndex ; CPU:$C56F PRG:056F A5 43 sta SelectedRecordIndexCopy ; CPU:$C571 PRG:0571 85 49 pla ; CPU:$C573 PRG:0573 68 sta RecordIndex ; CPU:$C574 PRG:0574 85 12 rts ; CPU:$C576 PRG:0576 60 ;=============================================================================== ; InsertRecordIntoSortedTable ; ; Global: ; Inserts the current five-byte record into the sorted 50-record table. ; ; Local: ; Finds the insertion index, shifts later five-byte records toward the end, and copies the current record into the selected slot. ; ; Parameters: ; Current five-byte record at $0003-$0007. ; ; Returns: ; The table at SortedRecordTable-$07F9 is updated in place. ; ; PRG offsets: $0579-$05B6 ; CPU range: $C579-$C5B6 ;=============================================================================== InsertRecordIntoSortedTable: jsr FindSortedRecordPosition ; CPU:$C577 PRG:0577 20 39 C5 dec RecordIndex ; CPU:$C57A PRG:057A C6 12 lda #$31 ; CPU:$C57C PRG:057C A9 31 sec ; CPU:$C57E PRG:057E 38 sbc RecordIndex ; CPU:$C57F PRG:057F E5 12 sta ReverseRecordIndex ; CPU:$C581 PRG:0581 85 13 asl a ; CPU:$C583 PRG:0583 0A asl a ; CPU:$C584 PRG:0584 0A adc ReverseRecordIndex ; CPU:$C585 PRG:0585 65 13 tay ; CPU:$C587 PRG:0587 A8 lda RecordIndex ; CPU:$C588 PRG:0588 A5 12 asl a ; CPU:$C58A PRG:058A 0A asl a ; CPU:$C58B PRG:058B 0A adc RecordIndex ; CPU:$C58C PRG:058C 65 12 sta RecordPtrLo ; CPU:$C58E PRG:058E 85 1D clc ; CPU:$C590 PRG:0590 18 adc #$05 ; CPU:$C591 PRG:0591 69 05 sta DestinationPtrLo ; CPU:$C593 PRG:0593 85 1F lda #$07 ; CPU:$C595 PRG:0595 A9 07 sta RecordPtrHi ; CPU:$C597 PRG:0597 85 1E sta DestinationPtrHi ; CPU:$C599 PRG:0599 85 20 tya ; CPU:$C59B PRG:059B 98 beq InsertRecordIntoSortedTable_Block_1 ; CPU:$C59C PRG:059C F0 0C dey ; CPU:$C59E PRG:059E 88 InsertRecordIntoSortedTable_Block: lda (RecordPtrLo),y ; CPU:$C59F PRG:059F B1 1D sta (DestinationPtrLo),y ; CPU:$C5A1 PRG:05A1 91 1F dey ; CPU:$C5A3 PRG:05A3 88 bne InsertRecordIntoSortedTable_Block ; CPU:$C5A4 PRG:05A4 D0 F9 lda (RecordPtrLo),y ; CPU:$C5A6 PRG:05A6 B1 1D sta (DestinationPtrLo),y ; CPU:$C5A8 PRG:05A8 91 1F InsertRecordIntoSortedTable_Block_1: ldy #$04 ; CPU:$C5AA PRG:05AA A0 04 InsertRecordIntoSortedTable_Block_2: lda CurrentRecord,y ; CPU:$C5AC PRG:05AC B9 03 00 sta (RecordPtrLo),y ; CPU:$C5AF PRG:05AF 91 1D dey ; CPU:$C5B1 PRG:05B1 88 bpl InsertRecordIntoSortedTable_Block_2 ; CPU:$C5B2 PRG:05B2 10 F8 rts ; CPU:$C5B4 PRG:05B4 60 ; Carrier display-selection tables ;=============================================================================== NormalDisplayModeTable: .byte $01, $02, $03, $03 ; CPU:$C5B5 PRG:05B5 01 02 03 03 AlternateDisplayModeTable: .byte $02, $01, $FF, $03, $04, $05, $06, $FF ; CPU:$C5B9 PRG:05B9 02 01 FF 03 04 05 06 FF ;=============================================================================== ; UpdateCarrierObjectDisplay ; ; Global: ; Builds the display state for a carrier/rescue-sequence object and places the selected player relative to it. ; ; Local: ; Selects a display mode from one of two tables, builds an eight-part metasprite, and updates the targeted player position while the sequence is active. ; ; Parameters: ; Carrier sequence state at $048A-$048D and player arrays indexed through $048B. ; ; Returns: ; Carrier metasprite and target-player coordinates updated. ; ; PRG offsets: $05C3-$0613 ; CPU range: $C5C3-$C613 ;=============================================================================== UpdateCarrierObjectDisplay: lda CarrierSequenceTimer ; CPU:$C5C1 PRG:05C1 AD 8D 04 lsr a ; CPU:$C5C4 PRG:05C4 4A lsr a ; CPU:$C5C5 PRG:05C5 4A lsr a ; CPU:$C5C6 PRG:05C6 4A tax ; CPU:$C5C7 PRG:05C7 AA lda CarrierMode ; CPU:$C5C8 PRG:05C8 AD 8A 04 bne UpdateCarrierObjectDisplay_Block ; CPU:$C5CB PRG:05CB D0 06 lda NormalDisplayModeTable,x ; CPU:$C5CD PRG:05CD BD B7 C5 jmp UpdateCarrierObjectDisplay_Store ; CPU:$C5D0 PRG:05D0 4C D8 C5 UpdateCarrierObjectDisplay_Block: lda AlternateDisplayModeTable,x ; CPU:$C5D3 PRG:05D3 BD BB C5 UpdateCarrierObjectDisplay_Store: sta CarrierDisplayMode ; CPU:$C5D6 PRG:05D6 85 87 ldx #$08 ; CPU:$C5D8 PRG:05D8 A2 08 jsr BuildObjectMetasprite ; CPU:$C5DA PRG:05DA 20 A4 E3 lda CarrierDropPending ; CPU:$C5DD PRG:05DD AD 8C 04 beq UpdateCarrierObjectDisplay_Block_5 ; CPU:$C5E0 PRG:05E0 F0 2F ldx CarrierTargetPlayer ; CPU:$C5E2 PRG:05E2 AE 8B 04 lda CarrierSequenceTimer ; CPU:$C5E5 PRG:05E5 AD 8D 04 cmp #$20 ; CPU:$C5E8 PRG:05E8 C9 20 bne UpdateCarrierObjectDisplay_Block_1 ; CPU:$C5EA PRG:05EA D0 06 lda #$FF ; CPU:$C5EC PRG:05EC A9 FF sta PlayerSlotState,x ; CPU:$C5EE PRG:05EE 95 88 bmi UpdateCarrierObjectDisplay_Block_4 ; CPU:$C5F0 PRG:05F0 30 1C UpdateCarrierObjectDisplay_Block_1: bcs UpdateCarrierObjectDisplay_Block_5 ; CPU:$C5F2 PRG:05F2 B0 1D lda CarrierSavedValue ; CPU:$C5F4 PRG:05F4 AD 50 04 bne UpdateCarrierObjectDisplay_Block_2 ; CPU:$C5F7 PRG:05F7 D0 07 lda CarrierTargetX ; CPU:$C5F9 PRG:05F9 A5 99 clc ; CPU:$C5FB PRG:05FB 18 adc #$04 ; CPU:$C5FC PRG:05FC 69 04 bne UpdateCarrierObjectDisplay_Block_3 ; CPU:$C5FE PRG:05FE D0 05 UpdateCarrierObjectDisplay_Block_2: lda CarrierTargetX ; CPU:$C600 PRG:0600 A5 99 sec ; CPU:$C602 PRG:0602 38 sbc #$04 ; CPU:$C603 PRG:0603 E9 04 UpdateCarrierObjectDisplay_Block_3: sta PlayerPosX,x ; CPU:$C605 PRG:0605 95 91 lda CarrierPosY ; CPU:$C607 PRG:0607 A5 A2 sec ; CPU:$C609 PRG:0609 38 sbc #$0A ; CPU:$C60A PRG:060A E9 0A sta PlayerPosY,x ; CPU:$C60C PRG:060C 95 9A UpdateCarrierObjectDisplay_Block_4: jsr BuildObjectMetasprite ; CPU:$C60E PRG:060E 20 A4 E3 UpdateCarrierObjectDisplay_Block_5: rts ; CPU:$C611 PRG:0611 60 ;=============================================================================== ; FindEligiblePlayerForCarrier ; ; Global: ; Selects a player slot eligible for the carrier/rescue sequence. ; ; Local: ; Scans player slots 7 through 0, excluding inactive entries and rejecting a slot at the lower screen boundary unless its X position matches the carrier target. ; ; Parameters: ; Player state and position arrays; CarrierTargetX. ; ; Returns: ; CarrierTargetPlayer is set when an eligible player is found; $FF indicates none. ; ; PRG offsets: $0614-$064A ; CPU range: $C614-$C64A ;=============================================================================== FindEligiblePlayerForCarrier: lda #$FF ; CPU:$C612 PRG:0612 A9 FF sta CarrierTargetPlayer ; CPU:$C614 PRG:0614 8D 8B 04 ldx #$07 ; CPU:$C617 PRG:0617 A2 07 FindEligiblePlayerForCarrier_Block: lda PlayerSlotState,x ; CPU:$C619 PRG:0619 B5 88 bmi FindEligiblePlayerForCarrier_Block_1 ; CPU:$C61B PRG:061B 30 0C lda PlayerPosY,x ; CPU:$C61D PRG:061D B5 9A cmp #$B4 ; CPU:$C61F PRG:061F C9 B4 bcc FindEligiblePlayerForCarrier_Block_1 ; CPU:$C621 PRG:0621 90 06 lda PlayerPosX,x ; CPU:$C623 PRG:0623 B5 91 cmp CarrierTargetX ; CPU:$C625 PRG:0625 C5 99 beq FindEligiblePlayerForCarrier_Block_2 ; CPU:$C627 PRG:0627 F0 04 FindEligiblePlayerForCarrier_Block_1: dex ; CPU:$C629 PRG:0629 CA bpl FindEligiblePlayerForCarrier_Block ; CPU:$C62A PRG:062A 10 ED rts ; CPU:$C62C PRG:062C 60 FindEligiblePlayerForCarrier_Block_2: stx CarrierTargetPlayer ; CPU:$C62D PRG:062D 8E 8B 04 lda PlayerVariantTable,x ; CPU:$C630 PRG:0630 BD 48 04 sta CarrierSavedValue ; CPU:$C633 PRG:0633 8D 50 04 lda #$00 ; CPU:$C636 PRG:0636 A9 00 sta CarrierMode ; CPU:$C638 PRG:0638 8D 8A 04 sta CarrierSequenceTimer ; CPU:$C63B PRG:063B 8D 8D 04 sta CarrierDropPending ; CPU:$C63E PRG:063E 8D 8C 04 sta CarrierSequenceActive ; CPU:$C641 PRG:0641 8D 89 04 lda #$DC ; CPU:$C644 PRG:0644 A9 DC sta CarrierPosY ; CPU:$C646 PRG:0646 85 A2 rts ; CPU:$C648 PRG:0648 60 ;=============================================================================== ; AdvanceCarrierTargetX ; ; Global: ; Advances and wraps the carrier horizontal target position. ; ; Local: ; Increments CarrierTargetX and wraps values at $B1 or above back to $40. ; ; Parameters: ; CarrierTargetX. ; ; Returns: ; CarrierTargetX updated. ; ; PRG offsets: $064B-$0657 ; CPU range: $C64B-$C657 ;=============================================================================== AdvanceCarrierTargetX: inc CarrierTargetX ; CPU:$C649 PRG:0649 E6 99 lda CarrierTargetX ; CPU:$C64B PRG:064B A5 99 cmp #$B1 ; CPU:$C64D PRG:064D C9 B1 bcc AdvanceCarrierTargetX_Block ; CPU:$C64F PRG:064F 90 04 lda #$40 ; CPU:$C651 PRG:0651 A9 40 sta CarrierTargetX ; CPU:$C653 PRG:0653 85 99 AdvanceCarrierTargetX_Block: rts ; CPU:$C655 PRG:0655 60 ;=============================================================================== ; UpdateCarrierArrivalSequence ; ; Global: ; Advances the carrier vertical movement and resolves its arrival at the selected player. ; ; Local: ; Moves the carrier toward its target, advances sequence timers, changes player animation/state when contact is reached, and queues a sound request. ; ; Parameters: ; Carrier and player sequence state in zero page and $0489-$048D. ; ; Returns: ; Carrier sequence state, player state, and sound request flags updated. ; ; PRG offsets: $0658-$06B7 ; CPU range: $C658-$C6B7 ;=============================================================================== UpdateCarrierArrivalSequence: lda CarrierSequenceActive ; CPU:$C656 PRG:0656 AD 89 04 bne UpdateCarrierArrivalSequence_Block ; CPU:$C659 PRG:0659 D0 12 dec CarrierPosY ; CPU:$C65B PRG:065B C6 A2 lda CarrierPosY ; CPU:$C65D PRG:065D A5 A2 cmp #$C4 ; CPU:$C65F PRG:065F C9 C4 bcs UpdateCarrierArrivalSequence_Block_1 ; CPU:$C661 PRG:0661 B0 0C inc CarrierPosY ; CPU:$C663 PRG:0663 E6 A2 inc CarrierMode ; CPU:$C665 PRG:0665 EE 8A 04 inc CarrierSequenceActive ; CPU:$C668 PRG:0668 EE 89 04 bne UpdateCarrierArrivalSequence_Block_1 ; CPU:$C66B PRG:066B D0 02 UpdateCarrierArrivalSequence_Block: inc CarrierPosY ; CPU:$C66D PRG:066D E6 A2 UpdateCarrierArrivalSequence_Block_1: inc CarrierSequenceTimer ; CPU:$C66F PRG:066F EE 8D 04 lda CarrierSequenceTimer ; CPU:$C672 PRG:0672 AD 8D 04 cmp #$18 ; CPU:$C675 PRG:0675 C9 18 bne UpdateCarrierArrivalSequence_Block_2 ; CPU:$C677 PRG:0677 D0 28 ldx CarrierTargetPlayer ; CPU:$C679 PRG:0679 AE 8B 04 lda PlayerSlotState,x ; CPU:$C67C PRG:067C B5 88 bmi UpdateCarrierArrivalSequence_Block_2 ; CPU:$C67E PRG:067E 30 21 lda PlayerPosY,x ; CPU:$C680 PRG:0680 B5 9A clc ; CPU:$C682 PRG:0682 18 adc #$10 ; CPU:$C683 PRG:0683 69 10 cmp CarrierPosY ; CPU:$C685 PRG:0685 C5 A2 bcc UpdateCarrierArrivalSequence_Block_2 ; CPU:$C687 PRG:0687 90 18 ldy PlayerAnimationState,x ; CPU:$C689 PRG:0689 BC 51 04 lda CarrierAnimationSequenceTable,y ; CPU:$C68C PRG:068C B9 B8 C6 sta PlayerAnimationState,x ; CPU:$C68F PRG:068F 9D 51 04 lda #$00 ; CPU:$C692 PRG:0692 A9 00 sta PlayerLifecycleState,x ; CPU:$C694 PRG:0694 95 7F sta PlayerSlotState,x ; CPU:$C696 PRG:0696 95 88 lda SoundRequestFlags2 ; CPU:$C698 PRG:0698 A5 F2 ora #$40 ; CPU:$C69A PRG:069A 09 40 sta SoundRequestFlags2 ; CPU:$C69C PRG:069C 85 F2 inc CarrierDropPending ; CPU:$C69E PRG:069E EE 8C 04 UpdateCarrierArrivalSequence_Block_2: lda CarrierMode ; CPU:$C6A1 PRG:06A1 AD 8A 04 beq UpdateCarrierArrivalSequence_Block_4 ; CPU:$C6A4 PRG:06A4 F0 0F lda CarrierSequenceTimer ; CPU:$C6A6 PRG:06A6 AD 8D 04 cmp #$28 ; CPU:$C6A9 PRG:06A9 C9 28 beq UpdateCarrierArrivalSequence_Block_3 ; CPU:$C6AB PRG:06AB F0 04 cmp #$30 ; CPU:$C6AD PRG:06AD C9 30 bne UpdateCarrierArrivalSequence_Block_4 ; CPU:$C6AF PRG:06AF D0 04 UpdateCarrierArrivalSequence_Block_3: lda #$CC ; CPU:$C6B1 PRG:06B1 A9 CC sta CarrierPosY ; CPU:$C6B3 PRG:06B3 85 A2 UpdateCarrierArrivalSequence_Block_4: rts ; CPU:$C6B5 PRG:06B5 60 ; Carrier animation remap table ; Maps player animation states to the carrier-sequence animation states. ;=============================================================================== CarrierAnimationSequenceTable: .byte $08, $09, $0A, $0B ; CPU:$C6B6 PRG:06B6 08 09 0A 0B .byte $08, $09, $0A, $0B ; CPU:$C6BA PRG:06BA 08 09 0A 0B .byte $08, $09, $0A, $0B ; CPU:$C6BE PRG:06BE 08 09 0A 0B ;=============================================================================== ; BeginCarrierTargetSequence ; ; Global: ; Starts the carrier sequence for the currently selected player when conditions allow. ; ; Local: ; Rejects an already-active sequence or an invalid target, captures player state, resets sequence fields, and initializes the carrier vertical position. ; ; Parameters: ; CarrierTargetPlayer and player arrays. ; ; Returns: ; Carrier sequence activated when a valid target exists. ; ; PRG offsets: $06C4-$06F8 ; CPU range: $C6C4-$C6F8 ;=============================================================================== BeginCarrierTargetSequence: lda CarrierSequenceActive ; CPU:$C6C2 PRG:06C2 AD 89 04 bne BeginCarrierTargetSequence_Block_2 ; CPU:$C6C5 PRG:06C5 D0 2F ldx CarrierTargetPlayer ; CPU:$C6C7 PRG:06C7 AE 8B 04 lda PlayerSlotState,x ; CPU:$C6CA PRG:06CA B5 88 bmi BeginCarrierTargetSequence_Block ; CPU:$C6CC PRG:06CC 30 10 lda PlayerPosY,x ; CPU:$C6CE PRG:06CE B5 9A cmp #$B4 ; CPU:$C6D0 PRG:06D0 C9 B4 bcc BeginCarrierTargetSequence_Block ; CPU:$C6D2 PRG:06D2 90 0A lda PlayerPosX,x ; CPU:$C6D4 PRG:06D4 B5 91 cmp #$40 ; CPU:$C6D6 PRG:06D6 C9 40 bcc BeginCarrierTargetSequence_Block ; CPU:$C6D8 PRG:06D8 90 04 cmp #$B1 ; CPU:$C6DA PRG:06DA C9 B1 bcc BeginCarrierTargetSequence_Block_1 ; CPU:$C6DC PRG:06DC 90 0E BeginCarrierTargetSequence_Block: lda #$30 ; CPU:$C6DE PRG:06DE A9 30 sec ; CPU:$C6E0 PRG:06E0 38 sbc CarrierSequenceTimer ; CPU:$C6E1 PRG:06E1 ED 8D 04 sta CarrierSequenceTimer ; CPU:$C6E4 PRG:06E4 8D 8D 04 inc CarrierSequenceActive ; CPU:$C6E7 PRG:06E7 EE 89 04 bne BeginCarrierTargetSequence_Block_2 ; CPU:$C6EA PRG:06EA D0 0A BeginCarrierTargetSequence_Block_1: lda PlayerPosX,x ; CPU:$C6EC PRG:06EC B5 91 sta $99 ; CPU:$C6EE PRG:06EE 85 99 lda $0448,x ; CPU:$C6F0 PRG:06F0 BD 48 04 sta $0450 ; CPU:$C6F3 PRG:06F3 8D 50 04 BeginCarrierTargetSequence_Block_2: rts ; CPU:$C6F6 PRG:06F6 60 ;=============================================================================== ; UpdateCarrierSequence ; ; Global: ; Coordinates the carrier target search, movement, arrival, and display update. ; ; Local: ; Advances the target X position while idle; otherwise updates arrival state, acquires a target, starts the sequence, and tail-calls the display updater. ; ; Parameters: ; Carrier sequence state and player arrays. ; ; Returns: ; Carrier and player state updated for the frame. ; ; PRG offsets: $06F9-$0715 ; CPU range: $C6F9-$C715 ;=============================================================================== UpdateCarrierSequence: lda CarrierDisplayMode ; CPU:$C6F7 PRG:06F7 A5 87 bpl UpdateCarrierSequence_Block_1 ; CPU:$C6F9 PRG:06F9 10 10 jsr AdvanceCarrierTargetX ; CPU:$C6FB PRG:06FB 20 4B C6 jsr FindEligiblePlayerForCarrier ; CPU:$C6FE PRG:06FE 20 14 C6 lda CarrierTargetPlayer ; CPU:$C701 PRG:0701 AD 8B 04 bpl UpdateCarrierSequence_Block ; CPU:$C704 PRG:0704 10 01 rts ; CPU:$C706 PRG:0706 60 UpdateCarrierSequence_Block: lda #$40 ; CPU:$C707 PRG:0707 A9 40 sta SoundRequestFlags3 ; CPU:$C709 PRG:0709 85 F3 UpdateCarrierSequence_Block_1: jsr BeginCarrierTargetSequence ; CPU:$C70B PRG:070B 20 C4 C6 jsr UpdateCarrierArrivalSequence ; CPU:$C70E PRG:070E 20 58 C6 jmp UpdateCarrierObjectDisplay ; CPU:$C711 PRG:0711 4C C3 C5 ;=============================================================================== ; InitializeRoundObjectPools ; ; Global: ; Clears the first two gameplay-object slots and starts round object spawning. ; ; Local: ; Marks two gameplay slots unused, clears their auxiliary state, then calls the round-spawn routine. ; ; Parameters: ; Global round state. ; ; Returns: ; Object pools initialized and spawn processing started. ; ; PRG offsets: $0716-$0725 ; CPU range: $C716-$C725 ;=============================================================================== InitializeRoundObjectPools: ldx #$01 ; CPU:$C714 PRG:0714 A2 01 InitializeRoundObjectPools_Block: lda #$FF ; CPU:$C716 PRG:0716 A9 FF sta GameplayObjectState,x ; CPU:$C718 PRG:0718 9D 30 05 sta GameplayObjectAuxState,x ; CPU:$C71B PRG:071B 9D 44 05 dex ; CPU:$C71E PRG:071E CA bpl InitializeRoundObjectPools_Block ; CPU:$C71F PRG:071F 10 F5 jsr SpawnRoundObjects ; CPU:$C721 PRG:0721 20 7A C7 ;=============================================================================== ; InitializeRoundPresentation ; ; Global: ; Initializes round-dependent object counts, delays, and hidden OAM entries. ; ; Local: ; Clears pool state, clamps the round index for lookup tables, loads round parameters, hides three OAM entries, and tail-calls presentation setup. ; ; Parameters: ; RoundIndex. ; ; Returns: ; RoundSpawnDelay, SpawnSelector, OAM, and presentation state initialized. ; ; PRG offsets: $0726-$0747 ; CPU range: $C726-$C747 ;=============================================================================== InitializeRoundPresentation: ldx RoundIndex ; CPU:$C724 PRG:0724 A6 3C cpx #$18 ; CPU:$C726 PRG:0726 E0 18 bcc InitializeRoundPresentation_Block ; CPU:$C728 PRG:0728 90 02 ldx #$18 ; CPU:$C72A PRG:072A A2 18 InitializeRoundPresentation_Block: lda RoundObjectCountTable,x ; CPU:$C72C PRG:072C BD 48 C7 sta SpawnSelector ; CPU:$C72F PRG:072F 85 BA lda RoundDelayTable,x ; CPU:$C731 PRG:0731 BD 61 C7 sta RoundSpawnDelay ; CPU:$C734 PRG:0734 85 B8 lda #$F0 ; CPU:$C736 PRG:0736 A9 F0 sta OamEntryE0Y ; CPU:$C738 PRG:0738 8D E0 02 sta OamEntryE4Y ; CPU:$C73B PRG:073B 8D E4 02 sta OamEntryE8Y ; CPU:$C73E PRG:073E 8D E8 02 lda #$03 ; CPU:$C741 PRG:0741 A9 03 jmp ConfigureRoundPresentation ; CPU:$C743 PRG:0743 4C 56 C8 ; Round spawn lookup tables ;=============================================================================== RoundObjectCountTable: .byte $00, $00, $00, $00, $00, $00, $00, $00 ; CPU:$C746 PRG:0746 00 00 00 00 00 00 00 00 .byte $00, $00, $01, $01, $01, $01, $01, $01 ; CPU:$C74E PRG:074E 00 00 01 01 01 01 01 01 .byte $02, $01, $01, $01, $01, $01, $01, $01 ; CPU:$C756 PRG:0756 02 01 01 01 01 01 01 01 .byte $01 ; CPU:$C75E PRG:075E 01 RoundDelayTable: .byte $0F, $0F, $0C, $0C, $0C, $0C, $0A, $0A ; CPU:$C75F PRG:075F 0F 0F 0C 0C 0C 0C 0A 0A .byte $0A, $0A, $0C, $0C, $0A, $0A, $0A, $08 ; CPU:$C767 PRG:0767 0A 0A 0C 0C 0A 0A 0A 08 .byte $0A, $0A, $08, $08, $08, $08, $08, $08 ; CPU:$C76F PRG:076F 0A 0A 08 08 08 08 08 08 .byte $05 ; CPU:$C777 PRG:0777 05 ;=============================================================================== ; ChooseRoundSpawnIndex ; ; Global: ; Chooses a randomized spawn index below the current round limit. ; ; Local: ; Copies a negative cached index when available; otherwise repeatedly samples the random generator until the result is below RoundSpawnRandomLimit and nonzero. ; ; Parameters: ; RoundSpawnRandomLimit and cached index $A4. ; ; Returns: ; A contains the selected nonzero index and SelectedSpawnIndex is updated when needed. ; ; PRG offsets: $077A-$078F ; CPU range: $C77A-$C78F ;=============================================================================== ChooseRoundSpawnIndex: lda RoundSpawnRandomLimit ; CPU:$C778 PRG:0778 A5 A3 bpl ChooseRoundSpawnIndex_Block_1 ; CPU:$C77A PRG:077A 10 03 ChooseRoundSpawnIndex_Block: sta SelectedSpawnIndex ; CPU:$C77C PRG:077C 85 A4 rts ; CPU:$C77E PRG:077E 60 ChooseRoundSpawnIndex_Block_1: jsr GetRandomValue ; CPU:$C77F PRG:077F 20 B3 F1 ChooseRoundSpawnIndex_Block_2: cmp RoundSpawnRandomLimit ; CPU:$C782 PRG:0782 C5 A3 bcc ChooseRoundSpawnIndex_Block ; CPU:$C784 PRG:0784 90 F6 beq ChooseRoundSpawnIndex_Block ; CPU:$C786 PRG:0786 F0 F4 clc ; CPU:$C788 PRG:0788 18 sbc RoundSpawnRandomLimit ; CPU:$C789 PRG:0789 E5 A3 jmp ChooseRoundSpawnIndex_Block_2 ; CPU:$C78B PRG:078B 4C 84 C7 ;=============================================================================== ; UpdateRoundSpawner ; ; Global: ; Runs the timed round-object spawning process. ; ; Local: ; Uses FrameCounter as a divider, counts down RoundSpawnDelay, finds two free gameplay-object slots, initializes a new object from round/spawn tables, and repeats until the round quota is exhausted. ; ; Parameters: ; Round spawn state, gameplay-object arrays, and SpawnSelector. ; ; Returns: ; A gameplay object may be initialized; round counters and sound requests are updated. ; ; PRG offsets: $0790-$0830 ; CPU range: $C790-$C830 ;=============================================================================== UpdateRoundSpawner: lda FrameCounter ; CPU:$C78E PRG:078E A5 19 and #$7F ; CPU:$C790 PRG:0790 29 7F beq UpdateRoundSpawner_Block_1 ; CPU:$C792 PRG:0792 F0 01 UpdateRoundSpawner_Block: rts ; CPU:$C794 PRG:0794 60 UpdateRoundSpawner_Block_1: dec RoundSpawnDelay ; CPU:$C795 PRG:0795 C6 B8 bne UpdateRoundSpawner_Block ; CPU:$C797 PRG:0797 D0 FB ldx #$00 ; CPU:$C799 PRG:0799 A2 00 lda GameplayObjectState,x ; CPU:$C79B PRG:079B BD 30 05 bmi UpdateRoundSpawner_Block_2 ; CPU:$C79E PRG:079E 30 0B inx ; CPU:$C7A0 PRG:07A0 E8 lda GameplayObjectState,x ; CPU:$C7A1 PRG:07A1 BD 30 05 bmi UpdateRoundSpawner_Block_2 ; CPU:$C7A4 PRG:07A4 30 05 lda #$01 ; CPU:$C7A6 PRG:07A6 A9 01 sta RoundSpawnDelay ; CPU:$C7A8 PRG:07A8 85 B8 rts ; CPU:$C7AA PRG:07AA 60 UpdateRoundSpawner_Block_2: ldy SelectedSpawnIndex ; CPU:$C7AB PRG:07AB A4 A4 sty SelectedSpawnIndexCopy ; CPU:$C7AD PRG:07AD 84 A5 bpl UpdateRoundSpawner_Block_3 ; CPU:$C7AF PRG:07AF 10 01 rts ; CPU:$C7B1 PRG:07B1 60 UpdateRoundSpawner_Block_3: lda #$80 ; CPU:$C7B2 PRG:07B2 A9 80 sta GameplayObjectVelocityFracY,x ; CPU:$C7B4 PRG:07B4 9D B8 04 sta GameplayObjectVelocityIntY,x ; CPU:$C7B7 PRG:07B7 9D CC 04 lda #$00 ; CPU:$C7BA PRG:07BA A9 00 sta GameplayObjectState,x ; CPU:$C7BC PRG:07BC 9D 30 05 lda $00B2,y ; CPU:$C7BF PRG:07BF B9 B2 00 sta GameplayObjectPosX,x ; CPU:$C7C2 PRG:07C2 9D 90 04 lda $00B5,y ; CPU:$C7C5 PRG:07C5 B9 B5 00 sta GameplayObjectPosY,x ; CPU:$C7C8 PRG:07C8 9D A4 04 ldy SpawnSelector ; CPU:$C7CB PRG:07CB A4 BA jsr GetRandomValue ; CPU:$C7CD PRG:07CD 20 B3 F1 and #$1F ; CPU:$C7D0 PRG:07D0 29 1F adc SpawnParameterTable,y ; CPU:$C7D2 PRG:07D2 79 9F C8 sta GameplayObjectParameter,x ; CPU:$C7D5 PRG:07D5 9D 08 05 lda SpawnPositionHiTable,y ; CPU:$C7D8 PRG:07D8 B9 AB C8 sta GameplayObjectPosXHi,x ; CPU:$C7DB PRG:07DB 9D 1C 05 lda SpawnVelocityYTable,y ; CPU:$C7DE PRG:07DE B9 A5 C8 sta GameplayObjectVelocityY,x ; CPU:$C7E1 PRG:07E1 9D E0 04 lda SpawnVelocityXTable,y ; CPU:$C7E4 PRG:07E4 B9 B1 C8 sta GameplayObjectVelocityX,x ; CPU:$C7E7 PRG:07E7 9D F4 04 jsr GetRandomValue ; CPU:$C7EA PRG:07EA 20 B3 F1 and #$03 ; CPU:$C7ED PRG:07ED 29 03 sta GameplayObjectAuxState,x ; CPU:$C7EF PRG:07EF 9D 44 05 tay ; CPU:$C7F2 PRG:07F2 A8 lda SpawnXOffsetTable,y ; CPU:$C7F3 PRG:07F3 B9 97 C8 clc ; CPU:$C7F6 PRG:07F6 18 adc GameplayObjectPosX,x ; CPU:$C7F7 PRG:07F7 7D 90 04 sta GameplayObjectPosX,x ; CPU:$C7FA PRG:07FA 9D 90 04 lda SpawnYOffsetTable,y ; CPU:$C7FD PRG:07FD B9 9B C8 clc ; CPU:$C800 PRG:0800 18 adc GameplayObjectPosY,x ; CPU:$C801 PRG:0801 7D A4 04 sta GameplayObjectPosY,x ; CPU:$C804 PRG:0804 9D A4 04 lda SpawnFlipYTable,y ; CPU:$C807 PRG:0807 B9 8F C8 beq UpdateRoundSpawner_Block_4 ; CPU:$C80A PRG:080A F0 03 jsr NegateGameplayObjectVelocityY ; CPU:$C80C PRG:080C 20 3D CA UpdateRoundSpawner_Block_4: lda SpawnFlipXTable,y ; CPU:$C80F PRG:080F B9 93 C8 beq UpdateRoundSpawner_Block_5 ; CPU:$C812 PRG:0812 F0 03 jsr NegateGameplayObjectVelocityX ; CPU:$C814 PRG:0814 20 55 CA UpdateRoundSpawner_Block_5: lda SpawnSelector ; CPU:$C817 PRG:0817 A5 BA cmp #$05 ; CPU:$C819 PRG:0819 C9 05 bcs UpdateRoundSpawner_Block_6 ; CPU:$C81B PRG:081B B0 02 inc SpawnSelector ; CPU:$C81D PRG:081D E6 BA UpdateRoundSpawner_Block_6: lda #$06 ; CPU:$C81F PRG:081F A9 06 sec ; CPU:$C821 PRG:0821 38 sbc SpawnSelector ; CPU:$C822 PRG:0822 E5 BA sta RoundSpawnDelay ; CPU:$C824 PRG:0824 85 B8 lda SoundRequestFlags0 ; CPU:$C826 PRG:0826 A5 F0 ora #$04 ; CPU:$C828 PRG:0828 09 04 sta SoundRequestFlags0 ; CPU:$C82A PRG:082A 85 F0 jmp ChooseRoundSpawnIndex ; CPU:$C82C PRG:082C 4C 7A C7 ;=============================================================================== ; UpdateRoundHud ; ; Global: ; Updates the round HUD when the spawn countdown reaches its display phase. ; ; Local: ; Waits for the appropriate frame count, requests a sound at the transition, selects a HUD tile, and appends four values from zero-page arrays to the PPU command buffer. ; ; Parameters: ; RoundSpawnDelay, FrameCounter, and zero-page HUD values. ; ; Returns: ; PPU command buffer receives the updated HUD values. ; ; PRG offsets: $0831-$0855 ; CPU range: $C831-$C855 ;=============================================================================== UpdateRoundHud: lda RoundSpawnDelay ; CPU:$C82F PRG:082F A5 B8 cmp #$01 ; CPU:$C831 PRG:0831 C9 01 bne AppendRoundHudValue_Block ; CPU:$C833 PRG:0833 D0 53 lda GameplayObjectState ; CPU:$C835 PRG:0835 AD 30 05 bmi UpdateRoundHud_Block ; CPU:$C838 PRG:0838 30 0A lda $0531 ; CPU:$C83A PRG:083A AD 31 05 bmi UpdateRoundHud_Block ; CPU:$C83D PRG:083D 30 05 lda #$02 ; CPU:$C83F PRG:083F A9 02 sta RoundSpawnDelay ; CPU:$C841 PRG:0841 85 B8 rts ; CPU:$C843 PRG:0843 60 UpdateRoundHud_Block: lda FrameCounter ; CPU:$C844 PRG:0844 A5 19 and #$7F ; CPU:$C846 PRG:0846 29 7F cmp #$40 ; CPU:$C848 PRG:0848 C9 40 bcc AppendRoundHudValue_Block ; CPU:$C84A PRG:084A 90 3C bne ConfigureRoundPresentation ; CPU:$C84C PRG:084C D0 06 lda SoundRequestFlags1 ; CPU:$C84E PRG:084E A5 F1 ora #$08 ; CPU:$C850 PRG:0850 09 08 sta SoundRequestFlags1 ; CPU:$C852 PRG:0852 85 F1 ;=============================================================================== ; ConfigureRoundPresentation ; ; Global: ; Configures round presentation state and writes HUD values. ; ; Local: ; Selects a HUD tile from the mode table, iterates active HUD values, and appends them as PPU commands before tail-calling the common buffer append routine. ; ; Parameters: ; A = presentation mode; SelectedSpawnIndex and zero-page HUD values. ; ; Returns: ; PPU command buffer updated. ; ; PRG offsets: $0856-$0882 ; CPU range: $C856-$C882 ;=============================================================================== ConfigureRoundPresentation: and #$03 ; CPU:$C854 PRG:0854 29 03 tax ; CPU:$C856 PRG:0856 AA lda RoundHudTileTable,x ; CPU:$C857 PRG:0857 BD 8B C8 sta RoundHudTile ; CPU:$C85A PRG:085A 85 5A ldx SelectedSpawnIndex ; CPU:$C85C PRG:085C A6 A4 bmi AppendRoundHudValue_Block ; CPU:$C85E PRG:085E 30 28 lda #$23 ; CPU:$C860 PRG:0860 A9 23 sta RoundHudCommandAddressHi ; CPU:$C862 PRG:0862 85 57 lda $A6,x ; CPU:$C864 PRG:0864 B5 A6 sta RoundHudCommandAddressLo ; CPU:$C866 PRG:0866 85 58 lda #$01 ; CPU:$C868 PRG:0868 A9 01 sta RoundHudCommandLength ; CPU:$C86A PRG:086A 85 59 jsr AppendRoundHudValue ; CPU:$C86C PRG:086C 20 83 C8 lda $A9,x ; CPU:$C86F PRG:086F B5 A9 sta RoundHudCommandAddressLo ; CPU:$C871 PRG:0871 85 58 jsr AppendRoundHudValue ; CPU:$C873 PRG:0873 20 83 C8 lda $AC,x ; CPU:$C876 PRG:0876 B5 AC sta RoundHudCommandAddressLo ; CPU:$C878 PRG:0878 85 58 jsr AppendRoundHudValue ; CPU:$C87A PRG:087A 20 83 C8 lda $AF,x ; CPU:$C87D PRG:087D B5 AF sta RoundHudCommandAddressLo ; CPU:$C87F PRG:087F 85 58 ;=============================================================================== ; AppendRoundHudValue ; ; Global: ; Appends one HUD value to the PPU command buffer. ; ; Local: ; Stores the current value as a one-byte command payload and invokes the common PPU-buffer append routine. ; ; Parameters: ; A = HUD value; $57-$59 describe the command. ; ; Returns: ; One HUD update command appended. ; ; PRG offsets: $0883-$088A ; CPU range: $C883-$C88A ;=============================================================================== AppendRoundHudValue: lda #$57 ; CPU:$C881 PRG:0881 A9 57 ldy #$00 ; CPU:$C883 PRG:0883 A0 00 jmp AppendBytesToPpuBuffer ; CPU:$C885 PRG:0885 4C 31 C1 AppendRoundHudValue_Block: rts ; CPU:$C888 PRG:0888 60 ; Round spawner and sprite lookup tables ;=============================================================================== RoundHudTileTable: .byte $55, $FF, $00, $FF ; CPU:$C889 PRG:0889 55 FF 00 FF SpawnFlipYTable: .byte $00, $00, $FF, $FF ; CPU:$C88D PRG:088D 00 00 FF FF SpawnFlipXTable: .byte $FF, $00, $00, $FF ; CPU:$C891 PRG:0891 FF 00 00 FF SpawnXOffsetTable: .byte $10, $10, $F0, $F0 ; CPU:$C895 PRG:0895 10 10 F0 F0 SpawnYOffsetTable: .byte $DE, $22, $22, $DE ; CPU:$C899 PRG:0899 DE 22 22 DE SpawnParameterTable: .byte $60, $70, $80, $90, $A0, $B0 ; CPU:$C89D PRG:089D 60 70 80 90 A0 B0 SpawnVelocityYTable: .byte $00, $00, $00, $00, $00, $00 ; CPU:$C8A3 PRG:08A3 00 00 00 00 00 00 SpawnPositionHiTable: .byte $C0, $F0, $20, $50, $80, $B0 ; CPU:$C8A9 PRG:08A9 C0 F0 20 50 80 B0 SpawnVelocityXTable: .byte $00, $00, $01, $01, $01, $01 ; CPU:$C8AF PRG:08AF 00 00 01 01 01 01 ;=============================================================================== ; UpdateRoundObjectSpritesAndPhysics ; ; Global: ; Updates both round-spawned gameplay objects, constructs their three-sprite OAM entries, and advances their state and movement. ; ; Local: ; Walks slots 1 through 0, skips inactive entries, derives OAM coordinates and tiles from lookup tables, advances animation state, performs bounds handling, integrates movement, resolves interactions, and writes OAM. ; ; Parameters: ; Gameplay-object arrays, FrameCounter, and round-spawn lookup tables. ; ; Returns: ; Object state, positions, animation, and OAM entries are updated. ; ; PRG offsets: $08B7-$09B5 ; CPU range: $C8B7-$C9B5 ;=============================================================================== UpdateRoundObjectSpritesAndPhysics: ldx #$01 ; CPU:$C8B5 PRG:08B5 A2 01 UpdateRoundObjectSpritesAndPhysics_Load: lda GameplayObjectState,x ; CPU:$C8B7 PRG:08B7 BD 30 05 bpl UpdateRoundObjectSpritesAndPhysics_Block ; CPU:$C8BA PRG:08BA 10 03 jmp UpdateRoundObjectSpritesAndPhysics_Block_9 ; CPU:$C8BC PRG:08BC 4C AF C9 UpdateRoundObjectSpritesAndPhysics_Block: lda GameplayObjectAuxState,x ; CPU:$C8BF PRG:08BF BD 44 05 bmi UpdateRoundObjectSpritesAndPhysics_Block_3 ; CPU:$C8C2 PRG:08C2 30 7B tay ; CPU:$C8C4 PRG:08C4 A8 txa ; CPU:$C8C5 PRG:08C5 8A pha ; CPU:$C8C6 PRG:08C6 48 ldx SelectedSpawnIndexCopy ; CPU:$C8C7 PRG:08C7 A6 A5 lda RoundSpawnBaseX,x ; CPU:$C8C9 PRG:08C9 B5 B2 adc RoundObjectXOffsetTable,y ; CPU:$C8CB PRG:08CB 79 E5 C9 sta $02E3 ; CPU:$C8CE PRG:08CE 8D E3 02 sta $02E7 ; CPU:$C8D1 PRG:08D1 8D E7 02 sta $02EB ; CPU:$C8D4 PRG:08D4 8D EB 02 lda RoundSpawnBaseY,x ; CPU:$C8D7 PRG:08D7 B5 B5 adc RoundObjectYOffsetTable,y ; CPU:$C8D9 PRG:08D9 79 F5 C9 sta $02E0 ; CPU:$C8DC PRG:08DC 8D E0 02 adc RoundObjectVerticalSpacingTable,y ; CPU:$C8DF PRG:08DF 79 05 CA sta $02E4 ; CPU:$C8E2 PRG:08E2 8D E4 02 adc RoundObjectVerticalSpacingTable,y ; CPU:$C8E5 PRG:08E5 79 05 CA sta $02E8 ; CPU:$C8E8 PRG:08E8 8D E8 02 tya ; CPU:$C8EB PRG:08EB 98 and #$03 ; CPU:$C8EC PRG:08EC 29 03 tax ; CPU:$C8EE PRG:08EE AA tya ; CPU:$C8EF PRG:08EF 98 lsr a ; CPU:$C8F0 PRG:08F0 4A lsr a ; CPU:$C8F1 PRG:08F1 4A tay ; CPU:$C8F2 PRG:08F2 A8 lda FrameCounter ; CPU:$C8F3 PRG:08F3 A5 19 lsr a ; CPU:$C8F5 PRG:08F5 4A lsr a ; CPU:$C8F6 PRG:08F6 4A bcs UpdateRoundObjectSpritesAndPhysics_Block_1 ; CPU:$C8F7 PRG:08F7 B0 04 tya ; CPU:$C8F9 PRG:08F9 98 adc #$05 ; CPU:$C8FA PRG:08FA 69 05 tay ; CPU:$C8FC PRG:08FC A8 UpdateRoundObjectSpritesAndPhysics_Block_1: lda RoundObjectTileTopTable,y ; CPU:$C8FD PRG:08FD B9 15 CA sta $02E1 ; CPU:$C900 PRG:0900 8D E1 02 lda RoundObjectTileMiddleTable,y ; CPU:$C903 PRG:0903 B9 1F CA sta $02E5 ; CPU:$C906 PRG:0906 8D E5 02 lda RoundObjectTileBottomTable,y ; CPU:$C909 PRG:0909 B9 29 CA sta $02E9 ; CPU:$C90C PRG:090C 8D E9 02 lda RoundObjectAttributeTable,x ; CPU:$C90F PRG:090F BD 33 CA sta $02E2 ; CPU:$C912 PRG:0912 8D E2 02 sta $02E6 ; CPU:$C915 PRG:0915 8D E6 02 sta $02EA ; CPU:$C918 PRG:0918 8D EA 02 pla ; CPU:$C91B PRG:091B 68 tax ; CPU:$C91C PRG:091C AA lda FrameCounter ; CPU:$C91D PRG:091D A5 19 and #$07 ; CPU:$C91F PRG:091F 29 07 bne UpdateRoundObjectSpritesAndPhysics_Block_2 ; CPU:$C921 PRG:0921 D0 12 lda GameplayObjectAuxState,x ; CPU:$C923 PRG:0923 BD 44 05 clc ; CPU:$C926 PRG:0926 18 adc #$04 ; CPU:$C927 PRG:0927 69 04 sta GameplayObjectAuxState,x ; CPU:$C929 PRG:0929 9D 44 05 cmp #$14 ; CPU:$C92C PRG:092C C9 14 bcc UpdateRoundObjectSpritesAndPhysics_Block_2 ; CPU:$C92E PRG:092E 90 05 lda #$FF ; CPU:$C930 PRG:0930 A9 FF sta GameplayObjectAuxState,x ; CPU:$C932 PRG:0932 9D 44 05 UpdateRoundObjectSpritesAndPhysics_Block_2: lda GameplayObjectAuxState,x ; CPU:$C935 PRG:0935 BD 44 05 cmp #$10 ; CPU:$C938 PRG:0938 C9 10 bcs UpdateRoundObjectSpritesAndPhysics_Block_3 ; CPU:$C93A PRG:093A B0 03 jmp UpdateRoundObjectSpritesAndPhysics_Block_9 ; CPU:$C93C PRG:093C 4C AF C9 UpdateRoundObjectSpritesAndPhysics_Block_3: jsr IntegrateGameplayObjectPosition ; CPU:$C93F PRG:093F 20 B6 C9 lda GameplayObjectPosX,x ; CPU:$C942 PRG:0942 BD 90 04 cmp #$02 ; CPU:$C945 PRG:0945 C9 02 bcs UpdateRoundObjectSpritesAndPhysics_Block_4 ; CPU:$C947 PRG:0947 B0 03 jsr BounceGameplayObjectY ; CPU:$C949 PRG:0949 20 37 CA UpdateRoundObjectSpritesAndPhysics_Block_4: lda GameplayObjectPosX,x ; CPU:$C94C PRG:094C BD 90 04 cmp #$F7 ; CPU:$C94F PRG:094F C9 F7 bcc UpdateRoundObjectSpritesAndPhysics_Block_5 ; CPU:$C951 PRG:0951 90 03 jsr BounceGameplayObjectY ; CPU:$C953 PRG:0953 20 37 CA UpdateRoundObjectSpritesAndPhysics_Block_5: lda GameplayObjectPosY,x ; CPU:$C956 PRG:0956 BD A4 04 cmp #$02 ; CPU:$C959 PRG:0959 C9 02 bcs UpdateRoundObjectSpritesAndPhysics_Block_6 ; CPU:$C95B PRG:095B B0 03 jsr BounceGameplayObjectX ; CPU:$C95D PRG:095D 20 4F CA UpdateRoundObjectSpritesAndPhysics_Block_6: lda GameplayObjectPosY,x ; CPU:$C960 PRG:0960 BD A4 04 cmp #$E0 ; CPU:$C963 PRG:0963 C9 E0 bcc UpdateRoundObjectSpritesAndPhysics_Block_7 ; CPU:$C965 PRG:0965 90 0D lda #$FF ; CPU:$C967 PRG:0967 A9 FF sta GameplayObjectState,x ; CPU:$C969 PRG:0969 9D 30 05 lda #$F0 ; CPU:$C96C PRG:096C A9 F0 sta GameplayObjectPosY,x ; CPU:$C96E PRG:096E 9D A4 04 jmp UpdateRoundObjectSpritesAndPhysics_Block_9 ; CPU:$C971 PRG:0971 4C AF C9 UpdateRoundObjectSpritesAndPhysics_Block_7: jsr TestGameplayObjectAgainstBounds ; CPU:$C974 PRG:0974 20 67 CA jsr ResolveGameplayObjectInteraction ; CPU:$C977 PRG:0977 20 1C CB ldy GameplayObjectState,x ; CPU:$C97A PRG:097A BC 30 05 iny ; CPU:$C97D PRG:097D C8 tya ; CPU:$C97E PRG:097E 98 and #$07 ; CPU:$C97F PRG:097F 29 07 sta GameplayObjectState,x ; CPU:$C981 PRG:0981 9D 30 05 ldy GameplayObjectState,x ; CPU:$C984 PRG:0984 BC 30 05 lda RoundObjectTileTable,y ; CPU:$C987 PRG:0987 B9 DD C9 sta CurrentRoundObjectTile ; CPU:$C98A PRG:098A 85 12 txa ; CPU:$C98C PRG:098C 8A asl a ; CPU:$C98D PRG:098D 0A asl a ; CPU:$C98E PRG:098E 0A clc ; CPU:$C98F PRG:098F 18 tay ; CPU:$C990 PRG:0990 A8 lda GameplayObjectPosY,x ; CPU:$C991 PRG:0991 BD A4 04 cmp #$D0 ; CPU:$C994 PRG:0994 C9 D0 sta OamBuffer,y ; CPU:$C996 PRG:0996 99 00 02 lda GameplayObjectPosX,x ; CPU:$C999 PRG:0999 BD 90 04 sta $0203,y ; CPU:$C99C PRG:099C 99 03 02 lda CurrentRoundObjectTile ; CPU:$C99F PRG:099F A5 12 sta $0201,y ; CPU:$C9A1 PRG:09A1 99 01 02 lda #$00 ; CPU:$C9A4 PRG:09A4 A9 00 bcc UpdateRoundObjectSpritesAndPhysics_Block_8 ; CPU:$C9A6 PRG:09A6 90 02 lda #$20 ; CPU:$C9A8 PRG:09A8 A9 20 UpdateRoundObjectSpritesAndPhysics_Block_8: sta $0202,y ; CPU:$C9AA PRG:09AA 99 02 02 UpdateRoundObjectSpritesAndPhysics_Block_9: dex ; CPU:$C9AD PRG:09AD CA bmi UpdateRoundObjectSpritesAndPhysics_Block_10 ; CPU:$C9AE PRG:09AE 30 03 jmp UpdateRoundObjectSpritesAndPhysics_Load ; CPU:$C9B0 PRG:09B0 4C B9 C8 UpdateRoundObjectSpritesAndPhysics_Block_10: rts ; CPU:$C9B3 PRG:09B3 60 ;=============================================================================== ; IntegrateGameplayObjectPosition ; ; Global: ; Applies the gameplay object velocity components to its fixed-point position fields. ; ; Local: ; Adds the fractional and integer components of both axes into the corresponding parallel position arrays. ; ; Parameters: ; X = gameplay-object slot. ; ; Returns: ; Gameplay object X/Y fixed-point positions updated. ; ; PRG offsets: $09B6-$09DC ; CPU range: $C9B6-$C9DC ;=============================================================================== IntegrateGameplayObjectPosition: lda GameplayObjectParameter,x ; CPU:$C9B4 PRG:09B4 BD 08 05 clc ; CPU:$C9B7 PRG:09B7 18 adc GameplayObjectVelocityFracY,x ; CPU:$C9B8 PRG:09B8 7D B8 04 sta GameplayObjectVelocityFracY,x ; CPU:$C9BB PRG:09BB 9D B8 04 lda GameplayObjectVelocityY,x ; CPU:$C9BE PRG:09BE BD E0 04 adc GameplayObjectPosX,x ; CPU:$C9C1 PRG:09C1 7D 90 04 sta GameplayObjectPosX,x ; CPU:$C9C4 PRG:09C4 9D 90 04 lda GameplayObjectPosXHi,x ; CPU:$C9C7 PRG:09C7 BD 1C 05 clc ; CPU:$C9CA PRG:09CA 18 adc GameplayObjectVelocityIntY,x ; CPU:$C9CB PRG:09CB 7D CC 04 sta GameplayObjectVelocityIntY,x ; CPU:$C9CE PRG:09CE 9D CC 04 lda GameplayObjectVelocityX,x ; CPU:$C9D1 PRG:09D1 BD F4 04 adc GameplayObjectPosY,x ; CPU:$C9D4 PRG:09D4 7D A4 04 sta GameplayObjectPosY,x ; CPU:$C9D7 PRG:09D7 9D A4 04 rts ; CPU:$C9DA PRG:09DA 60 ; Round-object sprite tables ;=============================================================================== RoundObjectTileTable: .byte $9D, $9E, $9F, $9E, $9D, $A0, $A1, $A0 ; CPU:$C9DB PRG:09DB 9D 9E 9F 9E 9D A0 A1 A0 RoundObjectXOffsetTable: .byte $08, $08, $F0, $F0, $08, $08, $F0, $F0 ; CPU:$C9E3 PRG:09E3 08 08 F0 F0 08 08 F0 F0 .byte $08, $08, $F0, $F0, $08, $08, $F0, $F0 ; CPU:$C9EB PRG:09EB 08 08 F0 F0 08 08 F0 F0 RoundObjectYOffsetTable: .byte $EE, $0A, $0A, $EE, $EE, $0A, $0A, $EE ; CPU:$C9F3 PRG:09F3 EE 0A 0A EE EE 0A 0A EE .byte $EE, $0A, $0A, $EE, $EE, $0A, $0A, $EE ; CPU:$C9FB PRG:09FB EE 0A 0A EE EE 0A 0A EE RoundObjectVerticalSpacingTable: .byte $F8, $08, $08, $F8, $F8, $08, $08, $F8 ; CPU:$CA03 PRG:0A03 F8 08 08 F8 F8 08 08 F8 .byte $F8, $08, $08, $F8, $F8, $08, $08, $F8 ; CPU:$CA0B PRG:0A0B F8 08 08 F8 F8 08 08 F8 RoundObjectTileTopTable: .byte $91, $93, $97, $97, $FC, $92, $95, $9A ; CPU:$CA13 PRG:0A13 91 93 97 97 FC 92 95 9A .byte $9A, $FC ; CPU:$CA1B PRG:0A1B 9A FC RoundObjectTileMiddleTable: .byte $FC, $94, $98, $98, $FC, $FC, $96, $9B ; CPU:$CA1D PRG:0A1D FC 94 98 98 FC FC 96 9B .byte $9B, $FC ; CPU:$CA25 PRG:0A25 9B FC RoundObjectTileBottomTable: .byte $FC, $FC, $99, $99, $FC, $FC, $FC, $9C ; CPU:$CA27 PRG:0A27 FC FC 99 99 FC FC FC 9C .byte $9C, $FC ; CPU:$CA2F PRG:0A2F 9C FC RoundObjectAttributeTable: .byte $C0, $40, $00, $80 ; CPU:$CA31 PRG:0A31 C0 40 00 80 ;=============================================================================== ; NegateGameplayObjectVelocityY ; ; Global: ; Sets the sound/event request flag and negates one fixed-point gameplay-object velocity pair. ; ; Local: ; Sets bit $80 in SoundRequestFlags3, then two’s-complements GameplayObjectParameter and GameplayObjectVelocityY. ; ; Parameters: ; X = gameplay-object slot. ; ; Returns: ; The selected velocity pair is negated. ; ; PRG offsets: $0A37-$0A4E ; CPU range: $CA37-$CA4E ;=============================================================================== BounceGameplayObjectY: lda SoundRequestFlags3 ; CPU:$CA35 PRG:0A35 A5 F3 ora #$80 ; CPU:$CA37 PRG:0A37 09 80 sta SoundRequestFlags3 ; CPU:$CA39 PRG:0A39 85 F3 NegateGameplayObjectVelocityY: lda #$00 ; CPU:$CA3B PRG:0A3B A9 00 sec ; CPU:$CA3D PRG:0A3D 38 sbc GameplayObjectParameter,x ; CPU:$CA3E PRG:0A3E FD 08 05 sta GameplayObjectParameter,x ; CPU:$CA41 PRG:0A41 9D 08 05 lda #$00 ; CPU:$CA44 PRG:0A44 A9 00 sbc GameplayObjectVelocityY,x ; CPU:$CA46 PRG:0A46 FD E0 04 sta GameplayObjectVelocityY,x ; CPU:$CA49 PRG:0A49 9D E0 04 rts ; CPU:$CA4C PRG:0A4C 60 ;=============================================================================== ; NegateGameplayObjectVelocityX ; ; Global: ; Sets the sound/event request flag and negates the other fixed-point gameplay-object velocity pair. ; ; Local: ; Sets bit $80 in SoundRequestFlags3, then two’s-complements GameplayObjectPosXHi and GameplayObjectVelocityX. ; ; Parameters: ; X = gameplay-object slot. ; ; Returns: ; The selected velocity pair is negated. ; ; PRG offsets: $0A4F-$0A66 ; CPU range: $CA4F-$CA66 ;=============================================================================== BounceGameplayObjectX: lda SoundRequestFlags3 ; CPU:$CA4D PRG:0A4D A5 F3 ora #$80 ; CPU:$CA4F PRG:0A4F 09 80 sta SoundRequestFlags3 ; CPU:$CA51 PRG:0A51 85 F3 NegateGameplayObjectVelocityX: lda #$00 ; CPU:$CA53 PRG:0A53 A9 00 sec ; CPU:$CA55 PRG:0A55 38 sbc GameplayObjectPosXHi,x ; CPU:$CA56 PRG:0A56 FD 1C 05 sta GameplayObjectPosXHi,x ; CPU:$CA59 PRG:0A59 9D 1C 05 lda #$00 ; CPU:$CA5C PRG:0A5C A9 00 sbc GameplayObjectVelocityX,x ; CPU:$CA5E PRG:0A5E FD F4 04 sta GameplayObjectVelocityX,x ; CPU:$CA61 PRG:0A61 9D F4 04 rts ; CPU:$CA64 PRG:0A64 60 ;=============================================================================== ; TestGameplayObjectAgainstBounds ; ; Global: ; Tests one gameplay object against a table-driven set of rectangular boundaries. ; ; Local: ; Walks boundary candidate records through four zero-page pointers, accumulates directional overlap flags, and reflects velocity components according to the collision side. ; ; Parameters: ; X = gameplay-object slot; BoundsCandidateIndex and four boundary-table pointers. ; ; Returns: ; GameplayObjectCollisionFlags contains overlap sides; velocity components may be negated. ; ; PRG offsets: $0A67-$0B1A ; CPU range: $CA67-$CB1A ;=============================================================================== TestGameplayObjectAgainstBounds: ldy BoundsCandidateIndex ; CPU:$CA65 PRG:0A65 A4 CD TestGameplayObjectAgainstBounds_Load: lda #$00 ; CPU:$CA67 PRG:0A67 A9 00 sta GameplayObjectCollisionFlags ; CPU:$CA69 PRG:0A69 85 CC lda (BoundsTopPtrLo),y ; CPU:$CA6B PRG:0A6B B1 27 sec ; CPU:$CA6D PRG:0A6D 38 sbc #$08 ; CPU:$CA6E PRG:0A6E E9 08 cmp GameplayObjectPosY,x ; CPU:$CA70 PRG:0A70 DD A4 04 bcs TestGameplayObjectAgainstBounds_Block_7 ; CPU:$CA73 PRG:0A73 B0 66 adc #$03 ; CPU:$CA75 PRG:0A75 69 03 cmp GameplayObjectPosY,x ; CPU:$CA77 PRG:0A77 DD A4 04 bcc TestGameplayObjectAgainstBounds_Block ; CPU:$CA7A PRG:0A7A 90 04 lda #$01 ; CPU:$CA7C PRG:0A7C A9 01 bne TestGameplayObjectAgainstBounds_Block_1 ; CPU:$CA7E PRG:0A7E D0 10 TestGameplayObjectAgainstBounds_Block: lda (BoundsBottomPtrLo),y ; CPU:$CA80 PRG:0A80 B1 29 cmp GameplayObjectPosY,x ; CPU:$CA82 PRG:0A82 DD A4 04 bcc TestGameplayObjectAgainstBounds_Block_7 ; CPU:$CA85 PRG:0A85 90 54 sbc #$03 ; CPU:$CA87 PRG:0A87 E9 03 cmp GameplayObjectPosY,x ; CPU:$CA89 PRG:0A89 DD A4 04 bcs TestGameplayObjectAgainstBounds_Block_4 ; CPU:$CA8C PRG:0A8C B0 1D lda #$02 ; CPU:$CA8E PRG:0A8E A9 02 TestGameplayObjectAgainstBounds_Block_1: sta GameplayObjectCollisionFlags ; CPU:$CA90 PRG:0A90 85 CC lda (BoundsLeftPtrLo),y ; CPU:$CA92 PRG:0A92 B1 23 cmp #$10 ; CPU:$CA94 PRG:0A94 C9 10 beq TestGameplayObjectAgainstBounds_Block_2 ; CPU:$CA96 PRG:0A96 F0 08 sec ; CPU:$CA98 PRG:0A98 38 sbc #$04 ; CPU:$CA99 PRG:0A99 E9 04 cmp GameplayObjectPosX,x ; CPU:$CA9B PRG:0A9B DD 90 04 bcs TestGameplayObjectAgainstBounds_Block_3 ; CPU:$CA9E PRG:0A9E B0 07 TestGameplayObjectAgainstBounds_Block_2: lda (BoundsRightPtrLo),y ; CPU:$CAA0 PRG:0AA0 B1 25 cmp GameplayObjectPosX,x ; CPU:$CAA2 PRG:0AA2 DD 90 04 bcs TestGameplayObjectAgainstBounds_Block_4 ; CPU:$CAA5 PRG:0AA5 B0 04 TestGameplayObjectAgainstBounds_Block_3: lda #$00 ; CPU:$CAA7 PRG:0AA7 A9 00 sta GameplayObjectCollisionFlags ; CPU:$CAA9 PRG:0AA9 85 CC TestGameplayObjectAgainstBounds_Block_4: lda (BoundsLeftPtrLo),y ; CPU:$CAAB PRG:0AAB B1 23 cmp #$10 ; CPU:$CAAD PRG:0AAD C9 10 beq TestGameplayObjectAgainstBounds_Block_5 ; CPU:$CAAF PRG:0AAF F0 15 sec ; CPU:$CAB1 PRG:0AB1 38 sbc #$08 ; CPU:$CAB2 PRG:0AB2 E9 08 cmp GameplayObjectPosX,x ; CPU:$CAB4 PRG:0AB4 DD 90 04 bcs TestGameplayObjectAgainstBounds_Block_7 ; CPU:$CAB7 PRG:0AB7 B0 22 adc #$03 ; CPU:$CAB9 PRG:0AB9 69 03 cmp GameplayObjectPosX,x ; CPU:$CABB PRG:0ABB DD 90 04 bcc TestGameplayObjectAgainstBounds_Block_5 ; CPU:$CABE PRG:0ABE 90 06 lda GameplayObjectCollisionFlags ; CPU:$CAC0 PRG:0AC0 A5 CC ora #$04 ; CPU:$CAC2 PRG:0AC2 09 04 bne TestGameplayObjectAgainstBounds_Block_6 ; CPU:$CAC4 PRG:0AC4 D0 13 TestGameplayObjectAgainstBounds_Block_5: lda (BoundsRightPtrLo),y ; CPU:$CAC6 PRG:0AC6 B1 25 cmp #$FF ; CPU:$CAC8 PRG:0AC8 C9 FF beq TestGameplayObjectAgainstBounds_Block_7 ; CPU:$CACA PRG:0ACA F0 0F cmp GameplayObjectPosX,x ; CPU:$CACC PRG:0ACC DD 90 04 bcc TestGameplayObjectAgainstBounds_Block_7 ; CPU:$CACF PRG:0ACF 90 0A sbc #$03 ; CPU:$CAD1 PRG:0AD1 E9 03 bcs TestGameplayObjectAgainstBounds_Block_7 ; CPU:$CAD3 PRG:0AD3 B0 06 lda GameplayObjectCollisionFlags ; CPU:$CAD5 PRG:0AD5 A5 CC ora #$08 ; CPU:$CAD7 PRG:0AD7 09 08 TestGameplayObjectAgainstBounds_Block_6: sta GameplayObjectCollisionFlags ; CPU:$CAD9 PRG:0AD9 85 CC TestGameplayObjectAgainstBounds_Block_7: lda GameplayObjectCollisionFlags ; CPU:$CADB PRG:0ADB A5 CC bne TestGameplayObjectAgainstBounds_Block_9 ; CPU:$CADD PRG:0ADD D0 07 TestGameplayObjectAgainstBounds_Decrement: dey ; CPU:$CADF PRG:0ADF 88 bmi TestGameplayObjectAgainstBounds_Block_8 ; CPU:$CAE0 PRG:0AE0 30 03 jmp TestGameplayObjectAgainstBounds_Load ; CPU:$CAE2 PRG:0AE2 4C 69 CA TestGameplayObjectAgainstBounds_Block_8: rts ; CPU:$CAE5 PRG:0AE5 60 TestGameplayObjectAgainstBounds_Block_9: lsr GameplayObjectCollisionFlags ; CPU:$CAE6 PRG:0AE6 46 CC bcc TestGameplayObjectAgainstBounds_Block_10 ; CPU:$CAE8 PRG:0AE8 90 08 lda GameplayObjectVelocityX,x ; CPU:$CAEA PRG:0AEA BD F4 04 bmi TestGameplayObjectAgainstBounds_Block_10 ; CPU:$CAED PRG:0AED 30 03 jsr BounceGameplayObjectX ; CPU:$CAEF PRG:0AEF 20 4F CA TestGameplayObjectAgainstBounds_Block_10: lsr GameplayObjectCollisionFlags ; CPU:$CAF2 PRG:0AF2 46 CC bcc TestGameplayObjectAgainstBounds_Block_11 ; CPU:$CAF4 PRG:0AF4 90 08 lda GameplayObjectVelocityX,x ; CPU:$CAF6 PRG:0AF6 BD F4 04 bpl TestGameplayObjectAgainstBounds_Block_11 ; CPU:$CAF9 PRG:0AF9 10 03 jsr BounceGameplayObjectX ; CPU:$CAFB PRG:0AFB 20 4F CA TestGameplayObjectAgainstBounds_Block_11: lsr GameplayObjectCollisionFlags ; CPU:$CAFE PRG:0AFE 46 CC bcc TestGameplayObjectAgainstBounds_Block_12 ; CPU:$CB00 PRG:0B00 90 08 lda GameplayObjectVelocityY,x ; CPU:$CB02 PRG:0B02 BD E0 04 bmi TestGameplayObjectAgainstBounds_Block_12 ; CPU:$CB05 PRG:0B05 30 03 jsr BounceGameplayObjectY ; CPU:$CB07 PRG:0B07 20 37 CA TestGameplayObjectAgainstBounds_Block_12: lsr GameplayObjectCollisionFlags ; CPU:$CB0A PRG:0B0A 46 CC bcc TestGameplayObjectAgainstBounds_Block_13 ; CPU:$CB0C PRG:0B0C 90 08 lda GameplayObjectVelocityY,x ; CPU:$CB0E PRG:0B0E BD E0 04 bpl TestGameplayObjectAgainstBounds_Block_13 ; CPU:$CB11 PRG:0B11 10 03 jsr BounceGameplayObjectY ; CPU:$CB13 PRG:0B13 20 37 CA TestGameplayObjectAgainstBounds_Block_13: jmp TestGameplayObjectAgainstBounds_Decrement ; CPU:$CB16 PRG:0B16 4C E1 CA ; $0B1B: RTS terminating TestGameplayObjectAgainstBounds. rts ; CPU:$CB19 PRG:0B19 60 ;=============================================================================== ; ResolveGameplayObjectInteraction ; ; Global: ; Tests the current gameplay object against active player slots and handles a successful hit. ; ; Local: ; Compares object and player coordinates, transitions the player into a hit state, updates animation/timers and sound flags, then removes the gameplay object. ; ; Parameters: ; X = gameplay-object slot. ; ; Returns: ; Player and gameplay-object state may be changed. ; ; PRG offsets: $0B1C-$0B73 ; CPU range: $CB1C-$CB73 ;=============================================================================== ResolveGameplayObjectInteraction: ldy #$01 ; CPU:$CB1A PRG:0B1A A0 01 ResolveGameplayObjectInteraction_Block: lda $0088,y ; CPU:$CB1C PRG:0B1C B9 88 00 bmi ResolveGameplayObjectInteraction_Block_1 ; CPU:$CB1F PRG:0B1F 30 4D beq ResolveGameplayObjectInteraction_Block_1 ; CPU:$CB21 PRG:0B21 F0 4B lda $00BD,y ; CPU:$CB23 PRG:0B23 B9 BD 00 bne ResolveGameplayObjectInteraction_Block_1 ; CPU:$CB26 PRG:0B26 D0 46 lda GameplayObjectPosX,x ; CPU:$CB28 PRG:0B28 BD 90 04 sec ; CPU:$CB2B PRG:0B2B 38 sbc $0091,y ; CPU:$CB2C PRG:0B2C F9 91 00 jsr AbsoluteDifference ; CPU:$CB2F PRG:0B2F 20 8E F0 cmp #$08 ; CPU:$CB32 PRG:0B32 C9 08 bcs ResolveGameplayObjectInteraction_Block_1 ; CPU:$CB34 PRG:0B34 B0 38 lda GameplayObjectPosY,x ; CPU:$CB36 PRG:0B36 BD A4 04 sec ; CPU:$CB39 PRG:0B39 38 sbc $009A,y ; CPU:$CB3A PRG:0B3A F9 9A 00 sec ; CPU:$CB3D PRG:0B3D 38 sbc #$08 ; CPU:$CB3E PRG:0B3E E9 08 jsr AbsoluteDifference ; CPU:$CB40 PRG:0B40 20 8E F0 cmp #$0C ; CPU:$CB43 PRG:0B43 C9 0C bcs ResolveGameplayObjectInteraction_Block_1 ; CPU:$CB45 PRG:0B45 B0 27 lda #$00 ; CPU:$CB47 PRG:0B47 A9 00 sta $0088,y ; CPU:$CB49 PRG:0B49 99 88 00 lda #$01 ; CPU:$CB4C PRG:0B4C A9 01 sta $007F,y ; CPU:$CB4E PRG:0B4E 99 7F 00 sta $00C1,y ; CPU:$CB51 PRG:0B51 99 C1 00 lda #$0B ; CPU:$CB54 PRG:0B54 A9 0B sta PlayerAnimationState,y ; CPU:$CB56 PRG:0B56 99 51 04 lda #$20 ; CPU:$CB59 PRG:0B59 A9 20 sta PlayerStateTimer,y ; CPU:$CB5B PRG:0B5B 99 5A 04 lda SoundRequestFlags0 ; CPU:$CB5E PRG:0B5E A5 F0 ora #$80 ; CPU:$CB60 PRG:0B60 09 80 sta SoundRequestFlags0 ; CPU:$CB62 PRG:0B62 85 F0 lda #$F0 ; CPU:$CB64 PRG:0B64 A9 F0 sta GameplayObjectPosY,x ; CPU:$CB66 PRG:0B66 9D A4 04 lda #$FF ; CPU:$CB69 PRG:0B69 A9 FF sta GameplayObjectState,x ; CPU:$CB6B PRG:0B6B 9D 30 05 ResolveGameplayObjectInteraction_Block_1: dey ; CPU:$CB6E PRG:0B6E 88 bpl ResolveGameplayObjectInteraction_Block ; CPU:$CB6F PRG:0B6F 10 AB rts ; CPU:$CB71 PRG:0B71 60 ;=============================================================================== ; UpdateBonusObjectSystem ; ; Global: ; Advances the active bonus-object subsystem. ; ; Local: ; Finds the active object, performs frame-gated phase/timer updates, tests player overlap, and advances object phases. ; ; Parameters: ; Bonus object arrays and FrameCounter. ; ; Returns: ; Bonus object state and player effects may be updated. ; ; PRG offsets: $0B74-$0BA7 ; CPU range: $CB74-$CBA7 ;=============================================================================== UpdateBonusObjectSystem: ldx ActiveBonusObjectIndex ; CPU:$CB72 PRG:0B72 AE D1 05 bmi UpdateBonusObjectSystem_Block_2 ; CPU:$CB75 PRG:0B75 30 2E UpdateBonusObjectSystem_Block: jsr FindActiveBonusObject ; CPU:$CB77 PRG:0B77 20 A8 CB lda BonusObjectTimer,x ; CPU:$CB7A PRG:0B7A BD 04 06 beq UpdateBonusObjectSystem_Block_1 ; CPU:$CB7D PRG:0B7D F0 23 txa ; CPU:$CB7F PRG:0B7F 8A eor FrameCounter ; CPU:$CB80 PRG:0B80 45 19 and #$01 ; CPU:$CB82 PRG:0B82 29 01 bne UpdateBonusObjectSystem_Block_1 ; CPU:$CB84 PRG:0B84 D0 1C ldy BonusObjectPhase,x ; CPU:$CB86 PRG:0B86 BC FA 05 iny ; CPU:$CB89 PRG:0B89 C8 tya ; CPU:$CB8A PRG:0B8A 98 and #$03 ; CPU:$CB8B PRG:0B8B 29 03 sta BonusObjectPhase,x ; CPU:$CB8D PRG:0B8D 9D FA 05 jsr DrawBonusObjectHud ; CPU:$CB90 PRG:0B90 20 CB CC lda BonusObjectPhase,x ; CPU:$CB93 PRG:0B93 BD FA 05 cmp #$01 ; CPU:$CB96 PRG:0B96 C9 01 bne UpdateBonusObjectSystem_Block_1 ; CPU:$CB98 PRG:0B98 D0 08 dec BonusObjectPhaseTimer,x ; CPU:$CB9A PRG:0B9A DE 0E 06 bne UpdateBonusObjectSystem_Block_1 ; CPU:$CB9D PRG:0B9D D0 03 dec BonusObjectTimer,x ; CPU:$CB9F PRG:0B9F DE 04 06 UpdateBonusObjectSystem_Block_1: dex ; CPU:$CBA2 PRG:0BA2 CA bpl UpdateBonusObjectSystem_Block ; CPU:$CBA3 PRG:0BA3 10 D2 UpdateBonusObjectSystem_Block_2: rts ; CPU:$CBA5 PRG:0BA5 60 ;=============================================================================== ; FindActiveBonusObject ; ; Global: ; Returns whether the selected bonus-object slot is active. ; ; Local: ; Loads the slot timer/state and returns through the caller path. ; ; Parameters: ; X = bonus-object slot. ; ; Returns: ; Condition codes and A reflect slot activity. ; ; PRG offsets: $0BA8-$0BB1 ; CPU range: $CBA8-$CBB1 ;=============================================================================== FindActiveBonusObject: ldy #$07 ; CPU:$CBA6 PRG:0BA6 A0 07 lda BonusObjectTimer,x ; CPU:$CBA8 PRG:0BA8 BD 04 06 bne TestBonusObjectPlayerOverlap ; CPU:$CBAB PRG:0BAB D0 03 jmp TestBonusObjectCollection ; CPU:$CBAD PRG:0BAD 4C 3A CC ;=============================================================================== ; TestBonusObjectPlayerOverlap ; ; Global: ; Tests a bonus object against each active player and applies directional impulses. ; ; Local: ; Computes absolute X/Y deltas, checks overlap thresholds, sets player impulse fields, requests sound, and continues through all players. ; ; Parameters: ; X = bonus-object slot; Y iterates player slots. ; ; Returns: ; Player motion state and sound flags may be updated. ; ; PRG offsets: $0BB2-$0C32 ; CPU range: $CBB2-$CC32 ;=============================================================================== TestBonusObjectPlayerOverlap: lda $0088,y ; CPU:$CBB0 PRG:0BB0 B9 88 00 bmi TestBonusObjectPlayerOverlap_Block_4 ; CPU:$CBB3 PRG:0BB3 30 78 beq TestBonusObjectPlayerOverlap_Block_4 ; CPU:$CBB5 PRG:0BB5 F0 76 cpy #$02 ; CPU:$CBB7 PRG:0BB7 C0 02 bcc TestBonusObjectPlayerOverlap_Block ; CPU:$CBB9 PRG:0BB9 90 04 cmp #$01 ; CPU:$CBBB PRG:0BBB C9 01 beq TestBonusObjectPlayerOverlap_Block_4 ; CPU:$CBBD PRG:0BBD F0 6E TestBonusObjectPlayerOverlap_Block: lda $0091,y ; CPU:$CBBF PRG:0BBF B9 91 00 clc ; CPU:$CBC2 PRG:0BC2 18 adc #$08 ; CPU:$CBC3 PRG:0BC3 69 08 sec ; CPU:$CBC5 PRG:0BC5 38 sbc BonusObjectPosX,x ; CPU:$CBC6 PRG:0BC6 FD D2 05 sta CollisionDeltaX ; CPU:$CBC9 PRG:0BC9 85 12 jsr AbsoluteDifference ; CPU:$CBCB PRG:0BCB 20 8E F0 cmp #$12 ; CPU:$CBCE PRG:0BCE C9 12 bcs TestBonusObjectPlayerOverlap_Block_4 ; CPU:$CBD0 PRG:0BD0 B0 5B lda $009A,y ; CPU:$CBD2 PRG:0BD2 B9 9A 00 clc ; CPU:$CBD5 PRG:0BD5 18 adc #$0C ; CPU:$CBD6 PRG:0BD6 69 0C sec ; CPU:$CBD8 PRG:0BD8 38 sbc BonusObjectPosY,x ; CPU:$CBD9 PRG:0BD9 FD DC 05 sta CollisionDeltaY ; CPU:$CBDC PRG:0BDC 85 13 jsr AbsoluteDifference ; CPU:$CBDE PRG:0BDE 20 8E F0 cmp #$12 ; CPU:$CBE1 PRG:0BE1 C9 12 bcs TestBonusObjectPlayerOverlap_Block_4 ; CPU:$CBE3 PRG:0BE3 B0 48 lda CollisionDeltaX ; CPU:$CBE5 PRG:0BE5 A5 12 bmi TestBonusObjectPlayerOverlap_Block_1 ; CPU:$CBE7 PRG:0BE7 30 11 cmp #$03 ; CPU:$CBE9 PRG:0BE9 C9 03 bcc TestBonusObjectPlayerOverlap_Block_2 ; CPU:$CBEB PRG:0BEB 90 1C lda #$02 ; CPU:$CBED PRG:0BED A9 02 sta PlayerHorizontalImpulse,y ; CPU:$CBEF PRG:0BEF 99 1B 04 jsr RequestCollisionSound ; CPU:$CBF2 PRG:0BF2 20 33 CC jsr AdjustPlayerVerticalState ; CPU:$CBF5 PRG:0BF5 20 BB EB bne TestBonusObjectPlayerOverlap_Block_2 ; CPU:$CBF8 PRG:0BF8 D0 0F TestBonusObjectPlayerOverlap_Block_1: cmp #$FD ; CPU:$CBFA PRG:0BFA C9 FD bcs TestBonusObjectPlayerOverlap_Block_2 ; CPU:$CBFC PRG:0BFC B0 0B lda #$FE ; CPU:$CBFE PRG:0BFE A9 FE sta PlayerHorizontalImpulse,y ; CPU:$CC00 PRG:0C00 99 1B 04 jsr AdjustPlayerVerticalState ; CPU:$CC03 PRG:0C03 20 BB EB jsr RequestCollisionSound ; CPU:$CC06 PRG:0C06 20 33 CC TestBonusObjectPlayerOverlap_Block_2: lda CollisionDeltaY ; CPU:$CC09 PRG:0C09 A5 13 bmi TestBonusObjectPlayerOverlap_Block_3 ; CPU:$CC0B PRG:0C0B 30 11 cmp #$03 ; CPU:$CC0D PRG:0C0D C9 03 bcc TestBonusObjectPlayerOverlap_Block_4 ; CPU:$CC0F PRG:0C0F 90 1C lda #$02 ; CPU:$CC11 PRG:0C11 A9 02 sta PlayerVerticalImpulse,y ; CPU:$CC13 PRG:0C13 99 2D 04 jsr AdjustPlayerHorizontalState ; CPU:$CC16 PRG:0C16 20 B2 EB jsr RequestCollisionSound ; CPU:$CC19 PRG:0C19 20 33 CC bne TestBonusObjectPlayerOverlap_Block_4 ; CPU:$CC1C PRG:0C1C D0 0F TestBonusObjectPlayerOverlap_Block_3: cmp #$FD ; CPU:$CC1E PRG:0C1E C9 FD bcs TestBonusObjectPlayerOverlap_Block_4 ; CPU:$CC20 PRG:0C20 B0 0B lda #$FE ; CPU:$CC22 PRG:0C22 A9 FE sta PlayerVerticalImpulse,y ; CPU:$CC24 PRG:0C24 99 2D 04 jsr AdjustPlayerHorizontalState ; CPU:$CC27 PRG:0C27 20 B2 EB jsr RequestCollisionSound ; CPU:$CC2A PRG:0C2A 20 33 CC TestBonusObjectPlayerOverlap_Block_4: dey ; CPU:$CC2D PRG:0C2D 88 bpl TestBonusObjectPlayerOverlap ; CPU:$CC2E PRG:0C2E 10 80 rts ; CPU:$CC30 PRG:0C30 60 ;=============================================================================== ; RequestCollisionSound ; ; Global: ; Queues the collision sound effect. ; ; Local: ; Sets bit $02 in SoundRequestFlags1. ; ; Parameters: ; None. ; ; Returns: ; Sound request flag updated. ; ; PRG offsets: $0C33-$0C39 ; CPU range: $CC33-$CC39 ;=============================================================================== RequestCollisionSound: lda SoundRequestFlags1 ; CPU:$CC31 PRG:0C31 A5 F1 ora #$02 ; CPU:$CC33 PRG:0C33 09 02 sta SoundRequestFlags1 ; CPU:$CC35 PRG:0C35 85 F1 rts ; CPU:$CC37 PRG:0C37 60 ;=============================================================================== ; TestBonusObjectCollection ; ; Global: ; Tests a bonus object against players for collection or activation. ; ; Local: ; Checks phase-dependent rectangular overlap and starts the bonus-object timer when collected. ; ; Parameters: ; X = bonus-object slot; Y iterates players. ; ; Returns: ; Bonus object phase/timer may be changed. ; ; PRG offsets: $0C3A-$0CBE ; CPU range: $CC3A-$CCBE ;=============================================================================== TestBonusObjectCollection: lda $0088,y ; CPU:$CC38 PRG:0C38 B9 88 00 bmi TestBonusObjectCollection_Block_2 ; CPU:$CC3B PRG:0C3B 30 79 beq TestBonusObjectCollection_Block_2 ; CPU:$CC3D PRG:0C3D F0 77 cpy #$02 ; CPU:$CC3F PRG:0C3F C0 02 bcc TestBonusObjectCollection_Block ; CPU:$CC41 PRG:0C41 90 2E lda BonusObjectPhase,x ; CPU:$CC43 PRG:0C43 BD FA 05 cmp #$03 ; CPU:$CC46 PRG:0C46 C9 03 bne TestBonusObjectCollection_Block ; CPU:$CC48 PRG:0C48 D0 27 lda BonusObjectPosX,x ; CPU:$CC4A PRG:0C4A BD D2 05 sec ; CPU:$CC4D PRG:0C4D 38 sbc #$0A ; CPU:$CC4E PRG:0C4E E9 0A cmp $0091,y ; CPU:$CC50 PRG:0C50 D9 91 00 bcs TestBonusObjectCollection_Block ; CPU:$CC53 PRG:0C53 B0 1C adc #$04 ; CPU:$CC55 PRG:0C55 69 04 cmp $0091,y ; CPU:$CC57 PRG:0C57 D9 91 00 bcc TestBonusObjectCollection_Block ; CPU:$CC5A PRG:0C5A 90 15 lda BonusObjectPosY,x ; CPU:$CC5C PRG:0C5C BD DC 05 sec ; CPU:$CC5F PRG:0C5F 38 sbc #$1C ; CPU:$CC60 PRG:0C60 E9 1C cmp $009A,y ; CPU:$CC62 PRG:0C62 D9 9A 00 bcs TestBonusObjectCollection_Block ; CPU:$CC65 PRG:0C65 B0 0A adc #$04 ; CPU:$CC67 PRG:0C67 69 04 cmp $009A,y ; CPU:$CC69 PRG:0C69 D9 9A 00 bcc TestBonusObjectCollection_Block ; CPU:$CC6C PRG:0C6C 90 03 jsr TriggerBonusObjectEffect ; CPU:$CC6E PRG:0C6E 20 BF CC TestBonusObjectCollection_Block: lda $0091,y ; CPU:$CC71 PRG:0C71 B9 91 00 clc ; CPU:$CC74 PRG:0C74 18 adc #$08 ; CPU:$CC75 PRG:0C75 69 08 sec ; CPU:$CC77 PRG:0C77 38 sbc BonusObjectPosX,x ; CPU:$CC78 PRG:0C78 FD D2 05 jsr AbsoluteDifference ; CPU:$CC7B PRG:0C7B 20 8E F0 sta CollisionDeltaX ; CPU:$CC7E PRG:0C7E 85 12 lda $009A,y ; CPU:$CC80 PRG:0C80 B9 9A 00 clc ; CPU:$CC83 PRG:0C83 18 adc #$0C ; CPU:$CC84 PRG:0C84 69 0C sec ; CPU:$CC86 PRG:0C86 38 sbc BonusObjectPosY,x ; CPU:$CC87 PRG:0C87 FD DC 05 jsr AbsoluteDifference ; CPU:$CC8A PRG:0C8A 20 8E F0 sta CollisionDeltaY ; CPU:$CC8D PRG:0C8D 85 13 lda BonusObjectPhase,x ; CPU:$CC8F PRG:0C8F BD FA 05 cmp #$03 ; CPU:$CC92 PRG:0C92 C9 03 beq TestBonusObjectCollection_Block_1 ; CPU:$CC94 PRG:0C94 F0 0A lda CollisionDeltaX ; CPU:$CC96 PRG:0C96 A5 12 pha ; CPU:$CC98 PRG:0C98 48 lda CollisionDeltaY ; CPU:$CC99 PRG:0C99 A5 13 sta CollisionDeltaX ; CPU:$CC9B PRG:0C9B 85 12 pla ; CPU:$CC9D PRG:0C9D 68 sta CollisionDeltaY ; CPU:$CC9E PRG:0C9E 85 13 TestBonusObjectCollection_Block_1: lda CollisionDeltaX ; CPU:$CCA0 PRG:0CA0 A5 12 cmp #$14 ; CPU:$CCA2 PRG:0CA2 C9 14 bcs TestBonusObjectCollection_Block_2 ; CPU:$CCA4 PRG:0CA4 B0 10 lda CollisionDeltaY ; CPU:$CCA6 PRG:0CA6 A5 13 cmp #$0B ; CPU:$CCA8 PRG:0CA8 C9 0B bcs TestBonusObjectCollection_Block_2 ; CPU:$CCAA PRG:0CAA B0 0A lda #$01 ; CPU:$CCAC PRG:0CAC A9 01 sta BonusObjectTimer,x ; CPU:$CCAE PRG:0CAE 9D 04 06 lda #$32 ; CPU:$CCB1 PRG:0CB1 A9 32 sta BonusObjectPhaseTimer,x ; CPU:$CCB3 PRG:0CB3 9D 0E 06 TestBonusObjectCollection_Block_2: dey ; CPU:$CCB6 PRG:0CB6 88 bmi TestBonusObjectCollection_Block_3 ; CPU:$CCB7 PRG:0CB7 30 03 jmp TestBonusObjectCollection ; CPU:$CCB9 PRG:0CB9 4C 3A CC TestBonusObjectCollection_Block_3: rts ; CPU:$CCBC PRG:0CBC 60 ;=============================================================================== ; TriggerBonusObjectEffect ; ; Global: ; Invokes the bonus effect using the collecting player as context. ; ; Local: ; Preserves the bonus slot, moves the player index into X, increments the effect count, and calls the effect routine. ; ; Parameters: ; X = bonus-object slot; Y = player slot. ; ; Returns: ; Bonus effect counter and player state updated. ; ; PRG offsets: $0CBF-$0CCA ; CPU range: $CCBF-$CCCA ;=============================================================================== TriggerBonusObjectEffect: txa ; CPU:$CCBD PRG:0CBD 8A pha ; CPU:$CCBE PRG:0CBE 48 tya ; CPU:$CCBF PRG:0CBF 98 tax ; CPU:$CCC0 PRG:0CC0 AA inc BonusEffectCounter ; CPU:$CCC1 PRG:0CC1 E6 CB jsr ApplyBonusEffect ; CPU:$CCC3 PRG:0CC3 20 83 E9 pla ; CPU:$CCC6 PRG:0CC6 68 tax ; CPU:$CCC7 PRG:0CC7 AA rts ; CPU:$CCC8 PRG:0CC8 60 ;=============================================================================== ; DrawBonusObjectHud ; ; Global: ; Builds three HUD tile commands for the active bonus object. ; ; Local: ; Loads command address bytes, selects three triplets of tiles from phase tables, appends each command, and advances the PPU destination. ; ; Parameters: ; X = bonus-object slot. ; ; Returns: ; Three HUD command groups appended. ; ; PRG offsets: $0CCB-$0D0E ; CPU range: $CCCB-$CD0E ;=============================================================================== DrawBonusObjectHud: lda BonusHudAddressHi,x ; CPU:$CCC9 PRG:0CC9 BD F0 05 sta HudCommandAddressHi ; CPU:$CCCC PRG:0CCC 85 57 lda BonusHudAddressLo,x ; CPU:$CCCE PRG:0CCE BD E6 05 sta HudCommandAddressLo ; CPU:$CCD1 PRG:0CD1 85 58 lda #$03 ; CPU:$CCD3 PRG:0CD3 A9 03 sta HudCommandLength ; CPU:$CCD5 PRG:0CD5 85 59 ldy BonusObjectPhase,x ; CPU:$CCD7 PRG:0CD7 BC FA 05 lda BonusHudRow0Tile0Table,y ; CPU:$CCDA PRG:0CDA B9 26 CD sta HudCommandTile0 ; CPU:$CCDD PRG:0CDD 85 5A lda BonusHudRow0Tile1Table,y ; CPU:$CCDF PRG:0CDF B9 2A CD sta HudCommandTile1 ; CPU:$CCE2 PRG:0CE2 85 5B lda BonusHudRow0Tile2Table,y ; CPU:$CCE4 PRG:0CE4 B9 2E CD sta HudCommandTile2 ; CPU:$CCE7 PRG:0CE7 85 5C jsr AdvanceHudCommandAddress ; CPU:$CCE9 PRG:0CE9 20 0F CD lda BonusHudRow1Tile0Table,y ; CPU:$CCEC PRG:0CEC B9 32 CD sta HudCommandTile0 ; CPU:$CCEF PRG:0CEF 85 5A lda BonusHudRow1Tile1Table,y ; CPU:$CCF1 PRG:0CF1 B9 36 CD sta HudCommandTile1 ; CPU:$CCF4 PRG:0CF4 85 5B lda BonusHudRow1Tile2Table,y ; CPU:$CCF6 PRG:0CF6 B9 3A CD sta HudCommandTile2 ; CPU:$CCF9 PRG:0CF9 85 5C jsr AdvanceHudCommandAddress ; CPU:$CCFB PRG:0CFB 20 0F CD lda BonusHudRow2Tile0Table,y ; CPU:$CCFE PRG:0CFE B9 3E CD sta HudCommandTile0 ; CPU:$CD01 PRG:0D01 85 5A lda BonusHudRow2Tile1Table,y ; CPU:$CD03 PRG:0D03 B9 42 CD sta HudCommandTile1 ; CPU:$CD06 PRG:0D06 85 5B lda BonusHudRow2Tile2Table,y ; CPU:$CD08 PRG:0D08 B9 46 CD sta HudCommandTile2 ; CPU:$CD0B PRG:0D0B 85 5C ;=============================================================================== ; AdvanceHudCommandAddress ; ; Global: ; Appends one three-byte HUD tile group and advances the destination by $20. ; ; Local: ; Preserves Y, appends the command block at $57, advances the low address byte, and carries into the high byte. ; ; Parameters: ; Y = phase/table index; $57-$5C = command. ; ; Returns: ; HUD command appended and destination advanced. ; ; PRG offsets: $0D0F-$0D25 ; CPU range: $CD0F-$CD25 ;=============================================================================== AdvanceHudCommandAddress: tya ; CPU:$CD0D PRG:0D0D 98 pha ; CPU:$CD0E PRG:0D0E 48 lda #$57 ; CPU:$CD0F PRG:0D0F A9 57 ldy #$00 ; CPU:$CD11 PRG:0D11 A0 00 jsr $C131 ; CPU:$CD13 PRG:0D13 20 31 C1 pla ; CPU:$CD16 PRG:0D16 68 tay ; CPU:$CD17 PRG:0D17 A8 lda HudCommandAddressLo ; CPU:$CD18 PRG:0D18 A5 58 clc ; CPU:$CD1A PRG:0D1A 18 adc #$20 ; CPU:$CD1B PRG:0D1B 69 20 sta HudCommandAddressLo ; CPU:$CD1D PRG:0D1D 85 58 bcc AdvanceHudCommandAddress_Block ; CPU:$CD1F PRG:0D1F 90 02 inc HudCommandAddressHi ; CPU:$CD21 PRG:0D21 E6 57 AdvanceHudCommandAddress_Block: rts ; CPU:$CD23 PRG:0D23 60 ; Bonus-object HUD tile triplets ; ; Each four-byte table is indexed by BonusObjectPhase ($00-$03). The three ; tables in each group supply HudCommandTile0, HudCommandTile1, and ; HudCommandTile2 for one of the three vertically separated HUD commands. ; ; PRG offsets: $0D26-$0D49 ; CPU range: $CD26-$CD49 ;=============================================================================== BonusHudRow0Tile0Table: .byte $A1, $24, $24, $24 ; CPU:$CD24 PRG:0D24 A1 24 24 24 BonusHudRow0Tile1Table: .byte $A2, $9E, $AB, $24 ; CPU:$CD28 PRG:0D28 A2 9E AB 24 BonusHudRow0Tile2Table: .byte $24, $24, $AC, $24 ; CPU:$CD2C PRG:0D2C 24 24 AC 24 BonusHudRow1Tile0Table: .byte $A3, $24, $AD, $A8 ; CPU:$CD30 PRG:0D30 A3 24 AD A8 BonusHudRow1Tile1Table: .byte $A4, $9F, $AE, $A9 ; CPU:$CD34 PRG:0D34 A4 9F AE A9 BonusHudRow1Tile2Table: .byte $A5, $24, $AF, $AA ; CPU:$CD38 PRG:0D38 A5 24 AF AA BonusHudRow2Tile0Table: .byte $24, $24, $B0, $24 ; CPU:$CD3C PRG:0D3C 24 24 B0 24 BonusHudRow2Tile1Table: .byte $A6, $A0, $B1, $24 ; CPU:$CD40 PRG:0D40 A6 A0 B1 24 BonusHudRow2Tile2Table: .byte $A7, $24, $24, $24 ; CPU:$CD44 PRG:0D44 A7 24 24 24 ;=============================================================================== ; InitializeParticleSlots ; ; Global: ; Initializes the ten-slot particle/effect pool. ; ; Local: ; Marks each slot inactive and places its Y coordinate offscreen. ; ; Parameters: ; None. ; ; Returns: ; Particle slots 0-9 are inactive and hidden. ; ; PRG offsets: $0D4A-$0D59 ; CPU range: $CD4A-$CD59 ;=============================================================================== InitializeParticleSlots: ldx #$09 ; CPU:$CD48 PRG:0D48 A2 09 InitializeParticleSlots_Block: lda #$FF ; CPU:$CD4A PRG:0D4A A9 FF sta ParticleState,x ; CPU:$CD4C PRG:0D4C 9D 5D 05 lda #$F0 ; CPU:$CD4F PRG:0D4F A9 F0 sta ParticlePosY,x ; CPU:$CD51 PRG:0D51 9D 7B 05 dex ; CPU:$CD54 PRG:0D54 CA bpl InitializeParticleSlots_Block ; CPU:$CD55 PRG:0D55 10 F3 rts ; CPU:$CD57 PRG:0D57 60 ;=============================================================================== ; SpawnTimedParticle ; ; Global: ; Counts down the shared spawn timer and initializes one free particle slot when it expires. ; ; Local: ; Reloads the timer from pseudo-random state, finds a free slot, clears motion accumulators, assigns initial position and velocity, and decrements the remaining spawn count. ; ; Parameters: ; ParticleSpawnCountdown and remaining count at $05CB. ; ; Returns: ; One particle may be activated; spawn counters are updated. ; ; PRG offsets: $0D5A-$0DA9 ; CPU range: $CD5A-$CDA9 ;=============================================================================== SpawnTimedParticle: dec ParticleSpawnCountdown ; CPU:$CD58 PRG:0D58 CE CC 05 beq SpawnTimedParticle_Block ; CPU:$CD5B PRG:0D5B F0 01 rts ; CPU:$CD5D PRG:0D5D 60 SpawnTimedParticle_Block: lda RandomState ; CPU:$CD5E PRG:0D5E A5 1B and #$3F ; CPU:$CD60 PRG:0D60 29 3F adc #$28 ; CPU:$CD62 PRG:0D62 69 28 sta ParticleSpawnCountdown ; CPU:$CD64 PRG:0D64 8D CC 05 ldx #$09 ; CPU:$CD67 PRG:0D67 A2 09 SpawnTimedParticle_Block_1: lda ParticleState,x ; CPU:$CD69 PRG:0D69 BD 5D 05 bmi SpawnTimedParticle_Block_2 ; CPU:$CD6C PRG:0D6C 30 04 dex ; CPU:$CD6E PRG:0D6E CA bpl SpawnTimedParticle_Block_1 ; CPU:$CD6F PRG:0D6F 10 F8 rts ; CPU:$CD71 PRG:0D71 60 SpawnTimedParticle_Block_2: lda #$00 ; CPU:$CD72 PRG:0D72 A9 00 sta ParticleState,x ; CPU:$CD74 PRG:0D74 9D 5D 05 sta ParticleVelocityXLo,x ; CPU:$CD77 PRG:0D77 9D 99 05 sta ParticleVelocityXHi,x ; CPU:$CD7A PRG:0D7A 9D 8F 05 lda #$80 ; CPU:$CD7D PRG:0D7D A9 80 sta ParticlePosXFrac,x ; CPU:$CD7F PRG:0D7F 9D 71 05 sta ParticlePosYFrac,x ; CPU:$CD82 PRG:0D82 9D 85 05 lda #$D0 ; CPU:$CD85 PRG:0D85 A9 D0 sta ParticlePosY,x ; CPU:$CD87 PRG:0D87 9D 7B 05 jsr GetRandomValue ; CPU:$CD8A PRG:0D8A 20 B3 F1 and #$03 ; CPU:$CD8D PRG:0D8D 29 03 tay ; CPU:$CD8F PRG:0D8F A8 lda ParticleInitialVelocityTable,y ; CPU:$CD90 PRG:0D90 B9 AE CE sta ParticlePosX,x ; CPU:$CD93 PRG:0D93 9D 67 05 ldy #$00 ; CPU:$CD96 PRG:0D96 A0 00 lda RandomState ; CPU:$CD98 PRG:0D98 A5 1B sta ParticleVelocityYLo,x ; CPU:$CD9A PRG:0D9A 9D B7 05 bpl SpawnTimedParticle_Block_3 ; CPU:$CD9D PRG:0D9D 10 01 dey ; CPU:$CD9F PRG:0D9F 88 SpawnTimedParticle_Block_3: tya ; CPU:$CDA0 PRG:0DA0 98 sta ParticleVelocityYHi,x ; CPU:$CDA1 PRG:0DA1 9D C1 05 dec ParticleSpawnRemaining ; CPU:$CDA4 PRG:0DA4 CE CB 05 rts ; CPU:$CDA7 PRG:0DA7 60 ;=============================================================================== ; UpdateParticleSystem ; ; Global: ; Updates all ten particle slots for the current frame. ; ; Local: ; For each active slot, integrates signed X/Y motion, applies scrolling, retires particles outside the visible range, draws sprites, and tests player overlap. ; ; Parameters: ; Particle arrays, ParticleScrollDelta, and FrameCounter. ; ; Returns: ; Particle positions, states, OAM, and player interactions are updated. ; ; PRG offsets: $0DAA-$0E2E ; CPU range: $CDAA-$CE2E ;=============================================================================== UpdateParticleSystem: ldx #$09 ; CPU:$CDA8 PRG:0DA8 A2 09 UpdateParticleSystem_Load: lda ParticleState,x ; CPU:$CDAA PRG:0DAA BD 5D 05 bmi UpdateParticleSystem_Block_3 ; CPU:$CDAD PRG:0DAD 30 71 beq UpdateParticleSystem_Block ; CPU:$CDAF PRG:0DAF F0 49 lda ParticleVelocityXLo,x ; CPU:$CDB1 PRG:0DB1 BD 99 05 sta MotionDeltaLo ; CPU:$CDB4 PRG:0DB4 85 12 lda ParticleVelocityXHi,x ; CPU:$CDB6 PRG:0DB6 BD 8F 05 sta MotionDeltaHi ; CPU:$CDB9 PRG:0DB9 85 13 jsr UpdateSignedMotionAccumulator ; CPU:$CDBB PRG:0DBB 20 A6 F1 lda ParticleVelocityYLo,x ; CPU:$CDBE PRG:0DBE BD B7 05 clc ; CPU:$CDC1 PRG:0DC1 18 adc MotionDeltaLo ; CPU:$CDC2 PRG:0DC2 65 12 sta ParticleVelocityYLo,x ; CPU:$CDC4 PRG:0DC4 9D B7 05 sta MotionDeltaLo ; CPU:$CDC7 PRG:0DC7 85 12 lda ParticleVelocityYHi,x ; CPU:$CDC9 PRG:0DC9 BD C1 05 adc MotionDeltaHi ; CPU:$CDCC PRG:0DCC 65 13 sta ParticleVelocityYHi,x ; CPU:$CDCE PRG:0DCE 9D C1 05 sta MotionDeltaHi ; CPU:$CDD1 PRG:0DD1 85 13 jsr UpdateSignedMotionAccumulator ; CPU:$CDD3 PRG:0DD3 20 A6 F1 lda ParticleVelocityXLo,x ; CPU:$CDD6 PRG:0DD6 BD 99 05 sec ; CPU:$CDD9 PRG:0DD9 38 sbc MotionDeltaLo ; CPU:$CDDA PRG:0DDA E5 12 sta ParticleVelocityXLo,x ; CPU:$CDDC PRG:0DDC 9D 99 05 lda ParticleVelocityXHi,x ; CPU:$CDDF PRG:0DDF BD 8F 05 sbc MotionDeltaHi ; CPU:$CDE2 PRG:0DE2 E5 13 sta ParticleVelocityXHi,x ; CPU:$CDE4 PRG:0DE4 9D 8F 05 lda ParticlePosXFrac,x ; CPU:$CDE7 PRG:0DE7 BD 71 05 clc ; CPU:$CDEA PRG:0DEA 18 adc ParticleVelocityXLo,x ; CPU:$CDEB PRG:0DEB 7D 99 05 sta ParticlePosXFrac,x ; CPU:$CDEE PRG:0DEE 9D 71 05 lda ParticlePosX,x ; CPU:$CDF1 PRG:0DF1 BD 67 05 adc ParticleVelocityXHi,x ; CPU:$CDF4 PRG:0DF4 7D 8F 05 sta ParticlePosX,x ; CPU:$CDF7 PRG:0DF7 9D 67 05 UpdateParticleSystem_Block: lda ParticlePosYFrac,x ; CPU:$CDFA PRG:0DFA BD 85 05 sec ; CPU:$CDFD PRG:0DFD 38 sbc ParticleScrollDelta ; CPU:$CDFE PRG:0DFE ED 5A 05 sta ParticlePosYFrac,x ; CPU:$CE01 PRG:0E01 9D 85 05 bcs UpdateParticleSystem_Block_1 ; CPU:$CE04 PRG:0E04 B0 03 dec ParticlePosY,x ; CPU:$CE06 PRG:0E06 DE 7B 05 UpdateParticleSystem_Block_1: lda ParticlePosY,x ; CPU:$CE09 PRG:0E09 BD 7B 05 cmp #$F0 ; CPU:$CE0C PRG:0E0C C9 F0 beq UpdateParticleSystem_Block_2 ; CPU:$CE0E PRG:0E0E F0 0B cmp #$A8 ; CPU:$CE10 PRG:0E10 C9 A8 bcs UpdateParticleSystem_Block_3 ; CPU:$CE12 PRG:0E12 B0 0C lda #$01 ; CPU:$CE14 PRG:0E14 A9 01 sta ParticleState,x ; CPU:$CE16 PRG:0E16 9D 5D 05 bne UpdateParticleSystem_Block_3 ; CPU:$CE19 PRG:0E19 D0 05 UpdateParticleSystem_Block_2: lda #$FF ; CPU:$CE1B PRG:0E1B A9 FF sta ParticleState,x ; CPU:$CE1D PRG:0E1D 9D 5D 05 UpdateParticleSystem_Block_3: jsr DrawParticleSprites ; CPU:$CE20 PRG:0E20 20 2F CE jsr TestParticlePlayerOverlap ; CPU:$CE23 PRG:0E23 20 CE CE dex ; CPU:$CE26 PRG:0E26 CA bmi UpdateParticleSystem_Block_4 ; CPU:$CE27 PRG:0E27 30 03 jmp UpdateParticleSystem_Load ; CPU:$CE29 PRG:0E29 4C AC CD UpdateParticleSystem_Block_4: rts ; CPU:$CE2C PRG:0E2C 60 ;=============================================================================== ; DrawParticleSprites ; ; Global: ; Builds the three-sprite OAM representation for one particle slot. ; ; Local: ; Selects the attribute and animation frame from state/timing tables, writes three adjacent sprites, and hides inactive particles. ; ; Parameters: ; X = particle slot. ; ; Returns: ; OAM entries for the selected particle are written. ; ; PRG offsets: $0E2F-$0EAD ; CPU range: $CE2F-$CEAD ;=============================================================================== DrawParticleSprites: ldy ParticleState,x ; CPU:$CE2D PRG:0E2D BC 5D 05 iny ; CPU:$CE30 PRG:0E30 C8 lda ParticleAttributeTable,y ; CPU:$CE31 PRG:0E31 B9 B2 CE sta MotionDeltaHi ; CPU:$CE34 PRG:0E34 85 13 txa ; CPU:$CE36 PRG:0E36 8A sta MotionDeltaLo ; CPU:$CE37 PRG:0E37 85 12 asl a ; CPU:$CE39 PRG:0E39 0A adc MotionDeltaLo ; CPU:$CE3A PRG:0E3A 65 12 asl a ; CPU:$CE3C PRG:0E3C 0A asl a ; CPU:$CE3D PRG:0E3D 0A tay ; CPU:$CE3E PRG:0E3E A8 lda ParticlePosY,x ; CPU:$CE3F PRG:0E3F BD 7B 05 sta ParticleOamBase,y ; CPU:$CE42 PRG:0E42 99 50 02 sta $0254,y ; CPU:$CE45 PRG:0E45 99 54 02 clc ; CPU:$CE48 PRG:0E48 18 adc #$08 ; CPU:$CE49 PRG:0E49 69 08 sta $0258,y ; CPU:$CE4B PRG:0E4B 99 58 02 lda ParticlePosX,x ; CPU:$CE4E PRG:0E4E BD 67 05 sta $0253,y ; CPU:$CE51 PRG:0E51 99 53 02 clc ; CPU:$CE54 PRG:0E54 18 adc #$04 ; CPU:$CE55 PRG:0E55 69 04 sta $025B,y ; CPU:$CE57 PRG:0E57 99 5B 02 clc ; CPU:$CE5A PRG:0E5A 18 adc #$04 ; CPU:$CE5B PRG:0E5B 69 04 sta $0257,y ; CPU:$CE5D PRG:0E5D 99 57 02 lda MotionDeltaHi ; CPU:$CE60 PRG:0E60 A5 13 sta $0252,y ; CPU:$CE62 PRG:0E62 99 52 02 sta $0256,y ; CPU:$CE65 PRG:0E65 99 56 02 sta $025A,y ; CPU:$CE68 PRG:0E68 99 5A 02 lda ParticleState,x ; CPU:$CE6B PRG:0E6B BD 5D 05 bmi DrawParticleSprites_Block ; CPU:$CE6E PRG:0E6E 30 27 lda #$A8 ; CPU:$CE70 PRG:0E70 A9 A8 sta $0251,y ; CPU:$CE72 PRG:0E72 99 51 02 lda #$A9 ; CPU:$CE75 PRG:0E75 A9 A9 sta $0255,y ; CPU:$CE77 PRG:0E77 99 55 02 lda FrameCounter ; CPU:$CE7A PRG:0E7A A5 19 lsr a ; CPU:$CE7C PRG:0E7C 4A lsr a ; CPU:$CE7D PRG:0E7D 4A lsr a ; CPU:$CE7E PRG:0E7E 4A lsr a ; CPU:$CE7F PRG:0E7F 4A and #$07 ; CPU:$CE80 PRG:0E80 29 07 stx MotionDeltaHi ; CPU:$CE82 PRG:0E82 86 13 tax ; CPU:$CE84 PRG:0E84 AA lda ParticleAnimationTileTable,x ; CPU:$CE85 PRG:0E85 BD B5 CE sta $0259,y ; CPU:$CE88 PRG:0E88 99 59 02 lda $025A,y ; CPU:$CE8B PRG:0E8B B9 5A 02 eor ParticleAnimationAttributeMaskTable,x ; CPU:$CE8E PRG:0E8E 5D BD CE sta $025A,y ; CPU:$CE91 PRG:0E91 99 5A 02 ldx MotionDeltaHi ; CPU:$CE94 PRG:0E94 A6 13 rts ; CPU:$CE96 PRG:0E96 60 DrawParticleSprites_Block: lda #$F0 ; CPU:$CE97 PRG:0E97 A9 F0 sta ParticlePosY,x ; CPU:$CE99 PRG:0E99 9D 7B 05 lda #$AC ; CPU:$CE9C PRG:0E9C A9 AC sta $0251,y ; CPU:$CE9E PRG:0E9E 99 51 02 lda #$AD ; CPU:$CEA1 PRG:0EA1 A9 AD sta $0255,y ; CPU:$CEA3 PRG:0EA3 99 55 02 lda #$FC ; CPU:$CEA6 PRG:0EA6 A9 FC sta $0259,y ; CPU:$CEA8 PRG:0EA8 99 59 02 rts ; CPU:$CEAB PRG:0EAB 60 ; Particle rendering tables ;=============================================================================== ParticleInitialVelocityTable: .byte $20, $50, $A0, $D0 ; CPU:$CEAC PRG:0EAC 20 50 A0 D0 ParticleAttributeTable: .byte $02, $22, $02 ; CPU:$CEB0 PRG:0EB0 02 22 02 ParticleAnimationTileTable: .byte $AA, $AB, $AB, $AA, $AA, $AB, $AB, $AA ; CPU:$CEB3 PRG:0EB3 AA AB AB AA AA AB AB AA ParticleAnimationAttributeMaskTable: .byte $00, $00, $40, $40, $40, $40, $00, $00 ; CPU:$CEBB PRG:0EBB 00 00 40 40 40 40 00 00 .byte $FC, $FC, $DF, $FC, $FC, $E0, $E2, $E1 ; CPU:$CEC3 PRG:0EC3 FC FC DF FC FC E0 E2 E1 .byte $FC ; CPU:$CECB PRG:0ECB FC ;=============================================================================== ; TestParticlePlayerOverlap ; ; Global: ; Tests an active particle against both players and records a hit. ; ; Local: ; Rejects inactive players and particles, checks X/Y distances, retires the particle, increments the player hit counter, and requests a sound. ; ; Parameters: ; X = particle slot. ; ; Returns: ; Particle and player hit state may be updated. ; ; PRG offsets: $0ECE-$0F12 ; CPU range: $CECE-$CF12 ;=============================================================================== TestParticlePlayerOverlap: ldy #$01 ; CPU:$CECC PRG:0ECC A0 01 TestParticlePlayerOverlap_Block: lda $0088,y ; CPU:$CECE PRG:0ECE B9 88 00 bmi TestParticlePlayerOverlap_Block_1 ; CPU:$CED1 PRG:0ED1 30 3A beq TestParticlePlayerOverlap_Block_1 ; CPU:$CED3 PRG:0ED3 F0 38 lda ParticleState,x ; CPU:$CED5 PRG:0ED5 BD 5D 05 bmi TestParticlePlayerOverlap_Block_2 ; CPU:$CED8 PRG:0ED8 30 36 lda $009A,y ; CPU:$CEDA PRG:0EDA B9 9A 00 cmp #$C0 ; CPU:$CEDD PRG:0EDD C9 C0 bcs TestParticlePlayerOverlap_Block_1 ; CPU:$CEDF PRG:0EDF B0 2C sec ; CPU:$CEE1 PRG:0EE1 38 sbc ParticlePosY,x ; CPU:$CEE2 PRG:0EE2 FD 7B 05 jsr AbsoluteDifference ; CPU:$CEE5 PRG:0EE5 20 8E F0 cmp #$18 ; CPU:$CEE8 PRG:0EE8 C9 18 bcs TestParticlePlayerOverlap_Block_1 ; CPU:$CEEA PRG:0EEA B0 21 lda $0091,y ; CPU:$CEEC PRG:0EEC B9 91 00 sec ; CPU:$CEEF PRG:0EEF 38 sbc ParticlePosX,x ; CPU:$CEF0 PRG:0EF0 FD 67 05 jsr AbsoluteDifference ; CPU:$CEF3 PRG:0EF3 20 8E F0 cmp #$10 ; CPU:$CEF6 PRG:0EF6 C9 10 bcs TestParticlePlayerOverlap_Block_1 ; CPU:$CEF8 PRG:0EF8 B0 13 lda #$FF ; CPU:$CEFA PRG:0EFA A9 FF sta ParticleState,x ; CPU:$CEFC PRG:0EFC 9D 5D 05 lda PlayerParticleHitCount,y ; CPU:$CEFF PRG:0EFF B9 CD 05 clc ; CPU:$CF02 PRG:0F02 18 adc #$01 ; CPU:$CF03 PRG:0F03 69 01 sta PlayerParticleHitCount,y ; CPU:$CF05 PRG:0F05 99 CD 05 lda #$02 ; CPU:$CF08 PRG:0F08 A9 02 sta SoundRequestFlags0 ; CPU:$CF0A PRG:0F0A 85 F0 rts ; CPU:$CF0C PRG:0F0C 60 TestParticlePlayerOverlap_Block_1: dey ; CPU:$CF0D PRG:0F0D 88 bpl TestParticlePlayerOverlap_Block ; CPU:$CF0E PRG:0F0E 10 BE TestParticlePlayerOverlap_Block_2: rts ; CPU:$CF10 PRG:0F10 60 ;=============================================================================== ; RunParticleBonusSequence ; ; Global: ; Runs the complete particle bonus/transition sequence. ; ; Local: ; Initializes systems, spawns and updates particles until exhausted, presents result screens, positions players, and advances several timed PPU/audio phases. ; ; Parameters: ; Global game and player state. ; ; Returns: ; Sequence completes and returns to the main state flow. ; ; PRG offsets: $0F13-$10E1 ; CPU range: $CF13-$D0E1 ;=============================================================================== RunParticleBonusSequence: lda #$20 ; CPU:$CF11 PRG:0F11 A9 20 sta SoundRequestFlags2 ; CPU:$CF13 PRG:0F13 85 F2 jsr LoadParticleSequenceData ; CPU:$CF15 PRG:0F15 20 E2 D0 jsr InitializeParticleSlots ; CPU:$CF18 PRG:0F18 20 4A CD ldx PlayerCountMinusOne ; CPU:$CF1B PRG:0F1B A6 40 RunParticleBonusSequence_Block: lda PlayerActiveFlags,x ; CPU:$CF1D PRG:0F1D B5 41 bmi RunParticleBonusSequence_Block_1 ; CPU:$CF1F PRG:0F1F 30 03 jsr $F3B0 ; CPU:$CF21 PRG:0F21 20 B0 F3 RunParticleBonusSequence_Block_1: dex ; CPU:$CF24 PRG:0F24 CA bpl RunParticleBonusSequence_Block ; CPU:$CF25 PRG:0F25 10 F6 ldx #$00 ; CPU:$CF27 PRG:0F27 A2 00 stx PlayerCollisionDisable ; CPU:$CF29 PRG:0F29 86 BD stx SequenceState ; CPU:$CF2B PRG:0F2B 86 BE lda #$14 ; CPU:$CF2D PRG:0F2D A9 14 sta $05CB ; CPU:$CF2F PRG:0F2F 8D CB 05 RunParticleBonusSequence_Block_2: jsr $F470 ; CPU:$CF32 PRG:0F32 20 70 F4 inc $4C ; CPU:$CF35 PRG:0F35 E6 4C jsr $D8DD ; CPU:$CF37 PRG:0F37 20 DD D8 jsr $E691 ; CPU:$CF3A PRG:0F3A 20 91 E6 lda $05CB ; CPU:$CF3D PRG:0F3D AD CB 05 beq RunParticleBonusSequence_Block_3 ; CPU:$CF40 PRG:0F40 F0 03 jsr SpawnTimedParticle ; CPU:$CF42 PRG:0F42 20 5A CD RunParticleBonusSequence_Block_3: jsr UpdateParticleSystem ; CPU:$CF45 PRG:0F45 20 AA CD lda $05CB ; CPU:$CF48 PRG:0F48 AD CB 05 bne RunParticleBonusSequence_Block_2 ; CPU:$CF4B PRG:0F4B D0 E5 ldx #$09 ; CPU:$CF4D PRG:0F4D A2 09 RunParticleBonusSequence_Block_4: lda ParticleState,x ; CPU:$CF4F PRG:0F4F BD 5D 05 bpl RunParticleBonusSequence_Block_2 ; CPU:$CF52 PRG:0F52 10 DE dex ; CPU:$CF54 PRG:0F54 CA bpl RunParticleBonusSequence_Block_4 ; CPU:$CF55 PRG:0F55 10 F8 lda FrameCounter ; CPU:$CF57 PRG:0F57 A5 19 bne RunParticleBonusSequence_Block_2 ; CPU:$CF59 PRG:0F59 D0 D7 jsr $D246 ; CPU:$CF5B PRG:0F5B 20 46 D2 ldx #$02 ; CPU:$CF5E PRG:0F5E A2 02 stx SequenceStep ; CPU:$CF60 PRG:0F60 86 46 jsr $F45E ; CPU:$CF62 PRG:0F62 20 5E F4 lda #$2B ; CPU:$CF65 PRG:0F65 A9 2B ldy #$D1 ; CPU:$CF67 PRG:0F67 A0 D1 jsr $C131 ; CPU:$CF69 PRG:0F69 20 31 C1 lda #$5A ; CPU:$CF6C PRG:0F6C A9 5A ldy #$D1 ; CPU:$CF6E PRG:0F6E A0 D1 jsr $C131 ; CPU:$CF70 PRG:0F70 20 31 C1 lda #$65 ; CPU:$CF73 PRG:0F73 A9 65 ldy #$D1 ; CPU:$CF75 PRG:0F75 A0 D1 jsr $C131 ; CPU:$CF77 PRG:0F77 20 31 C1 ldx PlayerCountMinusOne ; CPU:$CF7A PRG:0F7A A6 40 RunParticleBonusSequence_Block_5: lda #$20 ; CPU:$CF7C PRG:0F7C A9 20 sta PlayerPosX,x ; CPU:$CF7E PRG:0F7E 95 91 lda $D19E,x ; CPU:$CF80 PRG:0F80 BD 9E D1 sta PlayerPosY,x ; CPU:$CF83 PRG:0F83 95 9A lda #$03 ; CPU:$CF85 PRG:0F85 A9 03 sta $7F,x ; CPU:$CF87 PRG:0F87 95 7F lda #$01 ; CPU:$CF89 PRG:0F89 A9 01 sta $0448,x ; CPU:$CF8B PRG:0F8B 9D 48 04 jsr $F3B0 ; CPU:$CF8E PRG:0F8E 20 B0 F3 jsr $E3A4 ; CPU:$CF91 PRG:0F91 20 A4 E3 dex ; CPU:$CF94 PRG:0F94 CA bpl RunParticleBonusSequence_Block_5 ; CPU:$CF95 PRG:0F95 10 E5 lda #$44 ; CPU:$CF97 PRG:0F97 A9 44 sta ParticlePosX ; CPU:$CF99 PRG:0F99 8D 67 05 sta $0568 ; CPU:$CF9C PRG:0F9C 8D 68 05 lda #$54 ; CPU:$CF9F PRG:0F9F A9 54 sta ParticlePosY ; CPU:$CFA1 PRG:0FA1 8D 7B 05 lda #$74 ; CPU:$CFA4 PRG:0FA4 A9 74 sta $057C ; CPU:$CFA6 PRG:0FA6 8D 7C 05 lda #$01 ; CPU:$CFA9 PRG:0FA9 A9 01 sta ParticleState ; CPU:$CFAB PRG:0FAB 8D 5D 05 sta $055E ; CPU:$CFAE PRG:0FAE 8D 5E 05 ldx PlayerCountMinusOne ; CPU:$CFB1 PRG:0FB1 A6 40 RunParticleBonusSequence_Block_6: jsr DrawParticleSprites ; CPU:$CFB3 PRG:0FB3 20 2F CE dex ; CPU:$CFB6 PRG:0FB6 CA bpl RunParticleBonusSequence_Block_6 ; CPU:$CFB7 PRG:0FB7 10 FA jsr $F45C ; CPU:$CFB9 PRG:0FB9 20 5C F4 lda #$2B ; CPU:$CFBC PRG:0FBC A9 2B sta PpuCommandData0 ; CPU:$CFBE PRG:0FBE 85 57 lda #$24 ; CPU:$CFC0 PRG:0FC0 A9 24 sta PpuCommandData1 ; CPU:$CFC2 PRG:0FC2 85 58 sta PpuCommandData2 ; CPU:$CFC4 PRG:0FC4 85 59 lda #$0C ; CPU:$CFC6 PRG:0FC6 A9 0C sta PpuCommandAddressHi ; CPU:$CFC8 PRG:0FC8 85 54 lda #$0B ; CPU:$CFCA PRG:0FCA A9 0B sta PpuCommandAddressLo ; CPU:$CFCC PRG:0FCC 85 55 lda #$05 ; CPU:$CFCE PRG:0FCE A9 05 sta PpuCommandLength ; CPU:$CFD0 PRG:0FD0 85 56 lda PlayerParticleHitCount ; CPU:$CFD2 PRG:0FD2 AD CD 05 jsr $D1C9 ; CPU:$CFD5 PRG:0FD5 20 C9 D1 lda PlayerCountMinusOne ; CPU:$CFD8 PRG:0FD8 A5 40 beq RunParticleBonusSequence_Block_7 ; CPU:$CFDA PRG:0FDA F0 0A lda #$0F ; CPU:$CFDC PRG:0FDC A9 0F sta PpuCommandAddressLo ; CPU:$CFDE PRG:0FDE 85 55 lda PlayerParticleHitCount2 ; CPU:$CFE0 PRG:0FE0 AD CE 05 jsr $D1C9 ; CPU:$CFE3 PRG:0FE3 20 C9 D1 RunParticleBonusSequence_Block_7: jsr $F45C ; CPU:$CFE6 PRG:0FE6 20 5C F4 lda ParticleSequenceValue ; CPU:$CFE9 PRG:0FE9 AD 59 05 sta PpuCommandData0 ; CPU:$CFEC PRG:0FEC 85 57 lda #$00 ; CPU:$CFEE PRG:0FEE A9 00 sta PpuCommandData1 ; CPU:$CFF0 PRG:0FF0 85 58 sta PpuCommandData2 ; CPU:$CFF2 PRG:0FF2 85 59 lda #$08 ; CPU:$CFF4 PRG:0FF4 A9 08 sta PpuCommandAddressHi ; CPU:$CFF6 PRG:0FF6 85 54 lda #$0B ; CPU:$CFF8 PRG:0FF8 A9 0B sta PpuCommandAddressLo ; CPU:$CFFA PRG:0FFA 85 55 lda #$03 ; CPU:$CFFC PRG:0FFC A9 03 sta PpuCommandLength ; CPU:$CFFE PRG:0FFE 85 56 lda ParticleSequenceValue ; CPU:$D000 PRG:1000 AD 59 05 jsr $C119 ; CPU:$D003 PRG:1003 20 19 C1 lda PlayerCountMinusOne ; CPU:$D006 PRG:1006 A5 40 beq RunParticleBonusSequence_Block_8 ; CPU:$D008 PRG:1008 F0 07 lda #$0F ; CPU:$D00A PRG:100A A9 0F sta PpuCommandAddressLo ; CPU:$D00C PRG:100C 85 55 jsr $C119 ; CPU:$D00E PRG:100E 20 19 C1 RunParticleBonusSequence_Block_8: lda #$FF ; CPU:$D011 PRG:1011 A9 FF sta ParticleState ; CPU:$D013 PRG:1013 8D 5D 05 sta $055E ; CPU:$D016 PRG:1016 8D 5E 05 ldx PlayerCountMinusOne ; CPU:$D019 PRG:1019 A6 40 RunParticleBonusSequence_Block_9: jsr DrawParticleSprites ; CPU:$D01B PRG:101B 20 2F CE dex ; CPU:$D01E PRG:101E CA bpl RunParticleBonusSequence_Block_9 ; CPU:$D01F PRG:101F 10 FA lda #$02 ; CPU:$D021 PRG:1021 A9 02 sta SoundRequestFlags0 ; CPU:$D023 PRG:1023 85 F0 ldx #$02 ; CPU:$D025 PRG:1025 A2 02 jsr $F45E ; CPU:$D027 PRG:1027 20 5E F4 ldx PlayerCountMinusOne ; CPU:$D02A PRG:102A A6 40 RunParticleBonusSequence_Block_10: jsr DrawParticleSprites ; CPU:$D02C PRG:102C 20 2F CE dex ; CPU:$D02F PRG:102F CA bpl RunParticleBonusSequence_Block_10 ; CPU:$D030 PRG:1030 10 FA jsr $D1A0 ; CPU:$D032 PRG:1032 20 A0 D1 jsr $F45C ; CPU:$D035 PRG:1035 20 5C F4 lda #$01 ; CPU:$D038 PRG:1038 A9 01 sta SoundRequestFlags0 ; CPU:$D03A PRG:103A 85 F0 jsr $D121 ; CPU:$D03C PRG:103C 20 21 D1 bne RunParticleBonusSequence_Block_12 ; CPU:$D03F PRG:103F D0 25 lda #$70 ; CPU:$D041 PRG:1041 A9 70 ldy #$D1 ; CPU:$D043 PRG:1043 A0 D1 jsr $C131 ; CPU:$D045 PRG:1045 20 31 C1 jsr $F465 ; CPU:$D048 PRG:1048 20 65 F4 ldx #$1A ; CPU:$D04B PRG:104B A2 1A RunParticleBonusSequence_Block_11: lda $D184,x ; CPU:$D04D PRG:104D BD 84 D1 sta PpuCommandData0,x ; CPU:$D050 PRG:1050 95 57 dex ; CPU:$D052 PRG:1052 CA bpl RunParticleBonusSequence_Block_11 ; CPU:$D053 PRG:1053 10 F8 lda SequenceDataLo ; CPU:$D055 PRG:1055 AD 5B 05 sta SequencePointerLo ; CPU:$D058 PRG:1058 85 68 lda SequenceDataHi ; CPU:$D05A PRG:105A AD 5C 05 sta SequencePointerHi ; CPU:$D05D PRG:105D 85 69 jsr $C12D ; CPU:$D05F PRG:105F 20 2D C1 lda #$10 ; CPU:$D062 PRG:1062 A9 10 sta SoundRequestFlags2 ; CPU:$D064 PRG:1064 85 F2 RunParticleBonusSequence_Block_12: ldx #$78 ; CPU:$D066 PRG:1066 A2 78 jsr $F45E ; CPU:$D068 PRG:1068 20 5E F4 jsr $D1A0 ; CPU:$D06B PRG:106B 20 A0 D1 RunParticleBonusSequence_Block_13: lda #$00 ; CPU:$D06E PRG:106E A9 00 sta SequencePlayerIndex ; CPU:$D070 PRG:1070 85 3E ldx #$04 ; CPU:$D072 PRG:1072 A2 04 jsr $D213 ; CPU:$D074 PRG:1074 20 13 D2 jsr $C12D ; CPU:$D077 PRG:1077 20 2D C1 lda PlayerCountMinusOne ; CPU:$D07A PRG:107A A5 40 beq RunParticleBonusSequence_Block_14 ; CPU:$D07C PRG:107C F0 0E inc SequencePlayerIndex ; CPU:$D07E PRG:107E E6 3E ldx #$12 ; CPU:$D080 PRG:1080 A2 12 jsr $D213 ; CPU:$D082 PRG:1082 20 13 D2 lda #$65 ; CPU:$D085 PRG:1085 A9 65 ldy #$00 ; CPU:$D087 PRG:1087 A0 00 jsr $C131 ; CPU:$D089 PRG:1089 20 31 C1 RunParticleBonusSequence_Block_14: lda #$01 ; CPU:$D08C PRG:108C A9 01 sta SoundRequestFlags1 ; CPU:$D08E PRG:108E 85 F1 ldx #$02 ; CPU:$D090 PRG:1090 A2 02 jsr $F45E ; CPU:$D092 PRG:1092 20 5E F4 lda PpuBufferHead ; CPU:$D095 PRG:1095 A5 5D cmp #$24 ; CPU:$D097 PRG:1097 C9 24 bne RunParticleBonusSequence_Block_13 ; CPU:$D099 PRG:1099 D0 D3 lda PlayerCountMinusOne ; CPU:$D09B PRG:109B A5 40 beq RunParticleBonusSequence_Block_15 ; CPU:$D09D PRG:109D F0 07 lda a:$006B ; CPU:$D09F PRG:109F AD 6B 00 cmp #$24 ; CPU:$D0A2 PRG:10A2 C9 24 bne RunParticleBonusSequence_Block_13 ; CPU:$D0A4 PRG:10A4 D0 C8 RunParticleBonusSequence_Block_15: ldx #$0A ; CPU:$D0A6 PRG:10A6 A2 0A jsr $F45E ; CPU:$D0A8 PRG:10A8 20 5E F4 jsr $D121 ; CPU:$D0AB PRG:10AB 20 21 D1 bne RunParticleBonusSequence_Block_17 ; CPU:$D0AE PRG:10AE D0 1C lda SequenceDataLo ; CPU:$D0B0 PRG:10B0 AD 5B 05 sta SequenceValueLo ; CPU:$D0B3 PRG:10B3 85 47 lda SequenceDataHi ; CPU:$D0B5 PRG:10B5 AD 5C 05 sta SequenceValueHi ; CPU:$D0B8 PRG:10B8 85 48 lda PlayerCountMinusOne ; CPU:$D0BA PRG:10BA A5 40 sta SequencePlayerIndex ; CPU:$D0BC PRG:10BC 85 3E RunParticleBonusSequence_Block_16: jsr $D6DC ; CPU:$D0BE PRG:10BE 20 DC D6 dec SequencePlayerIndex ; CPU:$D0C1 PRG:10C1 C6 3E bpl RunParticleBonusSequence_Block_16 ; CPU:$D0C3 PRG:10C3 10 F9 lda #$01 ; CPU:$D0C5 PRG:10C5 A9 01 sta SoundRequestFlags1 ; CPU:$D0C7 PRG:10C7 85 F1 jsr $F45C ; CPU:$D0C9 PRG:10C9 20 5C F4 RunParticleBonusSequence_Block_17: lda #$00 ; CPU:$D0CC PRG:10CC A9 00 sta SequenceValueLo ; CPU:$D0CE PRG:10CE 85 47 sta SequenceValueHi ; CPU:$D0D0 PRG:10D0 85 48 ldx #$01 ; CPU:$D0D2 PRG:10D2 A2 01 RunParticleBonusSequence_Block_18: lda PlayerActiveFlags,x ; CPU:$D0D4 PRG:10D4 B5 41 bpl RunParticleBonusSequence_Block_19 ; CPU:$D0D6 PRG:10D6 10 02 sta PlayerSlotState,x ; CPU:$D0D8 PRG:10D8 95 88 RunParticleBonusSequence_Block_19: dex ; CPU:$D0DA PRG:10DA CA bpl RunParticleBonusSequence_Block_18 ; CPU:$D0DB PRG:10DB 10 F7 jmp $F353 ; CPU:$D0DD PRG:10DD 4C 53 F3 ;=============================================================================== ; LoadParticleSequenceData ; ; Global: ; Loads the next particle-sequence data set and clears player hit totals. ; ; Local: ; Indexes four parameter tables, advances the index while in range, and clears both result counters. ; ; Parameters: ; ParticleSequenceIndex. ; ; Returns: ; Sequence parameters loaded and result counters cleared. ; ; PRG offsets: $10E2-$110C ; CPU range: $D0E2-$D10C ;=============================================================================== LoadParticleSequenceData: ldx ParticleSequenceIndex ; CPU:$D0E0 PRG:10E0 AE 58 05 lda ParticleSequenceIndexTable,x ; CPU:$D0E3 PRG:10E3 BD 0D D1 sta ParticleSequenceValue ; CPU:$D0E6 PRG:10E6 8D 59 05 lda ParticleSequenceValueTableA,x ; CPU:$D0E9 PRG:10E9 BD 12 D1 sta $055A ; CPU:$D0EC PRG:10EC 8D 5A 05 lda ParticleSequenceValueTableB,x ; CPU:$D0EF PRG:10EF BD 17 D1 sta SequenceDataLo ; CPU:$D0F2 PRG:10F2 8D 5B 05 lda ParticleSequenceValueTableC,x ; CPU:$D0F5 PRG:10F5 BD 1C D1 sta SequenceDataHi ; CPU:$D0F8 PRG:10F8 8D 5C 05 cpx #$04 ; CPU:$D0FB PRG:10FB E0 04 bcs LoadParticleSequenceData_Block ; CPU:$D0FD PRG:10FD B0 03 inc ParticleSequenceIndex ; CPU:$D0FF PRG:10FF EE 58 05 LoadParticleSequenceData_Block: lda #$00 ; CPU:$D102 PRG:1102 A9 00 sta PlayerParticleHitCount ; CPU:$D104 PRG:1104 8D CD 05 sta PlayerParticleHitCount2 ; CPU:$D107 PRG:1107 8D CE 05 rts ; CPU:$D10A PRG:110A 60 ; Sequence parameter tables ParticleSequenceIndexTable: .byte $03, $05, $07, $07, $07 ; CPU:$D10B PRG:110B 03 05 07 07 07 ParticleSequenceValueTableA: .byte $80, $90, $98, $A0, $A8 ; CPU:$D110 PRG:1110 80 90 98 A0 A8 ParticleSequenceValueTableB: .byte $01, $01, $02, $02, $03 ; CPU:$D115 PRG:1115 01 01 02 02 03 ParticleSequenceValueTableC: .byte $00, $05, $00, $05, $00 ; CPU:$D11A PRG:111A 00 05 00 05 00 ; Sum player particle-hit totals SumParticleHitCounts: lda $05CD ; CPU:$D11F PRG:111F AD CD 05 clc ; CPU:$D122 PRG:1122 18 adc $05CE ; CPU:$D123 PRG:1123 6D CE 05 cmp #$14 ; CPU:$D126 PRG:1126 C9 14 rts ; CPU:$D128 PRG:1128 60 ; Embedded PPU templates, strings, and position tables ($D12B-$D19F) ParticleResultsData: .byte $3F, $00, $10, $0F, $30, $30, $30, $0F ; CPU:$D129 PRG:1129 3F 00 10 0F 30 30 30 0F .byte $30, $27, $15, $0F, $30, $02, $21, $0F ; CPU:$D131 PRG:1131 30 27 15 0F 30 02 21 0F .byte $16, $16, $16 ; CPU:$D139 PRG:1139 16 16 16 ParticleResultsPpuTemplate: .byte $21, $73, $0B, $29, $00 ; CPU:$D13C PRG:113C 21 73 0B 29 00 .byte $00, $00, $00, $00, $24, $19, $1D, $1C ; CPU:$D141 PRG:1141 00 00 00 00 24 19 1D 1C .byte $26, $21, $F3, $0B, $29, $00, $00, $00 ; CPU:$D149 PRG:1149 26 21 F3 0B 29 00 00 00 .byte $00, $00, $24, $19, $1D, $1C, $26, $23 ; CPU:$D151 PRG:1151 00 00 24 19 1D 1C 26 23 .byte $E8, $08, $FF, $FF, $FF, $FF, $FF, $FF ; CPU:$D159 PRG:1159 E8 08 FF FF FF FF FF FF .byte $FF, $FF, $23, $C0, $08, $40, $50, $50 ; CPU:$D161 PRG:1161 FF FF 23 C0 08 40 50 50 .byte $50, $50, $90, $A0, $A0, $22, $88, $11 ; CPU:$D169 PRG:1169 50 50 90 A0 A0 22 88 11 .byte $19, $24, $0E, $24, $1B, $24, $0F, $24 ; CPU:$D171 PRG:1171 19 24 0E 24 1B 24 0F 24 .byte $0E, $24, $0C, $24, $1D, $24, $2C, $2C ; CPU:$D179 PRG:1179 0E 24 0C 24 1D 24 2C 2C .byte $2C ; CPU:$D181 PRG:1181 2C PlayerStartYTable: .byte $22, $C6, $17, $1C, $1E, $19, $0E ; CPU:$D182 PRG:1182 22 C6 17 1C 1E 19 0E .byte $1B, $24, $0B, $18, $17, $1E, $1C, $24 ; CPU:$D189 PRG:1189 1B 24 0B 18 17 1E 1C 24 .byte $24, $24, $01, $00, $00, $00, $00, $19 ; CPU:$D191 PRG:1191 24 24 01 00 00 00 00 19 .byte $1D, $1C, $2C ; CPU:$D199 PRG:1199 1D 1C 2C PlayerStartXTable: .byte $50, $70 ; CPU:$D19C PRG:119C 50 70 DrawParticleBonusResults: ldx #$1C ; CPU:$D19E PRG:119E A2 1C DrawParticleBonusResults_Block: lda ParticleResultsPpuTemplate,x ; CPU:$D1A0 PRG:11A0 BD 3E D1 sta $57,x ; CPU:$D1A3 PRG:11A3 95 57 dex ; CPU:$D1A5 PRG:11A5 CA bpl DrawParticleBonusResults_Block ; CPU:$D1A6 PRG:11A6 10 F8 ldx #$04 ; CPU:$D1A8 PRG:11A8 A2 04 ldy $05CD ; CPU:$D1AA PRG:11AA AC CD 05 jsr AddParticleResultDigits ; CPU:$D1AD PRG:11AD 20 DC D1 ldx #$12 ; CPU:$D1B0 PRG:11B0 A2 12 ldy $05CE ; CPU:$D1B2 PRG:11B2 AC CE 05 jsr AddParticleResultDigits ; CPU:$D1B5 PRG:11B5 20 DC D1 jsr $C12D ; CPU:$D1B8 PRG:11B8 20 2D C1 lda $40 ; CPU:$D1BB PRG:11BB A5 40 bne DrawParticleBonusResults_Block_1 ; CPU:$D1BD PRG:11BD D0 01 rts ; CPU:$D1BF PRG:11BF 60 DrawParticleBonusResults_Block_1: lda #$65 ; CPU:$D1C0 PRG:11C0 A9 65 ldy #$00 ; CPU:$D1C2 PRG:11C2 A0 00 jmp $C131 ; CPU:$D1C4 PRG:11C4 4C 31 C1 ConvertValueToDecimalDigits: ldy #$00 ; CPU:$D1C7 PRG:11C7 A0 00 ConvertValueToDecimalDigits_Block: cmp #$0A ; CPU:$D1C9 PRG:11C9 C9 0A bcc ConvertValueToDecimalDigits_Block_1 ; CPU:$D1CB PRG:11CB 90 06 iny ; CPU:$D1CD PRG:11CD C8 sbc #$0A ; CPU:$D1CE PRG:11CE E9 0A jmp ConvertValueToDecimalDigits_Block ; CPU:$D1D0 PRG:11D0 4C CB D1 ConvertValueToDecimalDigits_Block_1: sty $5A ; CPU:$D1D3 PRG:11D3 84 5A sta $5B ; CPU:$D1D5 PRG:11D5 85 5B jmp $C119 ; CPU:$D1D7 PRG:11D7 4C 19 C1 AddParticleResultDigits: dey ; CPU:$D1DA PRG:11DA 88 bmi AddParticleResultDigits_Block_2 ; CPU:$D1DB PRG:11DB 30 1F lda $0559 ; CPU:$D1DD PRG:11DD AD 59 05 clc ; CPU:$D1E0 PRG:11E0 18 adc $59,x ; CPU:$D1E1 PRG:11E1 75 59 cmp #$0A ; CPU:$D1E3 PRG:11E3 C9 0A bcc AddParticleResultDigits_Block ; CPU:$D1E5 PRG:11E5 90 04 sbc #$0A ; CPU:$D1E7 PRG:11E7 E9 0A inc $58,x ; CPU:$D1E9 PRG:11E9 F6 58 AddParticleResultDigits_Block: sta $59,x ; CPU:$D1EB PRG:11EB 95 59 lda $58,x ; CPU:$D1ED PRG:11ED B5 58 cmp #$0A ; CPU:$D1EF PRG:11EF C9 0A bcc AddParticleResultDigits_Block_1 ; CPU:$D1F1 PRG:11F1 90 06 sbc #$0A ; CPU:$D1F3 PRG:11F3 E9 0A inc $57,x ; CPU:$D1F5 PRG:11F5 F6 57 sta $58,x ; CPU:$D1F7 PRG:11F7 95 58 AddParticleResultDigits_Block_1: jmp AddParticleResultDigits ; CPU:$D1F9 PRG:11F9 4C DC D1 AddParticleResultDigits_Block_2: ldy #$00 ; CPU:$D1FC PRG:11FC A0 00 AddParticleResultDigits_Block_3: lda $57,x ; CPU:$D1FE PRG:11FE B5 57 beq AddParticleResultDigits_Block_4 ; CPU:$D200 PRG:1200 F0 04 cmp #$24 ; CPU:$D202 PRG:1202 C9 24 bne AddParticleResultDigits_Block_5 ; CPU:$D204 PRG:1204 D0 0A AddParticleResultDigits_Block_4: lda #$24 ; CPU:$D206 PRG:1206 A9 24 sta $57,x ; CPU:$D208 PRG:1208 95 57 inx ; CPU:$D20A PRG:120A E8 iny ; CPU:$D20B PRG:120B C8 cpy #$04 ; CPU:$D20C PRG:120C C0 04 bne AddParticleResultDigits_Block_3 ; CPU:$D20E PRG:120E D0 EE AddParticleResultDigits_Block_5: rts ; CPU:$D210 PRG:1210 60 DecrementDecimalDigits: lda $59,x ; CPU:$D211 PRG:1211 B5 59 cmp #$24 ; CPU:$D213 PRG:1213 C9 24 beq DecrementDecimalDigits_Block_2 ; CPU:$D215 PRG:1215 F0 2A tay ; CPU:$D217 PRG:1217 A8 bne DecrementDecimalDigits_Block_1 ; CPU:$D218 PRG:1218 D0 1C lda $58,x ; CPU:$D21A PRG:121A B5 58 cmp #$24 ; CPU:$D21C PRG:121C C9 24 beq DecrementDecimalDigits_Block_2 ; CPU:$D21E PRG:121E F0 21 lda $58,x ; CPU:$D220 PRG:1220 B5 58 bne DecrementDecimalDigits_Block ; CPU:$D222 PRG:1222 D0 0C lda $57,x ; CPU:$D224 PRG:1224 B5 57 cmp #$24 ; CPU:$D226 PRG:1226 C9 24 beq DecrementDecimalDigits_Block_2 ; CPU:$D228 PRG:1228 F0 17 lda #$0A ; CPU:$D22A PRG:122A A9 0A sta $58,x ; CPU:$D22C PRG:122C 95 58 dec $57,x ; CPU:$D22E PRG:122E D6 57 DecrementDecimalDigits_Block: lda #$0A ; CPU:$D230 PRG:1230 A9 0A sta $59,x ; CPU:$D232 PRG:1232 95 59 dec $58,x ; CPU:$D234 PRG:1234 D6 58 DecrementDecimalDigits_Block_1: dec $59,x ; CPU:$D236 PRG:1236 D6 59 txa ; CPU:$D238 PRG:1238 8A pha ; CPU:$D239 PRG:1239 48 lda #$0A ; CPU:$D23A PRG:123A A9 0A jsr $D6DE ; CPU:$D23C PRG:123C 20 DE D6 pla ; CPU:$D23F PRG:123F 68 tax ; CPU:$D240 PRG:1240 AA DecrementDecimalDigits_Block_2: jmp AddParticleResultDigits_Block_2 ; CPU:$D241 PRG:1241 4C FE D1 ClearPpuAndOamBuffers: jsr $C10A ; CPU:$D244 PRG:1244 20 0A C1 jsr $C0FA ; CPU:$D247 PRG:1247 20 FA C0 lda #$20 ; CPU:$D24A PRG:124A A9 20 sta $2006 ; CPU:$D24C PRG:124C 8D 06 20 lda #$00 ; CPU:$D24F PRG:124F A9 00 sta $2006 ; CPU:$D251 PRG:1251 8D 06 20 jsr ClearNametable ; CPU:$D254 PRG:1254 20 75 D2 jsr ClearNametable ; CPU:$D257 PRG:1257 20 75 D2 jsr $C104 ; CPU:$D25A PRG:125A 20 04 C1 jsr $C115 ; CPU:$D25D PRG:125D 20 15 C1 ldx #$3F ; CPU:$D260 PRG:1260 A2 3F ldy #$00 ; CPU:$D262 PRG:1262 A0 00 sty $4C ; CPU:$D264 PRG:1264 84 4C ClearPpuAndOamBuffers_Block: lda #$F0 ; CPU:$D266 PRG:1266 A9 F0 sta $0200,y ; CPU:$D268 PRG:1268 99 00 02 iny ; CPU:$D26B PRG:126B C8 iny ; CPU:$D26C PRG:126C C8 iny ; CPU:$D26D PRG:126D C8 iny ; CPU:$D26E PRG:126E C8 dex ; CPU:$D26F PRG:126F CA bpl ClearPpuAndOamBuffers_Block ; CPU:$D270 PRG:1270 10 F4 rts ; CPU:$D272 PRG:1272 60 ClearNametable: ldx #$F0 ; CPU:$D273 PRG:1273 A2 F0 lda #$24 ; CPU:$D275 PRG:1275 A9 24 ClearNametable_Block: sta $2007 ; CPU:$D277 PRG:1277 8D 07 20 sta $2007 ; CPU:$D27A PRG:127A 8D 07 20 sta $2007 ; CPU:$D27D PRG:127D 8D 07 20 sta $2007 ; CPU:$D280 PRG:1280 8D 07 20 dex ; CPU:$D283 PRG:1283 CA bne ClearNametable_Block ; CPU:$D284 PRG:1284 D0 F1 ldx #$40 ; CPU:$D286 PRG:1286 A2 40 lda #$00 ; CPU:$D288 PRG:1288 A9 00 ClearNametable_Block_1: sta $2007 ; CPU:$D28A PRG:128A 8D 07 20 dex ; CPU:$D28D PRG:128D CA bne ClearNametable_Block_1 ; CPU:$D28E PRG:128E D0 FA rts ; CPU:$D290 PRG:1290 60 LoadStageObjectData: jsr $C10A ; CPU:$D291 PRG:1291 20 0A C1 jsr $C0FA ; CPU:$D294 PRG:1294 20 FA C0 lda $16 ; CPU:$D297 PRG:1297 A5 16 beq LoadStageObjectData_Block ; CPU:$D299 PRG:1299 F0 03 jmp $D572 ; CPU:$D29B PRG:129B 4C 72 D5 LoadStageObjectData_Block: ldy $3B ; CPU:$D29E PRG:129E A4 3B lda StageStreamPointerLoTable,y ; CPU:$D2A0 PRG:12A0 B9 2A DB sta $1D ; CPU:$D2A3 PRG:12A3 85 1D lda StageStreamPointerHiTable,y ; CPU:$D2A5 PRG:12A5 B9 3A DB sta $1E ; CPU:$D2A8 PRG:12A8 85 1E jsr $D497 ; CPU:$D2AA PRG:12AA 20 97 D4 ldx #$00 ; CPU:$D2AD PRG:12AD A2 00 LoadStageObjectData_Block_1: jsr $D4E5 ; CPU:$D2AF PRG:12AF 20 E5 D4 cmp #$FF ; CPU:$D2B2 PRG:12B2 C9 FF beq LoadStageObjectData_Block_4 ; CPU:$D2B4 PRG:12B4 F0 6A sta $54 ; CPU:$D2B6 PRG:12B6 85 54 jsr $D4E5 ; CPU:$D2B8 PRG:12B8 20 E5 D4 sta $55 ; CPU:$D2BB PRG:12BB 85 55 ldy #$03 ; CPU:$D2BD PRG:12BD A0 03 LoadStageObjectData_Block_2: jsr $D4FB ; CPU:$D2BF PRG:12BF 20 FB D4 lda #$04 ; CPU:$D2C2 PRG:12C2 A9 04 sta $12 ; CPU:$D2C4 PRG:12C4 85 12 lda $D493,y ; CPU:$D2C6 PRG:12C6 B9 93 D4 LoadStageObjectData_Block_3: sta $2007 ; CPU:$D2C9 PRG:12C9 8D 07 20 clc ; CPU:$D2CC PRG:12CC 18 adc #$04 ; CPU:$D2CD PRG:12CD 69 04 dec $12 ; CPU:$D2CF PRG:12CF C6 12 bne LoadStageObjectData_Block_3 ; CPU:$D2D1 PRG:12D1 D0 F6 inc $55 ; CPU:$D2D3 PRG:12D3 E6 55 dey ; CPU:$D2D5 PRG:12D5 88 bpl LoadStageObjectData_Block_2 ; CPU:$D2D6 PRG:12D6 10 E7 lda $55 ; CPU:$D2D8 PRG:12D8 A5 55 sec ; CPU:$D2DA PRG:12DA 38 sbc #$04 ; CPU:$D2DB PRG:12DB E9 04 sta $55 ; CPU:$D2DD PRG:12DD 85 55 jsr $D51C ; CPU:$D2DF PRG:12DF 20 1C D5 sta $A6,x ; CPU:$D2E2 PRG:12E2 95 A6 inc $54 ; CPU:$D2E4 PRG:12E4 E6 54 inc $54 ; CPU:$D2E6 PRG:12E6 E6 54 jsr $D51C ; CPU:$D2E8 PRG:12E8 20 1C D5 sta $A9,x ; CPU:$D2EB PRG:12EB 95 A9 inc $55 ; CPU:$D2ED PRG:12ED E6 55 inc $55 ; CPU:$D2EF PRG:12EF E6 55 jsr $D51C ; CPU:$D2F1 PRG:12F1 20 1C D5 sta $AF,x ; CPU:$D2F4 PRG:12F4 95 AF dec $54 ; CPU:$D2F6 PRG:12F6 C6 54 dec $54 ; CPU:$D2F8 PRG:12F8 C6 54 jsr $D51C ; CPU:$D2FA PRG:12FA 20 1C D5 sta $AC,x ; CPU:$D2FD PRG:12FD 95 AC stx $A4 ; CPU:$D2FF PRG:12FF 86 A4 lda #$03 ; CPU:$D301 PRG:1301 A9 03 jsr $C856 ; CPU:$D303 PRG:1303 20 56 C8 jsr $C17C ; CPU:$D306 PRG:1306 20 7C C1 ldx $A4 ; CPU:$D309 PRG:1309 A6 A4 lda $54 ; CPU:$D30B PRG:130B A5 54 asl a ; CPU:$D30D PRG:130D 0A asl a ; CPU:$D30E PRG:130E 0A asl a ; CPU:$D30F PRG:130F 0A clc ; CPU:$D310 PRG:1310 18 adc #$10 ; CPU:$D311 PRG:1311 69 10 sta $B2,x ; CPU:$D313 PRG:1313 95 B2 lda $55 ; CPU:$D315 PRG:1315 A5 55 asl a ; CPU:$D317 PRG:1317 0A asl a ; CPU:$D318 PRG:1318 0A asl a ; CPU:$D319 PRG:1319 0A sta $B5,x ; CPU:$D31A PRG:131A 95 B5 inx ; CPU:$D31C PRG:131C E8 jmp LoadStageObjectData_Block_1 ; CPU:$D31D PRG:131D 4C B1 D2 LoadStageObjectData_Block_4: dex ; CPU:$D320 PRG:1320 CA stx $A3 ; CPU:$D321 PRG:1321 86 A3 ldx #$00 ; CPU:$D323 PRG:1323 A2 00 LoadStageObjectData_Block_5: jsr $D4E5 ; CPU:$D325 PRG:1325 20 E5 D4 cmp #$FF ; CPU:$D328 PRG:1328 C9 FF beq LoadStageObjectData_Block_6 ; CPU:$D32A PRG:132A F0 50 sta $54 ; CPU:$D32C PRG:132C 85 54 jsr $D4E5 ; CPU:$D32E PRG:132E 20 E5 D4 sta $55 ; CPU:$D331 PRG:1331 85 55 jsr $D4E5 ; CPU:$D333 PRG:1333 20 E5 D4 sta $05FA,x ; CPU:$D336 PRG:1336 9D FA 05 lda $54 ; CPU:$D339 PRG:1339 A5 54 asl a ; CPU:$D33B PRG:133B 0A asl a ; CPU:$D33C PRG:133C 0A asl a ; CPU:$D33D PRG:133D 0A adc #$0C ; CPU:$D33E PRG:133E 69 0C sta $05D2,x ; CPU:$D340 PRG:1340 9D D2 05 lda $55 ; CPU:$D343 PRG:1343 A5 55 asl a ; CPU:$D345 PRG:1345 0A asl a ; CPU:$D346 PRG:1346 0A asl a ; CPU:$D347 PRG:1347 0A adc #$0C ; CPU:$D348 PRG:1348 69 0C sta $05DC,x ; CPU:$D34A PRG:134A 9D DC 05 lda #$00 ; CPU:$D34D PRG:134D A9 00 sta $0604,x ; CPU:$D34F PRG:134F 9D 04 06 jsr $D4FB ; CPU:$D352 PRG:1352 20 FB D4 sta $05E6,x ; CPU:$D355 PRG:1355 9D E6 05 lda $13 ; CPU:$D358 PRG:1358 A5 13 sta $05F0,x ; CPU:$D35A PRG:135A 9D F0 05 jsr $D56C ; CPU:$D35D PRG:135D 20 6C D5 jsr $D53C ; CPU:$D360 PRG:1360 20 3C D5 inc $54 ; CPU:$D363 PRG:1363 E6 54 inc $54 ; CPU:$D365 PRG:1365 E6 54 jsr $D53C ; CPU:$D367 PRG:1367 20 3C D5 inc $55 ; CPU:$D36A PRG:136A E6 55 inc $55 ; CPU:$D36C PRG:136C E6 55 jsr $D53C ; CPU:$D36E PRG:136E 20 3C D5 dec $54 ; CPU:$D371 PRG:1371 C6 54 dec $54 ; CPU:$D373 PRG:1373 C6 54 jsr $D53C ; CPU:$D375 PRG:1375 20 3C D5 inx ; CPU:$D378 PRG:1378 E8 jmp LoadStageObjectData_Block_5 ; CPU:$D379 PRG:1379 4C 27 D3 LoadStageObjectData_Block_6: dex ; CPU:$D37C PRG:137C CA stx $05D1 ; CPU:$D37D PRG:137D 8E D1 05 jsr $D4E5 ; CPU:$D380 PRG:1380 20 E5 D4 sta $1F ; CPU:$D383 PRG:1383 85 1F jsr $D4E5 ; CPU:$D385 PRG:1385 20 E5 D4 sta $20 ; CPU:$D388 PRG:1388 85 20 ldy #$00 ; CPU:$D38A PRG:138A A0 00 lda ($1F),y ; CPU:$D38C PRG:138C B1 1F tax ; CPU:$D38E PRG:138E AA dex ; CPU:$D38F PRG:138F CA bpl LoadStageObjectData_Block_7 ; CPU:$D390 PRG:1390 10 05 inc $C8 ; CPU:$D392 PRG:1392 E6 C8 jmp LoadStageObjectData_Block_9 ; CPU:$D394 PRG:1394 4C BA D3 LoadStageObjectData_Block_7: iny ; CPU:$D397 PRG:1397 C8 LoadStageObjectData_Block_8: lda ($1F),y ; CPU:$D398 PRG:1398 B1 1F iny ; CPU:$D39A PRG:139A C8 sta $93,x ; CPU:$D39B PRG:139B 95 93 lda ($1F),y ; CPU:$D39D PRG:139D B1 1F iny ; CPU:$D39F PRG:139F C8 sta $9C,x ; CPU:$D3A0 PRG:13A0 95 9C lda ($1F),y ; CPU:$D3A2 PRG:13A2 B1 1F iny ; CPU:$D3A4 PRG:13A4 C8 sta $0453,x ; CPU:$D3A5 PRG:13A5 9D 53 04 lda #$02 ; CPU:$D3A8 PRG:13A8 A9 02 sta $81,x ; CPU:$D3AA PRG:13AA 95 81 lda #$01 ; CPU:$D3AC PRG:13AC A9 01 sta $8A,x ; CPU:$D3AE PRG:13AE 95 8A lda $C6 ; CPU:$D3B0 PRG:13B0 A5 C6 sta $0441,x ; CPU:$D3B2 PRG:13B2 9D 41 04 dex ; CPU:$D3B5 PRG:13B5 CA bpl LoadStageObjectData_Block_8 ; CPU:$D3B6 PRG:13B6 10 E0 LoadStageObjectData_Block_9: jsr $D4E5 ; CPU:$D3B8 PRG:13B8 20 E5 D4 sta $CD ; CPU:$D3BB PRG:13BB 85 CD jsr $D4E5 ; CPU:$D3BD PRG:13BD 20 E5 D4 sta $23 ; CPU:$D3C0 PRG:13C0 85 23 jsr $D4E5 ; CPU:$D3C2 PRG:13C2 20 E5 D4 tay ; CPU:$D3C5 PRG:13C5 A8 sta $24 ; CPU:$D3C6 PRG:13C6 85 24 lda $23 ; CPU:$D3C8 PRG:13C8 A5 23 jsr $D48C ; CPU:$D3CA PRG:13CA 20 8C D4 sta $25 ; CPU:$D3CD PRG:13CD 85 25 sty $26 ; CPU:$D3CF PRG:13CF 84 26 jsr $D48C ; CPU:$D3D1 PRG:13D1 20 8C D4 sta $27 ; CPU:$D3D4 PRG:13D4 85 27 sty $28 ; CPU:$D3D6 PRG:13D6 84 28 jsr $D48C ; CPU:$D3D8 PRG:13D8 20 8C D4 sta $29 ; CPU:$D3DB PRG:13DB 85 29 sty $2A ; CPU:$D3DD PRG:13DD 84 2A jsr $D5D9 ; CPU:$D3DF PRG:13DF 20 D9 D5 jsr BuildStagePpuCommands ; CPU:$D3E2 PRG:13E2 20 ED D3 jsr $C104 ; CPU:$D3E5 PRG:13E5 20 04 C1 jmp $C115 ; CPU:$D3E8 PRG:13E8 4C 15 C1 BuildStagePpuCommands: ldx #$22 ; CPU:$D3EB PRG:13EB A2 22 BuildStagePpuCommands_Block: lda StagePaletteAndTileData,x ; CPU:$D3ED PRG:13ED BD 37 D4 sta $57,x ; CPU:$D3F0 PRG:13F0 95 57 dex ; CPU:$D3F2 PRG:13F2 CA bpl BuildStagePpuCommands_Block ; CPU:$D3F3 PRG:13F3 10 F8 lda $C8 ; CPU:$D3F5 PRG:13F5 A5 C8 bne BuildStagePpuCommands_Block_3 ; CPU:$D3F7 PRG:13F7 D0 15 lda $3B ; CPU:$D3F9 PRG:13F9 A5 3B and #$0C ; CPU:$D3FB PRG:13FB 29 0C ora #$03 ; CPU:$D3FD PRG:13FD 09 03 tay ; CPU:$D3FF PRG:13FF A8 ldx #$03 ; CPU:$D400 PRG:1400 A2 03 BuildStagePpuCommands_Block_1: lda $D45A,y ; CPU:$D402 PRG:1402 B9 5A D4 sta $5A,x ; CPU:$D405 PRG:1405 95 5A dey ; CPU:$D407 PRG:1407 88 dex ; CPU:$D408 PRG:1408 CA bpl BuildStagePpuCommands_Block_1 ; CPU:$D409 PRG:1409 10 F7 BuildStagePpuCommands_Block_2: jmp $C12D ; CPU:$D40B PRG:140B 4C 2D C1 BuildStagePpuCommands_Block_3: ldx $0558 ; CPU:$D40E PRG:140E AE 58 05 lda $D46A,x ; CPU:$D411 PRG:1411 BD 6A D4 sta $1D ; CPU:$D414 PRG:1414 85 1D lda $D46F,x ; CPU:$D416 PRG:1416 BD 6F D4 sta $1E ; CPU:$D419 PRG:1419 85 1E ldx #$03 ; CPU:$D41B PRG:141B A2 03 ldy #$07 ; CPU:$D41D PRG:141D A0 07 BuildStagePpuCommands_Block_4: lda ($1D),y ; CPU:$D41F PRG:141F B1 1D sta $72,x ; CPU:$D421 PRG:1421 95 72 dey ; CPU:$D423 PRG:1423 88 dex ; CPU:$D424 PRG:1424 CA bpl BuildStagePpuCommands_Block_4 ; CPU:$D425 PRG:1425 10 F8 lda $16 ; CPU:$D427 PRG:1427 A5 16 bne BuildStagePpuCommands_Block_2 ; CPU:$D429 PRG:1429 D0 E0 BuildStagePpuCommands_Block_5: lda ($1D),y ; CPU:$D42B PRG:142B B1 1D sta a:$005A,y ; CPU:$D42D PRG:142D 99 5A 00 dey ; CPU:$D430 PRG:1430 88 bpl BuildStagePpuCommands_Block_5 ; CPU:$D431 PRG:1431 10 F8 bmi BuildStagePpuCommands_Block_2 ; CPU:$D433 PRG:1433 30 D6 StagePaletteAndTileData: .byte $3F, $00, $20, $0F, $2A, $09, $07, $0F ; CPU:$D435 PRG:1435 3F 00 20 0F 2A 09 07 0F .byte $30, $27, $15, $0F, $30, $02, $21, $0F ; CPU:$D43D PRG:143D 30 27 15 0F 30 02 21 0F .byte $30, $00, $10, $0F, $16, $12, $37, $0F ; CPU:$D445 PRG:1445 30 00 10 0F 16 12 37 0F .byte $12, $16, $37, $0F, $17, $11, $35, $0F ; CPU:$D44D PRG:144D 12 16 37 0F 17 11 35 0F .byte $17, $11, $2B, $0F, $2A, $09, $07, $0F ; CPU:$D455 PRG:1455 17 11 2B 0F 2A 09 07 0F .byte $26, $06, $07, $0F, $1B, $0C, $07, $0F ; CPU:$D45D PRG:145D 26 06 07 0F 1B 0C 07 0F .byte $2C, $01, $06, $74, $7C, $84, $84, $84 ; CPU:$D465 PRG:1465 2C 01 06 74 7C 84 84 84 .byte $D4, $D4, $D4, $D4, $D4, $0F, $02, $08 ; CPU:$D46D PRG:146D D4 D4 D4 D4 D4 0F 02 08 .byte $06, $0F, $2B, $30, $12, $0F, $07, $0A ; CPU:$D475 PRG:1475 06 0F 2B 30 12 0F 07 0A .byte $19, $0F, $26, $30, $2B, $0F, $07, $0C ; CPU:$D47D PRG:147D 19 0F 26 30 2B 0F 07 0C .byte $1C, $0F, $15, $30, $26 ; CPU:$D485 PRG:1485 1C 0F 15 30 26 AddOffsetToStreamPointer: sec ; CPU:$D48A PRG:148A 38 adc $CD ; CPU:$D48B PRG:148B 65 CD bcc AddOffsetToStreamPointer_Block ; CPU:$D48D PRG:148D 90 01 iny ; CPU:$D48F PRG:148F C8 AddOffsetToStreamPointer_Block: rts ; CPU:$D490 PRG:1490 60 StreamPointerAdjustmentTable: .byte $7F, $7E, $7D, $7C ; CPU:$D491 PRG:1491 7F 7E 7D 7C DecodePpuCommandStream: jsr ReadStageStreamByte ; CPU:$D495 PRG:1495 20 E5 D4 sta $1F ; CPU:$D498 PRG:1498 85 1F jsr ReadStageStreamByte ; CPU:$D49A PRG:149A 20 E5 D4 sta $20 ; CPU:$D49D PRG:149D 85 20 tax ; CPU:$D49F PRG:149F AA beq DecodePpuCommandStream_Block_4 ; CPU:$D4A0 PRG:14A0 F0 40 DecodePpuCommandStream_Block: jsr ReadPpuStreamByte ; CPU:$D4A2 PRG:14A2 20 F0 D4 tax ; CPU:$D4A5 PRG:14A5 AA beq DecodePpuCommandStream ; CPU:$D4A6 PRG:14A6 F0 ED and #$7F ; CPU:$D4A8 PRG:14A8 29 7F sta $2006 ; CPU:$D4AA PRG:14AA 8D 06 20 jsr ReadPpuStreamByte ; CPU:$D4AD PRG:14AD 20 F0 D4 sta $2006 ; CPU:$D4B0 PRG:14B0 8D 06 20 jsr ReadPpuStreamByte ; CPU:$D4B3 PRG:14B3 20 F0 D4 sta $12 ; CPU:$D4B6 PRG:14B6 85 12 txa ; CPU:$D4B8 PRG:14B8 8A and #$80 ; CPU:$D4B9 PRG:14B9 29 80 lsr a ; CPU:$D4BB PRG:14BB 4A lsr a ; CPU:$D4BC PRG:14BC 4A lsr a ; CPU:$D4BD PRG:14BD 4A lsr a ; CPU:$D4BE PRG:14BE 4A lsr a ; CPU:$D4BF PRG:14BF 4A ora $00 ; CPU:$D4C0 PRG:14C0 05 00 sta $2000 ; CPU:$D4C2 PRG:14C2 8D 00 20 txa ; CPU:$D4C5 PRG:14C5 8A and #$40 ; CPU:$D4C6 PRG:14C6 29 40 bne DecodePpuCommandStream_Block_2 ; CPU:$D4C8 PRG:14C8 D0 0C DecodePpuCommandStream_Block_1: jsr ReadPpuStreamByte ; CPU:$D4CA PRG:14CA 20 F0 D4 sta $2007 ; CPU:$D4CD PRG:14CD 8D 07 20 dec $12 ; CPU:$D4D0 PRG:14D0 C6 12 bne DecodePpuCommandStream_Block_1 ; CPU:$D4D2 PRG:14D2 D0 F6 beq DecodePpuCommandStream_Block ; CPU:$D4D4 PRG:14D4 F0 CC DecodePpuCommandStream_Block_2: jsr ReadPpuStreamByte ; CPU:$D4D6 PRG:14D6 20 F0 D4 DecodePpuCommandStream_Block_3: sta $2007 ; CPU:$D4D9 PRG:14D9 8D 07 20 dec $12 ; CPU:$D4DC PRG:14DC C6 12 bne DecodePpuCommandStream_Block_3 ; CPU:$D4DE PRG:14DE D0 F9 beq DecodePpuCommandStream_Block ; CPU:$D4E0 PRG:14E0 F0 C0 DecodePpuCommandStream_Block_4: rts ; CPU:$D4E2 PRG:14E2 60 ReadStageStreamByte: ldy #$00 ; CPU:$D4E3 PRG:14E3 A0 00 lda ($1D),y ; CPU:$D4E5 PRG:14E5 B1 1D inc $1D ; CPU:$D4E7 PRG:14E7 E6 1D bne ReadStageStreamByte_Block ; CPU:$D4E9 PRG:14E9 D0 02 inc $1E ; CPU:$D4EB PRG:14EB E6 1E ReadStageStreamByte_Block: rts ; CPU:$D4ED PRG:14ED 60 ReadPpuStreamByte: ldy #$00 ; CPU:$D4EE PRG:14EE A0 00 lda ($1F),y ; CPU:$D4F0 PRG:14F0 B1 1F inc $1F ; CPU:$D4F2 PRG:14F2 E6 1F bne ReadPpuStreamByte_Block ; CPU:$D4F4 PRG:14F4 D0 02 inc $20 ; CPU:$D4F6 PRG:14F6 E6 20 ReadPpuStreamByte_Block: rts ; CPU:$D4F8 PRG:14F8 60 ReadPpuStreamByte_Block_1: lda $55 ; CPU:$D4F9 PRG:14F9 A5 55 sta $12 ; CPU:$D4FB PRG:14FB 85 12 lda #$00 ; CPU:$D4FD PRG:14FD A9 00 asl $12 ; CPU:$D4FF PRG:14FF 06 12 asl $12 ; CPU:$D501 PRG:1501 06 12 asl $12 ; CPU:$D503 PRG:1503 06 12 asl $12 ; CPU:$D505 PRG:1505 06 12 rol a ; CPU:$D507 PRG:1507 2A asl $12 ; CPU:$D508 PRG:1508 06 12 rol a ; CPU:$D50A PRG:150A 2A ora #$20 ; CPU:$D50B PRG:150B 09 20 sta $2006 ; CPU:$D50D PRG:150D 8D 06 20 sta $13 ; CPU:$D510 PRG:1510 85 13 lda $12 ; CPU:$D512 PRG:1512 A5 12 ora $54 ; CPU:$D514 PRG:1514 05 54 sta $2006 ; CPU:$D516 PRG:1516 8D 06 20 rts ; CPU:$D519 PRG:1519 60 SetTileAddressFromCoordinates: lda $55 ; CPU:$D51A PRG:151A A5 55 and #$FC ; CPU:$D51C PRG:151C 29 FC asl a ; CPU:$D51E PRG:151E 0A sta $12 ; CPU:$D51F PRG:151F 85 12 lda $54 ; CPU:$D521 PRG:1521 A5 54 lsr a ; CPU:$D523 PRG:1523 4A lsr a ; CPU:$D524 PRG:1524 4A ora $12 ; CPU:$D525 PRG:1525 05 12 ora #$C0 ; CPU:$D527 PRG:1527 09 C0 pha ; CPU:$D529 PRG:1529 48 lda $55 ; CPU:$D52A PRG:152A A5 55 and #$02 ; CPU:$D52C PRG:152C 29 02 sta $12 ; CPU:$D52E PRG:152E 85 12 lda $54 ; CPU:$D530 PRG:1530 A5 54 and #$02 ; CPU:$D532 PRG:1532 29 02 lsr a ; CPU:$D534 PRG:1534 4A ora $12 ; CPU:$D535 PRG:1535 05 12 tay ; CPU:$D537 PRG:1537 A8 pla ; CPU:$D538 PRG:1538 68 rts ; CPU:$D539 PRG:1539 60 ReadModifyAttributeByte: lda #$23 ; CPU:$D53A PRG:153A A9 23 sta $2006 ; CPU:$D53C PRG:153C 8D 06 20 jsr SetTileAddressFromCoordinates ; CPU:$D53F PRG:153F 20 1C D5 sta $2006 ; CPU:$D542 PRG:1542 8D 06 20 lda $2007 ; CPU:$D545 PRG:1545 AD 07 20 lda $2007 ; CPU:$D548 PRG:1548 AD 07 20 and AttributeClearMaskTable,y ; CPU:$D54B PRG:154B 39 64 D5 ora AttributeSetMaskTable,y ; CPU:$D54E PRG:154E 19 68 D5 pha ; CPU:$D551 PRG:1551 48 lda #$23 ; CPU:$D552 PRG:1552 A9 23 sta $2006 ; CPU:$D554 PRG:1554 8D 06 20 jsr SetTileAddressFromCoordinates ; CPU:$D557 PRG:1557 20 1C D5 sta $2006 ; CPU:$D55A PRG:155A 8D 06 20 pla ; CPU:$D55D PRG:155D 68 sta $2007 ; CPU:$D55E PRG:155E 8D 07 20 rts ; CPU:$D561 PRG:1561 60 AttributeClearMaskTable: .byte $FC, $F3, $CF, $3F ; CPU:$D562 PRG:1562 FC F3 CF 3F AttributeSetMaskTable: .byte $01, $04, $10, $40 ; CPU:$D566 PRG:1566 01 04 10 40 InitializeNametablePatterns: jsr $CCCB ; CPU:$D56A PRG:156A 20 CB CC jmp $C17C ; CPU:$D56D PRG:156D 4C 7C C1 InitializeNametablePatterns_Block: lda #$C0 ; CPU:$D570 PRG:1570 A9 C0 ldy #$23 ; CPU:$D572 PRG:1572 A0 23 jsr WriteNametableHeaderPattern ; CPU:$D574 PRG:1574 20 93 D5 lda #$C0 ; CPU:$D577 PRG:1577 A9 C0 ldy #$27 ; CPU:$D579 PRG:1579 A0 27 jsr WriteNametableHeaderPattern ; CPU:$D57B PRG:157B 20 93 D5 ldy #$23 ; CPU:$D57E PRG:157E A0 23 lda #$60 ; CPU:$D580 PRG:1580 A9 60 jsr WriteNametableAttributePattern ; CPU:$D582 PRG:1582 20 B8 D5 ldy #$27 ; CPU:$D585 PRG:1585 A0 27 lda #$60 ; CPU:$D587 PRG:1587 A9 60 jsr WriteNametableAttributePattern ; CPU:$D589 PRG:1589 20 B8 D5 inc $C8 ; CPU:$D58C PRG:158C E6 C8 jmp $D3E1 ; CPU:$D58E PRG:158E 4C E1 D3 WriteNametableHeaderPattern: sty $2006 ; CPU:$D591 PRG:1591 8C 06 20 sta $2006 ; CPU:$D594 PRG:1594 8D 06 20 ldx #$00 ; CPU:$D597 PRG:1597 A2 00 WriteNametableHeaderPattern_Block: lda $DCAE,x ; CPU:$D599 PRG:1599 BD AE DC sta $2007 ; CPU:$D59C PRG:159C 8D 07 20 inx ; CPU:$D59F PRG:159F E8 cpx #$08 ; CPU:$D5A0 PRG:15A0 E0 08 bne WriteNametableHeaderPattern_Block ; CPU:$D5A2 PRG:15A2 D0 F5 lda #$00 ; CPU:$D5A4 PRG:15A4 A9 00 ldx #$28 ; CPU:$D5A6 PRG:15A6 A2 28 jsr FillPpuBytes ; CPU:$D5A8 PRG:15A8 20 B1 D5 lda #$AA ; CPU:$D5AB PRG:15AB A9 AA ldx #$10 ; CPU:$D5AD PRG:15AD A2 10 FillPpuBytes: sta $2007 ; CPU:$D5AF PRG:15AF 8D 07 20 dex ; CPU:$D5B2 PRG:15B2 CA bne FillPpuBytes ; CPU:$D5B3 PRG:15B3 D0 FA rts ; CPU:$D5B5 PRG:15B5 60 WriteNametableAttributePattern: sty $2006 ; CPU:$D5B6 PRG:15B6 8C 06 20 sta $2006 ; CPU:$D5B9 PRG:15B9 8D 06 20 ldx #$20 ; CPU:$D5BC PRG:15BC A2 20 lda #$58 ; CPU:$D5BE PRG:15BE A9 58 jsr WriteAttributeQuadrants ; CPU:$D5C0 PRG:15C0 20 C9 D5 ldx #$40 ; CPU:$D5C3 PRG:15C3 A2 40 lda #$5C ; CPU:$D5C5 PRG:15C5 A9 5C WriteAttributeQuadrants: sta $12 ; CPU:$D5C7 PRG:15C7 85 12 WriteAttributeQuadrants_Block: txa ; CPU:$D5C9 PRG:15C9 8A and #$03 ; CPU:$D5CA PRG:15CA 29 03 eor #$03 ; CPU:$D5CC PRG:15CC 49 03 ora $12 ; CPU:$D5CE PRG:15CE 05 12 sta $2007 ; CPU:$D5D0 PRG:15D0 8D 07 20 dex ; CPU:$D5D3 PRG:15D3 CA bne WriteAttributeQuadrants_Block ; CPU:$D5D4 PRG:15D4 D0 F3 rts ; CPU:$D5D6 PRG:15D6 60 ScanNametableTiles: ldx #$00 ; CPU:$D5D7 PRG:15D7 A2 00 ScanNametableTiles_Block: jsr GetNametableAddressForIndex ; CPU:$D5D9 PRG:15D9 20 51 D6 jsr ClassifyNametableTile ; CPU:$D5DC PRG:15DC 20 F1 D5 lda $51 ; CPU:$D5DF PRG:15DF A5 51 ora #$04 ; CPU:$D5E1 PRG:15E1 09 04 sta $51 ; CPU:$D5E3 PRG:15E3 85 51 jsr ClassifyNametableTile ; CPU:$D5E5 PRG:15E5 20 F1 D5 inx ; CPU:$D5E8 PRG:15E8 E8 inx ; CPU:$D5E9 PRG:15E9 E8 cpx #$80 ; CPU:$D5EA PRG:15EA E0 80 bne ScanNametableTiles_Block ; CPU:$D5EC PRG:15EC D0 EB rts ; CPU:$D5EE PRG:15EE 60 ClassifyNametableTile: lda $51 ; CPU:$D5EF PRG:15EF A5 51 sta $2006 ; CPU:$D5F1 PRG:15F1 8D 06 20 lda $50 ; CPU:$D5F4 PRG:15F4 A5 50 sta $2006 ; CPU:$D5F6 PRG:15F6 8D 06 20 lda $2007 ; CPU:$D5F9 PRG:15F9 AD 07 20 lda $2007 ; CPU:$D5FC PRG:15FC AD 07 20 cmp #$24 ; CPU:$D5FF PRG:15FF C9 24 bne ClassifyNametableTile_Block ; CPU:$D601 PRG:1601 D0 07 txa ; CPU:$D603 PRG:1603 8A and #$03 ; CPU:$D604 PRG:1604 29 03 tay ; CPU:$D606 PRG:1606 A8 jmp ClassifyNametableTile_Load ; CPU:$D607 PRG:1607 4C 3B D6 ClassifyNametableTile_Block: rts ; CPU:$D60A PRG:160A 60 ClassifyNametableTile_Block_1: lda $4C ; CPU:$D60B PRG:160B A5 4C beq ClassifyNametableTile_Block_3 ; CPU:$D60D PRG:160D F0 29 dec $4C ; CPU:$D60F PRG:160F C6 4C lda $4F ; CPU:$D611 PRG:1611 A5 4F clc ; CPU:$D613 PRG:1613 18 adc #$02 ; CPU:$D614 PRG:1614 69 02 and #$3F ; CPU:$D616 PRG:1616 29 3F sta $4F ; CPU:$D618 PRG:1618 85 4F tax ; CPU:$D61A PRG:161A AA jsr GetNametableAddressForIndex ; CPU:$D61B PRG:161B 20 51 D6 lda $51 ; CPU:$D61E PRG:161E A5 51 sta $2006 ; CPU:$D620 PRG:1620 8D 06 20 lda $50 ; CPU:$D623 PRG:1623 A5 50 sta $2006 ; CPU:$D625 PRG:1625 8D 06 20 lda $2007 ; CPU:$D628 PRG:1628 AD 07 20 lda $2007 ; CPU:$D62B PRG:162B AD 07 20 ldy #$03 ; CPU:$D62E PRG:162E A0 03 ClassifyNametableTile_Block_2: cmp NametableTileClassTable,y ; CPU:$D630 PRG:1630 D9 4C D6 beq ClassifyNametableTile_Load ; CPU:$D633 PRG:1633 F0 04 dey ; CPU:$D635 PRG:1635 88 bpl ClassifyNametableTile_Block_2 ; CPU:$D636 PRG:1636 10 F8 ClassifyNametableTile_Block_3: rts ; CPU:$D638 PRG:1638 60 ClassifyNametableTile_Load: lda $51 ; CPU:$D639 PRG:1639 A5 51 sta $2006 ; CPU:$D63B PRG:163B 8D 06 20 lda $50 ; CPU:$D63E PRG:163E A5 50 sta $2006 ; CPU:$D640 PRG:1640 8D 06 20 lda $D64D,y ; CPU:$D643 PRG:1643 B9 4D D6 sta $2007 ; CPU:$D646 PRG:1646 8D 07 20 rts ; CPU:$D649 PRG:1649 60 NametableTileClassTable: .byte $24, $ED, $EE, $EF, $24 ; CPU:$D64A PRG:164A 24 ED EE EF 24 GetNametableAddressForIndex: lda NametableAddressPairTable,x ; CPU:$D64F PRG:164F BD 5C D6 sta $50 ; CPU:$D652 PRG:1652 85 50 lda NametableAddressPairTable+1,x ; CPU:$D654 PRG:1654 BD 5D D6 sta $51 ; CPU:$D657 PRG:1657 85 51 rts ; CPU:$D659 PRG:1659 60 NametableAddressPairTable: .byte $63, $21, $A5, $21, $CB, $20, $B7, $20 ; CPU:$D65A PRG:165A 63 21 A5 21 CB 20 B7 20 .byte $7D, $21, $9B, $22, $F2, $20, $49, $22 ; CPU:$D662 PRG:1662 7D 21 9B 22 F2 20 49 22 .byte $6D, $21, $0B, $22, $92, $22, $95, $21 ; CPU:$D66A PRG:166A 6D 21 0B 22 92 22 95 21 .byte $1C, $21, $48, $21, $E0, $20, $0B, $23 ; CPU:$D672 PRG:1672 1C 21 48 21 E0 20 0B 23 .byte $CE, $20, $D0, $21, $06, $21, $19, $21 ; CPU:$D67A PRG:167A CE 20 D0 21 06 21 19 21 .byte $30, $22, $8A, $22, $88, $22, $A4, $20 ; CPU:$D682 PRG:1682 30 22 8A 22 88 22 A4 20 .byte $42, $22, $68, $21, $3C, $22, $36, $21 ; CPU:$D68A PRG:168A 42 22 68 21 3C 22 36 21 .byte $CA, $21, $BC, $20, $96, $21, $4C, $21 ; CPU:$D692 PRG:1692 CA 21 BC 20 96 21 4C 21 .byte $35, $22, $EF, $20, $68, $22, $A6, $20 ; CPU:$D69A PRG:169A 35 22 EF 20 68 22 A6 20 .byte $BB, $21, $7A, $21, $EA, $20, $F1, $21 ; CPU:$D6A2 PRG:16A2 BB 21 7A 21 EA 20 F1 21 .byte $C2, $20, $77, $21, $54, $21, $BA, $20 ; CPU:$D6AA PRG:16AA C2 20 77 21 54 21 BA 20 .byte $C5, $22, $BE, $20, $FA, $20, $AE, $21 ; CPU:$D6B2 PRG:16B2 C5 22 BE 20 FA 20 AE 21 .byte $46, $21, $9A, $21, $D2, $20, $3D, $21 ; CPU:$D6BA PRG:16BA 46 21 9A 21 D2 20 3D 21 .byte $2B, $22, $B0, $20, $B6, $21, $AC, $20 ; CPU:$D6C2 PRG:16C2 2B 22 B0 20 B6 21 AC 20 .byte $B3, $20, $DB, $20, $F6, $20, $2C, $21 ; CPU:$D6CA PRG:16CA B3 20 DB 20 F6 20 2C 21 .byte $E7, $20, $62, $21, $E4, $21, $4E, $21 ; CPU:$D6D2 PRG:16D2 E7 20 62 21 E4 21 4E 21 UpdateBonusScoreTotals: lda #$00 ; CPU:$D6DA PRG:16DA A9 00 AccumulatePlayerBonusScore: sta $43 ; CPU:$D6DC PRG:16DC 85 43 lda $3A ; CPU:$D6DE PRG:16DE A5 3A beq AccumulatePlayerBonusScore_Block_1 ; CPU:$D6E0 PRG:16E0 F0 01 AccumulatePlayerBonusScore_Block: rts ; CPU:$D6E2 PRG:16E2 60 AccumulatePlayerBonusScore_Block_1: ldx $3E ; CPU:$D6E3 PRG:16E3 A6 3E cpx #$02 ; CPU:$D6E5 PRG:16E5 E0 02 bcs AccumulatePlayerBonusScore_Block ; CPU:$D6E7 PRG:16E7 B0 F9 lda $41,x ; CPU:$D6E9 PRG:16E9 B5 41 bmi AccumulatePlayerBonusScore_Block ; CPU:$D6EB PRG:16EB 30 F5 ldy #$64 ; CPU:$D6ED PRG:16ED A0 64 jsr DivideBonusValue ; CPU:$D6EF PRG:16EF 20 7C D7 clc ; CPU:$D6F2 PRG:16F2 18 adc $48 ; CPU:$D6F3 PRG:16F3 65 48 sta $45 ; CPU:$D6F5 PRG:16F5 85 45 ldy #$0A ; CPU:$D6F7 PRG:16F7 A0 0A jsr DivideBonusValue ; CPU:$D6F9 PRG:16F9 20 7C D7 sta $44 ; CPU:$D6FC PRG:16FC 85 44 ldx $3F ; CPU:$D6FE PRG:16FE A6 3F lda BonusScoreWeightTable,x ; CPU:$D700 PRG:1700 BD 79 D7 sta $21 ; CPU:$D703 PRG:1703 85 21 lda #$06 ; CPU:$D705 PRG:1705 A9 06 sta $22 ; CPU:$D707 PRG:1707 85 22 lda $3E ; CPU:$D709 PRG:1709 A5 3E asl a ; CPU:$D70B PRG:170B 0A asl a ; CPU:$D70C PRG:170C 0A ora $3E ; CPU:$D70D PRG:170D 05 3E tax ; CPU:$D70F PRG:170F AA clc ; CPU:$D710 PRG:1710 18 lda $03,x ; CPU:$D711 PRG:1711 B5 03 adc $43 ; CPU:$D713 PRG:1713 65 43 jsr ClampDecimalDigit ; CPU:$D715 PRG:1715 20 8F D7 sta $03,x ; CPU:$D718 PRG:1718 95 03 lda $04,x ; CPU:$D71A PRG:171A B5 04 adc $44 ; CPU:$D71C PRG:171C 65 44 jsr ClampDecimalDigit ; CPU:$D71E PRG:171E 20 8F D7 sta $04,x ; CPU:$D721 PRG:1721 95 04 lda $05,x ; CPU:$D723 PRG:1723 B5 05 adc $45 ; CPU:$D725 PRG:1725 65 45 jsr ClampDecimalDigit ; CPU:$D727 PRG:1727 20 8F D7 sta $05,x ; CPU:$D72A PRG:172A 95 05 lda $06,x ; CPU:$D72C PRG:172C B5 06 adc $47 ; CPU:$D72E PRG:172E 65 47 jsr ClampDecimalDigit ; CPU:$D730 PRG:1730 20 8F D7 sta $06,x ; CPU:$D733 PRG:1733 95 06 lda $07,x ; CPU:$D735 PRG:1735 B5 07 adc #$00 ; CPU:$D737 PRG:1737 69 00 jsr ClampDecimalDigit ; CPU:$D739 PRG:1739 20 8F D7 sta $07,x ; CPU:$D73C PRG:173C 95 07 inx ; CPU:$D73E PRG:173E E8 inx ; CPU:$D73F PRG:173F E8 inx ; CPU:$D740 PRG:1740 E8 inx ; CPU:$D741 PRG:1741 E8 ldy #$04 ; CPU:$D742 PRG:1742 A0 04 AccumulatePlayerBonusScore_Block_2: lda $03,x ; CPU:$D744 PRG:1744 B5 03 cmp ($21),y ; CPU:$D746 PRG:1746 D1 21 bcc AccumulatePlayerBonusScore_Block_5 ; CPU:$D748 PRG:1748 90 19 bne AccumulatePlayerBonusScore_Block_3 ; CPU:$D74A PRG:174A D0 04 dex ; CPU:$D74C PRG:174C CA dey ; CPU:$D74D PRG:174D 88 bpl AccumulatePlayerBonusScore_Block_2 ; CPU:$D74E PRG:174E 10 F4 AccumulatePlayerBonusScore_Block_3: ldy #$00 ; CPU:$D750 PRG:1750 A0 00 lda $3E ; CPU:$D752 PRG:1752 A5 3E asl a ; CPU:$D754 PRG:1754 0A asl a ; CPU:$D755 PRG:1755 0A ora $3E ; CPU:$D756 PRG:1756 05 3E tax ; CPU:$D758 PRG:1758 AA AccumulatePlayerBonusScore_Block_4: lda $03,x ; CPU:$D759 PRG:1759 B5 03 sta ($21),y ; CPU:$D75B PRG:175B 91 21 inx ; CPU:$D75D PRG:175D E8 iny ; CPU:$D75E PRG:175E C8 cpy #$05 ; CPU:$D75F PRG:175F C0 05 bne AccumulatePlayerBonusScore_Block_4 ; CPU:$D761 PRG:1761 D0 F6 AccumulatePlayerBonusScore_Block_5: ldy #$04 ; CPU:$D763 PRG:1763 A0 04 AccumulatePlayerBonusScore_Block_6: lda ($21),y ; CPU:$D765 PRG:1765 B1 21 sta a:$000D,y ; CPU:$D767 PRG:1767 99 0D 00 dey ; CPU:$D76A PRG:176A 88 bpl AccumulatePlayerBonusScore_Block_6 ; CPU:$D76B PRG:176B 10 F8 inc $46 ; CPU:$D76D PRG:176D E6 46 lda $16 ; CPU:$D76F PRG:176F A5 16 beq AccumulatePlayerBonusScore_Block_7 ; CPU:$D771 PRG:1771 F0 03 jsr $C539 ; CPU:$D773 PRG:1773 20 39 C5 AccumulatePlayerBonusScore_Block_7: rts ; CPU:$D776 PRG:1776 60 BonusScoreWeightTable: .byte $29, $2E, $33 ; CPU:$D777 PRG:1777 29 2E 33 DivideBonusValue: sty $12 ; CPU:$D77A PRG:177A 84 12 ldx #$FF ; CPU:$D77C PRG:177C A2 FF lda $43 ; CPU:$D77E PRG:177E A5 43 DivideBonusValue_Block: sec ; CPU:$D780 PRG:1780 38 sbc $12 ; CPU:$D781 PRG:1781 E5 12 inx ; CPU:$D783 PRG:1783 E8 bcs DivideBonusValue_Block ; CPU:$D784 PRG:1784 B0 FA clc ; CPU:$D786 PRG:1786 18 adc $12 ; CPU:$D787 PRG:1787 65 12 sta $43 ; CPU:$D789 PRG:1789 85 43 txa ; CPU:$D78B PRG:178B 8A rts ; CPU:$D78C PRG:178C 60 ClampDecimalDigit: cmp #$0A ; CPU:$D78D PRG:178D C9 0A bcs ClampDecimalDigit_Block ; CPU:$D78F PRG:178F B0 01 rts ; CPU:$D791 PRG:1791 60 ClampDecimalDigit_Block: sec ; CPU:$D792 PRG:1792 38 sbc #$0A ; CPU:$D793 PRG:1793 E9 0A rts ; CPU:$D795 PRG:1795 60 DrawBonusResultScreen: ldy $46 ; CPU:$D796 PRG:1796 A4 46 dey ; CPU:$D798 PRG:1798 88 beq DrawBonusResultScreen_Block ; CPU:$D799 PRG:1799 F0 03 bpl DrawBonusResultScreen_Block_5 ; CPU:$D79B PRG:179B 10 66 rts ; CPU:$D79D PRG:179D 60 DrawBonusResultScreen_Block: lda #$20 ; CPU:$D79E PRG:179E A9 20 sta $2006 ; CPU:$D7A0 PRG:17A0 8D 06 20 lda #$43 ; CPU:$D7A3 PRG:17A3 A9 43 sta $2006 ; CPU:$D7A5 PRG:17A5 8D 06 20 lda #$8E ; CPU:$D7A8 PRG:17A8 A9 8E sta $2007 ; CPU:$D7AA PRG:17AA 8D 07 20 ldx #$04 ; CPU:$D7AD PRG:17AD A2 04 DrawBonusResultScreen_Block_1: lda $03,x ; CPU:$D7AF PRG:17AF B5 03 sta $2007 ; CPU:$D7B1 PRG:17B1 8D 07 20 dex ; CPU:$D7B4 PRG:17B4 CA bpl DrawBonusResultScreen_Block_1 ; CPU:$D7B5 PRG:17B5 10 F8 lda #$00 ; CPU:$D7B7 PRG:17B7 A9 00 sta $2007 ; CPU:$D7B9 PRG:17B9 8D 07 20 lda #$24 ; CPU:$D7BC PRG:17BC A9 24 sta $2007 ; CPU:$D7BE PRG:17BE 8D 07 20 sta $2007 ; CPU:$D7C1 PRG:17C1 8D 07 20 ldx #$8C ; CPU:$D7C4 PRG:17C4 A2 8C stx $2007 ; CPU:$D7C6 PRG:17C6 8E 07 20 inx ; CPU:$D7C9 PRG:17C9 E8 stx $2007 ; CPU:$D7CA PRG:17CA 8E 07 20 ldx #$04 ; CPU:$D7CD PRG:17CD A2 04 DrawBonusResultScreen_Block_2: lda $0D,x ; CPU:$D7CF PRG:17CF B5 0D sta $2007 ; CPU:$D7D1 PRG:17D1 8D 07 20 dex ; CPU:$D7D4 PRG:17D4 CA bpl DrawBonusResultScreen_Block_2 ; CPU:$D7D5 PRG:17D5 10 F8 lda #$00 ; CPU:$D7D7 PRG:17D7 A9 00 sta $2007 ; CPU:$D7D9 PRG:17D9 8D 07 20 lda #$24 ; CPU:$D7DC PRG:17DC A9 24 sta $2007 ; CPU:$D7DE PRG:17DE 8D 07 20 sta $2007 ; CPU:$D7E1 PRG:17E1 8D 07 20 lda $16 ; CPU:$D7E4 PRG:17E4 A5 16 bne DrawBonusValueDigits ; CPU:$D7E6 PRG:17E6 D0 6A lda $40 ; CPU:$D7E8 PRG:17E8 A5 40 beq DrawBonusResultScreen_Block_4 ; CPU:$D7EA PRG:17EA F0 14 lda #$8F ; CPU:$D7EC PRG:17EC A9 8F sta $2007 ; CPU:$D7EE PRG:17EE 8D 07 20 ldx #$04 ; CPU:$D7F1 PRG:17F1 A2 04 DrawBonusResultScreen_Block_3: lda $08,x ; CPU:$D7F3 PRG:17F3 B5 08 sta $2007 ; CPU:$D7F5 PRG:17F5 8D 07 20 dex ; CPU:$D7F8 PRG:17F8 CA bpl DrawBonusResultScreen_Block_3 ; CPU:$D7F9 PRG:17F9 10 F8 lda #$00 ; CPU:$D7FB PRG:17FB A9 00 sta $2007 ; CPU:$D7FD PRG:17FD 8D 07 20 DrawBonusResultScreen_Block_4: dec $46 ; CPU:$D800 PRG:1800 C6 46 rts ; CPU:$D802 PRG:1802 60 DrawBonusResultScreen_Block_5: dec $46 ; CPU:$D803 PRG:1803 C6 46 lda #$20 ; CPU:$D805 PRG:1805 A9 20 sta $2006 ; CPU:$D807 PRG:1807 8D 06 20 lda #$62 ; CPU:$D80A PRG:180A A9 62 sta $2006 ; CPU:$D80C PRG:180C 8D 06 20 lda $41 ; CPU:$D80F PRG:180F A5 41 jsr DrawBonusMeter ; CPU:$D811 PRG:1811 20 26 D8 lda $40 ; CPU:$D814 PRG:1814 A5 40 beq DrawBonusMeter_Block_3 ; CPU:$D816 PRG:1816 F0 20 lda #$20 ; CPU:$D818 PRG:1818 A9 20 sta $2006 ; CPU:$D81A PRG:181A 8D 06 20 lda #$75 ; CPU:$D81D PRG:181D A9 75 sta $2006 ; CPU:$D81F PRG:181F 8D 06 20 lda $42 ; CPU:$D822 PRG:1822 A5 42 DrawBonusMeter: bmi DrawBonusMeter_Block_4 ; CPU:$D824 PRG:1824 30 13 DrawBonusMeter_Block: sta $50 ; CPU:$D826 PRG:1826 85 50 ldx #$06 ; CPU:$D828 PRG:1828 A2 06 DrawBonusMeter_Block_1: lda #$24 ; CPU:$D82A PRG:182A A9 24 cpx $50 ; CPU:$D82C PRG:182C E4 50 bcs DrawBonusMeter_Block_2 ; CPU:$D82E PRG:182E B0 02 lda #$2A ; CPU:$D830 PRG:1830 A9 2A DrawBonusMeter_Block_2: sta $2007 ; CPU:$D832 PRG:1832 8D 07 20 dex ; CPU:$D835 PRG:1835 CA bpl DrawBonusMeter_Block_1 ; CPU:$D836 PRG:1836 10 F2 DrawBonusMeter_Block_3: rts ; CPU:$D838 PRG:1838 60 DrawBonusMeter_Block_4: lda $40 ; CPU:$D839 PRG:1839 A5 40 beq DrawBonusMeter_Block ; CPU:$D83B PRG:183B F0 E9 ldx #$08 ; CPU:$D83D PRG:183D A2 08 DrawBonusMeter_Block_5: lda BonusLabelTiles,x ; CPU:$D83F PRG:183F BD 4B D8 sta $2007 ; CPU:$D842 PRG:1842 8D 07 20 dex ; CPU:$D845 PRG:1845 CA bpl DrawBonusMeter_Block_5 ; CPU:$D846 PRG:1846 10 F7 rts ; CPU:$D848 PRG:1848 60 BonusLabelTiles: .byte $1B, $0E, $1F, $18, $24, $0E, $16, $0A ; CPU:$D849 PRG:1849 1B 0E 1F 18 24 0E 16 0A .byte $10 ; CPU:$D851 PRG:1851 10 DrawBonusValueDigits: ldy #$04 ; CPU:$D852 PRG:1852 A0 04 DrawBonusValueDigits_Block: lda BonusDigitOffsetTable,y ; CPU:$D854 PRG:1854 B9 6C D8 sta $2007 ; CPU:$D857 PRG:1857 8D 07 20 dey ; CPU:$D85A PRG:185A 88 bpl DrawBonusValueDigits_Block ; CPU:$D85B PRG:185B 10 F7 lda $4A ; CPU:$D85D PRG:185D A5 4A sta $2007 ; CPU:$D85F PRG:185F 8D 07 20 lda $49 ; CPU:$D862 PRG:1862 A5 49 sta $2007 ; CPU:$D864 PRG:1864 8D 07 20 dec $46 ; CPU:$D867 PRG:1867 C6 46 rts ; CPU:$D869 PRG:1869 60 BonusDigitOffsetTable: .byte $FB, $FA, $F9, $F8, $F7 ; CPU:$D86A PRG:186A FB FA F9 F8 F7 CreateBonusResultSprites: sta $12 ; CPU:$D86F PRG:186F 85 12 stx $13 ; CPU:$D871 PRG:1871 86 13 sty $14 ; CPU:$D873 PRG:1873 84 14 ldx #$01 ; CPU:$D875 PRG:1875 A2 01 CreateBonusResultSprites_Block: lda $061A,x ; CPU:$D877 PRG:1877 BD 1A 06 bmi CreateBonusResultSprites_Block_1 ; CPU:$D87A PRG:187A 30 0E dex ; CPU:$D87C PRG:187C CA bpl CreateBonusResultSprites_Block ; CPU:$D87D PRG:187D 10 F8 ldx #$01 ; CPU:$D87F PRG:187F A2 01 lda $0619 ; CPU:$D881 PRG:1881 AD 19 06 cmp $0618 ; CPU:$D884 PRG:1884 CD 18 06 bcc CreateBonusResultSprites_Block_1 ; CPU:$D887 PRG:1887 90 01 dex ; CPU:$D889 PRG:1889 CA CreateBonusResultSprites_Block_1: lda #$64 ; CPU:$D88A PRG:188A A9 64 sta $0618,x ; CPU:$D88C PRG:188C 9D 18 06 lda $12 ; CPU:$D88F PRG:188F A5 12 sta $061A,x ; CPU:$D891 PRG:1891 9D 1A 06 tay ; CPU:$D894 PRG:1894 A8 txa ; CPU:$D895 PRG:1895 8A asl a ; CPU:$D896 PRG:1896 0A asl a ; CPU:$D897 PRG:1897 0A asl a ; CPU:$D898 PRG:1898 0A tax ; CPU:$D899 PRG:1899 AA lda BonusSpriteTileTableA,y ; CPU:$D89A PRG:189A B9 D1 D8 sta $02F1,x ; CPU:$D89D PRG:189D 9D F1 02 lda BonusSpriteTileTableB,y ; CPU:$D8A0 PRG:18A0 B9 D7 D8 sta $02F5,x ; CPU:$D8A3 PRG:18A3 9D F5 02 ldy $13 ; CPU:$D8A6 PRG:18A6 A4 13 lda a:$009A,y ; CPU:$D8A8 PRG:18A8 B9 9A 00 sec ; CPU:$D8AB PRG:18AB 38 sbc #$08 ; CPU:$D8AC PRG:18AC E9 08 sta $02F0,x ; CPU:$D8AE PRG:18AE 9D F0 02 sta $02F4,x ; CPU:$D8B1 PRG:18B1 9D F4 02 lda a:$0091,y ; CPU:$D8B4 PRG:18B4 B9 91 00 sta $02F3,x ; CPU:$D8B7 PRG:18B7 9D F3 02 clc ; CPU:$D8BA PRG:18BA 18 adc #$08 ; CPU:$D8BB PRG:18BB 69 08 sta $02F7,x ; CPU:$D8BD PRG:18BD 9D F7 02 lda $3E ; CPU:$D8C0 PRG:18C0 A5 3E sta $02F2,x ; CPU:$D8C2 PRG:18C2 9D F2 02 sta $02F6,x ; CPU:$D8C5 PRG:18C5 9D F6 02 ldy $14 ; CPU:$D8C8 PRG:18C8 A4 14 ldx $13 ; CPU:$D8CA PRG:18CA A6 13 lda $12 ; CPU:$D8CC PRG:18CC A5 12 rts ; CPU:$D8CE PRG:18CE 60 BonusSpriteTileTableA: .byte $F4, $F5, $F6, $F7, $F8, $F9 ; CPU:$D8CF PRG:18CF F4 F5 F6 F7 F8 F9 BonusSpriteTileTableB: .byte $FB, $FB, $FA, $FB, $FB, $FB ; CPU:$D8D5 PRG:18D5 FB FB FA FB FB FB UpdateBonusResultSprites: ldx #$01 ; CPU:$D8DB PRG:18DB A2 01 UpdateBonusResultSprites_Block: lda $061A,x ; CPU:$D8DD PRG:18DD BD 1A 06 bmi UpdateBonusResultSprites_Block_1 ; CPU:$D8E0 PRG:18E0 30 17 dec $0618,x ; CPU:$D8E2 PRG:18E2 DE 18 06 bne UpdateBonusResultSprites_Block_1 ; CPU:$D8E5 PRG:18E5 D0 12 lda #$FF ; CPU:$D8E7 PRG:18E7 A9 FF sta $061A,x ; CPU:$D8E9 PRG:18E9 9D 1A 06 txa ; CPU:$D8EC PRG:18EC 8A asl a ; CPU:$D8ED PRG:18ED 0A asl a ; CPU:$D8EE PRG:18EE 0A asl a ; CPU:$D8EF PRG:18EF 0A tay ; CPU:$D8F0 PRG:18F0 A8 lda #$F0 ; CPU:$D8F1 PRG:18F1 A9 F0 sta $02F0,y ; CPU:$D8F3 PRG:18F3 99 F0 02 sta $02F4,y ; CPU:$D8F6 PRG:18F6 99 F4 02 UpdateBonusResultSprites_Block_1: dex ; CPU:$D8F9 PRG:18F9 CA bpl UpdateBonusResultSprites_Block ; CPU:$D8FA PRG:18FA 10 E1 rts ; CPU:$D8FC PRG:18FC 60 ClearBonusResultSprites: ldx #$01 ; CPU:$D8FD PRG:18FD A2 01 ClearBonusResultSprites_Block: lda #$00 ; CPU:$D8FF PRG:18FF A9 00 sta $0618,x ; CPU:$D901 PRG:1901 9D 18 06 lda #$FF ; CPU:$D904 PRG:1904 A9 FF sta $061A,x ; CPU:$D906 PRG:1906 9D 1A 06 dex ; CPU:$D909 PRG:1909 CA bpl ClearBonusResultSprites_Block ; CPU:$D90A PRG:190A 10 F3 rts ; CPU:$D90C PRG:190C 60 ClearBonusResultSprites_Block_1: jsr $D246 ; CPU:$D90D PRG:190D 20 46 D2 jsr $C10A ; CPU:$D910 PRG:1910 20 0A C1 jsr $F465 ; CPU:$D913 PRG:1913 20 65 F4 jsr $C0FA ; CPU:$D916 PRG:1916 20 FA C0 lda #$2C ; CPU:$D919 PRG:1919 A9 2C sta $1D ; CPU:$D91B PRG:191B 85 1D lda #$D9 ; CPU:$D91D PRG:191D A9 D9 sta $1E ; CPU:$D91F PRG:191F 85 1E jsr $D497 ; CPU:$D921 PRG:1921 20 97 D4 jsr $C104 ; CPU:$D924 PRG:1924 20 04 C1 jmp $C115 ; CPU:$D927 PRG:1927 4C 15 C1 ; Title/menu PPU command streams and tile data TitleScreenPpuData: .byte $30, $D9, $00, $00, $3F, $00, $04, $0F ; CPU:$D92A PRG:192A 30 D9 00 00 3F 00 04 0F .byte $30, $27, $2A, $3F, $18, $04, $0F, $16 ; CPU:$D932 PRG:1932 30 27 2A 3F 18 04 0F 16 .byte $30, $21, $20, $7C, $21, $F0, $F1, $24 ; CPU:$D93A PRG:193A 30 21 20 7C 21 F0 F1 24 .byte $24, $24, $24, $E0, $E1, $E1, $E2, $E0 ; CPU:$D942 PRG:1942 24 24 24 E0 E1 E1 E2 E0 .byte $E1, $E1, $E2, $E0, $E2, $24, $E0, $E2 ; CPU:$D94A PRG:194A E1 E1 E2 E0 E2 24 E0 E2 .byte $24, $E0, $E1, $E1, $E2, $E0, $E1, $E1 ; CPU:$D952 PRG:1952 24 E0 E1 E1 E2 E0 E1 E1 .byte $E2, $E0, $EC, $24, $E0, $E2, $20, $A2 ; CPU:$D95A PRG:195A E2 E0 EC 24 E0 E2 20 A2 .byte $1B, $E3, $E3, $E3, $E5, $E3, $E3, $E3 ; CPU:$D962 PRG:1962 1B E3 E3 E3 E5 E3 E3 E3 .byte $E5, $E3, $E5, $24, $E3, $E5, $24, $E3 ; CPU:$D96A PRG:196A E5 E3 E5 24 E3 E5 24 E3 .byte $E3, $E3, $E5, $E3, $E3, $E3, $E5, $E3 ; CPU:$D972 PRG:1972 E3 E3 E5 E3 E3 E3 E5 E3 .byte $E3, $F3, $E3, $E5, $20, $C2, $1B, $E3 ; CPU:$D97A PRG:197A E3 F3 E3 E5 20 C2 1B E3 .byte $E4, $E3, $E7, $E3, $E4, $E3, $E5, $E3 ; CPU:$D982 PRG:1982 E4 E3 E7 E3 E4 E3 E5 E3 .byte $E5, $24, $E3, $E5, $24, $E3, $E4, $E3 ; CPU:$D98A PRG:198A E5 24 E3 E5 24 E3 E4 E3 .byte $E5, $E3, $E4, $E3, $E5, $E3, $E3, $E3 ; CPU:$D992 PRG:1992 E5 E3 E4 E3 E5 E3 E3 E3 .byte $E3, $E5, $20, $E2, $1B, $E3, $E3, $E3 ; CPU:$D99A PRG:199A E3 E5 20 E2 1B E3 E3 E3 .byte $E2, $E3, $E3, $E3, $E5, $E3, $E5, $24 ; CPU:$D9A2 PRG:19A2 E2 E3 E3 E3 E5 E3 E5 24 .byte $E3, $E5, $24, $E3, $E3, $E3, $E5, $E3 ; CPU:$D9AA PRG:19AA E3 E5 24 E3 E3 E3 E5 E3 .byte $E3, $E3, $E5, $E3, $E3, $E3, $E3, $E5 ; CPU:$D9B2 PRG:19B2 E3 E3 E5 E3 E3 E3 E3 E5 .byte $21, $02, $1B, $E3, $E4, $E3, $E5, $E3 ; CPU:$D9BA PRG:19BA 21 02 1B E3 E4 E3 E5 E3 .byte $F2, $E3, $E5, $E3, $E3, $E2, $E3, $E3 ; CPU:$D9C2 PRG:19C2 F2 E3 E5 E3 E3 E2 E3 E3 .byte $E2, $E3, $E3, $E3, $E5, $E3, $E3, $E3 ; CPU:$D9CA PRG:19CA E2 E3 E3 E3 E5 E3 E3 E3 .byte $E5, $E3, $F2, $E3, $E3, $E5, $21, $22 ; CPU:$D9D2 PRG:19D2 E5 E3 F2 E3 E3 E5 21 22 .byte $1B, $E6, $E3, $E3, $E7, $EB, $24, $E6 ; CPU:$D9DA PRG:19DA 1B E6 E3 E3 E7 EB 24 E6 .byte $E7, $E6, $E3, $E7, $E6, $E3, $E7, $E6 ; CPU:$D9E2 PRG:19E2 E7 E6 E3 E7 E6 E3 E7 E6 .byte $E3, $E3, $E7, $E6, $E3, $E3, $E7, $EB ; CPU:$D9EA PRG:19EA E3 E3 E7 E6 E3 E3 E7 EB .byte $24, $E6, $E3, $E7, $21, $4C, $12, $E0 ; CPU:$D9F2 PRG:19F2 24 E6 E3 E7 21 4C 12 E0 .byte $E1, $E1, $E2, $E0, $E2, $E0, $E1, $E1 ; CPU:$D9FA PRG:19FA E1 E1 E2 E0 E2 E0 E1 E1 .byte $E2, $E8, $24, $E0, $E2, $E0, $E1, $E1 ; CPU:$DA02 PRG:1A02 E2 E8 24 E0 E2 E0 E1 E1 .byte $E2, $21, $6C, $12, $E3, $E3, $E3, $E7 ; CPU:$DA0A PRG:1A0A E2 21 6C 12 E3 E3 E3 E7 .byte $E3, $E5, $E3, $F5, $F6, $E7, $E3, $F3 ; CPU:$DA12 PRG:1A12 E3 E5 E3 F5 F6 E7 E3 F3 .byte $E3, $E5, $E6, $E3, $E3, $E7, $21, $8C ; CPU:$DA1A PRG:1A1A E3 E5 E6 E3 E3 E7 21 8C .byte $12, $E3, $E3, $EF, $24, $E3, $E5, $E3 ; CPU:$DA22 PRG:1A22 12 E3 E3 EF 24 E3 E5 E3 .byte $24, $24, $24, $E3, $E3, $E3, $E5, $24 ; CPU:$DA2A PRG:1A2A 24 24 24 E3 E3 E3 E5 24 .byte $E3, $E5, $24, $21, $AC, $12, $E3, $E3 ; CPU:$DA32 PRG:1A32 E3 E5 24 21 AC 12 E3 E3 .byte $E1, $EA, $E3, $E5, $E3, $E9, $E3, $E2 ; CPU:$DA3A PRG:1A3A E1 EA E3 E5 E3 E9 E3 E2 .byte $E3, $E3, $E3, $E5, $24, $E3, $E5, $24 ; CPU:$DA42 PRG:1A42 E3 E3 E3 E5 24 E3 E5 24 .byte $21, $CC, $12, $E3, $E3, $EF, $24, $E3 ; CPU:$DA4A PRG:1A4A 21 CC 12 E3 E3 EF 24 E3 .byte $E5, $E3, $F3, $E3, $E5, $E3, $F2, $E3 ; CPU:$DA52 PRG:1A52 E5 E3 F3 E3 E5 E3 F2 E3 .byte $E5, $24, $E3, $E5, $24, $21, $EC, $12 ; CPU:$DA5A PRG:1A5A E5 24 E3 E5 24 21 EC 12 .byte $E6, $E7, $24, $24, $E6, $E7, $E6, $E7 ; CPU:$DA62 PRG:1A62 E6 E7 24 24 E6 E7 E6 E7 .byte $E6, $E7, $EB, $24, $E6, $E7, $24, $E6 ; CPU:$DA6A PRG:1A6A E6 E7 EB 24 E6 E7 24 E6 .byte $E7, $24, $22, $48, $10, $0A, $24, $24 ; CPU:$DA72 PRG:1A72 E7 24 22 48 10 0A 24 24 .byte $01, $25, $19, $15, $0A, $22, $0E, $1B ; CPU:$DA7A PRG:1A7A 01 25 19 15 0A 22 0E 1B .byte $24, $10, $0A, $16, $0E, $22, $88, $10 ; CPU:$DA82 PRG:1A82 24 10 0A 16 0E 22 88 10 .byte $0B, $24, $24, $02, $25, $19, $15, $0A ; CPU:$DA8A PRG:1A8A 0B 24 24 02 25 19 15 0A .byte $22, $0E, $1B, $24, $10, $0A, $16, $0E ; CPU:$DA92 PRG:1A92 22 0E 1B 24 10 0A 16 0E .byte $22, $C8, $10, $0C, $24, $24, $0B, $0A ; CPU:$DA9A PRG:1A9A 22 C8 10 0C 24 24 0B 0A .byte $15, $15, $18, $18, $17, $24, $24, $1D ; CPU:$DAA2 PRG:1AA2 15 15 18 18 17 24 24 1D .byte $1B, $12, $19, $23, $49, $0E, $F4, $01 ; CPU:$DAAA PRG:1AAA 1B 12 19 23 49 0E F4 01 .byte $09, $08, $04, $24, $17, $12, $17, $1D ; CPU:$DAB2 PRG:1AB2 09 08 04 24 17 12 17 1D .byte $0E, $17, $0D, $18, $00 ; CPU:$DABA PRG:1ABA 0E 17 0D 18 00 RunTitleMenuLoop: jsr $C104 ; CPU:$DABF PRG:1ABF 20 04 C1 jsr $D90F ; CPU:$DAC2 PRG:1AC2 20 0F D9 lda #$00 ; CPU:$DAC5 PRG:1AC5 A9 00 sta $19 ; CPU:$DAC7 PRG:1AC7 85 19 RunTitleMenuLoop_Block: jsr $F465 ; CPU:$DAC9 PRG:1AC9 20 65 F4 lda $19 ; CPU:$DACC PRG:1ACC A5 19 beq RunTitleMenuLoop_Block_3 ; CPU:$DACE PRG:1ACE F0 1F jsr ApplySelectedGameMode ; CPU:$DAD0 PRG:1AD0 20 08 DB jsr $E768 ; CPU:$DAD3 PRG:1AD3 20 68 E7 tax ; CPU:$DAD6 PRG:1AD6 AA and #$10 ; CPU:$DAD7 PRG:1AD7 29 10 bne RunTitleMenuLoop_Block_2 ; CPU:$DAD9 PRG:1AD9 D0 13 txa ; CPU:$DADB PRG:1ADB 8A and #$20 ; CPU:$DADC PRG:1ADC 29 20 beq RunTitleMenuLoop_Block_1 ; CPU:$DADE PRG:1ADE F0 0B lda #$00 ; CPU:$DAE0 PRG:1AE0 A9 00 sta $19 ; CPU:$DAE2 PRG:1AE2 85 19 ldx $3F ; CPU:$DAE4 PRG:1AE4 A6 3F lda GameModePlayerCountTable,x ; CPU:$DAE6 PRG:1AE6 BD 05 DB sta $3F ; CPU:$DAE9 PRG:1AE9 85 3F RunTitleMenuLoop_Block_1: jmp RunTitleMenuLoop_Block ; CPU:$DAEB PRG:1AEB 4C CB DA RunTitleMenuLoop_Block_2: rts ; CPU:$DAEE PRG:1AEE 60 RunTitleMenuLoop_Block_3: inc $3A ; CPU:$DAEF PRG:1AEF E6 3A inc $40 ; CPU:$DAF1 PRG:1AF1 E6 40 lda #$00 ; CPU:$DAF3 PRG:1AF3 A9 00 sta $4015 ; CPU:$DAF5 PRG:1AF5 8D 15 40 sta $16 ; CPU:$DAF8 PRG:1AF8 85 16 jsr $F1F2 ; CPU:$DAFA PRG:1AFA 20 F2 F1 lda #$00 ; CPU:$DAFD PRG:1AFD A9 00 sta $3A ; CPU:$DAFF PRG:1AFF 85 3A beq RunTitleMenuLoop ; CPU:$DB01 PRG:1B01 F0 BC GameModePlayerCountTable: ora ($02,x) ; CPU:$DB03 PRG:1B03 01 02 brk ; CPU:$DB05 PRG:1B05 00 ApplySelectedGameMode: lda $3F ; CPU:$DB06 PRG:1B06 A5 3F lsr a ; CPU:$DB08 PRG:1B08 4A sta $16 ; CPU:$DB09 PRG:1B09 85 16 lda $3F ; CPU:$DB0B PRG:1B0B A5 3F tax ; CPU:$DB0D PRG:1B0D AA and #$01 ; CPU:$DB0E PRG:1B0E 29 01 sta $40 ; CPU:$DB10 PRG:1B10 85 40 lda StageDataPointerTableLo,x ; CPU:$DB12 PRG:1B12 BD 27 DB sta $057B ; CPU:$DB15 PRG:1B15 8D 7B 05 lda #$2C ; CPU:$DB18 PRG:1B18 A9 2C sta $0567 ; CPU:$DB1A PRG:1B1A 8D 67 05 ldx #$00 ; CPU:$DB1D PRG:1B1D A2 00 stx $055D ; CPU:$DB1F PRG:1B1F 8E 5D 05 jmp $CE2F ; CPU:$DB22 PRG:1B22 4C 2F CE ;=============================================================================== ; Stage data tables ; CPU $DB27-$E3A3 / PRG $1B27-$23A3 ; Mode selection, stage stream pointers, PPU command streams, object placement, ; boundary data, and stage setup pointer tables. ;=============================================================================== StageDataPointerTableLo: GameModeInitialStageTable: .byte $8C, $9C, $AC ; CPU:$DB25 PRG:1B25 8C 9C AC StageStreamPointerLoTable: .byte $4A, $59, $F2, $6C, $77, $88, $E1, $6C ; CPU:$DB28 PRG:1B28 4A 59 F2 6C 77 88 E1 6C .byte $99, $03, $CA, $6C, $AD, $17, $E1, $6C ; CPU:$DB30 PRG:1B30 99 03 CA 6C AD 17 E1 6C StageStreamPointerHiTable: .byte $DB, $DB, $DB, $DB, $DB, $DB, $DB, $DB ; CPU:$DB38 PRG:1B38 DB DB DB DB DB DB DB DB .byte $DB, $DC, $DB, $DB, $DB, $DC, $DB, $DB ; CPU:$DB40 PRG:1B40 DB DC DB DB DB DC DB DB StageStream_00: StageStream_00_Target: .byte $2B, $DC, $39, $DD, $00, $00, $10, $06 ; CPU:$DB48 PRG:1B48 2B DC 39 DD 00 00 10 06 .byte $FF, $FF, $96, $DF, $02, $7A, $DE ; CPU:$DB50 PRG:1B50 FF FF 96 DF 02 7A DE StageStream_01: StageStream_01_Target: .byte $2B, $DC, $39, $DD, $4B, $DD, $00, $00 ; CPU:$DB57 PRG:1B57 2B DC 39 DD 4B DD 00 00 .byte $18, $0C, $04, $0E, $FF, $FF, $A0, $DF ; CPU:$DB5F PRG:1B5F 18 0C 04 0E FF FF A0 DF .byte $04, $86, $DE ; CPU:$DB67 PRG:1B67 04 86 DE StageStream_02: StageStream_03_Target: StageStream_07_Target: StageStream_0B_Target: StageStream_0F_Target: .byte $CA, $DC, $00, $00, $FF, $FF, $B0, $DF ; CPU:$DB6A PRG:1B6A CA DC 00 00 FF FF B0 DF .byte $00, $9A, $DE ; CPU:$DB72 PRG:1B72 00 9A DE StageStream_03: StageStream_04_Target: .byte $2B, $DC, $5E, $DD, $00, $00, $08, $06 ; CPU:$DB75 PRG:1B75 2B DC 5E DD 00 00 08 06 .byte $18, $0A, $FF, $FF, $B1, $DF, $06, $9E ; CPU:$DB7D PRG:1B7D 18 0A FF FF B1 DF 06 9E .byte $DE ; CPU:$DB85 PRG:1B85 DE StageStream_05_Target: .byte $2B, $DC, $7D ; CPU:$DB86 PRG:1B86 2B DC 7D StageStream_04: .byte $DD, $00, $00, $04, $06, $12, $08, $FF ; CPU:$DB89 PRG:1B89 DD 00 00 04 06 12 08 FF .byte $FF, $C1, $DF, $07, $BA, $DE ; CPU:$DB91 PRG:1B91 FF C1 DF 07 BA DE StageStream_08_Target: .byte $2B, $DC, $A3, $DD ; CPU:$DB97 PRG:1B97 2B DC A3 DD StageStream_05: .byte $00, $00, $06, $06, $14, $10, $FF, $0F ; CPU:$DB9B PRG:1B9B 00 00 06 06 14 10 FF 0F .byte $0D, $01, $FF, $D4, $DF, $09, $DA, $DE ; CPU:$DBA3 PRG:1BA3 0D 01 FF D4 DF 09 DA DE StageStream_0C_Target: .byte $2B ; CPU:$DBAB PRG:1BAB 2B StageStream_06: .byte $DC, $CE, $DD, $00, $00, $04, $06, $10 ; CPU:$DBAC PRG:1BAC DC CE DD 00 00 04 06 10 .byte $0E, $FF, $08, $0E, $03, $0D, $09, $03 ; CPU:$DBB4 PRG:1BB4 0E FF 08 0E 03 0D 09 03 .byte $12, $08, $03, $17, $0D, $03, $FF, $E7 ; CPU:$DBBC PRG:1BBC 12 08 03 17 0D 03 FF E7 .byte $DF, $03, $02, $DF ; CPU:$DBC4 PRG:1BC4 DF 03 02 DF StageStream_07: StageStream_0A_Target: .byte $2B, $DC, $5E, $DD, $00, $00, $10, $06 ; CPU:$DBC8 PRG:1BC8 2B DC 5E DD 00 00 10 06 .byte $1A, $0C, $FF, $08, $08, $01, $18, $04 ; CPU:$DBD0 PRG:1BD0 1A 0C FF 08 08 01 18 04 .byte $01, $FF, $B1, $DF, $06 ; CPU:$DBD8 PRG:1BD8 01 FF B1 DF 06 StageStream_08: .byte $9E, $DE ; CPU:$DBDD PRG:1BDD 9E DE StageStream_06_Target: StageStream_0E_Target: .byte $2B, $DC, $DB, $DD, $00, $00, $0E, $06 ; CPU:$DBDF PRG:1BDF 2B DC DB DD 00 00 0E 06 .byte $0C, $14, $FF, $FF, $F7 ; CPU:$DBE7 PRG:1BE7 0C 14 FF FF F7 StageStream_09: .byte $DF, $06, $12, $DF ; CPU:$DBEC PRG:1BEC DF 06 12 DF StageStream_02_Target: .byte $2B, $DC, $01, $DE, $00, $00, $04, $08 ; CPU:$DBF0 PRG:1BF0 2B DC 01 DE 00 00 04 08 .byte $16, $10, $FF, $FF, $07, $E0, $09 ; CPU:$DBF8 PRG:1BF8 16 10 FF FF 07 E0 09 StageStream_0A: .byte $2E, $DF ; CPU:$DBFF PRG:1BFF 2E DF StageStream_09_Target: .byte $2B, $DC, $32, $DE, $00, $00, $04, $10 ; CPU:$DC01 PRG:1C01 2B DC 32 DE 00 00 04 10 .byte $18, $10, $FF, $0E, $06, $01, $FF, $17 ; CPU:$DC09 PRG:1C09 18 10 FF 0E 06 01 FF 17 .byte $E0, $07, $56, $DF ; CPU:$DC11 PRG:1C11 E0 07 56 DF StageStream_0B: StageStream_0D_Target: .byte $2B, $DC, $5B, $DE, $00, $00, $04, $08 ; CPU:$DC15 PRG:1C15 2B DC 5B DE 00 00 04 08 .byte $0E, $10, $FF, $10, $07, $01, $FF, $2A ; CPU:$DC1D PRG:1C1D 0E 10 FF 10 07 01 FF 2A .byte $E0, $07, $76, $DF ; CPU:$DC25 PRG:1C25 E0 07 76 DF StagePpuData_Common: .byte $23, $40, $88, $39, $38, $39, $38, $39 ; CPU:$DC29 PRG:1C29 23 40 88 39 38 39 38 39 .byte $38, $39, $33, $24, $24, $24, $24, $24 ; CPU:$DC31 PRG:1C31 38 39 33 24 24 24 24 24 .byte $24, $24, $24, $24, $24, $24, $24, $24 ; CPU:$DC39 PRG:1C39 24 24 24 24 24 24 24 24 .byte $24, $24, $24, $30, $38, $39, $38, $39 ; CPU:$DC41 PRG:1C41 24 24 24 30 38 39 38 39 .byte $38, $39, $38, $3C, $3B, $3C, $3B, $3C ; CPU:$DC49 PRG:1C49 38 39 38 3C 3B 3C 3B 3C .byte $3B, $3C, $3D, $58, $59, $5A, $5B, $58 ; CPU:$DC51 PRG:1C51 3B 3C 3D 58 59 5A 5B 58 .byte $59, $5A, $5B, $58, $59, $5A, $5B, $58 ; CPU:$DC59 PRG:1C59 59 5A 5B 58 59 5A 5B 58 .byte $59, $5A, $5B, $3A, $3B, $3C, $3B, $3C ; CPU:$DC61 PRG:1C61 59 5A 5B 3A 3B 3C 3B 3C .byte $3B, $3C, $3B, $60, $61, $62, $63, $60 ; CPU:$DC69 PRG:1C69 3B 3C 3B 60 61 62 63 60 .byte $61, $62, $63, $5C, $5D, $5E, $5F, $5C ; CPU:$DC71 PRG:1C71 61 62 63 5C 5D 5E 5F 5C .byte $5D, $5E, $5F, $5C, $5D, $5E, $5F, $5C ; CPU:$DC79 PRG:1C79 5D 5E 5F 5C 5D 5E 5F 5C .byte $5D, $5E, $5F, $60, $61, $62, $63, $60 ; CPU:$DC81 PRG:1C81 5D 5E 5F 60 61 62 63 60 .byte $61, $62, $63, $5C, $5D, $5E, $5F, $5C ; CPU:$DC89 PRG:1C89 61 62 63 5C 5D 5E 5F 5C .byte $5D, $5E, $5F, $5C, $5D, $5E, $5F, $5C ; CPU:$DC91 PRG:1C91 5D 5E 5F 5C 5D 5E 5F 5C .byte $5D, $5E, $5F, $5C, $5D, $5E, $5F, $5C ; CPU:$DC99 PRG:1C99 5D 5E 5F 5C 5D 5E 5F 5C .byte $5D, $5E, $5F, $5C, $5D, $5E, $5F, $5C ; CPU:$DCA1 PRG:1CA1 5D 5E 5F 5C 5D 5E 5F 5C .byte $5D, $5E, $5F ; CPU:$DCA9 PRG:1CA9 5D 5E 5F NametableHeaderPatternData: .byte $40, $50, $50, $50, $50, $90, $A0, $A0 ; CPU:$DCAC PRG:1CAC 40 50 50 50 50 90 A0 A0 .byte $23, $F0, $10, $00, $00, $A0, $A0, $A0 ; CPU:$DCB4 PRG:1CB4 23 F0 10 00 00 A0 A0 A0 .byte $A0, $00, $00, $0A, $0A, $0A, $0A, $0A ; CPU:$DCBC PRG:1CBC A0 00 00 0A 0A 0A 0A 0A .byte $0A, $0A, $0A, $00, $A3, $04, $04, $93 ; CPU:$DCC4 PRG:1CC4 0A 0A 0A 00 A3 04 04 93 .byte $94, $94, $94, $A3, $05, $04, $95, $96 ; CPU:$DCCC PRG:1CCC 94 94 94 A3 05 04 95 96 .byte $96, $96, $A2, $EA, $05, $93, $94, $94 ; CPU:$DCD4 PRG:1CD4 96 96 A2 EA 05 93 94 94 .byte $94, $94, $A2, $EB, $05, $95, $96, $96 ; CPU:$DCDC PRG:1CDC 94 94 A2 EB 05 95 96 96 .byte $96, $96, $A3, $34, $03, $93, $94, $94 ; CPU:$DCE4 PRG:1CE4 96 96 A3 34 03 93 94 94 .byte $A3, $35, $03, $95, $96, $96, $A3, $1A ; CPU:$DCEC PRG:1CEC A3 35 03 95 96 96 A3 1A .byte $04, $93, $94, $94, $94, $A3, $1B, $04 ; CPU:$DCF4 PRG:1CF4 04 93 94 94 94 A3 1B 04 .byte $95, $96, $96, $96, $63, $80, $20, $97 ; CPU:$DCFC PRG:1CFC 95 96 96 96 63 80 20 97 .byte $23, $A0, $20, $98, $99, $98, $99, $98 ; CPU:$DD04 PRG:1D04 23 A0 20 98 99 98 99 98 .byte $99, $98, $99, $98, $99, $98, $99, $98 ; CPU:$DD0C PRG:1D0C 99 98 99 98 99 98 99 98 .byte $99, $98, $99, $98, $99, $98, $99, $98 ; CPU:$DD14 PRG:1D14 99 98 99 98 99 98 99 98 .byte $99, $98, $99, $98, $99, $98, $99, $98 ; CPU:$DD1C PRG:1D1C 99 98 99 98 99 98 99 98 .byte $99, $98, $99, $23, $C0, $08, $40, $50 ; CPU:$DD24 PRG:1D24 99 98 99 23 C0 08 40 50 .byte $50, $50, $50, $90, $A0, $A0, $63, $E8 ; CPU:$DD2C PRG:1D2C 50 50 50 90 A0 A0 63 E8 .byte $10, $FF, $00 ; CPU:$DD34 PRG:1D34 10 FF 00 StagePpuLayoutData: .byte $22, $49, $0E, $30, $31, $32, $31, $32 ; CPU:$DD37 PRG:1D37 22 49 0E 30 31 32 31 32 .byte $31, $32, $31, $32, $31, $32, $31, $32 ; CPU:$DD3F PRG:1D3F 31 32 31 32 31 32 31 32 .byte $33, $00, $21, $57, $06, $30, $31, $32 ; CPU:$DD47 PRG:1D47 33 00 21 57 06 30 31 32 .byte $31, $32, $33, $21, $65, $06, $30, $31 ; CPU:$DD4F PRG:1D4F 31 32 33 21 65 06 30 31 .byte $32, $31, $32, $33, $00, $21, $90, $03 ; CPU:$DD57 PRG:1D57 32 31 32 33 00 21 90 03 .byte $30, $31, $33, $22, $26, $03, $30, $31 ; CPU:$DD5F PRG:1D5F 30 31 33 22 26 03 30 31 .byte $33, $22, $57, $03, $30, $31, $33, $22 ; CPU:$DD67 PRG:1D67 33 22 57 03 30 31 33 22 .byte $6C, $03, $30, $31, $33, $22, $F2, $03 ; CPU:$DD6F PRG:1D6F 6C 03 30 31 33 22 F2 03 .byte $30, $31, $33, $00, $20, $CB, $03, $30 ; CPU:$DD77 PRG:1D77 30 31 33 00 20 CB 03 30 .byte $31, $33, $A1, $6D, $03, $3E, $3F, $40 ; CPU:$DD7F PRG:1D7F 31 33 A1 6D 03 3E 3F 40 .byte $A1, $59, $04, $3E, $3F, $3F, $40, $A1 ; CPU:$DD87 PRG:1D87 A1 59 04 3E 3F 3F 40 A1 .byte $A5, $03, $3E, $3F, $40, $22, $AA, $03 ; CPU:$DD8F PRG:1D8F A5 03 3E 3F 40 22 AA 03 .byte $30, $31, $33, $22, $B3, $03, $30, $31 ; CPU:$DD97 PRG:1D97 30 31 33 22 B3 03 30 31 .byte $33, $00, $20, $E2, $02, $30, $33, $20 ; CPU:$DD9F PRG:1D9F 33 00 20 E2 02 30 33 20 .byte $FB, $02, $30, $33, $21, $57, $02, $30 ; CPU:$DDA7 PRG:1DA7 FB 02 30 33 21 57 02 30 .byte $33, $21, $93, $02, $30, $33, $22, $0B ; CPU:$DDAF PRG:1DAF 33 21 93 02 30 33 22 0B .byte $02, $30, $33, $22, $47, $02, $30, $33 ; CPU:$DDB7 PRG:1DB7 02 30 33 22 47 02 30 33 .byte $22, $83, $02, $30, $33, $22, $CF, $04 ; CPU:$DDBF PRG:1DBF 22 83 02 30 33 22 CF 04 .byte $30, $31, $32, $33, $00, $22, $CA, $03 ; CPU:$DDC7 PRG:1DC7 30 31 32 33 00 22 CA 03 .byte $30, $31, $33, $22, $D2, $03, $30, $31 ; CPU:$DDCF PRG:1DCF 30 31 33 22 D2 03 30 31 .byte $33, $00, $21, $08, $04, $30, $31, $32 ; CPU:$DDD7 PRG:1DD7 33 00 21 08 04 30 31 32 .byte $33, $21, $14, $04, $30, $31, $32, $33 ; CPU:$DDDF PRG:1DDF 33 21 14 04 30 31 32 33 .byte $A1, $A5, $04, $3E, $3F, $3F, $40, $A1 ; CPU:$DDE7 PRG:1DE7 A1 A5 04 3E 3F 3F 40 A1 .byte $BA, $04, $3E, $3F, $3F, $40, $22, $6C ; CPU:$DDEF PRG:1DEF BA 04 3E 3F 3F 40 22 6C .byte $06, $30, $31, $32, $31, $32, $33, $00 ; CPU:$DDF7 PRG:1DF7 06 30 31 32 31 32 33 00 .byte $22, $EE, $04, $30, $31, $32, $33, $20 ; CPU:$DDFF PRG:1DFF 22 EE 04 30 31 32 33 20 .byte $F9, $03, $30, $31, $33, $A1, $1A, $03 ; CPU:$DE07 PRG:1E07 F9 03 30 31 33 A1 1A 03 .byte $3F, $3F, $40, $21, $90, $03, $30, $31 ; CPU:$DE0F PRG:1E0F 3F 3F 40 21 90 03 30 31 .byte $33, $A1, $B1, $03, $3F, $3F, $40, $22 ; CPU:$DE17 PRG:1E17 33 A1 B1 03 3F 3F 40 22 .byte $28, $03, $30, $31, $33, $A2, $49, $03 ; CPU:$DE1F PRG:1E1F 28 03 30 31 33 A2 49 03 .byte $3F, $3F, $40, $20, $EA, $02, $30, $33 ; CPU:$DE27 PRG:1E27 3F 3F 40 20 EA 02 30 33 .byte $00, $A2, $6C, $03, $3E, $3F, $40, $A2 ; CPU:$DE2F PRG:1E2F 00 A2 6C 03 3E 3F 40 A2 .byte $73, $03, $3E, $3F, $40, $20, $E4, $04 ; CPU:$DE37 PRG:1E37 73 03 3E 3F 40 20 E4 04 .byte $30, $31, $32, $33, $20, $F8, $04, $30 ; CPU:$DE3F PRG:1E3F 30 31 32 33 20 F8 04 30 .byte $31, $32, $33, $21, $A8, $04, $30, $31 ; CPU:$DE47 PRG:1E47 31 32 33 21 A8 04 30 31 .byte $32, $33, $21, $B5, $04, $30, $31, $32 ; CPU:$DE4F PRG:1E4F 32 33 21 B5 04 30 31 32 .byte $33, $00, $22, $64, $02, $30, $33, $22 ; CPU:$DE57 PRG:1E57 33 00 22 64 02 30 33 22 .byte $08, $02, $30, $33, $21, $AC, $02, $30 ; CPU:$DE5F PRG:1E5F 08 02 30 33 21 AC 02 30 .byte $33, $21, $B4, $02, $30, $33, $22, $18 ; CPU:$DE67 PRG:1E67 33 21 B4 02 30 33 22 18 .byte $02, $30, $33, $22, $7C, $02, $30, $33 ; CPU:$DE6F PRG:1E6F 02 30 33 22 7C 02 30 33 .byte $00, $10, $C8, $48, $38, $FF, $B8, $CF ; CPU:$DE77 PRG:1E77 00 10 C8 48 38 FF B8 CF .byte $CF, $8F, $E0, $E0, $98, $10, $C4, $48 ; CPU:$DE7F PRG:1E7F CF 8F E0 E0 98 10 C4 48 .byte $B8, $28, $3C, $FF, $B8, $E8, $58, $CF ; CPU:$DE87 PRG:1E87 B8 28 3C FF B8 E8 58 CF .byte $CF, $8F, $4F, $57, $E0, $E0, $98, $58 ; CPU:$DE8F PRG:1E8F CF 8F 4F 57 E0 E0 98 58 .byte $60, $10, $FF, $DF, $EC, $10, $C8, $80 ; CPU:$DE97 PRG:1E97 60 10 FF DF EC 10 C8 80 .byte $30, $B8, $60, $90, $38, $FF, $98, $48 ; CPU:$DE9F PRG:1E9F 30 B8 60 90 38 FF 98 48 .byte $D0, $78, $A8, $CF, $CF, $5F, $87, $8F ; CPU:$DEA7 PRG:1EA7 D0 78 A8 CF CF 5F 87 8F .byte $97, $B7, $E0, $E0, $68, $90, $98, $A0 ; CPU:$DEAF PRG:1EAF 97 B7 E0 E0 68 90 98 A0 .byte $C0, $10, $C8, $58, $68, $C8, $28, $50 ; CPU:$DEB7 PRG:1EB7 C0 10 C8 58 68 C8 28 50 .byte $98, $38, $FF, $70, $78, $D0, $30, $68 ; CPU:$DEBF PRG:1EBF 98 38 FF 70 78 D0 30 68 .byte $B0, $CF, $CF, $2F, $57, $4F, $67, $A7 ; CPU:$DEC7 PRG:1EC7 B0 CF CF 2F 57 4F 67 A7 .byte $A7, $E0, $E0, $38, $6C, $6C, $7C, $B0 ; CPU:$DECF PRG:1ECF A7 E0 E0 38 6C 6C 7C B0 .byte $B0, $10, $C8, $12, $DA, $BA, $9A, $5A ; CPU:$DED7 PRG:1ED7 B0 10 C8 12 DA BA 9A 5A .byte $3A, $1A, $7A, $38, $FF, $1E, $E6, $C6 ; CPU:$DEDF PRG:1EDF 3A 1A 7A 38 FF 1E E6 C6 .byte $A6, $66, $46, $26, $96, $CF, $CF, $37 ; CPU:$DEE7 PRG:1EE7 A6 66 46 26 96 CF CF 37 .byte $37, $4F, $5F, $7F, $8F, $9F, $AF, $E0 ; CPU:$DEEF PRG:1EEF 37 4F 5F 7F 8F 9F AF E0 .byte $E0, $40, $40, $58, $68, $88, $98, $A8 ; CPU:$DEF7 PRG:1EF7 E0 40 40 58 68 88 98 A8 .byte $B8, $10, $C8, $52, $92, $38, $FF, $66 ; CPU:$DEFF PRG:1EFF B8 10 C8 52 92 38 FF 66 .byte $A6, $CF, $CF, $AF, $AF, $E0, $E0, $B8 ; CPU:$DF07 PRG:1F07 A6 CF CF AF AF E0 E0 B8 .byte $B8, $10, $C8, $40, $A0, $28, $D0, $60 ; CPU:$DF0F PRG:1F0F B8 10 C8 40 A0 28 D0 60 .byte $38, $FF, $60, $C0, $30, $D8, $90, $CF ; CPU:$DF17 PRG:1F17 38 FF 60 C0 30 D8 90 CF .byte $CF, $3F, $3F, $67, $67, $97, $E0, $E0 ; CPU:$DF1F PRG:1F1F CF 3F 3F 67 67 97 E0 E0 .byte $48, $48, $88, $88, $A0, $10, $C8, $50 ; CPU:$DF27 PRG:1F27 48 48 88 88 A0 10 C8 50 .byte $C8, $88, $40, $70, $D0, $88, $48, $38 ; CPU:$DF2F PRG:1F2F C8 88 40 70 D0 88 48 38 .byte $FF, $60, $E0, $98, $58, $90, $D8, $90 ; CPU:$DF37 PRG:1F37 FF 60 E0 98 58 90 D8 90 .byte $50, $CF, $CF, $37, $37, $5F, $87, $B7 ; CPU:$DF3F PRG:1F3F 50 CF CF 37 37 5F 87 B7 .byte $3C, $64, $8C, $E0, $E0, $40, $40, $68 ; CPU:$DF47 PRG:1F47 3C 64 8C E0 E0 40 40 68 .byte $90, $C0, $60, $80, $A8, $10, $C8, $20 ; CPU:$DF4F PRG:1F4F 90 C0 60 80 A8 10 C8 20 .byte $C0, $40, $A8, $60, $98, $38, $FF, $40 ; CPU:$DF57 PRG:1F57 C0 40 A8 60 98 38 FF 40 .byte $E0, $60, $C8, $68, $A0, $CF, $CF, $37 ; CPU:$DF5F PRG:1F5F E0 60 C8 68 A0 CF CF 37 .byte $37, $67, $67, $97, $97, $E0, $E0, $40 ; CPU:$DF67 PRG:1F67 37 67 67 97 97 E0 E0 40 .byte $40, $70, $70, $B0, $B0, $10, $C8, $20 ; CPU:$DF6F PRG:1F6F 40 70 70 B0 B0 10 C8 20 .byte $40, $60, $A0, $C0, $E0, $38, $FF, $30 ; CPU:$DF77 PRG:1F77 40 60 A0 C0 E0 38 FF 30 .byte $50, $70, $B0, $D0, $F0, $CF, $CF, $97 ; CPU:$DF7F PRG:1F7F 50 70 B0 D0 F0 CF CF 97 .byte $7F, $67, $67, $7F, $97, $E0, $E0, $A0 ; CPU:$DF87 PRG:1F87 7F 67 67 7F 97 E0 E0 A0 .byte $88, $70, $70, $88, $A0, $03, $58, $78 ; CPU:$DF8F PRG:1F8F 88 70 70 88 A0 03 58 78 .byte $04, $78, $78, $04, $98, $78, $04, $05 ; CPU:$DF97 PRG:1F97 04 78 78 04 98 78 04 05 .byte $C8, $38, $05, $38, $40, $05, $58, $78 ; CPU:$DF9F PRG:1F9F C8 38 05 38 40 05 58 78 .byte $04, $78, $78, $04, $98, $78, $04, $00 ; CPU:$DFA7 PRG:1FA7 04 78 78 04 98 78 04 00 .byte $05, $94, $A0, $06, $84, $48, $05, $34 ; CPU:$DFAF PRG:1FAF 05 94 A0 06 84 48 05 34 .byte $70, $04, $64, $80, $04, $BC, $78, $04 ; CPU:$DFB7 PRG:1FB7 70 04 64 80 04 BC 78 04 .byte $06, $5C, $18, $06, $24, $50, $05, $64 ; CPU:$DFBF PRG:1FBF 06 5C 18 06 24 50 05 64 .byte $40, $05, $C4, $38, $05, $54, $90, $04 ; CPU:$DFC7 PRG:1FC7 40 05 C4 38 05 54 90 04 .byte $9C, $90, $04, $06, $10, $20, $06, $D8 ; CPU:$DFCF PRG:1FCF 9C 90 04 06 10 20 06 D8 .byte $20, $06, $B8, $38, $05, $98, $48, $05 ; CPU:$DFD7 PRG:1FD7 20 06 B8 38 05 98 48 05 .byte $58, $68, $05, $38, $78, $04, $05, $54 ; CPU:$DFDF PRG:1FDF 58 68 05 38 78 04 05 54 .byte $98, $05, $94, $98, $05, $6C, $39, $06 ; CPU:$DFE7 PRG:1FE7 98 05 94 98 05 6C 39 06 .byte $94, $31, $06, $BC, $59, $06, $05, $50 ; CPU:$DFEF PRG:1FEF 94 31 06 BC 59 06 05 50 .byte $28, $06, $A8, $28, $06, $24, $50, $06 ; CPU:$DFF7 PRG:1FF7 28 06 A8 28 06 24 50 06 .byte $CC, $50, $06, $70, $80, $04, $05, $50 ; CPU:$DFFF PRG:1FFF CC 50 06 70 80 04 05 50 .byte $20, $06, $C8, $20, $06, $84, $48, $05 ; CPU:$E007 PRG:2007 20 06 C8 20 06 84 48 05 .byte $44, $70, $05, $78, $A0, $04, $06, $28 ; CPU:$E00F PRG:200F 44 70 05 78 A0 04 06 28 .byte $20, $06, $C8, $20, $06, $48, $50, $05 ; CPU:$E017 PRG:2017 20 06 C8 20 06 48 50 05 .byte $B0, $50, $05, $5C, $80, $04, $94, $80 ; CPU:$E01F PRG:201F B0 50 05 5C 80 04 94 80 .byte $04, $06, $20, $80, $04, $40, $68, $05 ; CPU:$E027 PRG:2027 04 06 20 80 04 40 68 05 .byte $60, $50, $06, $A0, $50, $06, $C0, $68 ; CPU:$E02F PRG:202F 60 50 06 A0 50 06 C0 68 .byte $05, $E0, $80, $04 ; CPU:$E037 PRG:2037 05 E0 80 04 StageObjectPointerData: .byte $08, $08, $F0, $08, $08, $00, $00, $00 ; CPU:$E03B PRG:203B 08 08 F0 08 08 00 00 00 .byte $00, $08, $08, $08, $00, $00, $01, $08 ; CPU:$E043 PRG:2043 00 08 08 08 00 00 01 08 .byte $08, $09, $00, $00, $FF, $08, $08, $07 ; CPU:$E04B PRG:204B 08 09 00 00 FF 08 08 07 .byte $FE, $00, $00, $06, $08, $08, $02, $00 ; CPU:$E053 PRG:2053 FE 00 00 06 08 08 02 00 .byte $00, $0A, $08, $08, $02, $00, $01, $0A ; CPU:$E05B PRG:205B 00 0A 08 08 02 00 01 0A .byte $08, $09, $04, $00, $00, $0C, $08, $08 ; CPU:$E063 PRG:2063 08 09 04 00 00 0C 08 08 .byte $00, $00, $FE, $08, $08, $06, $FD, $FD ; CPU:$E06B PRG:206B 00 00 FE 08 08 06 FD FD .byte $FD, $05, $05, $05, $08, $08, $08, $00 ; CPU:$E073 PRG:2073 FD 05 05 05 08 08 08 00 .byte $00, $00, $08, $08, $07, $00, $00, $FF ; CPU:$E07B PRG:207B 00 00 08 08 07 00 00 FF .byte $08, $08, $09, $00, $00, $01, $0A, $08 ; CPU:$E083 PRG:2083 08 08 09 00 00 01 0A 08 .byte $08, $02, $00, $00, $06, $08, $08, $FE ; CPU:$E08B PRG:208B 08 02 00 00 06 08 08 FE .byte $00, $00, $06, $08, $07, $FE, $00, $FF ; CPU:$E093 PRG:2093 00 00 06 08 07 FE 00 FF .byte $04, $08, $08, $FC, $00, $00, $08, $08 ; CPU:$E09B PRG:209B 04 08 08 FC 00 00 08 08 .byte $0A, $00, $00, $02, $0B, $0B, $0B, $03 ; CPU:$E0A3 PRG:20A3 0A 00 00 02 0B 0B 0B 03 .byte $03, $03, $00, $00, $01, $02, $03, $04 ; CPU:$E0AB PRG:20AB 03 03 00 00 01 02 03 04 .byte $05, $00, $00, $01, $02, $03, $06, $07 ; CPU:$E0B3 PRG:20B3 05 00 00 01 02 03 06 07 .byte $00, $00, $01, $02, $03, $06, $08, $00 ; CPU:$E0BB PRG:20BB 00 00 01 02 03 06 08 00 .byte $09, $0A, $02, $0B, $0C, $05, $00, $00 ; CPU:$E0C3 PRG:20C3 09 0A 02 0B 0C 05 00 00 .byte $01, $02, $03, $04, $05, $00, $00, $01 ; CPU:$E0CB PRG:20CB 01 02 03 04 05 00 00 01 .byte $02, $0D, $0E, $05, $00, $1A, $1B, $1C ; CPU:$E0D3 PRG:20D3 02 0D 0E 05 00 1A 1B 1C .byte $1D, $1E, $1F, $01, $1A, $1B, $20, $1D ; CPU:$E0DB PRG:20DB 1D 1E 1F 01 1A 1B 20 1D .byte $1E, $FC, $00, $1A, $21, $22, $1D, $23 ; CPU:$E0E3 PRG:20E3 1E FC 00 1A 21 22 1D 23 .byte $24, $00, $00, $38, $35, $0D, $39, $37 ; CPU:$E0EB PRG:20EB 24 00 00 38 35 0D 39 37 .byte $00, $00, $34, $35, $03, $36, $37, $00 ; CPU:$E0F3 PRG:20F3 00 00 34 35 03 36 37 00 .byte $09, $3A, $35, $0B, $3B, $37, $00, $CE ; CPU:$E0FB PRG:20FB 09 3A 35 0B 3B 37 00 CE .byte $CF, $D0, $D1, $D2, $D3, $00, $25, $26 ; CPU:$E103 PRG:2103 CF D0 D1 D2 D3 00 25 26 .byte $27, $28, $29, $2A, $01, $28, $29, $2C ; CPU:$E10B PRG:210B 27 28 29 2A 01 28 29 2C .byte $25, $26, $2B, $00, $4C, $CC, $02, $4D ; CPU:$E113 PRG:2113 25 26 2B 00 4C CC 02 4D .byte $CD, $05, $00, $4C, $2F, $22, $4D, $30 ; CPU:$E11B PRG:211B CD 05 00 4C 2F 22 4D 30 .byte $24, $07, $4C, $2F, $35, $4D, $30, $37 ; CPU:$E123 PRG:2123 24 07 4C 2F 35 4D 30 37 .byte $02, $4C, $2F, $27, $4D, $30, $2A, $07 ; CPU:$E12B PRG:212B 02 4C 2F 27 4D 30 2A 07 .byte $4C, $2F, $2B, $4D, $30, $2C, $00, $0F ; CPU:$E133 PRG:2133 4C 2F 2B 4D 30 2C 00 0F .byte $10, $02, $11, $12, $05, $00, $0F, $10 ; CPU:$E13B PRG:213B 10 02 11 12 05 00 0F 10 .byte $02, $11, $19, $07, $00, $0F, $10, $02 ; CPU:$E143 PRG:2143 02 11 19 07 00 0F 10 02 .byte $11, $19, $08, $00, $13, $14, $02, $15 ; CPU:$E14B PRG:214B 11 19 08 00 13 14 02 15 .byte $16, $05, $00, $0F, $10, $02, $11, $12 ; CPU:$E153 PRG:2153 16 05 00 0F 10 02 11 12 .byte $05, $03, $13, $17, $02, $15, $18, $05 ; CPU:$E15B PRG:215B 05 03 13 17 02 15 18 05 .byte $04, $13, $2D, $1C, $15, $2E, $1F, $05 ; CPU:$E163 PRG:2163 04 13 2D 1C 15 2E 1F 05 .byte $13, $2D, $20, $15, $2E, $FC, $04, $13 ; CPU:$E16B PRG:216B 13 2D 20 15 2E FC 04 13 .byte $2F, $22, $15, $30, $24, $00, $13, $3C ; CPU:$E173 PRG:2173 2F 22 15 30 24 00 13 3C .byte $35, $15, $3D, $37, $00, $0F, $40, $35 ; CPU:$E17B PRG:217B 35 15 3D 37 00 0F 40 35 .byte $11, $41, $37, $03, $13, $3E, $35, $15 ; CPU:$E183 PRG:2183 11 41 37 03 13 3E 35 15 .byte $3F, $37, $00, $D4, $D5, $D0, $D6, $D7 ; CPU:$E18B PRG:218B 3F 37 00 D4 D5 D0 D6 D7 .byte $D3, $00, $25, $31, $27, $32, $33, $2A ; CPU:$E193 PRG:2193 D3 00 25 31 27 32 33 2A .byte $02, $25, $31, $27, $32, $33, $2A, $00 ; CPU:$E19B PRG:219B 02 25 31 27 32 33 2A 00 .byte $FC, $48, $42, $FC, $49, $43, $00, $FC ; CPU:$E1A3 PRG:21A3 FC 48 42 FC 49 43 00 FC .byte $48, $44, $FC, $49, $45, $00, $FC, $4A ; CPU:$E1AB PRG:21AB 48 44 FC 49 45 00 FC 4A .byte $46, $FC, $4B, $47, $00, $FC, $A4, $A5 ; CPU:$E1B3 PRG:21B3 46 FC 4B 47 00 FC A4 A5 .byte $FC, $A6, $A7, $08, $FC, $71, $FC, $FC ; CPU:$E1BB PRG:21BB FC A6 A7 08 FC 71 FC FC .byte $72, $73, $08, $FC, $74, $FC, $FC, $75 ; CPU:$E1C3 PRG:21C3 72 73 08 FC 74 FC FC 75 .byte $76, $08, $FC, $71, $77, $FC, $72, $73 ; CPU:$E1CB PRG:21CB 76 08 FC 71 77 FC 72 73 .byte $08, $FC, $74, $77, $FC, $75, $76, $08 ; CPU:$E1D3 PRG:21D3 08 FC 74 77 FC 75 76 08 .byte $FC, $71, $78, $FC, $72, $73, $08, $FC ; CPU:$E1DB PRG:21DB FC 71 78 FC 72 73 08 FC .byte $74, $78, $FC, $75, $76, $08, $FC, $71 ; CPU:$E1E3 PRG:21E3 74 78 FC 75 76 08 FC 71 .byte $79, $FC, $72, $73, $08, $FC, $74, $79 ; CPU:$E1EB PRG:21EB 79 FC 72 73 08 FC 74 79 .byte $FC, $75, $76, $00, $4E, $4F, $50, $51 ; CPU:$E1F3 PRG:21F3 FC 75 76 00 4E 4F 50 51 .byte $52, $53, $00, $4E, $4F, $50, $51, $5E ; CPU:$E1FB PRG:21FB 52 53 00 4E 4F 50 51 5E .byte $58, $00, $4E, $4F, $50, $51, $5E, $5D ; CPU:$E203 PRG:2203 58 00 4E 4F 50 51 5E 5D .byte $00, $54, $55, $50, $56, $57, $53, $00 ; CPU:$E20B PRG:220B 00 54 55 50 56 57 53 00 .byte $4E, $4F, $50, $51, $52, $53, $00, $59 ; CPU:$E213 PRG:2213 4E 4F 50 51 52 53 00 59 .byte $5A, $50, $5B, $5C, $53, $00, $FC, $5F ; CPU:$E21B PRG:221B 5A 50 5B 5C 53 00 FC 5F .byte $60, $FC, $61, $62, $06, $63, $64, $60 ; CPU:$E223 PRG:2223 60 FC 61 62 06 63 64 60 .byte $FC, $65, $62, $00, $66, $67, $60, $68 ; CPU:$E22B PRG:222B FC 65 62 00 66 67 60 68 .byte $69, $62, $00, $6A, $67, $60, $6B, $69 ; CPU:$E233 PRG:2233 69 62 00 6A 67 60 6B 69 .byte $62, $00, $FC, $6C, $6D, $FC, $6E, $6F ; CPU:$E23B PRG:223B 62 00 FC 6C 6D FC 6E 6F .byte $00, $FC, $6C, $6D, $FC, $6E, $70 ; CPU:$E243 PRG:2243 00 FC 6C 6D FC 6E 70 StageBoundaryDataA: .byte $AF, $B6, $BD, $B6, $C4, $CB, $D2, $CB ; CPU:$E24A PRG:224A AF B6 BD B6 C4 CB D2 CB .byte $D9, $E0, $E7, $E0, $EE, $F5, $FC, $F5 ; CPU:$E252 PRG:2252 D9 E0 E7 E0 EE F5 FC F5 .byte $0A, $0A, $0A, $0A, $11, $11, $11, $11 ; CPU:$E25A PRG:225A 0A 0A 0A 0A 11 11 11 11 .byte $18, $18, $18, $18, $1F, $1F, $1F, $1F ; CPU:$E262 PRG:2262 18 18 18 18 1F 1F 1F 1F .byte $26, $26, $26, $26, $2D, $2D, $2D, $2D ; CPU:$E26A PRG:226A 26 26 26 26 2D 2D 2D 2D .byte $34, $34, $34, $34, $3B, $42, $49, $42 ; CPU:$E272 PRG:2272 34 34 34 34 3B 42 49 42 .byte $50, $57, $5E, $57, $65, $6C, $73, $6C ; CPU:$E27A PRG:227A 50 57 5E 57 65 6C 73 6C .byte $7A, $81, $88, $81, $96, $96, $96, $96 ; CPU:$E282 PRG:2282 7A 81 88 81 96 96 96 96 .byte $9D, $9D, $9D, $9D, $A4, $AB, $B2, $AB ; CPU:$E28A PRG:228A 9D 9D 9D 9D A4 AB B2 AB .byte $B9, $A4, $B9, $A4 ; CPU:$E292 PRG:2292 B9 A4 B9 A4 StageBoundaryDataB: .byte $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0 ; CPU:$E296 PRG:2296 E0 E0 E0 E0 E0 E0 E0 E0 .byte $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0 ; CPU:$E29E PRG:229E E0 E0 E0 E0 E0 E0 E0 E0 .byte $E1, $E1, $E1, $E1, $E1, $E1, $E1, $E1 ; CPU:$E2A6 PRG:22A6 E1 E1 E1 E1 E1 E1 E1 E1 .byte $E1, $E1, $E1, $E1, $E1, $E1, $E1, $E1 ; CPU:$E2AE PRG:22AE E1 E1 E1 E1 E1 E1 E1 E1 .byte $E1, $E1, $E1, $E1, $E1, $E1, $E1, $E1 ; CPU:$E2B6 PRG:22B6 E1 E1 E1 E1 E1 E1 E1 E1 .byte $E1, $E1, $E1, $E1, $E1, $E1, $E1, $E1 ; CPU:$E2BE PRG:22BE E1 E1 E1 E1 E1 E1 E1 E1 .byte $E1, $E1, $E1, $E1, $E1, $E1, $E1, $E1 ; CPU:$E2C6 PRG:22C6 E1 E1 E1 E1 E1 E1 E1 E1 .byte $E1, $E1, $E1, $E1, $E1, $E1, $E1, $E1 ; CPU:$E2CE PRG:22CE E1 E1 E1 E1 E1 E1 E1 E1 .byte $E1, $E1, $E1, $E1, $E1, $E1, $E1, $E1 ; CPU:$E2D6 PRG:22D6 E1 E1 E1 E1 E1 E1 E1 E1 .byte $E1, $E1, $E1, $E1 ; CPU:$E2DE PRG:22DE E1 E1 E1 E1 StageObjectTypeData: .byte $81, $81, $8F, $81, $F5, $F5, $03, $F5 ; CPU:$E2E2 PRG:22E2 81 81 8F 81 F5 F5 03 F5 StageObjectXData: .byte $E1, $E1, $E1, $E1, $E0, $E0, $E1, $E0 ; CPU:$E2EA PRG:22EA E1 E1 E1 E1 E0 E0 E1 E0 StageObjectYData: .byte $F8, $FF, $06, $FF, $0D, $14, $1B, $14 ; CPU:$E2F2 PRG:22F2 F8 FF 06 FF 0D 14 1B 14 .byte $3E, $3E, $22, $29, $30, $30, $30, $30 ; CPU:$E2FA PRG:22FA 3E 3E 22 29 30 30 30 30 .byte $C0, $C0, $C0, $C0, $C0, $C7, $C0, $C7 ; CPU:$E302 PRG:2302 C0 C0 C0 C0 C0 C7 C0 C7 .byte $CE, $D5, $CE, $D5, $DC, $E3, $DC, $E3 ; CPU:$E30A PRG:230A CE D5 CE D5 DC E3 DC E3 .byte $EA, $F1, $EA, $F1, $3E, $45, $3E, $45 ; CPU:$E312 PRG:2312 EA F1 EA F1 3E 45 3E 45 .byte $37, $37, $37, $37 ; CPU:$E31A PRG:231A 37 37 37 37 StageObjectAttributeData: .byte $E1, $E1, $E2, $E1, $E2, $E2, $E2, $E2 ; CPU:$E31E PRG:231E E1 E1 E2 E1 E2 E2 E2 E2 .byte $E2, $E2, $E2, $E2, $E2, $E2, $E2, $E2 ; CPU:$E326 PRG:2326 E2 E2 E2 E2 E2 E2 E2 E2 .byte $E1, $E1, $E1, $E1, $E1, $E1, $E1, $E1 ; CPU:$E32E PRG:232E E1 E1 E1 E1 E1 E1 E1 E1 .byte $E1, $E1, $E1, $E1, $E1, $E1, $E1, $E1 ; CPU:$E336 PRG:2336 E1 E1 E1 E1 E1 E1 E1 E1 .byte $E1, $E1, $E1, $E1, $E2, $E2, $E2, $E2 ; CPU:$E33E PRG:233E E1 E1 E1 E1 E2 E2 E2 E2 .byte $E2, $E2, $E2, $E2 ; CPU:$E346 PRG:2346 E2 E2 E2 E2 StageObjectDataTableA: .byte $44, $2C, $00 ; CPU:$E34A PRG:234A 44 2C 00 StageObjectDataTableB: .byte $00, $00, $04 ; CPU:$E34D PRG:234D 00 00 04 StageObjectDataTableC: .byte $24, $08, $00, $00, $FC, $FC, $FE, $FC ; CPU:$E350 PRG:2350 24 08 00 00 FC FC FE FC .byte $00, $7B, $FC, $FC, $7C, $FC, $FC, $00 ; CPU:$E358 PRG:2358 00 7B FC FC 7C FC FC 00 .byte $7D, $7E, $FC, $7F, $80, $FC, $00, $81 ; CPU:$E360 PRG:2360 7D 7E FC 7F 80 FC 00 81 .byte $82, $83, $84, $85, $86, $00, $87, $88 ; CPU:$E368 PRG:2368 82 83 84 85 86 00 87 88 .byte $FC, $89, $8A, $FC, $00, $8B, $8C, $FC ; CPU:$E370 PRG:2370 FC 89 8A FC 00 8B 8C FC .byte $8D, $8E, $FC, $00, $8F, $90, $FC, $FC ; CPU:$E378 PRG:2378 8D 8E FC 00 8F 90 FC FC .byte $FC, $FC ; CPU:$E380 PRG:2380 FC FC StageObjectDataTableD: .byte $55, $5A, $61, $68, $6F, $76, $7D ; CPU:$E382 PRG:2382 55 5A 61 68 6F 76 7D StageObjectDataTableE: .byte $E3, $E3, $E3, $E3, $E3, $E3, $E3 ; CPU:$E389 PRG:2389 E3 E3 E3 E3 E3 E3 E3 StageSetupPointerLoTable: .byte $20, $38, $50, $68, $80, $98, $B0, $C8 ; CPU:$E390 PRG:2390 20 38 50 68 80 98 B0 C8 .byte $08 ; CPU:$E398 PRG:2398 08 StageSetupPointerHiTable: .byte $20, $38, $C8, $B0, $98, $80, $68, $50 ; CPU:$E399 PRG:2399 20 38 C8 B0 98 80 68 50 .byte $08 ; CPU:$E3A1 PRG:23A1 08 ; RenderObjectSprites ; Purpose: select object animation streams and emit six OAM sprite records. ; Inputs: X = object slot; object state arrays and frame counter in RAM. ; Returns: selected OAM buffer updated; A/Y modified; X restored. RenderObjectSprites: lda StageSetupPointerLoTable,x ; CPU:$E3A2 PRG:23A2 BD 92 E3 sta $1F ; CPU:$E3A5 PRG:23A5 85 1F lda $19 ; CPU:$E3A7 PRG:23A7 A5 19 lsr a ; CPU:$E3A9 PRG:23A9 4A bcc RenderObjectSprites_Block ; CPU:$E3AA PRG:23AA 90 05 lda StageSetupPointerHiTable,x ; CPU:$E3AC PRG:23AC BD 9B E3 sta $1F ; CPU:$E3AF PRG:23AF 85 1F RenderObjectSprites_Block: lda #$02 ; CPU:$E3B1 PRG:23B1 A9 02 sta $20 ; CPU:$E3B3 PRG:23B3 85 20 lda $88,x ; CPU:$E3B5 PRG:23B5 B5 88 bpl RenderObjectSprites_Block_3 ; CPU:$E3B7 PRG:23B7 10 14 cmp #$FF ; CPU:$E3B9 PRG:23B9 C9 FF beq RenderObjectSprites_Block_1 ; CPU:$E3BB PRG:23BB F0 03 jmp RenderLargeObjectSprites ; CPU:$E3BD PRG:23BD 4C D5 E4 RenderObjectSprites_Block_1: ldy #$14 ; CPU:$E3C0 PRG:23C0 A0 14 RenderObjectSprites_Block_2: lda #$F0 ; CPU:$E3C2 PRG:23C2 A9 F0 sta ($1F),y ; CPU:$E3C4 PRG:23C4 91 1F dey ; CPU:$E3C6 PRG:23C6 88 dey ; CPU:$E3C7 PRG:23C7 88 dey ; CPU:$E3C8 PRG:23C8 88 dey ; CPU:$E3C9 PRG:23C9 88 bpl RenderObjectSprites_Block_2 ; CPU:$E3CA PRG:23CA 10 F6 rts ; CPU:$E3CC PRG:23CC 60 RenderObjectSprites_Block_3: cpx #$08 ; CPU:$E3CD PRG:23CD E0 08 beq RenderObjectSprites_Block_5 ; CPU:$E3CF PRG:23CF F0 48 lda $7F,x ; CPU:$E3D1 PRG:23D1 B5 7F asl a ; CPU:$E3D3 PRG:23D3 0A asl a ; CPU:$E3D4 PRG:23D4 0A adc $0436,x ; CPU:$E3D5 PRG:23D5 7D 36 04 cpx #$02 ; CPU:$E3D8 PRG:23D8 E0 02 bcs RenderObjectSprites_Block_4 ; CPU:$E3DA PRG:23DA B0 2A ldy $88,x ; CPU:$E3DC PRG:23DC B4 88 adc $E34C,y ; CPU:$E3DE PRG:23DE 79 4C E3 tay ; CPU:$E3E1 PRG:23E1 A8 lda $E24C,y ; CPU:$E3E2 PRG:23E2 B9 4C E2 sta $1D ; CPU:$E3E5 PRG:23E5 85 1D lda $E298,y ; CPU:$E3E7 PRG:23E7 B9 98 E2 sta $1E ; CPU:$E3EA PRG:23EA 85 1E lda $BD,x ; CPU:$E3EC PRG:23EC B5 BD beq RenderObjectSprites_Load ; CPU:$E3EE PRG:23EE F0 37 ldy $88,x ; CPU:$E3F0 PRG:23F0 B4 88 lda $E34F,y ; CPU:$E3F2 PRG:23F2 B9 4F E3 adc $0436,x ; CPU:$E3F5 PRG:23F5 7D 36 04 tay ; CPU:$E3F8 PRG:23F8 A8 lda $E2E4,y ; CPU:$E3F9 PRG:23F9 B9 E4 E2 sta $1D ; CPU:$E3FC PRG:23FC 85 1D lda $E2EC,y ; CPU:$E3FE PRG:23FE B9 EC E2 sta $1E ; CPU:$E401 PRG:2401 85 1E jmp RenderObjectSprites_Load ; CPU:$E403 PRG:2403 4C 29 E4 RenderObjectSprites_Block_4: ldy $88,x ; CPU:$E406 PRG:2406 B4 88 clc ; CPU:$E408 PRG:2408 18 adc $E352,y ; CPU:$E409 PRG:2409 79 52 E3 tay ; CPU:$E40C PRG:240C A8 lda $E2F4,y ; CPU:$E40D PRG:240D B9 F4 E2 sta $1D ; CPU:$E410 PRG:2410 85 1D lda $E320,y ; CPU:$E412 PRG:2412 B9 20 E3 sta $1E ; CPU:$E415 PRG:2415 85 1E bne RenderObjectSprites_Load ; CPU:$E417 PRG:2417 D0 0E RenderObjectSprites_Block_5: ldy $7F,x ; CPU:$E419 PRG:2419 B4 7F bmi RenderObjectSprites_Block_1 ; CPU:$E41B PRG:241B 30 A3 lda $E384,y ; CPU:$E41D PRG:241D B9 84 E3 sta $1D ; CPU:$E420 PRG:2420 85 1D lda $E38B,y ; CPU:$E422 PRG:2422 B9 8B E3 sta $1E ; CPU:$E425 PRG:2425 85 1E RenderObjectSprites_Load: lda $91,x ; CPU:$E427 PRG:2427 B5 91 sta $15 ; CPU:$E429 PRG:2429 85 15 lda $9A,x ; CPU:$E42B PRG:242B B5 9A sta $12 ; CPU:$E42D PRG:242D 85 12 txa ; CPU:$E42F PRG:242F 8A beq RenderObjectSprites_Block_7 ; CPU:$E430 PRG:2430 F0 10 cpx #$01 ; CPU:$E432 PRG:2432 E0 01 bne RenderObjectSprites_Block_6 ; CPU:$E434 PRG:2434 D0 04 lda #$01 ; CPU:$E436 PRG:2436 A9 01 bne RenderObjectSprites_Block_7 ; CPU:$E438 PRG:2438 D0 08 RenderObjectSprites_Block_6: lda $0451,x ; CPU:$E43A PRG:243A BD 51 04 clc ; CPU:$E43D PRG:243D 18 adc #$02 ; CPU:$E43E PRG:243E 69 02 and #$03 ; CPU:$E440 PRG:2440 29 03 RenderObjectSprites_Block_7: ldy $0448,x ; CPU:$E442 PRG:2442 BC 48 04 beq RenderObjectSprites_Block_8 ; CPU:$E445 PRG:2445 F0 02 ora #$40 ; CPU:$E447 PRG:2447 09 40 RenderObjectSprites_Block_8: ldy $88,x ; CPU:$E449 PRG:2449 B4 88 cpy #$02 ; CPU:$E44B PRG:244B C0 02 bne RenderObjectSprites_Block_9 ; CPU:$E44D PRG:244D D0 08 ldy $7F,x ; CPU:$E44F PRG:244F B4 7F cpy #$05 ; CPU:$E451 PRG:2451 C0 05 bne RenderObjectSprites_Block_9 ; CPU:$E453 PRG:2453 D0 02 eor #$40 ; CPU:$E455 PRG:2455 49 40 RenderObjectSprites_Block_9: ldy $9A,x ; CPU:$E457 PRG:2457 B4 9A cpy #$C9 ; CPU:$E459 PRG:2459 C0 C9 bcs RenderObjectSprites_Block_10 ; CPU:$E45B PRG:245B B0 04 cpx #$09 ; CPU:$E45D PRG:245D E0 09 bne RenderObjectSprites_Block_11 ; CPU:$E45F PRG:245F D0 02 RenderObjectSprites_Block_10: ora #$20 ; CPU:$E461 PRG:2461 09 20 RenderObjectSprites_Block_11: sta $14 ; CPU:$E463 PRG:2463 85 14 lda #$43 ; CPU:$E465 PRG:2465 A9 43 sta $21 ; CPU:$E467 PRG:2467 85 21 lda #$E0 ; CPU:$E469 PRG:2469 A9 E0 sta $22 ; CPU:$E46B PRG:246B 85 22 lda $0448,x ; CPU:$E46D PRG:246D BD 48 04 beq RenderObjectSprites_Block_12 ; CPU:$E470 PRG:2470 F0 08 lda #$79 ; CPU:$E472 PRG:2472 A9 79 sta $21 ; CPU:$E474 PRG:2474 85 21 lda #$E0 ; CPU:$E476 PRG:2476 A9 E0 sta $22 ; CPU:$E478 PRG:2478 85 22 RenderObjectSprites_Block_12: ldy #$00 ; CPU:$E47A PRG:247A A0 00 lda ($1D),y ; CPU:$E47C PRG:247C B1 1D inc $1D ; CPU:$E47E PRG:247E E6 1D bne RenderObjectSprites_Block_13 ; CPU:$E480 PRG:2480 D0 02 inc $1E ; CPU:$E482 PRG:2482 E6 1E RenderObjectSprites_Block_13: asl a ; CPU:$E484 PRG:2484 0A sta $13 ; CPU:$E485 PRG:2485 85 13 asl a ; CPU:$E487 PRG:2487 0A adc $13 ; CPU:$E488 PRG:2488 65 13 adc $21 ; CPU:$E48A PRG:248A 65 21 sta $21 ; CPU:$E48C PRG:248C 85 21 bcc RenderObjectSprites_Block_14 ; CPU:$E48E PRG:248E 90 02 inc $22 ; CPU:$E490 PRG:2490 E6 22 RenderObjectSprites_Block_14: txa ; CPU:$E492 PRG:2492 8A pha ; CPU:$E493 PRG:2493 48 ldx #$05 ; CPU:$E494 PRG:2494 A2 05 ldy #$00 ; CPU:$E496 PRG:2496 A0 00 RenderObjectSprites_Block_15: lda $12 ; CPU:$E498 PRG:2498 A5 12 clc ; CPU:$E49A PRG:249A 18 adc $E03D,x ; CPU:$E49B PRG:249B 7D 3D E0 sta ($1F),y ; CPU:$E49E PRG:249E 91 1F sta $12 ; CPU:$E4A0 PRG:24A0 85 12 iny ; CPU:$E4A2 PRG:24A2 C8 sty $13 ; CPU:$E4A3 PRG:24A3 84 13 ldy #$00 ; CPU:$E4A5 PRG:24A5 A0 00 lda ($1D),y ; CPU:$E4A7 PRG:24A7 B1 1D inc $1D ; CPU:$E4A9 PRG:24A9 E6 1D bne RenderObjectSprites_Block_16 ; CPU:$E4AB PRG:24AB D0 02 inc $1E ; CPU:$E4AD PRG:24AD E6 1E RenderObjectSprites_Block_16: ldy $13 ; CPU:$E4AF PRG:24AF A4 13 sta ($1F),y ; CPU:$E4B1 PRG:24B1 91 1F iny ; CPU:$E4B3 PRG:24B3 C8 lda $14 ; CPU:$E4B4 PRG:24B4 A5 14 sta ($1F),y ; CPU:$E4B6 PRG:24B6 91 1F iny ; CPU:$E4B8 PRG:24B8 C8 sty $13 ; CPU:$E4B9 PRG:24B9 84 13 ldy #$00 ; CPU:$E4BB PRG:24BB A0 00 lda $15 ; CPU:$E4BD PRG:24BD A5 15 clc ; CPU:$E4BF PRG:24BF 18 adc ($21),y ; CPU:$E4C0 PRG:24C0 71 21 inc $21 ; CPU:$E4C2 PRG:24C2 E6 21 bne RenderObjectSprites_Block_17 ; CPU:$E4C4 PRG:24C4 D0 02 inc $22 ; CPU:$E4C6 PRG:24C6 E6 22 RenderObjectSprites_Block_17: ldy $13 ; CPU:$E4C8 PRG:24C8 A4 13 sta ($1F),y ; CPU:$E4CA PRG:24CA 91 1F iny ; CPU:$E4CC PRG:24CC C8 dex ; CPU:$E4CD PRG:24CD CA bpl RenderObjectSprites_Block_15 ; CPU:$E4CE PRG:24CE 10 C8 pla ; CPU:$E4D0 PRG:24D0 68 tax ; CPU:$E4D1 PRG:24D1 AA rts ; CPU:$E4D2 PRG:24D2 60 ; RenderLargeObjectSprites ; Purpose: emit a fixed multi-sprite object and update animation/expiry state. ; Inputs: X = object slot; $1F selects the OAM destination. ; Returns: OAM entries updated; X restored; expired objects disabled. RenderLargeObjectSprites: txa ; CPU:$E4D3 PRG:24D3 8A pha ; CPU:$E4D4 PRG:24D4 48 ldy $1F ; CPU:$E4D5 PRG:24D5 A4 1F lda $9A,x ; CPU:$E4D7 PRG:24D7 B5 9A sta $0200,y ; CPU:$E4D9 PRG:24D9 99 00 02 sta $0204,y ; CPU:$E4DC PRG:24DC 99 04 02 clc ; CPU:$E4DF PRG:24DF 18 adc #$08 ; CPU:$E4E0 PRG:24E0 69 08 sta $0208,y ; CPU:$E4E2 PRG:24E2 99 08 02 sta $020C,y ; CPU:$E4E5 PRG:24E5 99 0C 02 lda #$F0 ; CPU:$E4E8 PRG:24E8 A9 F0 sta $0210,y ; CPU:$E4EA PRG:24EA 99 10 02 sta $0214,y ; CPU:$E4ED PRG:24ED 99 14 02 lda $91,x ; CPU:$E4F0 PRG:24F0 B5 91 sta $0203,y ; CPU:$E4F2 PRG:24F2 99 03 02 sta $020B,y ; CPU:$E4F5 PRG:24F5 99 0B 02 clc ; CPU:$E4F8 PRG:24F8 18 adc #$08 ; CPU:$E4F9 PRG:24F9 69 08 sta $0207,y ; CPU:$E4FB PRG:24FB 99 07 02 sta $020F,y ; CPU:$E4FE PRG:24FE 99 0F 02 lda $9A,x ; CPU:$E501 PRG:2501 B5 9A cmp #$D0 ; CPU:$E503 PRG:2503 C9 D0 lda #$03 ; CPU:$E505 PRG:2505 A9 03 bcc RenderLargeObjectSprites_Block ; CPU:$E507 PRG:2507 90 02 lda #$23 ; CPU:$E509 PRG:2509 A9 23 RenderLargeObjectSprites_Block: sta $0202,y ; CPU:$E50B PRG:250B 99 02 02 lda $7F,x ; CPU:$E50E PRG:250E B5 7F bne RenderLargeObjectSprites_Block_3 ; CPU:$E510 PRG:2510 D0 3F lda $0202,y ; CPU:$E512 PRG:2512 B9 02 02 sta $0206,y ; CPU:$E515 PRG:2515 99 06 02 sta $020A,y ; CPU:$E518 PRG:2518 99 0A 02 sta $020E,y ; CPU:$E51B PRG:251B 99 0E 02 lda #$DA ; CPU:$E51E PRG:251E A9 DA sta $0201,y ; CPU:$E520 PRG:2520 99 01 02 lda #$DB ; CPU:$E523 PRG:2523 A9 DB sta $0205,y ; CPU:$E525 PRG:2525 99 05 02 lda #$DC ; CPU:$E528 PRG:2528 A9 DC sta $0209,y ; CPU:$E52A PRG:252A 99 09 02 lda #$DD ; CPU:$E52D PRG:252D A9 DD sta $020D,y ; CPU:$E52F PRG:252F 99 0D 02 ldx $1F ; CPU:$E532 PRG:2532 A6 1F lda $19 ; CPU:$E534 PRG:2534 A5 19 and #$20 ; CPU:$E536 PRG:2536 29 20 beq RenderLargeObjectSprites_Block_2 ; CPU:$E538 PRG:2538 F0 14 lda $19 ; CPU:$E53A PRG:253A A5 19 and #$40 ; CPU:$E53C PRG:253C 29 40 bne RenderLargeObjectSprites_Block_1 ; CPU:$E53E PRG:253E D0 08 inc $0200,x ; CPU:$E540 PRG:2540 FE 00 02 inc $0204,x ; CPU:$E543 PRG:2543 FE 04 02 bne RenderLargeObjectSprites_Block_2 ; CPU:$E546 PRG:2546 D0 06 RenderLargeObjectSprites_Block_1: inc $0203,x ; CPU:$E548 PRG:2548 FE 03 02 inc $020B,x ; CPU:$E54B PRG:254B FE 0B 02 RenderLargeObjectSprites_Block_2: pla ; CPU:$E54E PRG:254E 68 tax ; CPU:$E54F PRG:254F AA rts ; CPU:$E550 PRG:2550 60 RenderLargeObjectSprites_Block_3: lda $0202,y ; CPU:$E551 PRG:2551 B9 02 02 ora #$40 ; CPU:$E554 PRG:2554 09 40 sta $0206,y ; CPU:$E556 PRG:2556 99 06 02 ora #$80 ; CPU:$E559 PRG:2559 09 80 sta $020E,y ; CPU:$E55B PRG:255B 99 0E 02 and #$BF ; CPU:$E55E PRG:255E 29 BF sta $020A,y ; CPU:$E560 PRG:2560 99 0A 02 lda #$DE ; CPU:$E563 PRG:2563 A9 DE sta $0201,y ; CPU:$E565 PRG:2565 99 01 02 sta $0205,y ; CPU:$E568 PRG:2568 99 05 02 sta $0209,y ; CPU:$E56B PRG:256B 99 09 02 sta $020D,y ; CPU:$E56E PRG:256E 99 0D 02 dec $045A,x ; CPU:$E571 PRG:2571 DE 5A 04 bpl RenderLargeObjectSprites_Block_4 ; CPU:$E574 PRG:2574 10 0C lda #$FF ; CPU:$E576 PRG:2576 A9 FF sta $88,x ; CPU:$E578 PRG:2578 95 88 lda #$F0 ; CPU:$E57A PRG:257A A9 F0 sta $9A,x ; CPU:$E57C PRG:257C 95 9A lda #$04 ; CPU:$E57E PRG:257E A9 04 sta $F1 ; CPU:$E580 PRG:2580 85 F1 RenderLargeObjectSprites_Block_4: pla ; CPU:$E582 PRG:2582 68 tax ; CPU:$E583 PRG:2583 AA rts ; CPU:$E584 PRG:2584 60 ; CopyOverlaySpriteStream ; Purpose: copy a selected 16-byte overlay sprite stream into OAM and apply Y offset. ; Inputs: $BB = stream index, $BC = vertical offset. ; Returns: overlay OAM region updated; may decrement $BB. CopyOverlaySpriteStream: ldx $BB ; CPU:$E585 PRG:2585 A6 BB bmi CopyOverlaySpriteStream_Block_3 ; CPU:$E587 PRG:2587 30 39 lda OverlaySpriteStreamLoTable,x ; CPU:$E589 PRG:2589 BD C5 E5 sta $1D ; CPU:$E58C PRG:258C 85 1D lda OverlaySpriteStreamHiTable,x ; CPU:$E58E PRG:258E BD CA E5 sta $1E ; CPU:$E591 PRG:2591 85 1E ldy #$00 ; CPU:$E593 PRG:2593 A0 00 ldx #$00 ; CPU:$E595 PRG:2595 A2 00 CopyOverlaySpriteStream_Block: lda ($1D),y ; CPU:$E597 PRG:2597 B1 1D sta $02E0,x ; CPU:$E599 PRG:2599 9D E0 02 iny ; CPU:$E59C PRG:259C C8 inx ; CPU:$E59D PRG:259D E8 cmp #$F0 ; CPU:$E59E PRG:259E C9 F0 bne CopyOverlaySpriteStream_Block_1 ; CPU:$E5A0 PRG:25A0 D0 03 inx ; CPU:$E5A2 PRG:25A2 E8 inx ; CPU:$E5A3 PRG:25A3 E8 inx ; CPU:$E5A4 PRG:25A4 E8 CopyOverlaySpriteStream_Block_1: cpx #$10 ; CPU:$E5A5 PRG:25A5 E0 10 bne CopyOverlaySpriteStream_Block ; CPU:$E5A7 PRG:25A7 D0 EE ldy #$0F ; CPU:$E5A9 PRG:25A9 A0 0F CopyOverlaySpriteStream_Block_2: lda $02E0,y ; CPU:$E5AB PRG:25AB B9 E0 02 clc ; CPU:$E5AE PRG:25AE 18 adc $BC ; CPU:$E5AF PRG:25AF 65 BC sta $02E0,y ; CPU:$E5B1 PRG:25B1 99 E0 02 dey ; CPU:$E5B4 PRG:25B4 88 dey ; CPU:$E5B5 PRG:25B5 88 dey ; CPU:$E5B6 PRG:25B6 88 dey ; CPU:$E5B7 PRG:25B7 88 bpl CopyOverlaySpriteStream_Block_2 ; CPU:$E5B8 PRG:25B8 10 F1 lda $19 ; CPU:$E5BA PRG:25BA A5 19 and #$03 ; CPU:$E5BC PRG:25BC 29 03 bne CopyOverlaySpriteStream_Block_3 ; CPU:$E5BE PRG:25BE D0 02 dec $BB ; CPU:$E5C0 PRG:25C0 C6 BB CopyOverlaySpriteStream_Block_3: rts ; CPU:$E5C2 PRG:25C2 60 ; Rendering streams and object motion/physics lookup data OverlaySpriteStreamLoTable: .byte $FD, $ED, $E0, $D6, $CF ; CPU:$E5C3 PRG:25C3 FD ED E0 D6 CF OverlaySpriteStreamHiTable: .byte $E5, $E5, $E5, $E5, $E5, $D0, $AE, $03 ; CPU:$E5C8 PRG:25C8 E5 E5 E5 E5 E5 D0 AE 03 .byte $04, $F0, $F0, $F0, $C8, $AF, $03, $04 ; CPU:$E5D0 PRG:25D0 04 F0 F0 F0 C8 AF 03 04 .byte $D0, $B0, $03, $04, $F0, $F0, $C8, $B1 ; CPU:$E5D8 PRG:25D8 D0 B0 03 04 F0 F0 C8 B1 .byte $03, $FC, $C8, $B2, $03, $04, $D0, $B3 ; CPU:$E5E0 PRG:25E0 03 FC C8 B2 03 04 D0 B3 .byte $03, $04, $F0, $C8, $B4, $03, $00, $C8 ; CPU:$E5E8 PRG:25E8 03 04 F0 C8 B4 03 00 C8 .byte $B4, $43, $08, $D0, $B5, $03, $00, $D0 ; CPU:$E5F0 PRG:25F0 B4 43 08 D0 B5 03 00 D0 .byte $B5, $43, $08, $F0, $F0, $F0, $F0 ; CPU:$E5F8 PRG:25F8 B5 43 08 F0 F0 F0 F0 ObjectAccelerationTableA: .byte $04, $04, $05, $06, $03, $03, $03, $06 ; CPU:$E5FF PRG:25FF 04 04 05 06 03 03 03 06 .byte $0A, $0A, $0A, $0A ; CPU:$E607 PRG:2607 0A 0A 0A 0A ObjectAccelerationTableB: .byte $28, $32, $46, $78, $00, $00, $00, $64 ; CPU:$E60B PRG:260B 28 32 46 78 00 00 00 64 .byte $00, $00, $00, $00 ; CPU:$E613 PRG:2613 00 00 00 00 ObjectVelocityTableA: .byte $0A, $1E, $32, $70, $00, $00, $00, $70 ; CPU:$E617 PRG:2617 0A 1E 32 70 00 00 00 70 .byte $00, $00, $00, $00 ; CPU:$E61F PRG:261F 00 00 00 00 ObjectVelocityTableB: .byte $14, $3C, $64, $A0, $00, $00, $00, $A0 ; CPU:$E623 PRG:2623 14 3C 64 A0 00 00 00 A0 .byte $00, $00, $00, $00 ; CPU:$E62B PRG:262B 00 00 00 00 ObjectVelocityTableC: .byte $70, $B0, $E0, $40, $80, $80, $80, $40 ; CPU:$E62F PRG:262F 70 B0 E0 40 80 80 80 40 .byte $00, $00, $00, $00 ; CPU:$E637 PRG:2637 00 00 00 00 ObjectVelocityTableD: .byte $00, $00, $00, $01, $00, $00, $00, $01 ; CPU:$E63B PRG:263B 00 00 00 01 00 00 00 01 .byte $00, $00, $00, $00 ; CPU:$E643 PRG:2643 00 00 00 00 ObjectVelocityTableE: .byte $90, $50, $20, $C0, $80, $80, $80, $C0 ; CPU:$E647 PRG:2647 90 50 20 C0 80 80 80 C0 .byte $00, $00, $00, $00 ; CPU:$E64F PRG:264F 00 00 00 00 ObjectVelocityTableF: .byte $FF, $FF, $FF, $FE, $FF, $FF, $FF, $FE ; CPU:$E653 PRG:2653 FF FF FF FE FF FF FF FE .byte $00, $00, $00, $00 ; CPU:$E65B PRG:265B 00 00 00 00 ObjectMotionTableA: .byte $50, $90, $C0, $40, $40, $40, $40, $40 ; CPU:$E65F PRG:265F 50 90 C0 40 40 40 40 40 .byte $00, $00, $00, $00 ; CPU:$E667 PRG:2667 00 00 00 00 ObjectMotionTableB: .byte $00, $00, $00, $01, $00, $00, $00, $01 ; CPU:$E66B PRG:266B 00 00 00 01 00 00 00 01 .byte $02, $02, $02, $02 ; CPU:$E673 PRG:2673 02 02 02 02 ObjectMotionTableC: .byte $B0, $70, $40, $C0, $C0, $C0, $C0, $C0 ; CPU:$E677 PRG:2677 B0 70 40 C0 C0 C0 C0 C0 .byte $C0, $C0, $C0, $C0 ; CPU:$E67F PRG:267F C0 C0 C0 C0 ObjectMotionTableD: .byte $FF, $FF, $FF, $FE, $FF, $FF, $FF, $FE ; CPU:$E683 PRG:2683 FF FF FF FE FF FF FF FE .byte $FE, $01, $FE, $FE ; CPU:$E68B PRG:268B FE 01 FE FE ; UpdateAllObjects ; Purpose: update active object slots, physics, interactions, and sprite rendering. ; Inputs: global object arrays; no explicit register parameters. ; Returns: all active objects processed; X exhausted to $FF. UpdateAllObjects: jsr $EE25 ; CPU:$E68F PRG:268F 20 25 EE ldx #$07 ; CPU:$E692 PRG:2692 A2 07 UpdateAllObjects_Block: lda $88,x ; CPU:$E694 PRG:2694 B5 88 bpl UpdateAllObjects_Block_1 ; CPU:$E696 PRG:2696 10 0A cmp #$FF ; CPU:$E698 PRG:2698 C9 FF beq UpdateAllObjects_Block_5 ; CPU:$E69A PRG:269A F0 44 jsr $ECBA ; CPU:$E69C PRG:269C 20 BA EC jmp UpdateAllObjects_Block_5 ; CPU:$E69F PRG:269F 4C E2 E6 UpdateAllObjects_Block_1: cpx #$02 ; CPU:$E6A2 PRG:26A2 E0 02 bcc UpdateAllObjects_Block_2 ; CPU:$E6A4 PRG:26A4 90 10 cmp #$01 ; CPU:$E6A6 PRG:26A6 C9 01 bne UpdateAllObjects_Block_2 ; CPU:$E6A8 PRG:26A8 D0 0C lda $7F,x ; CPU:$E6AA PRG:26AA B5 7F cmp #$02 ; CPU:$E6AC PRG:26AC C9 02 bcs UpdateAllObjects_Block_2 ; CPU:$E6AE PRG:26AE B0 06 lda $F1 ; CPU:$E6B0 PRG:26B0 A5 F1 ora #$20 ; CPU:$E6B2 PRG:26B2 09 20 sta $F1 ; CPU:$E6B4 PRG:26B4 85 F1 UpdateAllObjects_Block_2: dec $043F,x ; CPU:$E6B6 PRG:26B6 DE 3F 04 bne UpdateAllObjects_Block_4 ; CPU:$E6B9 PRG:26B9 D0 1C lda #$03 ; CPU:$E6BB PRG:26BB A9 03 sta $043F,x ; CPU:$E6BD PRG:26BD 9D 3F 04 cpx #$02 ; CPU:$E6C0 PRG:26C0 E0 02 bcs UpdateAllObjects_Block_3 ; CPU:$E6C2 PRG:26C2 B0 08 dec $BF,x ; CPU:$E6C4 PRG:26C4 D6 BF bne UpdateAllObjects_Block_3 ; CPU:$E6C6 PRG:26C6 D0 04 lda #$00 ; CPU:$E6C8 PRG:26C8 A9 00 sta $BD,x ; CPU:$E6CA PRG:26CA 95 BD UpdateAllObjects_Block_3: jsr $EA18 ; CPU:$E6CC PRG:26CC 20 18 EA stx $3E ; CPU:$E6CF PRG:26CF 86 3E jsr $EBC4 ; CPU:$E6D1 PRG:26D1 20 C4 EB jsr $E796 ; CPU:$E6D4 PRG:26D4 20 96 E7 UpdateAllObjects_Block_4: jsr $EA58 ; CPU:$E6D7 PRG:26D7 20 58 EA jsr $ED28 ; CPU:$E6DA PRG:26DA 20 28 ED jsr $E983 ; CPU:$E6DD PRG:26DD 20 83 E9 UpdateAllObjects_Block_5: jsr $E3A4 ; CPU:$E6E0 PRG:26E0 20 A4 E3 dex ; CPU:$E6E3 PRG:26E3 CA bpl UpdateAllObjects_Block ; CPU:$E6E4 PRG:26E4 10 AE rts ; CPU:$E6E6 PRG:26E6 60 ; UpdatePlayerInputState ; Purpose: update per-player directional input and animation timing state. ; Inputs: X = player object slot. ; Returns: direction/state byte $31,X updated. UpdatePlayerInputState: cpx #$02 ; CPU:$E6E7 PRG:26E7 E0 02 bcs UpdatePlayerInputState_Block_2 ; CPU:$E6E9 PRG:26E9 B0 18 lda $19 ; CPU:$E6EB PRG:26EB A5 19 and #$0F ; CPU:$E6ED PRG:26ED 29 0F bne UpdatePlayerInputState_Block ; CPU:$E6EF PRG:26EF D0 05 jsr $F1B3 ; CPU:$E6F1 PRG:26F1 20 B3 F1 sta $31,x ; CPU:$E6F4 PRG:26F4 95 31 UpdatePlayerInputState_Block: lda $3A ; CPU:$E6F6 PRG:26F6 A5 3A bne UpdatePlayerInputState_Block_2 ; CPU:$E6F8 PRG:26F8 D0 09 jsr $E76A ; CPU:$E6FA PRG:26FA 20 6A E7 lda $061C,x ; CPU:$E6FD PRG:26FD BD 1C 06 sta $31,x ; CPU:$E700 PRG:2700 95 31 UpdatePlayerInputState_Block_1: rts ; CPU:$E702 PRG:2702 60 UpdatePlayerInputState_Block_2: lda $9A,x ; CPU:$E703 PRG:2703 B5 9A cmp #$A0 ; CPU:$E705 PRG:2705 C9 A0 bcc UpdatePlayerInputState_Block_3 ; CPU:$E707 PRG:2707 90 07 lda $31,x ; CPU:$E709 PRG:2709 B5 31 ora #$40 ; CPU:$E70B PRG:270B 09 40 sta $31,x ; CPU:$E70D PRG:270D 95 31 rts ; CPU:$E70F PRG:270F 60 UpdatePlayerInputState_Block_3: dec $045A,x ; CPU:$E710 PRG:2710 DE 5A 04 bne UpdatePlayerInputState_Block_1 ; CPU:$E713 PRG:2713 D0 ED jsr $F1B3 ; CPU:$E715 PRG:2715 20 B3 F1 ldy $0451,x ; CPU:$E718 PRG:2718 BC 51 04 and ObjectAnimationPeriodTable,y ; CPU:$E71B PRG:271B 39 62 E7 adc ControllerBitMaskTable,y ; CPU:$E71E PRG:271E 79 65 E7 sta $045A,x ; CPU:$E721 PRG:2721 9D 5A 04 stx $12 ; CPU:$E724 PRG:2724 86 12 lda $19 ; CPU:$E726 PRG:2726 A5 19 rol a ; CPU:$E728 PRG:2728 2A rol a ; CPU:$E729 PRG:2729 2A eor $12 ; CPU:$E72A PRG:272A 45 12 and #$01 ; CPU:$E72C PRG:272C 29 01 tay ; CPU:$E72E PRG:272E A8 lda a:$0088,y ; CPU:$E72F PRG:272F B9 88 00 bmi UpdatePlayerInputState_Block_4 ; CPU:$E732 PRG:2732 30 13 lda a:$00BD,y ; CPU:$E734 PRG:2734 B9 BD 00 bne UpdatePlayerInputState_Block_4 ; CPU:$E737 PRG:2737 D0 0E lda #$00 ; CPU:$E739 PRG:2739 A9 00 sta $31,x ; CPU:$E73B PRG:273B 95 31 lda a:$009A,y ; CPU:$E73D PRG:273D B9 9A 00 sec ; CPU:$E740 PRG:2740 38 sbc #$04 ; CPU:$E741 PRG:2741 E9 04 cmp $9A,x ; CPU:$E743 PRG:2743 D5 9A bcs UpdatePlayerInputState_Block_5 ; CPU:$E745 PRG:2745 B0 04 UpdatePlayerInputState_Block_4: lda #$40 ; CPU:$E747 PRG:2747 A9 40 sta $31,x ; CPU:$E749 PRG:2749 95 31 UpdatePlayerInputState_Block_5: lda $91,x ; CPU:$E74B PRG:274B B5 91 cmp a:$0091,y ; CPU:$E74D PRG:274D D9 91 00 bcs UpdatePlayerInputState_Block_6 ; CPU:$E750 PRG:2750 B0 07 lda $31,x ; CPU:$E752 PRG:2752 B5 31 ora #$01 ; CPU:$E754 PRG:2754 09 01 sta $31,x ; CPU:$E756 PRG:2756 95 31 rts ; CPU:$E758 PRG:2758 60 UpdatePlayerInputState_Block_6: lda $31,x ; CPU:$E759 PRG:2759 B5 31 ora #$02 ; CPU:$E75B PRG:275B 09 02 sta $31,x ; CPU:$E75D PRG:275D 95 31 rts ; CPU:$E75F PRG:275F 60 ; Per-object animation timer masks selected by object type/state. ObjectAnimationPeriodTable: .byte $1F, $0F, $07 ; CPU:$E760 PRG:2760 1F 0F 07 ; Base timer periods paired with ObjectAnimationPeriodTable. ObjectAnimationBasePeriodTable: ControllerBitMaskTable: .byte $20, $10, $08 ; CPU:$E763 PRG:2763 20 10 08 ; PollControllers ; Purpose: strobe both NES controller ports and update current/pressed input bytes. ; Inputs: none. ; Returns: controller history at $061C-$061F updated; A/X/Y modified. PollControllers: ldx #$00 ; CPU:$E766 PRG:2766 A2 00 ReadControllerPort: lda #$01 ; CPU:$E768 PRG:2768 A9 01 sta $4016 ; CPU:$E76A PRG:276A 8D 16 40 lda #$00 ; CPU:$E76D PRG:276D A9 00 sta $4016 ; CPU:$E76F PRG:276F 8D 16 40 ldy #$07 ; CPU:$E772 PRG:2772 A0 07 ReadControllerPort_Block: lda $4016,x ; CPU:$E774 PRG:2774 BD 16 40 sta $12 ; CPU:$E777 PRG:2777 85 12 lsr a ; CPU:$E779 PRG:2779 4A ora $12 ; CPU:$E77A PRG:277A 05 12 lsr a ; CPU:$E77C PRG:277C 4A rol $061C,x ; CPU:$E77D PRG:277D 3E 1C 06 dey ; CPU:$E780 PRG:2780 88 bpl ReadControllerPort_Block ; CPU:$E781 PRG:2781 10 F1 ldy $061E,x ; CPU:$E783 PRG:2783 BC 1E 06 lda $061C,x ; CPU:$E786 PRG:2786 BD 1C 06 sta $061E,x ; CPU:$E789 PRG:2789 9D 1E 06 tya ; CPU:$E78C PRG:278C 98 eor $061C,x ; CPU:$E78D PRG:278D 5D 1C 06 and $061C,x ; CPU:$E790 PRG:2790 3D 1C 06 rts ; CPU:$E793 PRG:2793 60 ; UpdateObjectMotionState ; Purpose: clear motion accumulators for inactive objects and integrate active-object velocity. ; Inputs: X = object slot. ; Returns: per-object fixed-point motion values updated. UpdateObjectMotionState: lda $88,x ; CPU:$E794 PRG:2794 B5 88 bne UpdateObjectMotionState_Block_1 ; CPU:$E796 PRG:2796 D0 09 UpdateObjectMotionState_Block: lda #$00 ; CPU:$E798 PRG:2798 A9 00 sta $0424,x ; CPU:$E79A PRG:279A 9D 24 04 sta $042D,x ; CPU:$E79D PRG:279D 9D 2D 04 rts ; CPU:$E7A0 PRG:27A0 60 UpdateObjectMotionState_Block_1: cmp #$02 ; CPU:$E7A1 PRG:27A1 C9 02 beq UpdateObjectVelocity_Block ; CPU:$E7A3 PRG:27A3 F0 41 cpx #$02 ; CPU:$E7A5 PRG:27A5 E0 02 bcc UpdateObjectVelocity_Block ; CPU:$E7A7 PRG:27A7 90 3D lda $7F,x ; CPU:$E7A9 PRG:27A9 B5 7F cmp #$02 ; CPU:$E7AB PRG:27AB C9 02 bcs UpdateObjectMotionState_Block ; CPU:$E7AD PRG:27AD B0 E9 ; UpdateObjectVelocity ; Purpose: select movement state and adjust horizontal velocity from directional state. ; Inputs: X = object slot. ; Returns: state $7F,X, facing $0448,X, and velocity $0424/$042D updated. UpdateObjectVelocity: lda $0424,x ; CPU:$E7AF PRG:27AF BD 24 04 sta $12 ; CPU:$E7B2 PRG:27B2 85 12 lda $042D,x ; CPU:$E7B4 PRG:27B4 BD 2D 04 sta $13 ; CPU:$E7B7 PRG:27B7 85 13 jsr $F1A6 ; CPU:$E7B9 PRG:27B9 20 A6 F1 lda $0463,x ; CPU:$E7BC PRG:27BC BD 63 04 clc ; CPU:$E7BF PRG:27BF 18 adc $12 ; CPU:$E7C0 PRG:27C0 65 12 sta $0463,x ; CPU:$E7C2 PRG:27C2 9D 63 04 sta $12 ; CPU:$E7C5 PRG:27C5 85 12 lda $046C,x ; CPU:$E7C7 PRG:27C7 BD 6C 04 adc $13 ; CPU:$E7CA PRG:27CA 65 13 sta $046C,x ; CPU:$E7CC PRG:27CC 9D 6C 04 sta $13 ; CPU:$E7CF PRG:27CF 85 13 jsr $F1A6 ; CPU:$E7D1 PRG:27D1 20 A6 F1 lda $0424,x ; CPU:$E7D4 PRG:27D4 BD 24 04 sec ; CPU:$E7D7 PRG:27D7 38 sbc $12 ; CPU:$E7D8 PRG:27D8 E5 12 sta $0424,x ; CPU:$E7DA PRG:27DA 9D 24 04 lda $042D,x ; CPU:$E7DD PRG:27DD BD 2D 04 sbc $13 ; CPU:$E7E0 PRG:27E0 E5 13 sta $042D,x ; CPU:$E7E2 PRG:27E2 9D 2D 04 rts ; CPU:$E7E5 PRG:27E5 60 UpdateObjectVelocity_Block: lda $7F,x ; CPU:$E7E6 PRG:27E6 B5 7F cmp #$06 ; CPU:$E7E8 PRG:27E8 C9 06 bcc UpdateObjectVelocity_Block_1 ; CPU:$E7EA PRG:27EA 90 01 rts ; CPU:$E7EC PRG:27EC 60 UpdateObjectVelocity_Block_1: lda $7F,x ; CPU:$E7ED PRG:27ED B5 7F cmp #$04 ; CPU:$E7EF PRG:27EF C9 04 bne UpdateObjectVelocity_Block_4 ; CPU:$E7F1 PRG:27F1 D0 1C lda $31,x ; CPU:$E7F3 PRG:27F3 B5 31 and #$02 ; CPU:$E7F5 PRG:27F5 29 02 beq UpdateObjectVelocity_Block_2 ; CPU:$E7F7 PRG:27F7 F0 07 lda $0448,x ; CPU:$E7F9 PRG:27F9 BD 48 04 beq UpdateObjectVelocity_Block_4 ; CPU:$E7FC PRG:27FC F0 11 bne UpdateObjectVelocity_Block_3 ; CPU:$E7FE PRG:27FE D0 0B UpdateObjectVelocity_Block_2: lda $31,x ; CPU:$E800 PRG:2800 B5 31 and #$01 ; CPU:$E802 PRG:2802 29 01 beq UpdateObjectVelocity_Block_4 ; CPU:$E804 PRG:2804 F0 09 lda $0448,x ; CPU:$E806 PRG:2806 BD 48 04 bne UpdateObjectVelocity_Block_4 ; CPU:$E809 PRG:2809 D0 04 UpdateObjectVelocity_Block_3: lda #$05 ; CPU:$E80B PRG:280B A9 05 sta $7F,x ; CPU:$E80D PRG:280D 95 7F UpdateObjectVelocity_Block_4: lda $7F,x ; CPU:$E80F PRG:280F B5 7F cmp #$02 ; CPU:$E811 PRG:2811 C9 02 bne UpdateObjectVelocity_Block_8 ; CPU:$E813 PRG:2813 D0 1B lda $31,x ; CPU:$E815 PRG:2815 B5 31 and #$02 ; CPU:$E817 PRG:2817 29 02 beq UpdateObjectVelocity_Block_5 ; CPU:$E819 PRG:2819 F0 04 lda #$00 ; CPU:$E81B PRG:281B A9 00 beq UpdateObjectVelocity_Block_6 ; CPU:$E81D PRG:281D F0 08 UpdateObjectVelocity_Block_5: lda $31,x ; CPU:$E81F PRG:281F B5 31 and #$01 ; CPU:$E821 PRG:2821 29 01 beq UpdateObjectVelocity_Block_7 ; CPU:$E823 PRG:2823 F0 07 lda #$01 ; CPU:$E825 PRG:2825 A9 01 UpdateObjectVelocity_Block_6: cmp $0448,x ; CPU:$E827 PRG:2827 DD 48 04 beq UpdateObjectVelocity_Block_8 ; CPU:$E82A PRG:282A F0 04 UpdateObjectVelocity_Block_7: lda #$04 ; CPU:$E82C PRG:282C A9 04 sta $7F,x ; CPU:$E82E PRG:282E 95 7F UpdateObjectVelocity_Block_8: lda $7F,x ; CPU:$E830 PRG:2830 B5 7F cmp #$04 ; CPU:$E832 PRG:2832 C9 04 bcc UpdateObjectVelocity_Block_11 ; CPU:$E834 PRG:2834 90 1C lda $31,x ; CPU:$E836 PRG:2836 B5 31 and #$02 ; CPU:$E838 PRG:2838 29 02 beq UpdateObjectVelocity_Block_9 ; CPU:$E83A PRG:283A F0 07 lda $0448,x ; CPU:$E83C PRG:283C BD 48 04 bne UpdateObjectVelocity_Block_11 ; CPU:$E83F PRG:283F D0 11 beq UpdateObjectVelocity_Block_10 ; CPU:$E841 PRG:2841 F0 0B UpdateObjectVelocity_Block_9: lda $31,x ; CPU:$E843 PRG:2843 B5 31 and #$01 ; CPU:$E845 PRG:2845 29 01 beq UpdateObjectVelocity_Block_11 ; CPU:$E847 PRG:2847 F0 09 lda $0448,x ; CPU:$E849 PRG:2849 BD 48 04 beq UpdateObjectVelocity_Block_11 ; CPU:$E84C PRG:284C F0 04 UpdateObjectVelocity_Block_10: lda #$02 ; CPU:$E84E PRG:284E A9 02 sta $7F,x ; CPU:$E850 PRG:2850 95 7F UpdateObjectVelocity_Block_11: lda $7F,x ; CPU:$E852 PRG:2852 B5 7F cmp #$03 ; CPU:$E854 PRG:2854 C9 03 bne UpdateObjectVelocity_Block_12 ; CPU:$E856 PRG:2856 D0 0A lda $31,x ; CPU:$E858 PRG:2858 B5 31 and #$03 ; CPU:$E85A PRG:285A 29 03 beq UpdateObjectVelocity_Block_12 ; CPU:$E85C PRG:285C F0 04 lda #$02 ; CPU:$E85E PRG:285E A9 02 sta $7F,x ; CPU:$E860 PRG:2860 95 7F UpdateObjectVelocity_Block_12: lda $7F,x ; CPU:$E862 PRG:2862 B5 7F cmp #$04 ; CPU:$E864 PRG:2864 C9 04 bcs UpdateObjectVelocity_Block_15 ; CPU:$E866 PRG:2866 B0 15 lda $31,x ; CPU:$E868 PRG:2868 B5 31 and #$02 ; CPU:$E86A PRG:286A 29 02 beq UpdateObjectVelocity_Block_13 ; CPU:$E86C PRG:286C F0 04 lda #$00 ; CPU:$E86E PRG:286E A9 00 beq UpdateObjectVelocity_Block_14 ; CPU:$E870 PRG:2870 F0 08 UpdateObjectVelocity_Block_13: lda $31,x ; CPU:$E872 PRG:2872 B5 31 and #$01 ; CPU:$E874 PRG:2874 29 01 beq UpdateObjectVelocity_Block_15 ; CPU:$E876 PRG:2876 F0 05 lda #$01 ; CPU:$E878 PRG:2878 A9 01 UpdateObjectVelocity_Block_14: sta $0448,x ; CPU:$E87A PRG:287A 9D 48 04 UpdateObjectVelocity_Block_15: lda $7F,x ; CPU:$E87D PRG:287D B5 7F cmp #$04 ; CPU:$E87F PRG:287F C9 04 bcc UpdateObjectVelocity_Block_17 ; CPU:$E881 PRG:2881 90 33 lda $0436,x ; CPU:$E883 PRG:2883 BD 36 04 cmp #$01 ; CPU:$E886 PRG:2886 C9 01 bne UpdateObjectVelocity_Block_17 ; CPU:$E888 PRG:2888 D0 2C ldy $0451,x ; CPU:$E88A PRG:288A BC 51 04 lda $0448,x ; CPU:$E88D PRG:288D BD 48 04 beq UpdateObjectVelocity_Block_16 ; CPU:$E890 PRG:2890 F0 12 lda $0424,x ; CPU:$E892 PRG:2892 BD 24 04 sec ; CPU:$E895 PRG:2895 38 sbc $E625,y ; CPU:$E896 PRG:2896 F9 25 E6 sta $0424,x ; CPU:$E899 PRG:2899 9D 24 04 lda $042D,x ; CPU:$E89C PRG:289C BD 2D 04 sbc #$00 ; CPU:$E89F PRG:289F E9 00 jmp UpdateObjectVelocity_Store ; CPU:$E8A1 PRG:28A1 4C 01 E9 UpdateObjectVelocity_Block_16: lda $0424,x ; CPU:$E8A4 PRG:28A4 BD 24 04 clc ; CPU:$E8A7 PRG:28A7 18 adc $E625,y ; CPU:$E8A8 PRG:28A8 79 25 E6 sta $0424,x ; CPU:$E8AB PRG:28AB 9D 24 04 lda $042D,x ; CPU:$E8AE PRG:28AE BD 2D 04 adc #$00 ; CPU:$E8B1 PRG:28B1 69 00 jmp UpdateObjectVelocity_Store ; CPU:$E8B3 PRG:28B3 4C 01 E9 UpdateObjectVelocity_Block_17: lda $7F,x ; CPU:$E8B6 PRG:28B6 B5 7F beq UpdateObjectVelocity_Block_18 ; CPU:$E8B8 PRG:28B8 F0 0B cmp #$02 ; CPU:$E8BA PRG:28BA C9 02 beq UpdateObjectVelocity_Block_21 ; CPU:$E8BC PRG:28BC F0 47 cmp #$03 ; CPU:$E8BE PRG:28BE C9 03 beq UpdateObjectVelocity_Block_18 ; CPU:$E8C0 PRG:28C0 F0 03 jmp UpdateObjectVelocity_Load ; CPU:$E8C2 PRG:28C2 4C 51 E9 UpdateObjectVelocity_Block_18: lda $0436,x ; CPU:$E8C5 PRG:28C5 BD 36 04 cmp #$01 ; CPU:$E8C8 PRG:28C8 C9 01 beq UpdateObjectVelocity_Block_19 ; CPU:$E8CA PRG:28CA F0 03 jmp UpdateObjectVelocity_Load ; CPU:$E8CC PRG:28CC 4C 51 E9 UpdateObjectVelocity_Block_19: ldy $0451,x ; CPU:$E8CF PRG:28CF BC 51 04 lda $31,x ; CPU:$E8D2 PRG:28D2 B5 31 and #$02 ; CPU:$E8D4 PRG:28D4 29 02 beq UpdateObjectVelocity_Block_20 ; CPU:$E8D6 PRG:28D6 F0 12 lda $0424,x ; CPU:$E8D8 PRG:28D8 BD 24 04 sec ; CPU:$E8DB PRG:28DB 38 sbc $E619,y ; CPU:$E8DC PRG:28DC F9 19 E6 sta $0424,x ; CPU:$E8DF PRG:28DF 9D 24 04 lda $042D,x ; CPU:$E8E2 PRG:28E2 BD 2D 04 sbc #$00 ; CPU:$E8E5 PRG:28E5 E9 00 jmp UpdateObjectVelocity_Store ; CPU:$E8E7 PRG:28E7 4C 01 E9 UpdateObjectVelocity_Block_20: lda $31,x ; CPU:$E8EA PRG:28EA B5 31 and #$01 ; CPU:$E8EC PRG:28EC 29 01 beq UpdateObjectVelocity_Load ; CPU:$E8EE PRG:28EE F0 5F lda $0424,x ; CPU:$E8F0 PRG:28F0 BD 24 04 clc ; CPU:$E8F3 PRG:28F3 18 adc $E619,y ; CPU:$E8F4 PRG:28F4 79 19 E6 sta $0424,x ; CPU:$E8F7 PRG:28F7 9D 24 04 lda $042D,x ; CPU:$E8FA PRG:28FA BD 2D 04 adc #$00 ; CPU:$E8FD PRG:28FD 69 00 UpdateObjectVelocity_Store: sta $042D,x ; CPU:$E8FF PRG:28FF 9D 2D 04 jmp UpdateObjectVelocity_Load ; CPU:$E902 PRG:2902 4C 51 E9 UpdateObjectVelocity_Block_21: lda $0436,x ; CPU:$E905 PRG:2905 BD 36 04 cmp #$01 ; CPU:$E908 PRG:2908 C9 01 bne UpdateObjectVelocity_Load ; CPU:$E90A PRG:290A D0 43 ldy $0451,x ; CPU:$E90C PRG:290C BC 51 04 lda $31,x ; CPU:$E90F PRG:290F B5 31 and #$02 ; CPU:$E911 PRG:2911 29 02 beq UpdateObjectVelocity_Block_22 ; CPU:$E913 PRG:2913 F0 12 lda $0424,x ; CPU:$E915 PRG:2915 BD 24 04 sec ; CPU:$E918 PRG:2918 38 sbc $E625,y ; CPU:$E919 PRG:2919 F9 25 E6 sta $0424,x ; CPU:$E91C PRG:291C 9D 24 04 lda $042D,x ; CPU:$E91F PRG:291F BD 2D 04 sbc #$00 ; CPU:$E922 PRG:2922 E9 00 jmp UpdateObjectVelocity_Store_1 ; CPU:$E924 PRG:2924 4C 3E E9 UpdateObjectVelocity_Block_22: lda $31,x ; CPU:$E927 PRG:2927 B5 31 and #$01 ; CPU:$E929 PRG:2929 29 01 beq UpdateObjectVelocity_Load ; CPU:$E92B PRG:292B F0 22 lda $0424,x ; CPU:$E92D PRG:292D BD 24 04 clc ; CPU:$E930 PRG:2930 18 adc $E625,y ; CPU:$E931 PRG:2931 79 25 E6 sta $0424,x ; CPU:$E934 PRG:2934 9D 24 04 lda $042D,x ; CPU:$E937 PRG:2937 BD 2D 04 adc #$00 ; CPU:$E93A PRG:293A 69 00 UpdateObjectVelocity_Store_1: sta $042D,x ; CPU:$E93C PRG:293C 9D 2D 04 lda $31,x ; CPU:$E93F PRG:293F B5 31 and #$03 ; CPU:$E941 PRG:2941 29 03 beq UpdateObjectVelocity_Load ; CPU:$E943 PRG:2943 F0 0A cpx #$02 ; CPU:$E945 PRG:2945 E0 02 bcs UpdateObjectVelocity_Load ; CPU:$E947 PRG:2947 B0 06 lda $F0 ; CPU:$E949 PRG:2949 A5 F0 ora #$08 ; CPU:$E94B PRG:294B 09 08 sta $F0 ; CPU:$E94D PRG:294D 85 F0 UpdateObjectVelocity_Load: lda $7F,x ; CPU:$E94F PRG:294F B5 7F cmp #$04 ; CPU:$E951 PRG:2951 C9 04 bcc UpdateObjectVelocity_Block_26 ; CPU:$E953 PRG:2953 90 2B lda $0448,x ; CPU:$E955 PRG:2955 BD 48 04 bne UpdateObjectVelocity_Block_23 ; CPU:$E958 PRG:2958 D0 07 lda $042D,x ; CPU:$E95A PRG:295A BD 2D 04 bmi UpdateObjectVelocity_Block_26 ; CPU:$E95D PRG:295D 30 21 bpl UpdateObjectVelocity_Block_24 ; CPU:$E95F PRG:295F 10 05 UpdateObjectVelocity_Block_23: lda $042D,x ; CPU:$E961 PRG:2961 BD 2D 04 bpl UpdateObjectVelocity_Block_26 ; CPU:$E964 PRG:2964 10 1A UpdateObjectVelocity_Block_24: lda $7F,x ; CPU:$E966 PRG:2966 B5 7F cmp #$05 ; CPU:$E968 PRG:2968 C9 05 bne UpdateObjectVelocity_Block_25 ; CPU:$E96A PRG:296A D0 08 lda $0448,x ; CPU:$E96C PRG:296C BD 48 04 eor #$01 ; CPU:$E96F PRG:296F 49 01 sta $0448,x ; CPU:$E971 PRG:2971 9D 48 04 UpdateObjectVelocity_Block_25: lda #$03 ; CPU:$E974 PRG:2974 A9 03 sta $7F,x ; CPU:$E976 PRG:2976 95 7F lda #$00 ; CPU:$E978 PRG:2978 A9 00 sta $0424,x ; CPU:$E97A PRG:297A 9D 24 04 sta $042D,x ; CPU:$E97D PRG:297D 9D 2D 04 UpdateObjectVelocity_Block_26: rts ; CPU:$E980 PRG:2980 60 ; UpdateObjectFacingAndState ; Purpose: normalize movement/facing state using controller direction and object mode. ; Inputs: X = object slot. ; Returns: object state and facing fields updated. UpdateObjectFacingAndState: lda $CB ; CPU:$E981 PRG:2981 A5 CB bne UpdateObjectFacingAndState_Block_2 ; CPU:$E983 PRG:2983 D0 2F lda $BD,x ; CPU:$E985 PRG:2985 B5 BD beq UpdateObjectFacingAndState_Block ; CPU:$E987 PRG:2987 F0 0F lda $0488 ; CPU:$E989 PRG:2989 AD 88 04 beq UpdateObjectFacingAndState_Block ; CPU:$E98C PRG:298C F0 0A sec ; CPU:$E98E PRG:298E 38 sbc $91,x ; CPU:$E98F PRG:298F F5 91 jsr $F08E ; CPU:$E991 PRG:2991 20 8E F0 cmp #$05 ; CPU:$E994 PRG:2994 C9 05 bcc UpdateObjectFacingAndState_Block_2 ; CPU:$E996 PRG:2996 90 1C UpdateObjectFacingAndState_Block: cpx #$02 ; CPU:$E998 PRG:2998 E0 02 bcc UpdateObjectFacingAndState_Block_1 ; CPU:$E99A PRG:299A 90 06 lda $88,x ; CPU:$E99C PRG:299C B5 88 cmp #$02 ; CPU:$E99E PRG:299E C9 02 bne UpdateObjectFacingAndState_Block_3 ; CPU:$E9A0 PRG:29A0 D0 4E UpdateObjectFacingAndState_Block_1: lda $7F,x ; CPU:$E9A2 PRG:29A2 B5 7F cmp #$02 ; CPU:$E9A4 PRG:29A4 C9 02 bcc UpdateObjectFacingAndState_Block_3 ; CPU:$E9A6 PRG:29A6 90 48 cmp #$06 ; CPU:$E9A8 PRG:29A8 C9 06 bcs UpdateObjectFacingAndState_Block_3 ; CPU:$E9AA PRG:29AA B0 44 lda #$01 ; CPU:$E9AC PRG:29AC A9 01 sta $7F,x ; CPU:$E9AE PRG:29AE 95 7F sta $045A,x ; CPU:$E9B0 PRG:29B0 9D 5A 04 rts ; CPU:$E9B3 PRG:29B3 60 UpdateObjectFacingAndState_Block_2: lda #$00 ; CPU:$E9B4 PRG:29B4 A9 00 sta $0412,x ; CPU:$E9B6 PRG:29B6 9D 12 04 sta $041B,x ; CPU:$E9B9 PRG:29B9 9D 1B 04 sta $0409,x ; CPU:$E9BC PRG:29BC 9D 09 04 sta $CB ; CPU:$E9BF PRG:29BF 85 CB cpx #$02 ; CPU:$E9C1 PRG:29C1 E0 02 bcc UpdateObjectFacingAndState_Block_5 ; CPU:$E9C3 PRG:29C3 90 36 lda $88,x ; CPU:$E9C5 PRG:29C5 B5 88 cmp #$02 ; CPU:$E9C7 PRG:29C7 C9 02 beq UpdateObjectFacingAndState_Block_4 ; CPU:$E9C9 PRG:29C9 F0 26 cmp #$01 ; CPU:$E9CB PRG:29CB C9 01 bne UpdateObjectFacingAndState_Block_3 ; CPU:$E9CD PRG:29CD D0 21 lda $7F,x ; CPU:$E9CF PRG:29CF B5 7F cmp #$02 ; CPU:$E9D1 PRG:29D1 C9 02 bcs UpdateObjectFacingAndState_Block_3 ; CPU:$E9D3 PRG:29D3 B0 1B lda #$02 ; CPU:$E9D5 PRG:29D5 A9 02 sta $7F,x ; CPU:$E9D7 PRG:29D7 95 7F lda $C6 ; CPU:$E9D9 PRG:29D9 A5 C6 sta $043F,x ; CPU:$E9DB PRG:29DB 9D 3F 04 lda #$00 ; CPU:$E9DE PRG:29DE A9 00 sta $0424,x ; CPU:$E9E0 PRG:29E0 9D 24 04 sta $042D,x ; CPU:$E9E3 PRG:29E3 9D 2D 04 sta $0463,x ; CPU:$E9E6 PRG:29E6 9D 63 04 sta $046C,x ; CPU:$E9E9 PRG:29E9 9D 6C 04 lda #$40 ; CPU:$E9EC PRG:29EC A9 40 sta $F1 ; CPU:$E9EE PRG:29EE 85 F1 UpdateObjectFacingAndState_Block_3: rts ; CPU:$E9F0 PRG:29F0 60 UpdateObjectFacingAndState_Block_4: lda #$00 ; CPU:$E9F1 PRG:29F1 A9 00 sta $7F,x ; CPU:$E9F3 PRG:29F3 95 7F lda #$01 ; CPU:$E9F5 PRG:29F5 A9 01 sta $045A,x ; CPU:$E9F7 PRG:29F7 9D 5A 04 rts ; CPU:$E9FA PRG:29FA 60 UpdateObjectFacingAndState_Block_5: lda $7F,x ; CPU:$E9FB PRG:29FB B5 7F cmp #$01 ; CPU:$E9FD PRG:29FD C9 01 bne UpdateObjectFacingAndState_Block_8 ; CPU:$E9FF PRG:29FF D0 14 cmp #$06 ; CPU:$EA01 PRG:2A01 C9 06 bcs UpdateObjectFacingAndState_Block_8 ; CPU:$EA03 PRG:2A03 B0 10 lda $0424,x ; CPU:$EA05 PRG:2A05 BD 24 04 ora $042D,x ; CPU:$EA08 PRG:2A08 1D 2D 04 bne UpdateObjectFacingAndState_Block_6 ; CPU:$EA0B PRG:2A0B D0 04 lda #$03 ; CPU:$EA0D PRG:2A0D A9 03 bne UpdateObjectFacingAndState_Block_7 ; CPU:$EA0F PRG:2A0F D0 02 UpdateObjectFacingAndState_Block_6: lda #$02 ; CPU:$EA11 PRG:2A11 A9 02 UpdateObjectFacingAndState_Block_7: sta $7F,x ; CPU:$EA13 PRG:2A13 95 7F UpdateObjectFacingAndState_Block_8: rts ; CPU:$EA15 PRG:2A15 60 ; ApplyObjectHorizontalMotion ; Purpose: clamp and integrate horizontal fixed-point velocity. ; Inputs: X = object slot. ; Returns: horizontal position/velocity updated; may deactivate escaped objects. ApplyObjectHorizontalMotion: cpx #$02 ; CPU:$EA16 PRG:2A16 E0 02 bcs ApplyObjectHorizontalMotion_Block ; CPU:$EA18 PRG:2A18 B0 10 lda $BD,x ; CPU:$EA1A PRG:2A1A B5 BD bne ApplyObjectHorizontalMotion_Block_2 ; CPU:$EA1C PRG:2A1C D0 24 lda $7F,x ; CPU:$EA1E PRG:2A1E B5 7F cmp #$01 ; CPU:$EA20 PRG:2A20 C9 01 beq ApplyObjectHorizontalMotion_Block_1 ; CPU:$EA22 PRG:2A22 F0 18 cmp #$03 ; CPU:$EA24 PRG:2A24 C9 03 bne ApplyObjectHorizontalMotion_Block_2 ; CPU:$EA26 PRG:2A26 D0 1A beq ApplyObjectHorizontalMotion_Block_1 ; CPU:$EA28 PRG:2A28 F0 12 ApplyObjectHorizontalMotion_Block: lda $7F,x ; CPU:$EA2A PRG:2A2A B5 7F cmp #$01 ; CPU:$EA2C PRG:2A2C C9 01 beq ApplyObjectHorizontalMotion_Block_1 ; CPU:$EA2E PRG:2A2E F0 0C cmp #$03 ; CPU:$EA30 PRG:2A30 C9 03 bcc ApplyObjectHorizontalMotion_Block_2 ; CPU:$EA32 PRG:2A32 90 0E lda $19 ; CPU:$EA34 PRG:2A34 A5 19 and #$03 ; CPU:$EA36 PRG:2A36 29 03 bne ApplyObjectHorizontalMotion_Block_3 ; CPU:$EA38 PRG:2A38 D0 0B beq ApplyObjectHorizontalMotion_Block_2 ; CPU:$EA3A PRG:2A3A F0 06 ApplyObjectHorizontalMotion_Block_1: lda $19 ; CPU:$EA3C PRG:2A3C A5 19 and #$07 ; CPU:$EA3E PRG:2A3E 29 07 bne ApplyObjectHorizontalMotion_Block_3 ; CPU:$EA40 PRG:2A40 D0 03 ApplyObjectHorizontalMotion_Block_2: inc $0436,x ; CPU:$EA42 PRG:2A42 FE 36 04 ApplyObjectHorizontalMotion_Block_3: lda $0436,x ; CPU:$EA45 PRG:2A45 BD 36 04 and #$03 ; CPU:$EA48 PRG:2A48 29 03 sta $0436,x ; CPU:$EA4A PRG:2A4A 9D 36 04 bne ApplyObjectHorizontalMotion_Block_4 ; CPU:$EA4D PRG:2A4D D0 06 lda $7F,x ; CPU:$EA4F PRG:2A4F B5 7F bne ApplyObjectHorizontalMotion_Block_4 ; CPU:$EA51 PRG:2A51 D0 02 inc $7F,x ; CPU:$EA53 PRG:2A53 F6 7F ApplyObjectHorizontalMotion_Block_4: rts ; CPU:$EA55 PRG:2A55 60 ; ApplyObjectVerticalMotion ; Purpose: clamp and integrate vertical fixed-point velocity. ; Inputs: X = object slot. ; Returns: vertical position/velocity updated; may trigger object removal. ApplyObjectVerticalMotion: lda $0475,x ; CPU:$EA56 PRG:2A56 BD 75 04 beq ApplyObjectVerticalMotion_Block ; CPU:$EA59 PRG:2A59 F0 03 dec $0475,x ; CPU:$EA5B PRG:2A5B DE 75 04 ApplyObjectVerticalMotion_Block: cpx #$02 ; CPU:$EA5E PRG:2A5E E0 02 bcs ApplyObjectVerticalMotion_Block_2 ; CPU:$EA60 PRG:2A60 B0 28 lda $C1,x ; CPU:$EA62 PRG:2A62 B5 C1 beq ApplyObjectVerticalMotion_Block_2 ; CPU:$EA64 PRG:2A64 F0 24 lda $19 ; CPU:$EA66 PRG:2A66 A5 19 lsr a ; CPU:$EA68 PRG:2A68 4A bcc ApplyObjectVerticalMotion_Block_1 ; CPU:$EA69 PRG:2A69 90 1E inc $0436,x ; CPU:$EA6B PRG:2A6B FE 36 04 lda $0436,x ; CPU:$EA6E PRG:2A6E BD 36 04 and #$03 ; CPU:$EA71 PRG:2A71 29 03 sta $0436,x ; CPU:$EA73 PRG:2A73 9D 36 04 lda #$01 ; CPU:$EA76 PRG:2A76 A9 01 sta $7F,x ; CPU:$EA78 PRG:2A78 95 7F dec $045A,x ; CPU:$EA7A PRG:2A7A DE 5A 04 bne ApplyObjectVerticalMotion_Block_1 ; CPU:$EA7D PRG:2A7D D0 0A lda #$00 ; CPU:$EA7F PRG:2A7F A9 00 sta $C1,x ; CPU:$EA81 PRG:2A81 95 C1 sta $7F,x ; CPU:$EA83 PRG:2A83 95 7F lda #$20 ; CPU:$EA85 PRG:2A85 A9 20 sta $F0 ; CPU:$EA87 PRG:2A87 85 F0 ApplyObjectVerticalMotion_Block_1: rts ; CPU:$EA89 PRG:2A89 60 ApplyObjectVerticalMotion_Block_2: lda $0412,x ; CPU:$EA8A PRG:2A8A BD 12 04 clc ; CPU:$EA8D PRG:2A8D 18 ldy $0451,x ; CPU:$EA8E PRG:2A8E BC 51 04 adc $E601,y ; CPU:$EA91 PRG:2A91 79 01 E6 sta $0412,x ; CPU:$EA94 PRG:2A94 9D 12 04 bcc ApplyObjectVerticalMotion_Block_3 ; CPU:$EA97 PRG:2A97 90 03 inc $041B,x ; CPU:$EA99 PRG:2A99 FE 1B 04 ApplyObjectVerticalMotion_Block_3: lda $041B,x ; CPU:$EA9C PRG:2A9C BD 1B 04 bmi ApplyObjectVerticalMotion_Block_5 ; CPU:$EA9F PRG:2A9F 30 1E cmp $E66D,y ; CPU:$EAA1 PRG:2AA1 D9 6D E6 bcc ApplyObjectVerticalMotion_Block_7 ; CPU:$EAA4 PRG:2AA4 90 34 bne ApplyObjectVerticalMotion_Block_4 ; CPU:$EAA6 PRG:2AA6 D0 08 lda $0412,x ; CPU:$EAA8 PRG:2AA8 BD 12 04 cmp $E661,y ; CPU:$EAAB PRG:2AAB D9 61 E6 bcc ApplyObjectVerticalMotion_Block_7 ; CPU:$EAAE PRG:2AAE 90 2A ApplyObjectVerticalMotion_Block_4: lda $E661,y ; CPU:$EAB0 PRG:2AB0 B9 61 E6 sta $0412,x ; CPU:$EAB3 PRG:2AB3 9D 12 04 lda $E66D,y ; CPU:$EAB6 PRG:2AB6 B9 6D E6 sta $041B,x ; CPU:$EAB9 PRG:2AB9 9D 1B 04 jmp ApplyObjectVerticalMotion_Block_7 ; CPU:$EABC PRG:2ABC 4C DC EA ApplyObjectVerticalMotion_Block_5: cmp $E685,y ; CPU:$EABF PRG:2ABF D9 85 E6 bcc ApplyObjectVerticalMotion_Block_6 ; CPU:$EAC2 PRG:2AC2 90 0A bne ApplyObjectVerticalMotion_Block_7 ; CPU:$EAC4 PRG:2AC4 D0 14 lda $0412,x ; CPU:$EAC6 PRG:2AC6 BD 12 04 cmp $E679,y ; CPU:$EAC9 PRG:2AC9 D9 79 E6 bcs ApplyObjectVerticalMotion_Block_7 ; CPU:$EACC PRG:2ACC B0 0C ApplyObjectVerticalMotion_Block_6: lda $E679,y ; CPU:$EACE PRG:2ACE B9 79 E6 sta $0412,x ; CPU:$EAD1 PRG:2AD1 9D 12 04 lda $E685,y ; CPU:$EAD4 PRG:2AD4 B9 85 E6 sta $041B,x ; CPU:$EAD7 PRG:2AD7 9D 1B 04 ApplyObjectVerticalMotion_Block_7: jsr IntegrateVerticalPosition ; CPU:$EADA PRG:2ADA 20 A0 EB cmp #$F8 ; CPU:$EADD PRG:2ADD C9 F8 bcs ApplyObjectVerticalMotion_Block_9 ; CPU:$EADF PRG:2ADF B0 2A cmp #$E8 ; CPU:$EAE1 PRG:2AE1 C9 E8 bcc ApplyObjectVerticalMotion_Block_9 ; CPU:$EAE3 PRG:2AE3 90 26 lda #$FF ; CPU:$EAE5 PRG:2AE5 A9 FF sta $88,x ; CPU:$EAE7 PRG:2AE7 95 88 lda #$04 ; CPU:$EAE9 PRG:2AE9 A9 04 sta $BB ; CPU:$EAEB PRG:2AEB 85 BB lda $91,x ; CPU:$EAED PRG:2AED B5 91 sta $BC ; CPU:$EAEF PRG:2AEF 85 BC cpx #$02 ; CPU:$EAF1 PRG:2AF1 E0 02 bcc ApplyObjectVerticalMotion_Block_8 ; CPU:$EAF3 PRG:2AF3 90 0E lda #$80 ; CPU:$EAF5 PRG:2AF5 A9 80 sta $88,x ; CPU:$EAF7 PRG:2AF7 95 88 lda #$00 ; CPU:$EAF9 PRG:2AF9 A9 00 sta $7F,x ; CPU:$EAFB PRG:2AFB 95 7F lda #$01 ; CPU:$EAFD PRG:2AFD A9 01 sta $F3 ; CPU:$EAFF PRG:2AFF 85 F3 bne ApplyObjectVerticalMotion_Block_9 ; CPU:$EB01 PRG:2B01 D0 08 ApplyObjectVerticalMotion_Block_8: lda $C8 ; CPU:$EB03 PRG:2B03 A5 C8 bne ApplyObjectVerticalMotion_Block_9 ; CPU:$EB05 PRG:2B05 D0 04 lda #$40 ; CPU:$EB07 PRG:2B07 A9 40 sta $F0 ; CPU:$EB09 PRG:2B09 85 F0 ApplyObjectVerticalMotion_Block_9: lda $042D,x ; CPU:$EB0B PRG:2B0B BD 2D 04 bmi ApplyObjectVerticalMotion_Block_11 ; CPU:$EB0E PRG:2B0E 30 1E cmp $E63D,y ; CPU:$EB10 PRG:2B10 D9 3D E6 bcc ApplyObjectVerticalMotion_Block_13 ; CPU:$EB13 PRG:2B13 90 34 bne ApplyObjectVerticalMotion_Block_10 ; CPU:$EB15 PRG:2B15 D0 08 lda $0424,x ; CPU:$EB17 PRG:2B17 BD 24 04 cmp $E631,y ; CPU:$EB1A PRG:2B1A D9 31 E6 bcc ApplyObjectVerticalMotion_Block_13 ; CPU:$EB1D PRG:2B1D 90 2A ApplyObjectVerticalMotion_Block_10: lda $E631,y ; CPU:$EB1F PRG:2B1F B9 31 E6 sta $0424,x ; CPU:$EB22 PRG:2B22 9D 24 04 lda $E63D,y ; CPU:$EB25 PRG:2B25 B9 3D E6 sta $042D,x ; CPU:$EB28 PRG:2B28 9D 2D 04 jmp ApplyObjectVerticalMotion_Block_13 ; CPU:$EB2B PRG:2B2B 4C 4B EB ApplyObjectVerticalMotion_Block_11: cmp $E655,y ; CPU:$EB2E PRG:2B2E D9 55 E6 bcc ApplyObjectVerticalMotion_Block_12 ; CPU:$EB31 PRG:2B31 90 0A bne ApplyObjectVerticalMotion_Block_13 ; CPU:$EB33 PRG:2B33 D0 14 lda $0424,x ; CPU:$EB35 PRG:2B35 BD 24 04 cmp $E649,y ; CPU:$EB38 PRG:2B38 D9 49 E6 bcs ApplyObjectVerticalMotion_Block_13 ; CPU:$EB3B PRG:2B3B B0 0C ApplyObjectVerticalMotion_Block_12: lda $E649,y ; CPU:$EB3D PRG:2B3D B9 49 E6 sta $0424,x ; CPU:$EB40 PRG:2B40 9D 24 04 lda $E655,y ; CPU:$EB43 PRG:2B43 B9 55 E6 sta $042D,x ; CPU:$EB46 PRG:2B46 9D 2D 04 ApplyObjectVerticalMotion_Block_13: jsr IntegrateHorizontalPosition ; CPU:$EB49 PRG:2B49 20 8E EB lda $16 ; CPU:$EB4C PRG:2B4C A5 16 beq ApplyObjectVerticalMotion_Block_16 ; CPU:$EB4E PRG:2B4E F0 10 lda $91,x ; CPU:$EB50 PRG:2B50 B5 91 cmp #$10 ; CPU:$EB52 PRG:2B52 C9 10 bcs ApplyObjectVerticalMotion_Block_14 ; CPU:$EB54 PRG:2B54 B0 02 lda #$10 ; CPU:$EB56 PRG:2B56 A9 10 ApplyObjectVerticalMotion_Block_14: cmp #$E0 ; CPU:$EB58 PRG:2B58 C9 E0 bcc ApplyObjectVerticalMotion_Block_15 ; CPU:$EB5A PRG:2B5A 90 02 lda #$E0 ; CPU:$EB5C PRG:2B5C A9 E0 ApplyObjectVerticalMotion_Block_15: sta $91,x ; CPU:$EB5E PRG:2B5E 95 91 ApplyObjectVerticalMotion_Block_16: lda $C8 ; CPU:$EB60 PRG:2B60 A5 C8 beq ApplyObjectVerticalMotion_Block_18 ; CPU:$EB62 PRG:2B62 F0 27 lda $88,x ; CPU:$EB64 PRG:2B64 B5 88 bne ApplyObjectVerticalMotion_Block_18 ; CPU:$EB66 PRG:2B66 D0 23 lda $9A,x ; CPU:$EB68 PRG:2B68 B5 9A cmp #$C8 ; CPU:$EB6A PRG:2B6A C9 C8 bcc ApplyObjectVerticalMotion_Block_18 ; CPU:$EB6C PRG:2B6C 90 1D lda #$C7 ; CPU:$EB6E PRG:2B6E A9 C7 sta $9A,x ; CPU:$EB70 PRG:2B70 95 9A lda $0451,x ; CPU:$EB72 PRG:2B72 BD 51 04 cmp #$0B ; CPU:$EB75 PRG:2B75 C9 0B bne ApplyObjectVerticalMotion_Block_17 ; CPU:$EB77 PRG:2B77 D0 09 dec $0451,x ; CPU:$EB79 PRG:2B79 DE 51 04 jsr $F107 ; CPU:$EB7C PRG:2B7C 20 07 F1 jmp $F18C ; CPU:$EB7F PRG:2B7F 4C 8C F1 ApplyObjectVerticalMotion_Block_17: lda #$02 ; CPU:$EB82 PRG:2B82 A9 02 sta $88,x ; CPU:$EB84 PRG:2B84 95 88 lda #$03 ; CPU:$EB86 PRG:2B86 A9 03 sta $0451,x ; CPU:$EB88 PRG:2B88 9D 51 04 ApplyObjectVerticalMotion_Block_18: rts ; CPU:$EB8B PRG:2B8B 60 ; IntegrateHorizontalPosition ; Purpose: add horizontal velocity to fixed-point X position. ; Inputs: X = object slot. ; Returns: $0400,X and $91,X updated. IntegrateHorizontalPosition: lda $0400,x ; CPU:$EB8C PRG:2B8C BD 00 04 clc ; CPU:$EB8F PRG:2B8F 18 adc $0424,x ; CPU:$EB90 PRG:2B90 7D 24 04 sta $0400,x ; CPU:$EB93 PRG:2B93 9D 00 04 lda $91,x ; CPU:$EB96 PRG:2B96 B5 91 adc $042D,x ; CPU:$EB98 PRG:2B98 7D 2D 04 sta $91,x ; CPU:$EB9B PRG:2B9B 95 91 rts ; CPU:$EB9D PRG:2B9D 60 ; IntegrateVerticalPosition ; Purpose: add vertical velocity to fixed-point Y position. ; Inputs: X = object slot. ; Returns: $0409,X and $9A,X updated. IntegrateVerticalPosition: lda $0409,x ; CPU:$EB9E PRG:2B9E BD 09 04 clc ; CPU:$EBA1 PRG:2BA1 18 adc $0412,x ; CPU:$EBA2 PRG:2BA2 7D 12 04 sta $0409,x ; CPU:$EBA5 PRG:2BA5 9D 09 04 lda $9A,x ; CPU:$EBA8 PRG:2BA8 B5 9A adc $041B,x ; CPU:$EBAA PRG:2BAA 7D 1B 04 sta $9A,x ; CPU:$EBAD PRG:2BAD 95 9A rts ; CPU:$EBAF PRG:2BAF 60 ; ApplyHorizontalCollisionResponse ; Purpose: run collision handling around horizontal integration. ; Inputs: X = object slot. ; Returns: collision response and position updated. ApplyHorizontalCollisionResponse: jsr $F0B4 ; CPU:$EBB0 PRG:2BB0 20 B4 F0 jsr IntegrateHorizontalPosition ; CPU:$EBB3 PRG:2BB3 20 8E EB jmp $F0B4 ; CPU:$EBB6 PRG:2BB6 4C B4 F0 ; ApplyVerticalCollisionResponse ; Purpose: run collision handling around vertical integration. ; Inputs: X = object slot. ; Returns: collision response and position updated. ApplyVerticalCollisionResponse: jsr $F0B4 ; CPU:$EBB9 PRG:2BB9 20 B4 F0 jsr IntegrateVerticalPosition ; CPU:$EBBC PRG:2BBC 20 A0 EB jmp $F0B4 ; CPU:$EBBF PRG:2BBF 4C B4 F0 ; UpdateObjectEnvironmentState ; Purpose: update environment-dependent object motion and collision flags. ; Inputs: X = object slot. ; Returns: movement flags and velocities adjusted. UpdateObjectEnvironmentState: cpx #$02 ; CPU:$EBC2 PRG:2BC2 E0 02 bcs UpdateObjectEnvironmentState_Block_1 ; CPU:$EBC4 PRG:2BC4 B0 1B lda $88,x ; CPU:$EBC6 PRG:2BC6 B5 88 bne UpdateObjectEnvironmentState_Block ; CPU:$EBC8 PRG:2BC8 D0 0A lda $0436,x ; CPU:$EBCA PRG:2BCA BD 36 04 bne UpdateObjectEnvironmentState_Block ; CPU:$EBCD PRG:2BCD D0 05 lda #$00 ; CPU:$EBCF PRG:2BCF A9 00 sta $7F,x ; CPU:$EBD1 PRG:2BD1 95 7F rts ; CPU:$EBD3 PRG:2BD3 60 UpdateObjectEnvironmentState_Block: lda $7F,x ; CPU:$EBD4 PRG:2BD4 B5 7F cmp #$06 ; CPU:$EBD6 PRG:2BD6 C9 06 bcc UpdateObjectEnvironmentState_Block_7 ; CPU:$EBD8 PRG:2BD8 90 5C lda #$01 ; CPU:$EBDA PRG:2BDA A9 01 sta $7F,x ; CPU:$EBDC PRG:2BDC 95 7F dec $88,x ; CPU:$EBDE PRG:2BDE D6 88 rts ; CPU:$EBE0 PRG:2BE0 60 UpdateObjectEnvironmentState_Block_1: lda $88,x ; CPU:$EBE1 PRG:2BE1 B5 88 cmp #$02 ; CPU:$EBE3 PRG:2BE3 C9 02 beq UpdateObjectEnvironmentState_Block_7 ; CPU:$EBE5 PRG:2BE5 F0 4F lda $0436,x ; CPU:$EBE7 PRG:2BE7 BD 36 04 bne UpdateObjectEnvironmentState_Block_3 ; CPU:$EBEA PRG:2BEA D0 0F lda $88,x ; CPU:$EBEC PRG:2BEC B5 88 bne UpdateObjectEnvironmentState_Block_2 ; CPU:$EBEE PRG:2BEE D0 05 lda #$00 ; CPU:$EBF0 PRG:2BF0 A9 00 sta $7F,x ; CPU:$EBF2 PRG:2BF2 95 7F rts ; CPU:$EBF4 PRG:2BF4 60 UpdateObjectEnvironmentState_Block_2: lda $7F,x ; CPU:$EBF5 PRG:2BF5 B5 7F bne UpdateObjectEnvironmentState_Block_4 ; CPU:$EBF7 PRG:2BF7 D0 03 inc $7F,x ; CPU:$EBF9 PRG:2BF9 F6 7F UpdateObjectEnvironmentState_Block_3: rts ; CPU:$EBFB PRG:2BFB 60 UpdateObjectEnvironmentState_Block_4: cmp #$02 ; CPU:$EBFC PRG:2BFC C9 02 bcc UpdateObjectEnvironmentState_Block_3 ; CPU:$EBFE PRG:2BFE 90 FB dec $045A,x ; CPU:$EC00 PRG:2C00 DE 5A 04 bne UpdateObjectEnvironmentState_Block_6 ; CPU:$EC03 PRG:2C03 D0 30 lda $C7 ; CPU:$EC05 PRG:2C05 A5 C7 sta $045A,x ; CPU:$EC07 PRG:2C07 9D 5A 04 inc $7F,x ; CPU:$EC0A PRG:2C0A F6 7F lda $7F,x ; CPU:$EC0C PRG:2C0C B5 7F cmp #$07 ; CPU:$EC0E PRG:2C0E C9 07 bcc UpdateObjectEnvironmentState_Block_6 ; CPU:$EC10 PRG:2C10 90 23 lda #$02 ; CPU:$EC12 PRG:2C12 A9 02 sta $88,x ; CPU:$EC14 PRG:2C14 95 88 lda #$00 ; CPU:$EC16 PRG:2C16 A9 00 sta $7F,x ; CPU:$EC18 PRG:2C18 95 7F ldy $0451,x ; CPU:$EC1A PRG:2C1A BC 51 04 lda EnvironmentStateTable,y ; CPU:$EC1D PRG:2C1D B9 AE EC ldy $047E,x ; CPU:$EC20 PRG:2C20 BC 7E 04 bne UpdateObjectEnvironmentState_Block_5 ; CPU:$EC23 PRG:2C23 D0 08 dec $047E,x ; CPU:$EC25 PRG:2C25 DE 7E 04 lda $0451,x ; CPU:$EC28 PRG:2C28 BD 51 04 and #$03 ; CPU:$EC2B PRG:2C2B 29 03 UpdateObjectEnvironmentState_Block_5: sta $0451,x ; CPU:$EC2D PRG:2C2D 9D 51 04 lda #$FE ; CPU:$EC30 PRG:2C30 A9 FE sta $041B,x ; CPU:$EC32 PRG:2C32 9D 1B 04 UpdateObjectEnvironmentState_Block_6: rts ; CPU:$EC35 PRG:2C35 60 UpdateObjectEnvironmentState_Block_7: jsr $E6E9 ; CPU:$EC36 PRG:2C36 20 E9 E6 lda $31,x ; CPU:$EC39 PRG:2C39 B5 31 and #$C3 ; CPU:$EC3B PRG:2C3B 29 C3 beq UpdateObjectEnvironmentState_Block_8 ; CPU:$EC3D PRG:2C3D F0 08 cpx #$02 ; CPU:$EC3F PRG:2C3F E0 02 bcs UpdateObjectEnvironmentState_Block_8 ; CPU:$EC41 PRG:2C41 B0 04 lda #$00 ; CPU:$EC43 PRG:2C43 A9 00 sta $BD,x ; CPU:$EC45 PRG:2C45 95 BD UpdateObjectEnvironmentState_Block_8: lda $31,x ; CPU:$EC47 PRG:2C47 B5 31 and #$40 ; CPU:$EC49 PRG:2C49 29 40 bne UpdateObjectEnvironmentState_Block_10 ; CPU:$EC4B PRG:2C4B D0 12 lda $31,x ; CPU:$EC4D PRG:2C4D B5 31 and #$80 ; CPU:$EC4F PRG:2C4F 29 80 bne UpdateObjectEnvironmentState_Block_9 ; CPU:$EC51 PRG:2C51 D0 07 lda #$00 ; CPU:$EC53 PRG:2C53 A9 00 sta $0620,x ; CPU:$EC55 PRG:2C55 9D 20 06 beq UpdateObjectEnvironmentState_Block_14 ; CPU:$EC58 PRG:2C58 F0 51 UpdateObjectEnvironmentState_Block_9: lda $0620,x ; CPU:$EC5A PRG:2C5A BD 20 06 bne UpdateObjectEnvironmentState_Block_14 ; CPU:$EC5D PRG:2C5D D0 4C UpdateObjectEnvironmentState_Block_10: lda $7F,x ; CPU:$EC5F PRG:2C5F B5 7F cmp #$02 ; CPU:$EC61 PRG:2C61 C9 02 bcc UpdateObjectEnvironmentState_Block_11 ; CPU:$EC63 PRG:2C63 90 0E dec $9A,x ; CPU:$EC65 PRG:2C65 D6 9A dec $9A,x ; CPU:$EC67 PRG:2C67 D6 9A lda #$00 ; CPU:$EC69 PRG:2C69 A9 00 sta $0412,x ; CPU:$EC6B PRG:2C6B 9D 12 04 sta $041B,x ; CPU:$EC6E PRG:2C6E 9D 1B 04 beq UpdateObjectEnvironmentState_Block_12 ; CPU:$EC71 PRG:2C71 F0 09 UpdateObjectEnvironmentState_Block_11: cmp #$01 ; CPU:$EC73 PRG:2C73 C9 01 beq UpdateObjectEnvironmentState_Block_12 ; CPU:$EC75 PRG:2C75 F0 05 lda $0436,x ; CPU:$EC77 PRG:2C77 BD 36 04 bne UpdateObjectEnvironmentState_Block_14 ; CPU:$EC7A PRG:2C7A D0 2F UpdateObjectEnvironmentState_Block_12: lda #$00 ; CPU:$EC7C PRG:2C7C A9 00 sta $7F,x ; CPU:$EC7E PRG:2C7E 95 7F lda #$01 ; CPU:$EC80 PRG:2C80 A9 01 sta $0436,x ; CPU:$EC82 PRG:2C82 9D 36 04 lda #$01 ; CPU:$EC85 PRG:2C85 A9 01 sta $0620,x ; CPU:$EC87 PRG:2C87 9D 20 06 ldy #$00 ; CPU:$EC8A PRG:2C8A A0 00 cpx #$02 ; CPU:$EC8C PRG:2C8C E0 02 bcc UpdateObjectEnvironmentState_Block_13 ; CPU:$EC8E PRG:2C8E 90 01 iny ; CPU:$EC90 PRG:2C90 C8 UpdateObjectEnvironmentState_Block_13: lda a:$00F0,y ; CPU:$EC91 PRG:2C91 B9 F0 00 ora #$10 ; CPU:$EC94 PRG:2C94 09 10 sta a:$00F0,y ; CPU:$EC96 PRG:2C96 99 F0 00 lda $0412,x ; CPU:$EC99 PRG:2C99 BD 12 04 sec ; CPU:$EC9C PRG:2C9C 38 ldy $0451,x ; CPU:$EC9D PRG:2C9D BC 51 04 sbc $E60D,y ; CPU:$ECA0 PRG:2CA0 F9 0D E6 sta $0412,x ; CPU:$ECA3 PRG:2CA3 9D 12 04 bcs UpdateObjectEnvironmentState_Block_14 ; CPU:$ECA6 PRG:2CA6 B0 03 dec $041B,x ; CPU:$ECA8 PRG:2CA8 DE 1B 04 UpdateObjectEnvironmentState_Block_14: rts ; CPU:$ECAB PRG:2CAB 60 ; Environment response pattern used by UpdateObjectEnvironmentState. EnvironmentStateTable: .byte $01, $02, $02, $03, $01, $02, $02, $03 ; CPU:$ECAC PRG:2CAC 01 02 02 03 01 02 02 03 .byte $01, $02, $02, $03 ; CPU:$ECB4 PRG:2CB4 01 02 02 03 ; UpdateSpecialObjectState ; Purpose: update special/falling object states and test contact with active players. ; Inputs: X = object slot. ; Returns: position/state/event fields updated; X restored. UpdateSpecialObjectState: lda $7F,x ; CPU:$ECB8 PRG:2CB8 B5 7F bne UpdateSpecialObjectState_Block_3 ; CPU:$ECBA PRG:2CBA D0 69 jsr $E7B1 ; CPU:$ECBC PRG:2CBC 20 B1 E7 jsr $EB8E ; CPU:$ECBF PRG:2CBF 20 8E EB lda $0409,x ; CPU:$ECC2 PRG:2CC2 BD 09 04 sec ; CPU:$ECC5 PRG:2CC5 38 sbc #$60 ; CPU:$ECC6 PRG:2CC6 E9 60 sta $0409,x ; CPU:$ECC8 PRG:2CC8 9D 09 04 lda $9A,x ; CPU:$ECCB PRG:2CCB B5 9A sbc #$00 ; CPU:$ECCD PRG:2CCD E9 00 sta $9A,x ; CPU:$ECCF PRG:2CCF 95 9A cmp #$F1 ; CPU:$ECD1 PRG:2CD1 C9 F1 bcc UpdateSpecialObjectState_Block ; CPU:$ECD3 PRG:2CD3 90 04 lda #$FF ; CPU:$ECD5 PRG:2CD5 A9 FF sta $88,x ; CPU:$ECD7 PRG:2CD7 95 88 UpdateSpecialObjectState_Block: txa ; CPU:$ECD9 PRG:2CD9 8A pha ; CPU:$ECDA PRG:2CDA 48 ldy #$01 ; CPU:$ECDB PRG:2CDB A0 01 UpdateSpecialObjectState_Block_1: lda a:$0088,y ; CPU:$ECDD PRG:2CDD B9 88 00 beq UpdateSpecialObjectState_Block_2 ; CPU:$ECE0 PRG:2CE0 F0 3E bmi UpdateSpecialObjectState_Block_2 ; CPU:$ECE2 PRG:2CE2 30 3C lda $9A,x ; CPU:$ECE4 PRG:2CE4 B5 9A sec ; CPU:$ECE6 PRG:2CE6 38 sbc a:$009A,y ; CPU:$ECE7 PRG:2CE7 F9 9A 00 jsr $F08E ; CPU:$ECEA PRG:2CEA 20 8E F0 cmp #$18 ; CPU:$ECED PRG:2CED C9 18 bcs UpdateSpecialObjectState_Block_2 ; CPU:$ECEF PRG:2CEF B0 2F lda $91,x ; CPU:$ECF1 PRG:2CF1 B5 91 sec ; CPU:$ECF3 PRG:2CF3 38 sbc a:$0091,y ; CPU:$ECF4 PRG:2CF4 F9 91 00 jsr $F08E ; CPU:$ECF7 PRG:2CF7 20 8E F0 cmp #$10 ; CPU:$ECFA PRG:2CFA C9 10 bcs UpdateSpecialObjectState_Block_2 ; CPU:$ECFC PRG:2CFC B0 22 lda #$FF ; CPU:$ECFE PRG:2CFE A9 FF sta $7F,x ; CPU:$ED00 PRG:2D00 95 7F lda #$03 ; CPU:$ED02 PRG:2D02 A9 03 sta $045A,x ; CPU:$ED04 PRG:2D04 9D 5A 04 lda #$78 ; CPU:$ED07 PRG:2D07 A9 78 sta $C5 ; CPU:$ED09 PRG:2D09 85 C5 lda #$02 ; CPU:$ED0B PRG:2D0B A9 02 sta $F0 ; CPU:$ED0D PRG:2D0D 85 F0 lda #$32 ; CPU:$ED0F PRG:2D0F A9 32 sty $3E ; CPU:$ED11 PRG:2D11 84 3E jsr $D6DE ; CPU:$ED13 PRG:2D13 20 DE D6 lda #$01 ; CPU:$ED16 PRG:2D16 A9 01 ldx $3E ; CPU:$ED18 PRG:2D18 A6 3E jsr $D871 ; CPU:$ED1A PRG:2D1A 20 71 D8 pla ; CPU:$ED1D PRG:2D1D 68 tax ; CPU:$ED1E PRG:2D1E AA rts ; CPU:$ED1F PRG:2D1F 60 UpdateSpecialObjectState_Block_2: dey ; CPU:$ED20 PRG:2D20 88 bpl UpdateSpecialObjectState_Block_1 ; CPU:$ED21 PRG:2D21 10 BA pla ; CPU:$ED23 PRG:2D23 68 tax ; CPU:$ED24 PRG:2D24 AA UpdateSpecialObjectState_Block_3: rts ; CPU:$ED25 PRG:2D25 60 ; ResolveStageCollision ; Purpose: test an object against stage collision boundaries and classify contact side. ; Inputs: X = object slot; stage collision pointers in zero page. ; Returns: collision mask in $CC and response fields updated. ResolveStageCollision: ldy $88,x ; CPU:$ED26 PRG:2D26 B4 88 dey ; CPU:$ED28 PRG:2D28 88 bpl ResolveStageCollision_Block_1 ; CPU:$ED29 PRG:2D29 10 01 ResolveStageCollision_Block: rts ; CPU:$ED2B PRG:2D2B 60 ResolveStageCollision_Block_1: lda $9A,x ; CPU:$ED2C PRG:2D2C B5 9A cmp #$F9 ; CPU:$ED2E PRG:2D2E C9 F9 bcc ResolveStageCollision_Block_2 ; CPU:$ED30 PRG:2D30 90 0C lda $041B,x ; CPU:$ED32 PRG:2D32 BD 1B 04 bpl ResolveStageCollision_Block ; CPU:$ED35 PRG:2D35 10 F4 lda #$00 ; CPU:$ED37 PRG:2D37 A9 00 sta $CC ; CPU:$ED39 PRG:2D39 85 CC jmp ResolveStageCollision_Store ; CPU:$ED3B PRG:2D3B 4C E1 ED ResolveStageCollision_Block_2: ldy $CD ; CPU:$ED3E PRG:2D3E A4 CD bmi UpdateSpecialObjectState_Block_3 ; CPU:$ED40 PRG:2D40 30 E3 ResolveStageCollision_Load: lda #$00 ; CPU:$ED42 PRG:2D42 A9 00 sta $CC ; CPU:$ED44 PRG:2D44 85 CC lda ($27),y ; CPU:$ED46 PRG:2D46 B1 27 sec ; CPU:$ED48 PRG:2D48 38 sbc #$18 ; CPU:$ED49 PRG:2D49 E9 18 cmp $9A,x ; CPU:$ED4B PRG:2D4B D5 9A bcs ResolveStageCollision_Block_10 ; CPU:$ED4D PRG:2D4D B0 65 adc #$03 ; CPU:$ED4F PRG:2D4F 69 03 cmp $9A,x ; CPU:$ED51 PRG:2D51 D5 9A bcc ResolveStageCollision_Block_3 ; CPU:$ED53 PRG:2D53 90 04 lda #$01 ; CPU:$ED55 PRG:2D55 A9 01 bne ResolveStageCollision_Block_4 ; CPU:$ED57 PRG:2D57 D0 0E ResolveStageCollision_Block_3: lda ($29),y ; CPU:$ED59 PRG:2D59 B1 29 cmp $9A,x ; CPU:$ED5B PRG:2D5B D5 9A bcc ResolveStageCollision_Block_10 ; CPU:$ED5D PRG:2D5D 90 55 sbc #$03 ; CPU:$ED5F PRG:2D5F E9 03 cmp $9A,x ; CPU:$ED61 PRG:2D61 D5 9A bcs ResolveStageCollision_Block_7 ; CPU:$ED63 PRG:2D63 B0 22 lda #$02 ; CPU:$ED65 PRG:2D65 A9 02 ResolveStageCollision_Block_4: sta $CC ; CPU:$ED67 PRG:2D67 85 CC lda ($23),y ; CPU:$ED69 PRG:2D69 B1 23 cmp #$10 ; CPU:$ED6B PRG:2D6B C9 10 beq ResolveStageCollision_Block_5 ; CPU:$ED6D PRG:2D6D F0 07 sec ; CPU:$ED6F PRG:2D6F 38 sbc #$0C ; CPU:$ED70 PRG:2D70 E9 0C cmp $91,x ; CPU:$ED72 PRG:2D72 D5 91 bcs ResolveStageCollision_Block_6 ; CPU:$ED74 PRG:2D74 B0 0D ResolveStageCollision_Block_5: lda ($25),y ; CPU:$ED76 PRG:2D76 B1 25 cmp #$FF ; CPU:$ED78 PRG:2D78 C9 FF beq ResolveStageCollision_Block_7 ; CPU:$ED7A PRG:2D7A F0 0B sec ; CPU:$ED7C PRG:2D7C 38 sbc #$04 ; CPU:$ED7D PRG:2D7D E9 04 cmp $91,x ; CPU:$ED7F PRG:2D7F D5 91 bcs ResolveStageCollision_Block_7 ; CPU:$ED81 PRG:2D81 B0 04 ResolveStageCollision_Block_6: lda #$00 ; CPU:$ED83 PRG:2D83 A9 00 sta $CC ; CPU:$ED85 PRG:2D85 85 CC ResolveStageCollision_Block_7: lda ($23),y ; CPU:$ED87 PRG:2D87 B1 23 sec ; CPU:$ED89 PRG:2D89 38 sbc #$10 ; CPU:$ED8A PRG:2D8A E9 10 beq ResolveStageCollision_Block_8 ; CPU:$ED8C PRG:2D8C F0 10 cmp $91,x ; CPU:$ED8E PRG:2D8E D5 91 bcs ResolveStageCollision_Block_10 ; CPU:$ED90 PRG:2D90 B0 22 adc #$04 ; CPU:$ED92 PRG:2D92 69 04 cmp $91,x ; CPU:$ED94 PRG:2D94 D5 91 bcc ResolveStageCollision_Block_8 ; CPU:$ED96 PRG:2D96 90 06 lda $CC ; CPU:$ED98 PRG:2D98 A5 CC ora #$04 ; CPU:$ED9A PRG:2D9A 09 04 bne ResolveStageCollision_Block_9 ; CPU:$ED9C PRG:2D9C D0 14 ResolveStageCollision_Block_8: lda ($25),y ; CPU:$ED9E PRG:2D9E B1 25 cmp #$FF ; CPU:$EDA0 PRG:2DA0 C9 FF beq ResolveStageCollision_Block_10 ; CPU:$EDA2 PRG:2DA2 F0 10 cmp $91,x ; CPU:$EDA4 PRG:2DA4 D5 91 bcc ResolveStageCollision_Block_10 ; CPU:$EDA6 PRG:2DA6 90 0C sbc #$04 ; CPU:$EDA8 PRG:2DA8 E9 04 cmp $91,x ; CPU:$EDAA PRG:2DAA D5 91 bcs ResolveStageCollision_Block_10 ; CPU:$EDAC PRG:2DAC B0 06 lda $CC ; CPU:$EDAE PRG:2DAE A5 CC ora #$08 ; CPU:$EDB0 PRG:2DB0 09 08 ResolveStageCollision_Block_9: sta $CC ; CPU:$EDB2 PRG:2DB2 85 CC ResolveStageCollision_Block_10: lda $CC ; CPU:$EDB4 PRG:2DB4 A5 CC bne ResolveStageCollision_Block_12 ; CPU:$EDB6 PRG:2DB6 D0 07 dey ; CPU:$EDB8 PRG:2DB8 88 bmi ResolveStageCollision_Block_11 ; CPU:$EDB9 PRG:2DB9 30 03 jmp ResolveStageCollision_Load ; CPU:$EDBB PRG:2DBB 4C 44 ED ResolveStageCollision_Block_11: rts ; CPU:$EDBE PRG:2DBE 60 ResolveStageCollision_Block_12: lsr $CC ; CPU:$EDBF PRG:2DBF 46 CC bcc ResolveStageCollision_Block_13 ; CPU:$EDC1 PRG:2DC1 90 11 lda $041B,x ; CPU:$EDC3 PRG:2DC3 BD 1B 04 bmi ResolveStageCollision_Block_13 ; CPU:$EDC6 PRG:2DC6 30 0C lda ($27),y ; CPU:$EDC8 PRG:2DC8 B1 27 sbc #$18 ; CPU:$EDCA PRG:2DCA E9 18 sta $9A,x ; CPU:$EDCC PRG:2DCC 95 9A inc $9A,x ; CPU:$EDCE PRG:2DCE F6 9A lda #$01 ; CPU:$EDD0 PRG:2DD0 A9 01 sta $CB ; CPU:$EDD2 PRG:2DD2 85 CB ResolveStageCollision_Block_13: lsr $CC ; CPU:$EDD4 PRG:2DD4 46 CC bcc ResolveStageCollision_Block_15 ; CPU:$EDD6 PRG:2DD6 90 1A lda $041B,x ; CPU:$EDD8 PRG:2DD8 BD 1B 04 bpl ResolveStageCollision_Block_15 ; CPU:$EDDB PRG:2DDB 10 15 lda ($29),y ; CPU:$EDDD PRG:2DDD B1 29 ResolveStageCollision_Store: sta $9A,x ; CPU:$EDDF PRG:2DDF 95 9A jsr $F107 ; CPU:$EDE1 PRG:2DE1 20 07 F1 jsr $F18C ; CPU:$EDE4 PRG:2DE4 20 8C F1 cpx #$02 ; CPU:$EDE7 PRG:2DE7 E0 02 bcs ResolveStageCollision_Block_14 ; CPU:$EDE9 PRG:2DE9 B0 03 jsr $CC33 ; CPU:$EDEB PRG:2DEB 20 33 CC ResolveStageCollision_Block_14: lda $CB ; CPU:$EDEE PRG:2DEE A5 CB bne ResolveStageCollision_Block_18 ; CPU:$EDF0 PRG:2DF0 D0 30 ResolveStageCollision_Block_15: lsr $CC ; CPU:$EDF2 PRG:2DF2 46 CC bcc ResolveStageCollision_Block_16 ; CPU:$EDF4 PRG:2DF4 90 07 lda $042D,x ; CPU:$EDF6 PRG:2DF6 BD 2D 04 bmi ResolveStageCollision_Block_16 ; CPU:$EDF9 PRG:2DF9 30 02 bpl ResolveStageCollision_Block_17 ; CPU:$EDFB PRG:2DFB 10 09 ResolveStageCollision_Block_16: lsr $CC ; CPU:$EDFD PRG:2DFD 46 CC bcc ResolveStageCollision_Block_18 ; CPU:$EDFF PRG:2DFF 90 21 lda $042D,x ; CPU:$EE01 PRG:2E01 BD 2D 04 bpl ResolveStageCollision_Block_18 ; CPU:$EE04 PRG:2E04 10 1C ResolveStageCollision_Block_17: jsr $F0DE ; CPU:$EE06 PRG:2E06 20 DE F0 jsr $F172 ; CPU:$EE09 PRG:2E09 20 72 F1 lda $042D,x ; CPU:$EE0C PRG:2E0C BD 2D 04 ora $0424,x ; CPU:$EE0F PRG:2E0F 1D 24 04 beq ResolveStageCollision_Block_18 ; CPU:$EE12 PRG:2E12 F0 0E lda $0448,x ; CPU:$EE14 PRG:2E14 BD 48 04 eor #$01 ; CPU:$EE17 PRG:2E17 49 01 sta $0448,x ; CPU:$EE19 PRG:2E19 9D 48 04 lda $F1 ; CPU:$EE1C PRG:2E1C A5 F1 ora #$02 ; CPU:$EE1E PRG:2E1E 09 02 sta $F1 ; CPU:$EE20 PRG:2E20 85 F1 ResolveStageCollision_Block_18: rts ; CPU:$EE22 PRG:2E22 60 ; CheckObjectInteractions ; Purpose: compare active object pairs and dispatch overlap resolution. ; Inputs: active object arrays. ; Returns: collisions resolved; event and score state may be updated. CheckObjectInteractions: ldx #$07 ; CPU:$EE23 PRG:2E23 A2 07 CheckObjectInteractions_Block: stx $12 ; CPU:$EE25 PRG:2E25 86 12 ldy $12 ; CPU:$EE27 PRG:2E27 A4 12 dey ; CPU:$EE29 PRG:2E29 88 bpl CheckObjectInteractions_Load ; CPU:$EE2A PRG:2E2A 10 03 CheckObjectInteractions_Block_1: jmp CheckObjectInteractions_Decrement ; CPU:$EE2C PRG:2E2C 4C 2A EF CheckObjectInteractions_Load: lda $88,x ; CPU:$EE2F PRG:2E2F B5 88 bmi CheckObjectInteractions_Block_1 ; CPU:$EE31 PRG:2E31 30 F9 beq CheckObjectInteractions_Block_1 ; CPU:$EE33 PRG:2E33 F0 F7 lda a:$0088,y ; CPU:$EE35 PRG:2E35 B9 88 00 bmi CheckObjectInteractions_Block_1 ; CPU:$EE38 PRG:2E38 30 F2 beq CheckObjectInteractions_Block_1 ; CPU:$EE3A PRG:2E3A F0 F0 lda #$00 ; CPU:$EE3C PRG:2E3C A9 00 sta $CC ; CPU:$EE3E PRG:2E3E 85 CC lda a:$009A,y ; CPU:$EE40 PRG:2E40 B9 9A 00 sec ; CPU:$EE43 PRG:2E43 38 sbc $9A,x ; CPU:$EE44 PRG:2E44 F5 9A jsr $F08E ; CPU:$EE46 PRG:2E46 20 8E F0 cmp #$18 ; CPU:$EE49 PRG:2E49 C9 18 bcs CheckObjectInteractions_Block_7 ; CPU:$EE4B PRG:2E4B B0 71 lda $9A,x ; CPU:$EE4D PRG:2E4D B5 9A clc ; CPU:$EE4F PRG:2E4F 18 adc #$18 ; CPU:$EE50 PRG:2E50 69 18 sta $12 ; CPU:$EE52 PRG:2E52 85 12 lda a:$009A,y ; CPU:$EE54 PRG:2E54 B9 9A 00 clc ; CPU:$EE57 PRG:2E57 18 adc #$07 ; CPU:$EE58 PRG:2E58 69 07 sec ; CPU:$EE5A PRG:2E5A 38 sbc $12 ; CPU:$EE5B PRG:2E5B E5 12 jsr $F08E ; CPU:$EE5D PRG:2E5D 20 8E F0 cmp #$04 ; CPU:$EE60 PRG:2E60 C9 04 bcs CheckObjectInteractions_Block_2 ; CPU:$EE62 PRG:2E62 B0 04 lda #$01 ; CPU:$EE64 PRG:2E64 A9 01 bne CheckObjectInteractions_Block_3 ; CPU:$EE66 PRG:2E66 D0 12 CheckObjectInteractions_Block_2: lda a:$009A,y ; CPU:$EE68 PRG:2E68 B9 9A 00 clc ; CPU:$EE6B PRG:2E6B 18 adc #$11 ; CPU:$EE6C PRG:2E6C 69 11 sec ; CPU:$EE6E PRG:2E6E 38 sbc $9A,x ; CPU:$EE6F PRG:2E6F F5 9A jsr $F08E ; CPU:$EE71 PRG:2E71 20 8E F0 cmp #$04 ; CPU:$EE74 PRG:2E74 C9 04 bcs CheckObjectInteractions_Block_4 ; CPU:$EE76 PRG:2E76 B0 15 lda #$02 ; CPU:$EE78 PRG:2E78 A9 02 CheckObjectInteractions_Block_3: sta $CC ; CPU:$EE7A PRG:2E7A 85 CC lda a:$0091,y ; CPU:$EE7C PRG:2E7C B9 91 00 sec ; CPU:$EE7F PRG:2E7F 38 sbc $91,x ; CPU:$EE80 PRG:2E80 F5 91 jsr $F08E ; CPU:$EE82 PRG:2E82 20 8E F0 cmp #$10 ; CPU:$EE85 PRG:2E85 C9 10 bcc CheckObjectInteractions_Block_4 ; CPU:$EE87 PRG:2E87 90 04 lda #$00 ; CPU:$EE89 PRG:2E89 A9 00 sta $CC ; CPU:$EE8B PRG:2E8B 85 CC CheckObjectInteractions_Block_4: lda $91,x ; CPU:$EE8D PRG:2E8D B5 91 clc ; CPU:$EE8F PRG:2E8F 18 adc #$10 ; CPU:$EE90 PRG:2E90 69 10 sta $12 ; CPU:$EE92 PRG:2E92 85 12 lda a:$0091,y ; CPU:$EE94 PRG:2E94 B9 91 00 clc ; CPU:$EE97 PRG:2E97 18 adc #$07 ; CPU:$EE98 PRG:2E98 69 07 sec ; CPU:$EE9A PRG:2E9A 38 sbc $12 ; CPU:$EE9B PRG:2E9B E5 12 jsr $F08E ; CPU:$EE9D PRG:2E9D 20 8E F0 cmp #$04 ; CPU:$EEA0 PRG:2EA0 C9 04 bcs CheckObjectInteractions_Block_5 ; CPU:$EEA2 PRG:2EA2 B0 04 lda #$04 ; CPU:$EEA4 PRG:2EA4 A9 04 bne CheckObjectInteractions_Block_6 ; CPU:$EEA6 PRG:2EA6 D0 12 CheckObjectInteractions_Block_5: lda a:$0091,y ; CPU:$EEA8 PRG:2EA8 B9 91 00 clc ; CPU:$EEAB PRG:2EAB 18 adc #$09 ; CPU:$EEAC PRG:2EAC 69 09 sec ; CPU:$EEAE PRG:2EAE 38 sbc $91,x ; CPU:$EEAF PRG:2EAF F5 91 jsr $F08E ; CPU:$EEB1 PRG:2EB1 20 8E F0 cmp #$04 ; CPU:$EEB4 PRG:2EB4 C9 04 bcs CheckObjectInteractions_Block_7 ; CPU:$EEB6 PRG:2EB6 B0 06 lda #$08 ; CPU:$EEB8 PRG:2EB8 A9 08 CheckObjectInteractions_Block_6: ora $CC ; CPU:$EEBA PRG:2EBA 05 CC sta $CC ; CPU:$EEBC PRG:2EBC 85 CC CheckObjectInteractions_Block_7: lda #$00 ; CPU:$EEBE PRG:2EBE A9 00 sta $4B ; CPU:$EEC0 PRG:2EC0 85 4B lsr $CC ; CPU:$EEC2 PRG:2EC2 46 CC bcc CheckObjectInteractions_Block_8 ; CPU:$EEC4 PRG:2EC4 90 05 jsr $F0A6 ; CPU:$EEC6 PRG:2EC6 20 A6 F0 bmi CheckObjectInteractions_Block_9 ; CPU:$EEC9 PRG:2EC9 30 09 CheckObjectInteractions_Block_8: lsr $CC ; CPU:$EECB PRG:2ECB 46 CC bcc CheckObjectInteractions_Block_11 ; CPU:$EECD PRG:2ECD 90 20 jsr $F0A6 ; CPU:$EECF PRG:2ECF 20 A6 F0 bmi CheckObjectInteractions_Block_11 ; CPU:$EED2 PRG:2ED2 30 1B CheckObjectInteractions_Block_9: jsr $F0BD ; CPU:$EED4 PRG:2ED4 20 BD F0 bcs CheckObjectInteractions_Block_10 ; CPU:$EED7 PRG:2ED7 B0 12 jsr $F107 ; CPU:$EED9 PRG:2ED9 20 07 F1 jsr $F18C ; CPU:$EEDC PRG:2EDC 20 8C F1 jsr $F0B4 ; CPU:$EEDF PRG:2EDF 20 B4 F0 jsr $F107 ; CPU:$EEE2 PRG:2EE2 20 07 F1 jsr $F18C ; CPU:$EEE5 PRG:2EE5 20 8C F1 jsr $F0B4 ; CPU:$EEE8 PRG:2EE8 20 B4 F0 CheckObjectInteractions_Block_10: lda #$01 ; CPU:$EEEB PRG:2EEB A9 01 sta $4B ; CPU:$EEED PRG:2EED 85 4B CheckObjectInteractions_Block_11: lsr $CC ; CPU:$EEEF PRG:2EEF 46 CC bcc CheckObjectInteractions_Block_12 ; CPU:$EEF1 PRG:2EF1 90 05 jsr $F098 ; CPU:$EEF3 PRG:2EF3 20 98 F0 bmi CheckObjectInteractions_Block_13 ; CPU:$EEF6 PRG:2EF6 30 09 CheckObjectInteractions_Block_12: lsr $CC ; CPU:$EEF8 PRG:2EF8 46 CC bcc CheckObjectInteractions_Block_15 ; CPU:$EEFA PRG:2EFA 90 20 jsr $F098 ; CPU:$EEFC PRG:2EFC 20 98 F0 bmi CheckObjectInteractions_Block_15 ; CPU:$EEFF PRG:2EFF 30 1B CheckObjectInteractions_Block_13: jsr $F0BD ; CPU:$EF01 PRG:2F01 20 BD F0 bcs CheckObjectInteractions_Block_14 ; CPU:$EF04 PRG:2F04 B0 12 jsr $F0DE ; CPU:$EF06 PRG:2F06 20 DE F0 jsr $F172 ; CPU:$EF09 PRG:2F09 20 72 F1 jsr $F0B4 ; CPU:$EF0C PRG:2F0C 20 B4 F0 jsr $F0DE ; CPU:$EF0F PRG:2F0F 20 DE F0 jsr $F172 ; CPU:$EF12 PRG:2F12 20 72 F1 jsr $F0B4 ; CPU:$EF15 PRG:2F15 20 B4 F0 CheckObjectInteractions_Block_14: lda #$01 ; CPU:$EF18 PRG:2F18 A9 01 sta $4B ; CPU:$EF1A PRG:2F1A 85 4B CheckObjectInteractions_Block_15: jsr ResolveObjectCollisionPair ; CPU:$EF1C PRG:2F1C 20 37 EF jsr $F0B4 ; CPU:$EF1F PRG:2F1F 20 B4 F0 jsr ResolveObjectCollisionPair ; CPU:$EF22 PRG:2F22 20 37 EF jsr $F0B4 ; CPU:$EF25 PRG:2F25 20 B4 F0 CheckObjectInteractions_Decrement: dey ; CPU:$EF28 PRG:2F28 88 bmi CheckObjectInteractions_Block_16 ; CPU:$EF29 PRG:2F29 30 03 jmp CheckObjectInteractions_Load ; CPU:$EF2B PRG:2F2B 4C 31 EE CheckObjectInteractions_Block_16: dex ; CPU:$EF2E PRG:2F2E CA bmi CheckObjectInteractions_Block_17 ; CPU:$EF2F PRG:2F2F 30 03 jmp CheckObjectInteractions_Block ; CPU:$EF31 PRG:2F31 4C 27 EE CheckObjectInteractions_Block_17: rts ; CPU:$EF34 PRG:2F34 60 ; ResolveObjectCollisionPair ; Purpose: resolve one overlapping pair and apply state, score, sound, and knockback effects. ; Inputs: X/Y = object pair. ; Returns: both object records and global event flags may change. ResolveObjectCollisionPair: cpx #$02 ; CPU:$EF35 PRG:2F35 E0 02 bcc ResolveObjectCollisionPair_Block ; CPU:$EF37 PRG:2F37 90 07 cpy #$02 ; CPU:$EF39 PRG:2F39 C0 02 bcc ResolveObjectCollisionPair_Block ; CPU:$EF3B PRG:2F3B 90 03 jmp ResolveObjectCollisionPair_Load ; CPU:$EF3D PRG:2F3D 4C 43 F0 ResolveObjectCollisionPair_Block: lda #$00 ; CPU:$EF40 PRG:2F40 A9 00 sta $0487 ; CPU:$EF42 PRG:2F42 8D 87 04 lda $0475,x ; CPU:$EF45 PRG:2F45 BD 75 04 beq ResolveObjectCollisionPair_Block_1 ; CPU:$EF48 PRG:2F48 F0 03 jmp ResolveObjectCollisionPair_Load ; CPU:$EF4A PRG:2F4A 4C 43 F0 ResolveObjectCollisionPair_Block_1: lda $4B ; CPU:$EF4D PRG:2F4D A5 4B bne ResolveObjectCollisionPair_Block_2 ; CPU:$EF4F PRG:2F4F D0 03 jmp ResolveObjectCollisionPair_Load ; CPU:$EF51 PRG:2F51 4C 43 F0 ResolveObjectCollisionPair_Block_2: cpx #$02 ; CPU:$EF54 PRG:2F54 E0 02 bcs ResolveObjectCollisionPair_Block_3 ; CPU:$EF56 PRG:2F56 B0 07 lda $BD,x ; CPU:$EF58 PRG:2F58 B5 BD beq ResolveObjectCollisionPair_Block_4 ; CPU:$EF5A PRG:2F5A F0 14 jmp ResolveObjectCollisionPair_Load ; CPU:$EF5C PRG:2F5C 4C 43 F0 ResolveObjectCollisionPair_Block_3: lda $88,x ; CPU:$EF5F PRG:2F5F B5 88 cmp #$01 ; CPU:$EF61 PRG:2F61 C9 01 bne ResolveObjectCollisionPair_Block_4 ; CPU:$EF63 PRG:2F63 D0 0B lda $7F,x ; CPU:$EF65 PRG:2F65 B5 7F cmp #$02 ; CPU:$EF67 PRG:2F67 C9 02 bcs ResolveObjectCollisionPair_Block_5 ; CPU:$EF69 PRG:2F69 B0 12 lda #$01 ; CPU:$EF6B PRG:2F6B A9 01 sta $0487 ; CPU:$EF6D PRG:2F6D 8D 87 04 ResolveObjectCollisionPair_Block_4: lda a:$009A,y ; CPU:$EF70 PRG:2F70 B9 9A 00 clc ; CPU:$EF73 PRG:2F73 18 adc #$04 ; CPU:$EF74 PRG:2F74 69 04 cmp $9A,x ; CPU:$EF76 PRG:2F76 D5 9A bcc ResolveObjectCollisionPair_Block_5 ; CPU:$EF78 PRG:2F78 90 03 jmp ResolveObjectCollisionPair_Load ; CPU:$EF7A PRG:2F7A 4C 43 F0 ResolveObjectCollisionPair_Block_5: lda #$14 ; CPU:$EF7D PRG:2F7D A9 14 sta $0475,x ; CPU:$EF7F PRG:2F7F 9D 75 04 lda #$00 ; CPU:$EF82 PRG:2F82 A9 00 sta $0436,x ; CPU:$EF84 PRG:2F84 9D 36 04 cpy #$02 ; CPU:$EF87 PRG:2F87 C0 02 bcc ResolveObjectCollisionPair_Block_6 ; CPU:$EF89 PRG:2F89 90 0A lda a:$0088,y ; CPU:$EF8B PRG:2F8B B9 88 00 cmp #$02 ; CPU:$EF8E PRG:2F8E C9 02 beq ResolveObjectCollisionPair_Block_6 ; CPU:$EF90 PRG:2F90 F0 03 jmp ResolveObjectCollisionPair_Load ; CPU:$EF92 PRG:2F92 4C 43 F0 ResolveObjectCollisionPair_Block_6: lda $F0 ; CPU:$EF95 PRG:2F95 A5 F0 ora #$02 ; CPU:$EF97 PRG:2F97 09 02 sta $F0 ; CPU:$EF99 PRG:2F99 85 F0 lda $88,x ; CPU:$EF9B PRG:2F9B B5 88 cmp #$02 ; CPU:$EF9D PRG:2F9D C9 02 bne ResolveObjectCollisionPair_Block_8 ; CPU:$EF9F PRG:2F9F D0 1D cpx #$02 ; CPU:$EFA1 PRG:2FA1 E0 02 bcs ResolveObjectCollisionPair_Block_8 ; CPU:$EFA3 PRG:2FA3 B0 19 sty $12 ; CPU:$EFA5 PRG:2FA5 84 12 ldy $7F,x ; CPU:$EFA7 PRG:2FA7 B4 7F lda CollisionResultStateTable,y ; CPU:$EFA9 PRG:2FA9 B9 53 F0 ldy $12 ; CPU:$EFAC PRG:2FAC A4 12 pha ; CPU:$EFAE PRG:2FAE 48 pla ; CPU:$EFAF PRG:2FAF 68 bne ResolveObjectCollisionPair_Block_7 ; CPU:$EFB0 PRG:2FB0 D0 03 jmp ResolveObjectCollisionPair_Load ; CPU:$EFB2 PRG:2FB2 4C 43 F0 ResolveObjectCollisionPair_Block_7: sta $7F,x ; CPU:$EFB5 PRG:2FB5 95 7F lda #$00 ; CPU:$EFB7 PRG:2FB7 A9 00 sta $0436,x ; CPU:$EFB9 PRG:2FB9 9D 36 04 beq ResolveObjectCollisionPair_Block_12 ; CPU:$EFBC PRG:2FBC F0 2A ResolveObjectCollisionPair_Block_8: dec $88,x ; CPU:$EFBE PRG:2FBE D6 88 bne ResolveObjectCollisionPair_Block_9 ; CPU:$EFC0 PRG:2FC0 D0 0A lda #$FF ; CPU:$EFC2 PRG:2FC2 A9 FF sta $041B,x ; CPU:$EFC4 PRG:2FC4 9D 1B 04 lda #$00 ; CPU:$EFC7 PRG:2FC7 A9 00 sta $0412,x ; CPU:$EFC9 PRG:2FC9 9D 12 04 ResolveObjectCollisionPair_Block_9: lda #$00 ; CPU:$EFCC PRG:2FCC A9 00 sta $7F,x ; CPU:$EFCE PRG:2FCE 95 7F sta $0424,x ; CPU:$EFD0 PRG:2FD0 9D 24 04 sta $042D,x ; CPU:$EFD3 PRG:2FD3 9D 2D 04 lda $91,x ; CPU:$EFD6 PRG:2FD6 B5 91 bmi ResolveObjectCollisionPair_Block_10 ; CPU:$EFD8 PRG:2FD8 30 04 lda #$FF ; CPU:$EFDA PRG:2FDA A9 FF bne ResolveObjectCollisionPair_Block_11 ; CPU:$EFDC PRG:2FDC D0 02 ResolveObjectCollisionPair_Block_10: lda #$00 ; CPU:$EFDE PRG:2FDE A9 00 ResolveObjectCollisionPair_Block_11: sta $046C,x ; CPU:$EFE0 PRG:2FE0 9D 6C 04 lda #$80 ; CPU:$EFE3 PRG:2FE3 A9 80 sta $0463,x ; CPU:$EFE5 PRG:2FE5 9D 63 04 ResolveObjectCollisionPair_Block_12: sty $12 ; CPU:$EFE8 PRG:2FE8 84 12 ldy $0451,x ; CPU:$EFEA PRG:2FEA BC 51 04 lda ObjectStateTransitionTable,y ; CPU:$EFED PRG:2FED B9 5E F0 sta $0451,x ; CPU:$EFF0 PRG:2FF0 9D 51 04 lda #$01 ; CPU:$EFF3 PRG:2FF3 A9 01 sta $047E,x ; CPU:$EFF5 PRG:2FF5 9D 7E 04 ldy $12 ; CPU:$EFF8 PRG:2FF8 A4 12 cpy #$02 ; CPU:$EFFA PRG:2FFA C0 02 bcs ResolveObjectCollisionPair_Load ; CPU:$EFFC PRG:2FFC B0 43 lda $0451,x ; CPU:$EFFE PRG:2FFE BD 51 04 cmp #$07 ; CPU:$F001 PRG:3001 C9 07 beq ResolveObjectCollisionPair_Block_13 ; CPU:$F003 PRG:3003 F0 0A cmp #$08 ; CPU:$F005 PRG:3005 C9 08 bcc ResolveObjectCollisionPair_Block_13 ; CPU:$F007 PRG:3007 90 06 lda $F1 ; CPU:$F009 PRG:3009 A5 F1 ora #$80 ; CPU:$F00B PRG:300B 09 80 sta $F1 ; CPU:$F00D PRG:300D 85 F1 ResolveObjectCollisionPair_Block_13: ldy $0451,x ; CPU:$F00F PRG:300F BC 51 04 lda CollisionSoundTable,y ; CPU:$F012 PRG:3012 B9 6A F0 sta $13 ; CPU:$F015 PRG:3015 85 13 lda $0487 ; CPU:$F017 PRG:3017 AD 87 04 beq ResolveObjectCollisionPair_Block_14 ; CPU:$F01A PRG:301A F0 05 lda CollisionScoreTable,y ; CPU:$F01C PRG:301C B9 76 F0 sta $13 ; CPU:$F01F PRG:301F 85 13 ResolveObjectCollisionPair_Block_14: lda CollisionEventTable,y ; CPU:$F021 PRG:3021 B9 82 F0 clc ; CPU:$F024 PRG:3024 18 adc $0487 ; CPU:$F025 PRG:3025 6D 87 04 sta $14 ; CPU:$F028 PRG:3028 85 14 lda $12 ; CPU:$F02A PRG:302A A5 12 sta $3E ; CPU:$F02C PRG:302C 85 3E pha ; CPU:$F02E PRG:302E 48 txa ; CPU:$F02F PRG:302F 8A pha ; CPU:$F030 PRG:3030 48 lda $13 ; CPU:$F031 PRG:3031 A5 13 pha ; CPU:$F033 PRG:3033 48 lda $14 ; CPU:$F034 PRG:3034 A5 14 jsr $D871 ; CPU:$F036 PRG:3036 20 71 D8 pla ; CPU:$F039 PRG:3039 68 jsr $D6DE ; CPU:$F03A PRG:303A 20 DE D6 pla ; CPU:$F03D PRG:303D 68 tax ; CPU:$F03E PRG:303E AA pla ; CPU:$F03F PRG:303F 68 tay ; CPU:$F040 PRG:3040 A8 ResolveObjectCollisionPair_Load: lda $0451,x ; CPU:$F041 PRG:3041 BD 51 04 cmp #$0B ; CPU:$F044 PRG:3044 C9 0B bne ResolveObjectCollisionPair_Block_15 ; CPU:$F046 PRG:3046 D0 08 lda $C8 ; CPU:$F048 PRG:3048 A5 C8 bne ResolveObjectCollisionPair_Block_15 ; CPU:$F04A PRG:304A D0 04 lda #$20 ; CPU:$F04C PRG:304C A9 20 sta $F0 ; CPU:$F04E PRG:304E 85 F0 ResolveObjectCollisionPair_Block_15: rts ; CPU:$F050 PRG:3050 60 ; Collision outcome state values indexed by collision class. CollisionResultStateTable: .byte $06, $06, $07, $08, $09, $0A, $00, $00, $00, $00, $00 ; CPU:$F051 PRG:3051 06 06 07 08 09 0A 00 00 00 00 00 ; Post-collision object-state transitions. ObjectStateTransitionTable: .byte $04, $05, $06, $07, $08, $09, $0A, $0B, $08, $09, $0A, $0B ; CPU:$F05C PRG:305C 04 05 06 07 08 09 0A 0B 08 09 0A 0B ; Collision sound/event magnitude values. CollisionSoundTable: .byte $00, $00, $00, $00, $32, $4B, $64, $64, $4B, $64, $96, $64 ; CPU:$F068 PRG:3068 00 00 00 00 32 4B 64 64 4B 64 96 64 ; Collision score/reward values. CollisionScoreTable: .byte $00, $00, $00, $00, $32, $4B, $64, $64, $64, $96, $C8, $64 ; CPU:$F074 PRG:3074 00 00 00 00 32 4B 64 64 64 96 C8 64 ; Collision event identifiers. CollisionEventTable: .byte $00, $00, $00, $00, $01, $02, $03, $03, $02, $03, $04, $03 ; CPU:$F080 PRG:3080 00 00 00 00 01 02 03 03 02 03 04 03 ; AbsoluteDifferenceA ; Purpose: return the absolute value of signed accumulator A. ; Inputs: A = signed delta. ; Returns: A = absolute magnitude. AbsoluteDifferenceA: pha ; CPU:$F08C PRG:308C 48 pla ; CPU:$F08D PRG:308D 68 bpl AbsoluteDifferenceA_Block ; CPU:$F08E PRG:308E 10 05 eor #$FF ; CPU:$F090 PRG:3090 49 FF clc ; CPU:$F092 PRG:3092 18 adc #$01 ; CPU:$F093 PRG:3093 69 01 AbsoluteDifferenceA_Block: rts ; CPU:$F095 PRG:3095 60 ; SubtractHorizontalVelocityPair ; Purpose: calculate Y-object minus X-object horizontal velocity. ; Inputs: X/Y = object indexes. ; Returns: A/high arithmetic state from $0424/$042D difference. SubtractHorizontalVelocityPair: lda $0424,y ; CPU:$F096 PRG:3096 B9 24 04 sec ; CPU:$F099 PRG:3099 38 sbc $0424,x ; CPU:$F09A PRG:309A FD 24 04 lda $042D,y ; CPU:$F09D PRG:309D B9 2D 04 sbc $042D,x ; CPU:$F0A0 PRG:30A0 FD 2D 04 rts ; CPU:$F0A3 PRG:30A3 60 ; SubtractVerticalVelocityPair ; Purpose: calculate Y-object minus X-object vertical velocity. ; Inputs: X/Y = object indexes. ; Returns: A/high arithmetic state from $0412/$041B difference. SubtractVerticalVelocityPair: lda $0412,y ; CPU:$F0A4 PRG:30A4 B9 12 04 sec ; CPU:$F0A7 PRG:30A7 38 sbc $0412,x ; CPU:$F0A8 PRG:30A8 FD 12 04 lda $041B,y ; CPU:$F0AB PRG:30AB B9 1B 04 sbc $041B,x ; CPU:$F0AE PRG:30AE FD 1B 04 rts ; CPU:$F0B1 PRG:30B1 60 ; SwapObjectIndexes ; Purpose: exchange X and Y through scratch bytes. ; Inputs: X/Y = object indexes. ; Returns: X/Y swapped. SwapObjectIndexes: stx $12 ; CPU:$F0B2 PRG:30B2 86 12 sty $13 ; CPU:$F0B4 PRG:30B4 84 13 ldx $13 ; CPU:$F0B6 PRG:30B6 A6 13 ldy $12 ; CPU:$F0B8 PRG:30B8 A4 12 rts ; CPU:$F0BA PRG:30BA 60 ; TestPairCollisionEligibility ; Purpose: test whether an object pair can participate in collision response. ; Inputs: X/Y = object indexes. ; Returns: A = zero if rejected, nonzero if eligible. TestPairCollisionEligibility: cpx #$02 ; CPU:$F0BB PRG:30BB E0 02 bcc TestPairCollisionEligibility_Block ; CPU:$F0BD PRG:30BD 90 1C lda $7F,x ; CPU:$F0BF PRG:30BF B5 7F cmp #$02 ; CPU:$F0C1 PRG:30C1 C9 02 bcc TestPairCollisionEligibility_Block ; CPU:$F0C3 PRG:30C3 90 16 lda #$01 ; CPU:$F0C5 PRG:30C5 A9 01 cmp $88,x ; CPU:$F0C7 PRG:30C7 D5 88 bcs TestPairCollisionEligibility_Block ; CPU:$F0C9 PRG:30C9 B0 10 cpy #$02 ; CPU:$F0CB PRG:30CB C0 02 bcc TestPairCollisionEligibility_Block ; CPU:$F0CD PRG:30CD 90 0C lda a:$007F,y ; CPU:$F0CF PRG:30CF B9 7F 00 cmp #$02 ; CPU:$F0D2 PRG:30D2 C9 02 bcc TestPairCollisionEligibility_Block ; CPU:$F0D4 PRG:30D4 90 05 lda #$01 ; CPU:$F0D6 PRG:30D6 A9 01 cmp a:$0088,y ; CPU:$F0D8 PRG:30D8 D9 88 00 TestPairCollisionEligibility_Block: rts ; CPU:$F0DB PRG:30DB 60 ; NegateHorizontalMotion ; Purpose: negate an object horizontal velocity and acceleration pair. ; Inputs: X = object slot. ; Returns: horizontal motion fields negated; direction flag normalized. NegateHorizontalMotion: lda #$00 ; CPU:$F0DC PRG:30DC A9 00 sec ; CPU:$F0DE PRG:30DE 38 sbc $0424,x ; CPU:$F0DF PRG:30DF FD 24 04 sta $0424,x ; CPU:$F0E2 PRG:30E2 9D 24 04 lda #$00 ; CPU:$F0E5 PRG:30E5 A9 00 sbc $042D,x ; CPU:$F0E7 PRG:30E7 FD 2D 04 sta $042D,x ; CPU:$F0EA PRG:30EA 9D 2D 04 lda #$00 ; CPU:$F0ED PRG:30ED A9 00 sec ; CPU:$F0EF PRG:30EF 38 sbc $0463,x ; CPU:$F0F0 PRG:30F0 FD 63 04 sta $0463,x ; CPU:$F0F3 PRG:30F3 9D 63 04 lda #$00 ; CPU:$F0F6 PRG:30F6 A9 00 sbc $046C,x ; CPU:$F0F8 PRG:30F8 FD 6C 04 sta $046C,x ; CPU:$F0FB PRG:30FB 9D 6C 04 lda $31,x ; CPU:$F0FE PRG:30FE B5 31 and #$40 ; CPU:$F100 PRG:3100 29 40 sta $31,x ; CPU:$F102 PRG:3102 95 31 rts ; CPU:$F104 PRG:3104 60 ; NegateVerticalMotion ; Purpose: negate an object vertical velocity pair. ; Inputs: X = object slot. ; Returns: vertical motion fields negated. NegateVerticalMotion: lda #$00 ; CPU:$F105 PRG:3105 A9 00 sec ; CPU:$F107 PRG:3107 38 sbc $0412,x ; CPU:$F108 PRG:3108 FD 12 04 sta $0412,x ; CPU:$F10B PRG:310B 9D 12 04 lda #$00 ; CPU:$F10E PRG:310E A9 00 sbc $041B,x ; CPU:$F110 PRG:3110 FD 1B 04 sta $041B,x ; CPU:$F113 PRG:3113 9D 1B 04 rts ; CPU:$F116 PRG:3116 60 ; MultiplySignedValue ; Purpose: multiply a signed 16-bit value by an 8-bit factor. ; Inputs: signed value in $2B/$2C, multiplier in A. ; Returns: signed product in $2E-$30. MultiplySignedValue: sta $2D ; CPU:$F117 PRG:3117 85 2D lda $2C ; CPU:$F119 PRG:3119 A5 2C bpl MultiplyUnsigned16By8 ; CPU:$F11B PRG:311B 10 24 lda #$00 ; CPU:$F11D PRG:311D A9 00 sec ; CPU:$F11F PRG:311F 38 sbc $2B ; CPU:$F120 PRG:3120 E5 2B sta $2B ; CPU:$F122 PRG:3122 85 2B lda #$00 ; CPU:$F124 PRG:3124 A9 00 sbc $2C ; CPU:$F126 PRG:3126 E5 2C sta $2C ; CPU:$F128 PRG:3128 85 2C jsr MultiplyUnsigned16By8 ; CPU:$F12A PRG:312A 20 43 F1 lda #$00 ; CPU:$F12D PRG:312D A9 00 sec ; CPU:$F12F PRG:312F 38 sbc $2E ; CPU:$F130 PRG:3130 E5 2E sta $2E ; CPU:$F132 PRG:3132 85 2E lda #$00 ; CPU:$F134 PRG:3134 A9 00 sbc $2F ; CPU:$F136 PRG:3136 E5 2F sta $2F ; CPU:$F138 PRG:3138 85 2F lda #$00 ; CPU:$F13A PRG:313A A9 00 sbc $30 ; CPU:$F13C PRG:313C E5 30 sta $30 ; CPU:$F13E PRG:313E 85 30 rts ; CPU:$F140 PRG:3140 60 ; MultiplyUnsigned16By8 ; Purpose: perform the unsigned shift-add multiply core. ; Inputs: $2B/$2C multiplicand, $2D multiplier. ; Returns: 24-bit product in $2E-$30. MultiplyUnsigned16By8: txa ; CPU:$F141 PRG:3141 8A pha ; CPU:$F142 PRG:3142 48 lda #$00 ; CPU:$F143 PRG:3143 A9 00 sta $2E ; CPU:$F145 PRG:3145 85 2E sta $2F ; CPU:$F147 PRG:3147 85 2F sta $30 ; CPU:$F149 PRG:3149 85 30 ldx #$08 ; CPU:$F14B PRG:314B A2 08 MultiplyUnsigned16By8_Block: asl $2E ; CPU:$F14D PRG:314D 06 2E rol $2F ; CPU:$F14F PRG:314F 26 2F rol $30 ; CPU:$F151 PRG:3151 26 30 asl $2D ; CPU:$F153 PRG:3153 06 2D bcc MultiplyUnsigned16By8_Block_1 ; CPU:$F155 PRG:3155 90 13 clc ; CPU:$F157 PRG:3157 18 lda $2B ; CPU:$F158 PRG:3158 A5 2B adc $2E ; CPU:$F15A PRG:315A 65 2E sta $2E ; CPU:$F15C PRG:315C 85 2E lda $2C ; CPU:$F15E PRG:315E A5 2C adc $2F ; CPU:$F160 PRG:3160 65 2F sta $2F ; CPU:$F162 PRG:3162 85 2F lda #$00 ; CPU:$F164 PRG:3164 A9 00 adc $30 ; CPU:$F166 PRG:3166 65 30 sta $30 ; CPU:$F168 PRG:3168 85 30 MultiplyUnsigned16By8_Block_1: dex ; CPU:$F16A PRG:316A CA bne MultiplyUnsigned16By8_Block ; CPU:$F16B PRG:316B D0 E0 pla ; CPU:$F16D PRG:316D 68 tax ; CPU:$F16E PRG:316E AA rts ; CPU:$F16F PRG:316F 60 ; ScaleHorizontalVelocity ; Purpose: scale horizontal velocity by the fixed collision factor. ; Inputs: X = object slot. ; Returns: $0424/$042D scaled. ScaleHorizontalVelocity: lda $0424,x ; CPU:$F170 PRG:3170 BD 24 04 sta $2B ; CPU:$F173 PRG:3173 85 2B lda $042D,x ; CPU:$F175 PRG:3175 BD 2D 04 sta $2C ; CPU:$F178 PRG:3178 85 2C lda #$CD ; CPU:$F17A PRG:317A A9 CD jsr MultiplySignedValue ; CPU:$F17C PRG:317C 20 19 F1 lda $2F ; CPU:$F17F PRG:317F A5 2F sta $0424,x ; CPU:$F181 PRG:3181 9D 24 04 lda $30 ; CPU:$F184 PRG:3184 A5 30 sta $042D,x ; CPU:$F186 PRG:3186 9D 2D 04 rts ; CPU:$F189 PRG:3189 60 ; ScaleVerticalVelocity ; Purpose: scale vertical velocity by the fixed collision factor. ; Inputs: X = object slot. ; Returns: $0412/$041B scaled. ScaleVerticalVelocity: lda $0412,x ; CPU:$F18A PRG:318A BD 12 04 sta $2B ; CPU:$F18D PRG:318D 85 2B lda $041B,x ; CPU:$F18F PRG:318F BD 1B 04 sta $2C ; CPU:$F192 PRG:3192 85 2C lda #$CD ; CPU:$F194 PRG:3194 A9 CD jsr MultiplySignedValue ; CPU:$F196 PRG:3196 20 19 F1 lda $2F ; CPU:$F199 PRG:3199 A5 2F sta $0412,x ; CPU:$F19B PRG:319B 9D 12 04 lda $30 ; CPU:$F19E PRG:319E A5 30 sta $041B,x ; CPU:$F1A0 PRG:31A0 9D 1B 04 rts ; CPU:$F1A3 PRG:31A3 60 ; ShiftInputVectorRight4 ; Purpose: arithmetic-shift the two-byte input vector right four places. ; Inputs: vector in $12/$13. ; Returns: scaled vector in $12/$13. ShiftInputVectorRight4: ldy #$04 ; CPU:$F1A4 PRG:31A4 A0 04 ShiftInputVectorRight4_Block: lda $13 ; CPU:$F1A6 PRG:31A6 A5 13 asl a ; CPU:$F1A8 PRG:31A8 0A ror $13 ; CPU:$F1A9 PRG:31A9 66 13 ror $12 ; CPU:$F1AB PRG:31AB 66 12 dey ; CPU:$F1AD PRG:31AD 88 bne ShiftInputVectorRight4_Block ; CPU:$F1AE PRG:31AE D0 F6 rts ; CPU:$F1B0 PRG:31B0 60 ; NextRandomByte ; Purpose: advance the game pseudo-random shift register. ; Inputs: random state in $1B/$1C. ; Returns: A and $1B contain the next random byte. NextRandomByte: txa ; CPU:$F1B1 PRG:31B1 8A pha ; CPU:$F1B2 PRG:31B2 48 ldx #$0B ; CPU:$F1B3 PRG:31B3 A2 0B NextRandomByte_Block: asl $1B ; CPU:$F1B5 PRG:31B5 06 1B rol $1C ; CPU:$F1B7 PRG:31B7 26 1C rol a ; CPU:$F1B9 PRG:31B9 2A rol a ; CPU:$F1BA PRG:31BA 2A eor $1B ; CPU:$F1BB PRG:31BB 45 1B rol a ; CPU:$F1BD PRG:31BD 2A eor $1B ; CPU:$F1BE PRG:31BE 45 1B lsr a ; CPU:$F1C0 PRG:31C0 4A lsr a ; CPU:$F1C1 PRG:31C1 4A eor #$FF ; CPU:$F1C2 PRG:31C2 49 FF and #$01 ; CPU:$F1C4 PRG:31C4 29 01 ora $1B ; CPU:$F1C6 PRG:31C6 05 1B sta $1B ; CPU:$F1C8 PRG:31C8 85 1B dex ; CPU:$F1CA PRG:31CA CA bne NextRandomByte_Block ; CPU:$F1CB PRG:31CB D0 E8 pla ; CPU:$F1CD PRG:31CD 68 tax ; CPU:$F1CE PRG:31CE AA lda $1B ; CPU:$F1CF PRG:31CF A5 1B rts ; CPU:$F1D1 PRG:31D1 60 NextRandomByte_Block_1: jsr $DAC1 ; CPU:$F1D2 PRG:31D2 20 C1 DA ldx #$09 ; CPU:$F1D5 PRG:31D5 A2 09 NextRandomByte_Block_2: lda #$00 ; CPU:$F1D7 PRG:31D7 A9 00 sta $03,x ; CPU:$F1D9 PRG:31D9 95 03 dex ; CPU:$F1DB PRG:31DB CA bpl NextRandomByte_Block_2 ; CPU:$F1DC PRG:31DC 10 F9 sta $3E ; CPU:$F1DE PRG:31DE 85 3E inc $41 ; CPU:$F1E0 PRG:31E0 E6 41 jsr $D6DE ; CPU:$F1E2 PRG:31E2 20 DE D6 lda #$0F ; CPU:$F1E5 PRG:31E5 A9 0F sta $4015 ; CPU:$F1E7 PRG:31E7 8D 15 40 lda #$01 ; CPU:$F1EA PRG:31EA A9 01 sta $F0 ; CPU:$F1EC PRG:31EC 85 F0 lda #$02 ; CPU:$F1EE PRG:31EE A9 02 ; InitializeRoundObjects ; Purpose: initialize object slots and round-specific gameplay state. ; Inputs: round/stage globals. ; Returns: object arrays, sound state, and counters initialized. InitializeRoundObjects: sta $41 ; CPU:$F1F0 PRG:31F0 85 41 ldy $40 ; CPU:$F1F2 PRG:31F2 A4 40 bne InitializeRoundObjects_Block ; CPU:$F1F4 PRG:31F4 D0 02 lda #$FF ; CPU:$F1F6 PRG:31F6 A9 FF InitializeRoundObjects_Block: sta $42 ; CPU:$F1F8 PRG:31F8 85 42 ldx #$00 ; CPU:$F1FA PRG:31FA A2 00 stx $0488 ; CPU:$F1FC PRG:31FC 8E 88 04 stx $3B ; CPU:$F1FF PRG:31FF 86 3B stx $3C ; CPU:$F201 PRG:3201 86 3C stx $0558 ; CPU:$F203 PRG:3203 8E 58 05 dex ; CPU:$F206 PRG:3206 CA stx $89 ; CPU:$F207 PRG:3207 86 89 ldx $40 ; CPU:$F209 PRG:3209 A6 40 InitializeRoundObjects_Block_1: jsr $F3B0 ; CPU:$F20B PRG:320B 20 B0 F3 dex ; CPU:$F20E PRG:320E CA bpl InitializeRoundObjects_Block_1 ; CPU:$F20F PRG:320F 10 FA InitializeRoundObjects_Load: lda #$00 ; CPU:$F211 PRG:3211 A9 00 sta $C8 ; CPU:$F213 PRG:3213 85 C8 lda $3C ; CPU:$F215 PRG:3215 A5 3C lsr a ; CPU:$F217 PRG:3217 4A lsr a ; CPU:$F218 PRG:3218 4A cmp #$08 ; CPU:$F219 PRG:3219 C9 08 bcc InitializeRoundObjects_Block_2 ; CPU:$F21B PRG:321B 90 02 lda #$08 ; CPU:$F21D PRG:321D A9 08 InitializeRoundObjects_Block_2: tax ; CPU:$F21F PRG:321F AA lda RoundObjectTypeTable,x ; CPU:$F220 PRG:3220 BD BA F3 sta $C6 ; CPU:$F223 PRG:3223 85 C6 lda RoundObjectPositionTable,x ; CPU:$F225 PRG:3225 BD C3 F3 sta $C7 ; CPU:$F228 PRG:3228 85 C7 lda $3C ; CPU:$F22A PRG:322A A5 3C cmp #$02 ; CPU:$F22C PRG:322C C9 02 bcs InitializeRoundObjects_Block_3 ; CPU:$F22E PRG:322E B0 06 lda #$03 ; CPU:$F230 PRG:3230 A9 03 sta $C6 ; CPU:$F232 PRG:3232 85 C6 sta $C7 ; CPU:$F234 PRG:3234 85 C7 InitializeRoundObjects_Block_3: ldx #$07 ; CPU:$F236 PRG:3236 A2 07 InitializeRoundObjects_Block_4: lda #$00 ; CPU:$F238 PRG:3238 A9 00 sta $0448,x ; CPU:$F23A PRG:323A 9D 48 04 sta $0475,x ; CPU:$F23D PRG:323D 9D 75 04 sta $047E,x ; CPU:$F240 PRG:3240 9D 7E 04 sta $0424,x ; CPU:$F243 PRG:3243 9D 24 04 sta $042D,x ; CPU:$F246 PRG:3246 9D 2D 04 sta $0412,x ; CPU:$F249 PRG:3249 9D 12 04 sta $041B,x ; CPU:$F24C PRG:324C 9D 1B 04 sta $0463,x ; CPU:$F24F PRG:324F 9D 63 04 sta $046C,x ; CPU:$F252 PRG:3252 9D 6C 04 sta $0400,x ; CPU:$F255 PRG:3255 9D 00 04 sta $0409,x ; CPU:$F258 PRG:3258 9D 09 04 lda #$01 ; CPU:$F25B PRG:325B A9 01 sta $043F,x ; CPU:$F25D PRG:325D 9D 3F 04 sta $045A,x ; CPU:$F260 PRG:3260 9D 5A 04 lda #$03 ; CPU:$F263 PRG:3263 A9 03 sta $0436,x ; CPU:$F265 PRG:3265 9D 36 04 dex ; CPU:$F268 PRG:3268 CA bpl InitializeRoundObjects_Block_4 ; CPU:$F269 PRG:3269 10 CD ldx #$05 ; CPU:$F26B PRG:326B A2 05 InitializeRoundObjects_Block_5: lda #$FF ; CPU:$F26D PRG:326D A9 FF sta $8A,x ; CPU:$F26F PRG:326F 95 8A dex ; CPU:$F271 PRG:3271 CA bpl InitializeRoundObjects_Block_5 ; CPU:$F272 PRG:3272 10 F9 ldx $40 ; CPU:$F274 PRG:3274 A6 40 InitializeRoundObjects_Block_6: jsr ResetObjectMotion ; CPU:$F276 PRG:3276 20 86 F3 dex ; CPU:$F279 PRG:3279 CA bpl InitializeRoundObjects_Block_6 ; CPU:$F27A PRG:327A 10 FA jsr $D246 ; CPU:$F27C PRG:327C 20 46 D2 jsr $D293 ; CPU:$F27F PRG:327F 20 93 D2 lda $C6 ; CPU:$F282 PRG:3282 A5 C6 cmp #$10 ; CPU:$F284 PRG:3284 C9 10 bcs InitializeRoundObjects_Block_7 ; CPU:$F286 PRG:3286 B0 04 lda #$58 ; CPU:$F288 PRG:3288 A9 58 sta $C6 ; CPU:$F28A PRG:328A 85 C6 InitializeRoundObjects_Block_7: jsr $F4A5 ; CPU:$F28C PRG:328C 20 A5 F4 jsr $D8FF ; CPU:$F28F PRG:328F 20 FF D8 lda $16 ; CPU:$F292 PRG:3292 A5 16 beq InitializeRoundObjects_Block_8 ; CPU:$F294 PRG:3294 F0 03 jmp $C1C5 ; CPU:$F296 PRG:3296 4C C5 C1 InitializeRoundObjects_Block_8: lda $C8 ; CPU:$F299 PRG:3299 A5 C8 beq InitializeRoundObjects_Block_9 ; CPU:$F29B PRG:329B F0 03 jmp $CF13 ; CPU:$F29D PRG:329D 4C 13 CF InitializeRoundObjects_Block_9: jsr $C716 ; CPU:$F2A0 PRG:32A0 20 16 C7 lda $3B ; CPU:$F2A3 PRG:32A3 A5 3B and #$03 ; CPU:$F2A5 PRG:32A5 29 03 bne InitializeRoundObjects_Block_10 ; CPU:$F2A7 PRG:32A7 D0 08 lda #$08 ; CPU:$F2A9 PRG:32A9 A9 08 sta $F2 ; CPU:$F2AB PRG:32AB 85 F2 ldx $3A ; CPU:$F2AD PRG:32AD A6 3A bne InitializeRoundObjects_Block_11 ; CPU:$F2AF PRG:32AF D0 06 InitializeRoundObjects_Block_10: lda #$FF ; CPU:$F2B1 PRG:32B1 A9 FF sta $3D ; CPU:$F2B3 PRG:32B3 85 3D inc $3C ; CPU:$F2B5 PRG:32B5 E6 3C InitializeRoundObjects_Block_11: jsr $F470 ; CPU:$F2B7 PRG:32B7 20 70 F4 lda $3D ; CPU:$F2BA PRG:32BA A5 3D beq InitializeRoundObjects_Block_12 ; CPU:$F2BC PRG:32BC F0 05 dec $3D ; CPU:$F2BE PRG:32BE C6 3D jsr $F3CC ; CPU:$F2C0 PRG:32C0 20 CC F3 InitializeRoundObjects_Block_12: jsr NextRandomByte ; CPU:$F2C3 PRG:32C3 20 B3 F1 jsr $E691 ; CPU:$F2C6 PRG:32C6 20 91 E6 jsr $C6F9 ; CPU:$F2C9 PRG:32C9 20 F9 C6 jsr $C790 ; CPU:$F2CC PRG:32CC 20 90 C7 jsr $C831 ; CPU:$F2CF PRG:32CF 20 31 C8 jsr $C8B7 ; CPU:$F2D2 PRG:32D2 20 B7 C8 jsr $D8DD ; CPU:$F2D5 PRG:32D5 20 DD D8 jsr $E587 ; CPU:$F2D8 PRG:32D8 20 87 E5 jsr $CB74 ; CPU:$F2DB PRG:32DB 20 74 CB inc $4C ; CPU:$F2DE PRG:32DE E6 4C ldx $40 ; CPU:$F2E0 PRG:32E0 A6 40 InitializeRoundObjects_Block_13: lda $88,x ; CPU:$F2E2 PRG:32E2 B5 88 bpl InitializeRoundObjects_Block_14 ; CPU:$F2E4 PRG:32E4 10 25 lda $3A ; CPU:$F2E6 PRG:32E6 A5 3A bne InitializeRoundObjects_Block_16 ; CPU:$F2E8 PRG:32E8 D0 3A lda $41,x ; CPU:$F2EA PRG:32EA B5 41 bmi InitializeRoundObjects_Block_14 ; CPU:$F2EC PRG:32EC 30 1D dec $C3,x ; CPU:$F2EE PRG:32EE D6 C3 bne InitializeRoundObjects_Block_17 ; CPU:$F2F0 PRG:32F0 D0 33 txa ; CPU:$F2F2 PRG:32F2 8A pha ; CPU:$F2F3 PRG:32F3 48 jsr $C726 ; CPU:$F2F4 PRG:32F4 20 26 C7 pla ; CPU:$F2F7 PRG:32F7 68 tax ; CPU:$F2F8 PRG:32F8 AA ldy #$02 ; CPU:$F2F9 PRG:32F9 A0 02 dec $41,x ; CPU:$F2FB PRG:32FB D6 41 sty $46 ; CPU:$F2FD PRG:32FD 84 46 bmi InitializeRoundObjects_Block_14 ; CPU:$F2FF PRG:32FF 30 0A jsr ResetObjectMotion ; CPU:$F301 PRG:3301 20 86 F3 jsr $F3B0 ; CPU:$F304 PRG:3304 20 B0 F3 lda #$80 ; CPU:$F307 PRG:3307 A9 80 sta $F2 ; CPU:$F309 PRG:3309 85 F2 InitializeRoundObjects_Block_14: dex ; CPU:$F30B PRG:330B CA bpl InitializeRoundObjects_Block_13 ; CPU:$F30C PRG:330C 10 D4 lda $41 ; CPU:$F30E PRG:330E A5 41 bpl InitializeRoundObjects_Block_15 ; CPU:$F310 PRG:3310 10 04 lda $42 ; CPU:$F312 PRG:3312 A5 42 bmi InitializeRoundObjects_Block_23 ; CPU:$F314 PRG:3314 30 4E InitializeRoundObjects_Block_15: lda $3A ; CPU:$F316 PRG:3316 A5 3A beq InitializeRoundObjects_Block_17 ; CPU:$F318 PRG:3318 F0 0B jsr $E768 ; CPU:$F31A PRG:331A 20 68 E7 lda $061C ; CPU:$F31D PRG:331D AD 1C 06 and #$30 ; CPU:$F320 PRG:3320 29 30 beq InitializeRoundObjects_Block_11 ; CPU:$F322 PRG:3322 F0 93 InitializeRoundObjects_Block_16: rts ; CPU:$F324 PRG:3324 60 InitializeRoundObjects_Block_17: ldx #$05 ; CPU:$F325 PRG:3325 A2 05 InitializeRoundObjects_Block_18: lda $8A,x ; CPU:$F327 PRG:3327 B5 8A beq InitializeRoundObjects_Block_19 ; CPU:$F329 PRG:3329 F0 02 bpl InitializeRoundObjects_Block_11 ; CPU:$F32B PRG:332B 10 8A InitializeRoundObjects_Block_19: dex ; CPU:$F32D PRG:332D CA bpl InitializeRoundObjects_Block_18 ; CPU:$F32E PRG:332E 10 F7 lda $BB ; CPU:$F330 PRG:3330 A5 BB bpl InitializeRoundObjects_Block_11 ; CPU:$F332 PRG:3332 10 83 ldx $40 ; CPU:$F334 PRG:3334 A6 40 InitializeRoundObjects_Block_20: ldy $88,x ; CPU:$F336 PRG:3336 B4 88 dey ; CPU:$F338 PRG:3338 88 bpl InitializeRoundObjects_Block_21 ; CPU:$F339 PRG:3339 10 0F lda $41,x ; CPU:$F33B PRG:333B B5 41 bmi InitializeRoundObjects_Block_21 ; CPU:$F33D PRG:333D 30 0B lda #$FF ; CPU:$F33F PRG:333F A9 FF sta $88,x ; CPU:$F341 PRG:3341 95 88 lda #$01 ; CPU:$F343 PRG:3343 A9 01 sta $C3,x ; CPU:$F345 PRG:3345 95 C3 jmp InitializeRoundObjects_Block_11 ; CPU:$F347 PRG:3347 4C B9 F2 InitializeRoundObjects_Block_21: dex ; CPU:$F34A PRG:334A CA bpl InitializeRoundObjects_Block_20 ; CPU:$F34B PRG:334B 10 E9 lda #$02 ; CPU:$F34D PRG:334D A9 02 sta $F2 ; CPU:$F34F PRG:334F 85 F2 ldx #$96 ; CPU:$F351 PRG:3351 A2 96 jsr $F45E ; CPU:$F353 PRG:3353 20 5E F4 ldx $3B ; CPU:$F356 PRG:3356 A6 3B inx ; CPU:$F358 PRG:3358 E8 cpx #$10 ; CPU:$F359 PRG:3359 E0 10 bne InitializeRoundObjects_Block_22 ; CPU:$F35B PRG:335B D0 02 ldx #$04 ; CPU:$F35D PRG:335D A2 04 InitializeRoundObjects_Block_22: stx $3B ; CPU:$F35F PRG:335F 86 3B jmp InitializeRoundObjects_Load ; CPU:$F361 PRG:3361 4C 13 F2 InitializeRoundObjects_Block_23: lda #$01 ; CPU:$F364 PRG:3364 A9 01 sta $F2 ; CPU:$F366 PRG:3366 85 F2 lda #$00 ; CPU:$F368 PRG:3368 A9 00 sta $17 ; CPU:$F36A PRG:336A 85 17 sta $18 ; CPU:$F36C PRG:336C 85 18 sta $15 ; CPU:$F36E PRG:336E 85 15 jsr $F40B ; CPU:$F370 PRG:3370 20 0B F4 InitializeRoundObjects_Block_24: jsr $F465 ; CPU:$F373 PRG:3373 20 65 F4 jsr $E768 ; CPU:$F376 PRG:3376 20 68 E7 and #$30 ; CPU:$F379 PRG:3379 29 30 bne InitializeRoundObjects_Block_25 ; CPU:$F37B PRG:337B D0 04 dec $15 ; CPU:$F37D PRG:337D C6 15 bne InitializeRoundObjects_Block_24 ; CPU:$F37F PRG:337F D0 F2 InitializeRoundObjects_Block_25: jmp NextRandomByte_Block_1 ; CPU:$F381 PRG:3381 4C D4 F1 ; ResetObjectMotion ; Purpose: clear an object motion/state record. ; Inputs: X = object slot. ; Returns: motion fields cleared and default state restored. ResetObjectMotion: lda $41,x ; CPU:$F384 PRG:3384 B5 41 bmi ResetObjectMotion_Block_1 ; CPU:$F386 PRG:3386 30 23 lda ObjectSpawnStateTable,x ; CPU:$F388 PRG:3388 BD AE F3 sta $91,x ; CPU:$F38B PRG:338B 95 91 lda #$B8 ; CPU:$F38D PRG:338D A9 B8 sta $9A,x ; CPU:$F38F PRG:338F 95 9A sta $BD,x ; CPU:$F391 PRG:3391 95 BD lda #$C8 ; CPU:$F393 PRG:3393 A9 C8 sta $BF,x ; CPU:$F395 PRG:3395 95 BF lda #$5A ; CPU:$F397 PRG:3397 A9 5A ldy $41,x ; CPU:$F399 PRG:3399 B4 41 bpl ResetObjectMotion_Block ; CPU:$F39B PRG:339B 10 02 lda #$01 ; CPU:$F39D PRG:339D A9 01 ResetObjectMotion_Block: sta $C3,x ; CPU:$F39F PRG:339F 95 C3 lda #$00 ; CPU:$F3A1 PRG:33A1 A9 00 sta $C1,x ; CPU:$F3A3 PRG:33A3 95 C1 sta $042D,x ; CPU:$F3A5 PRG:33A5 9D 2D 04 sta $0424,x ; CPU:$F3A8 PRG:33A8 9D 24 04 ResetObjectMotion_Block_1: rts ; CPU:$F3AB PRG:33AB 60 ObjectSpawnStateTable: .byte $20, $D0 ; CPU:$F3AC PRG:33AC 20 D0 ; ActivateSpawnedObject ; Purpose: finalize a newly spawned object record. ; Inputs: X = object slot. ; Returns: object type/state initialized and slot activated. ActivateSpawnedObject: lda #$03 ; CPU:$F3AE PRG:33AE A9 03 sta $0451,x ; CPU:$F3B0 PRG:33B0 9D 51 04 lda #$02 ; CPU:$F3B3 PRG:33B3 A9 02 sta $88,x ; CPU:$F3B5 PRG:33B5 95 88 rts ; CPU:$F3B7 PRG:33B7 60 RoundObjectTypeTable: .byte $58, $50, $58, $50, $50, $40, $38, $30 ; CPU:$F3B8 PRG:33B8 58 50 58 50 50 40 38 30 .byte $28 ; CPU:$F3C0 PRG:33C0 28 RoundObjectPositionTable: .byte $04, $04, $03, $03, $02, $02, $02, $02 ; CPU:$F3C1 PRG:33C1 04 04 03 03 02 02 02 02 .byte $02 ; CPU:$F3C9 PRG:33C9 02 ; LoadRoundScreenData ; Purpose: select and queue round-specific screen/status data. ; Inputs: round and mode globals. ; Returns: display data pointers and buffers initialized. LoadRoundScreenData: lda $3D ; CPU:$F3CA PRG:33CA A5 3D and #$20 ; CPU:$F3CC PRG:33CC 29 20 beq LoadRoundScreenData_Block_1 ; CPU:$F3CE PRG:33CE F0 1C ldx #$0A ; CPU:$F3D0 PRG:33D0 A2 0A LoadRoundScreenData_Block: lda $F3F5,x ; CPU:$F3D2 PRG:33D2 BD F5 F3 sta $57,x ; CPU:$F3D5 PRG:33D5 95 57 dex ; CPU:$F3D7 PRG:33D7 CA bpl LoadRoundScreenData_Block ; CPU:$F3D8 PRG:33D8 10 F8 ldy #$0A ; CPU:$F3DA PRG:33DA A0 0A lda $3C ; CPU:$F3DC PRG:33DC A5 3C sta $43 ; CPU:$F3DE PRG:33DE 85 43 jsr $D77C ; CPU:$F3E0 PRG:33E0 20 7C D7 sta $60 ; CPU:$F3E3 PRG:33E3 85 60 lda $43 ; CPU:$F3E5 PRG:33E5 A5 43 sta $61 ; CPU:$F3E7 PRG:33E7 85 61 jmp $C12D ; CPU:$F3E9 PRG:33E9 4C 2D C1 LoadRoundScreenData_Block_1: lda #$00 ; CPU:$F3EC PRG:33EC A9 00 ldy #$F4 ; CPU:$F3EE PRG:33EE A0 F4 jmp $C131 ; CPU:$F3F0 PRG:33F0 4C 31 C1 RoundInitAttributeTable: .byte $20, $6C, $08, $19, $11, $0A, $1C, $0E ; CPU:$F3F3 PRG:33F3 20 6C 08 19 11 0A 1C 0E .byte $25, $00, $00, $20, $6C, $08, $24, $24 ; CPU:$F3FB PRG:33FB 25 00 00 20 6C 08 24 24 .byte $24, $24, $24, $24, $24, $24 ; CPU:$F403 PRG:3403 24 24 24 24 24 24 ; DrawRoundStatusPanel ; Purpose: write fixed round-status tile rows and numeric fields. ; Inputs: round status globals. ; Returns: status-panel buffer populated. DrawRoundStatusPanel: jsr WaitOneFrame ; CPU:$F409 PRG:3409 20 65 F4 ldx #$01 ; CPU:$F40C PRG:340C A2 01 DrawRoundStatusPanel_Block: lda $F43B,x ; CPU:$F40E PRG:340E BD 3B F4 ldy $F43D,x ; CPU:$F411 PRG:3411 BC 3D F4 jsr $C131 ; CPU:$F414 PRG:3414 20 31 C1 dex ; CPU:$F417 PRG:3417 CA bpl DrawRoundStatusPanel_Block ; CPU:$F418 PRG:3418 10 F4 ldx #$0F ; CPU:$F41A PRG:341A A2 0F DrawRoundStatusPanel_Block_1: lda #$24 ; CPU:$F41C PRG:341C A9 24 sta $5A,x ; CPU:$F41E PRG:341E 95 5A dex ; CPU:$F420 PRG:3420 CA bpl DrawRoundStatusPanel_Block_1 ; CPU:$F421 PRG:3421 10 F9 lda #$10 ; CPU:$F423 PRG:3423 A9 10 sta $59 ; CPU:$F425 PRG:3425 85 59 lda #$21 ; CPU:$F427 PRG:3427 A9 21 sta $57 ; CPU:$F429 PRG:3429 85 57 ldx #$02 ; CPU:$F42B PRG:342B A2 02 DrawRoundStatusPanel_Block_2: lda $F43F,x ; CPU:$F42D PRG:342D BD 3F F4 sta $58 ; CPU:$F430 PRG:3430 85 58 jsr $C12D ; CPU:$F432 PRG:3432 20 2D C1 dex ; CPU:$F435 PRG:3435 CA bpl DrawRoundStatusPanel_Block_2 ; CPU:$F436 PRG:3436 10 F5 rts ; CPU:$F438 PRG:3438 60 StatusPanelAddressLoTable: .byte $42, $55 ; CPU:$F439 PRG:3439 42 55 StatusPanelAddressHiTable: .byte $F4, $F4 ; CPU:$F43B PRG:343B F4 F4 StatusPanelTileData: .byte $88, $A8, $E8, $21, $C8, $10, $24, $24 ; CPU:$F43D PRG:343D 88 A8 E8 21 C8 10 24 24 .byte $24, $10, $0A, $16, $0E, $24, $24, $18 ; CPU:$F445 PRG:3445 24 10 0A 16 0E 24 24 18 .byte $1F, $0E, $1B, $24, $24, $24, $23, $DA ; CPU:$F44D PRG:344D 1F 0E 1B 24 24 24 23 DA .byte $04, $AA, $AA, $AA, $AA ; CPU:$F455 PRG:3455 04 AA AA AA AA ; DelayFrames ; Purpose: wait for a fixed number of frame ticks. ; Inputs: A = frame count. ; Returns: after A frame-counter transitions. DelayFrames: ldx #$14 ; CPU:$F45A PRG:345A A2 14 DelayFramesLoop: jsr WaitOneFrame ; CPU:$F45C PRG:345C 20 65 F4 dex ; CPU:$F45F PRG:345F CA bne DelayFramesLoop ; CPU:$F460 PRG:3460 D0 FA rts ; CPU:$F462 PRG:3462 60 ; WaitOneFrame ; Purpose: block until the NMI/frame counter changes. ; Inputs: none. ; Returns: one frame elapsed. WaitOneFrame: lda #$00 ; CPU:$F463 PRG:3463 A9 00 sta $02 ; CPU:$F465 PRG:3465 85 02 WaitForFrameCounter: lda $02 ; CPU:$F467 PRG:3467 A5 02 beq WaitForFrameCounter ; CPU:$F469 PRG:3469 F0 FC dec $02 ; CPU:$F46B PRG:346B C6 02 WaitForFrameCounter_Block: rts ; CPU:$F46D PRG:346D 60 ; WaitForStartPress ; Purpose: wait for Start while maintaining frame and PPU state. ; Inputs: global controller/game state. ; Returns: Start detected; transition-delay fields updated. WaitForStartPress: jsr WaitForFrameCounter ; CPU:$F46E PRG:346E 20 69 F4 lda $3A ; CPU:$F471 PRG:3471 A5 3A bne WaitForFrameCounter_Block ; CPU:$F473 PRG:3473 D0 F8 jsr $E768 ; CPU:$F475 PRG:3475 20 68 E7 and #$10 ; CPU:$F478 PRG:3478 29 10 beq WaitForFrameCounter_Block ; CPU:$F47A PRG:347A F0 F1 lda #$04 ; CPU:$F47C PRG:347C A9 04 sta $F2 ; CPU:$F47E PRG:347E 85 F2 lda $01 ; CPU:$F480 PRG:3480 A5 01 and #$EF ; CPU:$F482 PRG:3482 29 EF sta $2001 ; CPU:$F484 PRG:3484 8D 01 20 WaitForStartPress_Block: jsr WaitOneFrame ; CPU:$F487 PRG:3487 20 65 F4 jsr $E768 ; CPU:$F48A PRG:348A 20 68 E7 and #$10 ; CPU:$F48D PRG:348D 29 10 beq WaitForStartPress_Block ; CPU:$F48F PRG:348F F0 F6 lda $01 ; CPU:$F491 PRG:3491 A5 01 sta $2001 ; CPU:$F493 PRG:3493 8D 01 20 ldy #$04 ; CPU:$F496 PRG:3496 A0 04 lda $C8 ; CPU:$F498 PRG:3498 A5 C8 ora $16 ; CPU:$F49A PRG:349A 05 16 beq WaitForStartPress_Block_1 ; CPU:$F49C PRG:349C F0 02 ldy #$20 ; CPU:$F49E PRG:349E A0 20 WaitForStartPress_Block_1: sty $F2 ; CPU:$F4A0 PRG:34A0 84 F2 rts ; CPU:$F4A2 PRG:34A2 60 ; InitializeGameplayGlobals ; Purpose: initialize common gameplay flags, counters, and player defaults. ; Inputs: none. ; Returns: core gameplay globals reset. InitializeGameplayGlobals: lda #$01 ; CPU:$F4A3 PRG:34A3 A9 01 sta $048E ; CPU:$F4A5 PRG:34A5 8D 8E 04 sta $048F ; CPU:$F4A8 PRG:34A8 8D 8F 04 lda #$FF ; CPU:$F4AB PRG:34AB A9 FF sta $BB ; CPU:$F4AD PRG:34AD 85 BB sta $87 ; CPU:$F4AF PRG:34AF 85 87 sta $048C ; CPU:$F4B1 PRG:34B1 8D 8C 04 ldx #$01 ; CPU:$F4B4 PRG:34B4 A2 01 stx $0459 ; CPU:$F4B6 PRG:34B6 8E 59 04 stx $90 ; CPU:$F4B9 PRG:34B9 86 90 inx ; CPU:$F4BB PRG:34BB E8 stx $46 ; CPU:$F4BC PRG:34BC 86 46 lda #$40 ; CPU:$F4BE PRG:34BE A9 40 sta $99 ; CPU:$F4C0 PRG:34C0 85 99 rts ; CPU:$F4C2 PRG:34C2 60 ; $F4C5-$F4FF - trailing $FF padding after the sound-init routine's RTS at $F4C4. ; Pass 1: emitted as explicit classified bytes so no ROM byte stays hidden in an ; .incbin. Unreached padding, never executed. TrailingFillBeforeApuTables: .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; CPU:$F4C3 PRG:34C3 FF FF FF FF FF FF FF FF .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; CPU:$F4CB PRG:34CB FF FF FF FF FF FF FF FF .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; CPU:$F4D3 PRG:34D3 FF FF FF FF FF FF FF FF .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; CPU:$F4DB PRG:34DB FF FF FF FF FF FF FF FF .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; CPU:$F4E3 PRG:34E3 FF FF FF FF FF FF FF FF .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; CPU:$F4EB PRG:34EB FF FF FF FF FF FF FF FF .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; CPU:$F4F3 PRG:34F3 FF FF FF FF FF FF FF FF .byte $FF, $FF, $FF ; CPU:$F4FB PRG:34FB FF FF FF ; UpdateSoundEngine ; Purpose: invoke the sound-effect/music sequencer for the current frame. ; Inputs: sound state and stream pointers in zero page. ; Returns: APU registers and per-channel sequencer state updated. UpdateSoundEngine: jsr $F78F ; CPU:$F4FE PRG:34FE 20 8F F7 UpdateSoundEngine_Block: rts ; CPU:$F501 PRG:3501 60 ; ProcessSoundChannels ; Purpose: interpret active sound streams for pulse, triangle, and noise channels. ; Inputs: sound pointers, timers, envelopes, and channel flags in $D0-$FF. ; Returns: APU channel registers and stream cursors updated. ProcessSoundChannels: lda #$00 ; CPU:$F502 PRG:3502 A9 00 tax ; CPU:$F504 PRG:3504 AA sta $FD ; CPU:$F505 PRG:3505 85 FD beq ProcessSoundChannels_Block_1 ; CPU:$F507 PRG:3507 F0 10 ProcessSoundChannels_Block: txa ; CPU:$F509 PRG:3509 8A lsr a ; CPU:$F50A PRG:350A 4A tax ; CPU:$F50B PRG:350B AA ProcessSoundChannels_Increment: inx ; CPU:$F50C PRG:350C E8 txa ; CPU:$F50D PRG:350D 8A cmp #$04 ; CPU:$F50E PRG:350E C9 04 beq UpdateSoundEngine_Block ; CPU:$F510 PRG:3510 F0 EF lda $FD ; CPU:$F512 PRG:3512 A5 FD clc ; CPU:$F514 PRG:3514 18 adc #$04 ; CPU:$F515 PRG:3515 69 04 sta $FD ; CPU:$F517 PRG:3517 85 FD ProcessSoundChannels_Block_1: txa ; CPU:$F519 PRG:3519 8A asl a ; CPU:$F51A PRG:351A 0A tax ; CPU:$F51B PRG:351B AA lda $E0,x ; CPU:$F51C PRG:351C B5 E0 sta $FE ; CPU:$F51E PRG:351E 85 FE lda $E1,x ; CPU:$F520 PRG:3520 B5 E1 sta $FF ; CPU:$F522 PRG:3522 85 FF lda $E1,x ; CPU:$F524 PRG:3524 B5 E1 beq ProcessSoundChannels_Block ; CPU:$F526 PRG:3526 F0 E1 txa ; CPU:$F528 PRG:3528 8A lsr a ; CPU:$F529 PRG:3529 4A tax ; CPU:$F52A PRG:352A AA dec $D0,x ; CPU:$F52B PRG:352B D6 D0 bne ProcessSoundChannels_Increment ; CPU:$F52D PRG:352D D0 DD ProcessSoundChannels_Block_2: ldy $E8,x ; CPU:$F52F PRG:352F B4 E8 inc $E8,x ; CPU:$F531 PRG:3531 F6 E8 lda ($FE),y ; CPU:$F533 PRG:3533 B1 FE beq UpdateSoundEngine ; CPU:$F535 PRG:3535 F0 C7 tay ; CPU:$F537 PRG:3537 A8 cmp #$FF ; CPU:$F538 PRG:3538 C9 FF beq ProcessSoundChannels_Block_3 ; CPU:$F53A PRG:353A F0 09 and #$C0 ; CPU:$F53C PRG:353C 29 C0 cmp #$C0 ; CPU:$F53E PRG:353E C9 C0 beq ProcessSoundChannels_Block_4 ; CPU:$F540 PRG:3540 F0 0F jmp ProcessSoundChannels_Block_6 ; CPU:$F542 PRG:3542 4C 61 F5 ProcessSoundChannels_Block_3: lda $D8,x ; CPU:$F545 PRG:3545 B5 D8 beq ProcessSoundChannels_Block_5 ; CPU:$F547 PRG:3547 F0 13 dec $D8,x ; CPU:$F549 PRG:3549 D6 D8 lda $EC,x ; CPU:$F54B PRG:354B B5 EC sta $E8,x ; CPU:$F54D PRG:354D 95 E8 bne ProcessSoundChannels_Block_5 ; CPU:$F54F PRG:354F D0 0B ProcessSoundChannels_Block_4: tya ; CPU:$F551 PRG:3551 98 and #$3F ; CPU:$F552 PRG:3552 29 3F sta $D8,x ; CPU:$F554 PRG:3554 95 D8 dec $D8,x ; CPU:$F556 PRG:3556 D6 D8 lda $E8,x ; CPU:$F558 PRG:3558 B5 E8 sta $EC,x ; CPU:$F55A PRG:355A 95 EC ProcessSoundChannels_Block_5: jmp ProcessSoundChannels_Block_2 ; CPU:$F55C PRG:355C 4C 31 F5 ProcessSoundChannels_Block_6: tya ; CPU:$F55F PRG:355F 98 bpl ProcessSoundChannels_Block_8 ; CPU:$F560 PRG:3560 10 17 and #$0F ; CPU:$F562 PRG:3562 29 0F clc ; CPU:$F564 PRG:3564 18 adc $DF ; CPU:$F565 PRG:3565 65 DF tay ; CPU:$F567 PRG:3567 A8 lda SoundCommandMaskTable,y ; CPU:$F568 PRG:3568 B9 60 F6 sta $D4,x ; CPU:$F56B PRG:356B 95 D4 tay ; CPU:$F56D PRG:356D A8 txa ; CPU:$F56E PRG:356E 8A cmp #$02 ; CPU:$F56F PRG:356F C9 02 beq ProcessSoundChannels_Block_14 ; CPU:$F571 PRG:3571 F0 4F ProcessSoundChannels_Block_7: ldy $E8,x ; CPU:$F573 PRG:3573 B4 E8 inc $E8,x ; CPU:$F575 PRG:3575 F6 E8 lda ($FE),y ; CPU:$F577 PRG:3577 B1 FE ProcessSoundChannels_Block_8: tay ; CPU:$F579 PRG:3579 A8 txa ; CPU:$F57A PRG:357A 8A cmp #$03 ; CPU:$F57B PRG:357B C9 03 beq ProcessSoundChannels_Block_17 ; CPU:$F57D PRG:357D F0 60 pha ; CPU:$F57F PRG:357F 48 tax ; CPU:$F580 PRG:3580 AA cmp #$01 ; CPU:$F581 PRG:3581 C9 01 beq ProcessSoundChannels_Block_13 ; CPU:$F583 PRG:3583 F0 32 ProcessSoundChannels_Block_9: ldx $FD ; CPU:$F585 PRG:3585 A6 FD lda ApuPeriodLowTable,y ; CPU:$F587 PRG:3587 B9 01 F6 beq ProcessSoundChannels_Block_10 ; CPU:$F58A PRG:358A F0 0B sta $4002,x ; CPU:$F58C PRG:358C 9D 02 40 lda ApuPeriodHighTable,y ; CPU:$F58F PRG:358F B9 00 F6 ora #$08 ; CPU:$F592 PRG:3592 09 08 sta $4003,x ; CPU:$F594 PRG:3594 9D 03 40 ProcessSoundChannels_Block_10: tay ; CPU:$F597 PRG:3597 A8 pla ; CPU:$F598 PRG:3598 68 tax ; CPU:$F599 PRG:3599 AA tya ; CPU:$F59A PRG:359A 98 bne ProcessSoundChannels_Block_11 ; CPU:$F59B PRG:359B D0 0B ldy #$00 ; CPU:$F59D PRG:359D A0 00 txa ; CPU:$F59F PRG:359F 8A cmp #$02 ; CPU:$F5A0 PRG:35A0 C9 02 beq ProcessSoundChannels_Block_12 ; CPU:$F5A2 PRG:35A2 F0 06 ldy #$10 ; CPU:$F5A4 PRG:35A4 A0 10 bne ProcessSoundChannels_Block_12 ; CPU:$F5A6 PRG:35A6 D0 02 ProcessSoundChannels_Block_11: ldy $DC,x ; CPU:$F5A8 PRG:35A8 B4 DC ProcessSoundChannels_Block_12: tya ; CPU:$F5AA PRG:35AA 98 ldy $FD ; CPU:$F5AB PRG:35AB A4 FD sta $4000,y ; CPU:$F5AD PRG:35AD 99 00 40 ProcessSoundChannels_Load: lda $D4,x ; CPU:$F5B0 PRG:35B0 B5 D4 sta $D0,x ; CPU:$F5B2 PRG:35B2 95 D0 jmp ProcessSoundChannels_Increment ; CPU:$F5B4 PRG:35B4 4C 0E F5 ProcessSoundChannels_Block_13: lda $F5 ; CPU:$F5B7 PRG:35B7 A5 F5 and #$02 ; CPU:$F5B9 PRG:35B9 29 02 beq ProcessSoundChannels_Block_9 ; CPU:$F5BB PRG:35BB F0 C8 pla ; CPU:$F5BD PRG:35BD 68 tax ; CPU:$F5BE PRG:35BE AA jmp ProcessSoundChannels_Load ; CPU:$F5BF PRG:35BF 4C B2 F5 ProcessSoundChannels_Block_14: tya ; CPU:$F5C2 PRG:35C2 98 ldy $07F0 ; CPU:$F5C3 PRG:35C3 AC F0 07 beq ProcessSoundChannels_Block_15 ; CPU:$F5C6 PRG:35C6 F0 04 lda #$FF ; CPU:$F5C8 PRG:35C8 A9 FF bne ProcessSoundChannels_Block_16 ; CPU:$F5CA PRG:35CA D0 0B ProcessSoundChannels_Block_15: clc ; CPU:$F5CC PRG:35CC 18 adc #$FE ; CPU:$F5CD PRG:35CD 69 FE asl a ; CPU:$F5CF PRG:35CF 0A asl a ; CPU:$F5D0 PRG:35D0 0A cmp #$3C ; CPU:$F5D1 PRG:35D1 C9 3C bcc ProcessSoundChannels_Block_16 ; CPU:$F5D3 PRG:35D3 90 02 lda #$3C ; CPU:$F5D5 PRG:35D5 A9 3C ProcessSoundChannels_Block_16: sta $4008 ; CPU:$F5D7 PRG:35D7 8D 08 40 sta $DE ; CPU:$F5DA PRG:35DA 85 DE jmp ProcessSoundChannels_Block_7 ; CPU:$F5DC PRG:35DC 4C 75 F5 ProcessSoundChannels_Block_17: lda $F4 ; CPU:$F5DF PRG:35DF A5 F4 cmp #$02 ; CPU:$F5E1 PRG:35E1 C9 02 beq ProcessSoundChannels_Block_18 ; CPU:$F5E3 PRG:35E3 F0 12 lda $F700,y ; CPU:$F5E5 PRG:35E5 B9 00 F7 sta $400C ; CPU:$F5E8 PRG:35E8 8D 0C 40 lda $F701,y ; CPU:$F5EB PRG:35EB B9 01 F7 sta $400E ; CPU:$F5EE PRG:35EE 8D 0E 40 lda $F702,y ; CPU:$F5F1 PRG:35F1 B9 02 F7 sta $400F ; CPU:$F5F4 PRG:35F4 8D 0F 40 ProcessSoundChannels_Block_18: jmp ProcessSoundChannels_Load ; CPU:$F5F7 PRG:35F7 4C B2 F5 ; $F5FC-$F5FF - four unreached bytes between the sound engine's final JMP ; ($F5F9) and ApuPeriodTable ($F600). Left as data: the preceding instruction ; is an unconditional JMP so control never falls through here, and the bytes do ; not form a coherent instruction sequence. SoundEngineTailBytes: .byte $16, $FF, $10, $C5 ; CPU:$F5FA PRG:35FA 16 FF 10 C5 ; Interleaved APU timer high/low bytes; aliases below preserve the original odd/even indexed accesses. ApuPeriodTable: .byte $07, $F0, $00, $00, $00, $D4, $00, $C8 ; CPU:$F5FE PRG:35FE 07 F0 00 00 00 D4 00 C8 .byte $00, $BD, $00, $B2, $00, $A8, $00, $9F ; CPU:$F606 PRG:3606 00 BD 00 B2 00 A8 00 9F .byte $00, $96, $00, $8D, $00, $85, $00, $7E ; CPU:$F60E PRG:360E 00 96 00 8D 00 85 00 7E .byte $00, $76, $00, $70, $01, $AB, $01, $93 ; CPU:$F616 PRG:3616 00 76 00 70 01 AB 01 93 .byte $01, $7C, $01, $67, $01, $52, $01, $3F ; CPU:$F61E PRG:361E 01 7C 01 67 01 52 01 3F .byte $01, $2D, $01, $1C, $01, $0C, $00, $FD ; CPU:$F626 PRG:3626 01 2D 01 1C 01 0C 00 FD .byte $00, $EE, $00, $E1, $03, $57, $03, $27 ; CPU:$F62E PRG:362E 00 EE 00 E1 03 57 03 27 .byte $02, $F9, $02, $CF, $02, $A6, $02, $80 ; CPU:$F636 PRG:3636 02 F9 02 CF 02 A6 02 80 .byte $02, $5C, $02, $3A, $02, $1A, $01, $FC ; CPU:$F63E PRG:363E 02 5C 02 3A 02 1A 01 FC .byte $01, $DF, $01, $C4, $03, $F8, $00, $69 ; CPU:$F646 PRG:3646 01 DF 01 C4 03 F8 00 69 .byte $00, $63, $00, $5E, $00, $58, $00, $53 ; CPU:$F64E PRG:364E 00 63 00 5E 00 58 00 53 .byte $00, $4F, $00, $4A, $00, $46, $00, $42 ; CPU:$F656 PRG:3656 00 4F 00 4A 00 46 00 42 ApuPeriodHighTable = ApuPeriodTable ApuPeriodLowTable = ApuPeriodTable + 1 ; Sound command masks, duration patterns, and channel-selection values. SoundCommandMaskTable: .byte $03, $06, $0C, $18, $30, $12, $24, $09 ; CPU:$F65E PRG:365E 03 06 0C 18 30 12 24 09 .byte $08, $04, $07, $01, $04, $08, $10, $20 ; CPU:$F666 PRG:3666 08 04 07 01 04 08 10 20 .byte $40, $18, $30, $0C, $01, $06, $0C, $18 ; CPU:$F66E PRG:366E 40 18 30 0C 01 06 0C 18 .byte $30, $60, $24, $48, $12, $10, $08, $0E ; CPU:$F676 PRG:3676 30 60 24 48 12 10 08 0E .byte $02, $03, $04 ; CPU:$F67E PRG:367E 02 03 04 ; SelectSoundChannelOffset ; Purpose: select the pulse 1 APU register shadow offset. ; Inputs: none. ; Returns: A = $00 and control flows into the common selector. SelectSoundChannelOffset: lda #$00 ; CPU:$F681 PRG:3681 A9 00 beq CopyFourBytesToApuShadow_Block ; CPU:$F683 PRG:3683 F0 0A ; SelectPulse2Offset ; Purpose: select the pulse 2 APU register shadow offset. ; Inputs: none. ; Returns: A = $08 and control flows into the common selector. SelectPulse2Offset: lda #$08 ; CPU:$F685 PRG:3685 A9 08 bne CopyFourBytesToApuShadow_Block ; CPU:$F687 PRG:3687 D0 06 ; SelectTriangleOffset ; Purpose: select the triangle/noise APU shadow offset. ; Inputs: none. ; Returns: A = $0C or $04 through the common selector. SelectTriangleOffset: lda #$0C ; CPU:$F689 PRG:3689 A9 0C bne CopyFourBytesToApuShadow_Block ; CPU:$F68B PRG:368B D0 02 ; CopyFourBytesToApuShadow ; Purpose: copy four bytes from a source pointer to the selected APU shadow/register block. ; Inputs: X/Y form source pointer; selector entry determines destination offset. ; Returns: four bytes copied; source pointer retained in $FB/$FC. CopyFourBytesToApuShadow: lda #$04 ; CPU:$F68D PRG:368D A9 04 CopyFourBytesToApuShadow_Block: sta $F9 ; CPU:$F68F PRG:368F 85 F9 lda #$40 ; CPU:$F691 PRG:3691 A9 40 sta $FA ; CPU:$F693 PRG:3693 85 FA stx $FB ; CPU:$F695 PRG:3695 86 FB sty $FC ; CPU:$F697 PRG:3697 84 FC ldy #$00 ; CPU:$F699 PRG:3699 A0 00 CopyFourBytesToApuShadow_Block_1: lda ($FB),y ; CPU:$F69B PRG:369B B1 FB sta ($F9),y ; CPU:$F69D PRG:369D 91 F9 iny ; CPU:$F69F PRG:369F C8 tya ; CPU:$F6A0 PRG:36A0 98 cmp #$04 ; CPU:$F6A1 PRG:36A1 C9 04 bne CopyFourBytesToApuShadow_Block_1 ; CPU:$F6A3 PRG:36A3 D0 F6 rts ; CPU:$F6A5 PRG:36A5 60 ; InitializeSoundSequence ; Purpose: resolve a sound sequence, load its initial state, and reset channel cursors. ; Inputs: A = sound request/sequence selector. ; Returns: stream state $DF-$EB and sound flags initialized. InitializeSoundSequence: tax ; CPU:$F6A6 PRG:36A6 AA jsr $F798 ; CPU:$F6A7 PRG:36A7 20 98 F7 stx $F6 ; CPU:$F6AA PRG:36AA 86 F6 lda $07F5 ; CPU:$F6AC PRG:36AC AD F5 07 beq InitializeSoundSequence_Block ; CPU:$F6AF PRG:36AF F0 0B cmp #$02 ; CPU:$F6B1 PRG:36B1 C9 02 bne InitializeSoundSequence_Block ; CPU:$F6B3 PRG:36B3 D0 07 sta $F0 ; CPU:$F6B5 PRG:36B5 85 F0 lda #$00 ; CPU:$F6B7 PRG:36B7 A9 00 sta $07F5 ; CPU:$F6B9 PRG:36B9 8D F5 07 InitializeSoundSequence_Block: lda SoundSequencePointerTable,y ; CPU:$F6BC PRG:36BC B9 CA FB tay ; CPU:$F6BF PRG:36BF A8 ldx #$00 ; CPU:$F6C0 PRG:36C0 A2 00 InitializeSoundSequence_Block_1: lda SoundSequencePointerTable,y ; CPU:$F6C2 PRG:36C2 B9 CA FB sta $DF,x ; CPU:$F6C5 PRG:36C5 95 DF iny ; CPU:$F6C7 PRG:36C7 C8 inx ; CPU:$F6C8 PRG:36C8 E8 txa ; CPU:$F6C9 PRG:36C9 8A cmp #$09 ; CPU:$F6CA PRG:36CA C9 09 bne InitializeSoundSequence_Block_1 ; CPU:$F6CC PRG:36CC D0 F4 lda #$01 ; CPU:$F6CE PRG:36CE A9 01 sta $D0 ; CPU:$F6D0 PRG:36D0 85 D0 sta $D1 ; CPU:$F6D2 PRG:36D2 85 D1 sta $D2 ; CPU:$F6D4 PRG:36D4 85 D2 sta $D3 ; CPU:$F6D6 PRG:36D6 85 D3 lda #$00 ; CPU:$F6D8 PRG:36D8 A9 00 sta $E8 ; CPU:$F6DA PRG:36DA 85 E8 sta $E9 ; CPU:$F6DC PRG:36DC 85 E9 sta $EA ; CPU:$F6DE PRG:36DE 85 EA sta $EB ; CPU:$F6E0 PRG:36E0 85 EB rts ; CPU:$F6E2 PRG:36E2 60 ; Preserved sound data / unused bytes Data_F6E5: .byte $94, $AB, $FD, $58, $00, $7F, $04, $18 ; CPU:$F6E3 PRG:36E3 94 AB FD 58 00 7F 04 18 .byte $3F, $7F, $00, $00, $06, $7F, $0A, $C0 ; CPU:$F6EB PRG:36EB 3F 7F 00 00 06 7F 0A C0 .byte $08, $7F, $05, $C0, $C1, $89, $02, $0F ; CPU:$F6F3 PRG:36F3 08 7F 05 C0 C1 89 02 0F .byte $FF, $FF, $FF, $10, $00, $18, $10, $01 ; CPU:$F6FB PRG:36FB FF FF FF 10 00 18 10 01 .byte $18, $00, $01, $88, $02, $02, $40, $03 ; CPU:$F703 PRG:3703 18 00 01 88 02 02 40 03 .byte $05, $40, $04, $07, $40 ; CPU:$F70B PRG:370B 05 40 04 07 40 ; SilencePulseChannels ; Purpose: sound-driver routine identified from call flow and register/state access. ; Inputs: sound request, channel, and stream state in zero page/global RAM as used locally. ; Returns: corresponding APU or sequencer state updated. SilencePulseChannels: lda #$7F ; CPU:$F710 PRG:3710 A9 7F sta $4001 ; CPU:$F712 PRG:3712 8D 01 40 sta $4005 ; CPU:$F715 PRG:3715 8D 05 40 ; InitializeApuChannelState ; Purpose: sound-driver routine identified from call flow and register/state access. ; Inputs: sound request, channel, and stream state in zero page/global RAM as used locally. ; Returns: corresponding APU or sequencer state updated. InitializeApuChannelState: stx $DC ; CPU:$F718 PRG:3718 86 DC sty $DD ; CPU:$F71A PRG:371A 84 DD rts ; CPU:$F71C PRG:371C 60 Sound_F71F: ldx #$E5 ; CPU:$F71D PRG:371D A2 E5 ldy #$F6 ; CPU:$F71F PRG:371F A0 F6 bne Sound_F745 ; CPU:$F721 PRG:3721 D0 20 ; UpdateMusicTempo ; Purpose: sound-driver routine identified from call flow and register/state access. ; Inputs: sound request, channel, and stream state in zero page/global RAM as used locally. ; Returns: corresponding APU or sequencer state updated. UpdateMusicTempo: lda $F3 ; CPU:$F723 PRG:3723 A5 F3 lsr a ; CPU:$F725 PRG:3725 4A bcs Sound_F736 ; CPU:$F726 PRG:3726 B0 0C lda $F7 ; CPU:$F728 PRG:3728 A5 F7 lsr a ; CPU:$F72A PRG:372A 4A bcs Sound_F749 ; CPU:$F72B PRG:372B B0 1A lda $F0 ; CPU:$F72D PRG:372D A5 F0 and #$10 ; CPU:$F72F PRG:372F 29 10 bne Sound_F71F ; CPU:$F731 PRG:3731 D0 EA rts ; CPU:$F733 PRG:3733 60 Sound_F736: lda $F7 ; CPU:$F734 PRG:3734 A5 F7 ora #$01 ; CPU:$F736 PRG:3736 09 01 sta $F7 ; CPU:$F738 PRG:3738 85 F7 lda #$00 ; CPU:$F73A PRG:373A A9 00 sta $07E4 ; CPU:$F73C PRG:373C 8D E4 07 ldx #$FC ; CPU:$F73F PRG:373F A2 FC ldy #$F5 ; CPU:$F741 PRG:3741 A0 F5 Sound_F745: jsr $F683 ; CPU:$F743 PRG:3743 20 83 F6 rts ; CPU:$F746 PRG:3746 60 Sound_F749: inc $07E4 ; CPU:$F747 PRG:3747 EE E4 07 lda $07E4 ; CPU:$F74A PRG:374A AD E4 07 cmp #$58 ; CPU:$F74D PRG:374D C9 58 bne Sound_F77B ; CPU:$F74F PRG:374F D0 28 lda #$00 ; CPU:$F751 PRG:3751 A9 00 sta $F7 ; CPU:$F753 PRG:3753 85 F7 rts ; CPU:$F755 PRG:3755 60 Sound_F758: lda #$C0 ; CPU:$F756 PRG:3756 A9 C0 sta $4017 ; CPU:$F758 PRG:3758 8D 17 40 jsr UpdateSoundPriority ; CPU:$F75B PRG:375B 20 25 FB jsr ProcessMusicRequest ; CPU:$F75E PRG:375E 20 0A F9 jsr UpdatePulseEffects ; CPU:$F761 PRG:3761 20 38 FA jsr UpdateNoiseEffects ; CPU:$F764 PRG:3764 20 AC FA jsr ProcessSoundEffectRequests ; CPU:$F767 PRG:3767 20 24 F8 lda $F1 ; CPU:$F76A PRG:376A A5 F1 sta $07E9 ; CPU:$F76C PRG:376C 8D E9 07 lda #$00 ; CPU:$F76F PRG:376F A9 00 sta $F0 ; CPU:$F771 PRG:3771 85 F0 sta $F1 ; CPU:$F773 PRG:3773 85 F1 sta $F2 ; CPU:$F775 PRG:3775 85 F2 sta $F3 ; CPU:$F777 PRG:3777 85 F3 Sound_F77B: rts ; CPU:$F779 PRG:3779 60 Sound_F77C: lda $F4 ; CPU:$F77A PRG:377A A5 F4 and #$06 ; CPU:$F77C PRG:377C 29 06 bne Sound_F77B ; CPU:$F77E PRG:377E D0 F9 lda $F4 ; CPU:$F780 PRG:3780 A5 F4 and #$F0 ; CPU:$F782 PRG:3782 29 F0 sta $F4 ; CPU:$F784 PRG:3784 85 F4 ldx #$E9 ; CPU:$F786 PRG:3786 A2 E9 ldy #$F6 ; CPU:$F788 PRG:3788 A0 F6 jmp Sound_F879 ; CPU:$F78A PRG:378A 4C 79 F8 ; UpdateSoundRequests ; Purpose: sound-driver routine identified from call flow and register/state access. ; Inputs: sound request, channel, and stream state in zero page/global RAM as used locally. ; Returns: corresponding APU or sequencer state updated. UpdateSoundRequests: lda $F6 ; CPU:$F78D PRG:378D A5 F6 cmp #$20 ; CPU:$F78F PRG:378F C9 20 bne Sound_F79F ; CPU:$F791 PRG:3791 D0 0A inc $07E8 ; CPU:$F793 PRG:3793 EE E8 07 ; InitializeSoundDataPointers ; Purpose: sound-driver routine identified from call flow and register/state access. ; Inputs: sound request, channel, and stream state in zero page/global RAM as used locally. ; Returns: corresponding APU or sequencer state updated. InitializeSoundDataPointers: and #$0F ; CPU:$F796 PRG:3796 29 0F cmp #$0F ; CPU:$F798 PRG:3798 C9 0F bne ResetAllSoundState ; CPU:$F79A PRG:379A D0 07 txa ; CPU:$F79C PRG:379C 8A Sound_F79F: lda $F4 ; CPU:$F79D PRG:379D A5 F4 and #$20 ; CPU:$F79F PRG:379F 29 20 bne Sound_F7C7 ; CPU:$F7A1 PRG:37A1 D0 22 ; ResetAllSoundState ; Purpose: sound-driver routine identified from call flow and register/state access. ; Inputs: sound request, channel, and stream state in zero page/global RAM as used locally. ; Returns: corresponding APU or sequencer state updated. ResetAllSoundState: lda #$10 ; CPU:$F7A3 PRG:37A3 A9 10 sta $400C ; CPU:$F7A5 PRG:37A5 8D 0C 40 sta $4000 ; CPU:$F7A8 PRG:37A8 8D 00 40 sta $4004 ; CPU:$F7AB PRG:37AB 8D 04 40 lda #$00 ; CPU:$F7AE PRG:37AE A9 00 sta $F4 ; CPU:$F7B0 PRG:37B0 85 F4 Sound_F7B4: sta $F5 ; CPU:$F7B2 PRG:37B2 85 F5 sta $F6 ; CPU:$F7B4 PRG:37B4 85 F6 sta $07FA ; CPU:$F7B6 PRG:37B6 8D FA 07 sta $F7 ; CPU:$F7B9 PRG:37B9 85 F7 sta $4008 ; CPU:$F7BB PRG:37BB 8D 08 40 sta $4011 ; CPU:$F7BE PRG:37BE 8D 11 40 sta $07F0 ; CPU:$F7C1 PRG:37C1 8D F0 07 rts ; CPU:$F7C4 PRG:37C4 60 Sound_F7C7: lda #$10 ; CPU:$F7C5 PRG:37C5 A9 10 sta $4004 ; CPU:$F7C7 PRG:37C7 8D 04 40 sta $400C ; CPU:$F7CA PRG:37CA 8D 0C 40 lda #$00 ; CPU:$F7CD PRG:37CD A9 00 beq Sound_F7B4 ; CPU:$F7CF PRG:37CF F0 E1 Sound_F7D3: lda #$00 ; CPU:$F7D1 PRG:37D1 A9 00 sta $07FA ; CPU:$F7D3 PRG:37D3 8D FA 07 rts ; CPU:$F7D6 PRG:37D6 60 Sound_F7D9: ldx #$F5 ; CPU:$F7D7 PRG:37D7 A2 F5 ldy #$F6 ; CPU:$F7D9 PRG:37D9 A0 F6 jmp Sound_F879 ; CPU:$F7DB PRG:37DB 4C 79 F8 Sound_F7E0: inc $07FB ; CPU:$F7DE PRG:37DE EE FB 07 lda $07FB ; CPU:$F7E1 PRG:37E1 AD FB 07 cmp #$10 ; CPU:$F7E4 PRG:37E4 C9 10 beq Sound_F7D9 ; CPU:$F7E6 PRG:37E6 F0 EF cmp #$20 ; CPU:$F7E8 PRG:37E8 C9 20 beq Sound_F7D3 ; CPU:$F7EA PRG:37EA F0 E5 rts ; CPU:$F7EC PRG:37EC 60 Sound_F7EF: lda #$00 ; CPU:$F7ED PRG:37ED A9 00 sta $07FB ; CPU:$F7EF PRG:37EF 8D FB 07 lda #$F0 ; CPU:$F7F2 PRG:37F2 A9 F0 sta $07FA ; CPU:$F7F4 PRG:37F4 8D FA 07 ldx #$F1 ; CPU:$F7F7 PRG:37F7 A2 F1 ldy #$F6 ; CPU:$F7F9 PRG:37F9 A0 F6 jmp Sound_F879 ; CPU:$F7FB PRG:37FB 4C 79 F8 Sound_F800: lda $F4 ; CPU:$F7FE PRG:37FE A5 F4 and #$F0 ; CPU:$F800 PRG:3800 29 F0 ora #$02 ; CPU:$F802 PRG:3802 09 02 sta $F4 ; CPU:$F804 PRG:3804 85 F4 lda #$00 ; CPU:$F806 PRG:3806 A9 00 sta $07F7 ; CPU:$F808 PRG:3808 8D F7 07 ldx #$F1 ; CPU:$F80B PRG:380B A2 F1 ldy #$F6 ; CPU:$F80D PRG:380D A0 F6 jmp Sound_F879 ; CPU:$F80F PRG:380F 4C 79 F8 Sound_F814: inc $07F7 ; CPU:$F812 PRG:3812 EE F7 07 lda $07F7 ; CPU:$F815 PRG:3815 AD F7 07 cmp #$10 ; CPU:$F818 PRG:3818 C9 10 bne Sound_F85B ; CPU:$F81A PRG:381A D0 3D jmp Sound_F89B ; CPU:$F81C PRG:381C 4C 9B F8 Sound_F821: jmp ResetAllSoundState ; CPU:$F81F PRG:381F 4C A5 F7 ; ProcessSoundEffectRequests ; Purpose: sound-driver routine identified from call flow and register/state access. ; Inputs: sound request, channel, and stream state in zero page/global RAM as used locally. ; Returns: corresponding APU or sequencer state updated. ProcessSoundEffectRequests: lda $F0 ; CPU:$F822 PRG:3822 A5 F0 lsr a ; CPU:$F824 PRG:3824 4A bcs Sound_F821 ; CPU:$F825 PRG:3825 B0 F8 lda $F6 ; CPU:$F827 PRG:3827 A5 F6 cmp #$DF ; CPU:$F829 PRG:3829 C9 DF beq Sound_F83B ; CPU:$F82B PRG:382B F0 0C cmp #$7F ; CPU:$F82D PRG:382D C9 7F beq Sound_F83B ; CPU:$F82F PRG:382F F0 08 cmp #$20 ; CPU:$F831 PRG:3831 C9 20 beq Sound_F83B ; CPU:$F833 PRG:3833 F0 04 lda $F6 ; CPU:$F835 PRG:3835 A5 F6 bne Sound_F85B ; CPU:$F837 PRG:3837 D0 20 Sound_F83B: lda $07FA ; CPU:$F839 PRG:3839 AD FA 07 cmp #$0F ; CPU:$F83C PRG:383C C9 0F beq Sound_F7EF ; CPU:$F83E PRG:383E F0 AD cmp #$F0 ; CPU:$F840 PRG:3840 C9 F0 beq Sound_F7E0 ; CPU:$F842 PRG:3842 F0 9A lda $F0 ; CPU:$F844 PRG:3844 A5 F0 lsr a ; CPU:$F846 PRG:3846 4A lsr a ; CPU:$F847 PRG:3847 4A bcs Sound_F800 ; CPU:$F848 PRG:3848 B0 B4 lsr a ; CPU:$F84A PRG:384A 4A bcs Sound_F85F ; CPU:$F84B PRG:384B B0 10 lsr a ; CPU:$F84D PRG:384D 4A bcs Sound_F85C ; CPU:$F84E PRG:384E B0 0A lda $F4 ; CPU:$F850 PRG:3850 A5 F4 lsr a ; CPU:$F852 PRG:3852 4A lsr a ; CPU:$F853 PRG:3853 4A bcs Sound_F814 ; CPU:$F854 PRG:3854 B0 BC lsr a ; CPU:$F856 PRG:3856 4A bcs Sound_F87D ; CPU:$F857 PRG:3857 B0 22 Sound_F85B: rts ; CPU:$F859 PRG:3859 60 Sound_F85C: jmp Sound_F77C ; CPU:$F85A PRG:385A 4C 7C F7 Sound_F85F: lda $F4 ; CPU:$F85D PRG:385D A5 F4 and #$80 ; CPU:$F85F PRG:385F 29 80 bne Sound_F85B ; CPU:$F861 PRG:3861 D0 F6 lda $F4 ; CPU:$F863 PRG:3863 A5 F4 and #$F0 ; CPU:$F865 PRG:3865 29 F0 ora #$04 ; CPU:$F867 PRG:3867 09 04 sta $F4 ; CPU:$F869 PRG:3869 85 F4 lda #$00 ; CPU:$F86B PRG:386B A9 00 sta $07F3 ; CPU:$F86D PRG:386D 8D F3 07 sta $07F1 ; CPU:$F870 PRG:3870 8D F1 07 ldx #$ED ; CPU:$F873 PRG:3873 A2 ED ldy #$F6 ; CPU:$F875 PRG:3875 A0 F6 Sound_F879: jsr $F68B ; CPU:$F877 PRG:3877 20 8B F6 rts ; CPU:$F87A PRG:387A 60 Sound_F87D: inc $07F3 ; CPU:$F87B PRG:387B EE F3 07 lda $07F3 ; CPU:$F87E PRG:387E AD F3 07 cmp #$03 ; CPU:$F881 PRG:3881 C9 03 bne Sound_F8A1 ; CPU:$F883 PRG:3883 D0 1A lda #$00 ; CPU:$F885 PRG:3885 A9 00 sta $07F3 ; CPU:$F887 PRG:3887 8D F3 07 inc $07F1 ; CPU:$F88A PRG:388A EE F1 07 lda $07F1 ; CPU:$F88D PRG:388D AD F1 07 cmp #$10 ; CPU:$F890 PRG:3890 C9 10 bne Sound_F8A2 ; CPU:$F892 PRG:3892 D0 0C lda #$10 ; CPU:$F894 PRG:3894 A9 10 sta $400C ; CPU:$F896 PRG:3896 8D 0C 40 Sound_F89B: lda $F4 ; CPU:$F899 PRG:3899 A5 F4 and #$F0 ; CPU:$F89B PRG:389B 29 F0 sta $F4 ; CPU:$F89D PRG:389D 85 F4 Sound_F8A1: rts ; CPU:$F89F PRG:389F 60 Sound_F8A2: sta $400E ; CPU:$F8A0 PRG:38A0 8D 0E 40 rts ; CPU:$F8A3 PRG:38A3 60 Sound_F8A6: lda #$00 ; CPU:$F8A4 PRG:38A4 A9 00 sta $07E0 ; CPU:$F8A6 PRG:38A6 8D E0 07 clc ; CPU:$F8A9 PRG:38A9 18 lda $1B ; CPU:$F8AA PRG:38AA A5 1B and #$07 ; CPU:$F8AC PRG:38AC 29 07 adc #$02 ; CPU:$F8AE PRG:38AE 69 02 sta $07E1 ; CPU:$F8B0 PRG:38B0 8D E1 07 lda $F7 ; CPU:$F8B3 PRG:38B3 A5 F7 and #$00 ; CPU:$F8B5 PRG:38B5 29 00 ora #$80 ; CPU:$F8B7 PRG:38B7 09 80 sta $F7 ; CPU:$F8B9 PRG:38B9 85 F7 bne Sound_F8E8 ; CPU:$F8BB PRG:38BB D0 29 Sound_F8BF: inc $07E0 ; CPU:$F8BD PRG:38BD EE E0 07 lda $07E0 ; CPU:$F8C0 PRG:38C0 AD E0 07 cmp $07E1 ; CPU:$F8C3 PRG:38C3 CD E1 07 bne Sound_F8E8 ; CPU:$F8C6 PRG:38C6 D0 1E Sound_F8CA: lda #$10 ; CPU:$F8C8 PRG:38C8 A9 10 sta $4000 ; CPU:$F8CA PRG:38CA 8D 00 40 sta $4004 ; CPU:$F8CD PRG:38CD 8D 04 40 lda #$00 ; CPU:$F8D0 PRG:38D0 A9 00 sta $F7 ; CPU:$F8D2 PRG:38D2 85 F7 lda $F4 ; CPU:$F8D4 PRG:38D4 A5 F4 and #$0F ; CPU:$F8D6 PRG:38D6 29 0F sta $F4 ; CPU:$F8D8 PRG:38D8 85 F4 rts ; CPU:$F8DA PRG:38DA 60 Sound_F8DD: jsr ResetAllSoundState ; CPU:$F8DB PRG:38DB 20 A5 F7 lda #$80 ; CPU:$F8DE PRG:38DE A9 80 sta $F4 ; CPU:$F8E0 PRG:38E0 85 F4 lda #$02 ; CPU:$F8E2 PRG:38E2 A9 02 sta $F0 ; CPU:$F8E4 PRG:38E4 85 F0 Sound_F8E8: ldx #$F9 ; CPU:$F8E6 PRG:38E6 A2 F9 ldy #$F6 ; CPU:$F8E8 PRG:38E8 A0 F6 jsr $F683 ; CPU:$F8EA PRG:38EA 20 83 F6 lda $1B ; CPU:$F8ED PRG:38ED A5 1B and #$0F ; CPU:$F8EF PRG:38EF 29 0F sta $4002 ; CPU:$F8F1 PRG:38F1 8D 02 40 ldx #$F9 ; CPU:$F8F4 PRG:38F4 A2 F9 ldy #$F6 ; CPU:$F8F6 PRG:38F6 A0 F6 jsr $F68F ; CPU:$F8F8 PRG:38F8 20 8F F6 lda $1B ; CPU:$F8FB PRG:38FB A5 1B lsr a ; CPU:$F8FD PRG:38FD 4A lsr a ; CPU:$F8FE PRG:38FE 4A and #$0F ; CPU:$F8FF PRG:38FF 29 0F sta $4006 ; CPU:$F901 PRG:3901 8D 06 40 rts ; CPU:$F904 PRG:3904 60 Sound_F907: jmp Sound_F8A6 ; CPU:$F905 PRG:3905 4C A6 F8 ; ProcessMusicRequest ; Purpose: sound-driver routine identified from call flow and register/state access. ; Inputs: sound request, channel, and stream state in zero page/global RAM as used locally. ; Returns: corresponding APU or sequencer state updated. ProcessMusicRequest: lda $F6 ; CPU:$F908 PRG:3908 A5 F6 beq Sound_F91B ; CPU:$F90A PRG:390A F0 0D cmp #$DF ; CPU:$F90C PRG:390C C9 DF beq Sound_F91B ; CPU:$F90E PRG:390E F0 09 lda $F0 ; CPU:$F910 PRG:3910 A5 F0 and #$E0 ; CPU:$F912 PRG:3912 29 E0 beq Sound_F94E ; CPU:$F914 PRG:3914 F0 36 jsr ResetAllSoundState ; CPU:$F916 PRG:3916 20 A5 F7 Sound_F91B: lda $F0 ; CPU:$F919 PRG:3919 A5 F0 asl a ; CPU:$F91B PRG:391B 0A bcs Sound_F8DD ; CPU:$F91C PRG:391C B0 BD asl a ; CPU:$F91E PRG:391E 0A bcs Sound_F952 ; CPU:$F91F PRG:391F B0 2F asl a ; CPU:$F921 PRG:3921 0A bcs Sound_F965 ; CPU:$F922 PRG:3922 B0 3F lda $F4 ; CPU:$F924 PRG:3924 A5 F4 asl a ; CPU:$F926 PRG:3926 0A bcs Sound_F8E8 ; CPU:$F927 PRG:3927 B0 BD lda $F4 ; CPU:$F929 PRG:3929 A5 F4 and #$E0 ; CPU:$F92B PRG:392B 29 E0 bne Sound_F94E ; CPU:$F92D PRG:392D D0 1D lda $F6 ; CPU:$F92F PRG:392F A5 F6 cmp #$DF ; CPU:$F931 PRG:3931 C9 DF beq Sound_F94B ; CPU:$F933 PRG:3933 F0 14 lda $F6 ; CPU:$F935 PRG:3935 A5 F6 bne Sound_F94E ; CPU:$F937 PRG:3937 D0 13 lda $F3 ; CPU:$F939 PRG:3939 A5 F3 asl a ; CPU:$F93B PRG:393B 0A bcs Sound_F907 ; CPU:$F93C PRG:393C B0 C7 asl a ; CPU:$F93E PRG:393E 0A bcs Sound_F977 ; CPU:$F93F PRG:393F B0 34 lda $F7 ; CPU:$F941 PRG:3941 A5 F7 asl a ; CPU:$F943 PRG:3943 0A bcs Sound_F94F ; CPU:$F944 PRG:3944 B0 07 asl a ; CPU:$F946 PRG:3946 0A bcs Sound_F993 ; CPU:$F947 PRG:3947 B0 48 Sound_F94B: jsr UpdateMusicTempo ; CPU:$F949 PRG:3949 20 25 F7 Sound_F94E: rts ; CPU:$F94C PRG:394C 60 Sound_F94F: jmp Sound_F8BF ; CPU:$F94D PRG:394D 4C BF F8 Sound_F952: lda #$0F ; CPU:$F950 PRG:3950 A9 0F sta $07FA ; CPU:$F952 PRG:3952 8D FA 07 lda $F4 ; CPU:$F955 PRG:3955 A5 F4 and #$0F ; CPU:$F957 PRG:3957 29 0F ora #$40 ; CPU:$F959 PRG:3959 09 40 sta $F4 ; CPU:$F95B PRG:395B 85 F4 ldx #$D1 ; CPU:$F95D PRG:395D A2 D1 ldy #$F9 ; CPU:$F95F PRG:395F A0 F9 bne Sound_F98F ; CPU:$F961 PRG:3961 D0 2A Sound_F965: lda #$02 ; CPU:$F963 PRG:3963 A9 02 sta $F0 ; CPU:$F965 PRG:3965 85 F0 lda $F4 ; CPU:$F967 PRG:3967 A5 F4 and #$0F ; CPU:$F969 PRG:3969 29 0F ora #$20 ; CPU:$F96B PRG:396B 09 20 sta $F4 ; CPU:$F96D PRG:396D 85 F4 ldx #$CD ; CPU:$F96F PRG:396F A2 CD ldy #$F9 ; CPU:$F971 PRG:3971 A0 F9 bne Sound_F98F ; CPU:$F973 PRG:3973 D0 18 Sound_F977: lda #$00 ; CPU:$F975 PRG:3975 A9 00 sta $07FC ; CPU:$F977 PRG:3977 8D FC 07 lda $F7 ; CPU:$F97A PRG:397A A5 F7 and #$00 ; CPU:$F97C PRG:397C 29 00 ora #$40 ; CPU:$F97E PRG:397E 09 40 sta $F7 ; CPU:$F980 PRG:3980 85 F7 ldx #$D5 ; CPU:$F982 PRG:3982 A2 D5 ldy #$F9 ; CPU:$F984 PRG:3984 A0 F9 jsr $F68F ; CPU:$F986 PRG:3986 20 8F F6 ldx #$D9 ; CPU:$F989 PRG:3989 A2 D9 ldy #$F9 ; CPU:$F98B PRG:398B A0 F9 Sound_F98F: jsr $F683 ; CPU:$F98D PRG:398D 20 83 F6 rts ; CPU:$F990 PRG:3990 60 Sound_F993: inc $07FC ; CPU:$F991 PRG:3991 EE FC 07 lda $07FC ; CPU:$F994 PRG:3994 AD FC 07 cmp #$12 ; CPU:$F997 PRG:3997 C9 12 beq Sound_F9CA ; CPU:$F999 PRG:3999 F0 2D cmp #$06 ; CPU:$F99B PRG:399B C9 06 bcc Sound_F9B1 ; CPU:$F99D PRG:399D 90 10 lda $1B ; CPU:$F99F PRG:399F A5 1B ora #$10 ; CPU:$F9A1 PRG:39A1 09 10 and #$7F ; CPU:$F9A3 PRG:39A3 29 7F sta $07FE ; CPU:$F9A5 PRG:39A5 8D FE 07 rol a ; CPU:$F9A8 PRG:39A8 2A sta $07FD ; CPU:$F9A9 PRG:39A9 8D FD 07 jmp Sound_F9BD ; CPU:$F9AC PRG:39AC 4C BD F9 Sound_F9B1: inc $07FD ; CPU:$F9AF PRG:39AF EE FD 07 inc $07FD ; CPU:$F9B2 PRG:39B2 EE FD 07 inc $07FE ; CPU:$F9B5 PRG:39B5 EE FE 07 inc $07FE ; CPU:$F9B8 PRG:39B8 EE FE 07 Sound_F9BD: lda $07FD ; CPU:$F9BB PRG:39BB AD FD 07 sta $4006 ; CPU:$F9BE PRG:39BE 8D 06 40 lda $07FE ; CPU:$F9C1 PRG:39C1 AD FE 07 sta $4002 ; CPU:$F9C4 PRG:39C4 8D 02 40 rts ; CPU:$F9C7 PRG:39C7 60 Sound_F9CA: jmp Sound_F8CA ; CPU:$F9C8 PRG:39C8 4C CA F8 ; Preserved sound data / unused bytes Data_F9CD: .byte $B8, $D5, $20, $00, $9F, $93, $80, $22 ; CPU:$F9CB PRG:39CB B8 D5 20 00 9F 93 80 22 .byte $3F, $BA, $E0, $06, $3F, $BB, $CE, $06 ; CPU:$F9D3 PRG:39D3 3F BA E0 06 3F BB CE 06 .byte $B8, $93, $50, $02, $80, $7F, $60, $68 ; CPU:$F9DB PRG:39DB B8 93 50 02 80 7F 60 68 .byte $80, $7F, $62, $68 ; CPU:$F9E3 PRG:39E3 80 7F 62 68 ; UpdateSoundEnvelopes ; Purpose: sound-driver routine identified from call flow and register/state access. ; Inputs: sound request, channel, and stream state in zero page/global RAM as used locally. ; Returns: corresponding APU or sequencer state updated. UpdateSoundEnvelopes: lda $F5 ; CPU:$F9E7 PRG:39E7 A5 F5 and #$02 ; CPU:$F9E9 PRG:39E9 29 02 bne Sound_FA26 ; CPU:$F9EB PRG:39EB D0 37 lda $F6 ; CPU:$F9ED PRG:39ED A5 F6 cmp #$DF ; CPU:$F9EF PRG:39EF C9 DF beq Sound_F9F9 ; CPU:$F9F1 PRG:39F1 F0 04 lda $F6 ; CPU:$F9F3 PRG:39F3 A5 F6 bne Sound_FA26 ; CPU:$F9F5 PRG:39F5 D0 2D Sound_F9F9: lda #$00 ; CPU:$F9F7 PRG:39F7 A9 00 sta $07F9 ; CPU:$F9F9 PRG:39F9 8D F9 07 lda $F5 ; CPU:$F9FC PRG:39FC A5 F5 and #$E0 ; CPU:$F9FE PRG:39FE 29 E0 ora #$02 ; CPU:$FA00 PRG:3A00 09 02 sta $F5 ; CPU:$FA02 PRG:3A02 85 F5 ldx #$DD ; CPU:$FA04 PRG:3A04 A2 DD ldy #$F9 ; CPU:$FA06 PRG:3A06 A0 F9 bne Sound_FA7F ; CPU:$FA08 PRG:3A08 D0 73 Sound_FA0C: inc $07F9 ; CPU:$FA0A PRG:3A0A EE F9 07 lda $07F9 ; CPU:$FA0D PRG:3A0D AD F9 07 cmp #$07 ; CPU:$FA10 PRG:3A10 C9 07 bne Sound_FA26 ; CPU:$FA12 PRG:3A12 D0 10 lda #$7F ; CPU:$FA14 PRG:3A14 A9 7F sta $4005 ; CPU:$FA16 PRG:3A16 8D 05 40 lda #$10 ; CPU:$FA19 PRG:3A19 A9 10 sta $4004 ; CPU:$FA1B PRG:3A1B 8D 04 40 lda $F5 ; CPU:$FA1E PRG:3A1E A5 F5 and #$E0 ; CPU:$FA20 PRG:3A20 29 E0 sta $F5 ; CPU:$FA22 PRG:3A22 85 F5 Sound_FA26: rts ; CPU:$FA24 PRG:3A24 60 Sound_FA27: jsr ResetAllSoundState ; CPU:$FA25 PRG:3A25 20 A5 F7 ldx #$E1 ; CPU:$FA28 PRG:3A28 A2 E1 ldy #$F9 ; CPU:$FA2A PRG:3A2A A0 F9 jsr $F683 ; CPU:$FA2C PRG:3A2C 20 83 F6 ldx #$E5 ; CPU:$FA2F PRG:3A2F A2 E5 ldy #$F9 ; CPU:$FA31 PRG:3A31 A0 F9 jmp Sound_FA7F ; CPU:$FA33 PRG:3A33 4C 7F FA ; UpdatePulseEffects ; Purpose: sound-driver routine identified from call flow and register/state access. ; Inputs: sound request, channel, and stream state in zero page/global RAM as used locally. ; Returns: corresponding APU or sequencer state updated. UpdatePulseEffects: lda $F6 ; CPU:$FA36 PRG:3A36 A5 F6 beq Sound_FA42 ; CPU:$FA38 PRG:3A38 F0 06 and #$0F ; CPU:$FA3A PRG:3A3A 29 0F cmp #$0F ; CPU:$FA3C PRG:3A3C C9 0F bne Sound_FA63 ; CPU:$FA3E PRG:3A3E D0 21 Sound_FA42: lda $F4 ; CPU:$FA40 PRG:3A40 A5 F4 and #$80 ; CPU:$FA42 PRG:3A42 29 80 bne Sound_FA63 ; CPU:$FA44 PRG:3A44 D0 1B lda $F7 ; CPU:$FA46 PRG:3A46 A5 F7 and #$C0 ; CPU:$FA48 PRG:3A48 29 C0 bne Sound_FA63 ; CPU:$FA4A PRG:3A4A D0 15 lda $F1 ; CPU:$FA4C PRG:3A4C A5 F1 lsr a ; CPU:$FA4E PRG:3A4E 4A bcs Sound_FA27 ; CPU:$FA4F PRG:3A4F B0 D4 lsr a ; CPU:$FA51 PRG:3A51 4A bcs UpdateSoundEnvelopes ; CPU:$FA52 PRG:3A52 B0 93 lsr a ; CPU:$FA54 PRG:3A54 4A bcs Sound_FA83 ; CPU:$FA55 PRG:3A55 B0 2A lsr a ; CPU:$FA57 PRG:3A57 4A lsr a ; CPU:$FA58 PRG:3A58 4A bcs Sound_FA64 ; CPU:$FA59 PRG:3A59 B0 07 lda $F5 ; CPU:$FA5B PRG:3A5B A5 F5 lsr a ; CPU:$FA5D PRG:3A5D 4A lsr a ; CPU:$FA5E PRG:3A5E 4A bcs Sound_FA0C ; CPU:$FA5F PRG:3A5F B0 A9 Sound_FA63: rts ; CPU:$FA61 PRG:3A61 60 Sound_FA64: lda $F6 ; CPU:$FA62 PRG:3A62 A5 F6 bne Sound_FA63 ; CPU:$FA64 PRG:3A64 D0 FB lda $F5 ; CPU:$FA66 PRG:3A66 A5 F5 and #$02 ; CPU:$FA68 PRG:3A68 29 02 bne Sound_FA63 ; CPU:$FA6A PRG:3A6A D0 F5 ldx #$8A ; CPU:$FA6C PRG:3A6C A2 8A ldy #$FA ; CPU:$FA6E PRG:3A6E A0 FA jsr $F68F ; CPU:$FA70 PRG:3A70 20 8F F6 lda $1B ; CPU:$FA73 PRG:3A73 A5 1B and #$3F ; CPU:$FA75 PRG:3A75 29 3F ora #$10 ; CPU:$FA77 PRG:3A77 09 10 sta $4006 ; CPU:$FA79 PRG:3A79 8D 06 40 rts ; CPU:$FA7C PRG:3A7C 60 Sound_FA7F: jsr $F68F ; CPU:$FA7D PRG:3A7D 20 8F F6 rts ; CPU:$FA80 PRG:3A80 60 Sound_FA83: ldy #$0A ; CPU:$FA81 PRG:3A81 A0 0A lda #$EF ; CPU:$FA83 PRG:3A83 A9 EF jmp Sound_FBA5 ; CPU:$FA85 PRG:3A85 4C A5 FB ; Preserved sound data / unused bytes Data_FA8A: .byte $D9, $86, $A8, $48, $08, $7F, $40, $28 ; CPU:$FA88 PRG:3A88 D9 86 A8 48 08 7F 40 28 .byte $08, $7F, $45, $28 ; CPU:$FA90 PRG:3A90 08 7F 45 28 ; UpdateTriangleEffects ; Purpose: sound-driver routine identified from call flow and register/state access. ; Inputs: sound request, channel, and stream state in zero page/global RAM as used locally. ; Returns: corresponding APU or sequencer state updated. UpdateTriangleEffects: inc $07F6 ; CPU:$FA94 PRG:3A94 EE F6 07 lda $07F6 ; CPU:$FA97 PRG:3A97 AD F6 07 cmp #$04 ; CPU:$FA9A PRG:3A9A C9 04 bne Sound_FAD8 ; CPU:$FA9C PRG:3A9C D0 38 lda $F5 ; CPU:$FA9E PRG:3A9E A5 F5 and #$1F ; CPU:$FAA0 PRG:3AA0 29 1F sta $F5 ; CPU:$FAA2 PRG:3AA2 85 F5 ldx #$92 ; CPU:$FAA4 PRG:3AA4 A2 92 ldy #$FA ; CPU:$FAA6 PRG:3AA6 A0 FA bne Sound_FB00 ; CPU:$FAA8 PRG:3AA8 D0 54 ; UpdateNoiseEffects ; Purpose: sound-driver routine identified from call flow and register/state access. ; Inputs: sound request, channel, and stream state in zero page/global RAM as used locally. ; Returns: corresponding APU or sequencer state updated. UpdateNoiseEffects: lda $F6 ; CPU:$FAAA PRG:3AAA A5 F6 beq Sound_FABA ; CPU:$FAAC PRG:3AAC F0 0A cmp #$08 ; CPU:$FAAE PRG:3AAE C9 08 beq Sound_FABA ; CPU:$FAB0 PRG:3AB0 F0 06 and #$0F ; CPU:$FAB2 PRG:3AB2 29 0F cmp #$0F ; CPU:$FAB4 PRG:3AB4 C9 0F bne Sound_FAD8 ; CPU:$FAB6 PRG:3AB6 D0 1E Sound_FABA: lda $F4 ; CPU:$FAB8 PRG:3AB8 A5 F4 and #$80 ; CPU:$FABA PRG:3ABA 29 80 bne Sound_FAD8 ; CPU:$FABC PRG:3ABC D0 18 lda $F1 ; CPU:$FABE PRG:3ABE A5 F1 asl a ; CPU:$FAC0 PRG:3AC0 0A bcs Sound_FB17 ; CPU:$FAC1 PRG:3AC1 B0 52 asl a ; CPU:$FAC3 PRG:3AC3 0A bcs Sound_FAE2 ; CPU:$FAC4 PRG:3AC4 B0 1A lda $F5 ; CPU:$FAC6 PRG:3AC6 A5 F5 asl a ; CPU:$FAC8 PRG:3AC8 0A asl a ; CPU:$FAC9 PRG:3AC9 0A bcs UpdateTriangleEffects ; CPU:$FACA PRG:3ACA B0 C8 lda $F1 ; CPU:$FACC PRG:3ACC A5 F1 and #$20 ; CPU:$FACE PRG:3ACE 29 20 beq Sound_FAD9 ; CPU:$FAD0 PRG:3AD0 F0 05 lda $F6 ; CPU:$FAD2 PRG:3AD2 A5 F6 beq Sound_FB04 ; CPU:$FAD4 PRG:3AD4 F0 2C Sound_FAD8: rts ; CPU:$FAD6 PRG:3AD6 60 Sound_FAD9: lda $F6 ; CPU:$FAD7 PRG:3AD7 A5 F6 cmp #$DF ; CPU:$FAD9 PRG:3AD9 C9 DF bne Sound_FAD8 ; CPU:$FADB PRG:3ADB D0 F9 jmp Sound_F79F ; CPU:$FADD PRG:3ADD 4C 9F F7 Sound_FAE2: lda $F5 ; CPU:$FAE0 PRG:3AE0 A5 F5 and #$1F ; CPU:$FAE2 PRG:3AE2 29 1F ora #$40 ; CPU:$FAE4 PRG:3AE4 09 40 sta $F5 ; CPU:$FAE6 PRG:3AE6 85 F5 lda #$00 ; CPU:$FAE8 PRG:3AE8 A9 00 sta $4008 ; CPU:$FAEA PRG:3AEA 8D 08 40 sta $F6 ; CPU:$FAED PRG:3AED 85 F6 sta $07F6 ; CPU:$FAEF PRG:3AEF 8D F6 07 lda #$10 ; CPU:$FAF2 PRG:3AF2 A9 10 sta $4004 ; CPU:$FAF4 PRG:3AF4 8D 04 40 sta $400C ; CPU:$FAF7 PRG:3AF7 8D 0C 40 ldx #$8E ; CPU:$FAFA PRG:3AFA A2 8E ldy #$FA ; CPU:$FAFC PRG:3AFC A0 FA Sound_FB00: jsr $F687 ; CPU:$FAFE PRG:3AFE 20 87 F6 rts ; CPU:$FB01 PRG:3B01 60 Sound_FB04: lda $07E9 ; CPU:$FB02 PRG:3B02 AD E9 07 and #$20 ; CPU:$FB05 PRG:3B05 29 20 bne Sound_FB10 ; CPU:$FB07 PRG:3B07 D0 05 lda #$02 ; CPU:$FB09 PRG:3B09 A9 02 sta $07F5 ; CPU:$FB0B PRG:3B0B 8D F5 07 Sound_FB10: ldy #$08 ; CPU:$FB0E PRG:3B0E A0 08 lda #$DF ; CPU:$FB10 PRG:3B10 A9 DF jmp Sound_FBA5 ; CPU:$FB12 PRG:3B12 4C A5 FB Sound_FB17: ldy #$04 ; CPU:$FB15 PRG:3B15 A0 04 lda #$7F ; CPU:$FB17 PRG:3B17 A9 7F jmp Sound_FBA5 ; CPU:$FB19 PRG:3B19 4C A5 FB Sound_FB1E: ldy #$00 ; CPU:$FB1C PRG:3B1C A0 00 lda #$02 ; CPU:$FB1E PRG:3B1E A9 02 jmp Sound_FBC1 ; CPU:$FB20 PRG:3B20 4C C1 FB ; UpdateSoundPriority ; Purpose: sound-driver routine identified from call flow and register/state access. ; Inputs: sound request, channel, and stream state in zero page/global RAM as used locally. ; Returns: corresponding APU or sequencer state updated. UpdateSoundPriority: lda $07E8 ; CPU:$FB23 PRG:3B23 AD E8 07 bne Sound_FB5E ; CPU:$FB26 PRG:3B26 D0 34 lda $F2 ; CPU:$FB28 PRG:3B28 A5 F2 lsr a ; CPU:$FB2A PRG:3B2A 4A bcs Sound_FB82 ; CPU:$FB2B PRG:3B2B B0 53 lsr a ; CPU:$FB2D PRG:3B2D 4A bcs Sound_FB1E ; CPU:$FB2E PRG:3B2E B0 EC lsr a ; CPU:$FB30 PRG:3B30 4A bcs Sound_FB4C ; CPU:$FB31 PRG:3B31 B0 17 lsr a ; CPU:$FB33 PRG:3B33 4A bcs Sound_FB7C ; CPU:$FB34 PRG:3B34 B0 44 lsr a ; CPU:$FB36 PRG:3B36 4A bcs Sound_FB69 ; CPU:$FB37 PRG:3B37 B0 2E lsr a ; CPU:$FB39 PRG:3B39 4A bcs Sound_FB5E ; CPU:$FB3A PRG:3B3A B0 20 lsr a ; CPU:$FB3C PRG:3B3C 4A bcs Sound_FB58 ; CPU:$FB3D PRG:3B3D B0 17 lsr a ; CPU:$FB3F PRG:3B3F 4A bcs Sound_FB52 ; CPU:$FB40 PRG:3B40 B0 0E lda $F6 ; CPU:$FB42 PRG:3B42 A5 F6 bne Sound_FB49 ; CPU:$FB44 PRG:3B44 D0 01 rts ; CPU:$FB46 PRG:3B46 60 Sound_FB49: jmp $F504 ; CPU:$FB47 PRG:3B47 4C 04 F5 Sound_FB4C: ldy #$02 ; CPU:$FB4A PRG:3B4A A0 02 lda #$04 ; CPU:$FB4C PRG:3B4C A9 04 bne Sound_FBA5 ; CPU:$FB4E PRG:3B4E D0 53 Sound_FB52: ldy #$09 ; CPU:$FB50 PRG:3B50 A0 09 lda #$80 ; CPU:$FB52 PRG:3B52 A9 80 bne Sound_FB6D ; CPU:$FB54 PRG:3B54 D0 15 Sound_FB58: ldy #$07 ; CPU:$FB56 PRG:3B56 A0 07 lda #$40 ; CPU:$FB58 PRG:3B58 A9 40 bne Sound_FB6D ; CPU:$FB5A PRG:3B5A D0 0F Sound_FB5E: lda #$00 ; CPU:$FB5C PRG:3B5C A9 00 sta $07E8 ; CPU:$FB5E PRG:3B5E 8D E8 07 ldy #$06 ; CPU:$FB61 PRG:3B61 A0 06 lda #$20 ; CPU:$FB63 PRG:3B63 A9 20 bne Sound_FBC1 ; CPU:$FB65 PRG:3B65 D0 58 Sound_FB69: ldy #$05 ; CPU:$FB67 PRG:3B67 A0 05 lda #$10 ; CPU:$FB69 PRG:3B69 A9 10 Sound_FB6D: jsr $F6A8 ; CPU:$FB6B PRG:3B6B 20 A8 F6 ldx #$FC ; CPU:$FB6E PRG:3B6E A2 FC ldy #$FC ; CPU:$FB70 PRG:3B70 A0 FC jsr SilencePulseChannels ; CPU:$FB72 PRG:3B72 20 12 F7 inc $07F0 ; CPU:$FB75 PRG:3B75 EE F0 07 bne Sound_FB49 ; CPU:$FB78 PRG:3B78 D0 CD Sound_FB7C: ldy #$03 ; CPU:$FB7A PRG:3B7A A0 03 lda #$08 ; CPU:$FB7C PRG:3B7C A9 08 bne Sound_FB86 ; CPU:$FB7E PRG:3B7E D0 04 Sound_FB82: ldy #$01 ; CPU:$FB80 PRG:3B80 A0 01 lda #$01 ; CPU:$FB82 PRG:3B82 A9 01 Sound_FB86: jsr $F6A8 ; CPU:$FB84 PRG:3B84 20 A8 F6 ldx #$80 ; CPU:$FB87 PRG:3B87 A2 80 ldy #$80 ; CPU:$FB89 PRG:3B89 A0 80 Sound_FB8D: jsr InitializeApuChannelState ; CPU:$FB8B PRG:3B8B 20 1A F7 lda #$83 ; CPU:$FB8E PRG:3B8E A9 83 sta $4001 ; CPU:$FB90 PRG:3B90 8D 01 40 lda #$7F ; CPU:$FB93 PRG:3B93 A9 7F sta $4005 ; CPU:$FB95 PRG:3B95 8D 05 40 bne Sound_FBAF ; CPU:$FB98 PRG:3B98 D0 13 jsr $F6A8 ; CPU:$FB9A PRG:3B9A 20 A8 F6 ldx #$04 ; CPU:$FB9D PRG:3B9D A2 04 ldy #$04 ; CPU:$FB9F PRG:3B9F A0 04 bne Sound_FBAC ; CPU:$FBA1 PRG:3BA1 D0 07 Sound_FBA5: jsr $F6A8 ; CPU:$FBA3 PRG:3BA3 20 A8 F6 ldx #$80 ; CPU:$FBA6 PRG:3BA6 A2 80 ldy #$80 ; CPU:$FBA8 PRG:3BA8 A0 80 Sound_FBAC: jsr SilencePulseChannels ; CPU:$FBAA PRG:3BAA 20 12 F7 Sound_FBAF: lda #$00 ; CPU:$FBAD PRG:3BAD A9 00 sta $07F0 ; CPU:$FBAF PRG:3BAF 8D F0 07 lda $F4 ; CPU:$FBB2 PRG:3BB2 A5 F4 and #$20 ; CPU:$FBB4 PRG:3BB4 29 20 beq Sound_FB49 ; CPU:$FBB6 PRG:3BB6 F0 8F lda #$D5 ; CPU:$FBB8 PRG:3BB8 A9 D5 sta $4001 ; CPU:$FBBA PRG:3BBA 8D 01 40 bne Sound_FB49 ; CPU:$FBBD PRG:3BBD D0 88 Sound_FBC1: jsr $F6A8 ; CPU:$FBBF PRG:3BBF 20 A8 F6 ldx #$80 ; CPU:$FBC2 PRG:3BC2 A2 80 ldy #$BA ; CPU:$FBC4 PRG:3BC4 A0 BA bne Sound_FB8D ; CPU:$FBC6 PRG:3BC6 D0 C3 ; Sound sequence pointer/index table and encoded sequence data. SoundSequencePointerTable: .byte $0B, $14, $1D, $26, $2F, $38, $41, $4A ; CPU:$FBC8 PRG:3BC8 0B 14 1D 26 2F 38 41 4A .byte $53, $5C, $65, $0C, $02, $FF, $0B, $FF ; CPU:$FBD0 PRG:3BD0 53 5C 65 0C 02 FF 0B FF .byte $1E, $FF, $31, $FF, $15, $18, $FE, $2A ; CPU:$FBD8 PRG:3BD8 1E FF 31 FF 15 18 FE 2A .byte $FE, $65, $FE, $86, $FE, $0C, $0D, $FE ; CPU:$FBE0 PRG:3BE0 FE 65 FE 86 FE 0C 0D FE .byte $00, $00, $13, $FE, $00, $00, $15, $38 ; CPU:$FBE8 PRG:3BE8 00 00 13 FE 00 00 15 38 .byte $FF, $5A, $FF, $79, $FF, $94, $FF, $00 ; CPU:$FBF0 PRG:3BF0 FF 5A FF 79 FF 94 FF 00 .byte $00, $00, $D7, $FE, $ED, $FE, $00, $00 ; CPU:$FBF8 PRG:3BF8 00 00 D7 FE ED FE 00 00 .byte $00, $B3, $FF, $C9, $FF, $DA, $FF, $EF ; CPU:$FC00 PRG:3C00 00 B3 FF C9 FF DA FF EF .byte $FF, $15, $A5, $FC, $0A, $FD, $98, $FD ; CPU:$FC08 PRG:3C08 FF 15 A5 FC 0A FD 98 FD .byte $E0, $FD, $15, $B2, $FE, $00, $00, $C5 ; CPU:$FC10 PRG:3C10 E0 FD 15 B2 FE 00 00 C5 .byte $FE, $00, $00, $15, $00, $00, $92, $FE ; CPU:$FC18 PRG:3C18 FE 00 00 15 00 00 92 FE .byte $A1, $FE, $00, $00, $0C, $59, $FC, $72 ; CPU:$FC20 PRG:3C20 A1 FE 00 00 0C 59 FC 72 .byte $FC, $8C, $FC, $00, $00, $00, $00, $00 ; CPU:$FC28 PRG:3C28 FC 8C FC 00 00 00 00 00 .byte $38, $FC, $49, $FC, $00, $00, $82, $02 ; CPU:$FC30 PRG:3C30 38 FC 49 FC 00 00 82 02 .byte $8B, $02, $80, $08, $02, $10, $02, $16 ; CPU:$FC38 PRG:3C38 8B 02 80 08 02 10 02 16 .byte $02, $52, $02, $02, $02, $1A, $00, $82 ; CPU:$FC40 PRG:3C40 02 52 02 02 02 1A 00 82 .byte $02, $80, $10, $02, $16, $02, $52, $02 ; CPU:$FC48 PRG:3C48 02 80 10 02 16 02 52 02 .byte $5A, $02, $02, $02, $56, $81, $02, $80 ; CPU:$FC50 PRG:3C50 5A 02 02 02 56 81 02 80 .byte $12, $02, $0C, $02, $04, $02, $0C, $02 ; CPU:$FC58 PRG:3C58 12 02 0C 02 04 02 0C 02 .byte $04, $02, $2A, $02, $81, $04, $02, $80 ; CPU:$FC60 PRG:3C60 04 02 2A 02 81 04 02 80 .byte $04, $02, $81, $04, $88, $02, $02, $00 ; CPU:$FC68 PRG:3C68 04 02 81 04 88 02 02 00 .byte $88, $02, $02, $80, $04, $02, $2A, $02 ; CPU:$FC70 PRG:3C70 88 02 02 80 04 02 2A 02 .byte $24, $02, $2A, $02, $24, $02, $1C, $02 ; CPU:$FC78 PRG:3C78 24 02 2A 02 24 02 1C 02 .byte $81, $22, $02, $80, $22, $02, $81, $24 ; CPU:$FC80 PRG:3C80 81 22 02 80 22 02 81 24 .byte $88, $02, $88, $02, $80, $56, $02, $4E ; CPU:$FC88 PRG:3C88 88 02 88 02 80 56 02 4E .byte $02, $12, $02, $4E, $02, $12, $02, $0C ; CPU:$FC90 PRG:3C90 02 12 02 4E 02 12 02 0C .byte $02, $81, $10, $02, $80, $10, $02, $81 ; CPU:$FC98 PRG:3C98 02 81 10 02 80 10 02 81 .byte $12, $88, $02, $C3, $81, $02, $02, $1C ; CPU:$FCA0 PRG:3CA0 12 88 02 C3 81 02 02 1C .byte $02, $02, $02, $1C, $1C, $FF, $C6, $88 ; CPU:$FCA8 PRG:3CA8 02 02 02 1C 1C FF C6 88 .byte $1C, $FF, $C7, $82, $4C, $4C, $2A, $4C ; CPU:$FCB0 PRG:3CB0 1C FF C7 82 4C 4C 2A 4C .byte $FF, $C6, $88, $1C, $FF, $C4, $81, $46 ; CPU:$FCB8 PRG:3CB8 FF C6 88 1C FF C4 81 46 .byte $02, $46, $02, $32, $02, $46, $80, $2E ; CPU:$FCC0 PRG:3CC0 02 46 02 32 02 46 80 2E .byte $2E, $FF, $C3, $82, $46, $46, $81, $32 ; CPU:$FCC8 PRG:3CC8 2E FF C3 82 46 46 81 32 .byte $32, $46, $2E, $FF, $80, $0C, $0C, $81 ; CPU:$FCD0 PRG:3CD0 32 46 2E FF 80 0C 0C 81 .byte $46, $46, $46, $80, $04, $04, $81, $46 ; CPU:$FCD8 PRG:3CD8 46 46 46 80 04 04 81 46 .byte $46, $02, $C8, $82, $4C, $4C, $2A, $4C ; CPU:$FCE0 PRG:3CE0 46 02 C8 82 4C 4C 2A 4C .byte $FF, $C2, $81, $46, $80, $32, $32, $82 ; CPU:$FCE8 PRG:3CE8 FF C2 81 46 80 32 32 82 .byte $46, $04, $81, $46, $2A, $FF, $C2, $81 ; CPU:$FCF0 PRG:3CF0 46 04 81 46 2A FF C2 81 .byte $0C, $0C, $80, $04, $04, $81, $04, $80 ; CPU:$FCF8 PRG:3CF8 0C 0C 80 04 04 81 04 80 .byte $2E, $2E, $81, $2E, $82, $24, $FF, $00 ; CPU:$FD00 PRG:3D00 2E 2E 81 2E 82 24 FF 00 .byte $81, $32, $02, $02, $06, $0C, $32, $02 ; CPU:$FD08 PRG:3D08 81 32 02 02 06 0C 32 02 .byte $02, $8A, $2E, $8B, $02, $8A, $2E, $8B ; CPU:$FD10 PRG:3D10 02 8A 2E 8B 02 8A 2E 8B .byte $02, $8A, $2E, $8B, $02, $88, $2E, $32 ; CPU:$FD18 PRG:3D18 02 8A 2E 8B 02 88 2E 32 .byte $2E, $D0, $8C, $2C, $24, $FF, $D0, $2E ; CPU:$FD20 PRG:3D20 2E D0 8C 2C 24 FF D0 2E .byte $20, $FF, $C3, $80, $28, $02, $82, $02 ; CPU:$FD28 PRG:3D28 20 FF C3 80 28 02 82 02 .byte $80, $2C, $02, $32, $02, $24, $02, $82 ; CPU:$FD30 PRG:3D30 80 2C 02 32 02 24 02 82 .byte $02, $81, $02, $80, $28, $02, $06, $02 ; CPU:$FD38 PRG:3D38 02 81 02 80 28 02 06 02 .byte $28, $02, $81, $02, $80, $24, $02, $32 ; CPU:$FD40 PRG:3D40 28 02 81 02 80 24 02 32 .byte $02, $24, $02, $FF, $80, $28, $02, $82 ; CPU:$FD48 PRG:3D48 02 24 02 FF 80 28 02 82 .byte $02, $80, $2C, $02, $32, $02, $24, $02 ; CPU:$FD50 PRG:3D50 02 80 2C 02 32 02 24 02 .byte $82, $02, $89, $0C, $0A, $08, $06, $32 ; CPU:$FD58 PRG:3D58 82 02 89 0C 0A 08 06 32 .byte $30, $2E, $2C, $2A, $28, $26, $24, $02 ; CPU:$FD60 PRG:3D60 30 2E 2C 2A 28 26 24 02 .byte $02, $02, $86, $02, $C7, $84, $02, $FF ; CPU:$FD68 PRG:3D68 02 02 86 02 C7 84 02 FF .byte $C4, $80, $28, $02, $82, $02, $80, $2C ; CPU:$FD70 PRG:3D70 C4 80 28 02 82 02 80 2C .byte $02, $32, $02, $24, $02, $82, $02, $81 ; CPU:$FD78 PRG:3D78 02 32 02 24 02 82 02 81 .byte $02, $80, $28, $02, $06, $02, $28, $02 ; CPU:$FD80 PRG:3D80 02 80 28 02 06 02 28 02 .byte $81, $02, $80, $24, $02, $32, $02, $24 ; CPU:$FD88 PRG:3D88 81 02 80 24 02 32 02 24 .byte $02, $FF, $C8, $84, $02, $FF, $81, $14 ; CPU:$FD90 PRG:3D90 02 FF C8 84 02 FF 81 14 .byte $02, $02, $14, $1A, $14, $02, $02, $88 ; CPU:$FD98 PRG:3D98 02 02 14 1A 14 02 02 88 .byte $10, $10, $10, $10, $14, $10, $85, $3C ; CPU:$FDA0 PRG:3DA0 10 10 10 10 14 10 85 3C .byte $81, $44, $85, $4A, $81, $44, $88, $28 ; CPU:$FDA8 PRG:3DA8 81 44 85 4A 81 44 88 28 .byte $24, $20, $46, $42, $40, $C6, $81, $3C ; CPU:$FDB0 PRG:3DB0 24 20 46 42 40 C6 81 3C .byte $02, $02, $44, $02, $02, $02, $4A, $02 ; CPU:$FDB8 PRG:3DB8 02 02 44 02 02 02 4A 02 .byte $46, $36, $36, $38, $38, $02, $3A, $02 ; CPU:$FDC0 PRG:3DC0 46 36 36 38 38 02 3A 02 .byte $80, $3C, $3C, $81, $02, $24, $02, $02 ; CPU:$FDC8 PRG:3DC8 80 3C 3C 81 02 24 02 02 .byte $2C, $24, $88, $24, $1E, $46, $36, $38 ; CPU:$FDD0 PRG:3DD0 2C 24 88 24 1E 46 36 38 .byte $3A, $FF, $C4, $84, $02, $FF, $D8, $81 ; CPU:$FDD8 PRG:3DD8 3A FF C4 84 02 FF D8 81 .byte $06, $FF, $C6, $88, $06, $FF, $C7, $81 ; CPU:$FDE0 PRG:3DE0 06 FF C6 88 06 FF C7 81 .byte $06, $06, $80, $06, $06, $81, $06, $06 ; CPU:$FDE8 PRG:3DE8 06 06 80 06 06 81 06 06 .byte $80, $06, $06, $81, $06, $06, $FF, $C6 ; CPU:$FDF0 PRG:3DF0 80 06 06 81 06 06 FF C6 .byte $88, $06, $FF, $E0, $81, $06, $06, $FF ; CPU:$FDF8 PRG:3DF8 88 06 FF E0 81 06 06 FF .byte $82, $0F, $81, $06, $06, $EA, $06, $06 ; CPU:$FE00 PRG:3E00 82 0F 81 06 06 EA 06 06 .byte $06, $06, $FF, $C5, $80, $0E, $58, $FF ; CPU:$FE08 PRG:3E08 06 06 FF C5 80 0E 58 FF .byte $00, $C5, $80, $0E, $58, $FF, $82, $1C ; CPU:$FE10 PRG:3E10 00 C5 80 0E 58 FF 82 1C .byte $1C, $C3, $82, $1C, $1C, $81, $1C, $1C ; CPU:$FE18 PRG:3E18 1C C3 82 1C 1C 81 1C 1C .byte $1C, $02, $FF, $C7, $88, $1C, $FF, $00 ; CPU:$FE20 PRG:3E20 1C 02 FF C7 88 1C FF 00 .byte $83, $02, $80, $0E, $02, $0E, $02, $0C ; CPU:$FE28 PRG:3E28 83 02 80 0E 02 0E 02 0C .byte $02, $0E, $02, $4E, $02, $02, $02, $0E ; CPU:$FE30 PRG:3E30 02 0E 02 4E 02 02 02 0E .byte $02, $0C, $02, $02, $02, $0E, $02, $0C ; CPU:$FE38 PRG:3E38 02 0C 02 02 02 0E 02 0C .byte $02, $0E, $02, $4E, $02, $02, $02, $0E ; CPU:$FE40 PRG:3E40 02 0E 02 4E 02 02 02 0E .byte $02, $0C, $02, $0E, $02, $0E, $02, $0C ; CPU:$FE48 PRG:3E48 02 0C 02 0E 02 0E 02 0C .byte $02, $0E, $02, $4E, $02, $02, $02, $0E ; CPU:$FE50 PRG:3E50 02 0E 02 4E 02 02 02 0E .byte $02, $0C, $02, $88, $4E, $18, $16, $12 ; CPU:$FE58 PRG:3E58 02 0C 02 88 4E 18 16 12 .byte $0E, $0C, $0E, $83, $02, $81, $3E, $3E ; CPU:$FE60 PRG:3E60 0E 0C 0E 83 02 81 3E 3E .byte $82, $46, $1C, $46, $81, $02, $38, $3E ; CPU:$FE68 PRG:3E68 82 46 1C 46 81 02 38 3E .byte $02, $82, $46, $1C, $82, $48, $48, $81 ; CPU:$FE70 PRG:3E70 02 82 46 1C 82 48 48 81 .byte $3E, $3E, $82, $38, $88, $24, $20, $1C ; CPU:$FE78 PRG:3E78 3E 3E 82 38 88 24 20 1C .byte $48, $46, $42, $3E, $82, $09, $09, $C6 ; CPU:$FE80 PRG:3E80 48 46 42 3E 82 09 09 C6 .byte $82, $03, $0C, $FF, $C6, $88, $06, $FF ; CPU:$FE88 PRG:3E88 82 03 0C FF C6 88 06 FF .byte $ED, $89, $2A, $02, $04, $0C, $02, $04 ; CPU:$FE90 PRG:3E90 ED 89 2A 02 04 0C 02 04 .byte $08, $02, $30, $26, $02, $30, $FF, $80 ; CPU:$FE98 PRG:3E98 08 02 30 26 02 30 FF 80 .byte $02, $ED, $89, $0C, $02, $12, $4E, $02 ; CPU:$FEA0 PRG:3EA0 02 ED 89 0C 02 12 4E 02 .byte $12, $18, $02, $0E, $08, $02, $0E, $FF ; CPU:$FEA8 PRG:3EA8 12 18 02 0E 08 02 0E FF .byte $80, $42, $02, $48, $02, $1E, $02, $24 ; CPU:$FEB0 PRG:3EB0 80 42 02 48 02 1E 02 24 .byte $02, $02, $02, $2A, $02, $C6, $8C, $30 ; CPU:$FEB8 PRG:3EB8 02 02 02 2A 02 C6 8C 30 .byte $2A, $FF, $00, $80, $24, $02, $2A, $02 ; CPU:$FEC0 PRG:3EC0 2A FF 00 80 24 02 2A 02 .byte $30, $02, $06, $02, $02, $02, $0C, $02 ; CPU:$FEC8 PRG:3EC8 30 02 06 02 02 02 0C 02 .byte $C6, $8C, $12, $18, $FF, $80, $56, $54 ; CPU:$FED0 PRG:3ED0 C6 8C 12 18 FF 80 56 54 .byte $52, $50, $81, $02, $80, $5E, $5A, $54 ; CPU:$FED8 PRG:3ED8 52 50 81 02 80 5E 5A 54 .byte $50, $18, $14, $10, $0A, $06, $30, $2C ; CPU:$FEE0 PRG:3EE0 50 18 14 10 0A 06 30 2C .byte $28, $02, $00, $80, $1A, $18, $16, $14 ; CPU:$FEE8 PRG:3EE8 28 02 00 80 1A 18 16 14 .byte $81, $02, $80, $02, $5E, $5A, $54, $50 ; CPU:$FEF0 PRG:3EF0 81 02 80 02 5E 5A 54 50 .byte $18, $14, $10, $0A, $06, $30, $2C, $28 ; CPU:$FEF8 PRG:3EF8 18 14 10 0A 06 30 2C 28 .byte $82, $1C, $02, $1C, $02, $02, $1C, $1C ; CPU:$FF00 PRG:3F00 82 1C 02 1C 02 02 1C 1C .byte $00, $81, $10, $0A, $32, $28, $80, $32 ; CPU:$FF08 PRG:3F08 00 81 10 0A 32 28 80 32 .byte $02, $32, $02, $82, $32, $81, $06, $02 ; CPU:$FF10 PRG:3F10 02 32 02 82 32 81 06 02 .byte $06, $02, $82, $32, $81, $54, $1A, $10 ; CPU:$FF18 PRG:3F18 06 02 82 32 81 54 1A 10 .byte $0A, $80, $10, $02, $10, $02, $82, $10 ; CPU:$FF20 PRG:3F20 0A 80 10 02 10 02 82 10 .byte $81, $16, $02, $16, $02, $82, $0A, $83 ; CPU:$FF28 PRG:3F28 81 16 02 16 02 82 0A 83 .byte $03, $0C, $82, $03, $0C, $0C, $C2, $88 ; CPU:$FF30 PRG:3F30 03 0C 82 03 0C 0C C2 88 .byte $1C, $1C, $1C, $1C, $1C, $1C, $83, $1C ; CPU:$FF38 PRG:3F38 1C 1C 1C 1C 1C 1C 83 1C .byte $80, $04, $04, $2A, $02, $82, $1C, $FF ; CPU:$FF40 PRG:3F40 80 04 04 2A 02 82 1C FF .byte $81, $4C, $02, $4C, $02, $2A, $02, $4C ; CPU:$FF48 PRG:3F48 81 4C 02 4C 02 2A 02 4C .byte $1C, $81, $4C, $02, $4C, $02, $4C, $00 ; CPU:$FF50 PRG:3F50 1C 81 4C 02 4C 02 4C 00 .byte $88, $2E, $2E, $2E, $30, $04, $30, $C4 ; CPU:$FF58 PRG:3F58 88 2E 2E 2E 30 04 30 C4 .byte $80, $2E, $04, $FF, $83, $02, $88, $2E ; CPU:$FF60 PRG:3F60 80 2E 04 FF 83 02 88 2E .byte $2E, $2E, $30, $04, $30, $C4, $80, $2E ; CPU:$FF68 PRG:3F68 2E 2E 30 04 30 C4 80 2E .byte $04, $FF, $83, $02, $84, $02, $02, $C2 ; CPU:$FF70 PRG:3F70 04 FF 83 02 84 02 02 C2 .byte $88, $3E, $3E, $3E, $42, $46, $42, $84 ; CPU:$FF78 PRG:3F78 88 3E 3E 3E 42 46 42 84 .byte $3E, $FF, $85, $3E, $81, $3E, $88, $1C ; CPU:$FF80 PRG:3F80 3E FF 85 3E 81 3E 88 1C .byte $46, $1C, $81, $02, $3E, $3E, $3E, $82 ; CPU:$FF88 PRG:3F88 46 1C 81 02 3E 3E 3E 82 .byte $34, $02, $C2, $88, $06, $06, $06, $06 ; CPU:$FF90 PRG:3F90 34 02 C2 88 06 06 06 06 .byte $06, $06, $82, $06, $06, $06, $06, $FF ; CPU:$FF98 PRG:3F98 06 06 82 06 06 06 06 FF .byte $C2, $81, $06, $06, $80, $06, $06, $81 ; CPU:$FFA0 PRG:3FA0 C2 81 06 06 80 06 06 81 .byte $06, $06, $06, $06, $80, $06, $06, $FF ; CPU:$FFA8 PRG:3FA8 06 06 06 06 80 06 06 FF .byte $09, $80, $10, $02, $10, $02, $10, $02 ; CPU:$FFB0 PRG:3FB0 09 80 10 02 10 02 10 02 .byte $0C, $0C, $0C, $02, $0C, $02, $14, $14 ; CPU:$FFB8 PRG:3FB8 0C 0C 0C 02 0C 02 14 14 .byte $14, $02, $14, $02, $85, $10, $00, $80 ; CPU:$FFC0 PRG:3FC0 14 02 14 02 85 10 00 80 .byte $32, $02, $32, $02, $32, $02, $C2, $32 ; CPU:$FFC8 PRG:3FC8 32 02 32 02 32 02 C2 32 .byte $32, $32, $02, $32, $02, $FF, $85, $32 ; CPU:$FFD0 PRG:3FD0 32 32 02 32 02 FF 85 32 .byte $80, $54, $02, $54, $02, $54, $02, $50 ; CPU:$FFD8 PRG:3FD8 80 54 02 54 02 54 02 50 .byte $50, $50, $02, $50, $02, $56, $56, $56 ; CPU:$FFE0 PRG:3FE0 50 50 02 50 02 56 56 56 .byte $02, $56, $02, $85, $54, $C4, $85, $0C ; CPU:$FFE8 PRG:3FE8 02 56 02 85 54 C4 85 0C .byte $FF, $FF, $FF, $FF, $FF ; CPU:$FFF0 PRG:3FF0 FF FF FF FF FF ; UpdateAudioFrame ; Purpose: sound-driver routine identified from call flow and register/state access. ; Inputs: sound request, channel, and stream state in zero page/global RAM as used locally. ; Returns: corresponding APU or sequencer state updated. UpdateAudioFrame: jmp Sound_F758 ; CPU:$FFF5 PRG:3FF5 4C 58 F7 ; NES interrupt vectors InterruptVectors: .word $C094, $C000, $C0F7 ; CPU:$FFF8 PRG:3FF8 94 C0 00 C0 F7 C0