OSDN Git Service

[INITIAL] Import 20141226 version of http://homepage3.nifty.com/takeda-toshiya/common...
[csp-qt/common_source_project-fm7.git] / source / src / vm / pv2000 / keyboard.cpp
1 /*\r
2         CASIO PV-2000 Emulator 'EmuGaki'\r
3 \r
4         Author : Takeda.Toshiya\r
5         Date   : 2006.08.18 -\r
6 \r
7         [ keyboard ]\r
8 */\r
9 \r
10 #include "keyboard.h"\r
11 \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
29 };\r
30 \r
31 void KEYBOARD::initialize()\r
32 {\r
33         joy_stat = emu->joy_buffer();\r
34 }\r
35 \r
36 void KEYBOARD::reset()\r
37 {\r
38         memset(key_stat, 0, sizeof(key_stat));\r
39         key_no = 0;\r
40         intr_enb = false;\r
41 }\r
42 \r
43 void KEYBOARD::write_io8(uint32 addr, uint32 data)\r
44 {\r
45         intr_enb = (data == 0xf);\r
46         key_no = data & 0xf;\r
47 }\r
48 \r
49 uint32 KEYBOARD::read_io8(uint32 addr)\r
50 {\r
51         uint32 val = 0;\r
52         \r
53         switch(addr & 0xff) {\r
54         case 0x10:\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
59                 return val;\r
60         case 0x20:\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
65                 if(key_no == 6) {\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
80                 }\r
81                 return val;\r
82         case 0x40:\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
86                 return val;\r
87         }\r
88         return 0xff;\r
89 }\r
90 \r
91 void KEYBOARD::key_down(int code)\r
92 {\r
93         if(!(code == 0x09 || code == 0x10 || code == 0x11)) {\r
94                 if(intr_enb) {\r
95                         d_cpu->set_intr_line(true, true, 0);\r
96                         intr_enb = false;\r
97                 }\r
98         }\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
102         }\r
103         key_stat[code] = 1;\r
104 }\r
105 \r
106 void KEYBOARD::key_up(int code)\r
107 {\r
108         key_stat[code] = 0;\r
109 }\r
110 \r