OSDN Git Service

f7b2771392e90da6bce4c99ba89dda3801b1db6b
[csp-qt/common_source_project-fm7.git] / source / src / vm / fm7 / keyboard.cpp
1 /*
2  * Common Source code Project -> VM -> FM-7/77AV -> Keyboard
3  * (C) 2015 K.Ohta <whatisthis.sowhat _at_ gmail.com>
4  * Licence: GPLv2
5  * History : 
6  *  Feb 12, 2015 : Initial 
7  */
8
9 #include "../../fifo.h"
10 #include "../device.h"
11 #include "keyboard.h"
12
13 enum {
14         SIG_FM7KEY_KEY_UP = 0x800,
15         SIG_FM7KEY_KEY_DOWN,
16         SIG_FM7KEY_READ, // D400 = high , D401 = low
17         SIG_FM7KEY_LED_ONOFF, // D40D: Write = OFF / Read = ON
18         // D431
19         SIG_FM7KEY_PUSH_TO_ENCODER,
20 };
21 //
22
23 uint16 vk_matrix[0x68] = { // VK
24         // +0, +1, +2, +3, +4, +5, +6, +7
25         /* 0x00, ESC, 1 , 2, 3, 4, 5, 6 */
26         0x00,            VK_KANJI,      '1',            '2',            '3',            '4',            '5',            '6',            // +0x00
27         /* 7, 8, 9, 0, - , ^, \|, BS */
28         '7',            '8',            '9',            '0',            0xbd,           0xde,           0xdc,           VK_BACK,        // +0x08
29         /* TAB, Q, W, E, R, T, Y, U */
30         VK_TAB,         'Q',            'W',            'E',            'R',            'T',            'Y',            'U',            // +0x10
31         /* I, O, P, @, [, [RET], A, S */
32         'I',            'O',            'P',            0xc0,           0xdb,           VK_RETURN,      'A',            'S',            //+0x18
33         /* D, F, G, H, J, K, L, ; */
34         'D',            'F',            'G',            'H',            'J',            'K',            'L',            0xbb,           // +0x20
35         /* :, ], Z, X, C, V, B, N */
36         0xba,           0xdd,           'Z',            'X',            'C',            'V',            'B',            'N',            // +0x28
37         /* M, , , ., / , \, RSPACE=RWIN , * , / */
38         'M',            0xbc,           0xbe,           0xbf,           0xe2,           VK_RWIN,        VK_MULTIPLY,    VK_DIVIDE,      // +0x30
39         /* + , - , 7, 8, 9, = , 4, 5 */
40         VK_ADD,         VK_SUBTRACT,    VK_NUMPAD7,     VK_NUMPAD8,     VK_NUMPAD9,     0x00,           VK_NUMPAD4,     VK_NUMPAD5,     // +0x38
41         /* 6, NUMPADCOMMA=RMENU , 1, 2, 3, NUMPADENTER=RETURN,0, . */
42         VK_NUMPAD6,     VK_RMENU,       VK_NUMPAD1,     VK_NUMPAD2,     VK_NUMPAD3,     VK_RETURN,      VK_NUMPAD0,     VK_DECIMAL,     // +0x40
43         /* INS, HOME, PRIOR, DEL, END, ↑, ↓,← */
44         VK_INSERT,      VK_HOME,        VK_PRIOR,       VK_DELETE,      VK_END,         VK_UP,          VK_NEXT,        VK_LEFT,        // +0x48
45         /* PAgeDown, →, LCTRL, LSHIFT, RSHIFT, CAPS, Graph=Muhenkan, Lspace=LALT */
46         VK_DOWN,        VK_RIGHT,       VK_LCONTROL,    VK_LSHIFT,      VK_RSHIFT,      VK_CAPITAL,     0x1d,   0xf3,   // +0x50
47         /* Cspace=Space, *Unknown*, KANA, *Unknown* , ESC(Break), F1, F2, F3 */
48         VK_SPACE,       0x00,           0xf2,           0x00,           VK_ESCAPE,      VK_F1,          VK_F2,  VK_F3,  // +0x58
49         /* F4, F5, F6, F7, F8, F9, F10 , *END* */
50         VK_F4,          VK_F5,          VK_F6,          VK_F7,          VK_F8,          VK_F9,          VK_F10,         0xffff  // +0x60
51 };
52
53 struct key_tbl_t {
54         uint16 phy;
55         uint16 code;
56 };
57
58 // Key tables value from XM7.
59 const key_tbl_t standard_key[] = {
60         {0x01, 0x1b},
61         {0x02, 0x31},
62         {0x03, 0x32},
63         {0x04, 0x33},
64         {0x05, 0x34},
65         {0x06, 0x35},
66         {0x07, 0x36},
67         {0x08, 0x37},
68         {0x09, 0x38},
69         {0x0a, 0x39},
70         {0x0b, 0x30},
71         {0x0c, 0x2d},
72         {0x0d, 0x5e},
73         {0x0e, 0x5c},
74         {0x0f, 0x08},
75         
76         {0x10, 0x09},
77         {0x11, 0x71},
78         {0x12, 0x77},
79         {0x13, 0x65},
80         {0x14, 0x72},
81         {0x15, 0x74},
82         {0x16, 0x79},
83         {0x17, 0x75},
84         {0x18, 0x69},
85         {0x19, 0x6f},
86         {0x1a, 0x70},
87         {0x1b, 0x40},
88         {0x1c, 0x5b},
89         {0x1d, 0x0d},
90         {0x1e, 0x61},
91         {0x1f, 0x73},
92         
93         {0x20, 0x64},
94         {0x21, 0x66},
95         {0x22, 0x67},
96         {0x23, 0x68},
97         {0x24, 0x6a},
98         {0x25, 0x6b},
99         {0x26, 0x6c},
100         {0x27, 0x3b},
101         {0x28, 0x3a},
102         {0x29, 0x5d},
103         {0x2a, 0x7a},
104         {0x2b, 0x78},
105         {0x2c, 0x63},
106         {0x2d, 0x76},
107         {0x2e, 0x62},
108         {0x2f, 0x6e},
109         
110         {0x30, 0x6d},
111         {0x31, 0x2c},
112         {0x32, 0x2e},
113         {0x33, 0x2f},
114         {0x34, 0x22},
115         {0x35, 0x20},
116         {0x36, 0x2a},
117         {0x37, 0x2f},
118         {0x38, 0x2b},
119         {0x39, 0x2d},
120         {0x3a, 0x37},
121         {0x3b, 0x38},
122         {0x3c, 0x39},
123         {0x3d, 0x3d},
124         {0x3e, 0x34},
125         {0x3f, 0x35},
126         
127         {0x40, 0x36},
128         {0x41, 0x2c},
129         {0x42, 0x31},
130         {0x43, 0x32},
131         {0x44, 0x33},
132         {0x45, 0x0d},
133         {0x46, 0x30},
134         {0x47, 0x2e},
135         {0x48, 0x12},
136         {0x49, 0x05},
137         {0x4a, 0x0c},
138         {0x4b, 0x7f},
139         {0x4c, 0x11},
140         {0x4d, 0x1e},
141         {0x4e, 0x0b},
142         {0x4f, 0x1d},
143         
144         {0x50, 0x1f},
145         {0x51, 0x1c},
146         
147         {0x57, 0x20},
148         {0x58, 0x20},
149         
150         {0x5d, 0x0101},
151         {0x5e, 0x0102},
152         {0x5f, 0x0103},
153         {0x60, 0x0104},
154         {0x61, 0x0105},
155         {0x62, 0x0106},
156         {0x63, 0x0107},
157         {0x64, 0x0108},
158         {0x65, 0x0109},
159         {0x66, 0x010a},
160         
161         {0xffff, 0xffff}
162 };
163
164 const key_tbl_t standard_shift_key[] = {
165         {0x01, 0x1b},
166         {0x02, 0x21},
167         {0x03, 0x22},
168         {0x04, 0x23},
169         {0x05, 0x24},
170         {0x06, 0x25},
171         {0x07, 0x26},
172         {0x08, 0x27},
173         {0x09, 0x28},
174         {0x0a, 0x29},
175         
176         {0x0c, 0x3d},
177         {0x0d, 0x7e},
178         {0x0e, 0x7c},
179         {0x0f, 0x08},
180         
181         {0x10, 0x09},
182         {0x11, 0x51},
183         {0x12, 0x57},
184         {0x13, 0x45},
185         {0x14, 0x52},
186         {0x15, 0x54},
187         {0x16, 0x59},
188         {0x17, 0x55},
189         {0x18, 0x49},
190         {0x19, 0x4f},
191         {0x1a, 0x50},
192         {0x1b, 0x60},
193         {0x1c, 0x7b},
194         {0x1d, 0x0d},
195         {0x1e, 0x41},
196         {0x1f, 0x53},
197         
198         {0x20, 0x44},
199         {0x21, 0x46},
200         {0x22, 0x47},
201         {0x23, 0x48},
202         {0x24, 0x4a},
203         {0x25, 0x4b},
204         {0x26, 0x4c},
205         {0x27, 0x2b},
206         {0x28, 0x2a},
207         {0x29, 0x7d},
208         {0x2a, 0x5a},
209         {0x2b, 0x58},
210         {0x2c, 0x43},
211         {0x2d, 0x56},
212         {0x2e, 0x42},
213         {0x2f, 0x4e},
214         
215         {0x30, 0x4d},
216         {0x31, 0x3c},
217         {0x32, 0x3e},
218         {0x33, 0x3f},
219         {0x34, 0x5f},
220         {0x35, 0x20},
221         {0x36, 0x2a},
222         {0x37, 0x2f},
223         {0x38, 0x2b},
224         {0x39, 0x2d},
225         {0x3a, 0x37},
226         {0x3b, 0x38},
227         {0x3c, 0x39},
228         {0x3d, 0x3d},
229         {0x3e, 0x34},
230         {0x3f, 0x35},
231
232         {0x40, 0x36},
233         {0x41, 0x2c},
234         {0x42, 0x31},
235         {0x43, 0x32},
236         {0x44, 0x33},
237         {0x45, 0x0d},
238         {0x46, 0x30},
239         {0x47, 0x2e},
240         {0x48, 0x12},
241         {0x49, 0x05},
242         {0x4a, 0x0c},
243         {0x4b, 0x7f},
244         {0x4c, 0x11},
245         {0x4d, 0x19},
246         {0x4e, 0x0b},
247         {0x4f, 0x02},
248         
249         {0x50, 0x1a},
250         {0x51, 0x06},
251
252         {0x57, 0x20},
253         {0x58, 0x20},
254         {0xffff, 0xffff}
255 };
256
257 const struct key_tbl_t ctrl_key[] = {
258         {0x0c, 0x1e},
259         {0x0d, 0x1c},
260         
261         {0x11, 0x11},
262         {0x12, 0x17},
263         {0x13, 0x05},
264         {0x14, 0x12},
265         {0x15, 0x14},
266         {0x16, 0x19},
267         {0x17, 0x15},
268         {0x18, 0x09},
269         {0x19, 0x0f}, // 09
270         {0x1a, 0x10},
271         {0x1b, 0x00},
272         {0x1c, 0x1b},
273         {0x1e, 0x01},
274         {0x1f, 0x13},
275         
276         {0x20, 0x04},
277         {0x21, 0x06},
278         {0x22, 0x07},
279         {0x23, 0x08},
280         {0x24, 0x0a},
281         {0x25, 0x0b},
282         {0x26, 0x0c},
283         {0x29, 0x1d},
284         {0x2a, 0x1a},
285         {0x2b, 0x18},
286         {0x2c, 0x03},
287         {0x2d, 0x16},
288         {0x2e, 0x02},
289         {0x2f, 0x0e},
290   
291         {0x30, 0x0d},
292         
293         {0x34, 0x1f},
294         {0xffff, 0xffff}
295 };
296
297 const struct key_tbl_t ctrl_shift_key[] = {
298         {0x0c, 0x1e},
299         {0x0d, 0x1c},
300         
301         {0x11, 0x11},
302         {0x12, 0x17},
303         {0x13, 0x05},
304         {0x14, 0x12},
305         {0x15, 0x14},
306         {0x16, 0x19},
307         {0x17, 0x15},
308         {0x18, 0x09},
309         {0x19, 0x09},
310         {0x1a, 0x10},
311         {0x1b, 0x00},
312         {0x1c, 0x1b},
313         {0x1e, 0x01},
314         {0x1f, 0x13},
315   
316         {0x20, 0x04},
317         {0x21, 0x06},
318         {0x22, 0x07},
319         {0x23, 0x08},
320         {0x24, 0x0a},
321         {0x25, 0x0b},
322         {0x26, 0x0c},
323         {0x29, 0x1d},
324         {0x2a, 0x1a},
325         {0x2b, 0x18},
326         {0x2c, 0x03},
327         {0x2d, 0x16},
328         {0x2e, 0x02},
329         {0x2f, 0x0e},
330   
331         {0x30, 0x0d},
332         
333         {0x34, 0x1f},
334         {0xffff, 0xffff}
335 };
336
337 const struct key_tbl_t graph_key[] = {
338         {0x01, 0x1b},
339         {0x02, 0xf9},
340         {0x03, 0xfa},
341         {0x04, 0xfb},
342         {0x05, 0xfc},
343         {0x06, 0xf2},
344         {0x07, 0xf3},
345         {0x08, 0xf4},
346         {0x09, 0xf5},
347         {0x0a, 0xf6},
348         {0x0b, 0xf7},
349         {0x0c, 0x8c},
350         {0x0d, 0x8b},
351         {0x0e, 0xf1},
352         {0x0f, 0x08},
353         
354         {0x10, 0x09},
355         {0x11, 0xfd},
356         {0x12, 0xf8},
357         {0x13, 0xe4},
358         {0x14, 0xe5},
359         {0x15, 0x9c},
360         {0x16, 0x9d},
361         {0x17, 0xf0},
362         {0x18, 0xe8},
363         {0x19, 0xe9},
364         {0x1a, 0x8d},
365         {0x1b, 0x8a},
366         {0x1c, 0xed},
367         {0x1d, 0x0d},
368         {0x1e, 0x95},
369         {0x1f, 0x96},
370   
371         {0x20, 0xe6},
372         {0x21, 0xe7},
373         {0x22, 0x9e},
374         {0x23, 0x9f},
375         {0x24, 0xea},
376         {0x25, 0xeb},
377         {0x26, 0x8e},
378         {0x27, 0x99},
379         {0x28, 0x94},
380         {0x29, 0xec},
381         {0x2a, 0x80},
382         {0x2b, 0x81},
383         {0x2c, 0x82},
384         {0x2d, 0x83},
385         {0x2e, 0x84},
386         {0x2f, 0x85},
387         
388         {0x30, 0x86},
389         {0x31, 0x87},
390         {0x32, 0x88},
391         {0x33, 0x97},
392         {0x34, 0xe0},
393         {0x35, 0x20},
394         {0x36, 0x98},
395         {0x37, 0x91},
396         {0x38, 0x99},
397         {0x39, 0xee},
398         {0x3a, 0xe1},
399         {0x3b, 0xe2},
400         {0x3c, 0xe3},
401         {0x3d, 0xef},
402         {0x3e, 0x93},
403         {0x3f, 0x8f},
404
405         {0x40, 0x92}, 
406         
407         {0x42, 0x9a},
408         {0x43, 0x90},
409         {0x44, 0x9b},
410         {0x45, 0x0d},
411         {0x48, 0x12},
412         {0x49, 0x05},
413         {0x4a, 0x0c},
414         {0x4b, 0x7f},
415         {0x4c, 0x11},
416         {0x4d, 0x1e},
417         {0x4e, 0x0b},
418         {0x4f, 0x1d},
419   
420         {0x50, 0x1f},
421         {0x51, 0x1c},
422
423         {0x57, 0x20},
424         {0x58, 0x20},
425         /* Belows is none when shift */
426         {0x5d, 0x101},
427         {0x5e, 0x102},
428         {0x5f, 0x103},
429         {0x60, 0x104},
430         {0x61, 0x105},
431         {0x62, 0x106},
432         {0x63, 0x107},
433         {0x64, 0x108},
434         {0x65, 0x109},
435         {0x66, 0x10a},
436         {0xffff, 0xffff}
437 };
438 const struct key_tbl_t graph_shift_key[] = {
439         {0x01, 0x1b},
440         {0x02, 0xf9},
441         {0x03, 0xfa},
442         {0x04, 0xfb},
443         {0x05, 0xfc},
444         {0x06, 0xf2},
445         {0x07, 0xf3},
446         {0x08, 0xf4},
447         {0x09, 0xf5},
448         {0x0a, 0xf6},
449         {0x0b, 0xf7},
450         {0x0c, 0x8c},
451         {0x0d, 0x8b},
452         {0x0e, 0xf1},
453         {0x0f, 0x08},
454
455         {0x10, 0x09},
456         {0x11, 0xfd},
457         {0x12, 0xf8},
458         {0x13, 0xe4},
459         {0x14, 0xe5},
460         {0x15, 0x9c},
461         {0x16, 0x9d},
462         {0x17, 0xf0},
463         {0x18, 0xe8},
464         {0x19, 0xe9},
465         {0x1a, 0x8d},
466         {0x1b, 0x8a},
467         {0x1c, 0xed},
468         {0x1d, 0x0d},
469         {0x1e, 0x95},
470         {0x1f, 0x96},
471   
472         {0x20, 0xe6},
473         {0x21, 0xe7},
474         {0x22, 0x9e},
475         {0x23, 0x9f},
476         {0x24, 0xea},
477         {0x25, 0xeb},
478         {0x26, 0x8e},
479         {0x27, 0x99},
480         {0x28, 0x94},
481         {0x29, 0xec},
482         {0x2a, 0x80},
483         {0x2b, 0x81},
484         {0x2c, 0x82},
485         {0x2d, 0x83},
486         {0x2e, 0x84},
487         {0x2f, 0x85},
488   
489         {0x30, 0x86},
490         {0x31, 0x87},
491         {0x32, 0x88},
492         {0x33, 0x97},
493         {0x34, 0xe0},
494         {0x35, 0x20},
495         {0x36, 0x98},
496         {0x37, 0x91},
497         {0x38, 0x99},
498         {0x39, 0xee},
499         {0x3a, 0xe1},
500         {0x3b, 0xe2},
501         {0x3c, 0xe3},
502         {0x3d, 0xef},
503         {0x3e, 0x93},
504         {0x3f, 0x8f},
505
506         {0x40, 0x92}, 
507         
508         {0x42, 0x9a},
509         {0x43, 0x90},
510         {0x44, 0x9b},
511         {0x45, 0x0d},
512         
513         {0x48, 0x12},
514         {0x49, 0x05},
515         {0x4a, 0x0c},
516         {0x4b, 0x7f},
517         {0x4c, 0x11},
518         {0x4d, 0x19},
519         {0x4e, 0x0b},
520         {0x4f, 0x02},
521   
522         {0x50, 0x1a},
523         {0x51, 0x06},
524         
525         {0x57, 0x20},
526         {0x58, 0x20},
527         {0xffff, 0xffff}
528 };
529
530 const struct key_tbl_t kana_key[] = {
531         {0x01, 0x1b}
532         {0x02, 0xc7},
533         {0x03, 0xcc},
534         {0x04, 0xb1},
535         {0x05, 0xb3},
536         {0x06, 0xb4},
537         {0x07, 0xb5},
538         {0x08, 0xd4},
539         {0x09, 0xd5},
540         {0x0a, 0xd6},
541         {0x0b, 0xdc},
542         {0x0c, 0xce},
543         {0x0d, 0xcd},
544         {0x0e, 0xb0},
545         {0x0f, 0x08},
546         
547         {0x10, 0x09},
548         {0x11, 0xc0},
549         {0x12, 0xc3},
550         {0x13, 0xb2},
551         {0x14, 0xbd},
552         {0x15, 0xb6},
553         {0x16, 0xdd},
554         {0x17, 0xc5},
555         {0x18, 0xc6},
556         {0x19, 0xd7},
557         {0x1a, 0xbe},
558         {0x1b, 0xde},
559         {0x1c, 0xdf},
560         {0x1d, 0x0d},
561         {0x1e, 0xc1},
562         {0x1f, 0xc4},
563         
564         {0x20, 0xbc},
565         {0x21, 0xca},
566         {0x22, 0xb7},
567         {0x23, 0xb8},
568         {0x24, 0xcf},
569         {0x25, 0xc9},
570         {0x26, 0xd8},
571         {0x27, 0xda},
572         {0x28, 0xb9},
573         {0x29, 0xd1},
574         {0x2a, 0xc2},
575         {0x2b, 0xbb},
576         {0x2c, 0xbf},
577         {0x2d, 0xcb},
578         {0x2e, 0xba},
579         {0x2f, 0xd0},
580                   
581         {0x30, 0xd3},
582         {0x31, 0xc8},
583         {0x32, 0xd9},
584         {0x33, 0xd2},
585         {0x34, 0xdb},
586         {0x35, 0x20},
587         {0x36, 0x2a},
588         {0x37, 0x2f},
589         {0x38, 0x2b},
590         {0x39, 0x2d},
591         {0x3a, 0x37},
592         {0x3b, 0x38},
593         {0x3c, 0x39},
594         {0x3d, 0x3d},
595         {0x3e, 0x34},
596         {0x3f, 0x35},
597                   
598         {0x40, 0x36},
599         {0x41, 0x2c},
600         {0x42, 0x31},
601         {0x43, 0x32},
602         {0x44, 0x33},
603         {0x45, 0x0d},
604         {0x46, 0x30},
605         {0x47, 0x2e},
606   
607         {0x48, 0x12},
608         {0x49, 0x05},
609         {0x4a, 0x0c},
610         {0x4b, 0x7f},
611         {0x4c, 0x11},
612         {0x4d, 0x1e},
613         
614         {0x4e, 0x0b},
615         {0x4f, 0x1d},
616         {0x50, 0x1f},
617         {0x51, 0x1c},
618         
619         
620         {0x57, 0x20},
621         {0x58, 0x20},
622         
623         {0x5d, 0x0101},
624         {0x5e, 0x0102},
625         {0x5f, 0x0103},
626         {0x60, 0x0104},
627         {0x61, 0x0105},
628         {0x62, 0x0106},
629         {0x63, 0x0107},
630         {0x64, 0x0108},
631         {0x65, 0x0109},
632         {0x66, 0x010a},
633
634         {0xffff, 0xffff}
635 };
636
637 const struct key_tbl_t kana_shift_key[] = {
638         {0x01, 0x1b}
639         {0x04, 0xa7},
640         {0x05, 0xa9},
641         {0x06, 0xaa},
642         {0x07, 0xab},
643         {0x08, 0xac},
644         {0x09, 0xad},
645         {0x0a, 0xae},
646         {0x0b, 0xa6},
647         {0x0f, 0x08},
648         
649         {0x10, 0x09},
650         {0x13, 0xa8},
651         {0x1c, 0xa2},
652         {0x1d, 0x0d},
653         
654         {0x29, 0xa3},
655         {0x2a, 0xaf},
656         
657         {0x31, 0xa4},
658         {0x32, 0xa1},
659         {0x33, 0xa5},
660         
661         {0x35, 0x20},
662         {0x36, 0x2a},
663         {0x37, 0x2f},
664         {0x38, 0x2b},
665         {0x39, 0x2d},
666         {0x3a, 0x37},
667         {0x3b, 0x38},
668         {0x3c, 0x39},
669         {0x3d, 0x3d},
670         {0x3e, 0x34},
671         {0x3f, 0x35},
672         
673         {0x40, 0x36},
674         {0x41, 0x2c},
675         {0x42, 0x31},
676         {0x43, 0x32},
677         {0x44, 0x33},
678         {0x45, 0x0d},
679         {0x46, 0x30},
680         {0x47, 0x2e},
681   
682         {0x48, 0x12},
683         {0x49, 0x05},
684         {0x4a, 0x0c},
685         {0x4b, 0x7f},
686         {0x4c, 0x11},
687         {0x4d, 0x19},
688
689         {0x4e, 0x0b},
690         {0x4f, 0x02},
691         {0x50, 0x1a},
692         {0x51, 0x06},
693         
694         {0x57, 0x20},
695         {0x58, 0x20},
696
697         {0xffff, 0xffff}
698 };
699
700 /*
701  * I/O API (subio)
702  */
703 // 0xd431 : Read
704 uint8 KEYBOARD::read_data_reg(void)
705 {
706         if(rxrdy->read_signal(0) != 0) {
707                 if(!data_fifo->empty()) {
708                         datareg = data_fifo->read() & 0xff;
709                 }
710         }
711         if(data_fifo->empty()) {
712                 rxrdy->write_signal(0x00, 0x00, 0x01);
713         } else {
714                 rxrdy->write_signal(0x00, 0x01, 0x01);
715         }
716         return datareg;
717 }
718
719 // 0xd432
720 uint8 KEYBOARD::read_stat_reg(void)
721 {
722         uint8 data = 0xff;
723         
724         if(!data_fifo->empty()) {
725                 rxrdy->write_signal(0x00, 0x01, 0x01);
726                 data &= 0x7f;
727         }
728         if(key_ack->read_signal(0) == 0x00) {
729           data &= 0xfe;
730         }
731         // Digityze : bit0 = '0' when waiting,
732         return data;
733 }
734
735 // 0xd400(SUB) or 0xfd00(MAIN)
736 uint8 KEYBOARD::get_keycode_high(void)
737 {
738         uint8 data = 0x00;
739         if((keycode_7 & 0x0100) != 0) data |= 0x01;
740         return data;
741 }
742
743 // 0xd401(SUB) or 0xfd01(MAIN)
744 uint8 KEYBOARD::get_keycode_low(void)
745 {
746         uint8 data = keycode_7 & 0xff;
747         maincpu->write_signal(SIG_CPU_IRQ, 0, 1);
748         subcpu->write_signal(SIG_CPU_FIRQ, 0, 1);
749         return data;
750 }
751
752 // 0xd40d : R
753 void KEYBOARD::turn_on_ins_led(void)
754 {
755         ins_led->write_signal(0x00, 0x01, 0x01);
756 }
757
758 // 0xd40d : W
759 void KEYBOARD::turn_off_ins_led(void)
760 {
761         ins_led->write_signal(0x00, 0x00, 0x01);
762 }
763
764
765
766 // UI Handler. 
767 uint16 KEYBOARD::vk2scancode(uint32 vk)
768 {
769         uint16 i;
770         
771         i = 0;
772         do {
773                 if(vk_matrix[i] == vk) return i;
774                 i++;
775         } while(vk_matrix[i] != 0xffff);
776         return 0x0000;
777 }
778
779 bool KEYBOARD::isModifier(uint16 scancode)
780 {
781         if(((scancode >= 0x52) && (scancode <= 0x56)) || // CTRL LSHIFT RSHIFT CAPS GRPH
782                 (scancode == 0x5a) || (scancode == 0x5c)) { // KANA BREAK
783                 return true;
784         }
785         return false;
786 }
787
788 void KEYBOARD::set_modifiers(uint16 scancode, bool flag)
789 {
790         if(scancode == 0x52) { // CTRL
791                 ctrl_pressed = flag; 
792         } else if(scancode == 0x53) { // LSHIFT
793                 lshift_pressed = flag;
794                 if(rshift_pressed) {
795                         shift_pressed = true;
796                 } else {
797                         shift_pressed = flag;
798                 }
799         } else if(scancode == 0x54) { // RSHIFT
800                 rshift_pressed = flag;
801                 if(lshift_pressed) {
802                   shift_pressed = true;
803                 } else {
804                   shift_pressed = flag;
805                 }
806         } else if(scancode == 0x56) { // GRPH
807                 graph_pressed = flag;
808         } else if(scancode == 0x55) { // CAPS
809                 // Toggle on press.
810                 if(flag) {
811                         if(caps_pressed) {
812                                 caps_pressed = false;
813                         } else {
814                                 caps_pressed = true;
815                         }
816                         if(keymode == KEYMODE_STANDARD) caps_led->write_signal(0x00, caps_pressed ? 0x01 : 0x00, 0x01);
817                 }
818         } else if(scancode == 0x5a) { // KANA
819                 // Toggle on press.
820                 if(flag) {
821                         if(kana_pressed) {
822                                 kana_pressed = false;
823                         } else {
824                                 kana_pressed = true;
825                         }
826                         if(keymode == KEYMODE_STANDARD) kana_led->write_signal(0x00, kana_pressed ? 0x01 : 0x00, 0x01);
827                 }
828         } else if(scancode == 0x5c) { // Break
829                 break_pressed = flag;
830         }
831 }
832
833 uint16 KEYBOARD::scan2fmkeycode(uint16 scancode)
834 {
835         struct key_tbl_t *keyptr;
836         uint16 code;
837         bool stdkey = false;
838         int i;
839         uint16 retval;
840         
841         if((scancode == 0) || (scancode >= 0x67)) return 0xffff;
842         // Set repeat flag(s)
843         if(shift_pressed && ctrl_pressed) {
844                 switch(scancode) {
845                         case 0x02: // 1
846                         case 0x42: // 1
847                                 repeat_mode = true;
848                                 //return 0xffff;
849                                 break;
850                         case 0x0b: // 0
851                         case 0x46: // 0
852                                 repeat_mode = false;
853                                 //return 0xffff;
854                                 break;
855                 }
856         }
857         if(shift_pressed) {
858           // DO super-impose mode:
859           // F7 : PC
860           // F8 : IMPOSE (High brightness)
861           // F9 : IMPOSE (Low brightness)
862           // F10: TV
863         }
864         if(keymode == KEYMODE_SCAN) {
865                 retval = scancode;
866                 return retval;
867         } else if(keymode == KEYMODE_STANDARD) {
868                 if(ctrl_pressed) {
869                         if(shift_pressed) {
870                                 keyptr = ctrl_shift_key;
871                         } else {
872                                 keyptr = ctrl_key;
873                         }
874                 } else if(graphkey_pressed) {
875                         if(shift_pressed) {
876                                 keyptr = graph_shift_key;
877                         } else {
878                                 keyptr = graph_key;
879                         }
880                 } else if(kanakey_pressed) {
881                         if(shift_pressed) {
882                                 keyptr = kana_shift_key;
883                         } else {
884                                 keyptr = kana_key;
885                         }
886                 } else { // Standard
887                         stdkey = true;
888                         if(shift_pressed) {
889                                 keyptr = standard_shift_key;
890                         } else {
891                                 keyptr = standard_key;
892                         }
893                 }
894                 if(keyptr == NULL) return 0xffff;
895         } else if(keymode == KEYMODE_16BETA) {
896                 return 0xffff;
897         }
898         
899         i = 0;
900         retval = 0xffff;
901         do {
902                 if(keyptr[i].phy == scancode) {
903                         retval = keyptr[i].code;
904                         break;
905                 }
906                 i++;
907         } while(keyptr[i].phy != 0xffff);
908
909         if(stdkey) {
910                 if((retval >= 'A') && (retval <= 'Z')) {
911                         if(caps_pressed) {
912                                 retval += 0x20;
913                         }
914                 } else if((retval >= 'a') && (retval <= 'z')) {
915                         if(caps_pressed) {
916                                 retval -= 0x20;
917                         }
918                 }
919         }
920         return retval;
921 }
922
923 void KEYBOARD::key_up(uint32 vk)
924 {
925         uint16 scancode = vk2scancode(vk);
926         bool stat_break = break_pressed;
927         if(event_ids[scancode] >= 0){
928                 cancel_event(this, event_ids[scancode]);
929                 event_ids[scancode] = -1;
930         }
931         if(this->isModifiers(scancode)) {
932                 set_modifiers(scancode, false);
933                 if(break_pressed != stat_break) { // Break key UP.
934                         break_line->write_signal(0x00, 0, 1);
935                         maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
936                 }
937         }
938         key_pressed_flag[scancode] = false; 
939 }
940
941 void KEYBOARD::key_down(uint32 vk)
942 {
943         double usec = (double)repeat_time_long * 1000.0;
944         uint32 code_7;
945         uint16 scancode = vk2scancode(vk);
946         bool stat_break = break_pressed;
947         key_pressed_flag[scancode] = true;
948         
949         code_7 = scan2fmkeycode(scancode);
950         if(code_7 < 0x200) {
951                 keycode_7 = code_7;
952                 maincpu->write_signal(SIG_CPU_IRQ, 1, 1);
953                 subcpu->write_signal(SIG_CPU_FIRQ, 1, 1);
954         }
955         if(this->isModifiers(scancode)) {  // modifiers
956                 if(break_pressed != stat_break) { // Break key Down.
957                         break_line->write_signal(0x00, 1, 1);
958                         maincpu->write_signal(SIG_CPU_FIRQ, 1, 1);
959                 }
960         }
961         // If repeat && !(PF) && !(BREAK) 
962         if((repeat_mode) && (scancode < 0x5c) && (scancode != 0)) {
963                 register_event(this,
964                                ID_KEYBOARD_AUTOREPEAT_FIRST + scancode,
965                                usec, false, &event_ids[scancode]);
966         } else {
967                 event_ids[scancode] = -1;
968         }
969         key_pressed_flag[scancode] = true;
970
971 }
972
973 void KEYBOARD::do_repeatkey(uint16 scancode)
974 {
975         uint16 code_7;
976         if((scancode == 0) || (scancode >= 0x67)) return; // scancode overrun.
977         if(!repeat_mode) {
978                 if(event_ids[scancode] >= 0) {
979                         cancel_event(this, event_ids[scancode]);
980                         event_ids[scancode] = -1;
981                 }
982                 return;
983         }
984         key_pressed_flag[scancode] = true;
985         code_7 = scan2fmkeycode(scancode);
986         if(code_7 < 0x200) {
987                 keycode_7 = code_7;
988                 maincpu->write_signal(SIG_CPU_IRQ, 1, 1);
989                 subcpu->write_signal(SIG_CPU_FIRQ, 1, 1);
990         }
991         //if(this->isModifiers(scancode)) {  // modifiers
992           //if(break_pressed != stat_break) { // Break key Down.
993           //            break_line->write_signal(0x00, 1, 1);
994           //            maincpu->write_signal(SIG_CPU_FIRQ, 1, 1);
995           //    }
996         //}
997 }
998
999 void KEYBOARD::event_callback(int event_id, int err)
1000 {
1001         if(event_id == ID_KEYBOARD_RXRDY_OK) {
1002                 rxrdy->write_signal(0x00, 0x01, 0x01);
1003         } else if(event_id == ID_KEYBOARD_RXRDY_BUSY) {
1004                 rxrdy->write_signal(0x00, 0x00, 0x01);
1005         } else if(event_id == ID_KEYBOARD_ACK) {
1006                 key_ack->write_signal(0x00, 0x01, 0x01);
1007         } else if((event_id >= ID_KEYBOARD_AUTOREPEAT_FIRST) && (event_id <= (ID_KEYBOARD_AUTOREPEAT_FIRST + 0x1ff))) {
1008                 uint32 scancode = event_id - ID_KEYBOARD_AUTOREPEAT_FIRST;
1009                 double usec = (double)repeat_time_short * 1000.0;
1010
1011                 if((scancode >= 0x67) || (scancode == 0)) return;
1012                 do_repeatkey((uint16)scancode);
1013                 register_event(this,
1014                                ID_KEYBOARD_AUTOREPEAT + scancode,
1015                                usec, true, &event_ids[scancode]);
1016                 // Key repeat.
1017         } else if((event_id >= ID_KEYBOARD_AUTOREPEAT) && (event_id <= (ID_KEYBOARD_AUTOREPEAT + 0x1ff))){
1018                 uint32 scancode = event_id - ID_KEYBOARD_AUTOREPEAT;
1019                 do_repeatkey((uint16)scancode);
1020         }
1021 }
1022
1023 // Commands
1024 void KEYBOARD::reset_keyboard(void)
1025 {
1026         repeat_time_short = 70; // mS
1027         repeat_time_long = 700; // mS
1028         repeat_mode = true;
1029         key_code = 0x00;
1030         
1031         lshift_pressed = false;
1032         rshift_pressed = false;
1033         ctrl_pressed   = false;
1034         graph_pressed = false;
1035         //      ins_pressed = false;
1036         cmd_fifo->clear();
1037         data_fifo->clear();
1038         datareg = 0x00;
1039         // Bus
1040         rxrdy->write_signal(0x00, 0x00, 0x01);
1041         key_ack->write_signal(0x00, 0x01, 0x01);
1042         break_line->write_signal(0x00, 0, 1);
1043         // leds
1044         ins_led->write_signal(0x01, 0x00, 0x01);
1045         caps_led->write_signal(0x01, 0x00, 0x01);
1046         kana_led->write_signal(0x01, 0x00, 0x01);
1047 }
1048   
1049 void KEYBOARD::set_mode(void)
1050 {
1051         int count = cmd_fifo->count();
1052         int cmd;
1053         if(count < 2) return;
1054         cmd = cmd_fifo->read();
1055         key_format = cmd_fifo->read();
1056         reset_keyboard();
1057 }
1058
1059 void KEYBOARD::get_mode(void)
1060 {
1061         int cmd;
1062         int dummy;
1063         cmd = cmd_fifo->read();
1064         if(data_fifo->full()) {
1065                 dummy = data_fifo->read();
1066         }
1067         data_fifo->write(key_format);
1068         rxrdy->write_signal(0x01, 0x01, 0x01);
1069 }
1070
1071
1072 void KEYBOARD::write_signal(int id, uint32 data, uint32 mask)
1073 {
1074   
1075         if(id == SIG_FM7KEY_PUSH_TO_ENCODER) {
1076                 /*
1077                  * I refered XM7's sourcecode : VM/keyboard.c act of key-encoder.
1078                  * Thanks to Ryu.Takegami and PI.
1079                  */
1080                 int count;
1081                 if(key_ack->read_signal(0x00) == 0) return; // If (not(ACK)) noop.
1082
1083                 if(cmd_fifo->full()) {
1084                         cmd_fifo->clear();
1085                 }
1086                 if(cmd_fifo->empty()) {
1087                         cmd_phase = data & 0xff;
1088                 }
1089                 
1090                 cmd_fifo->write(data & 0xff);
1091                 count = cmd_fifo->count();
1092                 
1093                 key_ack->write_signal(0x00, 0x00, 0x01);
1094                 switch(cmd_phase) {
1095                         case 0: // Set mode
1096                                 if(count >= 2) set_mode();
1097                                 break;
1098                         case 1: // Get mode
1099                                 get_mode();
1100                                 break;
1101                         case 2: // Set LED Phase
1102                                 if(count >= 2) set_leds();
1103                                 break;
1104                         case 3: // Get LED Phase
1105                                 get_leds();
1106                                 break;
1107                         case 4:
1108                                 if(count >= 2) set_repeat_type();
1109                                 break;
1110                         case 5:
1111                                 if(count >= 3) set_repeat_time();
1112                                 break;
1113                         case 0x80: // Communicate to/from RTC.
1114                                 if(count == 1) {
1115                                         rtc_set = false;
1116                                 }
1117                                 if(count == 2) {
1118                                         if((data & 0xff) == 0) { // Get
1119                                                 get_rtc();
1120                                         } else if((data & 0xff) == 1) { // Set
1121                                                 rtc_set_flag = true;
1122                                         } else { // Illegal
1123                                                 cmd_fifo->clear(); 
1124                                         }
1125                                 }
1126                                 if(rtc_set_flag) {
1127                                         if(count >= 9) {
1128                                                 set_rtc();
1129                                         }
1130                                 }
1131                                 break;
1132                         case 0x81: // Digitize.
1133                                 if(count >= 2) do_digitize(); // WILL Implement?
1134                                 break;
1135                         case 0x82:
1136                                 if(count >= 2) set_screen_mode();
1137                                 break;
1138                         case 0x83:
1139                                 get_screen_mode();
1140                                 break;
1141                         case 0x84:
1142                                 if(count >= 2) set_brightness();
1143                                 break;
1144                         default:
1145                                 //cmd_fifo->clear();
1146                                 break;
1147                 }
1148                 register_event(this, ID_KEYBOARD_ACK, 5, false, NULL); // Delay 5us until ACK is up.
1149         }
1150 }