2 SANYO PHC-25 Emulator 'ePHC-25'
3 SEIKO MAP-1010 Emulator 'eMAP-1010'
5 Author : Takeda.Toshiya
16 static const uint8_t key_map[0x50] = {
18 7800: Z X C V B N SPACE M
19 7808: , . / _ TK0 TK- TK+ ENTER
21 7818: L ; : ] TK1 TK2 TK3 TK=
23 7828: O P @ [ TK4 TK5 TK6 TK*
25 7838: 0 - ^ \ DEL TK7 TK8 TK9
27 7848: LEFT RIGHT UP DOWN TK/
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
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}
55 void KEYBOARD::initialize()
57 key_stat = emu->get_key_buffer();
59 // register event to update the key status
60 register_frame_event(this);
63 void KEYBOARD::reset()
68 memset(status, 0, sizeof(status));
72 uint32_t KEYBOARD::read_io8(uint32_t addr)
76 if(0x7800 <= addr && addr < 0x7850) {
77 return key_stat[key_map[addr - 0x7800]] ? 0 : 1;
78 } else if(addr == 0x7850) {
80 return key_stat[0x10] ? 0 : 1;
81 } else if(addr == 0x7851) {
84 } else if(addr == 0x7852) {
86 return key_stat[0x11] ? 0 : 1;
87 } else if(addr == 0x7853) {
89 return key_stat[0x12] ? 0 : 1;
90 } else if(addr == 0x785c) {
100 return ~status[addr & 0x0f];
104 void KEYBOARD::event_frame()
107 if(!kana_pressed && key_stat[0x15]) {
111 memset(status, 0, sizeof(status));
113 for(int i = 0; i < 10; i++) {
115 for(int j = 0; j < 8; j++) {
116 val |= key_stat[key_map[i][j]] ? (1 << j) : 0;
123 #define STATE_VERSION 1
125 bool KEYBOARD::process_state(FILEIO* state_fio, bool loading)
127 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
130 if(!state_fio->StateCheckInt32(this_device_id)) {
134 state_fio->StateInt32(kana_pressed);
136 state_fio->StateBuffer(status, sizeof(status), 1);