2 FUJITSU FMR-50 Emulator 'eFMR-50'
3 FUJITSU FMR-60 Emulator 'eFMR-60'
5 Author : Takeda.Toshiya
13 #include "../scsi_host.h"
14 #include "../upd71071.h"
18 #define CTRL_IMSK 0x40
21 #define CTRL_DMAE 0x02
24 #define STATUS_REQ 0x80
25 #define STATUS_IO 0x40
26 #define STATUS_MSG 0x20
27 #define STATUS_CD 0x10
28 #define STATUS_BSY 0x08
29 #define STATUS_INT 0x02
30 #define STATUS_PERR 0x01
38 void SCSI::write_io8(uint32_t addr, uint32_t data)
40 switch(addr & 0xffff) {
43 #ifdef _SCSI_DEBUG_LOG
44 this->out_debug_log(_T("[SCSI] out %04X %02X\n"), addr, data);
46 if(ctrl_reg & CTRL_WEN) {
47 d_host->write_dma_io8(addr, data);
53 #ifdef _SCSI_DEBUG_LOG
54 this->out_debug_log(_T("[SCSI] out %04X %02X\n"), addr, data);
57 if(ctrl_reg & CTRL_WEN) {
58 d_host->write_signal(SIG_SCSI_RST, data, CTRL_RST);
59 d_host->write_signal(SIG_SCSI_SEL, data, CTRL_SEL);
60 d_host->write_signal(SIG_SCSI_ATN, data, CTRL_ATN);
66 uint32_t SCSI::read_io8(uint32_t addr)
70 switch(addr & 0xffff) {
73 if(ctrl_reg & CTRL_WEN) {
74 value = d_host->read_dma_io8(addr);
76 #ifdef _SCSI_DEBUG_LOG
77 this->out_debug_log(_T("[SCSI] in %04X %02X\n"), addr, value);
83 value = (d_host->read_signal(SIG_SCSI_REQ) ? STATUS_REQ : 0) |
84 (d_host->read_signal(SIG_SCSI_IO ) ? STATUS_IO : 0) |
85 (d_host->read_signal(SIG_SCSI_MSG) ? STATUS_MSG : 0) |
86 (d_host->read_signal(SIG_SCSI_CD ) ? STATUS_CD : 0) |
87 (d_host->read_signal(SIG_SCSI_BSY) ? STATUS_BSY : 0) |
88 (irq_status ? STATUS_INT : 0);
89 #ifdef _SCSI_DEBUG_LOG
90 this->out_debug_log(_T("[SCSI] in %04X %02X\n"), addr, value);
97 void SCSI::write_signal(int id, uint32_t data, uint32_t mask)
101 if(ctrl_reg & CTRL_IMSK) {
102 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR0, data, mask);
104 irq_status = ((data & mask) != 0);
108 if(ctrl_reg & CTRL_DMAE) {
109 d_dma->write_signal(SIG_UPD71071_CH1, data, mask);
115 #define STATE_VERSION 1
117 #include "../../statesub.h"
119 void SCSI::decl_state()
121 enter_decl_state(STATE_VERSION);
123 DECL_STATE_ENTRY_UINT8(ctrl_reg);
124 DECL_STATE_ENTRY_BOOL(irq_status);
129 void SCSI::save_state(FILEIO* state_fio)
131 if(state_entry != NULL) {
132 state_entry->save_state(state_fio);
135 // state_fio->FputUint32(STATE_VERSION);
136 // state_fio->FputInt32(this_device_id);
138 // state_fio->FputUint8(ctrl_reg);
139 // state_fio->FputBool(irq_status);
142 bool SCSI::load_state(FILEIO* state_fio)
145 if(state_entry != NULL) {
146 mb = state_entry->load_state(state_fio);
152 // if(state_fio->FgetUint32() != STATE_VERSION) {
155 // if(state_fio->FgetInt32() != this_device_id) {
158 // ctrl_reg = state_fio->FgetUint8();
159 // irq_status = state_fio->FgetBool();
163 bool SCSI::process_state(FILEIO* state_fio, bool loading)
165 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
168 if(!state_fio->StateCheckInt32(this_device_id)) {
171 state_fio->StateUint8(ctrl_reg);
172 state_fio->StateBool(irq_status);