The closer for the AppleMouse II card (plans/20260721-01, now complete). No
code — the as-built record and the config surface's documentation.
- notes/MOUSE.md: the as-built — synthetic firmware and the identification /
screen-hole map, the private DEVSEL protocol, the interrupt model and the
reusable maskable-IRQ line (so Mockingboard inherits it), and the
coordinate decision (absolute/mapped, revised from the plan's
relative/captured).
- README: the "What's emulated" list gains the AppleMouse II; a runnable
example (examples/mouse.json, a slot-4 mouse //e) checked by
readme_examples_parse.
- notes/JSON_CONFIG.md: the slot-card inventory gains "mouse" (one, any slot
1-7, both families); notes/STATE.md lists the Mou Persist fields;
notes/IDEAS.md ticks the AppleMouse item and points Mockingboard at the
shared IRQ line.
Gate: readme_examples_parse + standard gates (382 pass).
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Our `apple2e` was really the Enhanced //e (65C02 + 342-0303/0304 system
ROMs + the 342-0265 MouseText video ROM). Rename the config-level token
to the honest `apple2enhanced`, freeing `apple2e` for the true original
(unenhanced) //e that E2-E4 add. Mechanical, mirroring the
`2plus`->`apple2plus` rename (#308); no ROM or machine changes.
What moved (the config surface only):
- `config::Model` serde token + `Model::token()`; `git mv
configs/apple2e.json -> apple2enhanced.json` with model updated and
title made honest ("Apple //e" -> "Enhanced Apple //e", reserving
"Apple //e" for E4's original). BUILTINS re-sorts in place (apple2enhanced
sorts before apple2plus, so no manual reorder).
- The `Persist` INFO model string mirrors the token by design
(apple2/apple2plus/...), so it renames too, keeping save-states
self-describing as `apple2enhanced`.
- Every `"apple2e"` config-token literal in tests/error strings; usage
and `--config` help text; README, notes/JSON_CONFIG.md, notes/MAC_APP.md,
examples/myiie.json. Both JSON schemas regenerated from source
(EWM_UPDATE_SCHEMA=1), not hand-edited.
- `builtin:list` column widened 12->16 so the longer name still aligns.
Deliberately NOT touched (internal, renamed later by E3): the Rust
identifiers `TwoType::Apple2E` / `Model::TwoE`, the `two_e_*` test files,
and their "apple2e must construct" panic strings — they name the type,
which stays until E3 splits the two machines.
Verified: cargo fmt --all --check, cargo clippy --all-targets -D warnings,
and cargo test (359 pass, incl. the golden-BMP screenshots and
readme_examples_parse). Gate: `builtin:list` shows apple2enhanced; the old
`builtin:apple2e` errors "no built-in config ... (available: apple1,
apple2, apple2enhanced, apple2plus, replica1)".
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Spell out the two-family model tokens so every machine reads the same
way — apple1, apple2e, apple2plus, replica1 — ahead of adding the
original Apple ][ as `apple2` (plans/20260720-01). Pre-1.0, so the old
terse tokens go outright: `--set machine:model=2plus` and
`--config builtin:2plus` are now apple2plus / apple2e, and an old name
errors with the available list.
Mechanical and wide: the config::Model serde tokens and Model::token(),
the BUILTINS table (renamed, re-sorted, include_str paths), configs/
files (git mv 2plus.json/2e.json -> apple2plus.json/apple2e.json) and
their model values, the ewm/tests/configs fixtures, every "2plus"/"2e"
string literal in tests and error messages, the examples, both schemas,
and the live docs (README, JSON_CONFIG, IDEAS, MAC_APP). Guarded
word-boundary replacement so e2e, new_2e and hex escaped it. The
builtin:list column widened to fit the 10-char "apple2plus".
Verified: fmt, clippy -D warnings, the full suite (37 binaries incl.
golden-BMP and the README example check) pass; builtin:list and the
old-token error checked against the real binary.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Phase C5, the last phase of plans/20260718-02-config-sources.md.
The README's config section is rewritten around the compositional
model — one document, four source kinds merged in command-line order
(--config base, --config-overlay layers, --set overrides, convenience
flags on top) — with the Total Replay overlay as the worked example
and --config builtin:2e in the quick-start. The example configs are
now committed under examples/ (myiie.json and
drive-with-total-replay.json, shown verbatim in the README), so every
example references real files. --print-config closes the section as
the "what machine did I just describe?" / linter answer.
The gate's scripted check is the readme_two_examples_parse test in
two.rs: it extracts every `cargo run --release -- two ...` example
from the README (quote-aware, continuation-joining) and runs it
through parse_options, which opens every --config/--config-overlay
source — so a renamed flag, a bad example path, or an example config
that stops validating fails the suite.
Notes brought up to date: JSON_CONFIG.md's status table gains the
config-sources row (C1-C5 done) and Phase C is marked as seeded by
options_to_config; IDEAS.md moves machine config files from "in
progress" to "landed" with the remaining palette work named;
MAC_APP.md's Phase 3 bullet records that .ewmachine bundles can be a
thin layer over the landed source surface. Also fixes the --fps usage
text (the default is 40, not 30 — drift spotted during C4).
Verified: the README's composed, complete-config, and overlay-only
examples run against the real binary from the repo root (exit 0,
expected documents); fmt, clippy -D warnings, and the full suite
(including the golden-BMP screenshot tests) pass.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>