branches/saturn_cdblock/src/emu/machine/segacdblock.c
| r248531 | r248532 | |
| 215 | 215 | res = -1; |
| 216 | 216 | if(xfertype == CDDMA_INPROGRESS) |
| 217 | 217 | { |
| 218 | | printf("%d %d %d %d\n",xfersect,xfersectnum,xferoffs,m_dma_size); |
| 218 | //printf("%d %d %d %d\n",xfersect,xfersectnum,xferoffs,m_dma_size); |
| 219 | 219 | if (xfersect < xfersectnum) |
| 220 | 220 | { |
| 221 | 221 | // get next longword |
| 222 | if(transpart->blocks[xfersectpos+xfersect] == (blockT *)NULL) |
| 223 | { |
| 224 | cd_drdy_cb(false); |
| 225 | return res; |
| 226 | } |
| 227 | |
| 222 | 228 | res = (transpart->blocks[xfersectpos+xfersect]->data[xferoffs + 0]<<24) | |
| 223 | 229 | (transpart->blocks[xfersectpos+xfersect]->data[xferoffs + 1]<<16) | |
| 224 | 230 | (transpart->blocks[xfersectpos+xfersect]->data[xferoffs + 2]<<8) | |
| r248531 | r248532 | |
| 343 | 349 | segacdblock_device::segacdblock_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 344 | 350 | : device_t(mconfig, SEGACDBLOCK, "Sega Saturn CD-Block (HLE)", tag, owner, clock, "segacdblock", __FILE__), |
| 345 | 351 | device_memory_interface(mconfig, *this), |
| 346 | | m_space_config("segacdblock", ENDIANNESS_BIG, 32,20, 0, NULL, *ADDRESS_MAP_NAME(map)) |
| 352 | m_space_config("segacdblock", ENDIANNESS_BIG, 32,20, 0, NULL, *ADDRESS_MAP_NAME(map)), |
| 353 | cd_drdy_cb(*this) |
| 347 | 354 | { |
| 348 | 355 | } |
| 349 | 356 | |
| r248531 | r248532 | |
| 1889 | 1896 | { |
| 1890 | 1897 | UINT8 p_ok; |
| 1891 | 1898 | |
| 1892 | | if(m_FADEnd) |
| 1893 | | printf("FAD %08x %08x %04x\n",m_FAD,m_FADEnd,m_hirq); |
| 1894 | | |
| 1895 | 1899 | p_ok = 0; |
| 1896 | 1900 | if (cdrom) |
| 1897 | 1901 | { |
| r248531 | r248532 | |
| 1906 | 1910 | //machine().device<cdda_device>("cdda")->start_audio(cd_curfad, 1); |
| 1907 | 1911 | } |
| 1908 | 1912 | } |
| 1913 | |
| 1914 | if(m_FADEnd) |
| 1915 | printf("FAD %08x %08x %04x %d\n",m_FAD,m_FADEnd,m_hirq,p_ok); |
| 1909 | 1916 | |
| 1910 | 1917 | set_flag(CSCT); |
| 1918 | cd_drdy_cb(true); |
| 1911 | 1919 | |
| 1912 | 1920 | if(p_ok) |
| 1913 | 1921 | { |
| r248531 | r248532 | |
| 1974 | 1982 | m_peri_timer = timer_alloc(PERI_TIMER); |
| 1975 | 1983 | m_cmd_timer = timer_alloc(CMD_TIMER); |
| 1976 | 1984 | m_cd_timer = timer_alloc(CD_TIMER); |
| 1985 | cd_drdy_cb.resolve_safe(); |
| 1986 | |
| 1977 | 1987 | m_DMABuffer = auto_alloc_array_clear(machine(), UINT8, 2352); |
| 1978 | 1988 | } |
| 1979 | 1989 | |
branches/saturn_cdblock/src/emu/machine/segacdblock.h
| r248531 | r248532 | |
| 23 | 23 | #define MCFG_SEGACDBLOCK_ADD(_tag,_freq) \ |
| 24 | 24 | MCFG_DEVICE_ADD(_tag, SEGACDBLOCK, _freq) |
| 25 | 25 | |
| 26 | #define MCFG_SEGACDBLOCK_DRDY_CALLBACK(_devcb) \ |
| 27 | devcb = &segacdblock_device::set_cd_drdy_cb(*device, DEVCB_##_devcb); |
| 28 | |
| 29 | |
| 26 | 30 | //************************************************************************** |
| 27 | 31 | // TYPE DEFINITIONS |
| 28 | 32 | //************************************************************************** |
| r248531 | r248532 | |
| 59 | 63 | DECLARE_READ16_MEMBER( datatrns_r ); |
| 60 | 64 | DECLARE_READ32_MEMBER( datatrns32_r ); |
| 61 | 65 | |
| 66 | 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); } |
| 67 | |
| 62 | 68 | protected: |
| 63 | 69 | // device-level overrides |
| 64 | 70 | virtual void device_validity_check(validity_checker &valid) const; |
| r248531 | r248532 | |
| 75 | 81 | static const device_timer_id PERI_TIMER = 0; |
| 76 | 82 | static const device_timer_id CMD_TIMER = 1; |
| 77 | 83 | static const device_timer_id CD_TIMER = 2; |
| 84 | devcb_write_line cd_drdy_cb; |
| 78 | 85 | |
| 79 | 86 | UINT16 m_cr[4]; |
| 80 | 87 | UINT16 m_dr[4]; |
branches/saturn_cdblock/src/mess/drivers/saturn.c
| r248531 | r248532 | |
| 48 | 48 | #include "imagedev/chd_cd.h" |
| 49 | 49 | #include "coreutil.h" |
| 50 | 50 | #include "machine/segacdblock.h" |
| 51 | #include "debugger.h" |
| 51 | 52 | |
| 52 | 53 | #include "bus/saturn/sat_slot.h" |
| 53 | 54 | #include "bus/saturn/rom.h" |
| r248531 | r248532 | |
| 80 | 81 | DECLARE_READ32_MEMBER(saturn_null_ram_r); |
| 81 | 82 | DECLARE_WRITE32_MEMBER(saturn_null_ram_w); |
| 82 | 83 | DECLARE_WRITE32_MEMBER(astal_cache_hack_w); |
| 83 | | |
| 84 | DECLARE_WRITE_LINE_MEMBER(cd_drdy_write_cb); |
| 85 | |
| 84 | 86 | void saturn_init_driver(int rgn); |
| 85 | 87 | DECLARE_DRIVER_INIT(saturnus); |
| 86 | 88 | DECLARE_DRIVER_INIT(saturneu); |
| 87 | 89 | DECLARE_DRIVER_INIT(saturnjp); |
| 88 | 90 | |
| 89 | 91 | SH2_DMA_FIFO_DATA_AVAILABLE_CB(cdblock_data_available_callback); |
| 90 | | |
| 92 | bool m_cd_drdy_line; |
| 93 | |
| 91 | 94 | void nvram_init(nvram_device &nvram, void *data, size_t size); |
| 92 | 95 | |
| 93 | 96 | required_device<sat_cart_slot_device> m_exp; |
| r248531 | r248532 | |
| 96 | 99 | required_device<segacdblock_device> m_cdblock; |
| 97 | 100 | }; |
| 98 | 101 | |
| 102 | WRITE_LINE_MEMBER(sat_console_state::cd_drdy_write_cb) |
| 103 | { |
| 104 | m_cd_drdy_line = state; |
| 105 | |
| 106 | if(state == true) |
| 107 | { |
| 108 | m_maincpu->sh2_notify_dma_data_available(); |
| 109 | m_slave->sh2_notify_dma_data_available(); |
| 110 | } |
| 111 | } |
| 112 | |
| 99 | 113 | SH2_DMA_FIFO_DATA_AVAILABLE_CB(sat_console_state::cdblock_data_available_callback) |
| 100 | 114 | { |
| 101 | 115 | if(src == 0x05818000) |
| 102 | 116 | { |
| 103 | | return 0; |
| 117 | return m_cd_drdy_line; |
| 104 | 118 | } |
| 105 | 119 | else if((src & 0x07f00000) == 0x05800000) |
| 106 | | printf("DMA callback %08x\n",src); |
| 107 | | |
| 120 | { |
| 121 | printf("CD Block SH-2 DMA callback %08x\n",src); |
| 122 | debugger_break(machine()); |
| 123 | } |
| 124 | |
| 108 | 125 | return 1; |
| 109 | 126 | } |
| 110 | 127 | |
| r248531 | r248532 | |
| 755 | 772 | MCFG_NVRAM_ADD_0FILL("smpc_nv") // TODO: default for each region (+ move it inside SMPC when converted to device) |
| 756 | 773 | |
| 757 | 774 | MCFG_SEGACDBLOCK_ADD("sh1_hle", 0) // 150, @todo |
| 775 | MCFG_SEGACDBLOCK_DRDY_CALLBACK(WRITELINE(sat_console_state,cd_drdy_write_cb)) |
| 758 | 776 | //MCFG_TIMER_DRIVER_ADD("sector_timer", sat_console_state, stv_sector_cb) |
| 759 | 777 | //MCFG_TIMER_DRIVER_ADD("sh1_cmd", sat_console_state, stv_sh1_sim) |
| 760 | 778 | |