mkdep.mod 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. MODULE mkdep ;
  2. (* Synthetic two-module MC64 test for the Loader2 dep-chain :
  3. - STAK.MC4 : dependency-free sidecar. proc0 = empty TOINIT,
  4. proc1 = writes a host string (proves an extern call reached
  5. the dependency's code via MTBL slot 0 + cross-module call/leave).
  6. - DEP.MC4 : main module, dcnt=1, dep name "STAK". TOINIT
  7. extern-calls STAK.proc1, then end_program.
  8. Run : mkdep ; then mcint DEP.MC4 from the dir holding STAK.MC4.
  9. Expect one line from the STAK proc, exit 0. *)
  10. FROM FileIO IMPORT WriteFile ;
  11. FROM Console IMPORT Fatal ;
  12. FROM SYSTEM IMPORT ADR ;
  13. CONST
  14. HeaderSize = 64 ;
  15. DescName = 264 ;
  16. DescChecksum = 288 ;
  17. DescFlags = 292 ;
  18. DescVarCount = 293 ;
  19. DescDepCount = 294 ;
  20. DescProcs = 296 ;
  21. ProcTable = 304 ;
  22. CodeOff = 312 ;
  23. BufSize = 2048 ;
  24. TYPE
  25. Typ = (tStak, tDep) ;
  26. VAR
  27. buf : ARRAY [0 .. BufSize - 1] OF CHAR ;
  28. pcimg : CARDINAL ;
  29. i, p0, p1, sum, pt : CARDINAL ;
  30. which : Typ ;
  31. PROCEDURE Op (o : CARDINAL) ;
  32. BEGIN
  33. buf [HeaderSize + pcimg] := CHR (o MOD 256) ;
  34. INC (pcimg) ;
  35. END Op ;
  36. PROCEDURE OpB (o, b : CARDINAL) ;
  37. BEGIN
  38. Op (o) ;
  39. buf [HeaderSize + pcimg] := CHR (b MOD 256) ;
  40. INC (pcimg) ;
  41. END OpB ;
  42. PROCEDURE Put32 (off, v : CARDINAL) ;
  43. BEGIN
  44. buf [off] := CHR (v MOD 256) ;
  45. buf [off + 1] := CHR ((v DIV 256) MOD 256) ;
  46. buf [off + 2] := CHR ((v DIV 65536) MOD 256) ;
  47. buf [off + 3] := CHR (v DIV 16777216) ;
  48. END Put32 ;
  49. PROCEDURE Put64 (off : CARDINAL ; v : LONGCARD) ;
  50. VAR j : CARDINAL ;
  51. BEGIN
  52. FOR j := 0 TO 7 DO
  53. buf [off + j] := CHR (VAL (CARDINAL, v MOD 256)) ;
  54. v := v DIV 256 ;
  55. END ;
  56. END Put64 ;
  57. PROCEDURE ImmB (b : CARDINAL) ;
  58. BEGIN
  59. OpB (8DH, b) ;
  60. END ImmB ;
  61. PROCEDURE EStr (s : ARRAY OF CHAR) ;
  62. VAR len, k : CARDINAL ;
  63. BEGIN
  64. Op (8CH) ;
  65. len := LENGTH (s) + 1 ;
  66. buf [HeaderSize + pcimg] := CHR (len) ;
  67. INC (pcimg) ;
  68. FOR k := 0 TO LENGTH (s) - 1 DO
  69. buf [HeaderSize + pcimg + k] := s [k] ;
  70. END ;
  71. INC (pcimg, LENGTH (s)) ;
  72. buf [HeaderSize + pcimg] := 0C ;
  73. INC (pcimg) ;
  74. END EStr ;
  75. PROCEDURE PrintStr ;
  76. BEGIN
  77. ImmB (1) ;
  78. Op (0C3H) ;
  79. END PrintStr ;
  80. PROCEDURE Stak ; (* build STAK.MCD *)
  81. VAR st, s1 : CARDINAL ;
  82. BEGIN
  83. which := tStak ;
  84. FOR i := 0 TO BufSize - 1 DO
  85. buf [i] := 0C ;
  86. END ;
  87. buf [0] := 'M' ;
  88. buf [1] := 'C' ;
  89. buf [2] := '6' ;
  90. buf [3] := '4' ;
  91. buf [HeaderSize + DescName] := 'S' ;
  92. buf [HeaderSize + DescName + 1] := 'T' ;
  93. buf [HeaderSize + DescName + 2] := 'A' ;
  94. buf [HeaderSize + DescName + 3] := 'K' ;
  95. buf [HeaderSize + DescFlags] := CHR (4) ;
  96. buf [HeaderSize + DescVarCount] := CHR (0) ;
  97. buf [HeaderSize + DescDepCount] := CHR (0) ;
  98. pcimg := CodeOff ;
  99. (* proc0 : empty initializer *)
  100. p0 := pcimg ;
  101. Op (50H) ;
  102. (* proc1 : write "cross-module ok" via SYSTEM service 1 *)
  103. s1 := pcimg ;
  104. OpB (0D4H, 250) ;
  105. EStr ("cross-module ok") ;
  106. PrintStr ;
  107. OpB (85H, 0) ;
  108. pt := pcimg ;
  109. Put64 (HeaderSize + DescProcs, VAL (LONGCARD, pt)) ;
  110. Put64 (HeaderSize + pt, VAL (LONGCARD, p0) - VAL (LONGCARD, pt)) ;
  111. Put64 (HeaderSize + pt + 8,
  112. VAL (LONGCARD, s1) - VAL (LONGCARD, pt + 8)) ;
  113. INC (pcimg, 16) ;
  114. sum := 0 ;
  115. FOR i := HeaderSize TO HeaderSize + pcimg - 1 DO
  116. IF NOT ((i >= 352) AND (i <= 355)) THEN
  117. sum := sum + ORD (buf [i]) ;
  118. END ;
  119. END ;
  120. Put32 (HeaderSize + DescChecksum, sum) ;
  121. IF NOT WriteFile ("STAK.MC4", buf, HeaderSize + pcimg) THEN
  122. Fatal ("mkdep: cannot write STAK.MC4") ;
  123. END ;
  124. END Stak ;
  125. PROCEDURE Dep ; (* build DEP.MC4 *)
  126. VAR st0, dep : CARDINAL ;
  127. BEGIN
  128. which := tDep ;
  129. FOR i := 0 TO BufSize - 1 DO
  130. buf [i] := 0C ;
  131. END ;
  132. buf [0] := 'M' ;
  133. buf [1] := 'C' ;
  134. buf [2] := '6' ;
  135. buf [3] := '4' ;
  136. buf [HeaderSize + DescName] := 'D' ;
  137. buf [HeaderSize + DescName + 1] := 'E' ;
  138. buf [HeaderSize + DescName + 2] := 'P' ;
  139. buf [HeaderSize + DescFlags] := CHR (4) ;
  140. buf [HeaderSize + DescVarCount] := CHR (0) ;
  141. buf [HeaderSize + DescDepCount] := CHR (1) ;
  142. pcimg := CodeOff ;
  143. (* proc0 : TOINIT -> extern call STAK.proc1, then end_program *)
  144. st0 := pcimg ;
  145. OpB (0EFH, 0) ; Op (1) ; (* extern_call mod=0, proc=1 *)
  146. Op (50H) ;
  147. pt := pcimg ;
  148. Put64 (HeaderSize + DescProcs, VAL (LONGCARD, pt)) ;
  149. Put64 (HeaderSize + pt, VAL (LONGCARD, st0) - VAL (LONGCARD, pt)) ;
  150. INC (pcimg, 8) ;
  151. (* dependency name table at the image tail : "STAK" *)
  152. dep := pcimg ;
  153. buf [HeaderSize + dep] := 'S' ;
  154. buf [HeaderSize + dep + 1] := 'T' ;
  155. buf [HeaderSize + dep + 2] := 'A' ;
  156. buf [HeaderSize + dep + 3] := 'K' ;
  157. INC (pcimg, 8) ;
  158. sum := 0 ;
  159. FOR i := HeaderSize TO HeaderSize + pcimg - 1 DO
  160. IF NOT ((i >= 352) AND (i <= 355)) THEN
  161. sum := sum + ORD (buf [i]) ;
  162. END ;
  163. END ;
  164. Put32 (HeaderSize + DescChecksum, sum) ;
  165. IF NOT WriteFile ("DEP.MC4", buf, HeaderSize + pcimg) THEN
  166. Fatal ("mkdep: cannot write DEP.MC4") ;
  167. END ;
  168. END Dep ;
  169. BEGIN
  170. Stak ;
  171. Dep ;
  172. END mkdep.