| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- (* Release 3.10 *)
- (*-------------------------------------------------------------------------*
- * *
- * BIOSIO.MOD - BIOS level i/o *
- * *
- * COPYRIGHT (C) 1987..1992 Clarion Software Corporation. *
- * All Rights Reserved *
- * *
- *--------------------------------------------------------------------------*)
- (*%F _fdata *)
- (*# call(seg_name => null) *)
- (*%E *)
- (*# module(implementation=>off) *)
- (*# data(seg_name => null) *)
- (*# check(stack=>off,
- index=>off,
- range=>off,
- overflow=>off,
- nil_ptr=>off) *)
- IMPLEMENTATION MODULE BiosIO ;
- IMPORT Lib,IO,SYSTEM;
- PROCEDURE KeyPressed() : BOOLEAN ;
- VAR R : SYSTEM.Registers;
- BEGIN
- IF LastChar = CHR(0) THEN
- RETURN TRUE ;
- ELSE
- R.AH := 1;
- IF EnhancedBIOS THEN R.AH := 11H END ;
- Lib.Intr(R,16H);
- RETURN NOT (SYSTEM.ZeroFlag IN R.Flags) ;
- END ;
- END KeyPressed;
- PROCEDURE RdKey () : CHAR ;
- VAR R : SYSTEM.Registers;
- BEGIN
- IF LastChar = CHR(0) THEN
- LastChar := CHR(0FFH) ;
- RETURN CHR(LastScan) ;
- ELSE
- IF EnhancedBIOS THEN
- R.AH := 10H ;
- Lib.Intr(R,16H);
- IF (R.AL=0E0H)AND(R.AH<>0) THEN R.AL := 0 END ;
- ELSE
- R.AH := 0 ;
- Lib.Intr(R,16H);
- END ;
- IF R.AX=0 THEN END ; (* break *)
- LastChar := CHR(R.AL) ;
- LastScan := R.AH ;
- RETURN LastChar ;
- END;
- END RdKey ;
- PROCEDURE RdChar () : CHAR ;
- (* reads and echoes char (if not extended) *)
- VAR C : CHAR ;
- BEGIN
- IF LastChar = CHR(0) THEN RETURN RdKey() END ;
- C := RdKey() ;
- IF C<>CHR(0) THEN
- IO.WrChar( C );
- END ;
- RETURN C ;
- END RdChar ;
- PROCEDURE KBFlags () : KBFlagSet ;
- VAR R : SYSTEM.Registers;
- BEGIN
- R.AH := 2 ;
- Lib.Intr(R,16H);
- RETURN KBFlagSet(R.AL) ;
- END KBFlags ;
- PROCEDURE Init ;
- VAR R : SYSTEM.Registers ;
- i : CARDINAL ;
- BEGIN
- LastScan := 0 ;
- LastChar := CHR(0FFH) ;
- EnhancedBIOS := FALSE ;
- (* Check for enhanced BIOS *)
- R.AX := 5FFH ;
- R.CX := 0FFFFH ;
- Lib.Intr(R,16H); (* Put FFFF into Kbd buffer *)
- IF R.AL=0 THEN
- i := 256 ;
- LOOP
- R.AH := 11H ;
- Lib.Intr(R,16H); (* And try and read it back *)
- IF SYSTEM.ZeroFlag IN R.Flags THEN EXIT END ;
- R.AH := 10H ;
- Lib.Intr(R,16H); (* And try and read it back *)
- IF (R.AX=0FFFFH) OR (i=0) THEN EXIT END ;
- DEC (i);
- END ;
- IF R.AX=0FFFFH THEN
- EnhancedBIOS := TRUE ;
- END ;
- END ;
- END Init ;
- BEGIN
- Init ;
- END BiosIO.
|