OSDN Git Service

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