OSDN Git Service

[VM][WIP] Pre-process to apply new state framework.Still not buildable.
[csp-qt/common_source_project-fm7.git] / source / src / vm / fmr50 / keyboard.cpp
1 /*
2         FUJITSU FMR-50 Emulator 'eFMR-50'
3         FUJITSU FMR-60 Emulator 'eFMR-60'
4
5         Author : Takeda.Toshiya
6         Date   : 2008.05.01 -
7
8         [ keyboard ]
9 */
10
11 #include "keyboard.h"
12 #include "../i8259.h"
13 #include "../../fifo.h"
14
15 void KEYBOARD::initialize()
16 {
17         key_buf = new FIFO(64);
18         register_frame_event(this);
19 }
20
21 void KEYBOARD::release()
22 {
23         key_buf->release();
24         delete key_buf;
25 }
26
27 void KEYBOARD::reset()
28 {
29         memset(table, 0, sizeof(table));
30         key_buf->clear();
31         kbstat = kbdata = kbint = kbmsk = 0;
32 }
33
34 void KEYBOARD::write_io8(uint32_t addr, uint32_t data)
35 {
36         switch(addr) {
37         case 0x600:
38                 // data
39 //              kbstat |= 2;
40                 break;
41         case 0x602:
42                 // command
43                 break;
44         case 0x604:
45                 kbmsk = data;
46                 break;
47         }
48 }
49
50 uint32_t KEYBOARD::read_io8(uint32_t addr)
51 {
52         switch(addr) {
53         case 0x600:
54                 kbint &= ~1;
55                 d_pic->write_signal(SIG_I8259_CHIP0 | SIG_I8259_IR1, 0, 0);
56                 kbstat &= ~1;
57                 return kbdata;
58         case 0x602:
59                 return kbstat;
60         case 0x604:
61                 return kbint | 0xfc;
62         }
63         return 0;
64 }
65
66 void KEYBOARD::event_frame()
67 {
68         if(!(kbstat & 1) && !key_buf->empty()) {
69                 kbstat |= 1;
70                 kbdata = key_buf->read();
71         }
72         if((kbstat & 1) && (kbmsk & 1) && !(kbint & 1)) {
73                 kbint |= 1;
74                 d_pic->write_signal(SIG_I8259_CHIP0 | SIG_I8259_IR1, 1, 1);
75         }
76 //      kbstat &= ~2;
77 }
78
79 void KEYBOARD::key_down(int code)
80 {
81 //      if(!table[code]) {
82                 table[code] = 1;
83                 if(code = key_table[code]) {
84                         // $11:CTRL, $10:SHIFT
85                         key_buf->write(0xa0 | (table[0x11] ? 8 : 0) | (table[0x10] ? 4 : 0));
86                         key_buf->write(code);
87                 }
88 //      }
89 }
90
91 void KEYBOARD::key_up(int code)
92 {
93 //      if(table[code]) {
94                 table[code] = 0;
95                 if(code = key_table[code]) {
96                         key_buf->write(0xb0);
97                         key_buf->write(code);
98                 }
99 //      }
100 }
101
102 #define STATE_VERSION   1
103
104 #include "../../statesub.h"
105
106 void KEYBOARD::decl_state()
107 {
108         enter_decl_state(STATE_VERSION);
109         
110         DECL_STATE_ENTRY_FIFO(key_buf);
111         DECL_STATE_ENTRY_UINT8(kbstat);
112         DECL_STATE_ENTRY_UINT8(kbdata);
113         DECL_STATE_ENTRY_UINT8(kbint);
114         DECL_STATE_ENTRY_UINT8(kbmsk);
115         DECL_STATE_ENTRY_1D_ARRAY(table, sizeof(table));
116         
117         leave_decl_state();
118 }
119
120 void KEYBOARD::save_state(FILEIO* state_fio)
121 {
122         if(state_entry != NULL) {
123                 state_entry->save_state(state_fio);
124         }
125
126 //      state_fio->FputUint32(STATE_VERSION);
127 //      state_fio->FputInt32(this_device_id);
128         
129 //      key_buf->save_state((void *)state_fio);
130 //      state_fio->FputUint8(kbstat);
131 //      state_fio->FputUint8(kbdata);
132 //      state_fio->FputUint8(kbint);
133 //      state_fio->FputUint8(kbmsk);
134 //      state_fio->Fwrite(table, sizeof(table), 1);
135 }
136
137 bool KEYBOARD::load_state(FILEIO* state_fio)
138 {
139         bool mb = false;
140         if(state_entry != NULL) {
141                 mb = state_entry->load_state(state_fio);
142         }
143         if(!mb) {
144                 return false;
145         }
146
147 //      if(state_fio->FgetUint32() != STATE_VERSION) {
148 //              return false;
149 //      }
150 //      if(state_fio->FgetInt32() != this_device_id) {
151 //              return false;
152 //      }
153 //      if(!key_buf->load_state((void *)state_fio)) {
154 //              return false;
155 //      }
156 //      kbstat = state_fio->FgetUint8();
157 //      kbdata = state_fio->FgetUint8();
158 //      kbint = state_fio->FgetUint8();
159 //      kbmsk = state_fio->FgetUint8();
160 //      state_fio->Fread(table, sizeof(table), 1);
161         return true;
162 }
163
164 bool KEYBOARD::process_state(FILEIO* state_fio, bool loading)
165 {
166         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
167                 return false;
168         }
169         if(!state_fio->StateCheckInt32(this_device_id)) {
170                 return false;
171         }
172         if(!key_buf->process_state((void *)state_fio, loading)) {
173                 return false;
174         }
175         state_fio->StateUint8(kbstat);
176         state_fio->StateUint8(kbdata);
177         state_fio->StateUint8(kbint);
178         state_fio->StateUint8(kbmsk);
179         state_fio->StateBuffer(table, sizeof(table), 1);
180         return true;
181 }