2 NEC PC-9801VX Emulator 'ePC-9801VX'
3 NEC PC-9801RA Emulator 'ePC-9801RA'
4 NEC PC-98XA Emulator 'ePC-98XA'
5 NEC PC-98XL Emulator 'ePC-98XL'
6 NEC PC-98RL Emulator 'ePC-98RL'
8 Author : Takeda.Toshiya
15 #include "../harddisk.h"
18 #include "../scsi_host.h"
19 #include "../scsi_hdd.h"
22 #define OCR_NRDSW 0x40
41 irq_status = drq_status = false;
44 void SASI::write_io8(uint32_t addr, uint32_t data)
48 #ifdef _SCSI_DEBUG_LOG
49 this->out_debug_log(_T("[SASI] out %04X %02X\n"), addr, data);
51 // if(ocr & OCR_CHEN) {
52 d_host->write_dma_io8(addr, data);
57 #ifdef _SCSI_DEBUG_LOG
58 this->out_debug_log(_T("[SASI] out %04X %02X\n"), addr, data);
60 d_host->write_signal(SIG_SCSI_RST, data, OCR_RST);
61 d_host->write_signal(SIG_SCSI_SEL, data, OCR_SEL);
67 uint32_t SASI::read_io8(uint32_t addr)
73 // if(ocr & OCR_CHEN) {
74 value = d_host->read_dma_io8(addr);
76 #ifdef _SCSI_DEBUG_LOG
77 this->out_debug_log(_T("[SASI] in %04X %02X\n"), addr, value);
83 value = (d_host->read_signal(SIG_SCSI_REQ) ? ISR_REQ : 0) |
84 // (d_host->read_signal(SIG_SCSI_ACK) ? ISR_ACK : 0) |
85 (d_host->read_signal(SIG_SCSI_BSY) ? ISR_BSY : 0) |
86 (d_host->read_signal(SIG_SCSI_MSG) ? ISR_MSG : 0) |
87 (d_host->read_signal(SIG_SCSI_CD ) ? ISR_CXD : 0) |
88 (d_host->read_signal(SIG_SCSI_IO ) ? ISR_IXO : 0) |
89 (irq_status ? ISR_INT : 0);
90 // irq_status = false;
91 #ifdef _SCSI_DEBUG_LOG
92 this->out_debug_log(_T("[SASI] in %04X %02X (REQ=%d,BSY=%d,MSG=%d,CxD=%d,IxO=%d,DH=%02X,DL=%02X)\n"), addr, value,
93 (value & ISR_REQ) ? 1 : 0,
94 (value & ISR_BSY) ? 1 : 0,
95 (value & ISR_MSG) ? 1 : 0,
96 (value & ISR_CXD) ? 1 : 0,
97 (value & ISR_IXO) ? 1 : 0,
98 vm->get_cpu(0)->read_debug_reg(_T("DH")), vm->get_cpu(0)->read_debug_reg(_T("DL")));
102 for(int i = 0; i < 2; i++) {
103 HARDDISK *unit = d_hdd->get_disk_handler(i);
104 uint32_t dt = 7, ct = 0;
106 if(unit != NULL && unit->mounted()) {
107 double size = unit->sector_num * unit->sector_size;
108 int size_mb = (int)(size / 1024.0 / 1024.0 + 0.5);
112 } else if(size_mb <= 11) {
114 } else if(size_mb <= 16) {
116 } else if(size_mb <= 21) {
117 if(unit->surfaces != 4) {
122 } else if(size_mb <= 31) {
127 if(unit->sector_size == 512) {
131 value |= dt << (i == 0 ? 3 : 0);
132 value |= ct << (i == 0 ? 7 : 6);
134 #ifdef _SCSI_DEBUG_LOG
135 this->out_debug_log(_T("[SASI] in %04X %02X (NRDSW=0)\n"), addr, value);
144 void SASI::write_dma_io8(uint32_t addr, uint32_t data)
146 write_io8(0x0080, data);
149 uint32_t SASI::read_dma_io8(uint32_t addr)
151 return read_io8(0x0080);
155 void SASI::write_signal(int id, uint32_t data, uint32_t mask)
159 #ifdef _SCSI_DEBUG_LOG
160 this->out_debug_log(_T("[SASI] IRQ=%d\n"), (data & mask) ? 1 : 0);
163 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR1, data, mask);
165 irq_status = ((data & mask) != 0);
169 #ifdef _SCSI_DEBUG_LOG
170 this->out_debug_log(_T("[SASI] DRQ=%d\n"), (data & mask) ? 1 : 0);
174 d_dma->write_signal(SIG_I8237_CH3, data, mask);
176 d_dma->write_signal(SIG_I8237_CH0, data, mask);
180 #ifdef _SCSI_DEBUG_LOG
181 this->out_debug_log(_T("[SASI] DMAE=0, change IRQ\n"));
183 write_signal(SIG_SASI_IRQ, data, mask);
186 drq_status = ((data & mask) != 0);
190 #ifdef _SCSI_DEBUG_LOG
191 this->out_debug_log(_T("[SASI] TC=%d\n"), (data & mask) ? 1 : 0);
200 #define STATE_VERSION 2
202 bool SASI::process_state(FILEIO* state_fio, bool loading)
204 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
207 if(!state_fio->StateCheckInt32(this_device_id)) {
210 state_fio->StateUint8(ocr);
211 state_fio->StateBool(irq_status);
212 state_fio->StateBool(drq_status);