diff options
| -rw-r--r-- | src/emu/machine/segacdblock.c | 20 | ||||
| -rw-r--r-- | src/emu/machine/segacdblock.h | 7 | ||||
| -rw-r--r-- | src/mess/drivers/saturn.c | 28 |
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) |
