home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1989-07-13 | 3.8 KB | 150 lines |
- (******************************************************)
- (* DIAGNOSE.MOD *)
- (* Hardware-Diagnose-Tools für Fitted Modula *)
- (* (C) 1989 M.Rother & TOOLBOX *)
-
- IMPLEMENTATION MODULE Diagnose;
-
-
- FROM SYSTEM IMPORT ASSEMBLER;
-
- PROCEDURE DiskSize(Laufwerk : INTEGER) : LONGCARD;
- VAR cx, al, dx, Ergebnis : LONGCARD;
- BEGIN
- cx := 0L;
- al := 0L;
- dx := 0L;
- ASM
- (* Laufwerksnummer (A=1,B=2...) nach DL *)
- MOV DL, Laufwerk
- (* Unterfunktion 28 von *)
- (* DOS-Interrupt *)
- MOV AH, 28
- INT 21H
- MOV cx, CX (* CX enthält Sektorgroesse *)
- MOV al, AL (* AL enthält Sektoren pro Cluster *)
- MOV dx, DX (* DX enthält Zylinder pro Laufwerk *)
- END;
- Ergebnis := cx * al * dx; (* Kapazitätsberechnung *)
- RETURN Ergebnis;
- END DiskSize;
-
-
- PROCEDURE DiskFree(Laufwerk : INTEGER) : LONGCARD;
- VAR cx, ax, bx, Ergebnis : LONGCARD;
- BEGIN
- cx := 0L;
- ax := 0L;
- bx := 0L;
- ASM
- (* Laufwerksnummer (A=1,B=2...) nach DL *)
- MOV DL, Laufwerk
- (* Unterfunktion 54 von *)
- (* DOS-Interrupt *)
- MOV AH, 54
- INT 21H
- MOV cx, CX (* CX enthält Sektorgroesse *)
- MOV ax, AX (* AX enthält Sektoren pro Cluster *)
- MOV bx, BX (* BX enthält Anzahl freie Cluster *)
- END;
- (* Errechnung freier Kapazität *)
- Ergebnis := cx * ax * bx;
- RETURN Ergebnis;
- END DiskFree;
-
- PROCEDURE DosVersion(VAR Hoch, Tief : CARDINAL);
- BEGIN
- ASM
- (* Unterfunktion 48 von *)
- (* DOS-Interrupt *)
- MOV AH, 48
- INT 21H
- LES DI, Tief (* VAR-Parameter! *)
- MOV BYTE ES:[DI], AH (* untergeord. VersionsNr *)
- LES DI, Hoch
- MOV BYTE ES:[DI], AL (* übergeord. VersionsNr *)
- END;
- END DosVersion;
-
- PROCEDURE DosMemory() : CARDINAL;
- VAR KBytes : CARDINAL;
- BEGIN
- ASM
- INT 12H (* Interrupt 12H *)
- MOV KBytes, AX
- (* AX enthaelt die Groesse in KBytes *)
- END;
- RETURN KBytes;
- END DosMemory;
-
- PROCEDURE ExtendedMemory() : CARDINAL;
- VAR KBytes : CARDINAL;
- BEGIN
- KBytes := 0;
- ASM
- MOV AX, 8800H (* Funktion 136 von *)
- INT 15H (* Interrupt 15H *)
- MOV KBytes, AX (* AX enth. d. Groesse in KBytes *)
- END;
- RETURN KBytes;
- END ExtendedMemory;
-
- PROCEDURE Ist_AT() : BOOLEAN;
- VAR AT : CARDINAL;
- BEGIN
- AT := 0;
- ASM
- PUSH DS (* Datensegment retten *)
- MOV AX, 0F000H (* neues Segment (BIOS) *)
- MOV DS, AX
- MOV BX, BYTE 0FFFEH (* neuer Offset (BIOS) *)
- MOV AL, [BX] (* Wert auslesen *)
- MOV AT, AL
- POP DS (* Datensegment restaurieren *)
- END;
- IF AT = 252 THEN
- RETURN TRUE;
- ELSE
- RETURN FALSE;
- END;
- END Ist_AT;
-
- PROCEDURE CoProzessor() : BOOLEAN;
- VAR ax : CARDINAL;
- BEGIN
- IF AT = TRUE THEN
- ASM
- INT 11H (* Interrupt 11H f. Konf. *)
- AND AX, 2 (* Bit 1 ausmaskieren *)
- MOV ax, AX
- END;
- IF ax = 2 THEN
- RETURN TRUE; (* Bit 1 ==> CoProzessor*)
- ELSE
- RETURN FALSE;
- END;
- END;
- END CoProzessor;
-
- PROCEDURE VideoModus() : Modus;
- VAR ax : CARDINAL;
- VAR Modi : Modus;
- BEGIN
- ASM
- INT 11H (* Interrupt 11H f.Konf. *)
- AND AX, 48 (* Bits 4 und 5 ausmaskieren *)
- MOV ax, AX
- END;
- CASE ax OF
- 16 : Modi := Farbe; RETURN Modi;
- | 32 : Modi := Farbe; RETURN Modi;
- | 48 : Modi := Mono; RETURN Modi;
- ELSE
- Modi := Unbekannt; RETURN Modi;
- END;
- END VideoModus;
-
- BEGIN
- AT := Ist_AT();
- END Diagnose.
-