# Frontend: COMPILE = Pass1 + Statemen + Express No `.MOD` decompiled yet — only `compile.txt` (74) / `pass1.txt` (2975) / `statement.txt` (1793) / `express.txt` (3898). Names below are inferred (`~` = internal, no header). ## COMPILE dispatcher `COMPILE.DIR/ = COMPILE.MCD` (link stub) + `PASS1/STATEMEN/EXPRESS.MCD`. `compile.txt` is a char-compare + byte-copy loop with `call .proc24` (`~FindKeyword/~StrCmp`), i.e. the link stub's keyword-hash helper, not a parser. Loaded by `Scanner.Compile`; `GENZ80` loaded afterwards if `Compiler.global25`. Token codes used everywhere: `Scanner.word5` = current symbol, `word9` = ident class, `word11` = text, `word12` = type. ## Pass1 — declarations/scopes/types | proc | proposed | |---|---| | proc4/5 | `~PushTempMark/~PopTempMark` (bracket `EXPRESS.proc1(err 82)`) | | proc6/7 | `~AllocSymEntry/~LinkSymEntry` | | proc1 | `~InsertSetConst` | | proc2/3 | `~CondInsert/~InsertEntry` | | proc8 | `~OpenScopeEmit` (`CODEGEN.proc18/21/3`) | | proc12 | `~TypeSizeRec` (recursive, self-call) | | proc13 | `~GetIdent` (returns `Scanner.word12`) | | proc16 | `~ParseImportItem` (`Expect(42)`=FROM?) | | proc17 | `~ParseConstDecl` | | proc18 | `~ParseVarDecl` | | proc19 | `~ParseType` (largest: enum/subrange/pointer/PROC/record/array) | | proc14 | `~ParseRecordType` (incl. variant) | | proc15/20/21 | `~ParseFormals/~ParseValParam/~ParseVarParam` | | proc22 | `~ParseFieldList` | | proc23 | `~EvalConstExpr` | | proc25 | `~CloseScopeFixup` | | PROCDE | `ParseProcedureDecl` | | MODULD/MODBLO/MAINDE | `ParseModuleHead/ParseBlock/ParseMain(DEFINITION/IMPLEMENTATION/PROGRAM)` | | proc28 | `~ParseExportList` | | DCL/DCLS/IMEXDC | `ParseOneDecl/ParseDecls/ParseImports` (`ERRORS.proc11`, `CODEGEN.proc22` recovery) | | proc9/33/35/34/36/PASS1 | `~WriteSym/~WriteMcdHeader/~EmitConst/~EmitType/~CheckForwards/Main` | ## Statemen — statements * Internal: `proc1 ~NextSymWrap`, `proc4 ~ParseStatSeqLoop`, `proc15 ~EmitJumpFixup`, `proc2 ~CalcMemOffset`, `proc3 ~SyncToStatStart`. * `STMT = ParseStatement`: `switch(word5)`: `121..130 -> proc10..proc5` (IF/WHILE/REPEAT/LOOP/WITH/CASE/...); ident-led: `word9=4` call (`EXPRESS.proc15`+`Expect(43)`=`(`), `=5` assign (`EXPRESS.proc17/18`+`Expect(27)`=`:=`), `=0` error 128. * `proc5 = ParseFOR` (largest frame), `proc16 = ParseCASE`, `proc6..14 = ParseIF/WHILE/REPEAT/...`, `proc17/18/19` block tails, `BODY = ParseBeginBlock`, `STATSE = GuardedStatSeq` (saves `Scanner.word2/25, CODEGEN.word2, SYMTAB.word5`; `ERRORS.proc11` recovery). ## Express — expressions * `EXPRES = ParseExpression`: `proc48 SimpleExpr` then relops `51..57` (`=/#//>=/IN`), `CODEGEN.proc17(23)+proc6`, `proc35`-fold, `proc27`-join; const path `CODEGEN.proc4`, general `CODEGEN.proc10(4)`. * Helpers: `proc48 ~ParseSimpleExpr`, `proc37/38/40/41/42 ~Term/Factor/Set/Call/Cast`, `proc21/20/15 ~DesignatorBase/Selector/Tail`, `ASSIGN ~ParseAssign` (stmt + func-result), `proc35 ~FoldConstOp`, `proc9 ~MatchOpClass`, `proc7/8/13/14/16 ~ConstToCard/Int/GetVal/GetType/EvalConst`, `proc43..46 ~ExpandStdProc`, `proc47/51/50/49 ~FoldRel/CheckRel/EmitCmp/EmitRange`, `proc18/19 ~Load/StoreOperand`, `proc4/5 ~Push/PopExprDesc`. Shared: `Scanner.proc1/4/8/9/13/17/19/20` (Get/Accept/Expect/Test/OpenScope/entries), `EXPRESS.proc1` central error (47/52/61/82/73/74), `CODEGEN.proc1/3/4/6/10/12/13/14/16/17/18/19/21/22`. Decompile order: `EXPRES/proc48/proc35/proc9 -> STMT/STATSE/proc4 -> CASE/FOR -> Pass1 proc13/19/14 -> DCL/DCLS/IMEXDC -> PROCDE/MODBLO/MAINDE -> WriteSym`.