SYSTEM.MOD 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. (* Release 3.10 *)
  2. (*-------------------------------------------------------------------------*
  3. * *
  4. * SYSTEM.MOD - Machine-level support *
  5. * *
  6. * COPYRIGHT (C) 1988..1992 Clarion Software Corporation. *
  7. * All Rights Reserved *
  8. * *
  9. *--------------------------------------------------------------------------*)
  10. (*%F _fdata *)
  11. (*# call(seg_name => null) *)
  12. (*# data(seg_name => null) *)
  13. (*%E *)
  14. (*# module(implementation=>off) *)
  15. (*# call(o_a_copy => off) *)
  16. (*# check(stack=>off,index=>off,range=>off,overflow=>off,nil_ptr=>off) *)
  17. IMPLEMENTATION MODULE SYSTEM;
  18. (*%F _OS2 *)
  19. IMPORT CoreMain;
  20. (*%E *)
  21. (*%T _OS2 *)
  22. IMPORT Lib,Dos,CoreSig,CoreMath;
  23. (*%E *)
  24. (*%F _OS2 *)
  25. PROCEDURE NEWPROCESS(P: PROC; A: FarADDRESS; S: CARDINAL; VAR P1: FarADDRESS); IN CoreProc;
  26. PROCEDURE TRANSFER (VAR P1,P2: FarADDRESS); IN CoreProc;
  27. PROCEDURE IOTRANSFER (VAR P1,P2: FarADDRESS; I: CARDINAL); IN CoreProc;
  28. PROCEDURE CurrentProcess():ADDRESS; IN CoreProc;
  29. PROCEDURE initprocess(); IN CoreProc;
  30. PROCEDURE CurrentPriority() : CARDINAL; IN CoreProc;
  31. PROCEDURE NewPriority(PR: CARDINAL); IN CoreProc;
  32. PROCEDURE Listen(Mask: BITSET); IN CoreProc;
  33. PROCEDURE InterruptRegisters(P: FarADDRESS): FarADDRESS; IN CoreProc;
  34. (*%E *)
  35. (*%T _OS2 *)
  36. CONST
  37. OS2MaxThreads = 64;
  38. VAR
  39. ProcessSem : ARRAY[1..OS2MaxThreads] OF LONGCARD;
  40. (* ADR(ProcessSem[T]) is process id and HSEM *)
  41. LaunchSem : LONGCARD; (* Set when launching new process *)
  42. LaunchProc : PROC;
  43. LI : Dos.PLINFOSEG;
  44. (*# save *)
  45. (*# call(near_call=>off, reg_param=>(), reg_saved=>(di,si,ds,st1,st2)) *)
  46. PROCEDURE Launch; (* Stub to launch new process *)
  47. (* Input LaunchProc *)
  48. VAR
  49. p : Dos.THREAD;
  50. mp : Dos.HSEM;
  51. r : CARDINAL;
  52. BEGIN
  53. mp := FarADR(ProcessSem[LI^.tidCurrent]);
  54. p := Dos.THREAD(LaunchProc);
  55. r := Dos.SemSet(mp);
  56. r := Dos.SemClear(FarADR(LaunchSem));
  57. r := Dos.SemWait(mp,Dos.SEM_INDEFINITE_WAIT);
  58. p();
  59. Lib.RunTimeError(CoreSig._FatalErrorPos(), 0CDH, Lib.NilStr);
  60. END Launch;
  61. (*#restore *)
  62. PROCEDURE NEWPROCESS(P: PROC; A: FarADDRESS; S: CARDINAL; VAR P1: FarADDRESS);
  63. VAR mp : Dos.HSEM;
  64. r : CARDINAL;
  65. tid : CARDINAL;
  66. BEGIN
  67. (*%T _mthread *)
  68. CoreMath._FloatInitInstance(CARDINAL(LONGCARD(A) >> 16));
  69. INC(CARDINAL(A),S);
  70. r := Dos.SemRequest(FarADR(LaunchSem),Dos.SEM_INDEFINITE_WAIT);
  71. LaunchProc := P;
  72. IF Dos.CreateThread(Launch,tid,A) # 0 THEN (* Start process *)
  73. Lib.RunTimeError(CoreSig._FatalErrorPos(), 0CAH, Lib.NilStr);
  74. END;
  75. IF tid>OS2MaxThreads THEN
  76. Lib.RunTimeError(CoreSig._FatalErrorPos(), 0CBH, Lib.NilStr);
  77. END;
  78. r := Dos.SemWait(FarADR(LaunchSem),Dos.SEM_INDEFINITE_WAIT);
  79. P1 := FarADR(ProcessSem[tid]);
  80. (*%E *)
  81. END NEWPROCESS;
  82. PROCEDURE TRANSFER (VAR P1,P2: FarADDRESS);
  83. VAR mp,pp : Dos.HSEM;
  84. r : CARDINAL ;
  85. BEGIN
  86. (*%T _mthread *)
  87. pp := P2;
  88. mp := FarADR(ProcessSem[LI^.tidCurrent]);
  89. P1 := mp;
  90. r := Dos.SemSet(mp);
  91. r := Dos.SemClear(pp);
  92. r := Dos.SemWait(mp,Dos.SEM_INDEFINITE_WAIT);
  93. (*%E *)
  94. END TRANSFER;
  95. PROCEDURE IOTRANSFER (VAR P1,P2: FarADDRESS; I: CARDINAL);
  96. VAR mp,pp : Dos.HSEM;
  97. r : CARDINAL ;
  98. BEGIN
  99. (*%T _mthread *)
  100. IF (I<>8) THEN
  101. Lib.RunTimeError(CoreSig._FatalErrorPos(), 0CCH, Lib.NilStr);
  102. END;
  103. pp := P2;
  104. mp := FarADR(ProcessSem[LI^.tidCurrent]);
  105. P1 := mp;
  106. r := Dos.SemSet(mp);
  107. r := Dos.SemClear(pp);
  108. r := Dos.SemWait(mp,20);
  109. P2 := FarADR(ProcessSem[LI^.tidCurrent]);
  110. (*%E *)
  111. END IOTRANSFER;
  112. PROCEDURE CurrentProcess() : ADDRESS;
  113. BEGIN
  114. RETURN ADR(ProcessSem[LI^.tidCurrent]);
  115. END CurrentProcess;
  116. PROCEDURE initprocess();
  117. BEGIN
  118. END initprocess;
  119. PROCEDURE CurrentPriority() : CARDINAL;
  120. TYPE
  121. PrType = RECORD
  122. CASE: BOOLEAN OF
  123. | TRUE :
  124. var: CARDINAL;
  125. | FALSE :
  126. pl, pc: SHORTCARD;
  127. END;
  128. END;
  129. VAR
  130. Pr: PrType;
  131. BEGIN
  132. Dos.GetPrty(2, Pr.var, 0);
  133. RETURN CARDINAL(Pr.pl);
  134. END CurrentPriority;
  135. PROCEDURE NewPriority(PR: CARDINAL);
  136. BEGIN
  137. Dos.SetPrty(2, 0, PR, 0);
  138. END NewPriority;
  139. PROCEDURE Init;
  140. VAR i,g,l : CARDINAL;
  141. BEGIN
  142. FOR i := 1 TO OS2MaxThreads DO ProcessSem[i] := 0 END;
  143. LI := FarNIL;
  144. IF Lib.ProtectedMode() THEN
  145. Dos.GetInfoSeg(g,l);
  146. LI := [l:0];
  147. END;
  148. END Init;
  149. PROCEDURE Listen(Mask: BITSET);
  150. BEGIN
  151. END Listen;
  152. PROCEDURE InterruptRegisters(P: FarADDRESS): FarADDRESS;
  153. BEGIN
  154. RETURN FarNIL;
  155. END InterruptRegisters;
  156. (*%E*)
  157. VAR
  158. HB: FarADDRESS;
  159. BEGIN
  160. (*%F _OS2 *)
  161. HB := CoreMain._getheapbase();
  162. HeapBase := Seg(HB^);
  163. (*%T _mthread *)
  164. initprocess();
  165. (*%E *)
  166. (*%E *)
  167. (*%T _OS2 *)
  168. Init;
  169. (*%E *)
  170. END SYSTEM.
  171.