PMD.MOD 8.0 KB

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