OSDN Git Service

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