From 4ec96d874aa39cf9260b63797a053932c5eb3349 Mon Sep 17 00:00:00 2001 From: angelosa Date: Tue, 28 Jul 2015 23:49:43 +0200 Subject: Banging my head over this ... --- src/emu/machine/segacdblock.c | 36 ++++++++++++++++++++++++------------ src/emu/machine/segacdblock.h | 1 + src/mess/drivers/saturn.c | 6 ++++-- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/emu/machine/segacdblock.c b/src/emu/machine/segacdblock.c index 0d39594c4ab..dd7b1dc11d4 100644 --- a/src/emu/machine/segacdblock.c +++ b/src/emu/machine/segacdblock.c @@ -215,15 +215,14 @@ READ32_MEMBER(segacdblock_device::datatrns32_r) res = -1; if(xfertype == CDDMA_INPROGRESS) { + //if(m_ext_drdy == false) + // return res; + //printf("%d %d %d %d\n",xfersect,xfersectnum,xferoffs,m_dma_size); if (xfersect < xfersectnum) { // get next longword - if(transpart->blocks[xfersectpos+xfersect] == (blockT *)NULL) - { - cd_drdy_cb(false); - return res; - } + //if(transpart->blocks[xfersectpos+xfersect] == (blockT *)NULL) res = (transpart->blocks[xfersectpos+xfersect]->data[xferoffs + 0]<<24) | (transpart->blocks[xfersectpos+xfersect]->data[xferoffs + 1]<<16) | @@ -787,13 +786,13 @@ void segacdblock_device::cd_cmd_init(UINT8 init_flags) void segacdblock_device::cd_cmd_end_transfer() { - m_TransferActive = false; - m_cd_state &= ~CD_STAT_TRANS; - if(m_dma_size != 0) { m_dr[0] = m_cd_state | ((m_dma_size >> 17) & 0xff); m_dr[1] = (m_dma_size>>1) & 0xffff; + + m_TransferActive = false; + m_cd_state &= ~CD_STAT_TRANS; } else { @@ -804,8 +803,10 @@ void segacdblock_device::cd_cmd_end_transfer() m_dr[2] = 0; m_dr[3] = 0; - if(DeleteSectorMode == true) + if(DeleteSectorMode == true && m_dma_size != 0) { + m_dma_size = 0; + if (transpart->size > 0) { INT32 i; @@ -857,7 +858,6 @@ void segacdblock_device::cd_cmd_end_transfer() else set_flag(EHST); - m_dma_size = 0; set_flag(CMOK); } @@ -1915,13 +1915,25 @@ void segacdblock_device::device_timer(emu_timer &timer, device_timer_id id, int printf("FAD %08x %08x %04x %d\n",m_FAD,m_FADEnd,m_hirq,p_ok); set_flag(CSCT); - cd_drdy_cb(true); + + printf("%d %d X\n",xfersect,xfersectnum); if(p_ok) { m_FAD ++; m_FADEnd --; - set_flag(SCDQ); + + if (xfersect < xfersectnum) + { + m_ext_drdy = false; + cd_drdy_cb(false); + } + else + { + m_ext_drdy = true; + cd_drdy_cb(true); + set_flag(SCDQ); + } if(m_FADEnd <= 0) { diff --git a/src/emu/machine/segacdblock.h b/src/emu/machine/segacdblock.h index 663043a3114..9d339256914 100644 --- a/src/emu/machine/segacdblock.h +++ b/src/emu/machine/segacdblock.h @@ -282,6 +282,7 @@ private: bool m_TempPause; bool m_TOCPhase; //bool m_BufferFull; + bool m_ext_drdy; void debug_cd_return_garbage_data(); }; diff --git a/src/mess/drivers/saturn.c b/src/mess/drivers/saturn.c index 3064efec461..bcad969d3a2 100644 --- a/src/mess/drivers/saturn.c +++ b/src/mess/drivers/saturn.c @@ -103,17 +103,19 @@ WRITE_LINE_MEMBER(sat_console_state::cd_drdy_write_cb) { m_cd_drdy_line = state; - if(state == true) +/* if(state == true) { m_maincpu->sh2_notify_dma_data_available(); m_slave->sh2_notify_dma_data_available(); - } + }*/ } SH2_DMA_FIFO_DATA_AVAILABLE_CB(sat_console_state::cdblock_data_available_callback) { if(src == 0x05818000) { + if(m_cd_drdy_line == false) + debugger_break(machine()); return m_cd_drdy_line; } else if((src & 0x07f00000) == 0x05800000) -- cgit v1.2.3