summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <salese_corp_ltd@email.it>2015-07-28 23:05:41 +0200
committer angelosa <salese_corp_ltd@email.it>2015-07-28 23:05:41 +0200
commita7f78448034a4c7c17ac5a2f28b8c9b9b125656d (patch)
treea2767639aa80a431ab75ca20655f4091c61b83bb
parent5d942931ec7610dcc71b3a759f4e422b495ca34b (diff)
Right idea, wrong place.
-rw-r--r--src/emu/machine/segacdblock.c20
-rw-r--r--src/emu/machine/segacdblock.h7
-rw-r--r--src/mess/drivers/saturn.c28
3 files changed, 45 insertions, 10 deletions
diff --git a/src/emu/machine/segacdblock.c b/src/emu/machine/segacdblock.c
index 270cf865ade..0d39594c4ab 100644
--- a/src/emu/machine/segacdblock.c
+++ b/src/emu/machine/segacdblock.c
@@ -215,10 +215,16 @@ READ32_MEMBER(segacdblock_device::datatrns32_r)
res = -1;
if(xfertype == CDDMA_INPROGRESS)
{
- printf("%d %d %d %d\n",xfersect,xfersectnum,xferoffs,m_dma_size);
+ //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;
+ }
+
res = (transpart->blocks[xfersectpos+xfersect]->data[xferoffs + 0]<<24) |
(transpart->blocks[xfersectpos+xfersect]->data[xferoffs + 1]<<16) |
(transpart->blocks[xfersectpos+xfersect]->data[xferoffs + 2]<<8) |
@@ -343,7 +349,8 @@ MACHINE_CONFIG_END
segacdblock_device::segacdblock_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, SEGACDBLOCK, "Sega Saturn CD-Block (HLE)", tag, owner, clock, "segacdblock", __FILE__),
device_memory_interface(mconfig, *this),
- m_space_config("segacdblock", ENDIANNESS_BIG, 32,20, 0, NULL, *ADDRESS_MAP_NAME(map))
+ m_space_config("segacdblock", ENDIANNESS_BIG, 32,20, 0, NULL, *ADDRESS_MAP_NAME(map)),
+ cd_drdy_cb(*this)
{
}
@@ -1889,9 +1896,6 @@ void segacdblock_device::device_timer(emu_timer &timer, device_timer_id id, int
{
UINT8 p_ok;
- if(m_FADEnd)
- printf("FAD %08x %08x %04x\n",m_FAD,m_FADEnd,m_hirq);
-
p_ok = 0;
if (cdrom)
{
@@ -1906,8 +1910,12 @@ void segacdblock_device::device_timer(emu_timer &timer, device_timer_id id, int
//machine().device<cdda_device>("cdda")->start_audio(cd_curfad, 1);
}
}
+
+ if(m_FADEnd)
+ printf("FAD %08x %08x %04x %d\n",m_FAD,m_FADEnd,m_hirq,p_ok);
set_flag(CSCT);
+ cd_drdy_cb(true);
if(p_ok)
{
@@ -1974,6 +1982,8 @@ void segacdblock_device::device_start()
m_peri_timer = timer_alloc(PERI_TIMER);
m_cmd_timer = timer_alloc(CMD_TIMER);
m_cd_timer = timer_alloc(CD_TIMER);
+ cd_drdy_cb.resolve_safe();
+
m_DMABuffer = auto_alloc_array_clear(machine(), UINT8, 2352);
}
diff --git a/src/emu/machine/segacdblock.h b/src/emu/machine/segacdblock.h
index 3f7cc3ba634..663043a3114 100644
--- a/src/emu/machine/segacdblock.h
+++ b/src/emu/machine/segacdblock.h
@@ -23,6 +23,10 @@ Sega Saturn CD-Block HLE device implementation
#define MCFG_SEGACDBLOCK_ADD(_tag,_freq) \
MCFG_DEVICE_ADD(_tag, SEGACDBLOCK, _freq)
+#define MCFG_SEGACDBLOCK_DRDY_CALLBACK(_devcb) \
+ devcb = &segacdblock_device::set_cd_drdy_cb(*device, DEVCB_##_devcb);
+
+
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -59,6 +63,8 @@ public:
DECLARE_READ16_MEMBER( datatrns_r );
DECLARE_READ32_MEMBER( datatrns32_r );
+ template<class _Object> static devcb_base &set_cd_drdy_cb(device_t &device, _Object object) { return downcast<segacdblock_device &>(device).cd_drdy_cb.set_callback(object); }
+
protected:
// device-level overrides
virtual void device_validity_check(validity_checker &valid) const;
@@ -75,6 +81,7 @@ private:
static const device_timer_id PERI_TIMER = 0;
static const device_timer_id CMD_TIMER = 1;
static const device_timer_id CD_TIMER = 2;
+ devcb_write_line cd_drdy_cb;
UINT16 m_cr[4];
UINT16 m_dr[4];
diff --git a/src/mess/drivers/saturn.c b/src/mess/drivers/saturn.c
index b5833cea8cf..3064efec461 100644
--- a/src/mess/drivers/saturn.c
+++ b/src/mess/drivers/saturn.c
@@ -48,6 +48,7 @@ test1f diagnostic hacks:
#include "imagedev/chd_cd.h"
#include "coreutil.h"
#include "machine/segacdblock.h"
+#include "debugger.h"
#include "bus/saturn/sat_slot.h"
#include "bus/saturn/rom.h"
@@ -80,14 +81,16 @@ public:
DECLARE_READ32_MEMBER(saturn_null_ram_r);
DECLARE_WRITE32_MEMBER(saturn_null_ram_w);
DECLARE_WRITE32_MEMBER(astal_cache_hack_w);
-
+ DECLARE_WRITE_LINE_MEMBER(cd_drdy_write_cb);
+
void saturn_init_driver(int rgn);
DECLARE_DRIVER_INIT(saturnus);
DECLARE_DRIVER_INIT(saturneu);
DECLARE_DRIVER_INIT(saturnjp);
SH2_DMA_FIFO_DATA_AVAILABLE_CB(cdblock_data_available_callback);
-
+ bool m_cd_drdy_line;
+
void nvram_init(nvram_device &nvram, void *data, size_t size);
required_device<sat_cart_slot_device> m_exp;
@@ -96,15 +99,29 @@ public:
required_device<segacdblock_device> m_cdblock;
};
+WRITE_LINE_MEMBER(sat_console_state::cd_drdy_write_cb)
+{
+ m_cd_drdy_line = state;
+
+ 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)
{
- return 0;
+ return m_cd_drdy_line;
}
else if((src & 0x07f00000) == 0x05800000)
- printf("DMA callback %08x\n",src);
-
+ {
+ printf("CD Block SH-2 DMA callback %08x\n",src);
+ debugger_break(machine());
+ }
+
return 1;
}
@@ -755,6 +772,7 @@ static MACHINE_CONFIG_START( saturn, sat_console_state )
MCFG_NVRAM_ADD_0FILL("smpc_nv") // TODO: default for each region (+ move it inside SMPC when converted to device)
MCFG_SEGACDBLOCK_ADD("sh1_hle", 0) // 150, @todo
+ MCFG_SEGACDBLOCK_DRDY_CALLBACK(WRITELINE(sat_console_state,cd_drdy_write_cb))
//MCFG_TIMER_DRIVER_ADD("sector_timer", sat_console_state, stv_sector_cb)
//MCFG_TIMER_DRIVER_ADD("sh1_cmd", sat_console_state, stv_sh1_sim)