Some clean-ups for Little Robin, nw

This commit is contained in:
Angelo Salese 2012-04-01 14:42:03 +00:00
parent e73c562f4c
commit d87b21ad35

View File

@ -103,12 +103,17 @@ public:
}; };
WRITE16_HANDLER( region4_w ) static WRITE16_HANDLER( region4_w )
{ {
littlerb_state *state = space->machine().driver_data<littlerb_state>(); littlerb_state *state = space->machine().driver_data<littlerb_state>();
COMBINE_DATA(&state->m_region4[offset]); COMBINE_DATA(&state->m_region4[offset]);
} }
static READ16_HANDLER( buffer_status_r )
{
return 0;
}
/* this map is wrong because our VDP access is wrong! */ /* this map is wrong because our VDP access is wrong! */
static ADDRESS_MAP_START( littlerb_vdp_map8, AS_0, 16, littlerb_state ) 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) // 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(0x00800002 ,0x00800003) AM_DEVWRITE8("^ramdac", ramdac_device, pal_w, 0x00ff)
AM_RANGE(0x00800004 ,0x00800005) AM_DEVWRITE8("^ramdac", ramdac_device, mask_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 // most gfx end up here including the sprite list
AM_RANGE(0x1ff80000, 0x1fffffff) AM_RAM_WRITE_LEGACY(region4_w) AM_BASE( m_region4) AM_RANGE(0x1ff80000, 0x1fffffff) AM_RAM_WRITE_LEGACY(region4_w) AM_BASE( m_region4)
ADDRESS_MAP_END 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<littlerb_state>();
UINT32 addr = state->m_write_address >> 3; // almost surely raw addresses are actually shifted by 3
address_space *vdp_space = machine.device<littlerb_vdp_device>("littlerbvdp")->space();
return vdp_space->read_word(addr, mem_mask);
}
static void littlerb_data_write(running_machine &machine, UINT16 data, UINT16 mem_mask) static void littlerb_data_write(running_machine &machine, UINT16 data, UINT16 mem_mask)
{ {
littlerb_state *state = machine.driver_data<littlerb_state>(); littlerb_state *state = machine.driver_data<littlerb_state>();
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<littlerb_vdp_device>("littlerbvdp")->space(); address_space *vdp_space = machine.device<littlerb_vdp_device>("littlerbvdp")->space();
int mode = state->m_vdp_writemode; 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 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. // 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); littlerb_recalc_regs(machine);
} }
@ -214,23 +227,17 @@ static READ16_HANDLER( littlerb_vdp_r )
{ {
littlerb_state *state = space->machine().driver_data<littlerb_state>(); littlerb_state *state = space->machine().driver_data<littlerb_state>();
logerror("%06x littlerb_vdp_r offs %04x mask %04x (address %08x)\n", cpu_get_pc(&space->device()), offset, mem_mask, state->m_write_address); 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: case 0: res = state->m_vdp_address_low; break;
return state->m_vdp_address_low; case 1: res = state->m_vdp_address_high; break;
case 2: res = littlerb_data_read(space->machine(), mem_mask); break;
case 1: case 3: res = state->m_vdp_writemode; break;
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;
} }
return -1; return res;
} }
#define LOG_VDP 0 #define LOG_VDP 0
@ -245,7 +252,7 @@ static WRITE16_HANDLER( littlerb_vdp_w )
if (state->m_type2_writes>2) if (state->m_type2_writes>2)
{ {
if (LOG_VDP) logerror("******************************* BIG WRITE OCCURRED BEFORE THIS!!! ****************************\n"); 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); if (LOG_VDP) logerror("~%06x previously wrote %08x data bytes\n", state->m_lasttype2pc, state->m_type2_writes*2);