OSDN Git Service

[VM][STATE] Apply New framework to some 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 #ifdef _MAP1010
14 static const uint8_t key_map[0x50] = {
15 /*
16         7800:   Z       X       C       V       B       N       SPACE   M
17         7808:   ,       .       /       _       TK0     TK-     TK+     ENTER
18         7810:   A       S       D       F       G       H       J       K
19         7818:   L       ;       :       ]       TK1     TK2     TK3     TK=
20         7820:   Q       W       E       R       T       Y       U       I
21         7828:   O       P       @       [       TK4     TK5     TK6     TK*
22         7830:           3       4       5       6       7       8       9
23         7838:   0       -       ^       \       DEL     TK7     TK8     TK9
24         7840:   2               1               F1      F2      F3      F4
25         7848:           LEFT    RIGHT   UP      DOWN                    TK/
26 */
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
37 };
38 #else
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}
50 };
51 #endif
52
53 void KEYBOARD::initialize()
54 {
55         key_stat = emu->get_key_buffer();
56         
57         // register event to update the key status
58         register_frame_event(this);
59 }
60
61 void KEYBOARD::reset()
62 {
63 #ifdef _MAP1010
64         kana_pressed = 0;
65 #else
66         memset(status, 0, sizeof(status));
67 #endif
68 }
69
70 uint32_t KEYBOARD::read_io8(uint32_t addr)
71 {
72 #ifdef _MAP1010
73         // memory mapped i/o
74         if(0x7800 <= addr && addr < 0x7850) {
75                 return key_stat[key_map[addr - 0x7800]] ? 0 : 1;
76         } else if(addr == 0x7850) {
77                 // LSHIFT
78                 return key_stat[0x10] ? 0 : 1;
79         } else if(addr == 0x7851) {
80                 // RSHIFT
81                 return 1;
82         } else if(addr == 0x7852) {
83                 // CTRL
84                 return key_stat[0x11] ? 0 : 1;
85         } else if(addr == 0x7853) {
86                 // GRAPH
87                 return key_stat[0x12] ? 0 : 1;
88         } else if(addr == 0x785c) {
89                 // KANA
90                 if(kana_pressed) {
91                         kana_pressed--;
92                         return 0;
93                 }
94                 return 1;
95         }
96         return 0xff;
97 #else
98         return ~status[addr & 0x0f];
99 #endif
100 }
101
102 void KEYBOARD::event_frame()
103 {
104 #ifdef _MAP1010
105         if(!kana_pressed && key_stat[0x15]) {
106                 kana_pressed = 4;
107         }
108 #else
109         memset(status, 0, sizeof(status));
110         
111         for(int i = 0; i < 10; i++) {
112                 uint8_t val = 0;
113                 for(int j = 0; j < 8; j++) {
114                         val |= key_stat[key_map[i][j]] ? (1 << j) : 0;
115                 }
116                 status[i] = val;
117         }
118 #endif
119 }
120
121 #define STATE_VERSION   1
122
123 bool KEYBOARD::process_state(FILEIO* state_fio, bool loading)
124 {
125         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
126                 return false;
127         }
128         if(!state_fio->StateCheckInt32(this_device_id)) {
129                 return false;
130         }
131 #ifdef _MAP1010
132         state_fio->StateInt32(kana_pressed);
133 #else
134         state_fio->StateBuffer(status, sizeof(status), 1);
135 #endif
136         return true;
137 }