OSDN Git Service

Merge branch 'master' of github.com:Artanejp/common_source_project-fm7 into 019938ffe...
[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 "fm7_keyboard.h"
12
13 //
14 const uint16 vk_matrix_106[0x68] = { // VK
15         // +0, +1, +2, +3, +4, +5, +6, +7
16         /* 0x00, ESC, 1 , 2, 3, 4, 5, 6 */
17         0x00,            VK_PAUSE,      '1',            '2',            '3',            '4',            '5',            '6',            // +0x00
18         /* 7, 8, 9, 0, - , ^, \|, BS */
19         '7',            '8',            '9',            '0',            0xbd,           0xde,           0xdc,           VK_BACK,        // +0x08
20         /* TAB, Q, W, E, R, T, Y, U */
21         VK_TAB,         'Q',            'W',            'E',            'R',            'T',            'Y',            'U',            // +0x10
22         /* I, O, P, @, [, [RET], A, S */
23         'I',            'O',            'P',            0xc0,           0xdb,           VK_RETURN,      'A',            'S',            //+0x18
24         /* D, F, G, H, J, K, L, ; */
25         'D',            'F',            'G',            'H',            'J',            'K',            'L',            0xbb,           // +0x20
26         /* :, ], Z, X, C, V, B, N */
27         0xba,           0xdd,           'Z',            'X',            'C',            'V',            'B',            'N',            // +0x28
28         /* M, , , ., / , \, RSPACE=RWIN , * , / */
29         'M',            0xbc,           0xbe,           0xbf,           0xe2,           VK_RWIN,        VK_MULTIPLY,    VK_DIVIDE,      // +0x30
30         /* + , - , 7, 8, 9, = , 4, 5 */
31         VK_ADD,         VK_SUBTRACT,    VK_NUMPAD7,     VK_NUMPAD8,     VK_NUMPAD9,     0x00,           VK_NUMPAD4,     VK_NUMPAD5,     // +0x38
32         /* 6, NUMPADCOMMA=RMENU , 1, 2, 3, NUMPADENTER=RETURN,0, . */
33         VK_NUMPAD6,     VK_RMENU,       VK_NUMPAD1,     VK_NUMPAD2,     VK_NUMPAD3,     VK_RETURN,      VK_NUMPAD0,     VK_DECIMAL,     // +0x40
34         /* INS, HOME, PRIOR, DEL, END, ↑, ↓,← */
35         VK_INSERT,      VK_HOME,        VK_PRIOR,       VK_DELETE,      VK_END,         VK_UP,          VK_NEXT,        VK_LEFT,        // +0x48
36         /* PAgeDown, →, LCTRL, LSHIFT, RSHIFT, CAPS, Graph=Muhenkan, Lspace=LALT */
37         VK_DOWN,        VK_RIGHT,       0x11,           0x10,           VK_RSHIFT,      0x14,           0x1d,   0xf3,   // +0x50
38         /* Cspace=Space, *Unknown*, KANA, *Unknown* , ESC(Break), F1, F2, F3 */
39         VK_SPACE,       0x00,           0x15,           0x00,           VK_ESCAPE,      VK_F1,          VK_F2,  VK_F3,  // +0x58
40         /* F4, F5, F6, F7, F8, F9, F10 , *END* */
41         VK_F4,          VK_F5,          VK_F6,          VK_F7,          VK_F8,          VK_F9,          VK_F10,         0xffff  // +0x60
42 };
43
44 struct key_tbl_t {
45         uint16 phy;
46         uint16 code;
47 };
48
49 // Key tables value from XM7.
50 const key_tbl_t standard_key[] = {
51         {0x01, 0x1b},
52         {0x02, 0x31},
53         {0x03, 0x32},
54         {0x04, 0x33},
55         {0x05, 0x34},
56         {0x06, 0x35},
57         {0x07, 0x36},
58         {0x08, 0x37},
59         {0x09, 0x38},
60         {0x0a, 0x39},
61         {0x0b, 0x30},
62         {0x0c, 0x2d},
63         {0x0d, 0x5e},
64         {0x0e, 0x5c},
65         {0x0f, 0x08},
66         
67         {0x10, 0x09},
68         {0x11, 0x71},
69         {0x12, 0x77},
70         {0x13, 0x65},
71         {0x14, 0x72},
72         {0x15, 0x74},
73         {0x16, 0x79},
74         {0x17, 0x75},
75         {0x18, 0x69},
76         {0x19, 0x6f},
77         {0x1a, 0x70},
78         {0x1b, 0x40},
79         {0x1c, 0x5b},
80         {0x1d, 0x0d},
81         {0x1e, 0x61},
82         {0x1f, 0x73},
83         
84         {0x20, 0x64},
85         {0x21, 0x66},
86         {0x22, 0x67},
87         {0x23, 0x68},
88         {0x24, 0x6a},
89         {0x25, 0x6b},
90         {0x26, 0x6c},
91         {0x27, 0x3b},
92         {0x28, 0x3a},
93         {0x29, 0x5d},
94         {0x2a, 0x7a},
95         {0x2b, 0x78},
96         {0x2c, 0x63},
97         {0x2d, 0x76},
98         {0x2e, 0x62},
99         {0x2f, 0x6e},
100         
101         {0x30, 0x6d},
102         {0x31, 0x2c},
103         {0x32, 0x2e},
104         {0x33, 0x2f},
105         {0x34, 0x22},
106         {0x35, 0x20},
107         {0x36, 0x2a},
108         {0x37, 0x2f},
109         {0x38, 0x2b},
110         {0x39, 0x2d},
111         {0x3a, 0x37},
112         {0x3b, 0x38},
113         {0x3c, 0x39},
114         {0x3d, 0x3d},
115         {0x3e, 0x34},
116         {0x3f, 0x35},
117         
118         {0x40, 0x36},
119         {0x41, 0x2c},
120         {0x42, 0x31},
121         {0x43, 0x32},
122         {0x44, 0x33},
123         {0x45, 0x0d},
124         {0x46, 0x30},
125         {0x47, 0x2e},
126         {0x48, 0x12},
127         {0x49, 0x05},
128         {0x4a, 0x0c},
129         {0x4b, 0x7f},
130         {0x4c, 0x11},
131         {0x4d, 0x1e},
132         {0x4e, 0x0b},
133         {0x4f, 0x1d},
134         
135         {0x50, 0x1f},
136         {0x51, 0x1c},
137         
138         {0x57, 0x20},
139         {0x58, 0x20},
140         
141         {0x5d, 0x0101},
142         {0x5e, 0x0102},
143         {0x5f, 0x0103},
144         {0x60, 0x0104},
145         {0x61, 0x0105},
146         {0x62, 0x0106},
147         {0x63, 0x0107},
148         {0x64, 0x0108},
149         {0x65, 0x0109},
150         {0x66, 0x010a},
151         
152         {0xffff, 0xffff}
153 };
154
155 const key_tbl_t standard_shift_key[] = {
156         {0x01, 0x1b},
157         {0x02, 0x21},
158         {0x03, 0x22},
159         {0x04, 0x23},
160         {0x05, 0x24},
161         {0x06, 0x25},
162         {0x07, 0x26},
163         {0x08, 0x27},
164         {0x09, 0x28},
165         {0x0a, 0x29},
166         
167         {0x0c, 0x3d},
168         {0x0d, 0x7e},
169         {0x0e, 0x7c},
170         {0x0f, 0x08},
171         
172         {0x10, 0x09},
173         {0x11, 0x51},
174         {0x12, 0x57},
175         {0x13, 0x45},
176         {0x14, 0x52},
177         {0x15, 0x54},
178         {0x16, 0x59},
179         {0x17, 0x55},
180         {0x18, 0x49},
181         {0x19, 0x4f},
182         {0x1a, 0x50},
183         {0x1b, 0x60},
184         {0x1c, 0x7b},
185         {0x1d, 0x0d},
186         {0x1e, 0x41},
187         {0x1f, 0x53},
188         
189         {0x20, 0x44},
190         {0x21, 0x46},
191         {0x22, 0x47},
192         {0x23, 0x48},
193         {0x24, 0x4a},
194         {0x25, 0x4b},
195         {0x26, 0x4c},
196         {0x27, 0x2b},
197         {0x28, 0x2a},
198         {0x29, 0x7d},
199         {0x2a, 0x5a},
200         {0x2b, 0x58},
201         {0x2c, 0x43},
202         {0x2d, 0x56},
203         {0x2e, 0x42},
204         {0x2f, 0x4e},
205         
206         {0x30, 0x4d},
207         {0x31, 0x3c},
208         {0x32, 0x3e},
209         {0x33, 0x3f},
210         {0x34, 0x5f},
211         {0x35, 0x20},
212         {0x36, 0x2a},
213         {0x37, 0x2f},
214         {0x38, 0x2b},
215         {0x39, 0x2d},
216         {0x3a, 0x37},
217         {0x3b, 0x38},
218         {0x3c, 0x39},
219         {0x3d, 0x3d},
220         {0x3e, 0x34},
221         {0x3f, 0x35},
222
223         {0x40, 0x36},
224         {0x41, 0x2c},
225         {0x42, 0x31},
226         {0x43, 0x32},
227         {0x44, 0x33},
228         {0x45, 0x0d},
229         {0x46, 0x30},
230         {0x47, 0x2e},
231         {0x48, 0x12},
232         {0x49, 0x05},
233         {0x4a, 0x0c},
234         {0x4b, 0x7f},
235         {0x4c, 0x11},
236         {0x4d, 0x19},
237         {0x4e, 0x0b},
238         {0x4f, 0x02},
239         
240         {0x50, 0x1a},
241         {0x51, 0x06},
242
243         {0x57, 0x20},
244         {0x58, 0x20},
245         {0xffff, 0xffff}
246 };
247
248 const struct key_tbl_t ctrl_key[] = {
249         {0x0c, 0x1e},
250         {0x0d, 0x1c},
251         
252         {0x11, 0x11},
253         {0x12, 0x17},
254         {0x13, 0x05},
255         {0x14, 0x12},
256         {0x15, 0x14},
257         {0x16, 0x19},
258         {0x17, 0x15},
259         {0x18, 0x09},
260         {0x19, 0x0f}, // 09
261         {0x1a, 0x10},
262         {0x1b, 0x00},
263         {0x1c, 0x1b},
264         {0x1e, 0x01},
265         {0x1f, 0x13},
266         
267         {0x20, 0x04},
268         {0x21, 0x06},
269         {0x22, 0x07},
270         {0x23, 0x08},
271         {0x24, 0x0a},
272         {0x25, 0x0b},
273         {0x26, 0x0c},
274         {0x29, 0x1d},
275         {0x2a, 0x1a},
276         {0x2b, 0x18},
277         {0x2c, 0x03},
278         {0x2d, 0x16},
279         {0x2e, 0x02},
280         {0x2f, 0x0e},
281   
282         {0x30, 0x0d},
283         
284         {0x34, 0x1f},
285         {0xffff, 0xffff}
286 };
287
288 const struct key_tbl_t ctrl_shift_key[] = {
289         {0x0c, 0x1e},
290         {0x0d, 0x1c},
291         
292         {0x11, 0x11},
293         {0x12, 0x17},
294         {0x13, 0x05},
295         {0x14, 0x12},
296         {0x15, 0x14},
297         {0x16, 0x19},
298         {0x17, 0x15},
299         {0x18, 0x09},
300         {0x19, 0x09},
301         {0x1a, 0x10},
302         {0x1b, 0x00},
303         {0x1c, 0x1b},
304         {0x1e, 0x01},
305         {0x1f, 0x13},
306   
307         {0x20, 0x04},
308         {0x21, 0x06},
309         {0x22, 0x07},
310         {0x23, 0x08},
311         {0x24, 0x0a},
312         {0x25, 0x0b},
313         {0x26, 0x0c},
314         {0x29, 0x1d},
315         {0x2a, 0x1a},
316         {0x2b, 0x18},
317         {0x2c, 0x03},
318         {0x2d, 0x16},
319         {0x2e, 0x02},
320         {0x2f, 0x0e},
321   
322         {0x30, 0x0d},
323         
324         {0x34, 0x1f},
325         {0xffff, 0xffff}
326 };
327
328 const struct key_tbl_t graph_key[] = {
329         {0x01, 0x1b},
330         {0x02, 0xf9},
331         {0x03, 0xfa},
332         {0x04, 0xfb},
333         {0x05, 0xfc},
334         {0x06, 0xf2},
335         {0x07, 0xf3},
336         {0x08, 0xf4},
337         {0x09, 0xf5},
338         {0x0a, 0xf6},
339         {0x0b, 0xf7},
340         {0x0c, 0x8c},
341         {0x0d, 0x8b},
342         {0x0e, 0xf1},
343         {0x0f, 0x08},
344         
345         {0x10, 0x09},
346         {0x11, 0xfd},
347         {0x12, 0xf8},
348         {0x13, 0xe4},
349         {0x14, 0xe5},
350         {0x15, 0x9c},
351         {0x16, 0x9d},
352         {0x17, 0xf0},
353         {0x18, 0xe8},
354         {0x19, 0xe9},
355         {0x1a, 0x8d},
356         {0x1b, 0x8a},
357         {0x1c, 0xed},
358         {0x1d, 0x0d},
359         {0x1e, 0x95},
360         {0x1f, 0x96},
361   
362         {0x20, 0xe6},
363         {0x21, 0xe7},
364         {0x22, 0x9e},
365         {0x23, 0x9f},
366         {0x24, 0xea},
367         {0x25, 0xeb},
368         {0x26, 0x8e},
369         {0x27, 0x99},
370         {0x28, 0x94},
371         {0x29, 0xec},
372         {0x2a, 0x80},
373         {0x2b, 0x81},
374         {0x2c, 0x82},
375         {0x2d, 0x83},
376         {0x2e, 0x84},
377         {0x2f, 0x85},
378         
379         {0x30, 0x86},
380         {0x31, 0x87},
381         {0x32, 0x88},
382         {0x33, 0x97},
383         {0x34, 0xe0},
384         {0x35, 0x20},
385         {0x36, 0x98},
386         {0x37, 0x91},
387         {0x38, 0x99},
388         {0x39, 0xee},
389         {0x3a, 0xe1},
390         {0x3b, 0xe2},
391         {0x3c, 0xe3},
392         {0x3d, 0xef},
393         {0x3e, 0x93},
394         {0x3f, 0x8f},
395
396         {0x40, 0x92}, 
397         
398         {0x42, 0x9a},
399         {0x43, 0x90},
400         {0x44, 0x9b},
401         {0x45, 0x0d},
402         {0x48, 0x12},
403         {0x49, 0x05},
404         {0x4a, 0x0c},
405         {0x4b, 0x7f},
406         {0x4c, 0x11},
407         {0x4d, 0x1e},
408         {0x4e, 0x0b},
409         {0x4f, 0x1d},
410   
411         {0x50, 0x1f},
412         {0x51, 0x1c},
413
414         {0x57, 0x20},
415         {0x58, 0x20},
416         /* Belows is none when shift */
417         {0x5d, 0x101},
418         {0x5e, 0x102},
419         {0x5f, 0x103},
420         {0x60, 0x104},
421         {0x61, 0x105},
422         {0x62, 0x106},
423         {0x63, 0x107},
424         {0x64, 0x108},
425         {0x65, 0x109},
426         {0x66, 0x10a},
427         {0xffff, 0xffff}
428 };
429 const struct key_tbl_t graph_shift_key[] = {
430         {0x01, 0x1b},
431         {0x02, 0xf9},
432         {0x03, 0xfa},
433         {0x04, 0xfb},
434         {0x05, 0xfc},
435         {0x06, 0xf2},
436         {0x07, 0xf3},
437         {0x08, 0xf4},
438         {0x09, 0xf5},
439         {0x0a, 0xf6},
440         {0x0b, 0xf7},
441         {0x0c, 0x8c},
442         {0x0d, 0x8b},
443         {0x0e, 0xf1},
444         {0x0f, 0x08},
445
446         {0x10, 0x09},
447         {0x11, 0xfd},
448         {0x12, 0xf8},
449         {0x13, 0xe4},
450         {0x14, 0xe5},
451         {0x15, 0x9c},
452         {0x16, 0x9d},
453         {0x17, 0xf0},
454         {0x18, 0xe8},
455         {0x19, 0xe9},
456         {0x1a, 0x8d},
457         {0x1b, 0x8a},
458         {0x1c, 0xed},
459         {0x1d, 0x0d},
460         {0x1e, 0x95},
461         {0x1f, 0x96},
462   
463         {0x20, 0xe6},
464         {0x21, 0xe7},
465         {0x22, 0x9e},
466         {0x23, 0x9f},
467         {0x24, 0xea},
468         {0x25, 0xeb},
469         {0x26, 0x8e},
470         {0x27, 0x99},
471         {0x28, 0x94},
472         {0x29, 0xec},
473         {0x2a, 0x80},
474         {0x2b, 0x81},
475         {0x2c, 0x82},
476         {0x2d, 0x83},
477         {0x2e, 0x84},
478         {0x2f, 0x85},
479   
480         {0x30, 0x86},
481         {0x31, 0x87},
482         {0x32, 0x88},
483         {0x33, 0x97},
484         {0x34, 0xe0},
485         {0x35, 0x20},
486         {0x36, 0x98},
487         {0x37, 0x91},
488         {0x38, 0x99},
489         {0x39, 0xee},
490         {0x3a, 0xe1},
491         {0x3b, 0xe2},
492         {0x3c, 0xe3},
493         {0x3d, 0xef},
494         {0x3e, 0x93},
495         {0x3f, 0x8f},
496
497         {0x40, 0x92}, 
498         
499         {0x42, 0x9a},
500         {0x43, 0x90},
501         {0x44, 0x9b},
502         {0x45, 0x0d},
503         
504         {0x48, 0x12},
505         {0x49, 0x05},
506         {0x4a, 0x0c},
507         {0x4b, 0x7f},
508         {0x4c, 0x11},
509         {0x4d, 0x19},
510         {0x4e, 0x0b},
511         {0x4f, 0x02},
512   
513         {0x50, 0x1a},
514         {0x51, 0x06},
515         
516         {0x57, 0x20},
517         {0x58, 0x20},
518         {0xffff, 0xffff}
519 };
520
521 const struct key_tbl_t kana_key[] = {
522         {0x01, 0x1b},
523         {0x02, 0xc7},
524         {0x03, 0xcc},
525         {0x04, 0xb1},
526         {0x05, 0xb3},
527         {0x06, 0xb4},
528         {0x07, 0xb5},
529         {0x08, 0xd4},
530         {0x09, 0xd5},
531         {0x0a, 0xd6},
532         {0x0b, 0xdc},
533         {0x0c, 0xce},
534         {0x0d, 0xcd},
535         {0x0e, 0xb0},
536         {0x0f, 0x08},
537         
538         {0x10, 0x09},
539         {0x11, 0xc0},
540         {0x12, 0xc3},
541         {0x13, 0xb2},
542         {0x14, 0xbd},
543         {0x15, 0xb6},
544         {0x16, 0xdd},
545         {0x17, 0xc5},
546         {0x18, 0xc6},
547         {0x19, 0xd7},
548         {0x1a, 0xbe},
549         {0x1b, 0xde},
550         {0x1c, 0xdf},
551         {0x1d, 0x0d},
552         {0x1e, 0xc1},
553         {0x1f, 0xc4},
554         
555         {0x20, 0xbc},
556         {0x21, 0xca},
557         {0x22, 0xb7},
558         {0x23, 0xb8},
559         {0x24, 0xcf},
560         {0x25, 0xc9},
561         {0x26, 0xd8},
562         {0x27, 0xda},
563         {0x28, 0xb9},
564         {0x29, 0xd1},
565         {0x2a, 0xc2},
566         {0x2b, 0xbb},
567         {0x2c, 0xbf},
568         {0x2d, 0xcb},
569         {0x2e, 0xba},
570         {0x2f, 0xd0},
571                   
572         {0x30, 0xd3},
573         {0x31, 0xc8},
574         {0x32, 0xd9},
575         {0x33, 0xd2},
576         {0x34, 0xdb},
577         {0x35, 0x20},
578         {0x36, 0x2a},
579         {0x37, 0x2f},
580         {0x38, 0x2b},
581         {0x39, 0x2d},
582         {0x3a, 0x37},
583         {0x3b, 0x38},
584         {0x3c, 0x39},
585         {0x3d, 0x3d},
586         {0x3e, 0x34},
587         {0x3f, 0x35},
588                   
589         {0x40, 0x36},
590         {0x41, 0x2c},
591         {0x42, 0x31},
592         {0x43, 0x32},
593         {0x44, 0x33},
594         {0x45, 0x0d},
595         {0x46, 0x30},
596         {0x47, 0x2e},
597   
598         {0x48, 0x12},
599         {0x49, 0x05},
600         {0x4a, 0x0c},
601         {0x4b, 0x7f},
602         {0x4c, 0x11},
603         {0x4d, 0x1e},
604         
605         {0x4e, 0x0b},
606         {0x4f, 0x1d},
607         {0x50, 0x1f},
608         {0x51, 0x1c},
609         
610         
611         {0x57, 0x20},
612         {0x58, 0x20},
613         
614         {0x5d, 0x0101},
615         {0x5e, 0x0102},
616         {0x5f, 0x0103},
617         {0x60, 0x0104},
618         {0x61, 0x0105},
619         {0x62, 0x0106},
620         {0x63, 0x0107},
621         {0x64, 0x0108},
622         {0x65, 0x0109},
623         {0x66, 0x010a},
624
625         {0xffff, 0xffff}
626 };
627
628 const struct key_tbl_t kana_shift_key[] = {
629         {0x01, 0x1b},
630         {0x04, 0xa7},
631         {0x05, 0xa9},
632         {0x06, 0xaa},
633         {0x07, 0xab},
634         {0x08, 0xac},
635         {0x09, 0xad},
636         {0x0a, 0xae},
637         {0x0b, 0xa6},
638         {0x0f, 0x08},
639         
640         {0x10, 0x09},
641         {0x13, 0xa8},
642         {0x1c, 0xa2},
643         {0x1d, 0x0d},
644         
645         {0x29, 0xa3},
646         {0x2a, 0xaf},
647         
648         {0x31, 0xa4},
649         {0x32, 0xa1},
650         {0x33, 0xa5},
651         
652         {0x35, 0x20},
653         {0x36, 0x2a},
654         {0x37, 0x2f},
655         {0x38, 0x2b},
656         {0x39, 0x2d},
657         {0x3a, 0x37},
658         {0x3b, 0x38},
659         {0x3c, 0x39},
660         {0x3d, 0x3d},
661         {0x3e, 0x34},
662         {0x3f, 0x35},
663         
664         {0x40, 0x36},
665         {0x41, 0x2c},
666         {0x42, 0x31},
667         {0x43, 0x32},
668         {0x44, 0x33},
669         {0x45, 0x0d},
670         {0x46, 0x30},
671         {0x47, 0x2e},
672   
673         {0x48, 0x12},
674         {0x49, 0x05},
675         {0x4a, 0x0c},
676         {0x4b, 0x7f},
677         {0x4c, 0x11},
678         {0x4d, 0x19},
679
680         {0x4e, 0x0b},
681         {0x4f, 0x02},
682         {0x50, 0x1a},
683         {0x51, 0x06},
684         
685         {0x57, 0x20},
686         {0x58, 0x20},
687
688         {0xffff, 0xffff}
689 };
690
691 /*
692  * I/O API (subio)
693  */
694 // 0xd400(SUB) or 0xfd00(MAIN)
695 uint8 KEYBOARD::get_keycode_high(void)
696 {
697         uint8 data = 0x00;
698         if((keycode_7 & 0x0100) != 0) data = 0x80;
699         return data;
700 }
701
702 // 0xd401(SUB) or 0xfd01(MAIN)
703 uint8 KEYBOARD::get_keycode_low(void)
704 {
705         uint8 data = keycode_7 & 0xff;
706         mainio->write_signal(FM7_MAINIO_KEYBOARDIRQ, 0, 1);
707         display->write_signal(SIG_FM7_SUB_KEY_FIRQ, 0, 1);
708         return data;
709 }
710
711 // 0xd40d : R
712 void KEYBOARD::turn_on_ins_led(void)
713 {
714         this->write_signals(&ins_led, 0xff);
715 }
716
717 // 0xd40d : W
718 void KEYBOARD::turn_off_ins_led(void)
719 {
720         this->write_signals(&ins_led, 0x00);
721 }
722
723 // UI Handler. 
724 uint16 KEYBOARD::vk2scancode(uint32 vk)
725 {
726         uint16 i;
727         i = 0;
728         do {
729                 if(vk_matrix_106[i] == vk) return i;
730                 i++;
731         } while(vk_matrix_106[i] != 0xffff);
732         return 0x0000;
733 }
734
735 bool KEYBOARD::isModifier(uint16 sc)
736 {
737         if(((sc >= 0x52) && (sc <= 0x56)) || // CTRL LSHIFT RSHIFT CAPS GRPH
738                 (sc == 0x5a) || (sc == 0x5c)) { // KANA BREAK
739                 return true;
740         }
741         return false;
742 }
743
744 void KEYBOARD::set_modifiers(uint16 sc, bool flag)
745 {
746         if(sc == 0x52) { // CTRL
747                 ctrl_pressed = flag; 
748         } else if(sc == 0x53) { // LSHIFT
749                 lshift_pressed = flag;
750                 if(rshift_pressed) {
751                         shift_pressed = true;
752                 } else {
753                         shift_pressed = flag;
754                 }
755         } else if(sc == 0x54) { // RSHIFT
756                 rshift_pressed = flag;
757                 if(lshift_pressed) {
758                   shift_pressed = true;
759                 } else {
760                   shift_pressed = flag;
761                 }
762         } else if(sc == 0x56) { // GRPH
763                 graph_pressed = flag;
764         } else if(sc == 0x55) { // CAPS
765                 // Toggle on press.
766                 if(flag) {
767                         if(caps_pressed) {
768                                 caps_pressed = false;
769                         } else {
770                                 caps_pressed = true;
771                         }
772                         if(keymode == KEYMODE_STANDARD) this->write_signals(&caps_led, caps_pressed ? 0xff : 0x00);
773                 }
774         } else if(sc == 0x5a) { // KANA
775                 // Toggle on press.
776                 if(flag) {
777                         if(kana_pressed) {
778                                 kana_pressed = false;
779                         } else {
780                                 kana_pressed = true;
781                         }
782                         if(keymode == KEYMODE_STANDARD) this->write_signals(&kana_led, kana_pressed ? 0xff : 0x00);
783                 }
784         } else if(sc == 0x5c) { // Break
785                 break_pressed = flag;
786         }
787 }
788
789 uint16 KEYBOARD::scan2fmkeycode(uint16 sc)
790 {
791         const struct key_tbl_t *keyptr = NULL;
792         bool stdkey = false;
793         int i;
794         uint16 retval;
795         
796         if((sc == 0) || (sc >= 0x67)) return 0xffff;
797         // Set repeat flag(s)
798         if(shift_pressed && ctrl_pressed) {
799                 switch(sc) {
800                         case 0x02: // 1
801                         case 0x42: // 1
802                                 repeat_mode = true;
803                                 return 0xffff;
804                                 break;
805                         case 0x0b: // 0
806                         case 0x46: // 0
807                                 repeat_mode = false;
808                                 return 0xffff;
809                                 break;
810                 }
811         }
812         if(keymode == KEYMODE_STANDARD) {
813                 bool dmy = isModifier(sc);
814                 if(ctrl_pressed) {
815                         if(shift_pressed) {
816                                 keyptr = ctrl_shift_key;
817                         } else {
818                                 keyptr = ctrl_key;
819                         }
820                 } else if(graph_pressed) {
821                         if(shift_pressed) {
822                                 keyptr = graph_shift_key;
823                         } else {
824                                 keyptr = graph_key;
825                         }
826                 } else if(kana_pressed) {
827                         if(shift_pressed) {
828                                 keyptr = kana_shift_key;
829                         } else {
830                                 keyptr = kana_key;
831                         }
832                 } else { // Standard
833                         stdkey = true;
834                         if(shift_pressed) {
835                                 keyptr = standard_shift_key;
836                         } else {
837                                 keyptr = standard_key;
838                         }
839                 }
840         }
841 #if defined(_FM77AV_VARIANTS)
842         else    if(shift_pressed) {
843           // DO super-impose mode:
844           // F7 : PC
845           // F8 : IMPOSE (High brightness)
846           // F9 : IMPOSE (Low brightness)
847           // F10: TV
848         }
849         if(keymode == KEYMODE_SCAN) {
850                 retval = sc;
851                 return retval;
852         } else if(keymode == KEYMODE_16BETA) { // Will Implement
853                 return 0xffff;
854         }
855 #endif //_FM77AV_VARIANTS       
856         i = 0;
857         retval = 0xffff;
858         if (keyptr == NULL) return 0xffff;
859         do {
860                 if(keyptr[i].phy == sc) {
861                         retval = keyptr[i].code;
862                         break;
863                 }
864                 i++;
865         } while(keyptr[i].phy != 0xffff);
866
867         if(stdkey) {
868                 if((retval >= 'A') && (retval <= 'Z')) {
869                         if(caps_pressed) {
870                                 retval += 0x20;
871                         }
872                 } else if((retval >= 'a') && (retval <= 'z')) {
873                         if(caps_pressed) {
874                                 retval -= 0x20;
875                         }
876                 }
877         }
878         return retval;
879 }
880
881 void KEYBOARD::key_up(uint32 vk)
882 {
883         scancode = vk2scancode(vk);
884         bool stat_break = break_pressed;
885         uint32 code_7;
886         older_vk = 0;
887         if(scancode == 0) return;
888         if(event_ids[scancode] >= 0){
889                 cancel_event(this, event_ids[scancode]);
890                 event_ids[scancode] = -1;
891         }
892         if(this->isModifier(scancode)) {
893                 set_modifiers(scancode, false);
894                 if(break_pressed != stat_break) { // Break key UP.
895                         this->write_signals(&break_line, 0x00);
896                 }
897         }
898         if(key_pressed_flag[scancode] == false) return; 
899         key_pressed_flag[scancode] = false; 
900         if(keymode == KEYMODE_SCAN) { // Notify even key-up, when using SCAN mode.
901                 //printf("UP SCAN=%04x break=%d\n", scancode, stat_break);
902                 if(scancode !=  0) {   
903                         code_7 = scancode | 0x80;
904                         keycode_7 = code_7 | 0x8000;
905                         mainio->write_signal(FM7_MAINIO_KEYBOARDIRQ, keycode_7, 0x8000);
906                         display->write_signal(SIG_FM7_SUB_KEY_FIRQ, keycode_7, 0x8000);
907                 }
908         }
909 }
910
911 void KEYBOARD::key_down(uint32 vk)
912 {
913         if(older_vk == vk) return;
914         older_vk = vk;
915         
916         scancode = vk2scancode(vk);
917         key_down_main();
918 }
919
920 void KEYBOARD::key_down_main(void)
921 {
922         double usec = (double)repeat_time_long * 1000.0;
923         uint32 code_7;
924         bool stat_break = break_pressed;
925
926         if(scancode == 0) return;
927         if(this->isModifier(scancode)) {  // modifiers
928                 set_modifiers(scancode, true);
929                 if(break_pressed != stat_break) { // Break key Down.
930                         this->write_signals(&break_line, 0xff);
931                 }
932         }
933         code_7 = scan2fmkeycode(scancode);
934         if(keymode == KEYMODE_SCAN) {
935                 code_7 = scancode & 0x7f;
936         }
937         //printf("DOWN SCAN=%04x 7CODE=%03x break=%d\n", scancode, code_7, stat_break);
938         if(key_pressed_flag[scancode] != false) return;
939         if(code_7 < 0x200) {
940                 keycode_7 = code_7 | 0x8000;
941                 //mainio->write_signal(FM7_MAINIO_PUSH_KEYBOARD, code_7, 0x1ff);
942                 mainio->write_signal(FM7_MAINIO_KEYBOARDIRQ, keycode_7, 0x8000);
943                 display->write_signal(SIG_FM7_SUB_KEY_FIRQ, keycode_7, 0x8000);
944                 key_pressed_flag[scancode] = true;
945         }
946    
947         // If repeat && !(PF) && !(BREAK) 
948         if((repeat_mode) && (scancode < 0x5c) && (code_7 != 0xffff)) {
949                 register_event(this,
950                                ID_KEYBOARD_AUTOREPEAT_FIRST + scancode,
951                                usec, false, &event_ids[scancode]);
952         } else {
953                 if(event_ids[scancode] >= 0) cancel_event(this, event_ids[scancode]);
954                 event_ids[scancode] = -1;
955         }
956         key_pressed_flag[scancode] = true;
957
958 }
959
960 #if defined(_FM77AV_VARIANTS)
961 void KEYBOARD::adjust_rtc(void)
962 {
963         p_emu->get_host_time(&cur_time);
964         rtc_yy = cur_time.year % 100;
965         rtc_mm = cur_time.month;
966         rtc_dd = cur_time.day;
967
968         rtc_dayofweek = cur_time.day_of_week;
969         if(rtc_count24h) {
970                 rtc_ispm = (cur_time.hour >= 12) ? true : false;
971                 rtc_hour = cur_time.hour % 12;
972         } else {
973                 rtc_ispm = false;
974                 rtc_hour = cur_time.hour;
975         }
976         rtc_minute = cur_time.minute;
977         rtc_sec = cur_time.second;
978         if(event_key_rtc >= 0) {
979                 cancel_event(this, event_key_rtc);
980         }
981         register_event(this, ID_KEYBOARD_RTC_COUNTUP, 1000.0 * 1000.0, true, &event_key_rtc);
982 }
983 #endif
984
985 void KEYBOARD::do_repeatkey(uint16 sc)
986 {
987         uint16 code_7;
988         if((sc == 0) || (sc >= 0x67)) return; // scancode overrun.
989         if(!repeat_mode) {
990                 if(event_ids[sc] >= 0) {
991                         cancel_event(this, event_ids[sc]);
992                         event_ids[sc] = -1;
993                 }
994                 return;
995         }
996         key_pressed_flag[sc] = true;
997         code_7 = scan2fmkeycode(sc);
998         if(keymode == KEYMODE_SCAN) {
999                 code_7 = sc;
1000         }
1001         if(code_7 < 0x200) {
1002                 keycode_7 = code_7 | 0x8000;
1003                 mainio->write_signal(FM7_MAINIO_KEYBOARDIRQ, keycode_7, 0x8000);
1004                 display->write_signal(SIG_FM7_SUB_KEY_FIRQ, keycode_7, 0x8000);
1005         }
1006 }
1007
1008 void KEYBOARD::event_callback(int event_id, int err)
1009 {
1010 #if defined(_FM77AV_VARIANTS)
1011         if(event_id == ID_KEYBOARD_RXRDY_OK) {
1012                 write_signals(&rxrdy, 0xff);
1013         } else if(event_id == ID_KEYBOARD_RXRDY_BUSY) {
1014                 write_signals(&rxrdy, 0x00);
1015         } else if(event_id == ID_KEYBOARD_ACK) {
1016           //key_ack_status = true;
1017                 write_signals(&key_ack, 0xff);
1018         } else if(event_id == ID_KEYBOARD_RTC_COUNTUP) {
1019                 rtc_count();
1020         } else
1021 #endif
1022         if((event_id >= ID_KEYBOARD_AUTOREPEAT_FIRST) && (event_id <= (ID_KEYBOARD_AUTOREPEAT_FIRST + 0x1ff))) {
1023                 uint32 sc = event_id - ID_KEYBOARD_AUTOREPEAT_FIRST;
1024                 double usec = (double)repeat_time_short * 1000.0;
1025
1026                 if((sc >= 0x67) || (sc == 0)) return;
1027                 do_repeatkey((uint16)sc);
1028                 register_event(this,
1029                                ID_KEYBOARD_AUTOREPEAT + sc,
1030                                usec, true, &event_ids[sc]);
1031                 // Key repeat.
1032         } else if((event_id >= ID_KEYBOARD_AUTOREPEAT) && (event_id <= (ID_KEYBOARD_AUTOREPEAT + 0x1ff))){
1033                 uint32 sc = event_id - ID_KEYBOARD_AUTOREPEAT;
1034                 do_repeatkey((uint16)sc);
1035         }
1036 }
1037
1038 // Commands
1039 void KEYBOARD::reset_unchange_mode(void)
1040 {
1041         int i;
1042         repeat_time_short = 70; // mS
1043         repeat_time_long = 700; // mS
1044         repeat_mode = true;
1045         keycode_7 = 0x00;
1046         older_vk = 0;
1047
1048         lshift_pressed = false;
1049         rshift_pressed = false;
1050         ctrl_pressed   = false;
1051         graph_pressed = false;
1052         //      ins_pressed = false;
1053         cmd_fifo->clear();
1054         data_fifo->clear();
1055         datareg = 0x00;
1056 #if defined(_FM77AV_VARIANTS)
1057         if(event_key_rtc >= 0) {
1058            cancel_event(this, event_key_rtc);
1059         }
1060         register_event(this,ID_KEYBOARD_RTC_COUNTUP, 1000.0 * 1000.0, true, &event_key_rtc);
1061
1062         cmd_phase = 0;
1063         for(i = 0; i < 0x70; i++) {
1064                 if(event_ids[i] >= 0) cancel_event(this,event_ids[i]);
1065                 event_ids[i] = -1;
1066                 key_pressed_flag[i] = false;
1067         }
1068 #endif
1069         // Bus
1070         this->write_signals(&break_line, 0x00);
1071 #if defined(_FM77AV_VARIANTS)
1072         rxrdy_status = false;
1073         key_ack_status = true;
1074         this->write_signals(&rxrdy, 0x00);                
1075         this->write_signals(&key_ack, 0xff);              
1076         this->write_signals(&kana_led, 0x00);             
1077         this->write_signals(&caps_led, 0x00);             
1078         this->write_signals(&ins_led, 0x00);              
1079 #else
1080         this->write_signals(&kana_led, 0x00);             
1081         this->write_signals(&caps_led, 0x00);             
1082         this->write_signals(&ins_led, 0x00);              
1083 #endif     
1084 }
1085
1086
1087 void KEYBOARD::reset(void)
1088 {
1089         keymode = KEYMODE_STANDARD;
1090         scancode = 0x00;
1091         keycode_7 = 0x00; 
1092         reset_unchange_mode();
1093 #if defined(_FM77AV_VARIANTS)  
1094         adjust_rtc();
1095 #endif
1096 }
1097
1098
1099 #if defined(_FM77AV_VARIANTS)  
1100 // 0xd431 : Read
1101 uint8 KEYBOARD::read_data_reg(void)
1102 {
1103         if(!data_fifo->empty()) {
1104                 datareg = data_fifo->read() & 0xff;
1105         }
1106         if(data_fifo->empty()) {
1107                 write_signals(&rxrdy, 0x00);
1108         } else {
1109                 write_signals(&rxrdy, 0xff);
1110         }
1111         return datareg;
1112 }
1113
1114 // 0xd432
1115 uint8 KEYBOARD::read_stat_reg(void)
1116 {
1117         uint8 data = 0xff;
1118         if(rxrdy_status) {
1119                 data &= 0x7f;
1120         }
1121         if(!key_ack_status) {
1122                 data &= 0xfe;
1123         }
1124         // Digityze : bit0 = '0' when waiting,
1125         return data;
1126 }
1127
1128 void KEYBOARD::set_mode(void)
1129 {
1130         int count = cmd_fifo->count();
1131         int cmd;
1132         int mode;
1133         if(count < 2) return;
1134         cmd = cmd_fifo->read();
1135         mode = cmd_fifo->read();
1136         if(mode <= KEYMODE_SCAN) {
1137                 keymode = mode;
1138                 reset_unchange_mode();
1139         }
1140         cmd_fifo->clear();
1141         data_fifo->clear(); // right?
1142         write_signals(&rxrdy, 0x00);
1143 }
1144
1145 void KEYBOARD::get_mode(void)
1146 {
1147         int cmd;
1148         int dummy;
1149         cmd = cmd_fifo->read();
1150         if(data_fifo->full()) {
1151                 dummy = data_fifo->read();
1152         }
1153         data_fifo->write(keymode);
1154         write_signals(&rxrdy, 0xff);
1155 }
1156
1157 void KEYBOARD::set_leds(void)
1158 {
1159         int count = cmd_fifo->count();
1160         int cmd;
1161         int ledvar;
1162         if(count < 2) return;
1163         cmd = cmd_fifo->read();
1164         ledvar = cmd_fifo->read();
1165         if(ledvar < 4) {
1166                 if((ledvar & 0x02) != 0) {
1167                         // Kana
1168                         kana_pressed = ((ledvar & 0x01) == 0);
1169                         write_signals(&kana_led, kana_pressed);
1170                 } else {
1171                         // Caps
1172                         caps_pressed = ((ledvar & 0x01) == 0);
1173                         write_signals(&caps_led, caps_pressed);
1174                 }
1175         }
1176         cmd_fifo->clear();
1177         data_fifo->clear(); // right?
1178         write_signals(&rxrdy, 0x00);
1179 }
1180
1181 void KEYBOARD::get_leds(void)
1182 {
1183         uint8 ledvar = 0x00;
1184         data_fifo->clear();
1185         ledvar |= caps_pressed ? 0x01 : 0x00;
1186         ledvar |= kana_pressed ? 0x02 : 0x00;
1187         data_fifo->write(ledvar);
1188         cmd_fifo->clear();
1189         write_signals(&rxrdy, 0xff);
1190 }
1191
1192 void KEYBOARD::set_repeat_type(void)
1193 {
1194         int cmd;
1195         int modeval;
1196
1197         cmd = cmd_fifo->read();
1198         if(!cmd_fifo->empty()) {
1199                 modeval = cmd_fifo->read();
1200                 if((modeval < 2) && (modeval >= 0)) {
1201                         repeat_mode = (modeval == 0);
1202                         if(repeat_mode) {
1203                                 keycode_7 = 0x00;
1204                                 scancode = 0x00;
1205                         }
1206                 }
1207         }
1208         data_fifo->clear();
1209         cmd_fifo->clear();
1210         write_signals(&rxrdy, 0x00);
1211 }
1212
1213 void KEYBOARD::set_repeat_time(void)
1214 {
1215         int cmd;
1216         int time_high = 0;
1217         int time_low = 0;
1218         cmd = cmd_fifo->read();
1219         if(cmd_fifo->empty()) goto _end;
1220         time_high = cmd_fifo->read();
1221         if(cmd_fifo->empty()) goto _end;
1222         time_low = cmd_fifo->read();
1223 //      if(cmd_fifo->empty()) goto _end;
1224 _end:
1225         if((time_high == 0) || (time_low == 0)) {
1226                 repeat_time_long = 700;
1227                 repeat_time_short = 70;
1228         } else {
1229                 repeat_time_long = time_high * 10;
1230                 repeat_time_short = time_low * 10;
1231         }
1232         data_fifo->clear();
1233         cmd_fifo->clear();
1234         write_signals(&rxrdy, 0x00);
1235 }
1236
1237 void KEYBOARD::set_rtc(void)
1238 {
1239         int cmd;
1240         int tmp;
1241         int localcmd;
1242         if(cmd_fifo->count() < 9) return;
1243         cmd = cmd_fifo->read();
1244         localcmd = cmd_fifo->read();
1245         // YY
1246         tmp = cmd_fifo->read();
1247         rtc_yy = ((tmp >> 4) * 10) | (tmp & 0x0f);
1248         // MM
1249         tmp = cmd_fifo->read();
1250         rtc_mm = ((tmp >> 4) * 10) | (tmp & 0x0f);
1251         // DD
1252         tmp = cmd_fifo->read();
1253         rtc_dd = (((tmp & 0x30) >> 4) * 10) | (tmp & 0x0f);
1254         // DayOfWeek + Hour
1255         tmp = cmd_fifo->read();
1256         rtc_count24h = ((tmp & 0x08) != 0);
1257         if(!rtc_count24h) {
1258                 rtc_ispm = ((tmp & 0x04) != 0);
1259         }
1260         rtc_dayofweek = (tmp >> 4) % 0x07;
1261         rtc_hour = ((tmp & 0x03) * 10);
1262         // Low
1263         tmp = cmd_fifo->read();
1264         rtc_hour = rtc_hour | (tmp >> 4);
1265         if(rtc_count24h) {
1266           rtc_ispm = (rtc_hour >= 12);
1267         }
1268         rtc_minute = (tmp & 0x0f) * 10;
1269         
1270         tmp = cmd_fifo->read();
1271         rtc_minute = rtc_minute | (tmp >> 4);
1272         rtc_sec = (tmp & 0x0f) * 10;
1273         
1274         tmp = cmd_fifo->read();
1275         rtc_sec = rtc_sec | (tmp >> 4);
1276         
1277         data_fifo->clear();
1278         cmd_fifo->clear();
1279         if(event_key_rtc >= 0) {
1280                 cancel_event(this, event_key_rtc);
1281         }
1282         register_event(this, ID_KEYBOARD_RTC_COUNTUP, 1000.0 * 1000.0, true, &event_key_rtc);
1283         write_signals(&rxrdy, 0x00);
1284 }
1285
1286 void KEYBOARD::get_rtc(void)
1287 {
1288         int tmp;
1289         data_fifo->clear();
1290         // YY
1291         tmp = ((rtc_yy / 10) << 4) | (rtc_yy % 10);
1292         data_fifo->write(tmp);
1293         // MM
1294         tmp = ((rtc_mm / 10) << 4) | (rtc_mm % 10);
1295         data_fifo->write(tmp);
1296         // DD
1297         tmp = ((rtc_dd / 10) << 4) | (rtc_dd % 10);
1298         tmp = tmp | (0 << 6); // leap
1299         data_fifo->write(tmp);
1300         // DayOfWeek + Hour
1301         tmp = rtc_dayofweek << 4;
1302         tmp = tmp | (rtc_hour / 10);
1303         if(rtc_count24h) {
1304           tmp = tmp | 0x08;
1305         } else {
1306           if(rtc_ispm) {
1307             tmp = tmp | 0x04;
1308           }
1309         }
1310         data_fifo->write(tmp);
1311         // Low
1312         tmp = (rtc_hour % 10) << 4;
1313         tmp = tmp | (rtc_minute / 10);
1314         data_fifo->write(tmp);
1315         
1316         tmp = (rtc_minute % 10) << 4;
1317         tmp = tmp | (rtc_sec / 10);
1318         data_fifo->write(tmp);
1319         
1320         tmp = (rtc_sec % 10) << 4;
1321         data_fifo->write(tmp);
1322         
1323         cmd_fifo->clear();
1324         write_signals(&rxrdy, 0xff);
1325 }
1326
1327 const int rtc_month_days[12] = {
1328         31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
1329 };
1330
1331 void KEYBOARD::rtc_count(void)
1332 {
1333         // count per 1sec
1334         rtc_sec++;
1335         if(rtc_sec >= 60) {
1336                 rtc_sec = 0;
1337                 rtc_minute++;
1338                 if(rtc_minute >= 60) {
1339                         rtc_minute = 0;
1340                         rtc_hour++;
1341                         if(rtc_count24h) {
1342                                 rtc_ispm = (rtc_hour >= 12);
1343                                 if(rtc_hour < 24) return;
1344                         } else {
1345                                 if(rtc_ispm) {
1346                                         if(rtc_hour < 12) return;
1347                                 } else {
1348                                         if(rtc_hour < 12) return;
1349                                         rtc_ispm = true;
1350                                         rtc_hour = 0;
1351                                         return;
1352                                 }
1353                         }
1354                         // Day count up
1355                         rtc_hour = 0;
1356                         rtc_dd++;
1357                         rtc_dayofweek++;
1358                         if(rtc_dayofweek >= 7) rtc_dayofweek = 0;
1359                         if(rtc_dd > rtc_month_days[rtc_mm]){
1360                                 if((rtc_mm ==1) && (rtc_dd == 29)) {
1361                                         if((rtc_yy % 4) == 0) return;
1362                                 }
1363                                 rtc_dd = 1;
1364                                 rtc_mm++;
1365                                 if(rtc_mm >= 12) {
1366                                         rtc_yy++;
1367                                         rtc_mm = 0;
1368                                         if(rtc_yy >= 100) rtc_yy = 0;
1369                                 }
1370                         }
1371                 }
1372         }
1373 }
1374 #endif // FM77AV_VARIANTS
1375
1376 uint32 KEYBOARD::read_signal(int id)
1377 {
1378         if(id == SIG_FM7KEY_BREAK_KEY) {
1379                 return break_pressed ? 0xfffffff : 0x00000000;
1380         }
1381         return 0;
1382 }
1383
1384
1385 void KEYBOARD::write_signal(int id, uint32 data, uint32 mask)
1386 {
1387         if(id == SIG_FM7KEY_SET_INSLED) {
1388                 write_signals(&ins_led, data & mask);
1389         }
1390 #if defined(_FM77AV_VARIANTS)  
1391          else if(id == SIG_FM7KEY_PUSH_TO_ENCODER) {
1392                 /*
1393                  * I refered XM7's sourcecode : VM/keyboard.c act of key-encoder.
1394                  * Thanks to Ryu.Takegami and PI.
1395                  */
1396                 int count;
1397                 if(!key_ack_status) return; // If (not(ACK)) noop.
1398
1399                 if(cmd_fifo->full()) {
1400                         cmd_fifo->clear();
1401                 }
1402                 if(cmd_fifo->empty()) {
1403                         cmd_phase = data & 0xff;
1404                 }
1405                 
1406                 cmd_fifo->write(data & 0xff);
1407                 count = cmd_fifo->count();
1408                 
1409                 write_signals(&key_ack, 0x00);
1410                 key_ack_status = false;
1411                 switch(cmd_phase) {
1412                         case 0: // Set mode
1413                                 if(count >= 2) {
1414                                         set_mode();
1415                                         if(keymode == KEYMODE_SCAN) key_down_main();
1416                                 }
1417                                 break;
1418                         case 1: // Get mode
1419                                 get_mode();
1420                                 break;
1421                         case 2: // Set LED Phase
1422                                 if(count >= 2) {
1423                                         set_leds();
1424                                         if(keymode == KEYMODE_SCAN) key_down_main();
1425                                 }
1426                                 break;
1427                         case 3: // Get LED Phase
1428                                 get_leds();
1429                                 break;
1430                         case 4:
1431                                 if(count >= 2) set_repeat_type();
1432                                 break;
1433                         case 5:
1434                                 if(count >= 3) set_repeat_time();
1435                                 break;
1436                         case 0x80: // Communicate to/from RTC.
1437                                 if(count == 1) {
1438                                         rtc_set = false;
1439                                 }
1440                                 if(count == 2) {
1441                                         if((data & 0xff) == 0) { // Get
1442                                                 get_rtc();
1443                                         } else if((data & 0xff) == 1) { // Set
1444                                                 rtc_set_flag = true;
1445                                         } else { // Illegal
1446                                                 cmd_fifo->clear(); 
1447                                         }
1448                                 }
1449                                 if(rtc_set_flag) {
1450                                         if(count >= 9) {
1451                                                 set_rtc();
1452                                         }
1453                                 }
1454                                 break;
1455                         case 0x81: // Digitize.
1456                                 if(count >= 2) do_digitize(); // WILL Implement?
1457                                 break;
1458                         case 0x82:
1459                                 if(count >= 2) set_screen_mode();
1460                                 break;
1461                         case 0x83:
1462                                 get_screen_mode();
1463                                 break;
1464                         case 0x84:
1465                                 if(count >= 2) set_brightness();
1466                                 break;
1467                         default:
1468                                 //cmd_fifo->clear();
1469                                 break;
1470                 }
1471                 register_event(this, ID_KEYBOARD_ACK, 5, false, NULL); // Delay 5us until ACK is up.
1472         } else if(id == SIG_FM7KEY_RXRDY) {
1473                 rxrdy_status = ((data & mask) != 0);
1474                 //write_signals(&rxrdy, (rxrdy_status) ? 0xffffffff : 0x00000000);
1475         } else if(id == SIG_FM7KEY_ACK) {
1476                 key_ack_status = ((data & mask) != 0);
1477                 //write_signals(&key_ack, (key_ack_status) ? 0xffffffff : 0x00000000);
1478         }
1479
1480 #endif
1481 }
1482
1483 uint32 KEYBOARD::read_data8(uint32 addr)
1484 {
1485         uint32 retval = 0xff;
1486         switch(addr) {
1487                 case 0x00:
1488                         retval = get_keycode_high();
1489                         break;
1490                 case 0x01:
1491                         retval = get_keycode_low();
1492                         break;
1493 #if defined(_FM77AV_VARIANTS)                   
1494                 case 0x31:
1495                         retval = read_data_reg();
1496                         break;
1497                 case 0x32:
1498                         retval = read_stat_reg();
1499                         break;
1500 #endif
1501                 default:
1502                         break;
1503         }
1504         return retval;
1505 }
1506
1507 void KEYBOARD::write_data8(uint32 addr, uint32 data)
1508 {
1509         switch(addr) {
1510 #if defined(_FM77AV_VARIANTS)                   
1511                 case 0x31:
1512                         this->write_signal(SIG_FM7KEY_PUSH_TO_ENCODER, data, 0x000000ff);
1513                         break;
1514 #endif
1515         }
1516 }
1517
1518 KEYBOARD::KEYBOARD(VM *parent_vm, EMU *parent_emu) : DEVICE(parent_vm, parent_emu)
1519 {
1520         int i;
1521         p_vm = parent_vm;
1522         p_emu = parent_emu;
1523   
1524         keycode_7 = 0;
1525    
1526         ctrl_pressed = false; 
1527         lshift_pressed = false; 
1528         rshift_pressed = false; 
1529         shift_pressed = false; 
1530         graph_pressed = false;
1531         caps_pressed = false;
1532         kana_pressed = false;
1533         break_pressed = false;
1534         
1535         for(i = 0; i < 0x70; i++) {
1536                 event_ids[i] = -1;
1537                 key_pressed_flag[i] = false;
1538         }
1539    
1540         cmd_fifo = new FIFO(16);
1541         data_fifo = new FIFO(16);
1542         keymode = KEYMODE_STANDARD;
1543 #if defined(_FM77AV_VARIANTS)
1544         rxrdy_status = false;
1545         key_ack_status = false;
1546         init_output_signals(&rxrdy);
1547         init_output_signals(&key_ack);
1548
1549         rtc_count24h = false;
1550         rtc_dayofweek = 0;
1551         rtc_ispm = false;
1552         rtc_set = false;
1553         rtc_set_flag = false;
1554         rtc_yy = 0;
1555         rtc_mm = 0;
1556         rtc_dd = 0;
1557         rtc_hour = 0;
1558         rtc_minute = 0;
1559         rtc_sec = 0;
1560         event_key_rtc = -1;
1561 #endif
1562         
1563         init_output_signals(&break_line);
1564         
1565         init_output_signals(&kana_led);
1566         init_output_signals(&caps_led);
1567         init_output_signals(&ins_led);
1568 }
1569
1570 void KEYBOARD::release(void)
1571 {
1572         cmd_fifo->release();
1573         data_fifo->release();
1574         delete cmd_fifo;
1575         delete data_fifo;
1576 }
1577
1578 KEYBOARD::~KEYBOARD()
1579 {
1580 }
1581
1582    
1583