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
39 irq_status = drq_status = false;
42 void SASI::write_io8(uint32_t addr, uint32_t data)
46 #ifdef _SCSI_DEBUG_LOG
47 this->out_debug_log(_T("[SASI] out %04X %02X\n"), addr, data);
49 // if(ocr & OCR_CHEN) {
50 d_host->write_dma_io8(addr, data);
55 #ifdef _SCSI_DEBUG_LOG
56 this->out_debug_log(_T("[SASI] out %04X %02X\n"), addr, data);
58 d_host->write_signal(SIG_SCSI_RST, data, OCR_RST);
59 d_host->write_signal(SIG_SCSI_SEL, data, OCR_SEL);
65 uint32_t SASI::read_io8(uint32_t addr)
71 // if(ocr & OCR_CHEN) {
72 value = d_host->read_dma_io8(addr);
74 #ifdef _SCSI_DEBUG_LOG
75 this->out_debug_log(_T("[SASI] in %04X %02X\n"), addr, value);
81 value = (d_host->read_signal(SIG_SCSI_REQ) ? ISR_REQ : 0) |
82 // (d_host->read_signal(SIG_SCSI_ACK) ? ISR_ACK : 0) |
83 (d_host->read_signal(SIG_SCSI_BSY) ? ISR_BSY : 0) |
84 (d_host->read_signal(SIG_SCSI_MSG) ? ISR_MSG : 0) |
85 (d_host->read_signal(SIG_SCSI_CD ) ? ISR_CXD : 0) |
86 (d_host->read_signal(SIG_SCSI_IO ) ? ISR_IXO : 0) |
87 (irq_status ? ISR_INT : 0);
88 // irq_status = false;
89 #ifdef _SCSI_DEBUG_LOG
90 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,
91 (value & ISR_REQ) ? 1 : 0,
92 (value & ISR_BSY) ? 1 : 0,
93 (value & ISR_MSG) ? 1 : 0,
94 (value & ISR_CXD) ? 1 : 0,
95 (value & ISR_IXO) ? 1 : 0,
96 vm->get_cpu(0)->read_debug_reg(_T("DH")), vm->get_cpu(0)->read_debug_reg(_T("DL")));
100 for(int i = 0; i < 2; i++) {
101 HARDDISK *unit = d_hdd->get_disk_handler(i);
102 uint32_t dt = 7, ct = 0;
104 if(unit != NULL && unit->mounted()) {
105 double size = unit->sector_num * unit->sector_size;
106 int size_mb = (int)(size / 1024.0 / 1024.0 + 0.5);
110 } else if(size_mb <= 11) {
112 } else if(size_mb <= 16) {
114 } else if(size_mb <= 21) {
115 if(unit->surfaces != 4) {
120 } else if(size_mb <= 31) {
125 if(unit->sector_size == 512) {
129 value |= dt << (i == 0 ? 3 : 0);
130 value |= ct << (i == 0 ? 7 : 6);
132 #ifdef _SCSI_DEBUG_LOG
133 this->out_debug_log(_T("[SASI] in %04X %02X (NRDSW=0)\n"), addr, value);
142 void SASI::write_dma_io8(uint32_t addr, uint32_t data)
144 write_io8(0x0080, data);
147 uint32_t SASI::read_dma_io8(uint32_t addr)
149 return read_io8(0x0080);
153 void SASI::write_signal(int id, uint32_t data, uint32_t mask)
157 #ifdef _SCSI_DEBUG_LOG
158 this->out_debug_log(_T("[SASI] IRQ=%d\n"), (data & mask) ? 1 : 0);
161 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR1, data, mask);
163 irq_status = ((data & mask) != 0);
167 #ifdef _SCSI_DEBUG_LOG
168 this->out_debug_log(_T("[SASI] DRQ=%d\n"), (data & mask) ? 1 : 0);
172 d_dma->write_signal(SIG_I8237_CH3, data, mask);
174 d_dma->write_signal(SIG_I8237_CH0, data, mask);
178 #ifdef _SCSI_DEBUG_LOG
179 this->out_debug_log(_T("[SASI] DMAE=0, change IRQ\n"));
181 write_signal(SIG_SASI_IRQ, data, mask);
184 drq_status = ((data & mask) != 0);
188 #ifdef _SCSI_DEBUG_LOG
189 this->out_debug_log(_T("[SASI] TC=%d\n"), (data & mask) ? 1 : 0);
198 #define STATE_VERSION 2
200 bool SASI::process_state(FILEIO* state_fio, bool loading)
202 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
205 if(!state_fio->StateCheckInt32(this_device_id)) {
208 state_fio->StateUint8(ocr);
209 state_fio->StateBool(irq_status);
210 state_fio->StateBool(drq_status);