summaryrefslogtreecommitdiff
path: root/apps/plugins/zxbox/spkey_p.h
blob: 7823f25aa16c968f9e783fa1137df97d78689d60 (plain)
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 */