DEFINITION MODULE Compiler ; (* TP3 single-pass Pascal -> 8086 compiler, in GNU Modula-2 (-fiso). Mirrors the original Turbo Pascal 3.0 compiler (TPSRC6 'turbo' entry, TPSRC7-10): a one-pass parser that reads the shared TextBuf as source and emits 8086 machine code directly into an internal code buffer, a patch list resolving forward references, TP3-style error reporting (error number + relative text position) and code/data size accounting. The shell (CmdCompile) will call Compile, then jump the editor to errPos on failure - exactly like the original errexit + editor2 path. *) FROM SYSTEM IMPORT BYTE ; FROM CompilerShared IMPORT ERes ; FROM CompilerSymbols IMPORT SymEntry ; PROCEDURE Compile (VAR errNo, errPos : CARDINAL) : BOOLEAN ; (* Compile the current TextBuf as a Pascal program. Returns TRUE on success (sizes available via CodeBytes / DataBytes). On failure returns FALSE, errNo carries the TP3-style error number and errPos the relative source offset (0-based) for the editor. *) PROCEDURE SetSource (path : ARRAY OF CHAR) ; (* Name the file the current TextBuf was loaded from. Only its directory is used: a {$I file} directive resolves the name against the including file's directory, so the compiler has to know where that file came from. The loaders (Shell.LoadWorkFile, CompileTest/ComTest LoadFile) call this; an unset name means includes resolve against the current directory. *) PROCEDURE CodeBytes () : CARDINAL ; (* emitted code size in bytes *) PROCEDURE DataBytes () : CARDINAL ; (* emitted data size in bytes - the program's own data, not counting the runtime or the fixed 4 KiB gap between code and data *) PROCEDURE ImageBytes () : CARDINAL ; (* total linked image size = runtime + program. This is what a .COM writer must emit, padded on to DataBase + DataBytes by the linker. *) PROCEDURE DataBase () : CARDINAL ; (* image-absolute offset of the data area, rtSz + 1000H. The linker places the program's globals here and zero-fills the gap after the code. *) PROCEDURE ImageByteAt (i : CARDINAL) : BYTE ; (* i-th byte of the whole image, runtime included, 0 past the end. This is what a .COM would actually start with. *) PROCEDURE CodeByteAt (i : CARDINAL) : BYTE ; (* i-th byte of the emitted image (0 past the end), so tests can check the generated 8086 code itself and not only its size *) (* Internal interface used by the expression and I/O modules. These are not part of the public shell/linker API. *) PROCEDURE Assignment (r : ERes) ; PROCEDURE BoundsOf (r : ERes ; VAR lo, hi : CARDINAL) : BOOLEAN ; PROCEDURE Compound () ; PROCEDURE DefBuiltins () ; PROCEDURE DefConst () ; PROCEDURE DefLabelPart () ; PROCEDURE DefPart () ; PROCEDURE DefType () ; PROCEDURE DefVar () ; PROCEDURE EmAddBxAx () ; PROCEDURE EmAddDiAx () ; PROCEDURE EmAddDiImm (n : CARDINAL) ; PROCEDURE EmAddSp (n : CARDINAL) ; PROCEDURE EmAndAlDl () ; PROCEDURE EmAndAlImm (v : CARDINAL) ; PROCEDURE EmAndClImm (v : CARDINAL) ; PROCEDURE EmCmpAlImm (v : CARDINAL) ; PROCEDURE EmCrtSeq (which : CARDINAL) ; PROCEDURE EmFileIo (reading : BOOLEAN ; fileLocal : BOOLEAN ; fileOff : CARDINAL ; addrKind : CARDINAL ; addrLocal : BOOLEAN ; addrOff, count : CARDINAL ; stringArg : BOOLEAN) ; PROCEDURE EmIncDi () ; PROCEDURE EmIncSi () ; PROCEDURE EmInlineCh (ch : CARDINAL) : CARDINAL ; PROCEDURE EmInlineCrLf () : CARDINAL ; PROCEDURE EmLdAlBx () ; PROCEDURE EmLdAlDi () ; PROCEDURE EmLdAlDiOff (off : CARDINAL) ; PROCEDURE EmLdAlSi () ; PROCEDURE EmLdAxDi () ; PROCEDURE EmLdDiGlob (off : CARDINAL) ; PROCEDURE EmLeaBx (off : CARDINAL) ; PROCEDURE EmLeaDi (local : BOOLEAN ; off : CARDINAL) ; PROCEDURE EmLeave () ; PROCEDURE EmLoadVar (local : BOOLEAN ; off, nbytes : CARDINAL) ; PROCEDURE EmLoadVarInd (off, nbytes : CARDINAL) ; PROCEDURE EmLoadVarIndSym (idx, nbytes : CARDINAL) ; PROCEDURE EmMovAxDi () ; PROCEDURE EmMovAxDs () ; PROCEDURE EmMovBxAx () ; PROCEDURE EmMovBxDi () ; PROCEDURE EmMovBxi (v : CARDINAL) ; PROCEDURE EmMovClAl () ; PROCEDURE EmMovDiAx () ; PROCEDURE EmMovDlImm (v : CARDINAL) ; PROCEDURE EmPopDi () ; PROCEDURE EmPushBp () ; PROCEDURE EmPushDi () ; PROCEDURE EmPushSi () ; PROCEDURE EmPushSymAddr (idx, off : CARDINAL) ; PROCEDURE EmPushVarAddr (local : BOOLEAN ; off : CARDINAL) ; PROCEDURE EmRet () ; PROCEDURE EmShlAxCl () ; PROCEDURE EmShlDlCl () ; PROCEDURE EmShrAx1 () ; PROCEDURE EmShrAxCl () ; PROCEDURE EmStDiAl () ; PROCEDURE EmStDiAlOff (off : CARDINAL) ; PROCEDURE EmStDiGlob (off : CARDINAL) ; PROCEDURE EmStDiImm (off, v : CARDINAL) ; PROCEDURE EmStoreInd (nbytes : CARDINAL) ; PROCEDURE EmStoreVar (local : BOOLEAN ; off, nbytes : CARDINAL) ; PROCEDURE EmStoreVarIndPrep (off : CARDINAL) ; PROCEDURE EmSubAlImm (v : CARDINAL) ; PROCEDURE EmSubSp (n : CARDINAL) ; PROCEDURE EmXorByteGlob (off, v : CARDINAL) ; PROCEDURE EmitFrameBase (level : CARDINAL) ; PROCEDURE EmitStaticLink (idx : CARDINAL) ; PROCEDURE HeadWord (VAR slot : CARDINAL) ; PROCEDURE IfMatchSemi () ; PROCEDURE Inittur () ; PROCEDURE IsOuterLocal (idx : CARDINAL) : BOOLEAN ; PROCEDURE LabelColonAhead () : BOOLEAN ; PROCEDURE LeaDiSym (idx, off : CARDINAL) ; PROCEDURE LoadSymVar (idx, off, nbytes : CARDINAL) ; PROCEDURE ParamSlotBytes (e : SymEntry) : CARDINAL ; PROCEDURE ParseType (VAR cls, size, elem : CARDINAL) ; PROCEDURE ProcFunc () ; PROCEDURE SlotSize (cls, size : CARDINAL) : CARDINAL ; PROCEDURE Statmnt () ; PROCEDURE StoreSymVar (idx, off, nbytes : CARDINAL) ; PROCEDURE StoreVarIndPrepSym (idx : CARDINAL) ; PROCEDURE SymEpi () ; PROCEDURE ParseLabelStmt () ; END Compiler.