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 bool SERIAL::process_state(FILEIO* state_fio, bool loading)
146 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
149 if(!state_fio->StateCheckInt32(this_device_id)) {
152 //state_fio->StateBuffer(sioctrl, sizeof(sioctrl), 1);
153 for(int i = 0; i < 4; i++) {
154 state_fio->StateUint8(sioctrl[i].baud);
155 state_fio->StateUint8(sioctrl[i].ctrl);
156 state_fio->StateBool(sioctrl[i].rxrdy);
157 state_fio->StateBool(sioctrl[i].txrdy);
158 state_fio->StateUint8(sioctrl[i].intmask);
159 state_fio->StateUint8(sioctrl[i].intstat);