home *** CD-ROM | disk | FTP | other *** search
Modula Definition | 1994-05-18 | 16.5 KB | 418 lines |
- DEFINITION MODULE DosSystem;
- __DEF_SWITCHES__
- #ifdef HM2
- #ifdef __LONG_WHOLE__
- (*$!i+: Modul muss mit $i- uebersetzt werden! *)
- (*$!w+: Modul muss mit $w- uebersetzt werden! *)
- #else
- (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
- (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
- #endif
- #endif
- (*****************************************************************************)
- (* 18-Mai-94, Holger Kleinschmidt *)
- (*****************************************************************************)
-
- FROM SYSTEM IMPORT
- (* TYPE *) ADDRESS;
-
- FROM PORTAB IMPORT
- (* TYPE *) ANYBYTE, UNSIGNEDBYTE, UNSIGNEDWORD, UNSIGNEDLONG, WORDSET;
-
- FROM types IMPORT
- (* TYPE *) StrPtr;
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- TYPE
- ExcVector = [2..263];
-
- TYPE
- CookieVal = RECORD
- CASE TAG_COLON UNSIGNEDWORD OF
- 0: ul : UNSIGNEDLONG;
- |1: uwh : UNSIGNEDWORD;
- uwl : UNSIGNEDWORD;
- |2: wsh : WORDSET;
- wsl : WORDSET;
- |3: ubhh : UNSIGNEDBYTE;
- ubhl : UNSIGNEDBYTE;
- ublh : UNSIGNEDBYTE;
- ubll : UNSIGNEDBYTE;
- ELSE ptr : ADDRESS;
- END;
- END;
-
- TYPE
- Cookie = RECORD
- id : UNSIGNEDLONG;
- val : CookieVal;
- END;
-
- TYPE
- CookieRange = [0..1000]; (* beliebig *)
- CookiePtr = POINTER TO ARRAY CookieRange OF Cookie;
-
- (* Die wichtigsten von Atari benutzten Cookies: *)
- CONST
- MiNTCk = 4D694E54H; (* MiNT *) (* MiNT vorhanden... *)
-
- (* Ein Cookie-Jar mit den folgenden Cookies wird ab TOS 1.06
- * automatisch angelegt:
- *)
-
- CPUCk = 5F435055H; (* _CPU *) (* Prozessor *)
- FPUCk = 5F465055H; (* _FPU *) (* Mathe-Coprozessor *)
- VDOCk = 5F56444FH; (* _VDO *) (* Video-Hardware *)
- SNDCk = 5F534E44H; (* _SND *) (* Sound-Hardware *)
- MCHCk = 5F4D4348H; (* _MCH *) (* Rechner *)
- SWICk = 5F535749H; (* _SWI *) (* Konfigurationsschalter *)
- FRBCk = 5F465242H; (* _FRB *) (* Fast-RAM-Puffer *)
-
- (* Zusaetzlich ab TOS 2.06/3.06: *)
-
- FDCCk = 5F464443H; (* _FDC *) (* Floppy-Controller-Hardware *)
- NETCK = 5F4E4554H; (* _NET *) (* Netzwerk vorhanden *)
- FLKCk = 5F464C4BH; (* _FLK *) (* File-Locking vorhanden *)
-
- (* Zusaetzlich ab TOS 4.00: (Aufbau siehe ST-Computer 4/93, 6/93) *)
-
- AKPCk = 5F414B50H; (* _AKP *) (* Landessprache, Tastaturlayout *)
- IDTCk = 5F494454H; (* _IDT *) (* Datumsformat *)
-
- TYPE
- PrefLanguage = (
- lUSA, (* Amerikanisches Englisch *)
- lFRG, (* Deutsch *)
- lFRA, (* Franzoesisch *)
- lUK, (* Englisch *)
- lSPA, (* Spanisch *)
- lITA, (* Italienisch *)
- lSWE, (* Schwedisch *)
- lSWF, (* Franzoesisch, Schweiz *)
- lSWG, (* Deutsch, Schweiz *)
- lTUR, (* Tuerkisch *)
- lFIN, (* Finnisch *)
- lNOR, (* Norwegisch *)
- lDEN, (* Daenisch *)
- lAUS, (* Arabisch *)
- lHOL (* Hollaendisch *)
- );
-
- TYPE
- MachineType = (atariST, atariSTE, atariTT, atariF030, atariMSTE, atari);
-
- TYPE
- CPUType = (CPU68000, CPU68010, CPU68020, CPU68030, CPU68040, CPU68XXX);
-
- TYPE
- FPUFlags = (
- sfp004, (* SFP 004 oder kompatible FPU-Peripheriekarte *)
- fpu1, (* Bitmaske, siehe FPU* *)
- fpu2, (* -""- *)
- m68040 (* 68040-Prozessor mit integrierter FPU *)
- );
-
- FPUType = SET OF FPUFlags;
-
- CONST
- FPUMask = FPUType{fpu1,fpu2};
-
- FPU81or82 = FPUType{fpu1}; (* 68881 oder 68882 *)
- FPU81 = FPUType{fpu2}; (* eindeutig 68881 *)
- FPU82 = FPUType{fpu1,fpu2}; (* eindeutig 68882 *)
-
- TYPE
- FPUInfo = RECORD
- fpu : FPUType;
- linef : UNSIGNEDWORD; (* <> 0: Line-F-Softwareemulation *)
- END;
-
-
- TYPE
- CmdLine = ARRAY [0..127] OF CHAR;
-
- BasePtr = POINTER TO BasePage;
- BasePPtr = POINTER TO BasePtr;
- BasePage = RECORD
- pLowtpa : ADDRESS;
- pHitpa : ADDRESS;
- pTbase : ADDRESS;
- pTlen : UNSIGNEDLONG;
- pDbase : ADDRESS;
- pDlen : UNSIGNEDLONG;
- pBbase : ADDRESS;
- pBlen : UNSIGNEDLONG;
- pDta : ADDRESS;
- pParent : BasePtr;
- pResrvd0 : UNSIGNEDLONG;
- pEnv : ADDRESS;
- pResrvd1 : ARRAY [0..79] OF CHAR;
- pCmdlin : CmdLine;
- END;
-
-
- TYPE
- OsPtr = POINTER TO OsHeader;
- OsHeader = RECORD
- osEntry : UNSIGNEDWORD;
- osVersion : UNSIGNEDWORD;
- reseth : ADDRESS;
- osBeg : OsPtr;
- osEnd : ADDRESS;
- osRsv1 : UNSIGNEDLONG;
- osMagic : ADDRESS;
- osDate : UNSIGNEDLONG;
- osConf : WORDSET;
- osDosdate : WORDSET;
- (* die folgenden Variablen ab TOS 1.02 *)
- pRoot : ADDRESS;
- pkbshift : ADDRESS;
- pRun : BasePPtr;
- pRsv2 : ADDRESS;
- END;
-
- TYPE
- Shell = (None, Mupfel, Gemini, Gulam, Master, Unknown);
-
-
- VAR
- BASEP : BasePtr; (* Zeiger auf die eigene Basepage *)
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- PROCEDURE GetOsHeader ((* -- /AUS *) VAR osp : ADDRESS );
-
- (*--------------------------------------------------------------------------
- | Liefert einen Zeiger auf die OSHEADER-Systemstruktur |
- --------------------------------------------------------------------------*)
-
- PROCEDURE DosVersion ( ): CARDINAL;
-
- (*--------------------------------------------------------------------------
- | Liefert die kodierte DOS-Version |
- --------------------------------------------------------------------------*)
-
- PROCEDURE SysClock ( ): UNSIGNEDLONG;
-
- (*--------------------------------------------------------------------------
- | Liefert zurueck, wie oft die Systemvariable '_hz_200' seit Programmstart |
- | erhoeht wurde. |
- --------------------------------------------------------------------------*)
-
- PROCEDURE ShellInstalled ( ): Shell;
-
- (*--------------------------------------------------------------------------
- | Versucht festzustellen, ob ueber die Systemvariable '_shell_p' eine |
- | Kommandoshell installiert ist. |
- --------------------------------------------------------------------------*)
-
- PROCEDURE CallShell ((* EIN/ -- *) cmd : StrPtr ): INTEGER;
-
- (*--------------------------------------------------------------------------
- | Versucht ein Shell-Kommando ueber die Systemvariable '_shell_p' abzu- |
- | setzen. Vorher wird mit "ShellInstalled()" ueberprueft, ob eine Shell |
- | installiert ist; wenn allerdings nach einem Reset oder nach Beendigung |
- | einer Shell (-> Gulam) diese Variable nicht wieder auf NULL gesetzt wird,|
- | gibts mit ziemlicher Sicherheit einen Systemabsturz! |
- | Als Funktionswert wird -1 zurueckgeliefert, falls keine Shell installiert|
- | ist, ansonsten der Rueckgabewert der Shell. |
- --------------------------------------------------------------------------*)
-
- PROCEDURE ProcessDomain ((* EIN/ -- *) dom : INTEGER ): INTEGER;
-
- (*--------------------------------------------------------------------------
- | Beeinflusst das Verhalten bestimmter Systemaufrufe. |
- | <dom> < 0: Keine Aenderung, nur Abfrage |
- | <dom> = 0: TOS-Domain |
- | <dom> = 1: MiNT-Domain |
- | |
- | Der alte ``Domain''-Wert wird zurueckgeliefert. Die Funktion hat nur |
- | unter MiNT eine Auswirkung. |
- | Ist MiNT bei Programmstart aktiv, wird automatisch MiNT-Domain voreinge- |
- | stellt. |
- | Fuer ein ACC, das unter einem Nicht-Multitasking-Desktop laeuft, sollte |
- | die TOS-Domain eingestellt werden, da sonst der Desktop auch in der MiNT-|
- | Domain laeuft und z.B. die Dateinamen klein sind. Wird Ulrich Kaisers |
- | 'crystal'- bzw. 'M2GEM'-Bibliothek ab Version 1.03 verwendet, geschieht |
- | dies automatisch. |
- --------------------------------------------------------------------------*)
-
-
- PROCEDURE FcntlAvail ( ): BOOLEAN;
-
- PROCEDURE DpathconfAvail ( ): BOOLEAN;
-
- PROCEDURE SysconfAvail ( ): BOOLEAN;
-
- PROCEDURE DgetcwdAvail ( ): BOOLEAN;
-
- (*--------------------------------------------------------------------------
- | Die Funktionen testen das Vorhandensein bestimmter GEMDOS-Funktionen, |
- | unabhaengig von MiNT. |
- --------------------------------------------------------------------------*)
-
-
- PROCEDURE DosPid ((* EIN/ -- *) bp : ADDRESS ): INTEGER;
-
- (*--------------------------------------------------------------------------
- | Berechnet aus der Adresse der Basepage eine (hoffentlich) eindeutige |
- | Prozesskennung. |
- --------------------------------------------------------------------------*)
-
-
- (* Routinen zur Manipulation des Cookie-Jars.
- * Die Routinen koennen keinen neuen Cookie-Jar einrichten, bzw. einen
- * bestehenden erweitern. Hierzu muss der benoetigte Speicher resident
- * bleiben, i.a. muss dafuer also ein residentes Programm benutzt
- * werden. Auch das Erweitern erfordert einen residenten Speicher, da ALLE
- * Cookies, also nicht nur der neu einzutragende, der den vorhandenen Jar
- * gesprengt haette, in den neuen Speicherbereich kopiert werden muessen.
- *)
-
- PROCEDURE GetCookieBase ((* -- /AUS *) VAR pcookies : CookiePtr );
-
- (*--------------------------------------------------------------------------
- | Es wird ein Zeiger auf den Cookie Jar geliefert, falls vorhanden; anson- |
- | sten ist <pcookies> gleich NULL. |
- | Der Cookie Jar ist ein Feld von Eintraegen des Typs 'Cookie'. Der letzte |
- | Cookie hat die ID '0H' und als Wert die Anzahl der moeglichen Eintraege |
- | im Cookie Jar. Hierbei ist zu beachten, dass dieser End-Cookie selbst |
- | einen Eintrag belegt. |
- --------------------------------------------------------------------------*)
-
- PROCEDURE GetCookie ((* EIN/ -- *) cookie : UNSIGNEDLONG;
- (* -- /AUS *) VAR value : CookieVal ): BOOLEAN;
-
- (*--------------------------------------------------------------------------
- | Der Cookie mit der ID <cookie> wird gesucht. Ist der Cookie nicht vor- |
- | handen oder kein Cookie Jar installiert, ist der Funktionswert FALSE, |
- | und <value> ist Null;sonst wird in <value> der Wert des Cookies geliefert|
- --------------------------------------------------------------------------*)
-
- PROCEDURE SetCookie ((* EIN/ -- *) cookie : UNSIGNEDLONG;
- (* EIN/ -- *) value : CookieVal;
- (* -- /AUS *) VAR done : BOOLEAN );
-
- (*--------------------------------------------------------------------------
- | Der Cookie mit der ID <cookie> wird gesucht. Wird der Cookie gefunden, |
- | erhaelt er den neuen Wert <value>. Wird der Cookie nicht gefunden, so |
- | wird er neu eingetragen mit <cookie> und <value>. Ist im Cookie Jar nicht|
- | mehr genuegend Platz fuer den neuen Cookie, wird nichts geaendert, und |
- | <done> ist gleich FALSE. |
- --------------------------------------------------------------------------*)
-
- PROCEDURE RemoveCookie ((* EIN/ -- *) cookie : UNSIGNEDLONG;
- (* -- /AUS *) VAR found : BOOLEAN );
-
- (*--------------------------------------------------------------------------
- | der Cookie mit der ID <cookie> wird gesucht und aus dem Cookie Jar ent- |
- | fernt. Wird er nicht gefunden, passiert nichts, und <found> ist gleich |
- | FALSE. |
- --------------------------------------------------------------------------*)
-
-
- PROCEDURE CookieJarSize( ): CARDINAL;
-
- PROCEDURE FreeEntries( ): CARDINAL;
-
- (*--------------------------------------------------------------------------
- | Es wird die Anzahl der moeglichen Eintraege im Cookie Jar einschliess- |
- | lich des End-Cookies, bzw. die Anzahl der noch freien Eintraege geliefert|
- --------------------------------------------------------------------------*)
-
-
- (* Die folgenden Funktionen liefern ihren Wert anhand eines Cookie-Jar-
- * Eintrags, der aber nur beim Programmstart untersucht wird, da davon
- * ausgegangen wird, das sich der Wert dieser Cookies waehrend des
- * Programmlaufs nicht aendert.
- *)
-
- PROCEDURE Machine ( ): MachineType;
-
- (*--------------------------------------------------------------------------
- | Versucht den Typ des Rechners durch den '_MCH'-Cookie festzustellen. |
- --------------------------------------------------------------------------*)
-
- PROCEDURE CPU ( ): CPUType;
-
- (*--------------------------------------------------------------------------
- | Versucht den Typ der CPU durch den '_CPU'-Cookie festzustellen. |
- --------------------------------------------------------------------------*)
-
- PROCEDURE FPU ((* -- /AUS *) VAR info : FPUInfo );
-
- (*--------------------------------------------------------------------------
- | Versucht den Typ der FPU durch den '_FPU'-Cookie festzustellen. |
- --------------------------------------------------------------------------*)
-
- PROCEDURE MiNTVersion ( ): CARDINAL;
-
- (*--------------------------------------------------------------------------
- | Liefert die kodierte MiNT-Version (= 0, falls MiNT nicht aktiv). |
- --------------------------------------------------------------------------*)
-
- PROCEDURE MagiXVersion ( ): CARDINAL;
-
- (*--------------------------------------------------------------------------
- | Liefert die kodierte MagiX-Version (= 0, falls MagiX nicht aktiv). |
- --------------------------------------------------------------------------*)
-
- PROCEDURE FileLocking ( ): BOOLEAN;
-
- (*--------------------------------------------------------------------------
- | Testet, ob das Betriebssystem ``File locking'' unterstuetzt. |
- --------------------------------------------------------------------------*)
-
- PROCEDURE Language ( ): PrefLanguage;
-
- (*--------------------------------------------------------------------------
- | Ermittelt die vorzugsweise verwendete ``Sprache'' des Desktops aus dem |
- | '_AKP'-Cookie, bzw. aus dem 'OsHeader', falls der Cookie nicht existiert.|
- | Unter MultiTOS hat die durch 'appl_getinfo' erhaltene Information |
- | (aus der Konfigurationsvariable AE_LANG, erscheint nicht im Environment) |
- | Vorrang vor "Language()", es gibt allerdings nur: Englisch, Deutsch, |
- | Franzoesisch, Spanisch und Italienisch. |
- --------------------------------------------------------------------------*)
-
-
- (* Mithilfe der folgenden Prozeduren kann auf RAM-Bereiche zugegriffen
- * werden, die nur im Supervisormodus der CPU zugaenglich sind, also der
- * Bereich der Systemvariablen und die Hardwareregister, und unter MiNT-
- * Memory-Protection die im Supervisormodus zugaenglichen Bereiche.
- * <adr> darf nur bei den Prozeduren ungerade sein, die eine beliebige Anzahl
- * Bytes kopieren ("ReadSysMem()", "WriteSysMem()"). Es ist egal, in welchem
- * Modus die CPU beim Aufruf dieser Prozeduren ist. Die Prozeduren sind
- * nicht reentrant.
- *)
-
- PROCEDURE ReadWordSysMem ((* EIN/ -- *) adr : UNSIGNEDLONG ): UNSIGNEDWORD;
-
- PROCEDURE ReadLongSysMem ((* EIN/ -- *) adr : UNSIGNEDLONG ): UNSIGNEDLONG;
-
- PROCEDURE ReadSysMem ((* EIN/ -- *) adr : UNSIGNEDLONG;
- (* -- /AUS *) VAR val : ARRAY OF ANYBYTE );
-
- PROCEDURE WriteWordSysMem ((* EIN/ -- *) adr : UNSIGNEDLONG;
- (* EIN/ -- *) val : UNSIGNEDWORD );
-
- PROCEDURE WriteLongSysMem ((* EIN/ -- *) adr : UNSIGNEDLONG;
- (* EIN/ -- *) val : UNSIGNEDLONG );
-
- PROCEDURE WriteSysMem ((* EIN/ -- *) adr : UNSIGNEDLONG;
- (* EIN/ -- *) VAR val : ARRAY OF ANYBYTE );
-
-
- (* Auf die Vektoren im Adressbereich $8 bis $41c darf nur mittels der
- * Vektornummer zugegriffen werden, da die Adressen nicht feststehen!
- * Hierfuer gibt es die folgenden Prozeduren:
- *)
-
- PROCEDURE SetException ((* EIN/ -- *) vec : ExcVector;
- (* EIN/ -- *) new : ADDRESS;
- (* -- /AUS *) VAR old : ADDRESS );
-
- PROCEDURE GetException ((* EIN/ -- *) vec : ExcVector ): ADDRESS;
-
- END DosSystem.
-