2 CASIO PV-2000 Emulator 'EmuGaki'
\r
4 Author : Takeda.Toshiya
\r
10 #include "keyboard.h"
\r
12 static const int key_map[16][8] = {
\r
13 {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38}, // 1 2 3 4 5 6 7 8
\r
14 {0x51, 0x57, 0x45, 0x52, 0x54, 0x59, 0x55, 0x49}, // Q W E R T Y U I
\r
15 {0x41, 0x53, 0x44, 0x46, 0x47, 0x48, 0x4a, 0x4b}, // A S D F G H J K
\r
16 {0x1d, 0x5a, 0x58, 0x43, 0x56, 0x42, 0x4e, 0x20}, // KANA Z X C V B N SPACE
\r
17 {0x24, 0x00, 0x00, 0xdc, 0x30, 0xde, 0xbd, 0x39}, // HOME ? ? \ 0 ^ - 9
\r
18 {0x00, 0x00, 0x00, 0x00, 0x50, 0xdb, 0xc0, 0x4f}, // UR DR DL UL P [ @ O
\r
19 {0x00, 0x00, 0x27, 0x28, 0xbb, 0xdd, 0xba, 0x4c}, // R2 D2 R1 D1 ; ] : L
\r
20 {0x00, 0x00, 0x26, 0x25, 0xbc, 0xbf, 0xbe, 0x4d}, // U2 L2 U1 L1 , / . M
\r
21 {0x73, 0x72, 0x71, 0x70, 0xe2, 0x2e, 0x74, 0x0d}, // A3 A2 A1 A0 _ DEL MODE RET
\r
22 {0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // STOP ? ? ? ? ? ? ?
\r
23 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
\r
24 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
\r
25 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
\r
26 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
\r
27 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
\r
28 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
\r
31 void KEYBOARD::initialize()
\r
33 joy_stat = emu->joy_buffer();
\r
36 void KEYBOARD::reset()
\r
38 memset(key_stat, 0, sizeof(key_stat));
\r
43 void KEYBOARD::write_io8(uint32 addr, uint32 data)
\r
45 intr_enb = (data == 0xf);
\r
46 key_no = data & 0xf;
\r
49 uint32 KEYBOARD::read_io8(uint32 addr)
\r
53 switch(addr & 0xff) {
\r
55 if(key_stat[key_map[key_no][7]]) val |= 1;
\r
56 if(key_stat[key_map[key_no][6]]) val |= 2;
\r
57 if(key_stat[key_map[key_no][5]]) val |= 4;
\r
58 if(key_stat[key_map[key_no][4]]) val |= 8;
\r
61 if(key_stat[key_map[key_no][3]]) val |= 1;
\r
62 if(key_stat[key_map[key_no][2]]) val |= 2;
\r
63 if(key_stat[key_map[key_no][1]]) val |= 4;
\r
64 if(key_stat[key_map[key_no][0]]) val |= 8;
\r
66 if(joy_stat[0] & 0x02) val |= 1;
\r
67 if(joy_stat[0] & 0x08) val |= 2;
\r
68 if(joy_stat[1] & 0x02) val |= 4;
\r
69 if(joy_stat[1] & 0x08) val |= 8;
\r
70 } else if(key_no == 7) {
\r
71 if(joy_stat[0] & 0x04) val |= 1;
\r
72 if(joy_stat[0] & 0x01) val |= 2;
\r
73 if(joy_stat[1] & 0x04) val |= 4;
\r
74 if(joy_stat[1] & 0x01) val |= 8;
\r
75 } else if(key_no == 8) {
\r
76 if(joy_stat[0] & 0x10) val |= 1;
\r
77 if(joy_stat[0] & 0x20) val |= 2;
\r
78 if(joy_stat[1] & 0x10) val |= 4;
\r
79 if(joy_stat[1] & 0x20) val |= 8;
\r
83 if(key_stat[0x11]) val |= 1; // COLOR (CTRL)
\r
84 if(key_stat[0x09]) val |= 2; // FUNC (TAB)
\r
85 if(key_stat[0x10]) val |= 4; // SHIFT
\r
91 void KEYBOARD::key_down(int code)
\r
93 if(!(code == 0x09 || code == 0x10 || code == 0x11)) {
\r
95 d_cpu->set_intr_line(true, true, 0);
\r
99 if((0x30 <= code && code <= 0x5a) || (0xba <= code && code <= 0xe2)) {
\r
100 memset(key_stat + 0x30, 0, 0x5a - 0x30 + 1);
\r
101 memset(key_stat + 0xba, 0, 0xe2 - 0xba + 1);
\r
103 key_stat[code] = 1;
\r
106 void KEYBOARD::key_up(int code)
\r
108 key_stat[code] = 0;
\r