home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 09 / praxis / diagnose.mod < prev    next >
Encoding:
Modula Implementation  |  1989-07-13  |  3.8 KB  |  150 lines

  1. (******************************************************)
  2. (*                    DIAGNOSE.MOD                    *)
  3. (*      Hardware-Diagnose-Tools für Fitted Modula     *)
  4. (*           (C) 1989 M.Rother & TOOLBOX              *)
  5.  
  6. IMPLEMENTATION MODULE Diagnose;
  7.  
  8.  
  9.   FROM SYSTEM IMPORT ASSEMBLER;
  10.  
  11.   PROCEDURE DiskSize(Laufwerk : INTEGER) : LONGCARD;
  12.   VAR cx, al, dx, Ergebnis : LONGCARD;
  13.   BEGIN
  14.     cx := 0L;
  15.     al := 0L;
  16.     dx := 0L;
  17.     ASM
  18.       (* Laufwerksnummer (A=1,B=2...) nach DL *)
  19.       MOV DL, Laufwerk
  20.       (* Unterfunktion 28 von  *)
  21.       (* DOS-Interrupt         *)
  22.       MOV AH, 28
  23.       INT 21H
  24.       MOV cx, CX  (* CX enthält Sektorgroesse         *)
  25.       MOV al, AL  (* AL enthält Sektoren pro Cluster  *)
  26.       MOV dx, DX  (* DX enthält Zylinder pro Laufwerk *)
  27.     END;
  28.     Ergebnis := cx * al * dx; (* Kapazitätsberechnung *)
  29.     RETURN Ergebnis;
  30.   END DiskSize;
  31.  
  32.  
  33.   PROCEDURE DiskFree(Laufwerk : INTEGER) : LONGCARD;
  34.   VAR cx, ax, bx, Ergebnis : LONGCARD;
  35.   BEGIN
  36.     cx := 0L;
  37.     ax := 0L;
  38.     bx := 0L;
  39.     ASM
  40.       (* Laufwerksnummer (A=1,B=2...) nach DL *)
  41.       MOV DL, Laufwerk
  42.       (* Unterfunktion 54 von *)
  43.       (* DOS-Interrupt        *)
  44.       MOV AH, 54
  45.       INT 21H
  46.       MOV cx, CX (* CX enthält Sektorgroesse        *)
  47.       MOV ax, AX (* AX enthält Sektoren pro Cluster *)
  48.       MOV bx, BX (* BX enthält Anzahl freie Cluster *)
  49.     END;
  50.     (* Errechnung freier Kapazität *)
  51.     Ergebnis := cx * ax * bx;
  52.     RETURN Ergebnis;
  53.   END DiskFree;
  54.  
  55.   PROCEDURE DosVersion(VAR Hoch, Tief : CARDINAL);
  56.   BEGIN
  57.     ASM
  58.       (* Unterfunktion 48 von *)
  59.       (* DOS-Interrupt        *)
  60.       MOV AH, 48
  61.       INT 21H
  62.       LES DI, Tief         (* VAR-Parameter!         *)
  63.       MOV BYTE ES:[DI], AH (* untergeord. VersionsNr *)
  64.       LES DI, Hoch
  65.       MOV BYTE ES:[DI], AL (* übergeord. VersionsNr  *)
  66.     END;
  67.   END DosVersion;
  68.  
  69.   PROCEDURE DosMemory() : CARDINAL;
  70.   VAR KBytes : CARDINAL;
  71.   BEGIN
  72.     ASM
  73.       INT 12H         (* Interrupt 12H *)
  74.       MOV KBytes, AX
  75.       (* AX enthaelt die Groesse in KBytes *)
  76.     END;
  77.     RETURN KBytes;
  78.   END DosMemory;
  79.  
  80.   PROCEDURE ExtendedMemory() : CARDINAL;
  81.   VAR KBytes : CARDINAL;
  82.   BEGIN
  83.     KBytes := 0;
  84.     ASM
  85.       MOV AX, 8800H  (* Funktion 136 von              *)
  86.       INT 15H        (* Interrupt 15H                 *)
  87.       MOV KBytes, AX (* AX enth. d. Groesse in KBytes *)
  88.     END;
  89.     RETURN KBytes;
  90.   END ExtendedMemory;
  91.  
  92.   PROCEDURE Ist_AT() : BOOLEAN;
  93.   VAR AT : CARDINAL;
  94.   BEGIN
  95.     AT := 0;
  96.     ASM
  97.       PUSH DS               (* Datensegment retten  *)
  98.       MOV AX, 0F000H        (* neues Segment (BIOS) *)
  99.       MOV DS, AX
  100.       MOV BX, BYTE 0FFFEH   (* neuer Offset  (BIOS) *)
  101.       MOV AL, [BX]          (* Wert auslesen        *)
  102.       MOV AT, AL
  103.       POP DS           (* Datensegment restaurieren *)
  104.     END;
  105.     IF AT = 252 THEN
  106.       RETURN TRUE;
  107.     ELSE
  108.       RETURN FALSE;
  109.     END;
  110.   END Ist_AT;
  111.  
  112.   PROCEDURE CoProzessor() : BOOLEAN;
  113.   VAR ax : CARDINAL;
  114.   BEGIN
  115.     IF AT = TRUE THEN
  116.       ASM
  117.         INT 11H    (* Interrupt 11H f. Konf. *)
  118.         AND AX, 2  (* Bit 1 ausmaskieren     *)
  119.         MOV ax, AX
  120.       END;
  121.       IF ax = 2 THEN
  122.         RETURN TRUE; (* Bit 1 ==> CoProzessor*)
  123.       ELSE
  124.         RETURN FALSE;
  125.       END;
  126.     END;
  127.   END CoProzessor;
  128.  
  129.   PROCEDURE VideoModus() : Modus;
  130.   VAR ax : CARDINAL;
  131.   VAR Modi : Modus;
  132.   BEGIN
  133.     ASM
  134.       INT 11H    (* Interrupt 11H f.Konf.     *)
  135.       AND AX, 48 (* Bits 4 und 5 ausmaskieren *)
  136.       MOV ax, AX
  137.     END;
  138.     CASE ax OF
  139.       16 :   Modi := Farbe; RETURN Modi;
  140.     | 32 :   Modi := Farbe; RETURN Modi;
  141.     | 48 :   Modi := Mono;  RETURN Modi;
  142.     ELSE
  143.              Modi := Unbekannt; RETURN Modi;
  144.     END;
  145.   END VideoModus;
  146.  
  147. BEGIN
  148.   AT := Ist_AT();
  149. END Diagnose.
  150.