PMD.MOD 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. (* Release 3.00 *)
  2. (* Copyright (C) 1987..1991 Jensen & Partners International *)
  3. (*# call(seg_name=>null) *)
  4. (*# name(prefix=>c) *)
  5. (*# module(implementation=>off) *)
  6. (*# check(stack=>off,
  7. index=>off,
  8. range=>off,
  9. overflow=>off,
  10. nil_ptr=>off) *)
  11. IMPLEMENTATION MODULE PMD;
  12. (*%F _OS2 *)
  13. IMPORT Str, CoreSig, CoreIO, CorePMD, CoreMain;
  14. (*%E *)
  15. (*%T _OS2 *)
  16. IMPORT Str, Dos, CoreSig, CoreIO, CorePMD, CoreMain;
  17. (*%E *)
  18. TYPE SegHeader = RECORD
  19. frame: CARDINAL;
  20. SegSize: CARDINAL;
  21. FilePos: LONGCARD;
  22. BucketSizes: ARRAY [0..15] OF CARDINAL;
  23. END;
  24. (*%T _OS2 *)
  25. SelInfo = RECORD
  26. selector, size: CARDINAL;
  27. END;
  28. CONST
  29. MAX_SELS = 256;
  30. VAR
  31. selectors: ARRAY [0..MAX_SELS] OF SelInfo;
  32. (*%E *)
  33. CONST
  34. ErrMsg ="Runtime Error - Creating PM_DUMP.$$$";
  35. (*%T _OS2 *)
  36. PROCEDURE Os2Write(handle: CARDINAL; buffer: FarADDRESS; count: CARDINAL): CARDINAL;
  37. VAR
  38. NumWrit: CARDINAL;
  39. BEGIN
  40. IF Dos.Write(handle, buffer, count, NumWrit) = 0 THEN
  41. RETURN NumWrit;
  42. END;
  43. RETURN MAX(CARDINAL);
  44. END Os2Write;
  45. PROCEDURE GetSelectors(): CARDINAL;
  46. VAR
  47. CurSel: CARDINAL;
  48. attempt, size: CARDINAL;
  49. BEGIN
  50. CurSel:=0;
  51. attempt:=0FH;
  52. WHILE attempt # 0FFFFH DO
  53. size := CorePMD.lsl(attempt);
  54. IF size # 0 THEN
  55. selectors[CurSel].size:=size+1;
  56. selectors[CurSel].selector:=attempt;
  57. INC(CurSel);
  58. IF CurSel = MAX_SELS THEN
  59. RETURN CurSel;
  60. END;
  61. END;
  62. INC(attempt, 10H);
  63. END;
  64. attempt:=07H;
  65. WHILE attempt # 0FFF7H DO
  66. size := CorePMD.lsl(attempt);
  67. IF size # 0 THEN
  68. selectors[CurSel].size:=size+1;
  69. selectors[CurSel].selector:=attempt;
  70. INC(CurSel);
  71. IF CurSel = MAX_SELS THEN
  72. RETURN CurSel;
  73. END;
  74. END;
  75. INC(attempt, 10H);
  76. END;
  77. RETURN CurSel;
  78. END GetSelectors;
  79. PROCEDURE WriteStruct(VAR State: ProcessState; fh: INTEGER): INTEGER;
  80. BEGIN
  81. IF Os2Write(fh, FarADR(State), SIZE(ProcessState)) # SIZE(ProcessState) THEN
  82. RETURN -1;
  83. END;
  84. RETURN 0;
  85. END WriteStruct;
  86. (*%E *)
  87. (*%F _OS2 *)
  88. PROCEDURE WriteStruct(VAR State: ProcessState; fh: INTEGER): INTEGER;
  89. BEGIN
  90. IF CoreIO._write(fh, ADR(State), SIZE(ProcessState)) # SIZE(ProcessState) THEN
  91. RETURN -1;
  92. END;
  93. RETURN 0;
  94. END WriteStruct;
  95. (*%E *)
  96. PROCEDURE compress(VAR header: SegHeader; fh: INTEGER): INTEGER;
  97. VAR
  98. SegSize: LONGINT;
  99. offset: CARDINAL;
  100. OutSize, BucketNo, BucketSize, NumWritize, NumWrit: CARDINAL;
  101. BEGIN
  102. SegSize:= LONGCARD(header.SegSize);
  103. IF SegSize = 0 THEN
  104. SegSize:=10000H;
  105. END;
  106. offset:=0;
  107. BucketNo:=0;
  108. WHILE SegSize > 0 DO
  109. IF SegSize > 1000H THEN
  110. OutSize:=1000H;
  111. ELSE
  112. OutSize:= CARDINAL(SegSize);
  113. END;
  114. BucketSize:= CorePMD._Pack(OutSize, [header.frame: offset]);
  115. header.BucketSizes[BucketNo]:=BucketSize;
  116. (*%F _OS2 *)
  117. IF CoreIO._dos_write(fh, FarADR(CorePMD._p), BucketSize, NumWrit) # 0 THEN
  118. (*%E *)
  119. (*%T _OS2 *)
  120. IF Os2Write(fh, FarADR(CorePMD._p), BucketSize) # BucketSize THEN
  121. (*%E *)
  122. RETURN -1;
  123. END;
  124. DEC(SegSize, 1000H);
  125. INC(offset, 1000H);
  126. INC(BucketNo);
  127. END;
  128. RETURN 0;
  129. END compress;
  130. (*%F _OS2 *)
  131. PROCEDURE WriteCore(fh: INTEGER; top, bottom: CARDINAL);
  132. VAR
  133. h: SegHeader;
  134. TotalParas: CARDINAL;
  135. Segment: CARDINAL;
  136. SegTotal: CARDINAL;
  137. SegNum: CARDINAL;
  138. NumToWrite: CARDINAL;
  139. BEGIN
  140. Segment:=bottom;
  141. SegNum:=0;
  142. TotalParas:=top-bottom;
  143. SegTotal:=(TotalParas+0FFFH) DIV 01000H;
  144. IF CoreIO.lseek(fh, LONGCARD((SIZE(ProcessState)+SIZE(CARDINAL)+(SIZE(SegHeader)*SegTotal))-1), 0) # 0 THEN END;
  145. CoreIO._write(fh, ADR(Segment), 1);
  146. LOOP
  147. IF TotalParas = 0 THEN EXIT END;
  148. h.frame:=Segment;
  149. IF TotalParas < 1000H THEN
  150. NumToWrite:=TotalParas
  151. ELSE
  152. NumToWrite:= 1000H;
  153. END;
  154. h.SegSize:=NumToWrite<<4;
  155. h.FilePos:=CoreIO.lseek(fh, 0, 2);
  156. IF compress(h, fh) = -1 THEN
  157. SegTotal:=0;
  158. EXIT;
  159. END;
  160. IF CoreIO.lseek(fh, LONGCARD(SIZE(ProcessState)+SIZE(CARDINAL)+SIZE(SegHeader)*SegNum), 0) # 0 THEN END;
  161. INC(SegNum);
  162. CoreIO._write(fh, ADR(h), SIZE(SegHeader));
  163. INC(Segment, NumToWrite);
  164. DEC(TotalParas, NumToWrite);
  165. END;
  166. IF CoreIO.lseek(fh, (SIZE(ProcessState)), 0) # 0 THEN END;
  167. CoreIO._write(fh, ADR(SegTotal), SIZE(CARDINAL));
  168. RETURN;
  169. END WriteCore;
  170. PROCEDURE _PMDbody(VAR state: ProcessState);
  171. TYPE
  172. A2 = ARRAY [0..1] OF CHAR;
  173. VAR
  174. fh: INTEGER;
  175. Ln: A2;
  176. BEGIN
  177. Ln[0]:= CHAR(0DH);
  178. Ln[1]:= CHAR(0AH); (* NB *)
  179. IF CoreMain._argc # 0 THEN
  180. Str.Copy(state.ProgName, CoreMain._argv[0]^);
  181. END;
  182. fh:=CoreIO._creat_trunc("PM_DUMP.$$$", 0);
  183. IF fh >= 0 THEN
  184. IF CoreIO._write(2, ADR(ErrMsg), Str.Length(ErrMsg)) # 0 THEN END;
  185. IF CoreIO._write(2, ADR(Ln), 2) # 0 THEN END;
  186. IF WriteStruct(state, fh) = 0 THEN
  187. WriteCore(fh, state.TopLim, state.PSP);
  188. END;
  189. IF CoreIO._close(fh) # 0 THEN END;
  190. END;
  191. RETURN;
  192. END _PMDbody;
  193. (*%E *)
  194. (*%T _OS2 *)
  195. PROCEDURE WriteCore(fh: INTEGER);
  196. VAR
  197. h: SegHeader;
  198. Segment, SegTotal: CARDINAL;
  199. BEGIN
  200. Segment:=0;
  201. SegTotal:=GetSelectors();
  202. IF CoreIO.lseek(fh, LONGCARD((SIZE(ProcessState)+SIZE(CARDINAL)+(SIZE(SegHeader)*SegTotal))-1), 0) # 0 THEN END;
  203. IF Os2Write(fh, FarADR(Segment), 1) # 0 THEN END;
  204. LOOP
  205. IF Segment = SegTotal THEN EXIT END;
  206. h.frame:=selectors[Segment].selector;
  207. h.SegSize:=selectors[Segment].size;
  208. h.FilePos:=CoreIO.lseek(fh, 0, 2);
  209. IF compress(h, fh) = -1 THEN
  210. SegTotal:=0;
  211. EXIT;
  212. END;
  213. IF CoreIO.lseek(fh, LONGCARD(SIZE(ProcessState)+SIZE(CARDINAL)+SIZE(SegHeader)*Segment), 0) # 0 THEN END;
  214. IF Os2Write(fh, FarADR(h), SIZE(SegHeader)) # 0 THEN END;
  215. INC(Segment);
  216. END;
  217. IF CoreIO.lseek(fh, (SIZE(ProcessState)), 0) # 0 THEN END;
  218. IF Os2Write(fh, FarADR(SegTotal), SIZE(CARDINAL)) # 0 THEN END;
  219. RETURN;
  220. END WriteCore;
  221. PROCEDURE _PMDbody(VAR state: ProcessState);
  222. TYPE
  223. A2 = ARRAY [0..1] OF CHAR;
  224. VAR
  225. fh: CARDINAL;
  226. action: CARDINAL;
  227. Ln: A2;
  228. BEGIN
  229. Ln[0]:= CHAR(0DH);
  230. Ln[1]:= CHAR(0AH); (* NB *)
  231. IF CoreMain._argc # 0 THEN
  232. Str.Copy(state.ProgName, CoreMain._argv[0]^);
  233. END;
  234. IF Dos.Open("PM_DUMP.$$$", fh, action, LONGCARD(0),
  235. 0, 012H, 012H, LONGCARD(0)) = 0 THEN
  236. IF Os2Write(2, FarADR(ErrMsg), Str.Length(ErrMsg)) # 0 THEN END;
  237. IF Os2Write(2, FarADR(Ln), 2) # 0 THEN END;
  238. IF WriteStruct(state, fh) = 0 THEN
  239. WriteCore(fh);
  240. END;
  241. IF CoreIO._close(fh) # 0 THEN END;
  242. END;
  243. RETURN;
  244. END _PMDbody;
  245. (*%E *)
  246. PROCEDURE UserFatalError(ErrorCode: CARDINAL);
  247. BEGIN
  248. CoreSig._FatalError(CoreSig._FatalErrorPos(), ErrorCode);
  249. END UserFatalError;
  250. BEGIN
  251. includePMD:=1;
  252. END PMD.
  253.