Scaffold Kissaten Yugure; add M2 day spine, plan and script

Stage 1 (shop scene, customer, siphon brew minigame, serve loop) and the
M2 day spine: day counter, three-phase day, event-driven clock, journal
line, and a SaveState with magic/version/checksum.

Saving to disk is NOT working yet. A cartridge ROM can reach the Disk ROM
only from RAM (both PHYDIO and CALSLT switch page 1 out from under the
caller), and ROMDelayBoot is required so the Disk ROM's INIT runs at all.
With both in place the disk is detected, but sector I/O returns carry-clear
without transferring — proven with a sentinel. Probe now verifies the
buffer actually changed, so a non-working disk degrades to "no save"
rather than corrupting anything. Full findings in the project CLAUDE.md.

Also documented: keyboard reads need interrupt protection (the BIOS ISR
scans the matrix too), and BankedCall must stay off until banked data
exists.

Docs: PLAN.md (ten milestones, per-stage requirements, decision queue),
SCRIPT.md (all four character arcs, 60 beats, checked against the
26-character box), and amendment notes in DESIGN.md.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-27 21:58:22 +02:00
co-authored by Claude Opus 5
parent 4c33bdb880
commit 45749775fa
12 changed files with 3071 additions and 0 deletions
@@ -0,0 +1,35 @@
// Kissaten Yūgure - MSXgl project configuration
// MSX2 · SCREEN 5 · ASCII16 MegaROM (see docs/DESIGN.md §5)
// ASCII-safe name: used for output filenames (ROM, symbols, intermediates)
ProjName = "kissaten";
ProjModules = [ ProjName ];
LibModules = [ "system", "bios", "vdp", "print", "input", "memory", "math" ];
Machine = "2";
// ASCII16 MegaROM from day one: dialogue, portraits and music banks will not
// fit in 32KB (DESIGN.md §5). 16KB segments; segments 0-1 are the fixed main
// code at 4000h~BFFFh, segments 2+ are banked data (dialogue, art, music).
Target = "ROM_ASCII16";
ROMSize = 128;
ROMMainSegments = 2;
// Enable when banked data/code actually lands (stage 3 dialogue banks);
// with it on from day one, RAM globals were getting corrupted at runtime.
BankedCall = false;
CheckVersion = true; // MSX2 required (SCREEN 5, V9938 commands)
AddROMSignature = true;
// Required for disk saving. A cartridge's INIT normally runs *during* the BIOS
// slot scan and MSXgl never returns from it, so the Disk ROM's own INIT never
// happens — NMBDRV stays 0 and the PHYDIO hook is never patched. This option
// instead installs an H.STKE hook and returns to the scan, so the game starts
// after the disk system is up. Boot takes visibly longer as a result.
ROMDelayBoot = true;
AppSignature = true;
AppCompany = "JL";
AppID = "KY";
Verbose = true;