2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
7 [ SCSI base initiator ]
10 #include "scsi_host.h"
12 void SCSI_HOST::reset()
15 bsy_status = cd_status = io_status = msg_status = req_status = ack_status = 0;
23 void SCSI_HOST::write_dma_io16(uint32_t addr, uint32_t data)
25 void SCSI_HOST::write_dma_io8(uint32_t addr, uint32_t data)
28 #ifdef _SCSI_DEBUG_LOG
29 this->force_out_debug_log(_T("[SCSI_HOST] Write %02X\n"), data);
31 write_signals(&outputs_dat, data);
33 #ifdef SCSI_HOST_AUTO_ACK
34 // set ack to clear req signal immediately
35 if(bsy_status && !io_status) {
36 this->write_signal(SIG_SCSI_ACK, 1, 1);
42 uint32_t SCSI_HOST::read_dma_io16(uint32_t addr)
44 uint32_t SCSI_HOST::read_dma_io8(uint32_t addr)
47 uint32_t value = data_reg;
48 #ifdef _SCSI_DEBUG_LOG
49 this->force_out_debug_log(_T("[SCSI_HOST] Read %02X\n"), value);
51 #ifdef SCSI_HOST_AUTO_ACK
52 // set ack to clear req signal immediately
53 if(bsy_status && io_status) {
54 this->write_signal(SIG_SCSI_ACK, 1, 1);
60 void SCSI_HOST::write_signal(int id, uint32_t data, uint32_t mask)
65 #ifdef _SCSI_DEBUG_LOG
66 this->out_debug_log(_T("[SCSI_HOST] SEL = %d\n"), (data & mask) ? 1 : 0);
68 write_signals(&outputs_sel, (data & mask) ? 0xffffffff : 0);
72 #ifdef _SCSI_DEBUG_LOG
73 // this->out_debug_log(_T("[SCSI_HOST] ATN = %d\n"), (data & mask) ? 1 : 0);
75 write_signals(&outputs_atn, (data & mask) ? 0xffffffff : 0);
79 #ifdef _SCSI_DEBUG_LOG
80 // this->out_debug_log(_T("[SCSI_HOST] ACK = %d\n"), (data & mask) ? 1 : 0);
82 write_signals(&outputs_ack, (data & mask) ? 0xffffffff : 0);
83 ack_status = data & mask;
87 #ifdef _SCSI_DEBUG_LOG
88 this->out_debug_log(_T("[SCSI_HOST] RST = %d\n"), (data & mask) ? 1 : 0);
90 write_signals(&outputs_rst, (data & mask) ? 0xffffffff : 0);
96 data_reg |= (data & mask);
101 bsy_status |= (data & mask);
102 write_signals(&outputs_bsy, bsy_status ? 0xffffffff : 0);
107 cd_status |= (data & mask);
108 write_signals(&outputs_cd, cd_status ? 0xffffffff : 0);
113 io_status |= (data & mask);
114 write_signals(&outputs_io, io_status ? 0xffffffff : 0);
119 msg_status |= (data & mask);
120 write_signals(&outputs_msg, msg_status ? 0xffffffff : 0);
125 uint32_t prev_status = req_status;
127 req_status |= (data & mask);
129 if(!prev_status && req_status) {
136 } else if(!msg_status && io_status) {
141 } else if(prev_status && !req_status) {
145 #ifdef SCSI_HOST_AUTO_ACK
146 this->write_signal(SIG_SCSI_ACK, 0, 0);
149 write_signals(&outputs_req, req_status ? 0xffffffff : 0);
155 uint32_t SCSI_HOST::read_signal(int id)
160 return bsy_status ? 0xffffffff : 0;
163 return cd_status ? 0xffffffff : 0;
166 return io_status ? 0xffffffff : 0;
169 return msg_status ? 0xffffffff : 0;
172 return req_status ? 0xffffffff : 0;
175 return ack_status ? 0xffffffff : 0;
179 uint32_t value = access ? 0xffffffff : 0;
184 void SCSI_HOST::set_irq(bool value)
186 write_signals(&outputs_irq, value ? 0xffffffff : 0);
189 void SCSI_HOST::set_drq(bool value)
191 write_signals(&outputs_drq, value ? 0xffffffff : 0);
194 #define STATE_VERSION 2
196 bool SCSI_HOST::process_state(FILEIO* state_fio, bool loading)
198 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
201 if(!state_fio->StateCheckInt32(this_device_id)) {
204 state_fio->StateValue(data_reg);
205 state_fio->StateValue(bsy_status);
206 state_fio->StateValue(cd_status);
207 state_fio->StateValue(io_status);
208 state_fio->StateValue(msg_status);
209 state_fio->StateValue(req_status);
210 state_fio->StateValue(ack_status);