OSDN Git Service

[General] Convert sourcecode's CRLF format: DOS(WINDOWS) to Unix, to apply patches...
[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 #include "../../fileio.h"
13
14 /*
15         F1-F10                          F1-F10
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
21         NUMPAD                          
22
23         SHIFT + ENTER   -> VK_F20
24         SHIFT + F1      -> VK_F21
25         SHIFT + F2      -> VK_F22
26         SHIFT + F3      -> VK_F23
27         SHIFT + F4      -> VK_F24
28 */
29
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
48 };
49
50 void KEYBOARD::initialize()
51 {
52         for(int i = 0; i < 8; i++) {
53                 led[i] = false;
54         }
55         repeat = enable = true;
56         key_stat = emu->key_buffer();
57 }
58
59 void KEYBOARD::write_signal(int id, uint32 data, uint32 mask)
60 {
61         // rec command
62         process_cmd(data & 0xff);
63 }
64
65 void KEYBOARD::key_down(int code)
66 {
67         if(enable) {
68                 if(key_stat[0x10]) {
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
74                 }
75                 if(code = key_map[code]) {
76                         d_sio->write_signal(SIG_Z80SIO_RECV_CH0, code, 0xff);
77                 }
78         }
79 }
80
81 void KEYBOARD::key_up(int code)
82 {
83         if(enable) {
84                 // key break
85                 if(code == 0x10) {
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
91                 }
92         }
93 }
94
95 void KEYBOARD::process_cmd(uint8 val)
96 {
97         switch(val & 0xe0) {
98         case 0x00:
99                 // repeat starting time set:
100                 break;
101         case 0x20:
102                 // repeat interval set
103                 break;
104         case 0xa0:
105                 // repeat control
106                 repeat = ((val & 1) != 0);
107                 break;
108         case 0x40:
109                 // key_led control
110                 led[(val >> 1) & 7] = ((val & 1) != 0);
111                 break;
112         case 0x60:
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);
117                 }
118                 break;
119         case 0x80:
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);
130                 break;
131         case 0xc0:
132                 // keyboard enable
133                 enable = ((val & 1) != 0);
134                 break;
135         case 0xe0:
136                 // reset
137                 for(int i = 0; i < 8; i++) {
138                         led[i] = false;
139                 }
140                 repeat = enable = true;
141                 // diagnosis
142                 if(!(val & 1)) {
143                         d_sio->write_signal(SIG_Z80SIO_CLEAR_CH0, 1, 1);
144                         d_sio->write_signal(SIG_Z80SIO_RECV_CH0, 0, 0xff);
145                 }
146                 break;
147         }
148 }
149
150 #define STATE_VERSION   1
151
152 void KEYBOARD::save_state(FILEIO* state_fio)
153 {
154         state_fio->FputUint32(STATE_VERSION);
155         state_fio->FputInt32(this_device_id);
156         
157         state_fio->Fwrite(led, sizeof(led), 1);
158         state_fio->FputBool(repeat);
159         state_fio->FputBool(enable);
160 }
161
162 bool KEYBOARD::load_state(FILEIO* state_fio)
163 {
164         if(state_fio->FgetUint32() != STATE_VERSION) {
165                 return false;
166         }
167         if(state_fio->FgetInt32() != this_device_id) {
168                 return false;
169         }
170         state_fio->Fread(led, sizeof(led), 1);
171         repeat = state_fio->FgetBool();
172         enable = state_fio->FgetBool();
173         return true;
174 }
175