OSDN Git Service

0c884270364f5ebce86c5824ab987a2d45936429
[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 |= 0x01;
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 scancode)
736 {
737         if(((scancode >= 0x52) && (scancode <= 0x56)) || // CTRL LSHIFT RSHIFT CAPS GRPH
738                 (scancode == 0x5a) || (scancode == 0x5c)) { // KANA BREAK
739                 return true;
740         }
741         return false;
742 }
743
744 void KEYBOARD::set_modifiers(uint16 scancode, bool flag)
745 {
746         if(scancode == 0x52) { // CTRL
747                 ctrl_pressed = flag; 
748         } else if(scancode == 0x53) { // LSHIFT
749                 lshift_pressed = flag;
750                 if(rshift_pressed) {
751                         shift_pressed = true;
752                 } else {
753                         shift_pressed = flag;
754                 }
755         } else if(scancode == 0x54) { // RSHIFT
756                 rshift_pressed = flag;
757                 if(lshift_pressed) {
758                   shift_pressed = true;
759                 } else {
760                   shift_pressed = flag;
761                 }
762         } else if(scancode == 0x56) { // GRPH
763                 graph_pressed = flag;
764         } else if(scancode == 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(scancode == 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(scancode == 0x5c) { // Break
785                 break_pressed = flag;
786         }
787 }
788
789 uint16 KEYBOARD::scan2fmkeycode(uint16 scancode)
790 {
791         const struct key_tbl_t *keyptr;
792         uint16 code;
793         bool stdkey = false;
794         int i;
795         uint16 retval;
796         
797         if((scancode == 0) || (scancode >= 0x67)) return 0xffff;
798         // Set repeat flag(s)
799         if(shift_pressed && ctrl_pressed) {
800                 switch(scancode) {
801                         case 0x02: // 1
802                         case 0x42: // 1
803                                 repeat_mode = true;
804                                 //return 0xffff;
805                                 break;
806                         case 0x0b: // 0
807                         case 0x46: // 0
808                                 repeat_mode = false;
809                                 //return 0xffff;
810                                 break;
811                 }
812         }
813         if(keymode == KEYMODE_STANDARD) {
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                 if(keyptr == NULL) return 0xffff;
841         }
842 #if defined(_FM77AV_VARIANTS)
843         else    if(shift_pressed) {
844           // DO super-impose mode:
845           // F7 : PC
846           // F8 : IMPOSE (High brightness)
847           // F9 : IMPOSE (Low brightness)
848           // F10: TV
849         }
850         if(keymode == KEYMODE_SCAN) {
851                 retval = scancode;
852                 return retval;
853         } else if(keymode == KEYMODE_16BETA) { // Will Implement
854                 return 0xffff;
855         }
856 #endif //_FM77AV_VARIANTS       
857         i = 0;
858         retval = 0xffff;
859         do {
860                 if(keyptr[i].phy == scancode) {
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         uint16 scancode = vk2scancode(vk);
884         bool stat_break = break_pressed;
885         uint32 code_7;
886
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         key_pressed_flag[scancode] = false; 
893         if(this->isModifier(scancode)) {
894                 set_modifiers(scancode, false);
895                 if(break_pressed != stat_break) { // Break key UP.
896                         //mainio->write_signal(FM7_MAINIO_PUSH_BREAK, 0x00, 0xff);
897                         this->write_signals(&break_line, 0x00);
898                         return;    
899                 }
900         }
901         if(keymode == KEYMODE_SCAN) {
902                 code_7 = scan2fmkeycode(scancode);
903                 if(code_7 < 0x200) {
904                         keycode_7 = code_7;
905                         //mainio->write_signal(FM7_MAINIO_PUSH_KEYBOARD, code_7, 0x1ff);
906                         //mainio->write_signal(FM7_MAINIO_KEYBOARDIRQ, 0, 1);
907                         //display->write_signal(SIG_FM7_SUB_KEY_FIRQ, 0, 1);
908                 }
909         }         
910 }
911
912 void KEYBOARD::key_down(uint32 vk)
913 {
914         double usec = (double)repeat_time_long * 1000.0;
915         uint32 code_7;
916         uint16 scancode = vk2scancode(vk);
917         bool stat_break = break_pressed;
918         //printf("VK=%04x SCAN=%04x break=%d\n", vk, scancode, stat_break);
919
920         if(scancode == 0) return;
921         key_pressed_flag[scancode] = true;
922         
923         if(this->isModifier(scancode)) {  // modifiers
924                 set_modifiers(scancode, true);
925                 if(break_pressed != stat_break) { // Break key Down.
926                         //mainio->write_signal(FM7_MAINIO_PUSH_BREAK, 0xff, 0xff);
927                         this->write_signals(&break_line, 0xff);
928                 }
929         }
930         code_7 = scan2fmkeycode(scancode);
931         if(code_7 < 0x200) {
932                 keycode_7 = code_7;
933                 mainio->write_signal(FM7_MAINIO_PUSH_KEYBOARD, code_7, 0x1ff);
934                 mainio->write_signal(FM7_MAINIO_KEYBOARDIRQ, 1, 1);
935                 display->write_signal(SIG_FM7_SUB_KEY_FIRQ, 1, 1);
936         }
937         // If repeat && !(PF) && !(BREAK) 
938         if((repeat_mode) && (scancode < 0x5c) && (scancode != 0)) {
939                 register_event(this,
940                                ID_KEYBOARD_AUTOREPEAT_FIRST + scancode,
941                                usec, false, &event_ids[scancode]);
942         } else {
943                 event_ids[scancode] = -1;
944         }
945         key_pressed_flag[scancode] = true;
946
947 }
948
949 void KEYBOARD::do_repeatkey(uint16 scancode)
950 {
951         uint16 code_7;
952         if((scancode == 0) || (scancode >= 0x67)) return; // scancode overrun.
953         if(!repeat_mode) {
954                 if(event_ids[scancode] >= 0) {
955                         cancel_event(this, event_ids[scancode]);
956                         event_ids[scancode] = -1;
957                 }
958                 return;
959         }
960         key_pressed_flag[scancode] = true;
961         code_7 = scan2fmkeycode(scancode);
962         if(code_7 < 0x200) {
963                 keycode_7 = code_7;
964                 mainio->write_signal(FM7_MAINIO_PUSH_KEYBOARD, code_7, 0x1ff);
965                 mainio->write_signal(FM7_MAINIO_KEYBOARDIRQ, 1, 1);
966                 display->write_signal(SIG_FM7_SUB_KEY_FIRQ, 1, 1);
967         }
968         //if(this->isModifiers(scancode)) {  // modifiers
969           //if(break_pressed != stat_break) { // Break key Down.
970           //            break_line->write_signal(0x00, 1, 1);
971           //            maincpu->write_signal(SIG_CPU_FIRQ, 1, 1);
972           //    }
973         //}
974 }
975
976 void KEYBOARD::event_callback(int event_id, int err)
977 {
978         if(event_id == ID_KEYBOARD_RXRDY_OK) {
979                 write_signals(&rxrdy, 0xff);
980         } else if(event_id == ID_KEYBOARD_RXRDY_BUSY) {
981                 write_signals(&rxrdy, 0x00);
982         } else if(event_id == ID_KEYBOARD_ACK) {
983                 write_signals(&key_ack, 0xff);
984         } else if((event_id >= ID_KEYBOARD_AUTOREPEAT_FIRST) && (event_id <= (ID_KEYBOARD_AUTOREPEAT_FIRST + 0x1ff))) {
985                 uint32 scancode = event_id - ID_KEYBOARD_AUTOREPEAT_FIRST;
986                 double usec = (double)repeat_time_short * 1000.0;
987
988                 if((scancode >= 0x67) || (scancode == 0)) return;
989                 do_repeatkey((uint16)scancode);
990                 register_event(this,
991                                ID_KEYBOARD_AUTOREPEAT + scancode,
992                                usec, true, &event_ids[scancode]);
993                 // Key repeat.
994         } else if((event_id >= ID_KEYBOARD_AUTOREPEAT) && (event_id <= (ID_KEYBOARD_AUTOREPEAT + 0x1ff))){
995                 uint32 scancode = event_id - ID_KEYBOARD_AUTOREPEAT;
996                 do_repeatkey((uint16)scancode);
997         }
998 }
999
1000 // Commands
1001 void KEYBOARD::reset(void)
1002 {
1003         repeat_time_short = 70; // mS
1004         repeat_time_long = 700; // mS
1005         repeat_mode = true;
1006         keycode_7 = 0x00;
1007         
1008         lshift_pressed = false;
1009         rshift_pressed = false;
1010         ctrl_pressed   = false;
1011         graph_pressed = false;
1012         //      ins_pressed = false;
1013         cmd_fifo->clear();
1014         data_fifo->clear();
1015         datareg = 0x00;
1016         // Bus
1017         this->write_signals(&break_line, 0x00);           
1018         this->write_signals(&rxrdy, 0x00);                
1019         this->write_signals(&key_ack, 0x00);              
1020         this->write_signals(&kana_led, 0x00);             
1021         this->write_signals(&caps_led, 0x00);             
1022         this->write_signals(&ins_led, 0x00);              
1023
1024 }
1025 #if defined(_FM77AV_VARIANTS)  
1026 // 0xd431 : Read
1027 uint8 KEYBOARD::read_data_reg(void)
1028 {
1029         if(rxrdy->read_signal(0) != 0) {
1030                 if(!data_fifo->empty()) {
1031                         datareg = data_fifo->read() & 0xff;
1032                 }
1033         }
1034         if(data_fifo->empty()) {
1035                 rxrdy->write_signal(0x00, 0x00, 0x01);
1036         } else {
1037                 rxrdy->write_signal(0x00, 0x01, 0x01);
1038         }
1039         return datareg;
1040 }
1041
1042 // 0xd432
1043 uint8 KEYBOARD::read_stat_reg(void)
1044 {
1045         uint8 data = 0xff;
1046         
1047         if(!data_fifo->empty()) {
1048                 rxrdy->write_signal(0x00, 0x01, 0x01);
1049                 data &= 0x7f;
1050         }
1051         if(key_ack->read_signal(0) == 0x00) {
1052           data &= 0xfe;
1053         }
1054         // Digityze : bit0 = '0' when waiting,
1055         return data;
1056 }
1057
1058 void KEYBOARD::set_mode(void)
1059 {
1060         int count = cmd_fifo->count();
1061         int cmd;
1062         if(count < 2) return;
1063         cmd = cmd_fifo->read();
1064         keymode = cmd_fifo->read();
1065         if(keymode <= KEYMODE_SCAN) reset();
1066         cmd_fifo->clear();
1067         data_fifo->clear(); // right?
1068         rxrdy->write_signal(0x00, 0x00, 0x01);
1069 }
1070
1071 void KEYBOARD::get_mode(void)
1072 {
1073         int cmd;
1074         int dummy;
1075         cmd = cmd_fifo->read();
1076         if(data_fifo->full()) {
1077                 dummy = data_fifo->read();
1078         }
1079         data_fifo->write(keymode);
1080         rxrdy->write_signal(0x01, 0x01, 0x01);
1081 }
1082
1083 void KEYBOARD::set_leds(void)
1084 {
1085         int count = cmd_fifo->count();
1086         int cmd;
1087         int ledvar;
1088         if(count < 2) return;
1089         cmd = cmd_fifo->read();
1090         ledvar = cmd_fifo->read();
1091         if(ledvar < 4) {
1092                 if((ledvar & 0x02) != 0) {
1093                         // Kana
1094                         kana_pressed = ((ledvar & 0x01) == 0);
1095                         kana_led.write_signal(0x00, ~ledvar, 0x01);
1096                 } else {
1097                         // Caps
1098                         caps_pressed = ((ledvar & 0x01) == 0);
1099                         caps_led.write_signal(0x00, ~ledvar, 0x01);
1100                 }
1101         }
1102         cmd_fifo->clear();
1103         data_fifo->clear(); // right?
1104         rxrdy->write_signal(0x01, 0x00, 0x01);
1105 }
1106
1107 void KEYBOARD::get_leds(void)
1108 {
1109         uint8 ledvar = 0x00;
1110         data_fifo->clear();
1111         ledvar |= caps_pressed ? 0x01 : 0x00;
1112         ledvar |= kana_pressed ? 0x02 : 0x00;
1113         data_fifo->write(ledvar);
1114         cmd_fifo->clear();
1115         rxrdy->write_signal(0x01, 0x01, 0x01);
1116 }
1117
1118 void KEYBOARD::set_repeat_type(void)
1119 {
1120         int cmd;
1121         int modeval;
1122
1123         cmd = cmd_fifo->read();
1124         if(cmd_fifo->empty()) return;
1125         modeval = cmd_fifo->read();
1126         if((modeval >= 2) || (modeval < 0)) return;
1127         repeat_mode = (modeval == 0);
1128         data_fifo->clear();
1129         cmd_fifo->clear();
1130         rxrdy->write_signal(0x01, 0x00, 0x01);
1131 }
1132
1133 void KEYBOARD::set_repeat_time(void)
1134 {
1135         int cmd;
1136         int time_high;
1137         int time_low;
1138         cmd = cmd_fifo->read();
1139         if(cmd_fifo->empty()) return;
1140         time_high = cmd_fifo->read();
1141         if(cmd_fifo->empty()) return;
1142         time_low = cmd_fifo->read();
1143         if(cmd_fifo->empty()) return;
1144         
1145         if((time_high == 0) || (time_low == 0)) {
1146           repeat_time_long = 700;
1147           repeat_time_short = 70;
1148         } else {
1149           repeat_time_long = time_high * 10;
1150           repeat_time_short = time_low * 10;
1151         }
1152         data_fifo->clear();
1153         cmd_fifo->clear();
1154         rxrdy->write_signal(0x01, 0x00, 0x01);
1155 }
1156
1157 void KEYBOARD::set_rtc(void)
1158 {
1159         int cmd;
1160         int tmp;
1161         int localcmd;
1162         if(cmd_fifo->count() < 9) return;
1163         cmd = cmd_fifo->read();
1164         localcmd = cmd_fifo->read();
1165         // YY
1166         tmp = cmd_fifo->read();
1167         rtc_yy = ((tmp >> 4) * 10) | (tmp & 0x0f);
1168         // MM
1169         tmp = cmd_fifo->read();
1170         rtc_mm = ((tmp >> 4) * 10) | (tmp & 0x0f);
1171         // DD
1172         tmp = cmd_fifo->read();
1173         rtc_dd = (((tmp & 0x30) >> 4) * 10) | (tmp & 0x0f);
1174         // DayOfWeek + Hour
1175         tmp = cmd_fifo->read();
1176         rtc_count24h = ((tmp & 0x08) != 0);
1177         if(!rtc_count24h) {
1178                 rtc_ispm = ((tmp & 0x04) != 0);
1179         }
1180         rtc_dayofweek = (tmp >> 4) % 0x07;
1181         rtc_hh = ((tmp & 0x03) * 10);
1182         // Low
1183         tmp = cmd_fifo->read();
1184         rtc_hh = rtc_hh | (tmp >> 4);
1185         if(rtc_count24h) {
1186           rtc_ispm = (rtc_hh >= 12);
1187         }
1188         rtc_minute = (tmp & 0x0f) * 10;
1189         
1190         tmp = cmd_fifo->read();
1191         rtc_minute = rtc_minute | (tmp >> 4);
1192         rtc_sec = (tmp & 0x0f) * 10;
1193         
1194         tmp = cmd_fifo->read();
1195         rtc_sec = rtc_sec | (tmp >> 4);
1196         
1197         data_fifo->clear();
1198         cmd_fifo->clear();
1199         rxrdy->write_signal(0x01, 0x00, 0x01);
1200 }
1201
1202 void KEYBOARD::get_rtc(void)
1203 {
1204         int cmd;
1205         int tmp;
1206         int localcmd;
1207         data_fifo->clear();
1208         // YY
1209         tmp = ((rtc_yy / 10) << 4) | (rtc_yy % 10);
1210         data_fifo->write(tmp);
1211         // MM
1212         tmp = ((rtc_mm / 10) << 4) | (rtc_mm % 10);
1213         data_fifo->write(tmp);
1214         // DD
1215         tmp = ((rtc_dd / 10) << 4) | (rtc_dd % 10);
1216         tmp = tmp | (0 << 6); // leap
1217         data_fifo->write(tmp);
1218         // DayOfWeek + Hour
1219         tmp = rtc_dayofweek << 4;
1220         tmp = tmp | (rtc_hh / 10);
1221         if(rtc_count24h) {
1222           tmp = tmp | 0x08;
1223         } else {
1224           if(rtc_ispm) {
1225             tmp = tmp | 0x04;
1226           }
1227         }
1228         data_fifo->write(tmp);
1229         // Low
1230         tmp = (rtc_hh % 10) << 4;
1231         tmp = tmp | (rtc_mm / 10);
1232         data_fifo->write(tmp);
1233         
1234         tmp = (rtc_minute % 10) << 4;
1235         tmp = tmp | (rtc_sec / 10);
1236         data_fifo->write(tmp);
1237         
1238         tmp = (rtc_sec % 10) << 4;
1239         data_fifo->write(tmp);
1240         
1241         cmd_fifo->clear();
1242         rxrdy->write_signal(0x01, 0x01, 0x01);
1243 }
1244
1245 const int rtc_month_days[12] = {
1246         31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
1247 };
1248
1249 void KEYBOARD::rtc_count(void)
1250 {
1251         // count per 1sec
1252         rtc_sec++;
1253         if(rtc_sec >= 60) {
1254                 rtc_sec = 0;
1255                 rtc_minute++;
1256                 if(rtc_minute >= 60) {
1257                         rtc_minute = 0;
1258                         rtc_hour++;
1259                         if(rtc_count24h) {
1260                                 rtc_ispm = (rtc_hour >= 12);
1261                                 if(rtc_hour < 24) return;
1262                         } else {
1263                                 if(rtc_ispm) {
1264                                         if(rtc_hour < 12) return;
1265                                 } else {
1266                                         if(rtc_hour < 12) return;
1267                                         rtc_ispm = true;
1268                                         rtc_hour = 0;
1269                                         return;
1270                                 }
1271                         }
1272                         // Day count up
1273                         rtc_hour = 0;
1274                         rtc_dd++;
1275                         rtc_dayofweek++;
1276                         if(rtc_dayofweek >= 7) rtc_dayofweek = 0;
1277                         if(rtc_dd > rtc_month_days[rtc_mm]){
1278                                 if((rtc_mm ==1) && (rtc_dd == 29)) {
1279                                         if((rtc_yy % 4) == 0) return;
1280                                 }
1281                                 rtc_dd = 1;
1282                                 rtc_mm++;
1283                                 if(rtc_mm >= 12) {
1284                                         rtc_yy++;
1285                                         rtc_mm = 0;
1286                                         if(rtc_yy >= 100) rtc_yy = 0;
1287                                 }
1288                         }
1289                 }
1290         }
1291 }
1292 void KEYBOARD::rtc_adjust(void)
1293 {
1294 }
1295 #endif // FM77AV_VARIANTS
1296
1297 void KEYBOARD::write_signal(int id, uint32 data, uint32 mask)
1298 {
1299         if(id == SIG_FM7KEY_SET_INSLED) {
1300                 write_signals(&ins_led, data & mask);
1301         }
1302 #if defined(_FM77AV_VARIANTS)  
1303          else if(id == SIG_FM7KEY_PUSH_TO_ENCODER) {
1304                 /*
1305                  * I refered XM7's sourcecode : VM/keyboard.c act of key-encoder.
1306                  * Thanks to Ryu.Takegami and PI.
1307                  */
1308                 int count;
1309                 if(key_ack->read_signal(0x00) == 0) return; // If (not(ACK)) noop.
1310
1311                 if(cmd_fifo->full()) {
1312                         cmd_fifo->clear();
1313                 }
1314                 if(cmd_fifo->empty()) {
1315                         cmd_phase = data & 0xff;
1316                 }
1317                 
1318                 cmd_fifo->write(data & 0xff);
1319                 count = cmd_fifo->count();
1320                 
1321                 key_ack->write_signal(0x00, 0x00, 0x01);
1322                 switch(cmd_phase) {
1323                         case 0: // Set mode
1324                                 if(count >= 2) set_mode();
1325                                 break;
1326                         case 1: // Get mode
1327                                 get_mode();
1328                                 break;
1329                         case 2: // Set LED Phase
1330                                 if(count >= 2) set_leds();
1331                                 break;
1332                         case 3: // Get LED Phase
1333                                 get_leds();
1334                                 break;
1335                         case 4:
1336                                 if(count >= 2) set_repeat_type();
1337                                 break;
1338                         case 5:
1339                                 if(count >= 3) set_repeat_time();
1340                                 break;
1341                         case 0x80: // Communicate to/from RTC.
1342                                 if(count == 1) {
1343                                         rtc_set = false;
1344                                 }
1345                                 if(count == 2) {
1346                                         if((data & 0xff) == 0) { // Get
1347                                                 get_rtc();
1348                                         } else if((data & 0xff) == 1) { // Set
1349                                                 rtc_set_flag = true;
1350                                         } else { // Illegal
1351                                                 cmd_fifo->clear(); 
1352                                         }
1353                                 }
1354                                 if(rtc_set_flag) {
1355                                         if(count >= 9) {
1356                                                 set_rtc();
1357                                         }
1358                                 }
1359                                 break;
1360                         case 0x81: // Digitize.
1361                                 if(count >= 2) do_digitize(); // WILL Implement?
1362                                 break;
1363                         case 0x82:
1364                                 if(count >= 2) set_screen_mode();
1365                                 break;
1366                         case 0x83:
1367                                 get_screen_mode();
1368                                 break;
1369                         case 0x84:
1370                                 if(count >= 2) set_brightness();
1371                                 break;
1372                         default:
1373                                 //cmd_fifo->clear();
1374                                 break;
1375                 }
1376                 register_event(this, ID_KEYBOARD_ACK, 5, false, NULL); // Delay 5us until ACK is up.
1377         }
1378 #endif
1379 }
1380
1381 uint32 KEYBOARD::read_data8(uint32 addr)
1382 {
1383         uint32 retval = 0xff;
1384         switch(addr) {
1385                 case 0x00:
1386                         retval = (keycode_7 >> 8) & 0x80;
1387                         break;
1388                 case 0x01:
1389                         retval = keycode_7 & 0xff;
1390                         break;
1391 #if defined(_FM77AV_VARIANTS)                   
1392                 case 0x31:
1393                         retval = read_data_reg();
1394                         break;
1395                 case 0x32:
1396                         retval = read_stat_reg();
1397                         break;
1398 #endif
1399                 default:
1400                         break;
1401         }
1402         return retval;
1403 }
1404
1405 void KEYBOARD::write_data8(uint32 addr, uint32 data)
1406 {
1407         switch(addr) {
1408 #if defined(_FM77AV_VARIANTS)                   
1409                 case 0x31:
1410                         this->write_signal(SIG_FM7KEY_PUSH_TO_ENCODER, data, 0x000000ff);
1411                         break;
1412 #endif
1413         }
1414 }
1415
1416 KEYBOARD::KEYBOARD(VM *parent_vm, EMU *parent_emu) : DEVICE(parent_vm, parent_emu)
1417 {
1418         int i;
1419         p_vm = parent_vm;
1420         p_emu = parent_emu;
1421   
1422         keycode_7 = 0;
1423    
1424         ctrl_pressed = false; 
1425         lshift_pressed = false; 
1426         rshift_pressed = false; 
1427         shift_pressed = false; 
1428         graph_pressed = false;
1429         caps_pressed = false;
1430         kana_pressed = false;
1431         break_pressed = false;
1432         
1433         for(i = 0; i < 0x70; i++) {
1434                 event_ids[i] = 0;
1435                 key_pressed_flag[i] = false;
1436         }
1437    
1438         cmd_fifo = new FIFO(16);
1439         data_fifo = new FIFO(16);
1440         keymode = KEYMODE_STANDARD;
1441         
1442         init_output_signals(&rxrdy);
1443         init_output_signals(&key_ack);
1444         
1445         init_output_signals(&break_line);
1446         
1447         init_output_signals(&kana_led);
1448         init_output_signals(&caps_led);
1449         init_output_signals(&ins_led);
1450
1451         
1452 }
1453
1454 KEYBOARD::~KEYBOARD()
1455 {
1456 }
1457
1458    
1459