LIB.DEF 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. (* Release 3.10 *)
  2. (*-------------------------------------------------------------------------*
  3. * *
  4. * LIB.DEF - Modula-2 miscellaneous library functions *
  5. * *
  6. * COPYRIGHT (C) 1987..1992 Clarion Software Corporation. *
  7. * All Rights Reserved *
  8. * *
  9. *--------------------------------------------------------------------------*)
  10. (* OS/2 MSDOS Version *)
  11. (*# call(o_a_copy => off) *)
  12. (*%F _fdata *)
  13. (*# call(seg_name => null) *)
  14. (*# data(seg_name => null) *)
  15. (*%E *)
  16. (*# module(implementation=>off) *)
  17. DEFINITION MODULE Lib;
  18. IMPORT SYSTEM;
  19. (* The following function determines whether objects are hierarchically related *)
  20. TYPE
  21. (*# save *)
  22. (*%T _fdata *)
  23. (*# data(near_ptr => off) *)
  24. (*%E *)
  25. (*%F _fdata *)
  26. (*# data(near_ptr => on) *)
  27. (*%E *)
  28. MTablePtr = POINTER TO MHeader;
  29. (*# restore *)
  30. MHeader = RECORD
  31. Size: CARDINAL;
  32. Parent: MTablePtr;
  33. END;
  34. PROCEDURE IsOfClass(Child, Parent: MTablePtr): BOOLEAN;
  35. VAR
  36. NilStr : ARRAY [0..0] OF CHAR;
  37. RunTimeError: PROCEDURE(LONGCARD, CARDINAL, ARRAY OF CHAR);
  38. TYPE
  39. CompareProc = PROCEDURE(CARDINAL, CARDINAL) : BOOLEAN;
  40. SwapProc = PROCEDURE(CARDINAL, CARDINAL);
  41. PROCEDURE QSort(N: CARDINAL; Less: CompareProc; Swap: SwapProc);
  42. PROCEDURE HSort(N: CARDINAL; Less: CompareProc; Swap: SwapProc);
  43. PROCEDURE RANDOM(Range: CARDINAL) : CARDINAL;
  44. PROCEDURE RAND() : REAL;
  45. PROCEDURE SEED(v:CARDINAL);
  46. PROCEDURE RANDOMIZE;
  47. PROCEDURE Execute (Name : ARRAY OF CHAR; (* full name of program *)
  48. CommandLine : ARRAY OF CHAR; (* command line for program *)
  49. StoreAddr : FarADDRESS; (* storage to execute in, MSDOS only *)
  50. StoreLen : CARDINAL (* length of store paragraphs, MSDOS only *)
  51. ) : CARDINAL ; (* DOS reply (0=OK) *)
  52. PROCEDURE OSErrorMessage ( N : CARDINAL ; VAR S : ARRAY OF CHAR );
  53. PROCEDURE OSFatalError ( S : ARRAY OF CHAR ; N : CARDINAL ) ;
  54. PROCEDURE Speaker(FreqHz,TimeMs: CARDINAL);
  55. TYPE
  56. ExecEnvType = ARRAY [0..31] OF ADDRESS;
  57. ExecEnvPtr = POINTER TO ExecEnvType;
  58. VAR
  59. ExecSearchPath: BOOLEAN;
  60. TYPE
  61. (*# save *)
  62. (*# data(near_ptr => off) *)
  63. CommandType = POINTER TO ARRAY[0..126] OF CHAR;
  64. (*# restore *)
  65. PROCEDURE Environment(N: CARDINAL) : CommandType;
  66. PROCEDURE EnvironmentFind(name: ARRAY OF CHAR;
  67. VAR result: ARRAY OF CHAR );
  68. PROCEDURE ParamStr(VAR S: ARRAY OF CHAR; N: CARDINAL);
  69. PROCEDURE ParamCount() : CARDINAL;
  70. PROCEDURE Exec ( command : ARRAY OF CHAR ; Params: ARRAY OF CHAR; Env: ExecEnvPtr): CARDINAL;
  71. PROCEDURE ExecCmd ( command : ARRAY OF CHAR ): CARDINAL;
  72. PROCEDURE WrDosError ( ErrorNo : SHORTCARD ) ;
  73. PROCEDURE SysErrno(): CARDINAL;
  74. TYPE
  75. DayType = (Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday) ;
  76. PROCEDURE GetDate ( VAR Year,Month,Day : CARDINAL ;
  77. VAR DayOfWeek : DayType ) ;
  78. PROCEDURE GetTime ( VAR Hrs,Mins,Secs,Hsecs : CARDINAL ) ;
  79. PROCEDURE SetDate ( Year,Month,Day : CARDINAL): BOOLEAN ;
  80. PROCEDURE SetTime ( Hrs,Mins,Secs,Hsecs : CARDINAL ): BOOLEAN ;
  81. PROCEDURE MakeAllPath(VAR Path: ARRAY OF CHAR; Drive, Dir, Name, Ext: ARRAY OF CHAR);
  82. PROCEDURE SplitAllPath(Path: ARRAY OF CHAR; VAR Drive: ARRAY OF CHAR;
  83. VAR Dir: ARRAY OF CHAR; VAR Name: ARRAY OF CHAR; VAR Ext: ARRAY OF CHAR);
  84. (*# save *)
  85. (*%T _DLL *)
  86. (*# call(seg_name=>LibDLL) *)
  87. (*%E *)
  88. PROCEDURE AddFarAddr(A: FarADDRESS; increment: CARDINAL) : FarADDRESS;
  89. PROCEDURE SubFarAddr(A: FarADDRESS; decrement: CARDINAL) : FarADDRESS;
  90. PROCEDURE IncFarAddr(VAR A: FarADDRESS; increment: CARDINAL);
  91. PROCEDURE DecFarAddr(VAR A: FarADDRESS; decrement: CARDINAL);
  92. (*# restore *)
  93. TYPE
  94. A2 = ARRAY[0..1] OF BYTE;
  95. A3 = ARRAY[0..2] OF BYTE;
  96. A4 = ARRAY[0..3] OF BYTE;
  97. _C8 = ARRAY[0..7] OF BYTE;
  98. (*%T _fptr *)
  99. CONST
  100. AddAddr = AddFarAddr;
  101. SubAddr = SubFarAddr;
  102. IncAddr = IncFarAddr;
  103. DecAddr = DecFarAddr;
  104. (*%E *)
  105. (*# save,call(reg_saved=>(dx,si,di,ds,st1,st2))*)
  106. INLINE PROCEDURE QueryDosVersion():CARDINAL = _C8(0B8H,000H,030H,0CDH,021H,086H,0C4H,SYSTEM.Ret);
  107. (* Returns the DOS version number as a BCD number. This makes *)
  108. (* numerical comparisons easy. Example: *)
  109. (* *)
  110. (* IF Lib.QueryDosVersion() >= 300H THEN *)
  111. (* *)
  112. (* would test whether the program is running under a version of DOS *)
  113. (* at or above 3.00. *)
  114. (*# restore *)
  115. (*# save, call( reg_param=>(ax,bx),
  116. reg_saved=>(cx,dx,si,di,es,ds,st1,st2), inline=>on ) *)
  117. INLINE PROCEDURE AddNearAddr(A: NearADDRESS; increment: CARDINAL) : NearADDRESS=A3(03H, 0C3H, SYSTEM.Ret);
  118. (*# call( reg_param=>(ax,bx),
  119. reg_saved=>(cx,dx,si,di,es,ds,st1,st2), inline=>on ) *)
  120. INLINE PROCEDURE SubNearAddr(A: NearADDRESS; decrement: CARDINAL) : NearADDRESS=A3(2BH, 0C3H, SYSTEM.Ret);
  121. (*%T _fptr *)
  122. (*# call( reg_param=>(bx,es,ax),
  123. reg_saved=>(cx,dx,si,di,ds,st1,st2), inline=>on ) *)
  124. INLINE PROCEDURE IncNearAddr(VAR A: NearADDRESS; increment: CARDINAL)=A4(26H,01H, 07H, SYSTEM.Ret);
  125. (*# call( reg_param=>(bx,es,ax),
  126. reg_saved=>(cx,dx,si,di,ds,st1,st2), inline=>on ) *)
  127. INLINE PROCEDURE DecNearAddr(VAR A: NearADDRESS; decrement: CARDINAL)=A4(26H,29H, 07H, SYSTEM.Ret);
  128. (*%E *)
  129. (*%F _fptr *)
  130. (*# call( reg_param=>(bx,ax),
  131. reg_saved=>(cx,dx,si,di,ds,es,st1,st2), inline=>on ) *)
  132. INLINE PROCEDURE IncNearAddr(VAR A: NearADDRESS; increment: CARDINAL)=A3(01H, 07H, SYSTEM.Ret);
  133. (*# call( reg_param=>(bx,ax),
  134. reg_saved=>(cx,dx,si,di,ds,es,st1,st2), inline=>on ) *)
  135. INLINE PROCEDURE DecNearAddr(VAR A: NearADDRESS; decrement: CARDINAL)=A3(29H, 07H, SYSTEM.Ret);
  136. (*%E *)
  137. (*# restore *)
  138. (*%F _fptr *)
  139. (*# save,
  140. call( reg_param=>(ax,bx),
  141. reg_saved=>(cx,dx,si,di,es,ds,st1,st2), inline=>on )
  142. *)
  143. INLINE PROCEDURE AddAddr(A: ADDRESS; increment: CARDINAL) : ADDRESS=A3(03H, 0C3H, SYSTEM.Ret);
  144. (*# call( reg_param=>(ax,bx),
  145. reg_saved=>(cx,dx,si,di,es,ds,st1,st2), inline=>on ) *)
  146. INLINE PROCEDURE SubAddr(A: ADDRESS; decrement: CARDINAL) : ADDRESS=A3(2BH, 0C3H, SYSTEM.Ret);
  147. (*# call( reg_param=>(bx,ax),
  148. reg_saved=>(cx,dx,si,di,ds,es,st1,st2), inline=>on ) *)
  149. INLINE PROCEDURE IncAddr(VAR A: ADDRESS; increment: CARDINAL)=A3(01H, 07H, SYSTEM.Ret);
  150. (*# call( reg_param=>(bx,ax),
  151. reg_saved=>(cx,dx,si,di,ds,es,st1,st2), inline=>on ) *)
  152. INLINE PROCEDURE DecAddr(VAR A: ADDRESS; decrement: CARDINAL)=A3(29H, 07H, SYSTEM.Ret);
  153. (*# restore *)
  154. (*%E *)
  155. (*# save *)
  156. (*%T _fdata *)
  157. (*# call(seg_name=>SIG) *)
  158. (*%E *)
  159. PROCEDURE SetInProgramFlag(State: BOOLEAN);
  160. PROCEDURE GetInProgramFlag(): BOOLEAN;
  161. PROCEDURE EnableBreakCheck;
  162. PROCEDURE DisableBreakCheck;
  163. PROCEDURE Dos(VAR R: SYSTEM.Registers); (* INT 21H Function Call *)
  164. (*# restore *)
  165. PROCEDURE GetVector(Int:SHORTCARD):FarADDRESS;
  166. (* Returns the 32 bit address of the requested interrupt handler *)
  167. PROCEDURE SetVector(Int:SHORTCARD;Vector:FarADDRESS);
  168. (* Sets the interrupt handler for the requested interrupt vector *)
  169. PROCEDURE FatalError(S: ARRAY OF CHAR);
  170. (*# save *)
  171. (*%T _DLL *)
  172. (*# call(seg_name=>LibDLL) *)
  173. (*%E *)
  174. (*%F _fdata *)
  175. PROCEDURE NearMove (Source,Dest:NearADDRESS;Count:CARDINAL);
  176. PROCEDURE NearFastMove(Source,Dest:NearADDRESS;Count:CARDINAL);
  177. PROCEDURE NearWordMove(Source,Dest:NearADDRESS;WordCount:CARDINAL);
  178. (*%E *)
  179. PROCEDURE Move (Source,Dest:ADDRESS;Count:CARDINAL);
  180. PROCEDURE FastMove(Source,Dest:ADDRESS;Count:CARDINAL);
  181. PROCEDURE WordMove(Source,Dest:ADDRESS;WordCount:CARDINAL);
  182. PROCEDURE FarMove (Source,Dest:FarADDRESS;Count:CARDINAL);
  183. PROCEDURE FarFastMove(Source,Dest:FarADDRESS;Count:CARDINAL);
  184. PROCEDURE FarWordMove(Source,Dest:FarADDRESS;WordCount:CARDINAL);
  185. PROCEDURE Fill(Dest: ADDRESS; Count: CARDINAL; Value: BYTE);
  186. PROCEDURE FarFill(Dest: FarADDRESS; Count: CARDINAL; Value: BYTE);
  187. PROCEDURE WordFill(Dest: ADDRESS; WordCount: CARDINAL; Value: WORD);
  188. PROCEDURE FarWordFill(Dest: FarADDRESS; WordCount: CARDINAL; Value: WORD);
  189. PROCEDURE ScanR (Dest: ADDRESS; Count: CARDINAL; Value: BYTE) : CARDINAL;
  190. PROCEDURE ScanL (Dest: ADDRESS; Count: CARDINAL; Value: BYTE) : CARDINAL;
  191. PROCEDURE ScanNeR(Dest: ADDRESS; Count: CARDINAL; Value: BYTE) : CARDINAL;
  192. PROCEDURE ScanNeL(Dest: ADDRESS; Count: CARDINAL; Value: BYTE) : CARDINAL;
  193. PROCEDURE HashString(S: ARRAY OF CHAR; Range: CARDINAL) : CARDINAL;
  194. PROCEDURE Compare(Source,Dest: ADDRESS; Len: CARDINAL) : CARDINAL;
  195. PROCEDURE Terminate(P: PROC; VAR C: PROC);
  196. PROCEDURE SetReturnCode(code: SHORTCARD);
  197. TYPE
  198. CpuKind = (cpu_Unknown,cpu_V20,cpu_V30,cpu_8088,cpu_8086,
  199. cpu_80188,cpu_80186,
  200. cpu_80286,cpu_80386);
  201. FpuKind = (fpu_none,fpu_8087,fpu_80287,fpu_80387);
  202. CpuRec = RECORD
  203. cpu : CpuKind;
  204. fpu : FpuKind;
  205. END;
  206. PROCEDURE CpuId ( VAR r : CpuRec );
  207. (* MSDOS Only *)
  208. VAR
  209. PSP : CARDINAL;
  210. CommandLine : CommandType;
  211. BreakChecks : BOOLEAN;
  212. PROCEDURE UserBreak;
  213. PROCEDURE Sound(FreqHz: CARDINAL);
  214. PROCEDURE NoSound;
  215. PROCEDURE Intr(VAR R: SYSTEM.Registers; I: CARDINAL);
  216. PROCEDURE Delay(Time: CARDINAL);
  217. TYPE
  218. TENBYTEREAL = ARRAY [0..9] OF BYTE;
  219. LongLabelRec = RECORD
  220. j_sp, j_ss, j_flag, j_cs, j_ip, j_bp, j_di, j_es, j_si, j_ds: CARDINAL;
  221. st1, st2: TENBYTEREAL;
  222. END;
  223. LongLabel = ARRAY [0..0] OF LongLabelRec;
  224. (*# save *)
  225. (*# call(reg_saved=>(ds,es,si,di,st1,st2), set_jmp=>on) *)
  226. PROCEDURE SetJmp (VAR Lbl: LongLabel) : CARDINAL;
  227. (*# restore *)
  228. (*# save *)
  229. (*# call(reg_saved=>(ax,bx,cx,dx,ds,es,si,di,st0,st1,st2,st3,st4,st5,st6)) *)
  230. PROCEDURE LongJmp(VAR Lbl: LongLabel; result: CARDINAL);
  231. (*# restore *)
  232. (* Protected mode features *)
  233. PROCEDURE AddressOK ( A : ADDRESS ) : BOOLEAN;
  234. PROCEDURE SelectorLimit ( S : CARDINAL ) : CARDINAL;
  235. PROCEDURE ProtectedMode () : BOOLEAN;
  236. (*# restore *)
  237. END Lib.
  238.