/
Input.c
113 lines (103 loc) · 2.95 KB
/
Input.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#define KeyBufSize 8
extern char Input_keyBuf [KeyBufSize];
signed char Input_Available_NoRepeat (void);
signed char Input_Available_RepeatBuf (void);
unsigned char Input_Read_NoRepeat (void);
unsigned char Input_Read_Repeat (void);
unsigned char Input_Read_RepeatBuf (void);
void Input_RunMe50Hz (void);
/*================================== Header ==================================*/
signed char Input_Available_NoRepeat (void) {
__asm
LD IY,#0x5C3A
CALL 0x28E
LD L,#0
INC E
RET Z
INC L
__endasm;
} //Input_Available_NoRepeat
/*--------------------------------- Cut here ---------------------------------*/
signed char Input_Available_RepeatBuf (void) {
__asm
LD HL,(_Input_keysAvailable+1)
__endasm;
}
/*--------------------------------- Cut here ---------------------------------*/
unsigned char Input_Read_NoRepeat (void) {
__asm // http://zxpress.ru/book_articles.php?id=1395
LD IY,#0x5C3A
RES 5,1(IY)
LOOPnoRpt$:
CALL 0x2BF
BIT 5,1(IY)
JR Z,LOOPnoRpt$
LD L,-50(IY)
__endasm;
} //Input_Read_NoRepeat
/*--------------------------------- Cut here ---------------------------------*/
unsigned char Input_Read_Repeat (void) {
__asm
LD IY,#0x5C3A
RES 5,1(IY)
LOOPrpt$:
BIT 5,1(IY)
JR Z,LOOPrpt$
LD L,-50(IY)
__endasm;
} //Input_Read_Repeat
/*--------------------------------- Cut here ---------------------------------*/
char Input_keyBuf [KeyBufSize];
/* Çàêîíîìåðíî ñ÷èòàåì, ÷òî áîëåå àêòóàëüíû êëàâèøè, íàæàòûå ïîçäíåå,
ïîýòîìó ïðè ïåðåïîëíåíèè áóôåðà áóäåì óäàëÿòü èç íåãî íàæàòûå ðàíåå.
Ýòà ñòðàòåãèÿ êàæåòñÿ áîëåå óäà÷íîé, ÷åì èãíîðèðîâàíèå âñåõ êëàâèø,
íàæàòûõ ïîñëå ïåðåïîëíåíèÿ áóôåðà (êàê â êîíòðîëëåðå êëàâèàòóðû IBM PC). */
unsigned char Input_Read_RepeatBuf (void) {
__asm
LOOPrptbuf$:
LD HL,#_Input_keysAvailable+1
LD A,(HL)
OR A
JR Z,LOOPrptbuf$
DEC (HL)
.globl _Input_keyOut
_Input_keyOut: ; Read a key:
LD HL,#_Input_keyBuf ; key := keyBuf[keyOut];
LD C,(HL)
INC HL ; keyOut := (keyOut+1) MOD KeyBufSize;
LD A,L
SUB #<_Input_keyBuf+KeyBufSize
JR NZ,Save_keyOut$
LD HL,#_Input_keyBuf
Save_keyOut$:
LD (_Input_keyOut+1),HL
LD L,C ; RETURN key
__endasm;
} //Input_Read_RepeatBuf
void Input_RunMe50Hz (void) {
__asm
LD IY,#0x5C3A
RST 0x38
BIT 5,1(IY)
RET Z
RES 5,1(IY)
_Input_keyIn:
LD HL,#_Input_keyBuf ; Add a key:
LD A,-50(IY) ; keyBuf[keyIn] := CHR(keyCode);
LD (HL),A
INC HL
LD A,L
SUB #<_Input_keyBuf+KeyBufSize
JR NZ,Save_keyIn$
LD HL,#_Input_keyBuf
Save_keyIn$:
LD (_Input_keyIn+1),HL
.globl _Input_keysAvailable
_Input_keysAvailable:
LD A,#0 ; Check overflow:
CP #KeyBufSize ; IF keysAvailable > 8 THEN keysAvailable := 8 END;
JR NC,_Input_keyOut
INC A
LD (_Input_keysAvailable+1),A
__endasm;
} //Input_RunMe50Hz