Records the initialisation order the parser fixture establishes and the three output paths output.s already provides, so the driver is wiring rather than new file handling; no driver source has landed yet. Generated with Codebuff Co-Authored-By: Codebuff <noreply@codebuff.com>main
| @@ -0,0 +1,111 @@ | |||
| --- | |||
| story: E07-S05 | |||
| owner: codebuff | |||
| status: in-progress | |||
| started: 2026-11-10 | |||
| depends-on: [E07-S01, E04-S01, E04-S06, E02-S04] | |||
| --- | |||
| # E07-S05 Claim | |||
| ## Intended change | |||
| A `n128c` PRG that runs on `x128` and is the compiler the launcher and disk | |||
| builder already assume: it takes a source name from the keyboard, loads that SEQ | |||
| file from drive 8 through the buffered PETSCII reader, runs lexer, parser and | |||
| pass-2 emission, writes `NAME.PRG` and `NAME.MAP` through `output.s`, and prints | |||
| a one-screen summary with the source name, the output name and the diagnostic | |||
| count. Failures print a stable message, write diagnostics to `NAME.ERR`, and | |||
| leave any previous output untouched. | |||
| ## File area | |||
| - `src/compiler/driver.s` (new): prompt, load, compile, output, summary | |||
| - `cfg/driver.cfg` (new, or `cfg/compiler.cfg` plus `output.s` if the extra | |||
| section fits): link layout for the whole compiler | |||
| - `scripts/build-driver.ps1` (new): builds `build/n128c.prg` | |||
| - `tests/driver/driver.n8`, `tests/driver/fail.n8` (new fixtures) | |||
| - `scripts/verify-driver-test.ps1` (new): drives the PRG through `x128` | |||
| `keybuf` on a copied image and checks the PRG, ERR, MAP and summary | |||
| - `docs/editor-workflow.md`, `docs/architecture.md`, `docs/decisions.md` | |||
| - `planning/claims/E07-S05.md` | |||
| - generated files under `build/driver-test/` | |||
| ## Acceptance criteria (from the story) | |||
| - [ ] `build/n128c.prg` is built by a documented script and is the file | |||
| `prepare-disk.ps1` injects and `launch-compiler.ps1` autostarts. | |||
| - [ ] The driver takes one source name, loads it from the session disk with no | |||
| host conversion, compiles, and writes the PRG named after the source. | |||
| - [ ] ERR and MAP outputs are written for the same run, with a one-screen | |||
| summary naming source, output and diagnostic count. | |||
| - [ ] A clean source produces a PRG that runs on `x128`; a failing source | |||
| produces the catalogued diagnostics, a non-zero count, and no PRG. | |||
| - [ ] Missing source, unreadable source and an existing output each end with | |||
| the documented message and leave the previous output intact. | |||
| - [ ] A test drives the driver through `scripts/launch-compiler.ps1` on a copied | |||
| development image and checks the artifacts. | |||
| - [ ] `docs/editor-workflow.md` documents the command and the recovery steps, | |||
| and E07-S04 can be completed with no undocumented command. | |||
| ## Coordination notes | |||
| - The pieces exist and are individually proven: `src_load`, `names_init`, | |||
| `diag_init`/`diag_finish`, `parse_file` and `sizing`; `output.s` already | |||
| implements `out_begin` (refuses an existing `NAME.PRG`/`NAME.MAP`), | |||
| `out_startup`, `out_section`, `out_byte`, `out_finish` and `out_abort`. | |||
| `tests/parser/parser-test.s` shows the exact compiler initialisation order: | |||
| `mmu_init`, `mmu_bank0`, then per file `src_load`, `names_init`, `diag_init`, | |||
| `parse_file`, `diag_finish`. | |||
| - `scripts/build-parser-test.ps1` links every compiler module against | |||
| `cfg/compiler.cfg`, so the driver's link set is that list plus `output.s` and | |||
| the runtime startup/print modules. The map has `MAIN` to `$B7FF` | |||
| (about 40 KB) and `BANK1` to `$BFFF`; `output.s` keeps its section, class, | |||
| method and table records in BSS, so the remaining budget must be measured | |||
| after the first link, not assumed. | |||
| - `out_begin` derives `NAME.PRG`/`NAME.MAP`/`NAME.ERR` by stripping a trailing | |||
| `.N8` from the source name and caps the base at 12 characters, which matches | |||
| the 16-character limit VICE's directory allows; the driver must validate the | |||
| typed name before calling it. | |||
| - `parse_file` only emits when `em_on` is set; the fixture path sets it, so the | |||
| driver has to set it for pass 2 and must call `parse_file_base` (not | |||
| `parse_file`) when pass-3 absolute addresses are known. That decision is part | |||
| of the driver, not the parser. | |||
| - Launching the PRG needs the same rule the editor learned in D151: it must be | |||
| started from the session disk (`n128c`), not from a host path, so its file | |||
| naming and drive device are the ones the session uses. | |||
| ## Work log | |||
| - Read `output.s`, the parser initialisation path, `cfg/compiler.cfg` and the | |||
| parser fixture's link and startup code to fix the driver's contract and the | |||
| module set it must link. | |||
| - Confirmed `output.s` already refuses to overwrite and scratches only files it | |||
| created, so the story's "leave the previous output intact" criterion is a | |||
| matter of aborting on `out_err` rather than adding new file logic. | |||
| - No driver source, config, build script or fixture has been written yet, so no | |||
| behaviour exists to verify. | |||
| ## Completion | |||
| - Tests run: none. The claim records the design and the discovered contracts; | |||
| nothing has landed, so it stays `in-progress`. | |||
| - Results: not applicable. | |||
| - Remaining risks: the whole compiler plus `output.s` plus the runtime print | |||
| module may not fit `MAIN`/`BANK1`; if it does not, the driver needs a section | |||
| split or `output.s` record limits reduced, which is a decision, not a tweak. | |||
| The summary must not use the compiler's own zero page while a compile is in | |||
| progress, and a source name longer than 12 base characters has to be rejected | |||
| before `out_begin` builds both names. | |||
| ## Next steps | |||
| 1. Write `src/compiler/driver.s` with the initialisation order above, a | |||
| `source:` prompt, name validation, `parse_file`/`parse_file_base`, and the | |||
| `out_*` calls; build it with a copy of `cfg/compiler.cfg`. | |||
| 2. Measure the link (`MAIN`/`BANK1` free bytes) and record the result; adjust or | |||
| raise a decision if it does not fit. | |||
| 3. Add `scripts/build-driver.ps1` producing `build/n128c.prg`, then the | |||
| verifier that copies a disk, injects the driver, types a fixture name, and | |||
| checks `NAME.PRG`, `NAME.MAP`, `NAME.ERR` and the summary. | |||
| 4. Update `docs/editor-workflow.md` and unblock E07-S04. | |||
Powered by TurnKey Linux.