Pass 2 _wip: Slalom (U), Kung Fu (U), Othello (U) label replacement complete

Pass 3 _wip: Slalom (U), Kung Fu (U), Othello (U) semantic naming complete
Pass 3 _wip: apply symbols (0 residue) for Slalom (U), Kung Fu (U), Othello (U)
Pass 2/3 _wip: 10 NROM projects (Elevator Action, 1942, Tag Team Wrestling, Galaga, Kung Fu a1, Stack-Up, Magmax, Ms Pac-Man Namco, Soccer, Sqoon)
Promote 13 _wip/NROM projects to NROM/ (Slalom, Kung Fu, Othello, Elevator Action, 1942, Tag Team Wrestling, Galaga, Kung Fu a1, Stack-Up, Magmax, Ms Pac-Man Namco, Soccer, Sqoon)
Pass 2/3 _wip: 5 CNROM games (Tiger-Heli, Paperboy, Last Starfighter, Mighty Bomb Jack, Kung-Fu Heroes)
Docs: document CDL capture + re-trace workflow in TODO.md
Adds more code for
 - Elevator Action (U)
 - Kung Fu (U)
 - Othello (U)
 - Slalom (U)
 - Sqoon (U)
This commit is contained in:
tmerritt committed 2026-10-21 14:42:00 -04:00
1 parent f8d62601e5
commit 0a49ee6da7
228 files changed
+101961 -37231

No files matched your search

Binary file not shown.
+25
View File
@@ -0,0 +1,25 @@
CA65 ?= ca65
LD65 ?= ld65
all: reconstructed.nes verify
prg.o: prg.s symbols.inc locals.inc prg.bin
$(CA65) -g -o $@ $<
header.o: header.s header.bin
$(CA65) -g -o $@ $<
chr.o: chr.s chr.bin
$(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 rom.nes
cmp reconstructed.nes rom.nes
@echo "Byte-identical ROM verified."
clean:
rm -f *.o reconstructed.nes reconstructed_prg.bin reconstructed.map reconstructed.lbl
.PHONY: all verify clean
+67
View File
@@ -0,0 +1,67 @@
# 1942 (JU)
## Status
**Pass 3.** All address-derived `Label_XXXX` definitions replaced;
every `jsr`/`jmp` operand symbolic; hardware-register operands resolved
via `apply_symbols.py` (0 residue); audit comments aligned; `make`
stays byte-identical.
`make` assembles `header.s`, `prg.s`, `chr.s`, links them with `ld65` and compares the
result against `rom.nes`:
```
Byte-identical ROM verified.
```
## ROM
| Property | Value |
|----------|-------|
| Format | iNES |
| Mapper | 64 |
| Board | NROM-256 |
| Mirroring | Horizontal |
| Four-screen VRAM | no |
| Battery | no |
| PRG | 32 KB (2 x 16 KB), mapped at CPU $8000-$FFFF |
| CHR | 8 KB (1 x 8 KB) |
| Trainer | none |
| Footer | none |
| NMI vector | $C030 |
| RESET vector | $BF90 |
| IRQ vector | $BF90 |
| ROM file | `1942 (JU).nes` |
| SHA-256 | `017ff3154d09531d068c26869158776e2e441509cf9bbef8042964ad39b77349` |
### Header notes
- header byte 7 is `$44`; its upper nybble selects mapper bits 4-7
## Open work
- **Pass 1** - run `nesdis.py` over `prg.bin` to produce the code/data
split. The tracer reads the vectors from the last six bytes of the PRG
image, so the split seeds correctly.
- **Pass 1** must emit the canonical audit comment
`; CPU:$C123 PRG:0123 AD 21 03` at column 35 for every instruction.
- **Pass 2** - replace the address-derived `Label_XXXX` names and the raw
`$XXXX` call operands.
- **Pass 3** - semantic zero-page aliases (applied only at the sites where
their role is proven) and named data tables.
- **Promotion** to `NROM/<name>/` once Pass 3 is done, as `git mv`.
## Files
| File | Purpose |
|------|---------|
| `prg.s` | Pass 0 PRG include (replaced by the Pass 1 disassembly) |
| `header.s` | iNES header include |
| `chr.s` | CHR include |
| `prg.bin` | 32768 bytes (32 KB) PRG image |
| `chr.bin` | 8192 bytes (8 KB) CHR image |
| `rom.nes` | byte-identical copy of the original ROM |
| `linker.cfg` | HEADER / PRG / CHR memory areas |
| `symbols.inc` | NES hardware register names |
| `locals.inc` | zero-page aliases (empty at Pass 0) |
| `Makefile` | build and byte-identity check |
Binary file not shown.
+2
View File
@@ -0,0 +1,2 @@
.segment "CHR"
.incbin "chr.bin"
Binary file not shown.
+2
View File
@@ -0,0 +1,2 @@
.segment "HEADER"
.incbin "header.bin"
+95
View File
@@ -0,0 +1,95 @@
BF90 Reset
C030 NmiHandler
# ---- derived internal branch-target names ----
801B Sub_801B
8038 Sub_OnNonzero
9FDB Sub_9FDB
A001 Sub_OnNonzero2
A00E Sub_OnNonzero3
A029 Sub_OnNonzero4
A03C Sub_OnNonnegative
A046 Sub_OnNonnegative2
A050 Sub_A050
A054 Sub_OnNonnegative3
A0D0 Sub_A0D0
A0EA Sub_A0EA
A107 Sub_OnNonzero5
A113 Sub_OnZero
A11D Sub_Loop
A126 Sub_OnNonnegative4
A132 Sub_OnNonzero6
A140 Sub_OnNonzero7
A145 Sub_OnCarryClear
A14D Sub_Loop2
A154 Sub_Loop3
A18C Sub_A18C
A1A4 Sub_OnZero2
A1BD Sub_Loop4
A1C2 Sub_Loop5
A1CB Sub_Loop6
A1EA Sub_Loop7
A208 Sub_OnNonzero8
A219 Sub_Loop8
A21F Sub_A21F
A227 Sub_Loop9
A22F Sub_Loop10
A237 Sub_Loop11
A240 Sub_Loop12
A24C Sub_Loop13
A25B Sub_A25B
A265 Sub_Loop14
A275 Sub_Loop15
A280 Sub_Loop16
A298 Sub_OnNonzero9
A29F Sub_Loop17
A2B0 Sub_A2B0
A2BF Sub_Loop18
A2CC Sub_Loop19
A2E0 Sub_Loop20
A2E1 Sub_A2E1
A36A Sub_A36A
A38F Sub_A38F
B93D Sub_B93D
B94F Sub_OnNonzero10
B957 Sub_OnNonzero11
B96C Sub_B96C
B980 Sub_OnNonzero12
B9AC Sub_OnNonzero13
BF90 Reset
BF9A Reset_OnNonnegative
BFAD Reset_Loop
BFB7 Reset_OnNonzero
BFCA Reset_Loop2
BFCE Reset_OnNonzero2
BFFB Reset_OnNonzero3
C030 NmiHandler
C057 Sub_C057
C071 NmiHandler_OnNonzero
C07E NmiHandler_Loop
C081 NmiHandler_Loop2
C092 NmiHandler_OnNonzero2
C0BA NmiHandler_Loop3
C0C0 NmiHandler_Loop4
C10C NmiHandler_OnNonzero3
C129 NmiHandler_Loop5
C156 NmiHandler_OnNonzero4
C164 NmiHandler_Loop6
C166 NmiHandler_OnNonzero5
C171 NmiHandler_Loop7
C173 NmiHandler_OnCarryClear
C189 NmiHandler_Loop8
C18D NmiHandler_OnNonnegative
C195 NmiHandler_OnCarryClear2
C19D Sub_C19D
C1AD Sub_C1AD
C1C7 Sub_C1C7
C1C9 NmiHandler_OnNonzero6
C1F4 NmiHandler_Loop9
C1F5 Sub_C1F5
C230 NmiHandler_Loop10
C2C0 Sub_C2C0
C2CF NmiHandler_OnNonzero7
C2D8 NmiHandler_Loop11
C2E8 NmiHandler_OnCarryClear3
C2F5 NmiHandler_Loop12
1 BF90 Reset
2 C030 NmiHandler
3 # ---- derived internal branch-target names ----
4 801B Sub_801B
5 8038 Sub_OnNonzero
6 9FDB Sub_9FDB
7 A001 Sub_OnNonzero2
8 A00E Sub_OnNonzero3
9 A029 Sub_OnNonzero4
10 A03C Sub_OnNonnegative
11 A046 Sub_OnNonnegative2
12 A050 Sub_A050
13 A054 Sub_OnNonnegative3
14 A0D0 Sub_A0D0
15 A0EA Sub_A0EA
16 A107 Sub_OnNonzero5
17 A113 Sub_OnZero
18 A11D Sub_Loop
19 A126 Sub_OnNonnegative4
20 A132 Sub_OnNonzero6
21 A140 Sub_OnNonzero7
22 A145 Sub_OnCarryClear
23 A14D Sub_Loop2
24 A154 Sub_Loop3
25 A18C Sub_A18C
26 A1A4 Sub_OnZero2
27 A1BD Sub_Loop4
28 A1C2 Sub_Loop5
29 A1CB Sub_Loop6
30 A1EA Sub_Loop7
31 A208 Sub_OnNonzero8
32 A219 Sub_Loop8
33 A21F Sub_A21F
34 A227 Sub_Loop9
35 A22F Sub_Loop10
36 A237 Sub_Loop11
37 A240 Sub_Loop12
38 A24C Sub_Loop13
39 A25B Sub_A25B
40 A265 Sub_Loop14
41 A275 Sub_Loop15
42 A280 Sub_Loop16
43 A298 Sub_OnNonzero9
44 A29F Sub_Loop17
45 A2B0 Sub_A2B0
46 A2BF Sub_Loop18
47 A2CC Sub_Loop19
48 A2E0 Sub_Loop20
49 A2E1 Sub_A2E1
50 A36A Sub_A36A
51 A38F Sub_A38F
52 B93D Sub_B93D
53 B94F Sub_OnNonzero10
54 B957 Sub_OnNonzero11
55 B96C Sub_B96C
56 B980 Sub_OnNonzero12
57 B9AC Sub_OnNonzero13
58 BF90 Reset
59 BF9A Reset_OnNonnegative
60 BFAD Reset_Loop
61 BFB7 Reset_OnNonzero
62 BFCA Reset_Loop2
63 BFCE Reset_OnNonzero2
64 BFFB Reset_OnNonzero3
65 C030 NmiHandler
66 C057 Sub_C057
67 C071 NmiHandler_OnNonzero
68 C07E NmiHandler_Loop
69 C081 NmiHandler_Loop2
70 C092 NmiHandler_OnNonzero2
71 C0BA NmiHandler_Loop3
72 C0C0 NmiHandler_Loop4
73 C10C NmiHandler_OnNonzero3
74 C129 NmiHandler_Loop5
75 C156 NmiHandler_OnNonzero4
76 C164 NmiHandler_Loop6
77 C166 NmiHandler_OnNonzero5
78 C171 NmiHandler_Loop7
79 C173 NmiHandler_OnCarryClear
80 C189 NmiHandler_Loop8
81 C18D NmiHandler_OnNonnegative
82 C195 NmiHandler_OnCarryClear2
83 C19D Sub_C19D
84 C1AD Sub_C1AD
85 C1C7 Sub_C1C7
86 C1C9 NmiHandler_OnNonzero6
87 C1F4 NmiHandler_Loop9
88 C1F5 Sub_C1F5
89 C230 NmiHandler_Loop10
90 C2C0 Sub_C2C0
91 C2CF NmiHandler_OnNonzero7
92 C2D8 NmiHandler_Loop11
93 C2E8 NmiHandler_OnCarryClear3
94 C2F5 NmiHandler_Loop12
+10
View File
@@ -0,0 +1,10 @@
MEMORY {
HEADER: start = $0000, size = $0010, fill = yes;
PRG: start = $8000, size = $8000, fill = yes;
CHR: start = $0000, size = $2000, fill = yes;
}
SEGMENTS {
HEADER: load = HEADER, type = ro;
PRG: load = PRG, type = ro;
CHR: load = CHR, type = ro;
}
+58
View File
@@ -0,0 +1,58 @@
; 1942 (JU) application-specific RAM aliases - Pass 1
; Generated from every direct zero-page operand in reachable code:
; ref counts are reads/writes, `where` lists the referencing addresses.
; ZpXX names indicate storage with a role not yet unique enough for a behavioral name;
; Pass 2 replaces them with names derived from observed usage.
Zp00 = $00 ; 6 refs; reads=3 writes=3; used at $BFCE, C2C0, C2C9, C2DA, +2 more
Zp02 = $02 ; 7 refs; reads=5 writes=2; used at $C110, C123, C127, C1FF, +3 more
Zp03 = $03 ; 2 refs; reads=1 writes=1; used at $C22E, C2F7
Zp22 = $22 ; 2 refs; reads=1 writes=1; used at $C115, C119
Zp23 = $23 ; 2 refs; reads=1 writes=1; used at $C11B, C11F
Zp42 = $42 ; 1 refs; reads=1 writes=0; used at $C300
Zp43 = $43 ; 1 refs; reads=1 writes=0; used at $C2FD
Zp62 = $62 ; 4 refs; reads=2 writes=2; used at $C106, C2E8, C2F0
Zp63 = $63 ; 2 refs; reads=1 writes=1; used at $C030, C1AA
Zp64 = $64 ; 2 refs; reads=1 writes=1; used at $C032, C1A8
Zp65 = $65 ; 2 refs; reads=1 writes=1; used at $C034, C1A6
Zp66 = $66 ; 2 refs; reads=1 writes=1; used at $C1F7, C1FD
Zp6F = $6F ; 2 refs; reads=1 writes=1; used at $A174, A17E
Zp70 = $70 ; 2 refs; reads=1 writes=1; used at $A17A, A184
Zp72 = $72 ; 4 refs; reads=2 writes=2; used at $A105, A113, A120
Zp73 = $73 ; 8 refs; reads=4 writes=4; used at $A1A2, A1AA, A1B0, A1BD, +2 more
Zp74 = $74 ; 13 refs; reads=8 writes=5; used at $A122, A13E, A154, A159, +7 more
Zp75 = $75 ; 3 refs; reads=1 writes=2; used at $9FDD, A001, A239
Zp76 = $76 ; 1 refs; reads=0 writes=1; used at $9FE1
Zp77 = $77 ; 27 refs; reads=10 writes=17; used at $9FE5, A010, A169, A1D7, +23 more
Zp78 = $78 ; 1 refs; reads=0 writes=1; used at $9FE9
Zp79 = $79 ; 3 refs; reads=2 writes=1; used at $9FEE, A393, A3A4
Zp7A = $7A ; 1 refs; reads=0 writes=1; used at $9FF3
Zp7B = $7B ; 5 refs; reads=1 writes=4; used at $9FF7, A202, A20C, A20E
Zp7C = $7C ; 1 refs; reads=0 writes=1; used at $9FFB
Zp7D = $7D ; 4 refs; reads=1 writes=3; used at $A0ED, A10F, A18E
Zp7E = $7E ; 4 refs; reads=1 writes=3; used at $A0F2, A10D, A190
Zp7F = $7F ; 4 refs; reads=1 writes=3; used at $A0F7, A10B, A192
Zp80 = $80 ; 4 refs; reads=1 writes=3; used at $A0FC, A109, A194
Zp81 = $81 ; 9 refs; reads=5 writes=4; used at $A101, A107, A21B, A237, +4 more
Zp82 = $82 ; 23 refs; reads=18 writes=5; used at $A162, A17C, A196, A1CF, +19 more
Zp83 = $83 ; 12 refs; reads=5 writes=7; used at $A19C, A1E5, A1EE, A1F4, +7 more
Zp84 = $84 ; 8 refs; reads=3 writes=5; used at $A198, A290, A29A, A2AD, +3 more
Zp86 = $86 ; 6 refs; reads=2 writes=4; used at $B97E, B994, B9AA, B9C0
Zp87 = $87 ; 10 refs; reads=3 writes=7; used at $803E, A00C, A017, A025, +3 more
Zp88 = $88 ; 14 refs; reads=4 writes=10; used at $8031, A01D, A02B, B972, +10 more
Zp89 = $89 ; 9 refs; reads=3 writes=6; used at $802C, A021, B96E, B98E, +5 more
Zp8A = $8A ; 10 refs; reads=1 writes=9; used at $8038, A0D2, A0DC, A0DF, +6 more
Zp8B = $8B ; 6 refs; reads=1 writes=5; used at $A0D6, B976, B9A2, BFAF, +1 more
Zp8C = $8C ; 16 refs; reads=8 writes=8; used at $801B, 801F, 8042, 8046, +12 more
Zp8D = $8D ; 2 refs; reads=1 writes=1; used at $BFDA, C0F4
Zp8F = $8F ; 1 refs; reads=0 writes=1; used at $BFEA
Zp90 = $90 ; 2 refs; reads=1 writes=1; used at $BFEF, C0EA
Zp94 = $94 ; 4 refs; reads=1 writes=3; used at $C1B7, C1C1, C1C9, C1D4
Zp95 = $95 ; 8 refs; reads=4 writes=4; used at $C1CE, C1D1, C1DA, C1DC, +3 more
Zp98 = $98 ; 2 refs; reads=1 writes=1; used at $C1E0, C1E4
Zp99 = $99 ; 2 refs; reads=0 writes=2; used at $C1E6, C1F2
ZpCF = $CF ; 1 refs; reads=0 writes=1; used at $C055
ZpD0 = $D0 ; 4 refs; reads=2 writes=2; used at $C010, C08B, C0A4, C0AB
ZpD1 = $D1 ; 4 refs; reads=2 writes=2; used at $C014, C086, C0AD, C0C0
ZpD2 = $D2 ; 4 refs; reads=2 writes=2; used at $C008, C092, C09B, C0A2
ZpD3 = $D3 ; 1 refs; reads=0 writes=1; used at $C00C
Binary file not shown.
+3682
View File
File diff suppressed because it is too large. Load diff
Binary file not shown.
+3
View File
@@ -0,0 +1,3 @@
# routinemap (seed)
BF90 Reset
C030 NmiHandler
1 # routinemap (seed)
2 BF90 Reset
3 C030 NmiHandler
+108
View File
@@ -0,0 +1,108 @@
; =============================================================================
; Nintendo Entertainment System hardware symbols
; =============================================================================
; -----------------------------------------------------------------------------
; PPU registers
; -----------------------------------------------------------------------------
PPUCTRL = $2000
PPUMASK = $2001
PPUSTATUS = $2002
OAMADDR = $2003
OAMDATA = $2004
PPUSCROLL = $2005
PPUADDR = $2006
PPUDATA = $2007
OAMDMA = $4014
; -----------------------------------------------------------------------------
; Controller ports
;
; $4016:
; Write: controller strobe
; Read: controller port 1
;
; $4017:
; Read: controller port 2
; Write: APU frame counter
; -----------------------------------------------------------------------------
JOY1 = $4016
JOY2 = $4017
; -----------------------------------------------------------------------------
; APU pulse channel 1
; -----------------------------------------------------------------------------
APUPULSE1CTRL = $4000
APUPULSE1SWEEP = $4001
APUPULSE1TIMERLO = $4002
APUPULSE1TIMERHI = $4003
; -----------------------------------------------------------------------------
; APU pulse channel 2
; -----------------------------------------------------------------------------
APUPULSE2CTRL = $4004
APUPULSE2SWEEP = $4005
APUPULSE2TIMERLO = $4006
APUPULSE2TIMERHI = $4007
; -----------------------------------------------------------------------------
; APU triangle channel
; -----------------------------------------------------------------------------
APUTRIANGLECTRL = $4008
APUTRIANGLETIMERLO = $400A
APUTRIANGLETIMERHI = $400B
; -----------------------------------------------------------------------------
; APU noise channel
; -----------------------------------------------------------------------------
APUNOISECTRL = $400C
APUNOISEPERIOD = $400E
APUNOISELENGTH = $400F
; -----------------------------------------------------------------------------
; APU DMC channel
; -----------------------------------------------------------------------------
APUDMCCTRL = $4010
APUDMCDIRECT = $4011
APUDMCADDR = $4012
APUDMCLENGTH = $4013
; -----------------------------------------------------------------------------
; APU status and frame counter
;
; $4015:
; Write: enable or disable the five APU channels
; Read: channel and interrupt status
;
; $4017:
; Write: APU frame-counter mode and IRQ inhibit
; Read: controller port 2
; -----------------------------------------------------------------------------
APUSTATUS = $4015
APUFRAMECOUNTER = $4017
; -----------------------------------------------------------------------------
; Controller masks
; -----------------------------------------------------------------------------
PAD_RIGHT = $01
PAD_LEFT = $02
PAD_DOWN = $04
PAD_UP = $08
PAD_START = $10
PAD_SELECT = $20
PAD_B = $40
PAD_A = $80
PAD_HORIZONTAL = PAD_LEFT | PAD_RIGHT
PAD_VERTICAL = PAD_UP | PAD_DOWN
PAD_DPAD = PAD_HORIZONTAL | PAD_VERTICAL