ewm-core used to mean "everything headless", which put the Apple wiring
(pia, dsk, alc, chr, one, two) next to the generic CPU. The crates now
split kernel-vs-machine:
- ewm-core keeps only what is common to machines: cpu, mem, ins, fmt,
plus the CPU-level tests (Dormann, golden trace) and the benches.
- ewm gains a library target beside its binary and owns everything
Apple-specific: the devices (pia, dsk, alc, chr) and the machines.
one.rs and two.rs now each hold the machine *and* its SDL loop,
restoring the original one.c/two.c file layout. main.rs is the thin
ewm.c-style dispatcher over the library.
- The machine tests (boots, DOS 3.3 + CATALOG, language card) and the
headless example consoles move to ewm with the machines; the consoles
run as 'cargo run -p ewm --example ...' (README updated). scr stays
in the frontend, unchanged.
Pure code motion, no behavior change: all 39 tests pass unchanged.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Add the new screenshots to the README
The bootloader menu as the hero image, plus a gallery of the Replica 1,
a DOS 3.3 boot, Frogger and Bandits. The old 2016 screenshot the README
pointed at was deleted, so the previous image link was broken.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Escape the ][ in the Apple ][+ image alt text
The unescaped ] closed the image bracket early and broke the
markdown rendering of the gallery table.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Fresh structure: what's emulated, requirements, build/run/test
instructions, key bindings, the headless consoles, and an explicit
under-development note. The old C-era goals checklist and the
first-person intro from 2016 are replaced; history points at
REWRITE.md and the git history for the original C.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Phase 9: remove the C tree, promote the Rust workspace to the root
Pure git mv / git rm plus the mechanical path fixes:
- Delete src/*.c, src/*.h, src/Makefile, src/CMakeLists.txt, the Lua
scripts, .travis.yml, and scripts/gen-golden-trace.* (the golden
trace regeneration needed the C tree; the checked-in golden file is
now frozen — regenerating requires the C from git history).
- git mv src/rom -> rom and rust/* -> the repo root.
- Fix include_bytes! and test paths for the new layout (src/rom ->
rom, one directory level less). No other code changes.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Phase 9: CI drops the C job; ignore /target
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Phase 9: rewrite README for the Rust build; REWRITE.md complete
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Phase 9: rustfmt after the path shortening
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
- Benches: cpu_bench.c and mem_bench.c ported as plain std::time
cargo benches (harness = false, no criterion), same output formats
so C and Rust numbers compare directly. The mem addressing helpers
in ins.rs become pub, mirroring mem.h. Numbers recorded in
REWRITE.md: parity or better on most paths (Rust ADC 2x faster,
JSR 1.7x faster; ind* modes ~2.5x slower from dyn Bus dispatch —
all orders of magnitude beyond the 1.023 MHz requirement).
- --trace wired end to end: Cpu grows a trace sink written before
each step via the fmt.rs formatters ('PC: disassembly state');
both frontends open it from --trace[=file]. In C the write path
was dead code — recorded as a documented divergence. Unit-tested
against exact expected lines, and smoke-tested (767k lines from a
3s replica1 run, matching the Woz monitor reset sequence).
- --strict audited: accepted but inert at runtime in both C and Rust
(the only runtime caller of irq/nmi discards the error) — recorded
as quirk #7.
- REWRITE.md: flag-by-flag and feature-by-feature parity checklist,
a new 'Documented divergences' section (exact --flag parsing, no
PC in unexpected-I/O messages, frame-sampled joystick, working
--trace, Rust-only --screenshot, the skipped dsk.c OOB write,
no Lua), bench numbers, Phase 8 -> Done.
- README: 'Building the Rust version' section.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* Phase 0: Rust workspace scaffolding + CI
Adds the parallel Rust workspace under rust/ per REWRITE.md:
- ewm-core (headless lib, zero dependencies) and ewm (binary,
declares sdl2 now so CI installs SDL2 headers from day one;
prints the same usage line as the C binary)
- rust-toolchain.toml pinning 1.91.1 with rustfmt + clippy
- GitHub Actions CI: C build job (ubuntu + libsdl2-dev) and Rust
job (fmt --check, clippy -D warnings, test)
- Anchor the 'ewm' gitignore pattern to src/ so rust/ewm is tracked;
ignore rust/target/
- README note pointing at REWRITE.md
The C tree in src/ is untouched.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* CI: build the C tree on macOS
gcc on ubuntu fails -Werror with -Wimplicit-fallthrough in two.c;
src/ is frozen until Phase 9, so build C where it has always built
(macOS, as Travis did).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* CI: point clang at the Homebrew prefix via CPATH/LIBRARY_PATH
The committed Makefile does not search /opt/homebrew, so SDL2
headers are not found on the arm64 macOS runner. src/ is frozen,
so pass the paths through the environment instead.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>