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 = false;
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 emu->force_out_debug_log(_T("[SCSI_HOST] Write %02X\n"), data);
31 write_signals(&outputs_dat, data);
33 #ifdef SCSI_HOST_AUTO_ACK
34 if(bsy_status && !io_status) {
35 this->write_signal(SIG_SCSI_ACK, 1, 1);
41 uint32_t SCSI_HOST::read_dma_io16(uint32_t addr)
43 uint32_t SCSI_HOST::read_dma_io8(uint32_t addr)
46 uint32_t value = data_reg;
47 #ifdef _SCSI_DEBUG_LOG
48 emu->force_out_debug_log(_T("[SCSI_HOST] Read %02X\n"), value);
50 #ifdef SCSI_HOST_AUTO_ACK
51 if(bsy_status && io_status) {
52 this->write_signal(SIG_SCSI_ACK, 1, 1);
58 void SCSI_HOST::write_signal(int id, uint32_t data, uint32_t mask)
63 write_signals(&outputs_sel, (data & mask) ? 0xffffffff : 0);
67 write_signals(&outputs_atn, (data & mask) ? 0xffffffff : 0);
71 write_signals(&outputs_ack, (data & mask) ? 0xffffffff : 0);
75 write_signals(&outputs_rst, (data & mask) ? 0xffffffff : 0);
81 data_reg |= (data & mask);
86 bsy_status |= (data & mask);
91 cd_status |= (data & mask);
96 io_status |= (data & mask);
101 msg_status |= (data & mask);
106 uint32_t prev_status = req_status;
108 req_status |= (data & mask);
110 if(!prev_status && req_status) {
113 if(!cd_status && !msg_status) {
118 else if (cd_status) {
119 // command/status/message phase
123 } else if(prev_status && !req_status) {
127 #ifdef SCSI_HOST_AUTO_ACK
128 this->write_signal(SIG_SCSI_ACK, 0, 0);
136 uint32_t SCSI_HOST::read_signal(int id)
141 return bsy_status ? 0xffffffff : 0;
144 return cd_status ? 0xffffffff : 0;
147 return io_status ? 0xffffffff : 0;
150 return msg_status ? 0xffffffff : 0;
153 return req_status ? 0xffffffff : 0;
157 uint32_t value = access ? 0xffffffff : 0;
162 void SCSI_HOST::set_irq(bool value)
164 write_signals(&outputs_irq, value ? 0xffffffff : 0);
167 void SCSI_HOST::set_drq(bool value)
169 write_signals(&outputs_drq, value ? 0xffffffff : 0);
172 #define STATE_VERSION 1
174 void SCSI_HOST::save_state(FILEIO* state_fio)
176 state_fio->FputUint32(STATE_VERSION);
177 state_fio->FputInt32(this_device_id);
179 state_fio->FputUint32(data_reg);
180 state_fio->FputUint32(bsy_status);
181 state_fio->FputUint32(cd_status);
182 state_fio->FputUint32(io_status);
183 state_fio->FputUint32(msg_status);
184 state_fio->FputUint32(req_status);
187 bool SCSI_HOST::load_state(FILEIO* state_fio)
189 if(state_fio->FgetUint32() != STATE_VERSION) {
192 if(state_fio->FgetInt32() != this_device_id) {
195 data_reg = state_fio->FgetUint32();
196 bsy_status = state_fio->FgetUint32();
197 cd_status = state_fio->FgetUint32();
198 io_status = state_fio->FgetUint32();
199 msg_status = state_fio->FgetUint32();
200 req_status = state_fio->FgetUint32();