2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
17 #define SIG_Z80SIO_RECV_CH0 0
18 #define SIG_Z80SIO_RECV_CH1 1
19 #define SIG_Z80SIO_BREAK_CH0 2
20 #define SIG_Z80SIO_BREAK_CH1 3
21 #define SIG_Z80SIO_DCD_CH0 4
22 #define SIG_Z80SIO_DCD_CH1 5
23 #define SIG_Z80SIO_CTS_CH0 6
24 #define SIG_Z80SIO_CTS_CH1 7
25 #define SIG_Z80SIO_SYNC_CH0 8
26 #define SIG_Z80SIO_SYNC_CH1 9
27 #define SIG_Z80SIO_TX_CLK_CH0 10
28 #define SIG_Z80SIO_TX_CLK_CH1 11
29 #define SIG_Z80SIO_RX_CLK_CH0 12
30 #define SIG_Z80SIO_RX_CLK_CH1 13
31 // hack: clear recv buffer
32 #define SIG_Z80SIO_CLEAR_CH0 14
33 #define SIG_Z80SIO_CLEAR_CH1 15
37 class Z80SIO : public DEVICE
55 double tx_clock, tx_interval;
56 double rx_clock, rx_interval;
58 int tx_bits_x2, tx_bits_x2_remain;
59 int rx_bits_x2, rx_bits_x2_remain;
60 bool prev_tx_clock_signal;
61 bool prev_rx_clock_signal;
79 outputs_t outputs_rts;
80 outputs_t outputs_dtr;
81 outputs_t outputs_send;
82 outputs_t outputs_sync;
83 outputs_t outputs_break;
84 outputs_t outputs_txdone;
85 outputs_t outputs_rxdone;
88 void update_tx_timing(int ch);
89 void update_rx_timing(int ch);
92 DEVICE *d_cpu, *d_child;
98 Z80SIO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
100 memset(port, 0, sizeof(port));
101 for(int i = 0; i < 2; i++) {
102 port[i].tx_data_bits = 5;
105 init_output_signals(&port[i].outputs_rts);
106 init_output_signals(&port[i].outputs_dtr);
107 init_output_signals(&port[i].outputs_send);
108 init_output_signals(&port[i].outputs_sync);
109 init_output_signals(&port[i].outputs_break);
110 init_output_signals(&port[i].outputs_txdone);
111 init_output_signals(&port[i].outputs_rxdone);
113 d_cpu = d_child = NULL;
121 void write_io8(uint32 addr, uint32 data);
122 uint32 read_io8(uint32 addr);
123 void write_signal(int id, uint32 data, uint32 mask);
124 void event_callback(int event_id, int err);
125 void save_state(FILEIO* state_fio);
126 bool load_state(FILEIO* state_fio);
128 // interrupt common functions
129 void set_context_intr(DEVICE* device, uint32 bit)
134 void set_context_child(DEVICE* device)
138 void set_intr_iei(bool val);
143 void set_context_rts(int ch, DEVICE* device, int id, uint32 mask)
145 register_output_signal(&port[ch].outputs_rts, device, id, mask);
147 void set_context_dtr(int ch, DEVICE* device, int id, uint32 mask)
149 register_output_signal(&port[ch].outputs_dtr, device, id, mask);
151 void set_context_send(int ch, DEVICE* device, int id)
153 register_output_signal(&port[ch].outputs_send, device, id, 0xff);
155 void set_context_sync(int ch, DEVICE* device, int id, uint32 mask)
157 register_output_signal(&port[ch].outputs_sync, device, id, mask);
159 void set_context_break(int ch, DEVICE* device, int id, uint32 mask)
161 register_output_signal(&port[ch].outputs_break, device, id, mask);
163 void set_context_rxdone(int ch, DEVICE* device, int id, uint32 mask)
165 register_output_signal(&port[ch].outputs_rxdone, device, id, mask);
167 void set_context_txdone(int ch, DEVICE* device, int id, uint32 mask)
169 register_output_signal(&port[ch].outputs_txdone, device, id, mask);
171 void set_tx_clock(int ch, double clock)
173 if(port[ch].tx_clock != clock) {
174 port[ch].tx_clock = clock;
175 update_tx_timing(ch);
178 void set_rx_clock(int ch, double clock)
180 if(port[ch].rx_clock != clock) {
181 port[ch].rx_clock = clock;
182 update_rx_timing(ch);