OSDN Git Service

[VM][STATE] Use namespace {VMNAME} to separate per VMs.
[csp-qt/common_source_project-fm7.git] / source / src / vm / n5200 / keyboard.cpp
1 /*
2         NEC N5200 Emulator 'eN5200'
3
4         Author : Takeda.Toshiya
5         Date   : 2008.06.10 -
6
7         [ keyboard ]
8 */
9
10 #include "keyboard.h"
11 #include "../i8251.h"
12
13 namespace N5200 {
14
15 static const int key_table[256] = {
16           -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,0x0e,0x0f,  -1,  -1,  -1,0x1c,  -1,  -1,
17         0x70,0x74,0x73,0x60,  -1,  -1,  -1,  -1,  -1,  -1,  -1,0x00,0x35,0x51,  -1,  -1,
18         0x34,0x36,0x37,0x3f,0x3e,0x3b,0x3a,0x3c,0x3d,  -1,  -1,  -1,  -1,0x38,0x39,  -1,
19         0x0a,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,  -1,  -1,  -1,  -1,  -1,  -1,
20         0x0a,0x1d,0x2d,0x2b,0x1f,0x12,0x20,0x21,0x22,0x17,0x23,0x24,0x25,0x2f,0x2e,0x18,
21         0x19,0x10,0x13,0x1e,0x14,0x16,0x2c,0x11,0x2a,0x15,0x29,  -1,  -1,  -1,  -1,  -1,
22         0x4e,0x4a,0x4b,0x4c,0x46,0x47,0x48,0x42,0x43,0x44,0x45,0x49,  -1,0x40,0x50,0x41,
23         0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x60,0x61,  -1,  -1,  -1,  -1,
24           -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
25           -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
26           -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
27           -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,0x27,0x26,0x30,0x0b,0x31,0x32,
28         0x1a,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
29           -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,0x1b,0x0d,0x28,0x0c,  -1,
30           -1,  -1,0x33,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
31           -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1
32 };
33
34 void KEYBOARD::initialize()
35 {
36         memset(flag, 0, sizeof(flag));
37 }
38
39 void KEYBOARD::reset()
40 {
41         kana = caps = rst = false;
42 }
43
44 void KEYBOARD::write_signal(int id, uint32_t data, uint32_t mask)
45 {
46         if(id == SIG_KEYBOARD_RST) {
47                 bool next = ((data & mask) != 0);
48                 if(rst && !next) {
49                         // keyboard reset
50                         d_sio->write_signal(SIG_I8251_RECV, 0xa0, 0xff);
51                         d_sio->write_signal(SIG_I8251_RECV, 0x81, 0xff);
52                         d_sio->write_signal(SIG_I8251_RECV, 0xc0, 0xff);
53                         d_sio->write_signal(SIG_I8251_RECV, 0xe0, 0xff);
54                 }
55                 rst = next;
56         } else if(id == SIG_KEYBOARD_RECV) {
57                 // receive command
58                 data &= mask;
59                 if(data == 0) {
60                         // keyboard reset
61                         d_sio->write_signal(SIG_I8251_RECV, 0xa0, 0xff);
62                         d_sio->write_signal(SIG_I8251_RECV, 0x81, 0xff);
63                         d_sio->write_signal(SIG_I8251_RECV, 0xc0, 0xff);
64                         d_sio->write_signal(SIG_I8251_RECV, 0xe0, 0xff);
65                 }
66         }
67 }
68
69 void KEYBOARD::key_down(int code)
70 {
71         if(code == 0x14) {
72                 caps = !caps;
73                 d_sio->write_signal(SIG_I8251_RECV, 0x71 | (caps ? 0 : 0x80), 0xff);
74         } else if(code == 0x15) {
75                 kana = !kana;
76                 d_sio->write_signal(SIG_I8251_RECV, 0x72 | (kana ? 0 : 0x80), 0xff);
77         } else if((code = key_table[code & 0xff]) != -1) {
78                 if(flag[code]) {
79                         d_sio->write_signal(SIG_I8251_RECV, code | 0x80, 0xff);
80                 }
81                 d_sio->write_signal(SIG_I8251_RECV, code, 0xff);
82 //              if(!flag[code]) {
83 //                      d_sio->write_signal(SIG_I8251_RECV, code, 0xff);
84 //              }
85                 flag[code] = 1;
86         }
87 }
88
89 void KEYBOARD::key_up(int code)
90 {
91         if((code = key_table[code & 0xff]) != -1) {
92                 if(flag[code]) {
93                         d_sio->write_signal(SIG_I8251_RECV, code | 0x80, 0xff);
94                 }
95                 flag[code] = 0;
96         }
97 }
98
99 }