vidif.mod 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. (* Copyright (C) 1988 Jensen & Partners International *)
  2. (*$N,V-,I-,R-,A-,S-*)
  3. IMPLEMENTATION MODULE VidIf ;
  4. (* The Program Interface to VID *)
  5. (* NB This should NOT be compiled with debug options ON *)
  6. IMPORT SYSTEM,Str ;
  7. CONST
  8. MaxStrSize = 255 ;
  9. RealRequired = TRUE ;
  10. TYPE
  11. MaxStr = ARRAY [0..MaxStrSize] OF CHAR ;
  12. VidOper = (VFinitwin, VFopenwin, VFwrstr, VFsetxy, VFgetxy,
  13. VFsetcolor, VFgetcolor, VFclosewin, VFsetproc, VFresetproc,
  14. VFresettrap ) ;
  15. VidIfRec = RECORD
  16. CASE fn : VidOper OF
  17. | VFinitwin:
  18. w,d : CARDINAL ;
  19. t : ARRAY[0..79] OF CHAR ;
  20. | VFwrstr :
  21. str : MaxStr ;
  22. | VFsetproc:
  23. newusertrap : UserTrapProc
  24. | VFgetxy:
  25. xp,yp : POINTER TO CARDINAL ;
  26. | VFsetxy:
  27. x,y : CARDINAL ;
  28. | VFsetcolor :
  29. fore,back : SHORTCARD ;
  30. END ;
  31. END ;
  32. VIDPROC = PROCEDURE ( VAR VidIfRec ) ;
  33. NPROC = PROCEDURE ();
  34. VAR
  35. VID : VIDPROC ;
  36. VIDPAUSE : NPROC ;
  37. (*
  38. FormatString = { Alpha | FieldSpecifier | SwitchChar }
  39. Alpha = any ascii char except '%' and '\'
  40. FieldSpecifier = '%' '%'
  41. | '% ['-'] [WidthSpecifier] TypeSpecifier
  42. WidthSpecifier = DecimalNumber [ '.' DecimalNumber ]
  43. TypeSpecifier = 'u' (* Unsigned *)
  44. | 'i' (* Signed *)
  45. | 'r' (* Real *)
  46. | 'c' (* Character *)
  47. | 's' (* String *)
  48. | 'h' (* Hex (unsigned) *)
  49. | 'b' (* Boolean *)
  50. | 'p' (* Pointer / Address *)
  51. SwitchChar = '\' SwitchOptions
  52. SwitchOptions = '\' (* \ *)
  53. | '%' (* % *)
  54. | 'b' (* BS = CHR(8) *)
  55. | 'f' (* FF = CHR(12) *)
  56. | 'n' (* NL = CHR(13),CHR(10) *)
  57. | 't' (* Tab = CHR(9) *)
  58. | 'e' (* Esc = CHR(27) *)
  59. | CharCode
  60. CharCode = DecimalNumber
  61. DecimalNumber = Digit [ Digit [ Digit ] ]
  62. *)
  63. TYPE ParamRec = RECORD
  64. size : CARDINAL ;
  65. adr : ADDRESS ;
  66. END ;
  67. PROCEDURE Format ( VAR Res : ARRAY OF CHAR ;
  68. Pat : ARRAY OF CHAR ;
  69. Params : ARRAY OF ParamRec ) ;
  70. VAR
  71. buff : MaxStr ;
  72. hb : ARRAY [0..4] OF CHAR ;
  73. rjust : BOOLEAN ;
  74. fwidth : CARDINAL ;
  75. fnum : CARDINAL ;
  76. fsize : CARDINAL ;
  77. places : CARDINAL ;
  78. lc : LONGCARD ;
  79. lr : LONGREAL ;
  80. li : LONGINT ;
  81. i,j,h,l,p : CARDINAL ;
  82. storechar : BOOLEAN ;
  83. c : CHAR ;
  84. Ok : BOOLEAN ;
  85. base : CARDINAL ;
  86. f : POINTER TO
  87. RECORD CASE : SHORTCARD OF
  88. 0 : si : SHORTINT |
  89. 1 : i : INTEGER |
  90. 2 : li : LONGINT |
  91. 3 : sc : SHORTCARD |
  92. 4 : c : CARDINAL |
  93. 5 : lc : LONGCARD |
  94. 6 : r : REAL |
  95. 7 : lr : LONGREAL |
  96. 8 : ch : CHAR |
  97. 9 : a : ADDRESS |
  98. 10 : b : BOOLEAN |
  99. 11 : str : MaxStr ;
  100. END ;
  101. END ;
  102. PROCEDURE GetNum () : CARDINAL ; (* leaves i and c changed *)
  103. VAR n,nc : CARDINAL ;
  104. BEGIN
  105. n := 0 ;
  106. FOR nc := 0 TO 2 DO
  107. IF (c<'0')OR(c>'9') THEN RETURN n END ;
  108. n := n*10+ORD(c)-ORD('0');
  109. c := Pat[i] ;
  110. INC(i) ;
  111. END ;
  112. RETURN n ;
  113. END GetNum ;
  114. BEGIN
  115. fnum := 0 ;
  116. h := HIGH(Res) ;
  117. l := Str.Length(Pat);
  118. Res[0] := 0C ;
  119. i := 0 ; j := 0 ;
  120. LOOP
  121. IF i=l THEN EXIT END ;
  122. storechar := TRUE ;
  123. c := Pat[i] ; INC(i) ;
  124. IF c = '\' THEN
  125. c := Pat[i] ; INC(i) ;
  126. CASE CAP(c) OF
  127. 'B':c:=CHR(8);
  128. | 'F':c:=CHR(12);
  129. | 'E':c:=CHR(27);
  130. | 'N':Res[j] := CHR(13); INC(j) ; c := CHR(10);
  131. | 'T':c:=CHR(9);
  132. | '0'..'9':DEC(i) ; c:= CHR(GetNum()) ;
  133. END ;
  134. ELSIF (c='%')AND(i<>l) THEN
  135. c := Pat[i] ; INC(i) ;
  136. (* pattern found *)
  137. rjust:=TRUE ; places:=5 ;
  138. storechar := FALSE ;
  139. IF c='-' THEN rjust := FALSE ; c := Pat[i] ; INC(i) ;
  140. END ;
  141. fwidth := GetNum() ;
  142. IF c='.' THEN
  143. c := Pat[i] ; INC(i) ;
  144. places := GetNum() ;
  145. END;
  146. IF fnum<=HIGH(Params) THEN
  147. WITH Params[fnum] DO
  148. fsize := size ;
  149. f := adr ;
  150. END ;
  151. INC(fnum) ;
  152. c := CAP(c) ;
  153. Ok := TRUE ;
  154. buff[0] := 0C ;
  155. CASE c OF
  156. 'I': IF fsize=1 THEN li := LONGINT(f^.si)
  157. ELSIF fsize=2 THEN li := LONGINT(f^.i)
  158. ELSIF fsize=4 THEN li := LONGINT(f^.li) ;
  159. ELSE Ok := FALSE ;
  160. END ;
  161. IF Ok THEN
  162. Str.IntToStr(li,buff,10,Ok) ;
  163. END ;
  164. | 'U',
  165. 'H': IF fsize=1 THEN lc := LONGCARD(f^.sc)
  166. ELSIF fsize=2 THEN lc := LONGCARD(f^.c)
  167. ELSIF fsize=4 THEN lc := LONGCARD(f^.lc) ;
  168. ELSE Ok := FALSE ;
  169. END ;
  170. IF Ok THEN
  171. base := 10 ; IF c='H' THEN base := 16 END ;
  172. Str.CardToStr(lc,buff,base,Ok) ;
  173. END ;
  174. | 'P': IF fsize <> 4 THEN Ok := FALSE END ;
  175. IF Ok THEN
  176. Str.CardToStr(LONGCARD(SYSTEM.Seg(f^.a^)),buff,16,Ok) ;
  177. Str.Append(buff,':') ;
  178. Str.CardToStr(LONGCARD(SYSTEM.Ofs(f^.a^)),hb,16,Ok) ;
  179. Str.Append(buff,hb) ;
  180. END ;
  181. | 'R': IF RealRequired THEN
  182. IF fsize=4 THEN lr := LONGREAL(f^.r)
  183. ELSIF fsize=8 THEN lr := LONGREAL(f^.lr) ;
  184. ELSE Ok := FALSE ;
  185. END ;
  186. IF Ok THEN
  187. Str.RealToStr(lr,places,FALSE,buff,Ok) ;
  188. END ;
  189. END ;
  190. | 'S': Str.Copy(buff,f^.str) ;
  191. IF fsize < SIZE(buff) THEN buff[fsize] := CHR(0) END ;
  192. | 'C': buff[0] := f^.ch ; buff[1] := CHR(0) ;
  193. | 'B': IF fsize=1 THEN
  194. IF f^.b THEN buff := 'TRUE' ELSE buff := 'FALSE' END ;
  195. END ;
  196. ELSE DEC(fnum); storechar := TRUE ;
  197. END;
  198. Res[j] := CHR(0) ;
  199. IF NOT Ok THEN buff := '????' END ;
  200. p := Str.Length(buff) ;
  201. IF rjust THEN
  202. WHILE (p<fwidth) DO
  203. Res[j] := ' ' ; INC(j) ; INC(p) ;
  204. END ;
  205. Res[j] := CHR(0) ;
  206. Str.Append(Res,buff) ;
  207. j := Str.Length(Res);
  208. ELSE
  209. Res[j] := CHR(0) ;
  210. Str.Append(Res,buff) ;
  211. j := Str.Length(Res);
  212. WHILE (p<fwidth) DO
  213. Res[j] := ' ' ; INC(j) ; INC(p) ;
  214. END ;
  215. END ;
  216. END ;
  217. END ;
  218. IF storechar THEN
  219. Res[j] := c ; INC(j) ;
  220. END ;
  221. IF (j>h) THEN EXIT END ;
  222. END ;
  223. IF (j<=h) THEN Res[j] := CHR(0) END ;
  224. END Format ;
  225. PROCEDURE InitDebugWindow ( Title : ARRAY OF CHAR ;
  226. Width,Depth : CARDINAL ) ;
  227. VAR
  228. vifrec : VidIfRec ;
  229. BEGIN
  230. vifrec.fn := VFinitwin ;
  231. vifrec.w := Width ;
  232. vifrec.d := Depth ;
  233. Str.Copy(vifrec.t,Title) ;
  234. VID(vifrec) ;
  235. END InitDebugWindow ;
  236. PROCEDURE OpenDebugWindow ;
  237. VAR
  238. vifrec : VidIfRec ;
  239. BEGIN
  240. vifrec.fn := VFopenwin ;
  241. VID(vifrec) ;
  242. END OpenDebugWindow ;
  243. PROCEDURE Trace ( Pat : ARRAY OF CHAR ;
  244. P1,P2,P3,P4 : ARRAY OF BYTE ) ;
  245. VAR
  246. params : ARRAY [0..3] OF ParamRec ;
  247. vifrec : VidIfRec ;
  248. BEGIN
  249. vifrec.fn := VFwrstr ;
  250. params[0].size := SIZE(P1) ;
  251. params[0].adr := ADR(P1) ;
  252. params[1].size := SIZE(P2) ;
  253. params[1].adr := ADR(P2) ;
  254. params[2].size := SIZE(P3) ;
  255. params[2].adr := ADR(P3) ;
  256. params[3].size := SIZE(P4) ;
  257. params[3].adr := ADR(P4) ;
  258. Format(vifrec.str,Pat,params) ;
  259. VID(vifrec) ;
  260. END Trace ;
  261. PROCEDURE GotoXY ( X,Y : CARDINAL ) ;
  262. VAR
  263. vifrec : VidIfRec ;
  264. BEGIN
  265. vifrec.fn := VFsetxy ;
  266. vifrec.x := X ;
  267. vifrec.y := Y ;
  268. VID(vifrec) ;
  269. END GotoXY ;
  270. PROCEDURE WhereXY ( VAR X,Y : CARDINAL ) ;
  271. VAR
  272. vifrec : VidIfRec ;
  273. BEGIN
  274. vifrec.fn := VFgetxy ;
  275. vifrec.xp := ADR(X) ;
  276. vifrec.yp := ADR(Y) ;
  277. VID(vifrec) ;
  278. END WhereXY ;
  279. PROCEDURE SetColor ( Fore,Back : Color ) ;
  280. VAR
  281. vifrec : VidIfRec ;
  282. BEGIN
  283. vifrec.fn := VFsetcolor ;
  284. vifrec.fore := SHORTCARD(Fore);
  285. vifrec.back := SHORTCARD(Back);
  286. VID(vifrec) ;
  287. END SetColor ;
  288. PROCEDURE CloseDebugWindow ;
  289. VAR
  290. vifrec : VidIfRec ;
  291. BEGIN
  292. vifrec.fn := VFclosewin ;
  293. VID(vifrec) ;
  294. END CloseDebugWindow ;
  295. PROCEDURE SetUserTrapProc ( P : UserTrapProc ) ;
  296. VAR
  297. vifrec : VidIfRec ;
  298. BEGIN
  299. vifrec.fn := VFsetproc ;
  300. vifrec.newusertrap := P ;
  301. VID(vifrec) ;
  302. END SetUserTrapProc ;
  303. PROCEDURE ResetUserTrapProc ;
  304. VAR
  305. vifrec : VidIfRec ;
  306. BEGIN
  307. vifrec.fn := VFresetproc ;
  308. VID(vifrec) ;
  309. END ResetUserTrapProc ;
  310. PROCEDURE ClearUserTrap ;
  311. VAR
  312. vifrec : VidIfRec ;
  313. BEGIN
  314. vifrec.fn := VFresettrap ;
  315. VID(vifrec) ;
  316. END ClearUserTrap ;
  317. PROCEDURE Pause() ;
  318. BEGIN
  319. VIDPAUSE ;
  320. END Pause ;
  321. PROCEDURE DummyVid ( VAR r : VidIfRec ) ;
  322. BEGIN
  323. END DummyVid ;
  324. PROCEDURE DummyVidPause ;
  325. BEGIN
  326. END DummyVidPause ;
  327. VAR
  328. iht[0:10H] : POINTER TO
  329. RECORD
  330. op : SHORTCARD;
  331. ad : ADDRESS;
  332. str : ARRAY[0..8] OF CHAR;
  333. END;
  334. PROCEDURE Init ;
  335. TYPE code = ARRAY[0..7] OF SHORTCARD ;
  336. TYPE code2 = ARRAY[0..5] OF SHORTCARD ;
  337. CONST
  338. c1 = code (
  339. 5AH, (* pop dx *)
  340. 59H, (* pop cx *)
  341. 5BH, (* pop bx *)
  342. 0CDH,04H, (* int 4 *)
  343. 37H, (* aaa *)
  344. 0FFH,0E2H (* jmp dx *)
  345. ) ;
  346. c2 = code2 (
  347. 5AH, (* pop dx *)
  348. 0CDH,04H, (* int 4 *)
  349. 3FH, (* aas *)
  350. 0FFH,0E2H (* jmp dx *)
  351. ) ;
  352. BEGIN
  353. IF Str.Compare(iht^.str,'ENVREHVID')=0 THEN
  354. VID := VIDPROC(ADR(c1)) ;
  355. VIDPAUSE := NPROC(ADR(c2)) ;
  356. ELSE
  357. VID := DummyVid ;
  358. VIDPAUSE := DummyVidPause ;
  359. END ;
  360. END Init ;
  361. BEGIN
  362. Init ;
  363. END VidIf.
  364.