OSDN Git Service

[VM][STATE] Apply New framework to some VMs.
[csp-qt/common_source_project-fm7.git] / source / src / vm / pv2000 / keyboard.cpp
1 /*
2         CASIO PV-2000 Emulator 'EmuGaki'
3
4         Author : Takeda.Toshiya
5         Date   : 2006.08.18 -
6
7         [ keyboard ]
8 */
9
10 #include "keyboard.h"
11
12 static const int key_map[16][8] = {
13         {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38},       // 1    2       3       4       5       6       7       8
14         {0x51, 0x57, 0x45, 0x52, 0x54, 0x59, 0x55, 0x49},       // Q    W       E       R       T       Y       U       I
15         {0x41, 0x53, 0x44, 0x46, 0x47, 0x48, 0x4a, 0x4b},       // A    S       D       F       G       H       J       K
16         {0x1d, 0x5a, 0x58, 0x43, 0x56, 0x42, 0x4e, 0x20},       // KANA Z       X       C       V       B       N       SPACE
17         {0x24, 0x00, 0x00, 0xdc, 0x30, 0xde, 0xbd, 0x39},       // HOME ?       ?       \       0       ^       -       9
18         {0x00, 0x00, 0x00, 0x00, 0x50, 0xdb, 0xc0, 0x4f},       // UR   DR      DL      UL      P       [       @       O
19         {0x00, 0x00, 0x27, 0x28, 0xbb, 0xdd, 0xba, 0x4c},       // R2   D2      R1      D1      ;       ]       :       L
20         {0x00, 0x00, 0x26, 0x25, 0xbc, 0xbf, 0xbe, 0x4d},       // U2   L2      U1      L1      ,       /       .       M
21         {0x73, 0x72, 0x71, 0x70, 0xe2, 0x2e, 0x74, 0x0d},       // A3   A2      A1      A0      _       DEL     MODE    RET
22         {0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},       // STOP ?       ?       ?       ?       ?       ?       ?
23         {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
24         {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
25         {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
26         {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
27         {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
28         {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
29 };
30
31 void KEYBOARD::initialize()
32 {
33         joy_stat = emu->get_joy_buffer();
34 }
35
36 void KEYBOARD::reset()
37 {
38         memset(key_stat, 0, sizeof(key_stat));
39         key_no = 0;
40         intr_enb = false;
41 }
42
43 void KEYBOARD::write_io8(uint32_t addr, uint32_t data)
44 {
45         intr_enb = (data == 0xf);
46         key_no = data & 0xf;
47 }
48
49 uint32_t KEYBOARD::read_io8(uint32_t addr)
50 {
51         uint32_t val = 0;
52         
53         switch(addr & 0xff) {
54         case 0x10:
55                 if(key_stat[key_map[key_no][7]]) val |= 1;
56                 if(key_stat[key_map[key_no][6]]) val |= 2;
57                 if(key_stat[key_map[key_no][5]]) val |= 4;
58                 if(key_stat[key_map[key_no][4]]) val |= 8;
59                 return val;
60         case 0x20:
61                 if(key_stat[key_map[key_no][3]]) val |= 1;
62                 if(key_stat[key_map[key_no][2]]) val |= 2;
63                 if(key_stat[key_map[key_no][1]]) val |= 4;
64                 if(key_stat[key_map[key_no][0]]) val |= 8;
65                 if(key_no == 6) {
66                         if(joy_stat[0] & 0x02) val |= 1;
67                         if(joy_stat[0] & 0x08) val |= 2;
68                         if(joy_stat[1] & 0x02) val |= 4;
69                         if(joy_stat[1] & 0x08) val |= 8;
70                 } else if(key_no == 7) {
71                         if(joy_stat[0] & 0x04) val |= 1;
72                         if(joy_stat[0] & 0x01) val |= 2;
73                         if(joy_stat[1] & 0x04) val |= 4;
74                         if(joy_stat[1] & 0x01) val |= 8;
75                 } else if(key_no == 8) {
76                         if(joy_stat[0] & 0x10) val |= 1;
77                         if(joy_stat[0] & 0x20) val |= 2;
78                         if(joy_stat[1] & 0x10) val |= 4;
79                         if(joy_stat[1] & 0x20) val |= 8;
80                 }
81                 return val;
82         case 0x40:
83                 if(key_stat[0x11]) val |= 1;    // COLOR (CTRL)
84                 if(key_stat[0x09]) val |= 2;    // FUNC (TAB)
85                 if(key_stat[0x10]) val |= 4;    // SHIFT
86                 return val;
87         }
88         return 0xff;
89 }
90
91 void KEYBOARD::key_down(int code)
92 {
93         if(!(code == 0x09 || code == 0x10 || code == 0x11)) {
94                 if(intr_enb) {
95                         d_cpu->set_intr_line(true, true, 0);
96                         intr_enb = false;
97                 }
98         }
99         if((0x30 <= code && code <= 0x5a) || (0xba <= code && code <= 0xe2)) {
100                 memset(key_stat + 0x30, 0, 0x5a - 0x30 + 1);
101                 memset(key_stat + 0xba, 0, 0xe2 - 0xba + 1);
102         }
103         key_stat[code] = 1;
104 }
105
106 void KEYBOARD::key_up(int code)
107 {
108         key_stat[code] = 0;
109 }
110
111 #define STATE_VERSION   1
112
113
114 bool KEYBOARD::process_state(FILEIO* state_fio, bool loading)
115 {
116         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
117                 return false;
118         }
119         if(!state_fio->StateCheckInt32(this_device_id)) {
120                 return false;
121         }
122         state_fio->StateBuffer(key_stat, sizeof(key_stat), 1);
123         state_fio->StateInt32(key_no);
124         state_fio->StateBool(intr_enb);
125         return true;
126 }