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:
1 parent
f8d62601e5
commit
0a49ee6da7
228 files changed
+101961
-37231
No files matched your search
Binary file not shown.
@@ -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
|
||||
@@ -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.
@@ -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,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
|
||||
|
@@ -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;
|
||||
}
|
||||
@@ -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.
File diff suppressed because it is too large.
Load diff
Binary file not shown.
@@ -0,0 +1,3 @@
|
||||
# routinemap (seed)
|
||||
BF90 Reset
|
||||
C030 NmiHandler
|
||||
|
@@ -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
|
||||
Reference in new issue
Block a user