From 98d626e378d69e2b1e9430a62b708aca3f760b84 Mon Sep 17 00:00:00 2001 From: "K.Ohta" Date: Wed, 5 Jun 2019 20:21:08 +0900 Subject: [PATCH] [VM][UPD765A] Revert some commits excepts workaround for RELOCS/PC9801.Fix not detect floppy drives by PC-9801's BIOS at bootup. --- source/src/vm/upd765a.cpp | 69 +++++++++++------------------------------------ source/src/vm/upd765a.h | 3 +-- 2 files changed, 17 insertions(+), 55 deletions(-) diff --git a/source/src/vm/upd765a.cpp b/source/src/vm/upd765a.cpp index 1cbdabb91..53e2de427 100644 --- a/source/src/vm/upd765a.cpp +++ b/source/src/vm/upd765a.cpp @@ -300,7 +300,7 @@ void UPD765A::write_io8(uint32_t addr, uint32_t data) case PHASE_IDLE: //#ifdef _FDC_DEBUG_LOG if(_fdc_debug_log) { - this->out_debug_log(_T("FDC: CMD=%2X %s C H R N = %02X %02X %02X %02X\n"), data, get_command_name(data), id[0], id[1], id[2], id[3]); + this->out_debug_log(_T("FDC: CMD=%2x %s\n"), data, get_command_name(data)); } //#endif command = data; @@ -563,7 +563,6 @@ void UPD765A::set_irq(bool val) // if(_fdc_debug_log) this->out_debug_log(_T("FDC: IRQ=%d\n"), val ? 1 : 0); //#endif write_signals(&outputs_irq, (val && !irq_masked) ? 0xffffffff : 0); - interrupt_on = val; } void UPD765A::set_drq(bool val) @@ -598,7 +597,6 @@ void UPD765A::set_drq(bool val) } if(no_dma_mode) { write_signals(&outputs_irq, (val && !irq_masked) ? 0xffffffff : 0); - interrupt_on = (val && !irq_masked) ? true: false; } else { write_signals(&outputs_drq, (val && !drq_masked) ? 0xffffffff : 0); //#ifdef UPD765A_DMA_MODE @@ -690,43 +688,20 @@ void UPD765A::cmd_sence_devstat() set_hdu(buffer[0]); buffer[0] = get_devstat(buffer[0] & DRIVE_MASK); shift_to_result(1); - status = S_RQM | S_CB | S_DIO; - break; - default: - status = S_RQM; break; } } void UPD765A::cmd_sence_intstat() { - status = S_RQM | S_CB | S_DIO; - if(interrupt_on) { - if(fdc[hdu & DRIVE_MASK].result != 0) { - buffer[0] = (uint8_t)fdc[hdu & DRIVE_MASK].result; - buffer[1] = (uint8_t)fdc[hdu & DRIVE_MASK].track; - fdc[hdu & DRIVE_MASK].result = 0; + for(int i = 0; i < 4; i++) { + if(fdc[i].result) { + buffer[0] = (uint8_t)fdc[i].result; + buffer[1] = (uint8_t)fdc[i].track; + fdc[i].result = 0; shift_to_result(2); - } else { - for(int i = 0; i < 4; i++) { - if(fdc[i].result != 0) { - buffer[0] = (uint8_t)fdc[i].result; - buffer[1] = (uint8_t)fdc[i].track; - fdc[i].result = 0; - shift_to_result(2); - break; - } - } - } - bool result = false; - for(int i = 0; i < 4; i++) { - result |= (fdc[i].result != 0); - } - if(!(result)) { - set_irq(false); + return; } -// status &= ~S_CB; - return; } //#ifdef UPD765A_SENCE_INTSTAT_RESULT // IBM PC/JX @@ -866,7 +841,6 @@ void UPD765A::cmd_read_data() break; } read_data((command & 0x1f) == 12, false); - if(_fdc_debug_log) this->out_debug_log(_T("READ DATA EXEC RESULT=%02X\n"), result); break; case PHASE_READ: if(result) { @@ -1047,12 +1021,10 @@ void UPD765A::read_data(bool deleted, bool scan) { result = check_cond(false); if(result & ST1_MA) { - if(_fdc_debug_log) this->out_debug_log(_T("RESULT=%02X MA=1\n"), result); REGISTER_PHASE_EVENT(PHASE_EXEC, 10000); return; } if(result) { - if(_fdc_debug_log) this->out_debug_log(_T("RESULT=%02X\n"), result); shift_to_result7(); return; } @@ -1069,7 +1041,6 @@ void UPD765A::read_data(bool deleted, bool scan) return; } int length = (id[3] & 7) ? (0x80 << (id[3] & 7)) : (min(dtl, 0x80)); - //int length = 0x80 << (id[3] & 7); if(!scan) { shift_to_read(length); } else { @@ -1149,9 +1120,9 @@ uint32_t UPD765A::read_sector() return ST0_AT | ST1_MA; } // Note: Temporally disable below check.RELICS (for PC-9801) works. 20190604 K.O -// if((command & 0x40) != (disk[drv]->track_mfm ? 0x40 : 0)) { -// return ST0_AT | ST1_MA; -// } + //if((command & 0x40) != (disk[drv]->track_mfm ? 0x40 : 0)) { + // return ST0_AT | ST1_MA; + //} int secnum = disk[drv]->sector_num.sd; if(!secnum) { //#ifdef _FDC_DEBUG_LOG @@ -1165,7 +1136,7 @@ uint32_t UPD765A::read_sector() continue; } cy = disk[drv]->id[0]; -#if 1 +#if 0 if(disk[drv]->id[0] != id[0] || disk[drv]->id[1] != id[1] || disk[drv]->id[2] != id[2] /*|| disk[drv]->id[3] != id[3]*/) { #else if(disk[drv]->id[0] != id[0] || disk[drv]->id[1] != id[1] || disk[drv]->id[2] != id[2] || disk[drv]->id[3] != id[3]) { @@ -1173,7 +1144,7 @@ uint32_t UPD765A::read_sector() continue; } //#ifdef _FDC_DEBUG_LOG - if(_fdc_debug_log) this->out_debug_log(_T("FDC: SECTOR FOUND (TRK=%d SIDE=%d ID=%2x,%2x,%2x,%2x CRC=%02X%02X %s)\n"), trk, side, disk[drv]->id[0], disk[drv]->id[1], disk[drv]->id[2], disk[drv]->id[3], disk[drv]->id[4], disk[drv]->id[5], (disk[drv]->deleted) ? _T("DELETED"): _T("")); + if(_fdc_debug_log) this->out_debug_log(_T("FDC: SECTOR FOUND (TRK=%d SIDE=%d ID=%2x,%2x,%2x,%2x)\n"), trk, side, id[0], id[1], id[2], id[3]); //#endif if(disk[drv]->sector_size.sd == 0) { continue; @@ -1321,7 +1292,6 @@ void UPD765A::get_sector_params() eot = buffer[5]; gpl = buffer[6]; dtl = buffer[7]; - if(_fdc_debug_log) this->out_debug_log(_T("get_sector_params() CHRN=%02X %02X %02X %02X EOT=%02X GPL=%02X DTL=%02X\n"), id[0], id[1], id[2], id[3], eot, gpl, dtl); } bool UPD765A::id_incr() @@ -1341,9 +1311,6 @@ bool UPD765A::id_incr() id[1] ^= 1; if(id[1] & 1) { return true; - } else { - id[0]++; - return true; } } id[0]++; @@ -1367,8 +1334,8 @@ void UPD765A::cmd_read_id() break; } if(check_cond(false) & ST1_MA) { - REGISTER_PHASE_EVENT(PHASE_EXEC, 1000000); - break; +// REGISTER_PHASE_EVENT(PHASE_EXEC, 1000000); +// break; } if((result = read_id()) == 0) { int drv = hdu & DRIVE_MASK; @@ -1503,10 +1470,7 @@ void UPD765A::cmd_specify() head_unload_time = buffer[1] >> 1; no_dma_mode = ((buffer[1] & 1) != 0); shift_to_idle(); - status = S_RQM;//0xff; - break; - default: - status = S_RQM; + status = 0x80;//0xff; break; } } @@ -1871,7 +1835,7 @@ bool UPD765A::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len) } //#endif -#define STATE_VERSION 4 +#define STATE_VERSION 3 bool UPD765A::process_state(FILEIO* state_fio, bool loading) { @@ -1937,7 +1901,6 @@ bool UPD765A::process_state(FILEIO* state_fio, bool loading) state_fio->StateValue(reset_signal); state_fio->StateValue(prev_index); state_fio->StateValue(prev_drq_clock); - state_fio->StateValue(interrupt_on); return true; } diff --git a/source/src/vm/upd765a.h b/source/src/vm/upd765a.h index 08f386e26..2348a3236 100644 --- a/source/src/vm/upd765a.h +++ b/source/src/vm/upd765a.h @@ -78,8 +78,7 @@ private: bool force_ready; bool reset_signal; bool prev_index; - bool interrupt_on; - + int _max_drive; bool _fdc_debug_log; bool _upd765a_dma_mode; -- 2.11.0