2 FUJITSU FMR-30 Emulator 'eFMR-30'
4 Author : Takeda.Toshiya
14 void SERIAL::initialize()
16 memset(sioctrl, sizeof(sioctrl), 1);
19 void SERIAL::write_io8(uint32_t addr, uint32_t data)
21 switch(addr & 0xffff) {
23 sioctrl[0].baud = data;
26 sioctrl[0].ctrl = data;
27 d_kb->write_signal(SIG_I8251_LOOPBACK, data, 8);
31 sioctrl[1].baud = data;
34 sioctrl[1].ctrl = data;
35 d_sub->write_signal(SIG_I8251_LOOPBACK, data, 8);
39 sioctrl[2].baud = data;
42 sioctrl[2].ctrl = data;
43 d_ch1->write_signal(SIG_I8251_LOOPBACK, data, 8);
47 sioctrl[2].intmask = data;
50 sioctrl[2].intstat &= ~data;
53 sioctrl[3].baud = data;
56 sioctrl[3].ctrl = data;
57 d_ch2->write_signal(SIG_I8251_LOOPBACK, data, 8);
61 sioctrl[3].intmask = data;
64 sioctrl[3].intstat &= ~data;
69 uint32_t SERIAL::read_io8(uint32_t addr)
71 switch(addr & 0xffff) {
73 return sioctrl[0].baud;
75 return sioctrl[0].ctrl;
77 return sioctrl[1].baud;
79 return sioctrl[1].ctrl;
81 return sioctrl[2].baud;
83 return sioctrl[2].ctrl;
85 return sioctrl[2].intmask;
87 return sioctrl[2].intstat;
89 return 0xf0; // append register
91 return sioctrl[3].baud;
93 return sioctrl[3].ctrl;
95 return sioctrl[3].intmask;
97 return sioctrl[3].intstat;
99 return 0xf0; // append register
104 void SERIAL::write_signal(int id, uint32_t data, uint32_t mask)
107 case SIG_SERIAL_RXRDY_KB:
108 case SIG_SERIAL_RXRDY_SUB:
109 case SIG_SERIAL_RXRDY_CH1:
110 case SIG_SERIAL_RXRDY_CH2:
111 sioctrl[id & 3].rxrdy = ((data & mask) != 0);
114 case SIG_SERIAL_TXRDY_KB:
115 case SIG_SERIAL_TXRDY_SUB:
116 case SIG_SERIAL_TXRDY_CH1:
117 case SIG_SERIAL_TXRDY_CH2:
118 sioctrl[id & 3].txrdy = ((data & mask) != 0);
124 void SERIAL::update_intr(int ch)
126 static const int pic_ids[4] = {
127 SIG_I8259_CHIP0 | SIG_I8259_IR2, // keyboard
128 SIG_I8259_CHIP0 | SIG_I8259_IR3, // sub
129 SIG_I8259_CHIP0 | SIG_I8259_IR4, // rs-232c ch.1
130 SIG_I8259_CHIP1 | SIG_I8259_IR4 // rs-232c ch.2
133 if((sioctrl[ch].rxrdy && (sioctrl[ch].ctrl & 0x40)) || (sioctrl[ch].txrdy && (sioctrl[ch].ctrl & 0x20))) {
134 d_pic->write_signal(pic_ids[ch], 1, 1);
135 sioctrl[ch].intstat |= 4;
137 d_pic->write_signal(pic_ids[ch], 0, 1);
138 sioctrl[ch].intstat &= ~4;
142 #define STATE_VERSION 1
144 #include "../../statesub.h"
146 void SERIAL::decl_state()
148 enter_decl_state(STATE_VERSION);
150 DECL_STATE_ENTRY_UINT8_STRIDE((sioctrl[0].baud), 4, sizeof(sioctrl[0]));
151 DECL_STATE_ENTRY_UINT8_STRIDE((sioctrl[0].ctrl), 4, sizeof(sioctrl[0]));
152 DECL_STATE_ENTRY_BOOL_STRIDE((sioctrl[0].rxrdy), 4, sizeof(sioctrl[0]));
153 DECL_STATE_ENTRY_BOOL_STRIDE((sioctrl[0].txrdy), 4, sizeof(sioctrl[0]));
154 DECL_STATE_ENTRY_UINT8_STRIDE((sioctrl[0].intmask), 4, sizeof(sioctrl[0]));
155 DECL_STATE_ENTRY_UINT8_STRIDE((sioctrl[0].intstat), 4, sizeof(sioctrl[0]));
160 void SERIAL::save_state(FILEIO* state_fio)
162 if(state_entry != NULL) {
163 state_entry->save_state(state_fio);
166 // state_fio->FputUint32(STATE_VERSION);
167 // state_fio->FputInt32(this_device_id);
169 // state_fio->Fwrite(sioctrl, sizeof(sioctrl), 1);
172 bool SERIAL::load_state(FILEIO* state_fio)
175 if(state_entry != NULL) {
176 mb = state_entry->load_state(state_fio);
182 // if(state_fio->FgetUint32() != STATE_VERSION) {
185 // if(state_fio->FgetInt32() != this_device_id) {
188 // state_fio->Fread(sioctrl, sizeof(sioctrl), 1);
192 bool SERIAL::process_state(FILEIO* state_fio, bool loading)
194 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
197 if(!state_fio->StateCheckInt32(this_device_id)) {
200 state_fio->StateBuffer(sioctrl, sizeof(sioctrl), 1);