home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1990-11-06 | 3.6 KB | 146 lines |
- (* ------------------------------------------------------ *)
- (* DIAGNOSE.MOD *)
- (* (c) 1991 Michael 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
- MOV DL, Laufwerk
- MOV AH, 28
- INT 21H
- MOV cx, CX (* Sektorgroesse *)
- MOV al, AL (* Sektoren pro Cluster *)
- MOV dx, DX (* 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
- MOV DL, Laufwerk
- MOV AH, 54
- INT 21H
- MOV cx, CX (* Sektorgroesse *)
- MOV ax, AX (* Sektoren pro Cluster *)
- MOV bx, BX (* Anzahl freie Cluster *)
- END;
- Ergebnis := cx * ax * bx; (* freie Kapazität *)
- RETURN Ergebnis;
- END DiskFree;
-
- PROCEDURE DosVersion(VAR Hoch, Tief : CARDINAL);
- BEGIN
- ASM
- MOV AH, 30H
- INT 21H
- LES DI, Tief (* VAR-Parameter! *)
- MOV BYTE ES:[DI], AH (* untergeordnete VersionsNr *)
- LES DI, Hoch
- MOV BYTE ES:[DI], AL (* übergeordnete VersionsNr *)
- END;
- END DosVersion;
-
- PROCEDURE DosMemory() : CARDINAL;
- VAR
- KBytes : CARDINAL;
- BEGIN
- ASM
- INT 12H
- MOV KBytes, AX (* Groesse in KByte *)
- END;
- RETURN KBytes;
- END DosMemory;
-
- PROCEDURE ExtendedMemory() : CARDINAL;
- VAR
- KBytes : CARDINAL;
- BEGIN
- KBytes := 0;
- ASM
- MOV AX, 8800H
- INT 15H
- MOV KBytes, AX (* Groesse in KByte *)
- 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
- AND AX, 2 (* Bit 1 ausmaskieren *)
- MOV ax, AX
- END;
- IF ax = 2 THEN
- RETURN TRUE; (* Bit 1 gesetzt = CoProzessor *)
- ELSE
- RETURN FALSE;
- END;
- END;
- END CoProzessor;
-
- PROCEDURE VideoModus() : Modus;
- VAR
- ax : CARDINAL;
- Modi : Modus;
- BEGIN
- ASM
- INT 11H
- 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.
- (* ------------------------------------------------------ *)
- (* Ende von DIAGNOSE.MOD *)
-