OSDN Git Service

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