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 | |