home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1993-10-23 | 6.8 KB | 298 lines |
- IMPLEMENTATION MODULE DosSystem;
- (*__NO_CHECKS__*)
- (*****************************************************************************)
- (* 11-Feb-93, Holger Kleinschmidt *)
- (* --------------------------------------------------------------------------*)
- (* STATUS: OK *)
- (*****************************************************************************)
-
- VAL_INTRINSIC
- CAST_IMPORT
- OSCALL_IMPORT
-
- FROM SYSTEM IMPORT
- (* TYPE *) ADDRESS,
- (* PROC *) ADR;
-
- FROM types IMPORT
- (* CONST*) NULL,
- (* TYPE *) SIGNEDWORD, UNSIGNEDWORD, SIGNEDLONG, UNSIGNEDLONG;
-
- #if LPRM2
- IMPORT GEMX;
- #elif SPCM2
- IMPORT GEMDOS;
- #elif MM2
- IMPORT PrgCtrl;
- #elif HM2
- IMPORT System;
- #elif TDIM2
- IMPORT GEMX;
- #elif FTLM2
- IMPORT LOADER;
- #endif
-
- #include "oscalls.m2h"
-
- #if HM2 || TDIM2 || MM2 || LPRM2 || SPCM2 || FTLM2
- #define JSRA0 4E90H/* jsr (a0) */
- #define CALLSHELL(_CMD,_SHELL)\
- SETREG(0,_CMD);SETREG(8,_SHELL);CODE(PSHL,JSRA0,ADDQ4)
- #endif
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- CONST
- USER = LC(0);
-
- TYPE
- ULongPtr = POINTER TO UNSIGNEDLONG;
-
- VAR
- MiNT : CARDINAL;
- FLK : BOOLEAN;
- OS : UNSIGNEDWORD;
- OSP : OsPtr;
- BASEP : BasePtr;
- SHELL : UNSIGNEDLONG;
- STARTTIME : UNSIGNEDLONG;
- ssp : UNSIGNEDLONG;
- state : UNSIGNEDLONG;
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- PROCEDURE GetOsHeader ((* -- /AUS *) VAR osp : ADDRESS );
- (*T*)
- BEGIN
- osp := OSP;
- END GetOsHeader;
-
- (*--------------------------------------------------------------------------*)
-
- PROCEDURE GetBasePage ((* -- /AUS *) VAR basep : ADDRESS );
- (*T*)
- BEGIN
- basep := BASEP;
- END GetBasePage;
-
- (*--------------------------------------------------------------------------*)
-
- PROCEDURE MiNTVersion ( ): CARDINAL;
- (*T*)
- BEGIN
- RETURN(MiNT);
- END MiNTVersion;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE FileLocking ( ): BOOLEAN;
- (*T*)
- BEGIN
- RETURN(FLK);
- END FileLocking;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE ProcessDomain ((* EIN/ -- *) dom : INTEGER ): INTEGER;
- (*T*)
- VAR res : SIGNEDWORD;
-
- BEGIN
- IF MiNT > 0 THEN
- Pdomain(dom, res);
- RETURN(INT(res));
- ELSE
- RETURN(0); (* TOS-Domain *)
- END;
- END ProcessDomain;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE DosVersion ( ): CARDINAL;
- (*T*)
- BEGIN
- RETURN(VAL(CARDINAL,OS));
- END DosVersion;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE ReadHz200 ( ): UNSIGNEDLONG;
- (*T*)
- VAR Hz200 : ULongPtr;
- TIME : UNSIGNEDLONG;
-
- BEGIN
- Hz200 := CAST(ULongPtr,VAL(UNSIGNEDLONG,4BAH));
- Super(LC(1), state);
- IF state = USER THEN
- Super(LC(0), ssp);
- END;
- TIME := Hz200^;
- IF state = USER THEN
- Super(ssp, ssp);
- END;
- RETURN(TIME);
- END ReadHz200;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE SysClock ( ): UNSIGNEDLONG;
- (*T*)
- BEGIN
- RETURN(ReadHz200() - STARTTIME);
- END SysClock;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE ShellInstalled ( ): Shell;
- (*T*)
- CONST GulamMAGIC = 00420135H;
- XBRAID = 58425241H; (* 'XBRA' *)
- MasterID = 4D415354H; (* 'MAST' *)
- MupfelID = 4D555046H; (* 'MUPF' *)
- GeminiID = 474D4E49H; (* 'GMNI' *)
-
- TYPE xbraidp = POINTER TO ARRAY[0..1] OF UNSIGNEDLONG;
- magicp = ULongPtr;
-
- VAR xbraid : xbraidp;
- magic : magicp;
- val : UNSIGNEDLONG;
- ShellP : ULongPtr;
-
- BEGIN
- ShellP := CAST(ULongPtr,VAL(UNSIGNEDLONG,4F6H));
- Super(LC(1), state);
- IF state = USER THEN
- Super(LC(0), ssp);
- END;
- SHELL := ShellP^;
- IF state = USER THEN
- Super(ssp, ssp);
- END;
-
- IF SHELL = LC(0) THEN
- RETURN(None);
- END;
- xbraid := CAST(xbraidp,SHELL - LC(12));
- IF xbraid^[0] = XBRAID THEN
- IF xbraid^[1] = MupfelID THEN
- RETURN(Mupfel);
- ELSIF xbraid^[1] = GeminiID THEN
- RETURN(Gemini);
- ELSIF xbraid^[1] = MasterID THEN
- RETURN(Master);
- END;
- END;
- magic := CAST(magicp,SHELL - LC(10));
- IF magic^ = GulamMAGIC THEN
- RETURN(Gulam);
- END;
- RETURN(Unknown);
- END ShellInstalled;
-
- (*---------------------------------------------------------------------------*)
-
- PROCEDURE CallShell ((* EIN/ -- *) VAR cmd : ARRAY OF CHAR ): INTEGER;
- (*T*)
- VAR retCode : SIGNEDWORD;
-
- BEGIN
- cmd[HIGH(cmd)] := 0C;
- IF ShellInstalled() = None THEN
- RETURN(-1);
- ELSE
- CALLSHELL(ADR(cmd), SHELL);
- GETSWREG(0,retCode);
- RETURN(INT(retCode));
- END;
- END CallShell;
-
- (*===========================================================================*)
-
- CONST
- MiNTCk = 4D694E54H; (* "MiNT" *)
- FLKCk = 5F464C4BH; (* _FLK *)
-
- TYPE
- Cookie = RECORD
- id : UNSIGNEDLONG;
- val : UNSIGNEDLONG;
- END;
-
- CookieRange = [0..1000]; (* beliebig *)
- CookiePtr = POINTER TO ARRAY CookieRange OF Cookie;
- CookiePPtr = POINTER TO CookiePtr;
-
- TYPE
- OsPPtr = POINTER TO OsPtr;
-
- VAR
- Sysbase : OsPPtr;
- bptr : BasePPtr;
- res : SIGNEDWORD;
- vers : UNSIGNEDLONG;
- PCookies : CookiePPtr;
- pcookie : CookiePtr;
- i : CookieRange;
-
- BEGIN (* DosSystem *)
- STARTTIME := ReadHz200();
-
- Sysbase := CAST(OsPPtr,VAL(UNSIGNEDLONG,4F2H));
- PCookies := CAST(CookiePPtr,VAL(UNSIGNEDLONG,5A0H));
-
- Super(LC(1), state);
- IF state = USER THEN Super(LC(0), ssp); END;
- OSP := Sysbase^;
- OSP := OSP^.osBeg;
- pcookie := PCookies^;
- IF state = USER THEN Super(ssp, ssp); END;
-
- #if HM2
- BASEP := BasePtr(System.BasePage);
- #elif LPRM2
- BASEP := VAL(BasePtr,GEMX.BasePagePtr);
- #elif SPCM2
- BASEP := VAL(BasePtr,GEMDOS.BasePagePtr);
- #elif MM2
- PrgCtrl.GetBasePageAddr(BASEP);
- #elif TDIM2
- BASEP := BasePtr(GEMX.BasePageAddress);
- #elif FTLM2
- BASEP := BasePtr(LOADER.ProgPrefixAddress);
- #else
- IF VAL(CARDINAL,OSP^.osEntry) >= 0102H THEN
- bptr := OSP^.pRun; (* erst ab Blitter-TOS 1.02 *)
- ELSIF CAST(UNSIGNEDWORD,OSP^.osConf) DIV 2 = 4 THEN
- (* Spanisches TOS 1.0 *)
- bptr := CAST(BasePPtr,VAL(UNSIGNEDLONG,873CH));
- ELSE
- bptr := CAST(BasePPtr,VAL(UNSIGNEDLONG,602CH));
- END;
- BASEP := bptr^;
- #endif
-
- MiNT := 0;
- FLK := FALSE;
- IF pcookie <> NULL THEN
- i := 0;
- WHILE pcookie^[i].id <> LC(0) DO
- WITH pcookie^[i] DO
- IF id = MiNTCk THEN
- Pdomain(1, res);
- MiNT := VAL(CARDINAL,val);
- ELSIF id = FLKCk THEN
- FLK := TRUE;
- END;
- END;
- INC(i);
- END;
- END;
-
- Sversion(OS);
-
- PID := INT((CAST(UNSIGNEDLONG,BASEP) DIV LC(256)) MOD LC(32768));
- PPID := INT((CAST(UNSIGNEDLONG,BASEP^.pParent) DIV LC(256)) MOD LC(32768));
- END DosSystem.
-