Files
disasm/Balloon Fight (JU)/copilot/prg.s
T

8527 lines
429 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 ; $0000: A9 00
sta PPUCTRL ; $0002: 8D 00 20
sta PPUMASK ; $0005: 8D 01 20
WaitForVBlankSet:
lda PPUSTATUS ; $0008: AD 02 20
bpl WaitForVBlankSet ; $000B: 10 FB
WaitForVBlankClear:
lda PPUSTATUS ; $000D: AD 02 20
bmi WaitForVBlankClear ; $0010: 30 FB
WaitForSecondVBlank:
lda PPUSTATUS ; $0012: AD 02 20
bpl WaitForSecondVBlank ; $0015: 10 FB
sei ; $0017: 78
cld ; $0018: D8
ldx #$FF ; $0019: A2 FF
txs ; $001B: 9A
ldx #$12 ; $001C: A2 12
lda #$00 ; $001E: A9 00
ClearZeroPage:
sta $00,x ; $0020: 95 00
inx ; $0022: E8
bne ClearZeroPage ; $0023: D0 FB
ldx #$02 ; $0025: A2 02
CheckSavedSignature:
lda $07FA,x ; $0027: BD FA 07
cmp $C082,x ; $002A: DD 82 C0
bne InitializeMemory ; $002D: D0 05
dex ; $002F: CA
bpl CheckSavedSignature ; $0030: 10 F5
bmi SavedSignatureValid ; $0032: 30 43
InitializeMemory:
ldx #$00 ; $0034: A2 00
txa ; $0036: 8A
ClearZeroPageAndStackPage:
sta $00,x ; $0037: 95 00
sta $0700,x ; $0039: 9D 00 07
inx ; $003C: E8
bne ClearZeroPageAndStackPage ; $003D: D0 F8
lda #$32 ; $003F: A9 32
sta $15 ; $0041: 85 15
InitializeBlockLoop:
lda #$32 ; $0043: A9 32
jsr $D6DE ; $0045: 20 DE D6
lda #$00 ; $0048: A9 00
sta $46 ; $004A: 85 46
jsr $C579 ; $004C: 20 79 C5
dec $15 ; $004F: C6 15
bne InitializeBlockLoop ; $0051: D0 F0
ldx #$0E ; $0053: A2 0E
CopyInitializationData:
lda $C085,x ; $0055: BD 85 C0
sta $0629,x ; $0058: 9D 29 06
dex ; $005B: CA
bpl CopyInitializationData ; $005C: 10 F7
ldx #$04 ; $005E: A2 04
ClearLocalVariables:
lda #$00 ; $0060: A9 00
sta $03,x ; $0062: 95 03
dex ; $0064: CA
bpl ClearLocalVariables ; $0065: 10 F9
lda #$00 ; $0067: A9 00
jsr $D6DE ; $0069: 20 DE D6
ldx #$02 ; $006C: A2 02
CopySavedSignature:
lda $C082,x ; $006E: BD 82 C0
sta $07FA,x ; $0071: 9D FA 07
dex ; $0074: CA
bpl CopySavedSignature ; $0075: 10 F7
SavedSignatureValid:
lda #$1E ; $0077: A9 1E
sta $01 ; $0079: 85 01
lda #$90 ; $007B: A9 90
sta $00 ; $007D: 85 00
; Decoded PRG block $007F-$046A.
EnterMainInitialization:
jmp MainInitialization ; $007F: 4C D4 F1
WarmStartSignature:
.byte "HAL" ; $0082: 48 41 4C
ResetInitializationData:
.byte $00, $00, $00, $01, $00, $00, $00, $00 ; $0085: 00 00 00 01 00 00 00 00
.byte $01, $00, $00, $00, $05, $02, $00 ; $008D: 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 ; $0094: 48
txa ; $0095: 8A
pha ; $0096: 48
tya ; $0097: 98
pha ; $0098: 48
lda #$00 ; $0099: A9 00
sta $2003 ; $009B: 8D 03 20
lda #$02 ; $009E: A9 02
sta $4014 ; $00A0: 8D 14 40
lda PpuBufferReadOffset ; $00A3: A5 52
cmp PpuBufferWriteOffset ; $00A5: C5 53
beq Label_C0AC ; $00A7: F0 03
jsr FlushPpuCommandPreserved ; $00A9: 20 7C C1
Label_C0AC:
jsr UpdatePpuTransferSources ; $00AC: 20 0D D6
jsr BuildFrameOam ; $00AF: 20 98 D7
inc FrameCounter ; $00B2: E6 19
lda #$20 ; $00B4: A9 20
sta $2006 ; $00B6: 8D 06 20
lda #$00 ; $00B9: A9 00
sta $2006 ; $00BB: 8D 06 20
lda #$00 ; $00BE: A9 00
sta $2005 ; $00C0: 8D 05 20
sta $2005 ; $00C3: 8D 05 20
jsr UpdateAudioFrame ; $00C6: 20 F7 FF
lda #$01 ; $00C9: A9 01
sta NmiCompletedFlag ; $00CB: 85 02
lda RenderingDisabledFlag ; $00CD: A5 16
beq Label_C0F1 ; $00CF: F0 20
Label_C0D1:
lda $2002 ; $00D1: AD 02 20
bmi Label_C0D1 ; $00D4: 30 FB
ldx #$04 ; $00D6: A2 04
ldy #$C6 ; $00D8: A0 C6
Label_C0DA:
dey ; $00DA: 88
bne Label_C0DA ; $00DB: D0 FD
dex ; $00DD: CA
bne Label_C0DA ; $00DE: D0 FA
lda PpuControlBase ; $00E0: A5 18
ora PpuControlShadow ; $00E2: 05 00
sta $2000 ; $00E4: 8D 00 20
lda PpuScrollX ; $00E7: A5 17
sta $2005 ; $00E9: 8D 05 20
lda #$00 ; $00EC: A9 00
sta $2005 ; $00EE: 8D 05 20
Label_C0F1:
pla ; $00F1: 68
tay ; $00F2: A8
pla ; $00F3: 68
tax ; $00F4: AA
pla ; $00F5: 68
rti ; $00F6: 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 ; $00F7: 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 ; $00FA: A5 00
and #$7F ; $00FC: 29 7F
Label_C0FE:
sta $2000 ; $00FE: 8D 00 20
sta PpuControlShadow ; $0101: 85 00
rts ; $0103: 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 ; $0104: A5 00
ora #$80 ; $0106: 09 80
bne Label_C0FE ; $0108: 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 ; $010A: A9 00
Label_C10C:
pha ; $010C: 48
jsr WaitForFrame ; $010D: 20 65 F4
pla ; $0110: 68
sta $2001 ; $0111: 8D 01 20
rts ; $0114: 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 ; $0115: A5 01
bne Label_C10C ; $0117: 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 ; $0119: 20 54 C1
ldy #$00 ; $011C: A0 00
Label_C11E:
lda $0057,y ; $011E: B9 57 00
sta $0300,x ; $0121: 9D 00 03
inx ; $0124: E8
iny ; $0125: C8
cpy PpuCommandLength ; $0126: C4 56
bne Label_C11E ; $0128: D0 F4
stx PpuBufferWriteOffset ; $012A: 86 53
rts ; $012C: 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 ; $012D: A9 57
ldy #$00 ; $012F: 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 ; $0131: 85 21
sty PpuSourcePtrHi ; $0133: 84 22
txa ; $0135: 8A
pha ; $0136: 48
ldy #$02 ; $0137: 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 ; $0139: B1 21
clc ; $013B: 18
adc #$03 ; $013C: 69 03
sta Temp12 ; $013E: 85 12
ldx PpuBufferWriteOffset ; $0140: A6 53
ldy #$00 ; $0142: A0 00
Label_C144:
lda (PpuSourcePtrLo),y ; $0144: B1 21
sta $0300,x ; $0146: 9D 00 03
inx ; $0149: E8
iny ; $014A: C8
cpy Temp12 ; $014B: C4 12
bne Label_C144 ; $014D: D0 F5
stx PpuBufferWriteOffset ; $014F: 86 53
pla ; $0151: 68
tax ; $0152: AA
rts ; $0153: 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 ; $0154: A6 53
lda #$00 ; $0156: A9 00
sta Temp12 ; $0158: 85 12
lda PpuCommandAddressLo ; $015A: A5 55
asl a ; $015C: 0A
asl a ; $015D: 0A
asl a ; $015E: 0A
asl a ; $015F: 0A
rol Temp12 ; $0160: 26 12
asl a ; $0162: 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 ; $0163: 26 12
ora PpuCommandAddressHi ; $0165: 05 54
pha ; $0167: 48
lda Temp12 ; $0168: A5 12
ora #$20 ; $016A: 09 20
sta $0300,x ; $016C: 9D 00 03
inx ; $016F: E8
pla ; $0170: 68
sta $0300,x ; $0171: 9D 00 03
inx ; $0174: E8
lda PpuCommandLength ; $0175: A5 56
sta $0300,x ; $0177: 9D 00 03
inx ; $017A: E8
rts ; $017B: 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 ; $017C: 98
pha ; $017D: 48
txa ; $017E: 8A
pha ; $017F: 48
jsr PreserveXYAndFinalizePpuCommand; $0180: 20 88 C1
pla ; $0183: 68
tax ; $0184: AA
pla ; $0185: 68
tay ; $0186: A8
rts ; $0187: 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 ; $0188: A6 52
lda $0300,x ; $018A: BD 00 03
inx ; $018D: E8
sta PpuDestinationHi ; $018E: 85 50
sta $2006 ; $0190: 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 ; $0193: BD 00 03
inx ; $0196: E8
sta $2006 ; $0197: 8D 06 20
ldy $0300,x ; $019A: BC 00 03
inx ; $019D: E8
Label_C19E:
lda $0300,x ; $019E: BD 00 03
inx ; $01A1: E8
sta $2007 ; $01A2: 8D 07 20
dey ; $01A5: 88
bne Label_C19E ; $01A6: D0 F6
lda PpuDestinationHi ; $01A8: A5 50
cmp #$3F ; $01AA: C9 3F
bne Label_C1BE ; $01AC: D0 10
lda #$3F ; $01AE: A9 3F
sta $2006 ; $01B0: 8D 06 20
lda #$00 ; $01B3: A9 00
sta $2006 ; $01B5: 8D 06 20
sta $2006 ; $01B8: 8D 06 20
sta $2006 ; $01BB: 8D 06 20
Label_C1BE:
stx PpuBufferReadOffset ; $01BE: 86 52
cpx PpuBufferWriteOffset ; $01C0: E4 53
bne PreserveXYAndFinalizePpuCommand; $01C2: D0 C4
rts ; $01C4: 60
Label_C1C5:
lda #$20 ; $01C5: A9 20
sta $F2 ; $01C7: 85 F2
jsr $C527 ; $01C9: 20 27 C5
jsr $C539 ; $01CC: 20 39 C5
lda #$FF ; $01CF: A9 FF
sta $CD ; $01D1: 85 CD
lda #$AD ; $01D3: A9 AD
sta SpawnCommandPointerLo ; $01D5: 85 23
lda #$C4 ; $01D7: A9 C4
sta SpawnCommandPointerHi ; $01D9: 85 24
lda #$80 ; $01DB: A9 80
sta $91 ; $01DD: 85 91
sta $0488 ; $01DF: 8D 88 04
lda #$70 ; $01E2: A9 70
sta $9A ; $01E4: 85 9A
jsr InitializeParticleSlots ; $01E6: 20 4A CD
lda #$00 ; $01E9: A9 00
sta $41 ; $01EB: 85 41
sta $C9 ; $01ED: 85 C9
sta $CA ; $01EF: 85 CA
sta $BA ; $01F1: 85 BA
sta $C5 ; $01F3: 85 C5
sta $C8 ; $01F5: 85 C8
jsr InitializeAudio ; $01F7: 20 A5 F4
ldx #$13 ; $01FA: A2 13
Label_C1FC:
lda #$FF ; $01FC: A9 FF
sta $0530,x ; $01FE: 9D 30 05
lda #$F0 ; $0201: A9 F0
sta $04A4,x ; $0203: 9D A4 04
dex ; $0206: CA
bpl Label_C1FC ; $0207: 10 F3
Label_C209:
jsr $F470 ; $0209: 20 70 F4
jsr UpdateGameplayObjects ; $020C: 20 91 E6
lda $C5 ; $020F: A5 C5
bne Label_C216 ; $0211: D0 03
jsr UpdateSpecialObjectSystem ; $0213: 20 F9 C6
Label_C216:
lda FrameCounter ; $0216: A5 19
lsr a ; $0218: 4A
bcs Label_C21E ; $0219: B0 03
jmp Label_C2D0 ; $021B: 4C D0 C2
Label_C21E:
lda $C5 ; $021E: A5 C5
beq RunGameplayFrame ; $0220: F0 05
dec $C5 ; $0222: C6 C5
jmp Label_C2D0 ; $0224: 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 ; $0227: A5 17
bne Label_C231 ; $0229: D0 06
lda PpuControlBase ; $022B: A5 18
eor #$01 ; $022D: 49 01
sta PpuControlBase ; $022F: 85 18
Label_C231:
dec PpuScrollX ; $0231: C6 17
lda $0488 ; $0233: AD 88 04
beq Label_C24D ; $0236: F0 15
inc $0488 ; $0238: EE 88 04
lda $0488 ; $023B: AD 88 04
cmp #$F0 ; $023E: C9 F0
bcc Label_C247 ; $0240: 90 05
lda #$00 ; $0242: A9 00
sta $0488 ; $0244: 8D 88 04
Label_C247:
lda $BD ; $0247: A5 BD
beq Label_C24D ; $0249: F0 02
inc $91 ; $024B: E6 91
Label_C24D:
ldx #$07 ; $024D: A2 07
Label_C24F:
lda $055D,x ; $024F: BD 5D 05
bmi Label_C26D ; $0252: 30 19
inc $0567,x ; $0254: FE 67 05
lda $0567,x ; $0257: BD 67 05
cmp #$F8 ; $025A: C9 F8
bne Label_C26D ; $025C: D0 0F
lda #$FF ; $025E: A9 FF
sta $055D,x ; $0260: 9D 5D 05
lda #$F0 ; $0263: A9 F0
sta $057B,x ; $0265: 9D 7B 05
lda #$00 ; $0268: A9 00
sta $05CE ; $026A: 8D CE 05
Label_C26D:
dex ; $026D: CA
bpl Label_C24F ; $026E: 10 DF
ldx #$13 ; $0270: A2 13
Label_C272:
lda $0530,x ; $0272: BD 30 05
bmi Label_C289 ; $0275: 30 12
inc $0490,x ; $0277: FE 90 04
lda $0490,x ; $027A: BD 90 04
cmp #$F8 ; $027D: C9 F8
bcc Label_C289 ; $027F: 90 08
lda #$F0 ; $0281: A9 F0
sta $04A4,x ; $0283: 9D A4 04
sta $0530,x ; $0286: 9D 30 05
Label_C289:
dex ; $0289: CA
bpl Label_C272 ; $028A: 10 E6
lda PpuScrollX ; $028C: A5 17
and #$07 ; $028E: 29 07
bne Label_C2D0 ; $0290: D0 3E
ldx $88 ; $0292: A6 88
dex ; $0294: CA
bmi Label_C2D0 ; $0295: 30 39
lda #$00 ; $0297: A9 00
sta $3E ; $0299: 85 3E
lda #$01 ; $029B: A9 01
jsr InitializeOrQueueObject ; $029D: 20 DE D6
inc $C9 ; $02A0: E6 C9
lda $C9 ; $02A2: A5 C9
and #$1F ; $02A4: 29 1F
bne Label_C2BC ; $02A6: D0 14
inc $CA ; $02A8: E6 CA
lda $CA ; $02AA: A5 CA
cmp #$0A ; $02AC: C9 0A
bne Label_C2BC ; $02AE: D0 0C
lda #$02 ; $02B0: A9 02
sta $CA ; $02B2: 85 CA
ldy $BA ; $02B4: A4 BA
iny ; $02B6: C8
tya ; $02B7: 98
and #$03 ; $02B8: 29 03
sta $BA ; $02BA: 85 BA
Label_C2BC:
ldx $CA ; $02BC: A6 CA
lda SpawnPatternIndexTable,x ; $02BE: BD BF C3
asl a ; $02C1: 0A
tay ; $02C2: A8
lda SpawnPatternHandlerTable,y; $02C3: B9 B5 C3
sta DispatchPointerLo ; $02C6: 85 25
lda $C3B6,y ; $02C8: B9 B6 C3
sta DispatchPointerHi ; $02CB: 85 26
jsr DispatchSpawnPattern ; $02CD: 20 B2 C3
Label_C2D0:
ldx #$07 ; $02D0: A2 07
Label_C2D2:
lda $055D,x ; $02D2: BD 5D 05
bmi Label_C2EF ; $02D5: 30 18
jsr $CECE ; $02D7: 20 CE CE
lda $05CD ; $02DA: AD CD 05
beq Label_C2EF ; $02DD: F0 10
dec $05CD ; $02DF: CE CD 05
inc $05CE ; $02E2: EE CE 05
txa ; $02E5: 8A
pha ; $02E6: 48
lda $0559 ; $02E7: AD 59 05
jsr InitializeOrQueueObject ; $02EA: 20 DE D6
pla ; $02ED: 68
tax ; $02EE: AA
Label_C2EF:
jsr $CE2F ; $02EF: 20 2F CE
dex ; $02F2: CA
bpl Label_C2D2 ; $02F3: 10 DD
ldx #$13 ; $02F5: A2 13
Label_C2F7:
lda $0530,x ; $02F7: BD 30 05
bmi Label_C317 ; $02FA: 30 1B
lda $C5 ; $02FC: A5 C5
bne Label_C314 ; $02FE: D0 14
jsr $C9B6 ; $0300: 20 B6 C9
lda $04A4,x ; $0303: BD A4 04
cmp #$02 ; $0306: C9 02
bcs Label_C30D ; $0308: B0 03
jsr ReflectObjectYVelocity ; $030A: 20 4F CA
Label_C30D:
cmp #$D8 ; $030D: C9 D8
bcc Label_C314 ; $030F: 90 03
jsr ReflectObjectYVelocity ; $0311: 20 4F CA
Label_C314:
jsr $CB1C ; $0314: 20 1C CB
Label_C317:
lda FrameCounter ; $0317: A5 19
and #$07 ; $0319: 29 07
lsr a ; $031B: 4A
tay ; $031C: A8
lda $C9DD,y ; $031D: B9 DD C9
pha ; $0320: 48
lda FrameCounter ; $0321: A5 19
lsr a ; $0323: 4A
txa ; $0324: 8A
bcc Label_C32D ; $0325: 90 06
sta Temp12 ; $0327: 85 12
lda #$13 ; $0329: A9 13
sbc Temp12 ; $032B: E5 12
Label_C32D:
asl a ; $032D: 0A
asl a ; $032E: 0A
tay ; $032F: A8
pla ; $0330: 68
sta $02B1,y ; $0331: 99 B1 02
lda $04A4,x ; $0334: BD A4 04
sta $02B0,y ; $0337: 99 B0 02
lda $0490,x ; $033A: BD 90 04
sta $02B3,y ; $033D: 99 B3 02
lda #$00 ; $0340: A9 00
sta $02B2,y ; $0342: 99 B2 02
dex ; $0345: CA
bpl Label_C2F7 ; $0346: 10 AF
lda $05CE ; $0348: AD CE 05
cmp #$14 ; $034B: C9 14
bcc Label_C36F ; $034D: 90 20
inc $47 ; $034F: E6 47
lda #$00 ; $0351: A9 00
jsr InitializeOrQueueObject ; $0353: 20 DE D6
dec $47 ; $0356: C6 47
lda #$10 ; $0358: A9 10
sta $F2 ; $035A: 85 F2
inc $C8 ; $035C: E6 C8
jsr $D3ED ; $035E: 20 ED D3
jsr $C527 ; $0361: 20 27 C5
dec $C8 ; $0364: C6 C8
ldx #$64 ; $0366: A2 64
jsr $F45E ; $0368: 20 5E F4
lda #$20 ; $036B: A9 20
sta $F2 ; $036D: 85 F2
Label_C36F:
ldx #$F0 ; $036F: A2 F0
lda $0488 ; $0371: AD 88 04
beq Label_C378 ; $0374: F0 02
ldx #$88 ; $0376: A2 88
Label_C378:
stx $0200 ; $0378: 8E 00 02
stx $0204 ; $037B: 8E 04 02
sta $0203 ; $037E: 8D 03 02
clc ; $0381: 18
adc #$08 ; $0382: 69 08
sta $0207 ; $0384: 8D 07 02
lda FrameCounter ; $0387: A5 19
and #$03 ; $0389: 29 03
sta $0202 ; $038B: 8D 02 02
sta $0206 ; $038E: 8D 06 02
ldx #$E3 ; $0391: A2 E3
stx $0201 ; $0393: 8E 01 02
inx ; $0396: E8
stx $0205 ; $0397: 8E 05 02
lda $88 ; $039A: A5 88
bmi Label_C3A1 ; $039C: 30 03
jmp Label_C209 ; $039E: 4C 09 C2
Label_C3A1:
jsr SortOrInitializeRecords ; $03A1: 20 79 C5
lda #$01 ; $03A4: A9 01
sta $F0 ; $03A6: 85 F0
jsr WaitForFrame ; $03A8: 20 65 F4
lda #$02 ; $03AB: A9 02
sta $F2 ; $03AD: 85 F2
jmp $F36A ; $03AF: 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) ; $03B2: 6C 25 00
SpawnPatternHandlerTable:
.word SpawnFromCommandStream ; $03B5: C9 C3
.word SpawnAtRandomPosition ; $03B7: F7 C3
.word SpawnPatternNone ; $03B9: 3E C4
.word InitializeSpecialObject ; $03BB: 5F C4
.word SpawnPatternNoneAlt ; $03BD: 5E C4
SpawnPatternIndexTable:
.byte $00, $00, $02, $02, $02, $02, $02, $04, $03, $01 ; $03BF: 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 ; $03C9: A0 00
lda (SpawnCommandPointerLo),y ; $03CB: B1 23
inc SpawnCommandPointerLo ; $03CD: E6 23
bne Label_C3D3 ; $03CF: D0 02
inc SpawnCommandPointerHi ; $03D1: E6 24
Label_C3D3:
tax ; $03D3: AA
beq Label_C3F6 ; $03D4: F0 20
asl a ; $03D6: 0A
asl a ; $03D7: 0A
asl a ; $03D8: 0A
sta SpawnPixelPosition ; $03D9: 85 15
lda #$00 ; $03DB: A9 00
sta SpawnParameter ; $03DD: 85 14
txa ; $03DF: 8A
and #$C0 ; $03E0: 29 C0
cmp #$80 ; $03E2: C9 80
bne Label_C3EC ; $03E4: D0 06
jsr AllocateEffectObject ; $03E6: 20 6B C4
jmp SpawnFromCommandStream ; $03E9: 4C C9 C3
Label_C3EC:
cmp #$00 ; $03EC: C9 00
bne Label_C3F6 ; $03EE: D0 06
jsr $C486 ; $03F0: 20 86 C4
jmp SpawnFromCommandStream ; $03F3: 4C C9 C3
Label_C3F6:
rts ; $03F6: 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 ; $03F7: 20 B3 F1
and #$7F ; $03FA: 29 7F
cmp #$04 ; $03FC: C9 04
bcc SpawnRandomObject ; $03FE: 90 0C
cmp #$18 ; $0400: C9 18
bcs SpawnRandomObject ; $0402: B0 08
asl a ; $0404: 0A
asl a ; $0405: 0A
asl a ; $0406: 0A
sta SpawnPixelPosition ; $0407: 85 15
jsr AllocateEffectObject ; $0409: 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 ; $040C: 20 B3 F1
and #$3F ; $040F: 29 3F
cmp #$02 ; $0411: C9 02
bcc Label_C439 ; $0413: 90 24
cmp #$18 ; $0415: C9 18
bcs Label_C439 ; $0417: B0 20
asl a ; $0419: 0A
asl a ; $041A: 0A
asl a ; $041B: 0A
sta SpawnPixelPosition ; $041C: 85 15
jsr GetRandomValue ; $041E: 20 B3 F1
and #$3F ; $0421: 29 3F
ldx $BA ; $0423: A6 BA
adc SpawnSelectorAdjustmentTable,x; $0425: 7D 3A C4
sta SpawnParameter ; $0428: 85 14
jsr $C486 ; $042A: 20 86 C4
jsr GetRandomValue ; $042D: 20 B3 F1
lsr a ; $0430: 4A
bcc SpawnRandomObject ; $0431: 90 D9
jsr ReflectObjectYVelocity ; $0433: 20 4F CA
jmp SpawnRandomObject ; $0436: 4C 0C C4
Label_C439:
rts ; $0439: 60
SpawnSelectorAdjustmentTable:
.byte $20, $30, $40, $60 ; $043A: 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 ; $043E: 20 B3 F1
and #$CF ; $0441: 29 CF
bne SpawnAtRandomPosition ; $0443: D0 B2
ldy $89 ; $0445: A4 89
iny ; $0447: C8
bne SpawnAtRandomPosition ; $0448: D0 AD
lda #$E6 ; $044A: A9 E6
sta $9B ; $044C: 85 9B
lda RandomState ; $044E: A5 1B
and #$7F ; $0450: 29 7F
adc #$40 ; $0452: 69 40
sta $92 ; $0454: 85 92
lda #$80 ; $0456: A9 80
sta $89 ; $0458: 85 89
lda #$00 ; $045A: A9 00
sta $80 ; $045C: 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 ; $045E: 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 ; $045F: 20 0C C4
jsr GetRandomValue ; $0462: 20 B3 F1
and #$7F ; $0465: 29 7F
sta $0508,x ; $0467: 9D 08 05
rts ; $046A: 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 ; $046B: A2 07
@FindFreeSlot:
lda EffectObjectState,x ; $046D: BD 5D 05
bmi @InitializeSlot ; $0470: 30 04
dex ; $0472: CA
bpl @FindFreeSlot ; $0473: 10 F8
rts ; $0475: 60
@InitializeSlot:
lda #$01 ; $0476: A9 01
sta EffectObjectState,x ; $0478: 9D 5D 05
lda #$00 ; $047B: A9 00
sta EffectObjectPosX,x ; $047D: 9D 67 05
lda SpawnPixelPosition ; $0480: A5 15
sta EffectObjectPosY,x ; $0482: 9D 7B 05
rts ; $0485: 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 ; $0486: A2 13
@FindFreeSlot:
lda GameplayObjectState,x ; $0488: BD 30 05
bmi @InitializeSlot ; $048B: 30 04
dex ; $048D: CA
bpl @FindFreeSlot ; $048E: 10 F8
rts ; $0490: 60
@InitializeSlot:
lda #$00 ; $0491: A9 00
sta GameplayObjectState,x ; $0493: 9D 30 05
sta GameplayObjectPosX,x ; $0496: 9D 90 04
sta GameplayObjectVelocityX,x ; $0499: 9D F4 04
sta GameplayObjectParameter,x ; $049C: 9D 08 05
sta GameplayObjectVelocityY,x ; $049F: 9D E0 04
lda SpawnParameter ; $04A2: A5 14
sta GameplayObjectPosXHi,x ; $04A4: 9D 1C 05
lda SpawnPixelPosition ; $04A7: A5 15
sta GameplayObjectPosY,x ; $04A9: 9D A4 04
rts ; $04AC: 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; $04AD: 00 00 09 00 08 8C 00 07
.byte $18, $00, $18, $00, $19, $00, $1A, $00; $04B5: 18 00 18 00 19 00 1A 00
.byte $84, $94, $1A, $00, $1A, $00, $1A, $00; $04BD: 84 94 1A 00 1A 00 1A 00
.byte $0B, $12, $00, $0C, $13, $00, $0D, $14; $04C5: 0B 12 00 0C 13 00 0D 14
.byte $00, $14, $00, $00, $90, $00, $07, $00; $04CD: 00 14 00 00 90 00 07 00
.byte $07, $8C, $96, $00, $08, $00, $09, $00; $04D5: 07 8C 96 00 08 00 09 00
.byte $00, $18, $00, $17, $00, $16, $00, $00; $04DD: 00 18 00 17 00 16 00 00
.byte $00, $00, $00, $00, $8A, $90, $00, $00; $04E5: 00 00 00 00 8A 90 00 00
.byte $00, $08, $00, $09, $98, $00, $0A, $00; $04ED: 00 08 00 09 98 00 0A 00
.byte $00, $00, $86, $8A, $15, $00, $14, $00; $04F5: 00 00 86 8A 15 00 14 00
.byte $8E, $13, $00, $00, $03, $0D, $00, $0D; $04FD: 8E 13 00 00 03 0D 00 0D
.byte $0E, $00, $0C, $0D, $00, $0D, $19, $00; $0505: 0E 00 0C 0D 00 0D 19 00
.byte $86, $92, $00, $00, $98, $00, $00, $0A; $050D: 86 92 00 00 98 00 00 0A
.byte $12, $00, $09, $13, $00, $08, $14, $00; $0515: 12 00 09 13 00 08 14 00
.byte $07, $15, $00, $07, $16, $00, $07, $00; $051D: 07 15 00 07 16 00 07 00
.byte $00, $00 ; $0525: 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 ; $0527: 20 E2 D0
asl RoundSeedValue ; $052A: 0E 59 05
lda RoundSeedValue ; $052D: AD 59 05
asl a ; $0530: 0A
asl a ; $0531: 0A
adc RoundSeedValue ; $0532: 6D 59 05
sta RoundSeedValue ; $0535: 8D 59 05
rts ; $0538: 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 ; $0539: A9 00
sta RecordIndex ; $053B: 85 12
Label_C53D:
lda RecordIndex ; $053D: A5 12
asl a ; $053F: 0A
asl a ; $0540: 0A
adc RecordIndex ; $0541: 65 12
sta RecordPtrLo ; $0543: 85 1D
lda #$07 ; $0545: A9 07
sta RecordPtrHi ; $0547: 85 1E
ldy #$04 ; $0549: A0 04
Label_C54B:
lda (RecordPtrLo),y ; $054B: B1 1D
cmp CurrentRecord,y ; $054D: D9 03 00
bcc Label_C563 ; $0550: 90 11
bne Label_C559 ; $0552: D0 05
dey ; $0554: 88
bpl Label_C54B ; $0555: 10 F4
bmi Label_C563 ; $0557: 30 0A
Label_C559:
inc RecordIndex ; $0559: E6 12
lda RecordIndex ; $055B: A5 12
cmp #$32 ; $055D: C9 32
bne Label_C53D ; $055F: D0 DC
dec RecordIndex ; $0561: C6 12
Label_C563:
inc RecordIndex ; $0563: E6 12
lda RecordIndex ; $0565: A5 12
pha ; $0567: 48
sta SelectedRecordIndex ; $0568: 85 43
ldy #$0A ; $056A: A0 0A
jsr DivideOrScaleRecordValue ; $056C: 20 7C D7
sta ScaledRecordValue ; $056F: 85 4A
lda SelectedRecordIndex ; $0571: A5 43
sta SelectedRecordIndexCopy ; $0573: 85 49
pla ; $0575: 68
sta RecordIndex ; $0576: 85 12
rts ; $0578: 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 ; $0579: 20 39 C5
dec RecordIndex ; $057C: C6 12
lda #$31 ; $057E: A9 31
sec ; $0580: 38
sbc RecordIndex ; $0581: E5 12
sta ReverseRecordIndex ; $0583: 85 13
asl a ; $0585: 0A
asl a ; $0586: 0A
adc ReverseRecordIndex ; $0587: 65 13
tay ; $0589: A8
lda RecordIndex ; $058A: A5 12
asl a ; $058C: 0A
asl a ; $058D: 0A
adc RecordIndex ; $058E: 65 12
sta RecordPtrLo ; $0590: 85 1D
clc ; $0592: 18
adc #$05 ; $0593: 69 05
sta DestinationPtrLo ; $0595: 85 1F
lda #$07 ; $0597: A9 07
sta RecordPtrHi ; $0599: 85 1E
sta DestinationPtrHi ; $059B: 85 20
tya ; $059D: 98
beq Label_C5AC ; $059E: F0 0C
dey ; $05A0: 88
Label_C5A1:
lda (RecordPtrLo),y ; $05A1: B1 1D
sta (DestinationPtrLo),y ; $05A3: 91 1F
dey ; $05A5: 88
bne Label_C5A1 ; $05A6: D0 F9
lda (RecordPtrLo),y ; $05A8: B1 1D
sta (DestinationPtrLo),y ; $05AA: 91 1F
Label_C5AC:
ldy #$04 ; $05AC: A0 04
Label_C5AE:
lda CurrentRecord,y ; $05AE: B9 03 00
sta (RecordPtrLo),y ; $05B1: 91 1D
dey ; $05B3: 88
bpl Label_C5AE ; $05B4: 10 F8
rts ; $05B6: 60
; Carrier display-selection tables
;===============================================================================
NormalDisplayModeTable:
.byte $01, $02, $03, $03 ; $05B7: 01 02 03 03
AlternateDisplayModeTable:
.byte $02, $01, $FF, $03, $04, $05, $06, $FF ; $05BB: 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 ; $05C3: AD 8D 04
lsr a ; $05C6: 4A
lsr a ; $05C7: 4A
lsr a ; $05C8: 4A
tax ; $05C9: AA
lda CarrierMode ; $05CA: AD 8A 04
bne Label_C5D5 ; $05CD: D0 06
lda NormalDisplayModeTable,x ; $05CF: BD B7 C5
jmp Label_C5D8 ; $05D2: 4C D8 C5
Label_C5D5:
lda AlternateDisplayModeTable,x ; $05D5: BD BB C5
Label_C5D8:
sta CarrierDisplayMode ; $05D8: 85 87
ldx #$08 ; $05DA: A2 08
jsr BuildObjectMetasprite ; $05DC: 20 A4 E3
lda CarrierDropPending ; $05DF: AD 8C 04
beq Label_C613 ; $05E2: F0 2F
ldx CarrierTargetPlayer ; $05E4: AE 8B 04
lda CarrierSequenceTimer ; $05E7: AD 8D 04
cmp #$20 ; $05EA: C9 20
bne Label_C5F4 ; $05EC: D0 06
lda #$FF ; $05EE: A9 FF
sta PlayerSlotState,x ; $05F0: 95 88
bmi Label_C610 ; $05F2: 30 1C
Label_C5F4:
bcs Label_C613 ; $05F4: B0 1D
lda CarrierSavedValue ; $05F6: AD 50 04
bne Label_C602 ; $05F9: D0 07
lda CarrierTargetX ; $05FB: A5 99
clc ; $05FD: 18
adc #$04 ; $05FE: 69 04
bne Label_C607 ; $0600: D0 05
Label_C602:
lda CarrierTargetX ; $0602: A5 99
sec ; $0604: 38
sbc #$04 ; $0605: E9 04
Label_C607:
sta PlayerPosX,x ; $0607: 95 91
lda CarrierPosY ; $0609: A5 A2
sec ; $060B: 38
sbc #$0A ; $060C: E9 0A
sta PlayerPosY,x ; $060E: 95 9A
Label_C610:
jsr BuildObjectMetasprite ; $0610: 20 A4 E3
Label_C613:
rts ; $0613: 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 ; $0614: A9 FF
sta CarrierTargetPlayer ; $0616: 8D 8B 04
ldx #$07 ; $0619: A2 07
Label_C61B:
lda PlayerSlotState,x ; $061B: B5 88
bmi Label_C62B ; $061D: 30 0C
lda PlayerPosY,x ; $061F: B5 9A
cmp #$B4 ; $0621: C9 B4
bcc Label_C62B ; $0623: 90 06
lda PlayerPosX,x ; $0625: B5 91
cmp CarrierTargetX ; $0627: C5 99
beq Label_C62F ; $0629: F0 04
Label_C62B:
dex ; $062B: CA
bpl Label_C61B ; $062C: 10 ED
rts ; $062E: 60
Label_C62F:
stx CarrierTargetPlayer ; $062F: 8E 8B 04
lda PlayerVariantTable,x ; $0632: BD 48 04
sta CarrierSavedValue ; $0635: 8D 50 04
lda #$00 ; $0638: A9 00
sta CarrierMode ; $063A: 8D 8A 04
sta CarrierSequenceTimer ; $063D: 8D 8D 04
sta CarrierDropPending ; $0640: 8D 8C 04
sta CarrierSequenceActive ; $0643: 8D 89 04
lda #$DC ; $0646: A9 DC
sta CarrierPosY ; $0648: 85 A2
rts ; $064A: 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 ; $064B: E6 99
lda CarrierTargetX ; $064D: A5 99
cmp #$B1 ; $064F: C9 B1
bcc Label_C657 ; $0651: 90 04
lda #$40 ; $0653: A9 40
sta CarrierTargetX ; $0655: 85 99
Label_C657:
rts ; $0657: 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 ; $0658: AD 89 04
bne Label_C66F ; $065B: D0 12
dec CarrierPosY ; $065D: C6 A2
lda CarrierPosY ; $065F: A5 A2
cmp #$C4 ; $0661: C9 C4
bcs Label_C671 ; $0663: B0 0C
inc CarrierPosY ; $0665: E6 A2
inc CarrierMode ; $0667: EE 8A 04
inc CarrierSequenceActive ; $066A: EE 89 04
bne Label_C671 ; $066D: D0 02
Label_C66F:
inc CarrierPosY ; $066F: E6 A2
Label_C671:
inc CarrierSequenceTimer ; $0671: EE 8D 04
lda CarrierSequenceTimer ; $0674: AD 8D 04
cmp #$18 ; $0677: C9 18
bne Label_C6A3 ; $0679: D0 28
ldx CarrierTargetPlayer ; $067B: AE 8B 04
lda PlayerSlotState,x ; $067E: B5 88
bmi Label_C6A3 ; $0680: 30 21
lda PlayerPosY,x ; $0682: B5 9A
clc ; $0684: 18
adc #$10 ; $0685: 69 10
cmp CarrierPosY ; $0687: C5 A2
bcc Label_C6A3 ; $0689: 90 18
ldy PlayerAnimationState,x ; $068B: BC 51 04
lda CarrierAnimationSequenceTable,y ; $068E: B9 B8 C6
sta PlayerAnimationState,x ; $0691: 9D 51 04
lda #$00 ; $0694: A9 00
sta PlayerLifecycleState,x ; $0696: 95 7F
sta PlayerSlotState,x ; $0698: 95 88
lda SoundRequestFlags2 ; $069A: A5 F2
ora #$40 ; $069C: 09 40
sta SoundRequestFlags2 ; $069E: 85 F2
inc CarrierDropPending ; $06A0: EE 8C 04
Label_C6A3:
lda CarrierMode ; $06A3: AD 8A 04
beq Label_C6B7 ; $06A6: F0 0F
lda CarrierSequenceTimer ; $06A8: AD 8D 04
cmp #$28 ; $06AB: C9 28
beq Label_C6B3 ; $06AD: F0 04
cmp #$30 ; $06AF: C9 30
bne Label_C6B7 ; $06B1: D0 04
Label_C6B3:
lda #$CC ; $06B3: A9 CC
sta CarrierPosY ; $06B5: 85 A2
Label_C6B7:
rts ; $06B7: 60
; Carrier animation remap table
; Maps player animation states to the carrier-sequence animation states.
;===============================================================================
CarrierAnimationSequenceTable:
.byte $08, $09, $0A, $0B ; $06B8: 08 09 0A 0B
.byte $08, $09, $0A, $0B ; $06BC: 08 09 0A 0B
.byte $08, $09, $0A, $0B ; $06C0: 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 ; $06C4: AD 89 04
bne Label_C6F8 ; $06C7: D0 2F
ldx CarrierTargetPlayer ; $06C9: AE 8B 04
lda PlayerSlotState,x ; $06CC: B5 88
bmi Label_C6E0 ; $06CE: 30 10
lda PlayerPosY,x ; $06D0: B5 9A
cmp #$B4 ; $06D2: C9 B4
bcc Label_C6E0 ; $06D4: 90 0A
lda PlayerPosX,x ; $06D6: B5 91
cmp #$40 ; $06D8: C9 40
bcc Label_C6E0 ; $06DA: 90 04
cmp #$B1 ; $06DC: C9 B1
bcc Label_C6EE ; $06DE: 90 0E
Label_C6E0:
lda #$30 ; $06E0: A9 30
sec ; $06E2: 38
sbc CarrierSequenceTimer ; $06E3: ED 8D 04
sta CarrierSequenceTimer ; $06E6: 8D 8D 04
inc CarrierSequenceActive ; $06E9: EE 89 04
bne Label_C6F8 ; $06EC: D0 0A
Label_C6EE:
lda PlayerPosX,x ; $06EE: B5 91
sta $99 ; $06F0: 85 99
lda $0448,x ; $06F2: BD 48 04
sta $0450 ; $06F5: 8D 50 04
Label_C6F8:
rts ; $06F8: 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 ; $06F9: A5 87
bpl Label_C70D ; $06FB: 10 10
jsr AdvanceCarrierTargetX ; $06FD: 20 4B C6
jsr FindEligiblePlayerForCarrier ; $0700: 20 14 C6
lda CarrierTargetPlayer ; $0703: AD 8B 04
bpl Label_C709 ; $0706: 10 01
rts ; $0708: 60
Label_C709:
lda #$40 ; $0709: A9 40
sta SoundRequestFlags3 ; $070B: 85 F3
Label_C70D:
jsr BeginCarrierTargetSequence ; $070D: 20 C4 C6
jsr UpdateCarrierArrivalSequence ; $0710: 20 58 C6
jmp UpdateCarrierObjectDisplay ; $0713: 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 ; $0716: A2 01
Label_C718:
lda #$FF ; $0718: A9 FF
sta GameplayObjectState,x ; $071A: 9D 30 05
sta GameplayObjectAuxState,x ; $071D: 9D 44 05
dex ; $0720: CA
bpl Label_C718 ; $0721: 10 F5
jsr SpawnRoundObjects ; $0723: 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 ; $0726: A6 3C
cpx #$18 ; $0728: E0 18
bcc Label_C72E ; $072A: 90 02
ldx #$18 ; $072C: A2 18
Label_C72E:
lda RoundObjectCountTable,x ; $072E: BD 48 C7
sta SpawnSelector ; $0731: 85 BA
lda RoundDelayTable,x ; $0733: BD 61 C7
sta RoundSpawnDelay ; $0736: 85 B8
lda #$F0 ; $0738: A9 F0
sta OamEntryE0Y ; $073A: 8D E0 02
sta OamEntryE4Y ; $073D: 8D E4 02
sta OamEntryE8Y ; $0740: 8D E8 02
lda #$03 ; $0743: A9 03
jmp ConfigureRoundPresentation ; $0745: 4C 56 C8
; Round spawn lookup tables
;===============================================================================
RoundObjectCountTable:
.byte $00, $00, $00, $00, $00, $00, $00, $00 ; $0748: 00 00 00 00 00 00 00 00
.byte $00, $00, $01, $01, $01, $01, $01, $01 ; $0750: 00 00 01 01 01 01 01 01
.byte $02, $01, $01, $01, $01, $01, $01, $01 ; $0758: 02 01 01 01 01 01 01 01
.byte $01 ; $0760: 01
RoundDelayTable:
.byte $0F, $0F, $0C, $0C, $0C, $0C, $0A, $0A ; $0761: 0F 0F 0C 0C 0C 0C 0A 0A
.byte $0A, $0A, $0C, $0C, $0A, $0A, $0A, $08 ; $0769: 0A 0A 0C 0C 0A 0A 0A 08
.byte $0A, $0A, $08, $08, $08, $08, $08, $08 ; $0771: 0A 0A 08 08 08 08 08 08
.byte $05 ; $0779: 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 ; $077A: A5 A3
bpl Label_C781 ; $077C: 10 03
Label_C77E:
sta SelectedSpawnIndex ; $077E: 85 A4
rts ; $0780: 60
Label_C781:
jsr GetRandomValue ; $0781: 20 B3 F1
Label_C784:
cmp RoundSpawnRandomLimit ; $0784: C5 A3
bcc Label_C77E ; $0786: 90 F6
beq Label_C77E ; $0788: F0 F4
clc ; $078A: 18
sbc RoundSpawnRandomLimit ; $078B: E5 A3
jmp Label_C784 ; $078D: 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 ; $0790: A5 19
and #$7F ; $0792: 29 7F
beq Label_C797 ; $0794: F0 01
Label_C796:
rts ; $0796: 60
Label_C797:
dec RoundSpawnDelay ; $0797: C6 B8
bne Label_C796 ; $0799: D0 FB
ldx #$00 ; $079B: A2 00
lda GameplayObjectState,x ; $079D: BD 30 05
bmi Label_C7AD ; $07A0: 30 0B
inx ; $07A2: E8
lda GameplayObjectState,x ; $07A3: BD 30 05
bmi Label_C7AD ; $07A6: 30 05
lda #$01 ; $07A8: A9 01
sta RoundSpawnDelay ; $07AA: 85 B8
rts ; $07AC: 60
Label_C7AD:
ldy SelectedSpawnIndex ; $07AD: A4 A4
sty SelectedSpawnIndexCopy ; $07AF: 84 A5
bpl Label_C7B4 ; $07B1: 10 01
rts ; $07B3: 60
Label_C7B4:
lda #$80 ; $07B4: A9 80
sta GameplayObjectVelocityFracY,x ; $07B6: 9D B8 04
sta GameplayObjectVelocityIntY,x ; $07B9: 9D CC 04
lda #$00 ; $07BC: A9 00
sta GameplayObjectState,x ; $07BE: 9D 30 05
lda $00B2,y ; $07C1: B9 B2 00
sta GameplayObjectPosX,x ; $07C4: 9D 90 04
lda $00B5,y ; $07C7: B9 B5 00
sta GameplayObjectPosY,x ; $07CA: 9D A4 04
ldy SpawnSelector ; $07CD: A4 BA
jsr GetRandomValue ; $07CF: 20 B3 F1
and #$1F ; $07D2: 29 1F
adc SpawnParameterTable,y ; $07D4: 79 9F C8
sta GameplayObjectParameter,x ; $07D7: 9D 08 05
lda SpawnPositionHiTable,y ; $07DA: B9 AB C8
sta GameplayObjectPosXHi,x ; $07DD: 9D 1C 05
lda SpawnVelocityYTable,y ; $07E0: B9 A5 C8
sta GameplayObjectVelocityY,x ; $07E3: 9D E0 04
lda SpawnVelocityXTable,y ; $07E6: B9 B1 C8
sta GameplayObjectVelocityX,x ; $07E9: 9D F4 04
jsr GetRandomValue ; $07EC: 20 B3 F1
and #$03 ; $07EF: 29 03
sta GameplayObjectAuxState,x ; $07F1: 9D 44 05
tay ; $07F4: A8
lda SpawnXOffsetTable,y ; $07F5: B9 97 C8
clc ; $07F8: 18
adc GameplayObjectPosX,x ; $07F9: 7D 90 04
sta GameplayObjectPosX,x ; $07FC: 9D 90 04
lda SpawnYOffsetTable,y ; $07FF: B9 9B C8
clc ; $0802: 18
adc GameplayObjectPosY,x ; $0803: 7D A4 04
sta GameplayObjectPosY,x ; $0806: 9D A4 04
lda SpawnFlipYTable,y ; $0809: B9 8F C8
beq Label_C811 ; $080C: F0 03
jsr NegateGameplayObjectVelocityY ; $080E: 20 3D CA
Label_C811:
lda SpawnFlipXTable,y ; $0811: B9 93 C8
beq Label_C819 ; $0814: F0 03
jsr NegateGameplayObjectVelocityX ; $0816: 20 55 CA
Label_C819:
lda SpawnSelector ; $0819: A5 BA
cmp #$05 ; $081B: C9 05
bcs Label_C821 ; $081D: B0 02
inc SpawnSelector ; $081F: E6 BA
Label_C821:
lda #$06 ; $0821: A9 06
sec ; $0823: 38
sbc SpawnSelector ; $0824: E5 BA
sta RoundSpawnDelay ; $0826: 85 B8
lda SoundRequestFlags0 ; $0828: A5 F0
ora #$04 ; $082A: 09 04
sta SoundRequestFlags0 ; $082C: 85 F0
jmp ChooseRoundSpawnIndex ; $082E: 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 ; $0831: A5 B8
cmp #$01 ; $0833: C9 01
bne Label_C88A ; $0835: D0 53
lda GameplayObjectState ; $0837: AD 30 05
bmi Label_C846 ; $083A: 30 0A
lda $0531 ; $083C: AD 31 05
bmi Label_C846 ; $083F: 30 05
lda #$02 ; $0841: A9 02
sta RoundSpawnDelay ; $0843: 85 B8
rts ; $0845: 60
Label_C846:
lda FrameCounter ; $0846: A5 19
and #$7F ; $0848: 29 7F
cmp #$40 ; $084A: C9 40
bcc Label_C88A ; $084C: 90 3C
bne ConfigureRoundPresentation ; $084E: D0 06
lda SoundRequestFlags1 ; $0850: A5 F1
ora #$08 ; $0852: 09 08
sta SoundRequestFlags1 ; $0854: 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 ; $0856: 29 03
tax ; $0858: AA
lda RoundHudTileTable,x ; $0859: BD 8B C8
sta RoundHudTile ; $085C: 85 5A
ldx SelectedSpawnIndex ; $085E: A6 A4
bmi Label_C88A ; $0860: 30 28
lda #$23 ; $0862: A9 23
sta RoundHudCommandAddressHi ; $0864: 85 57
lda $A6,x ; $0866: B5 A6
sta RoundHudCommandAddressLo ; $0868: 85 58
lda #$01 ; $086A: A9 01
sta RoundHudCommandLength ; $086C: 85 59
jsr AppendRoundHudValue ; $086E: 20 83 C8
lda $A9,x ; $0871: B5 A9
sta RoundHudCommandAddressLo ; $0873: 85 58
jsr AppendRoundHudValue ; $0875: 20 83 C8
lda $AC,x ; $0878: B5 AC
sta RoundHudCommandAddressLo ; $087A: 85 58
jsr AppendRoundHudValue ; $087C: 20 83 C8
lda $AF,x ; $087F: B5 AF
sta RoundHudCommandAddressLo ; $0881: 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 ; $0883: A9 57
ldy #$00 ; $0885: A0 00
jmp AppendBytesToPpuBuffer ; $0887: 4C 31 C1
Label_C88A:
rts ; $088A: 60
; Round spawner and sprite lookup tables
;===============================================================================
RoundHudTileTable:
.byte $55, $FF, $00, $FF ; $088B: 55 FF 00 FF
SpawnFlipYTable:
.byte $00, $00, $FF, $FF ; $088F: 00 00 FF FF
SpawnFlipXTable:
.byte $FF, $00, $00, $FF ; $0893: FF 00 00 FF
SpawnXOffsetTable:
.byte $10, $10, $F0, $F0 ; $0897: 10 10 F0 F0
SpawnYOffsetTable:
.byte $DE, $22, $22, $DE ; $089B: DE 22 22 DE
SpawnParameterTable:
.byte $60, $70, $80, $90, $A0, $B0 ; $089F: 60 70 80 90 A0 B0
SpawnVelocityYTable:
.byte $00, $00, $00, $00, $00, $00 ; $08A5: 00 00 00 00 00 00
SpawnPositionHiTable:
.byte $C0, $F0, $20, $50, $80, $B0 ; $08AB: C0 F0 20 50 80 B0
SpawnVelocityXTable:
.byte $00, $00, $01, $01, $01, $01 ; $08B1: 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 ; $08B7: A2 01
Label_C8B9:
lda GameplayObjectState,x ; $08B9: BD 30 05
bpl Label_C8C1 ; $08BC: 10 03
jmp Label_C9AF ; $08BE: 4C AF C9
Label_C8C1:
lda GameplayObjectAuxState,x ; $08C1: BD 44 05
bmi Label_C941 ; $08C4: 30 7B
tay ; $08C6: A8
txa ; $08C7: 8A
pha ; $08C8: 48
ldx SelectedSpawnIndexCopy ; $08C9: A6 A5
lda RoundSpawnBaseX,x ; $08CB: B5 B2
adc RoundObjectXOffsetTable,y ; $08CD: 79 E5 C9
sta $02E3 ; $08D0: 8D E3 02
sta $02E7 ; $08D3: 8D E7 02
sta $02EB ; $08D6: 8D EB 02
lda RoundSpawnBaseY,x ; $08D9: B5 B5
adc RoundObjectYOffsetTable,y ; $08DB: 79 F5 C9
sta $02E0 ; $08DE: 8D E0 02
adc RoundObjectVerticalSpacingTable,y ; $08E1: 79 05 CA
sta $02E4 ; $08E4: 8D E4 02
adc RoundObjectVerticalSpacingTable,y ; $08E7: 79 05 CA
sta $02E8 ; $08EA: 8D E8 02
tya ; $08ED: 98
and #$03 ; $08EE: 29 03
tax ; $08F0: AA
tya ; $08F1: 98
lsr a ; $08F2: 4A
lsr a ; $08F3: 4A
tay ; $08F4: A8
lda FrameCounter ; $08F5: A5 19
lsr a ; $08F7: 4A
lsr a ; $08F8: 4A
bcs Label_C8FF ; $08F9: B0 04
tya ; $08FB: 98
adc #$05 ; $08FC: 69 05
tay ; $08FE: A8
Label_C8FF:
lda RoundObjectTileTopTable,y ; $08FF: B9 15 CA
sta $02E1 ; $0902: 8D E1 02
lda RoundObjectTileMiddleTable,y ; $0905: B9 1F CA
sta $02E5 ; $0908: 8D E5 02
lda RoundObjectTileBottomTable,y ; $090B: B9 29 CA
sta $02E9 ; $090E: 8D E9 02
lda RoundObjectAttributeTable,x ; $0911: BD 33 CA
sta $02E2 ; $0914: 8D E2 02
sta $02E6 ; $0917: 8D E6 02
sta $02EA ; $091A: 8D EA 02
pla ; $091D: 68
tax ; $091E: AA
lda FrameCounter ; $091F: A5 19
and #$07 ; $0921: 29 07
bne Label_C937 ; $0923: D0 12
lda GameplayObjectAuxState,x ; $0925: BD 44 05
clc ; $0928: 18
adc #$04 ; $0929: 69 04
sta GameplayObjectAuxState,x ; $092B: 9D 44 05
cmp #$14 ; $092E: C9 14
bcc Label_C937 ; $0930: 90 05
lda #$FF ; $0932: A9 FF
sta GameplayObjectAuxState,x ; $0934: 9D 44 05
Label_C937:
lda GameplayObjectAuxState,x ; $0937: BD 44 05
cmp #$10 ; $093A: C9 10
bcs Label_C941 ; $093C: B0 03
jmp Label_C9AF ; $093E: 4C AF C9
Label_C941:
jsr IntegrateGameplayObjectPosition ; $0941: 20 B6 C9
lda GameplayObjectPosX,x ; $0944: BD 90 04
cmp #$02 ; $0947: C9 02
bcs Label_C94E ; $0949: B0 03
jsr BounceGameplayObjectY ; $094B: 20 37 CA
Label_C94E:
lda GameplayObjectPosX,x ; $094E: BD 90 04
cmp #$F7 ; $0951: C9 F7
bcc Label_C958 ; $0953: 90 03
jsr BounceGameplayObjectY ; $0955: 20 37 CA
Label_C958:
lda GameplayObjectPosY,x ; $0958: BD A4 04
cmp #$02 ; $095B: C9 02
bcs Label_C962 ; $095D: B0 03
jsr BounceGameplayObjectX ; $095F: 20 4F CA
Label_C962:
lda GameplayObjectPosY,x ; $0962: BD A4 04
cmp #$E0 ; $0965: C9 E0
bcc Label_C976 ; $0967: 90 0D
lda #$FF ; $0969: A9 FF
sta GameplayObjectState,x ; $096B: 9D 30 05
lda #$F0 ; $096E: A9 F0
sta GameplayObjectPosY,x ; $0970: 9D A4 04
jmp Label_C9AF ; $0973: 4C AF C9
Label_C976:
jsr TestGameplayObjectAgainstBounds ; $0976: 20 67 CA
jsr ResolveGameplayObjectInteraction ; $0979: 20 1C CB
ldy GameplayObjectState,x ; $097C: BC 30 05
iny ; $097F: C8
tya ; $0980: 98
and #$07 ; $0981: 29 07
sta GameplayObjectState,x ; $0983: 9D 30 05
ldy GameplayObjectState,x ; $0986: BC 30 05
lda RoundObjectTileTable,y ; $0989: B9 DD C9
sta CurrentRoundObjectTile ; $098C: 85 12
txa ; $098E: 8A
asl a ; $098F: 0A
asl a ; $0990: 0A
clc ; $0991: 18
tay ; $0992: A8
lda GameplayObjectPosY,x ; $0993: BD A4 04
cmp #$D0 ; $0996: C9 D0
sta OamBuffer,y ; $0998: 99 00 02
lda GameplayObjectPosX,x ; $099B: BD 90 04
sta $0203,y ; $099E: 99 03 02
lda CurrentRoundObjectTile ; $09A1: A5 12
sta $0201,y ; $09A3: 99 01 02
lda #$00 ; $09A6: A9 00
bcc Label_C9AC ; $09A8: 90 02
lda #$20 ; $09AA: A9 20
Label_C9AC:
sta $0202,y ; $09AC: 99 02 02
Label_C9AF:
dex ; $09AF: CA
bmi Label_C9B5 ; $09B0: 30 03
jmp Label_C8B9 ; $09B2: 4C B9 C8
Label_C9B5:
rts ; $09B5: 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 ; $09B6: BD 08 05
clc ; $09B9: 18
adc GameplayObjectVelocityFracY,x ; $09BA: 7D B8 04
sta GameplayObjectVelocityFracY,x ; $09BD: 9D B8 04
lda GameplayObjectVelocityY,x ; $09C0: BD E0 04
adc GameplayObjectPosX,x ; $09C3: 7D 90 04
sta GameplayObjectPosX,x ; $09C6: 9D 90 04
lda GameplayObjectPosXHi,x ; $09C9: BD 1C 05
clc ; $09CC: 18
adc GameplayObjectVelocityIntY,x ; $09CD: 7D CC 04
sta GameplayObjectVelocityIntY,x ; $09D0: 9D CC 04
lda GameplayObjectVelocityX,x ; $09D3: BD F4 04
adc GameplayObjectPosY,x ; $09D6: 7D A4 04
sta GameplayObjectPosY,x ; $09D9: 9D A4 04
rts ; $09DC: 60
; Round-object sprite tables
;===============================================================================
RoundObjectTileTable:
.byte $9D, $9E, $9F, $9E, $9D, $A0, $A1, $A0 ; $09DD: 9D 9E 9F 9E 9D A0 A1 A0
RoundObjectXOffsetTable:
.byte $08, $08, $F0, $F0, $08, $08, $F0, $F0 ; $09E5: 08 08 F0 F0 08 08 F0 F0
.byte $08, $08, $F0, $F0, $08, $08, $F0, $F0 ; $09ED: 08 08 F0 F0 08 08 F0 F0
RoundObjectYOffsetTable:
.byte $EE, $0A, $0A, $EE, $EE, $0A, $0A, $EE ; $09F5: EE 0A 0A EE EE 0A 0A EE
.byte $EE, $0A, $0A, $EE, $EE, $0A, $0A, $EE ; $09FD: EE 0A 0A EE EE 0A 0A EE
RoundObjectVerticalSpacingTable:
.byte $F8, $08, $08, $F8, $F8, $08, $08, $F8 ; $0A05: F8 08 08 F8 F8 08 08 F8
.byte $F8, $08, $08, $F8, $F8, $08, $08, $F8 ; $0A0D: F8 08 08 F8 F8 08 08 F8
RoundObjectTileTopTable:
.byte $91, $93, $97, $97, $FC, $92, $95, $9A ; $0A15: 91 93 97 97 FC 92 95 9A
.byte $9A, $FC ; $0A1D: 9A FC
RoundObjectTileMiddleTable:
.byte $FC, $94, $98, $98, $FC, $FC, $96, $9B ; $0A1F: FC 94 98 98 FC FC 96 9B
.byte $9B, $FC ; $0A27: 9B FC
RoundObjectTileBottomTable:
.byte $FC, $FC, $99, $99, $FC, $FC, $FC, $9C ; $0A29: FC FC 99 99 FC FC FC 9C
.byte $9C, $FC ; $0A31: 9C FC
RoundObjectAttributeTable:
.byte $C0, $40, $00, $80 ; $0A33: 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 ; $0A37: A5 F3
ora #$80 ; $0A39: 09 80
sta SoundRequestFlags3 ; $0A3B: 85 F3
NegateGameplayObjectVelocityY:
lda #$00 ; $0A3D: A9 00
sec ; $0A3F: 38
sbc GameplayObjectParameter,x ; $0A40: FD 08 05
sta GameplayObjectParameter,x ; $0A43: 9D 08 05
lda #$00 ; $0A46: A9 00
sbc GameplayObjectVelocityY,x ; $0A48: FD E0 04
sta GameplayObjectVelocityY,x ; $0A4B: 9D E0 04
rts ; $0A4E: 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 ; $0A4F: A5 F3
ora #$80 ; $0A51: 09 80
sta SoundRequestFlags3 ; $0A53: 85 F3
NegateGameplayObjectVelocityX:
lda #$00 ; $0A55: A9 00
sec ; $0A57: 38
sbc GameplayObjectPosXHi,x ; $0A58: FD 1C 05
sta GameplayObjectPosXHi,x ; $0A5B: 9D 1C 05
lda #$00 ; $0A5E: A9 00
sbc GameplayObjectVelocityX,x ; $0A60: FD F4 04
sta GameplayObjectVelocityX,x ; $0A63: 9D F4 04
rts ; $0A66: 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 ; $0A67: A4 CD
Label_CA69:
lda #$00 ; $0A69: A9 00
sta GameplayObjectCollisionFlags ; $0A6B: 85 CC
lda (BoundsTopPtrLo),y ; $0A6D: B1 27
sec ; $0A6F: 38
sbc #$08 ; $0A70: E9 08
cmp GameplayObjectPosY,x ; $0A72: DD A4 04
bcs Label_CADD ; $0A75: B0 66
adc #$03 ; $0A77: 69 03
cmp GameplayObjectPosY,x ; $0A79: DD A4 04
bcc Label_CA82 ; $0A7C: 90 04
lda #$01 ; $0A7E: A9 01
bne Label_CA92 ; $0A80: D0 10
Label_CA82:
lda (BoundsBottomPtrLo),y ; $0A82: B1 29
cmp GameplayObjectPosY,x ; $0A84: DD A4 04
bcc Label_CADD ; $0A87: 90 54
sbc #$03 ; $0A89: E9 03
cmp GameplayObjectPosY,x ; $0A8B: DD A4 04
bcs Label_CAAD ; $0A8E: B0 1D
lda #$02 ; $0A90: A9 02
Label_CA92:
sta GameplayObjectCollisionFlags ; $0A92: 85 CC
lda (BoundsLeftPtrLo),y ; $0A94: B1 23
cmp #$10 ; $0A96: C9 10
beq Label_CAA2 ; $0A98: F0 08
sec ; $0A9A: 38
sbc #$04 ; $0A9B: E9 04
cmp GameplayObjectPosX,x ; $0A9D: DD 90 04
bcs Label_CAA9 ; $0AA0: B0 07
Label_CAA2:
lda (BoundsRightPtrLo),y ; $0AA2: B1 25
cmp GameplayObjectPosX,x ; $0AA4: DD 90 04
bcs Label_CAAD ; $0AA7: B0 04
Label_CAA9:
lda #$00 ; $0AA9: A9 00
sta GameplayObjectCollisionFlags ; $0AAB: 85 CC
Label_CAAD:
lda (BoundsLeftPtrLo),y ; $0AAD: B1 23
cmp #$10 ; $0AAF: C9 10
beq Label_CAC8 ; $0AB1: F0 15
sec ; $0AB3: 38
sbc #$08 ; $0AB4: E9 08
cmp GameplayObjectPosX,x ; $0AB6: DD 90 04
bcs Label_CADD ; $0AB9: B0 22
adc #$03 ; $0ABB: 69 03
cmp GameplayObjectPosX,x ; $0ABD: DD 90 04
bcc Label_CAC8 ; $0AC0: 90 06
lda GameplayObjectCollisionFlags ; $0AC2: A5 CC
ora #$04 ; $0AC4: 09 04
bne Label_CADB ; $0AC6: D0 13
Label_CAC8:
lda (BoundsRightPtrLo),y ; $0AC8: B1 25
cmp #$FF ; $0ACA: C9 FF
beq Label_CADD ; $0ACC: F0 0F
cmp GameplayObjectPosX,x ; $0ACE: DD 90 04
bcc Label_CADD ; $0AD1: 90 0A
sbc #$03 ; $0AD3: E9 03
bcs Label_CADD ; $0AD5: B0 06
lda GameplayObjectCollisionFlags ; $0AD7: A5 CC
ora #$08 ; $0AD9: 09 08
Label_CADB:
sta GameplayObjectCollisionFlags ; $0ADB: 85 CC
Label_CADD:
lda GameplayObjectCollisionFlags ; $0ADD: A5 CC
bne Label_CAE8 ; $0ADF: D0 07
Label_CAE1:
dey ; $0AE1: 88
bmi Label_CAE7 ; $0AE2: 30 03
jmp Label_CA69 ; $0AE4: 4C 69 CA
Label_CAE7:
rts ; $0AE7: 60
Label_CAE8:
lsr GameplayObjectCollisionFlags ; $0AE8: 46 CC
bcc Label_CAF4 ; $0AEA: 90 08
lda GameplayObjectVelocityX,x ; $0AEC: BD F4 04
bmi Label_CAF4 ; $0AEF: 30 03
jsr BounceGameplayObjectX ; $0AF1: 20 4F CA
Label_CAF4:
lsr GameplayObjectCollisionFlags ; $0AF4: 46 CC
bcc Label_CB00 ; $0AF6: 90 08
lda GameplayObjectVelocityX,x ; $0AF8: BD F4 04
bpl Label_CB00 ; $0AFB: 10 03
jsr BounceGameplayObjectX ; $0AFD: 20 4F CA
Label_CB00:
lsr GameplayObjectCollisionFlags ; $0B00: 46 CC
bcc Label_CB0C ; $0B02: 90 08
lda GameplayObjectVelocityY,x ; $0B04: BD E0 04
bmi Label_CB0C ; $0B07: 30 03
jsr BounceGameplayObjectY ; $0B09: 20 37 CA
Label_CB0C:
lsr GameplayObjectCollisionFlags ; $0B0C: 46 CC
bcc Label_CB18 ; $0B0E: 90 08
lda GameplayObjectVelocityY,x ; $0B10: BD E0 04
bpl Label_CB18 ; $0B13: 10 03
jsr BounceGameplayObjectY ; $0B15: 20 37 CA
Label_CB18:
jmp Label_CAE1 ; $0B18: 4C E1 CA
; $0B1B: RTS terminating TestGameplayObjectAgainstBounds.
rts ; $0B1B: 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 ; $0B1C: A0 01
Label_CB1E:
lda $0088,y ; $0B1E: B9 88 00
bmi Label_CB70 ; $0B21: 30 4D
beq Label_CB70 ; $0B23: F0 4B
lda $00BD,y ; $0B25: B9 BD 00
bne Label_CB70 ; $0B28: D0 46
lda GameplayObjectPosX,x ; $0B2A: BD 90 04
sec ; $0B2D: 38
sbc $0091,y ; $0B2E: F9 91 00
jsr AbsoluteDifference ; $0B31: 20 8E F0
cmp #$08 ; $0B34: C9 08
bcs Label_CB70 ; $0B36: B0 38
lda GameplayObjectPosY,x ; $0B38: BD A4 04
sec ; $0B3B: 38
sbc $009A,y ; $0B3C: F9 9A 00
sec ; $0B3F: 38
sbc #$08 ; $0B40: E9 08
jsr AbsoluteDifference ; $0B42: 20 8E F0
cmp #$0C ; $0B45: C9 0C
bcs Label_CB70 ; $0B47: B0 27
lda #$00 ; $0B49: A9 00
sta $0088,y ; $0B4B: 99 88 00
lda #$01 ; $0B4E: A9 01
sta $007F,y ; $0B50: 99 7F 00
sta $00C1,y ; $0B53: 99 C1 00
lda #$0B ; $0B56: A9 0B
sta PlayerAnimationState,y ; $0B58: 99 51 04
lda #$20 ; $0B5B: A9 20
sta PlayerStateTimer,y ; $0B5D: 99 5A 04
lda SoundRequestFlags0 ; $0B60: A5 F0
ora #$80 ; $0B62: 09 80
sta SoundRequestFlags0 ; $0B64: 85 F0
lda #$F0 ; $0B66: A9 F0
sta GameplayObjectPosY,x ; $0B68: 9D A4 04
lda #$FF ; $0B6B: A9 FF
sta GameplayObjectState,x ; $0B6D: 9D 30 05
Label_CB70:
dey ; $0B70: 88
bpl Label_CB1E ; $0B71: 10 AB
rts ; $0B73: 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 ; $0B74: AE D1 05
bmi Label_CBA7 ; $0B77: 30 2E
Label_CB79:
jsr FindActiveBonusObject ; $0B79: 20 A8 CB
lda BonusObjectTimer,x ; $0B7C: BD 04 06
beq Label_CBA4 ; $0B7F: F0 23
txa ; $0B81: 8A
eor FrameCounter ; $0B82: 45 19
and #$01 ; $0B84: 29 01
bne Label_CBA4 ; $0B86: D0 1C
ldy BonusObjectPhase,x ; $0B88: BC FA 05
iny ; $0B8B: C8
tya ; $0B8C: 98
and #$03 ; $0B8D: 29 03
sta BonusObjectPhase,x ; $0B8F: 9D FA 05
jsr DrawBonusObjectHud ; $0B92: 20 CB CC
lda BonusObjectPhase,x ; $0B95: BD FA 05
cmp #$01 ; $0B98: C9 01
bne Label_CBA4 ; $0B9A: D0 08
dec BonusObjectPhaseTimer,x ; $0B9C: DE 0E 06
bne Label_CBA4 ; $0B9F: D0 03
dec BonusObjectTimer,x ; $0BA1: DE 04 06
Label_CBA4:
dex ; $0BA4: CA
bpl Label_CB79 ; $0BA5: 10 D2
Label_CBA7:
rts ; $0BA7: 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 ; $0BA8: A0 07
lda BonusObjectTimer,x ; $0BAA: BD 04 06
bne TestBonusObjectPlayerOverlap ; $0BAD: D0 03
jmp TestBonusObjectCollection ; $0BAF: 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 ; $0BB2: B9 88 00
bmi Label_CC2F ; $0BB5: 30 78
beq Label_CC2F ; $0BB7: F0 76
cpy #$02 ; $0BB9: C0 02
bcc Label_CBC1 ; $0BBB: 90 04
cmp #$01 ; $0BBD: C9 01
beq Label_CC2F ; $0BBF: F0 6E
Label_CBC1:
lda $0091,y ; $0BC1: B9 91 00
clc ; $0BC4: 18
adc #$08 ; $0BC5: 69 08
sec ; $0BC7: 38
sbc BonusObjectPosX,x ; $0BC8: FD D2 05
sta CollisionDeltaX ; $0BCB: 85 12
jsr AbsoluteDifference ; $0BCD: 20 8E F0
cmp #$12 ; $0BD0: C9 12
bcs Label_CC2F ; $0BD2: B0 5B
lda $009A,y ; $0BD4: B9 9A 00
clc ; $0BD7: 18
adc #$0C ; $0BD8: 69 0C
sec ; $0BDA: 38
sbc BonusObjectPosY,x ; $0BDB: FD DC 05
sta CollisionDeltaY ; $0BDE: 85 13
jsr AbsoluteDifference ; $0BE0: 20 8E F0
cmp #$12 ; $0BE3: C9 12
bcs Label_CC2F ; $0BE5: B0 48
lda CollisionDeltaX ; $0BE7: A5 12
bmi Label_CBFC ; $0BE9: 30 11
cmp #$03 ; $0BEB: C9 03
bcc Label_CC0B ; $0BED: 90 1C
lda #$02 ; $0BEF: A9 02
sta PlayerHorizontalImpulse,y ; $0BF1: 99 1B 04
jsr RequestCollisionSound ; $0BF4: 20 33 CC
jsr AdjustPlayerVerticalState ; $0BF7: 20 BB EB
bne Label_CC0B ; $0BFA: D0 0F
Label_CBFC:
cmp #$FD ; $0BFC: C9 FD
bcs Label_CC0B ; $0BFE: B0 0B
lda #$FE ; $0C00: A9 FE
sta PlayerHorizontalImpulse,y ; $0C02: 99 1B 04
jsr AdjustPlayerVerticalState ; $0C05: 20 BB EB
jsr RequestCollisionSound ; $0C08: 20 33 CC
Label_CC0B:
lda CollisionDeltaY ; $0C0B: A5 13
bmi Label_CC20 ; $0C0D: 30 11
cmp #$03 ; $0C0F: C9 03
bcc Label_CC2F ; $0C11: 90 1C
lda #$02 ; $0C13: A9 02
sta PlayerVerticalImpulse,y ; $0C15: 99 2D 04
jsr AdjustPlayerHorizontalState ; $0C18: 20 B2 EB
jsr RequestCollisionSound ; $0C1B: 20 33 CC
bne Label_CC2F ; $0C1E: D0 0F
Label_CC20:
cmp #$FD ; $0C20: C9 FD
bcs Label_CC2F ; $0C22: B0 0B
lda #$FE ; $0C24: A9 FE
sta PlayerVerticalImpulse,y ; $0C26: 99 2D 04
jsr AdjustPlayerHorizontalState ; $0C29: 20 B2 EB
jsr RequestCollisionSound ; $0C2C: 20 33 CC
Label_CC2F:
dey ; $0C2F: 88
bpl TestBonusObjectPlayerOverlap ; $0C30: 10 80
rts ; $0C32: 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 ; $0C33: A5 F1
ora #$02 ; $0C35: 09 02
sta SoundRequestFlags1 ; $0C37: 85 F1
rts ; $0C39: 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 ; $0C3A: B9 88 00
bmi Label_CCB8 ; $0C3D: 30 79
beq Label_CCB8 ; $0C3F: F0 77
cpy #$02 ; $0C41: C0 02
bcc Label_CC73 ; $0C43: 90 2E
lda BonusObjectPhase,x ; $0C45: BD FA 05
cmp #$03 ; $0C48: C9 03
bne Label_CC73 ; $0C4A: D0 27
lda BonusObjectPosX,x ; $0C4C: BD D2 05
sec ; $0C4F: 38
sbc #$0A ; $0C50: E9 0A
cmp $0091,y ; $0C52: D9 91 00
bcs Label_CC73 ; $0C55: B0 1C
adc #$04 ; $0C57: 69 04
cmp $0091,y ; $0C59: D9 91 00
bcc Label_CC73 ; $0C5C: 90 15
lda BonusObjectPosY,x ; $0C5E: BD DC 05
sec ; $0C61: 38
sbc #$1C ; $0C62: E9 1C
cmp $009A,y ; $0C64: D9 9A 00
bcs Label_CC73 ; $0C67: B0 0A
adc #$04 ; $0C69: 69 04
cmp $009A,y ; $0C6B: D9 9A 00
bcc Label_CC73 ; $0C6E: 90 03
jsr TriggerBonusObjectEffect ; $0C70: 20 BF CC
Label_CC73:
lda $0091,y ; $0C73: B9 91 00
clc ; $0C76: 18
adc #$08 ; $0C77: 69 08
sec ; $0C79: 38
sbc BonusObjectPosX,x ; $0C7A: FD D2 05
jsr AbsoluteDifference ; $0C7D: 20 8E F0
sta CollisionDeltaX ; $0C80: 85 12
lda $009A,y ; $0C82: B9 9A 00
clc ; $0C85: 18
adc #$0C ; $0C86: 69 0C
sec ; $0C88: 38
sbc BonusObjectPosY,x ; $0C89: FD DC 05
jsr AbsoluteDifference ; $0C8C: 20 8E F0
sta CollisionDeltaY ; $0C8F: 85 13
lda BonusObjectPhase,x ; $0C91: BD FA 05
cmp #$03 ; $0C94: C9 03
beq Label_CCA2 ; $0C96: F0 0A
lda CollisionDeltaX ; $0C98: A5 12
pha ; $0C9A: 48
lda CollisionDeltaY ; $0C9B: A5 13
sta CollisionDeltaX ; $0C9D: 85 12
pla ; $0C9F: 68
sta CollisionDeltaY ; $0CA0: 85 13
Label_CCA2:
lda CollisionDeltaX ; $0CA2: A5 12
cmp #$14 ; $0CA4: C9 14
bcs Label_CCB8 ; $0CA6: B0 10
lda CollisionDeltaY ; $0CA8: A5 13
cmp #$0B ; $0CAA: C9 0B
bcs Label_CCB8 ; $0CAC: B0 0A
lda #$01 ; $0CAE: A9 01
sta BonusObjectTimer,x ; $0CB0: 9D 04 06
lda #$32 ; $0CB3: A9 32
sta BonusObjectPhaseTimer,x ; $0CB5: 9D 0E 06
Label_CCB8:
dey ; $0CB8: 88
bmi Label_CCBE ; $0CB9: 30 03
jmp TestBonusObjectCollection ; $0CBB: 4C 3A CC
Label_CCBE:
rts ; $0CBE: 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 ; $0CBF: 8A
pha ; $0CC0: 48
tya ; $0CC1: 98
tax ; $0CC2: AA
inc BonusEffectCounter ; $0CC3: E6 CB
jsr ApplyBonusEffect ; $0CC5: 20 83 E9
pla ; $0CC8: 68
tax ; $0CC9: AA
rts ; $0CCA: 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 ; $0CCB: BD F0 05
sta HudCommandAddressHi ; $0CCE: 85 57
lda BonusHudAddressLo,x ; $0CD0: BD E6 05
sta HudCommandAddressLo ; $0CD3: 85 58
lda #$03 ; $0CD5: A9 03
sta HudCommandLength ; $0CD7: 85 59
ldy BonusObjectPhase,x ; $0CD9: BC FA 05
lda BonusHudRow0Tile0Table,y ; $0CDC: B9 26 CD
sta HudCommandTile0 ; $0CDF: 85 5A
lda BonusHudRow0Tile1Table,y ; $0CE1: B9 2A CD
sta HudCommandTile1 ; $0CE4: 85 5B
lda BonusHudRow0Tile2Table,y ; $0CE6: B9 2E CD
sta HudCommandTile2 ; $0CE9: 85 5C
jsr AdvanceHudCommandAddress ; $0CEB: 20 0F CD
lda BonusHudRow1Tile0Table,y ; $0CEE: B9 32 CD
sta HudCommandTile0 ; $0CF1: 85 5A
lda BonusHudRow1Tile1Table,y ; $0CF3: B9 36 CD
sta HudCommandTile1 ; $0CF6: 85 5B
lda BonusHudRow1Tile2Table,y ; $0CF8: B9 3A CD
sta HudCommandTile2 ; $0CFB: 85 5C
jsr AdvanceHudCommandAddress ; $0CFD: 20 0F CD
lda BonusHudRow2Tile0Table,y ; $0D00: B9 3E CD
sta HudCommandTile0 ; $0D03: 85 5A
lda BonusHudRow2Tile1Table,y ; $0D05: B9 42 CD
sta HudCommandTile1 ; $0D08: 85 5B
lda BonusHudRow2Tile2Table,y ; $0D0A: B9 46 CD
sta HudCommandTile2 ; $0D0D: 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 ; $0D0F: 98
pha ; $0D10: 48
lda #$57 ; $0D11: A9 57
ldy #$00 ; $0D13: A0 00
jsr $C131 ; $0D15: 20 31 C1
pla ; $0D18: 68
tay ; $0D19: A8
lda HudCommandAddressLo ; $0D1A: A5 58
clc ; $0D1C: 18
adc #$20 ; $0D1D: 69 20
sta HudCommandAddressLo ; $0D1F: 85 58
bcc Label_CD25 ; $0D21: 90 02
inc HudCommandAddressHi ; $0D23: E6 57
Label_CD25:
rts ; $0D25: 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 ; $0D26: A1 24 24 24
BonusHudRow0Tile1Table:
.byte $A2, $9E, $AB, $24 ; $0D2A: A2 9E AB 24
BonusHudRow0Tile2Table:
.byte $24, $24, $AC, $24 ; $0D2E: 24 24 AC 24
BonusHudRow1Tile0Table:
.byte $A3, $24, $AD, $A8 ; $0D32: A3 24 AD A8
BonusHudRow1Tile1Table:
.byte $A4, $9F, $AE, $A9 ; $0D36: A4 9F AE A9
BonusHudRow1Tile2Table:
.byte $A5, $24, $AF, $AA ; $0D3A: A5 24 AF AA
BonusHudRow2Tile0Table:
.byte $24, $24, $B0, $24 ; $0D3E: 24 24 B0 24
BonusHudRow2Tile1Table:
.byte $A6, $A0, $B1, $24 ; $0D42: A6 A0 B1 24
BonusHudRow2Tile2Table:
.byte $A7, $24, $24, $24 ; $0D46: 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 ; $0D4A: A2 09
Label_CD4C:
lda #$FF ; $0D4C: A9 FF
sta ParticleState,x ; $0D4E: 9D 5D 05
lda #$F0 ; $0D51: A9 F0
sta ParticlePosY,x ; $0D53: 9D 7B 05
dex ; $0D56: CA
bpl Label_CD4C ; $0D57: 10 F3
rts ; $0D59: 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 ; $0D5A: CE CC 05
beq Label_CD60 ; $0D5D: F0 01
rts ; $0D5F: 60
Label_CD60:
lda RandomState ; $0D60: A5 1B
and #$3F ; $0D62: 29 3F
adc #$28 ; $0D64: 69 28
sta ParticleSpawnCountdown ; $0D66: 8D CC 05
ldx #$09 ; $0D69: A2 09
Label_CD6B:
lda ParticleState,x ; $0D6B: BD 5D 05
bmi Label_CD74 ; $0D6E: 30 04
dex ; $0D70: CA
bpl Label_CD6B ; $0D71: 10 F8
rts ; $0D73: 60
Label_CD74:
lda #$00 ; $0D74: A9 00
sta ParticleState,x ; $0D76: 9D 5D 05
sta ParticleVelocityXLo,x ; $0D79: 9D 99 05
sta ParticleVelocityXHi,x ; $0D7C: 9D 8F 05
lda #$80 ; $0D7F: A9 80
sta ParticlePosXFrac,x ; $0D81: 9D 71 05
sta ParticlePosYFrac,x ; $0D84: 9D 85 05
lda #$D0 ; $0D87: A9 D0
sta ParticlePosY,x ; $0D89: 9D 7B 05
jsr GetRandomValue ; $0D8C: 20 B3 F1
and #$03 ; $0D8F: 29 03
tay ; $0D91: A8
lda ParticleInitialVelocityTable,y ; $0D92: B9 AE CE
sta ParticlePosX,x ; $0D95: 9D 67 05
ldy #$00 ; $0D98: A0 00
lda RandomState ; $0D9A: A5 1B
sta ParticleVelocityYLo,x ; $0D9C: 9D B7 05
bpl Label_CDA2 ; $0D9F: 10 01
dey ; $0DA1: 88
Label_CDA2:
tya ; $0DA2: 98
sta ParticleVelocityYHi,x ; $0DA3: 9D C1 05
dec ParticleSpawnRemaining ; $0DA6: CE CB 05
rts ; $0DA9: 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 ; $0DAA: A2 09
Label_CDAC:
lda ParticleState,x ; $0DAC: BD 5D 05
bmi Label_CE22 ; $0DAF: 30 71
beq Label_CDFC ; $0DB1: F0 49
lda ParticleVelocityXLo,x ; $0DB3: BD 99 05
sta MotionDeltaLo ; $0DB6: 85 12
lda ParticleVelocityXHi,x ; $0DB8: BD 8F 05
sta MotionDeltaHi ; $0DBB: 85 13
jsr UpdateSignedMotionAccumulator ; $0DBD: 20 A6 F1
lda ParticleVelocityYLo,x ; $0DC0: BD B7 05
clc ; $0DC3: 18
adc MotionDeltaLo ; $0DC4: 65 12
sta ParticleVelocityYLo,x ; $0DC6: 9D B7 05
sta MotionDeltaLo ; $0DC9: 85 12
lda ParticleVelocityYHi,x ; $0DCB: BD C1 05
adc MotionDeltaHi ; $0DCE: 65 13
sta ParticleVelocityYHi,x ; $0DD0: 9D C1 05
sta MotionDeltaHi ; $0DD3: 85 13
jsr UpdateSignedMotionAccumulator ; $0DD5: 20 A6 F1
lda ParticleVelocityXLo,x ; $0DD8: BD 99 05
sec ; $0DDB: 38
sbc MotionDeltaLo ; $0DDC: E5 12
sta ParticleVelocityXLo,x ; $0DDE: 9D 99 05
lda ParticleVelocityXHi,x ; $0DE1: BD 8F 05
sbc MotionDeltaHi ; $0DE4: E5 13
sta ParticleVelocityXHi,x ; $0DE6: 9D 8F 05
lda ParticlePosXFrac,x ; $0DE9: BD 71 05
clc ; $0DEC: 18
adc ParticleVelocityXLo,x ; $0DED: 7D 99 05
sta ParticlePosXFrac,x ; $0DF0: 9D 71 05
lda ParticlePosX,x ; $0DF3: BD 67 05
adc ParticleVelocityXHi,x ; $0DF6: 7D 8F 05
sta ParticlePosX,x ; $0DF9: 9D 67 05
Label_CDFC:
lda ParticlePosYFrac,x ; $0DFC: BD 85 05
sec ; $0DFF: 38
sbc ParticleScrollDelta ; $0E00: ED 5A 05
sta ParticlePosYFrac,x ; $0E03: 9D 85 05
bcs Label_CE0B ; $0E06: B0 03
dec ParticlePosY,x ; $0E08: DE 7B 05
Label_CE0B:
lda ParticlePosY,x ; $0E0B: BD 7B 05
cmp #$F0 ; $0E0E: C9 F0
beq Label_CE1D ; $0E10: F0 0B
cmp #$A8 ; $0E12: C9 A8
bcs Label_CE22 ; $0E14: B0 0C
lda #$01 ; $0E16: A9 01
sta ParticleState,x ; $0E18: 9D 5D 05
bne Label_CE22 ; $0E1B: D0 05
Label_CE1D:
lda #$FF ; $0E1D: A9 FF
sta ParticleState,x ; $0E1F: 9D 5D 05
Label_CE22:
jsr DrawParticleSprites ; $0E22: 20 2F CE
jsr TestParticlePlayerOverlap ; $0E25: 20 CE CE
dex ; $0E28: CA
bmi Label_CE2E ; $0E29: 30 03
jmp Label_CDAC ; $0E2B: 4C AC CD
Label_CE2E:
rts ; $0E2E: 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 ; $0E2F: BC 5D 05
iny ; $0E32: C8
lda ParticleAttributeTable,y ; $0E33: B9 B2 CE
sta MotionDeltaHi ; $0E36: 85 13
txa ; $0E38: 8A
sta MotionDeltaLo ; $0E39: 85 12
asl a ; $0E3B: 0A
adc MotionDeltaLo ; $0E3C: 65 12
asl a ; $0E3E: 0A
asl a ; $0E3F: 0A
tay ; $0E40: A8
lda ParticlePosY,x ; $0E41: BD 7B 05
sta ParticleOamBase,y ; $0E44: 99 50 02
sta $0254,y ; $0E47: 99 54 02
clc ; $0E4A: 18
adc #$08 ; $0E4B: 69 08
sta $0258,y ; $0E4D: 99 58 02
lda ParticlePosX,x ; $0E50: BD 67 05
sta $0253,y ; $0E53: 99 53 02
clc ; $0E56: 18
adc #$04 ; $0E57: 69 04
sta $025B,y ; $0E59: 99 5B 02
clc ; $0E5C: 18
adc #$04 ; $0E5D: 69 04
sta $0257,y ; $0E5F: 99 57 02
lda MotionDeltaHi ; $0E62: A5 13
sta $0252,y ; $0E64: 99 52 02
sta $0256,y ; $0E67: 99 56 02
sta $025A,y ; $0E6A: 99 5A 02
lda ParticleState,x ; $0E6D: BD 5D 05
bmi Label_CE99 ; $0E70: 30 27
lda #$A8 ; $0E72: A9 A8
sta $0251,y ; $0E74: 99 51 02
lda #$A9 ; $0E77: A9 A9
sta $0255,y ; $0E79: 99 55 02
lda FrameCounter ; $0E7C: A5 19
lsr a ; $0E7E: 4A
lsr a ; $0E7F: 4A
lsr a ; $0E80: 4A
lsr a ; $0E81: 4A
and #$07 ; $0E82: 29 07
stx MotionDeltaHi ; $0E84: 86 13
tax ; $0E86: AA
lda ParticleAnimationTileTable,x ; $0E87: BD B5 CE
sta $0259,y ; $0E8A: 99 59 02
lda $025A,y ; $0E8D: B9 5A 02
eor ParticleAnimationAttributeMaskTable,x; $0E90: 5D BD CE
sta $025A,y ; $0E93: 99 5A 02
ldx MotionDeltaHi ; $0E96: A6 13
rts ; $0E98: 60
Label_CE99:
lda #$F0 ; $0E99: A9 F0
sta ParticlePosY,x ; $0E9B: 9D 7B 05
lda #$AC ; $0E9E: A9 AC
sta $0251,y ; $0EA0: 99 51 02
lda #$AD ; $0EA3: A9 AD
sta $0255,y ; $0EA5: 99 55 02
lda #$FC ; $0EA8: A9 FC
sta $0259,y ; $0EAA: 99 59 02
rts ; $0EAD: 60
; Particle rendering tables
;===============================================================================
ParticleInitialVelocityTable:
.byte $20, $50, $A0, $D0 ; $0EAE: 20 50 A0 D0
ParticleAttributeTable:
.byte $02, $22, $02 ; $0EB2: 02 22 02
ParticleAnimationTileTable:
.byte $AA, $AB, $AB, $AA, $AA, $AB, $AB, $AA ; $0EB5: AA AB AB AA AA AB AB AA
ParticleAnimationAttributeMaskTable:
.byte $00, $00, $40, $40, $40, $40, $00, $00 ; $0EBD: 00 00 40 40 40 40 00 00
.byte $FC, $FC, $DF, $FC, $FC, $E0, $E2, $E1 ; $0EC5: FC FC DF FC FC E0 E2 E1
.byte $FC ; $0ECD: 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 ; $0ECE: A0 01
Label_CED0:
lda $0088,y ; $0ED0: B9 88 00
bmi Label_CF0F ; $0ED3: 30 3A
beq Label_CF0F ; $0ED5: F0 38
lda ParticleState,x ; $0ED7: BD 5D 05
bmi Label_CF12 ; $0EDA: 30 36
lda $009A,y ; $0EDC: B9 9A 00
cmp #$C0 ; $0EDF: C9 C0
bcs Label_CF0F ; $0EE1: B0 2C
sec ; $0EE3: 38
sbc ParticlePosY,x ; $0EE4: FD 7B 05
jsr AbsoluteDifference ; $0EE7: 20 8E F0
cmp #$18 ; $0EEA: C9 18
bcs Label_CF0F ; $0EEC: B0 21
lda $0091,y ; $0EEE: B9 91 00
sec ; $0EF1: 38
sbc ParticlePosX,x ; $0EF2: FD 67 05
jsr AbsoluteDifference ; $0EF5: 20 8E F0
cmp #$10 ; $0EF8: C9 10
bcs Label_CF0F ; $0EFA: B0 13
lda #$FF ; $0EFC: A9 FF
sta ParticleState,x ; $0EFE: 9D 5D 05
lda PlayerParticleHitCount,y ; $0F01: B9 CD 05
clc ; $0F04: 18
adc #$01 ; $0F05: 69 01
sta PlayerParticleHitCount,y ; $0F07: 99 CD 05
lda #$02 ; $0F0A: A9 02
sta SoundRequestFlags0 ; $0F0C: 85 F0
rts ; $0F0E: 60
Label_CF0F:
dey ; $0F0F: 88
bpl Label_CED0 ; $0F10: 10 BE
Label_CF12:
rts ; $0F12: 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 ; $0F13: A9 20
sta SoundRequestFlags2 ; $0F15: 85 F2
jsr LoadParticleSequenceData ; $0F17: 20 E2 D0
jsr InitializeParticleSlots ; $0F1A: 20 4A CD
ldx PlayerCountMinusOne ; $0F1D: A6 40
Label_CF1F:
lda PlayerActiveFlags,x ; $0F1F: B5 41
bmi Label_CF26 ; $0F21: 30 03
jsr $F3B0 ; $0F23: 20 B0 F3
Label_CF26:
dex ; $0F26: CA
bpl Label_CF1F ; $0F27: 10 F6
ldx #$00 ; $0F29: A2 00
stx PlayerCollisionDisable ; $0F2B: 86 BD
stx SequenceState ; $0F2D: 86 BE
lda #$14 ; $0F2F: A9 14
sta $05CB ; $0F31: 8D CB 05
Label_CF34:
jsr $F470 ; $0F34: 20 70 F4
inc $4C ; $0F37: E6 4C
jsr $D8DD ; $0F39: 20 DD D8
jsr $E691 ; $0F3C: 20 91 E6
lda $05CB ; $0F3F: AD CB 05
beq Label_CF47 ; $0F42: F0 03
jsr SpawnTimedParticle ; $0F44: 20 5A CD
Label_CF47:
jsr UpdateParticleSystem ; $0F47: 20 AA CD
lda $05CB ; $0F4A: AD CB 05
bne Label_CF34 ; $0F4D: D0 E5
ldx #$09 ; $0F4F: A2 09
Label_CF51:
lda ParticleState,x ; $0F51: BD 5D 05
bpl Label_CF34 ; $0F54: 10 DE
dex ; $0F56: CA
bpl Label_CF51 ; $0F57: 10 F8
lda FrameCounter ; $0F59: A5 19
bne Label_CF34 ; $0F5B: D0 D7
jsr $D246 ; $0F5D: 20 46 D2
ldx #$02 ; $0F60: A2 02
stx SequenceStep ; $0F62: 86 46
jsr $F45E ; $0F64: 20 5E F4
lda #$2B ; $0F67: A9 2B
ldy #$D1 ; $0F69: A0 D1
jsr $C131 ; $0F6B: 20 31 C1
lda #$5A ; $0F6E: A9 5A
ldy #$D1 ; $0F70: A0 D1
jsr $C131 ; $0F72: 20 31 C1
lda #$65 ; $0F75: A9 65
ldy #$D1 ; $0F77: A0 D1
jsr $C131 ; $0F79: 20 31 C1
ldx PlayerCountMinusOne ; $0F7C: A6 40
Label_CF7E:
lda #$20 ; $0F7E: A9 20
sta PlayerPosX,x ; $0F80: 95 91
lda $D19E,x ; $0F82: BD 9E D1
sta PlayerPosY,x ; $0F85: 95 9A
lda #$03 ; $0F87: A9 03
sta $7F,x ; $0F89: 95 7F
lda #$01 ; $0F8B: A9 01
sta $0448,x ; $0F8D: 9D 48 04
jsr $F3B0 ; $0F90: 20 B0 F3
jsr $E3A4 ; $0F93: 20 A4 E3
dex ; $0F96: CA
bpl Label_CF7E ; $0F97: 10 E5
lda #$44 ; $0F99: A9 44
sta ParticlePosX ; $0F9B: 8D 67 05
sta $0568 ; $0F9E: 8D 68 05
lda #$54 ; $0FA1: A9 54
sta ParticlePosY ; $0FA3: 8D 7B 05
lda #$74 ; $0FA6: A9 74
sta $057C ; $0FA8: 8D 7C 05
lda #$01 ; $0FAB: A9 01
sta ParticleState ; $0FAD: 8D 5D 05
sta $055E ; $0FB0: 8D 5E 05
ldx PlayerCountMinusOne ; $0FB3: A6 40
Label_CFB5:
jsr DrawParticleSprites ; $0FB5: 20 2F CE
dex ; $0FB8: CA
bpl Label_CFB5 ; $0FB9: 10 FA
jsr $F45C ; $0FBB: 20 5C F4
lda #$2B ; $0FBE: A9 2B
sta PpuCommandData0 ; $0FC0: 85 57
lda #$24 ; $0FC2: A9 24
sta PpuCommandData1 ; $0FC4: 85 58
sta PpuCommandData2 ; $0FC6: 85 59
lda #$0C ; $0FC8: A9 0C
sta PpuCommandAddressHi ; $0FCA: 85 54
lda #$0B ; $0FCC: A9 0B
sta PpuCommandAddressLo ; $0FCE: 85 55
lda #$05 ; $0FD0: A9 05
sta PpuCommandLength ; $0FD2: 85 56
lda PlayerParticleHitCount ; $0FD4: AD CD 05
jsr $D1C9 ; $0FD7: 20 C9 D1
lda PlayerCountMinusOne ; $0FDA: A5 40
beq Label_CFE8 ; $0FDC: F0 0A
lda #$0F ; $0FDE: A9 0F
sta PpuCommandAddressLo ; $0FE0: 85 55
lda PlayerParticleHitCount2 ; $0FE2: AD CE 05
jsr $D1C9 ; $0FE5: 20 C9 D1
Label_CFE8:
jsr $F45C ; $0FE8: 20 5C F4
lda ParticleSequenceValue ; $0FEB: AD 59 05
sta PpuCommandData0 ; $0FEE: 85 57
lda #$00 ; $0FF0: A9 00
sta PpuCommandData1 ; $0FF2: 85 58
sta PpuCommandData2 ; $0FF4: 85 59
lda #$08 ; $0FF6: A9 08
sta PpuCommandAddressHi ; $0FF8: 85 54
lda #$0B ; $0FFA: A9 0B
sta PpuCommandAddressLo ; $0FFC: 85 55
lda #$03 ; $0FFE: A9 03
sta PpuCommandLength ; $1000: 85 56
lda ParticleSequenceValue ; $1002: AD 59 05
jsr $C119 ; $1005: 20 19 C1
lda PlayerCountMinusOne ; $1008: A5 40
beq Label_D013 ; $100A: F0 07
lda #$0F ; $100C: A9 0F
sta PpuCommandAddressLo ; $100E: 85 55
jsr $C119 ; $1010: 20 19 C1
Label_D013:
lda #$FF ; $1013: A9 FF
sta ParticleState ; $1015: 8D 5D 05
sta $055E ; $1018: 8D 5E 05
ldx PlayerCountMinusOne ; $101B: A6 40
Label_D01D:
jsr DrawParticleSprites ; $101D: 20 2F CE
dex ; $1020: CA
bpl Label_D01D ; $1021: 10 FA
lda #$02 ; $1023: A9 02
sta SoundRequestFlags0 ; $1025: 85 F0
ldx #$02 ; $1027: A2 02
jsr $F45E ; $1029: 20 5E F4
ldx PlayerCountMinusOne ; $102C: A6 40
Label_D02E:
jsr DrawParticleSprites ; $102E: 20 2F CE
dex ; $1031: CA
bpl Label_D02E ; $1032: 10 FA
jsr $D1A0 ; $1034: 20 A0 D1
jsr $F45C ; $1037: 20 5C F4
lda #$01 ; $103A: A9 01
sta SoundRequestFlags0 ; $103C: 85 F0
jsr $D121 ; $103E: 20 21 D1
bne Label_D068 ; $1041: D0 25
lda #$70 ; $1043: A9 70
ldy #$D1 ; $1045: A0 D1
jsr $C131 ; $1047: 20 31 C1
jsr $F465 ; $104A: 20 65 F4
ldx #$1A ; $104D: A2 1A
Label_D04F:
lda $D184,x ; $104F: BD 84 D1
sta PpuCommandData0,x ; $1052: 95 57
dex ; $1054: CA
bpl Label_D04F ; $1055: 10 F8
lda SequenceDataLo ; $1057: AD 5B 05
sta SequencePointerLo ; $105A: 85 68
lda SequenceDataHi ; $105C: AD 5C 05
sta SequencePointerHi ; $105F: 85 69
jsr $C12D ; $1061: 20 2D C1
lda #$10 ; $1064: A9 10
sta SoundRequestFlags2 ; $1066: 85 F2
Label_D068:
ldx #$78 ; $1068: A2 78
jsr $F45E ; $106A: 20 5E F4
jsr $D1A0 ; $106D: 20 A0 D1
Label_D070:
lda #$00 ; $1070: A9 00
sta SequencePlayerIndex ; $1072: 85 3E
ldx #$04 ; $1074: A2 04
jsr $D213 ; $1076: 20 13 D2
jsr $C12D ; $1079: 20 2D C1
lda PlayerCountMinusOne ; $107C: A5 40
beq Label_D08E ; $107E: F0 0E
inc SequencePlayerIndex ; $1080: E6 3E
ldx #$12 ; $1082: A2 12
jsr $D213 ; $1084: 20 13 D2
lda #$65 ; $1087: A9 65
ldy #$00 ; $1089: A0 00
jsr $C131 ; $108B: 20 31 C1
Label_D08E:
lda #$01 ; $108E: A9 01
sta SoundRequestFlags1 ; $1090: 85 F1
ldx #$02 ; $1092: A2 02
jsr $F45E ; $1094: 20 5E F4
lda PpuBufferHead ; $1097: A5 5D
cmp #$24 ; $1099: C9 24
bne Label_D070 ; $109B: D0 D3
lda PlayerCountMinusOne ; $109D: A5 40
beq Label_D0A8 ; $109F: F0 07
lda a:$006B ; $10A1: AD 6B 00
cmp #$24 ; $10A4: C9 24
bne Label_D070 ; $10A6: D0 C8
Label_D0A8:
ldx #$0A ; $10A8: A2 0A
jsr $F45E ; $10AA: 20 5E F4
jsr $D121 ; $10AD: 20 21 D1
bne Label_D0CE ; $10B0: D0 1C
lda SequenceDataLo ; $10B2: AD 5B 05
sta SequenceValueLo ; $10B5: 85 47
lda SequenceDataHi ; $10B7: AD 5C 05
sta SequenceValueHi ; $10BA: 85 48
lda PlayerCountMinusOne ; $10BC: A5 40
sta SequencePlayerIndex ; $10BE: 85 3E
Label_D0C0:
jsr $D6DC ; $10C0: 20 DC D6
dec SequencePlayerIndex ; $10C3: C6 3E
bpl Label_D0C0 ; $10C5: 10 F9
lda #$01 ; $10C7: A9 01
sta SoundRequestFlags1 ; $10C9: 85 F1
jsr $F45C ; $10CB: 20 5C F4
Label_D0CE:
lda #$00 ; $10CE: A9 00
sta SequenceValueLo ; $10D0: 85 47
sta SequenceValueHi ; $10D2: 85 48
ldx #$01 ; $10D4: A2 01
Label_D0D6:
lda PlayerActiveFlags,x ; $10D6: B5 41
bpl Label_D0DC ; $10D8: 10 02
sta PlayerSlotState,x ; $10DA: 95 88
Label_D0DC:
dex ; $10DC: CA
bpl Label_D0D6 ; $10DD: 10 F7
jmp $F353 ; $10DF: 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 ; $10E2: AE 58 05
lda ParticleSequenceIndexTable,x ; $10E5: BD 0D D1
sta ParticleSequenceValue ; $10E8: 8D 59 05
lda ParticleSequenceValueTableA,x ; $10EB: BD 12 D1
sta $055A ; $10EE: 8D 5A 05
lda ParticleSequenceValueTableB,x ; $10F1: BD 17 D1
sta SequenceDataLo ; $10F4: 8D 5B 05
lda ParticleSequenceValueTableC,x ; $10F7: BD 1C D1
sta SequenceDataHi ; $10FA: 8D 5C 05
cpx #$04 ; $10FD: E0 04
bcs Label_D104 ; $10FF: B0 03
inc ParticleSequenceIndex ; $1101: EE 58 05
Label_D104:
lda #$00 ; $1104: A9 00
sta PlayerParticleHitCount ; $1106: 8D CD 05
sta PlayerParticleHitCount2 ; $1109: 8D CE 05
rts ; $110C: 60
; Sequence parameter tables
ParticleSequenceIndexTable:
.byte $03, $05, $07, $07, $07 ; $110D: 03 05 07 07 07
ParticleSequenceValueTableA:
.byte $80, $90, $98, $A0, $A8 ; $1112: 80 90 98 A0 A8
ParticleSequenceValueTableB:
.byte $01, $01, $02, $02, $03 ; $1117: 01 01 02 02 03
ParticleSequenceValueTableC:
.byte $00, $05, $00, $05, $00 ; $111C: 00 05 00 05 00
; Sum player particle-hit totals
SumParticleHitCounts:
lda $05CD ; $1121: AD CD 05
clc ; $1124: 18
adc $05CE ; $1125: 6D CE 05
cmp #$14 ; $1128: C9 14
rts ; $112A: 60
; Embedded PPU templates, strings, and position tables ($D12B-$D19F)
ParticleResultsData:
.byte $3F, $00, $10, $0F, $30, $30, $30, $0F ; $112B: 3F 00 10 0F 30 30 30 0F
.byte $30, $27, $15, $0F, $30, $02, $21, $0F ; $1133: 30 27 15 0F 30 02 21 0F
.byte $16, $16, $16 ; $113B: 16 16 16
ParticleResultsPpuTemplate:
.byte $21, $73, $0B, $29, $00 ; $113E: 21 73 0B 29 00
.byte $00, $00, $00, $00, $24, $19, $1D, $1C ; $1143: 00 00 00 00 24 19 1D 1C
.byte $26, $21, $F3, $0B, $29, $00, $00, $00 ; $114B: 26 21 F3 0B 29 00 00 00
.byte $00, $00, $24, $19, $1D, $1C, $26, $23 ; $1153: 00 00 24 19 1D 1C 26 23
.byte $E8, $08, $FF, $FF, $FF, $FF, $FF, $FF ; $115B: E8 08 FF FF FF FF FF FF
.byte $FF, $FF, $23, $C0, $08, $40, $50, $50 ; $1163: FF FF 23 C0 08 40 50 50
.byte $50, $50, $90, $A0, $A0, $22, $88, $11 ; $116B: 50 50 90 A0 A0 22 88 11
.byte $19, $24, $0E, $24, $1B, $24, $0F, $24 ; $1173: 19 24 0E 24 1B 24 0F 24
.byte $0E, $24, $0C, $24, $1D, $24, $2C, $2C ; $117B: 0E 24 0C 24 1D 24 2C 2C
.byte $2C ; $1183: 2C
PlayerStartYTable:
.byte $22, $C6, $17, $1C, $1E, $19, $0E ; $1184: 22 C6 17 1C 1E 19 0E
.byte $1B, $24, $0B, $18, $17, $1E, $1C, $24 ; $118B: 1B 24 0B 18 17 1E 1C 24
.byte $24, $24, $01, $00, $00, $00, $00, $19 ; $1193: 24 24 01 00 00 00 00 19
.byte $1D, $1C, $2C ; $119B: 1D 1C 2C
PlayerStartXTable:
.byte $50, $70 ; $119E: 50 70
DrawParticleBonusResults:
ldx #$1C ; $11A0: A2 1C
Label_D1A2:
lda ParticleResultsPpuTemplate,x ; $11A2: BD 3E D1
sta $57,x ; $11A5: 95 57
dex ; $11A7: CA
bpl Label_D1A2 ; $11A8: 10 F8
ldx #$04 ; $11AA: A2 04
ldy $05CD ; $11AC: AC CD 05
jsr AddParticleResultDigits ; $11AF: 20 DC D1
ldx #$12 ; $11B2: A2 12
ldy $05CE ; $11B4: AC CE 05
jsr AddParticleResultDigits ; $11B7: 20 DC D1
jsr $C12D ; $11BA: 20 2D C1
lda $40 ; $11BD: A5 40
bne Label_D1C2 ; $11BF: D0 01
rts ; $11C1: 60
Label_D1C2:
lda #$65 ; $11C2: A9 65
ldy #$00 ; $11C4: A0 00
jmp $C131 ; $11C6: 4C 31 C1
ConvertValueToDecimalDigits:
ldy #$00 ; $11C9: A0 00
Label_D1CB:
cmp #$0A ; $11CB: C9 0A
bcc Label_D1D5 ; $11CD: 90 06
iny ; $11CF: C8
sbc #$0A ; $11D0: E9 0A
jmp Label_D1CB ; $11D2: 4C CB D1
Label_D1D5:
sty $5A ; $11D5: 84 5A
sta $5B ; $11D7: 85 5B
jmp $C119 ; $11D9: 4C 19 C1
AddParticleResultDigits:
dey ; $11DC: 88
bmi Label_D1FE ; $11DD: 30 1F
lda $0559 ; $11DF: AD 59 05
clc ; $11E2: 18
adc $59,x ; $11E3: 75 59
cmp #$0A ; $11E5: C9 0A
bcc Label_D1ED ; $11E7: 90 04
sbc #$0A ; $11E9: E9 0A
inc $58,x ; $11EB: F6 58
Label_D1ED:
sta $59,x ; $11ED: 95 59
lda $58,x ; $11EF: B5 58
cmp #$0A ; $11F1: C9 0A
bcc Label_D1FB ; $11F3: 90 06
sbc #$0A ; $11F5: E9 0A
inc $57,x ; $11F7: F6 57
sta $58,x ; $11F9: 95 58
Label_D1FB:
jmp AddParticleResultDigits ; $11FB: 4C DC D1
Label_D1FE:
ldy #$00 ; $11FE: A0 00
Label_D200:
lda $57,x ; $1200: B5 57
beq Label_D208 ; $1202: F0 04
cmp #$24 ; $1204: C9 24
bne Label_D212 ; $1206: D0 0A
Label_D208:
lda #$24 ; $1208: A9 24
sta $57,x ; $120A: 95 57
inx ; $120C: E8
iny ; $120D: C8
cpy #$04 ; $120E: C0 04
bne Label_D200 ; $1210: D0 EE
Label_D212:
rts ; $1212: 60
DecrementDecimalDigits:
lda $59,x ; $1213: B5 59
cmp #$24 ; $1215: C9 24
beq Label_D243 ; $1217: F0 2A
tay ; $1219: A8
bne Label_D238 ; $121A: D0 1C
lda $58,x ; $121C: B5 58
cmp #$24 ; $121E: C9 24
beq Label_D243 ; $1220: F0 21
lda $58,x ; $1222: B5 58
bne Label_D232 ; $1224: D0 0C
lda $57,x ; $1226: B5 57
cmp #$24 ; $1228: C9 24
beq Label_D243 ; $122A: F0 17
lda #$0A ; $122C: A9 0A
sta $58,x ; $122E: 95 58
dec $57,x ; $1230: D6 57
Label_D232:
lda #$0A ; $1232: A9 0A
sta $59,x ; $1234: 95 59
dec $58,x ; $1236: D6 58
Label_D238:
dec $59,x ; $1238: D6 59
txa ; $123A: 8A
pha ; $123B: 48
lda #$0A ; $123C: A9 0A
jsr $D6DE ; $123E: 20 DE D6
pla ; $1241: 68
tax ; $1242: AA
Label_D243:
jmp Label_D1FE ; $1243: 4C FE D1
ClearPpuAndOamBuffers:
jsr $C10A ; $1246: 20 0A C1
jsr $C0FA ; $1249: 20 FA C0
lda #$20 ; $124C: A9 20
sta $2006 ; $124E: 8D 06 20
lda #$00 ; $1251: A9 00
sta $2006 ; $1253: 8D 06 20
jsr ClearNametable ; $1256: 20 75 D2
jsr ClearNametable ; $1259: 20 75 D2
jsr $C104 ; $125C: 20 04 C1
jsr $C115 ; $125F: 20 15 C1
ldx #$3F ; $1262: A2 3F
ldy #$00 ; $1264: A0 00
sty $4C ; $1266: 84 4C
Label_D268:
lda #$F0 ; $1268: A9 F0
sta $0200,y ; $126A: 99 00 02
iny ; $126D: C8
iny ; $126E: C8
iny ; $126F: C8
iny ; $1270: C8
dex ; $1271: CA
bpl Label_D268 ; $1272: 10 F4
rts ; $1274: 60
ClearNametable:
ldx #$F0 ; $1275: A2 F0
lda #$24 ; $1277: A9 24
Label_D279:
sta $2007 ; $1279: 8D 07 20
sta $2007 ; $127C: 8D 07 20
sta $2007 ; $127F: 8D 07 20
sta $2007 ; $1282: 8D 07 20
dex ; $1285: CA
bne Label_D279 ; $1286: D0 F1
ldx #$40 ; $1288: A2 40
lda #$00 ; $128A: A9 00
Label_D28C:
sta $2007 ; $128C: 8D 07 20
dex ; $128F: CA
bne Label_D28C ; $1290: D0 FA
rts ; $1292: 60
LoadStageObjectData:
jsr $C10A ; $1293: 20 0A C1
jsr $C0FA ; $1296: 20 FA C0
lda $16 ; $1299: A5 16
beq Label_D2A0 ; $129B: F0 03
jmp $D572 ; $129D: 4C 72 D5
Label_D2A0:
ldy $3B ; $12A0: A4 3B
lda StageStreamPointerLoTable,y ; $12A2: B9 2A DB
sta $1D ; $12A5: 85 1D
lda StageStreamPointerHiTable,y ; $12A7: B9 3A DB
sta $1E ; $12AA: 85 1E
jsr $D497 ; $12AC: 20 97 D4
ldx #$00 ; $12AF: A2 00
Label_D2B1:
jsr $D4E5 ; $12B1: 20 E5 D4
cmp #$FF ; $12B4: C9 FF
beq Label_D322 ; $12B6: F0 6A
sta $54 ; $12B8: 85 54
jsr $D4E5 ; $12BA: 20 E5 D4
sta $55 ; $12BD: 85 55
ldy #$03 ; $12BF: A0 03
Label_D2C1:
jsr $D4FB ; $12C1: 20 FB D4
lda #$04 ; $12C4: A9 04
sta $12 ; $12C6: 85 12
lda $D493,y ; $12C8: B9 93 D4
Label_D2CB:
sta $2007 ; $12CB: 8D 07 20
clc ; $12CE: 18
adc #$04 ; $12CF: 69 04
dec $12 ; $12D1: C6 12
bne Label_D2CB ; $12D3: D0 F6
inc $55 ; $12D5: E6 55
dey ; $12D7: 88
bpl Label_D2C1 ; $12D8: 10 E7
lda $55 ; $12DA: A5 55
sec ; $12DC: 38
sbc #$04 ; $12DD: E9 04
sta $55 ; $12DF: 85 55
jsr $D51C ; $12E1: 20 1C D5
sta $A6,x ; $12E4: 95 A6
inc $54 ; $12E6: E6 54
inc $54 ; $12E8: E6 54
jsr $D51C ; $12EA: 20 1C D5
sta $A9,x ; $12ED: 95 A9
inc $55 ; $12EF: E6 55
inc $55 ; $12F1: E6 55
jsr $D51C ; $12F3: 20 1C D5
sta $AF,x ; $12F6: 95 AF
dec $54 ; $12F8: C6 54
dec $54 ; $12FA: C6 54
jsr $D51C ; $12FC: 20 1C D5
sta $AC,x ; $12FF: 95 AC
stx $A4 ; $1301: 86 A4
lda #$03 ; $1303: A9 03
jsr $C856 ; $1305: 20 56 C8
jsr $C17C ; $1308: 20 7C C1
ldx $A4 ; $130B: A6 A4
lda $54 ; $130D: A5 54
asl a ; $130F: 0A
asl a ; $1310: 0A
asl a ; $1311: 0A
clc ; $1312: 18
adc #$10 ; $1313: 69 10
sta $B2,x ; $1315: 95 B2
lda $55 ; $1317: A5 55
asl a ; $1319: 0A
asl a ; $131A: 0A
asl a ; $131B: 0A
sta $B5,x ; $131C: 95 B5
inx ; $131E: E8
jmp Label_D2B1 ; $131F: 4C B1 D2
Label_D322:
dex ; $1322: CA
stx $A3 ; $1323: 86 A3
ldx #$00 ; $1325: A2 00
Label_D327:
jsr $D4E5 ; $1327: 20 E5 D4
cmp #$FF ; $132A: C9 FF
beq Label_D37E ; $132C: F0 50
sta $54 ; $132E: 85 54
jsr $D4E5 ; $1330: 20 E5 D4
sta $55 ; $1333: 85 55
jsr $D4E5 ; $1335: 20 E5 D4
sta $05FA,x ; $1338: 9D FA 05
lda $54 ; $133B: A5 54
asl a ; $133D: 0A
asl a ; $133E: 0A
asl a ; $133F: 0A
adc #$0C ; $1340: 69 0C
sta $05D2,x ; $1342: 9D D2 05
lda $55 ; $1345: A5 55
asl a ; $1347: 0A
asl a ; $1348: 0A
asl a ; $1349: 0A
adc #$0C ; $134A: 69 0C
sta $05DC,x ; $134C: 9D DC 05
lda #$00 ; $134F: A9 00
sta $0604,x ; $1351: 9D 04 06
jsr $D4FB ; $1354: 20 FB D4
sta $05E6,x ; $1357: 9D E6 05
lda $13 ; $135A: A5 13
sta $05F0,x ; $135C: 9D F0 05
jsr $D56C ; $135F: 20 6C D5
jsr $D53C ; $1362: 20 3C D5
inc $54 ; $1365: E6 54
inc $54 ; $1367: E6 54
jsr $D53C ; $1369: 20 3C D5
inc $55 ; $136C: E6 55
inc $55 ; $136E: E6 55
jsr $D53C ; $1370: 20 3C D5
dec $54 ; $1373: C6 54
dec $54 ; $1375: C6 54
jsr $D53C ; $1377: 20 3C D5
inx ; $137A: E8
jmp Label_D327 ; $137B: 4C 27 D3
Label_D37E:
dex ; $137E: CA
stx $05D1 ; $137F: 8E D1 05
jsr $D4E5 ; $1382: 20 E5 D4
sta $1F ; $1385: 85 1F
jsr $D4E5 ; $1387: 20 E5 D4
sta $20 ; $138A: 85 20
ldy #$00 ; $138C: A0 00
lda ($1F),y ; $138E: B1 1F
tax ; $1390: AA
dex ; $1391: CA
bpl Label_D399 ; $1392: 10 05
inc $C8 ; $1394: E6 C8
jmp Label_D3BA ; $1396: 4C BA D3
Label_D399:
iny ; $1399: C8
Label_D39A:
lda ($1F),y ; $139A: B1 1F
iny ; $139C: C8
sta $93,x ; $139D: 95 93
lda ($1F),y ; $139F: B1 1F
iny ; $13A1: C8
sta $9C,x ; $13A2: 95 9C
lda ($1F),y ; $13A4: B1 1F
iny ; $13A6: C8
sta $0453,x ; $13A7: 9D 53 04
lda #$02 ; $13AA: A9 02
sta $81,x ; $13AC: 95 81
lda #$01 ; $13AE: A9 01
sta $8A,x ; $13B0: 95 8A
lda $C6 ; $13B2: A5 C6
sta $0441,x ; $13B4: 9D 41 04
dex ; $13B7: CA
bpl Label_D39A ; $13B8: 10 E0
Label_D3BA:
jsr $D4E5 ; $13BA: 20 E5 D4
sta $CD ; $13BD: 85 CD
jsr $D4E5 ; $13BF: 20 E5 D4
sta $23 ; $13C2: 85 23
jsr $D4E5 ; $13C4: 20 E5 D4
tay ; $13C7: A8
sta $24 ; $13C8: 85 24
lda $23 ; $13CA: A5 23
jsr $D48C ; $13CC: 20 8C D4
sta $25 ; $13CF: 85 25
sty $26 ; $13D1: 84 26
jsr $D48C ; $13D3: 20 8C D4
sta $27 ; $13D6: 85 27
sty $28 ; $13D8: 84 28
jsr $D48C ; $13DA: 20 8C D4
sta $29 ; $13DD: 85 29
sty $2A ; $13DF: 84 2A
jsr $D5D9 ; $13E1: 20 D9 D5
jsr BuildStagePpuCommands ; $13E4: 20 ED D3
jsr $C104 ; $13E7: 20 04 C1
jmp $C115 ; $13EA: 4C 15 C1
BuildStagePpuCommands:
ldx #$22 ; $13ED: A2 22
Label_D3EF:
lda StagePaletteAndTileData,x ; $13EF: BD 37 D4
sta $57,x ; $13F2: 95 57
dex ; $13F4: CA
bpl Label_D3EF ; $13F5: 10 F8
lda $C8 ; $13F7: A5 C8
bne Label_D410 ; $13F9: D0 15
lda $3B ; $13FB: A5 3B
and #$0C ; $13FD: 29 0C
ora #$03 ; $13FF: 09 03
tay ; $1401: A8
ldx #$03 ; $1402: A2 03
Label_D404:
lda $D45A,y ; $1404: B9 5A D4
sta $5A,x ; $1407: 95 5A
dey ; $1409: 88
dex ; $140A: CA
bpl Label_D404 ; $140B: 10 F7
Label_D40D:
jmp $C12D ; $140D: 4C 2D C1
Label_D410:
ldx $0558 ; $1410: AE 58 05
lda $D46A,x ; $1413: BD 6A D4
sta $1D ; $1416: 85 1D
lda $D46F,x ; $1418: BD 6F D4
sta $1E ; $141B: 85 1E
ldx #$03 ; $141D: A2 03
ldy #$07 ; $141F: A0 07
Label_D421:
lda ($1D),y ; $1421: B1 1D
sta $72,x ; $1423: 95 72
dey ; $1425: 88
dex ; $1426: CA
bpl Label_D421 ; $1427: 10 F8
lda $16 ; $1429: A5 16
bne Label_D40D ; $142B: D0 E0
Label_D42D:
lda ($1D),y ; $142D: B1 1D
sta a:$005A,y ; $142F: 99 5A 00
dey ; $1432: 88
bpl Label_D42D ; $1433: 10 F8
bmi Label_D40D ; $1435: 30 D6
StagePaletteAndTileData:
.byte $3F, $00, $20, $0F, $2A, $09, $07, $0F ; $1437: 3F 00 20 0F 2A 09 07 0F
.byte $30, $27, $15, $0F, $30, $02, $21, $0F ; $143F: 30 27 15 0F 30 02 21 0F
.byte $30, $00, $10, $0F, $16, $12, $37, $0F ; $1447: 30 00 10 0F 16 12 37 0F
.byte $12, $16, $37, $0F, $17, $11, $35, $0F ; $144F: 12 16 37 0F 17 11 35 0F
.byte $17, $11, $2B, $0F, $2A, $09, $07, $0F ; $1457: 17 11 2B 0F 2A 09 07 0F
.byte $26, $06, $07, $0F, $1B, $0C, $07, $0F ; $145F: 26 06 07 0F 1B 0C 07 0F
.byte $2C, $01, $06, $74, $7C, $84, $84, $84 ; $1467: 2C 01 06 74 7C 84 84 84
.byte $D4, $D4, $D4, $D4, $D4, $0F, $02, $08 ; $146F: D4 D4 D4 D4 D4 0F 02 08
.byte $06, $0F, $2B, $30, $12, $0F, $07, $0A ; $1477: 06 0F 2B 30 12 0F 07 0A
.byte $19, $0F, $26, $30, $2B, $0F, $07, $0C ; $147F: 19 0F 26 30 2B 0F 07 0C
.byte $1C, $0F, $15, $30, $26 ; $1487: 1C 0F 15 30 26
AddOffsetToStreamPointer:
sec ; $148C: 38
adc $CD ; $148D: 65 CD
bcc Label_D492 ; $148F: 90 01
iny ; $1491: C8
Label_D492:
rts ; $1492: 60
StreamPointerAdjustmentTable:
.byte $7F, $7E, $7D, $7C ; $1493: 7F 7E 7D 7C
DecodePpuCommandStream:
jsr ReadStageStreamByte ; $1497: 20 E5 D4
sta $1F ; $149A: 85 1F
jsr ReadStageStreamByte ; $149C: 20 E5 D4
sta $20 ; $149F: 85 20
tax ; $14A1: AA
beq Label_D4E4 ; $14A2: F0 40
Label_D4A4:
jsr ReadPpuStreamByte ; $14A4: 20 F0 D4
tax ; $14A7: AA
beq DecodePpuCommandStream ; $14A8: F0 ED
and #$7F ; $14AA: 29 7F
sta $2006 ; $14AC: 8D 06 20
jsr ReadPpuStreamByte ; $14AF: 20 F0 D4
sta $2006 ; $14B2: 8D 06 20
jsr ReadPpuStreamByte ; $14B5: 20 F0 D4
sta $12 ; $14B8: 85 12
txa ; $14BA: 8A
and #$80 ; $14BB: 29 80
lsr a ; $14BD: 4A
lsr a ; $14BE: 4A
lsr a ; $14BF: 4A
lsr a ; $14C0: 4A
lsr a ; $14C1: 4A
ora $00 ; $14C2: 05 00
sta $2000 ; $14C4: 8D 00 20
txa ; $14C7: 8A
and #$40 ; $14C8: 29 40
bne Label_D4D8 ; $14CA: D0 0C
Label_D4CC:
jsr ReadPpuStreamByte ; $14CC: 20 F0 D4
sta $2007 ; $14CF: 8D 07 20
dec $12 ; $14D2: C6 12
bne Label_D4CC ; $14D4: D0 F6
beq Label_D4A4 ; $14D6: F0 CC
Label_D4D8:
jsr ReadPpuStreamByte ; $14D8: 20 F0 D4
Label_D4DB:
sta $2007 ; $14DB: 8D 07 20
dec $12 ; $14DE: C6 12
bne Label_D4DB ; $14E0: D0 F9
beq Label_D4A4 ; $14E2: F0 C0
Label_D4E4:
rts ; $14E4: 60
ReadStageStreamByte:
ldy #$00 ; $14E5: A0 00
lda ($1D),y ; $14E7: B1 1D
inc $1D ; $14E9: E6 1D
bne Label_D4EF ; $14EB: D0 02
inc $1E ; $14ED: E6 1E
Label_D4EF:
rts ; $14EF: 60
ReadPpuStreamByte:
ldy #$00 ; $14F0: A0 00
lda ($1F),y ; $14F2: B1 1F
inc $1F ; $14F4: E6 1F
bne Label_D4FA ; $14F6: D0 02
inc $20 ; $14F8: E6 20
Label_D4FA:
rts ; $14FA: 60
Label_D4FB:
lda $55 ; $14FB: A5 55
sta $12 ; $14FD: 85 12
lda #$00 ; $14FF: A9 00
asl $12 ; $1501: 06 12
asl $12 ; $1503: 06 12
asl $12 ; $1505: 06 12
asl $12 ; $1507: 06 12
rol a ; $1509: 2A
asl $12 ; $150A: 06 12
rol a ; $150C: 2A
ora #$20 ; $150D: 09 20
sta $2006 ; $150F: 8D 06 20
sta $13 ; $1512: 85 13
lda $12 ; $1514: A5 12
ora $54 ; $1516: 05 54
sta $2006 ; $1518: 8D 06 20
rts ; $151B: 60
SetTileAddressFromCoordinates:
lda $55 ; $151C: A5 55
and #$FC ; $151E: 29 FC
asl a ; $1520: 0A
sta $12 ; $1521: 85 12
lda $54 ; $1523: A5 54
lsr a ; $1525: 4A
lsr a ; $1526: 4A
ora $12 ; $1527: 05 12
ora #$C0 ; $1529: 09 C0
pha ; $152B: 48
lda $55 ; $152C: A5 55
and #$02 ; $152E: 29 02
sta $12 ; $1530: 85 12
lda $54 ; $1532: A5 54
and #$02 ; $1534: 29 02
lsr a ; $1536: 4A
ora $12 ; $1537: 05 12
tay ; $1539: A8
pla ; $153A: 68
rts ; $153B: 60
ReadModifyAttributeByte:
lda #$23 ; $153C: A9 23
sta $2006 ; $153E: 8D 06 20
jsr SetTileAddressFromCoordinates ; $1541: 20 1C D5
sta $2006 ; $1544: 8D 06 20
lda $2007 ; $1547: AD 07 20
lda $2007 ; $154A: AD 07 20
and AttributeClearMaskTable,y ; $154D: 39 64 D5
ora AttributeSetMaskTable,y ; $1550: 19 68 D5
pha ; $1553: 48
lda #$23 ; $1554: A9 23
sta $2006 ; $1556: 8D 06 20
jsr SetTileAddressFromCoordinates ; $1559: 20 1C D5
sta $2006 ; $155C: 8D 06 20
pla ; $155F: 68
sta $2007 ; $1560: 8D 07 20
rts ; $1563: 60
AttributeClearMaskTable:
.byte $FC, $F3, $CF, $3F ; $1564: FC F3 CF 3F
AttributeSetMaskTable:
.byte $01, $04, $10, $40 ; $1568: 01 04 10 40
InitializeNametablePatterns:
jsr $CCCB ; $156C: 20 CB CC
jmp $C17C ; $156F: 4C 7C C1
Label_D572:
lda #$C0 ; $1572: A9 C0
ldy #$23 ; $1574: A0 23
jsr WriteNametableHeaderPattern ; $1576: 20 93 D5
lda #$C0 ; $1579: A9 C0
ldy #$27 ; $157B: A0 27
jsr WriteNametableHeaderPattern ; $157D: 20 93 D5
ldy #$23 ; $1580: A0 23
lda #$60 ; $1582: A9 60
jsr WriteNametableAttributePattern ; $1584: 20 B8 D5
ldy #$27 ; $1587: A0 27
lda #$60 ; $1589: A9 60
jsr WriteNametableAttributePattern ; $158B: 20 B8 D5
inc $C8 ; $158E: E6 C8
jmp $D3E1 ; $1590: 4C E1 D3
WriteNametableHeaderPattern:
sty $2006 ; $1593: 8C 06 20
sta $2006 ; $1596: 8D 06 20
ldx #$00 ; $1599: A2 00
Label_D59B:
lda $DCAE,x ; $159B: BD AE DC
sta $2007 ; $159E: 8D 07 20
inx ; $15A1: E8
cpx #$08 ; $15A2: E0 08
bne Label_D59B ; $15A4: D0 F5
lda #$00 ; $15A6: A9 00
ldx #$28 ; $15A8: A2 28
jsr FillPpuBytes ; $15AA: 20 B1 D5
lda #$AA ; $15AD: A9 AA
ldx #$10 ; $15AF: A2 10
FillPpuBytes:
sta $2007 ; $15B1: 8D 07 20
dex ; $15B4: CA
bne FillPpuBytes ; $15B5: D0 FA
rts ; $15B7: 60
WriteNametableAttributePattern:
sty $2006 ; $15B8: 8C 06 20
sta $2006 ; $15BB: 8D 06 20
ldx #$20 ; $15BE: A2 20
lda #$58 ; $15C0: A9 58
jsr WriteAttributeQuadrants ; $15C2: 20 C9 D5
ldx #$40 ; $15C5: A2 40
lda #$5C ; $15C7: A9 5C
WriteAttributeQuadrants:
sta $12 ; $15C9: 85 12
Label_D5CB:
txa ; $15CB: 8A
and #$03 ; $15CC: 29 03
eor #$03 ; $15CE: 49 03
ora $12 ; $15D0: 05 12
sta $2007 ; $15D2: 8D 07 20
dex ; $15D5: CA
bne Label_D5CB ; $15D6: D0 F3
rts ; $15D8: 60
ScanNametableTiles:
ldx #$00 ; $15D9: A2 00
Label_D5DB:
jsr GetNametableAddressForIndex ; $15DB: 20 51 D6
jsr ClassifyNametableTile ; $15DE: 20 F1 D5
lda $51 ; $15E1: A5 51
ora #$04 ; $15E3: 09 04
sta $51 ; $15E5: 85 51
jsr ClassifyNametableTile ; $15E7: 20 F1 D5
inx ; $15EA: E8
inx ; $15EB: E8
cpx #$80 ; $15EC: E0 80
bne Label_D5DB ; $15EE: D0 EB
rts ; $15F0: 60
ClassifyNametableTile:
lda $51 ; $15F1: A5 51
sta $2006 ; $15F3: 8D 06 20
lda $50 ; $15F6: A5 50
sta $2006 ; $15F8: 8D 06 20
lda $2007 ; $15FB: AD 07 20
lda $2007 ; $15FE: AD 07 20
cmp #$24 ; $1601: C9 24
bne Label_D60C ; $1603: D0 07
txa ; $1605: 8A
and #$03 ; $1606: 29 03
tay ; $1608: A8
jmp Label_D63B ; $1609: 4C 3B D6
Label_D60C:
rts ; $160C: 60
Label_D60D:
lda $4C ; $160D: A5 4C
beq Label_D63A ; $160F: F0 29
dec $4C ; $1611: C6 4C
lda $4F ; $1613: A5 4F
clc ; $1615: 18
adc #$02 ; $1616: 69 02
and #$3F ; $1618: 29 3F
sta $4F ; $161A: 85 4F
tax ; $161C: AA
jsr GetNametableAddressForIndex ; $161D: 20 51 D6
lda $51 ; $1620: A5 51
sta $2006 ; $1622: 8D 06 20
lda $50 ; $1625: A5 50
sta $2006 ; $1627: 8D 06 20
lda $2007 ; $162A: AD 07 20
lda $2007 ; $162D: AD 07 20
ldy #$03 ; $1630: A0 03
Label_D632:
cmp NametableTileClassTable,y ; $1632: D9 4C D6
beq Label_D63B ; $1635: F0 04
dey ; $1637: 88
bpl Label_D632 ; $1638: 10 F8
Label_D63A:
rts ; $163A: 60
Label_D63B:
lda $51 ; $163B: A5 51
sta $2006 ; $163D: 8D 06 20
lda $50 ; $1640: A5 50
sta $2006 ; $1642: 8D 06 20
lda $D64D,y ; $1645: B9 4D D6
sta $2007 ; $1648: 8D 07 20
rts ; $164B: 60
NametableTileClassTable:
.byte $24, $ED, $EE, $EF, $24 ; $164C: 24 ED EE EF 24
GetNametableAddressForIndex:
lda NametableAddressPairTable,x ; $1651: BD 5C D6
sta $50 ; $1654: 85 50
lda NametableAddressPairTable+1,x ; $1656: BD 5D D6
sta $51 ; $1659: 85 51
rts ; $165B: 60
NametableAddressPairTable:
.byte $63, $21, $A5, $21, $CB, $20, $B7, $20 ; $165C: 63 21 A5 21 CB 20 B7 20
.byte $7D, $21, $9B, $22, $F2, $20, $49, $22 ; $1664: 7D 21 9B 22 F2 20 49 22
.byte $6D, $21, $0B, $22, $92, $22, $95, $21 ; $166C: 6D 21 0B 22 92 22 95 21
.byte $1C, $21, $48, $21, $E0, $20, $0B, $23 ; $1674: 1C 21 48 21 E0 20 0B 23
.byte $CE, $20, $D0, $21, $06, $21, $19, $21 ; $167C: CE 20 D0 21 06 21 19 21
.byte $30, $22, $8A, $22, $88, $22, $A4, $20 ; $1684: 30 22 8A 22 88 22 A4 20
.byte $42, $22, $68, $21, $3C, $22, $36, $21 ; $168C: 42 22 68 21 3C 22 36 21
.byte $CA, $21, $BC, $20, $96, $21, $4C, $21 ; $1694: CA 21 BC 20 96 21 4C 21
.byte $35, $22, $EF, $20, $68, $22, $A6, $20 ; $169C: 35 22 EF 20 68 22 A6 20
.byte $BB, $21, $7A, $21, $EA, $20, $F1, $21 ; $16A4: BB 21 7A 21 EA 20 F1 21
.byte $C2, $20, $77, $21, $54, $21, $BA, $20 ; $16AC: C2 20 77 21 54 21 BA 20
.byte $C5, $22, $BE, $20, $FA, $20, $AE, $21 ; $16B4: C5 22 BE 20 FA 20 AE 21
.byte $46, $21, $9A, $21, $D2, $20, $3D, $21 ; $16BC: 46 21 9A 21 D2 20 3D 21
.byte $2B, $22, $B0, $20, $B6, $21, $AC, $20 ; $16C4: 2B 22 B0 20 B6 21 AC 20
.byte $B3, $20, $DB, $20, $F6, $20, $2C, $21 ; $16CC: B3 20 DB 20 F6 20 2C 21
.byte $E7, $20, $62, $21, $E4, $21, $4E, $21 ; $16D4: E7 20 62 21 E4 21 4E 21
UpdateBonusScoreTotals:
lda #$00 ; $16DC: A9 00
AccumulatePlayerBonusScore:
sta $43 ; $16DE: 85 43
lda $3A ; $16E0: A5 3A
beq Label_D6E5 ; $16E2: F0 01
Label_D6E4:
rts ; $16E4: 60
Label_D6E5:
ldx $3E ; $16E5: A6 3E
cpx #$02 ; $16E7: E0 02
bcs Label_D6E4 ; $16E9: B0 F9
lda $41,x ; $16EB: B5 41
bmi Label_D6E4 ; $16ED: 30 F5
ldy #$64 ; $16EF: A0 64
jsr DivideBonusValue ; $16F1: 20 7C D7
clc ; $16F4: 18
adc $48 ; $16F5: 65 48
sta $45 ; $16F7: 85 45
ldy #$0A ; $16F9: A0 0A
jsr DivideBonusValue ; $16FB: 20 7C D7
sta $44 ; $16FE: 85 44
ldx $3F ; $1700: A6 3F
lda BonusScoreWeightTable,x ; $1702: BD 79 D7
sta $21 ; $1705: 85 21
lda #$06 ; $1707: A9 06
sta $22 ; $1709: 85 22
lda $3E ; $170B: A5 3E
asl a ; $170D: 0A
asl a ; $170E: 0A
ora $3E ; $170F: 05 3E
tax ; $1711: AA
clc ; $1712: 18
lda $03,x ; $1713: B5 03
adc $43 ; $1715: 65 43
jsr ClampDecimalDigit ; $1717: 20 8F D7
sta $03,x ; $171A: 95 03
lda $04,x ; $171C: B5 04
adc $44 ; $171E: 65 44
jsr ClampDecimalDigit ; $1720: 20 8F D7
sta $04,x ; $1723: 95 04
lda $05,x ; $1725: B5 05
adc $45 ; $1727: 65 45
jsr ClampDecimalDigit ; $1729: 20 8F D7
sta $05,x ; $172C: 95 05
lda $06,x ; $172E: B5 06
adc $47 ; $1730: 65 47
jsr ClampDecimalDigit ; $1732: 20 8F D7
sta $06,x ; $1735: 95 06
lda $07,x ; $1737: B5 07
adc #$00 ; $1739: 69 00
jsr ClampDecimalDigit ; $173B: 20 8F D7
sta $07,x ; $173E: 95 07
inx ; $1740: E8
inx ; $1741: E8
inx ; $1742: E8
inx ; $1743: E8
ldy #$04 ; $1744: A0 04
Label_D746:
lda $03,x ; $1746: B5 03
cmp ($21),y ; $1748: D1 21
bcc Label_D765 ; $174A: 90 19
bne Label_D752 ; $174C: D0 04
dex ; $174E: CA
dey ; $174F: 88
bpl Label_D746 ; $1750: 10 F4
Label_D752:
ldy #$00 ; $1752: A0 00
lda $3E ; $1754: A5 3E
asl a ; $1756: 0A
asl a ; $1757: 0A
ora $3E ; $1758: 05 3E
tax ; $175A: AA
Label_D75B:
lda $03,x ; $175B: B5 03
sta ($21),y ; $175D: 91 21
inx ; $175F: E8
iny ; $1760: C8
cpy #$05 ; $1761: C0 05
bne Label_D75B ; $1763: D0 F6
Label_D765:
ldy #$04 ; $1765: A0 04
Label_D767:
lda ($21),y ; $1767: B1 21
sta a:$000D,y ; $1769: 99 0D 00
dey ; $176C: 88
bpl Label_D767 ; $176D: 10 F8
inc $46 ; $176F: E6 46
lda $16 ; $1771: A5 16
beq Label_D778 ; $1773: F0 03
jsr $C539 ; $1775: 20 39 C5
Label_D778:
rts ; $1778: 60
BonusScoreWeightTable:
.byte $29, $2E, $33 ; $1779: 29 2E 33
DivideBonusValue:
sty $12 ; $177C: 84 12
ldx #$FF ; $177E: A2 FF
lda $43 ; $1780: A5 43
Label_D782:
sec ; $1782: 38
sbc $12 ; $1783: E5 12
inx ; $1785: E8
bcs Label_D782 ; $1786: B0 FA
clc ; $1788: 18
adc $12 ; $1789: 65 12
sta $43 ; $178B: 85 43
txa ; $178D: 8A
rts ; $178E: 60
ClampDecimalDigit:
cmp #$0A ; $178F: C9 0A
bcs Label_D794 ; $1791: B0 01
rts ; $1793: 60
Label_D794:
sec ; $1794: 38
sbc #$0A ; $1795: E9 0A
rts ; $1797: 60
DrawBonusResultScreen:
ldy $46 ; $1798: A4 46
dey ; $179A: 88
beq Label_D7A0 ; $179B: F0 03
bpl Label_D805 ; $179D: 10 66
rts ; $179F: 60
Label_D7A0:
lda #$20 ; $17A0: A9 20
sta $2006 ; $17A2: 8D 06 20
lda #$43 ; $17A5: A9 43
sta $2006 ; $17A7: 8D 06 20
lda #$8E ; $17AA: A9 8E
sta $2007 ; $17AC: 8D 07 20
ldx #$04 ; $17AF: A2 04
Label_D7B1:
lda $03,x ; $17B1: B5 03
sta $2007 ; $17B3: 8D 07 20
dex ; $17B6: CA
bpl Label_D7B1 ; $17B7: 10 F8
lda #$00 ; $17B9: A9 00
sta $2007 ; $17BB: 8D 07 20
lda #$24 ; $17BE: A9 24
sta $2007 ; $17C0: 8D 07 20
sta $2007 ; $17C3: 8D 07 20
ldx #$8C ; $17C6: A2 8C
stx $2007 ; $17C8: 8E 07 20
inx ; $17CB: E8
stx $2007 ; $17CC: 8E 07 20
ldx #$04 ; $17CF: A2 04
Label_D7D1:
lda $0D,x ; $17D1: B5 0D
sta $2007 ; $17D3: 8D 07 20
dex ; $17D6: CA
bpl Label_D7D1 ; $17D7: 10 F8
lda #$00 ; $17D9: A9 00
sta $2007 ; $17DB: 8D 07 20
lda #$24 ; $17DE: A9 24
sta $2007 ; $17E0: 8D 07 20
sta $2007 ; $17E3: 8D 07 20
lda $16 ; $17E6: A5 16
bne DrawBonusValueDigits ; $17E8: D0 6A
lda $40 ; $17EA: A5 40
beq Label_D802 ; $17EC: F0 14
lda #$8F ; $17EE: A9 8F
sta $2007 ; $17F0: 8D 07 20
ldx #$04 ; $17F3: A2 04
Label_D7F5:
lda $08,x ; $17F5: B5 08
sta $2007 ; $17F7: 8D 07 20
dex ; $17FA: CA
bpl Label_D7F5 ; $17FB: 10 F8
lda #$00 ; $17FD: A9 00
sta $2007 ; $17FF: 8D 07 20
Label_D802:
dec $46 ; $1802: C6 46
rts ; $1804: 60
Label_D805:
dec $46 ; $1805: C6 46
lda #$20 ; $1807: A9 20
sta $2006 ; $1809: 8D 06 20
lda #$62 ; $180C: A9 62
sta $2006 ; $180E: 8D 06 20
lda $41 ; $1811: A5 41
jsr DrawBonusMeter ; $1813: 20 26 D8
lda $40 ; $1816: A5 40
beq Label_D83A ; $1818: F0 20
lda #$20 ; $181A: A9 20
sta $2006 ; $181C: 8D 06 20
lda #$75 ; $181F: A9 75
sta $2006 ; $1821: 8D 06 20
lda $42 ; $1824: A5 42
DrawBonusMeter:
bmi Label_D83B ; $1826: 30 13
Label_D828:
sta $50 ; $1828: 85 50
ldx #$06 ; $182A: A2 06
Label_D82C:
lda #$24 ; $182C: A9 24
cpx $50 ; $182E: E4 50
bcs Label_D834 ; $1830: B0 02
lda #$2A ; $1832: A9 2A
Label_D834:
sta $2007 ; $1834: 8D 07 20
dex ; $1837: CA
bpl Label_D82C ; $1838: 10 F2
Label_D83A:
rts ; $183A: 60
Label_D83B:
lda $40 ; $183B: A5 40
beq Label_D828 ; $183D: F0 E9
ldx #$08 ; $183F: A2 08
Label_D841:
lda BonusLabelTiles,x ; $1841: BD 4B D8
sta $2007 ; $1844: 8D 07 20
dex ; $1847: CA
bpl Label_D841 ; $1848: 10 F7
rts ; $184A: 60
BonusLabelTiles:
.byte $1B, $0E, $1F, $18, $24, $0E, $16, $0A ; $184B: 1B 0E 1F 18 24 0E 16 0A
.byte $10 ; $1853: 10
DrawBonusValueDigits:
ldy #$04 ; $1854: A0 04
Label_D856:
lda BonusDigitOffsetTable,y ; $1856: B9 6C D8
sta $2007 ; $1859: 8D 07 20
dey ; $185C: 88
bpl Label_D856 ; $185D: 10 F7
lda $4A ; $185F: A5 4A
sta $2007 ; $1861: 8D 07 20
lda $49 ; $1864: A5 49
sta $2007 ; $1866: 8D 07 20
dec $46 ; $1869: C6 46
rts ; $186B: 60
BonusDigitOffsetTable:
.byte $FB, $FA, $F9, $F8, $F7 ; $186C: FB FA F9 F8 F7
CreateBonusResultSprites:
sta $12 ; $1871: 85 12
stx $13 ; $1873: 86 13
sty $14 ; $1875: 84 14
ldx #$01 ; $1877: A2 01
Label_D879:
lda $061A,x ; $1879: BD 1A 06
bmi Label_D88C ; $187C: 30 0E
dex ; $187E: CA
bpl Label_D879 ; $187F: 10 F8
ldx #$01 ; $1881: A2 01
lda $0619 ; $1883: AD 19 06
cmp $0618 ; $1886: CD 18 06
bcc Label_D88C ; $1889: 90 01
dex ; $188B: CA
Label_D88C:
lda #$64 ; $188C: A9 64
sta $0618,x ; $188E: 9D 18 06
lda $12 ; $1891: A5 12
sta $061A,x ; $1893: 9D 1A 06
tay ; $1896: A8
txa ; $1897: 8A
asl a ; $1898: 0A
asl a ; $1899: 0A
asl a ; $189A: 0A
tax ; $189B: AA
lda BonusSpriteTileTableA,y ; $189C: B9 D1 D8
sta $02F1,x ; $189F: 9D F1 02
lda BonusSpriteTileTableB,y ; $18A2: B9 D7 D8
sta $02F5,x ; $18A5: 9D F5 02
ldy $13 ; $18A8: A4 13
lda a:$009A,y ; $18AA: B9 9A 00
sec ; $18AD: 38
sbc #$08 ; $18AE: E9 08
sta $02F0,x ; $18B0: 9D F0 02
sta $02F4,x ; $18B3: 9D F4 02
lda a:$0091,y ; $18B6: B9 91 00
sta $02F3,x ; $18B9: 9D F3 02
clc ; $18BC: 18
adc #$08 ; $18BD: 69 08
sta $02F7,x ; $18BF: 9D F7 02
lda $3E ; $18C2: A5 3E
sta $02F2,x ; $18C4: 9D F2 02
sta $02F6,x ; $18C7: 9D F6 02
ldy $14 ; $18CA: A4 14
ldx $13 ; $18CC: A6 13
lda $12 ; $18CE: A5 12
rts ; $18D0: 60
BonusSpriteTileTableA:
.byte $F4, $F5, $F6, $F7, $F8, $F9 ; $18D1: F4 F5 F6 F7 F8 F9
BonusSpriteTileTableB:
.byte $FB, $FB, $FA, $FB, $FB, $FB ; $18D7: FB FB FA FB FB FB
UpdateBonusResultSprites:
ldx #$01 ; $18DD: A2 01
Label_D8DF:
lda $061A,x ; $18DF: BD 1A 06
bmi Label_D8FB ; $18E2: 30 17
dec $0618,x ; $18E4: DE 18 06
bne Label_D8FB ; $18E7: D0 12
lda #$FF ; $18E9: A9 FF
sta $061A,x ; $18EB: 9D 1A 06
txa ; $18EE: 8A
asl a ; $18EF: 0A
asl a ; $18F0: 0A
asl a ; $18F1: 0A
tay ; $18F2: A8
lda #$F0 ; $18F3: A9 F0
sta $02F0,y ; $18F5: 99 F0 02
sta $02F4,y ; $18F8: 99 F4 02
Label_D8FB:
dex ; $18FB: CA
bpl Label_D8DF ; $18FC: 10 E1
rts ; $18FE: 60
ClearBonusResultSprites:
ldx #$01 ; $18FF: A2 01
Label_D901:
lda #$00 ; $1901: A9 00
sta $0618,x ; $1903: 9D 18 06
lda #$FF ; $1906: A9 FF
sta $061A,x ; $1908: 9D 1A 06
dex ; $190B: CA
bpl Label_D901 ; $190C: 10 F3
rts ; $190E: 60
Label_D90F:
jsr $D246 ; $190F: 20 46 D2
jsr $C10A ; $1912: 20 0A C1
jsr $F465 ; $1915: 20 65 F4
jsr $C0FA ; $1918: 20 FA C0
lda #$2C ; $191B: A9 2C
sta $1D ; $191D: 85 1D
lda #$D9 ; $191F: A9 D9
sta $1E ; $1921: 85 1E
jsr $D497 ; $1923: 20 97 D4
jsr $C104 ; $1926: 20 04 C1
jmp $C115 ; $1929: 4C 15 C1
; Title/menu PPU command streams and tile data
TitleScreenPpuData:
.byte $30, $D9, $00, $00, $3F, $00, $04, $0F ; $192C: 30 D9 00 00 3F 00 04 0F
.byte $30, $27, $2A, $3F, $18, $04, $0F, $16 ; $1934: 30 27 2A 3F 18 04 0F 16
.byte $30, $21, $20, $7C, $21, $F0, $F1, $24 ; $193C: 30 21 20 7C 21 F0 F1 24
.byte $24, $24, $24, $E0, $E1, $E1, $E2, $E0 ; $1944: 24 24 24 E0 E1 E1 E2 E0
.byte $E1, $E1, $E2, $E0, $E2, $24, $E0, $E2 ; $194C: E1 E1 E2 E0 E2 24 E0 E2
.byte $24, $E0, $E1, $E1, $E2, $E0, $E1, $E1 ; $1954: 24 E0 E1 E1 E2 E0 E1 E1
.byte $E2, $E0, $EC, $24, $E0, $E2, $20, $A2 ; $195C: E2 E0 EC 24 E0 E2 20 A2
.byte $1B, $E3, $E3, $E3, $E5, $E3, $E3, $E3 ; $1964: 1B E3 E3 E3 E5 E3 E3 E3
.byte $E5, $E3, $E5, $24, $E3, $E5, $24, $E3 ; $196C: E5 E3 E5 24 E3 E5 24 E3
.byte $E3, $E3, $E5, $E3, $E3, $E3, $E5, $E3 ; $1974: E3 E3 E5 E3 E3 E3 E5 E3
.byte $E3, $F3, $E3, $E5, $20, $C2, $1B, $E3 ; $197C: E3 F3 E3 E5 20 C2 1B E3
.byte $E4, $E3, $E7, $E3, $E4, $E3, $E5, $E3 ; $1984: E4 E3 E7 E3 E4 E3 E5 E3
.byte $E5, $24, $E3, $E5, $24, $E3, $E4, $E3 ; $198C: E5 24 E3 E5 24 E3 E4 E3
.byte $E5, $E3, $E4, $E3, $E5, $E3, $E3, $E3 ; $1994: E5 E3 E4 E3 E5 E3 E3 E3
.byte $E3, $E5, $20, $E2, $1B, $E3, $E3, $E3 ; $199C: E3 E5 20 E2 1B E3 E3 E3
.byte $E2, $E3, $E3, $E3, $E5, $E3, $E5, $24 ; $19A4: E2 E3 E3 E3 E5 E3 E5 24
.byte $E3, $E5, $24, $E3, $E3, $E3, $E5, $E3 ; $19AC: E3 E5 24 E3 E3 E3 E5 E3
.byte $E3, $E3, $E5, $E3, $E3, $E3, $E3, $E5 ; $19B4: E3 E3 E5 E3 E3 E3 E3 E5
.byte $21, $02, $1B, $E3, $E4, $E3, $E5, $E3 ; $19BC: 21 02 1B E3 E4 E3 E5 E3
.byte $F2, $E3, $E5, $E3, $E3, $E2, $E3, $E3 ; $19C4: F2 E3 E5 E3 E3 E2 E3 E3
.byte $E2, $E3, $E3, $E3, $E5, $E3, $E3, $E3 ; $19CC: E2 E3 E3 E3 E5 E3 E3 E3
.byte $E5, $E3, $F2, $E3, $E3, $E5, $21, $22 ; $19D4: E5 E3 F2 E3 E3 E5 21 22
.byte $1B, $E6, $E3, $E3, $E7, $EB, $24, $E6 ; $19DC: 1B E6 E3 E3 E7 EB 24 E6
.byte $E7, $E6, $E3, $E7, $E6, $E3, $E7, $E6 ; $19E4: E7 E6 E3 E7 E6 E3 E7 E6
.byte $E3, $E3, $E7, $E6, $E3, $E3, $E7, $EB ; $19EC: E3 E3 E7 E6 E3 E3 E7 EB
.byte $24, $E6, $E3, $E7, $21, $4C, $12, $E0 ; $19F4: 24 E6 E3 E7 21 4C 12 E0
.byte $E1, $E1, $E2, $E0, $E2, $E0, $E1, $E1 ; $19FC: E1 E1 E2 E0 E2 E0 E1 E1
.byte $E2, $E8, $24, $E0, $E2, $E0, $E1, $E1 ; $1A04: E2 E8 24 E0 E2 E0 E1 E1
.byte $E2, $21, $6C, $12, $E3, $E3, $E3, $E7 ; $1A0C: E2 21 6C 12 E3 E3 E3 E7
.byte $E3, $E5, $E3, $F5, $F6, $E7, $E3, $F3 ; $1A14: E3 E5 E3 F5 F6 E7 E3 F3
.byte $E3, $E5, $E6, $E3, $E3, $E7, $21, $8C ; $1A1C: E3 E5 E6 E3 E3 E7 21 8C
.byte $12, $E3, $E3, $EF, $24, $E3, $E5, $E3 ; $1A24: 12 E3 E3 EF 24 E3 E5 E3
.byte $24, $24, $24, $E3, $E3, $E3, $E5, $24 ; $1A2C: 24 24 24 E3 E3 E3 E5 24
.byte $E3, $E5, $24, $21, $AC, $12, $E3, $E3 ; $1A34: E3 E5 24 21 AC 12 E3 E3
.byte $E1, $EA, $E3, $E5, $E3, $E9, $E3, $E2 ; $1A3C: E1 EA E3 E5 E3 E9 E3 E2
.byte $E3, $E3, $E3, $E5, $24, $E3, $E5, $24 ; $1A44: E3 E3 E3 E5 24 E3 E5 24
.byte $21, $CC, $12, $E3, $E3, $EF, $24, $E3 ; $1A4C: 21 CC 12 E3 E3 EF 24 E3
.byte $E5, $E3, $F3, $E3, $E5, $E3, $F2, $E3 ; $1A54: E5 E3 F3 E3 E5 E3 F2 E3
.byte $E5, $24, $E3, $E5, $24, $21, $EC, $12 ; $1A5C: E5 24 E3 E5 24 21 EC 12
.byte $E6, $E7, $24, $24, $E6, $E7, $E6, $E7 ; $1A64: E6 E7 24 24 E6 E7 E6 E7
.byte $E6, $E7, $EB, $24, $E6, $E7, $24, $E6 ; $1A6C: E6 E7 EB 24 E6 E7 24 E6
.byte $E7, $24, $22, $48, $10, $0A, $24, $24 ; $1A74: E7 24 22 48 10 0A 24 24
.byte $01, $25, $19, $15, $0A, $22, $0E, $1B ; $1A7C: 01 25 19 15 0A 22 0E 1B
.byte $24, $10, $0A, $16, $0E, $22, $88, $10 ; $1A84: 24 10 0A 16 0E 22 88 10
.byte $0B, $24, $24, $02, $25, $19, $15, $0A ; $1A8C: 0B 24 24 02 25 19 15 0A
.byte $22, $0E, $1B, $24, $10, $0A, $16, $0E ; $1A94: 22 0E 1B 24 10 0A 16 0E
.byte $22, $C8, $10, $0C, $24, $24, $0B, $0A ; $1A9C: 22 C8 10 0C 24 24 0B 0A
.byte $15, $15, $18, $18, $17, $24, $24, $1D ; $1AA4: 15 15 18 18 17 24 24 1D
.byte $1B, $12, $19, $23, $49, $0E, $F4, $01 ; $1AAC: 1B 12 19 23 49 0E F4 01
.byte $09, $08, $04, $24, $17, $12, $17, $1D ; $1AB4: 09 08 04 24 17 12 17 1D
.byte $0E, $17, $0D, $18, $00 ; $1ABC: 0E 17 0D 18 00
RunTitleMenuLoop:
jsr $C104 ; $1AC1: 20 04 C1
jsr $D90F ; $1AC4: 20 0F D9
lda #$00 ; $1AC7: A9 00
sta $19 ; $1AC9: 85 19
Label_DACB:
jsr $F465 ; $1ACB: 20 65 F4
lda $19 ; $1ACE: A5 19
beq Label_DAF1 ; $1AD0: F0 1F
jsr ApplySelectedGameMode ; $1AD2: 20 08 DB
jsr $E768 ; $1AD5: 20 68 E7
tax ; $1AD8: AA
and #$10 ; $1AD9: 29 10
bne Label_DAF0 ; $1ADB: D0 13
txa ; $1ADD: 8A
and #$20 ; $1ADE: 29 20
beq Label_DAED ; $1AE0: F0 0B
lda #$00 ; $1AE2: A9 00
sta $19 ; $1AE4: 85 19
ldx $3F ; $1AE6: A6 3F
lda GameModePlayerCountTable,x ; $1AE8: BD 05 DB
sta $3F ; $1AEB: 85 3F
Label_DAED:
jmp Label_DACB ; $1AED: 4C CB DA
Label_DAF0:
rts ; $1AF0: 60
Label_DAF1:
inc $3A ; $1AF1: E6 3A
inc $40 ; $1AF3: E6 40
lda #$00 ; $1AF5: A9 00
sta $4015 ; $1AF7: 8D 15 40
sta $16 ; $1AFA: 85 16
jsr $F1F2 ; $1AFC: 20 F2 F1
lda #$00 ; $1AFF: A9 00
sta $3A ; $1B01: 85 3A
beq RunTitleMenuLoop ; $1B03: F0 BC
GameModePlayerCountTable:
ora ($02,x) ; $1B05: 01 02
brk ; $1B07: 00
ApplySelectedGameMode:
lda $3F ; $1B08: A5 3F
lsr a ; $1B0A: 4A
sta $16 ; $1B0B: 85 16
lda $3F ; $1B0D: A5 3F
tax ; $1B0F: AA
and #$01 ; $1B10: 29 01
sta $40 ; $1B12: 85 40
lda StageDataPointerTableLo,x ; $1B14: BD 27 DB
sta $057B ; $1B17: 8D 7B 05
lda #$2C ; $1B1A: A9 2C
sta $0567 ; $1B1C: 8D 67 05
ldx #$00 ; $1B1F: A2 00
stx $055D ; $1B21: 8E 5D 05
jmp $CE2F ; $1B24: 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 ; $1B27: 8C 9C AC
StageStreamPointerLoTable:
.byte $4A, $59, $F2, $6C, $77, $88, $E1, $6C ; $1B2A: 4A 59 F2 6C 77 88 E1 6C
.byte $99, $03, $CA, $6C, $AD, $17, $E1, $6C ; $1B32: 99 03 CA 6C AD 17 E1 6C
StageStreamPointerHiTable:
.byte $DB, $DB, $DB, $DB, $DB, $DB, $DB, $DB ; $1B3A: DB DB DB DB DB DB DB DB
.byte $DB, $DC, $DB, $DB, $DB, $DC, $DB, $DB ; $1B42: DB DC DB DB DB DC DB DB
StageStream_00:
StageStream_00_Target:
.byte $2B, $DC, $39, $DD, $00, $00, $10, $06 ; $1B4A: 2B DC 39 DD 00 00 10 06
.byte $FF, $FF, $96, $DF, $02, $7A, $DE ; $1B52: FF FF 96 DF 02 7A DE
StageStream_01:
StageStream_01_Target:
.byte $2B, $DC, $39, $DD, $4B, $DD, $00, $00 ; $1B59: 2B DC 39 DD 4B DD 00 00
.byte $18, $0C, $04, $0E, $FF, $FF, $A0, $DF ; $1B61: 18 0C 04 0E FF FF A0 DF
.byte $04, $86, $DE ; $1B69: 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 ; $1B6C: CA DC 00 00 FF FF B0 DF
.byte $00, $9A, $DE ; $1B74: 00 9A DE
StageStream_03:
StageStream_04_Target:
.byte $2B, $DC, $5E, $DD, $00, $00, $08, $06 ; $1B77: 2B DC 5E DD 00 00 08 06
.byte $18, $0A, $FF, $FF, $B1, $DF, $06, $9E ; $1B7F: 18 0A FF FF B1 DF 06 9E
.byte $DE ; $1B87: DE
StageStream_05_Target:
.byte $2B, $DC, $7D ; $1B88: 2B DC 7D
StageStream_04:
.byte $DD, $00, $00, $04, $06, $12, $08, $FF ; $1B8B: DD 00 00 04 06 12 08 FF
.byte $FF, $C1, $DF, $07, $BA, $DE ; $1B93: FF C1 DF 07 BA DE
StageStream_08_Target:
.byte $2B, $DC, $A3, $DD ; $1B99: 2B DC A3 DD
StageStream_05:
.byte $00, $00, $06, $06, $14, $10, $FF, $0F ; $1B9D: 00 00 06 06 14 10 FF 0F
.byte $0D, $01, $FF, $D4, $DF, $09, $DA, $DE ; $1BA5: 0D 01 FF D4 DF 09 DA DE
StageStream_0C_Target:
.byte $2B ; $1BAD: 2B
StageStream_06:
.byte $DC, $CE, $DD, $00, $00, $04, $06, $10 ; $1BAE: DC CE DD 00 00 04 06 10
.byte $0E, $FF, $08, $0E, $03, $0D, $09, $03 ; $1BB6: 0E FF 08 0E 03 0D 09 03
.byte $12, $08, $03, $17, $0D, $03, $FF, $E7 ; $1BBE: 12 08 03 17 0D 03 FF E7
.byte $DF, $03, $02, $DF ; $1BC6: DF 03 02 DF
StageStream_07:
StageStream_0A_Target:
.byte $2B, $DC, $5E, $DD, $00, $00, $10, $06 ; $1BCA: 2B DC 5E DD 00 00 10 06
.byte $1A, $0C, $FF, $08, $08, $01, $18, $04 ; $1BD2: 1A 0C FF 08 08 01 18 04
.byte $01, $FF, $B1, $DF, $06 ; $1BDA: 01 FF B1 DF 06
StageStream_08:
.byte $9E, $DE ; $1BDF: 9E DE
StageStream_06_Target:
StageStream_0E_Target:
.byte $2B, $DC, $DB, $DD, $00, $00, $0E, $06 ; $1BE1: 2B DC DB DD 00 00 0E 06
.byte $0C, $14, $FF, $FF, $F7 ; $1BE9: 0C 14 FF FF F7
StageStream_09:
.byte $DF, $06, $12, $DF ; $1BEE: DF 06 12 DF
StageStream_02_Target:
.byte $2B, $DC, $01, $DE, $00, $00, $04, $08 ; $1BF2: 2B DC 01 DE 00 00 04 08
.byte $16, $10, $FF, $FF, $07, $E0, $09 ; $1BFA: 16 10 FF FF 07 E0 09
StageStream_0A:
.byte $2E, $DF ; $1C01: 2E DF
StageStream_09_Target:
.byte $2B, $DC, $32, $DE, $00, $00, $04, $10 ; $1C03: 2B DC 32 DE 00 00 04 10
.byte $18, $10, $FF, $0E, $06, $01, $FF, $17 ; $1C0B: 18 10 FF 0E 06 01 FF 17
.byte $E0, $07, $56, $DF ; $1C13: E0 07 56 DF
StageStream_0B:
StageStream_0D_Target:
.byte $2B, $DC, $5B, $DE, $00, $00, $04, $08 ; $1C17: 2B DC 5B DE 00 00 04 08
.byte $0E, $10, $FF, $10, $07, $01, $FF, $2A ; $1C1F: 0E 10 FF 10 07 01 FF 2A
.byte $E0, $07, $76, $DF ; $1C27: E0 07 76 DF
StagePpuData_Common:
.byte $23, $40, $88, $39, $38, $39, $38, $39 ; $1C2B: 23 40 88 39 38 39 38 39
.byte $38, $39, $33, $24, $24, $24, $24, $24 ; $1C33: 38 39 33 24 24 24 24 24
.byte $24, $24, $24, $24, $24, $24, $24, $24 ; $1C3B: 24 24 24 24 24 24 24 24
.byte $24, $24, $24, $30, $38, $39, $38, $39 ; $1C43: 24 24 24 30 38 39 38 39
.byte $38, $39, $38, $3C, $3B, $3C, $3B, $3C ; $1C4B: 38 39 38 3C 3B 3C 3B 3C
.byte $3B, $3C, $3D, $58, $59, $5A, $5B, $58 ; $1C53: 3B 3C 3D 58 59 5A 5B 58
.byte $59, $5A, $5B, $58, $59, $5A, $5B, $58 ; $1C5B: 59 5A 5B 58 59 5A 5B 58
.byte $59, $5A, $5B, $3A, $3B, $3C, $3B, $3C ; $1C63: 59 5A 5B 3A 3B 3C 3B 3C
.byte $3B, $3C, $3B, $60, $61, $62, $63, $60 ; $1C6B: 3B 3C 3B 60 61 62 63 60
.byte $61, $62, $63, $5C, $5D, $5E, $5F, $5C ; $1C73: 61 62 63 5C 5D 5E 5F 5C
.byte $5D, $5E, $5F, $5C, $5D, $5E, $5F, $5C ; $1C7B: 5D 5E 5F 5C 5D 5E 5F 5C
.byte $5D, $5E, $5F, $60, $61, $62, $63, $60 ; $1C83: 5D 5E 5F 60 61 62 63 60
.byte $61, $62, $63, $5C, $5D, $5E, $5F, $5C ; $1C8B: 61 62 63 5C 5D 5E 5F 5C
.byte $5D, $5E, $5F, $5C, $5D, $5E, $5F, $5C ; $1C93: 5D 5E 5F 5C 5D 5E 5F 5C
.byte $5D, $5E, $5F, $5C, $5D, $5E, $5F, $5C ; $1C9B: 5D 5E 5F 5C 5D 5E 5F 5C
.byte $5D, $5E, $5F, $5C, $5D, $5E, $5F, $5C ; $1CA3: 5D 5E 5F 5C 5D 5E 5F 5C
.byte $5D, $5E, $5F ; $1CAB: 5D 5E 5F
NametableHeaderPatternData:
.byte $40, $50, $50, $50, $50, $90, $A0, $A0 ; $1CAE: 40 50 50 50 50 90 A0 A0
.byte $23, $F0, $10, $00, $00, $A0, $A0, $A0 ; $1CB6: 23 F0 10 00 00 A0 A0 A0
.byte $A0, $00, $00, $0A, $0A, $0A, $0A, $0A ; $1CBE: A0 00 00 0A 0A 0A 0A 0A
.byte $0A, $0A, $0A, $00, $A3, $04, $04, $93 ; $1CC6: 0A 0A 0A 00 A3 04 04 93
.byte $94, $94, $94, $A3, $05, $04, $95, $96 ; $1CCE: 94 94 94 A3 05 04 95 96
.byte $96, $96, $A2, $EA, $05, $93, $94, $94 ; $1CD6: 96 96 A2 EA 05 93 94 94
.byte $94, $94, $A2, $EB, $05, $95, $96, $96 ; $1CDE: 94 94 A2 EB 05 95 96 96
.byte $96, $96, $A3, $34, $03, $93, $94, $94 ; $1CE6: 96 96 A3 34 03 93 94 94
.byte $A3, $35, $03, $95, $96, $96, $A3, $1A ; $1CEE: A3 35 03 95 96 96 A3 1A
.byte $04, $93, $94, $94, $94, $A3, $1B, $04 ; $1CF6: 04 93 94 94 94 A3 1B 04
.byte $95, $96, $96, $96, $63, $80, $20, $97 ; $1CFE: 95 96 96 96 63 80 20 97
.byte $23, $A0, $20, $98, $99, $98, $99, $98 ; $1D06: 23 A0 20 98 99 98 99 98
.byte $99, $98, $99, $98, $99, $98, $99, $98 ; $1D0E: 99 98 99 98 99 98 99 98
.byte $99, $98, $99, $98, $99, $98, $99, $98 ; $1D16: 99 98 99 98 99 98 99 98
.byte $99, $98, $99, $98, $99, $98, $99, $98 ; $1D1E: 99 98 99 98 99 98 99 98
.byte $99, $98, $99, $23, $C0, $08, $40, $50 ; $1D26: 99 98 99 23 C0 08 40 50
.byte $50, $50, $50, $90, $A0, $A0, $63, $E8 ; $1D2E: 50 50 50 90 A0 A0 63 E8
.byte $10, $FF, $00 ; $1D36: 10 FF 00
StagePpuLayoutData:
.byte $22, $49, $0E, $30, $31, $32, $31, $32 ; $1D39: 22 49 0E 30 31 32 31 32
.byte $31, $32, $31, $32, $31, $32, $31, $32 ; $1D41: 31 32 31 32 31 32 31 32
.byte $33, $00, $21, $57, $06, $30, $31, $32 ; $1D49: 33 00 21 57 06 30 31 32
.byte $31, $32, $33, $21, $65, $06, $30, $31 ; $1D51: 31 32 33 21 65 06 30 31
.byte $32, $31, $32, $33, $00, $21, $90, $03 ; $1D59: 32 31 32 33 00 21 90 03
.byte $30, $31, $33, $22, $26, $03, $30, $31 ; $1D61: 30 31 33 22 26 03 30 31
.byte $33, $22, $57, $03, $30, $31, $33, $22 ; $1D69: 33 22 57 03 30 31 33 22
.byte $6C, $03, $30, $31, $33, $22, $F2, $03 ; $1D71: 6C 03 30 31 33 22 F2 03
.byte $30, $31, $33, $00, $20, $CB, $03, $30 ; $1D79: 30 31 33 00 20 CB 03 30
.byte $31, $33, $A1, $6D, $03, $3E, $3F, $40 ; $1D81: 31 33 A1 6D 03 3E 3F 40
.byte $A1, $59, $04, $3E, $3F, $3F, $40, $A1 ; $1D89: A1 59 04 3E 3F 3F 40 A1
.byte $A5, $03, $3E, $3F, $40, $22, $AA, $03 ; $1D91: A5 03 3E 3F 40 22 AA 03
.byte $30, $31, $33, $22, $B3, $03, $30, $31 ; $1D99: 30 31 33 22 B3 03 30 31
.byte $33, $00, $20, $E2, $02, $30, $33, $20 ; $1DA1: 33 00 20 E2 02 30 33 20
.byte $FB, $02, $30, $33, $21, $57, $02, $30 ; $1DA9: FB 02 30 33 21 57 02 30
.byte $33, $21, $93, $02, $30, $33, $22, $0B ; $1DB1: 33 21 93 02 30 33 22 0B
.byte $02, $30, $33, $22, $47, $02, $30, $33 ; $1DB9: 02 30 33 22 47 02 30 33
.byte $22, $83, $02, $30, $33, $22, $CF, $04 ; $1DC1: 22 83 02 30 33 22 CF 04
.byte $30, $31, $32, $33, $00, $22, $CA, $03 ; $1DC9: 30 31 32 33 00 22 CA 03
.byte $30, $31, $33, $22, $D2, $03, $30, $31 ; $1DD1: 30 31 33 22 D2 03 30 31
.byte $33, $00, $21, $08, $04, $30, $31, $32 ; $1DD9: 33 00 21 08 04 30 31 32
.byte $33, $21, $14, $04, $30, $31, $32, $33 ; $1DE1: 33 21 14 04 30 31 32 33
.byte $A1, $A5, $04, $3E, $3F, $3F, $40, $A1 ; $1DE9: A1 A5 04 3E 3F 3F 40 A1
.byte $BA, $04, $3E, $3F, $3F, $40, $22, $6C ; $1DF1: BA 04 3E 3F 3F 40 22 6C
.byte $06, $30, $31, $32, $31, $32, $33, $00 ; $1DF9: 06 30 31 32 31 32 33 00
.byte $22, $EE, $04, $30, $31, $32, $33, $20 ; $1E01: 22 EE 04 30 31 32 33 20
.byte $F9, $03, $30, $31, $33, $A1, $1A, $03 ; $1E09: F9 03 30 31 33 A1 1A 03
.byte $3F, $3F, $40, $21, $90, $03, $30, $31 ; $1E11: 3F 3F 40 21 90 03 30 31
.byte $33, $A1, $B1, $03, $3F, $3F, $40, $22 ; $1E19: 33 A1 B1 03 3F 3F 40 22
.byte $28, $03, $30, $31, $33, $A2, $49, $03 ; $1E21: 28 03 30 31 33 A2 49 03
.byte $3F, $3F, $40, $20, $EA, $02, $30, $33 ; $1E29: 3F 3F 40 20 EA 02 30 33
.byte $00, $A2, $6C, $03, $3E, $3F, $40, $A2 ; $1E31: 00 A2 6C 03 3E 3F 40 A2
.byte $73, $03, $3E, $3F, $40, $20, $E4, $04 ; $1E39: 73 03 3E 3F 40 20 E4 04
.byte $30, $31, $32, $33, $20, $F8, $04, $30 ; $1E41: 30 31 32 33 20 F8 04 30
.byte $31, $32, $33, $21, $A8, $04, $30, $31 ; $1E49: 31 32 33 21 A8 04 30 31
.byte $32, $33, $21, $B5, $04, $30, $31, $32 ; $1E51: 32 33 21 B5 04 30 31 32
.byte $33, $00, $22, $64, $02, $30, $33, $22 ; $1E59: 33 00 22 64 02 30 33 22
.byte $08, $02, $30, $33, $21, $AC, $02, $30 ; $1E61: 08 02 30 33 21 AC 02 30
.byte $33, $21, $B4, $02, $30, $33, $22, $18 ; $1E69: 33 21 B4 02 30 33 22 18
.byte $02, $30, $33, $22, $7C, $02, $30, $33 ; $1E71: 02 30 33 22 7C 02 30 33
.byte $00, $10, $C8, $48, $38, $FF, $B8, $CF ; $1E79: 00 10 C8 48 38 FF B8 CF
.byte $CF, $8F, $E0, $E0, $98, $10, $C4, $48 ; $1E81: CF 8F E0 E0 98 10 C4 48
.byte $B8, $28, $3C, $FF, $B8, $E8, $58, $CF ; $1E89: B8 28 3C FF B8 E8 58 CF
.byte $CF, $8F, $4F, $57, $E0, $E0, $98, $58 ; $1E91: CF 8F 4F 57 E0 E0 98 58
.byte $60, $10, $FF, $DF, $EC, $10, $C8, $80 ; $1E99: 60 10 FF DF EC 10 C8 80
.byte $30, $B8, $60, $90, $38, $FF, $98, $48 ; $1EA1: 30 B8 60 90 38 FF 98 48
.byte $D0, $78, $A8, $CF, $CF, $5F, $87, $8F ; $1EA9: D0 78 A8 CF CF 5F 87 8F
.byte $97, $B7, $E0, $E0, $68, $90, $98, $A0 ; $1EB1: 97 B7 E0 E0 68 90 98 A0
.byte $C0, $10, $C8, $58, $68, $C8, $28, $50 ; $1EB9: C0 10 C8 58 68 C8 28 50
.byte $98, $38, $FF, $70, $78, $D0, $30, $68 ; $1EC1: 98 38 FF 70 78 D0 30 68
.byte $B0, $CF, $CF, $2F, $57, $4F, $67, $A7 ; $1EC9: B0 CF CF 2F 57 4F 67 A7
.byte $A7, $E0, $E0, $38, $6C, $6C, $7C, $B0 ; $1ED1: A7 E0 E0 38 6C 6C 7C B0
.byte $B0, $10, $C8, $12, $DA, $BA, $9A, $5A ; $1ED9: B0 10 C8 12 DA BA 9A 5A
.byte $3A, $1A, $7A, $38, $FF, $1E, $E6, $C6 ; $1EE1: 3A 1A 7A 38 FF 1E E6 C6
.byte $A6, $66, $46, $26, $96, $CF, $CF, $37 ; $1EE9: A6 66 46 26 96 CF CF 37
.byte $37, $4F, $5F, $7F, $8F, $9F, $AF, $E0 ; $1EF1: 37 4F 5F 7F 8F 9F AF E0
.byte $E0, $40, $40, $58, $68, $88, $98, $A8 ; $1EF9: E0 40 40 58 68 88 98 A8
.byte $B8, $10, $C8, $52, $92, $38, $FF, $66 ; $1F01: B8 10 C8 52 92 38 FF 66
.byte $A6, $CF, $CF, $AF, $AF, $E0, $E0, $B8 ; $1F09: A6 CF CF AF AF E0 E0 B8
.byte $B8, $10, $C8, $40, $A0, $28, $D0, $60 ; $1F11: B8 10 C8 40 A0 28 D0 60
.byte $38, $FF, $60, $C0, $30, $D8, $90, $CF ; $1F19: 38 FF 60 C0 30 D8 90 CF
.byte $CF, $3F, $3F, $67, $67, $97, $E0, $E0 ; $1F21: CF 3F 3F 67 67 97 E0 E0
.byte $48, $48, $88, $88, $A0, $10, $C8, $50 ; $1F29: 48 48 88 88 A0 10 C8 50
.byte $C8, $88, $40, $70, $D0, $88, $48, $38 ; $1F31: C8 88 40 70 D0 88 48 38
.byte $FF, $60, $E0, $98, $58, $90, $D8, $90 ; $1F39: FF 60 E0 98 58 90 D8 90
.byte $50, $CF, $CF, $37, $37, $5F, $87, $B7 ; $1F41: 50 CF CF 37 37 5F 87 B7
.byte $3C, $64, $8C, $E0, $E0, $40, $40, $68 ; $1F49: 3C 64 8C E0 E0 40 40 68
.byte $90, $C0, $60, $80, $A8, $10, $C8, $20 ; $1F51: 90 C0 60 80 A8 10 C8 20
.byte $C0, $40, $A8, $60, $98, $38, $FF, $40 ; $1F59: C0 40 A8 60 98 38 FF 40
.byte $E0, $60, $C8, $68, $A0, $CF, $CF, $37 ; $1F61: E0 60 C8 68 A0 CF CF 37
.byte $37, $67, $67, $97, $97, $E0, $E0, $40 ; $1F69: 37 67 67 97 97 E0 E0 40
.byte $40, $70, $70, $B0, $B0, $10, $C8, $20 ; $1F71: 40 70 70 B0 B0 10 C8 20
.byte $40, $60, $A0, $C0, $E0, $38, $FF, $30 ; $1F79: 40 60 A0 C0 E0 38 FF 30
.byte $50, $70, $B0, $D0, $F0, $CF, $CF, $97 ; $1F81: 50 70 B0 D0 F0 CF CF 97
.byte $7F, $67, $67, $7F, $97, $E0, $E0, $A0 ; $1F89: 7F 67 67 7F 97 E0 E0 A0
.byte $88, $70, $70, $88, $A0, $03, $58, $78 ; $1F91: 88 70 70 88 A0 03 58 78
.byte $04, $78, $78, $04, $98, $78, $04, $05 ; $1F99: 04 78 78 04 98 78 04 05
.byte $C8, $38, $05, $38, $40, $05, $58, $78 ; $1FA1: C8 38 05 38 40 05 58 78
.byte $04, $78, $78, $04, $98, $78, $04, $00 ; $1FA9: 04 78 78 04 98 78 04 00
.byte $05, $94, $A0, $06, $84, $48, $05, $34 ; $1FB1: 05 94 A0 06 84 48 05 34
.byte $70, $04, $64, $80, $04, $BC, $78, $04 ; $1FB9: 70 04 64 80 04 BC 78 04
.byte $06, $5C, $18, $06, $24, $50, $05, $64 ; $1FC1: 06 5C 18 06 24 50 05 64
.byte $40, $05, $C4, $38, $05, $54, $90, $04 ; $1FC9: 40 05 C4 38 05 54 90 04
.byte $9C, $90, $04, $06, $10, $20, $06, $D8 ; $1FD1: 9C 90 04 06 10 20 06 D8
.byte $20, $06, $B8, $38, $05, $98, $48, $05 ; $1FD9: 20 06 B8 38 05 98 48 05
.byte $58, $68, $05, $38, $78, $04, $05, $54 ; $1FE1: 58 68 05 38 78 04 05 54
.byte $98, $05, $94, $98, $05, $6C, $39, $06 ; $1FE9: 98 05 94 98 05 6C 39 06
.byte $94, $31, $06, $BC, $59, $06, $05, $50 ; $1FF1: 94 31 06 BC 59 06 05 50
.byte $28, $06, $A8, $28, $06, $24, $50, $06 ; $1FF9: 28 06 A8 28 06 24 50 06
.byte $CC, $50, $06, $70, $80, $04, $05, $50 ; $2001: CC 50 06 70 80 04 05 50
.byte $20, $06, $C8, $20, $06, $84, $48, $05 ; $2009: 20 06 C8 20 06 84 48 05
.byte $44, $70, $05, $78, $A0, $04, $06, $28 ; $2011: 44 70 05 78 A0 04 06 28
.byte $20, $06, $C8, $20, $06, $48, $50, $05 ; $2019: 20 06 C8 20 06 48 50 05
.byte $B0, $50, $05, $5C, $80, $04, $94, $80 ; $2021: B0 50 05 5C 80 04 94 80
.byte $04, $06, $20, $80, $04, $40, $68, $05 ; $2029: 04 06 20 80 04 40 68 05
.byte $60, $50, $06, $A0, $50, $06, $C0, $68 ; $2031: 60 50 06 A0 50 06 C0 68
.byte $05, $E0, $80, $04 ; $2039: 05 E0 80 04
StageObjectPointerData:
.byte $08, $08, $F0, $08, $08, $00, $00, $00 ; $203D: 08 08 F0 08 08 00 00 00
.byte $00, $08, $08, $08, $00, $00, $01, $08 ; $2045: 00 08 08 08 00 00 01 08
.byte $08, $09, $00, $00, $FF, $08, $08, $07 ; $204D: 08 09 00 00 FF 08 08 07
.byte $FE, $00, $00, $06, $08, $08, $02, $00 ; $2055: FE 00 00 06 08 08 02 00
.byte $00, $0A, $08, $08, $02, $00, $01, $0A ; $205D: 00 0A 08 08 02 00 01 0A
.byte $08, $09, $04, $00, $00, $0C, $08, $08 ; $2065: 08 09 04 00 00 0C 08 08
.byte $00, $00, $FE, $08, $08, $06, $FD, $FD ; $206D: 00 00 FE 08 08 06 FD FD
.byte $FD, $05, $05, $05, $08, $08, $08, $00 ; $2075: FD 05 05 05 08 08 08 00
.byte $00, $00, $08, $08, $07, $00, $00, $FF ; $207D: 00 00 08 08 07 00 00 FF
.byte $08, $08, $09, $00, $00, $01, $0A, $08 ; $2085: 08 08 09 00 00 01 0A 08
.byte $08, $02, $00, $00, $06, $08, $08, $FE ; $208D: 08 02 00 00 06 08 08 FE
.byte $00, $00, $06, $08, $07, $FE, $00, $FF ; $2095: 00 00 06 08 07 FE 00 FF
.byte $04, $08, $08, $FC, $00, $00, $08, $08 ; $209D: 04 08 08 FC 00 00 08 08
.byte $0A, $00, $00, $02, $0B, $0B, $0B, $03 ; $20A5: 0A 00 00 02 0B 0B 0B 03
.byte $03, $03, $00, $00, $01, $02, $03, $04 ; $20AD: 03 03 00 00 01 02 03 04
.byte $05, $00, $00, $01, $02, $03, $06, $07 ; $20B5: 05 00 00 01 02 03 06 07
.byte $00, $00, $01, $02, $03, $06, $08, $00 ; $20BD: 00 00 01 02 03 06 08 00
.byte $09, $0A, $02, $0B, $0C, $05, $00, $00 ; $20C5: 09 0A 02 0B 0C 05 00 00
.byte $01, $02, $03, $04, $05, $00, $00, $01 ; $20CD: 01 02 03 04 05 00 00 01
.byte $02, $0D, $0E, $05, $00, $1A, $1B, $1C ; $20D5: 02 0D 0E 05 00 1A 1B 1C
.byte $1D, $1E, $1F, $01, $1A, $1B, $20, $1D ; $20DD: 1D 1E 1F 01 1A 1B 20 1D
.byte $1E, $FC, $00, $1A, $21, $22, $1D, $23 ; $20E5: 1E FC 00 1A 21 22 1D 23
.byte $24, $00, $00, $38, $35, $0D, $39, $37 ; $20ED: 24 00 00 38 35 0D 39 37
.byte $00, $00, $34, $35, $03, $36, $37, $00 ; $20F5: 00 00 34 35 03 36 37 00
.byte $09, $3A, $35, $0B, $3B, $37, $00, $CE ; $20FD: 09 3A 35 0B 3B 37 00 CE
.byte $CF, $D0, $D1, $D2, $D3, $00, $25, $26 ; $2105: CF D0 D1 D2 D3 00 25 26
.byte $27, $28, $29, $2A, $01, $28, $29, $2C ; $210D: 27 28 29 2A 01 28 29 2C
.byte $25, $26, $2B, $00, $4C, $CC, $02, $4D ; $2115: 25 26 2B 00 4C CC 02 4D
.byte $CD, $05, $00, $4C, $2F, $22, $4D, $30 ; $211D: CD 05 00 4C 2F 22 4D 30
.byte $24, $07, $4C, $2F, $35, $4D, $30, $37 ; $2125: 24 07 4C 2F 35 4D 30 37
.byte $02, $4C, $2F, $27, $4D, $30, $2A, $07 ; $212D: 02 4C 2F 27 4D 30 2A 07
.byte $4C, $2F, $2B, $4D, $30, $2C, $00, $0F ; $2135: 4C 2F 2B 4D 30 2C 00 0F
.byte $10, $02, $11, $12, $05, $00, $0F, $10 ; $213D: 10 02 11 12 05 00 0F 10
.byte $02, $11, $19, $07, $00, $0F, $10, $02 ; $2145: 02 11 19 07 00 0F 10 02
.byte $11, $19, $08, $00, $13, $14, $02, $15 ; $214D: 11 19 08 00 13 14 02 15
.byte $16, $05, $00, $0F, $10, $02, $11, $12 ; $2155: 16 05 00 0F 10 02 11 12
.byte $05, $03, $13, $17, $02, $15, $18, $05 ; $215D: 05 03 13 17 02 15 18 05
.byte $04, $13, $2D, $1C, $15, $2E, $1F, $05 ; $2165: 04 13 2D 1C 15 2E 1F 05
.byte $13, $2D, $20, $15, $2E, $FC, $04, $13 ; $216D: 13 2D 20 15 2E FC 04 13
.byte $2F, $22, $15, $30, $24, $00, $13, $3C ; $2175: 2F 22 15 30 24 00 13 3C
.byte $35, $15, $3D, $37, $00, $0F, $40, $35 ; $217D: 35 15 3D 37 00 0F 40 35
.byte $11, $41, $37, $03, $13, $3E, $35, $15 ; $2185: 11 41 37 03 13 3E 35 15
.byte $3F, $37, $00, $D4, $D5, $D0, $D6, $D7 ; $218D: 3F 37 00 D4 D5 D0 D6 D7
.byte $D3, $00, $25, $31, $27, $32, $33, $2A ; $2195: D3 00 25 31 27 32 33 2A
.byte $02, $25, $31, $27, $32, $33, $2A, $00 ; $219D: 02 25 31 27 32 33 2A 00
.byte $FC, $48, $42, $FC, $49, $43, $00, $FC ; $21A5: FC 48 42 FC 49 43 00 FC
.byte $48, $44, $FC, $49, $45, $00, $FC, $4A ; $21AD: 48 44 FC 49 45 00 FC 4A
.byte $46, $FC, $4B, $47, $00, $FC, $A4, $A5 ; $21B5: 46 FC 4B 47 00 FC A4 A5
.byte $FC, $A6, $A7, $08, $FC, $71, $FC, $FC ; $21BD: FC A6 A7 08 FC 71 FC FC
.byte $72, $73, $08, $FC, $74, $FC, $FC, $75 ; $21C5: 72 73 08 FC 74 FC FC 75
.byte $76, $08, $FC, $71, $77, $FC, $72, $73 ; $21CD: 76 08 FC 71 77 FC 72 73
.byte $08, $FC, $74, $77, $FC, $75, $76, $08 ; $21D5: 08 FC 74 77 FC 75 76 08
.byte $FC, $71, $78, $FC, $72, $73, $08, $FC ; $21DD: FC 71 78 FC 72 73 08 FC
.byte $74, $78, $FC, $75, $76, $08, $FC, $71 ; $21E5: 74 78 FC 75 76 08 FC 71
.byte $79, $FC, $72, $73, $08, $FC, $74, $79 ; $21ED: 79 FC 72 73 08 FC 74 79
.byte $FC, $75, $76, $00, $4E, $4F, $50, $51 ; $21F5: FC 75 76 00 4E 4F 50 51
.byte $52, $53, $00, $4E, $4F, $50, $51, $5E ; $21FD: 52 53 00 4E 4F 50 51 5E
.byte $58, $00, $4E, $4F, $50, $51, $5E, $5D ; $2205: 58 00 4E 4F 50 51 5E 5D
.byte $00, $54, $55, $50, $56, $57, $53, $00 ; $220D: 00 54 55 50 56 57 53 00
.byte $4E, $4F, $50, $51, $52, $53, $00, $59 ; $2215: 4E 4F 50 51 52 53 00 59
.byte $5A, $50, $5B, $5C, $53, $00, $FC, $5F ; $221D: 5A 50 5B 5C 53 00 FC 5F
.byte $60, $FC, $61, $62, $06, $63, $64, $60 ; $2225: 60 FC 61 62 06 63 64 60
.byte $FC, $65, $62, $00, $66, $67, $60, $68 ; $222D: FC 65 62 00 66 67 60 68
.byte $69, $62, $00, $6A, $67, $60, $6B, $69 ; $2235: 69 62 00 6A 67 60 6B 69
.byte $62, $00, $FC, $6C, $6D, $FC, $6E, $6F ; $223D: 62 00 FC 6C 6D FC 6E 6F
.byte $00, $FC, $6C, $6D, $FC, $6E, $70 ; $2245: 00 FC 6C 6D FC 6E 70
StageBoundaryDataA:
.byte $AF, $B6, $BD, $B6, $C4, $CB, $D2, $CB ; $224C: AF B6 BD B6 C4 CB D2 CB
.byte $D9, $E0, $E7, $E0, $EE, $F5, $FC, $F5 ; $2254: D9 E0 E7 E0 EE F5 FC F5
.byte $0A, $0A, $0A, $0A, $11, $11, $11, $11 ; $225C: 0A 0A 0A 0A 11 11 11 11
.byte $18, $18, $18, $18, $1F, $1F, $1F, $1F ; $2264: 18 18 18 18 1F 1F 1F 1F
.byte $26, $26, $26, $26, $2D, $2D, $2D, $2D ; $226C: 26 26 26 26 2D 2D 2D 2D
.byte $34, $34, $34, $34, $3B, $42, $49, $42 ; $2274: 34 34 34 34 3B 42 49 42
.byte $50, $57, $5E, $57, $65, $6C, $73, $6C ; $227C: 50 57 5E 57 65 6C 73 6C
.byte $7A, $81, $88, $81, $96, $96, $96, $96 ; $2284: 7A 81 88 81 96 96 96 96
.byte $9D, $9D, $9D, $9D, $A4, $AB, $B2, $AB ; $228C: 9D 9D 9D 9D A4 AB B2 AB
.byte $B9, $A4, $B9, $A4 ; $2294: B9 A4 B9 A4
StageBoundaryDataB:
.byte $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0 ; $2298: E0 E0 E0 E0 E0 E0 E0 E0
.byte $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0 ; $22A0: E0 E0 E0 E0 E0 E0 E0 E0
.byte $E1, $E1, $E1, $E1, $E1, $E1, $E1, $E1 ; $22A8: E1 E1 E1 E1 E1 E1 E1 E1
.byte $E1, $E1, $E1, $E1, $E1, $E1, $E1, $E1 ; $22B0: E1 E1 E1 E1 E1 E1 E1 E1
.byte $E1, $E1, $E1, $E1, $E1, $E1, $E1, $E1 ; $22B8: E1 E1 E1 E1 E1 E1 E1 E1
.byte $E1, $E1, $E1, $E1, $E1, $E1, $E1, $E1 ; $22C0: E1 E1 E1 E1 E1 E1 E1 E1
.byte $E1, $E1, $E1, $E1, $E1, $E1, $E1, $E1 ; $22C8: E1 E1 E1 E1 E1 E1 E1 E1
.byte $E1, $E1, $E1, $E1, $E1, $E1, $E1, $E1 ; $22D0: E1 E1 E1 E1 E1 E1 E1 E1
.byte $E1, $E1, $E1, $E1, $E1, $E1, $E1, $E1 ; $22D8: E1 E1 E1 E1 E1 E1 E1 E1
.byte $E1, $E1, $E1, $E1 ; $22E0: E1 E1 E1 E1
StageObjectTypeData:
.byte $81, $81, $8F, $81, $F5, $F5, $03, $F5 ; $22E4: 81 81 8F 81 F5 F5 03 F5
StageObjectXData:
.byte $E1, $E1, $E1, $E1, $E0, $E0, $E1, $E0 ; $22EC: E1 E1 E1 E1 E0 E0 E1 E0
StageObjectYData:
.byte $F8, $FF, $06, $FF, $0D, $14, $1B, $14 ; $22F4: F8 FF 06 FF 0D 14 1B 14
.byte $3E, $3E, $22, $29, $30, $30, $30, $30 ; $22FC: 3E 3E 22 29 30 30 30 30
.byte $C0, $C0, $C0, $C0, $C0, $C7, $C0, $C7 ; $2304: C0 C0 C0 C0 C0 C7 C0 C7
.byte $CE, $D5, $CE, $D5, $DC, $E3, $DC, $E3 ; $230C: CE D5 CE D5 DC E3 DC E3
.byte $EA, $F1, $EA, $F1, $3E, $45, $3E, $45 ; $2314: EA F1 EA F1 3E 45 3E 45
.byte $37, $37, $37, $37 ; $231C: 37 37 37 37
StageObjectAttributeData:
.byte $E1, $E1, $E2, $E1, $E2, $E2, $E2, $E2 ; $2320: E1 E1 E2 E1 E2 E2 E2 E2
.byte $E2, $E2, $E2, $E2, $E2, $E2, $E2, $E2 ; $2328: E2 E2 E2 E2 E2 E2 E2 E2
.byte $E1, $E1, $E1, $E1, $E1, $E1, $E1, $E1 ; $2330: E1 E1 E1 E1 E1 E1 E1 E1
.byte $E1, $E1, $E1, $E1, $E1, $E1, $E1, $E1 ; $2338: E1 E1 E1 E1 E1 E1 E1 E1
.byte $E1, $E1, $E1, $E1, $E2, $E2, $E2, $E2 ; $2340: E1 E1 E1 E1 E2 E2 E2 E2
.byte $E2, $E2, $E2, $E2 ; $2348: E2 E2 E2 E2
StageObjectDataTableA:
.byte $44, $2C, $00 ; $234C: 44 2C 00
StageObjectDataTableB:
.byte $00, $00, $04 ; $234F: 00 00 04
StageObjectDataTableC:
.byte $24, $08, $00, $00, $FC, $FC, $FE, $FC ; $2352: 24 08 00 00 FC FC FE FC
.byte $00, $7B, $FC, $FC, $7C, $FC, $FC, $00 ; $235A: 00 7B FC FC 7C FC FC 00
.byte $7D, $7E, $FC, $7F, $80, $FC, $00, $81 ; $2362: 7D 7E FC 7F 80 FC 00 81
.byte $82, $83, $84, $85, $86, $00, $87, $88 ; $236A: 82 83 84 85 86 00 87 88
.byte $FC, $89, $8A, $FC, $00, $8B, $8C, $FC ; $2372: FC 89 8A FC 00 8B 8C FC
.byte $8D, $8E, $FC, $00, $8F, $90, $FC, $FC ; $237A: 8D 8E FC 00 8F 90 FC FC
.byte $FC, $FC ; $2382: FC FC
StageObjectDataTableD:
.byte $55, $5A, $61, $68, $6F, $76, $7D ; $2384: 55 5A 61 68 6F 76 7D
StageObjectDataTableE:
.byte $E3, $E3, $E3, $E3, $E3, $E3, $E3 ; $238B: E3 E3 E3 E3 E3 E3 E3
StageSetupPointerLoTable:
.byte $20, $38, $50, $68, $80, $98, $B0, $C8 ; $2392: 20 38 50 68 80 98 B0 C8
.byte $08 ; $239A: 08
StageSetupPointerHiTable:
.byte $20, $38, $C8, $B0, $98, $80, $68, $50 ; $239B: 20 38 C8 B0 98 80 68 50
.byte $08 ; $23A3: 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 ; $23A4: BD 92 E3
sta $1F ; $23A7: 85 1F
lda $19 ; $23A9: A5 19
lsr a ; $23AB: 4A
bcc Label_E3B3 ; $23AC: 90 05
lda StageSetupPointerHiTable,x ; $23AE: BD 9B E3
sta $1F ; $23B1: 85 1F
Label_E3B3:
lda #$02 ; $23B3: A9 02
sta $20 ; $23B5: 85 20
lda $88,x ; $23B7: B5 88
bpl Label_E3CF ; $23B9: 10 14
cmp #$FF ; $23BB: C9 FF
beq Label_E3C2 ; $23BD: F0 03
jmp RenderLargeObjectSprites ; $23BF: 4C D5 E4
Label_E3C2:
ldy #$14 ; $23C2: A0 14
Label_E3C4:
lda #$F0 ; $23C4: A9 F0
sta ($1F),y ; $23C6: 91 1F
dey ; $23C8: 88
dey ; $23C9: 88
dey ; $23CA: 88
dey ; $23CB: 88
bpl Label_E3C4 ; $23CC: 10 F6
rts ; $23CE: 60
Label_E3CF:
cpx #$08 ; $23CF: E0 08
beq Label_E41B ; $23D1: F0 48
lda $7F,x ; $23D3: B5 7F
asl a ; $23D5: 0A
asl a ; $23D6: 0A
adc $0436,x ; $23D7: 7D 36 04
cpx #$02 ; $23DA: E0 02
bcs Label_E408 ; $23DC: B0 2A
ldy $88,x ; $23DE: B4 88
adc $E34C,y ; $23E0: 79 4C E3
tay ; $23E3: A8
lda $E24C,y ; $23E4: B9 4C E2
sta $1D ; $23E7: 85 1D
lda $E298,y ; $23E9: B9 98 E2
sta $1E ; $23EC: 85 1E
lda $BD,x ; $23EE: B5 BD
beq Label_E429 ; $23F0: F0 37
ldy $88,x ; $23F2: B4 88
lda $E34F,y ; $23F4: B9 4F E3
adc $0436,x ; $23F7: 7D 36 04
tay ; $23FA: A8
lda $E2E4,y ; $23FB: B9 E4 E2
sta $1D ; $23FE: 85 1D
lda $E2EC,y ; $2400: B9 EC E2
sta $1E ; $2403: 85 1E
jmp Label_E429 ; $2405: 4C 29 E4
Label_E408:
ldy $88,x ; $2408: B4 88
clc ; $240A: 18
adc $E352,y ; $240B: 79 52 E3
tay ; $240E: A8
lda $E2F4,y ; $240F: B9 F4 E2
sta $1D ; $2412: 85 1D
lda $E320,y ; $2414: B9 20 E3
sta $1E ; $2417: 85 1E
bne Label_E429 ; $2419: D0 0E
Label_E41B:
ldy $7F,x ; $241B: B4 7F
bmi Label_E3C2 ; $241D: 30 A3
lda $E384,y ; $241F: B9 84 E3
sta $1D ; $2422: 85 1D
lda $E38B,y ; $2424: B9 8B E3
sta $1E ; $2427: 85 1E
Label_E429:
lda $91,x ; $2429: B5 91
sta $15 ; $242B: 85 15
lda $9A,x ; $242D: B5 9A
sta $12 ; $242F: 85 12
txa ; $2431: 8A
beq Label_E444 ; $2432: F0 10
cpx #$01 ; $2434: E0 01
bne Label_E43C ; $2436: D0 04
lda #$01 ; $2438: A9 01
bne Label_E444 ; $243A: D0 08
Label_E43C:
lda $0451,x ; $243C: BD 51 04
clc ; $243F: 18
adc #$02 ; $2440: 69 02
and #$03 ; $2442: 29 03
Label_E444:
ldy $0448,x ; $2444: BC 48 04
beq Label_E44B ; $2447: F0 02
ora #$40 ; $2449: 09 40
Label_E44B:
ldy $88,x ; $244B: B4 88
cpy #$02 ; $244D: C0 02
bne Label_E459 ; $244F: D0 08
ldy $7F,x ; $2451: B4 7F
cpy #$05 ; $2453: C0 05
bne Label_E459 ; $2455: D0 02
eor #$40 ; $2457: 49 40
Label_E459:
ldy $9A,x ; $2459: B4 9A
cpy #$C9 ; $245B: C0 C9
bcs Label_E463 ; $245D: B0 04
cpx #$09 ; $245F: E0 09
bne Label_E465 ; $2461: D0 02
Label_E463:
ora #$20 ; $2463: 09 20
Label_E465:
sta $14 ; $2465: 85 14
lda #$43 ; $2467: A9 43
sta $21 ; $2469: 85 21
lda #$E0 ; $246B: A9 E0
sta $22 ; $246D: 85 22
lda $0448,x ; $246F: BD 48 04
beq Label_E47C ; $2472: F0 08
lda #$79 ; $2474: A9 79
sta $21 ; $2476: 85 21
lda #$E0 ; $2478: A9 E0
sta $22 ; $247A: 85 22
Label_E47C:
ldy #$00 ; $247C: A0 00
lda ($1D),y ; $247E: B1 1D
inc $1D ; $2480: E6 1D
bne Label_E486 ; $2482: D0 02
inc $1E ; $2484: E6 1E
Label_E486:
asl a ; $2486: 0A
sta $13 ; $2487: 85 13
asl a ; $2489: 0A
adc $13 ; $248A: 65 13
adc $21 ; $248C: 65 21
sta $21 ; $248E: 85 21
bcc Label_E494 ; $2490: 90 02
inc $22 ; $2492: E6 22
Label_E494:
txa ; $2494: 8A
pha ; $2495: 48
ldx #$05 ; $2496: A2 05
ldy #$00 ; $2498: A0 00
Label_E49A:
lda $12 ; $249A: A5 12
clc ; $249C: 18
adc $E03D,x ; $249D: 7D 3D E0
sta ($1F),y ; $24A0: 91 1F
sta $12 ; $24A2: 85 12
iny ; $24A4: C8
sty $13 ; $24A5: 84 13
ldy #$00 ; $24A7: A0 00
lda ($1D),y ; $24A9: B1 1D
inc $1D ; $24AB: E6 1D
bne Label_E4B1 ; $24AD: D0 02
inc $1E ; $24AF: E6 1E
Label_E4B1:
ldy $13 ; $24B1: A4 13
sta ($1F),y ; $24B3: 91 1F
iny ; $24B5: C8
lda $14 ; $24B6: A5 14
sta ($1F),y ; $24B8: 91 1F
iny ; $24BA: C8
sty $13 ; $24BB: 84 13
ldy #$00 ; $24BD: A0 00
lda $15 ; $24BF: A5 15
clc ; $24C1: 18
adc ($21),y ; $24C2: 71 21
inc $21 ; $24C4: E6 21
bne Label_E4CA ; $24C6: D0 02
inc $22 ; $24C8: E6 22
Label_E4CA:
ldy $13 ; $24CA: A4 13
sta ($1F),y ; $24CC: 91 1F
iny ; $24CE: C8
dex ; $24CF: CA
bpl Label_E49A ; $24D0: 10 C8
pla ; $24D2: 68
tax ; $24D3: AA
rts ; $24D4: 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 ; $24D5: 8A
pha ; $24D6: 48
ldy $1F ; $24D7: A4 1F
lda $9A,x ; $24D9: B5 9A
sta $0200,y ; $24DB: 99 00 02
sta $0204,y ; $24DE: 99 04 02
clc ; $24E1: 18
adc #$08 ; $24E2: 69 08
sta $0208,y ; $24E4: 99 08 02
sta $020C,y ; $24E7: 99 0C 02
lda #$F0 ; $24EA: A9 F0
sta $0210,y ; $24EC: 99 10 02
sta $0214,y ; $24EF: 99 14 02
lda $91,x ; $24F2: B5 91
sta $0203,y ; $24F4: 99 03 02
sta $020B,y ; $24F7: 99 0B 02
clc ; $24FA: 18
adc #$08 ; $24FB: 69 08
sta $0207,y ; $24FD: 99 07 02
sta $020F,y ; $2500: 99 0F 02
lda $9A,x ; $2503: B5 9A
cmp #$D0 ; $2505: C9 D0
lda #$03 ; $2507: A9 03
bcc Label_E50D ; $2509: 90 02
lda #$23 ; $250B: A9 23
Label_E50D:
sta $0202,y ; $250D: 99 02 02
lda $7F,x ; $2510: B5 7F
bne Label_E553 ; $2512: D0 3F
lda $0202,y ; $2514: B9 02 02
sta $0206,y ; $2517: 99 06 02
sta $020A,y ; $251A: 99 0A 02
sta $020E,y ; $251D: 99 0E 02
lda #$DA ; $2520: A9 DA
sta $0201,y ; $2522: 99 01 02
lda #$DB ; $2525: A9 DB
sta $0205,y ; $2527: 99 05 02
lda #$DC ; $252A: A9 DC
sta $0209,y ; $252C: 99 09 02
lda #$DD ; $252F: A9 DD
sta $020D,y ; $2531: 99 0D 02
ldx $1F ; $2534: A6 1F
lda $19 ; $2536: A5 19
and #$20 ; $2538: 29 20
beq Label_E550 ; $253A: F0 14
lda $19 ; $253C: A5 19
and #$40 ; $253E: 29 40
bne Label_E54A ; $2540: D0 08
inc $0200,x ; $2542: FE 00 02
inc $0204,x ; $2545: FE 04 02
bne Label_E550 ; $2548: D0 06
Label_E54A:
inc $0203,x ; $254A: FE 03 02
inc $020B,x ; $254D: FE 0B 02
Label_E550:
pla ; $2550: 68
tax ; $2551: AA
rts ; $2552: 60
Label_E553:
lda $0202,y ; $2553: B9 02 02
ora #$40 ; $2556: 09 40
sta $0206,y ; $2558: 99 06 02
ora #$80 ; $255B: 09 80
sta $020E,y ; $255D: 99 0E 02
and #$BF ; $2560: 29 BF
sta $020A,y ; $2562: 99 0A 02
lda #$DE ; $2565: A9 DE
sta $0201,y ; $2567: 99 01 02
sta $0205,y ; $256A: 99 05 02
sta $0209,y ; $256D: 99 09 02
sta $020D,y ; $2570: 99 0D 02
dec $045A,x ; $2573: DE 5A 04
bpl Label_E584 ; $2576: 10 0C
lda #$FF ; $2578: A9 FF
sta $88,x ; $257A: 95 88
lda #$F0 ; $257C: A9 F0
sta $9A,x ; $257E: 95 9A
lda #$04 ; $2580: A9 04
sta $F1 ; $2582: 85 F1
Label_E584:
pla ; $2584: 68
tax ; $2585: AA
rts ; $2586: 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 ; $2587: A6 BB
bmi Label_E5C4 ; $2589: 30 39
lda OverlaySpriteStreamLoTable,x ; $258B: BD C5 E5
sta $1D ; $258E: 85 1D
lda OverlaySpriteStreamHiTable,x ; $2590: BD CA E5
sta $1E ; $2593: 85 1E
ldy #$00 ; $2595: A0 00
ldx #$00 ; $2597: A2 00
Label_E599:
lda ($1D),y ; $2599: B1 1D
sta $02E0,x ; $259B: 9D E0 02
iny ; $259E: C8
inx ; $259F: E8
cmp #$F0 ; $25A0: C9 F0
bne Label_E5A7 ; $25A2: D0 03
inx ; $25A4: E8
inx ; $25A5: E8
inx ; $25A6: E8
Label_E5A7:
cpx #$10 ; $25A7: E0 10
bne Label_E599 ; $25A9: D0 EE
ldy #$0F ; $25AB: A0 0F
Label_E5AD:
lda $02E0,y ; $25AD: B9 E0 02
clc ; $25B0: 18
adc $BC ; $25B1: 65 BC
sta $02E0,y ; $25B3: 99 E0 02
dey ; $25B6: 88
dey ; $25B7: 88
dey ; $25B8: 88
dey ; $25B9: 88
bpl Label_E5AD ; $25BA: 10 F1
lda $19 ; $25BC: A5 19
and #$03 ; $25BE: 29 03
bne Label_E5C4 ; $25C0: D0 02
dec $BB ; $25C2: C6 BB
Label_E5C4:
rts ; $25C4: 60
; Rendering streams and object motion/physics lookup data
OverlaySpriteStreamLoTable:
.byte $FD, $ED, $E0, $D6, $CF ; $25C5: FD ED E0 D6 CF
OverlaySpriteStreamHiTable:
.byte $E5, $E5, $E5, $E5, $E5, $D0, $AE, $03 ; $25CA: E5 E5 E5 E5 E5 D0 AE 03
.byte $04, $F0, $F0, $F0, $C8, $AF, $03, $04 ; $25D2: 04 F0 F0 F0 C8 AF 03 04
.byte $D0, $B0, $03, $04, $F0, $F0, $C8, $B1 ; $25DA: D0 B0 03 04 F0 F0 C8 B1
.byte $03, $FC, $C8, $B2, $03, $04, $D0, $B3 ; $25E2: 03 FC C8 B2 03 04 D0 B3
.byte $03, $04, $F0, $C8, $B4, $03, $00, $C8 ; $25EA: 03 04 F0 C8 B4 03 00 C8
.byte $B4, $43, $08, $D0, $B5, $03, $00, $D0 ; $25F2: B4 43 08 D0 B5 03 00 D0
.byte $B5, $43, $08, $F0, $F0, $F0, $F0 ; $25FA: B5 43 08 F0 F0 F0 F0
ObjectAccelerationTableA:
.byte $04, $04, $05, $06, $03, $03, $03, $06 ; $2601: 04 04 05 06 03 03 03 06
.byte $0A, $0A, $0A, $0A ; $2609: 0A 0A 0A 0A
ObjectAccelerationTableB:
.byte $28, $32, $46, $78, $00, $00, $00, $64 ; $260D: 28 32 46 78 00 00 00 64
.byte $00, $00, $00, $00 ; $2615: 00 00 00 00
ObjectVelocityTableA:
.byte $0A, $1E, $32, $70, $00, $00, $00, $70 ; $2619: 0A 1E 32 70 00 00 00 70
.byte $00, $00, $00, $00 ; $2621: 00 00 00 00
ObjectVelocityTableB:
.byte $14, $3C, $64, $A0, $00, $00, $00, $A0 ; $2625: 14 3C 64 A0 00 00 00 A0
.byte $00, $00, $00, $00 ; $262D: 00 00 00 00
ObjectVelocityTableC:
.byte $70, $B0, $E0, $40, $80, $80, $80, $40 ; $2631: 70 B0 E0 40 80 80 80 40
.byte $00, $00, $00, $00 ; $2639: 00 00 00 00
ObjectVelocityTableD:
.byte $00, $00, $00, $01, $00, $00, $00, $01 ; $263D: 00 00 00 01 00 00 00 01
.byte $00, $00, $00, $00 ; $2645: 00 00 00 00
ObjectVelocityTableE:
.byte $90, $50, $20, $C0, $80, $80, $80, $C0 ; $2649: 90 50 20 C0 80 80 80 C0
.byte $00, $00, $00, $00 ; $2651: 00 00 00 00
ObjectVelocityTableF:
.byte $FF, $FF, $FF, $FE, $FF, $FF, $FF, $FE ; $2655: FF FF FF FE FF FF FF FE
.byte $00, $00, $00, $00 ; $265D: 00 00 00 00
ObjectMotionTableA:
.byte $50, $90, $C0, $40, $40, $40, $40, $40 ; $2661: 50 90 C0 40 40 40 40 40
.byte $00, $00, $00, $00 ; $2669: 00 00 00 00
ObjectMotionTableB:
.byte $00, $00, $00, $01, $00, $00, $00, $01 ; $266D: 00 00 00 01 00 00 00 01
.byte $02, $02, $02, $02 ; $2675: 02 02 02 02
ObjectMotionTableC:
.byte $B0, $70, $40, $C0, $C0, $C0, $C0, $C0 ; $2679: B0 70 40 C0 C0 C0 C0 C0
.byte $C0, $C0, $C0, $C0 ; $2681: C0 C0 C0 C0
ObjectMotionTableD:
.byte $FF, $FF, $FF, $FE, $FF, $FF, $FF, $FE ; $2685: FF FF FF FE FF FF FF FE
.byte $FE, $01, $FE, $FE ; $268D: 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 ; $2691: 20 25 EE
ldx #$07 ; $2694: A2 07
Label_E696:
lda $88,x ; $2696: B5 88
bpl Label_E6A4 ; $2698: 10 0A
cmp #$FF ; $269A: C9 FF
beq Label_E6E2 ; $269C: F0 44
jsr $ECBA ; $269E: 20 BA EC
jmp Label_E6E2 ; $26A1: 4C E2 E6
Label_E6A4:
cpx #$02 ; $26A4: E0 02
bcc Label_E6B8 ; $26A6: 90 10
cmp #$01 ; $26A8: C9 01
bne Label_E6B8 ; $26AA: D0 0C
lda $7F,x ; $26AC: B5 7F
cmp #$02 ; $26AE: C9 02
bcs Label_E6B8 ; $26B0: B0 06
lda $F1 ; $26B2: A5 F1
ora #$20 ; $26B4: 09 20
sta $F1 ; $26B6: 85 F1
Label_E6B8:
dec $043F,x ; $26B8: DE 3F 04
bne Label_E6D9 ; $26BB: D0 1C
lda #$03 ; $26BD: A9 03
sta $043F,x ; $26BF: 9D 3F 04
cpx #$02 ; $26C2: E0 02
bcs Label_E6CE ; $26C4: B0 08
dec $BF,x ; $26C6: D6 BF
bne Label_E6CE ; $26C8: D0 04
lda #$00 ; $26CA: A9 00
sta $BD,x ; $26CC: 95 BD
Label_E6CE:
jsr $EA18 ; $26CE: 20 18 EA
stx $3E ; $26D1: 86 3E
jsr $EBC4 ; $26D3: 20 C4 EB
jsr $E796 ; $26D6: 20 96 E7
Label_E6D9:
jsr $EA58 ; $26D9: 20 58 EA
jsr $ED28 ; $26DC: 20 28 ED
jsr $E983 ; $26DF: 20 83 E9
Label_E6E2:
jsr $E3A4 ; $26E2: 20 A4 E3
dex ; $26E5: CA
bpl Label_E696 ; $26E6: 10 AE
rts ; $26E8: 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 ; $26E9: E0 02
bcs Label_E705 ; $26EB: B0 18
lda $19 ; $26ED: A5 19
and #$0F ; $26EF: 29 0F
bne Label_E6F8 ; $26F1: D0 05
jsr $F1B3 ; $26F3: 20 B3 F1
sta $31,x ; $26F6: 95 31
Label_E6F8:
lda $3A ; $26F8: A5 3A
bne Label_E705 ; $26FA: D0 09
jsr $E76A ; $26FC: 20 6A E7
lda $061C,x ; $26FF: BD 1C 06
sta $31,x ; $2702: 95 31
Label_E704:
rts ; $2704: 60
Label_E705:
lda $9A,x ; $2705: B5 9A
cmp #$A0 ; $2707: C9 A0
bcc Label_E712 ; $2709: 90 07
lda $31,x ; $270B: B5 31
ora #$40 ; $270D: 09 40
sta $31,x ; $270F: 95 31
rts ; $2711: 60
Label_E712:
dec $045A,x ; $2712: DE 5A 04
bne Label_E704 ; $2715: D0 ED
jsr $F1B3 ; $2717: 20 B3 F1
ldy $0451,x ; $271A: BC 51 04
and ObjectAnimationPeriodTable,y ; $271D: 39 62 E7
adc ControllerBitMaskTable,y ; $2720: 79 65 E7
sta $045A,x ; $2723: 9D 5A 04
stx $12 ; $2726: 86 12
lda $19 ; $2728: A5 19
rol a ; $272A: 2A
rol a ; $272B: 2A
eor $12 ; $272C: 45 12
and #$01 ; $272E: 29 01
tay ; $2730: A8
lda a:$0088,y ; $2731: B9 88 00
bmi Label_E749 ; $2734: 30 13
lda a:$00BD,y ; $2736: B9 BD 00
bne Label_E749 ; $2739: D0 0E
lda #$00 ; $273B: A9 00
sta $31,x ; $273D: 95 31
lda a:$009A,y ; $273F: B9 9A 00
sec ; $2742: 38
sbc #$04 ; $2743: E9 04
cmp $9A,x ; $2745: D5 9A
bcs Label_E74D ; $2747: B0 04
Label_E749:
lda #$40 ; $2749: A9 40
sta $31,x ; $274B: 95 31
Label_E74D:
lda $91,x ; $274D: B5 91
cmp a:$0091,y ; $274F: D9 91 00
bcs Label_E75B ; $2752: B0 07
lda $31,x ; $2754: B5 31
ora #$01 ; $2756: 09 01
sta $31,x ; $2758: 95 31
rts ; $275A: 60
Label_E75B:
lda $31,x ; $275B: B5 31
ora #$02 ; $275D: 09 02
sta $31,x ; $275F: 95 31
rts ; $2761: 60
; Per-object animation timer masks selected by object type/state.
ObjectAnimationPeriodTable:
.byte $1F, $0F, $07 ; $2762: 1F 0F 07
; Base timer periods paired with ObjectAnimationPeriodTable.
ObjectAnimationBasePeriodTable:
ControllerBitMaskTable:
.byte $20, $10, $08 ; $2765: 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 ; $2768: A2 00
ReadControllerPort:
lda #$01 ; $276A: A9 01
sta $4016 ; $276C: 8D 16 40
lda #$00 ; $276F: A9 00
sta $4016 ; $2771: 8D 16 40
ldy #$07 ; $2774: A0 07
Label_E776:
lda $4016,x ; $2776: BD 16 40
sta $12 ; $2779: 85 12
lsr a ; $277B: 4A
ora $12 ; $277C: 05 12
lsr a ; $277E: 4A
rol $061C,x ; $277F: 3E 1C 06
dey ; $2782: 88
bpl Label_E776 ; $2783: 10 F1
ldy $061E,x ; $2785: BC 1E 06
lda $061C,x ; $2788: BD 1C 06
sta $061E,x ; $278B: 9D 1E 06
tya ; $278E: 98
eor $061C,x ; $278F: 5D 1C 06
and $061C,x ; $2792: 3D 1C 06
rts ; $2795: 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 ; $2796: B5 88
bne Label_E7A3 ; $2798: D0 09
Label_E79A:
lda #$00 ; $279A: A9 00
sta $0424,x ; $279C: 9D 24 04
sta $042D,x ; $279F: 9D 2D 04
rts ; $27A2: 60
Label_E7A3:
cmp #$02 ; $27A3: C9 02
beq Label_E7E8 ; $27A5: F0 41
cpx #$02 ; $27A7: E0 02
bcc Label_E7E8 ; $27A9: 90 3D
lda $7F,x ; $27AB: B5 7F
cmp #$02 ; $27AD: C9 02
bcs Label_E79A ; $27AF: 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 ; $27B1: BD 24 04
sta $12 ; $27B4: 85 12
lda $042D,x ; $27B6: BD 2D 04
sta $13 ; $27B9: 85 13
jsr $F1A6 ; $27BB: 20 A6 F1
lda $0463,x ; $27BE: BD 63 04
clc ; $27C1: 18
adc $12 ; $27C2: 65 12
sta $0463,x ; $27C4: 9D 63 04
sta $12 ; $27C7: 85 12
lda $046C,x ; $27C9: BD 6C 04
adc $13 ; $27CC: 65 13
sta $046C,x ; $27CE: 9D 6C 04
sta $13 ; $27D1: 85 13
jsr $F1A6 ; $27D3: 20 A6 F1
lda $0424,x ; $27D6: BD 24 04
sec ; $27D9: 38
sbc $12 ; $27DA: E5 12
sta $0424,x ; $27DC: 9D 24 04
lda $042D,x ; $27DF: BD 2D 04
sbc $13 ; $27E2: E5 13
sta $042D,x ; $27E4: 9D 2D 04
rts ; $27E7: 60
Label_E7E8:
lda $7F,x ; $27E8: B5 7F
cmp #$06 ; $27EA: C9 06
bcc Label_E7EF ; $27EC: 90 01
rts ; $27EE: 60
Label_E7EF:
lda $7F,x ; $27EF: B5 7F
cmp #$04 ; $27F1: C9 04
bne Label_E811 ; $27F3: D0 1C
lda $31,x ; $27F5: B5 31
and #$02 ; $27F7: 29 02
beq Label_E802 ; $27F9: F0 07
lda $0448,x ; $27FB: BD 48 04
beq Label_E811 ; $27FE: F0 11
bne Label_E80D ; $2800: D0 0B
Label_E802:
lda $31,x ; $2802: B5 31
and #$01 ; $2804: 29 01
beq Label_E811 ; $2806: F0 09
lda $0448,x ; $2808: BD 48 04
bne Label_E811 ; $280B: D0 04
Label_E80D:
lda #$05 ; $280D: A9 05
sta $7F,x ; $280F: 95 7F
Label_E811:
lda $7F,x ; $2811: B5 7F
cmp #$02 ; $2813: C9 02
bne Label_E832 ; $2815: D0 1B
lda $31,x ; $2817: B5 31
and #$02 ; $2819: 29 02
beq Label_E821 ; $281B: F0 04
lda #$00 ; $281D: A9 00
beq Label_E829 ; $281F: F0 08
Label_E821:
lda $31,x ; $2821: B5 31
and #$01 ; $2823: 29 01
beq Label_E82E ; $2825: F0 07
lda #$01 ; $2827: A9 01
Label_E829:
cmp $0448,x ; $2829: DD 48 04
beq Label_E832 ; $282C: F0 04
Label_E82E:
lda #$04 ; $282E: A9 04
sta $7F,x ; $2830: 95 7F
Label_E832:
lda $7F,x ; $2832: B5 7F
cmp #$04 ; $2834: C9 04
bcc Label_E854 ; $2836: 90 1C
lda $31,x ; $2838: B5 31
and #$02 ; $283A: 29 02
beq Label_E845 ; $283C: F0 07
lda $0448,x ; $283E: BD 48 04
bne Label_E854 ; $2841: D0 11
beq Label_E850 ; $2843: F0 0B
Label_E845:
lda $31,x ; $2845: B5 31
and #$01 ; $2847: 29 01
beq Label_E854 ; $2849: F0 09
lda $0448,x ; $284B: BD 48 04
beq Label_E854 ; $284E: F0 04
Label_E850:
lda #$02 ; $2850: A9 02
sta $7F,x ; $2852: 95 7F
Label_E854:
lda $7F,x ; $2854: B5 7F
cmp #$03 ; $2856: C9 03
bne Label_E864 ; $2858: D0 0A
lda $31,x ; $285A: B5 31
and #$03 ; $285C: 29 03
beq Label_E864 ; $285E: F0 04
lda #$02 ; $2860: A9 02
sta $7F,x ; $2862: 95 7F
Label_E864:
lda $7F,x ; $2864: B5 7F
cmp #$04 ; $2866: C9 04
bcs Label_E87F ; $2868: B0 15
lda $31,x ; $286A: B5 31
and #$02 ; $286C: 29 02
beq Label_E874 ; $286E: F0 04
lda #$00 ; $2870: A9 00
beq Label_E87C ; $2872: F0 08
Label_E874:
lda $31,x ; $2874: B5 31
and #$01 ; $2876: 29 01
beq Label_E87F ; $2878: F0 05
lda #$01 ; $287A: A9 01
Label_E87C:
sta $0448,x ; $287C: 9D 48 04
Label_E87F:
lda $7F,x ; $287F: B5 7F
cmp #$04 ; $2881: C9 04
bcc Label_E8B8 ; $2883: 90 33
lda $0436,x ; $2885: BD 36 04
cmp #$01 ; $2888: C9 01
bne Label_E8B8 ; $288A: D0 2C
ldy $0451,x ; $288C: BC 51 04
lda $0448,x ; $288F: BD 48 04
beq Label_E8A6 ; $2892: F0 12
lda $0424,x ; $2894: BD 24 04
sec ; $2897: 38
sbc $E625,y ; $2898: F9 25 E6
sta $0424,x ; $289B: 9D 24 04
lda $042D,x ; $289E: BD 2D 04
sbc #$00 ; $28A1: E9 00
jmp Label_E901 ; $28A3: 4C 01 E9
Label_E8A6:
lda $0424,x ; $28A6: BD 24 04
clc ; $28A9: 18
adc $E625,y ; $28AA: 79 25 E6
sta $0424,x ; $28AD: 9D 24 04
lda $042D,x ; $28B0: BD 2D 04
adc #$00 ; $28B3: 69 00
jmp Label_E901 ; $28B5: 4C 01 E9
Label_E8B8:
lda $7F,x ; $28B8: B5 7F
beq Label_E8C7 ; $28BA: F0 0B
cmp #$02 ; $28BC: C9 02
beq Label_E907 ; $28BE: F0 47
cmp #$03 ; $28C0: C9 03
beq Label_E8C7 ; $28C2: F0 03
jmp Label_E951 ; $28C4: 4C 51 E9
Label_E8C7:
lda $0436,x ; $28C7: BD 36 04
cmp #$01 ; $28CA: C9 01
beq Label_E8D1 ; $28CC: F0 03
jmp Label_E951 ; $28CE: 4C 51 E9
Label_E8D1:
ldy $0451,x ; $28D1: BC 51 04
lda $31,x ; $28D4: B5 31
and #$02 ; $28D6: 29 02
beq Label_E8EC ; $28D8: F0 12
lda $0424,x ; $28DA: BD 24 04
sec ; $28DD: 38
sbc $E619,y ; $28DE: F9 19 E6
sta $0424,x ; $28E1: 9D 24 04
lda $042D,x ; $28E4: BD 2D 04
sbc #$00 ; $28E7: E9 00
jmp Label_E901 ; $28E9: 4C 01 E9
Label_E8EC:
lda $31,x ; $28EC: B5 31
and #$01 ; $28EE: 29 01
beq Label_E951 ; $28F0: F0 5F
lda $0424,x ; $28F2: BD 24 04
clc ; $28F5: 18
adc $E619,y ; $28F6: 79 19 E6
sta $0424,x ; $28F9: 9D 24 04
lda $042D,x ; $28FC: BD 2D 04
adc #$00 ; $28FF: 69 00
Label_E901:
sta $042D,x ; $2901: 9D 2D 04
jmp Label_E951 ; $2904: 4C 51 E9
Label_E907:
lda $0436,x ; $2907: BD 36 04
cmp #$01 ; $290A: C9 01
bne Label_E951 ; $290C: D0 43
ldy $0451,x ; $290E: BC 51 04
lda $31,x ; $2911: B5 31
and #$02 ; $2913: 29 02
beq Label_E929 ; $2915: F0 12
lda $0424,x ; $2917: BD 24 04
sec ; $291A: 38
sbc $E625,y ; $291B: F9 25 E6
sta $0424,x ; $291E: 9D 24 04
lda $042D,x ; $2921: BD 2D 04
sbc #$00 ; $2924: E9 00
jmp Label_E93E ; $2926: 4C 3E E9
Label_E929:
lda $31,x ; $2929: B5 31
and #$01 ; $292B: 29 01
beq Label_E951 ; $292D: F0 22
lda $0424,x ; $292F: BD 24 04
clc ; $2932: 18
adc $E625,y ; $2933: 79 25 E6
sta $0424,x ; $2936: 9D 24 04
lda $042D,x ; $2939: BD 2D 04
adc #$00 ; $293C: 69 00
Label_E93E:
sta $042D,x ; $293E: 9D 2D 04
lda $31,x ; $2941: B5 31
and #$03 ; $2943: 29 03
beq Label_E951 ; $2945: F0 0A
cpx #$02 ; $2947: E0 02
bcs Label_E951 ; $2949: B0 06
lda $F0 ; $294B: A5 F0
ora #$08 ; $294D: 09 08
sta $F0 ; $294F: 85 F0
Label_E951:
lda $7F,x ; $2951: B5 7F
cmp #$04 ; $2953: C9 04
bcc Label_E982 ; $2955: 90 2B
lda $0448,x ; $2957: BD 48 04
bne Label_E963 ; $295A: D0 07
lda $042D,x ; $295C: BD 2D 04
bmi Label_E982 ; $295F: 30 21
bpl Label_E968 ; $2961: 10 05
Label_E963:
lda $042D,x ; $2963: BD 2D 04
bpl Label_E982 ; $2966: 10 1A
Label_E968:
lda $7F,x ; $2968: B5 7F
cmp #$05 ; $296A: C9 05
bne Label_E976 ; $296C: D0 08
lda $0448,x ; $296E: BD 48 04
eor #$01 ; $2971: 49 01
sta $0448,x ; $2973: 9D 48 04
Label_E976:
lda #$03 ; $2976: A9 03
sta $7F,x ; $2978: 95 7F
lda #$00 ; $297A: A9 00
sta $0424,x ; $297C: 9D 24 04
sta $042D,x ; $297F: 9D 2D 04
Label_E982:
rts ; $2982: 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 ; $2983: A5 CB
bne Label_E9B6 ; $2985: D0 2F
lda $BD,x ; $2987: B5 BD
beq Label_E99A ; $2989: F0 0F
lda $0488 ; $298B: AD 88 04
beq Label_E99A ; $298E: F0 0A
sec ; $2990: 38
sbc $91,x ; $2991: F5 91
jsr $F08E ; $2993: 20 8E F0
cmp #$05 ; $2996: C9 05
bcc Label_E9B6 ; $2998: 90 1C
Label_E99A:
cpx #$02 ; $299A: E0 02
bcc Label_E9A4 ; $299C: 90 06
lda $88,x ; $299E: B5 88
cmp #$02 ; $29A0: C9 02
bne Label_E9F2 ; $29A2: D0 4E
Label_E9A4:
lda $7F,x ; $29A4: B5 7F
cmp #$02 ; $29A6: C9 02
bcc Label_E9F2 ; $29A8: 90 48
cmp #$06 ; $29AA: C9 06
bcs Label_E9F2 ; $29AC: B0 44
lda #$01 ; $29AE: A9 01
sta $7F,x ; $29B0: 95 7F
sta $045A,x ; $29B2: 9D 5A 04
rts ; $29B5: 60
Label_E9B6:
lda #$00 ; $29B6: A9 00
sta $0412,x ; $29B8: 9D 12 04
sta $041B,x ; $29BB: 9D 1B 04
sta $0409,x ; $29BE: 9D 09 04
sta $CB ; $29C1: 85 CB
cpx #$02 ; $29C3: E0 02
bcc Label_E9FD ; $29C5: 90 36
lda $88,x ; $29C7: B5 88
cmp #$02 ; $29C9: C9 02
beq Label_E9F3 ; $29CB: F0 26
cmp #$01 ; $29CD: C9 01
bne Label_E9F2 ; $29CF: D0 21
lda $7F,x ; $29D1: B5 7F
cmp #$02 ; $29D3: C9 02
bcs Label_E9F2 ; $29D5: B0 1B
lda #$02 ; $29D7: A9 02
sta $7F,x ; $29D9: 95 7F
lda $C6 ; $29DB: A5 C6
sta $043F,x ; $29DD: 9D 3F 04
lda #$00 ; $29E0: A9 00
sta $0424,x ; $29E2: 9D 24 04
sta $042D,x ; $29E5: 9D 2D 04
sta $0463,x ; $29E8: 9D 63 04
sta $046C,x ; $29EB: 9D 6C 04
lda #$40 ; $29EE: A9 40
sta $F1 ; $29F0: 85 F1
Label_E9F2:
rts ; $29F2: 60
Label_E9F3:
lda #$00 ; $29F3: A9 00
sta $7F,x ; $29F5: 95 7F
lda #$01 ; $29F7: A9 01
sta $045A,x ; $29F9: 9D 5A 04
rts ; $29FC: 60
Label_E9FD:
lda $7F,x ; $29FD: B5 7F
cmp #$01 ; $29FF: C9 01
bne Label_EA17 ; $2A01: D0 14
cmp #$06 ; $2A03: C9 06
bcs Label_EA17 ; $2A05: B0 10
lda $0424,x ; $2A07: BD 24 04
ora $042D,x ; $2A0A: 1D 2D 04
bne Label_EA13 ; $2A0D: D0 04
lda #$03 ; $2A0F: A9 03
bne Label_EA15 ; $2A11: D0 02
Label_EA13:
lda #$02 ; $2A13: A9 02
Label_EA15:
sta $7F,x ; $2A15: 95 7F
Label_EA17:
rts ; $2A17: 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 ; $2A18: E0 02
bcs Label_EA2C ; $2A1A: B0 10
lda $BD,x ; $2A1C: B5 BD
bne Label_EA44 ; $2A1E: D0 24
lda $7F,x ; $2A20: B5 7F
cmp #$01 ; $2A22: C9 01
beq Label_EA3E ; $2A24: F0 18
cmp #$03 ; $2A26: C9 03
bne Label_EA44 ; $2A28: D0 1A
beq Label_EA3E ; $2A2A: F0 12
Label_EA2C:
lda $7F,x ; $2A2C: B5 7F
cmp #$01 ; $2A2E: C9 01
beq Label_EA3E ; $2A30: F0 0C
cmp #$03 ; $2A32: C9 03
bcc Label_EA44 ; $2A34: 90 0E
lda $19 ; $2A36: A5 19
and #$03 ; $2A38: 29 03
bne Label_EA47 ; $2A3A: D0 0B
beq Label_EA44 ; $2A3C: F0 06
Label_EA3E:
lda $19 ; $2A3E: A5 19
and #$07 ; $2A40: 29 07
bne Label_EA47 ; $2A42: D0 03
Label_EA44:
inc $0436,x ; $2A44: FE 36 04
Label_EA47:
lda $0436,x ; $2A47: BD 36 04
and #$03 ; $2A4A: 29 03
sta $0436,x ; $2A4C: 9D 36 04
bne Label_EA57 ; $2A4F: D0 06
lda $7F,x ; $2A51: B5 7F
bne Label_EA57 ; $2A53: D0 02
inc $7F,x ; $2A55: F6 7F
Label_EA57:
rts ; $2A57: 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 ; $2A58: BD 75 04
beq Label_EA60 ; $2A5B: F0 03
dec $0475,x ; $2A5D: DE 75 04
Label_EA60:
cpx #$02 ; $2A60: E0 02
bcs Label_EA8C ; $2A62: B0 28
lda $C1,x ; $2A64: B5 C1
beq Label_EA8C ; $2A66: F0 24
lda $19 ; $2A68: A5 19
lsr a ; $2A6A: 4A
bcc Label_EA8B ; $2A6B: 90 1E
inc $0436,x ; $2A6D: FE 36 04
lda $0436,x ; $2A70: BD 36 04
and #$03 ; $2A73: 29 03
sta $0436,x ; $2A75: 9D 36 04
lda #$01 ; $2A78: A9 01
sta $7F,x ; $2A7A: 95 7F
dec $045A,x ; $2A7C: DE 5A 04
bne Label_EA8B ; $2A7F: D0 0A
lda #$00 ; $2A81: A9 00
sta $C1,x ; $2A83: 95 C1
sta $7F,x ; $2A85: 95 7F
lda #$20 ; $2A87: A9 20
sta $F0 ; $2A89: 85 F0
Label_EA8B:
rts ; $2A8B: 60
Label_EA8C:
lda $0412,x ; $2A8C: BD 12 04
clc ; $2A8F: 18
ldy $0451,x ; $2A90: BC 51 04
adc $E601,y ; $2A93: 79 01 E6
sta $0412,x ; $2A96: 9D 12 04
bcc Label_EA9E ; $2A99: 90 03
inc $041B,x ; $2A9B: FE 1B 04
Label_EA9E:
lda $041B,x ; $2A9E: BD 1B 04
bmi Label_EAC1 ; $2AA1: 30 1E
cmp $E66D,y ; $2AA3: D9 6D E6
bcc Label_EADC ; $2AA6: 90 34
bne Label_EAB2 ; $2AA8: D0 08
lda $0412,x ; $2AAA: BD 12 04
cmp $E661,y ; $2AAD: D9 61 E6
bcc Label_EADC ; $2AB0: 90 2A
Label_EAB2:
lda $E661,y ; $2AB2: B9 61 E6
sta $0412,x ; $2AB5: 9D 12 04
lda $E66D,y ; $2AB8: B9 6D E6
sta $041B,x ; $2ABB: 9D 1B 04
jmp Label_EADC ; $2ABE: 4C DC EA
Label_EAC1:
cmp $E685,y ; $2AC1: D9 85 E6
bcc Label_EAD0 ; $2AC4: 90 0A
bne Label_EADC ; $2AC6: D0 14
lda $0412,x ; $2AC8: BD 12 04
cmp $E679,y ; $2ACB: D9 79 E6
bcs Label_EADC ; $2ACE: B0 0C
Label_EAD0:
lda $E679,y ; $2AD0: B9 79 E6
sta $0412,x ; $2AD3: 9D 12 04
lda $E685,y ; $2AD6: B9 85 E6
sta $041B,x ; $2AD9: 9D 1B 04
Label_EADC:
jsr IntegrateVerticalPosition ; $2ADC: 20 A0 EB
cmp #$F8 ; $2ADF: C9 F8
bcs Label_EB0D ; $2AE1: B0 2A
cmp #$E8 ; $2AE3: C9 E8
bcc Label_EB0D ; $2AE5: 90 26
lda #$FF ; $2AE7: A9 FF
sta $88,x ; $2AE9: 95 88
lda #$04 ; $2AEB: A9 04
sta $BB ; $2AED: 85 BB
lda $91,x ; $2AEF: B5 91
sta $BC ; $2AF1: 85 BC
cpx #$02 ; $2AF3: E0 02
bcc Label_EB05 ; $2AF5: 90 0E
lda #$80 ; $2AF7: A9 80
sta $88,x ; $2AF9: 95 88
lda #$00 ; $2AFB: A9 00
sta $7F,x ; $2AFD: 95 7F
lda #$01 ; $2AFF: A9 01
sta $F3 ; $2B01: 85 F3
bne Label_EB0D ; $2B03: D0 08
Label_EB05:
lda $C8 ; $2B05: A5 C8
bne Label_EB0D ; $2B07: D0 04
lda #$40 ; $2B09: A9 40
sta $F0 ; $2B0B: 85 F0
Label_EB0D:
lda $042D,x ; $2B0D: BD 2D 04
bmi Label_EB30 ; $2B10: 30 1E
cmp $E63D,y ; $2B12: D9 3D E6
bcc Label_EB4B ; $2B15: 90 34
bne Label_EB21 ; $2B17: D0 08
lda $0424,x ; $2B19: BD 24 04
cmp $E631,y ; $2B1C: D9 31 E6
bcc Label_EB4B ; $2B1F: 90 2A
Label_EB21:
lda $E631,y ; $2B21: B9 31 E6
sta $0424,x ; $2B24: 9D 24 04
lda $E63D,y ; $2B27: B9 3D E6
sta $042D,x ; $2B2A: 9D 2D 04
jmp Label_EB4B ; $2B2D: 4C 4B EB
Label_EB30:
cmp $E655,y ; $2B30: D9 55 E6
bcc Label_EB3F ; $2B33: 90 0A
bne Label_EB4B ; $2B35: D0 14
lda $0424,x ; $2B37: BD 24 04
cmp $E649,y ; $2B3A: D9 49 E6
bcs Label_EB4B ; $2B3D: B0 0C
Label_EB3F:
lda $E649,y ; $2B3F: B9 49 E6
sta $0424,x ; $2B42: 9D 24 04
lda $E655,y ; $2B45: B9 55 E6
sta $042D,x ; $2B48: 9D 2D 04
Label_EB4B:
jsr IntegrateHorizontalPosition ; $2B4B: 20 8E EB
lda $16 ; $2B4E: A5 16
beq Label_EB62 ; $2B50: F0 10
lda $91,x ; $2B52: B5 91
cmp #$10 ; $2B54: C9 10
bcs Label_EB5A ; $2B56: B0 02
lda #$10 ; $2B58: A9 10
Label_EB5A:
cmp #$E0 ; $2B5A: C9 E0
bcc Label_EB60 ; $2B5C: 90 02
lda #$E0 ; $2B5E: A9 E0
Label_EB60:
sta $91,x ; $2B60: 95 91
Label_EB62:
lda $C8 ; $2B62: A5 C8
beq Label_EB8D ; $2B64: F0 27
lda $88,x ; $2B66: B5 88
bne Label_EB8D ; $2B68: D0 23
lda $9A,x ; $2B6A: B5 9A
cmp #$C8 ; $2B6C: C9 C8
bcc Label_EB8D ; $2B6E: 90 1D
lda #$C7 ; $2B70: A9 C7
sta $9A,x ; $2B72: 95 9A
lda $0451,x ; $2B74: BD 51 04
cmp #$0B ; $2B77: C9 0B
bne Label_EB84 ; $2B79: D0 09
dec $0451,x ; $2B7B: DE 51 04
jsr $F107 ; $2B7E: 20 07 F1
jmp $F18C ; $2B81: 4C 8C F1
Label_EB84:
lda #$02 ; $2B84: A9 02
sta $88,x ; $2B86: 95 88
lda #$03 ; $2B88: A9 03
sta $0451,x ; $2B8A: 9D 51 04
Label_EB8D:
rts ; $2B8D: 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 ; $2B8E: BD 00 04
clc ; $2B91: 18
adc $0424,x ; $2B92: 7D 24 04
sta $0400,x ; $2B95: 9D 00 04
lda $91,x ; $2B98: B5 91
adc $042D,x ; $2B9A: 7D 2D 04
sta $91,x ; $2B9D: 95 91
rts ; $2B9F: 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 ; $2BA0: BD 09 04
clc ; $2BA3: 18
adc $0412,x ; $2BA4: 7D 12 04
sta $0409,x ; $2BA7: 9D 09 04
lda $9A,x ; $2BAA: B5 9A
adc $041B,x ; $2BAC: 7D 1B 04
sta $9A,x ; $2BAF: 95 9A
rts ; $2BB1: 60
; ApplyHorizontalCollisionResponse
; Purpose: run collision handling around horizontal integration.
; Inputs: X = object slot.
; Returns: collision response and position updated.
ApplyHorizontalCollisionResponse:
jsr $F0B4 ; $2BB2: 20 B4 F0
jsr IntegrateHorizontalPosition ; $2BB5: 20 8E EB
jmp $F0B4 ; $2BB8: 4C B4 F0
; ApplyVerticalCollisionResponse
; Purpose: run collision handling around vertical integration.
; Inputs: X = object slot.
; Returns: collision response and position updated.
ApplyVerticalCollisionResponse:
jsr $F0B4 ; $2BBB: 20 B4 F0
jsr IntegrateVerticalPosition ; $2BBE: 20 A0 EB
jmp $F0B4 ; $2BC1: 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 ; $2BC4: E0 02
bcs Label_EBE3 ; $2BC6: B0 1B
lda $88,x ; $2BC8: B5 88
bne Label_EBD6 ; $2BCA: D0 0A
lda $0436,x ; $2BCC: BD 36 04
bne Label_EBD6 ; $2BCF: D0 05
lda #$00 ; $2BD1: A9 00
sta $7F,x ; $2BD3: 95 7F
rts ; $2BD5: 60
Label_EBD6:
lda $7F,x ; $2BD6: B5 7F
cmp #$06 ; $2BD8: C9 06
bcc Label_EC38 ; $2BDA: 90 5C
lda #$01 ; $2BDC: A9 01
sta $7F,x ; $2BDE: 95 7F
dec $88,x ; $2BE0: D6 88
rts ; $2BE2: 60
Label_EBE3:
lda $88,x ; $2BE3: B5 88
cmp #$02 ; $2BE5: C9 02
beq Label_EC38 ; $2BE7: F0 4F
lda $0436,x ; $2BE9: BD 36 04
bne Label_EBFD ; $2BEC: D0 0F
lda $88,x ; $2BEE: B5 88
bne Label_EBF7 ; $2BF0: D0 05
lda #$00 ; $2BF2: A9 00
sta $7F,x ; $2BF4: 95 7F
rts ; $2BF6: 60
Label_EBF7:
lda $7F,x ; $2BF7: B5 7F
bne Label_EBFE ; $2BF9: D0 03
inc $7F,x ; $2BFB: F6 7F
Label_EBFD:
rts ; $2BFD: 60
Label_EBFE:
cmp #$02 ; $2BFE: C9 02
bcc Label_EBFD ; $2C00: 90 FB
dec $045A,x ; $2C02: DE 5A 04
bne Label_EC37 ; $2C05: D0 30
lda $C7 ; $2C07: A5 C7
sta $045A,x ; $2C09: 9D 5A 04
inc $7F,x ; $2C0C: F6 7F
lda $7F,x ; $2C0E: B5 7F
cmp #$07 ; $2C10: C9 07
bcc Label_EC37 ; $2C12: 90 23
lda #$02 ; $2C14: A9 02
sta $88,x ; $2C16: 95 88
lda #$00 ; $2C18: A9 00
sta $7F,x ; $2C1A: 95 7F
ldy $0451,x ; $2C1C: BC 51 04
lda EnvironmentStateTable,y ; $2C1F: B9 AE EC
ldy $047E,x ; $2C22: BC 7E 04
bne Label_EC2F ; $2C25: D0 08
dec $047E,x ; $2C27: DE 7E 04
lda $0451,x ; $2C2A: BD 51 04
and #$03 ; $2C2D: 29 03
Label_EC2F:
sta $0451,x ; $2C2F: 9D 51 04
lda #$FE ; $2C32: A9 FE
sta $041B,x ; $2C34: 9D 1B 04
Label_EC37:
rts ; $2C37: 60
Label_EC38:
jsr $E6E9 ; $2C38: 20 E9 E6
lda $31,x ; $2C3B: B5 31
and #$C3 ; $2C3D: 29 C3
beq Label_EC49 ; $2C3F: F0 08
cpx #$02 ; $2C41: E0 02
bcs Label_EC49 ; $2C43: B0 04
lda #$00 ; $2C45: A9 00
sta $BD,x ; $2C47: 95 BD
Label_EC49:
lda $31,x ; $2C49: B5 31
and #$40 ; $2C4B: 29 40
bne Label_EC61 ; $2C4D: D0 12
lda $31,x ; $2C4F: B5 31
and #$80 ; $2C51: 29 80
bne Label_EC5C ; $2C53: D0 07
lda #$00 ; $2C55: A9 00
sta $0620,x ; $2C57: 9D 20 06
beq Label_ECAD ; $2C5A: F0 51
Label_EC5C:
lda $0620,x ; $2C5C: BD 20 06
bne Label_ECAD ; $2C5F: D0 4C
Label_EC61:
lda $7F,x ; $2C61: B5 7F
cmp #$02 ; $2C63: C9 02
bcc Label_EC75 ; $2C65: 90 0E
dec $9A,x ; $2C67: D6 9A
dec $9A,x ; $2C69: D6 9A
lda #$00 ; $2C6B: A9 00
sta $0412,x ; $2C6D: 9D 12 04
sta $041B,x ; $2C70: 9D 1B 04
beq Label_EC7E ; $2C73: F0 09
Label_EC75:
cmp #$01 ; $2C75: C9 01
beq Label_EC7E ; $2C77: F0 05
lda $0436,x ; $2C79: BD 36 04
bne Label_ECAD ; $2C7C: D0 2F
Label_EC7E:
lda #$00 ; $2C7E: A9 00
sta $7F,x ; $2C80: 95 7F
lda #$01 ; $2C82: A9 01
sta $0436,x ; $2C84: 9D 36 04
lda #$01 ; $2C87: A9 01
sta $0620,x ; $2C89: 9D 20 06
ldy #$00 ; $2C8C: A0 00
cpx #$02 ; $2C8E: E0 02
bcc Label_EC93 ; $2C90: 90 01
iny ; $2C92: C8
Label_EC93:
lda a:$00F0,y ; $2C93: B9 F0 00
ora #$10 ; $2C96: 09 10
sta a:$00F0,y ; $2C98: 99 F0 00
lda $0412,x ; $2C9B: BD 12 04
sec ; $2C9E: 38
ldy $0451,x ; $2C9F: BC 51 04
sbc $E60D,y ; $2CA2: F9 0D E6
sta $0412,x ; $2CA5: 9D 12 04
bcs Label_ECAD ; $2CA8: B0 03
dec $041B,x ; $2CAA: DE 1B 04
Label_ECAD:
rts ; $2CAD: 60
; Environment response pattern used by UpdateObjectEnvironmentState.
EnvironmentStateTable:
.byte $01, $02, $02, $03, $01, $02, $02, $03 ; $2CAE: 01 02 02 03 01 02 02 03
.byte $01, $02, $02, $03 ; $2CB6: 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 ; $2CBA: B5 7F
bne Label_ED27 ; $2CBC: D0 69
jsr $E7B1 ; $2CBE: 20 B1 E7
jsr $EB8E ; $2CC1: 20 8E EB
lda $0409,x ; $2CC4: BD 09 04
sec ; $2CC7: 38
sbc #$60 ; $2CC8: E9 60
sta $0409,x ; $2CCA: 9D 09 04
lda $9A,x ; $2CCD: B5 9A
sbc #$00 ; $2CCF: E9 00
sta $9A,x ; $2CD1: 95 9A
cmp #$F1 ; $2CD3: C9 F1
bcc Label_ECDB ; $2CD5: 90 04
lda #$FF ; $2CD7: A9 FF
sta $88,x ; $2CD9: 95 88
Label_ECDB:
txa ; $2CDB: 8A
pha ; $2CDC: 48
ldy #$01 ; $2CDD: A0 01
Label_ECDF:
lda a:$0088,y ; $2CDF: B9 88 00
beq Label_ED22 ; $2CE2: F0 3E
bmi Label_ED22 ; $2CE4: 30 3C
lda $9A,x ; $2CE6: B5 9A
sec ; $2CE8: 38
sbc a:$009A,y ; $2CE9: F9 9A 00
jsr $F08E ; $2CEC: 20 8E F0
cmp #$18 ; $2CEF: C9 18
bcs Label_ED22 ; $2CF1: B0 2F
lda $91,x ; $2CF3: B5 91
sec ; $2CF5: 38
sbc a:$0091,y ; $2CF6: F9 91 00
jsr $F08E ; $2CF9: 20 8E F0
cmp #$10 ; $2CFC: C9 10
bcs Label_ED22 ; $2CFE: B0 22
lda #$FF ; $2D00: A9 FF
sta $7F,x ; $2D02: 95 7F
lda #$03 ; $2D04: A9 03
sta $045A,x ; $2D06: 9D 5A 04
lda #$78 ; $2D09: A9 78
sta $C5 ; $2D0B: 85 C5
lda #$02 ; $2D0D: A9 02
sta $F0 ; $2D0F: 85 F0
lda #$32 ; $2D11: A9 32
sty $3E ; $2D13: 84 3E
jsr $D6DE ; $2D15: 20 DE D6
lda #$01 ; $2D18: A9 01
ldx $3E ; $2D1A: A6 3E
jsr $D871 ; $2D1C: 20 71 D8
pla ; $2D1F: 68
tax ; $2D20: AA
rts ; $2D21: 60
Label_ED22:
dey ; $2D22: 88
bpl Label_ECDF ; $2D23: 10 BA
pla ; $2D25: 68
tax ; $2D26: AA
Label_ED27:
rts ; $2D27: 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 ; $2D28: B4 88
dey ; $2D2A: 88
bpl Label_ED2E ; $2D2B: 10 01
Label_ED2D:
rts ; $2D2D: 60
Label_ED2E:
lda $9A,x ; $2D2E: B5 9A
cmp #$F9 ; $2D30: C9 F9
bcc Label_ED40 ; $2D32: 90 0C
lda $041B,x ; $2D34: BD 1B 04
bpl Label_ED2D ; $2D37: 10 F4
lda #$00 ; $2D39: A9 00
sta $CC ; $2D3B: 85 CC
jmp Label_EDE1 ; $2D3D: 4C E1 ED
Label_ED40:
ldy $CD ; $2D40: A4 CD
bmi Label_ED27 ; $2D42: 30 E3
Label_ED44:
lda #$00 ; $2D44: A9 00
sta $CC ; $2D46: 85 CC
lda ($27),y ; $2D48: B1 27
sec ; $2D4A: 38
sbc #$18 ; $2D4B: E9 18
cmp $9A,x ; $2D4D: D5 9A
bcs Label_EDB6 ; $2D4F: B0 65
adc #$03 ; $2D51: 69 03
cmp $9A,x ; $2D53: D5 9A
bcc Label_ED5B ; $2D55: 90 04
lda #$01 ; $2D57: A9 01
bne Label_ED69 ; $2D59: D0 0E
Label_ED5B:
lda ($29),y ; $2D5B: B1 29
cmp $9A,x ; $2D5D: D5 9A
bcc Label_EDB6 ; $2D5F: 90 55
sbc #$03 ; $2D61: E9 03
cmp $9A,x ; $2D63: D5 9A
bcs Label_ED89 ; $2D65: B0 22
lda #$02 ; $2D67: A9 02
Label_ED69:
sta $CC ; $2D69: 85 CC
lda ($23),y ; $2D6B: B1 23
cmp #$10 ; $2D6D: C9 10
beq Label_ED78 ; $2D6F: F0 07
sec ; $2D71: 38
sbc #$0C ; $2D72: E9 0C
cmp $91,x ; $2D74: D5 91
bcs Label_ED85 ; $2D76: B0 0D
Label_ED78:
lda ($25),y ; $2D78: B1 25
cmp #$FF ; $2D7A: C9 FF
beq Label_ED89 ; $2D7C: F0 0B
sec ; $2D7E: 38
sbc #$04 ; $2D7F: E9 04
cmp $91,x ; $2D81: D5 91
bcs Label_ED89 ; $2D83: B0 04
Label_ED85:
lda #$00 ; $2D85: A9 00
sta $CC ; $2D87: 85 CC
Label_ED89:
lda ($23),y ; $2D89: B1 23
sec ; $2D8B: 38
sbc #$10 ; $2D8C: E9 10
beq Label_EDA0 ; $2D8E: F0 10
cmp $91,x ; $2D90: D5 91
bcs Label_EDB6 ; $2D92: B0 22
adc #$04 ; $2D94: 69 04
cmp $91,x ; $2D96: D5 91
bcc Label_EDA0 ; $2D98: 90 06
lda $CC ; $2D9A: A5 CC
ora #$04 ; $2D9C: 09 04
bne Label_EDB4 ; $2D9E: D0 14
Label_EDA0:
lda ($25),y ; $2DA0: B1 25
cmp #$FF ; $2DA2: C9 FF
beq Label_EDB6 ; $2DA4: F0 10
cmp $91,x ; $2DA6: D5 91
bcc Label_EDB6 ; $2DA8: 90 0C
sbc #$04 ; $2DAA: E9 04
cmp $91,x ; $2DAC: D5 91
bcs Label_EDB6 ; $2DAE: B0 06
lda $CC ; $2DB0: A5 CC
ora #$08 ; $2DB2: 09 08
Label_EDB4:
sta $CC ; $2DB4: 85 CC
Label_EDB6:
lda $CC ; $2DB6: A5 CC
bne Label_EDC1 ; $2DB8: D0 07
dey ; $2DBA: 88
bmi Label_EDC0 ; $2DBB: 30 03
jmp Label_ED44 ; $2DBD: 4C 44 ED
Label_EDC0:
rts ; $2DC0: 60
Label_EDC1:
lsr $CC ; $2DC1: 46 CC
bcc Label_EDD6 ; $2DC3: 90 11
lda $041B,x ; $2DC5: BD 1B 04
bmi Label_EDD6 ; $2DC8: 30 0C
lda ($27),y ; $2DCA: B1 27
sbc #$18 ; $2DCC: E9 18
sta $9A,x ; $2DCE: 95 9A
inc $9A,x ; $2DD0: F6 9A
lda #$01 ; $2DD2: A9 01
sta $CB ; $2DD4: 85 CB
Label_EDD6:
lsr $CC ; $2DD6: 46 CC
bcc Label_EDF4 ; $2DD8: 90 1A
lda $041B,x ; $2DDA: BD 1B 04
bpl Label_EDF4 ; $2DDD: 10 15
lda ($29),y ; $2DDF: B1 29
Label_EDE1:
sta $9A,x ; $2DE1: 95 9A
jsr $F107 ; $2DE3: 20 07 F1
jsr $F18C ; $2DE6: 20 8C F1
cpx #$02 ; $2DE9: E0 02
bcs Label_EDF0 ; $2DEB: B0 03
jsr $CC33 ; $2DED: 20 33 CC
Label_EDF0:
lda $CB ; $2DF0: A5 CB
bne Label_EE24 ; $2DF2: D0 30
Label_EDF4:
lsr $CC ; $2DF4: 46 CC
bcc Label_EDFF ; $2DF6: 90 07
lda $042D,x ; $2DF8: BD 2D 04
bmi Label_EDFF ; $2DFB: 30 02
bpl Label_EE08 ; $2DFD: 10 09
Label_EDFF:
lsr $CC ; $2DFF: 46 CC
bcc Label_EE24 ; $2E01: 90 21
lda $042D,x ; $2E03: BD 2D 04
bpl Label_EE24 ; $2E06: 10 1C
Label_EE08:
jsr $F0DE ; $2E08: 20 DE F0
jsr $F172 ; $2E0B: 20 72 F1
lda $042D,x ; $2E0E: BD 2D 04
ora $0424,x ; $2E11: 1D 24 04
beq Label_EE24 ; $2E14: F0 0E
lda $0448,x ; $2E16: BD 48 04
eor #$01 ; $2E19: 49 01
sta $0448,x ; $2E1B: 9D 48 04
lda $F1 ; $2E1E: A5 F1
ora #$02 ; $2E20: 09 02
sta $F1 ; $2E22: 85 F1
Label_EE24:
rts ; $2E24: 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 ; $2E25: A2 07
Label_EE27:
stx $12 ; $2E27: 86 12
ldy $12 ; $2E29: A4 12
dey ; $2E2B: 88
bpl Label_EE31 ; $2E2C: 10 03
Label_EE2E:
jmp Label_EF2A ; $2E2E: 4C 2A EF
Label_EE31:
lda $88,x ; $2E31: B5 88
bmi Label_EE2E ; $2E33: 30 F9
beq Label_EE2E ; $2E35: F0 F7
lda a:$0088,y ; $2E37: B9 88 00
bmi Label_EE2E ; $2E3A: 30 F2
beq Label_EE2E ; $2E3C: F0 F0
lda #$00 ; $2E3E: A9 00
sta $CC ; $2E40: 85 CC
lda a:$009A,y ; $2E42: B9 9A 00
sec ; $2E45: 38
sbc $9A,x ; $2E46: F5 9A
jsr $F08E ; $2E48: 20 8E F0
cmp #$18 ; $2E4B: C9 18
bcs Label_EEC0 ; $2E4D: B0 71
lda $9A,x ; $2E4F: B5 9A
clc ; $2E51: 18
adc #$18 ; $2E52: 69 18
sta $12 ; $2E54: 85 12
lda a:$009A,y ; $2E56: B9 9A 00
clc ; $2E59: 18
adc #$07 ; $2E5A: 69 07
sec ; $2E5C: 38
sbc $12 ; $2E5D: E5 12
jsr $F08E ; $2E5F: 20 8E F0
cmp #$04 ; $2E62: C9 04
bcs Label_EE6A ; $2E64: B0 04
lda #$01 ; $2E66: A9 01
bne Label_EE7C ; $2E68: D0 12
Label_EE6A:
lda a:$009A,y ; $2E6A: B9 9A 00
clc ; $2E6D: 18
adc #$11 ; $2E6E: 69 11
sec ; $2E70: 38
sbc $9A,x ; $2E71: F5 9A
jsr $F08E ; $2E73: 20 8E F0
cmp #$04 ; $2E76: C9 04
bcs Label_EE8F ; $2E78: B0 15
lda #$02 ; $2E7A: A9 02
Label_EE7C:
sta $CC ; $2E7C: 85 CC
lda a:$0091,y ; $2E7E: B9 91 00
sec ; $2E81: 38
sbc $91,x ; $2E82: F5 91
jsr $F08E ; $2E84: 20 8E F0
cmp #$10 ; $2E87: C9 10
bcc Label_EE8F ; $2E89: 90 04
lda #$00 ; $2E8B: A9 00
sta $CC ; $2E8D: 85 CC
Label_EE8F:
lda $91,x ; $2E8F: B5 91
clc ; $2E91: 18
adc #$10 ; $2E92: 69 10
sta $12 ; $2E94: 85 12
lda a:$0091,y ; $2E96: B9 91 00
clc ; $2E99: 18
adc #$07 ; $2E9A: 69 07
sec ; $2E9C: 38
sbc $12 ; $2E9D: E5 12
jsr $F08E ; $2E9F: 20 8E F0
cmp #$04 ; $2EA2: C9 04
bcs Label_EEAA ; $2EA4: B0 04
lda #$04 ; $2EA6: A9 04
bne Label_EEBC ; $2EA8: D0 12
Label_EEAA:
lda a:$0091,y ; $2EAA: B9 91 00
clc ; $2EAD: 18
adc #$09 ; $2EAE: 69 09
sec ; $2EB0: 38
sbc $91,x ; $2EB1: F5 91
jsr $F08E ; $2EB3: 20 8E F0
cmp #$04 ; $2EB6: C9 04
bcs Label_EEC0 ; $2EB8: B0 06
lda #$08 ; $2EBA: A9 08
Label_EEBC:
ora $CC ; $2EBC: 05 CC
sta $CC ; $2EBE: 85 CC
Label_EEC0:
lda #$00 ; $2EC0: A9 00
sta $4B ; $2EC2: 85 4B
lsr $CC ; $2EC4: 46 CC
bcc Label_EECD ; $2EC6: 90 05
jsr $F0A6 ; $2EC8: 20 A6 F0
bmi Label_EED6 ; $2ECB: 30 09
Label_EECD:
lsr $CC ; $2ECD: 46 CC
bcc Label_EEF1 ; $2ECF: 90 20
jsr $F0A6 ; $2ED1: 20 A6 F0
bmi Label_EEF1 ; $2ED4: 30 1B
Label_EED6:
jsr $F0BD ; $2ED6: 20 BD F0
bcs Label_EEED ; $2ED9: B0 12
jsr $F107 ; $2EDB: 20 07 F1
jsr $F18C ; $2EDE: 20 8C F1
jsr $F0B4 ; $2EE1: 20 B4 F0
jsr $F107 ; $2EE4: 20 07 F1
jsr $F18C ; $2EE7: 20 8C F1
jsr $F0B4 ; $2EEA: 20 B4 F0
Label_EEED:
lda #$01 ; $2EED: A9 01
sta $4B ; $2EEF: 85 4B
Label_EEF1:
lsr $CC ; $2EF1: 46 CC
bcc Label_EEFA ; $2EF3: 90 05
jsr $F098 ; $2EF5: 20 98 F0
bmi Label_EF03 ; $2EF8: 30 09
Label_EEFA:
lsr $CC ; $2EFA: 46 CC
bcc Label_EF1E ; $2EFC: 90 20
jsr $F098 ; $2EFE: 20 98 F0
bmi Label_EF1E ; $2F01: 30 1B
Label_EF03:
jsr $F0BD ; $2F03: 20 BD F0
bcs Label_EF1A ; $2F06: B0 12
jsr $F0DE ; $2F08: 20 DE F0
jsr $F172 ; $2F0B: 20 72 F1
jsr $F0B4 ; $2F0E: 20 B4 F0
jsr $F0DE ; $2F11: 20 DE F0
jsr $F172 ; $2F14: 20 72 F1
jsr $F0B4 ; $2F17: 20 B4 F0
Label_EF1A:
lda #$01 ; $2F1A: A9 01
sta $4B ; $2F1C: 85 4B
Label_EF1E:
jsr ResolveObjectCollisionPair ; $2F1E: 20 37 EF
jsr $F0B4 ; $2F21: 20 B4 F0
jsr ResolveObjectCollisionPair ; $2F24: 20 37 EF
jsr $F0B4 ; $2F27: 20 B4 F0
Label_EF2A:
dey ; $2F2A: 88
bmi Label_EF30 ; $2F2B: 30 03
jmp Label_EE31 ; $2F2D: 4C 31 EE
Label_EF30:
dex ; $2F30: CA
bmi Label_EF36 ; $2F31: 30 03
jmp Label_EE27 ; $2F33: 4C 27 EE
Label_EF36:
rts ; $2F36: 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 ; $2F37: E0 02
bcc Label_EF42 ; $2F39: 90 07
cpy #$02 ; $2F3B: C0 02
bcc Label_EF42 ; $2F3D: 90 03
jmp Label_F043 ; $2F3F: 4C 43 F0
Label_EF42:
lda #$00 ; $2F42: A9 00
sta $0487 ; $2F44: 8D 87 04
lda $0475,x ; $2F47: BD 75 04
beq Label_EF4F ; $2F4A: F0 03
jmp Label_F043 ; $2F4C: 4C 43 F0
Label_EF4F:
lda $4B ; $2F4F: A5 4B
bne Label_EF56 ; $2F51: D0 03
jmp Label_F043 ; $2F53: 4C 43 F0
Label_EF56:
cpx #$02 ; $2F56: E0 02
bcs Label_EF61 ; $2F58: B0 07
lda $BD,x ; $2F5A: B5 BD
beq Label_EF72 ; $2F5C: F0 14
jmp Label_F043 ; $2F5E: 4C 43 F0
Label_EF61:
lda $88,x ; $2F61: B5 88
cmp #$01 ; $2F63: C9 01
bne Label_EF72 ; $2F65: D0 0B
lda $7F,x ; $2F67: B5 7F
cmp #$02 ; $2F69: C9 02
bcs Label_EF7F ; $2F6B: B0 12
lda #$01 ; $2F6D: A9 01
sta $0487 ; $2F6F: 8D 87 04
Label_EF72:
lda a:$009A,y ; $2F72: B9 9A 00
clc ; $2F75: 18
adc #$04 ; $2F76: 69 04
cmp $9A,x ; $2F78: D5 9A
bcc Label_EF7F ; $2F7A: 90 03
jmp Label_F043 ; $2F7C: 4C 43 F0
Label_EF7F:
lda #$14 ; $2F7F: A9 14
sta $0475,x ; $2F81: 9D 75 04
lda #$00 ; $2F84: A9 00
sta $0436,x ; $2F86: 9D 36 04
cpy #$02 ; $2F89: C0 02
bcc Label_EF97 ; $2F8B: 90 0A
lda a:$0088,y ; $2F8D: B9 88 00
cmp #$02 ; $2F90: C9 02
beq Label_EF97 ; $2F92: F0 03
jmp Label_F043 ; $2F94: 4C 43 F0
Label_EF97:
lda $F0 ; $2F97: A5 F0
ora #$02 ; $2F99: 09 02
sta $F0 ; $2F9B: 85 F0
lda $88,x ; $2F9D: B5 88
cmp #$02 ; $2F9F: C9 02
bne Label_EFC0 ; $2FA1: D0 1D
cpx #$02 ; $2FA3: E0 02
bcs Label_EFC0 ; $2FA5: B0 19
sty $12 ; $2FA7: 84 12
ldy $7F,x ; $2FA9: B4 7F
lda CollisionResultStateTable,y ; $2FAB: B9 53 F0
ldy $12 ; $2FAE: A4 12
pha ; $2FB0: 48
pla ; $2FB1: 68
bne Label_EFB7 ; $2FB2: D0 03
jmp Label_F043 ; $2FB4: 4C 43 F0
Label_EFB7:
sta $7F,x ; $2FB7: 95 7F
lda #$00 ; $2FB9: A9 00
sta $0436,x ; $2FBB: 9D 36 04
beq Label_EFEA ; $2FBE: F0 2A
Label_EFC0:
dec $88,x ; $2FC0: D6 88
bne Label_EFCE ; $2FC2: D0 0A
lda #$FF ; $2FC4: A9 FF
sta $041B,x ; $2FC6: 9D 1B 04
lda #$00 ; $2FC9: A9 00
sta $0412,x ; $2FCB: 9D 12 04
Label_EFCE:
lda #$00 ; $2FCE: A9 00
sta $7F,x ; $2FD0: 95 7F
sta $0424,x ; $2FD2: 9D 24 04
sta $042D,x ; $2FD5: 9D 2D 04
lda $91,x ; $2FD8: B5 91
bmi Label_EFE0 ; $2FDA: 30 04
lda #$FF ; $2FDC: A9 FF
bne Label_EFE2 ; $2FDE: D0 02
Label_EFE0:
lda #$00 ; $2FE0: A9 00
Label_EFE2:
sta $046C,x ; $2FE2: 9D 6C 04
lda #$80 ; $2FE5: A9 80
sta $0463,x ; $2FE7: 9D 63 04
Label_EFEA:
sty $12 ; $2FEA: 84 12
ldy $0451,x ; $2FEC: BC 51 04
lda ObjectStateTransitionTable,y ; $2FEF: B9 5E F0
sta $0451,x ; $2FF2: 9D 51 04
lda #$01 ; $2FF5: A9 01
sta $047E,x ; $2FF7: 9D 7E 04
ldy $12 ; $2FFA: A4 12
cpy #$02 ; $2FFC: C0 02
bcs Label_F043 ; $2FFE: B0 43
lda $0451,x ; $3000: BD 51 04
cmp #$07 ; $3003: C9 07
beq Label_F011 ; $3005: F0 0A
cmp #$08 ; $3007: C9 08
bcc Label_F011 ; $3009: 90 06
lda $F1 ; $300B: A5 F1
ora #$80 ; $300D: 09 80
sta $F1 ; $300F: 85 F1
Label_F011:
ldy $0451,x ; $3011: BC 51 04
lda CollisionSoundTable,y ; $3014: B9 6A F0
sta $13 ; $3017: 85 13
lda $0487 ; $3019: AD 87 04
beq Label_F023 ; $301C: F0 05
lda CollisionScoreTable,y ; $301E: B9 76 F0
sta $13 ; $3021: 85 13
Label_F023:
lda CollisionEventTable,y ; $3023: B9 82 F0
clc ; $3026: 18
adc $0487 ; $3027: 6D 87 04
sta $14 ; $302A: 85 14
lda $12 ; $302C: A5 12
sta $3E ; $302E: 85 3E
pha ; $3030: 48
txa ; $3031: 8A
pha ; $3032: 48
lda $13 ; $3033: A5 13
pha ; $3035: 48
lda $14 ; $3036: A5 14
jsr $D871 ; $3038: 20 71 D8
pla ; $303B: 68
jsr $D6DE ; $303C: 20 DE D6
pla ; $303F: 68
tax ; $3040: AA
pla ; $3041: 68
tay ; $3042: A8
Label_F043:
lda $0451,x ; $3043: BD 51 04
cmp #$0B ; $3046: C9 0B
bne Label_F052 ; $3048: D0 08
lda $C8 ; $304A: A5 C8
bne Label_F052 ; $304C: D0 04
lda #$20 ; $304E: A9 20
sta $F0 ; $3050: 85 F0
Label_F052:
rts ; $3052: 60
; Collision outcome state values indexed by collision class.
CollisionResultStateTable:
.byte $06, $06, $07, $08, $09, $0A, $00, $00, $00, $00, $00 ; $3053: 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 ; $305E: 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 ; $306A: 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 ; $3076: 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 ; $3082: 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 ; $308E: 48
pla ; $308F: 68
bpl Label_F097 ; $3090: 10 05
eor #$FF ; $3092: 49 FF
clc ; $3094: 18
adc #$01 ; $3095: 69 01
Label_F097:
rts ; $3097: 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 ; $3098: B9 24 04
sec ; $309B: 38
sbc $0424,x ; $309C: FD 24 04
lda $042D,y ; $309F: B9 2D 04
sbc $042D,x ; $30A2: FD 2D 04
rts ; $30A5: 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 ; $30A6: B9 12 04
sec ; $30A9: 38
sbc $0412,x ; $30AA: FD 12 04
lda $041B,y ; $30AD: B9 1B 04
sbc $041B,x ; $30B0: FD 1B 04
rts ; $30B3: 60
; SwapObjectIndexes
; Purpose: exchange X and Y through scratch bytes.
; Inputs: X/Y = object indexes.
; Returns: X/Y swapped.
SwapObjectIndexes:
stx $12 ; $30B4: 86 12
sty $13 ; $30B6: 84 13
ldx $13 ; $30B8: A6 13
ldy $12 ; $30BA: A4 12
rts ; $30BC: 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 ; $30BD: E0 02
bcc Label_F0DD ; $30BF: 90 1C
lda $7F,x ; $30C1: B5 7F
cmp #$02 ; $30C3: C9 02
bcc Label_F0DD ; $30C5: 90 16
lda #$01 ; $30C7: A9 01
cmp $88,x ; $30C9: D5 88
bcs Label_F0DD ; $30CB: B0 10
cpy #$02 ; $30CD: C0 02
bcc Label_F0DD ; $30CF: 90 0C
lda a:$007F,y ; $30D1: B9 7F 00
cmp #$02 ; $30D4: C9 02
bcc Label_F0DD ; $30D6: 90 05
lda #$01 ; $30D8: A9 01
cmp a:$0088,y ; $30DA: D9 88 00
Label_F0DD:
rts ; $30DD: 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 ; $30DE: A9 00
sec ; $30E0: 38
sbc $0424,x ; $30E1: FD 24 04
sta $0424,x ; $30E4: 9D 24 04
lda #$00 ; $30E7: A9 00
sbc $042D,x ; $30E9: FD 2D 04
sta $042D,x ; $30EC: 9D 2D 04
lda #$00 ; $30EF: A9 00
sec ; $30F1: 38
sbc $0463,x ; $30F2: FD 63 04
sta $0463,x ; $30F5: 9D 63 04
lda #$00 ; $30F8: A9 00
sbc $046C,x ; $30FA: FD 6C 04
sta $046C,x ; $30FD: 9D 6C 04
lda $31,x ; $3100: B5 31
and #$40 ; $3102: 29 40
sta $31,x ; $3104: 95 31
rts ; $3106: 60
; NegateVerticalMotion
; Purpose: negate an object vertical velocity pair.
; Inputs: X = object slot.
; Returns: vertical motion fields negated.
NegateVerticalMotion:
lda #$00 ; $3107: A9 00
sec ; $3109: 38
sbc $0412,x ; $310A: FD 12 04
sta $0412,x ; $310D: 9D 12 04
lda #$00 ; $3110: A9 00
sbc $041B,x ; $3112: FD 1B 04
sta $041B,x ; $3115: 9D 1B 04
rts ; $3118: 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 ; $3119: 85 2D
lda $2C ; $311B: A5 2C
bpl MultiplyUnsigned16By8 ; $311D: 10 24
lda #$00 ; $311F: A9 00
sec ; $3121: 38
sbc $2B ; $3122: E5 2B
sta $2B ; $3124: 85 2B
lda #$00 ; $3126: A9 00
sbc $2C ; $3128: E5 2C
sta $2C ; $312A: 85 2C
jsr MultiplyUnsigned16By8 ; $312C: 20 43 F1
lda #$00 ; $312F: A9 00
sec ; $3131: 38
sbc $2E ; $3132: E5 2E
sta $2E ; $3134: 85 2E
lda #$00 ; $3136: A9 00
sbc $2F ; $3138: E5 2F
sta $2F ; $313A: 85 2F
lda #$00 ; $313C: A9 00
sbc $30 ; $313E: E5 30
sta $30 ; $3140: 85 30
rts ; $3142: 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 ; $3143: 8A
pha ; $3144: 48
lda #$00 ; $3145: A9 00
sta $2E ; $3147: 85 2E
sta $2F ; $3149: 85 2F
sta $30 ; $314B: 85 30
ldx #$08 ; $314D: A2 08
Label_F14F:
asl $2E ; $314F: 06 2E
rol $2F ; $3151: 26 2F
rol $30 ; $3153: 26 30
asl $2D ; $3155: 06 2D
bcc Label_F16C ; $3157: 90 13
clc ; $3159: 18
lda $2B ; $315A: A5 2B
adc $2E ; $315C: 65 2E
sta $2E ; $315E: 85 2E
lda $2C ; $3160: A5 2C
adc $2F ; $3162: 65 2F
sta $2F ; $3164: 85 2F
lda #$00 ; $3166: A9 00
adc $30 ; $3168: 65 30
sta $30 ; $316A: 85 30
Label_F16C:
dex ; $316C: CA
bne Label_F14F ; $316D: D0 E0
pla ; $316F: 68
tax ; $3170: AA
rts ; $3171: 60
; ScaleHorizontalVelocity
; Purpose: scale horizontal velocity by the fixed collision factor.
; Inputs: X = object slot.
; Returns: $0424/$042D scaled.
ScaleHorizontalVelocity:
lda $0424,x ; $3172: BD 24 04
sta $2B ; $3175: 85 2B
lda $042D,x ; $3177: BD 2D 04
sta $2C ; $317A: 85 2C
lda #$CD ; $317C: A9 CD
jsr MultiplySignedValue ; $317E: 20 19 F1
lda $2F ; $3181: A5 2F
sta $0424,x ; $3183: 9D 24 04
lda $30 ; $3186: A5 30
sta $042D,x ; $3188: 9D 2D 04
rts ; $318B: 60
; ScaleVerticalVelocity
; Purpose: scale vertical velocity by the fixed collision factor.
; Inputs: X = object slot.
; Returns: $0412/$041B scaled.
ScaleVerticalVelocity:
lda $0412,x ; $318C: BD 12 04
sta $2B ; $318F: 85 2B
lda $041B,x ; $3191: BD 1B 04
sta $2C ; $3194: 85 2C
lda #$CD ; $3196: A9 CD
jsr MultiplySignedValue ; $3198: 20 19 F1
lda $2F ; $319B: A5 2F
sta $0412,x ; $319D: 9D 12 04
lda $30 ; $31A0: A5 30
sta $041B,x ; $31A2: 9D 1B 04
rts ; $31A5: 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 ; $31A6: A0 04
Label_F1A8:
lda $13 ; $31A8: A5 13
asl a ; $31AA: 0A
ror $13 ; $31AB: 66 13
ror $12 ; $31AD: 66 12
dey ; $31AF: 88
bne Label_F1A8 ; $31B0: D0 F6
rts ; $31B2: 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 ; $31B3: 8A
pha ; $31B4: 48
ldx #$0B ; $31B5: A2 0B
Label_F1B7:
asl $1B ; $31B7: 06 1B
rol $1C ; $31B9: 26 1C
rol a ; $31BB: 2A
rol a ; $31BC: 2A
eor $1B ; $31BD: 45 1B
rol a ; $31BF: 2A
eor $1B ; $31C0: 45 1B
lsr a ; $31C2: 4A
lsr a ; $31C3: 4A
eor #$FF ; $31C4: 49 FF
and #$01 ; $31C6: 29 01
ora $1B ; $31C8: 05 1B
sta $1B ; $31CA: 85 1B
dex ; $31CC: CA
bne Label_F1B7 ; $31CD: D0 E8
pla ; $31CF: 68
tax ; $31D0: AA
lda $1B ; $31D1: A5 1B
rts ; $31D3: 60
Label_F1D4:
jsr $DAC1 ; $31D4: 20 C1 DA
ldx #$09 ; $31D7: A2 09
Label_F1D9:
lda #$00 ; $31D9: A9 00
sta $03,x ; $31DB: 95 03
dex ; $31DD: CA
bpl Label_F1D9 ; $31DE: 10 F9
sta $3E ; $31E0: 85 3E
inc $41 ; $31E2: E6 41
jsr $D6DE ; $31E4: 20 DE D6
lda #$0F ; $31E7: A9 0F
sta $4015 ; $31E9: 8D 15 40
lda #$01 ; $31EC: A9 01
sta $F0 ; $31EE: 85 F0
lda #$02 ; $31F0: 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 ; $31F2: 85 41
ldy $40 ; $31F4: A4 40
bne Label_F1FA ; $31F6: D0 02
lda #$FF ; $31F8: A9 FF
Label_F1FA:
sta $42 ; $31FA: 85 42
ldx #$00 ; $31FC: A2 00
stx $0488 ; $31FE: 8E 88 04
stx $3B ; $3201: 86 3B
stx $3C ; $3203: 86 3C
stx $0558 ; $3205: 8E 58 05
dex ; $3208: CA
stx $89 ; $3209: 86 89
ldx $40 ; $320B: A6 40
Label_F20D:
jsr $F3B0 ; $320D: 20 B0 F3
dex ; $3210: CA
bpl Label_F20D ; $3211: 10 FA
Label_F213:
lda #$00 ; $3213: A9 00
sta $C8 ; $3215: 85 C8
lda $3C ; $3217: A5 3C
lsr a ; $3219: 4A
lsr a ; $321A: 4A
cmp #$08 ; $321B: C9 08
bcc Label_F221 ; $321D: 90 02
lda #$08 ; $321F: A9 08
Label_F221:
tax ; $3221: AA
lda RoundObjectTypeTable,x ; $3222: BD BA F3
sta $C6 ; $3225: 85 C6
lda RoundObjectPositionTable,x ; $3227: BD C3 F3
sta $C7 ; $322A: 85 C7
lda $3C ; $322C: A5 3C
cmp #$02 ; $322E: C9 02
bcs Label_F238 ; $3230: B0 06
lda #$03 ; $3232: A9 03
sta $C6 ; $3234: 85 C6
sta $C7 ; $3236: 85 C7
Label_F238:
ldx #$07 ; $3238: A2 07
Label_F23A:
lda #$00 ; $323A: A9 00
sta $0448,x ; $323C: 9D 48 04
sta $0475,x ; $323F: 9D 75 04
sta $047E,x ; $3242: 9D 7E 04
sta $0424,x ; $3245: 9D 24 04
sta $042D,x ; $3248: 9D 2D 04
sta $0412,x ; $324B: 9D 12 04
sta $041B,x ; $324E: 9D 1B 04
sta $0463,x ; $3251: 9D 63 04
sta $046C,x ; $3254: 9D 6C 04
sta $0400,x ; $3257: 9D 00 04
sta $0409,x ; $325A: 9D 09 04
lda #$01 ; $325D: A9 01
sta $043F,x ; $325F: 9D 3F 04
sta $045A,x ; $3262: 9D 5A 04
lda #$03 ; $3265: A9 03
sta $0436,x ; $3267: 9D 36 04
dex ; $326A: CA
bpl Label_F23A ; $326B: 10 CD
ldx #$05 ; $326D: A2 05
Label_F26F:
lda #$FF ; $326F: A9 FF
sta $8A,x ; $3271: 95 8A
dex ; $3273: CA
bpl Label_F26F ; $3274: 10 F9
ldx $40 ; $3276: A6 40
Label_F278:
jsr ResetObjectMotion ; $3278: 20 86 F3
dex ; $327B: CA
bpl Label_F278 ; $327C: 10 FA
jsr $D246 ; $327E: 20 46 D2
jsr $D293 ; $3281: 20 93 D2
lda $C6 ; $3284: A5 C6
cmp #$10 ; $3286: C9 10
bcs Label_F28E ; $3288: B0 04
lda #$58 ; $328A: A9 58
sta $C6 ; $328C: 85 C6
Label_F28E:
jsr $F4A5 ; $328E: 20 A5 F4
jsr $D8FF ; $3291: 20 FF D8
lda $16 ; $3294: A5 16
beq Label_F29B ; $3296: F0 03
jmp $C1C5 ; $3298: 4C C5 C1
Label_F29B:
lda $C8 ; $329B: A5 C8
beq Label_F2A2 ; $329D: F0 03
jmp $CF13 ; $329F: 4C 13 CF
Label_F2A2:
jsr $C716 ; $32A2: 20 16 C7
lda $3B ; $32A5: A5 3B
and #$03 ; $32A7: 29 03
bne Label_F2B3 ; $32A9: D0 08
lda #$08 ; $32AB: A9 08
sta $F2 ; $32AD: 85 F2
ldx $3A ; $32AF: A6 3A
bne Label_F2B9 ; $32B1: D0 06
Label_F2B3:
lda #$FF ; $32B3: A9 FF
sta $3D ; $32B5: 85 3D
inc $3C ; $32B7: E6 3C
Label_F2B9:
jsr $F470 ; $32B9: 20 70 F4
lda $3D ; $32BC: A5 3D
beq Label_F2C5 ; $32BE: F0 05
dec $3D ; $32C0: C6 3D
jsr $F3CC ; $32C2: 20 CC F3
Label_F2C5:
jsr NextRandomByte ; $32C5: 20 B3 F1
jsr $E691 ; $32C8: 20 91 E6
jsr $C6F9 ; $32CB: 20 F9 C6
jsr $C790 ; $32CE: 20 90 C7
jsr $C831 ; $32D1: 20 31 C8
jsr $C8B7 ; $32D4: 20 B7 C8
jsr $D8DD ; $32D7: 20 DD D8
jsr $E587 ; $32DA: 20 87 E5
jsr $CB74 ; $32DD: 20 74 CB
inc $4C ; $32E0: E6 4C
ldx $40 ; $32E2: A6 40
Label_F2E4:
lda $88,x ; $32E4: B5 88
bpl Label_F30D ; $32E6: 10 25
lda $3A ; $32E8: A5 3A
bne Label_F326 ; $32EA: D0 3A
lda $41,x ; $32EC: B5 41
bmi Label_F30D ; $32EE: 30 1D
dec $C3,x ; $32F0: D6 C3
bne Label_F327 ; $32F2: D0 33
txa ; $32F4: 8A
pha ; $32F5: 48
jsr $C726 ; $32F6: 20 26 C7
pla ; $32F9: 68
tax ; $32FA: AA
ldy #$02 ; $32FB: A0 02
dec $41,x ; $32FD: D6 41
sty $46 ; $32FF: 84 46
bmi Label_F30D ; $3301: 30 0A
jsr ResetObjectMotion ; $3303: 20 86 F3
jsr $F3B0 ; $3306: 20 B0 F3
lda #$80 ; $3309: A9 80
sta $F2 ; $330B: 85 F2
Label_F30D:
dex ; $330D: CA
bpl Label_F2E4 ; $330E: 10 D4
lda $41 ; $3310: A5 41
bpl Label_F318 ; $3312: 10 04
lda $42 ; $3314: A5 42
bmi Label_F366 ; $3316: 30 4E
Label_F318:
lda $3A ; $3318: A5 3A
beq Label_F327 ; $331A: F0 0B
jsr $E768 ; $331C: 20 68 E7
lda $061C ; $331F: AD 1C 06
and #$30 ; $3322: 29 30
beq Label_F2B9 ; $3324: F0 93
Label_F326:
rts ; $3326: 60
Label_F327:
ldx #$05 ; $3327: A2 05
Label_F329:
lda $8A,x ; $3329: B5 8A
beq Label_F32F ; $332B: F0 02
bpl Label_F2B9 ; $332D: 10 8A
Label_F32F:
dex ; $332F: CA
bpl Label_F329 ; $3330: 10 F7
lda $BB ; $3332: A5 BB
bpl Label_F2B9 ; $3334: 10 83
ldx $40 ; $3336: A6 40
Label_F338:
ldy $88,x ; $3338: B4 88
dey ; $333A: 88
bpl Label_F34C ; $333B: 10 0F
lda $41,x ; $333D: B5 41
bmi Label_F34C ; $333F: 30 0B
lda #$FF ; $3341: A9 FF
sta $88,x ; $3343: 95 88
lda #$01 ; $3345: A9 01
sta $C3,x ; $3347: 95 C3
jmp Label_F2B9 ; $3349: 4C B9 F2
Label_F34C:
dex ; $334C: CA
bpl Label_F338 ; $334D: 10 E9
lda #$02 ; $334F: A9 02
sta $F2 ; $3351: 85 F2
ldx #$96 ; $3353: A2 96
jsr $F45E ; $3355: 20 5E F4
ldx $3B ; $3358: A6 3B
inx ; $335A: E8
cpx #$10 ; $335B: E0 10
bne Label_F361 ; $335D: D0 02
ldx #$04 ; $335F: A2 04
Label_F361:
stx $3B ; $3361: 86 3B
jmp Label_F213 ; $3363: 4C 13 F2
Label_F366:
lda #$01 ; $3366: A9 01
sta $F2 ; $3368: 85 F2
lda #$00 ; $336A: A9 00
sta $17 ; $336C: 85 17
sta $18 ; $336E: 85 18
sta $15 ; $3370: 85 15
jsr $F40B ; $3372: 20 0B F4
Label_F375:
jsr $F465 ; $3375: 20 65 F4
jsr $E768 ; $3378: 20 68 E7
and #$30 ; $337B: 29 30
bne Label_F383 ; $337D: D0 04
dec $15 ; $337F: C6 15
bne Label_F375 ; $3381: D0 F2
Label_F383:
jmp Label_F1D4 ; $3383: 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 ; $3386: B5 41
bmi Label_F3AD ; $3388: 30 23
lda ObjectSpawnStateTable,x ; $338A: BD AE F3
sta $91,x ; $338D: 95 91
lda #$B8 ; $338F: A9 B8
sta $9A,x ; $3391: 95 9A
sta $BD,x ; $3393: 95 BD
lda #$C8 ; $3395: A9 C8
sta $BF,x ; $3397: 95 BF
lda #$5A ; $3399: A9 5A
ldy $41,x ; $339B: B4 41
bpl Label_F3A1 ; $339D: 10 02
lda #$01 ; $339F: A9 01
Label_F3A1:
sta $C3,x ; $33A1: 95 C3
lda #$00 ; $33A3: A9 00
sta $C1,x ; $33A5: 95 C1
sta $042D,x ; $33A7: 9D 2D 04
sta $0424,x ; $33AA: 9D 24 04
Label_F3AD:
rts ; $33AD: 60
ObjectSpawnStateTable:
.byte $20, $D0 ; $33AE: 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 ; $33B0: A9 03
sta $0451,x ; $33B2: 9D 51 04
lda #$02 ; $33B5: A9 02
sta $88,x ; $33B7: 95 88
rts ; $33B9: 60
RoundObjectTypeTable:
.byte $58, $50, $58, $50, $50, $40, $38, $30 ; $33BA: 58 50 58 50 50 40 38 30
.byte $28 ; $33C2: 28
RoundObjectPositionTable:
.byte $04, $04, $03, $03, $02, $02, $02, $02 ; $33C3: 04 04 03 03 02 02 02 02
.byte $02 ; $33CB: 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 ; $33CC: A5 3D
and #$20 ; $33CE: 29 20
beq Label_F3EE ; $33D0: F0 1C
ldx #$0A ; $33D2: A2 0A
Label_F3D4:
lda $F3F5,x ; $33D4: BD F5 F3
sta $57,x ; $33D7: 95 57
dex ; $33D9: CA
bpl Label_F3D4 ; $33DA: 10 F8
ldy #$0A ; $33DC: A0 0A
lda $3C ; $33DE: A5 3C
sta $43 ; $33E0: 85 43
jsr $D77C ; $33E2: 20 7C D7
sta $60 ; $33E5: 85 60
lda $43 ; $33E7: A5 43
sta $61 ; $33E9: 85 61
jmp $C12D ; $33EB: 4C 2D C1
Label_F3EE:
lda #$00 ; $33EE: A9 00
ldy #$F4 ; $33F0: A0 F4
jmp $C131 ; $33F2: 4C 31 C1
RoundInitAttributeTable:
.byte $20, $6C, $08, $19, $11, $0A, $1C, $0E ; $33F5: 20 6C 08 19 11 0A 1C 0E
.byte $25, $00, $00, $20, $6C, $08, $24, $24 ; $33FD: 25 00 00 20 6C 08 24 24
.byte $24, $24, $24, $24, $24, $24 ; $3405: 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 ; $340B: 20 65 F4
ldx #$01 ; $340E: A2 01
Label_F410:
lda $F43B,x ; $3410: BD 3B F4
ldy $F43D,x ; $3413: BC 3D F4
jsr $C131 ; $3416: 20 31 C1
dex ; $3419: CA
bpl Label_F410 ; $341A: 10 F4
ldx #$0F ; $341C: A2 0F
Label_F41E:
lda #$24 ; $341E: A9 24
sta $5A,x ; $3420: 95 5A
dex ; $3422: CA
bpl Label_F41E ; $3423: 10 F9
lda #$10 ; $3425: A9 10
sta $59 ; $3427: 85 59
lda #$21 ; $3429: A9 21
sta $57 ; $342B: 85 57
ldx #$02 ; $342D: A2 02
Label_F42F:
lda $F43F,x ; $342F: BD 3F F4
sta $58 ; $3432: 85 58
jsr $C12D ; $3434: 20 2D C1
dex ; $3437: CA
bpl Label_F42F ; $3438: 10 F5
rts ; $343A: 60
StatusPanelAddressLoTable:
.byte $42, $55 ; $343B: 42 55
StatusPanelAddressHiTable:
.byte $F4, $F4 ; $343D: F4 F4
StatusPanelTileData:
.byte $88, $A8, $E8, $21, $C8, $10, $24, $24 ; $343F: 88 A8 E8 21 C8 10 24 24
.byte $24, $10, $0A, $16, $0E, $24, $24, $18 ; $3447: 24 10 0A 16 0E 24 24 18
.byte $1F, $0E, $1B, $24, $24, $24, $23, $DA ; $344F: 1F 0E 1B 24 24 24 23 DA
.byte $04, $AA, $AA, $AA, $AA ; $3457: 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 ; $345C: A2 14
DelayFramesLoop:
jsr WaitOneFrame ; $345E: 20 65 F4
dex ; $3461: CA
bne DelayFramesLoop ; $3462: D0 FA
rts ; $3464: 60
; WaitOneFrame
; Purpose: block until the NMI/frame counter changes.
; Inputs: none.
; Returns: one frame elapsed.
WaitOneFrame:
lda #$00 ; $3465: A9 00
sta $02 ; $3467: 85 02
WaitForFrameCounter:
lda $02 ; $3469: A5 02
beq WaitForFrameCounter ; $346B: F0 FC
dec $02 ; $346D: C6 02
Label_F46F:
rts ; $346F: 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 ; $3470: 20 69 F4
lda $3A ; $3473: A5 3A
bne Label_F46F ; $3475: D0 F8
jsr $E768 ; $3477: 20 68 E7
and #$10 ; $347A: 29 10
beq Label_F46F ; $347C: F0 F1
lda #$04 ; $347E: A9 04
sta $F2 ; $3480: 85 F2
lda $01 ; $3482: A5 01
and #$EF ; $3484: 29 EF
sta $2001 ; $3486: 8D 01 20
Label_F489:
jsr WaitOneFrame ; $3489: 20 65 F4
jsr $E768 ; $348C: 20 68 E7
and #$10 ; $348F: 29 10
beq Label_F489 ; $3491: F0 F6
lda $01 ; $3493: A5 01
sta $2001 ; $3495: 8D 01 20
ldy #$04 ; $3498: A0 04
lda $C8 ; $349A: A5 C8
ora $16 ; $349C: 05 16
beq Label_F4A2 ; $349E: F0 02
ldy #$20 ; $34A0: A0 20
Label_F4A2:
sty $F2 ; $34A2: 84 F2
rts ; $34A4: 60
; InitializeGameplayGlobals
; Purpose: initialize common gameplay flags, counters, and player defaults.
; Inputs: none.
; Returns: core gameplay globals reset.
InitializeGameplayGlobals:
lda #$01 ; $34A5: A9 01
sta $048E ; $34A7: 8D 8E 04
sta $048F ; $34AA: 8D 8F 04
lda #$FF ; $34AD: A9 FF
sta $BB ; $34AF: 85 BB
sta $87 ; $34B1: 85 87
sta $048C ; $34B3: 8D 8C 04
ldx #$01 ; $34B6: A2 01
stx $0459 ; $34B8: 8E 59 04
stx $90 ; $34BB: 86 90
inx ; $34BD: E8
stx $46 ; $34BE: 86 46
lda #$40 ; $34C0: A9 40
sta $99 ; $34C2: 85 99
rts ; $34C4: 60
.incbin "prg.bin", $34C5, $003B
; 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 ; $3500: 20 8F F7
Label_F503:
rts ; $3503: 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 ; $3504: A9 00
tax ; $3506: AA
sta $FD ; $3507: 85 FD
beq Label_F51B ; $3509: F0 10
Label_F50B:
txa ; $350B: 8A
lsr a ; $350C: 4A
tax ; $350D: AA
Label_F50E:
inx ; $350E: E8
txa ; $350F: 8A
cmp #$04 ; $3510: C9 04
beq Label_F503 ; $3512: F0 EF
lda $FD ; $3514: A5 FD
clc ; $3516: 18
adc #$04 ; $3517: 69 04
sta $FD ; $3519: 85 FD
Label_F51B:
txa ; $351B: 8A
asl a ; $351C: 0A
tax ; $351D: AA
lda $E0,x ; $351E: B5 E0
sta $FE ; $3520: 85 FE
lda $E1,x ; $3522: B5 E1
sta $FF ; $3524: 85 FF
lda $E1,x ; $3526: B5 E1
beq Label_F50B ; $3528: F0 E1
txa ; $352A: 8A
lsr a ; $352B: 4A
tax ; $352C: AA
dec $D0,x ; $352D: D6 D0
bne Label_F50E ; $352F: D0 DD
Label_F531:
ldy $E8,x ; $3531: B4 E8
inc $E8,x ; $3533: F6 E8
lda ($FE),y ; $3535: B1 FE
beq UpdateSoundEngine ; $3537: F0 C7
tay ; $3539: A8
cmp #$FF ; $353A: C9 FF
beq Label_F547 ; $353C: F0 09
and #$C0 ; $353E: 29 C0
cmp #$C0 ; $3540: C9 C0
beq Label_F553 ; $3542: F0 0F
jmp Label_F561 ; $3544: 4C 61 F5
Label_F547:
lda $D8,x ; $3547: B5 D8
beq Label_F55E ; $3549: F0 13
dec $D8,x ; $354B: D6 D8
lda $EC,x ; $354D: B5 EC
sta $E8,x ; $354F: 95 E8
bne Label_F55E ; $3551: D0 0B
Label_F553:
tya ; $3553: 98
and #$3F ; $3554: 29 3F
sta $D8,x ; $3556: 95 D8
dec $D8,x ; $3558: D6 D8
lda $E8,x ; $355A: B5 E8
sta $EC,x ; $355C: 95 EC
Label_F55E:
jmp Label_F531 ; $355E: 4C 31 F5
Label_F561:
tya ; $3561: 98
bpl Label_F57B ; $3562: 10 17
and #$0F ; $3564: 29 0F
clc ; $3566: 18
adc $DF ; $3567: 65 DF
tay ; $3569: A8
lda SoundCommandMaskTable,y ; $356A: B9 60 F6
sta $D4,x ; $356D: 95 D4
tay ; $356F: A8
txa ; $3570: 8A
cmp #$02 ; $3571: C9 02
beq Label_F5C4 ; $3573: F0 4F
Label_F575:
ldy $E8,x ; $3575: B4 E8
inc $E8,x ; $3577: F6 E8
lda ($FE),y ; $3579: B1 FE
Label_F57B:
tay ; $357B: A8
txa ; $357C: 8A
cmp #$03 ; $357D: C9 03
beq Label_F5E1 ; $357F: F0 60
pha ; $3581: 48
tax ; $3582: AA
cmp #$01 ; $3583: C9 01
beq Label_F5B9 ; $3585: F0 32
Label_F587:
ldx $FD ; $3587: A6 FD
lda ApuPeriodLowTable,y ; $3589: B9 01 F6
beq Label_F599 ; $358C: F0 0B
sta $4002,x ; $358E: 9D 02 40
lda ApuPeriodHighTable,y ; $3591: B9 00 F6
ora #$08 ; $3594: 09 08
sta $4003,x ; $3596: 9D 03 40
Label_F599:
tay ; $3599: A8
pla ; $359A: 68
tax ; $359B: AA
tya ; $359C: 98
bne Label_F5AA ; $359D: D0 0B
ldy #$00 ; $359F: A0 00
txa ; $35A1: 8A
cmp #$02 ; $35A2: C9 02
beq Label_F5AC ; $35A4: F0 06
ldy #$10 ; $35A6: A0 10
bne Label_F5AC ; $35A8: D0 02
Label_F5AA:
ldy $DC,x ; $35AA: B4 DC
Label_F5AC:
tya ; $35AC: 98
ldy $FD ; $35AD: A4 FD
sta $4000,y ; $35AF: 99 00 40
Label_F5B2:
lda $D4,x ; $35B2: B5 D4
sta $D0,x ; $35B4: 95 D0
jmp Label_F50E ; $35B6: 4C 0E F5
Label_F5B9:
lda $F5 ; $35B9: A5 F5
and #$02 ; $35BB: 29 02
beq Label_F587 ; $35BD: F0 C8
pla ; $35BF: 68
tax ; $35C0: AA
jmp Label_F5B2 ; $35C1: 4C B2 F5
Label_F5C4:
tya ; $35C4: 98
ldy $07F0 ; $35C5: AC F0 07
beq Label_F5CE ; $35C8: F0 04
lda #$FF ; $35CA: A9 FF
bne Label_F5D9 ; $35CC: D0 0B
Label_F5CE:
clc ; $35CE: 18
adc #$FE ; $35CF: 69 FE
asl a ; $35D1: 0A
asl a ; $35D2: 0A
cmp #$3C ; $35D3: C9 3C
bcc Label_F5D9 ; $35D5: 90 02
lda #$3C ; $35D7: A9 3C
Label_F5D9:
sta $4008 ; $35D9: 8D 08 40
sta $DE ; $35DC: 85 DE
jmp Label_F575 ; $35DE: 4C 75 F5
Label_F5E1:
lda $F4 ; $35E1: A5 F4
cmp #$02 ; $35E3: C9 02
beq Label_F5F9 ; $35E5: F0 12
lda $F700,y ; $35E7: B9 00 F7
sta $400C ; $35EA: 8D 0C 40
lda $F701,y ; $35ED: B9 01 F7
sta $400E ; $35F0: 8D 0E 40
lda $F702,y ; $35F3: B9 02 F7
sta $400F ; $35F6: 8D 0F 40
Label_F5F9:
jmp Label_F5B2 ; $35F9: 4C B2 F5
.incbin "prg.bin", $35FC, $0004
; 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 ; $3600: 07 F0 00 00 00 D4 00 C8
.byte $00, $BD, $00, $B2, $00, $A8, $00, $9F ; $3608: 00 BD 00 B2 00 A8 00 9F
.byte $00, $96, $00, $8D, $00, $85, $00, $7E ; $3610: 00 96 00 8D 00 85 00 7E
.byte $00, $76, $00, $70, $01, $AB, $01, $93 ; $3618: 00 76 00 70 01 AB 01 93
.byte $01, $7C, $01, $67, $01, $52, $01, $3F ; $3620: 01 7C 01 67 01 52 01 3F
.byte $01, $2D, $01, $1C, $01, $0C, $00, $FD ; $3628: 01 2D 01 1C 01 0C 00 FD
.byte $00, $EE, $00, $E1, $03, $57, $03, $27 ; $3630: 00 EE 00 E1 03 57 03 27
.byte $02, $F9, $02, $CF, $02, $A6, $02, $80 ; $3638: 02 F9 02 CF 02 A6 02 80
.byte $02, $5C, $02, $3A, $02, $1A, $01, $FC ; $3640: 02 5C 02 3A 02 1A 01 FC
.byte $01, $DF, $01, $C4, $03, $F8, $00, $69 ; $3648: 01 DF 01 C4 03 F8 00 69
.byte $00, $63, $00, $5E, $00, $58, $00, $53 ; $3650: 00 63 00 5E 00 58 00 53
.byte $00, $4F, $00, $4A, $00, $46, $00, $42 ; $3658: 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 ; $3660: 03 06 0C 18 30 12 24 09
.byte $08, $04, $07, $01, $04, $08, $10, $20 ; $3668: 08 04 07 01 04 08 10 20
.byte $40, $18, $30, $0C, $01, $06, $0C, $18 ; $3670: 40 18 30 0C 01 06 0C 18
.byte $30, $60, $24, $48, $12, $10, $08, $0E ; $3678: 30 60 24 48 12 10 08 0E
.byte $02, $03, $04 ; $3680: 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 ; $3683: A9 00
beq Label_F691 ; $3685: 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 ; $3687: A9 08
bne Label_F691 ; $3689: 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 ; $368B: A9 0C
bne Label_F691 ; $368D: 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 ; $368F: A9 04
Label_F691:
sta $F9 ; $3691: 85 F9
lda #$40 ; $3693: A9 40
sta $FA ; $3695: 85 FA
stx $FB ; $3697: 86 FB
sty $FC ; $3699: 84 FC
ldy #$00 ; $369B: A0 00
Label_F69D:
lda ($FB),y ; $369D: B1 FB
sta ($F9),y ; $369F: 91 F9
iny ; $36A1: C8
tya ; $36A2: 98
cmp #$04 ; $36A3: C9 04
bne Label_F69D ; $36A5: D0 F6
rts ; $36A7: 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 ; $36A8: AA
jsr $F798 ; $36A9: 20 98 F7
stx $F6 ; $36AC: 86 F6
lda $07F5 ; $36AE: AD F5 07
beq Label_F6BE ; $36B1: F0 0B
cmp #$02 ; $36B3: C9 02
bne Label_F6BE ; $36B5: D0 07
sta $F0 ; $36B7: 85 F0
lda #$00 ; $36B9: A9 00
sta $07F5 ; $36BB: 8D F5 07
Label_F6BE:
lda SoundSequencePointerTable,y ; $36BE: B9 CA FB
tay ; $36C1: A8
ldx #$00 ; $36C2: A2 00
Label_F6C4:
lda SoundSequencePointerTable,y ; $36C4: B9 CA FB
sta $DF,x ; $36C7: 95 DF
iny ; $36C9: C8
inx ; $36CA: E8
txa ; $36CB: 8A
cmp #$09 ; $36CC: C9 09
bne Label_F6C4 ; $36CE: D0 F4
lda #$01 ; $36D0: A9 01
sta $D0 ; $36D2: 85 D0
sta $D1 ; $36D4: 85 D1
sta $D2 ; $36D6: 85 D2
sta $D3 ; $36D8: 85 D3
lda #$00 ; $36DA: A9 00
sta $E8 ; $36DC: 85 E8
sta $E9 ; $36DE: 85 E9
sta $EA ; $36E0: 85 EA
sta $EB ; $36E2: 85 EB
rts ; $36E4: 60
; Preserved sound data / unused bytes
Data_F6E5:
.byte $94, $AB, $FD, $58, $00, $7F, $04, $18 ; $36E5: 94 AB FD 58 00 7F 04 18
.byte $3F, $7F, $00, $00, $06, $7F, $0A, $C0 ; $36ED: 3F 7F 00 00 06 7F 0A C0
.byte $08, $7F, $05, $C0, $C1, $89, $02, $0F ; $36F5: 08 7F 05 C0 C1 89 02 0F
.byte $FF, $FF, $FF, $10, $00, $18, $10, $01 ; $36FD: FF FF FF 10 00 18 10 01
.byte $18, $00, $01, $88, $02, $02, $40, $03 ; $3705: 18 00 01 88 02 02 40 03
.byte $05, $40, $04, $07, $40 ; $370D: 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 ; $3712: A9 7F
sta $4001 ; $3714: 8D 01 40
sta $4005 ; $3717: 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 ; $371A: 86 DC
sty $DD ; $371C: 84 DD
rts ; $371E: 60
Sound_F71F:
ldx #$E5 ; $371F: A2 E5
ldy #$F6 ; $3721: A0 F6
bne Sound_F745 ; $3723: 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 ; $3725: A5 F3
lsr a ; $3727: 4A
bcs Sound_F736 ; $3728: B0 0C
lda $F7 ; $372A: A5 F7
lsr a ; $372C: 4A
bcs Sound_F749 ; $372D: B0 1A
lda $F0 ; $372F: A5 F0
and #$10 ; $3731: 29 10
bne Sound_F71F ; $3733: D0 EA
rts ; $3735: 60
Sound_F736:
lda $F7 ; $3736: A5 F7
ora #$01 ; $3738: 09 01
sta $F7 ; $373A: 85 F7
lda #$00 ; $373C: A9 00
sta $07E4 ; $373E: 8D E4 07
ldx #$FC ; $3741: A2 FC
ldy #$F5 ; $3743: A0 F5
Sound_F745:
jsr $F683 ; $3745: 20 83 F6
rts ; $3748: 60
Sound_F749:
inc $07E4 ; $3749: EE E4 07
lda $07E4 ; $374C: AD E4 07
cmp #$58 ; $374F: C9 58
bne Sound_F77B ; $3751: D0 28
lda #$00 ; $3753: A9 00
sta $F7 ; $3755: 85 F7
rts ; $3757: 60
Sound_F758:
lda #$C0 ; $3758: A9 C0
sta $4017 ; $375A: 8D 17 40
jsr UpdateSoundPriority ; $375D: 20 25 FB
jsr ProcessMusicRequest ; $3760: 20 0A F9
jsr UpdatePulseEffects ; $3763: 20 38 FA
jsr UpdateNoiseEffects ; $3766: 20 AC FA
jsr ProcessSoundEffectRequests ; $3769: 20 24 F8
lda $F1 ; $376C: A5 F1
sta $07E9 ; $376E: 8D E9 07
lda #$00 ; $3771: A9 00
sta $F0 ; $3773: 85 F0
sta $F1 ; $3775: 85 F1
sta $F2 ; $3777: 85 F2
sta $F3 ; $3779: 85 F3
Sound_F77B:
rts ; $377B: 60
Sound_F77C:
lda $F4 ; $377C: A5 F4
and #$06 ; $377E: 29 06
bne Sound_F77B ; $3780: D0 F9
lda $F4 ; $3782: A5 F4
and #$F0 ; $3784: 29 F0
sta $F4 ; $3786: 85 F4
ldx #$E9 ; $3788: A2 E9
ldy #$F6 ; $378A: A0 F6
jmp Sound_F879 ; $378C: 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 ; $378F: A5 F6
cmp #$20 ; $3791: C9 20
bne Sound_F79F ; $3793: D0 0A
inc $07E8 ; $3795: 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 ; $3798: 29 0F
cmp #$0F ; $379A: C9 0F
bne ResetAllSoundState ; $379C: D0 07
txa ; $379E: 8A
Sound_F79F:
lda $F4 ; $379F: A5 F4
and #$20 ; $37A1: 29 20
bne Sound_F7C7 ; $37A3: 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 ; $37A5: A9 10
sta $400C ; $37A7: 8D 0C 40
sta $4000 ; $37AA: 8D 00 40
sta $4004 ; $37AD: 8D 04 40
lda #$00 ; $37B0: A9 00
sta $F4 ; $37B2: 85 F4
Sound_F7B4:
sta $F5 ; $37B4: 85 F5
sta $F6 ; $37B6: 85 F6
sta $07FA ; $37B8: 8D FA 07
sta $F7 ; $37BB: 85 F7
sta $4008 ; $37BD: 8D 08 40
sta $4011 ; $37C0: 8D 11 40
sta $07F0 ; $37C3: 8D F0 07
rts ; $37C6: 60
Sound_F7C7:
lda #$10 ; $37C7: A9 10
sta $4004 ; $37C9: 8D 04 40
sta $400C ; $37CC: 8D 0C 40
lda #$00 ; $37CF: A9 00
beq Sound_F7B4 ; $37D1: F0 E1
Sound_F7D3:
lda #$00 ; $37D3: A9 00
sta $07FA ; $37D5: 8D FA 07
rts ; $37D8: 60
Sound_F7D9:
ldx #$F5 ; $37D9: A2 F5
ldy #$F6 ; $37DB: A0 F6
jmp Sound_F879 ; $37DD: 4C 79 F8
Sound_F7E0:
inc $07FB ; $37E0: EE FB 07
lda $07FB ; $37E3: AD FB 07
cmp #$10 ; $37E6: C9 10
beq Sound_F7D9 ; $37E8: F0 EF
cmp #$20 ; $37EA: C9 20
beq Sound_F7D3 ; $37EC: F0 E5
rts ; $37EE: 60
Sound_F7EF:
lda #$00 ; $37EF: A9 00
sta $07FB ; $37F1: 8D FB 07
lda #$F0 ; $37F4: A9 F0
sta $07FA ; $37F6: 8D FA 07
ldx #$F1 ; $37F9: A2 F1
ldy #$F6 ; $37FB: A0 F6
jmp Sound_F879 ; $37FD: 4C 79 F8
Sound_F800:
lda $F4 ; $3800: A5 F4
and #$F0 ; $3802: 29 F0
ora #$02 ; $3804: 09 02
sta $F4 ; $3806: 85 F4
lda #$00 ; $3808: A9 00
sta $07F7 ; $380A: 8D F7 07
ldx #$F1 ; $380D: A2 F1
ldy #$F6 ; $380F: A0 F6
jmp Sound_F879 ; $3811: 4C 79 F8
Sound_F814:
inc $07F7 ; $3814: EE F7 07
lda $07F7 ; $3817: AD F7 07
cmp #$10 ; $381A: C9 10
bne Sound_F85B ; $381C: D0 3D
jmp Sound_F89B ; $381E: 4C 9B F8
Sound_F821:
jmp ResetAllSoundState ; $3821: 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 ; $3824: A5 F0
lsr a ; $3826: 4A
bcs Sound_F821 ; $3827: B0 F8
lda $F6 ; $3829: A5 F6
cmp #$DF ; $382B: C9 DF
beq Sound_F83B ; $382D: F0 0C
cmp #$7F ; $382F: C9 7F
beq Sound_F83B ; $3831: F0 08
cmp #$20 ; $3833: C9 20
beq Sound_F83B ; $3835: F0 04
lda $F6 ; $3837: A5 F6
bne Sound_F85B ; $3839: D0 20
Sound_F83B:
lda $07FA ; $383B: AD FA 07
cmp #$0F ; $383E: C9 0F
beq Sound_F7EF ; $3840: F0 AD
cmp #$F0 ; $3842: C9 F0
beq Sound_F7E0 ; $3844: F0 9A
lda $F0 ; $3846: A5 F0
lsr a ; $3848: 4A
lsr a ; $3849: 4A
bcs Sound_F800 ; $384A: B0 B4
lsr a ; $384C: 4A
bcs Sound_F85F ; $384D: B0 10
lsr a ; $384F: 4A
bcs Sound_F85C ; $3850: B0 0A
lda $F4 ; $3852: A5 F4
lsr a ; $3854: 4A
lsr a ; $3855: 4A
bcs Sound_F814 ; $3856: B0 BC
lsr a ; $3858: 4A
bcs Sound_F87D ; $3859: B0 22
Sound_F85B:
rts ; $385B: 60
Sound_F85C:
jmp Sound_F77C ; $385C: 4C 7C F7
Sound_F85F:
lda $F4 ; $385F: A5 F4
and #$80 ; $3861: 29 80
bne Sound_F85B ; $3863: D0 F6
lda $F4 ; $3865: A5 F4
and #$F0 ; $3867: 29 F0
ora #$04 ; $3869: 09 04
sta $F4 ; $386B: 85 F4
lda #$00 ; $386D: A9 00
sta $07F3 ; $386F: 8D F3 07
sta $07F1 ; $3872: 8D F1 07
ldx #$ED ; $3875: A2 ED
ldy #$F6 ; $3877: A0 F6
Sound_F879:
jsr $F68B ; $3879: 20 8B F6
rts ; $387C: 60
Sound_F87D:
inc $07F3 ; $387D: EE F3 07
lda $07F3 ; $3880: AD F3 07
cmp #$03 ; $3883: C9 03
bne Sound_F8A1 ; $3885: D0 1A
lda #$00 ; $3887: A9 00
sta $07F3 ; $3889: 8D F3 07
inc $07F1 ; $388C: EE F1 07
lda $07F1 ; $388F: AD F1 07
cmp #$10 ; $3892: C9 10
bne Sound_F8A2 ; $3894: D0 0C
lda #$10 ; $3896: A9 10
sta $400C ; $3898: 8D 0C 40
Sound_F89B:
lda $F4 ; $389B: A5 F4
and #$F0 ; $389D: 29 F0
sta $F4 ; $389F: 85 F4
Sound_F8A1:
rts ; $38A1: 60
Sound_F8A2:
sta $400E ; $38A2: 8D 0E 40
rts ; $38A5: 60
Sound_F8A6:
lda #$00 ; $38A6: A9 00
sta $07E0 ; $38A8: 8D E0 07
clc ; $38AB: 18
lda $1B ; $38AC: A5 1B
and #$07 ; $38AE: 29 07
adc #$02 ; $38B0: 69 02
sta $07E1 ; $38B2: 8D E1 07
lda $F7 ; $38B5: A5 F7
and #$00 ; $38B7: 29 00
ora #$80 ; $38B9: 09 80
sta $F7 ; $38BB: 85 F7
bne Sound_F8E8 ; $38BD: D0 29
Sound_F8BF:
inc $07E0 ; $38BF: EE E0 07
lda $07E0 ; $38C2: AD E0 07
cmp $07E1 ; $38C5: CD E1 07
bne Sound_F8E8 ; $38C8: D0 1E
Sound_F8CA:
lda #$10 ; $38CA: A9 10
sta $4000 ; $38CC: 8D 00 40
sta $4004 ; $38CF: 8D 04 40
lda #$00 ; $38D2: A9 00
sta $F7 ; $38D4: 85 F7
lda $F4 ; $38D6: A5 F4
and #$0F ; $38D8: 29 0F
sta $F4 ; $38DA: 85 F4
rts ; $38DC: 60
Sound_F8DD:
jsr ResetAllSoundState ; $38DD: 20 A5 F7
lda #$80 ; $38E0: A9 80
sta $F4 ; $38E2: 85 F4
lda #$02 ; $38E4: A9 02
sta $F0 ; $38E6: 85 F0
Sound_F8E8:
ldx #$F9 ; $38E8: A2 F9
ldy #$F6 ; $38EA: A0 F6
jsr $F683 ; $38EC: 20 83 F6
lda $1B ; $38EF: A5 1B
and #$0F ; $38F1: 29 0F
sta $4002 ; $38F3: 8D 02 40
ldx #$F9 ; $38F6: A2 F9
ldy #$F6 ; $38F8: A0 F6
jsr $F68F ; $38FA: 20 8F F6
lda $1B ; $38FD: A5 1B
lsr a ; $38FF: 4A
lsr a ; $3900: 4A
and #$0F ; $3901: 29 0F
sta $4006 ; $3903: 8D 06 40
rts ; $3906: 60
Sound_F907:
jmp Sound_F8A6 ; $3907: 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 ; $390A: A5 F6
beq Sound_F91B ; $390C: F0 0D
cmp #$DF ; $390E: C9 DF
beq Sound_F91B ; $3910: F0 09
lda $F0 ; $3912: A5 F0
and #$E0 ; $3914: 29 E0
beq Sound_F94E ; $3916: F0 36
jsr ResetAllSoundState ; $3918: 20 A5 F7
Sound_F91B:
lda $F0 ; $391B: A5 F0
asl a ; $391D: 0A
bcs Sound_F8DD ; $391E: B0 BD
asl a ; $3920: 0A
bcs Sound_F952 ; $3921: B0 2F
asl a ; $3923: 0A
bcs Sound_F965 ; $3924: B0 3F
lda $F4 ; $3926: A5 F4
asl a ; $3928: 0A
bcs Sound_F8E8 ; $3929: B0 BD
lda $F4 ; $392B: A5 F4
and #$E0 ; $392D: 29 E0
bne Sound_F94E ; $392F: D0 1D
lda $F6 ; $3931: A5 F6
cmp #$DF ; $3933: C9 DF
beq Sound_F94B ; $3935: F0 14
lda $F6 ; $3937: A5 F6
bne Sound_F94E ; $3939: D0 13
lda $F3 ; $393B: A5 F3
asl a ; $393D: 0A
bcs Sound_F907 ; $393E: B0 C7
asl a ; $3940: 0A
bcs Sound_F977 ; $3941: B0 34
lda $F7 ; $3943: A5 F7
asl a ; $3945: 0A
bcs Sound_F94F ; $3946: B0 07
asl a ; $3948: 0A
bcs Sound_F993 ; $3949: B0 48
Sound_F94B:
jsr UpdateMusicTempo ; $394B: 20 25 F7
Sound_F94E:
rts ; $394E: 60
Sound_F94F:
jmp Sound_F8BF ; $394F: 4C BF F8
Sound_F952:
lda #$0F ; $3952: A9 0F
sta $07FA ; $3954: 8D FA 07
lda $F4 ; $3957: A5 F4
and #$0F ; $3959: 29 0F
ora #$40 ; $395B: 09 40
sta $F4 ; $395D: 85 F4
ldx #$D1 ; $395F: A2 D1
ldy #$F9 ; $3961: A0 F9
bne Sound_F98F ; $3963: D0 2A
Sound_F965:
lda #$02 ; $3965: A9 02
sta $F0 ; $3967: 85 F0
lda $F4 ; $3969: A5 F4
and #$0F ; $396B: 29 0F
ora #$20 ; $396D: 09 20
sta $F4 ; $396F: 85 F4
ldx #$CD ; $3971: A2 CD
ldy #$F9 ; $3973: A0 F9
bne Sound_F98F ; $3975: D0 18
Sound_F977:
lda #$00 ; $3977: A9 00
sta $07FC ; $3979: 8D FC 07
lda $F7 ; $397C: A5 F7
and #$00 ; $397E: 29 00
ora #$40 ; $3980: 09 40
sta $F7 ; $3982: 85 F7
ldx #$D5 ; $3984: A2 D5
ldy #$F9 ; $3986: A0 F9
jsr $F68F ; $3988: 20 8F F6
ldx #$D9 ; $398B: A2 D9
ldy #$F9 ; $398D: A0 F9
Sound_F98F:
jsr $F683 ; $398F: 20 83 F6
rts ; $3992: 60
Sound_F993:
inc $07FC ; $3993: EE FC 07
lda $07FC ; $3996: AD FC 07
cmp #$12 ; $3999: C9 12
beq Sound_F9CA ; $399B: F0 2D
cmp #$06 ; $399D: C9 06
bcc Sound_F9B1 ; $399F: 90 10
lda $1B ; $39A1: A5 1B
ora #$10 ; $39A3: 09 10
and #$7F ; $39A5: 29 7F
sta $07FE ; $39A7: 8D FE 07
rol a ; $39AA: 2A
sta $07FD ; $39AB: 8D FD 07
jmp Sound_F9BD ; $39AE: 4C BD F9
Sound_F9B1:
inc $07FD ; $39B1: EE FD 07
inc $07FD ; $39B4: EE FD 07
inc $07FE ; $39B7: EE FE 07
inc $07FE ; $39BA: EE FE 07
Sound_F9BD:
lda $07FD ; $39BD: AD FD 07
sta $4006 ; $39C0: 8D 06 40
lda $07FE ; $39C3: AD FE 07
sta $4002 ; $39C6: 8D 02 40
rts ; $39C9: 60
Sound_F9CA:
jmp Sound_F8CA ; $39CA: 4C CA F8
; Preserved sound data / unused bytes
Data_F9CD:
.byte $B8, $D5, $20, $00, $9F, $93, $80, $22 ; $39CD: B8 D5 20 00 9F 93 80 22
.byte $3F, $BA, $E0, $06, $3F, $BB, $CE, $06 ; $39D5: 3F BA E0 06 3F BB CE 06
.byte $B8, $93, $50, $02, $80, $7F, $60, $68 ; $39DD: B8 93 50 02 80 7F 60 68
.byte $80, $7F, $62, $68 ; $39E5: 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 ; $39E9: A5 F5
and #$02 ; $39EB: 29 02
bne Sound_FA26 ; $39ED: D0 37
lda $F6 ; $39EF: A5 F6
cmp #$DF ; $39F1: C9 DF
beq Sound_F9F9 ; $39F3: F0 04
lda $F6 ; $39F5: A5 F6
bne Sound_FA26 ; $39F7: D0 2D
Sound_F9F9:
lda #$00 ; $39F9: A9 00
sta $07F9 ; $39FB: 8D F9 07
lda $F5 ; $39FE: A5 F5
and #$E0 ; $3A00: 29 E0
ora #$02 ; $3A02: 09 02
sta $F5 ; $3A04: 85 F5
ldx #$DD ; $3A06: A2 DD
ldy #$F9 ; $3A08: A0 F9
bne Sound_FA7F ; $3A0A: D0 73
Sound_FA0C:
inc $07F9 ; $3A0C: EE F9 07
lda $07F9 ; $3A0F: AD F9 07
cmp #$07 ; $3A12: C9 07
bne Sound_FA26 ; $3A14: D0 10
lda #$7F ; $3A16: A9 7F
sta $4005 ; $3A18: 8D 05 40
lda #$10 ; $3A1B: A9 10
sta $4004 ; $3A1D: 8D 04 40
lda $F5 ; $3A20: A5 F5
and #$E0 ; $3A22: 29 E0
sta $F5 ; $3A24: 85 F5
Sound_FA26:
rts ; $3A26: 60
Sound_FA27:
jsr ResetAllSoundState ; $3A27: 20 A5 F7
ldx #$E1 ; $3A2A: A2 E1
ldy #$F9 ; $3A2C: A0 F9
jsr $F683 ; $3A2E: 20 83 F6
ldx #$E5 ; $3A31: A2 E5
ldy #$F9 ; $3A33: A0 F9
jmp Sound_FA7F ; $3A35: 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 ; $3A38: A5 F6
beq Sound_FA42 ; $3A3A: F0 06
and #$0F ; $3A3C: 29 0F
cmp #$0F ; $3A3E: C9 0F
bne Sound_FA63 ; $3A40: D0 21
Sound_FA42:
lda $F4 ; $3A42: A5 F4
and #$80 ; $3A44: 29 80
bne Sound_FA63 ; $3A46: D0 1B
lda $F7 ; $3A48: A5 F7
and #$C0 ; $3A4A: 29 C0
bne Sound_FA63 ; $3A4C: D0 15
lda $F1 ; $3A4E: A5 F1
lsr a ; $3A50: 4A
bcs Sound_FA27 ; $3A51: B0 D4
lsr a ; $3A53: 4A
bcs UpdateSoundEnvelopes ; $3A54: B0 93
lsr a ; $3A56: 4A
bcs Sound_FA83 ; $3A57: B0 2A
lsr a ; $3A59: 4A
lsr a ; $3A5A: 4A
bcs Sound_FA64 ; $3A5B: B0 07
lda $F5 ; $3A5D: A5 F5
lsr a ; $3A5F: 4A
lsr a ; $3A60: 4A
bcs Sound_FA0C ; $3A61: B0 A9
Sound_FA63:
rts ; $3A63: 60
Sound_FA64:
lda $F6 ; $3A64: A5 F6
bne Sound_FA63 ; $3A66: D0 FB
lda $F5 ; $3A68: A5 F5
and #$02 ; $3A6A: 29 02
bne Sound_FA63 ; $3A6C: D0 F5
ldx #$8A ; $3A6E: A2 8A
ldy #$FA ; $3A70: A0 FA
jsr $F68F ; $3A72: 20 8F F6
lda $1B ; $3A75: A5 1B
and #$3F ; $3A77: 29 3F
ora #$10 ; $3A79: 09 10
sta $4006 ; $3A7B: 8D 06 40
rts ; $3A7E: 60
Sound_FA7F:
jsr $F68F ; $3A7F: 20 8F F6
rts ; $3A82: 60
Sound_FA83:
ldy #$0A ; $3A83: A0 0A
lda #$EF ; $3A85: A9 EF
jmp Sound_FBA5 ; $3A87: 4C A5 FB
; Preserved sound data / unused bytes
Data_FA8A:
.byte $D9, $86, $A8, $48, $08, $7F, $40, $28 ; $3A8A: D9 86 A8 48 08 7F 40 28
.byte $08, $7F, $45, $28 ; $3A92: 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 ; $3A96: EE F6 07
lda $07F6 ; $3A99: AD F6 07
cmp #$04 ; $3A9C: C9 04
bne Sound_FAD8 ; $3A9E: D0 38
lda $F5 ; $3AA0: A5 F5
and #$1F ; $3AA2: 29 1F
sta $F5 ; $3AA4: 85 F5
ldx #$92 ; $3AA6: A2 92
ldy #$FA ; $3AA8: A0 FA
bne Sound_FB00 ; $3AAA: 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 ; $3AAC: A5 F6
beq Sound_FABA ; $3AAE: F0 0A
cmp #$08 ; $3AB0: C9 08
beq Sound_FABA ; $3AB2: F0 06
and #$0F ; $3AB4: 29 0F
cmp #$0F ; $3AB6: C9 0F
bne Sound_FAD8 ; $3AB8: D0 1E
Sound_FABA:
lda $F4 ; $3ABA: A5 F4
and #$80 ; $3ABC: 29 80
bne Sound_FAD8 ; $3ABE: D0 18
lda $F1 ; $3AC0: A5 F1
asl a ; $3AC2: 0A
bcs Sound_FB17 ; $3AC3: B0 52
asl a ; $3AC5: 0A
bcs Sound_FAE2 ; $3AC6: B0 1A
lda $F5 ; $3AC8: A5 F5
asl a ; $3ACA: 0A
asl a ; $3ACB: 0A
bcs UpdateTriangleEffects ; $3ACC: B0 C8
lda $F1 ; $3ACE: A5 F1
and #$20 ; $3AD0: 29 20
beq Sound_FAD9 ; $3AD2: F0 05
lda $F6 ; $3AD4: A5 F6
beq Sound_FB04 ; $3AD6: F0 2C
Sound_FAD8:
rts ; $3AD8: 60
Sound_FAD9:
lda $F6 ; $3AD9: A5 F6
cmp #$DF ; $3ADB: C9 DF
bne Sound_FAD8 ; $3ADD: D0 F9
jmp Sound_F79F ; $3ADF: 4C 9F F7
Sound_FAE2:
lda $F5 ; $3AE2: A5 F5
and #$1F ; $3AE4: 29 1F
ora #$40 ; $3AE6: 09 40
sta $F5 ; $3AE8: 85 F5
lda #$00 ; $3AEA: A9 00
sta $4008 ; $3AEC: 8D 08 40
sta $F6 ; $3AEF: 85 F6
sta $07F6 ; $3AF1: 8D F6 07
lda #$10 ; $3AF4: A9 10
sta $4004 ; $3AF6: 8D 04 40
sta $400C ; $3AF9: 8D 0C 40
ldx #$8E ; $3AFC: A2 8E
ldy #$FA ; $3AFE: A0 FA
Sound_FB00:
jsr $F687 ; $3B00: 20 87 F6
rts ; $3B03: 60
Sound_FB04:
lda $07E9 ; $3B04: AD E9 07
and #$20 ; $3B07: 29 20
bne Sound_FB10 ; $3B09: D0 05
lda #$02 ; $3B0B: A9 02
sta $07F5 ; $3B0D: 8D F5 07
Sound_FB10:
ldy #$08 ; $3B10: A0 08
lda #$DF ; $3B12: A9 DF
jmp Sound_FBA5 ; $3B14: 4C A5 FB
Sound_FB17:
ldy #$04 ; $3B17: A0 04
lda #$7F ; $3B19: A9 7F
jmp Sound_FBA5 ; $3B1B: 4C A5 FB
Sound_FB1E:
ldy #$00 ; $3B1E: A0 00
lda #$02 ; $3B20: A9 02
jmp Sound_FBC1 ; $3B22: 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 ; $3B25: AD E8 07
bne Sound_FB5E ; $3B28: D0 34
lda $F2 ; $3B2A: A5 F2
lsr a ; $3B2C: 4A
bcs Sound_FB82 ; $3B2D: B0 53
lsr a ; $3B2F: 4A
bcs Sound_FB1E ; $3B30: B0 EC
lsr a ; $3B32: 4A
bcs Sound_FB4C ; $3B33: B0 17
lsr a ; $3B35: 4A
bcs Sound_FB7C ; $3B36: B0 44
lsr a ; $3B38: 4A
bcs Sound_FB69 ; $3B39: B0 2E
lsr a ; $3B3B: 4A
bcs Sound_FB5E ; $3B3C: B0 20
lsr a ; $3B3E: 4A
bcs Sound_FB58 ; $3B3F: B0 17
lsr a ; $3B41: 4A
bcs Sound_FB52 ; $3B42: B0 0E
lda $F6 ; $3B44: A5 F6
bne Sound_FB49 ; $3B46: D0 01
rts ; $3B48: 60
Sound_FB49:
jmp $F504 ; $3B49: 4C 04 F5
Sound_FB4C:
ldy #$02 ; $3B4C: A0 02
lda #$04 ; $3B4E: A9 04
bne Sound_FBA5 ; $3B50: D0 53
Sound_FB52:
ldy #$09 ; $3B52: A0 09
lda #$80 ; $3B54: A9 80
bne Sound_FB6D ; $3B56: D0 15
Sound_FB58:
ldy #$07 ; $3B58: A0 07
lda #$40 ; $3B5A: A9 40
bne Sound_FB6D ; $3B5C: D0 0F
Sound_FB5E:
lda #$00 ; $3B5E: A9 00
sta $07E8 ; $3B60: 8D E8 07
ldy #$06 ; $3B63: A0 06
lda #$20 ; $3B65: A9 20
bne Sound_FBC1 ; $3B67: D0 58
Sound_FB69:
ldy #$05 ; $3B69: A0 05
lda #$10 ; $3B6B: A9 10
Sound_FB6D:
jsr $F6A8 ; $3B6D: 20 A8 F6
ldx #$FC ; $3B70: A2 FC
ldy #$FC ; $3B72: A0 FC
jsr SilencePulseChannels ; $3B74: 20 12 F7
inc $07F0 ; $3B77: EE F0 07
bne Sound_FB49 ; $3B7A: D0 CD
Sound_FB7C:
ldy #$03 ; $3B7C: A0 03
lda #$08 ; $3B7E: A9 08
bne Sound_FB86 ; $3B80: D0 04
Sound_FB82:
ldy #$01 ; $3B82: A0 01
lda #$01 ; $3B84: A9 01
Sound_FB86:
jsr $F6A8 ; $3B86: 20 A8 F6
ldx #$80 ; $3B89: A2 80
ldy #$80 ; $3B8B: A0 80
Sound_FB8D:
jsr InitializeApuChannelState ; $3B8D: 20 1A F7
lda #$83 ; $3B90: A9 83
sta $4001 ; $3B92: 8D 01 40
lda #$7F ; $3B95: A9 7F
sta $4005 ; $3B97: 8D 05 40
bne Sound_FBAF ; $3B9A: D0 13
jsr $F6A8 ; $3B9C: 20 A8 F6
ldx #$04 ; $3B9F: A2 04
ldy #$04 ; $3BA1: A0 04
bne Sound_FBAC ; $3BA3: D0 07
Sound_FBA5:
jsr $F6A8 ; $3BA5: 20 A8 F6
ldx #$80 ; $3BA8: A2 80
ldy #$80 ; $3BAA: A0 80
Sound_FBAC:
jsr SilencePulseChannels ; $3BAC: 20 12 F7
Sound_FBAF:
lda #$00 ; $3BAF: A9 00
sta $07F0 ; $3BB1: 8D F0 07
lda $F4 ; $3BB4: A5 F4
and #$20 ; $3BB6: 29 20
beq Sound_FB49 ; $3BB8: F0 8F
lda #$D5 ; $3BBA: A9 D5
sta $4001 ; $3BBC: 8D 01 40
bne Sound_FB49 ; $3BBF: D0 88
Sound_FBC1:
jsr $F6A8 ; $3BC1: 20 A8 F6
ldx #$80 ; $3BC4: A2 80
ldy #$BA ; $3BC6: A0 BA
bne Sound_FB8D ; $3BC8: D0 C3
; Sound sequence pointer/index table and encoded sequence data.
SoundSequencePointerTable:
.byte $0B, $14, $1D, $26, $2F, $38, $41, $4A ; $3BCA: 0B 14 1D 26 2F 38 41 4A
.byte $53, $5C, $65, $0C, $02, $FF, $0B, $FF ; $3BD2: 53 5C 65 0C 02 FF 0B FF
.byte $1E, $FF, $31, $FF, $15, $18, $FE, $2A ; $3BDA: 1E FF 31 FF 15 18 FE 2A
.byte $FE, $65, $FE, $86, $FE, $0C, $0D, $FE ; $3BE2: FE 65 FE 86 FE 0C 0D FE
.byte $00, $00, $13, $FE, $00, $00, $15, $38 ; $3BEA: 00 00 13 FE 00 00 15 38
.byte $FF, $5A, $FF, $79, $FF, $94, $FF, $00 ; $3BF2: FF 5A FF 79 FF 94 FF 00
.byte $00, $00, $D7, $FE, $ED, $FE, $00, $00 ; $3BFA: 00 00 D7 FE ED FE 00 00
.byte $00, $B3, $FF, $C9, $FF, $DA, $FF, $EF ; $3C02: 00 B3 FF C9 FF DA FF EF
.byte $FF, $15, $A5, $FC, $0A, $FD, $98, $FD ; $3C0A: FF 15 A5 FC 0A FD 98 FD
.byte $E0, $FD, $15, $B2, $FE, $00, $00, $C5 ; $3C12: E0 FD 15 B2 FE 00 00 C5
.byte $FE, $00, $00, $15, $00, $00, $92, $FE ; $3C1A: FE 00 00 15 00 00 92 FE
.byte $A1, $FE, $00, $00, $0C, $59, $FC, $72 ; $3C22: A1 FE 00 00 0C 59 FC 72
.byte $FC, $8C, $FC, $00, $00, $00, $00, $00 ; $3C2A: FC 8C FC 00 00 00 00 00
.byte $38, $FC, $49, $FC, $00, $00, $82, $02 ; $3C32: 38 FC 49 FC 00 00 82 02
.byte $8B, $02, $80, $08, $02, $10, $02, $16 ; $3C3A: 8B 02 80 08 02 10 02 16
.byte $02, $52, $02, $02, $02, $1A, $00, $82 ; $3C42: 02 52 02 02 02 1A 00 82
.byte $02, $80, $10, $02, $16, $02, $52, $02 ; $3C4A: 02 80 10 02 16 02 52 02
.byte $5A, $02, $02, $02, $56, $81, $02, $80 ; $3C52: 5A 02 02 02 56 81 02 80
.byte $12, $02, $0C, $02, $04, $02, $0C, $02 ; $3C5A: 12 02 0C 02 04 02 0C 02
.byte $04, $02, $2A, $02, $81, $04, $02, $80 ; $3C62: 04 02 2A 02 81 04 02 80
.byte $04, $02, $81, $04, $88, $02, $02, $00 ; $3C6A: 04 02 81 04 88 02 02 00
.byte $88, $02, $02, $80, $04, $02, $2A, $02 ; $3C72: 88 02 02 80 04 02 2A 02
.byte $24, $02, $2A, $02, $24, $02, $1C, $02 ; $3C7A: 24 02 2A 02 24 02 1C 02
.byte $81, $22, $02, $80, $22, $02, $81, $24 ; $3C82: 81 22 02 80 22 02 81 24
.byte $88, $02, $88, $02, $80, $56, $02, $4E ; $3C8A: 88 02 88 02 80 56 02 4E
.byte $02, $12, $02, $4E, $02, $12, $02, $0C ; $3C92: 02 12 02 4E 02 12 02 0C
.byte $02, $81, $10, $02, $80, $10, $02, $81 ; $3C9A: 02 81 10 02 80 10 02 81
.byte $12, $88, $02, $C3, $81, $02, $02, $1C ; $3CA2: 12 88 02 C3 81 02 02 1C
.byte $02, $02, $02, $1C, $1C, $FF, $C6, $88 ; $3CAA: 02 02 02 1C 1C FF C6 88
.byte $1C, $FF, $C7, $82, $4C, $4C, $2A, $4C ; $3CB2: 1C FF C7 82 4C 4C 2A 4C
.byte $FF, $C6, $88, $1C, $FF, $C4, $81, $46 ; $3CBA: FF C6 88 1C FF C4 81 46
.byte $02, $46, $02, $32, $02, $46, $80, $2E ; $3CC2: 02 46 02 32 02 46 80 2E
.byte $2E, $FF, $C3, $82, $46, $46, $81, $32 ; $3CCA: 2E FF C3 82 46 46 81 32
.byte $32, $46, $2E, $FF, $80, $0C, $0C, $81 ; $3CD2: 32 46 2E FF 80 0C 0C 81
.byte $46, $46, $46, $80, $04, $04, $81, $46 ; $3CDA: 46 46 46 80 04 04 81 46
.byte $46, $02, $C8, $82, $4C, $4C, $2A, $4C ; $3CE2: 46 02 C8 82 4C 4C 2A 4C
.byte $FF, $C2, $81, $46, $80, $32, $32, $82 ; $3CEA: FF C2 81 46 80 32 32 82
.byte $46, $04, $81, $46, $2A, $FF, $C2, $81 ; $3CF2: 46 04 81 46 2A FF C2 81
.byte $0C, $0C, $80, $04, $04, $81, $04, $80 ; $3CFA: 0C 0C 80 04 04 81 04 80
.byte $2E, $2E, $81, $2E, $82, $24, $FF, $00 ; $3D02: 2E 2E 81 2E 82 24 FF 00
.byte $81, $32, $02, $02, $06, $0C, $32, $02 ; $3D0A: 81 32 02 02 06 0C 32 02
.byte $02, $8A, $2E, $8B, $02, $8A, $2E, $8B ; $3D12: 02 8A 2E 8B 02 8A 2E 8B
.byte $02, $8A, $2E, $8B, $02, $88, $2E, $32 ; $3D1A: 02 8A 2E 8B 02 88 2E 32
.byte $2E, $D0, $8C, $2C, $24, $FF, $D0, $2E ; $3D22: 2E D0 8C 2C 24 FF D0 2E
.byte $20, $FF, $C3, $80, $28, $02, $82, $02 ; $3D2A: 20 FF C3 80 28 02 82 02
.byte $80, $2C, $02, $32, $02, $24, $02, $82 ; $3D32: 80 2C 02 32 02 24 02 82
.byte $02, $81, $02, $80, $28, $02, $06, $02 ; $3D3A: 02 81 02 80 28 02 06 02
.byte $28, $02, $81, $02, $80, $24, $02, $32 ; $3D42: 28 02 81 02 80 24 02 32
.byte $02, $24, $02, $FF, $80, $28, $02, $82 ; $3D4A: 02 24 02 FF 80 28 02 82
.byte $02, $80, $2C, $02, $32, $02, $24, $02 ; $3D52: 02 80 2C 02 32 02 24 02
.byte $82, $02, $89, $0C, $0A, $08, $06, $32 ; $3D5A: 82 02 89 0C 0A 08 06 32
.byte $30, $2E, $2C, $2A, $28, $26, $24, $02 ; $3D62: 30 2E 2C 2A 28 26 24 02
.byte $02, $02, $86, $02, $C7, $84, $02, $FF ; $3D6A: 02 02 86 02 C7 84 02 FF
.byte $C4, $80, $28, $02, $82, $02, $80, $2C ; $3D72: C4 80 28 02 82 02 80 2C
.byte $02, $32, $02, $24, $02, $82, $02, $81 ; $3D7A: 02 32 02 24 02 82 02 81
.byte $02, $80, $28, $02, $06, $02, $28, $02 ; $3D82: 02 80 28 02 06 02 28 02
.byte $81, $02, $80, $24, $02, $32, $02, $24 ; $3D8A: 81 02 80 24 02 32 02 24
.byte $02, $FF, $C8, $84, $02, $FF, $81, $14 ; $3D92: 02 FF C8 84 02 FF 81 14
.byte $02, $02, $14, $1A, $14, $02, $02, $88 ; $3D9A: 02 02 14 1A 14 02 02 88
.byte $10, $10, $10, $10, $14, $10, $85, $3C ; $3DA2: 10 10 10 10 14 10 85 3C
.byte $81, $44, $85, $4A, $81, $44, $88, $28 ; $3DAA: 81 44 85 4A 81 44 88 28
.byte $24, $20, $46, $42, $40, $C6, $81, $3C ; $3DB2: 24 20 46 42 40 C6 81 3C
.byte $02, $02, $44, $02, $02, $02, $4A, $02 ; $3DBA: 02 02 44 02 02 02 4A 02
.byte $46, $36, $36, $38, $38, $02, $3A, $02 ; $3DC2: 46 36 36 38 38 02 3A 02
.byte $80, $3C, $3C, $81, $02, $24, $02, $02 ; $3DCA: 80 3C 3C 81 02 24 02 02
.byte $2C, $24, $88, $24, $1E, $46, $36, $38 ; $3DD2: 2C 24 88 24 1E 46 36 38
.byte $3A, $FF, $C4, $84, $02, $FF, $D8, $81 ; $3DDA: 3A FF C4 84 02 FF D8 81
.byte $06, $FF, $C6, $88, $06, $FF, $C7, $81 ; $3DE2: 06 FF C6 88 06 FF C7 81
.byte $06, $06, $80, $06, $06, $81, $06, $06 ; $3DEA: 06 06 80 06 06 81 06 06
.byte $80, $06, $06, $81, $06, $06, $FF, $C6 ; $3DF2: 80 06 06 81 06 06 FF C6
.byte $88, $06, $FF, $E0, $81, $06, $06, $FF ; $3DFA: 88 06 FF E0 81 06 06 FF
.byte $82, $0F, $81, $06, $06, $EA, $06, $06 ; $3E02: 82 0F 81 06 06 EA 06 06
.byte $06, $06, $FF, $C5, $80, $0E, $58, $FF ; $3E0A: 06 06 FF C5 80 0E 58 FF
.byte $00, $C5, $80, $0E, $58, $FF, $82, $1C ; $3E12: 00 C5 80 0E 58 FF 82 1C
.byte $1C, $C3, $82, $1C, $1C, $81, $1C, $1C ; $3E1A: 1C C3 82 1C 1C 81 1C 1C
.byte $1C, $02, $FF, $C7, $88, $1C, $FF, $00 ; $3E22: 1C 02 FF C7 88 1C FF 00
.byte $83, $02, $80, $0E, $02, $0E, $02, $0C ; $3E2A: 83 02 80 0E 02 0E 02 0C
.byte $02, $0E, $02, $4E, $02, $02, $02, $0E ; $3E32: 02 0E 02 4E 02 02 02 0E
.byte $02, $0C, $02, $02, $02, $0E, $02, $0C ; $3E3A: 02 0C 02 02 02 0E 02 0C
.byte $02, $0E, $02, $4E, $02, $02, $02, $0E ; $3E42: 02 0E 02 4E 02 02 02 0E
.byte $02, $0C, $02, $0E, $02, $0E, $02, $0C ; $3E4A: 02 0C 02 0E 02 0E 02 0C
.byte $02, $0E, $02, $4E, $02, $02, $02, $0E ; $3E52: 02 0E 02 4E 02 02 02 0E
.byte $02, $0C, $02, $88, $4E, $18, $16, $12 ; $3E5A: 02 0C 02 88 4E 18 16 12
.byte $0E, $0C, $0E, $83, $02, $81, $3E, $3E ; $3E62: 0E 0C 0E 83 02 81 3E 3E
.byte $82, $46, $1C, $46, $81, $02, $38, $3E ; $3E6A: 82 46 1C 46 81 02 38 3E
.byte $02, $82, $46, $1C, $82, $48, $48, $81 ; $3E72: 02 82 46 1C 82 48 48 81
.byte $3E, $3E, $82, $38, $88, $24, $20, $1C ; $3E7A: 3E 3E 82 38 88 24 20 1C
.byte $48, $46, $42, $3E, $82, $09, $09, $C6 ; $3E82: 48 46 42 3E 82 09 09 C6
.byte $82, $03, $0C, $FF, $C6, $88, $06, $FF ; $3E8A: 82 03 0C FF C6 88 06 FF
.byte $ED, $89, $2A, $02, $04, $0C, $02, $04 ; $3E92: ED 89 2A 02 04 0C 02 04
.byte $08, $02, $30, $26, $02, $30, $FF, $80 ; $3E9A: 08 02 30 26 02 30 FF 80
.byte $02, $ED, $89, $0C, $02, $12, $4E, $02 ; $3EA2: 02 ED 89 0C 02 12 4E 02
.byte $12, $18, $02, $0E, $08, $02, $0E, $FF ; $3EAA: 12 18 02 0E 08 02 0E FF
.byte $80, $42, $02, $48, $02, $1E, $02, $24 ; $3EB2: 80 42 02 48 02 1E 02 24
.byte $02, $02, $02, $2A, $02, $C6, $8C, $30 ; $3EBA: 02 02 02 2A 02 C6 8C 30
.byte $2A, $FF, $00, $80, $24, $02, $2A, $02 ; $3EC2: 2A FF 00 80 24 02 2A 02
.byte $30, $02, $06, $02, $02, $02, $0C, $02 ; $3ECA: 30 02 06 02 02 02 0C 02
.byte $C6, $8C, $12, $18, $FF, $80, $56, $54 ; $3ED2: C6 8C 12 18 FF 80 56 54
.byte $52, $50, $81, $02, $80, $5E, $5A, $54 ; $3EDA: 52 50 81 02 80 5E 5A 54
.byte $50, $18, $14, $10, $0A, $06, $30, $2C ; $3EE2: 50 18 14 10 0A 06 30 2C
.byte $28, $02, $00, $80, $1A, $18, $16, $14 ; $3EEA: 28 02 00 80 1A 18 16 14
.byte $81, $02, $80, $02, $5E, $5A, $54, $50 ; $3EF2: 81 02 80 02 5E 5A 54 50
.byte $18, $14, $10, $0A, $06, $30, $2C, $28 ; $3EFA: 18 14 10 0A 06 30 2C 28
.byte $82, $1C, $02, $1C, $02, $02, $1C, $1C ; $3F02: 82 1C 02 1C 02 02 1C 1C
.byte $00, $81, $10, $0A, $32, $28, $80, $32 ; $3F0A: 00 81 10 0A 32 28 80 32
.byte $02, $32, $02, $82, $32, $81, $06, $02 ; $3F12: 02 32 02 82 32 81 06 02
.byte $06, $02, $82, $32, $81, $54, $1A, $10 ; $3F1A: 06 02 82 32 81 54 1A 10
.byte $0A, $80, $10, $02, $10, $02, $82, $10 ; $3F22: 0A 80 10 02 10 02 82 10
.byte $81, $16, $02, $16, $02, $82, $0A, $83 ; $3F2A: 81 16 02 16 02 82 0A 83
.byte $03, $0C, $82, $03, $0C, $0C, $C2, $88 ; $3F32: 03 0C 82 03 0C 0C C2 88
.byte $1C, $1C, $1C, $1C, $1C, $1C, $83, $1C ; $3F3A: 1C 1C 1C 1C 1C 1C 83 1C
.byte $80, $04, $04, $2A, $02, $82, $1C, $FF ; $3F42: 80 04 04 2A 02 82 1C FF
.byte $81, $4C, $02, $4C, $02, $2A, $02, $4C ; $3F4A: 81 4C 02 4C 02 2A 02 4C
.byte $1C, $81, $4C, $02, $4C, $02, $4C, $00 ; $3F52: 1C 81 4C 02 4C 02 4C 00
.byte $88, $2E, $2E, $2E, $30, $04, $30, $C4 ; $3F5A: 88 2E 2E 2E 30 04 30 C4
.byte $80, $2E, $04, $FF, $83, $02, $88, $2E ; $3F62: 80 2E 04 FF 83 02 88 2E
.byte $2E, $2E, $30, $04, $30, $C4, $80, $2E ; $3F6A: 2E 2E 30 04 30 C4 80 2E
.byte $04, $FF, $83, $02, $84, $02, $02, $C2 ; $3F72: 04 FF 83 02 84 02 02 C2
.byte $88, $3E, $3E, $3E, $42, $46, $42, $84 ; $3F7A: 88 3E 3E 3E 42 46 42 84
.byte $3E, $FF, $85, $3E, $81, $3E, $88, $1C ; $3F82: 3E FF 85 3E 81 3E 88 1C
.byte $46, $1C, $81, $02, $3E, $3E, $3E, $82 ; $3F8A: 46 1C 81 02 3E 3E 3E 82
.byte $34, $02, $C2, $88, $06, $06, $06, $06 ; $3F92: 34 02 C2 88 06 06 06 06
.byte $06, $06, $82, $06, $06, $06, $06, $FF ; $3F9A: 06 06 82 06 06 06 06 FF
.byte $C2, $81, $06, $06, $80, $06, $06, $81 ; $3FA2: C2 81 06 06 80 06 06 81
.byte $06, $06, $06, $06, $80, $06, $06, $FF ; $3FAA: 06 06 06 06 80 06 06 FF
.byte $09, $80, $10, $02, $10, $02, $10, $02 ; $3FB2: 09 80 10 02 10 02 10 02
.byte $0C, $0C, $0C, $02, $0C, $02, $14, $14 ; $3FBA: 0C 0C 0C 02 0C 02 14 14
.byte $14, $02, $14, $02, $85, $10, $00, $80 ; $3FC2: 14 02 14 02 85 10 00 80
.byte $32, $02, $32, $02, $32, $02, $C2, $32 ; $3FCA: 32 02 32 02 32 02 C2 32
.byte $32, $32, $02, $32, $02, $FF, $85, $32 ; $3FD2: 32 32 02 32 02 FF 85 32
.byte $80, $54, $02, $54, $02, $54, $02, $50 ; $3FDA: 80 54 02 54 02 54 02 50
.byte $50, $50, $02, $50, $02, $56, $56, $56 ; $3FE2: 50 50 02 50 02 56 56 56
.byte $02, $56, $02, $85, $54, $C4, $85, $0C ; $3FEA: 02 56 02 85 54 C4 85 0C
.byte $FF, $FF, $FF, $FF, $FF ; $3FF2: 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 ; $3FF7: 4C 58 F7
; NES interrupt vectors
InterruptVectors:
.word $C094, $C000, $C0F7 ; $3FFA: 94 C0 00 C0 F7 C0