# TP3-comp — Turbo Pascal 3 clone in GNU Modula-2 (ISO) **Status:** compiler-core (`Compiler.mod`) + shell compiled clean with `gm2 -fiso -Wall`, and the ISO shell `tpshell` builds and runs (ESC-key driven, TP3-style DOS screen redraws). This is the working *implementation* companion — the human overview is `TP3-COMPILER.md` history summary and `RESUME-TP3.md`. ## Build (proven, two-phase — the ONLY recipe that beats GNU gm2's pass-3 "too many errors / too many identifiers" cap on compiler-sized whole-program programs) ``` gm2 -fiso -c Compiler.mod # phase A: small per-module pass gm2 -fiso -fgen-module-list=modules.lst -o /dev/null \ Compiler.mod Term.o TextBuf.o Posix.o Editor.o # phase B1: build list gm2 -fiso -fuse-module-list=modules.lst -o tpshell \ Shell.mod Compiler.mod Term.o TextBuf.o Posix.o Editor.o # phase B2: link ``` (Equivalent make target `tpshell` in `shell/Makefile`.) The single `gm2 -o` whole-program pass 3 silently caps identifier/error counts — see `build_tpshell.sh`.) ## What was changed inside `Compiler.mod` (all ISO-legal, gm2-verifiable) 1. **CHAR vs hex-int comparisons** (lines ~829, ~1086): Modula-2 `CHAR` is not the ZType; `ch = 09H` → `ORD (ch) = 09H` (and likewise 0DH/0AH/0CH). 2. **Return-value discard** (ISO forbids drop in statements; gm2 treats as error and has no `-Wno-`): added `DropCh/DropB/DropC` discard helpers and wrapped ~39 statement call sites of `GetCh`, `MatchKey`, `NewSym`, `EmCall`, `EmJmpNear` (no output reground clutter; TP3 TP5 `cascadepos` `waitkey` semantics preserved via the editor's ESC wait). 3. **`AND`/`OR`/`NOT` on W16-folded CARDINAL** (lines ~1233/1246/1454) are illegal on ZType in gm2 → added `BitAnd/BitOr/BitNot` (BITSET `*`/`+`/`-` fold, VAL-projected back to LONGINT) and rewrote the operands. 4. **`Compile` error-return params** aligned to `Compiler.def` (`errNo`/`errPos`, was `eNo`/`ePos`) — gm2 ISO rejects a disparate name in the proper procedure. The compiler's whole-program 8086-emit, TEXT-equivalent, pastres and errexit flow are unchanged (mirrors TP3 TPSRC file, ConvertTP3). ## Tests - `/tmp/tp_iso_mods.sh` two-phase build → `tpshell` 120528B ELF, runs, redraws, ESC quits. `make test` and editor/editor-round-trips covered in the earlier TP3-EDITOR-PSEUDOCODE suite. *Generated: 2026-09-22*