Added driver data class and save states to playmark.c, powerbal.c, pushman.c and pzletime.c [Fabio Priuli]

This commit is contained in:
Fabio Priuli 2010-04-19 08:00:59 +00:00
parent 7db95005ef
commit 1e21b12b9e
9 changed files with 847 additions and 502 deletions

1
.gitattributes vendored
View File

@ -2745,6 +2745,7 @@ src/mame/includes/psikyo.h svneol=native#text/plain
src/mame/includes/psikyo4.h svneol=native#text/plain
src/mame/includes/psikyosh.h svneol=native#text/plain
src/mame/includes/psx.h svneol=native#text/plain
src/mame/includes/pushman.h svneol=native#text/plain
src/mame/includes/qix.h svneol=native#text/plain
src/mame/includes/raiden2.h svneol=native#text/plain
src/mame/includes/rainbow.h svneol=native#text/plain

View File

@ -47,21 +47,15 @@ TODO:
#include "includes/playmark.h"
static UINT16 playmark_snd_command;
static UINT16 playmark_snd_flag;
static UINT8 playmark_oki_control;
static UINT8 playmark_oki_command;
static WRITE16_HANDLER( coinctrl_w )
{
if (ACCESSING_BITS_8_15)
{
coin_counter_w(space->machine, 0,data & 0x0100);
coin_counter_w(space->machine, 1,data & 0x0200);
coin_counter_w(space->machine, 0, data & 0x0100);
coin_counter_w(space->machine, 1, data & 0x0200);
}
if (data & 0xfcff)
logerror("Writing %04x to unknown coin control bits\n",data);
logerror("Writing %04x to unknown coin control bits\n", data);
}
@ -86,62 +80,69 @@ static const eeprom_interface eeprom_intf =
static WRITE16_HANDLER( wbeachvl_coin_eeprom_w )
{
playmark_state *state = (playmark_state *)space->machine->driver_data;
if (ACCESSING_BITS_0_7)
{
running_device *eeprom = devtag_get_device(space->machine, "eeprom");
/* bits 0-3 are coin counters? (only 0 used?) */
coin_counter_w(space->machine, 0,data & 0x01);
coin_counter_w(space->machine, 1,data & 0x02);
coin_counter_w(space->machine, 2,data & 0x04);
coin_counter_w(space->machine, 3,data & 0x08);
coin_counter_w(space->machine, 0, data & 0x01);
coin_counter_w(space->machine, 1, data & 0x02);
coin_counter_w(space->machine, 2, data & 0x04);
coin_counter_w(space->machine, 3, data & 0x08);
/* bits 5-7 control EEPROM */
eeprom_set_cs_line(eeprom, (data & 0x20) ? CLEAR_LINE : ASSERT_LINE);
eeprom_write_bit(eeprom, data & 0x80);
eeprom_set_clock_line(eeprom, (data & 0x40) ? CLEAR_LINE : ASSERT_LINE);
eeprom_set_cs_line(state->eeprom, (data & 0x20) ? CLEAR_LINE : ASSERT_LINE);
eeprom_write_bit(state->eeprom, data & 0x80);
eeprom_set_clock_line(state->eeprom, (data & 0x40) ? CLEAR_LINE : ASSERT_LINE);
}
}
static WRITE16_HANDLER( hotmind_coin_eeprom_w )
{
playmark_state *state = (playmark_state *)space->machine->driver_data;
if (ACCESSING_BITS_0_7)
{
running_device *eeprom = devtag_get_device(space->machine, "eeprom");
coin_counter_w(space->machine, 0,data & 0x20);
eeprom_set_cs_line(eeprom, (data & 1) ? CLEAR_LINE : ASSERT_LINE);
eeprom_write_bit(eeprom, data & 4);
eeprom_set_clock_line(eeprom, (data & 2) ? ASSERT_LINE : CLEAR_LINE );
eeprom_set_cs_line(state->eeprom, (data & 1) ? CLEAR_LINE : ASSERT_LINE);
eeprom_write_bit(state->eeprom, data & 4);
eeprom_set_clock_line(state->eeprom, (data & 2) ? ASSERT_LINE : CLEAR_LINE );
}
}
static WRITE16_HANDLER( hrdtimes_coin_w )
{
coin_counter_w(space->machine, 0,data & 0x01);
coin_counter_w(space->machine, 1,data & 0x02);
coin_counter_w(space->machine, 0, data & 0x01);
coin_counter_w(space->machine, 1, data & 0x02);
}
static WRITE16_HANDLER( playmark_snd_command_w )
{
if (ACCESSING_BITS_0_7) {
playmark_snd_command = (data & 0xff);
playmark_snd_flag = 1;
playmark_state *state = (playmark_state *)space->machine->driver_data;
if (ACCESSING_BITS_0_7)
{
state->snd_command = (data & 0xff);
state->snd_flag = 1;
cpu_yield(space->cpu);
}
}
static READ8_HANDLER( playmark_snd_command_r )
{
playmark_state *state = (playmark_state *)space->machine->driver_data;
int data = 0;
if ((playmark_oki_control & 0x38) == 0x30) {
data = playmark_snd_command;
// logerror("PC$%03x PortB reading %02x from the 68K\n",cpu_get_previouspc(space->cpu),data);
if ((state->oki_control & 0x38) == 0x30)
{
data = state->snd_command;
// logerror("PC$%03x PortB reading %02x from the 68K\n", cpu_get_previouspc(space->cpu), data);
}
else if ((playmark_oki_control & 0x38) == 0x28) {
data = (okim6295_r(devtag_get_device(space->machine, "oki"),0) & 0x0f);
// logerror("PC$%03x PortB reading %02x from the OKI status port\n",cpu_get_previouspc(space->cpu),data);
else if ((state->oki_control & 0x38) == 0x28)
{
data = (okim6295_r(state->oki, 0) & 0x0f);
// logerror("PC$%03x PortB reading %02x from the OKI status port\n", cpu_get_previouspc(space->cpu), data);
}
return data;
@ -149,8 +150,11 @@ static READ8_HANDLER( playmark_snd_command_r )
static READ8_HANDLER( playmark_snd_flag_r )
{
if (playmark_snd_flag) {
playmark_snd_flag = 0;
playmark_state *state = (playmark_state *)space->machine->driver_data;
if (state->snd_flag)
{
state->snd_flag = 0;
return 0x00;
}
@ -160,26 +164,28 @@ static READ8_HANDLER( playmark_snd_flag_r )
static WRITE8_DEVICE_HANDLER( playmark_oki_banking_w )
{
static int old_bank = 0;
playmark_state *state = (playmark_state *)device->machine->driver_data;
if(old_bank != (data & 7))
if (state->old_oki_bank != (data & 7))
{
old_bank = data & 7;
state->old_oki_bank = data & 7;
if(((old_bank - 1) * 0x40000) < memory_region_length(device->machine, "oki"))
if (((state->old_oki_bank - 1) * 0x40000) < memory_region_length(device->machine, "oki"))
{
okim6295_set_bank_base(device, 0x40000 * (old_bank - 1));
okim6295_set_bank_base(device, 0x40000 * (state->old_oki_bank - 1));
}
}
}
static WRITE8_HANDLER( playmark_oki_w )
{
playmark_oki_command = data;
playmark_state *state = (playmark_state *)space->machine->driver_data;
state->oki_command = data;
}
static WRITE8_DEVICE_HANDLER( playmark_snd_control_w )
{
playmark_state *state = (playmark_state *)device->machine->driver_data;
// const address_space *space = cputag_get_address_space(device->machine, "audiocpu", ADDRESS_SPACE_PROGRAM);
/* This port controls communications to and from the 68K, and the OKI
@ -195,12 +201,12 @@ static WRITE8_DEVICE_HANDLER( playmark_snd_control_w )
1 Not used
0 Not used
*/
playmark_oki_control = data;
state->oki_control = data;
if ((data & 0x38) == 0x18)
{
// logerror("PC$%03x Writing %02x to OKI1, PortC=%02x, Code=%02x\n",cpu_get_previouspc(space->cpu),playmark_oki_command,playmark_oki_control,playmark_snd_command);
okim6295_w(device, 0, playmark_oki_command);
// logerror("PC$%03x Writing %02x to OKI1, PortC=%02x, Code=%02x\n",cpu_get_previouspc(space->cpu),playmark_oki_command,playmark_oki_control,playmark_snd_command);
okim6295_w(device, 0, state->oki_command);
}
}
@ -216,14 +222,14 @@ static READ8_HANDLER( PIC16C5X_T0_clk_r )
static ADDRESS_MAP_START( bigtwin_main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x0fffff) AM_ROM
AM_RANGE(0x304000, 0x304001) AM_NOP /* watchdog? irq ack? */
AM_RANGE(0x440000, 0x4403ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
AM_RANGE(0x500000, 0x500fff) AM_WRITE(wbeachvl_fgvideoram_w) AM_BASE(&wbeachvl_videoram2)
AM_RANGE(0x440000, 0x4403ff) AM_RAM AM_BASE_SIZE_MEMBER(playmark_state, spriteram, spriteram_size)
AM_RANGE(0x500000, 0x500fff) AM_WRITE(wbeachvl_fgvideoram_w) AM_BASE_MEMBER(playmark_state, videoram2)
AM_RANGE(0x501000, 0x501fff) AM_WRITENOP /* unused RAM? */
AM_RANGE(0x502000, 0x503fff) AM_WRITE(wbeachvl_txvideoram_w) AM_BASE(&wbeachvl_videoram1)
AM_RANGE(0x502000, 0x503fff) AM_WRITE(wbeachvl_txvideoram_w) AM_BASE_MEMBER(playmark_state, videoram1)
AM_RANGE(0x504000, 0x50ffff) AM_WRITENOP /* unused RAM? */
AM_RANGE(0x510000, 0x51000b) AM_WRITE(bigtwin_scroll_w)
AM_RANGE(0x51000c, 0x51000d) AM_WRITENOP /* always 3? */
AM_RANGE(0x600000, 0x67ffff) AM_RAM AM_BASE(&bigtwin_bgvideoram)
AM_RANGE(0x600000, 0x67ffff) AM_RAM AM_BASE_MEMBER(playmark_state, bgvideoram)
AM_RANGE(0x700010, 0x700011) AM_READ_PORT("SYSTEM")
AM_RANGE(0x700012, 0x700013) AM_READ_PORT("P1")
AM_RANGE(0x700014, 0x700015) AM_READ_PORT("P2")
@ -238,11 +244,11 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( wbeachvl_main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x07ffff) AM_ROM
AM_RANGE(0x440000, 0x440fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
AM_RANGE(0x500000, 0x501fff) AM_RAM_WRITE(wbeachvl_bgvideoram_w) AM_BASE(&wbeachvl_videoram3)
AM_RANGE(0x504000, 0x505fff) AM_RAM_WRITE(wbeachvl_fgvideoram_w) AM_BASE(&wbeachvl_videoram2)
AM_RANGE(0x508000, 0x509fff) AM_RAM_WRITE(wbeachvl_txvideoram_w) AM_BASE(&wbeachvl_videoram1)
AM_RANGE(0x50f000, 0x50ffff) AM_RAM AM_BASE(&wbeachvl_rowscroll)
AM_RANGE(0x440000, 0x440fff) AM_RAM AM_BASE_SIZE_MEMBER(playmark_state, spriteram, spriteram_size)
AM_RANGE(0x500000, 0x501fff) AM_RAM_WRITE(wbeachvl_bgvideoram_w) AM_BASE_MEMBER(playmark_state, videoram3)
AM_RANGE(0x504000, 0x505fff) AM_RAM_WRITE(wbeachvl_fgvideoram_w) AM_BASE_MEMBER(playmark_state, videoram2)
AM_RANGE(0x508000, 0x509fff) AM_RAM_WRITE(wbeachvl_txvideoram_w) AM_BASE_MEMBER(playmark_state, videoram1)
AM_RANGE(0x50f000, 0x50ffff) AM_RAM AM_BASE_MEMBER(playmark_state, rowscroll)
AM_RANGE(0x510000, 0x51000b) AM_WRITE(wbeachvl_scroll_w)
AM_RANGE(0x51000c, 0x51000d) AM_WRITENOP /* 2 and 3 */
// AM_RANGE(0x700000, 0x700001) ?? written on startup
@ -261,12 +267,12 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( excelsr_main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x2fffff) AM_ROM
AM_RANGE(0x304000, 0x304001) AM_WRITENOP /* watchdog? irq ack? */
AM_RANGE(0x440000, 0x440cff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
AM_RANGE(0x500000, 0x500fff) AM_RAM_WRITE(wbeachvl_fgvideoram_w) AM_BASE(&wbeachvl_videoram2)
AM_RANGE(0x501000, 0x501fff) AM_RAM_WRITE(wbeachvl_txvideoram_w) AM_BASE(&wbeachvl_videoram1)
AM_RANGE(0x440000, 0x440cff) AM_RAM AM_BASE_SIZE_MEMBER(playmark_state, spriteram, spriteram_size)
AM_RANGE(0x500000, 0x500fff) AM_RAM_WRITE(wbeachvl_fgvideoram_w) AM_BASE_MEMBER(playmark_state, videoram2)
AM_RANGE(0x501000, 0x501fff) AM_RAM_WRITE(wbeachvl_txvideoram_w) AM_BASE_MEMBER(playmark_state, videoram1)
AM_RANGE(0x510000, 0x51000b) AM_WRITE(excelsr_scroll_w)
AM_RANGE(0x51000c, 0x51000d) AM_WRITENOP /* 2 and 3 */
AM_RANGE(0x600000, 0x67ffff) AM_RAM AM_BASE(&bigtwin_bgvideoram)
AM_RANGE(0x600000, 0x67ffff) AM_RAM AM_BASE_MEMBER(playmark_state, bgvideoram)
AM_RANGE(0x700010, 0x700011) AM_READ_PORT("SYSTEM")
AM_RANGE(0x700012, 0x700013) AM_READ_PORT("P1")
AM_RANGE(0x700014, 0x700015) AM_READ_PORT("P2")
@ -280,11 +286,11 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( hotmind_main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x100000, 0x103fff) AM_RAM_WRITE(hrdtimes_bgvideoram_w) AM_BASE(&wbeachvl_videoram3)
AM_RANGE(0x104000, 0x107fff) AM_RAM_WRITE(hrdtimes_fgvideoram_w) AM_BASE(&wbeachvl_videoram2)
AM_RANGE(0x108000, 0x10ffff) AM_RAM_WRITE(hrdtimes_txvideoram_w) AM_BASE(&wbeachvl_videoram1)
AM_RANGE(0x100000, 0x103fff) AM_RAM_WRITE(hrdtimes_bgvideoram_w) AM_BASE_MEMBER(playmark_state, videoram3)
AM_RANGE(0x104000, 0x107fff) AM_RAM_WRITE(hrdtimes_fgvideoram_w) AM_BASE_MEMBER(playmark_state, videoram2)
AM_RANGE(0x108000, 0x10ffff) AM_RAM_WRITE(hrdtimes_txvideoram_w) AM_BASE_MEMBER(playmark_state, videoram1)
AM_RANGE(0x110000, 0x11000d) AM_WRITE(hrdtimes_scroll_w)
AM_RANGE(0x200000, 0x200fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
AM_RANGE(0x200000, 0x200fff) AM_RAM AM_BASE_SIZE_MEMBER(playmark_state, spriteram, spriteram_size)
AM_RANGE(0x280000, 0x2807ff) AM_RAM_WRITE(bigtwin_paletteram_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0x300010, 0x300011) AM_READ_PORT("SYSTEM")
AM_RANGE(0x300012, 0x300013) AM_READ_PORT("P1")
@ -300,11 +306,11 @@ static ADDRESS_MAP_START( hrdtimes_main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x07ffff) AM_ROM
AM_RANGE(0x080000, 0x0bffff) AM_RAM
AM_RANGE(0x0c0000, 0x0fffff) AM_ROM AM_REGION("maincpu", 0x0c0000)
AM_RANGE(0x100000, 0x103fff) AM_RAM_WRITE(hrdtimes_bgvideoram_w) AM_BASE(&wbeachvl_videoram3)
AM_RANGE(0x104000, 0x107fff) AM_RAM_WRITE(hrdtimes_fgvideoram_w) AM_BASE(&wbeachvl_videoram2)
AM_RANGE(0x108000, 0x10ffff) AM_RAM_WRITE(hrdtimes_txvideoram_w) AM_BASE(&wbeachvl_videoram1)
AM_RANGE(0x100000, 0x103fff) AM_RAM_WRITE(hrdtimes_bgvideoram_w) AM_BASE_MEMBER(playmark_state, videoram3)
AM_RANGE(0x104000, 0x107fff) AM_RAM_WRITE(hrdtimes_fgvideoram_w) AM_BASE_MEMBER(playmark_state, videoram2)
AM_RANGE(0x108000, 0x10ffff) AM_RAM_WRITE(hrdtimes_txvideoram_w) AM_BASE_MEMBER(playmark_state, videoram1)
AM_RANGE(0x110000, 0x11000d) AM_WRITE(hrdtimes_scroll_w)
AM_RANGE(0x200000, 0x200fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
AM_RANGE(0x200000, 0x200fff) AM_RAM AM_BASE_SIZE_MEMBER(playmark_state, spriteram, spriteram_size)
AM_RANGE(0x280000, 0x2807ff) AM_RAM_WRITE(bigtwin_paletteram_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0x280800, 0x280fff) AM_RAM // unused
AM_RANGE(0x300010, 0x300011) AM_READ_PORT("SYSTEM")
@ -894,13 +900,56 @@ static const gfx_layout hrdtimes_charlayout =
static GFXDECODE_START( hrdtimes )
GFXDECODE_ENTRY( "gfx2", 0, hrdtimes_tilelayout, 0x200, 32 ) /* colors 0x200-0x2ff */
GFXDECODE_ENTRY( "gfx1", 0, hrdtimes_tilelayout, 0x000, 16 ) /* colors 0x000-0x0ff */
GFXDECODE_ENTRY( "gfx2", 0, hrdtimes_tilelayout, 0x200, 32 ) /* colors 0x200-0x2ff */
GFXDECODE_ENTRY( "gfx1", 0, hrdtimes_tilelayout, 0x000, 16 ) /* colors 0x000-0x0ff */
GFXDECODE_ENTRY( "gfx1", 0, hrdtimes_charlayout, 0x100, 8 ) /* colors 0x100-0x17f */
GFXDECODE_END
static MACHINE_START( playmark )
{
playmark_state *state = (playmark_state *)machine->driver_data;
state->oki = devtag_get_device(machine, "oki");
state->eeprom = devtag_get_device(machine, "eeprom");
state_save_register_global(machine, state->bgscrollx);
state_save_register_global(machine, state->bgscrolly);
state_save_register_global(machine, state->bg_enable);
state_save_register_global(machine, state->bg_full_size);
state_save_register_global(machine, state->fgscrollx);
state_save_register_global(machine, state->fg_rowscroll_enable);
state_save_register_global_array(machine, state->scroll);
state_save_register_global(machine, state->snd_command);
state_save_register_global(machine, state->snd_flag);
state_save_register_global(machine, state->oki_control);
state_save_register_global(machine, state->oki_command);
state_save_register_global(machine, state->old_oki_bank);
}
static MACHINE_RESET( playmark )
{
playmark_state *state = (playmark_state *)machine->driver_data;
state->bgscrollx = 0;
state->bgscrolly = 0;
state->bg_enable = 0;
state->bg_full_size = 0;
state->fgscrollx = 0;
state->fg_rowscroll_enable = 0;
memset(state->scroll, 0, ARRAY_LENGTH(state->scroll));
state->snd_command = 0;
state->oki_control = 0;
state->oki_command = 0;
state->old_oki_bank = 0;
}
static MACHINE_DRIVER_START( bigtwin )
/* driver data */
MDRV_DRIVER_DATA(playmark_state)
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, 12000000) /* 12 MHz */
MDRV_CPU_PROGRAM_MAP(bigtwin_main_map)
@ -910,6 +959,9 @@ static MACHINE_DRIVER_START( bigtwin )
/* Program and Data Maps are internal to the MCU */
MDRV_CPU_IO_MAP(playmark_sound_io_map)
MDRV_MACHINE_START(playmark)
MDRV_MACHINE_RESET(playmark)
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(58)
@ -935,6 +987,9 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( wbeachvl )
/* driver data */
MDRV_DRIVER_DATA(playmark_state)
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, 12000000) /* 12 MHz */
MDRV_CPU_PROGRAM_MAP(wbeachvl_main_map)
@ -947,6 +1002,9 @@ static MACHINE_DRIVER_START( wbeachvl )
MDRV_EEPROM_ADD("eeprom", eeprom_intf)
MDRV_EEPROM_DEFAULT_VALUE(0)
MDRV_MACHINE_START(playmark)
MDRV_MACHINE_RESET(playmark)
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(58)
@ -971,6 +1029,9 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( excelsr )
/* driver data */
MDRV_DRIVER_DATA(playmark_state)
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, 12000000) /* 12 MHz */
MDRV_CPU_PROGRAM_MAP(excelsr_main_map)
@ -980,6 +1041,9 @@ static MACHINE_DRIVER_START( excelsr )
/* Program and Data Maps are internal to the MCU */
MDRV_CPU_IO_MAP(playmark_sound_io_map)
MDRV_MACHINE_START(playmark)
MDRV_MACHINE_RESET(playmark)
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(58)
@ -1004,6 +1068,9 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( hotmind )
/* driver data */
MDRV_DRIVER_DATA(playmark_state)
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, XTAL_24MHz/2) /* verified on pcb */
MDRV_CPU_PROGRAM_MAP(hotmind_main_map)
@ -1016,6 +1083,9 @@ static MACHINE_DRIVER_START( hotmind )
MDRV_EEPROM_ADD("eeprom", eeprom_intf)
MDRV_EEPROM_DEFAULT_VALUE(0)
MDRV_MACHINE_START(playmark)
MDRV_MACHINE_RESET(playmark)
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(58)
@ -1040,6 +1110,9 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( hrdtimes )
/* driver data */
MDRV_DRIVER_DATA(playmark_state)
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, XTAL_24MHz/2) /* verified on pcb */
MDRV_CPU_PROGRAM_MAP(hrdtimes_main_map)
@ -1049,6 +1122,9 @@ static MACHINE_DRIVER_START( hrdtimes )
/* Program and Data Maps are internal to the MCU */
// MDRV_CPU_IO_MAP(playmark_sound_io_map)
MDRV_MACHINE_START(playmark)
MDRV_MACHINE_RESET(playmark)
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(58)
@ -1391,15 +1467,15 @@ static UINT8 playmark_asciitohex(UINT8 data)
static DRIVER_INIT( bigtwin )
{
playmark_state *state = (playmark_state *)machine->driver_data;
UINT8 *playmark_PICROM_HEX = memory_region(machine, "user1");
UINT16 *playmark_PICROM = (UINT16 *)memory_region(machine, "audiocpu");
INT32 offs, data;
UINT16 src_pos = 0;
UINT16 dst_pos = 0;
UINT8 data_hi, data_lo;
INT32 offs, data;
UINT16 src_pos = 0;
UINT16 dst_pos = 0;
UINT8 data_hi, data_lo;
playmark_snd_flag = 0;
state->snd_flag = 0;
/**** Convert the PIC16C57 ASCII HEX dumps to pure HEX ****/
do
@ -1414,12 +1490,14 @@ static DRIVER_INIT( bigtwin )
{
data_hi = playmark_asciitohex((playmark_PICROM_HEX[src_pos + offs + 0]));
data_lo = playmark_asciitohex((playmark_PICROM_HEX[src_pos + offs + 1]));
if ((data_hi <= 0x0f) && (data_lo <= 0x0f)) {
data = (data_hi << 4) | (data_lo << 0);
if ((data_hi <= 0x0f) && (data_lo <= 0x0f))
{
data = (data_hi << 4) | (data_lo << 0);
data_hi = playmark_asciitohex((playmark_PICROM_HEX[src_pos + offs + 2]));
data_lo = playmark_asciitohex((playmark_PICROM_HEX[src_pos + offs + 3]));
if ((data_hi <= 0x0f) && (data_lo <= 0x0f)) {
if ((data_hi <= 0x0f) && (data_lo <= 0x0f))
{
data |= (data_hi << 12) | (data_lo << 8);
playmark_PICROM[dst_pos] = data;
dst_pos += 1;
@ -1440,7 +1518,7 @@ static DRIVER_INIT( bigtwin )
data_hi = playmark_asciitohex((playmark_PICROM_HEX[src_pos + 0]));
data_lo = playmark_asciitohex((playmark_PICROM_HEX[src_pos + 1]));
data = (data_hi << 4) | (data_lo << 0);
data = (data_hi << 4) | (data_lo << 0);
data_hi = playmark_asciitohex((playmark_PICROM_HEX[src_pos + 2]));
data_lo = playmark_asciitohex((playmark_PICROM_HEX[src_pos + 3]));
data |= (data_hi << 12) | (data_lo << 8);
@ -1453,10 +1531,10 @@ static DRIVER_INIT( bigtwin )
} while (src_pos < 0x2d4c); /* 0x2d4c is the size of the HEX rom loaded */
}
GAME( 1995, bigtwin, 0, bigtwin, bigtwin, bigtwin, ROT0, "Playmark", "Big Twin", GAME_NO_COCKTAIL )
GAME( 1995, wbeachvl, 0, wbeachvl, wbeachvl, 0, ROT0, "Playmark", "World Beach Volley (set 1)", GAME_NO_COCKTAIL | GAME_NO_SOUND )
GAME( 1995, wbeachvl2,wbeachvl, wbeachvl, wbeachvl, 0, ROT0, "Playmark", "World Beach Volley (set 2)", GAME_NO_COCKTAIL | GAME_NO_SOUND )
GAME( 1996, excelsr, 0, excelsr, excelsr, bigtwin, ROT0, "Playmark", "Excelsior", 0 )
GAME( 1995, hotmind, 0, hotmind, hotmind, bigtwin, ROT0, "Playmark", "Hot Mind", 0 )
GAME( 1994, hrdtimes, 0, hrdtimes, hrdtimes, 0, ROT0, "Playmark", "Hard Times (set 1)", GAME_NO_SOUND )
GAME( 1994, hrdtimesa,hrdtimes, hrdtimes, hrdtimes, 0, ROT0, "Playmark", "Hard Times (set 2)", GAME_NO_SOUND )
GAME( 1995, bigtwin, 0, bigtwin, bigtwin, bigtwin, ROT0, "Playmark", "Big Twin", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE )
GAME( 1995, wbeachvl, 0, wbeachvl, wbeachvl, 0, ROT0, "Playmark", "World Beach Volley (set 1)", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1995, wbeachvl2, wbeachvl, wbeachvl, wbeachvl, 0, ROT0, "Playmark", "World Beach Volley (set 2)", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1996, excelsr, 0, excelsr, excelsr, bigtwin, ROT0, "Playmark", "Excelsior", GAME_SUPPORTS_SAVE )
GAME( 1995, hotmind, 0, hotmind, hotmind, bigtwin, ROT0, "Playmark", "Hot Mind", GAME_SUPPORTS_SAVE )
GAME( 1994, hrdtimes, 0, hrdtimes, hrdtimes, 0, ROT0, "Playmark", "Hard Times (set 1)", GAME_NO_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1994, hrdtimesa, hrdtimes, hrdtimes, hrdtimes, 0, ROT0, "Playmark", "Hard Times (set 2)", GAME_NO_SOUND | GAME_SUPPORTS_SAVE )

View File

@ -19,14 +19,6 @@ Magic Sticks:
#include "sound/okim6295.h"
#include "includes/playmark.h"
static tilemap_t *bg_tilemap;
static UINT16 *magicstk_videoram;
static int magicstk_tilebank;
static int bg_yoffset;
static int xoffset;
static int yoffset;
static const eeprom_interface eeprom_intf =
{
6, /* address bits */
@ -44,7 +36,7 @@ static WRITE16_DEVICE_HANDLER( magicstk_coin_eeprom_w )
{
if (ACCESSING_BITS_0_7)
{
coin_counter_w(device->machine, 0,data & 0x20);
coin_counter_w(device->machine, 0, data & 0x20);
eeprom_set_cs_line(device, (data & 8) ? CLEAR_LINE : ASSERT_LINE);
eeprom_write_bit(device, data & 2);
@ -54,26 +46,30 @@ static WRITE16_DEVICE_HANDLER( magicstk_coin_eeprom_w )
static WRITE16_HANDLER( magicstk_bgvideoram_w )
{
COMBINE_DATA(&magicstk_videoram[offset]);
tilemap_mark_tile_dirty(bg_tilemap,offset);
playmark_state *state = (playmark_state *)space->machine->driver_data;
COMBINE_DATA(&state->videoram1[offset]);
tilemap_mark_tile_dirty(state->bg_tilemap, offset);
}
static WRITE16_HANDLER( tile_banking_w )
{
if(((data >> 12) & 0x0f) != magicstk_tilebank)
playmark_state *state = (playmark_state *)space->machine->driver_data;
if (((data >> 12) & 0x0f) != state->tilebank)
{
magicstk_tilebank = (data >> 12) & 0x0f;
tilemap_mark_all_tiles_dirty(bg_tilemap);
state->tilebank = (data >> 12) & 0x0f;
tilemap_mark_all_tiles_dirty(state->bg_tilemap);
}
}
static WRITE16_DEVICE_HANDLER( oki_banking )
{
if(data & 3)
if (data & 3)
{
int addr = 0x40000 * ((data & 3) - 1);
if(addr < memory_region_length(device->machine, "oki"))
if (addr < memory_region_length(device->machine, "oki"))
okim6295_set_bank_base(device, addr);
}
}
@ -84,7 +80,7 @@ static ADDRESS_MAP_START( magicstk_main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x094000, 0x094001) AM_WRITENOP
AM_RANGE(0x094002, 0x094003) AM_WRITENOP
AM_RANGE(0x094004, 0x094005) AM_WRITE(tile_banking_w)
AM_RANGE(0x098180, 0x09917f) AM_RAM_WRITE(magicstk_bgvideoram_w) AM_BASE(&magicstk_videoram)
AM_RANGE(0x098180, 0x09917f) AM_RAM_WRITE(magicstk_bgvideoram_w) AM_BASE_MEMBER(playmark_state, videoram1)
AM_RANGE(0x0c2010, 0x0c2011) AM_READ_PORT("IN0")
AM_RANGE(0x0c2012, 0x0c2013) AM_READ_PORT("IN1")
AM_RANGE(0x0c2014, 0x0c2015) AM_READ_PORT("IN2") AM_DEVWRITE("eeprom", magicstk_coin_eeprom_w)
@ -94,7 +90,7 @@ static ADDRESS_MAP_START( magicstk_main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x0c201e, 0x0c201f) AM_DEVREADWRITE8("oki", okim6295_r, okim6295_w, 0x00ff)
AM_RANGE(0x0c4000, 0x0c4001) AM_WRITENOP
AM_RANGE(0x0e0000, 0x0fffff) AM_RAM
AM_RANGE(0x100000, 0x100fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
AM_RANGE(0x100000, 0x100fff) AM_RAM AM_BASE_SIZE_MEMBER(playmark_state, spriteram, spriteram_size)
ADDRESS_MAP_END
static ADDRESS_MAP_START( powerbal_main_map, ADDRESS_SPACE_PROGRAM, 16 )
@ -103,7 +99,7 @@ static ADDRESS_MAP_START( powerbal_main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x094000, 0x094001) AM_WRITENOP
AM_RANGE(0x094002, 0x094003) AM_WRITENOP
AM_RANGE(0x094004, 0x094005) AM_WRITE(tile_banking_w)
AM_RANGE(0x098000, 0x098fff) AM_RAM_WRITE(magicstk_bgvideoram_w) AM_BASE(&magicstk_videoram)
AM_RANGE(0x098000, 0x098fff) AM_RAM_WRITE(magicstk_bgvideoram_w) AM_BASE_MEMBER(playmark_state, videoram1)
AM_RANGE(0x099000, 0x09bfff) AM_RAM // not used
AM_RANGE(0x0c2010, 0x0c2011) AM_READ_PORT("IN0")
AM_RANGE(0x0c2012, 0x0c2013) AM_READ_PORT("IN1")
@ -114,7 +110,7 @@ static ADDRESS_MAP_START( powerbal_main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x0c201e, 0x0c201f) AM_DEVREADWRITE8("oki", okim6295_r, okim6295_w, 0x00ff)
AM_RANGE(0x0c4000, 0x0c4001) AM_WRITENOP
AM_RANGE(0x0f0000, 0x0fffff) AM_RAM
AM_RANGE(0x101000, 0x101fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
AM_RANGE(0x101000, 0x101fff) AM_RAM AM_BASE_SIZE_MEMBER(playmark_state, spriteram, spriteram_size)
AM_RANGE(0x102000, 0x10200d) AM_WRITENOP // not used scroll regs?
AM_RANGE(0x103000, 0x103fff) AM_RAM
ADDRESS_MAP_END
@ -381,54 +377,62 @@ INPUT_PORTS_END
static TILE_GET_INFO( powerbal_get_bg_tile_info )
{
int code = (magicstk_videoram[tile_index] & 0x07ff) + magicstk_tilebank * 0x800;
int colr = magicstk_videoram[tile_index] & 0xf000;
playmark_state *state = (playmark_state *)machine->driver_data;
int code = (state->videoram1[tile_index] & 0x07ff) + state->tilebank * 0x800;
int colr = state->videoram1[tile_index] & 0xf000;
if (magicstk_videoram[tile_index] & 0x800) code |= 0x8000;
if (state->videoram1[tile_index] & 0x800)
code |= 0x8000;
SET_TILE_INFO(1,code,colr >> 12,0);
SET_TILE_INFO(1, code, colr >> 12, 0);
}
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 )
{
UINT16 *spriteram16 = machine->generic.spriteram.u16;
playmark_state *state = (playmark_state *)machine->driver_data;
UINT16 *spriteram = state->spriteram;
int offs;
int height = machine->gfx[0]->height;
for (offs = 4;offs < machine->generic.spriteram_size/2;offs += 4)
for (offs = 4; offs < state->spriteram_size / 2; offs += 4)
{
int sx,sy,code,color,flipx;
int sx, sy, code, color, flipx;
sy = spriteram16[offs+3-4]; /* typical Playmark style... */
if (sy & 0x8000) return; /* end of list marker */
sy = spriteram[offs + 3 - 4]; /* typical Playmark style... */
if (sy & 0x8000)
return; /* end of list marker */
flipx = sy & 0x4000;
sx = (spriteram16[offs+1] & 0x01ff) - 16-7;
sy = (256-8-height - sy) & 0xff;
code = spriteram16[offs+2];
color = (spriteram16[offs+1] & 0xf000) >> 12;
sx = (spriteram[offs + 1] & 0x01ff) - 16 - 7;
sy = (256 - 8 - height - sy) & 0xff;
code = spriteram[offs + 2];
color = (spriteram[offs + 1] & 0xf000) >> 12;
drawgfx_transpen(bitmap,cliprect,machine->gfx[0],
code,
color,
flipx,0,
sx + xoffset,sy + yoffset,0);
sx + state->xoffset,sy + state->yoffset,0);
}
}
static VIDEO_START( powerbal )
{
bg_tilemap = tilemap_create(machine, powerbal_get_bg_tile_info,tilemap_scan_rows,8, 8,64,32);
playmark_state *state = (playmark_state *)machine->driver_data;
xoffset = -20;
state->bg_tilemap = tilemap_create(machine, powerbal_get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32);
tilemap_set_scrolly(bg_tilemap, 0, bg_yoffset);
state->xoffset = -20;
tilemap_set_scrolly(state->bg_tilemap, 0, state->bg_yoffset);
}
static VIDEO_UPDATE( powerbal )
{
tilemap_draw(bitmap,cliprect,bg_tilemap,0,0);
draw_sprites(screen->machine,bitmap,cliprect);
playmark_state *state = (playmark_state *)screen->machine->driver_data;
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
draw_sprites(screen->machine, bitmap, cliprect);
return 0;
}
@ -463,12 +467,35 @@ static GFXDECODE_START( powerbal )
GFXDECODE_ENTRY( "gfx1", 0, magicstk_charlayout, 0x000, 16 ) /* colors 0x000-0x0ff */
GFXDECODE_END
static MACHINE_START( powerbal )
{
playmark_state *state = (playmark_state *)machine->driver_data;
state_save_register_global(machine, state->tilebank);
}
static MACHINE_RESET( powerbal )
{
playmark_state *state = (playmark_state *)machine->driver_data;
state->tilebank = 0;
}
static MACHINE_DRIVER_START( powerbal )
/* driver data */
MDRV_DRIVER_DATA(playmark_state)
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, 12000000) /* 12 MHz */
MDRV_CPU_PROGRAM_MAP(powerbal_main_map)
MDRV_CPU_VBLANK_INT("screen", irq2_line_hold)
MDRV_MACHINE_START(powerbal)
MDRV_MACHINE_RESET(powerbal)
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(61)
@ -492,6 +519,10 @@ static MACHINE_DRIVER_START( powerbal )
MACHINE_DRIVER_END
static MACHINE_DRIVER_START( magicstk )
/* driver data */
MDRV_DRIVER_DATA(playmark_state)
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, 12000000) /* 12 MHz */
MDRV_CPU_PROGRAM_MAP(magicstk_main_map)
@ -500,6 +531,9 @@ static MACHINE_DRIVER_START( magicstk )
MDRV_EEPROM_ADD("eeprom", eeprom_intf)
MDRV_EEPROM_DEFAULT_VALUE(0)
MDRV_MACHINE_START(powerbal)
MDRV_MACHINE_RESET(powerbal)
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(61)
@ -656,14 +690,18 @@ ROM_END
static DRIVER_INIT( powerbal )
{
bg_yoffset = 16;
yoffset = -8;
playmark_state *state = (playmark_state *)machine->driver_data;
state->bg_yoffset = 16;
state->yoffset = -8;
}
static DRIVER_INIT( magicstk )
{
bg_yoffset = 0;
yoffset = -5;
playmark_state *state = (playmark_state *)machine->driver_data;
state->bg_yoffset = 0;
state->yoffset = -5;
}
/*************************
@ -671,6 +709,6 @@ static DRIVER_INIT( magicstk )
*************************/
/* YEAR NAME PARENT MACHINE INPUT INIT ROT COMPANY FULLNAME FLAGS */
GAME( 1994, powerbal, 0, powerbal, powerbal, powerbal, ROT0, "Playmark", "Power Balls", 0 )
GAME( 1995, magicstk, 0, magicstk, magicstk, magicstk, ROT0, "Playmark", "Magic Sticks", 0 )
GAME( 1995, hotminda, hotmind, magicstk, hotminda, magicstk, ROT0, "Playmark", "Hot Mind (adjustable prize)", 0 )
GAME( 1994, powerbal, 0, powerbal, powerbal, powerbal, ROT0, "Playmark", "Power Balls", GAME_SUPPORTS_SAVE )
GAME( 1995, magicstk, 0, magicstk, magicstk, magicstk, ROT0, "Playmark", "Magic Sticks", GAME_SUPPORTS_SAVE )
GAME( 1995, hotminda, hotmind, magicstk, hotminda, magicstk, ROT0, "Playmark", "Hot Mind (adjustable prize)", GAME_SUPPORTS_SAVE )

View File

@ -28,18 +28,9 @@
#include "cpu/m68000/m68000.h"
#include "cpu/z80/z80.h"
#include "cpu/m6805/m6805.h"
#include "includes/pushman.h"
#include "sound/2203intf.h"
VIDEO_UPDATE( pushman );
WRITE16_HANDLER( pushman_scroll_w );
WRITE16_HANDLER( pushman_videoram_w );
VIDEO_START( pushman );
static UINT8 shared_ram[8];
static UINT16 latch,new_latch=0;
/******************************************************************************/
static WRITE16_HANDLER( pushman_flipscreen_w )
{
if (ACCESSING_BITS_8_15)
@ -58,68 +49,81 @@ static WRITE16_HANDLER( pushman_control_w )
static READ16_HANDLER( pushman_68705_r )
{
pushman_state *state = (pushman_state *)space->machine->driver_data;
if (offset == 0)
return latch;
return state->latch;
if (offset == 3 && new_latch) { new_latch = 0; return 0; }
if (offset == 3 && !new_latch) return 0xff;
if (offset == 3 && state->new_latch)
{
state->new_latch = 0;
return 0;
}
if (offset == 3 && !state->new_latch)
return 0xff;
return (shared_ram[2 * offset + 1] << 8) + shared_ram[2 * offset];
return (state->shared_ram[2 * offset + 1] << 8) + state->shared_ram[2 * offset];
}
static WRITE16_HANDLER( pushman_68705_w )
{
pushman_state *state = (pushman_state *)space->machine->driver_data;
if (ACCESSING_BITS_8_15)
shared_ram[2 * offset] = data >> 8;
state->shared_ram[2 * offset] = data >> 8;
if (ACCESSING_BITS_0_7)
shared_ram[2 * offset + 1] = data & 0xff;
state->shared_ram[2 * offset + 1] = data & 0xff;
if (offset == 1)
{
cputag_set_input_line(space->machine, "mcu", M68705_IRQ_LINE, HOLD_LINE);
cpu_set_input_line(state->mcu, M68705_IRQ_LINE, HOLD_LINE);
cpu_spin(space->cpu);
new_latch = 0;
state->new_latch = 0;
}
}
/* ElSemi - Bouncing balls protection. */
static READ16_HANDLER( bballs_68705_r )
{
pushman_state *state = (pushman_state *)space->machine->driver_data;
if (offset == 0)
return latch;
if(offset == 3 && new_latch)
return state->latch;
if (offset == 3 && state->new_latch)
{
new_latch = 0;
state->new_latch = 0;
return 0;
}
if(offset == 3 && !new_latch)
if (offset == 3 && !state->new_latch)
return 0xff;
return (shared_ram[2 * offset + 1] << 8) + shared_ram[2 * offset];
return (state->shared_ram[2 * offset + 1] << 8) + state->shared_ram[2 * offset];
}
static WRITE16_HANDLER( bballs_68705_w )
{
if (ACCESSING_BITS_8_15)
shared_ram[2 * offset] = data >> 8;
if (ACCESSING_BITS_0_7)
shared_ram[2 * offset + 1] = data & 0xff;
pushman_state *state = (pushman_state *)space->machine->driver_data;
if(offset == 0)
if (ACCESSING_BITS_8_15)
state->shared_ram[2 * offset] = data >> 8;
if (ACCESSING_BITS_0_7)
state->shared_ram[2 * offset + 1] = data & 0xff;
if (offset == 0)
{
latch = 0;
if(shared_ram[0] <= 0xf)
state->latch = 0;
if (state->shared_ram[0] <= 0xf)
{
latch = shared_ram[0] << 2;
if(shared_ram[1])
latch |= 2;
new_latch = 1;
state->latch = state->shared_ram[0] << 2;
if (state->shared_ram[1])
state->latch |= 2;
state->new_latch = 1;
}
else if(shared_ram[0])
else if (state->shared_ram[0])
{
if(shared_ram[1])
latch |= 2;
new_latch = 1;
if (state->shared_ram[1])
state->latch |= 2;
state->new_latch = 1;
}
}
}
@ -127,42 +131,40 @@ static WRITE16_HANDLER( bballs_68705_w )
static READ8_HANDLER( pushman_68000_r )
{
return shared_ram[offset];
pushman_state *state = (pushman_state *)space->machine->driver_data;
return state->shared_ram[offset];
}
static WRITE8_HANDLER( pushman_68000_w )
{
if (offset == 2 && (shared_ram[2] & 2) == 0 && data & 2)
{
latch = (shared_ram[1] << 8) | shared_ram[0];
new_latch = 1;
}
shared_ram[offset] = data;
}
pushman_state *state = (pushman_state *)space->machine->driver_data;
static MACHINE_RESET( bballs )
{
latch = 0x400;
if (offset == 2 && (state->shared_ram[2] & 2) == 0 && data & 2)
{
state->latch = (state->shared_ram[1] << 8) | state->shared_ram[0];
state->new_latch = 1;
}
state->shared_ram[offset] = data;
}
/******************************************************************************/
static ADDRESS_MAP_START( pushman_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x01ffff) AM_ROM
AM_RANGE(0x060000, 0x060007) AM_READWRITE(pushman_68705_r,pushman_68705_w)
AM_RANGE(0xfe0800, 0xfe17ff) AM_RAM AM_BASE_GENERIC(spriteram)
AM_RANGE(0x060000, 0x060007) AM_READWRITE(pushman_68705_r, pushman_68705_w)
AM_RANGE(0xfe0800, 0xfe17ff) AM_RAM AM_BASE_MEMBER(pushman_state, spriteram)
AM_RANGE(0xfe4000, 0xfe4001) AM_READ_PORT("INPUTS") AM_WRITE(pushman_flipscreen_w)
AM_RANGE(0xfe4002, 0xfe4003) AM_READ_PORT("SYSTEM") AM_WRITE(pushman_control_w)
AM_RANGE(0xfe4004, 0xfe4005) AM_READ_PORT("DSW")
AM_RANGE(0xfe8000, 0xfe8003) AM_WRITE(pushman_scroll_w)
AM_RANGE(0xfe800e, 0xfe800f) AM_WRITENOP /* ? */
AM_RANGE(0xfec000, 0xfec7ff) AM_RAM_WRITE(pushman_videoram_w) AM_BASE_GENERIC(videoram)
AM_RANGE(0xfec000, 0xfec7ff) AM_RAM_WRITE(pushman_videoram_w) AM_BASE_MEMBER(pushman_state, videoram)
AM_RANGE(0xff8000, 0xff87ff) AM_RAM_WRITE(paletteram16_xxxxRRRRGGGGBBBB_word_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0xffc000, 0xffffff) AM_RAM
ADDRESS_MAP_END
static ADDRESS_MAP_START( mcu_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x0007) AM_READWRITE(pushman_68000_r,pushman_68000_w)
AM_RANGE(0x0000, 0x0007) AM_READWRITE(pushman_68000_r, pushman_68000_w)
AM_RANGE(0x0010, 0x007f) AM_RAM
AM_RANGE(0x0080, 0x0fff) AM_ROM
ADDRESS_MAP_END
@ -182,14 +184,14 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( bballs_map, ADDRESS_SPACE_PROGRAM, 16 )
ADDRESS_MAP_GLOBAL_MASK(0xfffff)
AM_RANGE(0x00000, 0x1ffff) AM_ROM
AM_RANGE(0x60000, 0x60007) AM_READWRITE(bballs_68705_r,bballs_68705_w)
AM_RANGE(0xe0800, 0xe17ff) AM_RAM AM_BASE_GENERIC(spriteram)
AM_RANGE(0x60000, 0x60007) AM_READWRITE(bballs_68705_r, bballs_68705_w)
AM_RANGE(0xe0800, 0xe17ff) AM_RAM AM_BASE_MEMBER(pushman_state, spriteram)
AM_RANGE(0xe4000, 0xe4001) AM_READ_PORT("INPUTS") AM_WRITE(pushman_flipscreen_w)
AM_RANGE(0xe4002, 0xe4003) AM_READ_PORT("SYSTEM") AM_WRITE(pushman_control_w)
AM_RANGE(0xe4004, 0xe4005) AM_READ_PORT("DSW")
AM_RANGE(0xe8000, 0xe8003) AM_WRITE(pushman_scroll_w)
AM_RANGE(0xe800e, 0xe800f) AM_WRITENOP /* ? */
AM_RANGE(0xec000, 0xec7ff) AM_RAM_WRITE(pushman_videoram_w) AM_BASE_GENERIC(videoram)
AM_RANGE(0xec000, 0xec7ff) AM_RAM_WRITE(pushman_videoram_w) AM_BASE_MEMBER(pushman_state, videoram)
AM_RANGE(0xf8000, 0xf87ff) AM_RAM_WRITE(paletteram16_xxxxRRRRGGGGBBBB_word_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0xfc000, 0xfffff) AM_RAM
ADDRESS_MAP_END
@ -401,22 +403,52 @@ GFXDECODE_END
static void irqhandler(running_device *device, int irq)
{
cputag_set_input_line(device->machine, "audiocpu", 0, irq ? ASSERT_LINE : CLEAR_LINE);
pushman_state *state = (pushman_state *)device->machine->driver_data;
cpu_set_input_line(state->audiocpu, 0, irq ? ASSERT_LINE : CLEAR_LINE);
}
static const ym2203_interface ym2203_config =
{
{
AY8910_LEGACY_OUTPUT,
AY8910_DEFAULT_LOADS,
DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL,
AY8910_LEGACY_OUTPUT,
AY8910_DEFAULT_LOADS,
DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL,
},
irqhandler
};
static MACHINE_START( pushman )
{
pushman_state *state = (pushman_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_array(machine, state->control);
state_save_register_global_array(machine, state->shared_ram);
state_save_register_global(machine, state->latch);
state_save_register_global(machine, state->new_latch);
}
static MACHINE_RESET( pushman )
{
pushman_state *state = (pushman_state *)machine->driver_data;
state->latch = 0;
state->new_latch = 0;
state->control[0] = 0;
state->control[1] = 0;
memset(state->shared_ram, 0, ARRAY_LENGTH(state->shared_ram));
}
static MACHINE_DRIVER_START( pushman )
/* driver data */
MDRV_DRIVER_DATA(pushman_state)
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, 8000000)
MDRV_CPU_PROGRAM_MAP(pushman_map)
@ -432,6 +464,9 @@ static MACHINE_DRIVER_START( pushman )
MDRV_QUANTUM_TIME(HZ(3600))
MDRV_MACHINE_START(pushman)
MDRV_MACHINE_RESET(pushman)
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60)
@ -457,8 +492,20 @@ static MACHINE_DRIVER_START( pushman )
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
MACHINE_DRIVER_END
static MACHINE_RESET( bballs )
{
pushman_state *state = (pushman_state *)machine->driver_data;
MACHINE_RESET_CALL(pushman);
state->latch = 0x400;
}
static MACHINE_DRIVER_START( bballs )
/* driver data */
MDRV_DRIVER_DATA(pushman_state)
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, 8000000)
MDRV_CPU_PROGRAM_MAP(bballs_map)
@ -470,6 +517,7 @@ static MACHINE_DRIVER_START( bballs )
MDRV_QUANTUM_TIME(HZ(3600))
MDRV_MACHINE_START(pushman)
MDRV_MACHINE_RESET(bballs)
/* video hardware */
@ -665,8 +713,8 @@ ROM_START( bballs )
ROM_LOAD( "bb_prom.e9", 0x0000, 0x0100, CRC(ec80ae36) SHA1(397ec8fc1b106c8b8d4bf6798aa429e8768a101a) ) /* priority (not used) N82S129 BPROM */
ROM_END
GAME( 1990, pushman, 0, pushman, pushman, 0, ROT0, "Comad", "Pushman (Korea, set 1)", 0 )
GAME( 1990, pushmana, pushman, pushman, pushman, 0, ROT0, "Comad", "Pushman (Korea, set 2)", 0 )
GAME( 1990, pushmans, pushman, pushman, pushman, 0, ROT0, "Comad (American Sammy license)", "Pushman (American Sammy license)", 0 )
GAME( 1990, pushmant, pushman, pushman, pushman, 0, ROT0, "Comad (Top Tronic license)", "Pushman (Top Tronic license)", 0 )
GAME( 1991, bballs, 0, bballs, bballs, 0, ROT0, "Comad", "Bouncing Balls", 0 )
GAME( 1990, pushman, 0, pushman, pushman, 0, ROT0, "Comad", "Pushman (Korea, set 1)", GAME_SUPPORTS_SAVE )
GAME( 1990, pushmana, pushman, pushman, pushman, 0, ROT0, "Comad", "Pushman (Korea, set 2)", GAME_SUPPORTS_SAVE )
GAME( 1990, pushmans, pushman, pushman, pushman, 0, ROT0, "Comad (American Sammy license)", "Pushman (American Sammy license)", GAME_SUPPORTS_SAVE )
GAME( 1990, pushmant, pushman, pushman, pushman, 0, ROT0, "Comad (Top Tronic license)", "Pushman (Top Tronic license)", GAME_SUPPORTS_SAVE )
GAME( 1991, bballs, 0, bballs, bballs, 0, ROT0, "Comad", "Bouncing Balls", GAME_SUPPORTS_SAVE )

View File

@ -19,117 +19,138 @@
#include "sound/okim6295.h"
#include "machine/eeprom.h"
static UINT16 *bg_videoram, *mid_videoram, *txt_videoram, *tilemap_regs, *video_regs;
static tilemap_t *mid_tilemap, *txt_tilemap;
static int ticket = 0;
class pzletime_state
{
public:
static void *alloc(running_machine &machine) { return auto_alloc_clear(&machine, pzletime_state(machine)); }
pzletime_state(running_machine &machine) { }
/* memory pointers */
UINT16 * bg_videoram;
UINT16 * mid_videoram;
UINT16 * txt_videoram;
UINT16 * tilemap_regs;
UINT16 * video_regs;
UINT16 * spriteram;
// UINT16 * paletteram; // currently this uses generic palette handling
/* video-related */
tilemap_t *mid_tilemap, *txt_tilemap;
/* misc */
int ticket;
};
static TILE_GET_INFO( get_mid_tile_info )
{
int tileno,colour;
tileno = mid_videoram[tile_index] & 0x0fff;
colour = mid_videoram[tile_index] & 0xf000;
pzletime_state *state = (pzletime_state *)machine->driver_data;
int tileno = state->mid_videoram[tile_index] & 0x0fff;
int colour = state->mid_videoram[tile_index] & 0xf000;
colour = colour >> 12;
SET_TILE_INFO(2,tileno,colour,0);
SET_TILE_INFO(2, tileno, colour, 0);
}
static TILE_GET_INFO( get_txt_tile_info )
{
int tileno,colour;
tileno = txt_videoram[tile_index] & 0x0fff;
colour = txt_videoram[tile_index] & 0xf000;
pzletime_state *state = (pzletime_state *)machine->driver_data;
int tileno = state->txt_videoram[tile_index] & 0x0fff;
int colour = state->txt_videoram[tile_index] & 0xf000;
colour = colour >> 12;
SET_TILE_INFO(0,tileno,colour,0);
SET_TILE_INFO(0, tileno, colour, 0);
tileinfo->category = (colour & 8) ? 1 : 0;
tileinfo->category = BIT(colour, 3);
}
static VIDEO_START( pzletime )
{
mid_tilemap = tilemap_create(machine, get_mid_tile_info,tilemap_scan_cols, 16,16,64,16);
txt_tilemap = tilemap_create(machine, get_txt_tile_info,tilemap_scan_rows, 8, 8,64,32);
pzletime_state *state = (pzletime_state *)machine->driver_data;
tilemap_set_transparent_pen(mid_tilemap,0);
tilemap_set_transparent_pen(txt_tilemap,0);
state->mid_tilemap = tilemap_create(machine, get_mid_tile_info, tilemap_scan_cols, 16, 16, 64, 16);
state->txt_tilemap = tilemap_create(machine, get_txt_tile_info, tilemap_scan_rows, 8, 8, 64, 32);
tilemap_set_transparent_pen(state->mid_tilemap, 0);
tilemap_set_transparent_pen(state->txt_tilemap, 0);
}
static VIDEO_UPDATE( pzletime )
{
pzletime_state *state = (pzletime_state *)screen->machine->driver_data;
int count;
int y,x;
int y, x;
bitmap_fill(bitmap, cliprect, screen->machine->pens[0]); //bg pen
tilemap_set_scrolly(txt_tilemap, 0, tilemap_regs[0]-3);
tilemap_set_scrollx(txt_tilemap, 0, tilemap_regs[1]);
tilemap_set_scrolly(state->txt_tilemap, 0, state->tilemap_regs[0] - 3);
tilemap_set_scrollx(state->txt_tilemap, 0, state->tilemap_regs[1]);
tilemap_set_scrolly(mid_tilemap, 0, tilemap_regs[2]-3);
tilemap_set_scrollx(mid_tilemap, 0, tilemap_regs[3]-7);
tilemap_set_scrolly(state->mid_tilemap, 0, state->tilemap_regs[2] - 3);
tilemap_set_scrollx(state->mid_tilemap, 0, state->tilemap_regs[3] - 7);
if(video_regs[2] & 1)
if (state->video_regs[2] & 1)
{
count = 0;
for(y=255;y>=0;y--)
for (y = 255; y >= 0; y--)
{
for(x=0;x<512;x++)
for (x = 0; x < 512; x++)
{
if(bg_videoram[count] & 0x8000)
{
*BITMAP_ADDR16(bitmap, (y - 18) & 0xff, (x - 32) & 0x1ff) = 0x300 + (bg_videoram[count] & 0x7fff);
}
if (state->bg_videoram[count] & 0x8000)
*BITMAP_ADDR16(bitmap, (y - 18) & 0xff, (x - 32) & 0x1ff) = 0x300 + (state->bg_videoram[count] & 0x7fff);
count++;
}
}
}
tilemap_draw(bitmap,cliprect,mid_tilemap, 0,0);
tilemap_draw(bitmap, cliprect, state->mid_tilemap, 0, 0);
{
UINT16 *spriteram16 = screen->machine->generic.spriteram.u16;
int offs,spr_offs,colour,sx,sy;
UINT16 *spriteram = state->spriteram;
int offs, spr_offs, colour, sx, sy;
for(offs = 0; offs < 0x2000/2; offs += 4)
for(offs = 0; offs < 0x2000 / 2; offs += 4)
{
if(spriteram16[offs+0] == 8)
if(spriteram[offs + 0] == 8)
break;
spr_offs = spriteram16[offs+3] & 0x0fff;
sy = 0x200-(spriteram16[offs+0] & 0x1ff)-35;
sx = (spriteram16[offs+1] & 0x1ff)-30;
colour = (spriteram16[offs+0] & 0xf000)>>12;
spr_offs = spriteram[offs + 3] & 0x0fff;
sy = 0x200 - (spriteram[offs + 0] & 0x1ff) - 35;
sx = (spriteram[offs + 1] & 0x1ff) - 30;
colour = (spriteram[offs + 0] & 0xf000) >> 12;
// is spriteram16[offs+0] & 0x200 flipy? it's always set
// is spriteram[offs + 0] & 0x200 flipy? it's always set
drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[1],spr_offs,colour,0,1,sx,sy,0);
drawgfx_transpen(bitmap, cliprect, screen->machine->gfx[1], spr_offs, colour, 0, 1, sx, sy, 0);
}
}
tilemap_draw(bitmap,cliprect,txt_tilemap,0,0);
if((video_screen_get_frame_number(screen) % 16) != 0)
tilemap_draw(bitmap,cliprect,txt_tilemap,1,0);
tilemap_draw(bitmap, cliprect, state->txt_tilemap, 0, 0);
if ((video_screen_get_frame_number(screen) % 16) != 0)
tilemap_draw(bitmap, cliprect, state->txt_tilemap, 1, 0);
return 0;
}
static WRITE16_HANDLER( mid_videoram_w )
{
COMBINE_DATA(&mid_videoram[offset]);
tilemap_mark_tile_dirty(mid_tilemap,offset);
pzletime_state *state = (pzletime_state *)space->machine->driver_data;
COMBINE_DATA(&state->mid_videoram[offset]);
tilemap_mark_tile_dirty(state->mid_tilemap, offset);
}
static WRITE16_HANDLER( txt_videoram_w )
{
COMBINE_DATA(&txt_videoram[offset]);
tilemap_mark_tile_dirty(txt_tilemap,offset);
pzletime_state *state = (pzletime_state *)space->machine->driver_data;
COMBINE_DATA(&state->txt_videoram[offset]);
tilemap_mark_tile_dirty(state->txt_tilemap, offset);
}
static WRITE16_DEVICE_HANDLER( eeprom_w )
{
if( ACCESSING_BITS_0_7 )
if (ACCESSING_BITS_0_7)
{
eeprom_write_bit(device, data & 0x01);
eeprom_set_cs_line(device, (data & 0x02) ? CLEAR_LINE : ASSERT_LINE );
@ -139,35 +160,36 @@ static WRITE16_DEVICE_HANDLER( eeprom_w )
static WRITE16_HANDLER( ticket_w )
{
if( ACCESSING_BITS_0_7 )
{
ticket = data & 1;
}
pzletime_state *state = (pzletime_state *)space->machine->driver_data;
if (ACCESSING_BITS_0_7)
state->ticket = data & 1;
}
static WRITE16_HANDLER( video_regs_w )
{
pzletime_state *state = (pzletime_state *)space->machine->driver_data;
int i;
COMBINE_DATA(&video_regs[offset]);
COMBINE_DATA(&state->video_regs[offset]);
if(offset == 0)
if (offset == 0)
{
if(video_regs[0] > 0)
if (state->video_regs[0] > 0)
{
for (i=0;i<0x300;i++)
for (i = 0; i < 0x300; i++)
{
palette_set_pen_contrast(space->machine, i, (double)0x8000/(double)video_regs[0]);
palette_set_pen_contrast(space->machine, i, (double)0x8000/(double)state->video_regs[0]);
}
}
}
else if(offset == 1)
else if (offset == 1)
{
if(video_regs[1] > 0)
if (state->video_regs[1] > 0)
{
for (i=0x300;i<32768 + 0x300;i++)
for (i = 0x300; i < 32768 + 0x300; i++)
{
palette_set_pen_contrast(space->machine, i, (double)0x8000/(double)video_regs[1]);
palette_set_pen_contrast(space->machine, i, (double)0x8000/(double)state->video_regs[1]);
}
}
}
@ -180,19 +202,20 @@ static WRITE16_DEVICE_HANDLER( oki_bank_w )
static CUSTOM_INPUT( ticket_status_r )
{
return ticket && !(video_screen_get_frame_number(field->port->machine->primary_screen)%128);
pzletime_state *state = (pzletime_state *)field->port->machine->driver_data;
return (state->ticket && !(video_screen_get_frame_number(field->port->machine->primary_screen) % 128));
}
static ADDRESS_MAP_START( pzletime_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x3fffff) AM_ROM
AM_RANGE(0x700000, 0x700005) AM_RAM_WRITE(video_regs_w) AM_BASE(&video_regs)
AM_RANGE(0x700000, 0x700005) AM_RAM_WRITE(video_regs_w) AM_BASE_MEMBER(pzletime_state, video_regs)
AM_RANGE(0x800000, 0x800001) AM_DEVREADWRITE8("oki", okim6295_r, okim6295_w, 0x00ff)
AM_RANGE(0x900000, 0x9005ff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0xa00000, 0xa00007) AM_RAM AM_BASE(&tilemap_regs)
AM_RANGE(0xb00000, 0xb3ffff) AM_RAM AM_BASE(&bg_videoram)
AM_RANGE(0xc00000, 0xc00fff) AM_RAM_WRITE(mid_videoram_w) AM_BASE(&mid_videoram)
AM_RANGE(0xc01000, 0xc01fff) AM_RAM_WRITE(txt_videoram_w) AM_BASE(&txt_videoram)
AM_RANGE(0xd00000, 0xd01fff) AM_RAM AM_BASE_GENERIC(spriteram)
AM_RANGE(0xa00000, 0xa00007) AM_RAM AM_BASE_MEMBER(pzletime_state, tilemap_regs)
AM_RANGE(0xb00000, 0xb3ffff) AM_RAM AM_BASE_MEMBER(pzletime_state, bg_videoram)
AM_RANGE(0xc00000, 0xc00fff) AM_RAM_WRITE(mid_videoram_w) AM_BASE_MEMBER(pzletime_state, mid_videoram)
AM_RANGE(0xc01000, 0xc01fff) AM_RAM_WRITE(txt_videoram_w) AM_BASE_MEMBER(pzletime_state, txt_videoram)
AM_RANGE(0xd00000, 0xd01fff) AM_RAM AM_BASE_MEMBER(pzletime_state, spriteram)
AM_RANGE(0xe00000, 0xe00001) AM_READ_PORT("INPUT") AM_DEVWRITE("eeprom", eeprom_w)
AM_RANGE(0xe00002, 0xe00003) AM_READ_PORT("SYSTEM") AM_WRITE(ticket_w)
AM_RANGE(0xe00004, 0xe00005) AM_DEVWRITE("oki", oki_bank_w)
@ -266,17 +289,37 @@ static PALETTE_INIT( pzletime )
/* first 0x300 colors are dynamic */
/* initialize 555 RGB lookup */
for (i = 0;i < 32768;i++)
palette_set_color_rgb(machine,i+0x300,pal5bit(i >> 10),pal5bit(i >> 5),pal5bit(i >> 0));
for (i = 0; i < 32768; i++)
palette_set_color_rgb(machine, i + 0x300, pal5bit(i >> 10), pal5bit(i >> 5), pal5bit(i >> 0));
}
static MACHINE_START( pzletime )
{
pzletime_state *state = (pzletime_state *)machine->driver_data;
state_save_register_global(machine, state->ticket);
}
static MACHINE_RESET( pzletime )
{
pzletime_state *state = (pzletime_state *)machine->driver_data;
state->ticket = 0;
}
static MACHINE_DRIVER_START( pzletime )
/* driver data */
MDRV_DRIVER_DATA(pzletime_state)
/* basic machine hardware */
MDRV_CPU_ADD("maincpu",M68000,10000000)
MDRV_CPU_PROGRAM_MAP(pzletime_map)
MDRV_CPU_VBLANK_INT("screen",irq4_line_hold)
MDRV_MACHINE_START(pzletime)
MDRV_MACHINE_RESET(pzletime)
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60)
@ -342,4 +385,4 @@ ROM_START( pzletime )
ROM_LOAD( "pzletime.nv", 0x0000, 0x0080, CRC(e5ed3d40) SHA1(8c163a6e5839e5c82d52f046d3268202fdf9f4d1) )
ROM_END
GAME( 199?, pzletime, 0, pzletime, pzletime, 0, ROT0, "Elettronica Video-Games S.R.L.", "Puzzle Time (Prototype)", 0 )
GAME( 199?, pzletime, 0, pzletime, pzletime, 0, ROT0, "Elettronica Video-Games S.R.L.", "Puzzle Time (Prototype)", GAME_SUPPORTS_SAVE )

View File

@ -1,14 +1,50 @@
class playmark_state
{
public:
static void *alloc(running_machine &machine) { return auto_alloc_clear(&machine, playmark_state(machine)); }
playmark_state(running_machine &machine) { }
/* memory pointers */
UINT16 * bgvideoram;
UINT16 * videoram1;
UINT16 * videoram2;
UINT16 * videoram3;
UINT16 * rowscroll;
UINT16 * spriteram;
// UINT16 * paletteram; // currently this uses generic palette handling
size_t spriteram_size;
/* video-related */
tilemap_t *tx_tilemap, *fg_tilemap, *bg_tilemap;
int bgscrollx, bgscrolly, bg_enable, bg_full_size;
int fgscrollx, fg_rowscroll_enable;
int xoffset;
int yoffset;
int txt_tile_offset;
int pri_masks[3];
UINT16 scroll[7];
/* powerbal-specific */
int tilebank;
int bg_yoffset;
/* misc */
UINT16 snd_command;
UINT16 snd_flag;
UINT8 oki_control;
UINT8 oki_command;
int old_oki_bank;
/* devices */
running_device *oki;
running_device *eeprom;
};
/*----------- defined in video/playmark.c -----------*/
extern UINT16 *bigtwin_bgvideoram;
extern UINT16 *wbeachvl_videoram1,*wbeachvl_videoram2,*wbeachvl_videoram3;
extern UINT16 *wbeachvl_rowscroll;
VIDEO_START( bigtwin );
VIDEO_START( wbeachvl );
VIDEO_START( excelsr );
VIDEO_START( hotmind );
VIDEO_START( hrdtimes );
WRITE16_HANDLER( wbeachvl_txvideoram_w );
WRITE16_HANDLER( wbeachvl_fgvideoram_w );
WRITE16_HANDLER( wbeachvl_bgvideoram_w );
@ -20,6 +56,13 @@ WRITE16_HANDLER( bigtwin_scroll_w );
WRITE16_HANDLER( wbeachvl_scroll_w );
WRITE16_HANDLER( excelsr_scroll_w );
WRITE16_HANDLER( hrdtimes_scroll_w );
VIDEO_START( bigtwin );
VIDEO_START( wbeachvl );
VIDEO_START( excelsr );
VIDEO_START( hotmind );
VIDEO_START( hrdtimes );
VIDEO_UPDATE( bigtwin );
VIDEO_UPDATE( wbeachvl );
VIDEO_UPDATE( excelsr );

View File

@ -0,0 +1,41 @@
/*************************************************************************
Pushman
*************************************************************************/
class pushman_state
{
public:
static void *alloc(running_machine &machine) { return auto_alloc_clear(&machine, pushman_state(machine)); }
pushman_state(running_machine &machine) { }
/* memory pointers */
UINT16 * videoram;
UINT16 * spriteram;
// UINT16 * paletteram; // currently this uses generic palette handling
/* video-related */
tilemap_t *bg_tilemap, *tx_tilemap;
UINT16 control[2];
/* misc */
UINT8 shared_ram[8];
UINT16 latch, new_latch;
/* devices */
running_device *maincpu;
running_device *audiocpu;
running_device *mcu;
};
/*----------- defined in video/pushman.c -----------*/
WRITE16_HANDLER( pushman_scroll_w );
WRITE16_HANDLER( pushman_videoram_w );
VIDEO_START( pushman );
VIDEO_UPDATE( pushman );

View File

@ -2,21 +2,6 @@
#include "includes/playmark.h"
UINT16 *bigtwin_bgvideoram;
UINT16 *wbeachvl_videoram1,*wbeachvl_videoram2,*wbeachvl_videoram3;
UINT16 *wbeachvl_rowscroll;
static int bgscrollx,bgscrolly,bg_enable,bg_full_size;
static int fgscrollx,fg_rowscroll_enable;
static tilemap_t *tx_tilemap,*fg_tilemap,*bg_tilemap;
static int xoffset = 0;
static int yoffset = 0;
static int txt_tile_offset = 0;
static int pri_masks[3];
static UINT16 playmark_scroll[7];
/***************************************************************************
Callbacks for the TileMap code
@ -25,8 +10,9 @@ static UINT16 playmark_scroll[7];
static TILE_GET_INFO( bigtwin_get_tx_tile_info )
{
UINT16 code = wbeachvl_videoram1[2*tile_index];
UINT16 color = wbeachvl_videoram1[2*tile_index+1];
playmark_state *state = (playmark_state *)machine->driver_data;
UINT16 code = state->videoram1[2 * tile_index];
UINT16 color = state->videoram1[2 * tile_index + 1];
SET_TILE_INFO(
2,
code,
@ -36,8 +22,9 @@ static TILE_GET_INFO( bigtwin_get_tx_tile_info )
static TILE_GET_INFO( bigtwin_get_fg_tile_info )
{
UINT16 code = wbeachvl_videoram2[2*tile_index];
UINT16 color = wbeachvl_videoram2[2*tile_index+1];
playmark_state *state = (playmark_state *)machine->driver_data;
UINT16 code = state->videoram2[2 * tile_index];
UINT16 color = state->videoram2[2 * tile_index + 1];
SET_TILE_INFO(
1,
code,
@ -47,8 +34,9 @@ static TILE_GET_INFO( bigtwin_get_fg_tile_info )
static TILE_GET_INFO( wbeachvl_get_tx_tile_info )
{
UINT16 code = wbeachvl_videoram1[2*tile_index];
UINT16 color = wbeachvl_videoram1[2*tile_index+1];
playmark_state *state = (playmark_state *)machine->driver_data;
UINT16 code = state->videoram1[2 * tile_index];
UINT16 color = state->videoram1[2 * tile_index + 1];
SET_TILE_INFO(
2,
@ -59,8 +47,9 @@ static TILE_GET_INFO( wbeachvl_get_tx_tile_info )
static TILE_GET_INFO( wbeachvl_get_fg_tile_info )
{
UINT16 code = wbeachvl_videoram2[2*tile_index];
UINT16 color = wbeachvl_videoram2[2*tile_index+1];
playmark_state *state = (playmark_state *)machine->driver_data;
UINT16 code = state->videoram2[2 * tile_index];
UINT16 color = state->videoram2[2 * tile_index + 1];
SET_TILE_INFO(
1,
@ -71,8 +60,9 @@ static TILE_GET_INFO( wbeachvl_get_fg_tile_info )
static TILE_GET_INFO( wbeachvl_get_bg_tile_info )
{
UINT16 code = wbeachvl_videoram3[2*tile_index];
UINT16 color = wbeachvl_videoram3[2*tile_index+1];
playmark_state *state = (playmark_state *)machine->driver_data;
UINT16 code = state->videoram3[2 * tile_index];
UINT16 color = state->videoram3[2 * tile_index + 1];
SET_TILE_INFO(
1,
@ -83,26 +73,29 @@ static TILE_GET_INFO( wbeachvl_get_bg_tile_info )
static TILE_GET_INFO( hrdtimes_get_tx_tile_info )
{
int code = wbeachvl_videoram1[tile_index] & 0x03ff;
int colr = wbeachvl_videoram1[tile_index] & 0xe000;
playmark_state *state = (playmark_state *)machine->driver_data;
int code = state->videoram1[tile_index] & 0x03ff;
int colr = state->videoram1[tile_index] & 0xe000;
SET_TILE_INFO(2,code + txt_tile_offset,colr >> 13,0);
SET_TILE_INFO(2,code + state->txt_tile_offset, colr >> 13, 0);
}
static TILE_GET_INFO( hrdtimes_get_fg_tile_info )
{
int code = wbeachvl_videoram2[tile_index] & 0x1fff;
int colr = wbeachvl_videoram2[tile_index] & 0xe000;
playmark_state *state = (playmark_state *)machine->driver_data;
int code = state->videoram2[tile_index] & 0x1fff;
int colr = state->videoram2[tile_index] & 0xe000;
SET_TILE_INFO(1,code + 0x2000,(colr >> 13) + 8,0);
}
static TILE_GET_INFO( hrdtimes_get_bg_tile_info )
{
int code = wbeachvl_videoram3[tile_index] & 0x1fff;
int colr = wbeachvl_videoram3[tile_index] & 0xe000;
playmark_state *state = (playmark_state *)machine->driver_data;
int code = state->videoram3[tile_index] & 0x1fff;
int colr = state->videoram3[tile_index] & 0xe000;
SET_TILE_INFO(1,code,colr >> 13,0);
SET_TILE_INFO(1, code, colr >> 13, 0);
}
/***************************************************************************
@ -113,85 +106,107 @@ static TILE_GET_INFO( hrdtimes_get_bg_tile_info )
VIDEO_START( bigtwin )
{
tx_tilemap = tilemap_create(machine, bigtwin_get_tx_tile_info,tilemap_scan_rows, 8, 8,64,32);
fg_tilemap = tilemap_create(machine, bigtwin_get_fg_tile_info,tilemap_scan_rows, 16,16,32,32);
playmark_state *state = (playmark_state *)machine->driver_data;
tilemap_set_transparent_pen(tx_tilemap,0);
state->tx_tilemap = tilemap_create(machine, bigtwin_get_tx_tile_info, tilemap_scan_rows, 8, 8, 64, 32);
state->fg_tilemap = tilemap_create(machine, bigtwin_get_fg_tile_info, tilemap_scan_rows, 16, 16, 32, 32);
pri_masks[0] = 0;
pri_masks[1] = 0;
pri_masks[2] = 0;
tilemap_set_transparent_pen(state->tx_tilemap, 0);
state->xoffset = 0;
state->yoffset = 0;
state->txt_tile_offset = 0;
state->pri_masks[0] = 0;
state->pri_masks[1] = 0;
state->pri_masks[2] = 0;
}
VIDEO_START( wbeachvl )
{
tx_tilemap = tilemap_create(machine, wbeachvl_get_tx_tile_info,tilemap_scan_rows, 8, 8,64,32);
fg_tilemap = tilemap_create(machine, wbeachvl_get_fg_tile_info,tilemap_scan_rows,16,16,64,32);
bg_tilemap = tilemap_create(machine, wbeachvl_get_bg_tile_info,tilemap_scan_rows, 16,16,64,32);
playmark_state *state = (playmark_state *)machine->driver_data;
tilemap_set_transparent_pen(tx_tilemap,0);
tilemap_set_transparent_pen(fg_tilemap,0);
state->tx_tilemap = tilemap_create(machine, wbeachvl_get_tx_tile_info, tilemap_scan_rows, 8, 8, 64, 32);
state->fg_tilemap = tilemap_create(machine, wbeachvl_get_fg_tile_info, tilemap_scan_rows, 16, 16, 64, 32);
state->bg_tilemap = tilemap_create(machine, wbeachvl_get_bg_tile_info, tilemap_scan_rows, 16, 16, 64, 32);
pri_masks[0] = 0xfff0;
pri_masks[1] = 0xfffc;
pri_masks[2] = 0;
tilemap_set_transparent_pen(state->tx_tilemap, 0);
tilemap_set_transparent_pen(state->fg_tilemap, 0);
state->xoffset = 0;
state->yoffset = 0;
state->txt_tile_offset = 0;
state->pri_masks[0] = 0xfff0;
state->pri_masks[1] = 0xfffc;
state->pri_masks[2] = 0;
}
VIDEO_START( excelsr )
{
tx_tilemap = tilemap_create(machine, bigtwin_get_tx_tile_info,tilemap_scan_rows,16,16,32,32);
fg_tilemap = tilemap_create(machine, bigtwin_get_fg_tile_info,tilemap_scan_rows, 16,16,32,32);
playmark_state *state = (playmark_state *)machine->driver_data;
tilemap_set_transparent_pen(tx_tilemap,0);
state->tx_tilemap = tilemap_create(machine, bigtwin_get_tx_tile_info, tilemap_scan_rows, 16, 16, 32, 32);
state->fg_tilemap = tilemap_create(machine, bigtwin_get_fg_tile_info, tilemap_scan_rows, 16, 16, 32, 32);
pri_masks[0] = 0;
pri_masks[1] = 0xfffc;
pri_masks[2] = 0xfff0;
tilemap_set_transparent_pen(state->tx_tilemap, 0);
state->xoffset = 0;
state->yoffset = 0;
state->txt_tile_offset = 0;
state->pri_masks[0] = 0;
state->pri_masks[1] = 0xfffc;
state->pri_masks[2] = 0xfff0;
}
VIDEO_START( hotmind )
{
tx_tilemap = tilemap_create(machine, hrdtimes_get_tx_tile_info,tilemap_scan_rows, 8, 8,64,64);
fg_tilemap = tilemap_create(machine, hrdtimes_get_fg_tile_info,tilemap_scan_rows,16,16,32,32);
bg_tilemap = tilemap_create(machine, hrdtimes_get_bg_tile_info,tilemap_scan_rows, 16,16,32,32);
playmark_state *state = (playmark_state *)machine->driver_data;
tilemap_set_transparent_pen(tx_tilemap,0);
tilemap_set_transparent_pen(fg_tilemap,0);
state->tx_tilemap = tilemap_create(machine, hrdtimes_get_tx_tile_info, tilemap_scan_rows, 8, 8, 64, 64);
state->fg_tilemap = tilemap_create(machine, hrdtimes_get_fg_tile_info, tilemap_scan_rows, 16, 16, 32, 32);
state->bg_tilemap = tilemap_create(machine, hrdtimes_get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32);
tilemap_set_scrolldx(tx_tilemap, -14, -14);
tilemap_set_scrolldx(fg_tilemap, -14, -14);
tilemap_set_scrolldx(bg_tilemap, -14, -14);
tilemap_set_transparent_pen(state->tx_tilemap, 0);
tilemap_set_transparent_pen(state->fg_tilemap, 0);
xoffset = -9;
yoffset = -8;
txt_tile_offset = 0x9000;
tilemap_set_scrolldx(state->tx_tilemap, -14, -14);
tilemap_set_scrolldx(state->fg_tilemap, -14, -14);
tilemap_set_scrolldx(state->bg_tilemap, -14, -14);
pri_masks[0] = 0xfff0;
pri_masks[1] = 0xfffc;
pri_masks[2] = 0;
state->xoffset = -9;
state->yoffset = -8;
state->txt_tile_offset = 0x9000;
state->pri_masks[0] = 0xfff0;
state->pri_masks[1] = 0xfffc;
state->pri_masks[2] = 0;
}
VIDEO_START( hrdtimes )
{
tx_tilemap = tilemap_create(machine, hrdtimes_get_tx_tile_info,tilemap_scan_rows, 8, 8,64,64);
fg_tilemap = tilemap_create(machine, hrdtimes_get_fg_tile_info,tilemap_scan_rows,16,16,32,32);
bg_tilemap = tilemap_create(machine, hrdtimes_get_bg_tile_info,tilemap_scan_rows, 16,16,32,32);
playmark_state *state = (playmark_state *)machine->driver_data;
tilemap_set_transparent_pen(tx_tilemap,0);
tilemap_set_transparent_pen(fg_tilemap,0);
state->tx_tilemap = tilemap_create(machine, hrdtimes_get_tx_tile_info,tilemap_scan_rows, 8, 8, 64, 64);
state->fg_tilemap = tilemap_create(machine, hrdtimes_get_fg_tile_info,tilemap_scan_rows, 16, 16, 32, 32);
state->bg_tilemap = tilemap_create(machine, hrdtimes_get_bg_tile_info,tilemap_scan_rows, 16, 16, 32, 32);
tilemap_set_scrolldx(tx_tilemap, -14, -14);
tilemap_set_scrolldx(fg_tilemap, -10, -10);
tilemap_set_scrolldx(bg_tilemap, -12, -12);
tilemap_set_transparent_pen(state->tx_tilemap, 0);
tilemap_set_transparent_pen(state->fg_tilemap, 0);
xoffset = -8;
yoffset = -8;
txt_tile_offset = 0xfc00;
tilemap_set_scrolldx(state->tx_tilemap, -14, -14);
tilemap_set_scrolldx(state->fg_tilemap, -10, -10);
tilemap_set_scrolldx(state->bg_tilemap, -12, -12);
pri_masks[0] = 0xfff0;
pri_masks[1] = 0xfffc;
pri_masks[2] = 0;
state->xoffset = -8;
state->yoffset = -8;
state->txt_tile_offset = 0xfc00;
state->pri_masks[0] = 0xfff0;
state->pri_masks[1] = 0xfffc;
state->pri_masks[2] = 0;
}
/***************************************************************************
@ -202,44 +217,56 @@ VIDEO_START( hrdtimes )
WRITE16_HANDLER( wbeachvl_txvideoram_w )
{
COMBINE_DATA(&wbeachvl_videoram1[offset]);
tilemap_mark_tile_dirty(tx_tilemap,offset / 2);
playmark_state *state = (playmark_state *)space->machine->driver_data;
COMBINE_DATA(&state->videoram1[offset]);
tilemap_mark_tile_dirty(state->tx_tilemap, offset / 2);
}
WRITE16_HANDLER( wbeachvl_fgvideoram_w )
{
COMBINE_DATA(&wbeachvl_videoram2[offset]);
tilemap_mark_tile_dirty(fg_tilemap,offset / 2);
playmark_state *state = (playmark_state *)space->machine->driver_data;
COMBINE_DATA(&state->videoram2[offset]);
tilemap_mark_tile_dirty(state->fg_tilemap, offset / 2);
}
WRITE16_HANDLER( wbeachvl_bgvideoram_w )
{
COMBINE_DATA(&wbeachvl_videoram3[offset]);
tilemap_mark_tile_dirty(bg_tilemap,offset / 2);
playmark_state *state = (playmark_state *)space->machine->driver_data;
COMBINE_DATA(&state->videoram3[offset]);
tilemap_mark_tile_dirty(state->bg_tilemap, offset / 2);
}
WRITE16_HANDLER( hrdtimes_txvideoram_w )
{
COMBINE_DATA(&wbeachvl_videoram1[offset]);
tilemap_mark_tile_dirty(tx_tilemap,offset);
playmark_state *state = (playmark_state *)space->machine->driver_data;
COMBINE_DATA(&state->videoram1[offset]);
tilemap_mark_tile_dirty(state->tx_tilemap, offset);
}
WRITE16_HANDLER( hrdtimes_fgvideoram_w )
{
COMBINE_DATA(&wbeachvl_videoram2[offset]);
tilemap_mark_tile_dirty(fg_tilemap,offset);
playmark_state *state = (playmark_state *)space->machine->driver_data;
COMBINE_DATA(&state->videoram2[offset]);
tilemap_mark_tile_dirty(state->fg_tilemap, offset);
}
WRITE16_HANDLER( hrdtimes_bgvideoram_w )
{
COMBINE_DATA(&wbeachvl_videoram3[offset]);
tilemap_mark_tile_dirty(bg_tilemap,offset);
playmark_state *state = (playmark_state *)space->machine->driver_data;
COMBINE_DATA(&state->videoram3[offset]);
tilemap_mark_tile_dirty(state->bg_tilemap, offset);
}
WRITE16_HANDLER( bigtwin_paletteram_w )
{
int r,g,b,val;
int r, g, b, val;
COMBINE_DATA(&space->machine->generic.paletteram.u16[offset]);
@ -252,74 +279,82 @@ WRITE16_HANDLER( bigtwin_paletteram_w )
g |= ((val & 0x04) >> 2);
b |= ((val & 0x02) >> 1);
palette_set_color_rgb(space->machine,offset,pal5bit(r),pal5bit(g),pal5bit(b));
palette_set_color_rgb(space->machine, offset, pal5bit(r), pal5bit(g), pal5bit(b));
}
WRITE16_HANDLER( bigtwin_scroll_w )
{
data = COMBINE_DATA(&playmark_scroll[offset]);
playmark_state *state = (playmark_state *)space->machine->driver_data;
data = COMBINE_DATA(&state->scroll[offset]);
switch (offset)
{
case 0: tilemap_set_scrollx(tx_tilemap,0,data+2); break;
case 1: tilemap_set_scrolly(tx_tilemap,0,data); break;
case 2: bgscrollx = -(data+4); break;
case 3: bgscrolly = (-data) & 0x1ff;
bg_enable = data & 0x0200;
bg_full_size = data & 0x0400;
case 0: tilemap_set_scrollx(state->tx_tilemap, 0, data + 2); break;
case 1: tilemap_set_scrolly(state->tx_tilemap, 0, data); break;
case 2: state->bgscrollx = -(data + 4); break;
case 3: state->bgscrolly = (-data) & 0x1ff;
state->bg_enable = data & 0x0200;
state->bg_full_size = data & 0x0400;
break;
case 4: tilemap_set_scrollx(fg_tilemap,0,data+6); break;
case 5: tilemap_set_scrolly(fg_tilemap,0,data); break;
case 4: tilemap_set_scrollx(state->fg_tilemap, 0, data + 6); break;
case 5: tilemap_set_scrolly(state->fg_tilemap, 0, data); break;
}
}
WRITE16_HANDLER( wbeachvl_scroll_w )
{
data = COMBINE_DATA(&playmark_scroll[offset]);
playmark_state *state = (playmark_state *)space->machine->driver_data;
data = COMBINE_DATA(&state->scroll[offset]);
switch (offset)
{
case 0: tilemap_set_scrollx(tx_tilemap,0,data+2); break;
case 1: tilemap_set_scrolly(tx_tilemap,0,data); break;
case 2: fgscrollx = data+4;break;
case 3: tilemap_set_scrolly(fg_tilemap,0,data & 0x3ff);
fg_rowscroll_enable = data & 0x0800;
case 0: tilemap_set_scrollx(state->tx_tilemap, 0, data + 2); break;
case 1: tilemap_set_scrolly(state->tx_tilemap, 0, data); break;
case 2: state->fgscrollx = data + 4;break;
case 3: tilemap_set_scrolly(state->fg_tilemap, 0, data & 0x3ff);
state->fg_rowscroll_enable = data & 0x0800;
break;
case 4: tilemap_set_scrollx(bg_tilemap,0,data+6); break;
case 5: tilemap_set_scrolly(bg_tilemap,0,data); break;
case 4: tilemap_set_scrollx(state->bg_tilemap, 0, data + 6); break;
case 5: tilemap_set_scrolly(state->bg_tilemap, 0, data); break;
}
}
WRITE16_HANDLER( excelsr_scroll_w )
{
data = COMBINE_DATA(&playmark_scroll[offset]);
playmark_state *state = (playmark_state *)space->machine->driver_data;
data = COMBINE_DATA(&state->scroll[offset]);
switch (offset)
{
case 0: tilemap_set_scrollx(tx_tilemap,0,data+2); break;
case 1: tilemap_set_scrolly(tx_tilemap,0,data); break;
case 2: bgscrollx = -data; break;
case 3: bgscrolly = (-data+2)& 0x1ff;
bg_enable = data & 0x0200;
bg_full_size = data & 0x0400;
case 0: tilemap_set_scrollx(state->tx_tilemap, 0, data + 2); break;
case 1: tilemap_set_scrolly(state->tx_tilemap, 0, data); break;
case 2: state->bgscrollx = -data; break;
case 3: state->bgscrolly = (-data + 2)& 0x1ff;
state->bg_enable = data & 0x0200;
state->bg_full_size = data & 0x0400;
break;
case 4: tilemap_set_scrollx(fg_tilemap,0,data+6); break;
case 5: tilemap_set_scrolly(fg_tilemap,0,data); break;
case 4: tilemap_set_scrollx(state->fg_tilemap, 0, data + 6); break;
case 5: tilemap_set_scrolly(state->fg_tilemap, 0, data); break;
}
}
WRITE16_HANDLER( hrdtimes_scroll_w )
{
data = COMBINE_DATA(&playmark_scroll[offset]);
playmark_state *state = (playmark_state *)space->machine->driver_data;
data = COMBINE_DATA(&state->scroll[offset]);
switch (offset)
{
case 0: tilemap_set_scrollx(tx_tilemap,0,data); break;
case 1: tilemap_set_scrolly(tx_tilemap,0,data); break;
case 2: tilemap_set_scrollx(fg_tilemap,0,data); break;
case 3: tilemap_set_scrolly(fg_tilemap,0,data); break;
case 4: tilemap_set_scrollx(bg_tilemap,0,data); break;
case 5: tilemap_set_scrolly(bg_tilemap,0,data); break;
case 0: tilemap_set_scrollx(state->tx_tilemap, 0, data); break;
case 1: tilemap_set_scrolly(state->tx_tilemap, 0, data); break;
case 2: tilemap_set_scrollx(state->fg_tilemap, 0, data); break;
case 3: tilemap_set_scrolly(state->fg_tilemap, 0, data); break;
case 4: tilemap_set_scrollx(state->bg_tilemap, 0, data); break;
case 5: tilemap_set_scrolly(state->bg_tilemap, 0, data); break;
}
}
@ -329,35 +364,36 @@ WRITE16_HANDLER( hrdtimes_scroll_w )
***************************************************************************/
static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectangle *cliprect,int codeshift)
static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int codeshift )
{
int offs, start_offset = machine->generic.spriteram_size/2 - 4;
playmark_state *state = (playmark_state *)machine->driver_data;
int offs, start_offset = state->spriteram_size / 2 - 4;
int height = machine->gfx[0]->height;
int colordiv = machine->gfx[0]->color_granularity / 16;
UINT16 *spriteram16 = machine->generic.spriteram.u16;
UINT16 *spriteram = state->spriteram;
// find the "end of list" to draw the sprites in reverse order
for (offs = 4;offs < machine->generic.spriteram_size/2;offs += 4)
for (offs = 4; offs < state->spriteram_size / 2; offs += 4)
{
if (spriteram16[offs+3-4] == 0x2000) /* end of list marker */
if (spriteram[offs + 3 - 4] == 0x2000) /* end of list marker */
{
start_offset = offs - 4;
break;
}
}
for (offs = start_offset;offs >= 4;offs -= 4)
for (offs = start_offset; offs >= 4; offs -= 4)
{
int sx,sy,code,color,flipx,pri;
int sx, sy, code, color, flipx, pri;
sy = spriteram16[offs+3-4]; /* -4? what the... ??? */
sy = spriteram[offs + 3 - 4]; /* -4? what the... ??? */
flipx = sy & 0x4000;
sx = (spriteram16[offs+1] & 0x01ff) - 16-7;
sy = (256-8-height - sy) & 0xff;
code = spriteram16[offs+2] >> codeshift;
color = ((spriteram16[offs+1] & 0x3e00) >> 9) / colordiv;
pri = (spriteram16[offs+1] & 0x8000) >> 15;
sx = (spriteram[offs + 1] & 0x01ff) - 16 - 7;
sy = (256 - 8 - height - sy) & 0xff;
code = spriteram[offs + 2] >> codeshift;
color = ((spriteram[offs + 1] & 0x3e00) >> 9) / colordiv;
pri = (spriteram[offs + 1] & 0x8000) >> 15;
if(!pri && (color & 0x0c) == 0x0c)
pri = 2;
@ -366,42 +402,43 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
code,
color,
flipx,0,
sx + xoffset,sy + yoffset,
machine->priority_bitmap,pri_masks[pri],0);
sx + state->xoffset,sy + state->yoffset,
machine->priority_bitmap,state->pri_masks[pri],0);
}
}
static void draw_bitmap(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
static void draw_bitmap( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
{
int x,y,count;
playmark_state *state = (playmark_state *)machine->driver_data;
int x, y, count;
int color;
UINT8 *pri;
count = 0;
for (y=0;y<512;y++)
for (y = 0; y < 512; y++)
{
for (x=0;x<512;x++)
for (x = 0; x < 512; x++)
{
color = bigtwin_bgvideoram[count] & 0xff;
color = state->bgvideoram[count] & 0xff;
if(color)
if (color)
{
if(bg_full_size)
if (state->bg_full_size)
{
*BITMAP_ADDR16(bitmap, (y + bgscrolly) & 0x1ff, (x + bgscrollx) & 0x1ff) = 0x100 + color;
*BITMAP_ADDR16(bitmap, (y + state->bgscrolly) & 0x1ff, (x + state->bgscrollx) & 0x1ff) = 0x100 + color;
pri = BITMAP_ADDR8(machine->priority_bitmap, (y + bgscrolly) & 0x1ff, 0);
pri[(x + bgscrollx) & 0x1ff] |= 2;
pri = BITMAP_ADDR8(machine->priority_bitmap, (y + state->bgscrolly) & 0x1ff, 0);
pri[(x + state->bgscrollx) & 0x1ff] |= 2;
}
else
{
/* 50% size */
if(!(x % 2) && !(y % 2))
{
*BITMAP_ADDR16(bitmap, (y / 2 + bgscrolly) & 0x1ff, (x / 2 + bgscrollx) & 0x1ff) = 0x100 + color;
*BITMAP_ADDR16(bitmap, (y / 2 + state->bgscrolly) & 0x1ff, (x / 2 + state->bgscrollx) & 0x1ff) = 0x100 + color;
pri = BITMAP_ADDR8(machine->priority_bitmap, (y / 2 + bgscrolly) & 0x1ff, 0);
pri[(x / 2 + bgscrollx) & 0x1ff] |= 2;
pri = BITMAP_ADDR8(machine->priority_bitmap, (y / 2 + state->bgscrolly) & 0x1ff, 0);
pri[(x / 2 + state->bgscrollx) & 0x1ff] |= 2;
}
}
}
@ -413,66 +450,74 @@ static void draw_bitmap(running_machine *machine, bitmap_t *bitmap, const rectan
VIDEO_UPDATE( bigtwin )
{
bitmap_fill(screen->machine->priority_bitmap,cliprect,0);
playmark_state *state = (playmark_state *)screen->machine->driver_data;
tilemap_draw(bitmap,cliprect,fg_tilemap,0,0);
if (bg_enable)
bitmap_fill(screen->machine->priority_bitmap, cliprect, 0);
tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 0);
if (state->bg_enable)
draw_bitmap(screen->machine, bitmap, cliprect);
draw_sprites(screen->machine, bitmap,cliprect,4);
tilemap_draw(bitmap,cliprect,tx_tilemap,0,0);
draw_sprites(screen->machine, bitmap, cliprect, 4);
tilemap_draw(bitmap, cliprect, state->tx_tilemap, 0, 0);
return 0;
}
VIDEO_UPDATE( excelsr )
{
bitmap_fill(screen->machine->priority_bitmap,cliprect,0);
playmark_state *state = (playmark_state *)screen->machine->driver_data;
tilemap_draw(bitmap,cliprect,fg_tilemap,0,1);
if (bg_enable)
bitmap_fill(screen->machine->priority_bitmap, cliprect, 0);
tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 1);
if (state->bg_enable)
draw_bitmap(screen->machine, bitmap, cliprect);
tilemap_draw(bitmap,cliprect,tx_tilemap,0,4);
draw_sprites(screen->machine,bitmap,cliprect,2);
tilemap_draw(bitmap, cliprect, state->tx_tilemap, 0, 4);
draw_sprites(screen->machine, bitmap, cliprect, 2);
return 0;
}
VIDEO_UPDATE( wbeachvl )
{
if (fg_rowscroll_enable)
playmark_state *state = (playmark_state *)screen->machine->driver_data;
if (state->fg_rowscroll_enable)
{
int i;
tilemap_set_scroll_rows(fg_tilemap,512);
for (i = 0;i < 256;i++)
tilemap_set_scrollx(fg_tilemap,i+1,wbeachvl_rowscroll[8*i]);
tilemap_set_scroll_rows(state->fg_tilemap, 512);
for (i = 0; i < 256; i++)
tilemap_set_scrollx(state->fg_tilemap, i + 1, state->rowscroll[8 * i]);
}
else
{
tilemap_set_scroll_rows(fg_tilemap,1);
tilemap_set_scrollx(fg_tilemap,0,fgscrollx);
tilemap_set_scroll_rows(state->fg_tilemap, 1);
tilemap_set_scrollx(state->fg_tilemap, 0, state->fgscrollx);
}
bitmap_fill(screen->machine->priority_bitmap,cliprect,0);
bitmap_fill(screen->machine->priority_bitmap, cliprect, 0);
tilemap_draw(bitmap,cliprect,bg_tilemap,0,1);
tilemap_draw(bitmap,cliprect,fg_tilemap,0,2);
draw_sprites(screen->machine,bitmap,cliprect,0);
tilemap_draw(bitmap,cliprect,tx_tilemap,0,0);
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 1);
tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 2);
draw_sprites(screen->machine, bitmap, cliprect, 0);
tilemap_draw(bitmap, cliprect, state->tx_tilemap, 0, 0);
return 0;
}
VIDEO_UPDATE( hrdtimes )
{
bitmap_fill(screen->machine->priority_bitmap,cliprect,0);
playmark_state *state = (playmark_state *)screen->machine->driver_data;
bitmap_fill(screen->machine->priority_bitmap, cliprect, 0);
// video enabled
if(playmark_scroll[6] & 1)
if (state->scroll[6] & 1)
{
tilemap_draw(bitmap,cliprect,bg_tilemap,0,1);
tilemap_draw(bitmap,cliprect,fg_tilemap,0,2);
draw_sprites(screen->machine,bitmap,cliprect,2);
tilemap_draw(bitmap,cliprect,tx_tilemap,0,0);
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 1);
tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 2);
draw_sprites(screen->machine, bitmap, cliprect, 2);
tilemap_draw(bitmap, cliprect, state->tx_tilemap, 0, 0);
}
else
bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine));
bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine));
return 0;
}

View File

@ -1,8 +1,5 @@
#include "emu.h"
static tilemap_t *bg_tilemap,*tx_tilemap;
static UINT16 control[2];
#include "includes/pushman.h"
/***************************************************************************
@ -13,30 +10,32 @@ static UINT16 control[2];
static TILEMAP_MAPPER( background_scan_rows )
{
/* logical (col,row) -> memory offset */
return ((col & 0x7)) + ((7-(row & 0x7)) << 3) + ((col & 0x78) <<3) + ((0x38-(row&0x38))<<7);
return ((col & 0x7)) + ((7 - (row & 0x7)) << 3) + ((col & 0x78) << 3) + ((0x38 - (row & 0x38)) << 7);
}
static TILE_GET_INFO( get_back_tile_info )
{
UINT8 *bgMap = memory_region(machine, "gfx4");
UINT8 *bg_map = memory_region(machine, "gfx4");
int tile;
tile=bgMap[tile_index<<1]+(bgMap[(tile_index<<1)+1]<<8);
tile = bg_map[tile_index << 1] + (bg_map[(tile_index << 1) + 1] << 8);
SET_TILE_INFO(
2,
(tile&0xff)|((tile&0x4000)>>6),
(tile>>8)&0xf,
(tile&0x2000)?TILE_FLIPX:0);
(tile & 0xff) | ((tile & 0x4000) >> 6),
(tile >> 8) & 0xf,
(tile & 0x2000) ? TILE_FLIPX : 0);
}
static TILE_GET_INFO( get_text_tile_info )
{
int tile = machine->generic.videoram.u16[tile_index];
pushman_state *state = (pushman_state *)machine->driver_data;
int tile = state->videoram[tile_index];
SET_TILE_INFO(
0,
(tile&0xff)|((tile&0xc000)>>6)|((tile&0x2000)>>3),
(tile>>8)&0xf,
(tile&0x1000)?TILE_FLIPY:0); /* not used? from Tiger Road */
(tile & 0xff) | ((tile & 0xc000) >> 6) | ((tile & 0x2000) >> 3),
(tile >> 8) & 0xf,
(tile & 0x1000) ? TILE_FLIPY : 0); /* not used? from Tiger Road */
}
@ -49,10 +48,12 @@ static TILE_GET_INFO( get_text_tile_info )
VIDEO_START( pushman )
{
bg_tilemap = tilemap_create(machine, get_back_tile_info,background_scan_rows, 32,32,128,64);
tx_tilemap = tilemap_create(machine, get_text_tile_info,tilemap_scan_rows, 8, 8, 32,32);
pushman_state *state = (pushman_state *)machine->driver_data;
tilemap_set_transparent_pen(tx_tilemap,3);
state->bg_tilemap = tilemap_create(machine, get_back_tile_info, background_scan_rows, 32, 32, 128, 64);
state->tx_tilemap = tilemap_create(machine, get_text_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_transparent_pen(state->tx_tilemap, 3);
}
@ -65,13 +66,15 @@ VIDEO_START( pushman )
WRITE16_HANDLER( pushman_scroll_w )
{
COMBINE_DATA(&control[offset]);
pushman_state *state = (pushman_state *)space->machine->driver_data;
COMBINE_DATA(&state->control[offset]);
}
WRITE16_HANDLER( pushman_videoram_w )
{
COMBINE_DATA(&space->machine->generic.videoram.u16[offset]);
tilemap_mark_tile_dirty(tx_tilemap,offset);
pushman_state *state = (pushman_state *)space->machine->driver_data;
COMBINE_DATA(&state->videoram[offset]);
tilemap_mark_tile_dirty(state->tx_tilemap, offset);
}
@ -82,23 +85,27 @@ WRITE16_HANDLER( pushman_videoram_w )
***************************************************************************/
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 )
{
UINT16 *spriteram16 = machine->generic.spriteram.u16;
int offs,x,y,color,sprite,flipx,flipy;
pushman_state *state = (pushman_state *)machine->driver_data;
UINT16 *spriteram = state->spriteram;
int offs, x, y, color, sprite, flipx, flipy;
for (offs = 0x0800-4;offs >=0;offs -= 4)
for (offs = 0x0800 - 4; offs >=0; offs -= 4)
{
/* Don't draw empty sprite table entries */
x = spriteram16[offs+3]&0x1ff;
if (x==0x180) continue;
if (x>0xff) x=0-(0x200-x);
y = 240-spriteram16[offs+2];
color = ((spriteram16[offs+1]>>2)&0xf);
sprite = spriteram16[offs]&0x7ff;
x = spriteram[offs + 3] & 0x1ff;
if (x == 0x180)
continue;
if (x > 0xff)
x = 0 - (0x200 - x);
y = 240 - spriteram[offs + 2];
color = ((spriteram[offs + 1] >> 2) & 0xf);
sprite = spriteram[offs] & 0x7ff;
/* ElSemi - Sprite flip info */
flipx=spriteram16[offs+1]&2;
flipy=spriteram16[offs+1]&1; /* flip y untested */
flipx = spriteram[offs + 1] & 2;
flipy = spriteram[offs + 1] & 1; /* flip y untested */
if (flip_screen_get(machine))
{
@ -108,20 +115,21 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
flipy = !flipy;
}
drawgfx_transpen(bitmap,cliprect,machine->gfx[1],
sprite,
color,flipx,flipy,x,y,15);
drawgfx_transpen(bitmap,cliprect,machine->gfx[1], sprite,
color, flipx, flipy, x, y, 15);
}
}
VIDEO_UPDATE( pushman )
{
/* Setup the tilemaps */
tilemap_set_scrollx( bg_tilemap,0, control[0] );
tilemap_set_scrolly( bg_tilemap,0, 0xf00-control[1] );
pushman_state *state = (pushman_state *)screen->machine->driver_data;
tilemap_draw(bitmap,cliprect,bg_tilemap,0,0);
draw_sprites(screen->machine,bitmap,cliprect);
tilemap_draw(bitmap,cliprect,tx_tilemap,0,0);
/* Setup the tilemaps */
tilemap_set_scrollx(state->bg_tilemap, 0, state->control[0]);
tilemap_set_scrolly(state->bg_tilemap, 0, 0xf00 - state->control[1]);
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
draw_sprites(screen->machine, bitmap, cliprect);
tilemap_draw(bitmap, cliprect, state->tx_tilemap, 0, 0);
return 0;
}