Compiler.def 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. DEFINITION MODULE Compiler ;
  2. (* TP3 single-pass Pascal -> 8086 compiler, in GNU Modula-2 (-fiso).
  3. Mirrors the original Turbo Pascal 3.0 compiler (TPSRC6 'turbo' entry,
  4. TPSRC7-10): a one-pass parser that reads the shared TextBuf as source
  5. and emits 8086 machine code directly into an internal code buffer, a
  6. patch list resolving forward references, TP3-style error reporting
  7. (error number + relative text position) and code/data size accounting.
  8. The shell (CmdCompile) will call Compile, then jump the editor to
  9. errPos on failure - exactly like the original errexit + editor2 path. *)
  10. FROM SYSTEM IMPORT BYTE ;
  11. FROM CompilerShared IMPORT ERes ;
  12. FROM CompilerSymbols IMPORT SymEntry ;
  13. PROCEDURE Compile (VAR errNo, errPos : CARDINAL) : BOOLEAN ;
  14. (* Compile the current TextBuf as a Pascal program. Returns TRUE on
  15. success (sizes available via CodeBytes / DataBytes). On failure
  16. returns FALSE, errNo carries the TP3-style error number and errPos
  17. the relative source offset (0-based) for the editor. *)
  18. PROCEDURE SetSource (path : ARRAY OF CHAR) ;
  19. (* Name the file the current TextBuf was loaded from. Only its directory is
  20. used: a {$I file} directive resolves the name against the including file's
  21. directory, so the compiler has to know where that file came from. The
  22. loaders (Shell.LoadWorkFile, CompileTest/ComTest LoadFile) call this; an
  23. unset name means includes resolve against the current directory. *)
  24. PROCEDURE CodeBytes () : CARDINAL ;
  25. (* emitted code size in bytes *)
  26. PROCEDURE DataBytes () : CARDINAL ;
  27. (* emitted data size in bytes - the program's own data, not counting the
  28. runtime or the fixed 4 KiB gap between code and data *)
  29. PROCEDURE ImageBytes () : CARDINAL ;
  30. (* total linked image size = runtime + program. This is what a .COM writer
  31. must emit, padded on to DataBase + DataBytes by the linker. *)
  32. PROCEDURE DataBase () : CARDINAL ;
  33. (* image-absolute offset of the data area, rtSz + 1000H. The linker places
  34. the program's globals here and zero-fills the gap after the code. *)
  35. PROCEDURE ImageByteAt (i : CARDINAL) : BYTE ;
  36. (* i-th byte of the whole image, runtime included, 0 past the end. This is
  37. what a .COM would actually start with. *)
  38. PROCEDURE CodeByteAt (i : CARDINAL) : BYTE ;
  39. (* i-th byte of the emitted image (0 past the end), so tests can check the
  40. generated 8086 code itself and not only its size *)
  41. (* Internal interface used by the expression and I/O modules. These are not
  42. part of the public shell/linker API. *)
  43. PROCEDURE Assignment (r : ERes) ;
  44. PROCEDURE BoundsOf (r : ERes ; VAR lo, hi : CARDINAL) : BOOLEAN ;
  45. PROCEDURE Compound () ;
  46. PROCEDURE DefBuiltins () ;
  47. PROCEDURE DefConst () ;
  48. PROCEDURE DefLabelPart () ;
  49. PROCEDURE DefPart () ;
  50. PROCEDURE DefType () ;
  51. PROCEDURE DefVar () ;
  52. PROCEDURE EmAddBxAx () ;
  53. PROCEDURE EmAddDiAx () ;
  54. PROCEDURE EmAddDiImm (n : CARDINAL) ;
  55. PROCEDURE EmAddSp (n : CARDINAL) ;
  56. PROCEDURE EmAndAlDl () ;
  57. PROCEDURE EmAndAlImm (v : CARDINAL) ;
  58. PROCEDURE EmAndClImm (v : CARDINAL) ;
  59. PROCEDURE EmCmpAlImm (v : CARDINAL) ;
  60. PROCEDURE EmCrtSeq (which : CARDINAL) ;
  61. PROCEDURE EmFileIo (reading : BOOLEAN ; fileLocal : BOOLEAN ; fileOff : CARDINAL ; addrKind : CARDINAL ; addrLocal : BOOLEAN ; addrOff, count : CARDINAL ; stringArg : BOOLEAN) ;
  62. PROCEDURE EmIncDi () ;
  63. PROCEDURE EmIncSi () ;
  64. PROCEDURE EmInlineCh (ch : CARDINAL) : CARDINAL ;
  65. PROCEDURE EmInlineCrLf () : CARDINAL ;
  66. PROCEDURE EmLdAlBx () ;
  67. PROCEDURE EmLdAlDi () ;
  68. PROCEDURE EmLdAlDiOff (off : CARDINAL) ;
  69. PROCEDURE EmLdAlSi () ;
  70. PROCEDURE EmLdAxDi () ;
  71. PROCEDURE EmLdDiGlob (off : CARDINAL) ;
  72. PROCEDURE EmLeaBx (off : CARDINAL) ;
  73. PROCEDURE EmLeaDi (local : BOOLEAN ; off : CARDINAL) ;
  74. PROCEDURE EmLeave () ;
  75. PROCEDURE EmLoadVar (local : BOOLEAN ; off, nbytes : CARDINAL) ;
  76. PROCEDURE EmLoadVarInd (off, nbytes : CARDINAL) ;
  77. PROCEDURE EmLoadVarIndSym (idx, nbytes : CARDINAL) ;
  78. PROCEDURE EmMovAxDi () ;
  79. PROCEDURE EmMovAxDs () ;
  80. PROCEDURE EmMovBxAx () ;
  81. PROCEDURE EmMovBxDi () ;
  82. PROCEDURE EmMovBxi (v : CARDINAL) ;
  83. PROCEDURE EmMovClAl () ;
  84. PROCEDURE EmMovDiAx () ;
  85. PROCEDURE EmMovDlImm (v : CARDINAL) ;
  86. PROCEDURE EmPopDi () ;
  87. PROCEDURE EmPushBp () ;
  88. PROCEDURE EmPushDi () ;
  89. PROCEDURE EmPushSi () ;
  90. PROCEDURE EmPushSymAddr (idx, off : CARDINAL) ;
  91. PROCEDURE EmPushVarAddr (local : BOOLEAN ; off : CARDINAL) ;
  92. PROCEDURE EmRet () ;
  93. PROCEDURE EmShlAxCl () ;
  94. PROCEDURE EmShlDlCl () ;
  95. PROCEDURE EmShrAx1 () ;
  96. PROCEDURE EmShrAxCl () ;
  97. PROCEDURE EmStDiAl () ;
  98. PROCEDURE EmStDiAlOff (off : CARDINAL) ;
  99. PROCEDURE EmStDiGlob (off : CARDINAL) ;
  100. PROCEDURE EmStDiImm (off, v : CARDINAL) ;
  101. PROCEDURE EmStoreInd (nbytes : CARDINAL) ;
  102. PROCEDURE EmStoreVar (local : BOOLEAN ; off, nbytes : CARDINAL) ;
  103. PROCEDURE EmStoreVarIndPrep (off : CARDINAL) ;
  104. PROCEDURE EmSubAlImm (v : CARDINAL) ;
  105. PROCEDURE EmSubSp (n : CARDINAL) ;
  106. PROCEDURE EmXorByteGlob (off, v : CARDINAL) ;
  107. PROCEDURE EmitFrameBase (level : CARDINAL) ;
  108. PROCEDURE EmitStaticLink (idx : CARDINAL) ;
  109. PROCEDURE HeadWord (VAR slot : CARDINAL) ;
  110. PROCEDURE IfMatchSemi () ;
  111. PROCEDURE Inittur () ;
  112. PROCEDURE IsOuterLocal (idx : CARDINAL) : BOOLEAN ;
  113. PROCEDURE LabelColonAhead () : BOOLEAN ;
  114. PROCEDURE LeaDiSym (idx, off : CARDINAL) ;
  115. PROCEDURE LoadSymVar (idx, off, nbytes : CARDINAL) ;
  116. PROCEDURE ParamSlotBytes (e : SymEntry) : CARDINAL ;
  117. PROCEDURE ParseType (VAR cls, size, elem : CARDINAL) ;
  118. PROCEDURE ProcFunc () ;
  119. PROCEDURE SlotSize (cls, size : CARDINAL) : CARDINAL ;
  120. PROCEDURE Statmnt () ;
  121. PROCEDURE StoreSymVar (idx, off, nbytes : CARDINAL) ;
  122. PROCEDURE StoreVarIndPrepSym (idx : CARDINAL) ;
  123. PROCEDURE SymEpi () ;
  124. PROCEDURE ParseLabelStmt () ;
  125. END Compiler.