BIOSIO.MOD 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. (* Release 3.10 *)
  2. (*-------------------------------------------------------------------------*
  3. * *
  4. * BIOSIO.MOD - BIOS level i/o *
  5. * *
  6. * COPYRIGHT (C) 1987..1992 Clarion Software Corporation. *
  7. * All Rights Reserved *
  8. * *
  9. *--------------------------------------------------------------------------*)
  10. (*%F _fdata *)
  11. (*# call(seg_name => null) *)
  12. (*%E *)
  13. (*# module(implementation=>off) *)
  14. (*# data(seg_name => null) *)
  15. (*# check(stack=>off,
  16. index=>off,
  17. range=>off,
  18. overflow=>off,
  19. nil_ptr=>off) *)
  20. IMPLEMENTATION MODULE BiosIO ;
  21. IMPORT Lib,IO,SYSTEM;
  22. PROCEDURE KeyPressed() : BOOLEAN ;
  23. VAR R : SYSTEM.Registers;
  24. BEGIN
  25. IF LastChar = CHR(0) THEN
  26. RETURN TRUE ;
  27. ELSE
  28. R.AH := 1;
  29. IF EnhancedBIOS THEN R.AH := 11H END ;
  30. Lib.Intr(R,16H);
  31. RETURN NOT (SYSTEM.ZeroFlag IN R.Flags) ;
  32. END ;
  33. END KeyPressed;
  34. PROCEDURE RdKey () : CHAR ;
  35. VAR R : SYSTEM.Registers;
  36. BEGIN
  37. IF LastChar = CHR(0) THEN
  38. LastChar := CHR(0FFH) ;
  39. RETURN CHR(LastScan) ;
  40. ELSE
  41. IF EnhancedBIOS THEN
  42. R.AH := 10H ;
  43. Lib.Intr(R,16H);
  44. IF (R.AL=0E0H)AND(R.AH<>0) THEN R.AL := 0 END ;
  45. ELSE
  46. R.AH := 0 ;
  47. Lib.Intr(R,16H);
  48. END ;
  49. IF R.AX=0 THEN END ; (* break *)
  50. LastChar := CHR(R.AL) ;
  51. LastScan := R.AH ;
  52. RETURN LastChar ;
  53. END;
  54. END RdKey ;
  55. PROCEDURE RdChar () : CHAR ;
  56. (* reads and echoes char (if not extended) *)
  57. VAR C : CHAR ;
  58. BEGIN
  59. IF LastChar = CHR(0) THEN RETURN RdKey() END ;
  60. C := RdKey() ;
  61. IF C<>CHR(0) THEN
  62. IO.WrChar( C );
  63. END ;
  64. RETURN C ;
  65. END RdChar ;
  66. PROCEDURE KBFlags () : KBFlagSet ;
  67. VAR R : SYSTEM.Registers;
  68. BEGIN
  69. R.AH := 2 ;
  70. Lib.Intr(R,16H);
  71. RETURN KBFlagSet(R.AL) ;
  72. END KBFlags ;
  73. PROCEDURE Init ;
  74. VAR R : SYSTEM.Registers ;
  75. i : CARDINAL ;
  76. BEGIN
  77. LastScan := 0 ;
  78. LastChar := CHR(0FFH) ;
  79. EnhancedBIOS := FALSE ;
  80. (* Check for enhanced BIOS *)
  81. R.AX := 5FFH ;
  82. R.CX := 0FFFFH ;
  83. Lib.Intr(R,16H); (* Put FFFF into Kbd buffer *)
  84. IF R.AL=0 THEN
  85. i := 256 ;
  86. LOOP
  87. R.AH := 11H ;
  88. Lib.Intr(R,16H); (* And try and read it back *)
  89. IF SYSTEM.ZeroFlag IN R.Flags THEN EXIT END ;
  90. R.AH := 10H ;
  91. Lib.Intr(R,16H); (* And try and read it back *)
  92. IF (R.AX=0FFFFH) OR (i=0) THEN EXIT END ;
  93. DEC (i);
  94. END ;
  95. IF R.AX=0FFFFH THEN
  96. EnhancedBIOS := TRUE ;
  97. END ;
  98. END ;
  99. END Init ;
  100. BEGIN
  101. Init ;
  102. END BiosIO.
  103.