From d87b21ad35152dad62c0fade038e036440e0c88b Mon Sep 17 00:00:00 2001 From: Angelo Salese Date: Sun, 1 Apr 2012 14:42:03 +0000 Subject: [PATCH] Some clean-ups for Little Robin, nw --- src/mame/drivers/littlerb.c | 47 +++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/src/mame/drivers/littlerb.c b/src/mame/drivers/littlerb.c index 8919cbd4987..b6a8b9ecc97 100644 --- a/src/mame/drivers/littlerb.c +++ b/src/mame/drivers/littlerb.c @@ -103,12 +103,17 @@ public: }; -WRITE16_HANDLER( region4_w ) +static WRITE16_HANDLER( region4_w ) { littlerb_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_region4[offset]); } +static READ16_HANDLER( buffer_status_r ) +{ + return 0; +} + /* this map is wrong because our VDP access is wrong! */ static ADDRESS_MAP_START( littlerb_vdp_map8, AS_0, 16, littlerb_state ) // it ends up writing some gfx here (the bubbles when you shoot an enemy) @@ -120,6 +125,7 @@ static ADDRESS_MAP_START( littlerb_vdp_map8, AS_0, 16, littlerb_state ) AM_RANGE(0x00800002 ,0x00800003) AM_DEVWRITE8("^ramdac", ramdac_device, pal_w, 0x00ff) AM_RANGE(0x00800004 ,0x00800005) AM_DEVWRITE8("^ramdac", ramdac_device, mask_w, 0x00ff) + AM_RANGE(0x1ff80804, 0x1ff80805) AM_READ(buffer_status_r) // most gfx end up here including the sprite list AM_RANGE(0x1ff80000, 0x1fffffff) AM_RAM_WRITE_LEGACY(region4_w) AM_BASE( m_region4) ADDRESS_MAP_END @@ -174,25 +180,32 @@ static void littlerb_recalc_regs(running_machine &machine) } +static UINT16 littlerb_data_read(running_machine &machine, UINT16 mem_mask) +{ + littlerb_state *state = machine.driver_data(); + UINT32 addr = state->m_write_address >> 3; // almost surely raw addresses are actually shifted by 3 + address_space *vdp_space = machine.device("littlerbvdp")->space(); + return vdp_space->read_word(addr, mem_mask); +} static void littlerb_data_write(running_machine &machine, UINT16 data, UINT16 mem_mask) { littlerb_state *state = machine.driver_data(); - UINT32 addr = state->m_write_address>>4; // is this right? should we shift? + UINT32 addr = state->m_write_address >> 3; // almost surely raw addresses are actually shifted by 3 address_space *vdp_space = machine.device("littlerbvdp")->space(); int mode = state->m_vdp_writemode; - if ((mode!=0x3800) && (mode !=0x2000)) + if ((mode!=0x3800) && (mode !=0x2000) && (mode != 0xe000) && (mode != 0xf800)) { - printf("mode %04x, data %04x, mem_mask %04x (address %08x)\n", mode, data, mem_mask, state->m_write_address); + printf("mode %04x, data %04x, mem_mask %04x (address %08x)\n", mode, data, mem_mask, state->m_write_address >> 3); } else { - vdp_space->write_word(addr*2, data, mem_mask); + vdp_space->write_word(addr, data, mem_mask); // 2000 is used for palette writes which appears to be a RAMDAC, no auto-inc. - if (mode!=0x2000) state->m_write_address+=0x10; + if (mode!=0x2000 && mode != 0xe000) state->m_write_address+=0x10; littlerb_recalc_regs(machine); } @@ -214,23 +227,17 @@ static READ16_HANDLER( littlerb_vdp_r ) { littlerb_state *state = space->machine().driver_data(); logerror("%06x littlerb_vdp_r offs %04x mask %04x (address %08x)\n", cpu_get_pc(&space->device()), offset, mem_mask, state->m_write_address); + UINT16 res; - switch (offset) + switch (offset & 3) { - case 0: - return state->m_vdp_address_low; - - case 1: - return state->m_vdp_address_high; - - case 2: - return 0; // data read? -- startup check expects 0 for something.. - - case 3: - return state->m_vdp_writemode; + case 0: res = state->m_vdp_address_low; break; + case 1: res = state->m_vdp_address_high; break; + case 2: res = littlerb_data_read(space->machine(), mem_mask); break; + case 3: res = state->m_vdp_writemode; break; } - return -1; + return res; } #define LOG_VDP 0 @@ -245,7 +252,7 @@ static WRITE16_HANDLER( littlerb_vdp_w ) if (state->m_type2_writes>2) { if (LOG_VDP) logerror("******************************* BIG WRITE OCCURRED BEFORE THIS!!! ****************************\n"); - printf("big write occured with start %08x end %08x\n", state->m_write_address_laststart, state->m_write_address_lastend); + printf("big write occured with start %08x end %08x\n", state->m_write_address_laststart >> 3, state->m_write_address_lastend >> 3); } if (LOG_VDP) logerror("~%06x previously wrote %08x data bytes\n", state->m_lasttype2pc, state->m_type2_writes*2);