home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / program / compiler / m2posx14 / src / dossyste.dpp < prev    next >
Encoding:
Modula Definition  |  1994-05-18  |  16.5 KB  |  418 lines

  1. DEFINITION MODULE DosSystem;
  2. __DEF_SWITCHES__
  3. #ifdef HM2
  4. #ifdef __LONG_WHOLE__
  5. (*$!i+: Modul muss mit $i- uebersetzt werden! *)
  6. (*$!w+: Modul muss mit $w- uebersetzt werden! *)
  7. #else
  8. (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
  9. (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
  10. #endif
  11. #endif
  12. (*****************************************************************************)
  13. (* 18-Mai-94, Holger Kleinschmidt                                            *)
  14. (*****************************************************************************)
  15.  
  16. FROM SYSTEM IMPORT
  17. (* TYPE *) ADDRESS;
  18.  
  19. FROM PORTAB IMPORT
  20. (* TYPE *) ANYBYTE, UNSIGNEDBYTE, UNSIGNEDWORD, UNSIGNEDLONG, WORDSET;
  21.  
  22. FROM types IMPORT
  23. (* TYPE *) StrPtr;
  24.  
  25. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  26.  
  27. TYPE
  28.   ExcVector = [2..263];
  29.  
  30. TYPE
  31.   CookieVal = RECORD
  32.     CASE TAG_COLON UNSIGNEDWORD OF
  33.       0: ul   : UNSIGNEDLONG;
  34.      |1: uwh  : UNSIGNEDWORD;
  35.          uwl  : UNSIGNEDWORD;
  36.      |2: wsh  : WORDSET;
  37.          wsl  : WORDSET;
  38.      |3: ubhh : UNSIGNEDBYTE;
  39.          ubhl : UNSIGNEDBYTE;
  40.          ublh : UNSIGNEDBYTE;
  41.          ubll : UNSIGNEDBYTE;
  42.     ELSE ptr  : ADDRESS;
  43.     END;
  44.   END;
  45.  
  46. TYPE
  47.   Cookie = RECORD
  48.     id  : UNSIGNEDLONG;
  49.     val : CookieVal;
  50.   END;
  51.  
  52. TYPE
  53.   CookieRange = [0..1000]; (* beliebig *)
  54.   CookiePtr   = POINTER TO ARRAY CookieRange OF Cookie;
  55.  
  56. (* Die wichtigsten von Atari benutzten Cookies: *)
  57. CONST
  58.   MiNTCk = 4D694E54H; (* MiNT *) (* MiNT vorhanden... *)
  59.  
  60. (* Ein Cookie-Jar mit den folgenden Cookies wird ab TOS 1.06
  61.  * automatisch angelegt:
  62.  *)
  63.  
  64.   CPUCk  = 5F435055H; (* _CPU *) (* Prozessor *)
  65.   FPUCk  = 5F465055H; (* _FPU *) (* Mathe-Coprozessor *)
  66.   VDOCk  = 5F56444FH; (* _VDO *) (* Video-Hardware *)
  67.   SNDCk  = 5F534E44H; (* _SND *) (* Sound-Hardware *)
  68.   MCHCk  = 5F4D4348H; (* _MCH *) (* Rechner *)
  69.   SWICk  = 5F535749H; (* _SWI *) (* Konfigurationsschalter *)
  70.   FRBCk  = 5F465242H; (* _FRB *) (* Fast-RAM-Puffer *)
  71.  
  72. (* Zusaetzlich ab TOS 2.06/3.06: *)
  73.  
  74.   FDCCk  = 5F464443H; (* _FDC *) (* Floppy-Controller-Hardware *)
  75.   NETCK  = 5F4E4554H; (* _NET *) (* Netzwerk vorhanden *)
  76.   FLKCk  = 5F464C4BH; (* _FLK *) (* File-Locking vorhanden *)
  77.  
  78. (* Zusaetzlich ab TOS 4.00: (Aufbau siehe ST-Computer 4/93, 6/93) *)
  79.  
  80.   AKPCk  = 5F414B50H; (* _AKP *) (* Landessprache, Tastaturlayout *)
  81.   IDTCk  = 5F494454H; (* _IDT *) (* Datumsformat *)
  82.  
  83. TYPE
  84.   PrefLanguage = (
  85.     lUSA, (* Amerikanisches Englisch *)
  86.     lFRG, (* Deutsch *)
  87.     lFRA, (* Franzoesisch *)
  88.     lUK,  (* Englisch *)
  89.     lSPA, (* Spanisch *)
  90.     lITA, (* Italienisch *)
  91.     lSWE, (* Schwedisch *)
  92.     lSWF, (* Franzoesisch, Schweiz *)
  93.     lSWG, (* Deutsch, Schweiz *)
  94.     lTUR, (* Tuerkisch *)
  95.     lFIN, (* Finnisch *)
  96.     lNOR, (* Norwegisch *)
  97.     lDEN, (* Daenisch *)
  98.     lAUS, (* Arabisch *)
  99.     lHOL  (* Hollaendisch *)
  100.   );
  101.  
  102. TYPE
  103.   MachineType = (atariST, atariSTE, atariTT, atariF030, atariMSTE, atari);
  104.  
  105. TYPE
  106.   CPUType = (CPU68000, CPU68010, CPU68020, CPU68030, CPU68040, CPU68XXX);
  107.  
  108. TYPE
  109.   FPUFlags = (
  110.     sfp004,   (* SFP 004 oder kompatible FPU-Peripheriekarte *)
  111.     fpu1,     (* Bitmaske, siehe FPU* *)
  112.     fpu2,     (* -""- *)
  113.     m68040    (* 68040-Prozessor mit integrierter FPU *)
  114.   );
  115.  
  116.   FPUType = SET OF FPUFlags;
  117.  
  118. CONST
  119.   FPUMask = FPUType{fpu1,fpu2};
  120.  
  121.   FPU81or82 = FPUType{fpu1};      (* 68881 oder 68882 *)
  122.   FPU81     = FPUType{fpu2};      (* eindeutig 68881 *)
  123.   FPU82     = FPUType{fpu1,fpu2}; (* eindeutig 68882 *)
  124.  
  125. TYPE
  126.   FPUInfo = RECORD
  127.     fpu   : FPUType;
  128.     linef : UNSIGNEDWORD; (* <> 0: Line-F-Softwareemulation *)
  129.   END;
  130.  
  131.  
  132. TYPE
  133.   CmdLine = ARRAY [0..127] OF CHAR;
  134.  
  135.   BasePtr  = POINTER TO BasePage;
  136.   BasePPtr = POINTER TO BasePtr;
  137.   BasePage = RECORD
  138.     pLowtpa  : ADDRESS;
  139.     pHitpa   : ADDRESS;
  140.     pTbase   : ADDRESS;
  141.     pTlen    : UNSIGNEDLONG;
  142.     pDbase   : ADDRESS;
  143.     pDlen    : UNSIGNEDLONG;
  144.     pBbase   : ADDRESS;
  145.     pBlen    : UNSIGNEDLONG;
  146.     pDta     : ADDRESS;
  147.     pParent  : BasePtr;
  148.     pResrvd0 : UNSIGNEDLONG;
  149.     pEnv     : ADDRESS;
  150.     pResrvd1 : ARRAY [0..79] OF CHAR;
  151.     pCmdlin  : CmdLine;
  152.   END;
  153.  
  154.  
  155. TYPE
  156.   OsPtr = POINTER TO OsHeader;
  157.   OsHeader = RECORD
  158.     osEntry   : UNSIGNEDWORD;
  159.     osVersion : UNSIGNEDWORD;
  160.     reseth    : ADDRESS;
  161.     osBeg     : OsPtr;
  162.     osEnd     : ADDRESS;
  163.     osRsv1    : UNSIGNEDLONG;
  164.     osMagic   : ADDRESS;
  165.     osDate    : UNSIGNEDLONG;
  166.     osConf    : WORDSET;
  167.     osDosdate : WORDSET;
  168.  (* die folgenden Variablen ab TOS 1.02 *)
  169.     pRoot     : ADDRESS;
  170.     pkbshift  : ADDRESS;
  171.     pRun      : BasePPtr;
  172.     pRsv2     : ADDRESS;
  173.   END;
  174.  
  175. TYPE
  176.   Shell = (None, Mupfel, Gemini, Gulam, Master, Unknown);
  177.  
  178.  
  179. VAR
  180.   BASEP : BasePtr; (* Zeiger auf die eigene Basepage *)
  181.  
  182. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  183.  
  184.  PROCEDURE GetOsHeader ((* -- /AUS *) VAR osp : ADDRESS );
  185.  
  186. (*--------------------------------------------------------------------------
  187.  | Liefert einen Zeiger auf die OSHEADER-Systemstruktur                     |
  188.   --------------------------------------------------------------------------*)
  189.  
  190.  PROCEDURE DosVersion ( ): CARDINAL;
  191.  
  192. (*--------------------------------------------------------------------------
  193.  | Liefert die kodierte DOS-Version                                         |
  194.   --------------------------------------------------------------------------*)
  195.  
  196.  PROCEDURE SysClock ( ): UNSIGNEDLONG;
  197.  
  198. (*--------------------------------------------------------------------------
  199.  | Liefert zurueck, wie oft die Systemvariable '_hz_200' seit Programmstart |
  200.  | erhoeht wurde.                                                           |
  201.   --------------------------------------------------------------------------*)
  202.  
  203.  PROCEDURE ShellInstalled ( ): Shell;
  204.  
  205. (*--------------------------------------------------------------------------
  206.  | Versucht festzustellen, ob ueber die Systemvariable '_shell_p' eine      |
  207.  | Kommandoshell installiert ist.                                           |
  208.   --------------------------------------------------------------------------*)
  209.  
  210.  PROCEDURE CallShell ((* EIN/ -- *) cmd : StrPtr ): INTEGER;
  211.  
  212. (*--------------------------------------------------------------------------
  213.  | Versucht ein Shell-Kommando ueber die Systemvariable '_shell_p' abzu-    |
  214.  | setzen. Vorher wird mit "ShellInstalled()" ueberprueft, ob eine Shell    |
  215.  | installiert ist; wenn allerdings nach einem Reset oder nach Beendigung   |
  216.  | einer Shell (-> Gulam) diese Variable nicht wieder auf NULL gesetzt wird,|
  217.  | gibts mit ziemlicher Sicherheit einen Systemabsturz!                     |
  218.  | Als Funktionswert wird -1 zurueckgeliefert, falls keine Shell installiert|
  219.  | ist, ansonsten der Rueckgabewert der Shell.                              |
  220.   --------------------------------------------------------------------------*)
  221.  
  222.  PROCEDURE ProcessDomain ((* EIN/ -- *) dom : INTEGER ): INTEGER;
  223.  
  224. (*--------------------------------------------------------------------------
  225.  | Beeinflusst das Verhalten bestimmter Systemaufrufe.                      |
  226.  | <dom> < 0: Keine Aenderung, nur Abfrage                                  |
  227.  | <dom> = 0: TOS-Domain                                                    |
  228.  | <dom> = 1: MiNT-Domain                                                   |
  229.  |                                                                          |
  230.  | Der alte ``Domain''-Wert wird zurueckgeliefert. Die Funktion hat nur     |
  231.  | unter MiNT eine Auswirkung.                                              |
  232.  | Ist MiNT bei Programmstart aktiv, wird automatisch MiNT-Domain voreinge- |
  233.  | stellt.                                                                  |
  234.  | Fuer ein ACC, das unter einem Nicht-Multitasking-Desktop laeuft, sollte  |
  235.  | die TOS-Domain eingestellt werden, da sonst der Desktop auch in der MiNT-|
  236.  | Domain laeuft und z.B. die Dateinamen klein sind. Wird Ulrich Kaisers    |
  237.  | 'crystal'- bzw. 'M2GEM'-Bibliothek ab Version 1.03 verwendet, geschieht  |
  238.  | dies automatisch.                                                        |
  239.   --------------------------------------------------------------------------*)
  240.  
  241.  
  242.  PROCEDURE FcntlAvail ( ): BOOLEAN;
  243.  
  244.  PROCEDURE DpathconfAvail ( ): BOOLEAN;
  245.  
  246.  PROCEDURE SysconfAvail ( ): BOOLEAN;
  247.  
  248.  PROCEDURE DgetcwdAvail ( ): BOOLEAN;
  249.  
  250. (*--------------------------------------------------------------------------
  251.  | Die Funktionen testen das Vorhandensein bestimmter GEMDOS-Funktionen,    |
  252.  | unabhaengig von MiNT.                                                    |
  253.   --------------------------------------------------------------------------*)
  254.  
  255.  
  256.  PROCEDURE DosPid ((* EIN/ -- *) bp : ADDRESS ): INTEGER;
  257.  
  258. (*--------------------------------------------------------------------------
  259.  | Berechnet aus der Adresse der Basepage eine (hoffentlich) eindeutige     |
  260.  | Prozesskennung.                                                          |
  261.   --------------------------------------------------------------------------*)
  262.  
  263.  
  264. (* Routinen zur Manipulation des Cookie-Jars.
  265.  * Die Routinen koennen keinen neuen Cookie-Jar einrichten, bzw. einen
  266.  * bestehenden erweitern. Hierzu muss der benoetigte Speicher resident
  267.  * bleiben, i.a. muss dafuer also ein residentes Programm benutzt
  268.  * werden. Auch das Erweitern erfordert einen residenten Speicher, da ALLE
  269.  * Cookies, also nicht nur der neu einzutragende, der den vorhandenen Jar
  270.  * gesprengt haette, in den neuen Speicherbereich kopiert werden muessen.
  271.  *)
  272.  
  273.  PROCEDURE GetCookieBase ((* -- /AUS *) VAR pcookies : CookiePtr );
  274.  
  275. (*--------------------------------------------------------------------------
  276.  | Es wird ein Zeiger auf den Cookie Jar geliefert, falls vorhanden; anson- |
  277.  | sten ist <pcookies> gleich NULL.                                         |
  278.  | Der Cookie Jar ist ein Feld von Eintraegen des Typs 'Cookie'. Der letzte |
  279.  | Cookie hat die ID '0H' und als Wert die Anzahl der moeglichen Eintraege  |
  280.  | im Cookie Jar. Hierbei ist zu beachten, dass dieser End-Cookie selbst    |
  281.  | einen Eintrag belegt.                                                    |
  282.   --------------------------------------------------------------------------*)
  283.  
  284.  PROCEDURE GetCookie ((* EIN/ -- *)     cookie : UNSIGNEDLONG;
  285.                       (* -- /AUS *) VAR value  : CookieVal    ): BOOLEAN;
  286.  
  287. (*--------------------------------------------------------------------------
  288.  | Der Cookie mit der ID <cookie> wird gesucht. Ist der Cookie nicht vor-   |
  289.  | handen oder kein Cookie Jar installiert, ist der Funktionswert FALSE,    |
  290.  | und <value> ist Null;sonst wird in <value> der Wert des Cookies geliefert|
  291.   --------------------------------------------------------------------------*)
  292.  
  293.  PROCEDURE SetCookie ((* EIN/ -- *)     cookie : UNSIGNEDLONG;
  294.                       (* EIN/ -- *)     value  : CookieVal;
  295.                       (* -- /AUS *) VAR done   : BOOLEAN      );
  296.  
  297. (*--------------------------------------------------------------------------
  298.  | Der Cookie mit der ID <cookie> wird gesucht. Wird der Cookie gefunden,   |
  299.  | erhaelt er den neuen Wert <value>. Wird der Cookie nicht gefunden, so    |
  300.  | wird er neu eingetragen mit <cookie> und <value>. Ist im Cookie Jar nicht|
  301.  | mehr genuegend Platz fuer den neuen Cookie, wird nichts geaendert, und   |
  302.  | <done> ist gleich FALSE.                                                 |
  303.   --------------------------------------------------------------------------*)
  304.  
  305.  PROCEDURE RemoveCookie ((* EIN/ -- *)     cookie : UNSIGNEDLONG;
  306.                          (* -- /AUS *) VAR found  : BOOLEAN      );
  307.  
  308. (*--------------------------------------------------------------------------
  309.  | der Cookie mit der ID <cookie> wird gesucht und aus dem Cookie Jar ent-  |
  310.  | fernt. Wird er nicht gefunden, passiert nichts, und <found> ist gleich   |
  311.  | FALSE.                                                                   |
  312.   --------------------------------------------------------------------------*)
  313.  
  314.  
  315.  PROCEDURE CookieJarSize( ): CARDINAL;
  316.  
  317.  PROCEDURE FreeEntries( ): CARDINAL;
  318.  
  319. (*--------------------------------------------------------------------------
  320.  | Es wird die Anzahl der moeglichen Eintraege im Cookie Jar einschliess-   |
  321.  | lich des End-Cookies, bzw. die Anzahl der noch freien Eintraege geliefert|
  322.   --------------------------------------------------------------------------*)
  323.  
  324.  
  325.  (* Die folgenden Funktionen liefern ihren Wert anhand eines Cookie-Jar-
  326.   * Eintrags, der aber nur beim Programmstart untersucht wird, da davon
  327.   * ausgegangen wird, das sich der Wert dieser Cookies waehrend des
  328.   * Programmlaufs nicht aendert.
  329.   *)
  330.  
  331.  PROCEDURE Machine ( ): MachineType;
  332.  
  333. (*--------------------------------------------------------------------------
  334.  | Versucht den Typ des Rechners durch den '_MCH'-Cookie festzustellen.     |
  335.   --------------------------------------------------------------------------*)
  336.  
  337.  PROCEDURE CPU ( ): CPUType;
  338.  
  339. (*--------------------------------------------------------------------------
  340.  | Versucht den Typ der CPU durch den '_CPU'-Cookie festzustellen.          |
  341.   --------------------------------------------------------------------------*)
  342.  
  343.  PROCEDURE FPU ((* -- /AUS *) VAR info : FPUInfo );
  344.  
  345. (*--------------------------------------------------------------------------
  346.  | Versucht den Typ der FPU durch den '_FPU'-Cookie festzustellen.          |
  347.   --------------------------------------------------------------------------*)
  348.  
  349.  PROCEDURE MiNTVersion ( ): CARDINAL;
  350.  
  351. (*--------------------------------------------------------------------------
  352.  | Liefert die kodierte MiNT-Version (= 0, falls MiNT nicht aktiv).         |
  353.   --------------------------------------------------------------------------*)
  354.  
  355.  PROCEDURE MagiXVersion ( ): CARDINAL;
  356.  
  357. (*--------------------------------------------------------------------------
  358.  | Liefert die kodierte MagiX-Version (= 0, falls MagiX nicht aktiv).       |
  359.   --------------------------------------------------------------------------*)
  360.  
  361.  PROCEDURE FileLocking ( ): BOOLEAN;
  362.  
  363. (*--------------------------------------------------------------------------
  364.  | Testet, ob das Betriebssystem ``File locking'' unterstuetzt.             |
  365.   --------------------------------------------------------------------------*)
  366.  
  367.  PROCEDURE Language ( ): PrefLanguage;
  368.  
  369. (*--------------------------------------------------------------------------
  370.  | Ermittelt die vorzugsweise verwendete ``Sprache'' des Desktops aus dem   |
  371.  | '_AKP'-Cookie, bzw. aus dem 'OsHeader', falls der Cookie nicht existiert.|
  372.  | Unter MultiTOS hat die durch 'appl_getinfo' erhaltene Information        |
  373.  | (aus der Konfigurationsvariable AE_LANG, erscheint nicht im Environment) |
  374.  | Vorrang vor "Language()", es gibt allerdings nur: Englisch, Deutsch,     |
  375.  | Franzoesisch, Spanisch und Italienisch.                                  |
  376.   --------------------------------------------------------------------------*)
  377.  
  378.  
  379. (* Mithilfe der folgenden Prozeduren kann auf RAM-Bereiche zugegriffen
  380.  * werden, die nur im Supervisormodus der CPU zugaenglich sind, also der
  381.  * Bereich der Systemvariablen und die Hardwareregister, und unter MiNT-
  382.  * Memory-Protection die im Supervisormodus zugaenglichen Bereiche.
  383.  * <adr> darf nur bei den Prozeduren ungerade sein, die eine beliebige Anzahl
  384.  * Bytes kopieren ("ReadSysMem()", "WriteSysMem()"). Es ist egal, in welchem
  385.  * Modus die CPU beim Aufruf dieser Prozeduren ist. Die Prozeduren sind
  386.  * nicht reentrant.
  387.  *)
  388.  
  389.  PROCEDURE ReadWordSysMem ((* EIN/ -- *) adr : UNSIGNEDLONG ): UNSIGNEDWORD;
  390.  
  391.  PROCEDURE ReadLongSysMem ((* EIN/ -- *) adr : UNSIGNEDLONG ): UNSIGNEDLONG;
  392.  
  393.  PROCEDURE ReadSysMem ((* EIN/ -- *)     adr : UNSIGNEDLONG;
  394.                        (* -- /AUS *) VAR val : ARRAY OF ANYBYTE );
  395.  
  396.  PROCEDURE WriteWordSysMem ((* EIN/ -- *) adr : UNSIGNEDLONG;
  397.                             (* EIN/ -- *) val : UNSIGNEDWORD );
  398.  
  399.  PROCEDURE WriteLongSysMem ((* EIN/ -- *) adr : UNSIGNEDLONG;
  400.                             (* EIN/ -- *) val : UNSIGNEDLONG );
  401.  
  402.  PROCEDURE WriteSysMem ((* EIN/ -- *)     adr : UNSIGNEDLONG;
  403.                         (* EIN/ -- *) VAR val : ARRAY OF ANYBYTE );
  404.  
  405.  
  406. (* Auf die Vektoren im Adressbereich $8 bis $41c darf nur mittels der
  407.  * Vektornummer zugegriffen werden, da die Adressen nicht feststehen!
  408.  * Hierfuer gibt es die folgenden Prozeduren:
  409.  *)
  410.  
  411.  PROCEDURE SetException ((* EIN/ -- *)     vec : ExcVector;
  412.                          (* EIN/ -- *)     new : ADDRESS;
  413.                          (* -- /AUS *) VAR old : ADDRESS   );
  414.  
  415.  PROCEDURE GetException ((* EIN/ -- *) vec : ExcVector ): ADDRESS;
  416.  
  417. END DosSystem.
  418.