summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/cobra.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/cobra.c')
-rw-r--r--src/mame/drivers/cobra.c240
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;