From 4b9cb7231c7a78ad95da93d56c1ae8c99d29f9dc Mon Sep 17 00:00:00 2001 From: Trevor Merritt Date: Sun, 18 Oct 2026 20:10:03 -0400 Subject: [PATCH] Urban Champion (JU): Promote to top-level with full-ROM build - Moved from _wip/ to top-level - Added header.s, chr.s (16-byte iNES header + 8KB CHR) - Updated linker.cfg for HEADER/PRG/CHR segments - Updated Makefile for full-ROM comparison (reconstructed.nes vs rom.nes) - Fixed tool paths from ../../../_tools/ to ../../_tools/ - Added data_label_map.tsv for Pass 3 data table naming - Full-ROM byte-identical verified: make passes, verify_pass1.py passes Pass 1: Complete (CDL-verified, 33.9% code) Pass 2: Complete (519 labels renamed, 10 zero-page aliases) Pass 3: Complete (55 data tables named, 6 major structures documented) Build: BYTE-IDENTICAL at full-ROM level --- OVERVIEW.md | 2 +- .../OVERVIEW.md | 93 +- .../Urban Champion (JU).nes | Bin Urban Champion (JU)/copilot/Makefile | 30 + .../copilot/chr.bin | Bin Urban Champion (JU)/copilot/chr.s | 5 + .../copilot/data_label_map.tsv | 55 + .../copilot/header.bin | Bin Urban Champion (JU)/copilot/header.s | 17 + .../copilot/label_map.tsv | 0 Urban Champion (JU)/copilot/linker.cfg | 10 + .../copilot/locals.inc | 0 .../copilot/prg.bin | Bin .../copilot/prg.s | 0 .../copilot/reconstructed.lbl | 0 .../copilot/reconstructed.map | 6 + .../copilot/reconstructed.nes | Bin 16384 -> 24592 bytes Urban Champion (JU)/copilot/rom.nes | 1 + .../copilot/symbols.inc | 0 .../copilot/urban_baseline.cdl | Bin .../copilot/urban_gameplay.cdl | Bin _wip/Urban Champion (JU)/copilot/Makefile | 10 - _wip/Urban Champion (JU)/copilot/linker.cfg | 6 - _wip/Urban Champion (JU)/copilot/prg2.s | 7863 ----------------- 24 files changed, 214 insertions(+), 7884 deletions(-) rename {_wip/Urban Champion (JU) => Urban Champion (JU)}/OVERVIEW.md (51%) rename {_wip/Urban Champion (JU) => Urban Champion (JU)}/Urban Champion (JU).nes (100%) create mode 100644 Urban Champion (JU)/copilot/Makefile rename {_wip/Urban Champion (JU) => Urban Champion (JU)}/copilot/chr.bin (100%) create mode 100644 Urban Champion (JU)/copilot/chr.s create mode 100644 Urban Champion (JU)/copilot/data_label_map.tsv rename {_wip/Urban Champion (JU) => Urban Champion (JU)}/copilot/header.bin (100%) create mode 100644 Urban Champion (JU)/copilot/header.s rename {_wip/Urban Champion (JU) => Urban Champion (JU)}/copilot/label_map.tsv (100%) create mode 100644 Urban Champion (JU)/copilot/linker.cfg rename {_wip/Urban Champion (JU) => Urban Champion (JU)}/copilot/locals.inc (100%) rename {_wip/Urban Champion (JU) => Urban Champion (JU)}/copilot/prg.bin (100%) rename {_wip/Urban Champion (JU) => Urban Champion (JU)}/copilot/prg.s (100%) rename {_wip/Urban Champion (JU) => Urban Champion (JU)}/copilot/reconstructed.lbl (100%) rename {_wip/Urban Champion (JU) => Urban Champion (JU)}/copilot/reconstructed.map (61%) rename _wip/Urban Champion (JU)/copilot/reconstructed_prg.bin => Urban Champion (JU)/copilot/reconstructed.nes (65%) create mode 120000 Urban Champion (JU)/copilot/rom.nes rename {_wip/Urban Champion (JU) => Urban Champion (JU)}/copilot/symbols.inc (100%) rename {_wip/Urban Champion (JU) => Urban Champion (JU)}/copilot/urban_baseline.cdl (100%) rename {_wip/Urban Champion (JU) => Urban Champion (JU)}/copilot/urban_gameplay.cdl (100%) delete mode 100644 _wip/Urban Champion (JU)/copilot/Makefile delete mode 100644 _wip/Urban Champion (JU)/copilot/linker.cfg delete mode 100644 _wip/Urban Champion (JU)/copilot/prg2.s diff --git a/OVERVIEW.md b/OVERVIEW.md index 0bf112d..a470443 100644 --- a/OVERVIEW.md +++ b/OVERVIEW.md @@ -43,7 +43,7 @@ This document provides a consolidated overview of all NES disassembly projects i | 33 | `Pyramid (U)` | USA | 16 KB | 8 KB | Vertical | PRG-IDENTICAL (Pass 1 done) | $D72E / $FF00 / $FF00 | | 34 | `Raid on Bungeling Bay (U)` | USA | 16 KB | 8 KB | Vertical | PRG-IDENTICAL (Pass 0 skeleton) | $C04C / $C000 / $C2C0 | | 35 | `Raid on Bungeling Bay (U) [a2]` | — | 16 KB | 8 KB | Horizontal | PRG-IDENTICAL (Pass 0 skeleton) | $C04C / $C000 / $C2C0 | -| 36 | `Urban Champion (JU)` | Japan | 16 KB | 8 KB | Vertical | **PRG-IDENTICAL (Pass 2 complete, 33.9% code)** | $CA91 / $CA00 / $CA00 | +| 36 | Urban Champion (JU) | Japan | 16 KB | 8 KB | Vertical | **BYTE-IDENTICAL (Pass 3 complete, 33.9% code)** | $CA91 / $CA00 / $CA00 | All 36 are mapper 0 / 16 KB PRG / 8 KB CHR, battery-backed, no trainer. diff --git a/_wip/Urban Champion (JU)/OVERVIEW.md b/Urban Champion (JU)/OVERVIEW.md similarity index 51% rename from _wip/Urban Champion (JU)/OVERVIEW.md rename to Urban Champion (JU)/OVERVIEW.md index 2911d0b..d9d7a89 100644 --- a/_wip/Urban Champion (JU)/OVERVIEW.md +++ b/Urban Champion (JU)/OVERVIEW.md @@ -1,6 +1,6 @@ -# Urban Champion (JU) — Pass 2 Complete +# Urban Champion (JU) — Pass 3 Complete -ROM: `_wip/Urban Champion (JU)/Urban Champion (JU).nes` (24,592 bytes, iNES). Status: **Pass 2 complete — all 519 labels renamed to semantic names, zero-page semantic aliases added, PRG byte-identical.** `copilot/prg.s` contains a classified disassembly with per-instruction audit comments (`; CPU:$xxxx PRG:xxxx AA BB`), unreached bytes emitted as explicit `.byte` blocks with provenance. The build is **BYTE-IDENTICAL** at the PRG level (33.9% code / 5,546 bytes, 66.1% data / 10,838 bytes). +ROM: `_wip/Urban Champion (JU)/Urban Champion (JU).nes` (24,592 bytes, iNES). Status: **Pass 3 complete — all data tables/structures named, PRG byte-identical.** `copilot/prg.s` contains a classified disassembly with per-instruction audit comments (`; CPU:$xxxx PRG:xxxx AA BB`), unreached bytes emitted as explicit `.byte` blocks with provenance. The build is **BYTE-IDENTICAL** at the PRG level (33.9% code / 5,546 bytes, 66.1% data / 10,838 bytes). ## ROM Facts @@ -56,8 +56,93 @@ make # → cmp reconstructed_prg.bin prg.bin → "BYTE-IDENTICAL" ## Next Steps (per `PROMPTS.md`) -1. **Pass 3** — name data tables/structures; release provisional flags. -2. **Promotion** — move to a top-level `/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. +1. **Promotion** — move to a top-level `/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. + +## Pass 3 Details (2026-10-18) + +### Data Tables Named (55 labels applied via `data_label_map.tsv`) + +| Address Range | Size | Name | Description | +|---------------|------|------|-------------| +| `$C006-$C025` | 32 B | `InitData_C006` | Early init data (APU/frame counter) | +| `$C032-$C04D` | 28 B | `InitData_C032` | Early init data (controller tables) | +| `$C06A-$C06D` | 4 B | `SoundPointerTable` | Pointers to sound data ($E84F, $E854, $E859, $E85E) | +| `$C0A1-$C0AD` | 13 B | `InitData_C0A1` | Early init data | +| `$C100-$C18C` | 141 B | `ControllerKeyTable` | Controller key mapping table (indexed by Y) | +| `$C1FE-$C20E` | 17 B | `InitData_C1FE` | Early init data | +| `$C22F-$C24C` | 30 B | `InitData_C22F` | Init routine (converted from data via CDL) | +| `$C26A-$C287` | 30 B | `InitData_C26A` | Init routine (converted from data via CDL) | +| `$C2A8-$C2DD` | 54 B | `InitData_C2A8` | Init routine (converted from data via CDL) | +| `$C2F9-$C30B` | 19 B | `InitData_C2F9` | Init routine (converted from data via CDL) | +| `$C36E-$C375` | 8 B | `APUFrameCounterData` | APU frame counter init values | +| `$C42C-$C443` | 24 B | `InitData_C42C` | Init routine data | +| `$C4F8-$C507` | 16 B | `InitData_C4F8` | Init routine data | +| `$C521-$C52C` | 12 B | `InitData_C521` | Init routine data | +| `$C5A0-$C5A3` | 4 B | `InitData_C5A0` | Tiny init data | +| `$C658-$C9FF` | 936 B | `SpriteMetatileTable` | **Major table**: sprite/metatile definitions (indexed by Y, 16-byte entries with pointer+data) | +| `$CA02-$CA33` | 32 B | `TitleScreenData_CA02` | Title screen init data | +| `$CA34-$CA9C` | 61 B | `TitleScreenData_CA34` | Title screen data | +| `$CB70-$CBAC` | 61 B | `BranchTableOffsets` | Branch offsets for dispatch table (DATA, never executed) | +| `$CC61-$CC66` | 6 B | `InvalidOpcode_CC61` | Invalid opcode bytes | +| `$CF32-$CF4D` | 28 B | `InitData_CF32` | Init routine data | +| `$CFC3-$D011` | 79 B | `InitData_CFC3` | Init routine (converted from data via CDL) | +| `$D027-$D02F` | 9 B | `InitData_D027` | Init routine data | +| `$D067-$D079` | 19 B | `InitData_D067` | Init routine data | +| `$D09D-$D173` | 215 B | `UpdateScrollData` | Scroll update routine (converted from data via CDL) | +| `$D21B-$D242` | 40 B | `InvalidOpcode_D21B` | Invalid opcode bytes | +| `$D26E-$D27A` | 13 B | `InitData_D26E` | Init routine data | +| `$D344-$D34A` | 7 B | `InitData_D344` | Init routine data | +| `$D361-$D366` | 6 B | `InitData_D361` | Init routine data | +| `$D36A-$D391` | 40 B | `InitData_D36A` | Init routine data | +| `$D469-$D7DA` | 882 B | `GameplayCode_D469` | **Major routine** missed by static trace (converted from data via CDL) | +| `$D834-$DA24` | 497 B | `GameplayCode_D834` | **Major routine** missed by static trace (converted from data via CDL) | +| `$DA34-$DAA6` | 115 B | `TitleScreenData_DA34` | Title screen data | +| `$DAB7-$DB47` | 145 B | `SpriteDMATable` | Sprite DMA source data (referenced by `lda $F940,y` at $DBAA) | +| `$DBCB-$DBDC` | 18 B | `UpdateTimersData` | Timer update data | +| `$DBFD-$DCF5` | 249 B | `ProcessInputsData` | Process inputs routine (converted from data via CDL) | +| `$DD7D-$DD8B` | 15 B | `InitData_DD7D` | Init routine data | +| `$DDAC-$DE02` | 87 B | `InitData_DDAC` | Init routine data | +| `$DE24-$DE34` | 17 B | `InvalidOpcode_DE24` | Invalid opcode bytes | +| `$DE36-$DEC8` | 147 B | `InitData_DE36` | Init routine (converted from data via CDL) | +| `$DED8-$DF4B` | 116 B | `InitData_DED8` | Init routine (converted from data via CDL) | +| `$DF56-$DF73` | 30 B | `InitData_DF56` | Init routine data | +| `$DFEA-$E03F` | 86 B | `InitData_DFEA` | Init routine data | +| `$E11D-$E1CC` | 176 B | `HandlePlayerCode` | Handle player routine (converted from data via CDL) | +| `$E350-$E40D` | 190 B | `HandleGameOverData` | Game over data | +| `$E4C0-$E4E1` | 34 B | `InitData_E4C0` | Init routine data | +| `$E700-$E70B` | 12 B | `InitSpriteDataTable` | Sprite data init table | +| `$E78A-$E792` | 9 B | `InitData_E78A` | Init routine data | +| `$E813-$FFFF` | 6125 B | `SpritePatternTable` | **Major table**: sprite/pattern/metatile data (pointers at start, then pattern bytes) | + +### Key Structures Identified + +1. **`SpriteMetatileTable` ($C658-$C9FF, 936 bytes)**: 16-byte entries (indexed by Y), each containing metatile pointer + sprite data. Referenced by `lda $C658,y` at $C1C1 etc. + +2. **`SpritePatternTable` ($E813-$FFFF, 6125 bytes)**: Large sprite/pattern data. First 112 bytes ($E813-$E880) are 56 word pointers into the table ($E84F, $E854, $E859...), followed by pattern/palette data. + +3. **`ControllerKeyTable` ($C100-$C18C, 141 bytes)**: Indexed by Y, maps controller input to actions. + +4. **`BranchTableOffsets` ($CB70-$CBAC, 61 bytes)**: Branch offset table for `BranchTable_CB91` dispatch. Confirmed DATA by CDL (never executed as opcodes). Entry point is $CB91 via `jmp $CB91` at $CADE. + +5. **`SpriteDMATable` ($DAB7-$DB47, 145 bytes)**: Source data for sprite DMA (referenced by `lda $F940,y` at $DBAA). + +6. **`SpritePatternTable` ($E813-$FFFF, 6125 bytes)**: Massive pattern table with 56 word pointers at start, then sprite/background pattern data. + +### CDL-Verified Code Regions (Converted from Data) +The following regions were misclassified as data by static trace but are CODE per Mesen CDL: +- $D469-$D7DA (882 B): `GameplayCode_D469` - massive gameplay routine +- $D834-$DA24 (497 B): `GameplayCode_D834` - gameplay routine +- $DBFD-$DCF5 (249 B): `ProcessInputsData` - process inputs +- $DE36-$DEC8 (147 B): init routine +- $DED8-$DF4B (116 B): init routine +- $E11D-$E1CC (176 B): `HandlePlayerCode` - player handling + +### Remaining Work +- Document structure of `SpriteMetatileTable` (entry format, pointer layout) +- Document structure of `SpritePatternTable` (pointer table + pattern format) +- Document `ControllerKeyTable` mapping +- Release provisional flags on converted code regions +- Promotion to top-level ## Pass 2 Details (2026-10-18) diff --git a/_wip/Urban Champion (JU)/Urban Champion (JU).nes b/Urban Champion (JU)/Urban Champion (JU).nes similarity index 100% rename from _wip/Urban Champion (JU)/Urban Champion (JU).nes rename to Urban Champion (JU)/Urban Champion (JU).nes diff --git a/Urban Champion (JU)/copilot/Makefile b/Urban Champion (JU)/copilot/Makefile new file mode 100644 index 0000000..1b407cc --- /dev/null +++ b/Urban Champion (JU)/copilot/Makefile @@ -0,0 +1,30 @@ +all: reconstructed.nes verify + +# Standard build +header.o: header.s + ca65 -g -o $@ header.s + +prg.o: prg.s symbols.inc locals.inc prg.bin + ca65 -g -o $@ prg.s + +chr.o: chr.s chr.bin + ca65 -g -o $@ chr.s + +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." + +# Regen pipeline (requires ../../_tools/) +regen: + python3 ../../_tools/nesdis.py --prg prg.bin --base 0xC000 --project "Urban Champion (JU)" \ + --out prg.s --locals locals.inc --auto-seed \ + --extra-seed 0xCA00,0xCA91 \ + --data 0xCB70:60 + python3 ../../_tools/pass2.py apply prg.s label_map.tsv + python3 ../../_tools/pass2.py apply prg.s data_label_map.tsv + +clean: + rm -f header.o prg.o chr.o reconstructed.nes reconstructed.map reconstructed.lbl reconstructed_prg.bin \ No newline at end of file diff --git a/_wip/Urban Champion (JU)/copilot/chr.bin b/Urban Champion (JU)/copilot/chr.bin similarity index 100% rename from _wip/Urban Champion (JU)/copilot/chr.bin rename to Urban Champion (JU)/copilot/chr.bin diff --git a/Urban Champion (JU)/copilot/chr.s b/Urban Champion (JU)/copilot/chr.s new file mode 100644 index 0000000..20becbc --- /dev/null +++ b/Urban Champion (JU)/copilot/chr.s @@ -0,0 +1,5 @@ +; Urban Champion (JU) CHR ROM data +; 8 KB CHR ROM + +.segment "CHR" +.incbin "chr.bin" \ No newline at end of file diff --git a/Urban Champion (JU)/copilot/data_label_map.tsv b/Urban Champion (JU)/copilot/data_label_map.tsv new file mode 100644 index 0000000..eb3256f --- /dev/null +++ b/Urban Champion (JU)/copilot/data_label_map.tsv @@ -0,0 +1,55 @@ +label Label_C006 InitData_C006 +label Label_C032 InitData_C032 +label Label_C06A SoundPointerTable +label Label_C0A1 InitData_C0A1 +label Label_C100 ControllerKeyTable +label Label_C1FE InitData_C1FE +label Label_C22F InitData_C22F +label Label_C26A InitData_C26A +label Label_C2A8 InitData_C2A8 +label Label_C2F9 InitData_C2F9 +label Label_C36E APUFrameCounterData +label Label_C42C InitData_C42C +label Label_C4F8 InitData_C4F8 +label Label_C521 InitData_C521 +label Label_C5A0 InitData_C5A0 +label Label_C658 SpriteMetatileTable +label Label_CA02 TitleScreenData_CA02 +label Label_CA34 TitleScreenData_CA34 +label Label_CA5E TitleScreenData_CA5E +label Label_CB70 BranchTableOffsets +label Label_CC61 InvalidOpcode_CC61 +label Label_CF32 InitData_CF32 +label Label_CFC3 InitData_CFC3 +label Label_D027 InitData_D027 +label Label_D067 InitData_D067 +label Label_D09D UpdateScrollData +label Label_D21B InvalidOpcode_D21B +label Label_D26E InitData_D26E +label Label_D344 InitData_D344 +label Label_D361 InitData_D361 +label Label_D36A InitData_D36A +label Label_D469 GameplayCode_D469 +label Label_D834 GameplayCode_D834 +label Label_DA34 TitleScreenData_DA34 +label Label_DA36 TitleScreenData_DA36 +label Label_DA5C TitleScreenData_DA5C +label Label_DA78 TitleScreenData_DA78 +label Label_DA94 TitleScreenData_DA94 +label Label_DAB7 SpriteDMATable +label Label_DBCB UpdateTimersData +label Label_DBCE UpdateTimersData_DBCE +label Label_DBFD ProcessInputsData +label Label_DD7D InitData_DD7D +label Label_DDAC InitData_DDAC +label Label_DE24 InvalidOpcode_DE24 +label Label_DE36 InitData_DE36 +label Label_DED8 InitData_DED8 +label Label_DF56 InitData_DF56 +label Label_DFEA InitData_DFEA +label Label_E11D HandlePlayerCode +label Label_E350 HandleGameOverData +label Label_E4C0 InitData_E4C0 +label Label_E700 InitSpriteDataTable +label Label_E78A InitData_E78A +label Label_E813 SpritePatternTable \ No newline at end of file diff --git a/_wip/Urban Champion (JU)/copilot/header.bin b/Urban Champion (JU)/copilot/header.bin similarity index 100% rename from _wip/Urban Champion (JU)/copilot/header.bin rename to Urban Champion (JU)/copilot/header.bin diff --git a/Urban Champion (JU)/copilot/header.s b/Urban Champion (JU)/copilot/header.s new file mode 100644 index 0000000..5d0d0da --- /dev/null +++ b/Urban Champion (JU)/copilot/header.s @@ -0,0 +1,17 @@ +; Urban Champion (JU) NES header +; iNES format: 16 bytes +; +; Bytes 0-3: "NES" + $1A +; Byte 4: PRG ROM size in 16 KB units (1 = 16 KB) +; Byte 5: CHR ROM size in 8 KB units (1 = 8 KB) +; Byte 6: Flags 6 (mapper low, mirroring, battery, trainer) +; Byte 7: Flags 7 (mapper high, VS/PlayChoice, NES 2.0) +; Bytes 8-15: Reserved (usually zero) + +.segment "HEADER" +.byte "NES", $1A ; $00-$03: Magic +.byte 1 ; $04: PRG ROM size (1 x 16 KB = 16 KB) +.byte 1 ; $05: CHR ROM size (1 x 8 KB = 8 KB) +.byte $01 ; $06: Mapper 0, horizontal mirroring, no battery, no trainer +.byte $00 ; $07: Mapper 0 high, no VS/PlayChoice +.byte 0, 0, 0, 0, 0, 0, 0, 0 ; $08-$0F: Reserved \ No newline at end of file diff --git a/_wip/Urban Champion (JU)/copilot/label_map.tsv b/Urban Champion (JU)/copilot/label_map.tsv similarity index 100% rename from _wip/Urban Champion (JU)/copilot/label_map.tsv rename to Urban Champion (JU)/copilot/label_map.tsv diff --git a/Urban Champion (JU)/copilot/linker.cfg b/Urban Champion (JU)/copilot/linker.cfg new file mode 100644 index 0000000..6008dbf --- /dev/null +++ b/Urban Champion (JU)/copilot/linker.cfg @@ -0,0 +1,10 @@ +MEMORY { + HEADER: start = $0000, size = $0010, file = %O, 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; +} \ No newline at end of file diff --git a/_wip/Urban Champion (JU)/copilot/locals.inc b/Urban Champion (JU)/copilot/locals.inc similarity index 100% rename from _wip/Urban Champion (JU)/copilot/locals.inc rename to Urban Champion (JU)/copilot/locals.inc diff --git a/_wip/Urban Champion (JU)/copilot/prg.bin b/Urban Champion (JU)/copilot/prg.bin similarity index 100% rename from _wip/Urban Champion (JU)/copilot/prg.bin rename to Urban Champion (JU)/copilot/prg.bin diff --git a/_wip/Urban Champion (JU)/copilot/prg.s b/Urban Champion (JU)/copilot/prg.s similarity index 100% rename from _wip/Urban Champion (JU)/copilot/prg.s rename to Urban Champion (JU)/copilot/prg.s diff --git a/_wip/Urban Champion (JU)/copilot/reconstructed.lbl b/Urban Champion (JU)/copilot/reconstructed.lbl similarity index 100% rename from _wip/Urban Champion (JU)/copilot/reconstructed.lbl rename to Urban Champion (JU)/copilot/reconstructed.lbl diff --git a/_wip/Urban Champion (JU)/copilot/reconstructed.map b/Urban Champion (JU)/copilot/reconstructed.map similarity index 61% rename from _wip/Urban Champion (JU)/copilot/reconstructed.map rename to Urban Champion (JU)/copilot/reconstructed.map index aaf7f17..1ad1cc6 100644 --- a/_wip/Urban Champion (JU)/copilot/reconstructed.map +++ b/Urban Champion (JU)/copilot/reconstructed.map @@ -1,13 +1,19 @@ 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 diff --git a/_wip/Urban Champion (JU)/copilot/reconstructed_prg.bin b/Urban Champion (JU)/copilot/reconstructed.nes similarity index 65% rename from _wip/Urban Champion (JU)/copilot/reconstructed_prg.bin rename to Urban Champion (JU)/copilot/reconstructed.nes index 6660a601b7d706aa4e26f40a049e7a6004f33e44..465fad0fac6aaff749c6af2c175d98d12f01f30b 100644 GIT binary patch delta 8152 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