OSDN Git Service

4f10cf3a918282f4c7ac74e5e9b7514ff35e695f
[csp-qt/common_source_project-fm7.git] / source / src / vm / mz80k / keyboard.cpp
1 /*
2         SHARP MZ-80K/C Emulator 'EmuZ-80K'
3         SHARP MZ-1200 Emulator 'EmuZ-1200'
4
5         Author : Takeda.Toshiya
6         Date   : 2010.08.18-
7
8         SHARP MZ-80A Emulator 'EmuZ-80A'
9         Modify : Hideki Suga
10         Date   : 2014.12.10 -
11
12         [ keyboard ]
13 */
14
15 #include "keyboard.h"
16 #include "../i8255.h"
17
18 static const int key_map[10][8] = {
19 #if defined(_MZ80A)
20         // MZ-80A
21         // 10KEY "00" -> 10KEY "/"
22         {0x10, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13},
23         {0x5a, 0x00, 0x2e, 0x41, 0x51, 0x57, 0x31, 0x32},
24         {0x43, 0x58, 0x53, 0x44, 0x45, 0x52, 0x33, 0x34},
25         {0x42, 0x56, 0x46, 0x47, 0x54, 0x59, 0x35, 0x36},
26         {0x20, 0x4e, 0x48, 0x4a, 0x55, 0x49, 0x37, 0x38},
27         {0x4d, 0xbc, 0x4b, 0x4c, 0x4f, 0x50, 0x39, 0x30},
28         {0xbe, 0xbf, 0xbb, 0xba, 0xc0, 0xdb, 0xbd, 0xde},
29         {0xe2, 0x00, 0xdd, 0x0d, 0x26, 0x27, 0xdc, 0x24},
30         {0x60, 0x6f, 0x61, 0x62, 0x64, 0x65, 0x67, 0x68},
31         {0x6e, 0x00, 0x63, 0x00, 0x66, 0x6d, 0x69, 0x6b},
32 #else
33         // MZ-80K , MZ-1200
34 /*
35         [ ^ ] [ F1] [ / ] [ * ] [ - ]
36         [ \ ] [ F2] [ 7 ] [ 8 ] [ 9 ]
37         [ [ ] [ F3] [ 4 ] [ 5 ] [ 6 ]
38         [ ] ] [ F4] [ 1 ] [ 2 ] [ 3 ]
39         [ _ ] [ F5] [ F6] [ F7] [ F8]
40 */
41         {0x31, 0x33, 0x35, 0x37, 0x39, 0xbd, 0x70, 0x6a},
42         {0x32, 0x34, 0x36, 0x38, 0x30, 0xde, 0x6f, 0x6d},
43         {0x51, 0x45, 0x54, 0x55, 0x4f, 0xc0, 0x71, 0x68},
44         {0x57, 0x52, 0x59, 0x49, 0x50, 0xdc, 0x67, 0x69},
45         {0x41, 0x44, 0x47, 0x4a, 0x4c, 0xba, 0x72, 0x65},
46         {0x53, 0x46, 0x48, 0x4b, 0xbb, 0xdb, 0x64, 0x66},
47         {0x5a, 0x43, 0x42, 0x4d, 0xbe, 0x15, 0x73, 0x62},
48         {0x58, 0x56, 0x4e, 0xbc, 0xbf, 0xdd, 0x61, 0x63},
49         {0x10, 0x2e, 0x00, 0x27, 0x0d, 0x00, 0x74, 0x76},
50         {0x24, 0x20, 0x28, 0x13, 0x00, 0xe2, 0x75, 0x77},
51 #endif
52 };
53
54 void KEYBOARD::initialize()
55 {
56 #if defined(_MZ80K) || defined(_MZ1200)
57         memset(key_buf, 0, sizeof(key_buf));
58 #endif
59         key_stat = emu->get_key_buffer();
60         
61         column = 0;
62         kana = false;
63         
64         // register event
65         register_frame_event(this);
66 }
67
68 void KEYBOARD::write_signal(int id, uint32_t data, uint32_t mask)
69 {
70         column = data & 0x0f;
71         update_key();
72 }
73
74 void KEYBOARD::event_frame()
75 {
76 #if defined(_MZ80K) || defined(_MZ1200)
77         if(key_buf[0x10] & 0x7f) {
78                 key_buf[0x10] = (key_buf[0x10] & 0x80) | ((key_buf[0x10] & 0x7f) - 1);
79         }
80         if(key_buf[0x15] & 0x7f) {
81                 key_buf[0x15] = (key_buf[0x15] & 0x80) | ((key_buf[0x15] & 0x7f) - 1);
82         }
83 #endif
84         update_key();
85 }
86
87 void KEYBOARD::update_key()
88 {
89         uint8_t stat = 0xff;
90         
91 #if defined(_MZ80K) || defined(_MZ1200)
92         uint8_t key10_stored = key_buf[0x10];
93         uint8_t key15_stored = key_buf[0x15];
94         memcpy(key_buf, key_stat, sizeof(key_buf));
95         key_buf[0x10] &= 0x80;
96         key_buf[0x10] |= key10_stored & 0x7f;
97         key_buf[0x15]  = key15_stored & 0x7f;
98 #else
99         #define key_buf key_stat
100 #endif
101         
102         if(column < 10) {
103                 for(int i = 0; i < 8; i++) {
104                         if(key_buf[key_map[column][i]]) {
105                                 stat &= ~(1 << i);
106                         }
107                 }
108         }
109         d_pio->write_signal(SIG_I8255_PORT_B, stat, 0xff);
110 }
111
112 void KEYBOARD::key_down(int code)
113 {
114 #if defined(_MZ80K) || defined(_MZ1200)
115         if(code == 0x15) {
116                 kana = !kana;
117                 key_buf[0x10] = kana ? 4 : 0;
118                 key_buf[0x15] = 4;
119         }
120 #endif
121 }
122
123 #define STATE_VERSION   2
124
125 #include "../../statesub.h"
126
127 void KEYBOARD::decl_state()
128 {
129         enter_decl_state(STATE_VERSION);
130         
131         DECL_STATE_ENTRY_UINT8(column);
132         DECL_STATE_ENTRY_BOOL(kana);
133         
134         leave_decl_state();
135 }
136
137 void KEYBOARD::save_state(FILEIO* state_fio)
138 {
139         if(state_entry != NULL) {
140                 state_entry->save_state(state_fio);
141         }
142 //      state_fio->FputUint32(STATE_VERSION);
143 //      state_fio->FputInt32(this_device_id);
144         
145 //      state_fio->FputUint8(column);
146 //      state_fio->FputBool(kana);
147 }
148
149 bool KEYBOARD::load_state(FILEIO* state_fio)
150 {
151         bool mb = false;
152         if(state_entry != NULL) {
153                 mb = state_entry->load_state(state_fio);
154         }
155         if(!mb) {
156                 return false;
157         }
158 //      if(state_fio->FgetUint32() != STATE_VERSION) {
159 //              return false;
160 //      }
161 //      if(state_fio->FgetInt32() != this_device_id) {
162 //              return false;
163 //      }
164 //      column = state_fio->FgetUint8();
165 //      kana = state_fio->FgetBool();
166         return true;
167 }
168
169 bool KEYBOARD::process_state(FILEIO* state_fio, bool loading)
170 {
171         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
172                 return false;
173         }
174         if(!state_fio->StateCheckInt32(this_device_id)) {
175                 return false;
176         }
177         state_fio->StateUint8(column);
178         state_fio->StateBool(kana);
179         return true;
180 }