Promotes Donkey Kong Jr
Adds remaining NROM as _wip Update gitignore to not keep object files Adds AGENTS.md as this is an AI helped project
This commit is contained in:
1 parent
a29b03b00b
commit
9aef410424
412 files changed
+33427
-221
No files matched your search
Submodule Clu Clu Land (JU) deleted from 0468fc89e0.
@@ -0,0 +1,320 @@
|
||||
# Clu Clu Land (JU) — Game Flow from Power-On
|
||||
|
||||
This document describes the execution flow of the disassembled Clu Clu Land (JU) PRG bank (16 KB, mapped at CPU **$C000–$FFFF**), starting from power-on. It is based entirely on `copilot/prg.s` in the repository. The rebuild is verified **byte-identical** to the original `prg.bin`.
|
||||
|
||||
---
|
||||
|
||||
## 1. ROM and Memory Layout
|
||||
|
||||
| Property | Value |
|
||||
|----------|-------|
|
||||
| Format | iNES / NES 2.0 |
|
||||
| PRG | 1 × 16 KB (mapped at CPU $C000–$FFFF) |
|
||||
| CHR | 1 × 8 KB |
|
||||
| Mirroring | Horizontal |
|
||||
| PRG bank start | CPU $C000 |
|
||||
| Source file | `copilot/prg.s` (9,150 lines) |
|
||||
| Output | `reconstructed_prg.bin` (16,384 bytes) |
|
||||
|
||||
### Interrupt vectors (CPU $FFFA–$FFFF)
|
||||
|
||||
| Vector | Address | Handler |
|
||||
|--------|---------|---------|
|
||||
| NMI | $C1F1 | `NMIHandler` |
|
||||
| RESET | $C196 | `ResetEntry` |
|
||||
| IRQ / BRK | $C196 | `IRQHandler` (reuses `ResetEntry`) |
|
||||
|
||||
---
|
||||
|
||||
## 2. Build Status
|
||||
|
||||
`make` in `copilot/` assembles `prg.s` with `ca65`, links with `ld65`, and verifies against `prg.bin`.
|
||||
|
||||
**Verification result: BYTE-IDENTICAL** — `reconstructed_prg.bin` matches `prg.bin` exactly (all 16,384 bytes), and `prg.bin` matches the PRG bank of `rom.nes`.
|
||||
|
||||
---
|
||||
|
||||
## 3. Reset — CPU $FFFC → $C196
|
||||
|
||||
**`ResetEntry`** ($C196)
|
||||
|
||||
On power-on or reset:
|
||||
|
||||
1. `CLD` — clear decimal mode.
|
||||
2. `LDA #$00 / STA PPUCTRL` — disable PPU rendering/NMI.
|
||||
3. `SEI` — disable maskable interrupts.
|
||||
4. `LDX #$FF / TXS` — initialize stack pointer to $FF.
|
||||
5. **Wait for two VBlanks** — `InterruptPathLoop_C1A2` (`LDX #$02`, then poll `PPUSTATUS` bit 7 twice via `DEX`/`BNE`). This is the PPU warm-up delay.
|
||||
6. **Clear RAM** — `LDY #$24` (or `$18` if `StartupPreserveFlag0`/$48 or `StartupPreserveFlag1`/$49 is nonzero), then `STA $0000,Y` in a loop clearing zero page + one page. The Y start value ($24 vs $18) is selected by the two preserve flags.
|
||||
7. `JSR RunGameTaskRoutine_CBA6` ($C1C2) — run an initial game task routine with Y=$07, X=$06.
|
||||
8. `LDA #$55 / STA FrameShiftRegister0` ($10) — initialize frame shift register 0.
|
||||
9. `LDA #$12 / STA PPUCTRL / STA ShadowPPUCTRL` ($40) — set PPU control to $12 (NMI enabled, $2000 base) and shadow.
|
||||
10. `LDA #$06 / STA PPUMASK / STA ShadowPPUMASK` ($41) — enable background + sprites, set mask shadow.
|
||||
11. `LDA #$0F / STA APUSTATUS / STA $0100` — enable all four APU channels, write to $0100.
|
||||
12. `JSR RunGameTaskRoutine_C3E4` ($C1DF) — run the C3E4 game task routine.
|
||||
13. `LDA ShadowPPUCTRL / ORA #$80 / STA ShadowPPUCTRL / STA PPUCTRL` — set NMI enable bit in shadow and PPUCTRL (enables NMI).
|
||||
14. Falls into **`InterruptPathDispatch_C1EB`** ($C1EB) — the permanent main loop.
|
||||
|
||||
---
|
||||
|
||||
## 4. Main Loop — `InterruptPathDispatch_C1EB` ($C1EB)
|
||||
|
||||
Once NMI is enabled, ResetEntry never returns. It enters an infinite loop:
|
||||
|
||||
```
|
||||
InterruptPathDispatch_C1EB ($C1EB):
|
||||
JSR EnginePath_F58D ; $C1EB: 20 8D F5 - frame/input processing
|
||||
JMP InterruptPathDispatch_C1EB ; $C1EE: 4C EB C1 - loop forever
|
||||
```
|
||||
|
||||
The real-time work happens in the **NMI** (see section 5). The main loop only repeatedly calls `EnginePath_F58D` and spins. `EnginePath_F58D` ($F58D) shifts the frame shift registers ($10–$17) right based on controller input bits ($10/$11 bit 2), producing a carry that drives rotation.
|
||||
|
||||
---
|
||||
|
||||
## 5. NMI / Frame Heartbeat — `NMIHandler` ($C1F1)
|
||||
|
||||
The NMI fires once per frame and is the central real-time driver. It:
|
||||
|
||||
1. **Save A** (`PHA`) and **save WorkPtr0Lo** ($00) onto the stack.
|
||||
2. **PPU control**: `LDA ShadowPPUCTRL ($40) / AND #$7F` (clear NMI bit), store back to shadow and $2000 — this **temporarily disables NMI** during the handler to prevent re-entry.
|
||||
3. **PPU mask**: `LDA ShadowPPUMASK ($41) / AND #$E7` (clear sprite/background enable bits), store to shadow and $2001 — rendering off during updates.
|
||||
4. **Game state update**: `JSR UpdateGameStateRoutine_C996` ($C207) — core per-frame game state logic.
|
||||
5. **OAM DMA**: write $00 to OAMADDR ($2003), then $02 to OAMDMA ($4014) — DMA $0200–$02FF to sprite RAM.
|
||||
6. **Resource/level data**: `JSR ResourceAndLevelData` ($F20B) — PPU command buffer processing / nametable updates.
|
||||
7. **Object paths**: `JSR ObjectPath_E113` ($E113), then `JSR ObjectPath_DDC1` ($DDC1) — object movement/collision.
|
||||
8. **Restore PPU**: write ShadowPPUCTRL ($40) to $2000; `LDA ShadowPPUMASK / ORA #$18` (re-enable background + sprites), store to shadow and $2001 — rendering back on.
|
||||
9. **Audio driver**: `JSR AudioDriverCode` ($F7C1) — process all audio channels.
|
||||
10. **Engine path**: `JSR EnginePath_F5AE` ($F5AE) — controller strobing + input processing (`ProcessResourceStateRoutine_F5BE`).
|
||||
11. **Object path**: `JSR ObjectPath_DDC1` ($DDC1) again.
|
||||
12. **Game task**: `JSR RunGameTaskRoutine_C368` ($C368) — main game task dispatcher.
|
||||
13. **PPU status poll**: `NMIReadPPUStatus_C234` — read PPUSTATUS (reset address latch).
|
||||
14. **Re-enable NMI**: `LDA ShadowPPUCTRL / ORA #$80 / STA ShadowPPUCTRL / STA PPUCTRL`.
|
||||
15. **Restore**: `PLA / STA WorkPtr0Lo ($00)`, `PLA`, `RTI`.
|
||||
|
||||
### AudioDriverCode ($F7C1)
|
||||
Called from NMI. Processes four audio state routines in sequence:
|
||||
- `ProcessAudioStateRoutine_F898`
|
||||
- `ProcessAudioStateRoutine_FA2E`
|
||||
- `ProcessAudioStateRoutine_FACF`
|
||||
- `ProcessAudioStateRoutine_FB22`
|
||||
Then clears audio request bytes $FB–$FF, handles the noise channel ($07FE, $4011), and returns.
|
||||
|
||||
---
|
||||
|
||||
## 6. Game Task Dispatcher — `RunGameTaskRoutine_C368` ($C368)
|
||||
|
||||
Called each NMI frame. This is the primary gameplay dispatcher with multiple entry points ($C368, $C3BC, $C3E4, $C402, $C463, $C47A, etc.). It branches on game state variables ($92, $B0, $8A, $8D, $8C, etc.) to:
|
||||
|
||||
- `ProcessResourceStateRoutine_F577` — resource processing
|
||||
- `CoreGameCode` ($C245) — the large central object-processing routine (see section 7)
|
||||
- `RunGameTaskRoutine_C6BE`, `C7EF`, `C7F3`, `C809`, `C816`, `C81A`, `C824`, `C830`, `C84B` — various sub-tasks
|
||||
- `ProcessResourceStateRoutine_F40C / F408 / F31A / F77D` — resource/command buffer updates
|
||||
|
||||
The dispatcher uses a dense network of `CorePath*` / `UpdateGameState*` / `UpdatePlayerState*` / `RunGameTaskDispatch_*` branch targets driven by zero-page state ($8A–$8F, $90–$93, $A7, $AC–$AF, $B0, etc.).
|
||||
|
||||
---
|
||||
|
||||
## 7. Core Object Processing — `CoreGameCode` ($C245)
|
||||
|
||||
The largest single routine in the bank. Called from the task dispatcher. It processes objects in two main phases:
|
||||
|
||||
**Phase 1** ($C245–$C264):
|
||||
- `JSR RunGameTaskRoutine_CBB9`
|
||||
- `JSR ObjectPath_D34E`
|
||||
- `JSR UpdateObjectRecord_D27D`
|
||||
- Object record reads from `CurrentObjectPtrLo/Hi` ($08/$09): `ReadObjectRecord_DADA`, `ReadObjectRecord_CD7B`, `ReadObjectRecord_D11E`
|
||||
|
||||
**Phase 2** ($C264–$C2C2):
|
||||
- `JSR ObjectPath_D06D`, `RunGameTaskRoutine_CBC6`, `ObjectPath_D34E`, `UpdateObjectRecord_D27D`
|
||||
- Second set of object record reads
|
||||
- Long chain of object buffer/update routines: `ObjectPath_D08F`, `ObjectPath_DD10`, `ObjectPath_DC5A`, `UpdateObjectBuffer_DB52`, `ObjectPath_D856`, `ObjectPath_D8BA`, `UpdateObjectBuffer_D64F`, `ObjectPath_D97B`, `UpdateObjectBuffer_D0C8`, `ObjectPath_CFA1`, `ObjectPath_D0B1`, `ProcessObjectStateRoutine_E6F3`, `ObjectPath_DA91`, `UpdateObjectBuffer_DBC7`, `ObjectPath_D0DF`, `ObjectPath_D1D6`, `UpdateObjectBuffer_DD8F`, `UpdateObjectBuffer_D0F6`, `UpdateGameStateRoutine_C47A`, `ObjectPath_D209`, then `RTS`.
|
||||
|
||||
**Object loop** (`CorePathLoop_C2C3` at $C2C3):
|
||||
- `JSR RunGameTaskRoutine_C84B`
|
||||
- Clears $0080–$009F (32 bytes) via indexed store
|
||||
- `RoundOrSubstate` ($88) = 0
|
||||
- Player/game state initialization based on `ContextIndex` ($4A)
|
||||
|
||||
---
|
||||
|
||||
## 8. PPU Command / Nametable Processing — `ResourceAndLevelData` ($F20B)
|
||||
|
||||
Called from NMI. Processes an embedded command stream at $0301:
|
||||
- Reads PPU address high/low from $0301,Y
|
||||
- Writes a counted block of bytes to $2007 (PPUDATA)
|
||||
- Handles $3F-prefixed commands (palette) specially — re-writes PPUADDR
|
||||
- This is the nametable/palette update pipeline driven during VBlank.
|
||||
|
||||
Supporting PPU helpers:
|
||||
- `SetDefaultScroll` ($FFEB) — writes $08, $00 to PPUSCROLL
|
||||
- `LoadPalette` style routines via `ProcessResourceStateRoutine_F40C/F408/F31A/F77D`
|
||||
- `UpdateCommandBufferRoutine_F3A1`
|
||||
|
||||
---
|
||||
|
||||
## 9. Object System
|
||||
|
||||
Object processing is spread across many `ObjectPath_*` and `UpdateObjectBuffer_*` / `UpdateObjectRecord_*` / `ReadObjectRecord_*` / `ProcessObjectState*` routines in the $C000–$EFFF range:
|
||||
|
||||
| Group | Address Range | Purpose |
|
||||
|-------|---------------|---------|
|
||||
| ObjectPath_D06D / D08F / D0B1 / D0DF / D1D6 / D209 | $Cxxx | Object coordinate/state update |
|
||||
| ObjectPath_D34E | $CD3E | Object processing core |
|
||||
| ObjectPath_D856 / D8BA / D97B | $CDxx | Object buffer/rendering |
|
||||
| ObjectPath_DC5A / DD10 / DDC1 | $CDxx–$DDxx | Object collision/movement |
|
||||
| ObjectPath_E113 | $E113 | Object entry (called from NMI) |
|
||||
| UpdateObjectRecord_D27D | $CD27D | Object record maintenance |
|
||||
| ReadObjectRecord_DADA / CD7B / D11E | $CDxx–$DAxx | Object record reading |
|
||||
| ProcessObjectStateRoutine_E6F3 / D1CE / D211 / D42C / D44A / D94D / DA26 | $CDxx–$E6xx | Object state machine dispatch |
|
||||
| UpdateObjectBuffer_DB52 / D64F / DBC7 / DD8F / D0F6 | $CDxx–$DDxx | OAM buffer writes |
|
||||
| ProcessCurrentObjectRoutine_CBE3 | $CBE3 | Current object processing |
|
||||
|
||||
Objects use `CurrentObjectPtrLo/Hi` ($08/$09) and `CurrentObjectIndex` ($0A) for indirect access. Object state arrays live in zero page ($90–$AF, $D0–$D8) and RAM ($0400–$07FF).
|
||||
|
||||
---
|
||||
|
||||
## 10. Zero-Page / RAM Symbols
|
||||
|
||||
| Address | Symbol | Use |
|
||||
|---------|--------|-----|
|
||||
| $00–$01 | WorkPtr0Lo/Hi | General indirect pointer (also saved across NMI) |
|
||||
| $02–$03 | WorkPtr1Lo/Hi | Secondary pointer |
|
||||
| $04–$05 | DataPtrLo/Hi | Data pointer |
|
||||
| $06–$07 | ListPtrLo/Hi | List pointer |
|
||||
| $08–$09 | CurrentObjectPtrLo/Hi | Current object pointer |
|
||||
| $0A | CurrentObjectIndex | Current object index |
|
||||
| $0B–$0C | AlternateObjectPtrLo/Hi | Alternate object pointer |
|
||||
| $0D–$0E | TempDirection / TempClass | Temporary direction/class |
|
||||
| $0F | LoopCounter | Loop counter |
|
||||
| $10–$17 | FrameShiftRegister0–7 | Frame shift registers (input/frame state) |
|
||||
| $20–$23 | CollisionRecordA0–A3 | Collision records |
|
||||
| $24–$27 | VectorComponent0–3 | Vector components |
|
||||
| $2C–$2F | TempField2C–2F | Temporary fields |
|
||||
| $33–$34 | TempField33/34 | Temporary fields |
|
||||
| $3F | TempField3F | Temporary field |
|
||||
| $40 | ShadowPPUCTRL | $2000 mirror |
|
||||
| $41 | ShadowPPUMASK | $2001 mirror |
|
||||
| $42–$43 | ScrollOrRenderState0/1 | Scroll/render state |
|
||||
| $44–$47 | ControllerButtonsBase/AltBase | Controller state ($44,$46 indexed) |
|
||||
| $48–$49 | StartupPreserveFlag0/1 | Startup preserve flags |
|
||||
| $4A | ContextIndex | Context index |
|
||||
| $4B | ModeToggleFlag | Mode toggle |
|
||||
| $4C | ActiveContext | Active context |
|
||||
| $4D | PendingStateIndex | Pending state index |
|
||||
| $4E | StateTransitionFlag | State transition flag |
|
||||
| $4F | InputLockFlag | Input lock flag |
|
||||
| $50 | GlobalTickDivider | Global tick divider |
|
||||
| $51–$68 | TimerArrayBase / GameVar* | Timers and gameplay variables |
|
||||
| $75–$7D | PlayerTimerBase / PlayerTimer1/2 / StateTimer / InputRepeatDelay | Player timers |
|
||||
| $80–$8F | MatchState80–StateCounter8F | Match/game state (RoundOrSubstate=$88, GameState=$8A, GameSubstate=$8B) |
|
||||
| $90–$93 | PlayerStateBase / PlayerState1 / CountdownValue / CountdownDivider | Player state |
|
||||
| $9F | ObjectStateArray9F | Object state array |
|
||||
| $A0–$A9 | StateVarA0–A9 | State variables |
|
||||
| $AC–$AF | StateVarAC–AF | State variables |
|
||||
| $B0 | ToggleStateB0 | Toggle state |
|
||||
| $B2 | StateVarB2 | State variable |
|
||||
| $D0–$D8 | ObjectVarD0–D8 | Object variables |
|
||||
| $DA | ObjectVarDA | Object variable |
|
||||
| $E9–$EF | ObjectVarE9–EF | Object variables |
|
||||
| $F0–$F3 | AudioPulse1State–AudioNoiseState | Audio channel states |
|
||||
| $F4 | AudioPeriodOrEnvelope | Audio period/envelope |
|
||||
| $F5–$F6 | AudioSequencePtrLo/Hi | Audio sequence pointer |
|
||||
| $F7 | AudioSequenceCursor | Audio sequence cursor |
|
||||
| $F8–$F9 | AudioChannelCursor/Index | Audio channel state |
|
||||
| $FA | AudioSequenceState | Audio sequence state |
|
||||
| $FB–$FF | AudioRequest0–4 | Audio request flags |
|
||||
|
||||
---
|
||||
|
||||
## 11. Audio System
|
||||
|
||||
**AudioDriverCode** ($F7C1) — NMI-called audio driver:
|
||||
- Strobes JOY2 ($4017 = $FF) to select noise mode
|
||||
- Calls four channel processors: $F898, $FA2E, $FACF, $FB22 (pulse 1, pulse 2, triangle, noise)
|
||||
- Clears audio request flags $FB–$FF
|
||||
- Noise channel: reads $07FE, applies envelope from AudioNoiseState ($F3), writes to $4011
|
||||
|
||||
Audio workspace ($F0–$FF): channel states, sequence pointers/cursors, request flags.
|
||||
|
||||
Audio data tables (`AudioDataTables` at $F441 / $FF34): pitch/envelope lookup tables at $FF34–$FF40 and $FF51–$FFF0.
|
||||
|
||||
---
|
||||
|
||||
## 12. Data Regions
|
||||
|
||||
| Label | Address | Description |
|
||||
|-------|---------|-------------|
|
||||
| `DeveloperCreditText` | $C000 | "T.SAWANO." encoded credit string |
|
||||
| `ResourceScriptPointerTable` | $C008 | 16 pointers into upper-PRG script area ($E75D–$EF91, $F117/$F11D) |
|
||||
| `TitleOrMessageTileString` | $C044 | Encoded title/message tile values |
|
||||
| `ResourceDescriptorData_C058` | $C058 | Variable-length resource descriptor records |
|
||||
| `DirectionAndCoordinateTables_C0B4` | $C0B4 | Direction, coordinate, and signed-offset lookup tables |
|
||||
| `StartupObjectTemplateData_C0E9` | $C0E9 | Startup object/template records |
|
||||
| `MovementTables` | $C7BD | Movement-related tables |
|
||||
| `ObjectEngineCodeAndTables` | $CCC8 | Object engine code + embedded tables |
|
||||
| `AudioDataTables` | $F441 | Audio pitch/envelope tables |
|
||||
| VectorTable | $FFFA–$FFFF | NMI=$C1F1, RESET=$C196, IRQ=$C196 |
|
||||
|
||||
---
|
||||
|
||||
## 13. Summary of Execution Flow
|
||||
|
||||
```
|
||||
Power On / Reset
|
||||
│
|
||||
▼
|
||||
ResetEntry ($C196) ───────────────────────────────────┐
|
||||
│ CLD, disable PPU/NMI, SEI, stack=$FF │
|
||||
│ wait 2× VBlank (PPU warm-up) │
|
||||
│ clear RAM (zero page + one page) │
|
||||
│ JSR RunGameTaskRoutine_CBA6 (init task) │
|
||||
│ FrameShiftRegister0=$55, PPUCTRL=$12 (NMI on) │
|
||||
│ PPUMASK=$06 (bg+sprites on), APU=$0F │
|
||||
│ JSR RunGameTaskRoutine_C3E4 │
|
||||
│ enable NMI bit in PPUCTRL │
|
||||
▼ │
|
||||
InterruptPathDispatch_C1EB ($C1EB) ───────────────────┤
|
||||
│ │
|
||||
├─ JSR EnginePath_F58D (frame shift regs) │
|
||||
└─ JMP InterruptPathDispatch_C1EB ◄─────────────┘ (spin forever)
|
||||
│
|
||||
NMI ($C1F1) [once per frame] │
|
||||
│ │
|
||||
├─ save A, WorkPtr0Lo ($00) │
|
||||
├─ PPUCTRL = shadow & #$7F (NMI off during H) │
|
||||
├─ PPUMASK = shadow & #$E7 (rendering off) │
|
||||
├─ JSR UpdateGameStateRoutine_C996 ($C996) │
|
||||
├─ OAM DMA ($0200–$02FF → $4014) │
|
||||
├─ JSR ResourceAndLevelData ($F20B) [PPU cmds] │
|
||||
├─ JSR ObjectPath_E113 ($E113) │
|
||||
├─ JSR ObjectPath_DDC1 ($DDC1) │
|
||||
├─ PPUCTRL = shadow; PPUMASK = shadow | #$18 │
|
||||
│ (rendering back on) │
|
||||
├─ JSR AudioDriverCode ($F7C1) [4 channels] │
|
||||
├─ JSR EnginePath_F5AE ($F5AE) [controller I/O]│
|
||||
├─ JSR ObjectPath_DDC1 ($DDC1) [again] │
|
||||
├─ JSR RunGameTaskRoutine_C368 ($C368) [game task]│
|
||||
│ │
|
||||
├─ read PPUSTATUS │
|
||||
├─ PPUCTRL = shadow | #$80 (re-enable NMI) │
|
||||
├─ restore A, WorkPtr0Lo ($00) │
|
||||
└─ RTI │
|
||||
|
||||
Game Task Dispatcher ($C368) [from NMI]
|
||||
├─ branches on $92,$B0,$8A,$8D,$8C,$8F,... │
|
||||
├─ CoreGameCode ($C245) — main object processor │
|
||||
├─ many RunGameTaskRoutine_* / ProcessResource* │
|
||||
└─ returns to NMI (which continues to RTI)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 14. Notes
|
||||
|
||||
- **Build verification:** `make` in `copilot/` produces `reconstructed_prg.bin` that is **byte-identical** to `prg.bin` and to the PRG bank of `rom.nes`.
|
||||
- Vectors confirm NMI at $C1F1 and both RESET/IRQ at $C196 (IRQ reuses the reset handler).
|
||||
- The main loop (`InterruptPathDispatch_C1EB`) is a tight infinite loop calling only `EnginePath_F58D`; all substantive per-frame work is done in the NMI handler.
|
||||
- NMI temporarily disables itself (`AND #$7F` on PPUCTRL) and rendering (`AND #$E7` on PPUMASK) while it updates PPU state and objects, then re-enables both before RTI — a classic NES VBlank update pattern.
|
||||
- Many routine labels carry address-based names (`ObjectPath_D34E`, `RunGameTaskRoutine_C368`, `ProcessObjectStateRoutine_E6F3`, etc.) reflecting the automated first-pass disassembly; semantic naming is provisional.
|
||||
- The disassembly includes extensive inline `.byte` data blocks interleaved with code; boundaries are marked as "conservative Pass-1 classifications."
|
||||
- `locals.inc` provides verified zero-page names; `symbols.inc` provides the NES hardware register set.
|
||||
@@ -0,0 +1,25 @@
|
||||
CA65 ?= ca65
|
||||
LD65 ?= ld65
|
||||
|
||||
all: reconstructed.nes verify
|
||||
|
||||
prg.o: prg.s symbols.inc locals.inc
|
||||
$(CA65) -g -o $@ $<
|
||||
|
||||
header.o: header.s
|
||||
$(CA65) -g -o $@ $<
|
||||
|
||||
chr.o: chr.s
|
||||
$(CA65) -g -o $@ $<
|
||||
|
||||
reconstructed.nes: header.o prg.o chr.o linker.cfg
|
||||
$(LD65) -C linker.cfg -m reconstructed.map -Ln reconstructed.lbl -o $@ header.o prg.o chr.o
|
||||
|
||||
verify: reconstructed.nes
|
||||
cmp reconstructed.nes rom.nes
|
||||
@echo "Byte-identical ROM verified."
|
||||
|
||||
clean:
|
||||
rm -f *.o reconstructed.nes reconstructed.map reconstructed.lbl
|
||||
|
||||
.PHONY: all verify clean
|
||||
@@ -0,0 +1,5 @@
|
||||
Clu Clu Land disassembly project.
|
||||
you will disassemble a NES rom. I will provide you with the binary file renamed as a txt file. With that file I want you to read the header to identify the type of file, locate the vectors that code starts from, and follow each of the 3 through the rom file. build the byte identical rom with ca65. once you have completed a first pass to identify the code vs the data blocks, stop and provide me with the code. The goal is a byte-identical disassembly. Identify code and data sections. After the first pass, take a second pass and replace the known labels. Pass a third time to better identify use of code and data tables naming more appropriately.
|
||||
|
||||
with code blocks that are generated, each method will have a local and global description, the parameters and the return value(s). for each instruction, include a comment at the end of the line with the offset followed by the actual bytes that are expected to be encoded. during building the byte exact source, include the remaining incbin line so we can cycle through builds quickly and efficently.
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,2 @@
|
||||
.segment "CHR"
|
||||
.incbin "chr.bin"
|
||||
Binary file not shown.
@@ -0,0 +1,2 @@
|
||||
.segment "HEADER"
|
||||
.incbin "header.bin"
|
||||
@@ -0,0 +1,10 @@
|
||||
MEMORY {
|
||||
HEADER: start = $0000, size = $0010, fill = yes;
|
||||
PRG: start = $C000, size = $4000, file = %O, fill = yes;
|
||||
CHR: start = $0000, size = $2000, file = %O, fill = yes;
|
||||
}
|
||||
SEGMENTS {
|
||||
HEADER: load = HEADER, type = ro;
|
||||
PRG: load = PRG, type = ro;
|
||||
CHR: load = CHR, type = ro;
|
||||
}
|
||||
@@ -0,0 +1,231 @@
|
||||
;------------------------------------------------------------
|
||||
; Shared zero-page pointer and scratch workspace
|
||||
;------------------------------------------------------------
|
||||
|
||||
WorkPtr0Lo = $00
|
||||
WorkPtr0Hi = $01
|
||||
WorkPtr1Lo = $02
|
||||
WorkPtr1Hi = $03
|
||||
DataPtrLo = $04
|
||||
DataPtrHi = $05
|
||||
ListPtrLo = $06
|
||||
ListPtrHi = $07
|
||||
CurrentObjectPtrLo = $08
|
||||
CurrentObjectPtrHi = $09
|
||||
CurrentObjectIndex = $0A
|
||||
AlternateObjectPtrLo = $0B
|
||||
AlternateObjectPtrHi = $0C
|
||||
TempDirection = $0D
|
||||
TempClass = $0E
|
||||
LoopCounter = $0F
|
||||
|
||||
;------------------------------------------------------------
|
||||
; Frame and controller shift state
|
||||
;------------------------------------------------------------
|
||||
|
||||
FrameShiftRegister0 = $10
|
||||
FrameShiftRegister1 = $11
|
||||
FrameShiftRegister2 = $12
|
||||
FrameShiftRegister3 = $13
|
||||
FrameShiftRegister4 = $14
|
||||
FrameShiftRegister5 = $15
|
||||
FrameShiftRegister6 = $16
|
||||
FrameShiftRegister7 = $17
|
||||
|
||||
;------------------------------------------------------------
|
||||
; Movement and collision workspace
|
||||
;------------------------------------------------------------
|
||||
|
||||
CollisionRecordA0 = $20
|
||||
CollisionRecordA1 = $21
|
||||
CollisionRecordA2 = $22
|
||||
CollisionRecordA3 = $23
|
||||
|
||||
VectorComponent0 = $24
|
||||
VectorComponent1 = $25
|
||||
VectorComponent2 = $26
|
||||
VectorComponent3 = $27
|
||||
|
||||
TempField2C = $2C
|
||||
TempField2E = $2E
|
||||
TempField2F = $2F
|
||||
TempField33 = $33
|
||||
TempField34 = $34
|
||||
TempField3F = $3F
|
||||
|
||||
;------------------------------------------------------------
|
||||
; PPU shadow and rendering state
|
||||
;------------------------------------------------------------
|
||||
|
||||
ShadowPPUCTRL = $40
|
||||
ShadowPPUMASK = $41
|
||||
ScrollOrRenderState0 = $42
|
||||
ScrollOrRenderState1 = $43
|
||||
|
||||
;------------------------------------------------------------
|
||||
; Controller state
|
||||
;
|
||||
; $44-$47 is accessed through overlapping indexed bases at
|
||||
; $44 and $46. Names for individual bytes remain provisional.
|
||||
;------------------------------------------------------------
|
||||
|
||||
ControllerButtonsBase = $44
|
||||
ControllerButtonsAltBase = $46
|
||||
|
||||
; Implicit indexed array members:
|
||||
ControllerState44 = $44
|
||||
ControllerState45 = $45
|
||||
ControllerState46 = $46
|
||||
ControllerState47 = $47
|
||||
|
||||
;------------------------------------------------------------
|
||||
; Startup, context, and input state
|
||||
;------------------------------------------------------------
|
||||
|
||||
StartupPreserveFlag0 = $48
|
||||
StartupPreserveFlag1 = $49
|
||||
ContextIndex = $4A
|
||||
ModeToggleFlag = $4B
|
||||
ActiveContext = $4C
|
||||
PendingStateIndex = $4D
|
||||
StateTransitionFlag = $4E
|
||||
InputLockFlag = $4F
|
||||
|
||||
;------------------------------------------------------------
|
||||
; Global timers and gameplay workspace
|
||||
;------------------------------------------------------------
|
||||
|
||||
GlobalTickDivider = $50
|
||||
TimerArrayBase = $51
|
||||
TimerArrayElement2 = $53
|
||||
|
||||
GameVar54 = $54
|
||||
GameVar55 = $55
|
||||
GameVar56 = $56
|
||||
GameVar57 = $57
|
||||
GameVar58 = $58
|
||||
GameVar5A = $5A
|
||||
GameVar5C = $5C
|
||||
GameVar5E = $5E
|
||||
GameVar5F = $5F
|
||||
|
||||
GameVar62 = $62
|
||||
GameVar63 = $63
|
||||
GameVar64 = $64
|
||||
GameVar67 = $67
|
||||
GameVar68 = $68
|
||||
GameVar6C = $6C
|
||||
GameVar70 = $70
|
||||
GameVar72 = $72
|
||||
|
||||
;------------------------------------------------------------
|
||||
; Player timers and input delays
|
||||
;------------------------------------------------------------
|
||||
|
||||
PlayerTimerBase = $75
|
||||
PlayerTimer1 = $76
|
||||
PlayerTimer2 = $77
|
||||
StateTimer = $78
|
||||
InputRepeatDelay = $7D
|
||||
|
||||
;------------------------------------------------------------
|
||||
; Primary match and game-state variables
|
||||
;------------------------------------------------------------
|
||||
|
||||
MatchState80 = $80
|
||||
MatchState81 = $81
|
||||
CurrentStageOrPlayer = $82
|
||||
StateCounter83 = $83
|
||||
StateCounter84 = $84
|
||||
StateCounter85 = $85
|
||||
StateCounter86 = $86
|
||||
PreviousContextIndex = $87
|
||||
RoundOrSubstate = $88
|
||||
ContextRoundSelector = $89
|
||||
GameState = $8A
|
||||
GameSubstate = $8B
|
||||
StateFlags8C = $8C
|
||||
StateControlFlag = $8D
|
||||
StateCounter8E = $8E
|
||||
StateCounter8F = $8F
|
||||
|
||||
;------------------------------------------------------------
|
||||
; Player state and countdown
|
||||
;------------------------------------------------------------
|
||||
|
||||
PlayerStateBase = $90
|
||||
PlayerState1 = $91
|
||||
CountdownValue = $92
|
||||
CountdownDivider = $93
|
||||
|
||||
ObjectStateArray9F = $9F
|
||||
|
||||
;------------------------------------------------------------
|
||||
; Additional gameplay and object state
|
||||
;------------------------------------------------------------
|
||||
|
||||
StateVarA0 = $A0
|
||||
StateVarA1 = $A1
|
||||
StateVarA2 = $A2
|
||||
StateVarA3 = $A3
|
||||
StateVarA4 = $A4
|
||||
StateVarA5 = $A5
|
||||
StateVarA6 = $A6
|
||||
StateVarA7 = $A7
|
||||
StateVarA8 = $A8
|
||||
StateVarA9 = $A9
|
||||
|
||||
StateVarAC = $AC
|
||||
StateVarAD = $AD
|
||||
StateVarAE = $AE
|
||||
StateVarAF = $AF
|
||||
ToggleStateB0 = $B0
|
||||
StateVarB2 = $B2
|
||||
|
||||
;------------------------------------------------------------
|
||||
; Object and behavior state
|
||||
;------------------------------------------------------------
|
||||
|
||||
ObjectVarD0 = $D0
|
||||
ObjectVarD1 = $D1
|
||||
ObjectVarD2 = $D2
|
||||
ObjectVarD4 = $D4
|
||||
ObjectVarD5 = $D5
|
||||
ObjectVarD6 = $D6
|
||||
ObjectVarD7 = $D7
|
||||
ObjectVarD8 = $D8
|
||||
ObjectVarDA = $DA
|
||||
|
||||
ObjectVarE9 = $E9
|
||||
ObjectVarEE = $EE
|
||||
ObjectVarEF = $EF
|
||||
|
||||
;------------------------------------------------------------
|
||||
; Audio workspace
|
||||
;------------------------------------------------------------
|
||||
|
||||
AudioPulse1State = $F0
|
||||
AudioPulse2State = $F1
|
||||
AudioTriangleState = $F2
|
||||
AudioNoiseState = $F3
|
||||
AudioPeriodOrEnvelope = $F4
|
||||
|
||||
AudioSequencePtrLo = $F5
|
||||
AudioSequencePtrHi = $F6
|
||||
AudioSequenceCursor = $F7
|
||||
AudioChannelCursor = $F8
|
||||
AudioChannelIndex = $F9
|
||||
AudioSequenceState = $FA
|
||||
|
||||
AudioRequest0 = $FB
|
||||
AudioRequest1 = $FC
|
||||
AudioRequest2 = $FD
|
||||
AudioRequest3 = $FE
|
||||
AudioRequest4 = $FF
|
||||
|
||||
; Verified vector-owned entry points
|
||||
IRQHandler = $C196
|
||||
|
||||
; First-pass routine entry aliases. These emit no bytes.
|
||||
; Names beyond the vectors are provisional and intentionally conservative.
|
||||
CheckBoundingBoxOverlap = $F730
|
||||
Binary file not shown.
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,770 @@
|
||||
al 00FFFA .VectorTable
|
||||
al 00FC78 .AudioDataTables
|
||||
al 00FC5B .UpdateNoiseOnNonZero_FC5B
|
||||
al 00FC55 .AudioPathOnNonZero_FC55
|
||||
al 00FC64 .AudioPathContinue_FC64
|
||||
al 00FC20 .UpdateTriangleOnNoCarry_FC20
|
||||
al 00FC2B .AudioPathContinue_FC2B
|
||||
al 00FC01 .UpdatePulse1OnNonZero_FC01
|
||||
al 00FBFF .AudioPathOnNonZero_FBFF
|
||||
al 00FBED .AudioPathOnNonZero_FBED
|
||||
al 00FBDA .UpdatePulse1Loop_FBDA
|
||||
al 00FC04 .AudioPathContinue_FC04
|
||||
al 00FBCB .UpdatePulse2OnZero_FBCB
|
||||
al 00FBD1 .AudioPathOnZero_FBD1
|
||||
al 00FBBA .UpdatePulse2OnCarry_FBBA
|
||||
al 00FBAF .AudioPathOnNonZero_FBAF
|
||||
al 00FBAA .AudioPathOnZero_FBAA
|
||||
al 00FF41 .ProcessAudioStateRoutine_FF41
|
||||
al 00FB95 .AudioPathOnNonZero_FB95
|
||||
al 00FB84 .UpdatePulse2OnZero_FB84
|
||||
al 00FB73 .AudioPathLoop_FB73
|
||||
al 00FBBD .AudioPathOnNonZero_FBBD
|
||||
al 00FB31 .UpdatePulse1Loop_FB31
|
||||
al 00FB6E .AudioPathOnNonZero_FB6E
|
||||
al 00FB2B .AudioPathLoop_FB2B
|
||||
al 00FB21 .AudioPathOnNonZero_FB21
|
||||
al 00FB05 .UpdateNoiseOnCarry_FB05
|
||||
al 00FAFE .AudioPathOnCarry_FAFE
|
||||
al 00FAF0 .UpdateNoiseOnCarry_FAF0
|
||||
al 00FAE9 .AudioPathOnCarry_FAE9
|
||||
al 00FB10 .UpdateNoiseOnNonZero_FB10
|
||||
al 00FABC .UpdateNoiseLoop_FABC
|
||||
al 00FAB5 .AudioPathLoop_FAB5
|
||||
al 00FA5A .AudioPathOnNonZero_FA5A
|
||||
al 00FA46 .AudioPathOnCarry_FA46
|
||||
al 00FA41 .AudioPathOnCarry_FA41
|
||||
al 00FA4E .UpdatePulse2OnNonZero_FA4E
|
||||
al 00FA26 .AudioPathLoop_FA26
|
||||
al 00FA21 .AudioPathLoop_FA21
|
||||
al 00FA0C .UpdatePulse2Routine_FA0C
|
||||
al 00FA07 .AudioPathOnNonZero_FA07
|
||||
al 00FA04 .UpdatePulse1OnNonZero_FA04
|
||||
al 00F9FC .AudioPathOnCarry_F9FC
|
||||
al 00F9F2 .AudioPathOnCarry_F9F2
|
||||
al 00F9D3 .UpdatePulse1Routine_F9D3
|
||||
al 00F9D8 .AudioPathOnNonZero_F9D8
|
||||
al 00F9BB .AudioPathLoop_F9BB
|
||||
al 00F9AE .AudioPathLoop_F9AE
|
||||
al 00F9A7 .AudioPathOnNonZero_F9A7
|
||||
al 00F9A1 .AudioPathOnNonZero_F9A1
|
||||
al 00F9A9 .AudioPathOnNonZero_F9A9
|
||||
al 00F999 .AudioPathOnNonZero_F999
|
||||
al 00F98D .AudioPathLoop_F98D
|
||||
al 00F97E .AudioPathLoop_F97E
|
||||
al 00F9C3 .UpdatePulse1OnNonZero_F9C3
|
||||
al 00F976 .UpdatePulse1Dispatch_F976
|
||||
al 00F971 .AudioPathLoop_F971
|
||||
al 00F9D9 .AudioPathOnNoCarry_F9D9
|
||||
al 00F95C .AudioPathOnNonZero_F95C
|
||||
al 00F94D .UpdatePulse1OnNonZero_F94D
|
||||
al 00F92B .UpdatePulse1OnZero_F92B
|
||||
al 00F935 .UpdatePulse1OnNoCarry_F935
|
||||
al 00F917 .UpdatePulse1Loop_F917
|
||||
al 00F95F .UpdatePulse1OnNoCarry_F95F
|
||||
al 00F8E2 .AudioPathOnNonZero_F8E2
|
||||
al 00F8D8 .AudioPathLoop_F8D8
|
||||
al 00F8CA .AudioPathLoop_F8CA
|
||||
al 00F9CF .ProcessAudioStateDispatch_F9CF
|
||||
al 00F8C7 .AudioPathLoop_F8C7
|
||||
al 00F8EA .UpdatePulse1OnNoCarry_F8EA
|
||||
al 00F8BD .AudioPathOnNoCarry_F8BD
|
||||
al 00F8B5 .AudioPathLoop_F8B5
|
||||
al 00F8F9 .UpdatePulse1OnNoCarry_F8F9
|
||||
al 00F9CB .ProcessAudioStateDispatch_F9CB
|
||||
al 00F895 .AudioPathContinue_F895
|
||||
al 00F890 .AudioPathOnNonZero_F890
|
||||
al 00F881 .AudioPathOnNonZero_F881
|
||||
al 00F875 .AudioPathLoop_F875
|
||||
al 00F871 .AudioPathLoop_F871
|
||||
al 00F86B .AudioPathLoop_F86B
|
||||
al 00F818 .ProcessAudioStateRoutine_F818
|
||||
al 00F814 .ProcessAudioStateRoutine_F814
|
||||
al 00F813 .AudioPathOnZero_F813
|
||||
al 00F802 .UpdatePulse1Loop_F802
|
||||
al 00F800 .ProcessAudioStateRoutine_F800
|
||||
al 00F7FD .ProcessAudioStateRoutine_F7FD
|
||||
al 00F7F6 .UpdatePulse1Routine_F7F6
|
||||
al 00F7F2 .AudioPathContinue_F7F2
|
||||
al 00F7EC .AudioPathOnZero_F7EC
|
||||
al 00FB22 .ProcessAudioStateRoutine_FB22
|
||||
al 00FACF .ProcessAudioStateRoutine_FACF
|
||||
al 00FA2E .ProcessAudioStateRoutine_FA2E
|
||||
al 00F898 .ProcessAudioStateRoutine_F898
|
||||
al 00F7B0 .EnginePathLoop_F7B0
|
||||
al 00F79D .EnginePathLoop_F79D
|
||||
al 00F77C .EnginePathContinue_F77C
|
||||
al 00F719 .EnginePath_F719
|
||||
al 00F70B .EnginePathLoop_F70B
|
||||
al 00F6FD .EnginePathLoop_F6FD
|
||||
al 00F6E4 .EnginePathLoop_F6E4
|
||||
al 00F6E2 .EnginePathLoop_F6E2
|
||||
al 00F6E7 .EnginePathOnNonZero_F6E7
|
||||
al 00F6D4 .EnginePathOnOverflowClear_F6D4
|
||||
al 00F6A3 .EnginePathLoop_F6A3
|
||||
al 00F6AF .EnginePathOnZero_F6AF
|
||||
al 00F69C .EnginePathLoop_F69C
|
||||
al 00F6C0 .EnginePathOnOverflowSet_F6C0
|
||||
al 00F6BE .EnginePathOnNegative_F6BE
|
||||
al 00F682 .EnginePathLoop_F682
|
||||
al 00F667 .EnginePathLoop_F667
|
||||
al 00F665 .EnginePathLoop_F665
|
||||
al 00F661 .EnginePathLoop_F661
|
||||
al 00F677 .EnginePathOnZero_F677
|
||||
al 00F707 .ProcessResourceStateRoutine_F707
|
||||
al 00F659 .EnginePathOnZero_F659
|
||||
al 00F6B0 .EnginePathOnNonZero_F6B0
|
||||
al 00F6FB .ProcessResourceStateRoutine_F6FB
|
||||
al 00F600 .EnginePathLoop_F600
|
||||
al 00F5F5 .EnginePathLoop_F5F5
|
||||
al 00F5F4 .EnginePathOnZero_F5F4
|
||||
al 00F5C0 .EnginePathLoop_F5C0
|
||||
al 00F5BE .ProcessResourceStateRoutine_F5BE
|
||||
al 00F59D .EnginePathOnZero_F59D
|
||||
al 00F589 .EnginePathOnZero_F589
|
||||
al 00F583 .EnginePathLoop_F583
|
||||
al 00F55E .EnginePathOnNoCarry_F55E
|
||||
al 00F56A .EnginePathContinue_F56A
|
||||
al 00F549 .EnginePathLoop_F549
|
||||
al 00F574 .EnginePathOnNonZero_F574
|
||||
al 00F56F .EnginePathOnCarry_F56F
|
||||
al 00F51E .EnginePathLoop_F51E
|
||||
al 00F544 .EnginePathLoop_F544
|
||||
al 00F56B .EnginePathOnZero_F56B
|
||||
al 00F515 .EnginePathLoop_F515
|
||||
al 00F4EE .EnginePathOnCarry_F4EE
|
||||
al 00F4E2 .EnginePathOnCarry_F4E2
|
||||
al 00F4C6 .EnginePathLoop_F4C6
|
||||
al 00F4CA .EnginePathOnNoCarry_F4CA
|
||||
al 00F4B9 .EnginePathOnNoCarry_F4B9
|
||||
al 00F4F1 .ProcessResourceStateRoutine_F4F1
|
||||
al 00F4AD .EnginePathOnCarry_F4AD
|
||||
al 00F491 .EnginePathOnZero_F491
|
||||
al 00F48B .EnginePathOnNonZero_F48B
|
||||
al 00F4CF .ProcessResourceStateRoutine_F4CF
|
||||
al 00F4AE .ProcessResourceStateRoutine_F4AE
|
||||
al 00F436 .EnginePathLoop_F436
|
||||
al 00F45D .EnginePathOnZero_F45D
|
||||
al 00F459 .EnginePathOnZero_F459
|
||||
al 00F429 .ProcessResourceStateRoutine_F429
|
||||
al 00F41F .EnginePathOnNonZero_F41F
|
||||
al 00F40E .EnginePathOnNonZero_F40E
|
||||
al 00F407 .EnginePathOnNoCarry_F407
|
||||
al 00F3CB .UpdateCommandBufferLoop_F3CB
|
||||
al 00F3B4 .UpdateCommandBufferLoop_F3B4
|
||||
al 00F38F .UpdateCommandBufferOnZero_F38F
|
||||
al 00F370 .UpdateCommandBufferLoop_F370
|
||||
al 00F3F7 .UpdateCommandBufferRoutine_F3F7
|
||||
al 00F3F5 .ProcessResourceStateRoutine_F3F5
|
||||
al 00F3A0 .EnginePathContinue_F3A0
|
||||
al 00F32C .UpdateCommandBufferRoutine_F32C
|
||||
al 00F302 .EnginePathOnNonZero_F302
|
||||
al 00F2F4 .EnginePathOnNonZero_F2F4
|
||||
al 00F2DE .EnginePathLoop_F2DE
|
||||
al 00F2C5 .EnginePathOnCarry_F2C5
|
||||
al 00F2C2 .EnginePathLoop_F2C2
|
||||
al 00F2BF .EnginePathOnNoCarry_F2BF
|
||||
al 00F2B3 .EnginePathOnCarry_F2B3
|
||||
al 00F29C .EnginePathLoop_F29C
|
||||
al 00F295 .EnginePathLoop_F295
|
||||
al 00F27C .EnginePathLoop_F27C
|
||||
al 00F266 .EnginePathLoop_F266
|
||||
al 00F248 .UpdateCommandBufferOnNonZero_F248
|
||||
al 00F22D .UpdateCommandBufferLoop_F22D
|
||||
al 00F220 .ResourceInputCollisionCode
|
||||
al 00F21B .PPUCommandLoop_F21B
|
||||
al 00F249 .PPUCommandReadNextByte_F249
|
||||
al 00E73C .UpdateObjectBufferOnNoCarry_E73C
|
||||
al 00E731 .ObjectPathOnZero_E731
|
||||
al 00E700 .UpdateObjectBuffer_E700
|
||||
al 00E6FD .ProcessObjectStateDispatch_E6FD
|
||||
al 00E6F9 .ObjectPathLoop_E6F9
|
||||
al 00E6D7 .UpdateObjectBufferOnNonZero_E6D7
|
||||
al 00E6CC .ObjectPathLoop_E6CC
|
||||
al 00E6C5 .ObjectPathOnNonZero_E6C5
|
||||
al 00E6F2 .ObjectPathLoop_E6F2
|
||||
al 00E69C .ReadObjectRecordLoop_E69C
|
||||
al 00E59B .ObjectPathLoop_E59B
|
||||
al 00E592 .UpdateObjectRecordOnZero_E592
|
||||
al 00E571 .UpdateObjectRecordOnZero_E571
|
||||
al 00E55A .UpdateObjectRecordLoop_E55A
|
||||
al 00E59C .ObjectPathOnZero_E59C
|
||||
al 00E547 .ObjectPathLoop_E547
|
||||
al 00E538 .ObjectPathLoop_E538
|
||||
al 00E4EA .UpdateObjectRecordLoop_E4EA
|
||||
al 00E4E3 .ReadObjectRecordOnZero_E4E3
|
||||
al 00E49F .UpdateObjectRecordOnZero_E49F
|
||||
al 00E49B .ObjectPathOnNonZero_E49B
|
||||
al 00E491 .ObjectPathOnNonZero_E491
|
||||
al 00E470 .ReadObjectRecordLoop_E470
|
||||
al 00E40F .ReadObjectRecordOnNoCarry_E40F
|
||||
al 00E3F4 .UpdateObjectRecordOnNoCarry_E3F4
|
||||
al 00E405 .ProcessObjectStateRoutine_E405
|
||||
al 00E3E4 .UpdateObjectRecordOnCarry_E3E4
|
||||
al 00E3B6 .UpdateObjectRecord_E3B6
|
||||
al 00E380 .ObjectPathOnZero_E380
|
||||
al 00E35C .ReadObjectRecord_E35C
|
||||
al 00E37E .ObjectPathLoop_E37E
|
||||
al 00E350 .ObjectPathOnNoCarry_E350
|
||||
al 00E313 .UpdateObjectRecordOnZero_E313
|
||||
al 00E301 .UpdateObjectRecordOnNoCarry_E301
|
||||
al 00E2D8 .ReadObjectRecordOnPositive_E2D8
|
||||
al 00E2AA .UpdateObjectRecordRoutine_E2AA
|
||||
al 00E2B9 .ObjectPathOnNegative_E2B9
|
||||
al 00E2B5 .ObjectPathOnNegative_E2B5
|
||||
al 00E2E6 .UpdateObjectRecordRoutine_E2E6
|
||||
al 00E2BA .ObjectPathOnCarry_E2BA
|
||||
al 00E2C7 .ReadObjectRecordOnNonZero_E2C7
|
||||
al 00E275 .UpdateObjectRecordOnPositive_E275
|
||||
al 00E251 .UpdateObjectRecordOnNonZero_E251
|
||||
al 00E249 .ObjectPathOnNoCarry_E249
|
||||
al 00E69A .ProcessObjectStateRoutine_E69A
|
||||
al 00E21D .ObjectPathOnNoCarry_E21D
|
||||
al 00E281 .ProcessObjectStateRoutine_E281
|
||||
al 00E1FD .UpdateObjectRecordOnNonZero_E1FD
|
||||
al 00E1E8 .ObjectPathOnNegative_E1E8
|
||||
al 00E229 .UpdateObjectRecordRoutine_E229
|
||||
al 00E262 .ReadObjectRecordRoutine_E262
|
||||
al 00E1CF .UpdateObjectRecordOnPositive_E1CF
|
||||
al 00E1BD .ObjectPathOnNonZero_E1BD
|
||||
al 00E1B9 .ObjectPathContinue_E1B9
|
||||
al 00E1A3 .ObjectPathOnCarry_E1A3
|
||||
al 00E1A7 .ObjectPathOnZero_E1A7
|
||||
al 00E191 .ObjectPathOnCarry_E191
|
||||
al 00E1BB .ObjectPathContinue_E1BB
|
||||
al 00E15B .ObjectPathLoop_E15B
|
||||
al 00E165 .ObjectPathOnCarry_E165
|
||||
al 00E153 .ReadObjectRecordOnZero_E153
|
||||
al 00E15D .ReadObjectRecordOnZero_E15D
|
||||
al 00E13F .ReadObjectRecordRoutine_E13F
|
||||
al 00E118 .ObjectPathLoop_E118
|
||||
al 00E0D2 .UpdateObjectBufferOnNonZero_E0D2
|
||||
al 00E0B5 .ObjectPathLoop_E0B5
|
||||
al 00E09C .UpdateObjectRecordOnZero_E09C
|
||||
al 00E080 .UpdateObjectRecordOnNoCarry_E080
|
||||
al 00E09B .ObjectPathContinue_E09B
|
||||
al 00E069 .ObjectPathOnNonZero_E069
|
||||
al 00E059 .ObjectPathOnNoCarry_E059
|
||||
al 00E04F .ObjectPathOnNoCarry_E04F
|
||||
al 00E045 .ProcessObjectStateRoutine_E045
|
||||
al 00DFE6 .ObjectPathOnZero_DFE6
|
||||
al 00DFD1 .ObjectPathLoop_DFD1
|
||||
al 00DFA3 .ObjectPathOnCarry_DFA3
|
||||
al 00DFAC .UpdateObjectBufferContinue_DFAC
|
||||
al 00DF7D .ObjectPathOnNonZero_DF7D
|
||||
al 00DF66 .UpdateObjectBufferDispatch_DF66
|
||||
al 00DF53 .ObjectPathLoop_DF53
|
||||
al 00DF1F .ObjectPathOnCarry_DF1F
|
||||
al 00DEE2 .UpdateObjectBufferOnNoCarry_DEE2
|
||||
al 00DED5 .ObjectPathLoop_DED5
|
||||
al 00DE8B .ProcessObjectStateRoutine_DE8B
|
||||
al 00DE6B .ObjectPathOnCarry_DE6B
|
||||
al 00DE55 .UpdateObjectBufferOnCarry_DE55
|
||||
al 00DE4D .ObjectPathOnNonZero_DE4D
|
||||
al 00DE3C .UpdateObjectBufferOnZero_DE3C
|
||||
al 00DE81 .UpdateObjectBufferRoutine_DE81
|
||||
al 00DE31 .ObjectPathLoop_DE31
|
||||
al 00DE26 .UpdateObjectBufferLoop_DE26
|
||||
al 00DE17 .ObjectPathLoop_DE17
|
||||
al 00DDF3 .ObjectPathOnCarry_DDF3
|
||||
al 00DDDB .ObjectPathLoop_DDDB
|
||||
al 00DDE3 .ObjectPathOnNonZero_DDE3
|
||||
al 00DDC7 .ObjectPathLoop_DDC7
|
||||
al 00DDF8 .ObjectPathOnZero_DDF8
|
||||
al 00DDAC .ObjectPathContinue_DDAC
|
||||
al 00DD99 .ObjectPathLoop_DD99
|
||||
al 00DD8E .ObjectPathOnNegative_DD8E
|
||||
al 00DD67 .UpdateObjectBufferLoop_DD67
|
||||
al 00DD4F .ObjectPathOnNonZero_DD4F
|
||||
al 00DD5A .ObjectPathOnNonZero_DD5A
|
||||
al 00DD3E .ObjectPathOnNonZero_DD3E
|
||||
al 00DD2F .ObjectPathOnNonZero_DD2F
|
||||
al 00DD20 .ObjectPathOnNonZero_DD20
|
||||
al 00DCE9 .ObjectPathOnNonZero_DCE9
|
||||
al 00DCD6 .ObjectPathOnZero_DCD6
|
||||
al 00DD08 .ObjectPathOnZero_DD08
|
||||
al 00DCEA .ObjectPathOnZero_DCEA
|
||||
al 00DCBB .UpdateObjectBufferOnZero_DCBB
|
||||
al 00DC9E .ObjectPathOnNegative_DC9E
|
||||
al 00DC8A .ObjectPathLoop_DC8A
|
||||
al 00DC72 .ObjectPathLoop_DC72
|
||||
al 00DC66 .UpdateObjectBufferLoop_DC66
|
||||
al 00DC44 .ObjectPathLoop_DC44
|
||||
al 00DC1E .ObjectPathLoop_DC1E
|
||||
al 00DC18 .ObjectPathOnZero_DC18
|
||||
al 00DC2E .ObjectPathLoop_DC2E
|
||||
al 00DC34 .ObjectPathOnZero_DC34
|
||||
al 00DC3E .ObjectPathOnNegative_DC3E
|
||||
al 00DC36 .ObjectPathLoop_DC36
|
||||
al 00DBD3 .ObjectPathLoop_DBD3
|
||||
al 00DBA7 .UpdateObjectBufferOnNegative_DBA7
|
||||
al 00DB8A .ProcessObjectStateRoutine_DB8A
|
||||
al 00DBC3 .ObjectPathContinue_DBC3
|
||||
al 00DB30 .ReadObjectRecordOnNoCarry_DB30
|
||||
al 00DB0A .ReadObjectRecordLoop_DB0A
|
||||
al 00DB28 .ObjectPathOnNegative_DB28
|
||||
al 00DB27 .ObjectPathContinue_DB27
|
||||
al 00DABD .ObjectPathOnZero_DABD
|
||||
al 00DAB5 .ObjectPathOnZero_DAB5
|
||||
al 00DA9F .ObjectPathOnZero_DA9F
|
||||
al 00DA81 .ObjectPathOnCarry_DA81
|
||||
al 00DA79 .ObjectPathOnCarry_DA79
|
||||
al 00DA8B .ObjectPathOnNonZero_DA8B
|
||||
al 00DA65 .ObjectPathOnZero_DA65
|
||||
al 00DA85 .ObjectPathLoop_DA85
|
||||
al 00DA3E .ObjectPathOnZero_DA3E
|
||||
al 00DA36 .ObjectPathOnNonZero_DA36
|
||||
al 00DA8A .ObjectPathContinue_DA8A
|
||||
al 00DA14 .ObjectPathOnNoCarry_DA14
|
||||
al 00D9F2 .ObjectPathOnNoCarry_D9F2
|
||||
al 00DA04 .UpdateObjectBufferRoutine_DA04
|
||||
al 00D9E1 .ObjectPathOnNoCarry_D9E1
|
||||
al 00D9E2 .UpdateObjectBufferRoutine_D9E2
|
||||
al 00D9CF .ObjectPathOnNonZero_D9CF
|
||||
al 00D9CB .ObjectPathOnCarry_D9CB
|
||||
al 00D9DE .ObjectPathContinue_D9DE
|
||||
al 00D9B1 .ProcessObjectStateRoutine_D9B1
|
||||
al 00D9A0 .ObjectPathOnNoCarry_D9A0
|
||||
al 00D998 .ObjectPathLoop_D998
|
||||
al 00D987 .UpdateObjectBufferLoop_D987
|
||||
al 00D978 .ObjectPathOnNonZero_D978
|
||||
al 00D95A .ObjectPathOnNoCarry_D95A
|
||||
al 00D96D .ObjectPathContinue_D96D
|
||||
al 00D93D .UpdateObjectBufferOnZero_D93D
|
||||
al 00D918 .UpdateObjectBufferLoop_D918
|
||||
al 00D8F2 .UpdateObjectBufferLoop_D8F2
|
||||
al 00D928 .ObjectPathOnCarry_D928
|
||||
al 00D8E1 .ObjectPathOnPositive_D8E1
|
||||
al 00D904 .ProcessObjectStateDispatch_D904
|
||||
al 00D970 .ProcessObjectStateRoutine_D970
|
||||
al 00D8D2 .ObjectPathLoop_D8D2
|
||||
al 00D8C6 .UpdateObjectBufferLoop_D8C6
|
||||
al 00F71C .ProcessResourceStateRoutine_F71C
|
||||
al 00D896 .UpdateObjectBufferOnPositive_D896
|
||||
al 00D888 .ObjectPathOnZero_D888
|
||||
al 00D8A5 .ObjectPathContinue_D8A5
|
||||
al 00D86E .ObjectPathLoop_D86E
|
||||
al 00D862 .UpdateObjectBufferLoop_D862
|
||||
al 00D842 .UpdateObjectRecordOnNoCarry_D842
|
||||
al 00D83A .ObjectPathOnZero_D83A
|
||||
al 00D82F .ObjectPathLoop_D82F
|
||||
al 00D828 .ReadObjectRecordOnCarry_D828
|
||||
al 00D804 .ObjectPathOnNonZero_D804
|
||||
al 00D7F0 .UpdateObjectRecordOnNonZero_D7F0
|
||||
al 00D7E8 .ObjectPathOnNoCarry_D7E8
|
||||
al 00D7DD .ProcessObjectStateDispatch_D7DD
|
||||
al 00D7DB .ObjectPathLoop_D7DB
|
||||
al 00D809 .ObjectPathOnZero_D809
|
||||
al 00D807 .ObjectPathOnCarry_D807
|
||||
al 00D80D .ReadObjectRecordLoop_D80D
|
||||
al 00D7B9 .TestObjectFieldOnNoCarry_D7B9
|
||||
al 00D814 .UpdateObjectRecordContinue_D814
|
||||
al 00D7A1 .ObjectPathOnNoCarry_D7A1
|
||||
al 00D794 .UpdateObjectRecordOnNonZero_D794
|
||||
al 00D765 .UpdateObjectRecordOnCarry_D765
|
||||
al 00D75D .ObjectPathOnCarry_D75D
|
||||
al 00D755 .ObjectPathOnCarry_D755
|
||||
al 00D7A4 .ReadObjectRecordContinue_D7A4
|
||||
al 00D775 .UpdateObjectRecordOnNonZero_D775
|
||||
al 00D736 .ObjectPathLoop_D736
|
||||
al 00D72A .ObjectPathContinue_D72A
|
||||
al 00D716 .ObjectPathLoop_D716
|
||||
al 00D6D6 .UpdateObjectRecordLoop_D6D6
|
||||
al 00D6C0 .UpdateObjectBufferOnNonZero_D6C0
|
||||
al 00D6A8 .ObjectPathOnNonZero_D6A8
|
||||
al 00D699 .ObjectPathOnZero_D699
|
||||
al 00D680 .UpdateObjectRecordLoop_D680
|
||||
al 00D68E .UpdateObjectRecordContinue_D68E
|
||||
al 00D6A9 .ReadObjectRecordOnZero_D6A9
|
||||
al 00D65B .ReadObjectRecordLoop_D65B
|
||||
al 00D64C .ObjectPathLoop_D64C
|
||||
al 00D73B .UpdateObjectBufferDispatch_D73B
|
||||
al 00D649 .ObjectPathLoop_D649
|
||||
al 00D646 .ObjectPathLoop_D646
|
||||
al 00D643 .ObjectPathLoop_D643
|
||||
al 00D640 .ObjectPathLoop_D640
|
||||
al 00D62A .UpdateObjectRecordLoop_D62A
|
||||
al 00D615 .ObjectPathLoop_D615
|
||||
al 00D60C .UpdateObjectRecordOnNoCarry_D60C
|
||||
al 00D5FF .UpdateObjectRecordOnNoCarry_D5FF
|
||||
al 00D5F6 .ObjectPathOnCarry_D5F6
|
||||
al 00D5F8 .ObjectPathOnZero_D5F8
|
||||
al 00D5D5 .ReadObjectRecordOnNonZero_D5D5
|
||||
al 00D5C7 .UpdateObjectRecordOnNonZero_D5C7
|
||||
al 00D5C9 .ObjectPathOnNonZero_D5C9
|
||||
al 00D5CC .ObjectPathContinue_D5CC
|
||||
al 00D5A3 .UpdateObjectRecordDispatch_D5A3
|
||||
al 00D59F .ProcessObjectStateDispatch_D59F
|
||||
al 00D777 .ReadObjectRecordDispatch_D777
|
||||
al 00D595 .UpdateObjectRecordOnNonZero_D595
|
||||
al 00D555 .UpdateObjectRecordDispatch_D555
|
||||
al 00D548 .UpdateObjectRecordLoop_D548
|
||||
al 00D546 .ObjectPathOnNonZero_D546
|
||||
al 00D54C .ObjectPathOnNoCarry_D54C
|
||||
al 00D527 .UpdateObjectRecordDispatch_D527
|
||||
al 00DD5B .UpdateObjectBufferRoutine_DD5B
|
||||
al 00D67A .ProcessObjectStateDispatch_D67A
|
||||
al 00D4FC .UpdateObjectRecordOnCarry_D4FC
|
||||
al 00D57E .UpdateObjectRecordDispatch_D57E
|
||||
al 00D4F9 .ObjectPathOnNonZero_D4F9
|
||||
al 00D783 .ProcessObjectStateDispatch_D783
|
||||
al 00D4C6 .ObjectPathLoop_D4C6
|
||||
al 00D4B8 .UpdateObjectRecordOnZero_D4B8
|
||||
al 00D4CB .UpdateObjectRecordContinue_D4CB
|
||||
al 00D4DE .UpdateObjectRecordOnCarry_D4DE
|
||||
al 00D4D5 .ReadObjectRecordOnCarry_D4D5
|
||||
al 00D481 .ReadObjectRecordDispatch_D481
|
||||
al 00D49E .UpdateObjectRecordDispatch_D49E
|
||||
al 00D47E .ObjectPathOnNoCarry_D47E
|
||||
al 00D476 .ObjectPathLoop_D476
|
||||
al 00D4A3 .ObjectPathOnNegative_D4A3
|
||||
al 00D436 .UpdateObjectBufferLoop_D436
|
||||
al 00D416 .ObjectPathLoop_D416
|
||||
al 00D41A .UpdateObjectRecordOnZero_D41A
|
||||
al 00D418 .ObjectPathOnNonZero_D418
|
||||
al 00D3FF .ObjectPathOnZero_D3FF
|
||||
al 00D3DC .ObjectPathOnNonZero_D3DC
|
||||
al 00D3E0 .ObjectPathOnPositive_D3E0
|
||||
al 00D3DA .ObjectPathContinue_D3DA
|
||||
al 00D3A2 .UpdateObjectBufferOnNoCarry_D3A2
|
||||
al 00D396 .UpdateObjectBufferOnNonZero_D396
|
||||
al 00D3AF .UpdateObjectBufferOnZero_D3AF
|
||||
al 00D384 .UpdateObjectBufferOnZero_D384
|
||||
al 00D382 .ObjectPathOnZero_D382
|
||||
al 00D401 .UpdateObjectRecordDispatch_D401
|
||||
al 00D34B .ObjectPathLoop_D34B
|
||||
al 00D36E .UpdateObjectRecordOnZero_D36E
|
||||
al 00E335 .UpdateObjectRecordRoutine_E335
|
||||
al 00D331 .ReadObjectRecordLoop_D331
|
||||
al 00D32F .ObjectPathLoop_D32F
|
||||
al 00D32B .ObjectPathLoop_D32B
|
||||
al 00D312 .UpdateObjectRecordLoop_D312
|
||||
al 00D30B .UpdateObjectRecordOnZero_D30B
|
||||
al 00D2E0 .UpdateObjectRecordOnZero_D2E0
|
||||
al 00D2C7 .ObjectPathOnZero_D2C7
|
||||
al 00E325 .UpdateObjectRecordRoutine_E325
|
||||
al 00D2B5 .UpdateObjectRecordOnZero_D2B5
|
||||
al 00D2D0 .ObjectPathOnZero_D2D0
|
||||
al 00D2CE .ObjectPathOnZero_D2CE
|
||||
al 00D275 .ObjectPathLoop_D275
|
||||
al 00D272 .ObjectPathOnZero_D272
|
||||
al 00D277 .ObjectPathOnZero_D277
|
||||
al 00D25F .ObjectPathLoop_D25F
|
||||
al 00D23A .ObjectPathOnNegative_D23A
|
||||
al 00D220 .ObjectPathOnPositive_D220
|
||||
al 00D222 .UpdateObjectBufferOnNonZero_D222
|
||||
al 00D254 .ObjectPathContinue_D254
|
||||
al 00D1EF .ObjectPathOnZero_D1EF
|
||||
al 00D1E6 .ObjectPathOnZero_D1E6
|
||||
al 00D1F4 .ObjectPathOnNonZero_D1F4
|
||||
al 00D16D .UpdateObjectRecordOnNoCarry_D16D
|
||||
al 00D161 .ObjectPathOnCarry_D161
|
||||
al 00D158 .ObjectPathLoop_D158
|
||||
al 00D14E .ObjectPathOnNoCarry_D14E
|
||||
al 00D13A .UpdateObjectRecordOnNonZero_D13A
|
||||
al 00D14F .ObjectPathOnNoCarry_D14F
|
||||
al 00D132 .ObjectPathContinue_D132
|
||||
al 00DDB2 .ProcessObjectStateRoutine_DDB2
|
||||
al 00D102 .ObjectPathLoop_D102
|
||||
al 00D0EB .ObjectPathLoop_D0EB
|
||||
al 00D0D4 .ObjectPathLoop_D0D4
|
||||
al 00D0BD .ObjectPathLoop_D0BD
|
||||
al 00F601 .ProcessResourceStateRoutine_F601
|
||||
al 00D04C .UpdateObjectRecordOnZero_D04C
|
||||
al 00D045 .ObjectPathOnNonZero_D045
|
||||
al 00D04F .ProcessObjectStateDispatch_D04F
|
||||
al 00D01A .UpdateObjectRecordOnCarry_D01A
|
||||
al 00D052 .UpdateObjectRecordOnZero_D052
|
||||
al 00CFF7 .UpdateObjectRecordContinue_CFF7
|
||||
al 00CFDB .ReadObjectRecordOnNonZero_CFDB
|
||||
al 00D004 .UpdateObjectRecordOnZero_D004
|
||||
al 00CFFA .ProcessObjectStateDispatch_CFFA
|
||||
al 00CF9E .ObjectPathLoop_CF9E
|
||||
al 00CFAD .UpdateObjectRecordLoop_CFAD
|
||||
al 00CF96 .UpdateObjectRecordOnCarry_CF96
|
||||
al 00CF6B .UpdateObjectRecordOnZero_CF6B
|
||||
al 00CF3C .ReadObjectRecordDispatch_CF3C
|
||||
al 00CF1E .ObjectPathContinue_CF1E
|
||||
al 00CF02 .ObjectPathContinue_CF02
|
||||
al 00D94D .ProcessObjectStateRoutine_D94D
|
||||
al 00CED7 .ObjectPathLoop_CED7
|
||||
al 00CECA .ObjectPathOnZero_CECA
|
||||
al 00CE96 .ObjectPathContinue_CE96
|
||||
al 00CE7A .ObjectPathLoop_CE7A
|
||||
al 00E0F9 .UpdateObjectBufferRoutine_E0F9
|
||||
al 00CE9D .ObjectPathOnZero_CE9D
|
||||
al 00CE6D .ObjectPathLoop_CE6D
|
||||
al 00CE6F .ObjectPathOnZero_CE6F
|
||||
al 00CE60 .ObjectPathLoop_CE60
|
||||
al 00CE41 .ObjectPathOnZero_CE41
|
||||
al 00CE26 .ObjectPathOnZero_CE26
|
||||
al 00CE2A .ProcessObjectStateDispatch_CE2A
|
||||
al 00CE34 .ObjectPathOnZero_CE34
|
||||
al 00CE33 .ObjectPathContinue_CE33
|
||||
al 00CE50 .ProcessObjectStateRoutine_CE50
|
||||
al 00CDE4 .UpdateObjectBufferContinue_CDE4
|
||||
al 00CDBE .ObjectPathOnCarry_CDBE
|
||||
al 00CDCE .ObjectPathContinue_CDCE
|
||||
al 00CDCD .ObjectPathContinue_CDCD
|
||||
al 00CD70 .ObjectPathOnZero_CD70
|
||||
al 00CD64 .ObjectPathLoop_CD64
|
||||
al 00CD62 .ObjectPathOnZero_CD62
|
||||
al 00CD5C .ObjectPathOnNoCarry_CD5C
|
||||
al 00CD45 .UpdateObjectRecordRoutine_CD45
|
||||
al 00CD1E .UpdateObjectRecordRoutine_CD1E
|
||||
al 00CCDE .UpdateObjectRecordLoop_CCDE
|
||||
al 00CCF7 .UpdateObjectRecordRoutine_CCF7
|
||||
al 00CCD9 .ObjectPathLoop_CCD9
|
||||
al 00CD54 .ProcessObjectStateRoutine_CD54
|
||||
al 00CCEF .ObjectPathOnCarry_CCEF
|
||||
al 00CCE9 .ObjectPathContinue_CCE9
|
||||
al 00CCCC .ObjectPathContinue_CCCC
|
||||
al 00CCB8 .ObjectEngineCodeAndTables
|
||||
al 00CCB6 .@SetObjectFieldOffset
|
||||
al 00CC40 .MovementTables
|
||||
al 00E28F .ProcessObjectStateRoutine_E28F
|
||||
al 00CC1F .RunGameTaskDispatch_CC1F
|
||||
al 00E3A7 .UpdateObjectRecordRoutine_E3A7
|
||||
al 00CC22 .CorePathOnNoCarry_CC22
|
||||
al 00E351 .ReadObjectRecordRoutine_E351
|
||||
al 00CCA8 .PrepareObjectMovementContext
|
||||
al 00E1BF .ProcessObjectStateRoutine_E1BF
|
||||
al 00E17F .ProcessObjectStateRoutine_E17F
|
||||
al 00CC10 .CorePathContinue_CC10
|
||||
al 00E5AA .ReadObjectRecordRoutine_E5AA
|
||||
al 00E06A .ReadObjectRecordRoutine_E06A
|
||||
al 00CC23 .CorePathOnCarry_CC23
|
||||
al 00E539 .ReadObjectRecordRoutine_E539
|
||||
al 00E468 .UpdateObjectBufferRoutine_E468
|
||||
al 00CBFA .CorePathOnPositive_CBFA
|
||||
al 00CBAE .CorePathLoop_CBAE
|
||||
al 00F2EA .ProcessResourceStateDispatch_F2EA
|
||||
al 00CB85 .CorePathOnNonZero_CB85
|
||||
al 00CB5E .UpdateGameStateOnZero_CB5E
|
||||
al 00CB56 .UpdatePlayerStateOnZero_CB56
|
||||
al 00D42C .ProcessObjectStateRoutine_D42C
|
||||
al 00CB3F .UpdatePlayerStateOnZero_CB3F
|
||||
al 00CB15 .UpdateGameStateOnNonZero_CB15
|
||||
al 00CAD4 .CorePathLoop_CAD4
|
||||
al 00CA4D .CorePathOnNonZero_CA4D
|
||||
al 00CA25 .UpdateGameStateLoop_CA25
|
||||
al 00CA1D .CorePathLoop_CA1D
|
||||
al 00CBA8 .RunGameTaskRoutine_CBA8
|
||||
al 00DF5E .UpdateObjectBuffer_DF5E
|
||||
al 00DE15 .ObjectPath_DE15
|
||||
al 00D211 .ProcessObjectStateRoutine_D211
|
||||
al 00CA09 .CorePathOnZero_CA09
|
||||
al 00DF2F .ObjectPath_DF2F
|
||||
al 00CB87 .RunGameTaskDispatch_CB87
|
||||
al 00C9D3 .CorePathOnZero_C9D3
|
||||
al 00CB8C .RunGameTaskRoutine_CB8C
|
||||
al 00C9B8 .UpdateGameStateOnZero_C9B8
|
||||
al 00F257 .ProcessResourceStateRoutine_F257
|
||||
al 00C9DA .CorePathOnZero_C9DA
|
||||
al 00C99B .UpdateGameStateOnNonZero_C99B
|
||||
al 00C986 .CorePathContinue_C986
|
||||
al 00C974 .CorePathContinue_C974
|
||||
al 00C95D .CorePathOnNonZero_C95D
|
||||
al 00C94D .CorePathLoop_C94D
|
||||
al 00C939 .CorePathLoop_C939
|
||||
al 00C937 .CorePathLoop_C937
|
||||
al 00C941 .CorePathContinue_C941
|
||||
al 00E0B2 .ProcessObjectStateRoutine_E0B2
|
||||
al 00E0DF .UpdateObjectBufferRoutine_E0DF
|
||||
al 00C907 .CorePathLoop_C907
|
||||
al 00C8FB .RunGameTaskRoutine_C8FB
|
||||
al 00C8E1 .CorePathLoop_C8E1
|
||||
al 00C8D6 .RunGameTaskRoutine_C8D6
|
||||
al 00CBD3 .RunGameTaskRoutine_CBD3
|
||||
al 00C8CA .CorePathLoop_C8CA
|
||||
al 00C8B9 .RunGameTaskRoutine_C8B9
|
||||
al 00C8AA .RunGameTaskRoutine_C8AA
|
||||
al 00C889 .CorePathLoop_C889
|
||||
al 00C875 .CorePathLoop_C875
|
||||
al 00C873 .CorePathLoop_C873
|
||||
al 00C86A .CorePathLoop_C86A
|
||||
al 00C862 .CorePathLoop_C862
|
||||
al 00C851 .CorePathLoop_C851
|
||||
al 00C82C .CorePathOnZero_C82C
|
||||
al 00C81E .CorePathLoop_C81E
|
||||
al 00C80F .CorePathLoop_C80F
|
||||
al 00C808 .CorePathOnZero_C808
|
||||
al 00F500 .ProcessResourceStateRoutine_F500
|
||||
al 00C816 .RunGameTaskRoutine_C816
|
||||
al 00C7DD .CorePathOnZero_C7DD
|
||||
al 00C79B .CorePathOnNegative_C79B
|
||||
al 00C78B .RunGameTaskDispatch_C78B
|
||||
al 00C77C .CorePathLoop_C77C
|
||||
al 00C77A .CorePathOnNonZero_C77A
|
||||
al 00C76A .CorePathOnZero_C76A
|
||||
al 00C7AD .RunGameTaskDispatch_C7AD
|
||||
al 00C772 .RunGameTaskDispatch_C772
|
||||
al 00C72E .CorePathContinue_C72E
|
||||
al 00C713 .UpdateGameStateOnZero_C713
|
||||
al 00C703 .CorePathOnNonZero_C703
|
||||
al 00C6E5 .CorePathOnNonZero_C6E5
|
||||
al 00C73D .CorePathOnZero_C73D
|
||||
al 00C73A .CorePathOnZero_C73A
|
||||
al 00C740 .CorePathOnZero_C740
|
||||
al 00C6BB .CorePathLoop_C6BB
|
||||
al 00C6B8 .CorePathLoop_C6B8
|
||||
al 00C6B5 .CorePathLoop_C6B5
|
||||
al 00D0A5 .ProcessObjectStateRoutine_D0A5
|
||||
al 00D083 .ProcessObjectStateRoutine_D083
|
||||
al 00C6A8 .CorePathOnNonZero_C6A8
|
||||
al 00C6A2 .CorePathOnNonZero_C6A2
|
||||
al 00C689 .CorePathLoop_C689
|
||||
al 00C67F .CorePathOnZero_C67F
|
||||
al 00C678 .CorePathLoop_C678
|
||||
al 00C7E8 .RunGameTaskDispatch_C7E8
|
||||
al 00C66B .CorePathLoop_C66B
|
||||
al 00C667 .CorePathOnNegative_C667
|
||||
al 00C66A .CorePathLoop_C66A
|
||||
al 00C670 .CorePathOnZero_C670
|
||||
al 00C654 .CorePathLoop_C654
|
||||
al 00C682 .CorePathOnZero_C682
|
||||
al 00D44A .ProcessObjectStateRoutine_D44A
|
||||
al 00C62D .RunGameTaskDispatch_C62D
|
||||
al 00C621 .RunGameTaskDispatch_C621
|
||||
al 00C80B .RunGameTaskDispatch_C80B
|
||||
al 00C824 .RunGameTaskRoutine_C824
|
||||
al 00C830 .RunGameTaskRoutine_C830
|
||||
al 00C60E .CorePathOnZero_C60E
|
||||
al 00C601 .CorePathLoop_C601
|
||||
al 00C61E .CorePathOnZero_C61E
|
||||
al 00C5FF .CorePathOnNonZero_C5FF
|
||||
al 00C5F7 .RunGameTaskDispatch_C5F7
|
||||
al 00C5F2 .RunGameTaskDispatch_C5F2
|
||||
al 00C5EC .UpdatePlayerStateDispatch_C5EC
|
||||
al 00C81A .RunGameTaskRoutine_C81A
|
||||
al 00C5E4 .CorePathOnNonZero_C5E4
|
||||
al 00C5CB .CorePathLoop_C5CB
|
||||
al 00C5C8 .CorePathLoop_C5C8
|
||||
al 00C7E5 .RunGameTaskDispatch_C7E5
|
||||
al 00F408 .ProcessResourceStateRoutine_F408
|
||||
al 00C5A5 .CorePathOnZero_C5A5
|
||||
al 00C594 .UpdatePlayerStateLoop_C594
|
||||
al 00C590 .CorePathOnNonZero_C590
|
||||
al 00C5C5 .CorePathContinue_C5C5
|
||||
al 00C584 .CorePathLoop_C584
|
||||
al 00C7EA .RunGameTaskDispatch_C7EA
|
||||
al 00C809 .RunGameTaskRoutine_C809
|
||||
al 00C7EF .RunGameTaskRoutine_C7EF
|
||||
al 00F40C .ProcessResourceStateRoutine_F40C
|
||||
al 00F3A1 .UpdateCommandBufferRoutine_F3A1
|
||||
al 00C56B .CorePathOnZero_C56B
|
||||
al 00C547 .UpdatePlayerStateLoop_C547
|
||||
al 00C581 .CorePathOnNonZero_C581
|
||||
al 00C53B .RunGameTaskDispatch_C53B
|
||||
al 00C51A .CorePathOnNonZero_C51A
|
||||
al 00F31A .ProcessResourceStateRoutine_F31A
|
||||
al 00C7F3 .RunGameTaskRoutine_C7F3
|
||||
al 00C4EB .CorePathLoop_C4EB
|
||||
al 00C4E1 .CorePathOnNonZero_C4E1
|
||||
al 00C4D1 .CorePathLoop_C4D1
|
||||
al 00C4C3 .CorePathLoop_C4C3
|
||||
al 00C4BF .CorePathOnZero_C4BF
|
||||
al 00DD48 .ProcessObjectStateDispatch_DD48
|
||||
al 00F77D .ProcessResourceStateRoutine_F77D
|
||||
al 00C4A9 .CorePathOnNonZero_C4A9
|
||||
al 00C4A3 .UpdatePlayerStateOnNonZero_C4A3
|
||||
al 00C4B3 .CorePathLoop_C4B3
|
||||
al 00D1CE .ProcessObjectStateRoutine_D1CE
|
||||
al 00DA26 .ProcessObjectStateRoutine_DA26
|
||||
al 00C504 .UpdatePlayerStateRoutine_C504
|
||||
al 00C46E .CorePathLoop_C46E
|
||||
al 00C467 .CorePathLoop_C467
|
||||
al 00C463 .RunGameTaskRoutine_C463
|
||||
al 00C45A .CorePathOnZero_C45A
|
||||
al 00C475 .CorePathOnCarry_C475
|
||||
al 00C43A .UpdatePlayerStateLoop_C43A
|
||||
al 00C438 .CorePathLoop_C438
|
||||
al 00D1AE .UpdateObjectBufferRoutine_D1AE
|
||||
al 00C432 .CorePathLoop_C432
|
||||
al 00C437 .CorePathOnNonZero_C437
|
||||
al 00C421 .CorePathLoop_C421
|
||||
al 00C41C .CorePathContinue_C41C
|
||||
al 00C402 .UpdateGameStateRoutine_C402
|
||||
al 00C3EE .CorePathOnNonZero_C3EE
|
||||
al 00C6BE .RunGameTaskRoutine_C6BE
|
||||
al 00C3DF .CorePathContinue_C3DF
|
||||
al 00C400 .CorePathOnZero_C400
|
||||
al 00C3BC .UpdateGameStateRoutine_C3BC
|
||||
al 00C3E0 .CorePathOnZero_C3E0
|
||||
al 00C3CC .CorePathLoop_C3CC
|
||||
al 00C3A3 .CorePathOnNonZero_C3A3
|
||||
al 00C3A9 .UpdateGameStateContinue_C3A9
|
||||
al 00C387 .CorePathOnNonZero_C387
|
||||
al 00C38D .CorePathOnZero_C38D
|
||||
al 00F577 .ProcessResourceStateRoutine_F577
|
||||
al 00C373 .UpdateGameStateOnNonZero_C373
|
||||
al 00C3CD .CorePathOnNonZero_C3CD
|
||||
al 00C359 .UpdateGameStateOnNonZero_C359
|
||||
al 00C342 .UpdatePlayerStateLoop_C342
|
||||
al 00C33A .CorePathLoop_C33A
|
||||
al 00C365 .CorePathContinue_C365
|
||||
al 00C31C .CorePathOnZero_C31C
|
||||
al 00C310 .UpdatePlayerStateContinue_C310
|
||||
al 00C2F8 .CorePathLoop_C2F8
|
||||
al 00C2F1 .UpdateGameStateDispatch_C2F1
|
||||
al 00C2DD .UpdateGameStateOnNonZero_C2DD
|
||||
al 00C2D4 .InitializePlayerAndGameState
|
||||
al 00C2CA .CorePathLoop_C2CA
|
||||
al 00C84B .RunGameTaskRoutine_C84B
|
||||
al 00C2C3 .CorePathLoop_C2C3
|
||||
al 00D209 .ObjectPath_D209
|
||||
al 00C47A .UpdateGameStateRoutine_C47A
|
||||
al 00D0F6 .UpdateObjectBuffer_D0F6
|
||||
al 00DD8F .UpdateObjectBuffer_DD8F
|
||||
al 00D1D6 .ObjectPath_D1D6
|
||||
al 00D0DF .ObjectPath_D0DF
|
||||
al 00DBC7 .UpdateObjectBuffer_DBC7
|
||||
al 00DA91 .ObjectPath_DA91
|
||||
al 00E6F3 .ProcessObjectStateRoutine_E6F3
|
||||
al 00D0B1 .ObjectPath_D0B1
|
||||
al 00CFA1 .ObjectPath_CFA1
|
||||
al 00D0C8 .UpdateObjectBuffer_D0C8
|
||||
al 00D97B .ObjectPath_D97B
|
||||
al 00D64F .UpdateObjectBuffer_D64F
|
||||
al 00D8BA .ObjectPath_D8BA
|
||||
al 00D856 .ObjectPath_D856
|
||||
al 00DB52 .UpdateObjectBuffer_DB52
|
||||
al 00DC5A .ObjectPath_DC5A
|
||||
al 00DD10 .ObjectPath_DD10
|
||||
al 00D08F .ObjectPath_D08F
|
||||
al 00C286 .CorePathContinue_C286
|
||||
al 00CBC6 .RunGameTaskRoutine_CBC6
|
||||
al 00D06D .ObjectPath_D06D
|
||||
al 00D11E .ReadObjectRecord_D11E
|
||||
al 00CD7B .ReadObjectRecord_CD7B
|
||||
al 00DADA .ReadObjectRecord_DADA
|
||||
al 00CBE3 .ProcessCurrentObjectRoutine_CBE3
|
||||
al 00D27D .UpdateObjectRecord_D27D
|
||||
al 00C264 .ProcessCurrentObjectContinue_C264
|
||||
al 00D34E .ObjectPath_D34E
|
||||
al 00CBB9 .RunGameTaskRoutine_CBB9
|
||||
al 00C245 .CoreGameCode
|
||||
al 00C234 .NMIReadPPUStatus_C234
|
||||
al 00C368 .RunGameTaskRoutine_C368
|
||||
al 00DDC1 .ObjectPath_DDC1
|
||||
al 00F5AE .EnginePath_F5AE
|
||||
al 00F7C1 .AudioDriverCode
|
||||
al 00E113 .ObjectPath_E113
|
||||
al 00F20B .ResourceAndLevelData
|
||||
al 00C996 .UpdateGameStateRoutine_C996
|
||||
al 00C1F1 .NMIHandler
|
||||
al 00F58D .EnginePath_F58D
|
||||
al 00C1EB .InterruptPathDispatch_C1EB
|
||||
al 00C3E4 .RunGameTaskRoutine_C3E4
|
||||
al 00CBA6 .RunGameTaskRoutine_CBA6
|
||||
al 00C1B8 .InterruptPathLoop_C1B8
|
||||
al 00C1B6 .InterruptPathOnZero_C1B6
|
||||
al 00C1B4 .InterruptPathOnNonZero_C1B4
|
||||
al 00C1A2 .InterruptPathLoop_C1A2
|
||||
al 00C196 .ResetEntry
|
||||
al 00C0E9 .StartupObjectTemplateData_C0E9
|
||||
al 00C0B4 .DirectionAndCoordinateTables_C0B4
|
||||
al 00C058 .ResourceDescriptorData_C058
|
||||
al 00C044 .TitleOrMessageTileString
|
||||
al 00C008 .ResourceScriptPointerTable
|
||||
al 00C000 .DeveloperCreditText
|
||||
@@ -0,0 +1,32 @@
|
||||
Modules list:
|
||||
-------------
|
||||
header.o:
|
||||
HEADER Offs=000000 Size=000010 Align=00001 Fill=0000
|
||||
prg.o:
|
||||
PRG Offs=000000 Size=004000 Align=00001 Fill=0000
|
||||
chr.o:
|
||||
CHR Offs=000000 Size=002000 Align=00001 Fill=0000
|
||||
|
||||
|
||||
Segment list:
|
||||
-------------
|
||||
Name Start End Size Align
|
||||
----------------------------------------------------
|
||||
CHR 000000 001FFF 002000 00001
|
||||
HEADER 000000 00000F 000010 00001
|
||||
PRG 00C000 00FFFF 004000 00001
|
||||
|
||||
|
||||
Exports list by name:
|
||||
---------------------
|
||||
|
||||
|
||||
|
||||
Exports list by value:
|
||||
----------------------
|
||||
|
||||
|
||||
|
||||
Imports list:
|
||||
-------------
|
||||
|
||||
Binary file not shown.
Binary file not shown.
+1
@@ -0,0 +1 @@
|
||||
../rom.nes
|
||||
@@ -0,0 +1,35 @@
|
||||
;------------------------------------------------------------
|
||||
; NES hardware registers
|
||||
;------------------------------------------------------------
|
||||
|
||||
PPUCTRL = $2000
|
||||
PPUMASK = $2001
|
||||
PPUSTATUS = $2002
|
||||
OAMADDR = $2003
|
||||
OAMDATA = $2004
|
||||
PPUSCROLL = $2005
|
||||
PPUADDR = $2006
|
||||
PPUDATA = $2007
|
||||
|
||||
SQ1_VOL = $4000
|
||||
SQ1_SWEEP = $4001
|
||||
SQ1_LO = $4002
|
||||
SQ1_HI = $4003
|
||||
|
||||
SQ2_VOL = $4004
|
||||
SQ2_SWEEP = $4005
|
||||
SQ2_LO = $4006
|
||||
SQ2_HI = $4007
|
||||
|
||||
TRI_LINEAR = $4008
|
||||
TRI_LO = $400A
|
||||
TRI_HI = $400B
|
||||
|
||||
NOISE_VOL = $400C
|
||||
NOISE_LO = $400E
|
||||
NOISE_HI = $400F
|
||||
|
||||
OAMDMA = $4014
|
||||
APUSTATUS = $4015
|
||||
JOY1 = $4016
|
||||
JOY2 = $4017
|
||||
Binary file not shown.
Reference in new issue
Block a user