2 SANYO PHC-25 Emulator 'ePHC-25'
3 SEIKO MAP-1010 Emulator 'eMAP-1010'
5 Author : Takeda.Toshiya
14 static const uint8_t key_map[0x50] = {
16 7800: Z X C V B N SPACE M
17 7808: , . / _ TK0 TK- TK+ ENTER
19 7818: L ; : ] TK1 TK2 TK3 TK=
21 7828: O P @ [ TK4 TK5 TK6 TK*
23 7838: 0 - ^ \ DEL TK7 TK8 TK9
25 7848: LEFT RIGHT UP DOWN TK/
27 0x5A, 0x58, 0x43, 0x56, 0x42, 0x4E, 0x20, 0x4D,
28 0xBC, 0xBE, 0xBF, 0xE2, 0x60, 0x6D, 0x6B, 0x0D,
29 0x41, 0x53, 0x44, 0x46, 0x47, 0x48, 0x4A, 0x4B,
30 0x4C, 0xBB, 0xBA, 0xDD, 0x61, 0x62, 0x63, 0x00,
31 0x51, 0x57, 0x45, 0x52, 0x54, 0x59, 0x55, 0x49,
32 0x4F, 0x50, 0xC0, 0xDB, 0x64, 0x65, 0x66, 0x6A,
33 0x00, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
34 0x30, 0xBD, 0xDE, 0xDC, 0x2E, 0x67, 0x68, 0x69,
35 0x32, 0x00, 0x31, 0x00, 0x70, 0x71, 0x72, 0x73,
36 0x00, 0x25, 0x27, 0x26, 0x28, 0x00, 0x00, 0x6F
39 static const uint8_t key_map[10][8] = {
40 {0x31, 0x57, 0x53, 0x58, 0x26, 0x2e, 0xba, 0x00},
41 {0x1b, 0x51, 0x41, 0x5a, 0x28, 0x0d, 0xbb, 0xbf},
42 {0x33, 0x52, 0x46, 0x56, 0x25, 0xde, 0xdb, 0x00},
43 {0x32, 0x45, 0x44, 0x43, 0x27, 0xdc, 0xdd, 0x20},
44 {0x35, 0x59, 0x48, 0x4e, 0x72, 0x30, 0x50, 0x00},
45 {0x34, 0x54, 0x47, 0x42, 0x73, 0xbd, 0xc0, 0x00},
46 {0x36, 0x55, 0x4a, 0x4d, 0x71, 0x39, 0x4f, 0x00},
47 {0x37, 0x49, 0x4b, 0xbc, 0x70, 0x38, 0x4c, 0xbe},
48 {0x00, 0x12, 0x10, 0x11, 0x00, 0xf0, 0x00, 0x00},
49 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
53 void KEYBOARD::initialize()
55 key_stat = emu->get_key_buffer();
57 // register event to update the key status
58 register_frame_event(this);
61 void KEYBOARD::reset()
66 memset(status, 0, sizeof(status));
70 uint32_t KEYBOARD::read_io8(uint32_t addr)
74 if(0x7800 <= addr && addr < 0x7850) {
75 return key_stat[key_map[addr - 0x7800]] ? 0 : 1;
76 } else if(addr == 0x7850) {
78 return key_stat[0x10] ? 0 : 1;
79 } else if(addr == 0x7851) {
82 } else if(addr == 0x7852) {
84 return key_stat[0x11] ? 0 : 1;
85 } else if(addr == 0x7853) {
87 return key_stat[0x12] ? 0 : 1;
88 } else if(addr == 0x785c) {
98 return ~status[addr & 0x0f];
102 void KEYBOARD::event_frame()
105 if(!kana_pressed && key_stat[0x15]) {
109 memset(status, 0, sizeof(status));
111 for(int i = 0; i < 10; i++) {
113 for(int j = 0; j < 8; j++) {
114 val |= key_stat[key_map[i][j]] ? (1 << j) : 0;
121 #define STATE_VERSION 1
123 bool KEYBOARD::process_state(FILEIO* state_fio, bool loading)
125 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
128 if(!state_fio->StateCheckInt32(this_device_id)) {
132 state_fio->StateInt32(kana_pressed);
134 state_fio->StateBuffer(status, sizeof(status), 1);