OSDN Git Service

[VM][STATE] Use namespace {VMNAME} to separate per VMs.
[csp-qt/common_source_project-fm7.git] / source / src / vm / phc25 / keyboard.cpp
1 /*
2         SANYO PHC-25 Emulator 'ePHC-25'
3         SEIKO MAP-1010 Emulator 'eMAP-1010'
4
5         Author : Takeda.Toshiya
6         Date   : 2010.08.03-
7
8         [ keyboard ]
9 */
10
11 #include "keyboard.h"
12
13 namespace PHC25 {
14
15 #ifdef _MAP1010
16 static const uint8_t key_map[0x50] = {
17 /*
18         7800:   Z       X       C       V       B       N       SPACE   M
19         7808:   ,       .       /       _       TK0     TK-     TK+     ENTER
20         7810:   A       S       D       F       G       H       J       K
21         7818:   L       ;       :       ]       TK1     TK2     TK3     TK=
22         7820:   Q       W       E       R       T       Y       U       I
23         7828:   O       P       @       [       TK4     TK5     TK6     TK*
24         7830:           3       4       5       6       7       8       9
25         7838:   0       -       ^       \       DEL     TK7     TK8     TK9
26         7840:   2               1               F1      F2      F3      F4
27         7848:           LEFT    RIGHT   UP      DOWN                    TK/
28 */
29         0x5A, 0x58, 0x43, 0x56, 0x42, 0x4E, 0x20, 0x4D,
30         0xBC, 0xBE, 0xBF, 0xE2, 0x60, 0x6D, 0x6B, 0x0D,
31         0x41, 0x53, 0x44, 0x46, 0x47, 0x48, 0x4A, 0x4B,
32         0x4C, 0xBB, 0xBA, 0xDD, 0x61, 0x62, 0x63, 0x00,
33         0x51, 0x57, 0x45, 0x52, 0x54, 0x59, 0x55, 0x49,
34         0x4F, 0x50, 0xC0, 0xDB, 0x64, 0x65, 0x66, 0x6A,
35         0x00, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
36         0x30, 0xBD, 0xDE, 0xDC, 0x2E, 0x67, 0x68, 0x69,
37         0x32, 0x00, 0x31, 0x00, 0x70, 0x71, 0x72, 0x73,
38         0x00, 0x25, 0x27, 0x26, 0x28, 0x00, 0x00, 0x6F
39 };
40 #else
41 static const uint8_t key_map[10][8] = {
42         {0x31, 0x57, 0x53, 0x58, 0x26, 0x2e, 0xba, 0x00},
43         {0x1b, 0x51, 0x41, 0x5a, 0x28, 0x0d, 0xbb, 0xbf},
44         {0x33, 0x52, 0x46, 0x56, 0x25, 0xde, 0xdb, 0x00},
45         {0x32, 0x45, 0x44, 0x43, 0x27, 0xdc, 0xdd, 0x20},
46         {0x35, 0x59, 0x48, 0x4e, 0x72, 0x30, 0x50, 0x00},
47         {0x34, 0x54, 0x47, 0x42, 0x73, 0xbd, 0xc0, 0x00},
48         {0x36, 0x55, 0x4a, 0x4d, 0x71, 0x39, 0x4f, 0x00},
49         {0x37, 0x49, 0x4b, 0xbc, 0x70, 0x38, 0x4c, 0xbe},
50         {0x00, 0x12, 0x10, 0x11, 0x00, 0xf0, 0x00, 0x00},
51         {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
52 };
53 #endif
54
55 void KEYBOARD::initialize()
56 {
57         key_stat = emu->get_key_buffer();
58         
59         // register event to update the key status
60         register_frame_event(this);
61 }
62
63 void KEYBOARD::reset()
64 {
65 #ifdef _MAP1010
66         kana_pressed = 0;
67 #else
68         memset(status, 0, sizeof(status));
69 #endif
70 }
71
72 uint32_t KEYBOARD::read_io8(uint32_t addr)
73 {
74 #ifdef _MAP1010
75         // memory mapped i/o
76         if(0x7800 <= addr && addr < 0x7850) {
77                 return key_stat[key_map[addr - 0x7800]] ? 0 : 1;
78         } else if(addr == 0x7850) {
79                 // LSHIFT
80                 return key_stat[0x10] ? 0 : 1;
81         } else if(addr == 0x7851) {
82                 // RSHIFT
83                 return 1;
84         } else if(addr == 0x7852) {
85                 // CTRL
86                 return key_stat[0x11] ? 0 : 1;
87         } else if(addr == 0x7853) {
88                 // GRAPH
89                 return key_stat[0x12] ? 0 : 1;
90         } else if(addr == 0x785c) {
91                 // KANA
92                 if(kana_pressed) {
93                         kana_pressed--;
94                         return 0;
95                 }
96                 return 1;
97         }
98         return 0xff;
99 #else
100         return ~status[addr & 0x0f];
101 #endif
102 }
103
104 void KEYBOARD::event_frame()
105 {
106 #ifdef _MAP1010
107         if(!kana_pressed && key_stat[0x15]) {
108                 kana_pressed = 4;
109         }
110 #else
111         memset(status, 0, sizeof(status));
112         
113         for(int i = 0; i < 10; i++) {
114                 uint8_t val = 0;
115                 for(int j = 0; j < 8; j++) {
116                         val |= key_stat[key_map[i][j]] ? (1 << j) : 0;
117                 }
118                 status[i] = val;
119         }
120 #endif
121 }
122
123 #define STATE_VERSION   1
124
125 bool KEYBOARD::process_state(FILEIO* state_fio, bool loading)
126 {
127         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
128                 return false;
129         }
130         if(!state_fio->StateCheckInt32(this_device_id)) {
131                 return false;
132         }
133 #ifdef _MAP1010
134         state_fio->StateInt32(kana_pressed);
135 #else
136         state_fio->StateBuffer(status, sizeof(status), 1);
137 #endif
138         return true;
139 }
140
141 }