Files
disasm/Balloon Fight (JU)/copilot/prg.s
T
tmerritt 18d44a8883 Pass 2 complete: Balloon Fight (JU) label renaming
Replaced all 497 Label_XXXX labels with semantic names:

- 37 jmp-target labels renamed with routine-specific names
- 6 branch-target labels renamed with _Loop/_Next/_Block roles
- 454 internal branch targets renamed as <Routine>_Block/_Block_N
  based on parent routine and block position

All 84 jsr targets already had semantic names.
Build verified byte-identical. verify_pass1.py passes with 'canoni'
comment format.

Updated TODO.md: removed Balloon Fight from Label_ residue table.
2026-10-19 10:29:50 -04:00

8544 lines
389 KiB
ArmAsm
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
.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