- Apply symbols.inc hardware register names to Defender 2 (U) (51 operands)
- Apply symbols.inc hardware register names to Donkey Kong 3 (JUE) (36 operands)
- Add APU register symbols (-) to Defender 2 (U) and Donkey Kong 3 (JUE) symbols.inc
- Apply symbols to Donkey Kong Jr. Math (U) (80 operands: 11 single + 69 hardware)
- Apply symbols to Excitebike (JU) (786 operands: 785 single + 1 hardware)
- Add promotion criteria to PROMPTS.md: symbol/local substitution,
ROM-specific semantic naming, and verification checklist
Add branch/jump target naming requirement to PROMPTS.md
All branches and jumps must target symbolic labels with descriptive names
derived from program flow role (e.g., _Loop, _Next, _Done, _Store, _Return),
never raw address literals. Adds criterion 8 to verification checklist.
Rename all OVERVIEW.md to README.md; add root README content to top-level
- Rename all OVERVIEW.md files to README.md throughout the repo (47 files)
- Prepend README.md content to top-level OVERVIEW.md before rename
- Fix apply_symbols.py NAME_RE regex to handle spaced assignments
- Apply symbols.inc to Defender 2 (U) (51 hardware operands)
- Apply symbols.inc to Donkey Kong 3 (JUE) (36 hardware operands)
- Apply symbols.inc to Donkey Kong Jr. Math (U) (80 operands: 11 single + 69 hardware)
- Apply symbols.inc to Excitebike (JU) (786 operands: 785 single + 1 hardware)
- Add missing Zp18/FrameCounter aliases to Excitebike prg.s
- Build all 27 top-level projects: byte-identical
Promote Donkey Kong Jr. Math back to _wip tier
Moves code from `copilot` folder and verifies each builds after
Add pre-commit hook for byte-identical verification
Add .git/hooks/pre-commit that runs 'make' then 'make clean' in each
project directory before committing. This ensures every project builds
byte-identical before any commit is accepted.
Also includes all file moves from the Donkey Kong Jr. Math (U) demotion
and other file restructuring from the session.
moves code out of copilot folder, its all AI generated.
Moves NROM games into NROM folder
removes copilot folder from Lunar Pool
Adds makefile to build all projects recursively
Updates docs to reflect changes in layout
Repromotes Donkey Kong Jr Math
Repromotes Excitebike
Promotes Popeye (JU) (PRG 1)
Updates Makefile to provide summary of build failure/success
Promote Raid on Bungeling Bay (U): Pass 2/3 partial, whole-ROM byte-identical
Move _wip/NROM/Raid on Bungeling Bay (U) to NROM/ and switch the build
from a PRG-only compare to a whole-ROM one:
- header.s/chr.s added (one-line .incbin of header.bin / chr.bin)
- linker.cfg gains HEADER ($0000, $0010) and CHR ($0000, $2000)
areas ahead of PRG ($C000, $4000)
- rom.nes symlink to the space-containing original ROM name
- Makefile builds header.o/prg.o/chr.o into reconstructed.nes and
compares it against rom.nes ('Byte-identical ROM verified.')
- one leftover neutral indirect operand jmp (Zp01) at $E2EC becomes
jmp (IndDispatch01); apply_symbols.py reports 0 substitutions pending
README.md / TODO.md / AGENTS.md updated: 29 promoted, 7 in _wip/.
Pac-Man (U): Pass 2 complete (label renaming) + Pass 3 partial (ZP aliases, table names)
Pass 2 — fresh map derived from the committed split, not from any drafted
map (the drafted maps in other projects were audited and found not
applicable):
- all 194 address-derived Label_XXXX definitions renamed to semantic
routine-entry names plus <Routine>_<Role>_<addr> internal branch
targets; zero Label_ remains
- all 49 jsr/jmp call sites resolved from raw $XXXX to labels; zero
raw $XXXX call operands remain
- routinemap.tsv / derived_names.tsv record the derivation
Pass 3 (partial):
- 15 proven semantic zero-page aliases added to locals.inc
(GameState, NmiFlag, ScrollX/Y, PpuCtrlShadow, OamDmaPage,
CocktailModeFlag, ActivePlayerFlag, GameplaySuspended, FrameCounter,
StateTimer, Player1/2Input, ActiveInput, CopyrightVerified)
- 112 operands substituted into prg.s (11 single + 101 hardware)
- key data tables named: ProgrammerSig ($C0EB), GameStateDispatchTable
($C253), TitleScreenData ($C2FD), EntityPtrTable ($D912),
AudioCommandTable ($EFDD)
Also corrects the README's claim that the RESET vector points at padding:
$FF00 holds real boot code (sei/cld, PPU off, double vblank wait, then
jmp ColdStart at $C042).
.gitignore: ignore reconstructed_prg.bin (build artifact of the _wip
Makefiles; '**/reconstructed.*' does not match the underscore form).
Promote Pac-Man (U): Pass 2/3 complete, whole-ROM byte-identical
Move _wip/NROM/Pac-Man (U) to NROM/ and switch the build from a PRG-only
compare to a whole-ROM one:
- header.s/chr.s added (one-line .incbin of header.bin / chr.bin)
- linker.cfg gains HEADER ($0000, $0010) and CHR ($0000, $2000)
areas ahead of PRG ($C000, $4000)
- rom.nes symlink to 'Pac-Man (U) [!].nes' (the original ROM name
contains a space and brackets)
- Makefile builds header.o/prg.o/chr.o into reconstructed.nes and
compares it against rom.nes
- reconstructed.nes is 24,592 bytes, MD5 a69d310f8cae9397fbd39f204672b5c7
- equal to the original ROM; the header/prg/chr splits were checked
against the original before promotion and are byte-exact
Pass 3 residue closed. The last 7 multi-alias zero-page operands are
resolved per site through a new sites.tsv, each proven from context
rather than guessed:
- jmp ($0010) at $C250/$D3CA/$D90F/$D9B6 -> (DispatchPtrLo); each
is immediately preceded by sta DispatchPtrLo/sta DispatchPtrHi
- jmp ($00FE) at $EFDA -> (AudioHandlerPtrLo); preceded by
sta AudioHandlerPtrLo/sta AudioHandlerPtrHi
- sta a:$0000,y at $C048/$C089 -> a:Zp00,y; the literal zero-page
base in the two ZP clear loops, so the neutral name is used rather
than the semantic WorkPtrLo. The 'a:' prefix survives the
substitution, so the bytes stay 99 00 00 (sta abs,Y)
apply_symbols.py now reports 119 operands substituted (101 hardware,
11 single-name, 7 site) and 0 residue.
New tool _tools/align_audit_comments.py: re-aligns the audit comment to
column 35 after a substitution lengthens an operand (nesdis.py pads each
instruction to 31 characters). Whitespace-only, so the byte identity
cannot change. 405 lines re-aligned in this project; all 2,387 audit
comments still match prg.bin at the stated PRG offset, 0 mismatches.
Docs: root README.md / TODO.md / AGENTS.md updated - 30 promoted, 6 in
_wip/; a per-project detail entry for Pac-Man (U) added; the stale
'Donkey Kong 3 (JUE) has no README.md' claim corrected (it has a
318-line one).
Promote Raid on Bungeling Bay (U) [a2]: Pass 3 complete, whole-ROM byte-identical
Move _wip/NROM/Raid on Bungeling Bay (U) [a2] to NROM/ and switch the build
from a PRG-only compare to a whole-ROM one:
- header.s/chr.s added (one-line .incbin of header.bin / chr.bin)
- linker.cfg gains HEADER ($0000, $0010) and CHR ($0000, $2000)
areas ahead of PRG ($C000, $4000)
- rom.nes symlink to 'Raid on Bungeling Bay (U) [a2].nes' (the original
ROM name contains spaces and brackets)
- reconstructed.nes is 24,592 bytes, MD5 659d340a1e9d420eee28df13319b0094
- equal to the original ROM; the header/prg/chr splits were checked
against the original before promotion and are byte-exact
Pass 3 - 15 semantic zero-page aliases, each applied only at the sites
where its role is proven:
- PpuCtrlShadow ($C2), 15 sites: the reset entry primes it right after
'sta PPUCTRL', and every other use is an ora/and/eor followed by
'sta PPUCTRL'
- NmiPathSelector ($C4), 5 sites: written 1 at $C3E9 and 0 at $C962
- GameState ($D6), 6 sites: 'cmp #$02' and used as an index at $C4C7
- FrameSubCounter ($55), 6 sites: set to $0A at $C520, decremented per
NMI at $C07B
- PrngPeriodCounter ($EA) / PrngSeedB ($EB) / PrngState ($EC), 13 sites:
the PRNG state
- PtrLo ($00) / PtrHi ($01), 8 sites: the 16-bit pair $1C13 and $1610
compared at $E785/$E791
- IndDispatch01 ($01) / IndDispatch02 ($02), 3 sites: the computed
dispatch at $E2EC
- IndDispatch1B ($1B) / IndDispatch1C ($1C), 6 sites: the dispatch at
$E7A3
- IndDispatch17 ($17) / IndDispatch19 ($19): the dispatches at $E79D
and $E7A0
Addresses that carry two names keep the neutral ZpXX name where the other
role applies - $01 is PtrHi at the 16-bit compare and IndDispatch01 at the
dispatch; $17 is IndDispatch17 at the dispatch and Zp17 for the absolute
RAM $0017 store in the copy loop at $E895/$E8D0.
New tool _tools/apply_zp_aliases.py does the per-site substitution:
apply_symbols.py only rewrites *numeric* operands, so it cannot rename an
operand that is already written as a neutral ZpXX name. The tool keeps the
ca65 'a:' prefix (dropping it would turn 'sta a:Zp17,y' into a zero-page
store and change the bytes) and rewrites only the operand token, so the
audit comment survives byte for byte.
Naming correction in the promoted sibling. Finishing this dump showed that
$EA was misnamed 'VBlankWaitCounter': the routine at $C412 is the game's
pseudo-random generator (the classic eor/asl/php/lsr/plp/rol scrambler,
called from thirteen gameplay sites, twice in a row at $CDF4/$CDF9 with the
second result masked #$07), so $EA is the scrambler's phase counter.
Renamed PrngPeriodCounter in both dumps and named $EB/$EC PrngSeedB /
PrngState. The sibling's two 'sta a:IndDispatch17,y' operands were also
wrong - they are absolute stores to RAM $0017, not the dispatch pointer -
and are now 'a:Zp17,y', matching the file's 'a:' = absolute convention.
Audit-comment alignment re-done with _tools/align_audit_comments.py (1,040
lines here, 1,080 in the sibling). Both files still match prg.bin at every
stated PRG offset: 5,467 and 5,483 audit comments, 0 mismatches.
Docs: root README.md / TODO.md / AGENTS.md updated - 31 promoted, 5 in
_wip/; per-project detail entries added for both Raid dumps.
Promote Pac-Man (Tengen) (U): Pass 2/3 from scratch, whole-ROM byte-identical
Move _wip/NROM/Pac-Man (Tengen) (U) to NROM/ and switch the build from a
PRG-only compare to a whole-ROM one:
- header.s/chr.s added (one-line .incbin of header.bin / chr.bin)
- linker.cfg gains HEADER ($0000, $0010) and CHR ($0000, $2000)
areas ahead of PRG ($C000, $4000)
- rom.nes symlink to 'Pac-Man (Tengen) (U) [!].nes'
- reconstructed.nes is 24,592 bytes, MD5 d34e7a74d8d2c231b6cc601210e28ad0
- equal to the original ROM; the header/prg/chr splits were checked
against the original before promotion and are byte-exact
Disassembled from scratch. No name, map or file was carried over from the
sibling 'Pac-Man (U)' dump; the map was derived from this dump's own
committed split and the two were only compared afterwards.
Pass 2 (new tool _tools/apply_pass2_map.py):
- all 194 Label_XXXX definitions renamed to semantic routine entries plus
<Routine>_<Role> branch targets; zero Label_ remains
- all 48 raw $XXXX jsr/jmp operands resolved to labels; zero raw $XXXX
call or branch operands remain
- the map is in routinemap.tsv
Pass 3:
- 30 semantic zero-page aliases, each applied only at the sites where its
role is proven (per-site choice in sites.tsv; the addresses that carry
two roles keep the neutral ZpXX name elsewhere). _tools/
derive_zp_aliases.py records how the set was derived, and locals.inc
records the reason for every remaining neutral slot
- 28 data tables named (new tool _tools/name_data_region.py), including
CharacterDataTable ($C66A) and CharacterNameStrings ($C67E), where the
ROM itself names Blinky, Pinky, Inky and Clyde - which is why the four
indexed entities are called ghosts and not 'actors'
- apply_symbols.py reports 0 substitutions pending and 0 residue
- audit-comment alignment re-done with _tools/align_audit_comments.py;
all 2,479 audit comments still match prg.bin at the stated PRG offset
Pass 1 correction - six command handlers recovered (new tool
_tools/recode_region.py). ScriptCommandTable ($EFDD) is read by the traced
instruction at $EFCC, and six of its entries point at $F00A, $F022, $F03A,
$F052, $F062 and $F072 - all of which the tracer had left as data, and two
of which it had mis-split across the 'jmp $EF61' at $F01F and $F04F.
Those 120 bytes are code here, decoded straight from the ROM; the six
handlers tile $F00A-$F081 exactly. The same gap exists in the promoted
'Pac-Man (U)' dump, which has not been corrected - recorded in both READMEs.
Residue (documented, not guessed): the unreached main game logic at
$C45A-$C55F is still .byte data. It is code - the tracer's own decoder
walks it cleanly and the dispatch table at $C511 points into it - but
nothing reaches it, so it cannot be entered without a guess. The same gap
exists in the promoted 'Pac-Man (U)' dump. Re-deriving it is a Pass 1 job;
a Mesen Code Data Logger capture is the tool the repo uses for it.
Docs: root README.md / TODO.md / AGENTS.md updated - 32 promoted, 4 in
_wip/; a per-project detail entry added for the Tengen dump.
Promote Pyramid (U): Pass 1 corrected, Pass 2/3 complete, whole-ROM byte-identical
Move _wip/NROM/Pyramid (U) to NROM/ and switch the build from a PRG-only
compare to a whole-ROM one:
- header.s/chr.s added (one-line .incbin of header.bin / chr.bin)
- linker.cfg gains HEADER ($0000, $0010) and CHR ($0000, $2000)
areas ahead of PRG ($C000, $4000)
- rom.nes symlink to 'Pyramid (U) (Sachen).nes'
- reconstructed.nes is 24,592 bytes, MD5 aa285ff17f25dd05da5996b7466c59e2
- equal to the original ROM; the header/prg/chr splits were checked
against the original before promotion and are byte-exact
Pass 1 correction - the committed split was a strict subset of the correct
one. This game dispatches through 'jmp' trampoline tables that live
*inside* the data regions, and the tracer cannot follow a jmp there, so
828 bytes of code were still marked as data. Four such tables were found
($C01E 3 entries, $C02A 6, $C042 2, $C054 5) plus ten more entries at
$C000-$C01B; all sixteen targets decode as valid instructions. Seeding
them, the $C800 boot mainline and six further code starts recovers the
whole lot, plus a five-byte stub at $DF89 (lda $33 / jmp $DECB) that sat
in a hole between two routines. The re-trace loses NO committed code byte
and takes the split from 34.5% to 39.6% (3,130 instructions / 6,493 code
bytes). 'make regen' reproduces it, so the split stays verifiable.
Pass 2 - a fresh map derived from this dump's own committed split:
- 428 Label_XXXX definitions renamed; zero Label_ residue
- 320 raw $XXXX jsr/jmp operands resolved; zero raw $XXXX branch
operands remain
- 431 routine entries and the 32 data blocks named from the code
- the internal branch-target names are derived mechanically from the
branch that reaches them by the new _tools/derive_branch_names.py
(beq -> OnZero, bne -> OnNonzero, bcc/bcs -> the carry cases, a
backwards branch -> Loop)
- recorded in routinemap.tsv
Pass 3:
- 24 semantic zero-page aliases, each applied only where its role is
proven; the 57 slots that stay neutral are each listed with the reason
in locals.inc (the neutral set lives in zp_aliases.inc so that
'make regen' can rebuild locals.inc from prg.bin)
- 32 data tables named - TaskVectorTable1/2, LevelScriptData,
MusicPeriodTable, SoundEnvelopeTable, the actor tables - recorded in
data_region_names.tsv
- apply_symbols.py reports 0 substitutions pending and 0 residue; no
hardware register is left as a raw literal
- the audit comments are now canonical on every line, data included
(the old file carried only 'PRG:$xxxx' on its 1,358 data lines);
all 3,762 audit comments match prg.bin at their stated PRG offset
Kept as-is, not 'cleaned up':
- sta $4100 stays a raw operand. The iNES header claims mapper 0 but
the boot code writes past the NES register space; the ROM does not
explain it, so it is recorded rather than guessed
- the 'A'/'V' check on RAM $0120/$0121 and its seed/clear routines
are named for what they do, not for what they are for
- the ninth entry of the $C3A6 task vector table ($D820) is a junk
slot and stays data
Docs: root README.md / TODO.md / AGENTS.md updated - 33 promoted, 3 in
_wip/; a per-project detail entry added.
Hogan's Alley (JU): Pass 1 correction, Pass 2, Pass 3, promoted to NROM/
The light-gun game whose engine dispatches through *inline* tables:
`IndirectCall` at $C34D pops the return address of the `jsr` that called
it and reads a 16-bit handler pointer from the word that follows, so all
six handler tables ($C124 19 entries, $C219 4, $C89C 14, $CDD1 1, $D234 2,
$D3D6 14) live inside the code stream and the static tracer cannot follow
them.
Pass 1 correction. The committed split was a strict subset of the correct
one -- 41.8% of the PRG was classified as code. A fresh Mesen Code Data
Logger capture was merged with the four captures already in the folder
(hogans_merged.cdl, the OR of five per-byte flag arrays, 6,544 code bytes)
and _tools/cdl_reclass.py rewrote the split to match what the CPU actually
fetched: 1,216 bytes moved from data to code, five the other way, 59 labels
emitted. The split is now 49.1% code (3,950 instructions, 8,041 bytes).
The four branch targets the reclassifier could not prove were turned into
labels by the new _tools/resolve_raw_branches.py.
Pass 2. 206 routine entries hand-named from this dump's own code and 413
internal branch targets derived mechanically by _tools/derive_branch_names.py:
630 Label_XXXX definitions gone, 484 raw $XXXX call operands resolved, 15
call targets the tracer had never labelled given a label. Recorded in
routinemap.tsv. No SubC<addr> residue was needed -- every entry the engine
reaches is named after what it does.
Pass 3. 60 semantic zero-page aliases, each applied only where its role is
proven (zp_aliases.inc, zp_alias_sites.tsv); the slots that stay neutral are
each listed with the reason. All 34 data blocks named
(data_region_names.tsv). apply_symbols.py reports 1 residue: `sta a:$00B4,y`
at $C203, the same address as Zp40/ActorPalette but forced to absolute
addressing, so it must stay numeric.
Promotion. header.s, chr.s and a HEADER/PRG/CHR linker.cfg added, rom.nes
symlinked to the original ROM; the whole-ROM cmp passes on the first
promoted build. There is deliberately no `make regen` target: the Pass 1
split here is the static trace corrected by a CDL capture, and the base the
correction was applied to is not what the current _tools/nesdis.py
produces, so prg.s is the maintained source of truth.
Tools changed:
nesdis.py --split/--note/--provenance options, so a data
region can carry its own name and explanation;
a forced-data address is no longer reported as a
recovered routine entry
apply_pass2_map.py can create the label for a call target the tracer
left unlabelled; no longer double-labels it
apply_zp_aliases.py --at-file, an address-based per-site list
derive_branch_names.py keeps the map's own header instead of writing a
fixed one
resolve_raw_branches.py new: turns `bXX *+$NN` operands into labels
build_hogans_map.py new: the hand-written Pass 2 map builder
The existing regen pipelines (MUSCLE (U), Urban Champion (JU)) still
reproduce prg.s byte for byte.
Apply the symbols.inc register names at Pass 1; fix a dropped byte in cdl_reclass
nesdis.py now names the hardware registers as it renders the operands, so a
project's Pass 1 output already reads `lda PPUSTATUS` instead of `lda $2002`
and the Pass 3 apply_symbols.py step has nothing left to do for them.
* nesdis.py --symbols FILE reads a symbols.inc-style file and substitutes
the register names. Only unambiguous entries in the $2000-$4017 window
are used: $4017 is both JOY2 and APUFRAMECOUNTER, so it stays numeric
and apply_symbols.py reports it as multi-alias residue, exactly as
before. The default is the symbols.inc next to --out, so a new project
gets the names without asking; --no-symbols opts out.
* The renderer records the operand's numeric value on the Insn, because
operand_value() used to re-parse the operand text and could no longer
read a name.
* The controller bit masks in symbols.inc (PAD_A and friends) are
constants, not addresses, and are still never substituted.
MUSCLE (U) and Urban Champion (JU) keep --no-symbols: their committed
prg.s was produced with the registers named by the Pass 3 apply_symbols.py
step, and the columns in those files reflect the in-place substitution.
Adding the missing apply_symbols.py step to both regen pipelines makes
them reproduce their committed prg.s byte for byte again - neither did
before this change (MUSCLE was 440 lines out, Urban Champion 772).
cdl_reclass.py had a bug that cost a byte: a region whose last source row
straddled the region's end was replaced by a regeneration of the region
only, so the tail of that row was dropped. Mario Bros (JU) hit it at
$C595, where the rebuild came out one byte short and every label after it
shifted. A region now covers the whole rows it replaces.
pass2.py reflow takes an optional column argument; the default is
unchanged (the ';' lands on the same column as before).
Mario Bros (JU): Pass 1 correction, Pass 2, Pass 3, promoted to NROM/
A two-player platformer whose handler tables are *inline*: the pointers sit
in the middle of the code stream, right after the `jsr` that reads them, so
the static tracer could never follow them.
Pass 1 correction. The committed split was a strict subset of the correct
one -- only 72.0% of the PRG was classified as code. A Mesen Code Data
Logger capture of this ROM (mario_mesen.cdl, 10,915 code bytes) showed
1,010 bytes the tracer had left as data were code; two branch targets the
capture never reached ($E4CB and $E639) were forced with --override for 57
more, so 1,067 bytes moved from data to code and 22 moved the other way.
The split is now 78.4% code (6,210 instructions, 12,847 bytes). The three
branch targets the reclassifier could not prove were turned into labels by
_resolve_raw_branches.py, which now refuses to put a label on a `.byte` row.
Pass 2. 206 routine entries and 519 internal branch targets: 931
Label_XXXX definitions gone, 51 raw $XXXX call operands resolved and 12 call
targets the tracer had never labelled given a label. Zero SubC residue --
the 185 entries a previous session had left as address-derived residue were
all named from this dump's own code. Recorded in routinemap.tsv.
Pass 3. 25 semantic zero-page aliases, each applied only where its role is
proven (zp_aliases.inc); the slots that stay neutral are each listed with the
reason. 35 data tables named -- GameStateHandlerTable, EnemyBehaviourTable,
EnemyScriptTable, EnemyTypePointerTable, SoundRoutineTable,
NoteFrequencyTable and the rest -- and recorded in
data_region_names.tsv. apply_symbols.py reports 0 residue.
Promotion. header.s, chr.s and a HEADER/PRG/CHR linker.cfg added, rom.nes
symlinked to the original ROM; the whole-ROM cmp passes on the first
promoted build. There is deliberately no `make regen` target: the Pass 1
split here is the static trace corrected by a CDL capture, and the base the
correction was applied to is not what the current _tools/nesdis.py
produces, so prg.s is the maintained source of truth.
Tools:
apply_pass2_map.py renames a label of any spelling -- SubC<addr> is
the honest residue form -- and its references
follow it; one combined pattern, so a 16,000-line
file does not need a substitution per label
resolve_raw_branches.py refuses to label a data row
build_mario_map.py new: the hand-written Pass 2 map builder
Remove the old _wip/NROM/Mario Bros (JU) folder (promoted to NROM/)
Mario Bros (JU): add the promoted-tier header, CHR, rom.nes symlink and zero-page aliases
Moves _ROMS/<ROM> into _wip/<MAPPER>/<ROM>
Sync the docs and the skeleton tool with the 857-project _wip tier
The _wip/ tier now holds 857 projects across 30 mapper folders, all
building byte-identical for the whole ROM. README.md, TODO.md and
AGENTS.md still described the old 39-project tier, so bring them in line
with WIP.md, which carries the tier's index.
The tier is no longer 39 projects of NROM-256 with a 16/32 KB PRG:
only two projects have a 16 KB PRG, 151 have 32 KB, 523 have 128 KB and
one has 1.5 MB, so most of it is a banked mapper whose image does not fit
the 6502's address space. Those projects link their MEMORY areas at .nes
file offsets rather than CPU addresses, which is the only option and the
honest model; the 39 older projects keep the CPU-address layout because
their PRG really is one contiguous window.
make_skeleton.py gains the two layouts (--layout flat|cpu), the board
name for the mapper, and a fix for find_rom() mistaking the build
output reconstructed.nes for the source ROM.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
599 lines
128 KiB
Plaintext
599 lines
128 KiB
Plaintext
||||||||||||||||||||||||||||||||pppppppppppppppp智乔妹乔乔妹乔且pppt妹xppt妹xppp蚊们乔乔乔乔敲檬蚊脁ppppppppt妹手乔乔乔妹乔乔乔襭pppppt妹xpppppp蚊乔乔乔乔乔乔檬蚊xp杈�憾句pt檬蚊妹躳tΣxp孛妹饰妹妹妹妹妹妹妹饰妹妹妹妹妹妹妹手乔乔乔乔乔乔乔襹|||||||||||||||||||||||||||||||||||||||||||||||pppppppppppppppp蚊乔乔乔乔乔敲檬蚊枤ppppppppt妹饰脦偯们乔乔乔敲饰脪喢脁ppppp瀶檬蚊乔乔乔乔妹巶檬蚊枤pppppt妹拞檬蚊巶妹乔乔乔乔檬蚊拞妹xppppp瀶檬蚊们乔乔乔妹巶檬蚊脁pppppt妹拞檬蚊妹妹妹妹妹妹檬智乔乔乔乔乔乔且||||||||||||||||||||||||||||||||||||||||||||||||pppppppppppppppp智敲们乔乔敲们且ppt妹xppppt妹xpp置们敲们敲们敲靡t妹滂妹xt妹滂妹x置绵嗝们敲绵嗝靡t妹茇妹xt妹茇妹x智妹乔乔乔乔妹且pt妹xppppppt妹xp蚊们乔乔乔乔敲檬蚊脁ppppppppt妹饰妹妹妹妹妹妹妹手乔乔乔乔乔乔乔襹|||||||||||||||||||||||||||||||||||||||||||||||pppppppppppppppp智乔乔敲们乔乔且枤ppppt妹xpppp瀶巶乔乔敲们乔乔巶ppppppt妹xpppppp蚊乔妹们乔乔乔檬蚊鋞妹脁ppppp杳饰绵乔乔乔乔妹嗝饰密pppppppt妹嗝饰妹妹乔乔乔乔嗝饰妹妹xppppppp孛饰妹妹妹妹妹妹妹手乔乔乔乔乔乔乔襹|||||||||||||||||||||||||||||||||||||||||||||||pppppppppppppppp蚊乔乔乔乔乔乔檬蚊xpppp桎ppppt檬智乔妹青嗲妹乔且pppt妹湄荑妹xppp蚊乔乔鄛}嗲乔敲饰脁ppp貆}鋚ppt檬智乔妹鄛}嗝们乔襭ppt妹荑湄妹xppp蚊乔乔青嗲乔乔檬蚊xppppppppppt檬蚊妹妹妹妹妹妹檬智乔乔乔乔乔乔且||||||||||||||||||||||||||||||||||||||||||||||||pppppppppppppppp智妹乔乔乔乔妹且pt妹xppppppt妹xp智妹乔敲们乔妹且pt妹鋚杳娩p杳脁p智妹嗑嗝绵距妹且pt妹�孛密孛脁p智乔妹妹妹妹乔且pppt妹乔乔妹xppp蚊们乔�憾乔敲檬蚊脁pppΣpppt妹饰妹妹妹妹妹妹妹手乔乔乔乔乔乔乔襹|||||||||||||||||||||||||||||||||||||||||||||||pppppppppppppppp蚊乔乔敲们乔乔檬智鋚ppt妹xppp枨襭p孛们乔敲妹密pp蚊们卿ppt妹们乔椅们鋚孛们乔卿ppp蚊x孛妹脁ppp孛檬蚊们乔乔妹妹乔且蚊脁ppp枨乔脁ppp智乔敲密pp枨乔檬ppppt妹妹密ppt檬蚊妹妹妹妹妹妹檬智乔乔乔乔乔乔且||||||||||||||||||||||||||||||||||||||||||||||||pppppppppppppppp智妹乔乔乔乔妹且pt妹xppppppt妹xp蚊乔乔敲们乔乔檬蚊xppp杳娩pppt檬智乔乔嗝绵乔乔且pppppp孛密pppppp蚊们乔乔乔乔敲檬蚊脁p瑾�朵pt妹饰妹妹躷Σx孛妹檬蚊妹妹妹妹妹妹檬蚊妹妹妹妹妹妹檬智乔乔乔乔乔乔且||||||||||||||||||||||||||||||||||||||||||||||||pppppppppppppppp智乔乔敲们乔乔且灇ppppt妹xpppp灇巶敲们乔乔敲们巶ppt妹xppppt妹xpp智乔乔敲们乔乔且湗ppppt妹xpppp湗寑妹乔乔乔乔妹寑拞妹暀pppp潐妹拞蚊妹崄乔乔崄妹檬蚊妹挗ⅱⅱ�妹檬蚊妹妹妹妹妹妹檬智乔乔乔乔乔乔且||||||||||||||||||||||||||||||||||||||||||||||||pppppppppppppppp泉�������泉獂ppppt忖忖忖热忖忖忖猊檎颜颜萷pppppt崓ォxpppp取湾崓崓崓�pppt取�ppppt崓ォ┅热 湾崓崓崶┅萷pppppt暜矋崓ォ热 �檻懚簛厜崶热轁檻憫懢聭憫亝热憫憫憫憫菓憫憫热憫憫憫憫憫憫憫葇|||||||||||||||潩潩潩潩潩潩潩潩潩潩潩潩潩潩潩潩潩潩榩ppppp悵潩潩潩槃#Ё#垚潩潩潣枺#xt#�悵潩槚#ЁЁЁ#帎潣枺#xppppt#�恷#ЁЁЁЁЁ#€|#xppppppppt#€|ЁВ'ЁВ'Ё€pppt#xppt#xppp�'ЁЁЁЁВ*��ppppppppt#�#######�ЁЁЁЁЁЁЁ矟澚潩翝澚潩翝澚潩澚潩翝澚潩翝澚澚亮亮亮亮亮亮亮羛ppppppppppppppp叮'Ё#ЁЁЁРt#xp愃�ppppppp叮'�舅#ЁЁ*t#xp惛舅�ppt*锭Ё�惛舅#ЁРpppt#帎妇耍xppp�ЁЁ�惛晶В2�xppt#帎笜t#x锭ЁЁЁ�p劊'瞤ppppppt###xp�######*锭ЁЁЁЁЁЁР澚翝澚翝澚翝澚翝翝澚翝澚翝澚翝澚澚翝澚翝澚翝澚翝翝澚榩ppppp惲潩翝亮潀#Ё#€澚翝翝潣劊�t#垚潩翝翗枺'ЁВ�惲澚槚#�ppt#�惲槚[ЁЁЁЁ耍帎劊垡虡pppp惛舅��姨槚'В帎妇*�€槚#xt#帎|*�垨'ЁЁВ巹*�#�ppppt##�#######�ЁЁЁЁЁЁЁ矟潩潩潩潩潩潩潩潩潩潩潩潩潩潩潩澚亮亮亮亮亮亮亮玲牧翗ppppppp惲玲崮哪|ЁЁ#�哪後哪哪榩pt#�哪後哪臉枺ЁЁ�哪後脑槚#xpp惸哪尼崮槚郄ЁВ帎哪尼pp栛姨榩t#帎阅岫[姨槚'Ё�惸醫垡虡枺�pt#巔p兑虡枺ЁЁЁВ*ppp枺�pppppt#�#######�ЁЁЁЁЁЁЁ擦澚澚澚澚澚澚澚澚澚澚澚澚澚澚澚澚澚澚澚澚澚澚澚漰ppppppppppppppp锭ЁЁ#郄ЁЁ*pppppt[姨榩pt*锭Ё#垡虡枺ЁРpppt[姨槚#xppp锭#垡虡枺ЁЁ*pt[姨槚#xppt*叮垡虡枺ЁВ'РtR虡枺�pt#xpp锭€槚'ЁЁЁВ猵pp枺�ppppppt*�######*锭ЁЁЁЁЁЁР亮亮亮亮亮亮亮亮潩潩潩潩潩潩潩潩亮亮亮亮亮亮亮亮潩潩潣pppp悵潩潩pp惲槚##帎翗pp�坧枺##�p劊�[ЁЁ#ЁЁ耍�Rpppt#xppp荆�\Ё�#郄Ё埽��p惛舅垡虡p劊�Ё�惛疽虡枺Ё瞤pt#帎柑槚#xpp锭ЁВ巔p枺ЁЁ瞤pppt###xpppp�######*锭ЁЁЁЁЁЁР潩潩潩潩潩潩潩潩潩潩潩潩潩潩潩潩潩潩潩潩潩潩潩潩pppppppppppppppp锭�#ЁЁ耍郄Рppp荆�p惛舅襭pp锭к##帎妇堙Рppp劊##帎笜ppp锭耍'Ё�帎|Ё瞤p荆�p惛舅巔ppp锭堙Ё�惛舅郄Рpppppt#帎妇襭pp�###�惛堙Р�####巔pppp�######*锭ЁЁЁЁЁЁР澚潩翝澚澚澚澚澚翝翝澚潩翝翝翝翝澚澚澚澚澚澚澚澚pppppppppppppppp�Ё�'ЁЁЁР�x惛舅xp惲澚榩p��惛舅�惲羭Р锭�帎妇耍帎潣pp亮妇藥惛舅�恷Рpp惛舅帎妇耍巔pp�帎妇�惛晶Ё*��pt#巔pppt*�#'ЁЁВ#*�#�ppppt##�#######�ЁЁЁЁЁЁЁ矟潩潩潩潩潩潩潩潩潩澚亮潩亮翝潩澚亮翝潩亮潩澚亮羛p惲翗pppp惲翗pp�€潣枺#�悵|*�坧枺##�p劊�ЁЁЁ#ЁЁЁ矟潣pppt#xppp悵澚槚'ЁЁЁВ帎羛枺�p悵潣pt#巔�郄В巔p枺Ё耍�б榯###x惥Р亮槚####帎亮pp枺####�pp�######*锭ЁЁЁЁЁЁР澚澚澚澚澚澚澚澚================================ppppppppppppppppLHHHHHHHHHHHHHH8LHxtHHHHHHHHxtH8LHHHHHHHHHHHHHH8ppppptHHHHxpppppLHHHHHHHHHHHHHH8LHxpppppppppptH8LHHHHHHHHHHHHHH8LHHHHHHHHHHHHHH8LHHHHHHHHHHHHHH8LHHHHHHHHHHHHHH8LHHHHHHHHHHHHHH8LHHHHHHHHHHHHHH8================||||||||||||||||||||||||||||||||pppppppppppppppp〕吵贩贩贩贩吵偿〕吵榩ppppp湷吵ァ撤穼贩吵贩尫烦ァ硏pppt吵xpppt偿┓贩烦吵吵撤贩翻€恜pt吵贩吵xpp攢|劮贩吵垊吵贩穲|恜ppt吵垊吵xppp攧吵贩贩垊贩贩吵垊吵xppppppppt吵垊吵吵吵吵吵吵吵垊贩贩贩贩贩贩贩垁€€€€€€€€€€€€€€€||||||||||||||||||||||||||||||||pppppppppppppppp〕贩贩烦撤贩贩偿〕xppp湷硺pppt偿〕贩贩尦硨贩贩偿〕榩ppt吵xppp湷ァ硨贩贩吵贩贩尦ァ硏ppp湷硺pppt偿〕贩贩尦硨贩贩偿〕榩ppt吵xppp湷ァ硨贩贩吵贩贩尦ァ硏pppt吵xpppt偿〕吵吵吵吵吵吵偿┓贩贩贩贩贩贩翻€€€€€€€€€€€€€€€€||||||||||||||||||||||||||||||||pppppppppppppppp〕贩贩烦撤贩贩偿〕榩ppt吵xppp湷ァ硨贩贩吵贩贩尦ァ硏pppt吵xpppt偿〕贩贩烦撤贩贩偿〕xppp湷硺pppt偿〕贩贩尦硨贩贩偿〕xpppt吵xpppt偿〕撤贩贩贩贩烦偿〕硏ppppppppt吵ァ吵吵吵吵吵吵吵ォ贩贩贩贩贩贩贩瓈€€€€€€€€€€€€€€€||||||||||||||||||||||||||||||||恜ppppppppppppp攧贩吵贩贩贩吵贩垚pt吵xppppt吵xp攧贩吵贩贩贩吵贩垚pt吵xppppt吵xp攧贩贩贩吵贩贩贩垚pppppt吵xppppp攧贩烦撤贩烦撤贩垁€忍吵娜忍吵娜€€|惣莱掣技莱掣紨||劤吵吵吵吵吵硤||劤吵吵吵吵吵硤||劮贩贩贩贩贩穲|€€€€€€€€€€€€€€€€||||||||||||||||||||||||||||||||pppppppppppppppp┓贩贩烦撤贩贩翻恜pppp湷硺ppppp攧贩贩穼吵尫贩贩坧pppppt吵xpppppp〕撤贩贩贩贩烦偿〕硺pppppppp湷偿〕硨贩贩贩贩尦偿〕硏ppppppppt吵ォ贩贩吵吵吵贩贩璸pppt吵吵吵xpppp〕吵吵吵吵吵吵偿┓贩贩贩贩贩贩翻€€€€€€€€€€€€€€€€||||||||||||||||||||||||||||||||pppppppppppppppp┓烦撤烦撤烦撤翻热坛衬坛衬坛衬热技莱掣莱掣莱掣技〕贩贩烦撤贩贩偿〕xpppt吵xpppt偿┓烦撤贩贩烦撤翻热坛衬热热坛衬热技莱掣技技莱掣技〕吵吵吵吵吵吵偿〕吵吵吵吵吵吵偿〕吵吵吵吵吵吵偿┓贩贩贩贩贩贩翻€€€€€€€€€€€€€€€€||||||||||||||||||||||||||||||||pppppppppppppppp〕贩烦撤烦撤贩偿〕xpt吵xt吵xpt偿〕贩烦撤烦撤贩偿〕xpt吵xt吵xpt偿〕贩烦撤烦撤贩偿〕xpt吵xt吵xpt偿〕贩烦撤烦撤贩偿〕xpt吵xt吵xpt偿〕贩烦撤烦撤贩偿〕xpt吵xt吵xpt偿〕吵吵吵吵吵吵偿┓贩贩贩贩贩贩翻€€€€€€€€€€€€€€€€||||||||||||||||||||||||||||||||pppppppppppppppp〕贩贩烦撤贩贩偿〕娜热坛衬热忍偿〕讣技莱掣技祭偿〕贩贩烦撤贩贩偿〕娜热坛衬热忍偿〕讣技莱掣技祭偿〕贩贩烦撤贩贩偿〕娜热坛衬热忍偿〕讣技莱掣技祭偿〕吵吵吵吵吵吵偿〕吵吵吵吵吵吵偿┓贩贩贩贩贩贩翻€€€€€€€€€€€€€€€€||||||||||||||||||||||||||||||||pppppppppppppppp〕贩贩贩贩贩贩偿〕垚ppp攼ppp攧偿〕垊贩穲劮贩垊偿〕垚ppp攼ppp攧偿〕垊贩穲劮贩垊偿〕垚ppp攼ppp攧偿〕垊贩穲劮贩垊偿〕xppppppppppt偿〕撤贩烦撤贩烦偿〕硏ppt吵xppt吵ァ吵吵吵吵吵吵吵ォ贩贩贩贩贩贩贩瓈€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€pppppppppppppppp〕吵吵吵吵吵吵偿〕xpppt吵xpppt偿〕吵吵吵吵吵吵偿〕xpppt吵xpppt偿〕吵吵吵吵吵吵偿〕吵吵吵吵吵吵偿〕吵吵吵吵吵吵偿〕吵吵吵吵吵吵偿〕吵吵吵吵吵吵偿〕吵吵吵吵吵吵偿〕吵吵吵吵吵吵偿〕吵吵吵吵吵吵偿€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€创创创创创创创创╬p|pp|p|ppèè▽�吵吵吵�悿え▽�恜|p|t�埊瘈��埊�吵吵埊�潓�埊痻ppp|劘痻p尟瘓�吵吵吵吵碀尟瘓�x||p|╬|pp尟瘓吵吵朝瘓吵碀尟瘈ppppt�€|p|p尦吵朝�吵吵吵碀ppppt�x|p|pp|pp櫙������瘯〕吵吵吵吵吵吵碀创创创创创创创创创创创创创创创创创创创创创创创创pppppppppppppppp〕吵吵朝�吵吵碀ppppp╰�x╬pppp櫙�瘓朝�埊�瘯〕�瘣t�x尟�碀pt�瘓朝�埊�xp〕朝瘈t�x劘�碀ppt�吵�吵�xpp櫙吵硱t�x尦吵瘯櫙xpp劘�瘈ppt瘯櫙������瘯櫙������瘯〕吵吵吵吵吵吵碀创创创创创创创创创创创创创创创创创创创创创创创创pppppppppppppppp〕吵吵吵吵吵朝瘯ppppǜèǜ╬t�暀�瘈è辅▌��暀��€い���瘯〕吵吵�吵吵吵碀ǜǜ╰�x辅è辅èǜ▌��€è辅èǜ▌���€èǜè▌����€èè������€い��������暋吵吵吵吵吵吵吵澊创创创创创创创创创创创创创创创创创创创创创创创锤ǜpppppppppp父辅竸�吵吵吵�€ǜ笇�痻ǜǜt�瘣袱劘�瘈ǜ劘�瘈ぁ吵朝�€劘�吵碀pp|t�吵吵�x||p櫙吵�x|pt�吵瘯櫙x尦吵吵吵硱t瘯櫙瘈辅|p|p父劘瘯櫙�€尟�瘣劘�暀��集����暀�������暋吵吵吵吵吵吵吵澊创创创创创创创创创创创创创创创创创创创创创创创磒ppppppppppppppp櫙吵吵吵吵吵吵瘯櫙x|▅p|p|p竝t瘯櫙吵埊��瘓吵瘯櫙xp尦朝�硱pt瘯櫙�€pt�xp劘�暋吵吵吵�吵吵吵澑pp||p尟瘣p|p|p笇��瘓�埊��悓朝�硤�埑��恜t�痻劘瘈t�痻p櫙������瘯〕吵吵吵吵吵吵碀创创创创创创创创创创创创创创创创创创创创创创创创ǜp|èp|p|è辅ǜ笇�悓��惛ǜ辅笇�悇��€ǜè袱劘����€いい櫙�吵吵吵吵吵瘯櫙�x||ppǜǜ尟暋吵吵吵�€い�瘯ǜ╬|pt��吵吵潳����痻||辅笝��吵吵吵�€い櫙�痻p|p|t��暀�������暋吵吵吵吵吵吵吵澊创创创创创创创创创创创创创创创创创创创创创创创磒|p||p|p|p|ppp|p〕������碀|t�吵吵吵吵�x|’�恷p|p|p尦�漷�悇���€尟痻’瘓��朝�埊瘽t�埑�xt�硤�x’瘈尦��硱劘瘽t�瘈尦吵硱劘�x〕�瘈▅p竸��潀t��集���x|櫙������瘯〕吵吵吵吵吵吵碀创创创创创创创创创创创创创创创创创创创创创创创创p|pp|p|p|p|p|p|p尟�吵吵吵吵朝瘣尟瘣|p|p|pǜ尟瘣尟瘓���€��悓�埑吵吵吵硤�悓�€|p|p|p|p劘瘣尦吵朝�吵吵吵硱父|p尟瘣||辅▅||��埊瘓�€��暋吵硤�埑吵吵朝晐p|p劘瘈pp||pt瘯櫙������瘯〕吵吵吵吵吵吵碀创创创创创创创创创创创创创创创创创创创创创创创创竝|父|p父p|父|p笇�悓�悓�悓�悇�€劘瘈劘瘈劘瘈櫙吵吵吵吵吵吵瘯櫙恷p|竝|竝|p尟暀瘓�瘓�埊�埊暀瘓�瘓�埊�埊暀����集�集暀�������暋吵�吵�吵�吵漰|t�xt�xt�x||櫙������瘯〕吵吵吵吵吵吵碀创创创创创创创创创创创创创创创创览览览览览览览览pppppppppppppppp家抑抑乙忠忠忠壹际蕏ppppppppt适技屯磐磐团团团屯紁pppptЁ'xppppp姬ВВЁ''棝臣姬�ppppppppt彲技洺'嫃瘚彄�儷紁ppppt儷儀ppppp純粙彄棝煟嫃摋浖紜彿儑嫃摚儑嫃技儑#儑##兗览览览览览览览览览览览览览览览览览览览览览览览览謹换悩敾粣様换悩様换磩盎淮劙换悩様炕换换换换豢悩剟|换换换换换x剟�靠靠换换靠靠哗�xpt|换换xpt|哗趴炕豢靠靠炕豢苛pt|换湢牋牑换xpt�换粚剟剟埢换哗�换换换换换换哗�换换换换换换哗�换换换换换换哗�换换换换换换哗�靠换靠靠换靠哗�湦换湢牑换湦哗�悢换愙鈹换悢哗�悢换愔迶换悢哗�窗换磩劙换窗哗�豢靠靠靠靠炕哗�粶牋牋牋牋せ哗�淮勌阝阝袆盎哗�换粣洲洲敾换哗�换淮勌袆盎换哗趴炕换粣敾换豢苛牋せ换淮盎换粶牑剟埢换换换换粚剟�换换换换换换哗�换换换换换换哗�换换换换换换哗趴炕豢炕豢炕豢苛牋せ粶せ粶せ粶牋槝敾粣敾粣敾粣槝槝敾粣敾粣敾粣迾樲敾淮盎淮盎粣洲樬斂靠换换换淮腾洲鉅牑换换换换刺种跇邪换豢靠炕淮剟绦盎换繙牋た哗�窗换换湗槝槫哗�换换换屘槝袌哗�换靠炕淮绦盎哗�豢湢た换窗换哗�粁虡衸换换换哗�换磩盎换换换哗�换换换换换换哗趴炕豢炕豢炕豢苛牋せ粶せ粶せ粶牋槝敾粣敾粣敾粣槝槝敾粣敾粣敾粣槝剟盎淮盎淮盎淮剟趴换换靠靠换换苛t|换换xpt|换换xp趴换换豢炕换换苛t|换换粁|换换粁p趴靠炕换换豢靠苛ptpt|换换换xptpt趴换换换换换换苛t|换换换换换换xp�换换换换换换哗�换换换换换换哗�换换换换换换哗趴换靠炕豢靠换苛牑换湢せ粶牑换湢様换悩敾粣様换悩様换悩敾粣様换悩邪换磩盎淮劙换刺敾换换靠靠换换粣斂靠炕xpt|豢靠繍槧牋せ豢炕粶牋牁樞剟埢粁|换寗勌槝斂换换换换换繍樞剕换换换换换x勌敾换换换换换换粣敾换豢靠靠炕换粣斂炕粶牋牋せ豢繍則|换寗剟剤换xp劖换换换换换换换┉豢靠靠换靠靠炕┉粶牋牑换湢牋せ┉粣槝様换悩槝敾┉粣槝様换悩槝敾┉淮剟劙换磩剟盎┡炕豢靠靠换靠靠義|换鋚pt杌讳ptpt趴换€靠縺换€靠苛x|换鋚pt杌讳ptpt趴换€靠縺换€靠苛x|换磒pt盎淮ptpt趴换换换换换换哗p|换换换换换换哗�换换换换换换哗�换换换换换换哗�换换换换换换哗趴靠换炕豢换靠苛牋牑换€换€换湢牋槝様换€换€换悩槝槝様换€换€换悩众掴邪换然蝗换刺槝众敾换换换换粣掴阝敾豢靠靠炕粣众剟盎粶牋牋せ淮剟趴换繍樷跇斂换苛t|换湗阝掴槫换xp趴换悩洲众様换苛t|换磩剟剟劙换xp�换换换换换换哗�换换换换换换哗�换换换换换换哗�换换换换换换哗趴炕豢靠靠炕豢苛牋せ粶牋牋せ粶牋槝敾粣槝槝敾粣槝槝敾粣槝槝敾粣槝剟盎淮剟剟盎淮剟趴炕豢靠炕豢靠哗pt|换xpt|换xp|哗�靠靠换靠靠换苛�xpt|换xpt|换xp趴炕换靠靠换豢苛pt|换粁pt|换粁pt趴换换换换换换苛t|换换换换换换xp�换换换换换换哗�换换换换换换哗�换换换换换换哗呕豢靠炕豢靠炕涣せ粶牋せ粶牋せ粶敾粣槝敾粣槝敾粣敾粣槝敾粣槝敾粣敾粣樞盎淮虡敾粣敾粣様换换悩敾粣敾淮劙换换磩盎粣斂炕换靠靠换豢繍槧せ换湢牑换粶牁鈽敾换悩様换粣槝迾敾换悩様换粣槝槝敾换悩様换粣槝剟盎换磩劙换淮剟�换换换换换换哗�换换换换换换哗�换换换换换换哗趴靠靠靠靠靠靠苛牋牋牋牋牋牋牋牋槝槝槝槝槝槝槝槝圹圹圹圹圹圹圹圹绦€蕴烫烫烫绦€蕴什€€€€€€€€€€€€厺苺€€€€€€€€€€€€€櫬畝€€€€€€€€€€€}暰獉€€€€€€€€€€€y懞�€€€€€€€€€€€u嵍�€€€€€€€€€€€q墍€€€€€€€€€€€€€€€€€€€哌哌哌哌€€€€€€€€圹圹圹圹€€€€哌哌坂噗坂噗哌哌圹圹坂噗坂噗圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹槝槝槝槝槝槝槝槝槝槝槝槝槝槝槝槝剟剟剟剟剟剟剟剟�豢靠炕豢靠炕哗�粶牋せ粶牋せ哗�粚剟埢粚剟埢哗趴靠炕换换豢靠苛牋牋せ换换粶牋牋剟剟埢换换粚剟剟�换靠靠靠靠换哗�换湢牋牋牑换哗�换寗剟剟剤换哗�换换GGGG换换哗�换换GGGG换换哗�换换换换换换哗�换换换换换换哗牋牋牋牋牋牋牋牋槝槝槝槝槝槝槝槝剟剟剟剟剟剟剟剟趴炕换豢炕换豢苛牋せ换粶せ换粶牋剟埢换粚埢换粚剟趴换换豢炕换换苛牑换换粶せ换换湢剤换换粚埢换换寗�换换靠靠换换哗�换换湢牑换换哗�换换寗剤换换哗�换换GGGG换换哗�换换GGGG换换哗�换换换换换换哗�换换换换换换哗牋牋牋牋牋牋牋牋槝槝槝槝槝槝槝槝剟剟剟剟剟剟剟剟趴靠换换换换换哗牋牑换换换换靠苛剟剤换换换换湢牋趴靠换换换换寗剟牋牑换换换换豢苛剟剤换换换换粶牋趴靠靠炕换换粚剟牋牋牋せ换换豢苛剟剟剟埢换换粚剟�换换换换换籊GG�换换换换换籊GG�换换换换换换换�换换换换换换换����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x���L€��������������������������������览 |