Promote Wild Gunman (U) from _wip to top-level project

Moves Wild Gunman (U) from _wip/ to Wild Gunman (U)/ with full ROM build:
- Adds header.s, chr.s, linker.cfg (HEADER+PRG+CHR segments)
- Updates Makefile to build and verify reconstructed.nes vs rom.nes
- Adds rom.nes copy + copilot/rom.nes symlink per repo convention
- Verified byte-identical build

Pass 1 complete: full code/data classification (~20% code / ~80% data)
Pass 2 partial: routine headers for all labels, semantic naming for key
routines (Reset, NmiHandler, MainStateDispatch, MainLoopBody, etc.),
zero-page aliases in locals.inc

Updates root OVERVIEW.md:
- Removes Wild Gunman from _wip skeleton table (23 -> 22 skeletons)
- Adds Wild Gunman as #13 in numbered inventory (BYTE-IDENTICAL, Pass 2)
- Updates summary count from 12 to 13 projects
This commit is contained in:
tmerritt committed 2026-10-16 18:51:15 -04:00
1 parent ef4a1044f7
commit c79a52e354
23 files changed
+5434 -86

No files matched your search

+25
View File
@@ -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
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"
+10
View File
@@ -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;
}
+18
View File
@@ -0,0 +1,18 @@
; Wild Gunman (U) zero-page aliases - Pass 2
; Semantic names for addresses with observed usage patterns; ZpXX names for
; addresses whose role is not yet uniquely determined.
GameMode = $30 ; Current game mode/state, set to 1 during reset.
NmiPhase = $20 ; NMI phase flag, set to 1 by NMI handler.
NmiFlag = $22 ; NMI flag, set to 1 by NMI handler.
Timer2F = $2F ; Timer incremented each frame in main loop.
Ctrl1 = $16 ; Controller 1 state, checked in MainStateDispatch.
Mode38 = $38 ; Mode byte checked in MainStateDispatch.
OAMBase = $05EC ; OAM/sprite base address used in reset init.
SpriteData = $05F0 ; Sprite data destination in reset init.
; Generic zero-page aliases (role not yet uniquely determined)
Zp00 = $00 ; Used as indirect pointer lo in RAM clear loop
Zp01 = $01 ; Used as indirect pointer hi in RAM clear loop
Zp08 = $08 ; Set to $90 during reset (PPUCTRL value)
Zp09 = $09 ; Set to $02 during reset
Binary file not shown.
File diff suppressed because it is too large. Load diff
+249
View File
@@ -0,0 +1,249 @@
al 00FFF7 .Label_FFF7
al 00FFF4 .Label_FFF4
al 00F76F .Label_F76F
al 00F724 .Label_F724
al 00F723 .Label_F723
al 00F70A .Label_F70A
al 00F702 .Label_F702
al 00F709 .Label_F709
al 00F6D2 .Label_F6D2
al 00F6D0 .Label_F6D0
al 00F6BC .Label_F6BC
al 00F6B1 .Label_F6B1
al 00F6C7 .Label_F6C7
al 00F6D9 .Label_F6D9
al 00F67F .Label_F67F
al 00F67D .Label_F67D
al 00F674 .Label_F674
al 00F686 .Label_F686
al 00F652 .Label_F652
al 00F650 .Label_F650
al 00F642 .Label_F642
al 00F64B .Label_F64B
al 00F659 .Label_F659
al 00F613 .Label_F613
al 00F60F .Label_F60F
al 00F60E .Label_F60E
al 00F5FD .Label_F5FD
al 00F5FB .Label_F5FB
al 00F5EF .Label_F5EF
al 00F5EC .Label_F5EC
al 00F5E1 .Label_F5E1
al 00F5D5 .Label_F5D5
al 00F5C7 .Label_F5C7
al 00F5B4 .Label_F5B4
al 00F617 .Label_F617
al 00F5AC .Label_F5AC
al 00F592 .Label_F592
al 00F5B0 .Label_F5B0
al 00F583 .Label_F583
al 00F570 .Label_F570
al 00F573 .Label_F573
al 00F5BD .Label_F5BD
al 00F59E .Label_F59E
al 00F588 .Label_F588
al 00F58E .Label_F58E
al 00F57F .Label_F57F
al 00F579 .Label_F579
al 00F53F .Label_F53F
al 00F5A9 .Label_F5A9
al 00F532 .Label_F532
al 00F53D .Label_F53D
al 00F51A .Label_F51A
al 00F50D .Label_F50D
al 00F50A .Label_F50A
al 00F4EF .Label_F4EF
al 00F48A .Label_F48A
al 00F48E .Label_F48E
al 00F468 .Label_F468
al 00F453 .Label_F453
al 00F440 .Label_F440
al 00F42A .Label_F42A
al 00F426 .Label_F426
al 00F418 .Label_F418
al 00F40F .Label_F40F
al 00F3EB .Label_F3EB
al 00F3EE .Label_F3EE
al 00F3E3 .Label_F3E3
al 00F3C0 .Label_F3C0
al 00F3A8 .Label_F3A8
al 00F39D .Label_F39D
al 00F38F .Label_F38F
al 00F38B .Label_F38B
al 00F391 .Label_F391
al 00F387 .Label_F387
al 00F372 .Label_F372
al 00DEED .Label_DEED
al 00DED4 .Label_DED4
al 00DAE0 .Label_DAE0
al 00DAD2 .Label_DAD2
al 00D97C .Label_D97C
al 00D996 .Label_D996
al 00D978 .Label_D978
al 00D969 .Label_D969
al 00D965 .Label_D965
al 00D959 .Label_D959
al 00D973 .Label_D973
al 00D955 .Label_D955
al 00D8FF .Label_D8FF
al 00D8EF .Label_D8EF
al 00D8E5 .Label_D8E5
al 00D8E3 .Label_D8E3
al 00D8D9 .Label_D8D9
al 00D8D7 .Label_D8D7
al 00D5B3 .Label_D5B3
al 00D5AF .Label_D5AF
al 00D4F4 .Label_D4F4
al 00D416 .Label_D416
al 00D3EE .Label_D3EE
al 00D3FD .Label_D3FD
al 00D3CF .Label_D3CF
al 00D3C4 .Label_D3C4
al 00D3C2 .Label_D3C2
al 00D3B9 .Label_D3B9
al 00D3BF .Label_D3BF
al 00D396 .Label_D396
al 00D382 .Label_D382
al 00D36C .Label_D36C
al 00D33C .Label_D33C
al 00D363 .Label_D363
al 00D365 .Label_D365
al 00D317 .Label_D317
al 00D313 .Label_D313
al 00D2F2 .Label_D2F2
al 00D2E2 .Label_D2E2
al 00D2D5 .Label_D2D5
al 00D2D3 .Label_D2D3
al 00D2CF .Label_D2CF
al 00D2D2 .Label_D2D2
al 00D273 .Label_D273
al 00D25E .Label_D25E
al 00D23B .Label_D23B
al 00D213 .Label_D213
al 00D208 .Label_D208
al 00D1FF .Label_D1FF
al 00D205 .Label_D205
al 00D1C9 .Label_D1C9
al 00D1D3 .Label_D1D3
al 00D1C5 .Label_D1C5
al 00D1D9 .Label_D1D9
al 00D1AE .Label_D1AE
al 00D19D .Label_D19D
al 00D187 .Label_D187
al 00D175 .Label_D175
al 00D172 .Label_D172
al 00D165 .Label_D165
al 00D154 .Label_D154
al 00D15B .Label_D15B
al 00D149 .Label_D149
al 00D14E .Label_D14E
al 00D118 .Label_D118
al 00D110 .Label_D110
al 00D134 .Label_D134
al 00D11D .Label_D11D
al 00D0FF .Label_D0FF
al 00D0F1 .Label_D0F1
al 00D0E3 .Label_D0E3
al 00D0DA .Label_D0DA
al 00D0CE .Label_D0CE
al 00D0D1 .Label_D0D1
al 00D0C3 .Label_D0C3
al 00D0B6 .Label_D0B6
al 00D0A6 .Label_D0A6
al 00D097 .Label_D097
al 00D089 .Label_D089
al 00D068 .Label_D068
al 00D053 .Label_D053
al 00D04F .Label_D04F
al 00D054 .Label_D054
al 00D03E .Label_D03E
al 00D02B .Label_D02B
al 00D027 .Label_D027
al 00D02C .Label_D02C
al 00D01C .Label_D01C
al 00CF0C .Label_CF0C
al 00CF01 .Label_CF01
al 00C5EC .Label_C5EC
al 00C5E6 .Label_C5E6
al 00C5DF .Label_C5DF
al 00C5D7 .Label_C5D7
al 00C5D1 .Sub_C5D1
al 00C585 .Label_C585
al 00C573 .MainLoopBody
al 00C4ED .Label_C4ED
al 00C4C2 .Label_C4C2
al 00C4C6 .Label_C4C6
al 00C4B5 .Label_C4B5
al 00C4AA .Label_C4AA
al 00C421 .Label_C421
al 00C411 .Label_C411
al 00C3E7 .Label_C3E7
al 00C3D0 .Label_C3D0
al 00C3B9 .Label_C3B9
al 00C3AC .NmiGameLogic5
al 00C3A3 .Label_C3A3
al 00C38F .Label_C38F
al 00C38C .Label_C38C
al 00C389 .Label_C389
al 00C37D .Label_C37D
al 00C367 .Label_C367
al 00C341 .Label_C341
al 00C33D .Label_C33D
al 00C337 .Label_C337
al 00C32B .NmiGameLogic4
al 00C324 .Label_C324
al 00C30B .Label_C30B
al 00C2F5 .Label_C2F5
al 00C2E3 .Label_C2E3
al 00C2CA .Label_C2CA
al 00C2BB .Label_C2BB
al 00C2D4 .Label_C2D4
al 00C2E2 .Label_C2E2
al 00C29F .NmiGameLogic3
al 00C29E .Label_C29E
al 00C275 .Label_C275
al 00C273 .Label_C273
al 00C265 .NmiGameLogic2
al 00C25A .Label_C25A
al 00C24D .Label_C24D
al 00C259 .Label_C259
al 00C233 .NmiGameLogic1
al 00C232 .Label_C232
al 00C22B .Label_C22B
al 00C225 .Label_C225
al 00C21B .ResetInitSub2
al 00C212 .Label_C212
al 00C202 .Label_C202
al 00C1EB .Label_C1EB
al 00C1CA .Label_C1CA
al 00C1A8 .Label_C1A8
al 00C1F7 .Label_C1F7
al 00C19B .Label_C19B
al 00C192 .Label_C192
al 00C183 .Label_C183
al 00C197 .Label_C197
al 00C189 .Label_C189
al 00C170 .Label_C170
al 00C169 .Label_C169
al 00C179 .Label_C179
al 00C156 .Label_C156
al 00C16D .Label_C16D
al 00C101 .Label_C101
al 00C0DE .Label_C0DE
al 00C0D4 .Label_C0D4
al 00C0F0 .Label_C0F0
al 00C10F .Label_C10F
al 00C10A .Label_C10A
al 00C130 .Label_C130
al 00C0B3 .MainStateDispatch
al 00C0A6 .Label_C0A6
al 00C086 .NmiHandler
al 00C06E .Label_C06E
al 00C06B .Label_C06B
al 00C061 .Label_C061
al 00C07C .Label_C07C
al 00C056 .Label_C056
al 00C02C .Label_C02C
al 00C01E .Label_C01E
al 00C002 .Label_C002
al 00C000 .Reset
+32
View File
@@ -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.
+1
View File
@@ -0,0 +1 @@
../rom.nes
+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