Files
Stefan ArentzandClaude Opus 4.8 f246e72fd5 Add the original (unenhanced) //e machine (//e original-plan E3) (#320)
* Rename the Enhanced //e identifiers (E3 prep)

Mechanical prep for the original //e: the Rust variants that name the
Enhanced machine become `TwoType::Apple2EEnhanced` / `Model::TwoEEnhanced`,
freeing the plain `Apple2E` / `TwoE` for the original //e that the next
commit adds. Kickoff decision (owner): the plain name is the *original*
machine, matching `Two` = original ][ and the config tokens (apple2e =
original, apple2enhanced = Enhanced).

Word-boundary-guarded rename across ewm/src + ewm/tests (86 Apple2E, 11
TwoE). No behavior change: the serde tokens are untouched (Model::TwoEEnhanced
keeps rename = "apple2enhanced"), so the schema is byte-unchanged, and the
golden-BMP //e screenshots are identical. cargo test 361 pass.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* Add the original (unenhanced) //e machine (//e original-plan E3)

`model: apple2e` is now a real machine: a 6502 //e with the unenhanced
342-0134/0135 system ROMs and the 342-0133 video ROM, alongside the
Enhanced //e (65C02, 342-0303/0304, MouseText). Kickoff naming (owner):
`Model::TwoE` / `TwoType::Apple2E` = the original (the plain name), the
Enhanced kept the `*Enhanced` names from the prep commit.

- config: `Model::TwoE` (token `apple2e`) joins the enum; family / token /
  two_type / the aux + slot-0 //e validation all cover both //e models.
- two.rs: `TwoType::Apple2E` + `TwoType::is_iie()`; `new_2e` takes the
  variant and selects (6502, unenhanced ROMs) or (65C02, Enhanced ROMs);
  `IouE::new` takes the CD/EF halves. The `Persist` INFO string and
  `--print-config` mapping gain the `apple2e` arm. Schemas regenerated.
- rendering: `Scr` holds both //e glyph sets and picks by variant; the
  five `== Apple2E` //e-detection sites become `is_iie()` (the original
  and Enhanced //e render identically apart from the character ROM).

The one real subtlety — the original //e is NOT a plain ROM swap. Its
video ROM stores plain upper case at `$40-$5F`, but the original //e
*displays* inverse upper case there (the glyphs Apple later replaced with
MouseText). So `alternate_index` gains a `mousetext` flag: the Enhanced
set reads MouseText straight from ROM, the original inverts the upper-case
glyph — the same steady inverse glyph the primary set flashes.
(`render_txt_row_80` also dropped its redundant `line_offset` arg, derived
from `row`, to stay under clippy's argument limit.)

Gates (all green): the Enhanced //e is byte-identical — the golden-BMP
screenshots don't move; a golden pins the composed original-//e $E000-$FFFF
to the unenhanced EF half (and different from the Enhanced); the bare
original //e cold-boots to `]` on the 6502; and a char test proves the
alternate $40-$5F is inverse upper case, distinct from Enhanced MouseText.
cargo fmt / clippy -D warnings / cargo test (364 pass).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 23:43:01 -04:00
..