Input.Mod.txt 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. MODULE Input; (*NW 5.10.86 / 15.11.90 Ceres-2; PDR 21.4.12 / NW 15.5.2013 Ceres-4*)
  2. IMPORT SYSTEM;
  3. CONST msAdr = -40; kbdAdr = -36;
  4. VAR kbdCode: BYTE; (*last keyboard code read*)
  5. Recd, Up, Shift, Ctrl, Ext: BOOLEAN;
  6. KTabAdr: INTEGER; (*keyboard code translation table*)
  7. MW, MH, MX, MY: INTEGER; (*mouse limits and coords*)
  8. MK: SET; (*mouse keys*)
  9. (*FIFO implemented in hardware, because every read must be handled,
  10. including tracking the state of the Shift and Ctrl keys*)
  11. PROCEDURE Peek();
  12. BEGIN
  13. IF SYSTEM.BIT(msAdr, 28) THEN
  14. SYSTEM.GET(kbdAdr, kbdCode);
  15. IF kbdCode = 0F0H THEN Up := TRUE
  16. ELSIF kbdCode = 0E0H THEN Ext := TRUE
  17. ELSE
  18. IF (kbdCode = 12H) OR (kbdCode = 59H) THEN (*shift*) Shift := ~Up
  19. ELSIF kbdCode = 14H THEN (*ctrl*) Ctrl := ~Up
  20. ELSIF ~Up THEN Recd := TRUE (*real key going down*)
  21. END ;
  22. Up := FALSE; Ext := FALSE
  23. END
  24. END;
  25. END Peek;
  26. PROCEDURE Available*(): INTEGER;
  27. BEGIN Peek();
  28. RETURN ORD(Recd)
  29. END Available;
  30. PROCEDURE Read*(VAR ch: CHAR);
  31. BEGIN
  32. WHILE ~Recd DO Peek() END ;
  33. IF Shift OR Ctrl THEN INC(kbdCode, 80H) END; (*ctrl implies shift*)
  34. (* ch := kbdTab[kbdCode]; *)
  35. SYSTEM.GET(KTabAdr + kbdCode, ch);
  36. IF Ctrl THEN ch := CHR(ORD(ch) MOD 20H) END;
  37. Recd := FALSE
  38. END Read;
  39. PROCEDURE Mouse*(VAR keys: SET; VAR x, y: INTEGER);
  40. VAR w: INTEGER;
  41. BEGIN SYSTEM.GET(msAdr, w);
  42. keys := SYSTEM.VAL(SET, w DIV 1000000H MOD 8);
  43. x := w MOD 400H; y := (w DIV 1000H) MOD 400H;
  44. IF y >= MH THEN y := MH-1 END
  45. END Mouse;
  46. PROCEDURE SetMouseLimits*(w, h: INTEGER);
  47. BEGIN MW := w; MH := h
  48. END SetMouseLimits;
  49. PROCEDURE Init*;
  50. BEGIN Up := FALSE; Shift := FALSE; Ctrl := FALSE; Recd := FALSE;
  51. KTabAdr := SYSTEM.ADR($
  52. 00 00 00 00 00 1A 00 00 00 00 00 00 00 09 60 00
  53. 00 00 00 00 00 71 31 00 00 00 7A 73 61 77 32 00
  54. 00 63 78 64 65 34 33 00 00 20 76 66 74 72 35 00
  55. 00 6E 62 68 67 79 36 00 00 00 6D 6A 75 37 38 00
  56. 00 2C 6B 69 6F 30 39 00 00 2E 2F 6C 3B 70 2D 00
  57. 00 00 27 00 5B 3D 00 00 00 00 0D 5D 00 5C 00 00
  58. 00 00 00 00 00 00 08 00 00 00 00 00 00 00 00 00
  59. 00 7F 00 00 00 00 1B 00 00 00 00 00 00 00 00 00
  60. 00 00 00 00 00 00 00 00 00 00 00 00 00 09 7E 00
  61. 00 00 00 00 00 51 21 00 00 00 5A 53 41 57 40 00
  62. 00 43 58 44 45 24 23 00 00 20 56 46 54 52 25 00
  63. 00 4E 42 48 47 59 5E 00 00 00 4D 4A 55 26 2A 00
  64. 00 3C 4B 49 4F 29 28 00 00 3E 3F 4C 3A 50 5F 00
  65. 00 00 22 00 7B 2B 00 00 00 00 0D 7D 00 7C 00 00
  66. 00 00 00 00 00 00 08 00 00 00 00 00 00 00 00 00
  67. 00 7F 00 00 00 00 1B 00 00 00 00 00 00 00 00 00$)
  68. END Init;
  69. BEGIN Init
  70. END Input.