2 FUJITSU FMR-30 Emulator 'eFMR-30'
4 Author : Takeda.Toshiya
11 #include "../../emu.h"
15 #include "../scsi_host.h"
18 #define CTRL_SWEN 0x80
19 #define CTRL_IMSK 0x40
22 #define CTRL_DMAE 0x02
23 #define CTRL_RSTS 0x01
25 #define STATUS_REQ 0x80
26 #define STATUS_IO 0x40
27 #define STATUS_MSG 0x20
28 #define STATUS_CD 0x10
29 #define STATUS_BSY 0x08
30 #define STATUS_INT 0x02
31 #define STATUS_PERR 0x01
33 #define IMSK_PHASE 0x02
36 #define STATUS_PHASE 0x02
37 #define STATUS_EOP 0x01
42 intm_reg = IMSK_PHASE; // DMA terminal count IRQ is disabled
43 phase_status = eop_status = false;
46 void SCSI::write_io8(uint32_t addr, uint32_t data)
48 switch(addr & 0xffff) {
51 #ifdef _SCSI_DEBUG_LOG
52 this->out_debug_log(_T("[SCSI] out %04X %02X\n"), addr, data);
54 // if(ctrl_reg & CTRL_SWEN) {
55 d_host->write_dma_io8(addr, data);
61 #ifdef _SCSI_DEBUG_LOG
62 this->out_debug_log(_T("[SCSI] out %04X %02X\n"), addr, data);
65 // if(ctrl_reg & CTRL_SWEN) {
66 d_host->write_signal(SIG_SCSI_RST, data, CTRL_RSTS);
67 d_host->write_signal(SIG_SCSI_SEL, data, CTRL_SEL);
68 d_host->write_signal(SIG_SCSI_ATN, data, CTRL_ATN);
73 #ifdef _SCSI_DEBUG_LOG
74 this->out_debug_log(_T("[SCSI] out %04X %02X\n"), addr, data);
76 if(data & STATUS_PHASE) {
79 if(data & STATUS_EOP) {
82 if(!(phase_status || eop_status)) {
83 // d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR2, 0, 0);
89 #ifdef _SCSI_DEBUG_LOG
90 this->out_debug_log(_T("[SCSI] out %04X %02X\n"), addr, data);
97 uint32_t SCSI::read_io8(uint32_t addr)
101 switch(addr & 0xffff) {
104 // if(ctrl_reg & CTRL_SWEN) {
105 value = d_host->read_dma_io8(addr);
107 #ifdef _SCSI_DEBUG_LOG
108 this->out_debug_log(_T("[SCSI] in %04X %02X\n"), addr, value);
114 value = (d_host->read_signal(SIG_SCSI_REQ) ? STATUS_REQ : 0) |
115 (d_host->read_signal(SIG_SCSI_IO ) ? STATUS_IO : 0) |
116 (d_host->read_signal(SIG_SCSI_MSG) ? STATUS_MSG : 0) |
117 (d_host->read_signal(SIG_SCSI_CD ) ? STATUS_CD : 0) |
118 (d_host->read_signal(SIG_SCSI_BSY) ? STATUS_BSY : 0) |
119 (phase_status || eop_status ? STATUS_INT : 0) | 0x04;
120 #ifdef _SCSI_DEBUG_LOG
121 this->out_debug_log(_T("[SCSI] in %04X %02X\n"), addr, value);
126 // irq status register
127 value = (phase_status ? STATUS_PHASE : 0) | (eop_status ? STATUS_EOP : 0);
128 #ifdef _SCSI_DEBUG_LOG
129 this->out_debug_log(_T("[SCSI] in %04X %02X\n"), addr, value);
136 void SCSI::write_signal(int id, uint32_t data, uint32_t mask)
140 if(ctrl_reg & CTRL_IMSK) {
141 if(intm_reg & IMSK_PHASE) {
142 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR2, data, mask);
145 phase_status = ((data & mask) != 0);
149 if(ctrl_reg & CTRL_DMAE) {
150 d_dma->write_signal(SIG_I8237_CH1, data, mask);
155 if(ctrl_reg & CTRL_IMSK) {
156 if(intm_reg & IMSK_EOP) {
157 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR2, data, mask);
160 eop_status = ((data & mask) != 0);
165 #define STATE_VERSION 1
167 #include "../../statesub.h"
169 void SCSI::decl_state()
171 enter_decl_state(STATE_VERSION);
173 DECL_STATE_ENTRY_UINT8(ctrl_reg);
174 DECL_STATE_ENTRY_UINT8(intm_reg);
175 DECL_STATE_ENTRY_BOOL(phase_status);
176 DECL_STATE_ENTRY_BOOL(eop_status);
181 void SCSI::save_state(FILEIO* state_fio)
183 if(state_entry != NULL) {
184 state_entry->save_state(state_fio);
187 // state_fio->FputUint32(STATE_VERSION);
188 // state_fio->FputInt32(this_device_id);
190 // state_fio->FputUint8(ctrl_reg);
191 // state_fio->FputUint8(intm_reg);
192 // state_fio->FputBool(phase_status);
193 // state_fio->FputBool(eop_status);
196 bool SCSI::load_state(FILEIO* state_fio)
199 if(state_entry != NULL) {
200 mb = state_entry->load_state(state_fio);
206 // if(state_fio->FgetUint32() != STATE_VERSION) {
209 // if(state_fio->FgetInt32() != this_device_id) {
212 // ctrl_reg = state_fio->FgetUint8();
213 // intm_reg = state_fio->FgetUint8();
214 // phase_status = state_fio->FgetBool();
215 // eop_status = state_fio->FgetBool();
219 bool SCSI::process_state(FILEIO* state_fio, bool loading)
221 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
224 if(!state_fio->StateCheckInt32(this_device_id)) {
227 state_fio->StateUint8(ctrl_reg);
228 state_fio->StateUint8(intm_reg);
229 state_fio->StateBool(phase_status);
230 state_fio->StateBool(eop_status);