Added driver_data struct and save states to the following drivers: lkage.c, lockon.c & lsasquad.c

Added save states to liberate.c
This commit is contained in:
Fabio Priuli 2010-02-19 23:58:29 +00:00
parent 43da9ac917
commit 5fde24c0de
15 changed files with 1391 additions and 952 deletions

View File

@ -35,25 +35,33 @@ static READ8_HANDLER( deco16_bank_r )
return ROM[offset]; return ROM[offset];
/* Else the handler falls through to read the usual address */ /* Else the handler falls through to read the usual address */
if (offset<0x400) return state->colorram[offset]; if (offset < 0x400)
if (offset<0x800) return state->videoram[offset-0x400]; return state->colorram[offset];
if (offset<0x1000) return space->machine->generic.spriteram.u8[offset-0x800]; if (offset < 0x800)
if (offset<0x2200) { logerror("%04x: Unmapped bank read %04x\n",cpu_get_pc(space->cpu),offset); return 0; } return state->videoram[offset - 0x400];
if (offset<0x2800) return state->scratchram[offset-0x2200]; if (offset < 0x1000)
return state->spriteram[offset - 0x800];
if (offset < 0x2200)
{
logerror("%04x: Unmapped bank read %04x\n", cpu_get_pc(space->cpu), offset);
return 0;
}
if (offset < 0x2800)
return state->scratchram[offset - 0x2200];
logerror("%04x: Unmapped bank read %04x\n",cpu_get_pc(space->cpu),offset); logerror("%04x: Unmapped bank read %04x\n", cpu_get_pc(space->cpu), offset);
return 0; return 0;
} }
static READ8_HANDLER( deco16_io_r ) static READ8_HANDLER( deco16_io_r )
{ {
if (offset==0) return input_port_read(space->machine, "IN1"); /* Player 1 controls */ if (offset == 0) return input_port_read(space->machine, "IN1"); /* Player 1 controls */
if (offset==1) return input_port_read(space->machine, "IN2"); /* Player 2 controls */ if (offset == 1) return input_port_read(space->machine, "IN2"); /* Player 2 controls */
if (offset==2) return input_port_read(space->machine, "IN3"); /* Vblank, coins */ if (offset == 2) return input_port_read(space->machine, "IN3"); /* Vblank, coins */
if (offset==3) return input_port_read(space->machine, "DSW1"); /* Dip 1 */ if (offset == 3) return input_port_read(space->machine, "DSW1"); /* Dip 1 */
if (offset==4) return input_port_read(space->machine, "DSW2"); /* Dip 2 */ if (offset == 4) return input_port_read(space->machine, "DSW2"); /* Dip 2 */
logerror("%04x: Read input %d\n",cpu_get_pc(space->cpu),offset); logerror("%04x: Read input %d\n", cpu_get_pc(space->cpu), offset);
return 0xff; return 0xff;
} }
@ -63,9 +71,9 @@ static WRITE8_HANDLER( deco16_bank_w )
state->bank = data; state->bank = data;
if (state->bank) if (state->bank)
memory_install_read8_handler(cputag_get_address_space(space->machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x8000, 0x800f, 0, 0, deco16_io_r); memory_install_read8_handler(cpu_get_address_space(state->maincpu, ADDRESS_SPACE_PROGRAM), 0x8000, 0x800f, 0, 0, deco16_io_r);
else else
memory_install_read_bank(cputag_get_address_space(space->machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x8000, 0x800f, 0, 0, "bank1"); memory_install_read_bank(cpu_get_address_space(state->maincpu, ADDRESS_SPACE_PROGRAM), 0x8000, 0x800f, 0, 0, "bank1");
} }
static READ8_HANDLER( prosoccr_bank_r ) static READ8_HANDLER( prosoccr_bank_r )
@ -78,14 +86,23 @@ static READ8_HANDLER( prosoccr_bank_r )
return ROM[offset]; return ROM[offset];
/* Else the handler falls through to read the usual address */ /* Else the handler falls through to read the usual address */
if (offset<0x400) return state->colorram[offset]; if (offset < 0x400)
if (offset<0x800) return state->videoram[offset-0x400]; return state->colorram[offset];
if (offset<0xc00) return state->colorram[offset-0x800]; if (offset < 0x800)
if (offset<0x1000) return space->machine->generic.spriteram.u8[offset-0xc00]; return state->videoram[offset - 0x400];
if (offset<0x2200) { logerror("%04x: Unmapped bank read %04x\n",cpu_get_pc(space->cpu),offset); return 0; } if (offset < 0xc00)
if (offset<0x2800) return state->scratchram[offset-0x2200]; return state->colorram[offset - 0x800];
if (offset < 0x1000)
return state->spriteram[offset - 0xc00];
if (offset < 0x2200)
{
logerror("%04x: Unmapped bank read %04x\n", cpu_get_pc(space->cpu), offset);
return 0;
}
if (offset < 0x2800)
return state->scratchram[offset - 0x2200];
logerror("%04x: Unmapped bank read %04x\n",cpu_get_pc(space->cpu),offset); logerror("%04x: Unmapped bank read %04x\n", cpu_get_pc(space->cpu), offset);
return 0; return 0;
} }
@ -96,19 +113,19 @@ static READ8_HANDLER( prosoccr_charram_r )
if (state->gfx_rom_readback) if (state->gfx_rom_readback)
{ {
switch(offset & 0x1800) switch (offset & 0x1800)
{ {
case 0x0000: case 0x0000:
return SRC_GFX[(offset & 0x7ff)+(0x0000)+0x0000]; return SRC_GFX[(offset & 0x7ff) + (0x0000) + 0x0000];
case 0x0800: case 0x0800:
return SRC_GFX[(offset & 0x7ff)+(0x0000)+0x2000]; return SRC_GFX[(offset & 0x7ff) + (0x0000) + 0x2000];
case 0x1000: case 0x1000:
return SRC_GFX[(offset & 0x7ff)+(0x0000)+0x4000]; return SRC_GFX[(offset & 0x7ff) + (0x0000) + 0x4000];
} }
} }
/* note: gfx_rom_readback == 1 never happens. */ /* note: gfx_rom_readback == 1 never happens. */
return state->charram[offset+state->gfx_rom_readback*0x1800]; return state->charram[offset + state->gfx_rom_readback * 0x1800];
} }
static WRITE8_HANDLER( prosoccr_charram_w ) static WRITE8_HANDLER( prosoccr_charram_w )
@ -118,43 +135,44 @@ static WRITE8_HANDLER( prosoccr_charram_w )
if (state->bank) if (state->bank)
{ {
prosoccr_io_w(space,offset & 0xf,data); prosoccr_io_w(space, offset & 0x0f, data);
} }
else else
{ {
/* note: gfx_rom_readback == 1 never happens. */ /* note: gfx_rom_readback == 1 never happens. */
state->charram[offset+state->gfx_rom_readback*0x1800] = data; state->charram[offset + state->gfx_rom_readback * 0x1800] = data;
switch(offset & 0x1800) switch (offset & 0x1800)
{ {
case 0x0000: case 0x0000:
FG_GFX[(offset & 0x7ff)+(0x0000)+0x0000] = data; FG_GFX[(offset & 0x7ff) + (0x0000) + 0x0000] = data;
//FG_GFX[(offset & 0x7ff)+(0x1800)+0x0000] = data; //FG_GFX[(offset & 0x7ff) + (0x1800) + 0x0000] = data;
break; break;
case 0x0800: case 0x0800:
FG_GFX[(offset & 0x7ff)+(0x0000)+0x2000] = data; FG_GFX[(offset & 0x7ff) + (0x0000) + 0x2000] = data;
//FG_GFX[(offset & 0x7ff)+(0x1800)+0x2000] = data; //FG_GFX[(offset & 0x7ff) + (0x1800) + 0x2000] = data;
break; break;
case 0x1000: case 0x1000:
FG_GFX[(offset & 0x7ff)+(0x0000)+0x4000] = data; FG_GFX[(offset & 0x7ff) + (0x0000) + 0x4000] = data;
//FG_GFX[(offset & 0x7ff)+(0x1800)+0x4000] = data; //FG_GFX[(offset & 0x7ff) + (0x1800) + 0x4000] = data;
break; break;
} }
} }
offset&=0x7ff; offset &= 0x7ff;
/* dirty char */ /* dirty char */
gfx_element_mark_dirty(space->machine->gfx[0], offset >> 3); gfx_element_mark_dirty(space->machine->gfx[0], offset >> 3);
// gfx_element_mark_dirty(space->machine->gfx[0], (offset|0x1800) >> 3); // gfx_element_mark_dirty(space->machine->gfx[0], (offset | 0x1800) >> 3);
} }
static WRITE8_HANDLER( prosoccr_char_bank_w ) static WRITE8_HANDLER( prosoccr_char_bank_w )
{ {
liberate_state *state = (liberate_state *)space->machine->driver_data; liberate_state *state = (liberate_state *)space->machine->driver_data;
state->gfx_rom_readback = data & 1; //enable GFX rom read-back state->gfx_rom_readback = data & 1; //enable GFX rom read-back
if(data & 0xfe)
printf("%02x\n",data); if (data & 0xfe)
printf("%02x\n", data);
} }
static WRITE8_HANDLER( prosoccr_io_bank_w ) static WRITE8_HANDLER( prosoccr_io_bank_w )
@ -163,9 +181,9 @@ static WRITE8_HANDLER( prosoccr_io_bank_w )
state->bank = data & 1; state->bank = data & 1;
if (state->bank) if (state->bank)
memory_install_read8_handler(cputag_get_address_space(space->machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x8000, 0x800f, 0, 0, deco16_io_r); memory_install_read8_handler(cpu_get_address_space(state->maincpu, ADDRESS_SPACE_PROGRAM), 0x8000, 0x800f, 0, 0, deco16_io_r);
else else
memory_install_read8_handler(cputag_get_address_space(space->machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x8000, 0x800f, 0, 0, prosoccr_charram_r); memory_install_read8_handler(cpu_get_address_space(state->maincpu, ADDRESS_SPACE_PROGRAM), 0x8000, 0x800f, 0, 0, prosoccr_charram_r);
} }
@ -173,17 +191,17 @@ static READ8_HANDLER( prosport_charram_r )
{ {
UINT8 *FG_GFX = memory_region(space->machine, "progolf_fg_gfx"); UINT8 *FG_GFX = memory_region(space->machine, "progolf_fg_gfx");
switch(offset & 0x1800) switch (offset & 0x1800)
{ {
case 0x0000: case 0x0000:
return FG_GFX[(offset & 0x7ff)+(0x0800)+0x0000]; return FG_GFX[(offset & 0x7ff) + (0x0800) + 0x0000];
//FG_GFX[(offset & 0x7ff)+(0x1800)+0x0000] = data; //FG_GFX[(offset & 0x7ff) + (0x1800) + 0x0000] = data;
case 0x0800: case 0x0800:
return FG_GFX[(offset & 0x7ff)+(0x0800)+0x2000]; return FG_GFX[(offset & 0x7ff) + (0x0800) + 0x2000];
//FG_GFX[(offset & 0x7ff)+(0x1800)+0x2000] = data; //FG_GFX[(offset & 0x7ff) + (0x1800) + 0x2000] = data;
case 0x1000: case 0x1000:
return FG_GFX[(offset & 0x7ff)+(0x0800)+0x4000]; return FG_GFX[(offset & 0x7ff) + (0x0800) + 0x4000];
//FG_GFX[(offset & 0x7ff)+(0x1800)+0x4000] = data; //FG_GFX[(offset & 0x7ff) + (0x1800) + 0x4000] = data;
} }
return 0; return 0;
@ -193,27 +211,27 @@ static WRITE8_HANDLER( prosport_charram_w )
{ {
UINT8 *FG_GFX = memory_region(space->machine, "progolf_fg_gfx"); UINT8 *FG_GFX = memory_region(space->machine, "progolf_fg_gfx");
switch(offset & 0x1800) switch (offset & 0x1800)
{ {
case 0x0000: case 0x0000:
FG_GFX[(offset & 0x7ff)+(0x0800)+0x0000] = data; FG_GFX[(offset & 0x7ff) + (0x0800) + 0x0000] = data;
//FG_GFX[(offset & 0x7ff)+(0x1800)+0x0000] = data; //FG_GFX[(offset & 0x7ff) + (0x1800) + 0x0000] = data;
break; break;
case 0x0800: case 0x0800:
FG_GFX[(offset & 0x7ff)+(0x0800)+0x2000] = data; FG_GFX[(offset & 0x7ff) + (0x0800) + 0x2000] = data;
//FG_GFX[(offset & 0x7ff)+(0x1800)+0x2000] = data; //FG_GFX[(offset & 0x7ff) + (0x1800) + 0x2000] = data;
break; break;
case 0x1000: case 0x1000:
FG_GFX[(offset & 0x7ff)+(0x0800)+0x4000] = data; FG_GFX[(offset & 0x7ff) + (0x0800) + 0x4000] = data;
//FG_GFX[(offset & 0x7ff)+(0x1800)+0x4000] = data; //FG_GFX[(offset & 0x7ff) + (0x1800) + 0x4000] = data;
break; break;
} }
offset&=0x7ff; offset &= 0x7ff;
/* dirty char */ /* dirty char */
gfx_element_mark_dirty(space->machine->gfx[3], (offset+0x800) >> 3); gfx_element_mark_dirty(space->machine->gfx[3], (offset + 0x800) >> 3);
gfx_element_mark_dirty(space->machine->gfx[3+4], (offset+0x800) >> 5); gfx_element_mark_dirty(space->machine->gfx[3 + 4], (offset + 0x800) >> 5);
} }
@ -224,14 +242,14 @@ static WRITE8_HANDLER( prosport_charram_w )
*************************************/ *************************************/
static ADDRESS_MAP_START( prosport_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( prosport_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0200, 0x021f) AM_RAM_WRITE(prosport_paletteram_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0x0200, 0x021f) AM_RAM_WRITE(prosport_paletteram_w) AM_BASE_MEMBER(liberate_state, paletteram)
AM_RANGE(0x0000, 0x03ff) AM_MIRROR(0x2000) AM_RAM AM_RANGE(0x0000, 0x03ff) AM_MIRROR(0x2000) AM_RAM
AM_RANGE(0x0400, 0x07ff) AM_RAM_WRITE(prosport_bg_vram_w) AM_BASE_MEMBER(liberate_state,bg_vram) AM_RANGE(0x0400, 0x07ff) AM_RAM_WRITE(prosport_bg_vram_w) AM_BASE_MEMBER(liberate_state, bg_vram)
AM_RANGE(0x0800, 0x1fff) AM_READWRITE(prosport_charram_r,prosport_charram_w) //0x1e00-0x1fff isn't charram! AM_RANGE(0x0800, 0x1fff) AM_READWRITE(prosport_charram_r,prosport_charram_w) //0x1e00-0x1fff isn't charram!
AM_RANGE(0x2400, 0x2fff) AM_RAM AM_RANGE(0x2400, 0x2fff) AM_RAM
AM_RANGE(0x3000, 0x33ff) AM_RAM_WRITE(liberate_colorram_w) AM_BASE_MEMBER(liberate_state,colorram) AM_RANGE(0x3000, 0x33ff) AM_RAM_WRITE(liberate_colorram_w) AM_BASE_MEMBER(liberate_state, colorram)
AM_RANGE(0x3400, 0x37ff) AM_RAM_WRITE(liberate_videoram_w) AM_BASE_MEMBER(liberate_state,videoram) AM_RANGE(0x3400, 0x37ff) AM_RAM_WRITE(liberate_videoram_w) AM_BASE_MEMBER(liberate_state, videoram)
AM_RANGE(0x3800, 0x3fff) AM_RAM AM_BASE_GENERIC(spriteram) AM_RANGE(0x3800, 0x3fff) AM_RAM AM_BASE_MEMBER(liberate_state, spriteram)
AM_RANGE(0x8000, 0x800f) AM_WRITE(prosport_io_w) AM_RANGE(0x8000, 0x800f) AM_WRITE(prosport_io_w)
AM_RANGE(0x8000, 0x800f) AM_ROMBANK("bank1") AM_RANGE(0x8000, 0x800f) AM_ROMBANK("bank1")
AM_RANGE(0x4000, 0xffff) AM_ROM AM_RANGE(0x4000, 0xffff) AM_ROM
@ -241,10 +259,10 @@ static ADDRESS_MAP_START( liberate_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x0fff) AM_RAM AM_RANGE(0x0000, 0x0fff) AM_RAM
AM_RANGE(0x1000, 0x3fff) AM_ROM /* Mirror of main rom */ AM_RANGE(0x1000, 0x3fff) AM_ROM /* Mirror of main rom */
AM_RANGE(0x4000, 0x7fff) AM_READ(deco16_bank_r) AM_RANGE(0x4000, 0x7fff) AM_READ(deco16_bank_r)
AM_RANGE(0x4000, 0x43ff) AM_WRITE(liberate_colorram_w) AM_BASE_MEMBER(liberate_state,colorram) AM_RANGE(0x4000, 0x43ff) AM_WRITE(liberate_colorram_w) AM_BASE_MEMBER(liberate_state, colorram)
AM_RANGE(0x4400, 0x47ff) AM_WRITE(liberate_videoram_w) AM_BASE_MEMBER(liberate_state,videoram) AM_RANGE(0x4400, 0x47ff) AM_WRITE(liberate_videoram_w) AM_BASE_MEMBER(liberate_state, videoram)
AM_RANGE(0x4800, 0x4fff) AM_WRITEONLY AM_BASE_GENERIC(spriteram) AM_RANGE(0x4800, 0x4fff) AM_WRITEONLY AM_BASE_MEMBER(liberate_state, spriteram)
AM_RANGE(0x6200, 0x67ff) AM_RAM AM_BASE_MEMBER(liberate_state,scratchram) AM_RANGE(0x6200, 0x67ff) AM_RAM AM_BASE_MEMBER(liberate_state, scratchram)
AM_RANGE(0x8000, 0x800f) AM_WRITE(deco16_io_w) AM_RANGE(0x8000, 0x800f) AM_WRITE(deco16_io_w)
AM_RANGE(0x8000, 0x800f) AM_ROMBANK("bank1") AM_RANGE(0x8000, 0x800f) AM_ROMBANK("bank1")
AM_RANGE(0x8000, 0xffff) AM_ROM AM_RANGE(0x8000, 0xffff) AM_ROM
@ -254,11 +272,11 @@ static ADDRESS_MAP_START( prosoccr_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x0fff) AM_RAM AM_RANGE(0x0000, 0x0fff) AM_RAM
AM_RANGE(0x1000, 0x3fff) AM_ROM /* Mirror of main rom */ AM_RANGE(0x1000, 0x3fff) AM_ROM /* Mirror of main rom */
AM_RANGE(0x4000, 0x7fff) AM_READ(prosoccr_bank_r) AM_RANGE(0x4000, 0x7fff) AM_READ(prosoccr_bank_r)
AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0x800) AM_WRITE(liberate_colorram_w) AM_BASE_MEMBER(liberate_state,colorram) AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0x800) AM_WRITE(liberate_colorram_w) AM_BASE_MEMBER(liberate_state, colorram)
AM_RANGE(0x4400, 0x47ff) AM_WRITE(liberate_videoram_w) AM_BASE_MEMBER(liberate_state,videoram) AM_RANGE(0x4400, 0x47ff) AM_WRITE(liberate_videoram_w) AM_BASE_MEMBER(liberate_state, videoram)
AM_RANGE(0x4c00, 0x4fff) AM_WRITEONLY AM_BASE_GENERIC(spriteram) AM_RANGE(0x4c00, 0x4fff) AM_WRITEONLY AM_BASE_MEMBER(liberate_state, spriteram)
AM_RANGE(0x6200, 0x67ff) AM_RAM AM_BASE_MEMBER(liberate_state,scratchram) AM_RANGE(0x6200, 0x67ff) AM_RAM AM_BASE_MEMBER(liberate_state, scratchram)
AM_RANGE(0x8000, 0x97ff) AM_READWRITE(prosoccr_charram_r,prosoccr_charram_w) AM_RANGE(0x8000, 0x97ff) AM_READWRITE(prosoccr_charram_r, prosoccr_charram_w)
AM_RANGE(0x9800, 0x9800) AM_WRITE(prosoccr_char_bank_w) AM_RANGE(0x9800, 0x9800) AM_WRITE(prosoccr_char_bank_w)
AM_RANGE(0xa000, 0xffff) AM_ROM AM_RANGE(0xa000, 0xffff) AM_ROM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -278,10 +296,10 @@ static ADDRESS_MAP_START( liberatb_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x0fff) AM_RAM AM_RANGE(0x0000, 0x0fff) AM_RAM
AM_RANGE(0x1000, 0x3fff) AM_ROM /* Mirror of main rom */ AM_RANGE(0x1000, 0x3fff) AM_ROM /* Mirror of main rom */
AM_RANGE(0x4000, 0x7fff) AM_READ(deco16_bank_r) AM_RANGE(0x4000, 0x7fff) AM_READ(deco16_bank_r)
AM_RANGE(0x4000, 0x43ff) AM_WRITE(liberate_colorram_w) AM_BASE_MEMBER(liberate_state,colorram) AM_RANGE(0x4000, 0x43ff) AM_WRITE(liberate_colorram_w) AM_BASE_MEMBER(liberate_state, colorram)
AM_RANGE(0x4400, 0x47ff) AM_WRITE(liberate_videoram_w) AM_BASE_MEMBER(liberate_state,videoram) AM_RANGE(0x4400, 0x47ff) AM_WRITE(liberate_videoram_w) AM_BASE_MEMBER(liberate_state, videoram)
AM_RANGE(0x4800, 0x4fff) AM_WRITEONLY AM_BASE_GENERIC(spriteram) AM_RANGE(0x4800, 0x4fff) AM_WRITEONLY AM_BASE_MEMBER(liberate_state, spriteram)
AM_RANGE(0x6200, 0x67ff) AM_WRITEONLY AM_BASE_MEMBER(liberate_state,scratchram) AM_RANGE(0x6200, 0x67ff) AM_WRITEONLY AM_BASE_MEMBER(liberate_state, scratchram)
AM_RANGE(0xf000, 0xf00f) AM_WRITE(deco16_io_w) AM_RANGE(0xf000, 0xf00f) AM_WRITE(deco16_io_w)
AM_RANGE(0xf000, 0xf000) AM_READ_PORT("IN1") AM_RANGE(0xf000, 0xf000) AM_READ_PORT("IN1")
AM_RANGE(0xf001, 0xf001) AM_READ_PORT("IN2") AM_RANGE(0xf001, 0xf001) AM_READ_PORT("IN2")
@ -761,7 +779,7 @@ static INTERRUPT_GEN( deco16_interrupt )
else else
{ {
if (!(p & 0x43)) if (!(p & 0x43))
state->latch=0; state->latch = 0;
} }
} }
@ -779,6 +797,35 @@ static INTERRUPT_GEN( prosport_interrupt )
* *
*************************************/ *************************************/
static MACHINE_START( liberate )
{
liberate_state *state = (liberate_state *)machine->driver_data;
state->maincpu = devtag_get_device(machine, "maincpu");
state->audiocpu = devtag_get_device(machine, "audiocpu");
state_save_register_global(machine, state->background_disable);
state_save_register_global(machine, state->background_color);
state_save_register_global(machine, state->gfx_rom_readback);
state_save_register_global(machine, state->latch);
state_save_register_global(machine, state->bank);
state_save_register_global_array(machine, state->io_ram);
}
static MACHINE_RESET( liberate )
{
liberate_state *state = (liberate_state *)machine->driver_data;
memset(state->io_ram, 0, ARRAY_LENGTH(state->io_ram));
state->background_disable = 0;
state->background_color = 0;
state->gfx_rom_readback = 0;
state->latch = 0;
state->bank = 0;
}
static MACHINE_DRIVER_START( liberate ) static MACHINE_DRIVER_START( liberate )
MDRV_DRIVER_DATA(liberate_state) MDRV_DRIVER_DATA(liberate_state)
@ -795,6 +842,9 @@ static MACHINE_DRIVER_START( liberate )
MDRV_QUANTUM_TIME(HZ(12000)) MDRV_QUANTUM_TIME(HZ(12000))
MDRV_MACHINE_START(liberate)
MDRV_MACHINE_RESET(liberate)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(60)
@ -879,6 +929,9 @@ static MACHINE_DRIVER_START( prosport )
// MDRV_QUANTUM_TIME(HZ(12000)) // MDRV_QUANTUM_TIME(HZ(12000))
MDRV_MACHINE_START(liberate)
MDRV_MACHINE_RESET(liberate)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(60)
@ -1319,8 +1372,8 @@ static void sound_cpu_decrypt(running_machine *machine)
int i; int i;
/* Bit swapping on sound cpu - Opcodes only */ /* Bit swapping on sound cpu - Opcodes only */
for (i=0xc000; i<0x10000; i++) for (i = 0xc000; i < 0x10000; i++)
decrypted[i-0xc000]=((rom[i] & 0x20) << 1) | ((rom[i] & 0x40) >> 1) | (rom[i] & 0x9f); decrypted[i - 0xc000] = ((rom[i] & 0x20) << 1) | ((rom[i] & 0x40) >> 1) | (rom[i] & 0x9f);
memory_set_decrypted_region(space, 0xc000, 0xffff, decrypted); memory_set_decrypted_region(space, 0xc000, 0xffff, decrypted);
} }
@ -1331,8 +1384,8 @@ static DRIVER_INIT( prosport )
int i; int i;
/* Main cpu has the nibbles swapped */ /* Main cpu has the nibbles swapped */
for (i=0; i<0x10000; i++) for (i = 0; i < 0x10000; i++)
RAM[i]=((RAM[i] & 0x0f) << 4) | ((RAM[i] & 0xf0) >> 4); RAM[i] = ((RAM[i] & 0x0f) << 4) | ((RAM[i] & 0xf0) >> 4);
sound_cpu_decrypt(machine); sound_cpu_decrypt(machine);
} }
@ -1354,7 +1407,7 @@ static DRIVER_INIT( liberate )
memory_set_decrypted_region(space, 0x0000, 0xffff, decrypted); memory_set_decrypted_region(space, 0x0000, 0xffff, decrypted);
/* Swap bits for opcodes only, not data */ /* Swap bits for opcodes only, not data */
for (A = 0;A < 0x10000;A++) { for (A = 0; A < 0x10000; A++) {
decrypted[A] = (ROM[A] & 0xd7) | ((ROM[A] & 0x08) << 2) | ((ROM[A] & 0x20) >> 2); decrypted[A] = (ROM[A] & 0xd7) | ((ROM[A] & 0x08) << 2) | ((ROM[A] & 0x20) >> 2);
decrypted[A] = (decrypted[A] & 0xbb) | ((decrypted[A] & 0x04) << 4) | ((decrypted[A] & 0x40) >> 4); decrypted[A] = (decrypted[A] & 0xbb) | ((decrypted[A] & 0x04) << 4) | ((decrypted[A] & 0x40) >> 4);
decrypted[A] = (decrypted[A] & 0x7d) | ((decrypted[A] & 0x02) << 6) | ((decrypted[A] & 0x80) >> 6); decrypted[A] = (decrypted[A] & 0x7d) | ((decrypted[A] & 0x02) << 6) | ((decrypted[A] & 0x80) >> 6);
@ -1371,14 +1424,14 @@ static DRIVER_INIT( liberate )
* *
*************************************/ *************************************/
GAME( 1983, prosoccr, 0, prosoccr, prosoccr, prosport, ROT270, "Data East Corporation", "Pro Soccer", 0 ) GAME( 1983, prosoccr, 0, prosoccr, prosoccr, prosport, ROT270, "Data East Corporation", "Pro Soccer", GAME_SUPPORTS_SAVE )
GAME( 1983, prosport, 0, prosport, prosport, prosport, ROT270, "Data East Corporation", "Pro. Sports", GAME_NO_COCKTAIL | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1983, prosport, 0, prosport, prosport, prosport, ROT270, "Data East Corporation", "Pro. Sports", GAME_NO_COCKTAIL | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1983, prosporta, prosport, prosport, prosport, prosport, ROT270, "Data East Corporation", "Pro. Sports (alternate)", GAME_NO_COCKTAIL | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1983, prosporta, prosport, prosport, prosport, prosport, ROT270, "Data East Corporation", "Pro. Sports (alternate)", GAME_NO_COCKTAIL | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1983, boomrang, 0, boomrang, boomrang, prosport, ROT270, "Data East Corporation", "Boomer Rang'r / Genesis (set 1)", 0 ) GAME( 1983, boomrang, 0, boomrang, boomrang, prosport, ROT270, "Data East Corporation", "Boomer Rang'r / Genesis (set 1)", GAME_SUPPORTS_SAVE )
GAME( 1983, boomranga, boomrang, boomrang, boomrang, prosport, ROT270, "Data East Corporation", "Boomer Rang'r / Genesis (set 2)", 0 ) GAME( 1983, boomranga, boomrang, boomrang, boomrang, prosport, ROT270, "Data East Corporation", "Boomer Rang'r / Genesis (set 2)", GAME_SUPPORTS_SAVE )
GAME( 1984, kamikcab, 0, boomrang, kamikcab, prosport, ROT270, "Data East Corporation", "Kamikaze Cabbie", 0 ) GAME( 1984, kamikcab, 0, boomrang, kamikcab, prosport, ROT270, "Data East Corporation", "Kamikaze Cabbie", GAME_SUPPORTS_SAVE )
GAME( 1984, yellowcbj, kamikcab, boomrang, yellowcb, yellowcb, ROT270, "Data East Corporation", "Yellow Cab (Japan)", 0 ) GAME( 1984, yellowcbj, kamikcab, boomrang, yellowcb, yellowcb, ROT270, "Data East Corporation", "Yellow Cab (Japan)", GAME_SUPPORTS_SAVE )
GAME( 1984, yellowcbb, kamikcab, boomrang, yellowcb, yellowcb, ROT270, "bootleg", "Yellow Cab (bootleg)", 0 ) GAME( 1984, yellowcbb, kamikcab, boomrang, yellowcb, yellowcb, ROT270, "bootleg", "Yellow Cab (bootleg)", GAME_SUPPORTS_SAVE )
GAME( 1984, liberate, 0, liberate, liberate, liberate, ROT270, "Data East Corporation", "Liberation", 0 ) GAME( 1984, liberate, 0, liberate, liberate, liberate, ROT270, "Data East Corporation", "Liberation", GAME_SUPPORTS_SAVE )
GAME( 1984, dualaslt, liberate, liberate, dualaslt, liberate, ROT270, "Data East USA", "Dual Assault", 0 ) GAME( 1984, dualaslt, liberate, liberate, dualaslt, liberate, ROT270, "Data East USA", "Dual Assault", GAME_SUPPORTS_SAVE )
GAME( 1984, liberateb, liberate, liberatb, liberatb, prosport, ROT270, "bootleg", "Liberation (bootleg)", 0 ) GAME( 1984, liberateb, liberate, liberatb, liberatb, prosport, ROT270, "bootleg", "Liberation (bootleg)", GAME_SUPPORTS_SAVE )

View File

@ -85,32 +85,37 @@ TODO:
#include "includes/lkage.h" #include "includes/lkage.h"
static int sound_nmi_enable,pending_nmi;
static TIMER_CALLBACK( nmi_callback ) static TIMER_CALLBACK( nmi_callback )
{ {
if (sound_nmi_enable) cputag_set_input_line(machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE); lkage_state *state = (lkage_state *)machine->driver_data;
else pending_nmi = 1; if (state->sound_nmi_enable)
cpu_set_input_line(state->audiocpu, INPUT_LINE_NMI, PULSE_LINE);
else
state->pending_nmi = 1;
} }
static WRITE8_HANDLER( lkage_sound_command_w ) static WRITE8_HANDLER( lkage_sound_command_w )
{ {
soundlatch_w(space,offset,data); soundlatch_w(space, offset, data);
timer_call_after_resynch(space->machine, NULL, data,nmi_callback); timer_call_after_resynch(space->machine, NULL, data, nmi_callback);
} }
static WRITE8_HANDLER( lkage_sh_nmi_disable_w ) static WRITE8_HANDLER( lkage_sh_nmi_disable_w )
{ {
sound_nmi_enable = 0; lkage_state *state = (lkage_state *)space->machine->driver_data;
state->sound_nmi_enable = 0;
} }
static WRITE8_HANDLER( lkage_sh_nmi_enable_w ) static WRITE8_HANDLER( lkage_sh_nmi_enable_w )
{ {
sound_nmi_enable = 1; lkage_state *state = (lkage_state *)space->machine->driver_data;
if (pending_nmi)
{ /* probably wrong but commands may go lost otherwise */ state->sound_nmi_enable = 1;
cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE); if (state->pending_nmi)
pending_nmi = 0; {
/* probably wrong but commands may go lost otherwise */
cpu_set_input_line(state->audiocpu, INPUT_LINE_NMI, PULSE_LINE);
state->pending_nmi = 0;
} }
} }
@ -118,7 +123,7 @@ static ADDRESS_MAP_START( lkage_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0xdfff) AM_ROM AM_RANGE(0x0000, 0xdfff) AM_ROM
AM_RANGE(0xe000, 0xe7ff) AM_RAM /* work ram */ AM_RANGE(0xe000, 0xe7ff) AM_RAM /* work ram */
AM_RANGE(0xe800, 0xefff) AM_RAM_WRITE(paletteram_xxxxRRRRGGGGBBBB_le_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0xe800, 0xefff) AM_RAM_WRITE(paletteram_xxxxRRRRGGGGBBBB_le_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0xf000, 0xf003) AM_RAM AM_BASE(&lkage_vreg) /* video registers */ AM_RANGE(0xf000, 0xf003) AM_RAM AM_BASE_MEMBER(lkage_state, vreg) /* video registers */
AM_RANGE(0xf060, 0xf060) AM_WRITE(lkage_sound_command_w) AM_RANGE(0xf060, 0xf060) AM_WRITE(lkage_sound_command_w)
AM_RANGE(0xf061, 0xf061) AM_WRITENOP AM_RANGE(0xf061, 0xf061) AM_WRITENOP
AM_RANGE(0xf062, 0xf062) AM_READWRITE(lkage_mcu_r,lkage_mcu_w) AM_RANGE(0xf062, 0xf062) AM_READWRITE(lkage_mcu_r,lkage_mcu_w)
@ -131,10 +136,10 @@ static ADDRESS_MAP_START( lkage_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0xf086, 0xf086) AM_READ_PORT("P2") AM_RANGE(0xf086, 0xf086) AM_READ_PORT("P2")
AM_RANGE(0xf087, 0xf087) AM_READ(lkage_mcu_status_r) AM_RANGE(0xf087, 0xf087) AM_READ(lkage_mcu_status_r)
AM_RANGE(0xf0a0, 0xf0a3) AM_RAM /* unknown */ AM_RANGE(0xf0a0, 0xf0a3) AM_RAM /* unknown */
AM_RANGE(0xf0c0, 0xf0c5) AM_RAM AM_BASE(&lkage_scroll) AM_RANGE(0xf0c0, 0xf0c5) AM_RAM AM_BASE_MEMBER(lkage_state, scroll)
AM_RANGE(0xf0e1, 0xf0e1) AM_WRITENOP /* pulsed */ AM_RANGE(0xf0e1, 0xf0e1) AM_WRITENOP /* pulsed */
AM_RANGE(0xf100, 0xf15f) AM_RAM AM_BASE_GENERIC(spriteram) AM_RANGE(0xf100, 0xf15f) AM_RAM AM_BASE_MEMBER(lkage_state, spriteram)
AM_RANGE(0xf400, 0xffff) AM_RAM_WRITE(lkage_videoram_w) AM_BASE_GENERIC(videoram) /* videoram */ AM_RANGE(0xf400, 0xffff) AM_RAM_WRITE(lkage_videoram_w) AM_BASE_MEMBER(lkage_state, videoram)
ADDRESS_MAP_END ADDRESS_MAP_END
static READ8_HANDLER( port_fetch_r ) static READ8_HANDLER( port_fetch_r )
@ -148,12 +153,12 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( lkage_m68705_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( lkage_m68705_map, ADDRESS_SPACE_PROGRAM, 8 )
ADDRESS_MAP_GLOBAL_MASK(0x7ff) ADDRESS_MAP_GLOBAL_MASK(0x7ff)
AM_RANGE(0x0000, 0x0000) AM_READWRITE(lkage_68705_portA_r,lkage_68705_portA_w) AM_RANGE(0x0000, 0x0000) AM_READWRITE(lkage_68705_port_a_r,lkage_68705_port_a_w)
AM_RANGE(0x0001, 0x0001) AM_READWRITE(lkage_68705_portB_r,lkage_68705_portB_w) AM_RANGE(0x0001, 0x0001) AM_READWRITE(lkage_68705_port_b_r,lkage_68705_port_b_w)
AM_RANGE(0x0002, 0x0002) AM_READWRITE(lkage_68705_portC_r,lkage_68705_portC_w) AM_RANGE(0x0002, 0x0002) AM_READWRITE(lkage_68705_port_c_r,lkage_68705_port_c_w)
AM_RANGE(0x0004, 0x0004) AM_WRITE(lkage_68705_ddrA_w) AM_RANGE(0x0004, 0x0004) AM_WRITE(lkage_68705_ddr_a_w)
AM_RANGE(0x0005, 0x0005) AM_WRITE(lkage_68705_ddrB_w) AM_RANGE(0x0005, 0x0005) AM_WRITE(lkage_68705_ddr_b_w)
AM_RANGE(0x0006, 0x0006) AM_WRITE(lkage_68705_ddrC_w) AM_RANGE(0x0006, 0x0006) AM_WRITE(lkage_68705_ddr_c_w)
AM_RANGE(0x0010, 0x007f) AM_RAM AM_RANGE(0x0010, 0x007f) AM_RAM
AM_RANGE(0x0080, 0x07ff) AM_ROM AM_RANGE(0x0080, 0x07ff) AM_ROM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -337,7 +342,8 @@ GFXDECODE_END
static void irqhandler(running_device *device, int irq) static void irqhandler(running_device *device, int irq)
{ {
cputag_set_input_line(device->machine, "audiocpu", 0, irq ? ASSERT_LINE : CLEAR_LINE); lkage_state *state = (lkage_state *)device->machine->driver_data;
cpu_set_input_line(state->audiocpu, 0, irq ? ASSERT_LINE : CLEAR_LINE);
} }
static const ym2203_interface ym2203_config = static const ym2203_interface ym2203_config =
@ -350,7 +356,69 @@ static const ym2203_interface ym2203_config =
irqhandler irqhandler
}; };
static MACHINE_START( lkage )
{
lkage_state *state = (lkage_state *)machine->driver_data;
state->maincpu = devtag_get_device(machine, "maincpu");
state->audiocpu = devtag_get_device(machine, "audiocpu");
state->mcu = devtag_get_device(machine, "mcu");
state_save_register_global(machine, state->bg_tile_bank);
state_save_register_global(machine, state->fg_tile_bank);
state_save_register_global(machine, state->mcu_ready);
state_save_register_global(machine, state->mcu_val);
state_save_register_global(machine, state->sound_nmi_enable);
state_save_register_global(machine, state->pending_nmi);
state_save_register_global(machine, state->port_a_in);
state_save_register_global(machine, state->port_a_out);
state_save_register_global(machine, state->ddr_a);
state_save_register_global(machine, state->port_b_in);
state_save_register_global(machine, state->port_b_out);
state_save_register_global(machine, state->ddr_b);
state_save_register_global(machine, state->port_c_in);
state_save_register_global(machine, state->port_c_out);
state_save_register_global(machine, state->ddr_c);
state_save_register_global(machine, state->mcu_sent);
state_save_register_global(machine, state->main_sent);
state_save_register_global(machine, state->from_main);
state_save_register_global(machine, state->from_mcu);
}
static MACHINE_RESET( lkage )
{
lkage_state *state = (lkage_state *)machine->driver_data;
state->bg_tile_bank = state->fg_tile_bank = 0;
state->mcu_ready = 3;
state->mcu_val = 0;
state->sound_nmi_enable = 0;
state->pending_nmi = 0;
state->port_a_in = 0;
state->port_a_out = 0;
state->ddr_a = 0;
state->port_b_in = 0;
state->port_b_out = 0;
state->ddr_b = 0;
state->port_c_in = 0;
state->port_c_out = 0;
state->ddr_c = 0;
state->mcu_sent = 0;
state->main_sent = 0;
state->from_main = 0;
state->from_mcu = 0;
}
static MACHINE_DRIVER_START( lkage ) static MACHINE_DRIVER_START( lkage )
/* driver data */
MDRV_DRIVER_DATA(lkage_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80,6000000) MDRV_CPU_ADD("maincpu", Z80,6000000)
MDRV_CPU_PROGRAM_MAP(lkage_map) MDRV_CPU_PROGRAM_MAP(lkage_map)
@ -364,6 +432,9 @@ static MACHINE_DRIVER_START( lkage )
MDRV_CPU_ADD("mcu", M68705,4000000) /* ??? */ MDRV_CPU_ADD("mcu", M68705,4000000) /* ??? */
MDRV_CPU_PROGRAM_MAP(lkage_m68705_map) MDRV_CPU_PROGRAM_MAP(lkage_m68705_map)
MDRV_MACHINE_START(lkage)
MDRV_MACHINE_RESET(lkage)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(60)
@ -397,6 +468,10 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( lkageb ) static MACHINE_DRIVER_START( lkageb )
/* driver data */
MDRV_DRIVER_DATA(lkage_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80,6000000) MDRV_CPU_ADD("maincpu", Z80,6000000)
MDRV_CPU_PROGRAM_MAP(lkage_map) MDRV_CPU_PROGRAM_MAP(lkage_map)
@ -407,6 +482,9 @@ static MACHINE_DRIVER_START( lkageb )
MDRV_CPU_PROGRAM_MAP(lkage_sound_map) MDRV_CPU_PROGRAM_MAP(lkage_sound_map)
/* IRQs are triggered by the YM2203 */ /* IRQs are triggered by the YM2203 */
MDRV_MACHINE_START(lkage)
MDRV_MACHINE_RESET(lkage)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(60)
@ -592,40 +670,39 @@ ROM_START( lkageb3 )
ROM_LOAD( "a54-10.2", 0x0000, 0x0200, CRC(17dfbd14) SHA1(f8f0b6dfedd4ba108dad43ccc7697ef4ab9cbf86) ) /* unknown */ ROM_LOAD( "a54-10.2", 0x0000, 0x0200, CRC(17dfbd14) SHA1(f8f0b6dfedd4ba108dad43ccc7697ef4ab9cbf86) ) /* unknown */
ROM_END ROM_END
static UINT8 mcu_val;
/*Note: This probably uses another MCU dump,which is undumped.*/ /*Note: This probably uses another MCU dump,which is undumped.*/
static READ8_HANDLER( fake_mcu_r ) static READ8_HANDLER( fake_mcu_r )
{ {
lkage_state *state = (lkage_state *)space->machine->driver_data;
int result = 0; int result = 0;
switch(mcu_val) switch (state->mcu_val)
{ {
/*These are for the attract mode*/ /*These are for the attract mode*/
case 0x01: case 0x01:
result = mcu_val-1; result = state->mcu_val - 1;
break; break;
case 0x90: case 0x90:
result = mcu_val+0x43; result = state->mcu_val + 0x43;
break; break;
/*Gameplay Protection,checked in this order at a start of a play*/ /*Gameplay Protection,checked in this order at a start of a play*/
case 0xa6: case 0xa6:
result = mcu_val+0x27; result = state->mcu_val + 0x27;
break; break;
case 0x34: case 0x34:
result = mcu_val+0x7f; result = state->mcu_val + 0x7f;
break; break;
case 0x48: case 0x48:
result = mcu_val+0xb7; result = state->mcu_val + 0xb7;
break; break;
default: default:
result = mcu_val; result = state->mcu_val;
break; break;
} }
return result; return result;
@ -633,13 +710,14 @@ static READ8_HANDLER( fake_mcu_r )
static WRITE8_HANDLER( fake_mcu_w ) static WRITE8_HANDLER( fake_mcu_w )
{ {
mcu_val = data; lkage_state *state = (lkage_state *)space->machine->driver_data;
state->mcu_val = data;
} }
static READ8_HANDLER( fake_status_r ) static READ8_HANDLER( fake_status_r )
{ {
static int res = 3; /* cpu data/mcu ready status */ lkage_state *state = (lkage_state *)space->machine->driver_data;
return res; return state->mcu_ready;
} }
static DRIVER_INIT( lkageb ) static DRIVER_INIT( lkageb )
@ -649,9 +727,9 @@ static DRIVER_INIT( lkageb )
memory_install_write8_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xf062, 0xf062, 0, 0, fake_mcu_w ); memory_install_write8_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xf062, 0xf062, 0, 0, fake_mcu_w );
} }
GAME( 1984, lkage, 0, lkage, lkage, 0, ROT0, "Taito Corporation", "The Legend of Kage", GAME_NO_COCKTAIL ) GAME( 1984, lkage, 0, lkage, lkage, 0, ROT0, "Taito Corporation", "The Legend of Kage", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE )
GAME( 1984, lkageo, lkage, lkage, lkage, 0, ROT0, "Taito Corporation", "The Legend of Kage (older)", GAME_NO_COCKTAIL ) GAME( 1984, lkageo, lkage, lkage, lkage, 0, ROT0, "Taito Corporation", "The Legend of Kage (older)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE )
GAME( 1984, lkageoo, lkage, lkage, lkage, 0, ROT0, "Taito Corporation", "The Legend of Kage (oldest)", GAME_NO_COCKTAIL ) GAME( 1984, lkageoo, lkage, lkage, lkage, 0, ROT0, "Taito Corporation", "The Legend of Kage (oldest)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE )
GAME( 1984, lkageb, lkage, lkageb, lkageb, lkageb, ROT0, "bootleg", "The Legend of Kage (bootleg set 1)", GAME_NO_COCKTAIL ) GAME( 1984, lkageb, lkage, lkageb, lkageb, lkageb, ROT0, "bootleg", "The Legend of Kage (bootleg set 1)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE )
GAME( 1984, lkageb2, lkage, lkageb, lkageb, lkageb, ROT0, "bootleg", "The Legend of Kage (bootleg set 2)", GAME_NO_COCKTAIL ) GAME( 1984, lkageb2, lkage, lkageb, lkageb, lkageb, ROT0, "bootleg", "The Legend of Kage (bootleg set 2)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE )
GAME( 1984, lkageb3, lkage, lkageb, lkageb, lkageb, ROT0, "bootleg", "The Legend of Kage (bootleg set 3)", GAME_NO_COCKTAIL ) GAME( 1984, lkageb3, lkage, lkageb, lkageb, lkageb, ROT0, "bootleg", "The Legend of Kage (bootleg set 3)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE )

View File

@ -16,8 +16,8 @@
#include "sound/flt_vol.h" #include "sound/flt_vol.h"
#include "includes/lockon.h" #include "includes/lockon.h"
#define V30_GND_ADDR ((lockon_ctrl_reg & 0x3) << 16) #define V30_GND_ADDR ((state->ctrl_reg & 0x3) << 16)
#define V30_OBJ_ADDR ((lockon_ctrl_reg & 0x18) << 13) #define V30_OBJ_ADDR ((state->ctrl_reg & 0x18) << 13)
/************************************* /*************************************
@ -30,16 +30,6 @@ static WRITE8_HANDLER( sound_vol );
static READ8_HANDLER( adc_r ); static READ8_HANDLER( adc_r );
/*************************************
*
* Globals
*
*************************************/
UINT32 lockon_main_inten;
UINT8 lockon_ctrl_reg;
/************************************* /*************************************
* *
* Machine functions * Machine functions
@ -63,23 +53,26 @@ UINT8 lockon_ctrl_reg;
static WRITE16_HANDLER( adrst_w ) static WRITE16_HANDLER( adrst_w )
{ {
lockon_ctrl_reg = data & 0xff; lockon_state *state = (lockon_state *)space->machine->driver_data;
state->ctrl_reg = data & 0xff;
/* Bus mastering for shared access */ /* Bus mastering for shared access */
cputag_set_input_line(space->machine, "ground", INPUT_LINE_HALT, data & 0x04 ? ASSERT_LINE : CLEAR_LINE); cpu_set_input_line(state->ground, INPUT_LINE_HALT, data & 0x04 ? ASSERT_LINE : CLEAR_LINE);
cputag_set_input_line(space->machine, "object", INPUT_LINE_HALT, data & 0x20 ? ASSERT_LINE : CLEAR_LINE); cpu_set_input_line(state->object, INPUT_LINE_HALT, data & 0x20 ? ASSERT_LINE : CLEAR_LINE);
cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_HALT, data & 0x40 ? CLEAR_LINE : ASSERT_LINE); cpu_set_input_line(state->audiocpu, INPUT_LINE_HALT, data & 0x40 ? CLEAR_LINE : ASSERT_LINE);
} }
static READ16_HANDLER( main_gnd_r ) static READ16_HANDLER( main_gnd_r )
{ {
const address_space *gndspace = cputag_get_address_space(space->machine, "ground", ADDRESS_SPACE_PROGRAM); lockon_state *state = (lockon_state *)space->machine->driver_data;
const address_space *gndspace = cpu_get_address_space(state->ground, ADDRESS_SPACE_PROGRAM);
return memory_read_word(gndspace, V30_GND_ADDR | offset * 2); return memory_read_word(gndspace, V30_GND_ADDR | offset * 2);
} }
static WRITE16_HANDLER( main_gnd_w ) static WRITE16_HANDLER( main_gnd_w )
{ {
const address_space *gndspace = cputag_get_address_space(space->machine, "ground", ADDRESS_SPACE_PROGRAM); lockon_state *state = (lockon_state *)space->machine->driver_data;
const address_space *gndspace = cpu_get_address_space(state->ground, ADDRESS_SPACE_PROGRAM);
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
memory_write_byte(gndspace, V30_GND_ADDR | (offset * 2 + 0), data); memory_write_byte(gndspace, V30_GND_ADDR | (offset * 2 + 0), data);
@ -89,13 +82,15 @@ static WRITE16_HANDLER( main_gnd_w )
static READ16_HANDLER( main_obj_r ) static READ16_HANDLER( main_obj_r )
{ {
const address_space *objspace = cputag_get_address_space(space->machine, "object", ADDRESS_SPACE_PROGRAM); lockon_state *state = (lockon_state *)space->machine->driver_data;
const address_space *objspace = cpu_get_address_space(state->object, ADDRESS_SPACE_PROGRAM);
return memory_read_word(objspace, V30_OBJ_ADDR | offset * 2); return memory_read_word(objspace, V30_OBJ_ADDR | offset * 2);
} }
static WRITE16_HANDLER( main_obj_w ) static WRITE16_HANDLER( main_obj_w )
{ {
const address_space *objspace = cputag_get_address_space(space->machine, "object", ADDRESS_SPACE_PROGRAM); lockon_state *state = (lockon_state *)space->machine->driver_data;
const address_space *objspace = cpu_get_address_space(state->object, ADDRESS_SPACE_PROGRAM);
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
memory_write_byte(objspace, V30_OBJ_ADDR | (offset * 2 + 0), data); memory_write_byte(objspace, V30_OBJ_ADDR | (offset * 2 + 0), data);
@ -105,10 +100,12 @@ static WRITE16_HANDLER( main_obj_w )
static WRITE16_HANDLER( tst_w ) static WRITE16_HANDLER( tst_w )
{ {
lockon_state *state = (lockon_state *)space->machine->driver_data;
if (offset < 0x800) if (offset < 0x800)
{ {
const address_space *gndspace = cputag_get_address_space(space->machine, "ground", ADDRESS_SPACE_PROGRAM); const address_space *gndspace = cpu_get_address_space(state->ground, ADDRESS_SPACE_PROGRAM);
const address_space *objspace = cputag_get_address_space(space->machine, "object", ADDRESS_SPACE_PROGRAM); const address_space *objspace = cpu_get_address_space(state->object, ADDRESS_SPACE_PROGRAM);
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
memory_write_byte(gndspace, V30_GND_ADDR | (offset * 2 + 0), data); memory_write_byte(gndspace, V30_GND_ADDR | (offset * 2 + 0), data);
@ -124,25 +121,29 @@ static WRITE16_HANDLER( tst_w )
static READ16_HANDLER( main_z80_r ) static READ16_HANDLER( main_z80_r )
{ {
const address_space *sndspace = cputag_get_address_space(space->machine, "audiocpu", ADDRESS_SPACE_PROGRAM); lockon_state *state = (lockon_state *)space->machine->driver_data;
const address_space *sndspace = cpu_get_address_space(state->audiocpu, ADDRESS_SPACE_PROGRAM);
return 0xff00 | memory_read_byte(sndspace, offset); return 0xff00 | memory_read_byte(sndspace, offset);
} }
static WRITE16_HANDLER( main_z80_w ) static WRITE16_HANDLER( main_z80_w )
{ {
const address_space *sndspace = cputag_get_address_space(space->machine, "audiocpu", ADDRESS_SPACE_PROGRAM); lockon_state *state = (lockon_state *)space->machine->driver_data;
const address_space *sndspace = cpu_get_address_space(state->audiocpu, ADDRESS_SPACE_PROGRAM);
memory_write_byte(sndspace, offset, data); memory_write_byte(sndspace, offset, data);
} }
static WRITE16_HANDLER( inten_w ) static WRITE16_HANDLER( inten_w )
{ {
lockon_main_inten = 1; lockon_state *state = (lockon_state *)space->machine->driver_data;
state->main_inten = 1;
} }
static WRITE16_HANDLER( emres_w ) static WRITE16_HANDLER( emres_w )
{ {
lockon_state *state = (lockon_state *)space->machine->driver_data;
watchdog_reset(space->machine); watchdog_reset(space->machine);
lockon_main_inten = 0; state->main_inten = 0;
} }
@ -157,8 +158,8 @@ static ADDRESS_MAP_START( main_v30, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x00000, 0x03fff) AM_RAM AM_RANGE(0x00000, 0x03fff) AM_RAM
AM_RANGE(0x04000, 0x04003) AM_READWRITE(lockon_crtc_r, lockon_crtc_w) AM_RANGE(0x04000, 0x04003) AM_READWRITE(lockon_crtc_r, lockon_crtc_w)
AM_RANGE(0x06000, 0x06001) AM_READ_PORT("DSW") AM_RANGE(0x06000, 0x06001) AM_READ_PORT("DSW")
AM_RANGE(0x08000, 0x081ff) AM_RAM AM_BASE(&lockon_hud_ram) AM_SIZE(&lockon_hudram_size) AM_RANGE(0x08000, 0x081ff) AM_RAM AM_BASE_SIZE_MEMBER(lockon_state, hud_ram, hudram_size)
AM_RANGE(0x09000, 0x09fff) AM_RAM_WRITE(lockon_char_w) AM_BASE(&lockon_char_ram) AM_RANGE(0x09000, 0x09fff) AM_RAM_WRITE(lockon_char_w) AM_BASE_MEMBER(lockon_state, char_ram)
AM_RANGE(0x0a000, 0x0a001) AM_WRITE(adrst_w) AM_RANGE(0x0a000, 0x0a001) AM_WRITE(adrst_w)
AM_RANGE(0x0b000, 0x0bfff) AM_WRITE(lockon_rotate_w) AM_RANGE(0x0b000, 0x0bfff) AM_WRITE(lockon_rotate_w)
AM_RANGE(0x0c000, 0x0cfff) AM_WRITE(lockon_fb_clut_w) AM_RANGE(0x0c000, 0x0cfff) AM_WRITE(lockon_fb_clut_w)
@ -177,8 +178,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( ground_v30, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( ground_v30, ADDRESS_SPACE_PROGRAM, 16 )
ADDRESS_MAP_UNMAP_HIGH ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0x00000, 0x03fff) AM_RAM AM_RANGE(0x00000, 0x03fff) AM_RAM
AM_RANGE(0x04000, 0x04fff) AM_RAM AM_BASE(&lockon_scene_ram) AM_RANGE(0x04000, 0x04fff) AM_RAM AM_BASE_MEMBER(lockon_state, scene_ram)
AM_RANGE(0x08000, 0x08fff) AM_RAM AM_BASE(&lockon_ground_ram) AM_SIZE(&lockon_groundram_size) AM_RANGE(0x08000, 0x08fff) AM_RAM AM_BASE_SIZE_MEMBER(lockon_state, ground_ram, groundram_size)
AM_RANGE(0x0C000, 0x0C001) AM_WRITE(lockon_scene_h_scr_w) AM_RANGE(0x0C000, 0x0C001) AM_WRITE(lockon_scene_h_scr_w)
AM_RANGE(0x0C002, 0x0C003) AM_WRITE(lockon_scene_v_scr_w) AM_RANGE(0x0C002, 0x0C003) AM_WRITE(lockon_scene_v_scr_w)
AM_RANGE(0x0C004, 0x0C005) AM_WRITE(lockon_ground_ctrl_w) AM_RANGE(0x0C004, 0x0C005) AM_WRITE(lockon_ground_ctrl_w)
@ -192,7 +193,7 @@ static ADDRESS_MAP_START( object_v30, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x00000, 0x03fff) AM_RAM AM_RANGE(0x00000, 0x03fff) AM_RAM
AM_RANGE(0x04000, 0x04001) AM_READWRITE(lockon_obj_4000_r, lockon_obj_4000_w) AM_RANGE(0x04000, 0x04001) AM_READWRITE(lockon_obj_4000_r, lockon_obj_4000_w)
AM_RANGE(0x08000, 0x08fff) AM_WRITE(lockon_tza112_w) AM_RANGE(0x08000, 0x08fff) AM_WRITE(lockon_tza112_w)
AM_RANGE(0x0c000, 0x0c1ff) AM_RAM AM_BASE(&lockon_object_ram) AM_SIZE(&lockon_objectram_size) AM_RANGE(0x0c000, 0x0c1ff) AM_RAM AM_BASE_SIZE_MEMBER(lockon_state, object_ram, objectram_size)
AM_RANGE(0x30000, 0x3ffff) AM_MIRROR(0xc0000) AM_ROM AM_RANGE(0x30000, 0x3ffff) AM_MIRROR(0xc0000) AM_ROM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -391,6 +392,8 @@ static WRITE8_HANDLER( sound_vol )
#define LO_RI 100000.0 #define LO_RI 100000.0
#define LO_RP 100000.0 #define LO_RP 100000.0
lockon_state *state = (lockon_state *)space->machine->driver_data;
static const double gains[16] = static const double gains[16] =
{ {
-( 1 / (1/LO_RP + 1/(LO_R3 + LO_R2 + LO_R1 + LO_R0)) ) / LO_RI, -( 1 / (1/LO_RP + 1/(LO_R3 + LO_R2 + LO_R1 + LO_R0)) ) / LO_RI,
@ -414,18 +417,19 @@ static WRITE8_HANDLER( sound_vol )
double lgain = gains[data & 0xf]; double lgain = gains[data & 0xf];
double rgain = gains[data >> 4]; double rgain = gains[data >> 4];
flt_volume_set_volume(devtag_get_device(space->machine, "f2203.1l"), lgain); flt_volume_set_volume(state->f2203_1l, lgain);
flt_volume_set_volume(devtag_get_device(space->machine, "f2203.2l"), lgain); flt_volume_set_volume(state->f2203_2l, lgain);
flt_volume_set_volume(devtag_get_device(space->machine, "f2203.3l"), lgain); flt_volume_set_volume(state->f2203_3l, lgain);
flt_volume_set_volume(devtag_get_device(space->machine, "f2203.1r"), rgain); flt_volume_set_volume(state->f2203_1r, rgain);
flt_volume_set_volume(devtag_get_device(space->machine, "f2203.2r"), rgain); flt_volume_set_volume(state->f2203_2r, rgain);
flt_volume_set_volume(devtag_get_device(space->machine, "f2203.3r"), rgain); flt_volume_set_volume(state->f2203_3r, rgain);
} }
static void ym2203_irq(running_device *device, int irq) static void ym2203_irq(running_device *device, int irq)
{ {
cputag_set_input_line(device->machine, "audiocpu", 0, irq ? ASSERT_LINE : CLEAR_LINE ); lockon_state *state = (lockon_state *)device->machine->driver_data;
cpu_set_input_line(state->audiocpu, 0, irq ? ASSERT_LINE : CLEAR_LINE );
} }
static WRITE8_DEVICE_HANDLER( ym2203_out_b ) static WRITE8_DEVICE_HANDLER( ym2203_out_b )
@ -458,7 +462,66 @@ static const ym2203_interface ym2203_config =
* *
*************************************/ *************************************/
static MACHINE_START( lockon )
{
lockon_state *state = (lockon_state *)machine->driver_data;
state->maincpu = devtag_get_device(machine, "maincpu");
state->audiocpu = devtag_get_device(machine, "audiocpu");
state->ground = devtag_get_device(machine, "ground");
state->object = devtag_get_device(machine, "object");
state->f2203_1l = devtag_get_device(machine, "f2203.1l");
state->f2203_2l = devtag_get_device(machine, "f2203.2l");
state->f2203_3l = devtag_get_device(machine, "f2203.3l");
state->f2203_1r = devtag_get_device(machine, "f2203.1r");
state->f2203_2r = devtag_get_device(machine, "f2203.2r");
state->f2203_3r = devtag_get_device(machine, "f2203.3r");
state_save_register_global(machine, state->ground_ctrl);
state_save_register_global(machine, state->scroll_h);
state_save_register_global(machine, state->scroll_v);
state_save_register_global(machine, state->xsal);
state_save_register_global(machine, state->x0ll);
state_save_register_global(machine, state->dx0ll);
state_save_register_global(machine, state->dxll);
state_save_register_global(machine, state->ysal);
state_save_register_global(machine, state->y0ll);
state_save_register_global(machine, state->dy0ll);
state_save_register_global(machine, state->dyll);
state_save_register_global(machine, state->iden);
state_save_register_global(machine, state->obj_pal_latch);
state_save_register_global(machine, state->obj_pal_addr);
state_save_register_global(machine, state->ctrl_reg);
state_save_register_global(machine, state->main_inten);
}
static MACHINE_RESET( lockon )
{
lockon_state *state = (lockon_state *)machine->driver_data;
state->ground_ctrl = 0;
state->scroll_h = 0;
state->scroll_v = 0;
state->xsal = 0;
state->x0ll = 0;
state->dx0ll = 0;
state->dxll = 0;
state->ysal = 0;
state->y0ll = 0;
state->dy0ll = 0;
state->dyll = 0;
state->iden = 0;
state->obj_pal_latch = 0;
state->obj_pal_addr = 0;
state->ctrl_reg = 0;
state->main_inten = 0;
}
static MACHINE_DRIVER_START( lockon ) static MACHINE_DRIVER_START( lockon )
/* driver data */
MDRV_DRIVER_DATA(lockon_state)
MDRV_CPU_ADD("maincpu", V30, XTAL_16MHz / 2) MDRV_CPU_ADD("maincpu", V30, XTAL_16MHz / 2)
MDRV_CPU_PROGRAM_MAP(main_v30) MDRV_CPU_PROGRAM_MAP(main_v30)
@ -475,6 +538,9 @@ static MACHINE_DRIVER_START( lockon )
MDRV_WATCHDOG_TIME_INIT(NSEC(PERIOD_OF_555_ASTABLE_NSEC(10000, 4700, 10000e-12) * 4096)) MDRV_WATCHDOG_TIME_INIT(NSEC(PERIOD_OF_555_ASTABLE_NSEC(10000, 4700, 10000e-12) * 4096))
MDRV_QUANTUM_TIME(HZ(600)) MDRV_QUANTUM_TIME(HZ(600))
MDRV_MACHINE_START(lockon)
MDRV_MACHINE_RESET(lockon)
MDRV_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK) MDRV_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK)
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
@ -754,5 +820,5 @@ ROM_END
* *
*************************************/ *************************************/
GAME( 1986, lockon, 0, lockon, lockon, 0, ROT0, "Tatsumi", "Lock-On (rev. E)", 0 ) GAME( 1986, lockon, 0, lockon, lockon, 0, ROT0, "Tatsumi", "Lock-On (rev. E)", GAME_SUPPORTS_SAVE )
GAME( 1986, lockonc, lockon, lockon, lockone, 0, ROT0, "Tatsumi", "Lock-On (rev. C)", 0 ) GAME( 1986, lockonc, lockon, lockon, lockone, 0, ROT0, "Tatsumi", "Lock-On (rev. C)", GAME_SUPPORTS_SAVE )

View File

@ -155,10 +155,8 @@ Notes:
static WRITE8_HANDLER( lsasquad_bankswitch_w ) static WRITE8_HANDLER( lsasquad_bankswitch_w )
{ {
UINT8 *ROM = memory_region(space->machine, "maincpu");
/* bits 0-2 select ROM bank */ /* bits 0-2 select ROM bank */
memory_set_bankptr(space->machine, "bank1",&ROM[0x10000 + 0x2000 * (data & 7)]); memory_set_bank(space->machine, "bank1", data & 0x07);
/* bit 3 is zeroed on startup, maybe reset sound CPU */ /* bit 3 is zeroed on startup, maybe reset sound CPU */
@ -172,9 +170,9 @@ static ADDRESS_MAP_START( lsasquad_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x9fff) AM_ROMBANK("bank1") AM_RANGE(0x8000, 0x9fff) AM_ROMBANK("bank1")
AM_RANGE(0xa000, 0xbfff) AM_RAM /* SRAM */ AM_RANGE(0xa000, 0xbfff) AM_RAM /* SRAM */
AM_RANGE(0xc000, 0xdfff) AM_RAM AM_BASE_GENERIC(videoram) AM_SIZE_GENERIC(videoram) /* SCREEN RAM */ AM_RANGE(0xc000, 0xdfff) AM_RAM AM_BASE_SIZE_MEMBER(lsasquad_state, videoram, videoram_size) /* SCREEN RAM */
AM_RANGE(0xe000, 0xe3ff) AM_RAM AM_BASE(&lsasquad_scrollram) /* SCROLL RAM */ AM_RANGE(0xe000, 0xe3ff) AM_RAM AM_BASE_MEMBER(lsasquad_state, scrollram) /* SCROLL RAM */
AM_RANGE(0xe400, 0xe5ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) /* OBJECT RAM */ AM_RANGE(0xe400, 0xe5ff) AM_RAM AM_BASE_SIZE_MEMBER(lsasquad_state, spriteram, spriteram_size) /* OBJECT RAM */
AM_RANGE(0xe800, 0xe800) AM_READ_PORT("DSWA") AM_RANGE(0xe800, 0xe800) AM_READ_PORT("DSWA")
AM_RANGE(0xe801, 0xe801) AM_READ_PORT("DSWB") AM_RANGE(0xe801, 0xe801) AM_READ_PORT("DSWB")
AM_RANGE(0xe802, 0xe802) AM_READ_PORT("DSWC") AM_RANGE(0xe802, 0xe802) AM_READ_PORT("DSWC")
@ -194,7 +192,7 @@ static ADDRESS_MAP_START( lsasquad_sound_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x8000, 0x87ff) AM_RAM AM_RANGE(0x8000, 0x87ff) AM_RAM
AM_RANGE(0xa000, 0xa001) AM_DEVREADWRITE("ymsnd", ym2203_r,ym2203_w) AM_RANGE(0xa000, 0xa001) AM_DEVREADWRITE("ymsnd", ym2203_r,ym2203_w)
AM_RANGE(0xc000, 0xc001) AM_DEVWRITE("aysnd", ay8910_address_data_w) AM_RANGE(0xc000, 0xc001) AM_DEVWRITE("aysnd", ay8910_address_data_w)
AM_RANGE(0xd000, 0xd000) AM_READWRITE(lsasquad_sh_sound_command_r,lsasquad_sh_result_w) AM_RANGE(0xd000, 0xd000) AM_READWRITE(lsasquad_sh_sound_command_r, lsasquad_sh_result_w)
AM_RANGE(0xd400, 0xd400) AM_WRITE(lsasquad_sh_nmi_disable_w) AM_RANGE(0xd400, 0xd400) AM_WRITE(lsasquad_sh_nmi_disable_w)
AM_RANGE(0xd800, 0xd800) AM_WRITE(lsasquad_sh_nmi_enable_w) AM_RANGE(0xd800, 0xd800) AM_WRITE(lsasquad_sh_nmi_enable_w)
AM_RANGE(0xd800, 0xd800) AM_READ(lsasquad_sound_status_r) AM_RANGE(0xd800, 0xd800) AM_READ(lsasquad_sound_status_r)
@ -203,11 +201,11 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( lsasquad_m68705_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( lsasquad_m68705_map, ADDRESS_SPACE_PROGRAM, 8 )
ADDRESS_MAP_GLOBAL_MASK(0x7ff) ADDRESS_MAP_GLOBAL_MASK(0x7ff)
AM_RANGE(0x0000, 0x0000) AM_READWRITE(lsasquad_68705_portA_r,lsasquad_68705_portA_w) AM_RANGE(0x0000, 0x0000) AM_READWRITE(lsasquad_68705_port_a_r,lsasquad_68705_port_a_w)
AM_RANGE(0x0001, 0x0001) AM_READWRITE(lsasquad_68705_portB_r,lsasquad_68705_portB_w) AM_RANGE(0x0001, 0x0001) AM_READWRITE(lsasquad_68705_port_b_r,lsasquad_68705_port_b_w)
AM_RANGE(0x0002, 0x0002) AM_READ(lsasquad_mcu_status_r) AM_RANGE(0x0002, 0x0002) AM_READ(lsasquad_mcu_status_r)
AM_RANGE(0x0004, 0x0004) AM_WRITE(lsasquad_68705_ddrA_w) AM_RANGE(0x0004, 0x0004) AM_WRITE(lsasquad_68705_ddr_a_w)
AM_RANGE(0x0005, 0x0005) AM_WRITE(lsasquad_68705_ddrB_w) AM_RANGE(0x0005, 0x0005) AM_WRITE(lsasquad_68705_ddr_b_w)
AM_RANGE(0x0010, 0x007f) AM_RAM AM_RANGE(0x0010, 0x007f) AM_RAM
AM_RANGE(0x0080, 0x07ff) AM_ROM AM_RANGE(0x0080, 0x07ff) AM_ROM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -342,9 +340,9 @@ static ADDRESS_MAP_START( daikaiju_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x9fff) AM_ROMBANK("bank1") AM_RANGE(0x8000, 0x9fff) AM_ROMBANK("bank1")
AM_RANGE(0xa000, 0xbfff) AM_RAM /* SRAM */ AM_RANGE(0xa000, 0xbfff) AM_RAM /* SRAM */
AM_RANGE(0xc000, 0xdfff) AM_RAM AM_BASE_GENERIC(videoram) AM_SIZE_GENERIC(videoram) /* SCREEN RAM */ AM_RANGE(0xc000, 0xdfff) AM_RAM AM_BASE_SIZE_MEMBER(lsasquad_state, videoram, videoram_size) /* SCREEN RAM */
AM_RANGE(0xe000, 0xe3ff) AM_RAM AM_BASE(&lsasquad_scrollram) /* SCROLL RAM */ AM_RANGE(0xe000, 0xe3ff) AM_RAM AM_BASE_MEMBER(lsasquad_state, scrollram) /* SCROLL RAM */
AM_RANGE(0xe400, 0xe7ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) /* OBJECT RAM */ AM_RANGE(0xe400, 0xe7ff) AM_RAM AM_BASE_SIZE_MEMBER(lsasquad_state, spriteram, spriteram_size) /* OBJECT RAM */
AM_RANGE(0xe800, 0xe800) AM_READ_PORT("DSWA") AM_RANGE(0xe800, 0xe800) AM_READ_PORT("DSWA")
AM_RANGE(0xe801, 0xe801) AM_READ_PORT("DSWB") AM_RANGE(0xe801, 0xe801) AM_READ_PORT("DSWB")
AM_RANGE(0xe803, 0xe803) AM_READ(daikaiju_mcu_status_r) /* COIN + 68705 status */ AM_RANGE(0xe803, 0xe803) AM_READ(daikaiju_mcu_status_r) /* COIN + 68705 status */
@ -505,7 +503,8 @@ GFXDECODE_END
static void irqhandler(running_device *device, int irq) static void irqhandler(running_device *device, int irq)
{ {
cputag_set_input_line(device->machine, "audiocpu", 0, irq ? ASSERT_LINE : CLEAR_LINE); lsasquad_state *state = (lsasquad_state *)device->machine->driver_data;
cpu_set_input_line(state->audiocpu, 0, irq ? ASSERT_LINE : CLEAR_LINE);
} }
static WRITE8_DEVICE_HANDLER( unk ) static WRITE8_DEVICE_HANDLER( unk )
@ -528,8 +527,81 @@ static const ym2203_interface ym2203_config =
}; };
static MACHINE_START( lsasquad )
{
lsasquad_state *state = (lsasquad_state *)machine->driver_data;
UINT8 *ROM = memory_region(machine, "maincpu");
memory_configure_bank(machine, "bank1", 0, 8, &ROM[0x10000], 0x2000);
state->maincpu = devtag_get_device(machine, "maincpu");
state->audiocpu = devtag_get_device(machine, "audiocpu");
state->mcu = devtag_get_device(machine, "mcu");
state_save_register_global(machine, state->port_a_in);
state_save_register_global(machine, state->port_a_out);
state_save_register_global(machine, state->ddr_a);
state_save_register_global(machine, state->port_b_in);
state_save_register_global(machine, state->port_b_out);
state_save_register_global(machine, state->ddr_b);
state_save_register_global(machine, state->mcu_sent);
state_save_register_global(machine, state->main_sent);
state_save_register_global(machine, state->from_main);
state_save_register_global(machine, state->from_mcu);
state_save_register_global(machine, state->sound_pending);
state_save_register_global(machine, state->sound_nmi_enable);
state_save_register_global(machine, state->pending_nmi);
state_save_register_global(machine, state->sound_cmd);
state_save_register_global(machine, state->sound_result);
state_save_register_global(machine, state->daikaiju_xor);
state_save_register_global(machine, state->daikaiju_command);
state_save_register_global(machine, state->daikaiju_length);
state_save_register_global(machine, state->daikaiju_prev);
state_save_register_global(machine, state->daikaiju_cnt);
state_save_register_global(machine, state->daikaiju_cntr);
state_save_register_global_array(machine, state->daikaiju_buffer);
}
static MACHINE_RESET( lsasquad )
{
lsasquad_state *state = (lsasquad_state *)machine->driver_data;
state->sound_pending = 0;
state->sound_nmi_enable = 0;
state->pending_nmi = 0;
state->sound_cmd = 0;
state->sound_result = 0;
state->port_a_in = 0;
state->port_a_out = 0;
state->ddr_a = 0;
state->port_b_in = 0;
state->port_b_out = 0;
state->ddr_b = 0;
state->mcu_sent = 0;
state->main_sent = 0;
state->from_main = 0;
state->from_mcu = 0;
/* daikaiju */
state->daikaiju_xor = -1;
state->daikaiju_command = 0;
state->daikaiju_length = 0;
state->daikaiju_prev = 0;
state->daikaiju_cnt = 0;
state->daikaiju_cntr = 0;
memset(state->daikaiju_buffer, 0, ARRAY_LENGTH(state->daikaiju_buffer));
}
static MACHINE_DRIVER_START( lsasquad ) static MACHINE_DRIVER_START( lsasquad )
/* driver data */
MDRV_DRIVER_DATA(lsasquad_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80, 6000000) /* 6 MHz? */ MDRV_CPU_ADD("maincpu", Z80, 6000000) /* 6 MHz? */
MDRV_CPU_PROGRAM_MAP(lsasquad_map) MDRV_CPU_PROGRAM_MAP(lsasquad_map)
@ -545,6 +617,9 @@ static MACHINE_DRIVER_START( lsasquad )
/* synchronization of the CPUs */ /* synchronization of the CPUs */
/* main<->sound synchronization depends on this */ /* main<->sound synchronization depends on this */
MDRV_MACHINE_START(lsasquad)
MDRV_MACHINE_RESET(lsasquad)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(60)
@ -575,6 +650,9 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( daikaiju ) static MACHINE_DRIVER_START( daikaiju )
/* driver data */
MDRV_DRIVER_DATA(lsasquad_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80, 6000000) MDRV_CPU_ADD("maincpu", Z80, 6000000)
MDRV_CPU_PROGRAM_MAP(daikaiju_map) MDRV_CPU_PROGRAM_MAP(daikaiju_map)
@ -588,7 +666,8 @@ static MACHINE_DRIVER_START( daikaiju )
/* synchronization of the CPUs */ /* synchronization of the CPUs */
/* main<->sound synchronization depends on this */ /* main<->sound synchronization depends on this */
MDRV_MACHINE_RESET(daikaiju) MDRV_MACHINE_START(lsasquad)
MDRV_MACHINE_RESET(lsasquad)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
@ -730,11 +809,19 @@ ROM_END
/* coin inputs are inverted in storming */ /* coin inputs are inverted in storming */
static DRIVER_INIT( lsasquad ) { lsasquad_invertcoin = 0x00; } static DRIVER_INIT( lsasquad )
static DRIVER_INIT( storming ) { lsasquad_invertcoin = 0x0c; } {
lsasquad_state *state = (lsasquad_state *)machine->driver_data;
state->invertcoin = 0x00;
}
static DRIVER_INIT( storming )
{
lsasquad_state *state = (lsasquad_state *)machine->driver_data;
state->invertcoin = 0x0c;
}
GAME( 1986, lsasquad, 0, lsasquad, lsasquad, lsasquad, ROT270, "Taito", "Land Sea Air Squad / Riku Kai Kuu Saizensen", GAME_IMPERFECT_GRAPHICS ) GAME( 1986, lsasquad, 0, lsasquad, lsasquad, lsasquad, ROT270, "Taito", "Land Sea Air Squad / Riku Kai Kuu Saizensen", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE )
GAME( 1986, storming, lsasquad, lsasquad, lsasquad, storming, ROT270, "Taito", "Storming Party / Riku Kai Kuu Saizensen", GAME_IMPERFECT_GRAPHICS ) GAME( 1986, storming, lsasquad, lsasquad, lsasquad, storming, ROT270, "Taito", "Storming Party / Riku Kai Kuu Saizensen", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE )
GAME( 1986, daikaiju, 0, daikaiju, daikaiju, 0, ROT270, "Taito", "Daikaiju no Gyakushu", GAME_IMPERFECT_GRAPHICS | GAME_UNEMULATED_PROTECTION) GAME( 1986, daikaiju, 0, daikaiju, daikaiju, 0, ROT270, "Taito", "Daikaiju no Gyakushu", GAME_IMPERFECT_GRAPHICS | GAME_UNEMULATED_PROTECTION | GAME_SUPPORTS_SAVE )

View File

@ -1,19 +1,27 @@
typedef struct _liberate_state liberate_state; typedef struct _liberate_state liberate_state;
struct _liberate_state struct _liberate_state
{ {
UINT8 *videoram;
UINT8 *colorram;
UINT8 *paletteram;
UINT8 *spriteram;
UINT8 *scratchram;
UINT8 *charram; /* prosoccr */
UINT8 *bg_vram; /* prosport */
UINT8 io_ram[16];
int bank; int bank;
int latch; int latch;
UINT8 gfx_rom_readback; UINT8 gfx_rom_readback;
int background_color; int background_color;
int background_disable; int background_disable;
tilemap_t *background_tilemap;
tilemap_t *back_tilemap;
tilemap_t *fix_tilemap; tilemap_t *fix_tilemap;
UINT8 io_ram[16];
UINT8 *videoram; running_device *maincpu;
UINT8 *colorram; running_device *audiocpu;
UINT8 *scratchram;
UINT8 *charram; /* prosoccr */
UINT8 *bg_vram; /* prosport */
}; };

View File

@ -1,14 +1,48 @@
typedef struct _lkage_state lkage_state;
struct _lkage_state
{
UINT8 * scroll;
UINT8 * vreg;
UINT8 * videoram;
UINT8 * spriteram;
// UINT8 * paletteram; // currently this uses generic palette handling
/* video-related */
tilemap_t *bg_tilemap, *fg_tilemap, *tx_tilemap;
UINT8 bg_tile_bank, fg_tile_bank;
/* misc */
int sound_nmi_enable, pending_nmi;
/* mcu */
UINT8 from_main, from_mcu;
int mcu_sent, main_sent;
UINT8 port_a_in, port_a_out, ddr_a;
UINT8 port_b_in, port_b_out, ddr_b;
UINT8 port_c_in, port_c_out, ddr_c;
/* lkageb fake mcu */
UINT8 mcu_val;
int mcu_ready; /* cpu data/mcu ready status */
/* devices */
running_device *maincpu;
running_device *audiocpu;
running_device *mcu;
};
/*----------- defined in machine/lkage.c -----------*/ /*----------- defined in machine/lkage.c -----------*/
READ8_HANDLER( lkage_68705_portA_r ); READ8_HANDLER( lkage_68705_port_a_r );
WRITE8_HANDLER( lkage_68705_portA_w ); WRITE8_HANDLER( lkage_68705_port_a_w );
READ8_HANDLER( lkage_68705_portB_r ); READ8_HANDLER( lkage_68705_port_b_r );
WRITE8_HANDLER( lkage_68705_portB_w ); WRITE8_HANDLER( lkage_68705_port_b_w );
READ8_HANDLER( lkage_68705_portC_r ); READ8_HANDLER( lkage_68705_port_c_r );
WRITE8_HANDLER( lkage_68705_portC_w ); WRITE8_HANDLER( lkage_68705_port_c_w );
WRITE8_HANDLER( lkage_68705_ddrA_w ); WRITE8_HANDLER( lkage_68705_ddr_a_w );
WRITE8_HANDLER( lkage_68705_ddrB_w ); WRITE8_HANDLER( lkage_68705_ddr_b_w );
WRITE8_HANDLER( lkage_68705_ddrC_w ); WRITE8_HANDLER( lkage_68705_ddr_c_w );
WRITE8_HANDLER( lkage_mcu_w ); WRITE8_HANDLER( lkage_mcu_w );
READ8_HANDLER( lkage_mcu_r ); READ8_HANDLER( lkage_mcu_r );
READ8_HANDLER( lkage_mcu_status_r ); READ8_HANDLER( lkage_mcu_status_r );
@ -16,7 +50,6 @@ READ8_HANDLER( lkage_mcu_status_r );
/*----------- defined in video/lkage.c -----------*/ /*----------- defined in video/lkage.c -----------*/
extern UINT8 *lkage_scroll, *lkage_vreg;
WRITE8_HANDLER( lkage_videoram_w ); WRITE8_HANDLER( lkage_videoram_w );
VIDEO_START( lkage ); VIDEO_START( lkage );
VIDEO_UPDATE( lkage ); VIDEO_UPDATE( lkage );

View File

@ -5,20 +5,76 @@
*************************************************************************/ *************************************************************************/
/* Calculated from CRT controller writes */ /* Calculated from CRT controller writes */
#define PIXEL_CLOCK (XTAL_21MHz / 3) #define PIXEL_CLOCK (XTAL_21MHz / 3)
#define FRAMEBUFFER_CLOCK XTAL_10MHz #define FRAMEBUFFER_CLOCK XTAL_10MHz
#define HBSTART 320 #define HBSTART 320
#define HBEND 0 #define HBEND 0
#define HTOTAL 448 #define HTOTAL 448
#define VBSTART 240 #define VBSTART 240
#define VBEND 0 #define VBEND 0
#define VTOTAL 280 #define VTOTAL 280
typedef struct _lockon_state lockon_state;
struct _lockon_state
{
/* memory pointers */
UINT16 *char_ram;
UINT16 *hud_ram;
UINT16 *scene_ram;
UINT16 *ground_ram;
UINT16 *object_ram;
size_t hudram_size;
size_t objectram_size;
size_t groundram_size;
/* video-related */
tilemap_t *tilemap;
UINT8 ground_ctrl;
UINT16 scroll_h;
UINT16 scroll_v;
bitmap_t *front_buffer;
bitmap_t *back_buffer;
emu_timer *bufend_timer;
emu_timer *cursor_timer;
/* Rotation Control */
UINT16 xsal;
UINT16 x0ll;
UINT16 dx0ll;
UINT16 dxll;
UINT16 ysal;
UINT16 y0ll;
UINT16 dy0ll;
UINT16 dyll;
/* Object palette RAM control */
UINT32 iden;
UINT8 * obj_pal_ram;
UINT32 obj_pal_latch;
UINT32 obj_pal_addr;
/* misc */
UINT8 ctrl_reg;
UINT32 main_inten;
/* devices */
running_device *maincpu;
running_device *audiocpu;
running_device *ground;
running_device *object;
running_device *f2203_1l;
running_device *f2203_2l;
running_device *f2203_3l;
running_device *f2203_1r;
running_device *f2203_2r;
running_device *f2203_3r;
};
/*----------- defined in drivers/lockon.c -----------*/
extern UINT8 lockon_ctrl_reg;
extern UINT32 lockon_main_inten;
/*----------- defined in video/lockon.c -----------*/ /*----------- defined in video/lockon.c -----------*/
PALETTE_INIT( lockon ); PALETTE_INIT( lockon );
VIDEO_START( lockon ); VIDEO_START( lockon );
VIDEO_UPDATE( lockon ); VIDEO_UPDATE( lockon );
@ -35,13 +91,3 @@ WRITE16_HANDLER( lockon_char_w );
WRITE16_HANDLER( lockon_tza112_w ); WRITE16_HANDLER( lockon_tza112_w );
READ16_HANDLER( lockon_obj_4000_r ); READ16_HANDLER( lockon_obj_4000_r );
WRITE16_HANDLER( lockon_obj_4000_w ); WRITE16_HANDLER( lockon_obj_4000_w );
extern UINT16 *lockon_char_ram;
extern UINT16 *lockon_scene_ram;
extern UINT16 *lockon_object_ram;
extern UINT16 *lockon_hud_ram;
extern UINT16 *lockon_ground_ram;
extern size_t lockon_hudram_size;
extern size_t lockon_objectram_size;
extern size_t lockon_groundram_size;

View File

@ -1,17 +1,44 @@
typedef struct _lsasquad_state lsasquad_state;
struct _lsasquad_state
{
/* memory pointers */
UINT8 * scrollram;
UINT8 * videoram;
UINT8 * spriteram;
size_t spriteram_size;
size_t videoram_size;
/* misc */
int invertcoin;
int sound_pending;
int sound_nmi_enable, pending_nmi, sound_cmd, sound_result;
/* daikaiju */
int daikaiju_xor, daikaiju_command, daikaiju_length, daikaiju_prev, daikaiju_cnt, daikaiju_cntr;
int daikaiju_buffer[256];
/* mcu */
UINT8 from_main, from_mcu;
int mcu_sent, main_sent;
UINT8 port_a_in, port_a_out, ddr_a;
UINT8 port_b_in, port_b_out, ddr_b;
/* devices */
running_device *maincpu;
running_device *audiocpu;
running_device *mcu;
};
/*----------- defined in machine/daikaiju.c -----------*/ /*----------- defined in machine/daikaiju.c -----------*/
READ8_HANDLER( daikaiju_mcu_r); READ8_HANDLER( daikaiju_mcu_r);
WRITE8_HANDLER( daikaiju_mcu_w); WRITE8_HANDLER( daikaiju_mcu_w);
READ8_HANDLER( daikaiju_mcu_status_r); READ8_HANDLER( daikaiju_mcu_status_r);
MACHINE_RESET(daikaiju);
/*----------- defined in machine/lsasquad.c -----------*/ /*----------- defined in machine/lsasquad.c -----------*/
extern int lsasquad_invertcoin;
extern int lsasquad_sound_pending;
WRITE8_HANDLER( lsasquad_sh_nmi_disable_w ); WRITE8_HANDLER( lsasquad_sh_nmi_disable_w );
WRITE8_HANDLER( lsasquad_sh_nmi_enable_w ); WRITE8_HANDLER( lsasquad_sh_nmi_enable_w );
WRITE8_HANDLER( lsasquad_sound_command_w ); WRITE8_HANDLER( lsasquad_sound_command_w );
@ -20,12 +47,12 @@ WRITE8_HANDLER( lsasquad_sh_result_w );
READ8_HANDLER( lsasquad_sound_result_r ); READ8_HANDLER( lsasquad_sound_result_r );
READ8_HANDLER( lsasquad_sound_status_r ); READ8_HANDLER( lsasquad_sound_status_r );
READ8_HANDLER( lsasquad_68705_portA_r ); READ8_HANDLER( lsasquad_68705_port_a_r );
WRITE8_HANDLER( lsasquad_68705_portA_w ); WRITE8_HANDLER( lsasquad_68705_port_a_w );
WRITE8_HANDLER( lsasquad_68705_ddrA_w ); WRITE8_HANDLER( lsasquad_68705_ddr_a_w );
READ8_HANDLER( lsasquad_68705_portB_r ); READ8_HANDLER( lsasquad_68705_port_b_r );
WRITE8_HANDLER( lsasquad_68705_portB_w ); WRITE8_HANDLER( lsasquad_68705_port_b_w );
WRITE8_HANDLER( lsasquad_68705_ddrB_w ); WRITE8_HANDLER( lsasquad_68705_ddr_b_w );
WRITE8_HANDLER( lsasquad_mcu_w ); WRITE8_HANDLER( lsasquad_mcu_w );
READ8_HANDLER( lsasquad_mcu_r ); READ8_HANDLER( lsasquad_mcu_r );
READ8_HANDLER( lsasquad_mcu_status_r ); READ8_HANDLER( lsasquad_mcu_status_r );
@ -36,7 +63,5 @@ READ8_HANDLER( daikaiju_sh_sound_command_r );
/*----------- defined in video/lsasquad.c -----------*/ /*----------- defined in video/lsasquad.c -----------*/
extern UINT8 *lsasquad_scrollram;
VIDEO_UPDATE( lsasquad ); VIDEO_UPDATE( lsasquad );
VIDEO_UPDATE( daikaiju ); VIDEO_UPDATE( daikaiju );

View File

@ -110,58 +110,49 @@ displayed (game) or not (attract mode). Due to above bug message is always displ
#define MCU_CONTROLS1 0x36 #define MCU_CONTROLS1 0x36
#define MCU_MESSAGE 0x40 #define MCU_MESSAGE 0x40
#define MCU_CONTROLS2 0x44 #define MCU_CONTROLS2 0x44
#define MCU_ID 0x60 #define MCU_ID 0x60
#define MCU_ADDRESS1_LENGTH 2 #define MCU_ADDRESS1_LENGTH 2
#define MCU_ADDRESS2_LENGTH 2 #define MCU_ADDRESS2_LENGTH 2
#define MCU_CONTROLS1_LENGTH 2 #define MCU_CONTROLS1_LENGTH 2
#define MCU_MESSAGE_LENGTH 3 #define MCU_MESSAGE_LENGTH 3
#define MCU_CONTROLS2_LENGTH 3 #define MCU_CONTROLS2_LENGTH 3
#define MCU_ID_LENGTH 0 #define MCU_ID_LENGTH 0
#define SET_COMMAND(n) daikaiju_command=data; \ #define SET_COMMAND(n) state->daikaiju_command = data; \
daikaiju_length=n;\ state->daikaiju_length = n;\
daikaiju_cnt=0;\ state->daikaiju_cnt = 0;\
daikaiju_cntr=0; state->daikaiju_cntr = 0;
static int daikaiju_xor, daikaiju_command, daikaiju_length, daikaiju_prev, daikaiju_cnt, daikaiju_cntr;
static int daikaiju_buffer[256];
static const int xortable[]= static const int xortable[]=
{ {
0xF5, 0xD5, 0x6A, 0x26, 0x00, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x16, 0x00, 0xCB, 0x23, 0x19, 0xF5, 0xD5, 0x6A, 0x26, 0x00, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x16, 0x00, 0xCB, 0x23, 0x19,
0x11, 0x00, 0xC0, 0x19, 0xD1, 0xF1, 0xC9, -1 0x11, 0x00, 0xC0, 0x19, 0xD1, 0xF1, 0xC9, -1
}; };
MACHINE_RESET(daikaiju)
{
daikaiju_xor=-1;
daikaiju_command=0;
daikaiju_length=0;
}
WRITE8_HANDLER( daikaiju_mcu_w ) WRITE8_HANDLER( daikaiju_mcu_w )
{ {
if(daikaiju_xor <0) lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
if (state->daikaiju_xor < 0)
{ {
//reset //reset
daikaiju_xor=0; state->daikaiju_xor = 0;
data^=0xc3; data ^= 0xc3;
} }
else else
{ {
data^=xortable[daikaiju_xor]; data ^= xortable[state->daikaiju_xor];
//check for end of table //check for end of table
if(xortable[++daikaiju_xor]<0) if (xortable[++state->daikaiju_xor] < 0)
{ {
daikaiju_xor=0; state->daikaiju_xor = 0;
} }
} }
daikaiju_prev=data; state->daikaiju_prev = data;
if(daikaiju_length == 0) //new command if (state->daikaiju_length == 0) //new command
{ {
switch(data) switch(data)
{ {
@ -172,22 +163,24 @@ WRITE8_HANDLER( daikaiju_mcu_w )
case MCU_CONTROLS1: SET_COMMAND(MCU_CONTROLS1_LENGTH); break; case MCU_CONTROLS1: SET_COMMAND(MCU_CONTROLS1_LENGTH); break;
case MCU_MESSAGE: SET_COMMAND(MCU_MESSAGE_LENGTH); break; case MCU_MESSAGE: SET_COMMAND(MCU_MESSAGE_LENGTH); break;
case MCU_CONTROLS2: SET_COMMAND(MCU_CONTROLS2_LENGTH); break; case MCU_CONTROLS2: SET_COMMAND(MCU_CONTROLS2_LENGTH); break;
case MCU_ID: SET_COMMAND(MCU_ID_LENGTH); break; case MCU_ID: SET_COMMAND(MCU_ID_LENGTH); break;
default: default:
daikaiju_command=data; state->daikaiju_command = data;
logerror("Unknown MCU command W %x %x \n",data,cpu_get_pc(space->cpu)); logerror("Unknown MCU command W %x %x \n",data,cpu_get_pc(space->cpu));
} }
} }
else else
{ {
--daikaiju_length; --state->daikaiju_length;
daikaiju_buffer[daikaiju_cnt++]=data; state->daikaiju_buffer[state->daikaiju_cnt++] = data;
} }
} }
READ8_HANDLER( daikaiju_mcu_r ) READ8_HANDLER( daikaiju_mcu_r )
{ {
switch(daikaiju_command) lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
switch (state->daikaiju_command)
{ {
case MCU_ID: case MCU_ID:
return ID_DAIKAIJU; return ID_DAIKAIJU;
@ -195,9 +188,9 @@ READ8_HANDLER( daikaiju_mcu_r )
case MCU_CONTROLS1: case MCU_CONTROLS1:
{ {
int n; int n;
switch( (daikaiju_buffer[0]&0xf)^0xf) switch ((state->daikaiju_buffer[0] & 0xf) ^ 0xf)
{ {
case 0x00: n = (daikaiju_buffer[1]&(~8))&0xf; break; case 0x00: n = (state->daikaiju_buffer[1] & (~8)) & 0xf; break;
case 0x08: n = 0 | 8; break; case 0x08: n = 0 | 8; break;
case 0x0a: n = 1 | 8; break; case 0x0a: n = 1 | 8; break;
case 0x02: n = 2 | 8; break; case 0x02: n = 2 | 8; break;
@ -210,49 +203,49 @@ READ8_HANDLER( daikaiju_mcu_r )
default: n = 0; break; default: n = 0; break;
} }
if( !(daikaiju_buffer[0]&0x10) ) //button 1 pressed if (!(state->daikaiju_buffer[0] & 0x10)) //button 1 pressed
{ {
if(daikaiju_buffer[1]&0x10) //previous status if (state->daikaiju_buffer[1] & 0x10) //previous status
{ {
n|=0x40; // button 0->1 n |= 0x40; // button 0->1
} }
else else
{ {
n|=0; //button 1->1 n |= 0; //button 1->1
} }
} }
else else
{ {
if(daikaiju_buffer[1]&0x10) //previous status if (state->daikaiju_buffer[1] & 0x10) //previous status
{ {
n|=0x40+0x10; // button 0->0 n |= 0x40 + 0x10; // button 0->0
} }
else else
{ {
n|=0x10; //button 1->0 n |= 0x10; //button 1->0
} }
} }
if( !(daikaiju_buffer[0]&0x20) ) //button 2 pressed if (!(state->daikaiju_buffer[0] & 0x20)) //button 2 pressed
{ {
if(daikaiju_buffer[1]&0x20) //previous status if (state->daikaiju_buffer[1] & 0x20) //previous status
{ {
n|=0x80; // button 0->1 n |= 0x80; // button 0->1
} }
else else
{ {
n|=0; //button 1->1 n |= 0; //button 1->1
} }
} }
else else
{ {
if(daikaiju_buffer[1]&0x20) //previous status if (state->daikaiju_buffer[1] & 0x20) //previous status
{ {
n|=0x80+0x20; // button 0->0 n |= 0x80 + 0x20; // button 0->0
} }
else else
{ {
n|=0x20; //button 1->0 n |= 0x20; //button 1->0
} }
} }
return n; return n;
@ -260,89 +253,91 @@ READ8_HANDLER( daikaiju_mcu_r )
case MCU_ADDRESS1: case MCU_ADDRESS1:
{ {
int address=daikaiju_buffer[1]*2+64*daikaiju_buffer[0]; int address = state->daikaiju_buffer[1] * 2 + 64 * state->daikaiju_buffer[0];
address&=0x0fff; // ? address &= 0x0fff; // ?
address+=0xd000; address += 0xd000;
if(daikaiju_cntr==0) if (state->daikaiju_cntr == 0)
{ {
daikaiju_cntr++; state->daikaiju_cntr++;
return address&0xff; return address & 0xff;
} }
else else
{ {
return address>>8; return address >> 8;
} }
} }
case MCU_ADDRESS2: case MCU_ADDRESS2:
{ {
int address=daikaiju_buffer[1]*2+64*daikaiju_buffer[0]; int address = state->daikaiju_buffer[1] * 2 + 64 * state->daikaiju_buffer[0];
address&=0x1fff; // ? address &= 0x1fff; // ?
address+=0xc000; address += 0xc000;
if(daikaiju_cntr==0) if (state->daikaiju_cntr == 0)
{ {
daikaiju_cntr++; state->daikaiju_cntr++;
return address&0xff; return address & 0xff;
} }
else else
{ {
return address>>8; return address >> 8;
} }
} }
case MCU_MESSAGE: case MCU_MESSAGE:
return daikaiju_buffer[1]; return state->daikaiju_buffer[1];
case MCU_CONTROLS2: case MCU_CONTROLS2:
{ {
int n; int n;
int dest=(daikaiju_buffer[0]&0x7)<<1; int dest = (state->daikaiju_buffer[0] & 0x7) << 1;
int prev=(daikaiju_buffer[1]&0xf); int prev = (state->daikaiju_buffer[1] & 0xf);
if(daikaiju_buffer[2]==2) if (state->daikaiju_buffer[2] == 2)
{ {
prev&=0xfe; prev &= 0xfe;
} }
if(prev!=dest)
{
int diff=(dest-prev);
if((diff>8 )|| (diff<0 && diff >-8)) if (prev != dest)
{
int diff = (dest - prev);
if ((diff > 8)|| (diff < 0 && diff > -8))
{ {
n=(prev-daikaiju_buffer[2])&0xf; n = (prev - state->daikaiju_buffer[2]) & 0xf;
} }
else else
{ {
n=(prev+daikaiju_buffer[2])&0xf; n = (prev + state->daikaiju_buffer[2]) & 0xf;
} }
} }
else else
{ {
n=prev; n = prev;
} }
prev&=0xf; prev &= 0xf;
if(prev!=n)
if (prev != n)
{ {
n|=0x10; n |= 0x10;
} }
return n; return n;
} }
} }
logerror("Unknown MCU R %x %x %x %x\n",cpu_get_pc(space->cpu), daikaiju_command, daikaiju_length, daikaiju_prev); logerror("Unknown MCU R %x %x %x %x\n", cpu_get_pc(space->cpu), state->daikaiju_command, state->daikaiju_length, state->daikaiju_prev);
return 0xff; return 0xff;
} }
READ8_HANDLER( daikaiju_mcu_status_r ) READ8_HANDLER( daikaiju_mcu_status_r )
{ {
lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
int res = input_port_read(space->machine, "MCU?"); int res = input_port_read(space->machine, "MCU?");
res^=mame_rand(space->machine)&3; res ^= mame_rand(space->machine) & 3;
res |=((lsasquad_sound_pending & 0x02)^2)<<3; //inverted flag res |= ((state->sound_pending & 0x02) ^ 2) << 3; //inverted flag
lsasquad_sound_pending &= ~0x02; state->sound_pending &= ~0x02;
return res; return res;
} }

View File

@ -11,10 +11,6 @@
#include "includes/lkage.h" #include "includes/lkage.h"
static UINT8 from_main,from_mcu;
static int mcu_sent = 0,main_sent = 0;
/*************************************************************************** /***************************************************************************
Legend of Kage 68705 protection interface Legend of Kage 68705 protection interface
@ -24,23 +20,26 @@ static int mcu_sent = 0,main_sent = 0;
***************************************************************************/ ***************************************************************************/
static UINT8 portA_in,portA_out,ddrA; READ8_HANDLER( lkage_68705_port_a_r )
READ8_HANDLER( lkage_68705_portA_r )
{ {
//logerror("%04x: 68705 port A read %02x\n",cpu_get_pc(space->cpu),portA_in); lkage_state *state = (lkage_state *)space->machine->driver_data;
return (portA_out & ddrA) | (portA_in & ~ddrA);
//logerror("%04x: 68705 port A read %02x\n", cpu_get_pc(space->cpu), state->port_a_in);
return (state->port_a_out & state->ddr_a) | (state->port_a_in & ~state->ddr_a);
} }
WRITE8_HANDLER( lkage_68705_portA_w ) WRITE8_HANDLER( lkage_68705_port_a_w )
{ {
//logerror("%04x: 68705 port A write %02x\n",cpu_get_pc(space->cpu),data); lkage_state *state = (lkage_state *)space->machine->driver_data;
portA_out = data;
//logerror("%04x: 68705 port A write %02x\n", cpu_get_pc(space->cpu), data);
state->port_a_out = data;
} }
WRITE8_HANDLER( lkage_68705_ddrA_w ) WRITE8_HANDLER( lkage_68705_ddr_a_w )
{ {
ddrA = data; lkage_state *state = (lkage_state *)space->machine->driver_data;
state->ddr_a = data;
} }
@ -54,87 +53,106 @@ WRITE8_HANDLER( lkage_68705_ddrA_w )
* 2 W when 0->1, copies port A to the latch for the main CPU * 2 W when 0->1, copies port A to the latch for the main CPU
*/ */
static UINT8 portB_in,portB_out,ddrB; READ8_HANDLER( lkage_68705_port_b_r )
READ8_HANDLER( lkage_68705_portB_r )
{ {
return (portB_out & ddrB) | (portB_in & ~ddrB); lkage_state *state = (lkage_state *)space->machine->driver_data;
return (state->port_b_out & state->ddr_b) | (state->port_b_in & ~state->ddr_b);
} }
WRITE8_HANDLER( lkage_68705_portB_w ) WRITE8_HANDLER( lkage_68705_port_b_w )
{ {
//logerror("%04x: 68705 port B write %02x\n",cpu_get_pc(space->cpu),data); lkage_state *state = (lkage_state *)space->machine->driver_data;
if ((ddrB & 0x02) && (~data & 0x02) && (portB_out & 0x02)) //logerror("%04x: 68705 port B write %02x\n", cpu_get_pc(space->cpu), data);
if ((state->ddr_b & 0x02) && (~data & 0x02) && (state->port_b_out & 0x02))
{ {
portA_in = from_main; state->port_a_in = state->from_main;
if (main_sent) cputag_set_input_line(space->machine, "mcu", 0, CLEAR_LINE); if (state->main_sent)
main_sent = 0; cpu_set_input_line(state->mcu, 0, CLEAR_LINE);
logerror("read command %02x from main cpu\n",portA_in);
} state->main_sent = 0;
if ((ddrB & 0x04) && (data & 0x04) && (~portB_out & 0x04)) logerror("read command %02x from main cpu\n", state->port_a_in);
{
logerror("send command %02x to main cpu\n",portA_out);
from_mcu = portA_out;
mcu_sent = 1;
} }
portB_out = data; if ((state->ddr_b & 0x04) && (data & 0x04) && (~state->port_b_out & 0x04))
{
logerror("send command %02x to main cpu\n", state->port_a_out);
state->from_mcu = state->port_a_out;
state->mcu_sent = 1;
}
state->port_b_out = data;
} }
WRITE8_HANDLER( lkage_68705_ddrB_w ) WRITE8_HANDLER( lkage_68705_ddr_b_w )
{ {
ddrB = data; lkage_state *state = (lkage_state *)space->machine->driver_data;
state->ddr_b = data;
} }
static UINT8 portC_in,portC_out,ddrC;
READ8_HANDLER( lkage_68705_portC_r ) READ8_HANDLER( lkage_68705_port_c_r )
{ {
portC_in = 0; lkage_state *state = (lkage_state *)space->machine->driver_data;
if (main_sent) portC_in |= 0x01;
if (!mcu_sent) portC_in |= 0x02; state->port_c_in = 0;
//logerror("%04x: 68705 port C read %02x\n",cpu_get_pc(space->cpu),portC_in); if (state->main_sent)
return (portC_out & ddrC) | (portC_in & ~ddrC); state->port_c_in |= 0x01;
if (!state->mcu_sent)
state->port_c_in |= 0x02;
//logerror("%04x: 68705 port C read %02x\n", cpu_get_pc(space->cpu), state->port_c_in);
return (state->port_c_out & state->ddr_c) | (state->port_c_in & ~state->ddr_c);
} }
WRITE8_HANDLER( lkage_68705_portC_w ) WRITE8_HANDLER( lkage_68705_port_c_w )
{ {
logerror("%04x: 68705 port C write %02x\n",cpu_get_pc(space->cpu),data); lkage_state *state = (lkage_state *)space->machine->driver_data;
portC_out = data;
logerror("%04x: 68705 port C write %02x\n", cpu_get_pc(space->cpu), data);
state->port_c_out = data;
} }
WRITE8_HANDLER( lkage_68705_ddrC_w ) WRITE8_HANDLER( lkage_68705_ddr_c_w )
{ {
ddrC = data; lkage_state *state = (lkage_state *)space->machine->driver_data;
state->ddr_c = data;
} }
WRITE8_HANDLER( lkage_mcu_w ) WRITE8_HANDLER( lkage_mcu_w )
{ {
logerror("%04x: mcu_w %02x\n",cpu_get_pc(space->cpu),data); lkage_state *state = (lkage_state *)space->machine->driver_data;
from_main = data;
main_sent = 1; logerror("%04x: mcu_w %02x\n", cpu_get_pc(space->cpu), data);
cputag_set_input_line(space->machine, "mcu", 0, ASSERT_LINE); state->from_main = data;
state->main_sent = 1;
cpu_set_input_line(state->mcu, 0, ASSERT_LINE);
} }
READ8_HANDLER( lkage_mcu_r ) READ8_HANDLER( lkage_mcu_r )
{ {
logerror("%04x: mcu_r %02x\n",cpu_get_pc(space->cpu),from_mcu); lkage_state *state = (lkage_state *)space->machine->driver_data;
mcu_sent = 0;
return from_mcu; logerror("%04x: mcu_r %02x\n", cpu_get_pc(space->cpu), state->from_mcu);
state->mcu_sent = 0;
return state->from_mcu;
} }
READ8_HANDLER( lkage_mcu_status_r ) READ8_HANDLER( lkage_mcu_status_r )
{ {
lkage_state *state = (lkage_state *)space->machine->driver_data;
int res = 0; int res = 0;
/* bit 0 = when 1, mcu is ready to receive data from main cpu */ /* bit 0 = when 1, mcu is ready to receive data from main cpu */
/* bit 1 = when 1, mcu has sent data to the main cpu */ /* bit 1 = when 1, mcu has sent data to the main cpu */
//logerror("%04x: mcu_status_r\n",cpu_get_pc(space->cpu)); //logerror("%04x: mcu_status_r\n", cpu_get_pc(space->cpu));
if (!main_sent) res |= 0x01; if (!state->main_sent)
if (mcu_sent) res |= 0x02; res |= 0x01;
if (state->mcu_sent)
res |= 0x02;
return res; return res;
} }

View File

@ -2,91 +2,100 @@
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "includes/lsasquad.h" #include "includes/lsasquad.h"
/* coin inputs are inverted in storming */
int lsasquad_invertcoin;
/*************************************************************************** /***************************************************************************
main <-> sound CPU communication main <-> sound CPU communication
***************************************************************************/ ***************************************************************************/
static int sound_nmi_enable,pending_nmi,sound_cmd,sound_result;
int lsasquad_sound_pending;
static TIMER_CALLBACK( nmi_callback ) static TIMER_CALLBACK( nmi_callback )
{ {
if (sound_nmi_enable) cputag_set_input_line(machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE); lsasquad_state *state = (lsasquad_state *)machine->driver_data;
else pending_nmi = 1;
if (state->sound_nmi_enable)
cpu_set_input_line(state->audiocpu, INPUT_LINE_NMI, PULSE_LINE);
else
state->pending_nmi = 1;
} }
WRITE8_HANDLER( lsasquad_sh_nmi_disable_w ) WRITE8_HANDLER( lsasquad_sh_nmi_disable_w )
{ {
sound_nmi_enable = 0; lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
state->sound_nmi_enable = 0;
} }
WRITE8_HANDLER( lsasquad_sh_nmi_enable_w ) WRITE8_HANDLER( lsasquad_sh_nmi_enable_w )
{ {
sound_nmi_enable = 1; lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
if (pending_nmi)
state->sound_nmi_enable = 1;
if (state->pending_nmi)
{ {
cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE); cpu_set_input_line(state->audiocpu, INPUT_LINE_NMI, PULSE_LINE);
pending_nmi = 0; state->pending_nmi = 0;
} }
} }
WRITE8_HANDLER( lsasquad_sound_command_w ) WRITE8_HANDLER( lsasquad_sound_command_w )
{ {
lsasquad_sound_pending |= 0x01; lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
sound_cmd = data; state->sound_pending |= 0x01;
//logerror("%04x: sound cmd %02x\n",cpu_get_pc(space->cpu),data); state->sound_cmd = data;
timer_call_after_resynch(space->machine, NULL, data,nmi_callback);
//logerror("%04x: sound cmd %02x\n", cpu_get_pc(space->cpu), data);
timer_call_after_resynch(space->machine, NULL, data, nmi_callback);
} }
READ8_HANDLER( lsasquad_sh_sound_command_r ) READ8_HANDLER( lsasquad_sh_sound_command_r )
{ {
lsasquad_sound_pending &= ~0x01; lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
//logerror("%04x: read sound cmd %02x\n",cpu_get_pc(space->cpu),sound_cmd); state->sound_pending &= ~0x01;
return sound_cmd; //logerror("%04x: read sound cmd %02x\n", cpu_get_pc(space->cpu), state->sound_cmd);
return state->sound_cmd;
} }
WRITE8_HANDLER( lsasquad_sh_result_w ) WRITE8_HANDLER( lsasquad_sh_result_w )
{ {
lsasquad_sound_pending |= 0x02; lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
//logerror("%04x: sound res %02x\n",cpu_get_pc(space->cpu),data); state->sound_pending |= 0x02;
sound_result = data; //logerror("%04x: sound res %02x\n", cpu_get_pc(space->cpu), data);
state->sound_result = data;
} }
READ8_HANDLER( lsasquad_sound_result_r ) READ8_HANDLER( lsasquad_sound_result_r )
{ {
lsasquad_sound_pending &= ~0x02; lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
//logerror("%04x: read sound res %02x\n",cpu_get_pc(space->cpu),sound_result); state->sound_pending &= ~0x02;
return sound_result; //logerror("%04x: read sound res %02x\n", cpu_get_pc(space->cpu), state->sound_result);
return state->sound_result;
} }
READ8_HANDLER( lsasquad_sound_status_r ) READ8_HANDLER( lsasquad_sound_status_r )
{ {
lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
/* bit 0: message pending for sound cpu */ /* bit 0: message pending for sound cpu */
/* bit 1: message pending for main cpu */ /* bit 1: message pending for main cpu */
return lsasquad_sound_pending; return state->sound_pending;
} }
READ8_HANDLER( daikaiju_sh_sound_command_r ) READ8_HANDLER( daikaiju_sh_sound_command_r )
{ {
lsasquad_sound_pending &= ~0x01; lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
lsasquad_sound_pending |= 0x02; state->sound_pending &= ~0x01;
//logerror("%04x: read sound cmd %02x\n",cpu_get_pc(space->cpu),sound_cmd); state->sound_pending |= 0x02;
return sound_cmd; //logerror("%04x: read sound cmd %02x\n", cpu_get_pc(space->cpu), state->sound_cmd);
return state->sound_cmd;
} }
READ8_HANDLER( daikaiju_sound_status_r ) READ8_HANDLER( daikaiju_sound_status_r )
{ {
lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
/* bit 0: message pending for sound cpu */ /* bit 0: message pending for sound cpu */
/* bit 1: message pending for main cpu */ /* bit 1: message pending for main cpu */
return lsasquad_sound_pending^3; return state->sound_pending ^ 3;
} }
@ -98,26 +107,26 @@ READ8_HANDLER( daikaiju_sound_status_r )
***************************************************************************/ ***************************************************************************/
static UINT8 from_main,from_mcu; READ8_HANDLER( lsasquad_68705_port_a_r )
static int mcu_sent = 0,main_sent = 0;
static UINT8 portA_in,portA_out,ddrA;
READ8_HANDLER( lsasquad_68705_portA_r )
{ {
//logerror("%04x: 68705 port A read %02x\n",cpu_get_pc(space->cpu),portA_in); lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
return (portA_out & ddrA) | (portA_in & ~ddrA);
//logerror("%04x: 68705 port A read %02x\n", cpu_get_pc(space->cpu), state->port_a_in);
return (state->port_a_out & state->ddr_a) | (state->port_a_in & ~state->ddr_a);
} }
WRITE8_HANDLER( lsasquad_68705_portA_w ) WRITE8_HANDLER( lsasquad_68705_port_a_w )
{ {
//logerror("%04x: 68705 port A write %02x\n",cpu_get_pc(space->cpu),data); lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
portA_out = data;
//logerror("%04x: 68705 port A write %02x\n", cpu_get_pc(space->cpu), data);
state->port_a_out = data;
} }
WRITE8_HANDLER( lsasquad_68705_ddrA_w ) WRITE8_HANDLER( lsasquad_68705_ddr_a_w )
{ {
ddrA = data; lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
state->ddr_a = data;
} }
@ -131,63 +140,74 @@ WRITE8_HANDLER( lsasquad_68705_ddrA_w )
* 2 W when 0->1, copies port A to the latch for the main CPU * 2 W when 0->1, copies port A to the latch for the main CPU
*/ */
static UINT8 portB_in,portB_out,ddrB; READ8_HANDLER( lsasquad_68705_port_b_r )
READ8_HANDLER( lsasquad_68705_portB_r )
{ {
return (portB_out & ddrB) | (portB_in & ~ddrB); lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
return (state->port_b_out & state->ddr_b) | (state->port_b_in & ~state->ddr_b);
} }
WRITE8_HANDLER( lsasquad_68705_portB_w ) WRITE8_HANDLER( lsasquad_68705_port_b_w )
{ {
//logerror("%04x: 68705 port B write %02x\n",cpu_get_pc(space->cpu),data); lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
if ((ddrB & 0x02) && (~data & 0x02) && (portB_out & 0x02)) //logerror("%04x: 68705 port B write %02x\n", cpu_get_pc(space->cpu), data);
if ((state->ddr_b & 0x02) && (~data & 0x02) && (state->port_b_out & 0x02))
{ {
portA_in = from_main; state->port_a_in = state->from_main;
if (main_sent) cputag_set_input_line(space->machine, "mcu", 0, CLEAR_LINE); if (state->main_sent)
main_sent = 0; cpu_set_input_line(state->mcu, 0, CLEAR_LINE);
//logerror("read command %02x from main cpu\n",portA_in); state->main_sent = 0;
} //logerror("read command %02x from main cpu\n", state->port_a_in);
if ((ddrB & 0x04) && (data & 0x04) && (~portB_out & 0x04))
{
//logerror("send command %02x to main cpu\n",portA_out);
from_mcu = portA_out;
mcu_sent = 1;
} }
portB_out = data; if ((state->ddr_b & 0x04) && (data & 0x04) && (~state->port_b_out & 0x04))
{
//logerror("send command %02x to main cpu\n", state->port_a_out);
state->from_mcu = state->port_a_out;
state->mcu_sent = 1;
}
state->port_b_out = data;
} }
WRITE8_HANDLER( lsasquad_68705_ddrB_w ) WRITE8_HANDLER( lsasquad_68705_ddr_b_w )
{ {
ddrB = data; lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
state->ddr_b = data;
} }
WRITE8_HANDLER( lsasquad_mcu_w ) WRITE8_HANDLER( lsasquad_mcu_w )
{ {
//logerror("%04x: mcu_w %02x\n",cpu_get_pc(space->cpu),data); lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
from_main = data;
main_sent = 1; //logerror("%04x: mcu_w %02x\n", cpu_get_pc(space->cpu), data);
cputag_set_input_line(space->machine, "mcu", 0, ASSERT_LINE); state->from_main = data;
state->main_sent = 1;
cpu_set_input_line(state->mcu, 0, ASSERT_LINE);
} }
READ8_HANDLER( lsasquad_mcu_r ) READ8_HANDLER( lsasquad_mcu_r )
{ {
//logerror("%04x: mcu_r %02x\n",cpu_get_pc(space->cpu),from_mcu); lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
mcu_sent = 0;
return from_mcu; //logerror("%04x: mcu_r %02x\n", cpu_get_pc(space->cpu), state->from_mcu);
state->mcu_sent = 0;
return state->from_mcu;
} }
READ8_HANDLER( lsasquad_mcu_status_r ) READ8_HANDLER( lsasquad_mcu_status_r )
{ {
lsasquad_state *state = (lsasquad_state *)space->machine->driver_data;
int res = input_port_read(space->machine, "MCU?"); int res = input_port_read(space->machine, "MCU?");
/* bit 0 = when 1, mcu is ready to receive data from main cpu */ /* bit 0 = when 1, mcu is ready to receive data from main cpu */
/* bit 1 = when 0, mcu has sent data to the main cpu */ /* bit 1 = when 0, mcu has sent data to the main cpu */
//logerror("%04x: mcu_status_r\n",cpu_get_pc(space->cpu)); //logerror("%04x: mcu_status_r\n",cpu_get_pc(space->cpu));
if (!main_sent) res |= 0x01; if (!state->main_sent)
if (!mcu_sent) res |= 0x02; res |= 0x01;
if (!state->mcu_sent)
res |= 0x02;
return res ^ lsasquad_invertcoin; return res ^ state->invertcoin;
} }

View File

@ -60,7 +60,10 @@ static TILE_GET_INFO( get_back_tile_info )
} }
tile = RAM[tile_index]; tile = RAM[tile_index];
if (tile > 0x7f) bank = 3; else bank = 2; if (tile > 0x7f)
bank = 3;
else
bank = 2;
SET_TILE_INFO(bank, tile & 0x7f, state->background_color, 0); SET_TILE_INFO(bank, tile & 0x7f, state->background_color, 0);
} }
@ -104,7 +107,7 @@ WRITE8_HANDLER( deco16_io_w )
liberate_state *state = (liberate_state *)space->machine->driver_data; liberate_state *state = (liberate_state *)space->machine->driver_data;
state->io_ram[offset] = data; state->io_ram[offset] = data;
if (offset > 1 && offset < 6) if (offset > 1 && offset < 6)
tilemap_mark_all_tiles_dirty(state->background_tilemap); tilemap_mark_all_tiles_dirty(state->back_tilemap);
switch (offset) switch (offset)
{ {
@ -112,20 +115,20 @@ WRITE8_HANDLER( deco16_io_w )
if (((data >> 4) & 3) != state->background_color) if (((data >> 4) & 3) != state->background_color)
{ {
state->background_color = (data >> 4) & 3; state->background_color = (data >> 4) & 3;
tilemap_mark_all_tiles_dirty(state->background_tilemap); tilemap_mark_all_tiles_dirty(state->back_tilemap);
} }
state->background_disable = data & 0x4; state->background_disable = data & 0x4;
flip_screen_set(space->machine, data & 0x1); flip_screen_set(space->machine, data & 0x01);
break; break;
case 7: /* Background palette resistors? */ case 7: /* Background palette resistors? */
/* Todo */ /* Todo */
break; break;
case 8: /* Irq ack */ case 8: /* Irq ack */
cputag_set_input_line(space->machine, "maincpu", DECO16_IRQ_LINE, CLEAR_LINE); cpu_set_input_line(state->maincpu, DECO16_IRQ_LINE, CLEAR_LINE);
break; break;
case 9: /* Sound */ case 9: /* Sound */
soundlatch_w(space, 0, data); soundlatch_w(space, 0, data);
cputag_set_input_line(space->machine, "audiocpu", M6502_IRQ_LINE, HOLD_LINE); cpu_set_input_line(state->audiocpu, M6502_IRQ_LINE, HOLD_LINE);
break; break;
} }
} }
@ -135,9 +138,9 @@ WRITE8_HANDLER( prosoccr_io_w )
liberate_state *state = (liberate_state *)space->machine->driver_data; liberate_state *state = (liberate_state *)space->machine->driver_data;
state->io_ram[offset] = data; state->io_ram[offset] = data;
if (offset > 1 && offset < 6) if (offset > 1 && offset < 6)
tilemap_mark_all_tiles_dirty(state->background_tilemap); tilemap_mark_all_tiles_dirty(state->back_tilemap);
// popmessage("%02x %02x",state->io_ram[6],state->io_ram[7]); // popmessage("%02x %02x",state->io_ram[6],state->io_ram[7]);
switch (offset) switch (offset)
{ {
@ -150,11 +153,11 @@ WRITE8_HANDLER( prosoccr_io_w )
/* x--- ---- used on the attract mode */ /* x--- ---- used on the attract mode */
break; break;
case 8: /* Irq ack */ case 8: /* Irq ack */
cputag_set_input_line(space->machine, "maincpu", DECO16_IRQ_LINE, CLEAR_LINE); cpu_set_input_line(state->maincpu, DECO16_IRQ_LINE, CLEAR_LINE);
break; break;
case 9: /* Sound */ case 9: /* Sound */
soundlatch_w(space, 0, data); soundlatch_w(space, 0, data);
cputag_set_input_line(space->machine, "audiocpu", M6502_IRQ_LINE, HOLD_LINE); cpu_set_input_line(state->audiocpu, M6502_IRQ_LINE, HOLD_LINE);
break; break;
} }
} }
@ -170,14 +173,14 @@ WRITE8_HANDLER( prosport_io_w )
case 0: case 0:
//background_disable = ~data & 0x80; //background_disable = ~data & 0x80;
flip_screen_set(space->machine, data & 0x80); flip_screen_set(space->machine, data & 0x80);
tilemap_mark_all_tiles_dirty(state->background_tilemap); tilemap_mark_all_tiles_dirty(state->back_tilemap);
break; break;
case 2: /* Sound */ case 2: /* Sound */
soundlatch_w(space, 0, data); soundlatch_w(space, 0, data);
cputag_set_input_line(space->machine, "audiocpu", M6502_IRQ_LINE, HOLD_LINE); cpu_set_input_line(state->audiocpu, M6502_IRQ_LINE, HOLD_LINE);
break; break;
case 4: /* Irq ack */ case 4: /* Irq ack */
cputag_set_input_line(space->machine, "maincpu", DECO16_IRQ_LINE, CLEAR_LINE); cpu_set_input_line(state->maincpu, DECO16_IRQ_LINE, CLEAR_LINE);
break; break;
} }
} }
@ -200,7 +203,7 @@ WRITE8_HANDLER( prosport_bg_vram_w )
{ {
liberate_state *state = (liberate_state *)space->machine->driver_data; liberate_state *state = (liberate_state *)space->machine->driver_data;
state->bg_vram[offset] = data; state->bg_vram[offset] = data;
tilemap_mark_tile_dirty(state->background_tilemap, offset); tilemap_mark_tile_dirty(state->back_tilemap, offset);
} }
/***************************************************************************/ /***************************************************************************/
@ -208,47 +211,48 @@ WRITE8_HANDLER( prosport_bg_vram_w )
VIDEO_START( prosoccr ) VIDEO_START( prosoccr )
{ {
liberate_state *state = (liberate_state *)machine->driver_data; liberate_state *state = (liberate_state *)machine->driver_data;
state->background_tilemap = tilemap_create(machine, get_back_tile_info,back_scan,16,16,32,32); state->back_tilemap = tilemap_create(machine, get_back_tile_info, back_scan, 16, 16, 32, 32);
state->fix_tilemap = tilemap_create(machine, get_fix_tile_info,fix_scan,8,8,32,32); state->fix_tilemap = tilemap_create(machine, get_fix_tile_info, fix_scan, 8, 8, 32, 32);
tilemap_set_transparent_pen(state->fix_tilemap,0); tilemap_set_transparent_pen(state->fix_tilemap, 0);
state->charram = auto_alloc_array(machine, UINT8, 0x1800*2); state->charram = auto_alloc_array(machine, UINT8, 0x1800 * 2);
} }
VIDEO_START( boomrang ) VIDEO_START( boomrang )
{ {
liberate_state *state = (liberate_state *)machine->driver_data; liberate_state *state = (liberate_state *)machine->driver_data;
state->background_tilemap = tilemap_create(machine, get_back_tile_info,back_scan,16,16,32,32); state->back_tilemap = tilemap_create(machine, get_back_tile_info, back_scan, 16, 16, 32, 32);
state->fix_tilemap = tilemap_create(machine, get_fix_tile_info,fix_scan,8,8,32,32); state->fix_tilemap = tilemap_create(machine, get_fix_tile_info, fix_scan, 8, 8, 32, 32);
tilemap_set_transmask(state->background_tilemap,0,0x0001,0x007e); /* Bottom 1 pen/Top 7 pens */ tilemap_set_transmask(state->back_tilemap, 0, 0x0001, 0x007e); /* Bottom 1 pen/Top 7 pens */
tilemap_set_transparent_pen(state->fix_tilemap,0); tilemap_set_transparent_pen(state->fix_tilemap, 0);
} }
VIDEO_START( liberate ) VIDEO_START( liberate )
{ {
liberate_state *state = (liberate_state *)machine->driver_data; liberate_state *state = (liberate_state *)machine->driver_data;
state->background_tilemap = tilemap_create(machine, get_back_tile_info,back_scan,16,16,32,32); state->back_tilemap = tilemap_create(machine, get_back_tile_info, back_scan, 16, 16, 32, 32);
state->fix_tilemap = tilemap_create(machine, get_fix_tile_info,fix_scan,8,8,32,32); state->fix_tilemap = tilemap_create(machine, get_fix_tile_info, fix_scan, 8, 8, 32, 32);
tilemap_set_transparent_pen(state->fix_tilemap,0); tilemap_set_transparent_pen(state->fix_tilemap, 0);
} }
VIDEO_START( prosport ) VIDEO_START( prosport )
{ {
liberate_state *state = (liberate_state *)machine->driver_data; liberate_state *state = (liberate_state *)machine->driver_data;
state->background_tilemap = tilemap_create(machine, prosport_get_back_tile_info,back_scan,16,16,32,32); state->back_tilemap = tilemap_create(machine, prosport_get_back_tile_info, back_scan, 16, 16, 32, 32);
state->fix_tilemap = tilemap_create(machine, get_fix_tile_info,fix_scan,8,8,32,32); state->fix_tilemap = tilemap_create(machine, get_fix_tile_info, fix_scan, 8, 8, 32, 32);
tilemap_set_transparent_pen(state->fix_tilemap,0); tilemap_set_transparent_pen(state->fix_tilemap, 0);
} }
/***************************************************************************/ /***************************************************************************/
WRITE8_HANDLER( prosport_paletteram_w ) WRITE8_HANDLER( prosport_paletteram_w )
{ {
space->machine->generic.paletteram.u8[offset] = data; liberate_state *state = (liberate_state *)space->machine->driver_data;
state->paletteram[offset] = data;
/* RGB output is inverted */ /* RGB output is inverted */
palette_set_color_rgb(space->machine, offset, pal3bit(~data >> 0), pal3bit(~data >> 3), pal2bit(~data >> 6)); palette_set_color_rgb(space->machine, offset, pal3bit(~data >> 0), pal3bit(~data >> 3), pal2bit(~data >> 6));
@ -256,7 +260,7 @@ WRITE8_HANDLER( prosport_paletteram_w )
PALETTE_INIT( liberate ) PALETTE_INIT( liberate )
{ {
int i,bit0,bit1,bit2,g,r,b; int i, bit0, bit1, bit2, g, r, b;
for (i = 0;i < 32;i++) for (i = 0;i < 32;i++)
{ {
@ -286,15 +290,16 @@ PALETTE_INIT( liberate )
/***************************************************************************/ /***************************************************************************/
static void liberate_draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect) static void liberate_draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
{ {
UINT8 *spriteram = machine->generic.spriteram.u8; liberate_state *state = (liberate_state *)machine->driver_data;
UINT8 *spriteram = state->spriteram;
int offs; int offs;
/* Sprites */ /* Sprites */
for (offs = 0x000;offs < 0x800;offs += 4) for (offs = 0x000; offs < 0x800; offs += 4)
{ {
int multi,fx,fy,sx,sy,sy2,code,color; int multi, fx, fy, sx, sy, sy2, code, color;
/* /*
Byte 0: 0x01 - ? Byte 0: 0x01 - ?
@ -309,34 +314,35 @@ static void liberate_draw_sprites(running_machine *machine, bitmap_t *bitmap, co
Byte 3: 0xff - X position Byte 3: 0xff - X position
*/ */
code = spriteram[offs+1] + ((spriteram[offs+0] & 0x60) << 3); code = spriteram[offs + 1] + ((spriteram[offs + 0] & 0x60) << 3);
sx = 240 - spriteram[offs+3]; sx = 240 - spriteram[offs + 3];
sy = 240 - spriteram[offs+2]; sy = 240 - spriteram[offs + 2];
color = ((spriteram[offs+1] & 0x08) >> 3); // ? color = ((spriteram[offs + 1] & 0x08) >> 3); // ?
fx = spriteram[offs+0] & 0x04; fx = spriteram[offs + 0] & 0x04;
fy = spriteram[offs+0] & 0x02; fy = spriteram[offs + 0] & 0x02;
multi = spriteram[offs+0] & 0x10; multi = spriteram[offs + 0] & 0x10;
if (multi && fy==0) sy-=16; if (multi && fy == 0)
sy -= 16;
if (flip_screen_get(machine)) if (flip_screen_get(machine))
{ {
sy=240-sy; sy = 240 - sy;
sx=240-sx; sx = 240 - sx;
if (fy) if (fy)
sy2=sy+16; sy2 = sy + 16;
else else
sy2=sy-16; sy2 = sy - 16;
if (fx) fx=0; else fx=1; if (fx) fx = 0; else fx = 1;
if (fy) fy=0; else fy=1; if (fy) fy = 0; else fy = 1;
} }
else else
{ {
if (fy) if (fy)
sy2=sy-16; sy2 = sy - 16;
else else
sy2=sy+16; sy2 = sy + 16;
} }
drawgfx_transpen(bitmap,cliprect,machine->gfx[1], drawgfx_transpen(bitmap,cliprect,machine->gfx[1],
@ -353,53 +359,55 @@ static void liberate_draw_sprites(running_machine *machine, bitmap_t *bitmap, co
} }
} }
static void prosport_draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect) static void prosport_draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
{ {
liberate_state *state = (liberate_state *)machine->driver_data; liberate_state *state = (liberate_state *)machine->driver_data;
int offs,multi,fx,fy,sx,sy,sy2,code,code2,color,gfx_region; int offs, multi, fx, fy, sx, sy, sy2, code, code2, color, gfx_region;
UINT8 *spriteram = machine->generic.spriteram.u8; UINT8 *spriteram = state->spriteram;
for (offs = 0x000;offs < 0x800;offs += 4) for (offs = 0x000; offs < 0x800; offs += 4)
{ {
if ((spriteram[offs+0]&1)!=1) continue; if ((spriteram[offs + 0] & 1) != 1)
continue;
code = spriteram[offs+1] + ((spriteram[offs+0]&0x3)<<8); code = spriteram[offs + 1] + ((spriteram[offs + 0] & 0x3) << 8);
code2=code+1; code2 = code + 1;
if(state->io_ram[0]&0x40) //dynamic ram-based gfxs for Pro Golf if(state->io_ram[0] & 0x40) //dynamic ram-based gfxs for Pro Golf
gfx_region = 3+4; gfx_region = 3 + 4;
else else
gfx_region = ((state->io_ram[0]&0x30)>>4)+4; gfx_region = ((state->io_ram[0] & 0x30) >> 4) + 4;
multi = spriteram[offs+0] & 0x10; multi = spriteram[offs + 0] & 0x10;
sy=spriteram[offs+2]; sy = spriteram[offs + 2];
if (multi) sy+=16; if (multi)
sx = (240 - spriteram[offs+3]); sy += 16;
// sy = (240-spriteram[offs+2]);//-16; sx = (240 - spriteram[offs + 3]);
sy = 240-sy; // sy = (240 - spriteram[offs + 2]);//-16;
sy = 240 - sy;
color = 1;//(state->io_ram[4] & 2)+1;//(spriteram[offs+0]&0x4)>>2; color = 1;//(state->io_ram[4] & 2) + 1;//(spriteram[offs + 0] & 0x4) >> 2;
fy = spriteram[offs+0] & 0x02; fy = spriteram[offs + 0] & 0x02;
fx = spriteram[offs+0] & 0x04; fx = spriteram[offs + 0] & 0x04;
multi = 0;// spriteram[offs+0] & 0x10; multi = 0;// spriteram[offs + 0] & 0x10;
// if (multi) sy-=16; // if (multi) sy -= 16;
if ((fy && multi) || (fx && multi)) { code2=code; code++; } if ((fy && multi) || (fx && multi)) { code2 = code; code++; }
if (flip_screen_get(machine)) if (flip_screen_get(machine))
{ {
sy=240-sy; sy = 240 - sy;
sx=240-sx; sx = 240 - sx;
if (fx) fx=0; else fx=1; if (fx) fx = 0; else fx = 1;
if (fy) fy=0; else fy=1; if (fy) fy = 0; else fy = 1;
sy2=sy-16; sy2 = sy - 16;
} }
else else
{ {
sy2=sy+16; sy2 = sy + 16;
} }
drawgfx_transpen(bitmap,cliprect,machine->gfx[gfx_region], drawgfx_transpen(bitmap,cliprect,machine->gfx[gfx_region],
@ -416,47 +424,51 @@ static void prosport_draw_sprites(running_machine *machine, bitmap_t *bitmap, co
} }
} }
static void boomrang_draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int pri) static void boomrang_draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int pri )
{ {
UINT8 *spriteram = machine->generic.spriteram.u8; liberate_state *state = (liberate_state *)machine->driver_data;
int offs,multi,fx,fy,sx,sy,sy2,code,code2,color; UINT8 *spriteram = state->spriteram;
int offs, multi, fx, fy, sx, sy, sy2, code, code2, color;
for (offs = 0x000;offs < 0x800;offs += 4) for (offs = 0x000; offs < 0x800; offs += 4)
{ {
if ((spriteram[offs+0]&1)!=1) continue; if ((spriteram[offs + 0] & 1) != 1)
if ((spriteram[offs+0]&0x8)!=pri) continue; continue;
if ((spriteram[offs + 0] & 0x8) != pri)
continue;
code = spriteram[offs+1] + ((spriteram[offs+0]&0xe0)<<3); code = spriteram[offs + 1] + ((spriteram[offs + 0] & 0xe0) << 3);
code2=code+1; code2 = code + 1;
multi = spriteram[offs+0] & 0x10; multi = spriteram[offs + 0] & 0x10;
sy=spriteram[offs+2]; sy=spriteram[offs + 2];
if (multi) sy+=16; if (multi)
sx = (240 - spriteram[offs+3]); sy += 16;
// sy = (240-spriteram[offs+2]);//-16; sx = (240 - spriteram[offs + 3]);
sy = 240-sy; // sy = (240-spriteram[offs + 2]);//-16;
sy = 240 - sy;
color = (spriteram[offs+0]&0x4)>>2; color = (spriteram[offs + 0] & 0x4) >> 2;
fx = 0; fx = 0;
fy = spriteram[offs+0] & 0x02; fy = spriteram[offs + 0] & 0x02;
multi = spriteram[offs+0] & 0x10; multi = spriteram[offs + 0] & 0x10;
// if (multi) sy-=16; // if (multi) sy -= 16;
if (fy && multi) { code2=code; code++; } if (fy && multi) { code2 = code; code++; }
if (flip_screen_get(machine)) if (flip_screen_get(machine))
{ {
sy=240-sy; sy = 240 - sy;
sx=240-sx; sx = 240 - sx;
if (fx) fx=0; else fx=1; if (fx) fx = 0; else fx = 1;
if (fy) fy=0; else fy=1; if (fy) fy = 0; else fy = 1;
sy2=sy-16; sy2 = sy - 16;
} }
else else
{ {
sy2=sy+16; sy2 = sy + 16;
} }
drawgfx_transpen(bitmap,cliprect,machine->gfx[1], drawgfx_transpen(bitmap,cliprect,machine->gfx[1],
@ -473,20 +485,22 @@ static void boomrang_draw_sprites(running_machine *machine, bitmap_t *bitmap, co
} }
} }
static void prosoccr_draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect) static void prosoccr_draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
{ {
UINT8 *spriteram = machine->generic.spriteram.u8; liberate_state *state = (liberate_state *)machine->driver_data;
int offs,code,fx,fy,sx,sy; UINT8 *spriteram = state->spriteram;
int offs, code, fx, fy, sx, sy;
for (offs = 0x000;offs < 0x400;offs += 4) for (offs = 0x000; offs < 0x400; offs += 4)
{ {
if ((spriteram[offs+0]&1)!=1) continue; if ((spriteram[offs + 0] & 1) != 1)
continue;
code = spriteram[offs+1]; code = spriteram[offs + 1];
sy = 240 - spriteram[offs+2]; sy = 240 - spriteram[offs + 2];
sx = 240 - spriteram[offs+3]; sx = 240 - spriteram[offs + 3];
fx = spriteram[offs+0] & 4; fx = spriteram[offs + 0] & 4;
fy = spriteram[offs+0] & 2; fy = spriteram[offs + 0] & 2;
drawgfx_transpen(bitmap,cliprect,machine->gfx[1], drawgfx_transpen(bitmap,cliprect,machine->gfx[1],
code, code,
@ -501,16 +515,16 @@ static void prosoccr_draw_sprites(running_machine *machine, bitmap_t *bitmap, co
VIDEO_UPDATE( prosoccr ) VIDEO_UPDATE( prosoccr )
{ {
liberate_state *state = (liberate_state *)screen->machine->driver_data; liberate_state *state = (liberate_state *)screen->machine->driver_data;
tilemap_set_scrolly(state->background_tilemap,0, state->io_ram[1]); tilemap_set_scrolly(state->back_tilemap, 0, state->io_ram[1]);
tilemap_set_scrollx(state->background_tilemap,0,-state->io_ram[0]); tilemap_set_scrollx(state->back_tilemap, 0, -state->io_ram[0]);
if (state->background_disable) if (state->background_disable)
bitmap_fill(bitmap,cliprect,32); bitmap_fill(bitmap, cliprect, 32);
else else
tilemap_draw(bitmap,cliprect,state->background_tilemap,0,0); tilemap_draw(bitmap, cliprect, state->back_tilemap, 0, 0);
tilemap_draw(bitmap,cliprect,state->fix_tilemap,0,0); tilemap_draw(bitmap, cliprect, state->fix_tilemap, 0, 0);
prosoccr_draw_sprites(screen->machine,bitmap,cliprect); prosoccr_draw_sprites(screen->machine, bitmap, cliprect);
return 0; return 0;
} }
@ -520,41 +534,41 @@ VIDEO_UPDATE( prosport )
liberate_state *state = (liberate_state *)screen->machine->driver_data; liberate_state *state = (liberate_state *)screen->machine->driver_data;
UINT8 *videoram = state->videoram; UINT8 *videoram = state->videoram;
UINT8 *colorram = state->colorram; UINT8 *colorram = state->colorram;
int mx,my,tile,offs,gfx_region; int mx, my, tile, offs, gfx_region;
int scrollx,scrolly; int scrollx, scrolly;
bitmap_fill(bitmap,cliprect,0); bitmap_fill(bitmap, cliprect, 0);
offs = 0; offs = 0;
/* TODO: what's bits 0 and 2 for? Internal scrolling state? */ /* TODO: what's bits 0 and 2 for? Internal scrolling state? */
scrolly = ((state->io_ram[0] & 0x8)<<5); scrolly = ((state->io_ram[0] & 0x8) << 5);
scrollx = ((state->io_ram[0] & 0x2)<<7) | (state->io_ram[1]); scrollx = ((state->io_ram[0] & 0x2) << 7) | (state->io_ram[1]);
tilemap_set_scrolly(state->background_tilemap,0,scrolly); tilemap_set_scrolly(state->back_tilemap, 0, scrolly);
tilemap_set_scrollx(state->background_tilemap,0,-scrollx); tilemap_set_scrollx(state->back_tilemap, 0, -scrollx);
tilemap_draw(bitmap,cliprect,state->background_tilemap,0,0); tilemap_draw(bitmap, cliprect, state->back_tilemap, 0, 0);
// popmessage("%d %02x %02x %02x %02x %02x %02x %02x %02x",scrollx,deco16_io_ram[0],deco16_io_ram[1],deco16_io_ram[2],deco16_io_ram[3] // popmessage("%d %02x %02x %02x %02x %02x %02x %02x %02x",scrollx,deco16_io_ram[0],deco16_io_ram[1],deco16_io_ram[2],deco16_io_ram[3]
// ,deco16_io_ram[4],deco16_io_ram[5],deco16_io_ram[6],deco16_io_ram[7]); // ,deco16_io_ram[4],deco16_io_ram[5],deco16_io_ram[6],deco16_io_ram[7]);
for (offs = 0;offs < 0x400;offs++) for (offs = 0; offs < 0x400; offs++)
{ {
tile=videoram[offs]+((colorram[offs]&0x3)<<8); tile = videoram[offs] + ((colorram[offs] & 0x3) << 8);
if(state->io_ram[0]&0x40) //dynamic ram-based gfxs for Pro Golf if(state->io_ram[0] & 0x40) //dynamic ram-based gfxs for Pro Golf
gfx_region = 3; gfx_region = 3;
else else
gfx_region = ((state->io_ram[0]&0x30)>>4); gfx_region = ((state->io_ram[0] & 0x30) >> 4);
my = (offs) % 32; my = (offs) % 32;
mx = (offs) / 32; mx = (offs) / 32;
drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[gfx_region], drawgfx_transpen(bitmap, cliprect,screen->machine->gfx[gfx_region],
tile,1,0,0,248-8*mx,8*my,0); tile, 1, 0, 0, 248 - 8 * mx, 8 * my, 0);
} }
prosport_draw_sprites(screen->machine,bitmap,cliprect); prosport_draw_sprites(screen->machine, bitmap, cliprect);
return 0; return 0;
} }
@ -562,34 +576,35 @@ VIDEO_UPDATE( prosport )
VIDEO_UPDATE( boomrang ) VIDEO_UPDATE( boomrang )
{ {
liberate_state *state = (liberate_state *)screen->machine->driver_data; liberate_state *state = (liberate_state *)screen->machine->driver_data;
tilemap_set_scrolly(state->background_tilemap,0, state->io_ram[1]); tilemap_set_scrolly(state->back_tilemap, 0, state->io_ram[1]);
tilemap_set_scrollx(state->background_tilemap,0,-state->io_ram[0]); tilemap_set_scrollx(state->back_tilemap, 0, -state->io_ram[0]);
if (state->background_disable) if (state->background_disable)
bitmap_fill(bitmap,cliprect,32); bitmap_fill(bitmap, cliprect, 32);
else else
tilemap_draw(bitmap,cliprect,state->background_tilemap,TILEMAP_DRAW_LAYER1,0); tilemap_draw(bitmap, cliprect, state->back_tilemap, TILEMAP_DRAW_LAYER1, 0);
boomrang_draw_sprites(screen->machine,bitmap,cliprect,8); boomrang_draw_sprites(screen->machine,bitmap,cliprect,8);
if (!state->background_disable) if (!state->background_disable)
tilemap_draw(bitmap,cliprect,state->background_tilemap,TILEMAP_DRAW_LAYER0,0); tilemap_draw(bitmap, cliprect, state->back_tilemap, TILEMAP_DRAW_LAYER0, 0);
boomrang_draw_sprites(screen->machine,bitmap,cliprect,0);
tilemap_draw(bitmap,cliprect,state->fix_tilemap,0,0); boomrang_draw_sprites(screen->machine, bitmap, cliprect, 0);
tilemap_draw(bitmap, cliprect, state->fix_tilemap, 0, 0);
return 0; return 0;
} }
VIDEO_UPDATE( liberate ) VIDEO_UPDATE( liberate )
{ {
liberate_state *state = (liberate_state *)screen->machine->driver_data; liberate_state *state = (liberate_state *)screen->machine->driver_data;
tilemap_set_scrolly(state->background_tilemap,0, state->io_ram[1]); tilemap_set_scrolly(state->back_tilemap, 0, state->io_ram[1]);
tilemap_set_scrollx(state->background_tilemap,0,-state->io_ram[0]); tilemap_set_scrollx(state->back_tilemap, 0, -state->io_ram[0]);
if (state->background_disable) if (state->background_disable)
bitmap_fill(bitmap,cliprect,32); bitmap_fill(bitmap, cliprect, 32);
else else
tilemap_draw(bitmap,cliprect,state->background_tilemap,0,0); tilemap_draw(bitmap, cliprect, state->back_tilemap, 0, 0);
liberate_draw_sprites(screen->machine,bitmap,cliprect); liberate_draw_sprites(screen->machine, bitmap, cliprect);
tilemap_draw(bitmap,cliprect,state->fix_tilemap,0,0); tilemap_draw(bitmap, cliprect, state->fix_tilemap, 0, 0);
return 0; return 0;
} }

View File

@ -1,11 +1,8 @@
#include "emu.h" /***************************************************************************
#include "includes/lkage.h"
video/lkage.c
static tilemap_t *bg_tilemap, *fg_tilemap, *tx_tilemap;
static UINT8 bg_tile_bank, fg_tile_bank;
UINT8 *lkage_scroll, *lkage_vreg;
/*
lkage_scroll[0x00]: text layer horizontal scroll lkage_scroll[0x00]: text layer horizontal scroll
lkage_scroll[0x01]: text layer vertical scroll lkage_scroll[0x01]: text layer vertical scroll
lkage_scroll[0x02]: foreground layer horizontal scroll lkage_scroll[0x02]: foreground layer horizontal scroll
@ -35,71 +32,84 @@ UINT8 *lkage_scroll, *lkage_vreg;
04 1e f3 : attract#2 110 04 1e f3 : attract#2 110
04 1e f3 : attract#3 110 04 1e f3 : attract#3 110
00 4e f3 : attract#4 110 00 4e f3 : attract#4 110
*/
***************************************************************************/
#include "emu.h"
#include "includes/lkage.h"
WRITE8_HANDLER( lkage_videoram_w ) WRITE8_HANDLER( lkage_videoram_w )
{ {
space->machine->generic.videoram.u8[offset] = data; lkage_state *state = (lkage_state *)space->machine->driver_data;
switch( offset/0x400 ) state->videoram[offset] = data;
switch (offset / 0x400)
{ {
case 0: case 0:
tilemap_mark_tile_dirty(tx_tilemap,offset & 0x3ff); tilemap_mark_tile_dirty(state->tx_tilemap, offset & 0x3ff);
break; break;
case 1: case 1:
tilemap_mark_tile_dirty(fg_tilemap,offset & 0x3ff); tilemap_mark_tile_dirty(state->fg_tilemap, offset & 0x3ff);
break; break;
case 2: case 2:
tilemap_mark_tile_dirty(bg_tilemap,offset & 0x3ff); tilemap_mark_tile_dirty(state->bg_tilemap, offset & 0x3ff);
break; break;
default: default:
break; break;
} }
} /* lkage_videoram_w */ }
static TILE_GET_INFO( get_bg_tile_info ) static TILE_GET_INFO( get_bg_tile_info )
{ {
int code = machine->generic.videoram.u8[tile_index + 0x800] + 256 * (bg_tile_bank?5:1); lkage_state *state = (lkage_state *)machine->driver_data;
int code = state->videoram[tile_index + 0x800] + 256 * (state->bg_tile_bank ? 5 : 1);
SET_TILE_INFO( 0/*gfx*/, code, 0/*color*/, 0/*flags*/ ); SET_TILE_INFO( 0/*gfx*/, code, 0/*color*/, 0/*flags*/ );
} }
static TILE_GET_INFO( get_fg_tile_info ) static TILE_GET_INFO( get_fg_tile_info )
{ {
int code = machine->generic.videoram.u8[tile_index + 0x400] + 256 * (fg_tile_bank?1:0); lkage_state *state = (lkage_state *)machine->driver_data;
int code = state->videoram[tile_index + 0x400] + 256 * (state->fg_tile_bank ? 1 : 0);
SET_TILE_INFO( 0/*gfx*/, code, 0/*color*/, 0/*flags*/); SET_TILE_INFO( 0/*gfx*/, code, 0/*color*/, 0/*flags*/);
} }
static TILE_GET_INFO( get_tx_tile_info ) static TILE_GET_INFO( get_tx_tile_info )
{ {
int code = machine->generic.videoram.u8[tile_index]; lkage_state *state = (lkage_state *)machine->driver_data;
int code = state->videoram[tile_index];
SET_TILE_INFO( 0/*gfx*/, code, 0/*color*/, 0/*flags*/); SET_TILE_INFO( 0/*gfx*/, code, 0/*color*/, 0/*flags*/);
} }
VIDEO_START( lkage ) VIDEO_START( lkage )
{ {
bg_tile_bank = fg_tile_bank = 0; lkage_state *state = (lkage_state *)machine->driver_data;
bg_tilemap = tilemap_create(machine, get_bg_tile_info,tilemap_scan_rows, 8,8,32,32); state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,32,32); state->fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tx_tilemap = tilemap_create(machine, get_tx_tile_info,tilemap_scan_rows,8,8,32,32); state->tx_tilemap = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_transparent_pen(fg_tilemap,0); tilemap_set_transparent_pen(state->fg_tilemap, 0);
tilemap_set_transparent_pen(tx_tilemap,0); tilemap_set_transparent_pen(state->tx_tilemap, 0);
tilemap_set_scrolldx(bg_tilemap,-5,-5+24); tilemap_set_scrolldx(state->bg_tilemap, -5, -5 + 24);
tilemap_set_scrolldx(fg_tilemap,-3,-3+24); tilemap_set_scrolldx(state->fg_tilemap, -3, -3 + 24);
tilemap_set_scrolldx(tx_tilemap,-1,-1+24); tilemap_set_scrolldx(state->tx_tilemap, -1, -1 + 24);
} /* VIDEO_START( lkage ) */ }
static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect ) static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
{ {
const UINT8 *source = machine->generic.spriteram.u8; lkage_state *state = (lkage_state *)machine->driver_data;
const UINT8 *finish = source+0x60; const UINT8 *source = state->spriteram;
while( source<finish ) const UINT8 *finish = source + 0x60;
while (source < finish)
{ {
int attributes = source[2]; int attributes = source[2];
/* 0x01: horizontal flip /* 0x01: horizontal flip
@ -110,22 +120,22 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
* 0x80: priority * 0x80: priority
*/ */
int priority_mask = 0; int priority_mask = 0;
int color = (attributes>>4)&7; int color = (attributes >> 4) & 7;
int flipx = attributes&0x01; int flipx = attributes & 0x01;
int flipy = attributes&0x02; int flipy = attributes & 0x02;
int height = (attributes&0x08) ? 2 : 1; int height = (attributes & 0x08) ? 2 : 1;
int sx = source[0]-15; int sx = source[0] - 15;
int sy = 256-16*height-source[1]; int sy = 256 - 16 * height - source[1];
int sprite_number = source[3] + ((attributes & 0x04) << 6); int sprite_number = source[3] + ((attributes & 0x04) << 6);
int y; int y;
if( attributes&0x80 ) if (attributes & 0x80)
{ {
priority_mask = (0xf0|0xcc ); priority_mask = (0xf0 | 0xcc);
} }
else else
{ {
priority_mask = (0xf0); priority_mask = 0xf0;
} }
if (flip_screen_x_get(machine)) if (flip_screen_x_get(machine))
@ -133,9 +143,9 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
sx = 239 - sx - 24; sx = 239 - sx - 24;
flipx = !flipx; flipx = !flipx;
} }
if( flip_screen_y_get(machine) ) if (flip_screen_y_get(machine))
{ {
sy = 254 - 16*height - sy; sy = 254 - 16 * height - sy;
flipy = !flipy; flipy = !flipy;
} }
if (height == 2 && !flipy) if (height == 2 && !flipy)
@ -143,7 +153,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
sprite_number ^= 1; sprite_number ^= 1;
} }
for (y = 0;y < height;y++) for (y = 0; y < height; y++)
{ {
pdrawgfx_transpen( pdrawgfx_transpen(
bitmap, bitmap,
@ -157,55 +167,56 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
machine->priority_bitmap, machine->priority_bitmap,
priority_mask,0 ); priority_mask,0 );
} }
source+=4; source += 4;
} }
} /* draw_sprites */ }
VIDEO_UPDATE( lkage ) VIDEO_UPDATE( lkage )
{ {
lkage_state *state = (lkage_state *)screen->machine->driver_data;
int bank; int bank;
flip_screen_x_set(screen->machine, ~lkage_vreg[2] & 0x01); flip_screen_x_set(screen->machine, ~state->vreg[2] & 0x01);
flip_screen_y_set(screen->machine, ~lkage_vreg[2] & 0x02); flip_screen_y_set(screen->machine, ~state->vreg[2] & 0x02);
bank = lkage_vreg[1]&0x08; bank = state->vreg[1] & 0x08;
if( bg_tile_bank != bank ) if (state->bg_tile_bank != bank)
{ {
bg_tile_bank = bank; state->bg_tile_bank = bank;
tilemap_mark_all_tiles_dirty( bg_tilemap ); tilemap_mark_all_tiles_dirty(state->bg_tilemap);
} }
bank = lkage_vreg[0]&0x04; bank = state->vreg[0]&0x04;
if( fg_tile_bank != bank ) if (state->fg_tile_bank != bank)
{ {
fg_tile_bank = bank; state->fg_tile_bank = bank;
tilemap_mark_all_tiles_dirty( fg_tilemap ); tilemap_mark_all_tiles_dirty(state->fg_tilemap);
} }
tilemap_set_palette_offset( bg_tilemap, 0x300 + (lkage_vreg[1]&0xf0) ); tilemap_set_palette_offset(state->bg_tilemap, 0x300 + (state->vreg[1] & 0xf0));
tilemap_set_palette_offset( fg_tilemap, 0x200 + (lkage_vreg[1]&0xf0) ); tilemap_set_palette_offset(state->fg_tilemap, 0x200 + (state->vreg[1] & 0xf0));
tilemap_set_palette_offset( tx_tilemap, 0x110 ); tilemap_set_palette_offset(state->tx_tilemap, 0x110);
tilemap_set_scrollx(tx_tilemap,0,lkage_scroll[0]); tilemap_set_scrollx(state->tx_tilemap, 0, state->scroll[0]);
tilemap_set_scrolly(tx_tilemap,0,lkage_scroll[1]); tilemap_set_scrolly(state->tx_tilemap, 0, state->scroll[1]);
tilemap_set_scrollx(fg_tilemap,0,lkage_scroll[2]); tilemap_set_scrollx(state->fg_tilemap, 0, state->scroll[2]);
tilemap_set_scrolly(fg_tilemap,0,lkage_scroll[3]); tilemap_set_scrolly(state->fg_tilemap, 0, state->scroll[3]);
tilemap_set_scrollx(bg_tilemap,0,lkage_scroll[4]); tilemap_set_scrollx(state->bg_tilemap, 0, state->scroll[4]);
tilemap_set_scrolly(bg_tilemap,0,lkage_scroll[5]); tilemap_set_scrolly(state->bg_tilemap, 0, state->scroll[5]);
bitmap_fill(screen->machine->priority_bitmap, cliprect, 0); bitmap_fill(screen->machine->priority_bitmap, cliprect, 0);
if ((lkage_vreg[2] & 0xf0) == 0xf0) if ((state->vreg[2] & 0xf0) == 0xf0)
{ {
tilemap_draw( bitmap,cliprect,bg_tilemap,0,1 ); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 1);
tilemap_draw( bitmap,cliprect,fg_tilemap,0,(lkage_vreg[1]&2)?2:4 ); tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, (state->vreg[1] & 2) ? 2 : 4);
tilemap_draw( bitmap,cliprect,tx_tilemap,0,4 ); tilemap_draw(bitmap, cliprect, state->tx_tilemap, 0, 4);
} }
else else
{ {
tilemap_draw( bitmap,cliprect,tx_tilemap,TILEMAP_DRAW_OPAQUE,0); tilemap_draw(bitmap, cliprect, state->tx_tilemap, TILEMAP_DRAW_OPAQUE, 0);
} }
draw_sprites(screen->machine, bitmap,cliprect ); draw_sprites(screen->machine, bitmap, cliprect);
return 0; return 0;
} }

View File

@ -15,56 +15,6 @@
#define FRAMEBUFFER_MAX_Y (UINT32)((FRAMEBUFFER_CLOCK / (float)(FRAMEBUFFER_MAX_X-1)) / ((float)PIXEL_CLOCK/(HTOTAL*VTOTAL))) #define FRAMEBUFFER_MAX_Y (UINT32)((FRAMEBUFFER_CLOCK / (float)(FRAMEBUFFER_MAX_X-1)) / ((float)PIXEL_CLOCK/(HTOTAL*VTOTAL)))
/*************************************
*
* Globals
*
*************************************/
UINT16 *lockon_char_ram;
UINT16 *lockon_hud_ram;
UINT16 *lockon_scene_ram;
UINT16 *lockon_ground_ram;
UINT16 *lockon_object_ram;
size_t lockon_hudram_size;
size_t lockon_objectram_size;
size_t lockon_groundram_size;
/*************************************
*
* Statics
*
*************************************/
static tilemap_t *lockon_tilemap;
static UINT8 ground_ctrl;
static UINT16 scroll_h;
static UINT16 scroll_v;
static bitmap_t *front_buffer;
static bitmap_t *back_buffer;
static emu_timer *bufend_timer;
static emu_timer *cursor_timer;
/* Rotation Control */
static UINT16 xsal;
static UINT16 x0ll;
static UINT16 dx0ll;
static UINT16 dxll;
static UINT16 ysal;
static UINT16 y0ll;
static UINT16 dy0ll;
static UINT16 dyll;
/* Object palette RAM control */
static UINT32 iden;
static UINT8 *obj_pal_ram;
static UINT32 obj_pal_latch;
static UINT32 obj_pal_addr;
/************************************* /*************************************
* *
* HD46505S-2 CRT Controller * HD46505S-2 CRT Controller
@ -114,10 +64,12 @@ WRITE16_HANDLER( lockon_crtc_w )
static TIMER_CALLBACK( cursor_callback ) static TIMER_CALLBACK( cursor_callback )
{ {
if (lockon_main_inten) lockon_state *state = (lockon_state *)machine->driver_data;
cputag_set_input_line_and_vector(machine, "maincpu", 0, HOLD_LINE, 0xff);
timer_adjust_oneshot(cursor_timer, video_screen_get_time_until_pos(machine->primary_screen, CURSOR_YPOS, CURSOR_XPOS), 0); if (state->main_inten)
cpu_set_input_line_and_vector(state->maincpu, 0, HOLD_LINE, 0xff);
timer_adjust_oneshot(state->cursor_timer, video_screen_get_time_until_pos(machine->primary_screen, CURSOR_YPOS, CURSOR_XPOS), 0);
} }
/************************************* /*************************************
@ -158,15 +110,15 @@ PALETTE_INIT( lockon )
if (p2 & 0x80) if (p2 & 0x80)
{ {
r = compute_res_net( (p2 >> 2) & 0x1f, 0, &lockon_net_info ); r = compute_res_net((p2 >> 2) & 0x1f, 0, &lockon_net_info);
g = compute_res_net( ((p1 >> 5) & 0x7) | (p2 & 3) << 3, 1, &lockon_net_info ); g = compute_res_net(((p1 >> 5) & 0x7) | (p2 & 3) << 3, 1, &lockon_net_info);
b = compute_res_net( (p1 & 0x1f), 2, &lockon_net_info ); b = compute_res_net((p1 & 0x1f), 2, &lockon_net_info);
} }
else else
{ {
r = compute_res_net( (p2 >> 2) & 0x1f, 0, &lockon_pd_net_info ); r = compute_res_net((p2 >> 2) & 0x1f, 0, &lockon_pd_net_info);
g = compute_res_net( ((p1 >> 5) & 0x7) | (p2 & 3) << 3, 1, &lockon_pd_net_info ); g = compute_res_net(((p1 >> 5) & 0x7) | (p2 & 3) << 3, 1, &lockon_pd_net_info);
b = compute_res_net( (p1 & 0x1f), 2, &lockon_pd_net_info ); b = compute_res_net((p1 & 0x1f), 2, &lockon_pd_net_info);
} }
palette_set_color(machine, i, MAKE_RGB(r, g, b)); palette_set_color(machine, i, MAKE_RGB(r, g, b));
@ -182,14 +134,16 @@ PALETTE_INIT( lockon )
WRITE16_HANDLER( lockon_char_w ) WRITE16_HANDLER( lockon_char_w )
{ {
lockon_char_ram[offset] = data; lockon_state *state = (lockon_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(lockon_tilemap, offset); state->char_ram[offset] = data;
tilemap_mark_tile_dirty(state->tilemap, offset);
} }
static TILE_GET_INFO( get_lockon_tile_info ) static TILE_GET_INFO( get_lockon_tile_info )
{ {
UINT32 tileno = lockon_char_ram[tile_index] & 0x03ff; lockon_state *state = (lockon_state *)machine->driver_data;
UINT32 col = (lockon_char_ram[tile_index] >> 10) & 0x3f; UINT32 tileno = state->char_ram[tile_index] & 0x03ff;
UINT32 col = (state->char_ram[tile_index] >> 10) & 0x3f;
col = (col & 0x1f) + (col & 0x20 ? 64 : 0); col = (col & 0x1f) + (col & 0x20 ? 64 : 0);
SET_TILE_INFO(0, tileno, col, 0); SET_TILE_INFO(0, tileno, col, 0);
@ -204,16 +158,19 @@ static TILE_GET_INFO( get_lockon_tile_info )
WRITE16_HANDLER( lockon_scene_h_scr_w ) WRITE16_HANDLER( lockon_scene_h_scr_w )
{ {
scroll_h = data & 0x1ff; lockon_state *state = (lockon_state *)space->machine->driver_data;
state->scroll_h = data & 0x1ff;
} }
WRITE16_HANDLER( lockon_scene_v_scr_w ) WRITE16_HANDLER( lockon_scene_v_scr_w )
{ {
scroll_v = data & 0x81ff; lockon_state *state = (lockon_state *)space->machine->driver_data;
state->scroll_v = data & 0x81ff;
} }
static void scene_draw(running_machine *machine) static void scene_draw( running_machine *machine )
{ {
lockon_state *state = (lockon_state *)machine->driver_data;
UINT32 y; UINT32 y;
/* 3bpp characters */ /* 3bpp characters */
@ -224,29 +181,29 @@ static void scene_draw(running_machine *machine)
for (y = 0; y < FRAMEBUFFER_MAX_Y; ++y) for (y = 0; y < FRAMEBUFFER_MAX_Y; ++y)
{ {
UINT32 x; UINT32 x;
UINT32 d0 = 0, d1 = 0, d2 = 0; UINT32 d0 = 0, d1 = 0, d2 = 0;
UINT32 colour = 0; UINT32 colour = 0;
UINT32 y_offs; UINT32 y_offs;
UINT32 x_offs; UINT32 x_offs;
UINT32 y_gran; UINT32 y_gran;
UINT16 *bmpaddr; UINT16 *bmpaddr;
UINT32 ram_mask = 0x7ff; UINT32 ram_mask = 0x7ff;
y_offs = (y + scroll_v) & 0x1ff; y_offs = (y + state->scroll_v) & 0x1ff;
/* Clamp - stops tilemap wrapping when screen is rotated */ /* Clamp - stops tilemap wrapping when screen is rotated */
if (BIT(scroll_v, 15) && y_offs & 0x100) if (BIT(state->scroll_v, 15) && y_offs & 0x100)
ram_mask = 0x7; ram_mask = 0x7;
x_offs = (scroll_h - 8) & 0x1ff; x_offs = (state->scroll_h - 8) & 0x1ff;
y_gran = y_offs & 7; y_gran = y_offs & 7;
if (x_offs & 7) if (x_offs & 7)
{ {
UINT32 tileidx; UINT32 tileidx;
UINT16 addr = ((y_offs & ~7) << 3) + ((x_offs >> 3) & 0x3f); UINT16 addr = ((y_offs & ~7) << 3) + ((x_offs >> 3) & 0x3f);
UINT16 ram_val = lockon_scene_ram[addr & ram_mask]; UINT16 ram_val = state->scene_ram[addr & ram_mask];
colour = (clut[ram_val & 0x7fff] & 0x3f) << 3; colour = (clut[ram_val & 0x7fff] & 0x3f) << 3;
tileidx = ((ram_val & 0x0fff) << 3) + y_gran; tileidx = ((ram_val & 0x0fff) << 3) + y_gran;
@ -256,7 +213,7 @@ static void scene_draw(running_machine *machine)
d2 = *(gfx3 + tileidx); d2 = *(gfx3 + tileidx);
} }
bmpaddr = BITMAP_ADDR16(back_buffer, y, 0); bmpaddr = BITMAP_ADDR16(state->back_buffer, y, 0);
for (x = 0; x < FRAMEBUFFER_MAX_X; ++x) for (x = 0; x < FRAMEBUFFER_MAX_X; ++x)
{ {
@ -267,7 +224,7 @@ static void scene_draw(running_machine *machine)
{ {
UINT32 tileidx; UINT32 tileidx;
UINT16 addr = ((y_offs & ~7) << 3) + ((x_offs >> 3) & 0x3f); UINT16 addr = ((y_offs & ~7) << 3) + ((x_offs >> 3) & 0x3f);
UINT16 ram_val = lockon_scene_ram[addr & ram_mask]; UINT16 ram_val = state->scene_ram[addr & ram_mask];
colour = (clut[ram_val & 0x7fff] & 0x3f) << 3; colour = (clut[ram_val & 0x7fff] & 0x3f) << 3;
tileidx = ((ram_val & 0x0fff) << 3) + y_gran; tileidx = ((ram_val & 0x0fff) << 3) + y_gran;
@ -324,13 +281,15 @@ static void scene_draw(running_machine *machine)
WRITE16_HANDLER( lockon_ground_ctrl_w ) WRITE16_HANDLER( lockon_ground_ctrl_w )
{ {
ground_ctrl = data & 0xff; lockon_state *state = (lockon_state *)space->machine->driver_data;
state->ground_ctrl = data & 0xff;
} }
static TIMER_CALLBACK( bufend_callback ) static TIMER_CALLBACK( bufend_callback )
{ {
cputag_set_input_line_and_vector(machine, "ground", 0, HOLD_LINE, 0xff); lockon_state *state = (lockon_state *)machine->driver_data;
cputag_set_input_line(machine, "object", NEC_INPUT_LINE_POLL, ASSERT_LINE); cpu_set_input_line_and_vector(state->ground, 0, HOLD_LINE, 0xff);
cpu_set_input_line(state->object, NEC_INPUT_LINE_POLL, ASSERT_LINE);
} }
/* Get data for a each 8x8x3 ground tile */ /* Get data for a each 8x8x3 ground tile */
@ -347,47 +306,49 @@ static TIMER_CALLBACK( bufend_callback )
rom_data3 = gfx_rom[gfx_addr + 0x20000]; \ rom_data3 = gfx_rom[gfx_addr + 0x20000]; \
} }
static void ground_draw(running_machine *machine) static void ground_draw( running_machine *machine )
{ {
lockon_state *state = (lockon_state *)machine->driver_data;
/* ROM pointers */ /* ROM pointers */
const UINT8 *const gfx_rom = memory_region(machine, "gfx4"); const UINT8 *const gfx_rom = memory_region(machine, "gfx4");
const UINT8 *const lut_rom = gfx_rom + 0x30000 + ((ground_ctrl >> 2) & 0x3 ? 0x10000 : 0); const UINT8 *const lut_rom = gfx_rom + 0x30000 + ((state->ground_ctrl >> 2) & 0x3 ? 0x10000 : 0);
const UINT8 *const clut_rom = gfx_rom + 0x50000; const UINT8 *const clut_rom = gfx_rom + 0x50000;
UINT32 lut_a15_14 = (ground_ctrl & 0x3) << 14; UINT32 lut_a15_14 = (state->ground_ctrl & 0x3) << 14;
UINT32 clut_a14_12 = (ground_ctrl & 0x70) << 8; UINT32 clut_a14_12 = (state->ground_ctrl & 0x70) << 8;
UINT32 gfx_a15 = (ground_ctrl & 0x40) << 9; UINT32 gfx_a15 = (state->ground_ctrl & 0x40) << 9;
UINT32 offs = 3; UINT32 offs = 3;
UINT32 y; UINT32 y;
/* TODO: Clean up and emulate CS of GFX ROMs? */ /* TODO: Clean up and emulate CS of GFX ROMs? */
for (y = 0; y < FRAMEBUFFER_MAX_Y; ++y) for (y = 0; y < FRAMEBUFFER_MAX_Y; ++y)
{ {
UINT16 *bmpaddr = BITMAP_ADDR16(back_buffer, y, 0); UINT16 *bmpaddr = BITMAP_ADDR16(state->back_buffer, y, 0);
UINT8 ls163; UINT8 ls163;
UINT32 clut_addr; UINT32 clut_addr;
UINT32 gfx_addr; UINT32 gfx_addr;
UINT8 rom_data1 = 0; UINT8 rom_data1 = 0;
UINT8 rom_data2 = 0; UINT8 rom_data2 = 0;
UINT8 rom_data3 = 0; UINT8 rom_data3 = 0;
UINT32 pal = 0; UINT32 pal = 0;
UINT32 x; UINT32 x;
/* Draw this line? */ /* Draw this line? */
if (!(lockon_ground_ram[offs] & 0x8000)) if (!(state->ground_ram[offs] & 0x8000))
{ {
UINT32 gfx_a2_0 = lockon_ground_ram[offs] & 0x0007; UINT32 gfx_a2_0 = state->ground_ram[offs] & 0x0007;
UINT32 gfx_a6_5 = (lockon_ground_ram[offs] & 0x0018) << 2; UINT32 gfx_a6_5 = (state->ground_ram[offs] & 0x0018) << 2;
UINT32 clut_a4_3 = (lockon_ground_ram[offs] & 0x0018) >> 1; UINT32 clut_a4_3 = (state->ground_ram[offs] & 0x0018) >> 1;
UINT8 tz2213_x = lockon_ground_ram[offs + 1] & 0xff; UINT8 tz2213_x = state->ground_ram[offs + 1] & 0xff;
UINT8 tz2213_dx = lockon_ground_ram[offs + 2] & 0xff; UINT8 tz2213_dx = state->ground_ram[offs + 2] & 0xff;
UINT32 lut_address = lut_a15_14 + ((lockon_ground_ram[offs] & 0x7fe0) >> 1); UINT32 lut_address = lut_a15_14 + ((state->ground_ram[offs] & 0x7fe0) >> 1);
UINT32 cy = lockon_ground_ram[offs + 2] & 0x0100; UINT32 cy = state->ground_ram[offs + 2] & 0x0100;
UINT32 color; UINT32 color;
UINT32 gpbal2_0_prev; UINT32 gpbal2_0_prev;
ls163 = lockon_ground_ram[offs + 1] >> 8; ls163 = state->ground_ram[offs + 1] >> 8;
gpbal2_0_prev = ((ls163 & 3) << 1) | BIT(tz2213_x, 7); gpbal2_0_prev = ((ls163 & 3) << 1) | BIT(tz2213_x, 7);
@ -425,9 +386,9 @@ static void ground_draw(running_machine *machine)
offs += 3; offs += 3;
/* End of list marker */ /* End of list marker */
if (lockon_ground_ram[offs + 2] & 0x8000) if (state->ground_ram[offs + 2] & 0x8000)
{ {
timer_adjust_oneshot(bufend_timer, attotime_mul(ATTOTIME_IN_HZ(FRAMEBUFFER_CLOCK), FRAMEBUFFER_MAX_X * y), 0); timer_adjust_oneshot(state->bufend_timer, attotime_mul(ATTOTIME_IN_HZ(FRAMEBUFFER_CLOCK), FRAMEBUFFER_MAX_X * y), 0);
} }
} }
} }
@ -464,7 +425,7 @@ do { \
if (px < FRAMEBUFFER_MAX_X) \ if (px < FRAMEBUFFER_MAX_X) \
if (COLOR != 0xf) \ if (COLOR != 0xf) \
{ \ { \
UINT8 clr = obj_pal_ram[(pal << 4) + COLOR]; \ UINT8 clr = state->obj_pal_ram[(pal << 4) + COLOR]; \
UINT16 *pix = (line + px); \ UINT16 *pix = (line + px); \
if (!(clr == 0xff && ((*pix & 0xe00) == 0xa00))) \ if (!(clr == 0xff && ((*pix & 0xe00) == 0xa00))) \
*pix = 0x400 + clr; \ *pix = 0x400 + clr; \
@ -472,16 +433,17 @@ do { \
px = (px + 1) & 0x7ff; \ px = (px + 1) & 0x7ff; \
} while(0) } while(0)
static void objects_draw(running_machine *machine) static void objects_draw( running_machine *machine )
{ {
UINT32 offs; UINT32 offs;
lockon_state *state = (lockon_state *)machine->driver_data;
const UINT8 *const romlut = memory_region(machine, "user1"); const UINT8 *const romlut = memory_region(machine, "user1");
const UINT16 *const chklut = (UINT16*)memory_region(machine, "user2"); const UINT16 *const chklut = (UINT16*)memory_region(machine, "user2");
const UINT8 *const gfxrom = memory_region(machine, "gfx5"); const UINT8 *const gfxrom = memory_region(machine, "gfx5");
const UINT8 *const sproms = memory_region(machine, "proms") + 0x800; const UINT8 *const sproms = memory_region(machine, "proms") + 0x800;
for (offs = 0; offs < lockon_objectram_size; offs += 4) for (offs = 0; offs < state->objectram_size; offs += 4)
{ {
UINT32 y; UINT32 y;
UINT32 xpos; UINT32 xpos;
@ -497,19 +459,19 @@ static void objects_draw(running_machine *machine)
UINT32 opsta15_8; UINT32 opsta15_8;
/* Retrieve the object attributes */ /* Retrieve the object attributes */
ypos = lockon_object_ram[offs] & 0x03ff; ypos = state->object_ram[offs] & 0x03ff;
xpos = lockon_object_ram[offs + 3] & 0x07ff; xpos = state->object_ram[offs + 3] & 0x07ff;
ysize = (lockon_object_ram[offs] >> 10) & 0x3; ysize = (state->object_ram[offs] >> 10) & 0x3;
xsize = (lockon_object_ram[offs] >> 12) & 0x3; xsize = (state->object_ram[offs] >> 12) & 0x3;
yflip = BIT(lockon_object_ram[offs], 14); yflip = BIT(state->object_ram[offs], 14);
xflip = BIT(lockon_object_ram[offs], 15); xflip = BIT(state->object_ram[offs], 15);
scale = lockon_object_ram[offs + 1] & 0xff; scale = state->object_ram[offs + 1] & 0xff;
pal = (lockon_object_ram[offs + 1] >> 8) & 0x7f; pal = (state->object_ram[offs + 1] >> 8) & 0x7f;
opsta = lockon_object_ram[offs + 2]; opsta = state->object_ram[offs + 2];
if (iden) if (state->iden)
{ {
obj_pal_ram[(pal << 4) + obj_pal_addr] = obj_pal_latch; state->obj_pal_ram[(pal << 4) + state->obj_pal_addr] = state->obj_pal_latch;
break; break;
} }
@ -523,14 +485,14 @@ static void objects_draw(running_machine *machine)
for (y = 0; y < FRAMEBUFFER_MAX_Y; y++) for (y = 0; y < FRAMEBUFFER_MAX_Y; y++)
{ {
UINT32 cy = (y + ypos) & 0x3ff; UINT32 cy = (y + ypos) & 0x3ff;
UINT32 optab; UINT32 optab;
UINT32 lutaddr; UINT32 lutaddr;
UINT32 tile; UINT32 tile;
UINT8 cnt; UINT8 cnt;
UINT32 yidx; UINT32 yidx;
UINT16 *line = BITMAP_ADDR16(back_buffer, y, 0); UINT16 *line = BITMAP_ADDR16(state->back_buffer, y, 0);
UINT32 px = xpos; UINT32 px = xpos;
/* Outside the limits? */ /* Outside the limits? */
if (cy & 0x300) if (cy & 0x300)
@ -560,13 +522,13 @@ static void objects_draw(running_machine *machine)
/* Draw! */ /* Draw! */
for (tile = 0; tile < (1 << xsize); ++tile) for (tile = 0; tile < (1 << xsize); ++tile)
{ {
UINT16 sc; UINT16 sc;
UINT16 scl; UINT16 scl;
UINT32 x; UINT32 x;
UINT32 tileaddr; UINT32 tileaddr;
UINT16 td0, td1, td2, td3; UINT16 td0, td1, td2, td3;
UINT32 j; UINT32 j;
UINT32 bank; UINT32 bank;
scl = scale & 0x7f; scl = scale & 0x7f;
tileaddr = (chklut[opsta15_8 + cnt] & 0x7fff); tileaddr = (chklut[opsta15_8 + cnt] & 0x7fff);
@ -610,7 +572,7 @@ static void objects_draw(running_machine *machine)
DRAW_OBJ_PIXEL(col); DRAW_OBJ_PIXEL(col);
if ( BIT(sc, x) ) if (BIT(sc, x))
DRAW_OBJ_PIXEL(col); DRAW_OBJ_PIXEL(col);
} }
} }
@ -621,7 +583,7 @@ static void objects_draw(running_machine *machine)
UINT8 col; UINT8 col;
UINT8 pix = x; UINT8 pix = x;
if ( BIT(sc, x) ) if (BIT(sc, x))
{ {
if (!xflip) if (!xflip)
pix ^= 0x7; pix ^= 0x7;
@ -640,7 +602,7 @@ static void objects_draw(running_machine *machine)
} }
/* Check for the end of list marker */ /* Check for the end of list marker */
if (lockon_object_ram[offs + 1] & 0x8000) if (state->object_ram[offs + 1] & 0x8000)
return; return;
} }
} }
@ -648,23 +610,28 @@ static void objects_draw(running_machine *machine)
/* The mechanism used by the object CPU to update the object ASICs palette RAM */ /* The mechanism used by the object CPU to update the object ASICs palette RAM */
WRITE16_HANDLER( lockon_tza112_w ) WRITE16_HANDLER( lockon_tza112_w )
{ {
if (iden) lockon_state *state = (lockon_state *)space->machine->driver_data;
if (state->iden)
{ {
obj_pal_latch = data & 0xff; state->obj_pal_latch = data & 0xff;
obj_pal_addr = offset & 0xf; state->obj_pal_addr = offset & 0xf;
objects_draw(space->machine); objects_draw(space->machine);
} }
} }
READ16_HANDLER( lockon_obj_4000_r ) READ16_HANDLER( lockon_obj_4000_r )
{ {
cputag_set_input_line(space->machine, "object", NEC_INPUT_LINE_POLL, CLEAR_LINE); lockon_state *state = (lockon_state *)space->machine->driver_data;
cpu_set_input_line(state->object, NEC_INPUT_LINE_POLL, CLEAR_LINE);
return 0xffff; return 0xffff;
} }
WRITE16_HANDLER( lockon_obj_4000_w ) WRITE16_HANDLER( lockon_obj_4000_w )
{ {
iden = data & 1; lockon_state *state = (lockon_state *)space->machine->driver_data;
state->iden = data & 1;
} }
@ -701,17 +668,19 @@ WRITE16_HANDLER( lockon_fb_clut_w )
/* Rotation control register */ /* Rotation control register */
WRITE16_HANDLER( lockon_rotate_w ) WRITE16_HANDLER( lockon_rotate_w )
{ {
lockon_state *state = (lockon_state *)space->machine->driver_data;
switch (offset & 7) switch (offset & 7)
{ {
case 0: xsal = data & 0x1ff; break; case 0: state->xsal = data & 0x1ff; break;
case 1: x0ll = data & 0xff; break; case 1: state->x0ll = data & 0xff; break;
case 2: dx0ll = data & 0x1ff; break; case 2: state->dx0ll = data & 0x1ff; break;
case 3: dxll = data & 0x1ff; break; case 3: state->dxll = data & 0x1ff; break;
case 4: ysal = data & 0x1ff; break; case 4: state->ysal = data & 0x1ff; break;
case 5: y0ll = data & 0xff; break; case 5: state->y0ll = data & 0xff; break;
case 6: dy0ll = data & 0x1ff; break; case 6: state->dy0ll = data & 0x1ff; break;
case 7: dyll = data & 0x3ff; break; case 7: state->dyll = data & 0x3ff; break;
} }
} }
@ -729,28 +698,29 @@ do { \
if (carry) --CNT; \ if (carry) --CNT; \
} while(0) } while(0)
static void rotate_draw(bitmap_t *bitmap, const rectangle *cliprect) static void rotate_draw( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
{ {
lockon_state *state = (lockon_state *)machine->driver_data;
UINT32 y; UINT32 y;
/* Counters */ /* Counters */
UINT32 cxy = xsal & 0xff; UINT32 cxy = state->xsal & 0xff;
UINT32 cyy = ysal & 0x1ff; UINT32 cyy = state->ysal & 0x1ff;
/* Accumulator values and deltas */ /* Accumulator values and deltas */
UINT8 axy = x0ll & 0xff; UINT8 axy = state->x0ll & 0xff;
UINT8 daxy = dx0ll & 0xff; UINT8 daxy = state->dx0ll & 0xff;
UINT8 ayy = y0ll & 0xff; UINT8 ayy = state->y0ll & 0xff;
UINT8 dayy = dy0ll & 0xff; UINT8 dayy = state->dy0ll & 0xff;
UINT8 dayx = dyll & 0xff; UINT8 dayx = state->dyll & 0xff;
UINT8 daxx = dxll & 0xff; UINT8 daxx = state->dxll & 0xff;
UINT32 xy_up = BIT(xsal, 8); UINT32 xy_up = BIT(state->xsal, 8);
UINT32 yx_up = BIT(dyll, 9); UINT32 yx_up = BIT(state->dyll, 9);
UINT32 axx_en = !BIT(dxll, 8); UINT32 axx_en = !BIT(state->dxll, 8);
UINT32 ayx_en = !BIT(dyll, 8); UINT32 ayx_en = !BIT(state->dyll, 8);
UINT32 axy_en = !BIT(dx0ll, 8); UINT32 axy_en = !BIT(state->dx0ll, 8);
UINT32 ayy_en = !BIT(dy0ll, 8); UINT32 ayy_en = !BIT(state->dy0ll, 8);
for (y = 0; y <= cliprect->max_y; ++y) for (y = 0; y <= cliprect->max_y; ++y)
{ {
@ -769,7 +739,7 @@ static void rotate_draw(bitmap_t *bitmap, const rectangle *cliprect)
cx &= 0x1ff; cx &= 0x1ff;
cy &= 0x1ff; cy &= 0x1ff;
*dst++ = *BITMAP_ADDR16(front_buffer, cy, cx); *dst++ = *BITMAP_ADDR16(state->front_buffer, cy, cx);
if (axx_en) if (axx_en)
INCREMENT(axx, cx); INCREMENT(axx, cx);
@ -833,33 +803,34 @@ static void rotate_draw(bitmap_t *bitmap, const rectangle *cliprect)
*******************************************************************************************/ *******************************************************************************************/
static void hud_draw(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect) static void hud_draw( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
{ {
lockon_state *state = (lockon_state *)machine->driver_data;
UINT8 *tile_rom = memory_region(machine, "gfx3"); UINT8 *tile_rom = memory_region(machine, "gfx3");
UINT32 offs; UINT32 offs;
for (offs = 0x0; offs <= lockon_hudram_size; offs += 2) for (offs = 0x0; offs <= state->hudram_size; offs += 2)
{ {
UINT32 y; UINT32 y;
UINT32 y_pos; UINT32 y_pos;
UINT32 x_pos; UINT32 x_pos;
UINT32 y_size; UINT32 y_size;
UINT32 x_size; UINT32 x_size;
UINT32 layout; UINT32 layout;
UINT16 colour; UINT16 colour;
UINT32 code; UINT32 code;
UINT32 rom_a12_7; UINT32 rom_a12_7;
/* End of sprite list marker */ /* End of sprite list marker */
if (lockon_hud_ram[offs + 1] & 0x8000) if (state->hud_ram[offs + 1] & 0x8000)
break; break;
y_pos = lockon_hud_ram[offs] & 0x1ff; y_pos = state->hud_ram[offs] & 0x1ff;
x_pos = lockon_hud_ram[offs + 1] & 0x1ff; x_pos = state->hud_ram[offs + 1] & 0x1ff;
x_size = (lockon_hud_ram[offs + 1] >> 12) & 7; x_size = (state->hud_ram[offs + 1] >> 12) & 7;
code = (lockon_hud_ram[offs] >> 9) & 0x7f; code = (state->hud_ram[offs] >> 9) & 0x7f;
colour = 0x200 + ((lockon_hud_ram[offs + 1] >> 9) & 7); colour = 0x200 + ((state->hud_ram[offs + 1] >> 9) & 7);
layout = (code >> 5) & 3; layout = (code >> 5) & 3;
rom_a12_7 = (code & 0xfe) << 6; rom_a12_7 = (code & 0xfe) << 6;
@ -888,8 +859,8 @@ static void hud_draw(running_machine *machine, bitmap_t *bitmap, const rectangle
for (xt = 0; xt <= x_size; ++xt) for (xt = 0; xt <= x_size; ++xt)
{ {
UINT32 rom_a6_3; UINT32 rom_a6_3;
UINT32 px; UINT32 px;
UINT8 gfx_strip; UINT8 gfx_strip;
if (layout == 3) if (layout == 3)
@ -934,38 +905,46 @@ static void hud_draw(running_machine *machine, bitmap_t *bitmap, const rectangle
VIDEO_START( lockon ) VIDEO_START( lockon )
{ {
lockon_tilemap = tilemap_create(machine, get_lockon_tile_info, tilemap_scan_rows, 8, 8, 64, 32); lockon_state *state = (lockon_state *)machine->driver_data;
tilemap_set_transparent_pen(lockon_tilemap, 0);
state->tilemap = tilemap_create(machine, get_lockon_tile_info, tilemap_scan_rows, 8, 8, 64, 32);
tilemap_set_transparent_pen(state->tilemap, 0);
/* Allocate the two frame buffers for rotation */ /* Allocate the two frame buffers for rotation */
back_buffer = auto_bitmap_alloc(machine, 512, 512, BITMAP_FORMAT_INDEXED16); state->back_buffer = auto_bitmap_alloc(machine, 512, 512, BITMAP_FORMAT_INDEXED16);
front_buffer = auto_bitmap_alloc(machine, 512, 512, BITMAP_FORMAT_INDEXED16); state->front_buffer = auto_bitmap_alloc(machine, 512, 512, BITMAP_FORMAT_INDEXED16);
/* 2kB of object ASIC palette RAM */ /* 2kB of object ASIC palette RAM */
obj_pal_ram = auto_alloc_array(machine, UINT8, 2048); state->obj_pal_ram = auto_alloc_array(machine, UINT8, 2048);
/* Timer for ground display list callback */ /* Timer for ground display list callback */
bufend_timer = timer_alloc(machine, bufend_callback, NULL); state->bufend_timer = timer_alloc(machine, bufend_callback, NULL);
/* Timer for the CRTC cursor pulse */ /* Timer for the CRTC cursor pulse */
cursor_timer = timer_alloc(machine, cursor_callback, NULL); state->cursor_timer = timer_alloc(machine, cursor_callback, NULL);
timer_adjust_oneshot(cursor_timer, video_screen_get_time_until_pos(machine->primary_screen, CURSOR_YPOS, CURSOR_XPOS), 0); timer_adjust_oneshot(state->cursor_timer, video_screen_get_time_until_pos(machine->primary_screen, CURSOR_YPOS, CURSOR_XPOS), 0);
state_save_register_global_bitmap(machine, state->back_buffer);
state_save_register_global_bitmap(machine, state->front_buffer);
state_save_register_global_pointer(machine, state->obj_pal_ram, 2048);
} }
VIDEO_UPDATE( lockon ) VIDEO_UPDATE( lockon )
{ {
lockon_state *state = (lockon_state *)screen->machine->driver_data;
/* If screen output is disabled, fill with black */ /* If screen output is disabled, fill with black */
if ( !BIT(lockon_ctrl_reg, 7) ) if (!BIT(state->ctrl_reg, 7))
{ {
bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine)); bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine));
return 0; return 0;
} }
/* Scan out the frame buffer in rotated order */ /* Scan out the frame buffer in rotated order */
rotate_draw(bitmap, cliprect); rotate_draw(screen->machine, bitmap, cliprect);
/* Draw the character tilemap */ /* Draw the character tilemap */
tilemap_draw(bitmap, cliprect, lockon_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->tilemap, 0, 0);
/* Draw the HUD */ /* Draw the HUD */
hud_draw(screen->machine, bitmap, cliprect); hud_draw(screen->machine, bitmap, cliprect);
@ -975,14 +954,15 @@ VIDEO_UPDATE( lockon )
VIDEO_EOF( lockon ) VIDEO_EOF( lockon )
{ {
lockon_state *state = (lockon_state *)machine->driver_data;
/* Swap the frame buffers */ /* Swap the frame buffers */
bitmap_t *tmp = front_buffer; bitmap_t *tmp = state->front_buffer;
front_buffer = back_buffer; state->front_buffer = state->back_buffer;
back_buffer = tmp; state->back_buffer = tmp;
/* Draw the frame buffer layers */ /* Draw the frame buffer layers */
scene_draw(machine); scene_draw(machine);
ground_draw(machine); ground_draw(machine);
objects_draw(machine); objects_draw(machine);
} }

View File

@ -1,37 +1,36 @@
#include "emu.h" #include "emu.h"
#include "includes/lsasquad.h" #include "includes/lsasquad.h"
UINT8 *lsasquad_scrollram; static void draw_layer( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 *scrollram )
static void draw_layer(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 *scrollram)
{ {
int offs,scrollx,scrolly; lsasquad_state *state = (lsasquad_state *)machine->driver_data;
int offs, scrollx, scrolly;
scrollx = scrollram[3]; scrollx = scrollram[3];
scrolly = -scrollram[0]; scrolly = -scrollram[0];
for (offs = 0;offs < 0x080;offs += 4) for (offs = 0; offs < 0x080; offs += 4)
{ {
int base,y,sx,sy,code,color; int base, y, sx, sy, code, color;
base = 64 * scrollram[offs + 1];
sx = 8 * (offs / 4) + scrollx;
if (flip_screen_get(machine))
sx = 248 - sx;
base = 64 * scrollram[offs+1];
sx = 8*(offs/4) + scrollx;
if (flip_screen_get(machine)) sx = 248 - sx;
sx &= 0xff; sx &= 0xff;
for (y = 0;y < 32;y++) for (y = 0; y < 32; y++)
{ {
int attr; int attr;
sy = 8*y + scrolly; sy = 8 * y + scrolly;
if (flip_screen_get(machine)) sy = 248 - sy; if (flip_screen_get(machine))
sy = 248 - sy;
sy &= 0xff; sy &= 0xff;
attr = machine->generic.videoram.u8[base + 2*y + 1]; attr = state->videoram[base + 2 * y + 1];
code = machine->generic.videoram.u8[base + 2*y] + ((attr & 0x0f) << 8); code = state->videoram[base + 2 * y] + ((attr & 0x0f) << 8);
color = attr >> 4; color = attr >> 4;
drawgfx_transpen(bitmap,cliprect,machine->gfx[0], drawgfx_transpen(bitmap,cliprect,machine->gfx[0],
@ -49,76 +48,78 @@ static void draw_layer(running_machine *machine, bitmap_t *bitmap, const rectang
} }
} }
static int draw_layer_daikaiju(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int * previd, int type) static int draw_layer_daikaiju( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int * previd, int type )
{ {
int id,scrollx,scrolly,initoffs, globalscrollx; lsasquad_state *state = (lsasquad_state *)machine->driver_data;
int stepx=0; int id, scrollx, scrolly, initoffs, globalscrollx;
initoffs=offs; int stepx = 0;
globalscrollx=0; initoffs = offs;
globalscrollx = 0;
id=lsasquad_scrollram[offs+2]; id = state->scrollram[offs + 2];
for(;offs < 0x400; offs+=4) for( ; offs < 0x400; offs += 4)
{ {
int base,y,sx,sy,code,color; int base, y, sx, sy, code, color;
//id change //id change
if(id!=lsasquad_scrollram[offs+2]) if (id != state->scrollram[offs + 2])
{ {
*previd = id; *previd = id;
return offs; return offs;
} }
else else
{ {
id=lsasquad_scrollram[offs+2]; id = state->scrollram[offs + 2];
} }
//skip empty (??) column, potential probs with 1st column in scrollram (scroll 0, tile 0, id 0) //skip empty (??) column, potential probs with 1st column in scrollram (scroll 0, tile 0, id 0)
if( (lsasquad_scrollram[offs+0]|lsasquad_scrollram[offs+1]|lsasquad_scrollram[offs+2]|lsasquad_scrollram[offs+3])==0) if ((state->scrollram[offs + 0] | state->scrollram[offs + 1] | state->scrollram[offs + 2] | state->scrollram[offs + 3]) == 0)
continue; continue;
//local scroll x/y //local scroll x/y
scrolly = -lsasquad_scrollram[offs+0]; scrolly = -state->scrollram[offs + 0];
scrollx = lsasquad_scrollram[offs+3]; scrollx = state->scrollram[offs + 3];
//check for global x scroll used in bg layer in game (starts at offset 0 in scrollram //check for global x scroll used in bg layer in game (starts at offset 0 in scrollram
// and game name/logo on title screen (starts in the middle of scrollram, but with different // and game name/logo on title screen (starts in the middle of scrollram, but with different
// (NOT unique )id than prev coulmn(s) // (NOT unique )id than prev coulmn(s)
if( *previd!=1 ) if (*previd != 1)
{ {
if(offs!=initoffs) if (offs != initoffs)
{ {
scrollx+=globalscrollx; scrollx += globalscrollx;
} }
else else
{ {
//global scroll init //global scroll init
globalscrollx=scrollx; globalscrollx = scrollx;
} }
} }
base = 64 * lsasquad_scrollram[offs+1]; base = 64 * state->scrollram[offs + 1];
sx = scrollx+stepx; sx = scrollx + stepx;
if (flip_screen_get(machine)) sx = 248 - sx; if (flip_screen_get(machine))
sx = 248 - sx;
sx &= 0xff; sx &= 0xff;
for (y = 0;y < 32;y++) for (y = 0; y < 32; y++)
{ {
int attr; int attr;
sy = 8*y + scrolly; sy = 8 * y + scrolly;
if (flip_screen_get(machine)) sy = 248 - sy; if (flip_screen_get(machine))
sy = 248 - sy;
sy &= 0xff; sy &= 0xff;
attr = machine->generic.videoram.u8[base + 2*y + 1]; attr = state->videoram[base + 2 * y + 1];
code = machine->generic.videoram.u8[base + 2*y] + ((attr & 0x0f) << 8); code = state->videoram[base + 2 * y] + ((attr & 0x0f) << 8);
color = attr >> 4; color = attr >> 4;
if ((type == 0 && color != 0x0d) || (type != 0 && color == 0x0d))
if((type==0 && color!=0x0d) || (type !=0 && color==0x0d))
{ {
drawgfx_transpen(bitmap,cliprect,machine->gfx[0], drawgfx_transpen(bitmap,cliprect,machine->gfx[0],
code, code,
@ -137,38 +138,40 @@ static int draw_layer_daikaiju(running_machine *machine, bitmap_t *bitmap, const
return offs; return offs;
} }
static void drawbg(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int type) static void drawbg( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int type )
{ {
int i=0; lsasquad_state *state = (lsasquad_state *)machine->driver_data;
int id=-1; int i = 0;
int id = -1;
while(i<0x400) while (i < 0x400)
{ {
if(!(lsasquad_scrollram[i+2]&1)) if (!(state->scrollram[i + 2] & 1))
{ {
i=draw_layer_daikaiju(machine, bitmap, cliprect, i, &id,type); i = draw_layer_daikaiju(machine, bitmap, cliprect, i, &id, type);
} }
else else
{ {
id=lsasquad_scrollram[i+2]; id = state->scrollram[i + 2];
i+=4; i += 4;
} }
} }
} }
static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect) static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
{ {
UINT8 *spriteram = machine->generic.spriteram.u8; lsasquad_state *state = (lsasquad_state *)machine->driver_data;
UINT8 *spriteram = state->spriteram;
int offs; int offs;
for (offs = machine->generic.spriteram_size-4;offs >= 0;offs -= 4) for (offs = state->spriteram_size - 4; offs >= 0; offs -= 4)
{ {
int sx,sy,attr,code,color,flipx,flipy; int sx, sy, attr, code, color, flipx, flipy;
sx = spriteram[offs+3]; sx = spriteram[offs + 3];
sy = 240 - spriteram[offs]; sy = 240 - spriteram[offs];
attr = spriteram[offs+1]; attr = spriteram[offs + 1];
code = spriteram[offs+2] + ((attr & 0x30) << 4); code = spriteram[offs + 2] + ((attr & 0x30) << 4);
color = attr & 0x0f; color = attr & 0x0f;
flipx = attr & 0x40; flipx = attr & 0x40;
flipy = attr & 0x80; flipy = attr & 0x80;
@ -197,21 +200,22 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
VIDEO_UPDATE( lsasquad ) VIDEO_UPDATE( lsasquad )
{ {
bitmap_fill(bitmap,cliprect,511); lsasquad_state *state = (lsasquad_state *)screen->machine->driver_data;
bitmap_fill(bitmap, cliprect, 511);
draw_layer(screen->machine,bitmap,cliprect,lsasquad_scrollram + 0x000); draw_layer(screen->machine, bitmap, cliprect, state->scrollram + 0x000);
draw_layer(screen->machine,bitmap,cliprect,lsasquad_scrollram + 0x080); draw_layer(screen->machine, bitmap, cliprect, state->scrollram + 0x080);
draw_sprites(screen->machine,bitmap,cliprect); draw_sprites(screen->machine, bitmap, cliprect);
draw_layer(screen->machine,bitmap,cliprect,lsasquad_scrollram + 0x100); draw_layer(screen->machine, bitmap, cliprect, state->scrollram + 0x100);
return 0; return 0;
} }
VIDEO_UPDATE( daikaiju ) VIDEO_UPDATE( daikaiju )
{ {
bitmap_fill(bitmap,cliprect,511); bitmap_fill(bitmap, cliprect, 511);
drawbg(screen->machine,bitmap,cliprect,0); // bottom drawbg(screen->machine, bitmap, cliprect, 0); // bottom
draw_sprites(screen->machine,bitmap,cliprect); draw_sprites(screen->machine, bitmap, cliprect);
drawbg(screen->machine,bitmap,cliprect,1); // top = pallete $d ? drawbg(screen->machine, bitmap, cliprect, 1); // top = pallete $d ?
return 0; return 0;
} }