diff options
Diffstat (limited to 'src/mame/drivers/cobra.c')
-rw-r--r-- | src/mame/drivers/cobra.c | 240 |
1 files changed, 119 insertions, 121 deletions
diff --git a/src/mame/drivers/cobra.c b/src/mame/drivers/cobra.c index 406264ee872..c6a1a45e8d4 100644 --- a/src/mame/drivers/cobra.c +++ b/src/mame/drivers/cobra.c @@ -630,13 +630,14 @@ public: DECLARE_READ64_MEMBER(main_comram_r); DECLARE_WRITE64_MEMBER(main_comram_w); DECLARE_READ64_MEMBER(main_fifo_r); - DECLARE_WRITE64_MEMBER(main_fifo_w); - DECLARE_READ64_MEMBER(main_mpc106_r); - DECLARE_WRITE64_MEMBER(main_mpc106_w); - - DECLARE_READ32_MEMBER(sub_comram_r); - DECLARE_WRITE32_MEMBER(sub_comram_w); - DECLARE_READ32_MEMBER(sub_sound_r); + DECLARE_WRITE64_MEMBER(main_fifo_w);
+ DECLARE_READ64_MEMBER(main_mpc106_r);
+ DECLARE_WRITE64_MEMBER(main_mpc106_w);
+ DECLARE_WRITE32_MEMBER(main_cpu_dc_store);
+
+ DECLARE_READ32_MEMBER(sub_comram_r);
+ DECLARE_WRITE32_MEMBER(sub_comram_w);
+ DECLARE_READ32_MEMBER(sub_sound_r);
DECLARE_WRITE32_MEMBER(sub_sound_w); DECLARE_READ32_MEMBER(sub_unk7e_r); DECLARE_WRITE32_MEMBER(sub_debug_w); @@ -650,21 +651,25 @@ public: DECLARE_WRITE16_MEMBER(sub_ata0_w); DECLARE_READ16_MEMBER(sub_ata1_r); DECLARE_WRITE16_MEMBER(sub_ata1_w); - DECLARE_READ32_MEMBER(sub_psac2_r); - DECLARE_WRITE32_MEMBER(sub_psac2_w); - DECLARE_WRITE32_MEMBER(sub_psac_palette_w); - - DECLARE_WRITE64_MEMBER(gfx_fifo0_w); - DECLARE_WRITE64_MEMBER(gfx_fifo1_w); + DECLARE_READ32_MEMBER(sub_psac2_r);
+ DECLARE_WRITE32_MEMBER(sub_psac2_w);
+ DECLARE_WRITE32_MEMBER(sub_psac_palette_w);
+ DECLARE_WRITE32_MEMBER(sub_sound_dma_w);
+
+ DECLARE_WRITE64_MEMBER(gfx_fifo0_w);
+ DECLARE_WRITE64_MEMBER(gfx_fifo1_w);
DECLARE_WRITE64_MEMBER(gfx_fifo2_w); DECLARE_WRITE64_MEMBER(gfx_debug_state_w); DECLARE_READ64_MEMBER(gfx_unk1_r); - DECLARE_WRITE64_MEMBER(gfx_unk1_w); - DECLARE_READ64_MEMBER(gfx_fifo_r); - DECLARE_WRITE64_MEMBER(gfx_buf_w); - - DECLARE_WRITE_LINE_MEMBER(ide_interrupt); - + DECLARE_WRITE64_MEMBER(gfx_unk1_w);
+ DECLARE_READ64_MEMBER(gfx_fifo_r);
+ DECLARE_WRITE64_MEMBER(gfx_buf_w);
+ DECLARE_WRITE32_MEMBER(gfx_cpu_dc_store);
+
+ DECLARE_WRITE8_MEMBER(sub_jvs_w);
+
+ DECLARE_WRITE_LINE_MEMBER(ide_interrupt);
+
cobra_renderer *m_renderer; cobra_fifo *m_gfxfifo_in; @@ -1596,20 +1601,18 @@ WRITE64_MEMBER(cobra_state::main_comram_w) UINT32 m2 = (UINT32)(mem_mask); m_comram[page][(offset << 1) + 0] = (w1 & ~m1) | (d1 & m1); - m_comram[page][(offset << 1) + 1] = (w2 & ~m2) | (d2 & m2); -} - -static void main_cpu_dc_store(device_t *device, UINT32 address) -{ - cobra_state *cobra = device->machine().driver_data<cobra_state>(); - - if ((address & 0xf0000000) == 0xc0000000) - { - // force sync when writing to GFX board main ram - cobra->m_maincpu->spin_until_time(attotime::from_usec(80)); - } -} - + m_comram[page][(offset << 1) + 1] = (w2 & ~m2) | (d2 & m2);
+}
+
+WRITE32_MEMBER(cobra_state::main_cpu_dc_store)
+{
+ if ((offset & 0xf0000000) == 0xc0000000)
+ {
+ // force sync when writing to GFX board main ram
+ m_maincpu->spin_until_time(attotime::from_usec(80));
+ }
+}
+
static ADDRESS_MAP_START( cobra_main_map, AS_PROGRAM, 64, cobra_state ) AM_RANGE(0x00000000, 0x003fffff) AM_RAM AM_RANGE(0x07c00000, 0x07ffffff) AM_RAM @@ -1885,49 +1888,46 @@ READ32_MEMBER(cobra_state::sub_psac2_r) } WRITE32_MEMBER(cobra_state::sub_psac2_w) -{ -} - -static void sub_sound_dma_w(device_t *device, int width, UINT32 data) -{ - //printf("DMA write to unknown: size %d, data %08X\n", width, data); - - /* - static FILE *out; +{
+}
+
+WRITE32_MEMBER(cobra_state::sub_sound_dma_w)
+{
+ //printf("DMA write to unknown: size %d, data %08X\n", address, data);
+
+ /*
+ static FILE *out;
if (out == NULL) out = fopen("sound.bin", "wb"); fputc((data >> 24) & 0xff, out); fputc((data >> 16) & 0xff, out); fputc((data >> 8) & 0xff, out); - fputc((data >> 0) & 0xff, out); - */ - - cobra_state *cobra = device->machine().driver_data<cobra_state>(); - - INT16 ldata = (INT16)(data >> 16); - INT16 rdata = (INT16)(data); - - cobra->m_sound_dma_buffer_l[cobra->m_sound_dma_ptr] = ldata; - cobra->m_sound_dma_buffer_r[cobra->m_sound_dma_ptr] = rdata; - cobra->m_sound_dma_ptr++; - - if (cobra->m_sound_dma_ptr >= DMA_SOUND_BUFFER_SIZE) - { - cobra->m_sound_dma_ptr = 0; - - dmadac_transfer(&cobra->m_dmadac[0], 1, 0, 1, DMA_SOUND_BUFFER_SIZE, cobra->m_sound_dma_buffer_l); - dmadac_transfer(&cobra->m_dmadac[1], 1, 0, 1, DMA_SOUND_BUFFER_SIZE, cobra->m_sound_dma_buffer_r); - } -} - -static void sub_jvs_w(device_t *device, UINT8 data) -{ - cobra_state *cobra = device->machine().driver_data<cobra_state>(); - cobra_jvs_host *jvs = downcast<cobra_jvs_host *>(device->machine().device("cobra_jvs_host")); - -#if LOG_JVS - printf("sub_jvs_w: %02X\n", data); + fputc((data >> 0) & 0xff, out);
+ */
+
+ INT16 ldata = (INT16)(data >> 16);
+ INT16 rdata = (INT16)(data);
+
+ m_sound_dma_buffer_l[m_sound_dma_ptr] = ldata;
+ m_sound_dma_buffer_r[m_sound_dma_ptr] = rdata;
+ m_sound_dma_ptr++;
+
+ if (m_sound_dma_ptr >= DMA_SOUND_BUFFER_SIZE)
+ {
+ m_sound_dma_ptr = 0;
+
+ dmadac_transfer(&m_dmadac[0], 1, 0, 1, DMA_SOUND_BUFFER_SIZE, m_sound_dma_buffer_l);
+ dmadac_transfer(&m_dmadac[1], 1, 0, 1, DMA_SOUND_BUFFER_SIZE, m_sound_dma_buffer_r);
+ }
+}
+
+WRITE8_MEMBER(cobra_state::sub_jvs_w)
+{
+ cobra_jvs_host *jvs = machine().device<cobra_jvs_host>("cobra_jvs_host");
+
+#if LOG_JVS
+ printf("sub_jvs_w: %02X\n", data);
#endif const UINT8 *rec_data; @@ -1945,13 +1945,13 @@ static void sub_jvs_w(device_t *device, UINT8 data) } printf("\n"); #endif - - for (int i=0; i < rec_size; i++) - { - cobra->m_subcpu->ppc4xx_spu_receive_byte(rec_data[i]); - } - } -} +
+ for (int i=0; i < rec_size; i++)
+ {
+ m_subcpu->ppc4xx_spu_receive_byte(rec_data[i]);
+ }
+ }
+}
static ADDRESS_MAP_START( cobra_sub_map, AS_PROGRAM, 32, cobra_state ) AM_RANGE(0x00000000, 0x003fffff) AM_MIRROR(0x80000000) AM_RAM // Main RAM @@ -2988,38 +2988,36 @@ WRITE64_MEMBER(cobra_state::gfx_buf_w) // prc_read always expects a value... m_gfxfifo_out->push(&space.device(), 0); - } -} - -static void gfx_cpu_dc_store(device_t *device, UINT32 address) -{ - cobra_state *cobra = device->machine().driver_data<cobra_state>(); - - UINT32 addr = address >> 24; - if (addr == 0x10 || addr == 0x18 || addr == 0x1e) - { - UINT64 i = (UINT64)(cobra->m_gfx_fifo_cache_addr) << 32; - cobra_fifo *fifo_in = cobra->m_gfxfifo_in; - - UINT32 a = (address / 8) & 0xff; - - fifo_in->push(device, (UINT32)(cobra->m_gfx_fifo_mem[a+0] >> 32) | i); - fifo_in->push(device, (UINT32)(cobra->m_gfx_fifo_mem[a+0] >> 0) | i); - fifo_in->push(device, (UINT32)(cobra->m_gfx_fifo_mem[a+1] >> 32) | i); - fifo_in->push(device, (UINT32)(cobra->m_gfx_fifo_mem[a+1] >> 0) | i); - fifo_in->push(device, (UINT32)(cobra->m_gfx_fifo_mem[a+2] >> 32) | i); - fifo_in->push(device, (UINT32)(cobra->m_gfx_fifo_mem[a+2] >> 0) | i); - fifo_in->push(device, (UINT32)(cobra->m_gfx_fifo_mem[a+3] >> 32) | i); - fifo_in->push(device, (UINT32)(cobra->m_gfx_fifo_mem[a+3] >> 0) | i); - - cobra->m_renderer->gfx_fifo_exec(); - } - else - { - logerror("gfx: data cache store at %08X\n", address); - } -} - + }
+}
+
+WRITE32_MEMBER(cobra_state::gfx_cpu_dc_store)
+{
+ UINT32 addr = offset >> 24;
+ if (addr == 0x10 || addr == 0x18 || addr == 0x1e)
+ {
+ UINT64 i = (UINT64)(m_gfx_fifo_cache_addr) << 32;
+ cobra_fifo *fifo_in = m_gfxfifo_in;
+
+ UINT32 a = (offset / 8) & 0xff;
+
+ fifo_in->push(&space.device(), (UINT32)(m_gfx_fifo_mem[a+0] >> 32) | i);
+ fifo_in->push(&space.device(), (UINT32)(m_gfx_fifo_mem[a+0] >> 0) | i);
+ fifo_in->push(&space.device(), (UINT32)(m_gfx_fifo_mem[a+1] >> 32) | i);
+ fifo_in->push(&space.device(), (UINT32)(m_gfx_fifo_mem[a+1] >> 0) | i);
+ fifo_in->push(&space.device(), (UINT32)(m_gfx_fifo_mem[a+2] >> 32) | i);
+ fifo_in->push(&space.device(), (UINT32)(m_gfx_fifo_mem[a+2] >> 0) | i);
+ fifo_in->push(&space.device(), (UINT32)(m_gfx_fifo_mem[a+3] >> 32) | i);
+ fifo_in->push(&space.device(), (UINT32)(m_gfx_fifo_mem[a+3] >> 0) | i);
+
+ m_renderer->gfx_fifo_exec();
+ }
+ else
+ {
+ logerror("gfx: data cache store at %08X\n", offset);
+ }
+}
+
WRITE64_MEMBER(cobra_state::gfx_debug_state_w) { if (ACCESSING_BITS_40_47) @@ -3260,18 +3258,18 @@ DRIVER_INIT_MEMBER(cobra_state, cobra) 2048, "S2MFIFO", S2MFIFO_VERBOSE != 0, - cobra_fifo::event_delegate(FUNC(cobra_state::s2mfifo_event_callback), this)) - ); - - m_maincpu->ppc_set_dcstore_callback(main_cpu_dc_store); - - m_gfxcpu->ppc_set_dcstore_callback(gfx_cpu_dc_store); - - m_subcpu->ppc4xx_set_dma_write_handler(0, sub_sound_dma_w, 44100); - m_subcpu->ppc4xx_spu_set_tx_handler(sub_jvs_w); - - - m_comram[0] = auto_alloc_array(machine(), UINT32, 0x40000/4); + cobra_fifo::event_delegate(FUNC(cobra_state::s2mfifo_event_callback), this))
+ );
+
+ m_maincpu->ppc_set_dcstore_callback(write32_delegate(FUNC(cobra_state::main_cpu_dc_store),this));
+
+ m_gfxcpu->ppc_set_dcstore_callback(write32_delegate(FUNC(cobra_state::gfx_cpu_dc_store), this));
+
+ m_subcpu->ppc4xx_set_dma_write_handler(0, write32_delegate(FUNC(cobra_state::sub_sound_dma_w), this), 44100);
+ m_subcpu->ppc4xx_spu_set_tx_handler(write8_delegate(FUNC(cobra_state::sub_jvs_w), this));
+
+
+ m_comram[0] = auto_alloc_array(machine(), UINT32, 0x40000/4);
m_comram[1] = auto_alloc_array(machine(), UINT32, 0x40000/4); m_comram_page = 0; |