| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- (* Release 3.10 *)
- (*-------------------------------------------------------------------------*
- * *
- * SYSTEM.MOD - Machine-level support *
- * *
- * COPYRIGHT (C) 1988..1992 Clarion Software Corporation. *
- * All Rights Reserved *
- * *
- *--------------------------------------------------------------------------*)
- (*%F _fdata *)
- (*# call(seg_name => null) *)
- (*# data(seg_name => null) *)
- (*%E *)
- (*# module(implementation=>off) *)
- (*# call(o_a_copy => off) *)
- (*# check(stack=>off,index=>off,range=>off,overflow=>off,nil_ptr=>off) *)
- IMPLEMENTATION MODULE SYSTEM;
- (*%F _OS2 *)
- IMPORT CoreMain;
- (*%E *)
- (*%T _OS2 *)
- IMPORT Lib,Dos,CoreSig,CoreMath;
- (*%E *)
- (*%F _OS2 *)
- PROCEDURE NEWPROCESS(P: PROC; A: FarADDRESS; S: CARDINAL; VAR P1: FarADDRESS); IN CoreProc;
- PROCEDURE TRANSFER (VAR P1,P2: FarADDRESS); IN CoreProc;
- PROCEDURE IOTRANSFER (VAR P1,P2: FarADDRESS; I: CARDINAL); IN CoreProc;
- PROCEDURE CurrentProcess():ADDRESS; IN CoreProc;
- PROCEDURE initprocess(); IN CoreProc;
- PROCEDURE CurrentPriority() : CARDINAL; IN CoreProc;
- PROCEDURE NewPriority(PR: CARDINAL); IN CoreProc;
- PROCEDURE Listen(Mask: BITSET); IN CoreProc;
- PROCEDURE InterruptRegisters(P: FarADDRESS): FarADDRESS; IN CoreProc;
- (*%E *)
- (*%T _OS2 *)
- CONST
- OS2MaxThreads = 64;
- VAR
- ProcessSem : ARRAY[1..OS2MaxThreads] OF LONGCARD;
- (* ADR(ProcessSem[T]) is process id and HSEM *)
- LaunchSem : LONGCARD; (* Set when launching new process *)
- LaunchProc : PROC;
- LI : Dos.PLINFOSEG;
- (*# save *)
- (*# call(near_call=>off, reg_param=>(), reg_saved=>(di,si,ds,st1,st2)) *)
- PROCEDURE Launch; (* Stub to launch new process *)
- (* Input LaunchProc *)
- VAR
- p : Dos.THREAD;
- mp : Dos.HSEM;
- r : CARDINAL;
- BEGIN
- mp := FarADR(ProcessSem[LI^.tidCurrent]);
- p := Dos.THREAD(LaunchProc);
- r := Dos.SemSet(mp);
- r := Dos.SemClear(FarADR(LaunchSem));
- r := Dos.SemWait(mp,Dos.SEM_INDEFINITE_WAIT);
- p();
- Lib.RunTimeError(CoreSig._FatalErrorPos(), 0CDH, Lib.NilStr);
- END Launch;
- (*#restore *)
- PROCEDURE NEWPROCESS(P: PROC; A: FarADDRESS; S: CARDINAL; VAR P1: FarADDRESS);
- VAR mp : Dos.HSEM;
- r : CARDINAL;
- tid : CARDINAL;
- BEGIN
- (*%T _mthread *)
- CoreMath._FloatInitInstance(CARDINAL(LONGCARD(A) >> 16));
- INC(CARDINAL(A),S);
- r := Dos.SemRequest(FarADR(LaunchSem),Dos.SEM_INDEFINITE_WAIT);
- LaunchProc := P;
- IF Dos.CreateThread(Launch,tid,A) # 0 THEN (* Start process *)
- Lib.RunTimeError(CoreSig._FatalErrorPos(), 0CAH, Lib.NilStr);
- END;
- IF tid>OS2MaxThreads THEN
- Lib.RunTimeError(CoreSig._FatalErrorPos(), 0CBH, Lib.NilStr);
- END;
- r := Dos.SemWait(FarADR(LaunchSem),Dos.SEM_INDEFINITE_WAIT);
- P1 := FarADR(ProcessSem[tid]);
- (*%E *)
- END NEWPROCESS;
- PROCEDURE TRANSFER (VAR P1,P2: FarADDRESS);
- VAR mp,pp : Dos.HSEM;
- r : CARDINAL ;
- BEGIN
- (*%T _mthread *)
- pp := P2;
- mp := FarADR(ProcessSem[LI^.tidCurrent]);
- P1 := mp;
- r := Dos.SemSet(mp);
- r := Dos.SemClear(pp);
- r := Dos.SemWait(mp,Dos.SEM_INDEFINITE_WAIT);
- (*%E *)
- END TRANSFER;
- PROCEDURE IOTRANSFER (VAR P1,P2: FarADDRESS; I: CARDINAL);
- VAR mp,pp : Dos.HSEM;
- r : CARDINAL ;
- BEGIN
- (*%T _mthread *)
- IF (I<>8) THEN
- Lib.RunTimeError(CoreSig._FatalErrorPos(), 0CCH, Lib.NilStr);
- END;
- pp := P2;
- mp := FarADR(ProcessSem[LI^.tidCurrent]);
- P1 := mp;
- r := Dos.SemSet(mp);
- r := Dos.SemClear(pp);
- r := Dos.SemWait(mp,20);
- P2 := FarADR(ProcessSem[LI^.tidCurrent]);
- (*%E *)
- END IOTRANSFER;
- PROCEDURE CurrentProcess() : ADDRESS;
- BEGIN
- RETURN ADR(ProcessSem[LI^.tidCurrent]);
- END CurrentProcess;
- PROCEDURE initprocess();
- BEGIN
- END initprocess;
- PROCEDURE CurrentPriority() : CARDINAL;
- TYPE
- PrType = RECORD
- CASE: BOOLEAN OF
- | TRUE :
- var: CARDINAL;
- | FALSE :
- pl, pc: SHORTCARD;
- END;
- END;
- VAR
- Pr: PrType;
- BEGIN
- Dos.GetPrty(2, Pr.var, 0);
- RETURN CARDINAL(Pr.pl);
- END CurrentPriority;
- PROCEDURE NewPriority(PR: CARDINAL);
- BEGIN
- Dos.SetPrty(2, 0, PR, 0);
- END NewPriority;
- PROCEDURE Init;
- VAR i,g,l : CARDINAL;
- BEGIN
- FOR i := 1 TO OS2MaxThreads DO ProcessSem[i] := 0 END;
- LI := FarNIL;
- IF Lib.ProtectedMode() THEN
- Dos.GetInfoSeg(g,l);
- LI := [l:0];
- END;
- END Init;
- PROCEDURE Listen(Mask: BITSET);
- BEGIN
- END Listen;
- PROCEDURE InterruptRegisters(P: FarADDRESS): FarADDRESS;
- BEGIN
- RETURN FarNIL;
- END InterruptRegisters;
- (*%E*)
- VAR
- HB: FarADDRESS;
- BEGIN
- (*%F _OS2 *)
- HB := CoreMain._getheapbase();
- HeapBase := Seg(HB^);
- (*%T _mthread *)
- initprocess();
- (*%E *)
- (*%E *)
- (*%T _OS2 *)
- Init;
- (*%E *)
- END SYSTEM.
|