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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
/*
* Copyright (C) 1996-1998 Szeredi Miklos
* Email: mszeredi@inf.bme.hu
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version. See the file COPYING.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#ifndef SPKEY_P_H
#define SPKEY_P_H
#include "z80_type.h"
struct keystate {
dbyte press;
byte state;
byte base;
qbyte frame;
};
struct onekey {
int index;
unsigned keysym;
unsigned shifted;
unsigned modif;
};
typedef byte spkeyboard[8];
#define SPIP(spk, h) (((qbyte *) (spk))[h])
#define SP_COMBINE(spk1, spk2) \
SPIP(spk1, 0) |= SPIP(spk2, 0), \
SPIP(spk1, 1) |= SPIP(spk2, 1)
#define SP_SUBSTRACT(spk1, spk2) \
SPIP(spk1, 0) &= ~SPIP(spk2, 0), \
SPIP(spk1, 1) &= ~SPIP(spk2, 1)
#define SP_NONEMPTY(spk) (SPIP(spk, 0) || SPIP(spk, 1))
#define SP_CONTAINS(spk1, spk2) \
((SPIP(spk1, 0) & SPIP(spk2, 0)) || (SPIP(spk1, 1) & SPIP(spk2, 1)))
#define SP_SETEMPTY(spk) \
SPIP(spk, 0) = 0, \
SPIP(spk, 1) = 0
#define SP_COPY(spk1, spk2) \
SPIP(spk1, 0) = SPIP(spk2, 0), \
SPIP(spk1, 1) = SPIP(spk2, 1)
#define TRKS(ks) ((ks) - 0xFF00 + 0x100)
#define KS_TO_KEY(ks) \
(((ks) >= 0x0000 && (ks) <= 0x00FF) ? (int) (ks) : \
(((ks) >= 0xFF00 && (ks) <= 0xFFFF) ? (int) TRKS(ks) : -1))
/* These are _accidently_ the same as the XK_ counterparts */
#define SK_BackSpace 0xFF08 /* back space, back char */
#define SK_Tab 0xFF09
#define SK_Linefeed 0xFF0A /* Linefeed, LF */
#define SK_Clear 0xFF0B
#define SK_Return 0xFF0D /* Return, enter */
#define SK_Pause 0xFF13 /* Pause, hold */
#define SK_Scroll_Lock 0xFF14
#define SK_Sys_Req 0xFF15
#define SK_Escape 0xFF1B
#define SK_Delete 0xFFFF /* Delete, rubout */
#define SK_Home 0xFF50
#define SK_Left 0xFF51 /* Move left, left arrow */
#define SK_Up 0xFF52 /* Move up, up arrow */
#define SK_Right 0xFF53 /* Move right, right arrow */
#define SK_Down 0xFF54 /* Move down, down arrow */
#define SK_Page_Up 0xFF55 /* Prior, previous */
#define SK_Page_Down 0xFF56 /* Next */
#define SK_End 0xFF57 /* EOL */
#define SK_Begin 0xFF58 /* BOL */
#define SK_Select 0xFF60 /* Select, mark */
#define SK_Print 0xFF61
#define SK_Execute 0xFF62 /* Execute, run, do */
#define SK_Insert 0xFF63 /* Insert, insert here */
#define SK_Undo 0xFF65 /* Undo, oops */
#define SK_Redo 0xFF66 /* redo, again */
#define SK_Menu 0xFF67
#define SK_Find 0xFF68 /* Find, search */
#define SK_Cancel 0xFF69 /* Cancel, stop, abort, exit */
#define SK_Help 0xFF6A /* Help */
#define SK_Break 0xFF6B
#define SK_Mode_switch 0xFF7E /* Character set switch */
#define SK_Num_Lock 0xFF7F
#define SK_KP_Space 0xFF80 /* space */
#define SK_KP_Tab 0xFF89
#define SK_KP_Enter 0xFF8D /* enter */
#define SK_KP_F1 0xFF91 /* PF1, KP_A, ... */
#define SK_KP_F2 0xFF92
#define SK_KP_F3 0xFF93
#define SK_KP_F4 0xFF94
#define SK_KP_Home 0xFF95
#define SK_KP_Left 0xFF96
#define SK_KP_Up 0xFF97
#define SK_KP_Right 0xFF98
#define SK_KP_Down 0xFF99
#define SK_KP_Page_Up 0xFF9A
#define SK_KP_Page_Down 0xFF9B
#define SK_KP_End 0xFF9C
#define SK_KP_Begin 0xFF9D
#define SK_KP_Insert 0xFF9E
#define SK_KP_Delete 0xFF9F
#define SK_KP_Equal 0xFFBD /* equals */
#define SK_KP_Multiply 0xFFAA
#define SK_KP_Add 0xFFAB
#define SK_KP_Separator 0xFFAC /* separator, often comma */
#define SK_KP_Subtract 0xFFAD
#define SK_KP_Decimal 0xFFAE
#define SK_KP_Divide 0xFFAF
#define SK_KP_0 0xFFB0
#define SK_KP_1 0xFFB1
#define SK_KP_2 0xFFB2
#define SK_KP_3 0xFFB3
#define SK_KP_4 0xFFB4
#define SK_KP_5 0xFFB5
#define SK_KP_6 0xFFB6
#define SK_KP_7 0xFFB7
#define SK_KP_8 0xFFB8
#define SK_KP_9 0xFFB9
#define SK_F1 0xFFBE
#define SK_F2 0xFFBF
#define SK_F3 0xFFC0
#define SK_F4 0xFFC1
#define SK_F5 0xFFC2
#define SK_F6 0xFFC3
#define SK_F7 0xFFC4
#define SK_F8 0xFFC5
#define SK_F9 0xFFC6
#define SK_F10 0xFFC7
#define SK_F11 0xFFC8
#define SK_F12 0xFFC9
#define SK_Shift_L 0xFFE1 /* Left shift */
#define SK_Shift_R 0xFFE2 /* Right shift */
#define SK_Control_L 0xFFE3 /* Left control */
#define SK_Control_R 0xFFE4 /* Right control */
#define SK_Caps_Lock 0xFFE5 /* Caps lock */
#define SK_Shift_Lock 0xFFE6 /* Shift lock */
#define SK_Meta_L 0xFFE7 /* Left meta */
#define SK_Meta_R 0xFFE8 /* Right meta */
#define SK_Alt_L 0xFFE9 /* Left alt */
#define SK_Alt_R 0xFFEA /* Right alt */
#define SK_Super_L 0xFFEB /* Left super */
#define SK_Super_R 0xFFEC /* Right super */
#define SK_Hyper_L 0xFFED /* Left hyper */
#define SK_Hyper_R 0xFFEE /* Right hyper */
/* Modifier masks */
#define SKShiftMask (1<<0)
#define SKLockMask (1<<1)
#define SKControlMask (1<<2)
#define SKMod1Mask (1<<3)
#define SKMod2Mask (1<<4)
#define SKMod3Mask (1<<5)
#define SKMod4Mask (1<<6)
#define SKMod5Mask (1<<7)
#define NR_SPKEYS 512
#define ISFKEY(ks) ((ks) >= SK_F1 && (ks) <= SK_F12)
extern volatile int accept_keys;
extern qbyte sp_int_ctr;
extern struct keystate spkb_kbstate[];
extern struct onekey spkb_last;
extern int spkb_state_changed;
extern spkeyboard spkey_state;
extern spkeyboard kb_mkey;
extern void spkey_textmode(void);
extern void spkey_screenmode(void);
extern const int need_switch_mode;
extern void spkb_refresh(void);
extern void clear_keystates(void);
extern int display_keyboard(void);
extern void process_keys(void);
extern void init_basekeys(void);
#endif /* SPKEY_P_H */
|