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