OSDN Git Service

[VM][General] Merge Upstream 2021-05-06. Some variants of PC-6001 are temporally...
[csp-qt/common_source_project-fm7.git] / source / src / vm / bx1 / keyboard.cpp
1 /*
2         CANON BX-1 Emulator 'eBX-1'
3
4         Author : Takeda.Toshiya
5         Date   : 2020.08.22-
6
7         [ keyboard ]
8 */
9
10 #include "keyboard.h"
11 #include "../../fifo.h"
12
13 namespace BX1 {
14
15 static const int table[256] = {
16           -1,   // 00 
17           -1,   // 01 
18           -1,   // 02 
19           -1,   // 03 
20           -1,   // 04 
21           -1,   // 05 
22           -1,   // 06 
23           -1,   // 07 
24           -1,   // 08 Back
25         0x13,   // 09 Tab       INST
26           -1,   // 0A 
27           -1,   // 0B 
28           -1,   // 0C 
29         0x42,   // 0D Enter     CR/LF
30           -1,   // 0E 
31           -1,   // 0F 
32           -1,   // 10 Shift
33           -1,   // 11 Ctrl
34           -1,   // 12 Alt
35           -1,   // 13 Pause
36         0x12,   // 14 Caps      CTRL
37           -1,   // 15 Kana
38           -1,   // 16 
39           -1,   // 17 
40           -1,   // 18 
41           -1,   // 19 Kanji
42           -1,   // 1A 
43         0x4F,   // 1B Escape    CLEAR
44           -1,   // 1C Convert
45           -1,   // 1D NonConv
46           -1,   // 1E 
47           -1,   // 1F 
48         0x41,   // 20 Space     SPACE
49         0x49,   // 21 PgUp      SQR
50         0x4A,   // 22 PgDwn     )
51         0x46,   // 23 End       (
52         0x45,   // 24 Home      alpha^x
53         0x63,   // 25 Left
54         0x62,   // 26 Up
55         0x65,   // 27 Right
56         0x64,   // 28 Down
57           -1,   // 29 
58           -1,   // 2A 
59           -1,   // 2B 
60           -1,   // 2C 
61         0x60,   // 2D Ins       INSERT
62         0x61,   // 2E Del       DELETE
63           -1,   // 2F 
64         0x3B,   // 30 0
65         0x17,   // 31 1
66         0x1B,   // 32 2
67         0x1F,   // 33 3
68         0x23,   // 34 4
69         0x27,   // 35 5
70         0x2B,   // 36 6
71         0x2F,   // 37 7
72         0x33,   // 38 8
73         0x37,   // 39 9
74           -1,   // 3A 
75           -1,   // 3B 
76           -1,   // 3C 
77           -1,   // 3D 
78           -1,   // 3E 
79           -1,   // 3F 
80           -1,   // 40 
81         0x15,   // 41 A
82         0x24,   // 42 B
83         0x1C,   // 43 C
84         0x1D,   // 44 D
85         0x1E,   // 45 E
86         0x21,   // 46 F
87         0x25,   // 47 G
88         0x29,   // 48 H
89         0x32,   // 49 I
90         0x2D,   // 4A J
91         0x31,   // 4B K
92         0x35,   // 4C L
93         0x2C,   // 4D M
94         0x28,   // 4E N
95         0x36,   // 4F O
96         0x3A,   // 50 P
97         0x16,   // 51 Q
98         0x22,   // 52 R
99         0x19,   // 53 S
100         0x26,   // 54 T
101         0x2E,   // 55 U
102         0x20,   // 56 V
103         0x1A,   // 57 W
104         0x18,   // 58 X
105         0x2A,   // 59 Y
106         0x14,   // 5A Z
107           -1,   // 5B 
108           -1,   // 5C 
109           -1,   // 5D 
110           -1,   // 5E 
111           -1,   // 5F 
112         0x0D,   // 60 NUM 0
113         0x01,   // 61 NUM 1
114         0x02,   // 62 NUM 2
115         0x03,   // 63 NUM 3
116         0x04,   // 64 NUM 4
117         0x05,   // 65 NUM 5
118         0x06,   // 66 NUM 6
119         0x07,   // 67 NUM 7
120         0x08,   // 68 NUM 8
121         0x09,   // 69 NUM 9
122         0x47,   // 6A NUM *
123         0x48,   // 6B NUM +
124         0x4D,   // 6C NUM Ent   =
125         0x4C,   // 6D NUM -
126         0x0E,   // 6E NUM .
127         0x4B,   // 6F NUM /
128         0x51,   // 70 F1        RUN
129         0x53,   // 71 F2        RENAME
130         0x55,   // 72 F3        PROTECT
131         0x57,   // 73 F4        PROG-LIST
132         0x59,   // 74 F5        STOP
133         0x5B,   // 75 F6        CONDENSE
134         0x5D,   // 76 F7        LINE-NO.
135           -1,   // 77 F8
136         0x0A,   // 78 F9        EXP
137         0x0B,   // 79 F10       SIGN CHG
138         0x0C,   // 7A F11       CE
139         0x0F,   // 7B F12       START ?
140         0x50,   // 7C F13       PROGRAM
141         0x52,   // 7D F14       NEW
142         0x54,   // 7E F15       SECURE
143         0x56,   // 7F F16       OPERATE
144         0x58,   // 80 F17       TRACE
145         0x5A,   // 81 F18       DISK-LIST
146         0x5C,   // 82 F19       RECALL
147           -1,   // 83 F20
148           -1,   // 84 F21
149           -1,   // 85 F22
150           -1,   // 86 F23
151           -1,   // 87 F24
152           -1,   // 88 
153           -1,   // 89 
154           -1,   // 8A 
155           -1,   // 8B 
156           -1,   // 8C 
157           -1,   // 8D 
158           -1,   // 8E 
159           -1,   // 8F 
160           -1,   // 90 
161         0x4E,   // 91 ScrLk     PAPER FEED
162           -1,   // 92 
163           -1,   // 93 
164           -1,   // 94 
165           -1,   // 95 
166           -1,   // 96 
167           -1,   // 97 
168           -1,   // 98 
169           -1,   // 99 
170           -1,   // 9A 
171           -1,   // 9B 
172           -1,   // 9C 
173           -1,   // 9D 
174           -1,   // 9E 
175           -1,   // 9F 
176         0x11,   // A0 L Shift   SML
177           -1,   // A1 R Shift   (Switch F1-F8)
178         0x10,   // A2 L Ctrl    CAP
179         0x3C,   // A3 R Ctrl    UC
180           -1,   // A4 L Alt
181           -1,   // A5 R Alt
182           -1,   // A6 
183           -1,   // A7 
184           -1,   // A8 
185           -1,   // A9 
186           -1,   // AA 
187           -1,   // AB 
188           -1,   // AC 
189           -1,   // AD 
190           -1,   // AE 
191           -1,   // AF 
192           -1,   // B0 
193           -1,   // B1 
194           -1,   // B2 
195           -1,   // B3 
196           -1,   // B4 
197           -1,   // B5 
198           -1,   // B6 
199           -1,   // B7 
200           -1,   // B8 
201           -1,   // B9 
202         0x3D,   // BA :
203         0x39,   // BB ;
204         0x30,   // BC ,
205         0x3F,   // BD -
206         0x34,   // BE .
207         0x38,   // BF /
208         0x3E,   // C0 @
209           -1,   // C1 
210           -1,   // C2 
211           -1,   // C3 
212           -1,   // C4 
213           -1,   // C5 
214           -1,   // C6 
215           -1,   // C7 
216           -1,   // C8 
217           -1,   // C9 
218           -1,   // CA 
219           -1,   // CB 
220           -1,   // CC 
221           -1,   // CD 
222           -1,   // CE 
223           -1,   // CF 
224           -1,   // D0 
225           -1,   // D1 
226           -1,   // D2 
227           -1,   // D3 
228           -1,   // D4 
229           -1,   // D5 
230           -1,   // D6 
231           -1,   // D7 
232           -1,   // D8 
233           -1,   // D9 
234           -1,   // DA 
235         0x46,   // DB [
236         0x44,   // DC Yen
237         0x4A,   // DD ]
238         0x43,   // DE ^
239           -1,   // DF 
240           -1,   // E0 
241           -1,   // E1 
242           -1,   // E2 _
243           -1,   // E3 
244           -1,   // E4 
245           -1,   // E5 
246           -1,   // E6 
247           -1,   // E7 
248           -1,   // E8 
249           -1,   // E9 
250           -1,   // EA 
251           -1,   // EB 
252           -1,   // EC 
253           -1,   // ED 
254           -1,   // EE 
255           -1,   // EF 
256           -1,   // F0 
257           -1,   // F1 
258           -1,   // F2 
259           -1,   // F3 
260           -1,   // F4 
261           -1,   // F5 
262           -1,   // F6 
263           -1,   // F7 
264           -1,   // F8 
265           -1,   // F9 
266           -1,   // FA 
267           -1,   // FB 
268           -1,   // FC 
269           -1,   // FD 
270           -1,   // FE 
271           -1,   // FF 
272 };
273
274 void KEYBOARD::initialize()
275 {
276         fifo_down = new FIFO(8);
277 }
278
279 void KEYBOARD::release()
280 {
281         fifo_down->release();
282         delete fifo_down;
283 }
284
285 void KEYBOARD::reset()
286 {
287         fifo_down->clear();
288 }
289
290 uint32_t KEYBOARD::read_io8(uint32_t addr)
291 {
292         uint32_t value = 0xff;
293         
294         switch(addr & 0xffff) {
295         case 0xe121:
296                 if(!fifo_down->empty()) {
297                         value = fifo_down->read_not_remove(0) | 0x80;
298                 } else {
299                         value = 0;
300                 }
301                 break;
302         case 0xe122:
303                 // bit7: JPN/ENG Jumper?
304                 // bit5: PROG.SELECT
305                 fifo_down->read();
306                 value  = (config.dipswitch & 2) ? 0 : 0x20;
307                 value |= (config.dipswitch & 4) ? 0 : 0x80;
308                 break;
309         }
310         return value;
311 }
312
313 void KEYBOARD::key_down(int code)
314 {
315         if(code >= 0x70 && code <= 0x7b && emu->get_key_buffer()[0xa1]) {
316                 // Right Shift + F1-F12 -> F13-F24
317                 code += 12;
318         }
319         if(table[code & 0xff] != -1) {
320                 fifo_down->write(table[code & 0xff]);
321         }
322 }
323
324 void KEYBOARD::key_up(int code)
325 {
326 }
327
328 #define STATE_VERSION   2
329
330 bool KEYBOARD::process_state(FILEIO* state_fio, bool loading)
331 {
332         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
333                 return false;
334         }
335         if(!state_fio->StateCheckInt32(this_device_id)) {
336                 return false;
337         }
338         if(!fifo_down->process_state((void *)state_fio, loading)) {
339                 return false;
340         }
341         return true;
342 }
343 }