OSDN Git Service

[VM][STATE] Use namespace {VMNAME} to separate per VMs.
[csp-qt/common_source_project-fm7.git] / source / src / vm / qc10 / keyboard.cpp
1 /*
2         EPSON QC-10 Emulator 'eQC-10'
3
4         Author : Takeda.Toshiya
5         Date   : 2008.02.13 -
6
7         [ keyboard ]
8 */
9
10 #include "keyboard.h"
11 #include "../z80sio.h"
12
13 /*
14         F1-F10                          F1-F10
15         BREAK,PAUSE,HELP,SCRN           F11,F12,PU,PD
16         SF1-SF4                         SHIFT + F1-F4?
17         ESC,TAB,CTRL,SHIFT,CAPS         ESC,TAB,CTRL,SHIFT,CAPS
18         BS,LF,ENTER,SHIFT,GRAPH         BS,SHIFT + ENTER,ENTER,SHIFT,GRAPH
19         HOME,CLS,INS,DEL                HOME,END,INS,DEL
20         NUMPAD                          
21
22         SHIFT + ENTER   -> VK_F20
23         SHIFT + F1      -> VK_F21
24         SHIFT + F2      -> VK_F22
25         SHIFT + F3      -> VK_F23
26         SHIFT + F4      -> VK_F24
27 */
28
29 namespace QC10 {
30
31 // pc key code -> qc-10 key code
32 static const int key_map[256] = {
33         0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x6d,0x77,0x00,0x00, 0x00,0x4e,0x00,0x00,     // 0
34         0x87,0x8b,0x8d,0x00, 0x31,0x00,0x00,0x00, 0x00,0x00,0x00,0x75, 0x00,0x00,0x00,0x00,     // 1
35         0x32,0x0c,0x0b,0x6f, 0x6e,0x3d,0x3c,0x3e, 0x3f,0x00,0x00,0x00, 0x00,0x5e,0x5f,0x00,     // 2
36         0x69,0x76,0x61,0x62, 0x63,0x64,0x65,0x66, 0x67,0x68,0x00,0x00, 0x00,0x00,0x00,0x00,     // 3
37         0x00,0x43,0x37,0x35, 0x45,0x53,0x46,0x47, 0x48,0x58,0x49,0x4a, 0x4b,0x39,0x38,0x59,     // 4
38         0x5a,0x51,0x54,0x44, 0x55,0x57,0x36,0x52, 0x34,0x56,0x33,0x00, 0x00,0x00,0x00,0x00,     // 5
39         0x17,0x27,0x26,0x25, 0x1b,0x1a,0x19,0x2b, 0x2a,0x29,0x2d,0x18, 0x2f,0x28,0x16,0x2e,     // 6
40         0x73,0x72,0x71,0x01, 0x02,0x03,0x04,0x05, 0x06,0x07,0x09,0x0a, 0x00,0x00,0x00,0x00,     // 7
41         0x00,0x00,0x00,0x11, 0x0f,0x1f,0x1e,0x1d, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,     // 8
42         0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,     // 9
43         0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,     // a
44         0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x4d,0x4c, 0x3a,0x6a,0x3b,0x4f,     // b
45         0x5b,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,     // c
46         0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5c, 0x6c,0x5d,0x6b,0x00,     // d
47         0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,     // e
48         0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00      // f
49 };
50
51 void KEYBOARD::initialize()
52 {
53         for(int i = 0; i < 8; i++) {
54                 led[i] = false;
55         }
56         repeat = enable = true;
57         key_stat = emu->get_key_buffer();
58 }
59
60 void KEYBOARD::write_signal(int id, uint32_t data, uint32_t mask)
61 {
62         // rec command
63         process_cmd(data & 0xff);
64 }
65
66 void KEYBOARD::key_down(int code)
67 {
68         if(enable) {
69                 if(key_stat[0x10]) {
70                         if(code == 0x0d) code = 0x83;   // SHIFT + ENTER
71                         if(code == 0x70) code = 0x84;   // SHIFT + F1
72                         if(code == 0x71) code = 0x85;   // SHIFT + F2
73                         if(code == 0x72) code = 0x86;   // SHIFT + F3
74                         if(code == 0x73) code = 0x87;   // SHIFT + F4
75                 }
76                 if(code = key_map[code]) {
77                         d_sio->write_signal(SIG_Z80SIO_RECV_CH0, code, 0xff);
78                 }
79         }
80 }
81
82 void KEYBOARD::key_up(int code)
83 {
84         if(enable) {
85                 // key break
86                 if(code == 0x10) {
87                         d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x86, 0xff);   // shift break
88                 } else if(code == 0x11) {
89                         d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x8a, 0xff);   // ctrl break
90                 } else if(code == 0x12) {
91                         d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x8c, 0xff);   // graph break
92                 }
93         }
94 }
95
96 void KEYBOARD::process_cmd(uint8_t val)
97 {
98         switch(val & 0xe0) {
99         case 0x00:
100                 // repeat starting time set:
101                 break;
102         case 0x20:
103                 // repeat interval set
104                 break;
105         case 0xa0:
106                 // repeat control
107                 repeat = ((val & 1) != 0);
108                 break;
109         case 0x40:
110                 // key_led control
111                 led[(val >> 1) & 7] = ((val & 1) != 0);
112                 break;
113         case 0x60:
114                 // key_led status read
115                 d_sio->write_signal(SIG_Z80SIO_CLEAR_CH0, 1, 1);
116                 for(int i = 0; i < 8; i++) {
117                         d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0xc0 | (i << 1) | (led[i] ? 1: 0), 0xff);
118                 }
119                 break;
120         case 0x80:
121                 // key sw status read
122                 d_sio->write_signal(SIG_Z80SIO_CLEAR_CH0, 1, 1);
123                 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x80, 0xff);
124                 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x82, 0xff);
125                 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x84, 0xff);
126                 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x86 | (key_stat[0x10] ? 1: 0), 0xff);
127                 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x88, 0xff);
128                 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x8a | (key_stat[0x11] ? 1: 0), 0xff);
129                 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x8c | (key_stat[0x12] ? 1: 0), 0xff);
130                 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x8e, 0xff);
131                 break;
132         case 0xc0:
133                 // keyboard enable
134                 enable = ((val & 1) != 0);
135                 break;
136         case 0xe0:
137                 // reset
138                 for(int i = 0; i < 8; i++) {
139                         led[i] = false;
140                 }
141                 repeat = enable = true;
142                 // diagnosis
143                 if(!(val & 1)) {
144                         d_sio->write_signal(SIG_Z80SIO_CLEAR_CH0, 1, 1);
145                         d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0, 0xff);
146                 }
147                 break;
148         }
149 }
150
151 #define STATE_VERSION   1
152
153 bool KEYBOARD::process_state(FILEIO* state_fio, bool loading)
154 {
155         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
156                 return false;
157         }
158         if(!state_fio->StateCheckInt32(this_device_id)) {
159                 return false;
160         }
161         //state_fio->StateBuffer(led, sizeof(led), 1);
162         for(int i = 0; i < 8; i++) {
163                 state_fio->StateBool(led[i]);
164         }
165         state_fio->StateBool(repeat);
166         state_fio->StateBool(enable);
167         return true;
168 }
169
170 }