biosio.mod 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. IMPLEMENTATION MODULE BiosIO ;
  2. FROM SYSTEM IMPORT Registers,ZeroFlag ;
  3. IMPORT Lib,IO ;
  4. VAR
  5. EnhancedBIOS : BOOLEAN ;
  6. PROCEDURE KeyPressed() : BOOLEAN ;
  7. VAR R : Registers;
  8. BEGIN
  9. IF LastChar = CHR(0) THEN
  10. RETURN TRUE ;
  11. ELSE
  12. R.AH := 1;
  13. IF EnhancedBIOS THEN R.AH := 11H END ;
  14. Lib.Intr(R,16H);
  15. RETURN NOT (ZeroFlag IN R.Flags) ;
  16. END ;
  17. END KeyPressed;
  18. PROCEDURE RdKey () : CHAR ;
  19. VAR R : Registers;
  20. BEGIN
  21. IF LastChar = CHR(0) THEN
  22. LastChar := CHR(0FFH) ;
  23. RETURN CHR(LastScan) ;
  24. ELSE
  25. IF EnhancedBIOS THEN
  26. R.AH := 10H ;
  27. Lib.Intr(R,16H);
  28. IF (R.AL=0E0H)AND(R.AH<>0) THEN R.AL := 0 END ;
  29. ELSE
  30. R.AH := 0 ;
  31. Lib.Intr(R,16H);
  32. END ;
  33. IF R.AX=0 THEN END ; (* break *)
  34. LastChar := CHR(R.AL) ;
  35. LastScan := R.AH ;
  36. RETURN LastChar ;
  37. END;
  38. END RdKey ;
  39. PROCEDURE RdChar () : CHAR ;
  40. (* reads and echoes char (if not extended) *)
  41. VAR C : CHAR ;
  42. BEGIN
  43. IF LastChar = CHR(0) THEN RETURN RdKey() END ;
  44. C := RdKey() ;
  45. IF C<>CHR(0) THEN
  46. IO.WrChar( C );
  47. END ;
  48. RETURN C ;
  49. END RdChar ;
  50. PROCEDURE KBFlags () : KBFlagSet ;
  51. VAR R : Registers;
  52. BEGIN
  53. R.AH := 2 ;
  54. Lib.Intr(R,16H);
  55. RETURN KBFlagSet(R.AL) ;
  56. END KBFlags ;
  57. PROCEDURE Init ;
  58. VAR R : Registers ;
  59. BEGIN
  60. LastScan := 0 ;
  61. LastChar := CHR(0FFH) ;
  62. EnhancedBIOS := FALSE ;
  63. (* Check for enhanced BIOS *)
  64. R.AH := 5 ;
  65. R.CX := 0FFFFH ;
  66. Lib.Intr(R,16H); (* Put FFFF into Kbd buffer *)
  67. R.AH := 11H ;
  68. Lib.Intr(R,16H); (* And try and read it back *)
  69. IF R.AX=0FFFFH THEN
  70. R.AH := 10H ;
  71. Lib.Intr(R,16H); (* clear FFFF *)
  72. EnhancedBIOS := TRUE ;
  73. END ;
  74. END Init ;
  75. BEGIN
  76. Init ;
  77. END BiosIO.
  78.