From c0b160ebf762aef24464b14e0946ea611e1a6e7c Mon Sep 17 00:00:00 2001 From: "K.Ohta" Date: Wed, 27 May 2020 03:36:49 +0900 Subject: [PATCH] [VM][FMTOWNS][CDROM] . --- source/src/vm/fmtowns/towns_cdrom.cpp | 57 +++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/source/src/vm/fmtowns/towns_cdrom.cpp b/source/src/vm/fmtowns/towns_cdrom.cpp index c78d668c1..addb18f85 100644 --- a/source/src/vm/fmtowns/towns_cdrom.cpp +++ b/source/src/vm/fmtowns/towns_cdrom.cpp @@ -636,19 +636,18 @@ void TOWNS_CDROM::write_signal(int id, uint32_t data, uint32_t mask) case SIG_TOWNS_CDROM_DMAINT: if((data & mask) != 0) { if(dma_transfer_phase) { -// dma_transfer_phase = false; clear_event(event_drq); clear_event(event_next_sector); clear_event(event_seek_completed); dma_transfer_phase = false; - set_dma_intr(true); if(read_length <= 0) { - set_status(true, 0, TOWNS_CD_STATUS_READ_DONE, 0x00, 0x00, 0x00); -// register_event(this, EVENT_CDROM_DMA_EOT, 100.0, false, &event_next_sector); - out_debug_log(_T("EOT(DMA)")); +// set_dma_intr(true); +// set_status(true, 0, TOWNS_CD_STATUS_READ_DONE, 0x00, 0x00, 0x00); + register_event(this, EVENT_CDROM_DMA_EOT, 10.0, false, &event_next_sector); + out_debug_log(_T("EOT(DMA)@SIGNAL")); } else { // dma_transfer_phase = false; -// set_dma_intr(true); + set_dma_intr(true); register_event(this, EVENT_CDROM_NEXT_SECTOR, 10.0, false, &event_next_sector); } @@ -786,7 +785,8 @@ void TOWNS_CDROM::execute_command(uint8_t command) && (toc_table[current_track].is_audio)) { // OK? playcode = (media_changed) ? 0x09 : 0x03; } else { - playcode = (media_changed) ? 0x09 : 0x01; +// playcode = (media_changed) ? 0x09 : 0x01; + playcode = (media_changed) ? 0x09 : 0x00; } media_changed = false; out_debug_log(_T("CMD SET STATE(%02X) PARAM=%02X %02X %02X %02X %02X %02X %02X %02X REPLY=%d"), @@ -1406,19 +1406,11 @@ void TOWNS_CDROM::event_callback(int event_id, int err) // BIOS FDDFCh(0FC0h:01FCh)- //pio_transfer_phase = false; //dma_transfer_phase = false; - if(pio_transfer) { - if(read_length <= 0) { - out_debug_log(_T("EOT")); - set_status(true, 0, TOWNS_CD_STATUS_READ_DONE, 0x00, 0x00, 0x00); - set_dma_intr(true); - break; - } - } pio_transfer_phase = pio_transfer; dma_transfer_phase = dma_transfer; -// if(read_length > 0) { - if(((cdrom_prefetch) && (buffer->left() >= logical_block_size())) || - (buffer->empty())) { + if(read_length > 0) { +// if(((cdrom_prefetch) && (buffer->left() >= logical_block_size())) || +// (buffer->empty())) { out_debug_log(_T("READ NEXT SECTOR")); if(pio_transfer) { set_status(true, 0, TOWNS_CD_STATUS_CMD_ABEND, 0x00, 0x00, 0x00); // OK? @@ -1428,17 +1420,37 @@ void TOWNS_CDROM::event_callback(int event_id, int err) //set_dma_intr(true); } // set_status(true, 0, TOWNS_CD_STATUS_DATA_READY, 0x00, 0x00, 0x00); - register_event(this, EVENT_CDROM_SEEK_COMPLETED, + register_event(this, EVENT_CDROM_SEEK_COMPLETED, (1.0e6 / ((double)transfer_speed * 150.0e3)) * /*16.0*/ 1.0, // OK? false, &event_seek_completed); + } else if((read_length <= 0) && (dma_transfer)) { +// set_status(true, 0, TOWNS_CD_STATUS_READ_DONE, 0x00, 0x00, 0x00); + mcu_intr = false; + dma_transfer_phase = false; + set_dma_intr(true); + out_debug_log(_T("EOT(DMA)@READ SECTOR")); + } else if((pio_transfer) && (read_length <= 0)) { + pio_transfer_phase = false; + out_debug_log(_T("EOT@PIO")); + set_status(true, 0, TOWNS_CD_STATUS_READ_DONE, 0x00, 0x00, 0x00); + set_dma_intr(true); } - break; case EVENT_CDROM_DMA_EOT: event_next_sector = -1; if(read_length <= 0) { +// dma_transfer_phase = false; +// status_queue->clear(); +// extra_status = 0; +// status_queue->write(TOWNS_CD_STATUS_READ_DONE); +// status_queue->write(0x00); +// status_queue->write(0x00); +// status_queue->write(0x00); +// mcu_intr = false; +// set_dma_intr(true); + pio_transfer_phase = false; dma_transfer_phase = false; - out_debug_log(_T("EOT(DMA)")); + out_debug_log(_T("EOT(DMA)@EVENT_CDROM_DMA_EOT")); set_dma_intr(true); set_status(true, 0, TOWNS_CD_STATUS_READ_DONE, 0x00, 0x00, 0x00); } @@ -2676,7 +2688,7 @@ void TOWNS_CDROM::write_io8(uint32_t addr, uint32_t data) dma_intr_mask = ((data & 0x01) == 0) ? true : false; if((data & 0x80) != 0) { if(mcu_intr) set_mcu_intr(false); - +/* switch(latest_command & 0x9f) { case CDROM_COMMAND_READ_MODE2: case CDROM_COMMAND_READ_MODE1: @@ -2691,6 +2703,7 @@ void TOWNS_CDROM::write_io8(uint32_t addr, uint32_t data) } break; } +*/ } if((data & 0x40) != 0) { if(dma_intr) set_dma_intr(false); -- 2.11.0