summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <salese_corp_ltd@email.it>2015-07-28 23:49:43 +0200
committer angelosa <salese_corp_ltd@email.it>2015-07-28 23:49:43 +0200
commit4ec96d874aa39cf9260b63797a053932c5eb3349 (patch)
treedffb1f3acca93c492bb72f4e66820c81dceea410
parenta7f78448034a4c7c17ac5a2f28b8c9b9b125656d (diff)
Banging my head over this ...
-rw-r--r--src/emu/machine/segacdblock.c36
-rw-r--r--src/emu/machine/segacdblock.h1
-rw-r--r--src/mess/drivers/saturn.c6
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)