2 EPSON QC-10 Emulator 'eQC-10'
4 Author : Takeda.Toshiya
11 #include "../z80sio.h"
12 #include "../../fileio.h"
16 BREAK,PAUSE,HELP,SCRN F11,F12,PU,PD
17 SF1-SF4 SHIFT + F1-F4?
18 ESC,TAB,CTRL,SHIFT,CAPS ESC,TAB,CTRL,SHIFT,CAPS
19 BS,LF,ENTER,SHIFT,GRAPH BS,SHIFT + ENTER,ENTER,SHIFT,GRAPH
20 HOME,CLS,INS,DEL HOME,END,INS,DEL
23 SHIFT + ENTER -> VK_F20
30 // pc key code -> qc-10 key code
31 static const int key_map[256] = {
32 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x6d,0x77,0x00,0x00, 0x00,0x4e,0x00,0x00, // 0
33 0x87,0x8b,0x8d,0x00, 0x31,0x00,0x00,0x00, 0x00,0x00,0x00,0x75, 0x00,0x00,0x00,0x00, // 1
34 0x32,0x0c,0x0b,0x6f, 0x6e,0x3d,0x3c,0x3e, 0x3f,0x00,0x00,0x00, 0x00,0x5e,0x5f,0x00, // 2
35 0x69,0x76,0x61,0x62, 0x63,0x64,0x65,0x66, 0x67,0x68,0x00,0x00, 0x00,0x00,0x00,0x00, // 3
36 0x00,0x43,0x37,0x35, 0x45,0x53,0x46,0x47, 0x48,0x58,0x49,0x4a, 0x4b,0x39,0x38,0x59, // 4
37 0x5a,0x51,0x54,0x44, 0x55,0x57,0x36,0x52, 0x34,0x56,0x33,0x00, 0x00,0x00,0x00,0x00, // 5
38 0x17,0x27,0x26,0x25, 0x1b,0x1a,0x19,0x2b, 0x2a,0x29,0x2d,0x18, 0x2f,0x28,0x16,0x2e, // 6
39 0x73,0x72,0x71,0x01, 0x02,0x03,0x04,0x05, 0x06,0x07,0x09,0x0a, 0x00,0x00,0x00,0x00, // 7
40 0x00,0x00,0x00,0x11, 0x0f,0x1f,0x1e,0x1d, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, // 8
41 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, // 9
42 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, // a
43 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x4d,0x4c, 0x3a,0x6a,0x3b,0x4f, // b
44 0x5b,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, // c
45 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5c, 0x6c,0x5d,0x6b,0x00, // d
46 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, // e
47 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00 // f
50 void KEYBOARD::initialize()
52 for(int i = 0; i < 8; i++) {
55 repeat = enable = true;
56 key_stat = emu->key_buffer();
59 void KEYBOARD::write_signal(int id, uint32 data, uint32 mask)
62 process_cmd(data & 0xff);
65 void KEYBOARD::key_down(int code)
69 if(code == 0x0d) code = 0x83; // SHIFT + ENTER
70 if(code == 0x70) code = 0x84; // SHIFT + F1
71 if(code == 0x71) code = 0x85; // SHIFT + F2
72 if(code == 0x72) code = 0x86; // SHIFT + F3
73 if(code == 0x73) code = 0x87; // SHIFT + F4
75 if(code = key_map[code]) {
76 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, code, 0xff);
81 void KEYBOARD::key_up(int code)
86 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x86, 0xff); // shift break
87 } else if(code == 0x11) {
88 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x8a, 0xff); // ctrl break
89 } else if(code == 0x12) {
90 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x8c, 0xff); // graph break
95 void KEYBOARD::process_cmd(uint8 val)
99 // repeat starting time set:
102 // repeat interval set
106 repeat = ((val & 1) != 0);
110 led[(val >> 1) & 7] = ((val & 1) != 0);
113 // key_led status read
114 d_sio->write_signal(SIG_Z80SIO_CLEAR_CH0, 1, 1);
115 for(int i = 0; i < 8; i++) {
116 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0xc0 | (i << 1) | (led[i] ? 1: 0), 0xff);
120 // key sw status read
121 d_sio->write_signal(SIG_Z80SIO_CLEAR_CH0, 1, 1);
122 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x80, 0xff);
123 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x82, 0xff);
124 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x84, 0xff);
125 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x86 | (key_stat[0x10] ? 1: 0), 0xff);
126 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x88, 0xff);
127 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x8a | (key_stat[0x11] ? 1: 0), 0xff);
128 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x8c | (key_stat[0x12] ? 1: 0), 0xff);
129 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0x8e, 0xff);
133 enable = ((val & 1) != 0);
137 for(int i = 0; i < 8; i++) {
140 repeat = enable = true;
143 d_sio->write_signal(SIG_Z80SIO_CLEAR_CH0, 1, 1);
144 d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0, 0xff);
150 #define STATE_VERSION 1
152 void KEYBOARD::save_state(FILEIO* state_fio)
154 state_fio->FputUint32(STATE_VERSION);
155 state_fio->FputInt32(this_device_id);
157 state_fio->Fwrite(led, sizeof(led), 1);
158 state_fio->FputBool(repeat);
159 state_fio->FputBool(enable);
162 bool KEYBOARD::load_state(FILEIO* state_fio)
164 if(state_fio->FgetUint32() != STATE_VERSION) {
167 if(state_fio->FgetInt32() != this_device_id) {
170 state_fio->Fread(led, sizeof(led), 1);
171 repeat = state_fio->FgetBool();
172 enable = state_fio->FgetBool();