Convert cclimber/galpani2/gticlub/namcond1/pacman/seibuspi/tetrisp2/vicdual

to driver_device. [Atari Ace]

Last commit should have been:
Removed globals from a number of device-like shared systems and made them
either statics or actual device variables. [Atari Ace]
This commit is contained in:
Aaron Giles 2011-03-25 16:05:24 +00:00
parent 0989f6fe05
commit e9fc65db48
26 changed files with 1339 additions and 1155 deletions

View File

@ -213,10 +213,6 @@ Dip location verified from manual for: cclimber, guzzler, swimmer
#define MASTER_CLOCK XTAL_18_432MHz
static UINT8 yamato_p0;
static UINT8 yamato_p1;
static UINT8 toprollr_rombank;
static WRITE8_HANDLER( swimmer_sh_soundlatch_w )
{
@ -227,32 +223,37 @@ static WRITE8_HANDLER( swimmer_sh_soundlatch_w )
static WRITE8_HANDLER( yamato_p0_w )
{
yamato_p0 = data;
cclimber_state *state = space->machine->driver_data<cclimber_state>();
state->yamato_p0 = data;
}
static WRITE8_HANDLER( yamato_p1_w )
{
yamato_p1 = data;
cclimber_state *state = space->machine->driver_data<cclimber_state>();
state->yamato_p1 = data;
}
static READ8_HANDLER( yamato_p0_r )
{
return yamato_p0;
cclimber_state *state = space->machine->driver_data<cclimber_state>();
return state->yamato_p0;
}
static READ8_HANDLER( yamato_p1_r )
{
return yamato_p1;
cclimber_state *state = space->machine->driver_data<cclimber_state>();
return state->yamato_p1;
}
static WRITE8_HANDLER(toprollr_rombank_w)
{
toprollr_rombank &= ~(1 << offset);
toprollr_rombank |= (data & 1) << offset;
cclimber_state *state = space->machine->driver_data<cclimber_state>();
state->toprollr_rombank &= ~(1 << offset);
state->toprollr_rombank |= (data & 1) << offset;
if (toprollr_rombank < 3)
memory_set_bank(space->machine, "bank1", toprollr_rombank);
if (state->toprollr_rombank < 3)
memory_set_bank(space->machine, "bank1", state->toprollr_rombank);
}
@ -264,13 +265,14 @@ static TIMER_CALLBACK( disable_interrupts )
static MACHINE_RESET( cclimber )
{
cclimber_state *state = machine->driver_data<cclimber_state>();
/* Disable interrupts, River Patrol / Silver Land needs this */
/* we must do this on a timer in order to have it take effect */
/* otherwise, the reset process will override our changes */
machine->scheduler().synchronize(FUNC(disable_interrupts));
toprollr_rombank = 0;
state->toprollr_rombank = 0;
}
@ -282,18 +284,18 @@ static ADDRESS_MAP_START( cclimber_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x5fff) AM_ROM
AM_RANGE(0x6000, 0x6bff) AM_RAM /* Crazy Kong only */
AM_RANGE(0x8000, 0x83ff) AM_RAM
AM_RANGE(0x8800, 0x88ff) AM_RAM AM_BASE(&cclimber_bigsprite_videoram)
AM_RANGE(0x8800, 0x88ff) AM_RAM AM_BASE_MEMBER(cclimber_state, bigsprite_videoram)
AM_RANGE(0x8900, 0x8bff) AM_RAM /* not used, but initialized */
AM_RANGE(0x9000, 0x93ff) AM_MIRROR(0x0400) AM_RAM AM_BASE(&cclimber_videoram)
AM_RANGE(0x9000, 0x93ff) AM_MIRROR(0x0400) AM_RAM AM_BASE_MEMBER(cclimber_state, videoram)
/* 9800-9bff and 9c00-9fff share the same RAM, interleaved */
/* (9800-981f for scroll, 9c20-9c3f for color RAM, and so on) */
AM_RANGE(0x9800, 0x981f) AM_RAM AM_BASE(&cclimber_column_scroll)
AM_RANGE(0x9880, 0x989f) AM_RAM AM_BASE(&cclimber_spriteram)
AM_RANGE(0x98dc, 0x98df) AM_RAM AM_BASE(&cclimber_bigsprite_control)
AM_RANGE(0x9800, 0x981f) AM_RAM AM_BASE_MEMBER(cclimber_state, column_scroll)
AM_RANGE(0x9880, 0x989f) AM_RAM AM_BASE_MEMBER(cclimber_state, spriteram)
AM_RANGE(0x98dc, 0x98df) AM_RAM AM_BASE_MEMBER(cclimber_state, bigsprite_control)
AM_RANGE(0x9800, 0x9bff) AM_RAM /* not used, but initialized */
AM_RANGE(0x9c00, 0x9fff) AM_RAM_WRITE(cclimber_colorram_w) AM_BASE(&cclimber_colorram)
AM_RANGE(0x9c00, 0x9fff) AM_RAM_WRITE(cclimber_colorram_w) AM_BASE_MEMBER(cclimber_state, colorram)
AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P1") AM_WRITE(interrupt_enable_w)
AM_RANGE(0xa001, 0xa002) AM_WRITEONLY AM_BASE(&cclimber_flip_screen)
AM_RANGE(0xa001, 0xa002) AM_WRITEONLY AM_BASE_MEMBER(cclimber_state, flip_screen)
AM_RANGE(0xa003, 0xa003) AM_WRITE(interrupt_enable_w) //used by Crazy Kong Bootleg with alt levels and speed up
AM_RANGE(0xa004, 0xa004) AM_WRITE(cclimber_sample_trigger_w)
AM_RANGE(0xa800, 0xa800) AM_READ_PORT("P2") AM_WRITE(cclimber_sample_rate_w)
@ -306,18 +308,18 @@ static ADDRESS_MAP_START( cannonb_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x5fff) AM_ROM
AM_RANGE(0x6000, 0x6bff) AM_RAM
AM_RANGE(0x8000, 0x83ff) AM_RAM
AM_RANGE(0x8800, 0x88ff) AM_READNOP AM_WRITEONLY AM_BASE(&cclimber_bigsprite_videoram) /* must not return what's written (game will reset after coin insert if it returns 0xff)*/
AM_RANGE(0x8800, 0x88ff) AM_READNOP AM_WRITEONLY AM_BASE_MEMBER(cclimber_state, bigsprite_videoram) /* must not return what's written (game will reset after coin insert if it returns 0xff)*/
// AM_RANGE(0x8900, 0x8bff) AM_WRITEONLY /* not used, but initialized */
AM_RANGE(0x9000, 0x93ff) AM_MIRROR(0x0400) AM_RAM AM_BASE(&cclimber_videoram)
AM_RANGE(0x9000, 0x93ff) AM_MIRROR(0x0400) AM_RAM AM_BASE_MEMBER(cclimber_state, videoram)
/* 9800-9bff and 9c00-9fff share the same RAM, interleaved */
/* (9800-981f for scroll, 9c20-9c3f for color RAM, and so on) */
AM_RANGE(0x9800, 0x981f) AM_RAM AM_BASE(&cclimber_column_scroll)
AM_RANGE(0x9880, 0x989f) AM_RAM AM_BASE(&cclimber_spriteram)
AM_RANGE(0x98dc, 0x98df) AM_RAM AM_BASE(&cclimber_bigsprite_control)
AM_RANGE(0x9800, 0x981f) AM_RAM AM_BASE_MEMBER(cclimber_state, column_scroll)
AM_RANGE(0x9880, 0x989f) AM_RAM AM_BASE_MEMBER(cclimber_state, spriteram)
AM_RANGE(0x98dc, 0x98df) AM_RAM AM_BASE_MEMBER(cclimber_state, bigsprite_control)
AM_RANGE(0x9800, 0x9bff) AM_RAM /* not used, but initialized */
AM_RANGE(0x9c00, 0x9fff) AM_RAM_WRITE(cclimber_colorram_w) AM_BASE(&cclimber_colorram)
AM_RANGE(0x9c00, 0x9fff) AM_RAM_WRITE(cclimber_colorram_w) AM_BASE_MEMBER(cclimber_state, colorram)
AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P1") AM_WRITE(interrupt_enable_w)
AM_RANGE(0xa001, 0xa002) AM_WRITE(cannonb_flip_screen_w) AM_BASE(&cclimber_flip_screen)
AM_RANGE(0xa001, 0xa002) AM_WRITE(cannonb_flip_screen_w) AM_BASE_MEMBER(cclimber_state, flip_screen)
AM_RANGE(0xa004, 0xa004) AM_WRITE(cclimber_sample_trigger_w)
AM_RANGE(0xa800, 0xa800) AM_READ_PORT("P2") AM_WRITE(cclimber_sample_rate_w)
AM_RANGE(0xb000, 0xb000) AM_READ_PORT("DSW") AM_WRITE(cclimber_sample_volume_w)
@ -327,19 +329,19 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( swimmer_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x87ff) AM_RAM
AM_RANGE(0x8800, 0x88ff) AM_MIRROR(0x0100) AM_RAM AM_BASE(&cclimber_bigsprite_videoram)
AM_RANGE(0x9000, 0x93ff) AM_MIRROR(0x0400) AM_RAM AM_BASE(&cclimber_videoram)
AM_RANGE(0x9800, 0x981f) AM_WRITEONLY AM_BASE(&cclimber_column_scroll)
AM_RANGE(0x9880, 0x989f) AM_WRITEONLY AM_BASE(&cclimber_spriteram)
AM_RANGE(0x98fc, 0x98ff) AM_WRITEONLY AM_BASE(&cclimber_bigsprite_control)
AM_RANGE(0x9c00, 0x9fff) AM_RAM_WRITE(cclimber_colorram_w) AM_BASE(&cclimber_colorram)
AM_RANGE(0x8800, 0x88ff) AM_MIRROR(0x0100) AM_RAM AM_BASE_MEMBER(cclimber_state, bigsprite_videoram)
AM_RANGE(0x9000, 0x93ff) AM_MIRROR(0x0400) AM_RAM AM_BASE_MEMBER(cclimber_state, videoram)
AM_RANGE(0x9800, 0x981f) AM_WRITEONLY AM_BASE_MEMBER(cclimber_state, column_scroll)
AM_RANGE(0x9880, 0x989f) AM_WRITEONLY AM_BASE_MEMBER(cclimber_state, spriteram)
AM_RANGE(0x98fc, 0x98ff) AM_WRITEONLY AM_BASE_MEMBER(cclimber_state, bigsprite_control)
AM_RANGE(0x9c00, 0x9fff) AM_RAM_WRITE(cclimber_colorram_w) AM_BASE_MEMBER(cclimber_state, colorram)
AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P2") AM_WRITE(interrupt_enable_w)
AM_RANGE(0xa001, 0xa002) AM_WRITEONLY AM_BASE(&cclimber_flip_screen)
AM_RANGE(0xa003, 0xa003) AM_WRITEONLY AM_BASE(&swimmer_side_background_enabled)
AM_RANGE(0xa004, 0xa004) AM_WRITEONLY AM_BASE(&swimmer_palettebank)
AM_RANGE(0xa001, 0xa002) AM_WRITEONLY AM_BASE_MEMBER(cclimber_state, flip_screen)
AM_RANGE(0xa003, 0xa003) AM_WRITEONLY AM_BASE_MEMBER(cclimber_state, swimmer_side_background_enabled)
AM_RANGE(0xa004, 0xa004) AM_WRITEONLY AM_BASE_MEMBER(cclimber_state, swimmer_palettebank)
AM_RANGE(0xa800, 0xa800) AM_READ_PORT("P1") AM_WRITE(swimmer_sh_soundlatch_w)
AM_RANGE(0xb000, 0xb000) AM_READ_PORT("DSW1")
AM_RANGE(0xb800, 0xb800) AM_READ_PORT("DSW2") AM_WRITEONLY AM_BASE(&swimmer_background_color)
AM_RANGE(0xb800, 0xb800) AM_READ_PORT("DSW2") AM_WRITEONLY AM_BASE_MEMBER(cclimber_state, swimmer_background_color)
AM_RANGE(0xb880, 0xb880) AM_READ_PORT("SYSTEM")
AM_RANGE(0xc000, 0xc7ff) AM_RAM /* ??? used by Guzzler */
AM_RANGE(0xe000, 0xffff) AM_ROM /* Guzzler only */
@ -349,18 +351,18 @@ static ADDRESS_MAP_START( yamato_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x5fff) AM_ROM
AM_RANGE(0x6000, 0x6fff) AM_RAM
AM_RANGE(0x7000, 0x7fff) AM_ROM
AM_RANGE(0x8800, 0x88ff) AM_RAM AM_BASE(&cclimber_bigsprite_videoram)
AM_RANGE(0x8800, 0x88ff) AM_RAM AM_BASE_MEMBER(cclimber_state, bigsprite_videoram)
AM_RANGE(0x8900, 0x8bff) AM_RAM /* not used, but initialized */
AM_RANGE(0x9000, 0x93ff) AM_MIRROR(0x0400) AM_RAM AM_BASE(&cclimber_videoram)
AM_RANGE(0x9000, 0x93ff) AM_MIRROR(0x0400) AM_RAM AM_BASE_MEMBER(cclimber_state, videoram)
/* 9800-9bff and 9c00-9fff share the same RAM, interleaved */
/* (9800-981f for scroll, 9c20-9c3f for color RAM, and so on) */
AM_RANGE(0x9800, 0x981f) AM_RAM AM_BASE(&cclimber_column_scroll)
AM_RANGE(0x9880, 0x989f) AM_RAM AM_BASE(&cclimber_spriteram)
AM_RANGE(0x98dc, 0x98df) AM_RAM AM_BASE(&cclimber_bigsprite_control)
AM_RANGE(0x9800, 0x981f) AM_RAM AM_BASE_MEMBER(cclimber_state, column_scroll)
AM_RANGE(0x9880, 0x989f) AM_RAM AM_BASE_MEMBER(cclimber_state, spriteram)
AM_RANGE(0x98dc, 0x98df) AM_RAM AM_BASE_MEMBER(cclimber_state, bigsprite_control)
AM_RANGE(0x9800, 0x9bff) AM_RAM /* not used, but initialized */
AM_RANGE(0x9c00, 0x9fff) AM_RAM_WRITE(cclimber_colorram_w) AM_BASE(&cclimber_colorram)
AM_RANGE(0x9c00, 0x9fff) AM_RAM_WRITE(cclimber_colorram_w) AM_BASE_MEMBER(cclimber_state, colorram)
AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P1") AM_WRITE(interrupt_enable_w)
AM_RANGE(0xa001, 0xa002) AM_WRITEONLY AM_BASE(&cclimber_flip_screen)
AM_RANGE(0xa001, 0xa002) AM_WRITEONLY AM_BASE_MEMBER(cclimber_state, flip_screen)
AM_RANGE(0xa800, 0xa800) AM_READ_PORT("P2")
AM_RANGE(0xb000, 0xb000) AM_READ_PORT("DSW")
AM_RANGE(0xb800, 0xb800) AM_READ_PORT("COIN")
@ -370,16 +372,16 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( toprollr_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x5fff) AM_ROMBANK("bank1")
AM_RANGE(0x6000, 0x6bff) AM_RAM
AM_RANGE(0x8800, 0x88ff) AM_RAM AM_BASE(&cclimber_bigsprite_videoram)
AM_RANGE(0x8c00, 0x8fff) AM_RAM AM_BASE(&toprollr_bg_videoram)
AM_RANGE(0x9000, 0x93ff) AM_RAM AM_BASE(&cclimber_videoram)
AM_RANGE(0x9400, 0x97ff) AM_RAM AM_BASE(&toprollr_bg_coloram)
AM_RANGE(0x8800, 0x88ff) AM_RAM AM_BASE_MEMBER(cclimber_state, bigsprite_videoram)
AM_RANGE(0x8c00, 0x8fff) AM_RAM AM_BASE_MEMBER(cclimber_state, toprollr_bg_videoram)
AM_RANGE(0x9000, 0x93ff) AM_RAM AM_BASE_MEMBER(cclimber_state, videoram)
AM_RANGE(0x9400, 0x97ff) AM_RAM AM_BASE_MEMBER(cclimber_state, toprollr_bg_coloram)
AM_RANGE(0x9800, 0x987f) AM_RAM /* unused ? */
AM_RANGE(0x9880, 0x995f) AM_RAM AM_BASE(&cclimber_spriteram)
AM_RANGE(0x99dc, 0x99df) AM_RAM AM_BASE(&cclimber_bigsprite_control)
AM_RANGE(0x9c00, 0x9fff) AM_RAM AM_BASE(&cclimber_colorram)
AM_RANGE(0x9880, 0x995f) AM_RAM AM_BASE_MEMBER(cclimber_state, spriteram)
AM_RANGE(0x99dc, 0x99df) AM_RAM AM_BASE_MEMBER(cclimber_state, bigsprite_control)
AM_RANGE(0x9c00, 0x9fff) AM_RAM AM_BASE_MEMBER(cclimber_state, colorram)
AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P1") AM_WRITE(interrupt_enable_w)
AM_RANGE(0xa001, 0xa002) AM_WRITEONLY AM_BASE(&cclimber_flip_screen)
AM_RANGE(0xa001, 0xa002) AM_WRITEONLY AM_BASE_MEMBER(cclimber_state, flip_screen)
AM_RANGE(0xa004, 0xa004) AM_WRITE(cclimber_sample_trigger_w)
AM_RANGE(0xa005, 0xa006) AM_WRITE(toprollr_rombank_w)
AM_RANGE(0xa800, 0xa800) AM_READ_PORT("P2") AM_WRITE(cclimber_sample_rate_w)
@ -982,7 +984,7 @@ GFXDECODE_END
static MACHINE_CONFIG_START( root, driver_device )
static MACHINE_CONFIG_START( root, cclimber_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK/3/2) /* 3.072 MHz */
@ -1080,7 +1082,7 @@ static MACHINE_CONFIG_DERIVED( toprollr, cclimber )
MACHINE_CONFIG_END
static MACHINE_CONFIG_START( swimmer, driver_device )
static MACHINE_CONFIG_START( swimmer, cclimber_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, XTAL_18_432MHz/6) /* verified on pcb */

View File

@ -35,15 +35,16 @@ To Do:
***************************************************************************/
static UINT16 eeprom_word;
static READ16_DEVICE_HANDLER(galpani2_eeprom_r)
{
return (eeprom_word & ~1) | (eeprom_read_bit(device) & 1);
galpani2_state *state = device->machine->driver_data<galpani2_state>();
return (state->eeprom_word & ~1) | (eeprom_read_bit(device) & 1);
}
static WRITE16_DEVICE_HANDLER(galpani2_eeprom_w)
{
COMBINE_DATA( &eeprom_word );
galpani2_state *state = device->machine->driver_data<galpani2_state>();
COMBINE_DATA( &state->eeprom_word );
if ( ACCESSING_BITS_0_7 )
{
// latch the bit
@ -68,7 +69,6 @@ static WRITE16_DEVICE_HANDLER(galpani2_eeprom_w)
***************************************************************************/
static UINT16 *galpani2_ram, *galpani2_ram2;
static MACHINE_RESET( galpani2 )
{
@ -236,22 +236,22 @@ static void galpani2_mcu_nmi2(running_machine *machine)
static WRITE8_HANDLER( galpani2_mcu_nmi1_w ) //driven by CPU1's int5 ISR
{
galpani2_state *state = space->machine->driver_data<galpani2_state>();
//for galpan2t:
//Triggered from 'maincpu' (00007D60),once, with no command, using alternate line, during init
//Triggered from 'maincpu' (000080BE),once, for unknown command, during init
//Triggered from 'maincpu' (0000741E),from here on...driven by int5, even if there's no command
static UINT16 old_mcu_nmi1 = 0;
if ( (data & 1) && !(old_mcu_nmi1 & 1) ) galpani2_mcu_nmi1(space->machine);
//if ( (data & 0x10) && !(old_mcu_nmi1 & 0x10) ) galpani2_mcu_nmi1(space->machine);
if ( (data & 1) && !(state->old_mcu_nmi1 & 1) ) galpani2_mcu_nmi1(space->machine);
//if ( (data & 0x10) && !(state->old_mcu_nmi1 & 0x10) ) galpani2_mcu_nmi1(space->machine);
//alternate line, same function?
old_mcu_nmi1 = data;
state->old_mcu_nmi1 = data;
}
static WRITE8_HANDLER( galpani2_mcu_nmi2_w ) //driven by CPU2's int5 ISR
{
static UINT16 old_mcu_nmi2 = 0;
if ( (data & 1) && !(old_mcu_nmi2 & 1) ) galpani2_mcu_nmi2(space->machine);
old_mcu_nmi2 = data;
galpani2_state *state = space->machine->driver_data<galpani2_state>();
if ( (data & 1) && !(state->old_mcu_nmi2 & 1) ) galpani2_mcu_nmi2(space->machine);
state->old_mcu_nmi2 = data;
}
@ -276,41 +276,41 @@ static WRITE8_HANDLER( galpani2_coin_lockout_w )
static WRITE8_DEVICE_HANDLER( galpani2_oki1_bank_w )
{
UINT8 *ROM = device->machine->region("oki1")->base();
logerror("%s : %s bank %08X\n",device->machine->describe_context(),device->tag(),data);
memcpy(ROM + 0x30000, ROM + 0x40000 + 0x10000 * (~data & 0xf), 0x10000);
UINT8 *ROM = device->machine->region("oki1")->base();
logerror("%s : %s bank %08X\n",device->machine->describe_context(),device->tag(),data);
memcpy(ROM + 0x30000, ROM + 0x40000 + 0x10000 * (~data & 0xf), 0x10000);
}
static WRITE8_DEVICE_HANDLER( galpani2_oki2_bank_w )
{
okim6295_device *oki = downcast<okim6295_device *>(device);
oki->set_bank_base(0x40000 * (data & 0xf) );
logerror("%s : %s bank %08X\n",device->machine->describe_context(),device->tag(),data);
okim6295_device *oki = downcast<okim6295_device *>(device);
oki->set_bank_base(0x40000 * (data & 0xf) );
logerror("%s : %s bank %08X\n",device->machine->describe_context(),device->tag(),data);
}
static ADDRESS_MAP_START( galpani2_mem1, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM
AM_RANGE(0x100000, 0x10ffff) AM_RAM AM_BASE(&galpani2_ram ) // Work RAM
AM_RANGE(0x100000, 0x10ffff) AM_RAM AM_BASE_MEMBER(galpani2_state, ram) // Work RAM
AM_RANGE(0x110000, 0x11000f) AM_RAM // ? corrupted? stack dumper on POST failure, pc+sr on gp2se
AM_RANGE(0x300000, 0x301fff) AM_RAM // ?
AM_RANGE(0x302000, 0x303fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites
AM_RANGE(0x304000, 0x30401f) AM_RAM_WRITE(kaneko16_sprites_regs_w) AM_BASE(&kaneko16_sprites_regs ) // Sprites Regs
AM_RANGE(0x308000, 0x308001) AM_WRITENOP // ? 0 at startup
AM_RANGE(0x30c000, 0x30c001) AM_WRITENOP // ? hblank effect ?
AM_RANGE(0x310000, 0x3101ff) AM_RAM_WRITE(galpani2_palette_0_w) AM_BASE(&galpani2_palette_0 ) // ?
AM_RANGE(0x310000, 0x3101ff) AM_RAM_WRITE(galpani2_palette_0_w) AM_BASE_MEMBER(galpani2_state, palette_0) // ?
AM_RANGE(0x314000, 0x314001) AM_WRITENOP // ? flip backgrounds ?
AM_RANGE(0x318000, 0x318001) AM_DEVREADWRITE("eeprom", galpani2_eeprom_r, galpani2_eeprom_w) // EEPROM
AM_RANGE(0x380000, 0x387fff) AM_RAM // Palette?
AM_RANGE(0x388000, 0x38ffff) AM_RAM_WRITE(paletteram16_xGGGGGRRRRRBBBBB_word_w) AM_BASE_GENERIC(paletteram ) // Palette
AM_RANGE(0x390000, 0x3901ff) AM_WRITENOP // ? at startup of service mode
AM_RANGE(0x400000, 0x43ffff) AM_RAM_WRITE(galpani2_bg8_0_w) AM_BASE(&galpani2_bg8_0 ) // Background 0
AM_RANGE(0x440000, 0x440001) AM_RAM AM_BASE(&galpani2_bg8_0_scrollx ) // Background 0 Scroll X
AM_RANGE(0x480000, 0x480001) AM_RAM AM_BASE(&galpani2_bg8_0_scrolly ) // Background 0 Scroll Y
AM_RANGE(0x400000, 0x43ffff) AM_RAM_WRITE(galpani2_bg8_0_w) AM_BASE_MEMBER(galpani2_state, bg8_0) // Background 0
AM_RANGE(0x440000, 0x440001) AM_RAM AM_BASE_MEMBER(galpani2_state, bg8_0_scrollx) // Background 0 Scroll X
AM_RANGE(0x480000, 0x480001) AM_RAM AM_BASE_MEMBER(galpani2_state, bg8_0_scrolly) // Background 0 Scroll Y
AM_RANGE(0x4c0000, 0x4c0001) AM_WRITENOP // ? 0 at startup only
AM_RANGE(0x500000, 0x53ffff) AM_RAM_WRITE(galpani2_bg8_1_w) AM_BASE(&galpani2_bg8_1 ) // Background 1
AM_RANGE(0x540000, 0x540001) AM_RAM AM_BASE(&galpani2_bg8_1_scrollx ) // Background 1 Scroll X
AM_RANGE(0x500000, 0x53ffff) AM_RAM_WRITE(galpani2_bg8_1_w) AM_BASE_MEMBER(galpani2_state, bg8_1) // Background 1
AM_RANGE(0x540000, 0x540001) AM_RAM AM_BASE_MEMBER(galpani2_state, bg8_1_scrollx) // Background 1 Scroll X
AM_RANGE(0x540572, 0x540573) AM_READNOP // ? galpani2 at F0A4
AM_RANGE(0x54057a, 0x54057b) AM_READNOP // ? galpani2 at F148
@ -322,7 +322,7 @@ static ADDRESS_MAP_START( galpani2_mem1, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x5405c2, 0x5405c3) AM_READNOP // ? galpani2 at F0A4 and F148
AM_RANGE(0x5405ca, 0x5405cb) AM_READNOP // ? galpani2 at F148
AM_RANGE(0x580000, 0x580001) AM_RAM AM_BASE(&galpani2_bg8_1_scrolly ) // Background 1 Scroll Y
AM_RANGE(0x580000, 0x580001) AM_RAM AM_BASE_MEMBER(galpani2_state, bg8_1_scrolly) // Background 1 Scroll Y
AM_RANGE(0x5c0000, 0x5c0001) AM_WRITENOP // ? 0 at startup only
AM_RANGE(0x600000, 0x600001) AM_WRITENOP // Watchdog
AM_RANGE(0x640000, 0x640001) AM_WRITE8(galpani2_mcu_init_w, 0x00ff ) // ? 0 before resetting and at startup, Reset mcu ?
@ -347,14 +347,14 @@ ADDRESS_MAP_END
***************************************************************************/
static UINT16 *galpani2_rombank;
static READ16_HANDLER( galpani2_bankedrom_r )
{
galpani2_state *state = space->machine->driver_data<galpani2_state>();
UINT16 *ROM = (UINT16 *) space->machine->region( "user1" )->base();
size_t len = space->machine->region( "user1" )->bytes() / 2;
offset += (0x800000/2) * (*galpani2_rombank & 0x0003);
offset += (0x800000/2) * (*state->rombank & 0x0003);
if ( offset < len ) return ROM[offset];
else return 0xffff; //floating bus for absent ROMs
@ -362,8 +362,8 @@ static READ16_HANDLER( galpani2_bankedrom_r )
static ADDRESS_MAP_START( galpani2_mem2, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM
AM_RANGE(0x100000, 0x13ffff) AM_RAM AM_BASE(&galpani2_ram2) // Work RAM
AM_RANGE(0x400000, 0x4fffff) AM_RAM_WRITE(galpani2_bg15_w) AM_BASE(&galpani2_bg15) // bg15
AM_RANGE(0x100000, 0x13ffff) AM_RAM AM_BASE_MEMBER(galpani2_state, ram2) // Work RAM
AM_RANGE(0x400000, 0x4fffff) AM_RAM_WRITE(galpani2_bg15_w) AM_BASE_MEMBER(galpani2_state, bg15) // bg15
AM_RANGE(0x500000, 0x5fffff) AM_RAM // bg15
AM_RANGE(0x600000, 0x600001) AM_NOP // ? 0 at startup only
AM_RANGE(0x640000, 0x640001) AM_WRITENOP // ? 0 at startup only
@ -372,7 +372,7 @@ static ADDRESS_MAP_START( galpani2_mem2, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x700000, 0x700001) AM_WRITENOP // Watchdog
// AM_RANGE(0x740000, 0x740001) AM_WRITENOP // ? Reset mcu
AM_RANGE(0x780000, 0x780001) AM_WRITE8(galpani2_mcu_nmi2_w, 0x00ff) // ? 0 -> 1 -> 0 (lev 5)
AM_RANGE(0x7c0000, 0x7c0001) AM_WRITEONLY AM_BASE(&galpani2_rombank ) // Rom Bank
AM_RANGE(0x7c0000, 0x7c0001) AM_WRITEONLY AM_BASE_MEMBER(galpani2_state, rombank) // Rom Bank
AM_RANGE(0x800000, 0xffffff) AM_READ(galpani2_bankedrom_r ) // Banked ROM
ADDRESS_MAP_END
@ -575,7 +575,7 @@ static INTERRUPT_GEN( galpani2_interrupt2 )
}
}
static MACHINE_CONFIG_START( galpani2, driver_device )
static MACHINE_CONFIG_START( galpani2, galpani2_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, XTAL_27MHz/2) /* Confirmed on galpani2i PCB */

View File

@ -235,7 +235,16 @@ Hang Pilot (uses an unknown but similar video board) 12W
#include "rendlay.h"
static UINT32 *work_ram;
class gticlub_state : public driver_device
{
public:
gticlub_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
UINT32 *work_ram;
UINT32 *sharc_dataram_0;
UINT32 *sharc_dataram_1;
};
static WRITE32_HANDLER( paletteram32_w )
@ -382,15 +391,17 @@ static WRITE8_HANDLER( sysreg_w )
static MACHINE_START( gticlub )
{
gticlub_state *state = machine->driver_data<gticlub_state>();
/* set conservative DRC options */
ppcdrc_set_options(machine->device("maincpu"), PPCDRC_COMPATIBLE_OPTIONS);
/* configure fast RAM regions for DRC */
ppcdrc_add_fastram(machine->device("maincpu"), 0x00000000, 0x000fffff, FALSE, work_ram);
ppcdrc_add_fastram(machine->device("maincpu"), 0x00000000, 0x000fffff, FALSE, state->work_ram);
}
static ADDRESS_MAP_START( gticlub_map, ADDRESS_SPACE_PROGRAM, 32 )
AM_RANGE(0x00000000, 0x000fffff) AM_RAM AM_BASE(&work_ram) /* Work RAM */
AM_RANGE(0x00000000, 0x000fffff) AM_RAM AM_BASE_MEMBER(gticlub_state, work_ram) /* Work RAM */
AM_RANGE(0x74000000, 0x740000ff) AM_READWRITE(gticlub_k001604_reg_r, gticlub_k001604_reg_w)
AM_RANGE(0x74010000, 0x7401ffff) AM_RAM_WRITE(paletteram32_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0x74020000, 0x7403ffff) AM_READWRITE(gticlub_k001604_tile_r, gticlub_k001604_tile_w)
@ -423,27 +434,28 @@ ADDRESS_MAP_END
/*****************************************************************************/
static UINT32 *sharc_dataram_0;
static UINT32 *sharc_dataram_1;
static READ32_HANDLER( dsp_dataram0_r )
{
return sharc_dataram_0[offset] & 0xffff;
gticlub_state *state = space->machine->driver_data<gticlub_state>();
return state->sharc_dataram_0[offset] & 0xffff;
}
static WRITE32_HANDLER( dsp_dataram0_w )
{
sharc_dataram_0[offset] = data;
gticlub_state *state = space->machine->driver_data<gticlub_state>();
state->sharc_dataram_0[offset] = data;
}
static READ32_HANDLER( dsp_dataram1_r )
{
return sharc_dataram_1[offset] & 0xffff;
gticlub_state *state = space->machine->driver_data<gticlub_state>();
return state->sharc_dataram_1[offset] & 0xffff;
}
static WRITE32_HANDLER( dsp_dataram1_w )
{
sharc_dataram_1[offset] = data;
gticlub_state *state = space->machine->driver_data<gticlub_state>();
state->sharc_dataram_1[offset] = data;
}
static ADDRESS_MAP_START( sharc_map, ADDRESS_SPACE_DATA, 32 )
@ -776,7 +788,7 @@ static MACHINE_RESET( gticlub )
cputag_set_input_line(machine, "dsp", INPUT_LINE_RESET, ASSERT_LINE);
}
static MACHINE_CONFIG_START( gticlub, driver_device )
static MACHINE_CONFIG_START( gticlub, gticlub_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", PPC403GA, 64000000/2) /* PowerPC 403GA 32MHz */
@ -859,7 +871,7 @@ static MACHINE_RESET( hangplt )
cputag_set_input_line(machine, "dsp2", INPUT_LINE_RESET, ASSERT_LINE);
}
static MACHINE_CONFIG_START( hangplt, driver_device )
static MACHINE_CONFIG_START( hangplt, gticlub_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", PPC403GA, 64000000/2) /* PowerPC 403GA 32MHz */
@ -1140,21 +1152,25 @@ ROM_END
static DRIVER_INIT(gticlub)
{
gticlub_state *state = machine->driver_data<gticlub_state>();
init_konami_cgboard(machine, 1, CGBOARD_TYPE_GTICLUB);
sharc_dataram_0 = auto_alloc_array(machine, UINT32, 0x100000/4);
state->sharc_dataram_0 = auto_alloc_array(machine, UINT32, 0x100000/4);
K001005_preprocess_texture_data(machine->region("gfx1")->base(), machine->region("gfx1")->bytes(), 1);
}
static DRIVER_INIT(hangplt)
{
gticlub_state *state = machine->driver_data<gticlub_state>();
init_konami_cgboard(machine, 2, CGBOARD_TYPE_HANGPLT);
set_cgboard_texture_bank(machine, 0, "bank5", machine->region("user5")->base());
set_cgboard_texture_bank(machine, 1, "bank6", machine->region("user5")->base());
sharc_dataram_0 = auto_alloc_array(machine, UINT32, 0x100000/4);
sharc_dataram_1 = auto_alloc_array(machine, UINT32, 0x100000/4);
state->sharc_dataram_0 = auto_alloc_array(machine, UINT32, 0x100000/4);
state->sharc_dataram_1 = auto_alloc_array(machine, UINT32, 0x100000/4);
}
/*************************************************************************/

View File

@ -104,11 +104,11 @@
#include "sound/namco.h"
class jrpacman_state : public driver_device
class jrpacman_state : public pacman_state
{
public:
jrpacman_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
: pacman_state(machine, config) { }
UINT8 *spriteram;
UINT8 *spriteram2;
@ -133,7 +133,7 @@ static WRITE8_HANDLER( jrpacman_interrupt_vector_w )
static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x4000, 0x47ff) AM_RAM_WRITE(jrpacman_videoram_w) AM_BASE(&pacman_videoram)
AM_RANGE(0x4000, 0x47ff) AM_RAM_WRITE(jrpacman_videoram_w) AM_BASE_MEMBER(jrpacman_state, videoram)
AM_RANGE(0x4800, 0x4fef) AM_RAM
AM_RANGE(0x4ff0, 0x4fff) AM_RAM AM_BASE_SIZE_MEMBER(jrpacman_state, spriteram, spriteram_size)
AM_RANGE(0x5000, 0x503f) AM_READ_PORT("P1")
@ -228,12 +228,12 @@ INPUT_PORTS_END
static const gfx_layout tilelayout =
{
8,8,
RGN_FRAC(1,2),
2,
{ 0, 4 },
{ STEP4(8*8,1), STEP4(0*8,1) },
{ STEP8(0*8,8) },
16*8
RGN_FRAC(1,2),
2,
{ 0, 4 },
{ STEP4(8*8,1), STEP4(0*8,1) },
{ STEP8(0*8,8) },
16*8
};

View File

@ -77,7 +77,7 @@ Notes:
static ADDRESS_MAP_START( namcond1_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x0fffff) AM_ROM
AM_RANGE(0x400000, 0x40ffff) AM_READWRITE(namcond1_shared_ram_r,namcond1_shared_ram_w) AM_BASE(&namcond1_shared_ram)
AM_RANGE(0x400000, 0x40ffff) AM_READWRITE(namcond1_shared_ram_r,namcond1_shared_ram_w) AM_BASE_MEMBER(namcond1_state, shared_ram)
AM_RANGE(0x800000, 0x80000f) AM_READWRITE(ygv608_r,ygv608_w)
AM_RANGE(0xa00000, 0xa00fff) AM_DEVREADWRITE8("at28c16", at28c16_r, at28c16_w, 0xff00)
#ifdef MAME_DEBUG
@ -222,15 +222,16 @@ GFXDECODE_END
static WRITE16_HANDLER( sharedram_sub_w )
{
COMBINE_DATA(&namcond1_shared_ram[offset]);
namcond1_state *state = space->machine->driver_data<namcond1_state>();
COMBINE_DATA(&state->shared_ram[offset]);
}
static READ16_HANDLER( sharedram_sub_r )
{
return namcond1_shared_ram[offset];
namcond1_state *state = space->machine->driver_data<namcond1_state>();
return state->shared_ram[offset];
}
static int p8;
static READ8_HANDLER( mcu_p7_read )
{
@ -244,7 +245,8 @@ static READ8_HANDLER( mcu_pa_read )
static WRITE8_HANDLER( mcu_pa_write )
{
p8 = data;
namcond1_state *state = space->machine->driver_data<namcond1_state>();
state->p8 = data;
}
/* H8/3002 MCU stuff */
@ -267,10 +269,11 @@ ADDRESS_MAP_END
static INTERRUPT_GEN( mcu_interrupt )
{
if( namcond1_h8_irq5_enabled )
{
generic_pulse_irq_line(device, H8_IRQ5);
}
namcond1_state *state = device->machine->driver_data<namcond1_state>();
if( state->h8_irq5_enabled )
{
generic_pulse_irq_line(device, H8_IRQ5);
}
}
/******************************************
@ -281,7 +284,7 @@ static INTERRUPT_GEN( mcu_interrupt )
- The level 1 interrupt to the 68k has been measured at 60Hz.
*******************************************/
static MACHINE_CONFIG_START( namcond1, driver_device )
static MACHINE_CONFIG_START( namcond1, namcond1_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, 12288000)

View File

@ -366,9 +366,6 @@ Boards:
#define VBSTART (224) /*(224+16)*/
static UINT8 cannonb_bit_to_read;
/*************************************
*
* Machine init
@ -546,11 +543,11 @@ static READ8_HANDLER( alibaba_mystery_1_r )
static READ8_HANDLER( alibaba_mystery_2_r )
{
pacman_state *state = space->machine->driver_data<pacman_state>();
/* The single bit return value determines when the mystery is lit up.
This is certainly wrong */
static int mystery = 0;
mystery++;
return (mystery >> 10) & 1;
state->mystery++;
return (state->mystery >> 10) & 1;
}
@ -654,8 +651,8 @@ static READ8_HANDLER( korosuke_special_port3_r )
static READ8_HANDLER( mschamp_kludge_r )
{
static UINT8 counter;
return counter++;
pacman_state *state = space->machine->driver_data<pacman_state>();
return state->counter++;
}
/************************************
@ -664,20 +661,21 @@ static READ8_HANDLER( mschamp_kludge_r )
*
************************************/
static int bigbucks_bank = 0;
static WRITE8_HANDLER( bigbucks_bank_w )
{
bigbucks_bank = data;
pacman_state *state = space->machine->driver_data<pacman_state>();
state->bigbucks_bank = data;
}
static READ8_HANDLER( bigbucks_question_r )
{
pacman_state *state = space->machine->driver_data<pacman_state>();
UINT8 *question = space->machine->region("user1")->base();
UINT8 ret;
ret = question[(bigbucks_bank << 16) | (offset ^ 0xffff)];
ret = question[(state->bigbucks_bank << 16) | (offset ^ 0xffff)];
return ret;
}
@ -745,43 +743,49 @@ static READ8_HANDLER( porky_port1_r )
*
************************************/
static UINT8 *rocktrv2_prot_data, rocktrv2_question_bank = 0;
static READ8_HANDLER( rocktrv2_prot1_data_r )
{
return rocktrv2_prot_data[0] >> 4;
pacman_state *state = space->machine->driver_data<pacman_state>();
return state->rocktrv2_prot_data[0] >> 4;
}
static READ8_HANDLER( rocktrv2_prot2_data_r )
{
return rocktrv2_prot_data[1] >> 4;
pacman_state *state = space->machine->driver_data<pacman_state>();
return state->rocktrv2_prot_data[1] >> 4;
}
static READ8_HANDLER( rocktrv2_prot3_data_r )
{
return rocktrv2_prot_data[2] >> 4;
pacman_state *state = space->machine->driver_data<pacman_state>();
return state->rocktrv2_prot_data[2] >> 4;
}
static READ8_HANDLER( rocktrv2_prot4_data_r )
{
return rocktrv2_prot_data[3] >> 4;
pacman_state *state = space->machine->driver_data<pacman_state>();
return state->rocktrv2_prot_data[3] >> 4;
}
static WRITE8_HANDLER( rocktrv2_prot_data_w )
{
rocktrv2_prot_data[offset] = data;
pacman_state *state = space->machine->driver_data<pacman_state>();
state->rocktrv2_prot_data[offset] = data;
}
static WRITE8_HANDLER( rocktrv2_question_bank_w )
{
rocktrv2_question_bank = data;
pacman_state *state = space->machine->driver_data<pacman_state>();
state->rocktrv2_question_bank = data;
}
static READ8_HANDLER( rocktrv2_question_r )
{
pacman_state *state = space->machine->driver_data<pacman_state>();
UINT8 *question = space->machine->region("user1")->base();
return question[offset | (rocktrv2_question_bank * 0x8000)];
return question[offset | (state->rocktrv2_question_bank * 0x8000)];
}
@ -892,8 +896,8 @@ static WRITE8_HANDLER( mspacman_enable_decode_w ) { mspacman_enable_deco
static ADDRESS_MAP_START( pacman_map, ADDRESS_SPACE_PROGRAM, 8 )
//A lot of games don't have an a15 at the cpu. Generally only games with a cpu daughter board can access the full 32k of romspace.
AM_RANGE(0x0000, 0x3fff) AM_MIRROR(0x8000) AM_ROM
AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_videoram_w) AM_BASE(&pacman_videoram)
AM_RANGE(0x4400, 0x47ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_colorram_w) AM_BASE(&pacman_colorram)
AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_videoram_w) AM_BASE_MEMBER(pacman_state, videoram)
AM_RANGE(0x4400, 0x47ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_colorram_w) AM_BASE_MEMBER(pacman_state, colorram)
AM_RANGE(0x4800, 0x4bff) AM_MIRROR(0xa000) AM_READ(pacman_read_nop) AM_WRITENOP
AM_RANGE(0x4c00, 0x4fef) AM_MIRROR(0xa000) AM_RAM
AM_RANGE(0x4ff0, 0x4fff) AM_MIRROR(0xa000) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
@ -919,8 +923,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( mspacman_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_videoram_w) AM_BASE(&pacman_videoram)
AM_RANGE(0x4400, 0x47ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_colorram_w) AM_BASE(&pacman_colorram)
AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_videoram_w) AM_BASE_MEMBER(pacman_state, videoram)
AM_RANGE(0x4400, 0x47ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_colorram_w) AM_BASE_MEMBER(pacman_state, colorram)
AM_RANGE(0x4800, 0x4bff) AM_MIRROR(0xa000) AM_READ(pacman_read_nop) AM_WRITENOP
AM_RANGE(0x4c00, 0x4fef) AM_MIRROR(0xa000) AM_RAM
AM_RANGE(0x4ff0, 0x4fff) AM_MIRROR(0xa000) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
@ -959,8 +963,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( woodpek_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_videoram_w) AM_BASE(&pacman_videoram)
AM_RANGE(0x4400, 0x47ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_colorram_w) AM_BASE(&pacman_colorram)
AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_videoram_w) AM_BASE_MEMBER(pacman_state, videoram)
AM_RANGE(0x4400, 0x47ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_colorram_w) AM_BASE_MEMBER(pacman_state, colorram)
AM_RANGE(0x4800, 0x4bff) AM_MIRROR(0xa000) AM_READ(pacman_read_nop) AM_WRITENOP
AM_RANGE(0x4c00, 0x4fef) AM_MIRROR(0xa000) AM_RAM
AM_RANGE(0x4ff0, 0x4fff) AM_MIRROR(0xa000) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
@ -986,8 +990,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( alibaba_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_videoram_w) AM_BASE(&pacman_videoram)
AM_RANGE(0x4400, 0x47ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_colorram_w) AM_BASE(&pacman_colorram)
AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_videoram_w) AM_BASE_MEMBER(pacman_state, videoram)
AM_RANGE(0x4400, 0x47ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_colorram_w) AM_BASE_MEMBER(pacman_state, colorram)
AM_RANGE(0x4800, 0x4bff) AM_MIRROR(0xa000) AM_READ(pacman_read_nop) AM_WRITENOP
AM_RANGE(0x4c00, 0x4eef) AM_MIRROR(0xa000) AM_RAM
AM_RANGE(0x4ef0, 0x4eff) AM_MIRROR(0xa000) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
@ -1018,8 +1022,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( dremshpr_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_videoram_w) AM_BASE(&pacman_videoram)
AM_RANGE(0x4400, 0x47ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_colorram_w) AM_BASE(&pacman_colorram)
AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_videoram_w) AM_BASE_MEMBER(pacman_state, videoram)
AM_RANGE(0x4400, 0x47ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_colorram_w) AM_BASE_MEMBER(pacman_state, colorram)
AM_RANGE(0x4800, 0x4fef) AM_MIRROR(0xa000) AM_RAM
AM_RANGE(0x4ff0, 0x4fff) AM_MIRROR(0xa000) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
AM_RANGE(0x5000, 0x5000) AM_MIRROR(0xaf38) AM_WRITE(interrupt_enable_w)
@ -1048,8 +1052,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( epos_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_MIRROR(0x8000) AM_ROMBANK("bank1")
AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_videoram_w) AM_BASE(&pacman_videoram)
AM_RANGE(0x4400, 0x47ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_colorram_w) AM_BASE(&pacman_colorram)
AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_videoram_w) AM_BASE_MEMBER(pacman_state, videoram)
AM_RANGE(0x4400, 0x47ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_colorram_w) AM_BASE_MEMBER(pacman_state, colorram)
AM_RANGE(0x4800, 0x4bff) AM_MIRROR(0xa000) AM_READ(pacman_read_nop) AM_WRITENOP
AM_RANGE(0x4c00, 0x4fef) AM_MIRROR(0xa000) AM_RAM
AM_RANGE(0x4ff0, 0x4fff) AM_MIRROR(0xa000) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
@ -1074,11 +1078,11 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( s2650games_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x0fff) AM_MIRROR(0x8000) AM_ROMBANK("bank1")
AM_RANGE(0x1000, 0x13ff) AM_MIRROR(0xe000) AM_WRITE(s2650games_colorram_w) AM_BASE(&pacman_colorram)
AM_RANGE(0x1000, 0x13ff) AM_MIRROR(0xe000) AM_WRITE(s2650games_colorram_w) AM_BASE_MEMBER(pacman_state, colorram)
AM_RANGE(0x1400, 0x141f) AM_MIRROR(0xe000) AM_WRITE(s2650games_scroll_w)
AM_RANGE(0x1420, 0x148f) AM_MIRROR(0xe000) AM_WRITEONLY
AM_RANGE(0x1490, 0x149f) AM_MIRROR(0xe000) AM_WRITEONLY AM_BASE(&s2650games_spriteram)
AM_RANGE(0x14a0, 0x14bf) AM_MIRROR(0xe000) AM_WRITE(s2650games_tilesbank_w) AM_BASE(&s2650games_tileram)
AM_RANGE(0x1490, 0x149f) AM_MIRROR(0xe000) AM_WRITEONLY AM_BASE_MEMBER(pacman_state, s2650games_spriteram)
AM_RANGE(0x14a0, 0x14bf) AM_MIRROR(0xe000) AM_WRITE(s2650games_tilesbank_w) AM_BASE_MEMBER(pacman_state, s2650games_tileram)
AM_RANGE(0x14c0, 0x14ff) AM_MIRROR(0xe000) AM_WRITEONLY
AM_RANGE(0x1500, 0x1502) AM_MIRROR(0xe000) AM_WRITENOP
AM_RANGE(0x1503, 0x1503) AM_MIRROR(0xe000) AM_WRITE(pacman_flipscreen_w)
@ -1093,7 +1097,7 @@ static ADDRESS_MAP_START( s2650games_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x1500, 0x1500) AM_MIRROR(0xe000) AM_READ_PORT("IN0")
AM_RANGE(0x1540, 0x1540) AM_MIRROR(0xe000) AM_READ_PORT("IN1")
AM_RANGE(0x1580, 0x1580) AM_MIRROR(0xe000) AM_READ_PORT("DSW0")
AM_RANGE(0x1800, 0x1bff) AM_MIRROR(0xe000) AM_WRITE(s2650games_videoram_w) AM_BASE(&pacman_videoram)
AM_RANGE(0x1800, 0x1bff) AM_MIRROR(0xe000) AM_WRITE(s2650games_videoram_w) AM_BASE_MEMBER(pacman_state, videoram)
AM_RANGE(0x1c00, 0x1fef) AM_MIRROR(0xe000) AM_RAM
AM_RANGE(0x1ff0, 0x1fff) AM_MIRROR(0xe000) AM_WRITEONLY AM_BASE_SIZE_GENERIC(spriteram)
AM_RANGE(0x2000, 0x2fff) AM_MIRROR(0x8000) AM_ROMBANK("bank2")
@ -1104,8 +1108,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( rocktrv2_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x4000, 0x43ff) AM_RAM_WRITE(pacman_videoram_w) AM_BASE(&pacman_videoram)
AM_RANGE(0x4400, 0x47ff) AM_RAM_WRITE(pacman_colorram_w) AM_BASE(&pacman_colorram)
AM_RANGE(0x4000, 0x43ff) AM_RAM_WRITE(pacman_videoram_w) AM_BASE_MEMBER(pacman_state, videoram)
AM_RANGE(0x4400, 0x47ff) AM_RAM_WRITE(pacman_colorram_w) AM_BASE_MEMBER(pacman_state, colorram)
AM_RANGE(0x4c00, 0x4fff) AM_RAM
AM_RANGE(0x5000, 0x5000) AM_WRITE(interrupt_enable_w)
AM_RANGE(0x5001, 0x5001) AM_DEVWRITE("namco", pacman_sound_enable_w)
@ -1113,7 +1117,7 @@ static ADDRESS_MAP_START( rocktrv2_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x5007, 0x5007) AM_WRITE(pacman_coin_counter_w)
AM_RANGE(0x5040, 0x505f) AM_DEVWRITE("namco", pacman_sound_w)
AM_RANGE(0x50c0, 0x50c0) AM_WRITE(watchdog_reset_w)
AM_RANGE(0x5fe0, 0x5fe3) AM_WRITE(rocktrv2_prot_data_w) AM_BASE(&rocktrv2_prot_data)
AM_RANGE(0x5fe0, 0x5fe3) AM_WRITE(rocktrv2_prot_data_w) AM_BASE_MEMBER(pacman_state, rocktrv2_prot_data)
AM_RANGE(0x5ff0, 0x5ff0) AM_WRITE(rocktrv2_question_bank_w)
AM_RANGE(0x5000, 0x5000) AM_READ_PORT("IN0") /* IN0 */
AM_RANGE(0x5040, 0x507f) AM_READ_PORT("IN1") /* IN1 */
@ -1131,8 +1135,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( bigbucks_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x4000, 0x43ff) AM_RAM_WRITE(pacman_videoram_w) AM_BASE(&pacman_videoram)
AM_RANGE(0x4400, 0x47ff) AM_RAM_WRITE(pacman_colorram_w) AM_BASE(&pacman_colorram)
AM_RANGE(0x4000, 0x43ff) AM_RAM_WRITE(pacman_videoram_w) AM_BASE_MEMBER(pacman_state, videoram)
AM_RANGE(0x4400, 0x47ff) AM_RAM_WRITE(pacman_colorram_w) AM_BASE_MEMBER(pacman_state, colorram)
AM_RANGE(0x4c00, 0x4fff) AM_RAM
AM_RANGE(0x5000, 0x5000) AM_WRITE(interrupt_enable_w)
AM_RANGE(0x5001, 0x5001) AM_DEVWRITE("namco", pacman_sound_enable_w)
@ -1152,8 +1156,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( mschamp_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_ROMBANK("bank1")
AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_videoram_w) AM_BASE(&pacman_videoram)
AM_RANGE(0x4400, 0x47ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_colorram_w) AM_BASE(&pacman_colorram)
AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_videoram_w) AM_BASE_MEMBER(pacman_state, videoram)
AM_RANGE(0x4400, 0x47ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_colorram_w) AM_BASE_MEMBER(pacman_state, colorram)
AM_RANGE(0x4800, 0x4bff) AM_MIRROR(0xa000) AM_READ(pacman_read_nop) AM_WRITENOP
AM_RANGE(0x4c00, 0x4fef) AM_MIRROR(0xa000) AM_RAM
AM_RANGE(0x4ff0, 0x4fff) AM_MIRROR(0xa000) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
@ -1179,8 +1183,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( crushs_map, ADDRESS_SPACE_PROGRAM, 8 )
//A lot of games don't have an a15 at the cpu. Generally only games with a cpu daughter board can access the full 32k of romspace.
AM_RANGE(0x0000, 0x3fff) AM_MIRROR(0x8000) AM_ROM
AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_videoram_w) AM_BASE(&pacman_videoram)
AM_RANGE(0x4400, 0x47ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_colorram_w) AM_BASE(&pacman_colorram)
AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_videoram_w) AM_BASE_MEMBER(pacman_state, videoram)
AM_RANGE(0x4400, 0x47ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_colorram_w) AM_BASE_MEMBER(pacman_state, colorram)
AM_RANGE(0x4800, 0x4bff) AM_MIRROR(0xa000) AM_READ(pacman_read_nop) AM_WRITENOP
AM_RANGE(0x4c00, 0x4fef) AM_MIRROR(0xa000) AM_RAM
AM_RANGE(0x4ff0, 0x4fff) AM_MIRROR(0xa000) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
@ -3137,7 +3141,7 @@ static const namco_interface namco_config =
*
*************************************/
static MACHINE_CONFIG_START( pacman, driver_device )
static MACHINE_CONFIG_START( pacman, pacman_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK/6)
@ -5656,6 +5660,7 @@ static DRIVER_INIT( mspacmbe )
static READ8_HANDLER( cannonbp_protection_r )
{
pacman_state *state = space->machine->driver_data<pacman_state>();
/* At 6p where a rom would usually be there is an epoxy resin chip with 'Novomatic Industrie' Cannon Ball tm 1984 label. */
/* As I have no clue about what shall be in this chip, what follows is only a simulation which is enough to play the game. */
@ -5682,11 +5687,11 @@ static READ8_HANDLER( cannonbp_protection_r )
2BA3: 00 nop
*/
case 0x0004:
cannonb_bit_to_read = 7;
state->cannonb_bit_to_read = 7;
return 0x00;
case 0x0001: // affects the ball hitting the blocks as well as jump address after bonus round
if (cpu_get_pc(space->cpu) == 0x2b97)
return (BIT(0x46, cannonb_bit_to_read--) << 7);
return (BIT(0x46, state->cannonb_bit_to_read--) << 7);
else
return 0xff; /* value taken from the bootlegs */

View File

@ -68,11 +68,11 @@
#include "sound/namco.h"
class pengo_state : public driver_device
class pengo_state : public pacman_state
{
public:
pengo_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
: pacman_state(machine, config) { }
UINT8 *spriteram;
UINT8 *spriteram2;
@ -111,8 +111,8 @@ public:
static ADDRESS_MAP_START( pengo_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x83ff) AM_RAM_WRITE(pacman_videoram_w) AM_BASE(&pacman_videoram) /* video and color RAM, scratchpad RAM, sprite codes */
AM_RANGE(0x8400, 0x87ff) AM_RAM_WRITE(pacman_colorram_w) AM_BASE(&pacman_colorram)
AM_RANGE(0x8000, 0x83ff) AM_RAM_WRITE(pacman_videoram_w) AM_BASE_MEMBER(pengo_state, videoram) /* video and color RAM, scratchpad RAM, sprite codes */
AM_RANGE(0x8400, 0x87ff) AM_RAM_WRITE(pacman_colorram_w) AM_BASE_MEMBER(pengo_state, colorram)
AM_RANGE(0x8800, 0x8fef) AM_RAM
AM_RANGE(0x8ff0, 0x8fff) AM_RAM AM_BASE_SIZE_MEMBER(pengo_state, spriteram, spriteram_size)
AM_RANGE(0x9000, 0x901f) AM_DEVWRITE("namco", pacman_sound_w)
@ -134,7 +134,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( jrpacmbl_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x87ff) AM_RAM_WRITE(jrpacman_videoram_w) AM_BASE(&pacman_videoram)
AM_RANGE(0x8000, 0x87ff) AM_RAM_WRITE(jrpacman_videoram_w) AM_BASE_MEMBER(pengo_state, videoram)
AM_RANGE(0x8800, 0x8fef) AM_RAM
AM_RANGE(0x8ff0, 0x8fff) AM_RAM AM_BASE_SIZE_MEMBER(pengo_state, spriteram, spriteram_size)
AM_RANGE(0x9000, 0x901f) AM_DEVWRITE("namco", pacman_sound_w)

View File

@ -739,45 +739,25 @@ Notes:
#include "machine/seibuspi.h"
#include "includes/seibuspi.h"
UINT32 *spimainram;
static intel_e28f008sa_device *flash[2];
static UINT8 *z80_rom;
/********************************************************************/
static int z80_prg_fifo_pos = 0;
static int z80_lastbank;
#define FIFO_SIZE 512
static int fifoin_rpos, fifoin_wpos;
static UINT8 fifoin_data[FIFO_SIZE];
static int fifoin_read_request = 0;
static int fifoout_rpos, fifoout_wpos;
static UINT8 fifoout_data[FIFO_SIZE];
static int fifoout_read_request = 0;
static UINT8 sb_coin_latch = 0;
static UINT8 ejsakura_input_port = 0;
static UINT8 z80_fifoout_pop(address_space *space)
{
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
UINT8 r;
if (fifoout_wpos == fifoout_rpos)
if (state->fifoout_wpos == state->fifoout_rpos)
{
logerror("Sound FIFOOUT underflow at %08X\n", cpu_get_pc(space->cpu));
}
r = fifoout_data[fifoout_rpos++];
if(fifoout_rpos == FIFO_SIZE)
r = state->fifoout_data[state->fifoout_rpos++];
if(state->fifoout_rpos == FIFO_SIZE)
{
fifoout_rpos = 0;
state->fifoout_rpos = 0;
}
if (fifoout_wpos == fifoout_rpos)
if (state->fifoout_wpos == state->fifoout_rpos)
{
fifoout_read_request = 0;
state->fifoout_read_request = 0;
}
return r;
@ -785,35 +765,37 @@ static UINT8 z80_fifoout_pop(address_space *space)
static void z80_fifoout_push(address_space *space, UINT8 data)
{
fifoout_data[fifoout_wpos++] = data;
if (fifoout_wpos == FIFO_SIZE)
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
state->fifoout_data[state->fifoout_wpos++] = data;
if (state->fifoout_wpos == FIFO_SIZE)
{
fifoout_wpos = 0;
state->fifoout_wpos = 0;
}
if(fifoout_wpos == fifoout_rpos)
if(state->fifoout_wpos == state->fifoout_rpos)
{
fatalerror("Sound FIFOOUT overflow at %08X", cpu_get_pc(space->cpu));
}
fifoout_read_request = 1;
state->fifoout_read_request = 1;
}
static UINT8 z80_fifoin_pop(address_space *space)
{
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
UINT8 r;
if (fifoin_wpos == fifoin_rpos)
if (state->fifoin_wpos == state->fifoin_rpos)
{
fatalerror("Sound FIFOIN underflow at %08X", cpu_get_pc(space->cpu));
}
r = fifoin_data[fifoin_rpos++];
if(fifoin_rpos == FIFO_SIZE)
r = state->fifoin_data[state->fifoin_rpos++];
if(state->fifoin_rpos == FIFO_SIZE)
{
fifoin_rpos = 0;
state->fifoin_rpos = 0;
}
if (fifoin_wpos == fifoin_rpos)
if (state->fifoin_wpos == state->fifoin_rpos)
{
fifoin_read_request = 0;
state->fifoin_read_request = 0;
}
return r;
@ -821,33 +803,36 @@ static UINT8 z80_fifoin_pop(address_space *space)
static void z80_fifoin_push(address_space *space, UINT8 data)
{
fifoin_data[fifoin_wpos++] = data;
if(fifoin_wpos == FIFO_SIZE)
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
state->fifoin_data[state->fifoin_wpos++] = data;
if(state->fifoin_wpos == FIFO_SIZE)
{
fifoin_wpos = 0;
state->fifoin_wpos = 0;
}
if(fifoin_wpos == fifoin_rpos)
if(state->fifoin_wpos == state->fifoin_rpos)
{
fatalerror("Sound FIFOIN overflow at %08X", cpu_get_pc(space->cpu));
}
fifoin_read_request = 1;
state->fifoin_read_request = 1;
}
static READ32_HANDLER( sb_coin_r )
{
UINT8 r = sb_coin_latch;
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
UINT8 r = state->sb_coin_latch;
sb_coin_latch = 0;
state->sb_coin_latch = 0;
return r;
}
static WRITE8_HANDLER( sb_coin_w )
{
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
if (data)
sb_coin_latch = 0xa0 | data;
state->sb_coin_latch = 0xa0 | data;
else
sb_coin_latch = 0;
state->sb_coin_latch = 0;
}
static READ32_HANDLER( sound_fifo_r )
@ -866,8 +851,9 @@ static WRITE32_HANDLER( sound_fifo_w )
static READ32_HANDLER( sound_fifo_status_r )
{
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
UINT32 r = 0;
if (fifoout_read_request)
if (state->fifoout_read_request)
{
r |= 2;
}
@ -891,7 +877,7 @@ static WRITE32_DEVICE_HANDLER( eeprom_w )
// tile banks
if( ACCESSING_BITS_16_23 ) {
rf2_set_layer_banks(data >> 16);
rf2_set_layer_banks(device->machine, data >> 16);
eeprom_write_bit(device, (data & 0x800000) ? 1 : 0);
eeprom_set_clock_line(device, (data & 0x400000) ? ASSERT_LINE : CLEAR_LINE);
eeprom_set_cs_line(device, (data & 0x200000) ? CLEAR_LINE : ASSERT_LINE);
@ -904,23 +890,25 @@ static WRITE32_DEVICE_HANDLER( eeprom_w )
static WRITE32_HANDLER( z80_prg_fifo_w )
{
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
if( ACCESSING_BITS_0_7 ) {
if (z80_prg_fifo_pos<0x40000) z80_rom[z80_prg_fifo_pos] = data & 0xff;
z80_prg_fifo_pos++;
if (state->z80_prg_fifo_pos<0x40000) state->z80_rom[state->z80_prg_fifo_pos] = data & 0xff;
state->z80_prg_fifo_pos++;
}
}
static WRITE32_HANDLER( z80_enable_w )
{
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
// tile banks
if( ACCESSING_BITS_16_23 ) {
rf2_set_layer_banks(data >> 16);
rf2_set_layer_banks(space->machine, data >> 16);
}
logerror("z80 data = %08x mask = %08x\n",data,mem_mask);
if( ACCESSING_BITS_0_7 ) {
if( data & 0x1 ) {
z80_prg_fifo_pos = 0;
state->z80_prg_fifo_pos = 0;
cputag_set_input_line(space->machine, "soundcpu", INPUT_LINE_RESET, CLEAR_LINE );
} else {
cputag_set_input_line(space->machine, "soundcpu", INPUT_LINE_RESET, ASSERT_LINE );
@ -948,7 +936,8 @@ static READ32_HANDLER( spi_controls2_r )
static CUSTOM_INPUT( ejsakura_keyboard_r )
{
switch(ejsakura_input_port)
seibuspi_state *state = field->port->machine->driver_data<seibuspi_state>();
switch(state->ejsakura_input_port)
{
case 0x01:
return input_port_read(field->port->machine, "INPUT01");
@ -981,8 +970,9 @@ static WRITE8_HANDLER( z80_soundfifo_w )
static READ8_HANDLER( z80_soundfifo_status_r )
{
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
UINT8 r = 0;
if (fifoin_read_request)
if (state->fifoin_read_request)
{
r |= 2;
}
@ -991,10 +981,11 @@ static READ8_HANDLER( z80_soundfifo_status_r )
static WRITE8_HANDLER( z80_bank_w )
{
if ((data & 7) != z80_lastbank)
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
if ((data & 7) != state->z80_lastbank)
{
z80_lastbank = (data & 7);
memory_set_bankptr(space->machine, "bank4", z80_rom + (0x8000 * z80_lastbank));
state->z80_lastbank = (data & 7);
memory_set_bankptr(space->machine, "bank4", state->z80_rom + (0x8000 * state->z80_lastbank));
}
}
@ -1044,7 +1035,7 @@ static ADDRESS_MAP_START( spi_map, ADDRESS_SPACE_PROGRAM, 32 )
AM_RANGE(0x00000418, 0x0000041b) AM_READWRITE(spi_layer_bank_r, spi_layer_bank_w)
AM_RANGE(0x0000041c, 0x0000041f) AM_READNOP
AM_RANGE(0x0000041c, 0x0000041f) AM_WRITE(spi_layer_enable_w)
AM_RANGE(0x00000420, 0x0000042b) AM_RAM AM_BASE(&spi_scrollram)
AM_RANGE(0x00000420, 0x0000042b) AM_RAM AM_BASE_MEMBER(seibuspi_state, spi_scrollram)
AM_RANGE(0x00000480, 0x00000483) AM_WRITE(tilemap_dma_start_w)
AM_RANGE(0x00000484, 0x00000487) AM_WRITE(palette_dma_start_w)
AM_RANGE(0x00000490, 0x00000493) AM_WRITE(video_dma_length_w)
@ -1062,7 +1053,7 @@ static ADDRESS_MAP_START( spi_map, ADDRESS_SPACE_PROGRAM, 32 )
AM_RANGE(0x000006d4, 0x000006d7) AM_DEVWRITE8("ds2404", ds2404_data_w, 0x000000ff)
AM_RANGE(0x000006d8, 0x000006db) AM_DEVWRITE8("ds2404", ds2404_clk_w, 0x000000ff)
AM_RANGE(0x000006dc, 0x000006df) AM_DEVREAD8("ds2404", ds2404_data_r, 0x000000ff)
AM_RANGE(0x00000800, 0x0003ffff) AM_RAM AM_BASE(&spimainram)
AM_RANGE(0x00000800, 0x0003ffff) AM_RAM AM_BASE_MEMBER(seibuspi_state, spimainram)
AM_RANGE(0x00200000, 0x003fffff) AM_ROM AM_SHARE("share2")
AM_RANGE(0x00a00000, 0x013fffff) AM_READ(soundrom_r)
AM_RANGE(0xffe00000, 0xffffffff) AM_ROM AM_REGION("user1", 0) AM_SHARE("share2") /* ROM location in real-mode */
@ -1085,28 +1076,30 @@ ADDRESS_MAP_END
static READ8_DEVICE_HANDLER( flashrom_read )
{
seibuspi_state *state = device->machine->driver_data<seibuspi_state>();
logerror("Flash Read: %08X\n", offset);
if( offset < 0x100000 )
{
return flash[0]->read(offset);
return state->flash[0]->read(offset);
}
else if( offset < 0x200000 )
{
return flash[1]->read(offset - 0x100000 );
return state->flash[1]->read(offset - 0x100000 );
}
return 0;
}
static WRITE8_DEVICE_HANDLER( flashrom_write )
{
seibuspi_state *state = device->machine->driver_data<seibuspi_state>();
logerror("Flash Write: %08X, %02X\n", offset, data);
if( offset < 0x100000 )
{
flash[0]->write(offset + 1, data);
state->flash[0]->write(offset + 1, data);
}
else if( offset < 0x200000 )
{
flash[1]->write(offset - 0x100000 + 1, data);
state->flash[1]->write(offset - 0x100000 + 1, data);
}
}
@ -1139,7 +1132,7 @@ static ADDRESS_MAP_START( seibu386_map, ADDRESS_SPACE_PROGRAM, 32 )
AM_RANGE(0x00000418, 0x0000041b) AM_READWRITE(spi_layer_bank_r, spi_layer_bank_w)
AM_RANGE(0x0000041c, 0x0000041f) AM_READNOP
AM_RANGE(0x0000041c, 0x0000041f) AM_WRITE(spi_layer_enable_w)
AM_RANGE(0x00000420, 0x0000042b) AM_RAM AM_BASE(&spi_scrollram)
AM_RANGE(0x00000420, 0x0000042b) AM_RAM AM_BASE_MEMBER(seibuspi_state, spi_scrollram)
AM_RANGE(0x00000480, 0x00000483) AM_WRITE(tilemap_dma_start_w)
AM_RANGE(0x00000484, 0x00000487) AM_WRITE(palette_dma_start_w)
AM_RANGE(0x00000490, 0x00000493) AM_WRITE(video_dma_length_w)
@ -1150,7 +1143,7 @@ static ADDRESS_MAP_START( seibu386_map, ADDRESS_SPACE_PROGRAM, 32 )
AM_RANGE(0x00000608, 0x0000060b) AM_READ(spi_unknown_r)
AM_RANGE(0x0000060c, 0x0000060f) AM_READ(spi_controls2_r) /* Player controls (start) */
AM_RANGE(0x0000068c, 0x0000068f) AM_DEVWRITE("eeprom", eeprom_w)
AM_RANGE(0x00000800, 0x0003ffff) AM_RAM AM_BASE(&spimainram)
AM_RANGE(0x00000800, 0x0003ffff) AM_RAM AM_BASE_MEMBER(seibuspi_state, spimainram)
AM_RANGE(0x00200000, 0x003fffff) AM_ROM AM_SHARE("share2")
AM_RANGE(0x01200000, 0x01200003) AM_DEVREADWRITE8_MODERN("oki1", okim6295_device, read, write, 0x000000ff)
AM_RANGE(0x01200004, 0x01200007) AM_DEVREADWRITE8_MODERN("oki2", okim6295_device, read, write, 0x000000ff)
@ -1159,7 +1152,8 @@ ADDRESS_MAP_END
static WRITE32_HANDLER(input_select_w)
{
ejsakura_input_port = data;
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
state->ejsakura_input_port = data;
}
static ADDRESS_MAP_START( sys386f2_map, ADDRESS_SPACE_PROGRAM, 32 )
@ -1177,7 +1171,7 @@ static ADDRESS_MAP_START( sys386f2_map, ADDRESS_SPACE_PROGRAM, 32 )
AM_RANGE(0x00000600, 0x00000607) AM_DEVREAD8("ymz", ymz280b_r, 0x000000ff)
AM_RANGE(0x00000608, 0x0000060b) AM_READ(spi_unknown_r)
AM_RANGE(0x0000060c, 0x0000060f) AM_READ(spi_controls1_r) /* Player controls */
AM_RANGE(0x00000800, 0x0003ffff) AM_RAM AM_BASE(&spimainram)
AM_RANGE(0x00000800, 0x0003ffff) AM_RAM AM_BASE_MEMBER(seibuspi_state, spimainram)
AM_RANGE(0x00200000, 0x003fffff) AM_ROM AM_SHARE("share2")
AM_RANGE(0xffe00000, 0xffffffff) AM_ROM AM_REGION("user1", 0) AM_SHARE("share2") /* ROM location in real-mode */
ADDRESS_MAP_END
@ -1816,11 +1810,13 @@ static IRQ_CALLBACK(spi_irq_callback)
static MACHINE_START( spi )
{
z80_rom = auto_alloc_array(machine, UINT8, 0x40000);
seibuspi_state *state = machine->driver_data<seibuspi_state>();
state->z80_rom = auto_alloc_array(machine, UINT8, 0x40000);
}
static MACHINE_RESET( spi )
{
seibuspi_state *state = machine->driver_data<seibuspi_state>();
int i;
UINT8 *sound = machine->region("ymf")->base();
@ -1834,28 +1830,28 @@ static MACHINE_RESET( spi )
memory_install_write32_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x00000688, 0x0000068b, 0, 0, z80_prg_fifo_w);
memory_install_write32_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x0000068c, 0x0000068f, 0, 0, z80_enable_w);
memory_set_bankptr(machine, "bank4", z80_rom);
memory_set_bankptr(machine, "bank5", z80_rom);
memory_set_bankptr(machine, "bank4", state->z80_rom);
memory_set_bankptr(machine, "bank5", state->z80_rom);
/* If the first value doesn't match, the game shows a checksum error */
/* If any of the other values are wrong, the game goes to update mode */
flash[0]->write(0, 0xff);
flash[0]->write(0, 0x10);
flash[0]->write(0, flash_data); /* country code */
state->flash[0]->write(0, 0xff);
state->flash[0]->write(0, 0x10);
state->flash[0]->write(0, flash_data); /* country code */
for (i=0; i < 0x100000; i++)
{
flash[0]->write(0, 0xff);
sound[i] = flash[0]->read(i);
state->flash[0]->write(0, 0xff);
sound[i] = state->flash[0]->read(i);
}
for (i=0; i < 0x100000; i++)
{
flash[1]->write(0, 0xff);
sound[0x100000+i] = flash[1]->read(i);
state->flash[1]->write(0, 0xff);
sound[0x100000+i] = state->flash[1]->read(i);
}
}
static MACHINE_CONFIG_START( spi, driver_device )
static MACHINE_CONFIG_START( spi, seibuspi_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I386, 50000000/2) /* Intel 386DX, 25MHz */
@ -1901,24 +1897,26 @@ MACHINE_CONFIG_END
static MACHINE_START( sxx2f )
{
z80_rom = auto_alloc_array(machine, UINT8, 0x40000);
seibuspi_state *state = machine->driver_data<seibuspi_state>();
state->z80_rom = auto_alloc_array(machine, UINT8, 0x40000);
}
static MACHINE_RESET( sxx2f )
{
seibuspi_state *state = machine->driver_data<seibuspi_state>();
UINT8 *rom = machine->region("soundcpu")->base();
memory_set_bankptr(machine, "bank4", z80_rom);
memory_set_bankptr(machine, "bank5", z80_rom);
memory_set_bankptr(machine, "bank4", state->z80_rom);
memory_set_bankptr(machine, "bank5", state->z80_rom);
memcpy(z80_rom, rom, 0x40000);
memcpy(state->z80_rom, rom, 0x40000);
memory_install_write32_device_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), machine->device("eeprom"), 0x0000068c, 0x0000068f, 0, 0, eeprom_w);
memory_install_read32_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x00000680, 0x00000683, 0, 0, sb_coin_r);
cpu_set_irq_callback(machine->device("maincpu"), spi_irq_callback);
sb_coin_latch = 0;
state->sb_coin_latch = 0;
}
static MACHINE_CONFIG_DERIVED( sxx2f, spi ) /* Intel i386DX @ 25MHz, YMF271 @ 16.9344MHz, Z80 @ 7.159MHz(?) */
@ -1955,18 +1953,21 @@ MACHINE_CONFIG_END
static READ32_HANDLER ( senkyu_speedup_r )
{
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
if (cpu_get_pc(space->cpu)==0x00305bb2) cpu_spinuntil_int(space->cpu); // idle
return spimainram[(0x0018cb4-0x800)/4];
return state->spimainram[(0x0018cb4-0x800)/4];
}
static READ32_HANDLER( senkyua_speedup_r )
{
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
if (cpu_get_pc(space->cpu)== 0x30582e) cpu_spinuntil_int(space->cpu); // idle
return spimainram[(0x0018c9c-0x800)/4];
return state->spimainram[(0x0018c9c-0x800)/4];
}
static READ32_HANDLER ( batlball_speedup_r )
{
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
// printf("cpu_get_pc(space->cpu) %06x\n", cpu_get_pc(space->cpu));
/* batlbalu */
@ -1975,11 +1976,12 @@ static READ32_HANDLER ( batlball_speedup_r )
/* batlball */
if (cpu_get_pc(space->cpu)==0x003058aa) cpu_spinuntil_int(space->cpu); // idle
return spimainram[(0x0018db4-0x800)/4];
return state->spimainram[(0x0018db4-0x800)/4];
}
static READ32_HANDLER ( rdft_speedup_r )
{
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
/* rdft */
if (cpu_get_pc(space->cpu)==0x0203f0a) cpu_spinuntil_int(space->cpu); // idle
@ -1997,11 +1999,12 @@ static READ32_HANDLER ( rdft_speedup_r )
// mame_printf_debug("%08x\n",cpu_get_pc(space->cpu));
return spimainram[(0x00298d0-0x800)/4];
return state->spimainram[(0x00298d0-0x800)/4];
}
static READ32_HANDLER ( viprp1_speedup_r )
{
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
/* viprp1 */
if (cpu_get_pc(space->cpu)==0x0202769) cpu_spinuntil_int(space->cpu); // idle
@ -2013,29 +2016,32 @@ static READ32_HANDLER ( viprp1_speedup_r )
// mame_printf_debug("%08x\n",cpu_get_pc(space->cpu));
return spimainram[(0x001e2e0-0x800)/4];
return state->spimainram[(0x001e2e0-0x800)/4];
}
static READ32_HANDLER ( viprp1o_speedup_r )
{
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
/* viperp1o */
if (cpu_get_pc(space->cpu)==0x0201f99) cpu_spinuntil_int(space->cpu); // idle
// mame_printf_debug("%08x\n",cpu_get_pc(space->cpu));
return spimainram[(0x001d49c-0x800)/4];
return state->spimainram[(0x001d49c-0x800)/4];
}
#ifdef UNUSED_FUNCTION
// causes input problems?
READ32_HANDLER ( ejanhs_speedup_r )
{
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
// mame_printf_debug("%08x\n",cpu_get_pc(space->cpu));
if (cpu_get_pc(space->cpu)==0x03032c7) cpu_spinuntil_int(space->cpu); // idle
return spimainram[(0x002d224-0x800)/4];
return state->spimainram[(0x002d224-0x800)/4];
}
#endif
static READ32_HANDLER ( rf2_speedup_r )
{
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
/* rdft22kc */
if (cpu_get_pc(space->cpu)==0x0203926) cpu_spinuntil_int(space->cpu); // idle
@ -2051,11 +2057,12 @@ static READ32_HANDLER ( rf2_speedup_r )
// mame_printf_debug("%08x\n",cpu_get_pc(space->cpu));
return spimainram[(0x0282AC-0x800)/4];
return state->spimainram[(0x0282AC-0x800)/4];
}
static READ32_HANDLER ( rfjet_speedup_r )
{
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
/* rfjet, rfjetu, rfjeta */
if (cpu_get_pc(space->cpu)==0x0206082) cpu_spinuntil_int(space->cpu); // idle
@ -2065,7 +2072,7 @@ static READ32_HANDLER ( rfjet_speedup_r )
UINT32 r;
cpu_spinuntil_int(space->cpu); // idle
// Hack to enter test mode
r = spimainram[(0x002894c-0x800)/4] & (~0x400);
r = state->spimainram[(0x002894c-0x800)/4] & (~0x400);
return r | (((input_port_read(space->machine, "SYSTEM") ^ 0xff)<<8) & 0x400);
}
@ -2075,13 +2082,14 @@ static READ32_HANDLER ( rfjet_speedup_r )
// mame_printf_debug("%08x\n",cpu_get_pc(space->cpu));
return spimainram[(0x002894c-0x800)/4];
return state->spimainram[(0x002894c-0x800)/4];
}
static void init_spi(running_machine *machine)
{
flash[0] = machine->device<intel_e28f008sa_device>("flash0");
flash[1] = machine->device<intel_e28f008sa_device>("flash1");
seibuspi_state *state = machine->driver_data<seibuspi_state>();
state->flash[0] = machine->device<intel_e28f008sa_device>("flash0");
state->flash[1] = machine->device<intel_e28f008sa_device>("flash1");
seibuspi_text_decrypt(machine->region("gfx1")->base());
seibuspi_bg_decrypt(machine->region("gfx2")->base(), machine->region("gfx2")->bytes());
@ -2142,8 +2150,9 @@ static DRIVER_INIT( viprp1o )
static void init_rf2(running_machine *machine)
{
flash[0] = machine->device<intel_e28f008sa_device>("flash0");
flash[1] = machine->device<intel_e28f008sa_device>("flash1");
seibuspi_state *state = machine->driver_data<seibuspi_state>();
state->flash[0] = machine->device<intel_e28f008sa_device>("flash0");
state->flash[1] = machine->device<intel_e28f008sa_device>("flash1");
memory_install_read32_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x0282AC, 0x0282AF, 0, 0, rf2_speedup_r );
seibuspi_rise10_text_decrypt(machine->region("gfx1")->base());
@ -2166,8 +2175,9 @@ static DRIVER_INIT( rdft2us )
static void init_rfjet(running_machine *machine)
{
flash[0] = machine->device<intel_e28f008sa_device>("flash0");
flash[1] = machine->device<intel_e28f008sa_device>("flash1");
seibuspi_state *state = machine->driver_data<seibuspi_state>();
state->flash[0] = machine->device<intel_e28f008sa_device>("flash0");
state->flash[1] = machine->device<intel_e28f008sa_device>("flash1");
memory_install_read32_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x002894c, 0x002894f, 0, 0, rfjet_speedup_r );
seibuspi_rise11_text_decrypt(machine->region("gfx1")->base());
@ -2199,7 +2209,7 @@ static MACHINE_RESET( seibu386 )
cpu_set_irq_callback(machine->device("maincpu"), spi_irq_callback);
}
static MACHINE_CONFIG_START( seibu386, driver_device )
static MACHINE_CONFIG_START( seibu386, seibuspi_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I386, 40000000) /* AMD 386DX, 40MHz */
@ -2253,7 +2263,7 @@ static DRIVER_INIT( sys386f2 )
}
}
static MACHINE_CONFIG_START( sys386f2, driver_device )
static MACHINE_CONFIG_START( sys386f2, seibuspi_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I386, 25000000) /* 25mhz */

View File

@ -41,15 +41,6 @@ Notes:
#include "includes/tetrisp2.h"
#include "machine/nvram.h"
UINT16 tetrisp2_systemregs[0x10];
static UINT16 rocknms_sub_systemregs[0x10];
static UINT16 rockn_protectdata;
static UINT16 rockn_adpcmbank;
static UINT16 rockn_soundvolume;
static emu_timer *rockn_timer_l4;
static emu_timer *rockn_timer_sub_l4;
/***************************************************************************
@ -61,9 +52,10 @@ static emu_timer *rockn_timer_sub_l4;
static WRITE16_HANDLER( tetrisp2_systemregs_w )
{
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
if (ACCESSING_BITS_0_7)
{
tetrisp2_systemregs[offset] = data;
state->systemregs[offset] = data;
}
}
@ -71,13 +63,14 @@ static WRITE16_HANDLER( tetrisp2_systemregs_w )
static WRITE16_HANDLER( rockn_systemregs_w )
{
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
if (ACCESSING_BITS_0_7)
{
tetrisp2_systemregs[offset] = data;
state->systemregs[offset] = data;
if (offset == 0x0c)
{
attotime timer = ROCKN_TIMER_BASE * (4096 - data);
rockn_timer_l4->adjust(timer, 0, timer);
state->rockn_timer_l4->adjust(timer, 0, timer);
}
}
}
@ -85,13 +78,14 @@ static WRITE16_HANDLER( rockn_systemregs_w )
static WRITE16_HANDLER( rocknms_sub_systemregs_w )
{
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
if (ACCESSING_BITS_0_7)
{
rocknms_sub_systemregs[offset] = data;
state->rocknms_sub_systemregs[offset] = data;
if (offset == 0x0c)
{
attotime timer = ROCKN_TIMER_BASE * (4096 - data);
rockn_timer_sub_l4->adjust(timer, 0, timer);
state->rockn_timer_sub_l4->adjust(timer, 0, timer);
}
}
}
@ -107,15 +101,17 @@ static WRITE16_HANDLER( rocknms_sub_systemregs_w )
static READ16_HANDLER( rockn_adpcmbank_r )
{
return ((rockn_adpcmbank & 0xf0ff) | (rockn_protectdata << 8));
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
return ((state->rockn_adpcmbank & 0xf0ff) | (state->rockn_protectdata << 8));
}
static WRITE16_HANDLER( rockn_adpcmbank_w )
{
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
UINT8 *SNDROM = space->machine->region("ymz")->base();
int bank;
rockn_adpcmbank = data;
state->rockn_adpcmbank = data;
bank = ((data & 0x001f) >> 2);
if (bank > 7)
@ -129,6 +125,7 @@ static WRITE16_HANDLER( rockn_adpcmbank_w )
static WRITE16_HANDLER( rockn2_adpcmbank_w )
{
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
UINT8 *SNDROM = space->machine->region("ymz")->base();
int bank;
@ -145,7 +142,7 @@ static WRITE16_HANDLER( rockn2_adpcmbank_w )
{ 0, 5, 14 }, // bank $20
};
rockn_adpcmbank = data;
state->rockn_adpcmbank = data;
bank = ((data & 0x003f) >> 2);
if (bank > 8)
@ -167,13 +164,14 @@ static READ16_HANDLER( rockn_soundvolume_r )
static WRITE16_HANDLER( rockn_soundvolume_w )
{
rockn_soundvolume = data;
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
state->rockn_soundvolume = data;
}
static WRITE16_HANDLER( nndmseal_sound_bank_w )
{
static int bank_lo, bank_hi;
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
if (ACCESSING_BITS_0_7)
{
@ -181,19 +179,19 @@ static WRITE16_HANDLER( nndmseal_sound_bank_w )
if (data & 0x04)
{
bank_lo = data & 0x03;
state->bank_lo = data & 0x03;
memcpy(space->machine->region("oki")->base(), rom + (bank_lo * 0x80000), 0x20000);
memcpy(space->machine->region("oki")->base(), rom + (state->bank_lo * 0x80000), 0x20000);
// logerror("PC:%06X sound bank_lo = %02X\n",cpu_get_pc(space->cpu),bank_lo);
// logerror("PC:%06X sound bank_lo = %02X\n",cpu_get_pc(space->cpu),state->bank_lo);
}
else
{
bank_hi = data & 0x03;
state->bank_hi = data & 0x03;
memcpy(space->machine->region("oki")->base() + 0x20000, rom + (bank_lo * 0x80000) + (bank_hi * 0x20000), 0x20000);
memcpy(space->machine->region("oki")->base() + 0x20000, rom + (state->bank_lo * 0x80000) + (state->bank_hi * 0x20000), 0x20000);
// logerror("PC:%06X sound bank_hi = %02X\n",cpu_get_pc(space->cpu),bank_hi);
// logerror("PC:%06X sound bank_hi = %02X\n",cpu_get_pc(space->cpu),state->bank_hi);
}
}
}
@ -222,24 +220,26 @@ static READ16_HANDLER( tetrisp2_ip_1_word_r )
***************************************************************************/
static UINT16 *tetrisp2_nvram;
/* The game only ever writes even bytes and reads odd bytes */
static READ16_HANDLER( tetrisp2_nvram_r )
{
return ( (tetrisp2_nvram[offset] >> 8) & 0x00ff ) |
( (tetrisp2_nvram[offset] << 8) & 0xff00 ) ;
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
return ( (state->nvram[offset] >> 8) & 0x00ff ) |
( (state->nvram[offset] << 8) & 0xff00 ) ;
}
static WRITE16_HANDLER( tetrisp2_nvram_w )
{
COMBINE_DATA(&tetrisp2_nvram[offset]);
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
COMBINE_DATA(&state->nvram[offset]);
}
static READ16_HANDLER( rockn_nvram_r )
{
return tetrisp2_nvram[offset];
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
return state->nvram[offset];
}
@ -251,29 +251,31 @@ static READ16_HANDLER( rockn_nvram_r )
***************************************************************************/
static UINT16 rocknms_main2sub;
static UINT16 rocknms_sub2main;
static READ16_HANDLER( rocknms_main2sub_r )
{
return rocknms_main2sub;
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
return state->rocknms_main2sub;
}
static WRITE16_HANDLER( rocknms_main2sub_w )
{
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
if (ACCESSING_BITS_0_7)
rocknms_main2sub = (data ^ 0xffff);
state->rocknms_main2sub = (data ^ 0xffff);
}
static CUSTOM_INPUT( rocknms_main2sub_status_r )
{
return rocknms_sub2main & 0x0003;
tetrisp2_state *state = field->port->machine->driver_data<tetrisp2_state>();
return state->rocknms_sub2main & 0x0003;
}
static WRITE16_HANDLER( rocknms_sub2main_w )
{
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
if (ACCESSING_BITS_0_7)
rocknms_sub2main = (data ^ 0xffff);
state->rocknms_sub2main = (data ^ 0xffff);
}
@ -299,21 +301,21 @@ static ADDRESS_MAP_START( tetrisp2_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x108000, 0x10ffff) AM_RAM // Work RAM
AM_RANGE(0x200000, 0x23ffff) AM_READWRITE8(tetrisp2_priority_r, tetrisp2_priority_w, 0x00ff)
AM_RANGE(0x300000, 0x31ffff) AM_RAM_WRITE(tetrisp2_palette_w) AM_BASE_GENERIC(paletteram) // Palette
AM_RANGE(0x400000, 0x403fff) AM_RAM_WRITE(tetrisp2_vram_fg_w) AM_BASE(&tetrisp2_vram_fg) // Foreground
AM_RANGE(0x404000, 0x407fff) AM_RAM_WRITE(tetrisp2_vram_bg_w) AM_BASE(&tetrisp2_vram_bg) // Background
AM_RANGE(0x400000, 0x403fff) AM_RAM_WRITE(tetrisp2_vram_fg_w) AM_BASE_MEMBER(tetrisp2_state, vram_fg) // Foreground
AM_RANGE(0x404000, 0x407fff) AM_RAM_WRITE(tetrisp2_vram_bg_w) AM_BASE_MEMBER(tetrisp2_state, vram_bg) // Background
AM_RANGE(0x408000, 0x409fff) AM_RAM // ???
AM_RANGE(0x500000, 0x50ffff) AM_RAM // Line
AM_RANGE(0x600000, 0x60ffff) AM_RAM_WRITE(tetrisp2_vram_rot_w) AM_BASE(&tetrisp2_vram_rot) // Rotation
AM_RANGE(0x600000, 0x60ffff) AM_RAM_WRITE(tetrisp2_vram_rot_w) AM_BASE_MEMBER(tetrisp2_state, vram_rot) // Rotation
AM_RANGE(0x650000, 0x651fff) AM_RAM_WRITE(tetrisp2_vram_rot_w) // Rotation (mirror)
AM_RANGE(0x800000, 0x800003) AM_DEVREADWRITE8("ymz", ymz280b_r, ymz280b_w, 0x00ff) // Sound
AM_RANGE(0x900000, 0x903fff) AM_READWRITE(tetrisp2_nvram_r, tetrisp2_nvram_w) AM_BASE(&tetrisp2_nvram) AM_SHARE("nvram") // NVRAM
AM_RANGE(0x900000, 0x903fff) AM_READWRITE(tetrisp2_nvram_r, tetrisp2_nvram_w) AM_BASE_MEMBER(tetrisp2_state, nvram) AM_SHARE("nvram") // NVRAM
AM_RANGE(0x904000, 0x907fff) AM_READWRITE(tetrisp2_nvram_r, tetrisp2_nvram_w) // NVRAM (mirror)
AM_RANGE(0xb00000, 0xb00001) AM_WRITE(tetrisp2_coincounter_w) // Coin Counter
AM_RANGE(0xb20000, 0xb20001) AM_WRITENOP // ???
AM_RANGE(0xb40000, 0xb4000b) AM_WRITEONLY AM_BASE(&tetrisp2_scroll_fg) // Foreground Scrolling
AM_RANGE(0xb40010, 0xb4001b) AM_WRITEONLY AM_BASE(&tetrisp2_scroll_bg) // Background Scrolling
AM_RANGE(0xb40000, 0xb4000b) AM_WRITEONLY AM_BASE_MEMBER(tetrisp2_state, scroll_fg) // Foreground Scrolling
AM_RANGE(0xb40010, 0xb4001b) AM_WRITEONLY AM_BASE_MEMBER(tetrisp2_state, scroll_bg) // Background Scrolling
AM_RANGE(0xb4003e, 0xb4003f) AM_WRITENOP // scr_size
AM_RANGE(0xb60000, 0xb6002f) AM_WRITEONLY AM_BASE(&tetrisp2_rotregs) // Rotation Registers
AM_RANGE(0xb60000, 0xb6002f) AM_WRITEONLY AM_BASE_MEMBER(tetrisp2_state, rotregs) // Rotation Registers
AM_RANGE(0xba0000, 0xba001f) AM_WRITE(tetrisp2_systemregs_w) // system param
AM_RANGE(0xba001a, 0xba001b) AM_WRITENOP // Lev 4 irq ack
AM_RANGE(0xba001e, 0xba001f) AM_WRITENOP // Lev 2 irq ack
@ -357,27 +359,27 @@ static ADDRESS_MAP_START( nndmseal_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x200000, 0x23ffff) AM_WRITE8(tetrisp2_priority_w, 0x00ff) // Priority
AM_RANGE(0x200000, 0x23ffff) AM_READ(nndmseal_priority_r)
AM_RANGE(0x300000, 0x31ffff) AM_RAM_WRITE(tetrisp2_palette_w) AM_BASE_GENERIC(paletteram) // Palette
AM_RANGE(0x400000, 0x403fff) AM_RAM_WRITE(tetrisp2_vram_fg_w) AM_BASE(&tetrisp2_vram_fg ) // Foreground
AM_RANGE(0x404000, 0x407fff) AM_RAM_WRITE(tetrisp2_vram_bg_w) AM_BASE(&tetrisp2_vram_bg ) // Background
AM_RANGE(0x400000, 0x403fff) AM_RAM_WRITE(tetrisp2_vram_fg_w) AM_BASE_MEMBER(tetrisp2_state, vram_fg ) // Foreground
AM_RANGE(0x404000, 0x407fff) AM_RAM_WRITE(tetrisp2_vram_bg_w) AM_BASE_MEMBER(tetrisp2_state, vram_bg ) // Background
AM_RANGE(0x408000, 0x409fff) AM_RAM // ???
AM_RANGE(0x500000, 0x50ffff) AM_RAM // Line
AM_RANGE(0x600000, 0x60ffff) AM_RAM_WRITE(tetrisp2_vram_rot_w) AM_BASE(&tetrisp2_vram_rot ) // Rotation
AM_RANGE(0x600000, 0x60ffff) AM_RAM_WRITE(tetrisp2_vram_rot_w) AM_BASE_MEMBER(tetrisp2_state, vram_rot ) // Rotation
AM_RANGE(0x650000, 0x651fff) AM_RAM_WRITE(tetrisp2_vram_rot_w) // Rotation (mirror)
AM_RANGE(0x800000, 0x800003) AM_DEVREADWRITE8_MODERN("oki", okim6295_device, read, write, 0x00ff ) // Sound
AM_RANGE(0x900000, 0x903fff) AM_READWRITE(tetrisp2_nvram_r, tetrisp2_nvram_w) AM_BASE(&tetrisp2_nvram) AM_SHARE("nvram") // NVRAM
AM_RANGE(0x900000, 0x903fff) AM_READWRITE(tetrisp2_nvram_r, tetrisp2_nvram_w) AM_BASE_MEMBER(tetrisp2_state, nvram) AM_SHARE("nvram") // NVRAM
AM_RANGE(0xb00000, 0xb00001) AM_WRITE(nndmseal_coincounter_w) // Coin Counter
AM_RANGE(0xb20000, 0xb20001) AM_WRITE(nndmseal_b20000_w) // ???
AM_RANGE(0xb40000, 0xb4000b) AM_WRITEONLY AM_BASE(&tetrisp2_scroll_fg ) // Foreground Scrolling
AM_RANGE(0xb40010, 0xb4001b) AM_WRITEONLY AM_BASE(&tetrisp2_scroll_bg ) // Background Scrolling
AM_RANGE(0xb40000, 0xb4000b) AM_WRITEONLY AM_BASE_MEMBER(tetrisp2_state, scroll_fg ) // Foreground Scrolling
AM_RANGE(0xb40010, 0xb4001b) AM_WRITEONLY AM_BASE_MEMBER(tetrisp2_state, scroll_bg ) // Background Scrolling
AM_RANGE(0xb4003e, 0xb4003f) AM_WRITENOP // scr_size
AM_RANGE(0xb60000, 0xb6002f) AM_WRITEONLY AM_BASE(&tetrisp2_rotregs) // Rotation Registers
AM_RANGE(0xb60000, 0xb6002f) AM_WRITEONLY AM_BASE_MEMBER(tetrisp2_state, rotregs) // Rotation Registers
AM_RANGE(0xb80000, 0xb80001) AM_WRITE(nndmseal_sound_bank_w)
@ -402,22 +404,22 @@ static ADDRESS_MAP_START( rockn1_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x108000, 0x10ffff) AM_RAM // Work RAM
AM_RANGE(0x200000, 0x23ffff) AM_READWRITE8(tetrisp2_priority_r, rockn_priority_w, 0x00ff) // Priority
AM_RANGE(0x300000, 0x31ffff) AM_RAM_WRITE(tetrisp2_palette_w) AM_BASE_GENERIC(paletteram) // Palette
AM_RANGE(0x400000, 0x403fff) AM_RAM_WRITE(tetrisp2_vram_fg_w) AM_BASE(&tetrisp2_vram_fg) // Foreground
AM_RANGE(0x404000, 0x407fff) AM_RAM_WRITE(tetrisp2_vram_bg_w) AM_BASE(&tetrisp2_vram_bg) // Background
AM_RANGE(0x400000, 0x403fff) AM_RAM_WRITE(tetrisp2_vram_fg_w) AM_BASE_MEMBER(tetrisp2_state, vram_fg) // Foreground
AM_RANGE(0x404000, 0x407fff) AM_RAM_WRITE(tetrisp2_vram_bg_w) AM_BASE_MEMBER(tetrisp2_state, vram_bg) // Background
AM_RANGE(0x408000, 0x409fff) AM_RAM // ???
AM_RANGE(0x500000, 0x50ffff) AM_RAM // Line
AM_RANGE(0x600000, 0x60ffff) AM_RAM_WRITE(tetrisp2_vram_rot_w) AM_BASE(&tetrisp2_vram_rot) // Rotation
AM_RANGE(0x900000, 0x903fff) AM_READWRITE(rockn_nvram_r, tetrisp2_nvram_w) AM_BASE(&tetrisp2_nvram) AM_SHARE("nvram") // NVRAM
AM_RANGE(0x600000, 0x60ffff) AM_RAM_WRITE(tetrisp2_vram_rot_w) AM_BASE_MEMBER(tetrisp2_state, vram_rot) // Rotation
AM_RANGE(0x900000, 0x903fff) AM_READWRITE(rockn_nvram_r, tetrisp2_nvram_w) AM_BASE_MEMBER(tetrisp2_state, nvram) AM_SHARE("nvram") // NVRAM
AM_RANGE(0xa30000, 0xa30001) AM_READWRITE(rockn_soundvolume_r, rockn_soundvolume_w) // Sound Volume
AM_RANGE(0xa40000, 0xa40003) AM_DEVREADWRITE8("ymz", ymz280b_r, ymz280b_w, 0x00ff) // Sound
AM_RANGE(0xa44000, 0xa44001) AM_READWRITE(rockn_adpcmbank_r, rockn_adpcmbank_w) // Sound Bank
AM_RANGE(0xa48000, 0xa48001) AM_NOP // YMZ280 Reset
AM_RANGE(0xb00000, 0xb00001) AM_WRITE(tetrisp2_coincounter_w) // Coin Counter
AM_RANGE(0xb20000, 0xb20001) AM_NOP // ???
AM_RANGE(0xb40000, 0xb4000b) AM_WRITEONLY AM_BASE(&tetrisp2_scroll_fg) // Foreground Scrolling
AM_RANGE(0xb40010, 0xb4001b) AM_WRITEONLY AM_BASE(&tetrisp2_scroll_bg) // Background Scrolling
AM_RANGE(0xb40000, 0xb4000b) AM_WRITEONLY AM_BASE_MEMBER(tetrisp2_state, scroll_fg) // Foreground Scrolling
AM_RANGE(0xb40010, 0xb4001b) AM_WRITEONLY AM_BASE_MEMBER(tetrisp2_state, scroll_bg) // Background Scrolling
AM_RANGE(0xb4003e, 0xb4003f) AM_WRITENOP // scr_size
AM_RANGE(0xb60000, 0xb6002f) AM_WRITEONLY AM_BASE(&tetrisp2_rotregs) // Rotation Registers
AM_RANGE(0xb60000, 0xb6002f) AM_WRITEONLY AM_BASE_MEMBER(tetrisp2_state, rotregs) // Rotation Registers
AM_RANGE(0xba0000, 0xba001f) AM_WRITE(rockn_systemregs_w) // system param
AM_RANGE(0xba001a, 0xba001b) AM_WRITENOP // Lev 4 irq ack
AM_RANGE(0xba001e, 0xba001f) AM_WRITENOP // Lev 2 irq ack
@ -437,21 +439,21 @@ static ADDRESS_MAP_START( rockn2_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x200000, 0x23ffff) AM_READWRITE8(tetrisp2_priority_r, rockn_priority_w, 0x00ff) // Priority
AM_RANGE(0x300000, 0x31ffff) AM_RAM_WRITE(tetrisp2_palette_w) AM_BASE_GENERIC(paletteram) // Palette
AM_RANGE(0x500000, 0x50ffff) AM_RAM // Line
AM_RANGE(0x600000, 0x60ffff) AM_RAM_WRITE(tetrisp2_vram_rot_w) AM_BASE(&tetrisp2_vram_rot) // Rotation
AM_RANGE(0x800000, 0x803fff) AM_RAM_WRITE(tetrisp2_vram_fg_w) AM_BASE(&tetrisp2_vram_fg) // Foreground
AM_RANGE(0x804000, 0x807fff) AM_RAM_WRITE(tetrisp2_vram_bg_w) AM_BASE(&tetrisp2_vram_bg) // Background
AM_RANGE(0x600000, 0x60ffff) AM_RAM_WRITE(tetrisp2_vram_rot_w) AM_BASE_MEMBER(tetrisp2_state, vram_rot) // Rotation
AM_RANGE(0x800000, 0x803fff) AM_RAM_WRITE(tetrisp2_vram_fg_w) AM_BASE_MEMBER(tetrisp2_state, vram_fg) // Foreground
AM_RANGE(0x804000, 0x807fff) AM_RAM_WRITE(tetrisp2_vram_bg_w) AM_BASE_MEMBER(tetrisp2_state, vram_bg) // Background
AM_RANGE(0x808000, 0x809fff) AM_RAM // ???
AM_RANGE(0x900000, 0x903fff) AM_READWRITE(rockn_nvram_r, tetrisp2_nvram_w) AM_BASE(&tetrisp2_nvram) AM_SHARE("nvram") // NVRAM
AM_RANGE(0x900000, 0x903fff) AM_READWRITE(rockn_nvram_r, tetrisp2_nvram_w) AM_BASE_MEMBER(tetrisp2_state, nvram) AM_SHARE("nvram") // NVRAM
AM_RANGE(0xa30000, 0xa30001) AM_READWRITE(rockn_soundvolume_r, rockn_soundvolume_w) // Sound Volume
AM_RANGE(0xa40000, 0xa40003) AM_DEVREADWRITE8("ymz", ymz280b_r, ymz280b_w, 0x00ff) // Sound
AM_RANGE(0xa44000, 0xa44001) AM_READWRITE(rockn_adpcmbank_r, rockn2_adpcmbank_w) // Sound Bank
AM_RANGE(0xa48000, 0xa48001) AM_WRITENOP // YMZ280 Reset
AM_RANGE(0xb00000, 0xb00001) AM_WRITE(tetrisp2_coincounter_w) // Coin Counter
AM_RANGE(0xb20000, 0xb20001) AM_WRITENOP // ???
AM_RANGE(0xb40000, 0xb4000b) AM_WRITEONLY AM_BASE(&tetrisp2_scroll_fg) // Foreground Scrolling
AM_RANGE(0xb40010, 0xb4001b) AM_WRITEONLY AM_BASE(&tetrisp2_scroll_bg) // Background Scrolling
AM_RANGE(0xb40000, 0xb4000b) AM_WRITEONLY AM_BASE_MEMBER(tetrisp2_state, scroll_fg) // Foreground Scrolling
AM_RANGE(0xb40010, 0xb4001b) AM_WRITEONLY AM_BASE_MEMBER(tetrisp2_state, scroll_bg) // Background Scrolling
AM_RANGE(0xb4003e, 0xb4003f) AM_WRITENOP // scr_size
AM_RANGE(0xb60000, 0xb6002f) AM_WRITEONLY AM_BASE(&tetrisp2_rotregs) // Rotation Registers
AM_RANGE(0xb60000, 0xb6002f) AM_WRITEONLY AM_BASE_MEMBER(tetrisp2_state, rotregs) // Rotation Registers
AM_RANGE(0xba0000, 0xba001f) AM_WRITE(rockn_systemregs_w) // system param
AM_RANGE(0xba001a, 0xba001b) AM_WRITENOP // Lev 4 irq ack
AM_RANGE(0xba001e, 0xba001f) AM_WRITENOP // Lev 2 irq ack
@ -471,11 +473,11 @@ static ADDRESS_MAP_START( rocknms_main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x200000, 0x23ffff) AM_READWRITE8(tetrisp2_priority_r, rockn_priority_w, 0x00ff) // Priority
AM_RANGE(0x300000, 0x31ffff) AM_RAM_WRITE(tetrisp2_palette_w) AM_BASE_GENERIC(paletteram) // Palette
// AM_RANGE(0x500000, 0x50ffff) AM_RAM // Line
AM_RANGE(0x600000, 0x60ffff) AM_RAM_WRITE(tetrisp2_vram_rot_w) AM_BASE(&tetrisp2_vram_rot) // Rotation
AM_RANGE(0x800000, 0x803fff) AM_RAM_WRITE(tetrisp2_vram_fg_w) AM_BASE(&tetrisp2_vram_fg) // Foreground
AM_RANGE(0x804000, 0x807fff) AM_RAM_WRITE(tetrisp2_vram_bg_w) AM_BASE(&tetrisp2_vram_bg) // Background
AM_RANGE(0x600000, 0x60ffff) AM_RAM_WRITE(tetrisp2_vram_rot_w) AM_BASE_MEMBER(tetrisp2_state, vram_rot) // Rotation
AM_RANGE(0x800000, 0x803fff) AM_RAM_WRITE(tetrisp2_vram_fg_w) AM_BASE_MEMBER(tetrisp2_state, vram_fg) // Foreground
AM_RANGE(0x804000, 0x807fff) AM_RAM_WRITE(tetrisp2_vram_bg_w) AM_BASE_MEMBER(tetrisp2_state, vram_bg) // Background
// AM_RANGE(0x808000, 0x809fff) AM_RAM // ???
AM_RANGE(0x900000, 0x903fff) AM_READWRITE(rockn_nvram_r, tetrisp2_nvram_w) AM_BASE(&tetrisp2_nvram) AM_SHARE("nvram") // NVRAM
AM_RANGE(0x900000, 0x903fff) AM_READWRITE(rockn_nvram_r, tetrisp2_nvram_w) AM_BASE_MEMBER(tetrisp2_state, nvram) AM_SHARE("nvram") // NVRAM
AM_RANGE(0xa30000, 0xa30001) AM_READWRITE(rockn_soundvolume_r, rockn_soundvolume_w) // Sound Volume
AM_RANGE(0xa40000, 0xa40003) AM_DEVREADWRITE8("ymz", ymz280b_r, ymz280b_w, 0x00ff) // Sound
AM_RANGE(0xa44000, 0xa44001) AM_READWRITE(rockn_adpcmbank_r, rockn_adpcmbank_w) // Sound Bank
@ -483,10 +485,10 @@ static ADDRESS_MAP_START( rocknms_main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0xa00000, 0xa00001) AM_WRITE(rocknms_main2sub_w) // MAIN -> SUB Communication
AM_RANGE(0xb00000, 0xb00001) AM_WRITE(tetrisp2_coincounter_w) // Coin Counter
AM_RANGE(0xb20000, 0xb20001) AM_WRITENOP // ???
AM_RANGE(0xb40000, 0xb4000b) AM_WRITEONLY AM_BASE(&tetrisp2_scroll_fg) // Foreground Scrolling
AM_RANGE(0xb40010, 0xb4001b) AM_WRITEONLY AM_BASE(&tetrisp2_scroll_bg) // Background Scrolling
AM_RANGE(0xb40000, 0xb4000b) AM_WRITEONLY AM_BASE_MEMBER(tetrisp2_state, scroll_fg) // Foreground Scrolling
AM_RANGE(0xb40010, 0xb4001b) AM_WRITEONLY AM_BASE_MEMBER(tetrisp2_state, scroll_bg) // Background Scrolling
AM_RANGE(0xb4003e, 0xb4003f) AM_WRITENOP // scr_size
AM_RANGE(0xb60000, 0xb6002f) AM_WRITEONLY AM_BASE(&tetrisp2_rotregs) // Rotation Registers
AM_RANGE(0xb60000, 0xb6002f) AM_WRITEONLY AM_BASE_MEMBER(tetrisp2_state, rotregs) // Rotation Registers
AM_RANGE(0xba0000, 0xba001f) AM_WRITE(rockn_systemregs_w) // system param
AM_RANGE(0xba001a, 0xba001b) AM_WRITENOP // Lev 4 irq ack
AM_RANGE(0xba001e, 0xba001f) AM_WRITENOP // Lev 2 irq ack
@ -503,12 +505,12 @@ static ADDRESS_MAP_START( rocknms_sub_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x100000, 0x103fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram2) // Object RAM
AM_RANGE(0x104000, 0x107fff) AM_RAM // Spare Object RAM
AM_RANGE(0x108000, 0x10ffff) AM_RAM // Work RAM
AM_RANGE(0x200000, 0x23ffff) AM_RAM_WRITE(rocknms_sub_priority_w) AM_BASE(&rocknms_sub_priority) // Priority
AM_RANGE(0x200000, 0x23ffff) AM_RAM_WRITE(rocknms_sub_priority_w) AM_BASE_MEMBER(tetrisp2_state, rocknms_sub_priority) // Priority
AM_RANGE(0x300000, 0x31ffff) AM_RAM_WRITE(rocknms_sub_palette_w) AM_BASE_GENERIC(paletteram2) // Palette
// AM_RANGE(0x500000, 0x50ffff) AM_RAM // Line
AM_RANGE(0x600000, 0x60ffff) AM_RAM_WRITE(rocknms_sub_vram_rot_w) AM_BASE(&rocknms_sub_vram_rot) // Rotation
AM_RANGE(0x800000, 0x803fff) AM_RAM_WRITE(rocknms_sub_vram_fg_w) AM_BASE(&rocknms_sub_vram_fg) // Foreground
AM_RANGE(0x804000, 0x807fff) AM_RAM_WRITE(rocknms_sub_vram_bg_w) AM_BASE(&rocknms_sub_vram_bg) // Background
AM_RANGE(0x600000, 0x60ffff) AM_RAM_WRITE(rocknms_sub_vram_rot_w) AM_BASE_MEMBER(tetrisp2_state, rocknms_sub_vram_rot) // Rotation
AM_RANGE(0x800000, 0x803fff) AM_RAM_WRITE(rocknms_sub_vram_fg_w) AM_BASE_MEMBER(tetrisp2_state, rocknms_sub_vram_fg) // Foreground
AM_RANGE(0x804000, 0x807fff) AM_RAM_WRITE(rocknms_sub_vram_bg_w) AM_BASE_MEMBER(tetrisp2_state, rocknms_sub_vram_bg) // Background
// AM_RANGE(0x808000, 0x809fff) AM_RAM // ???
AM_RANGE(0x900000, 0x907fff) AM_RAM // NVRAM
AM_RANGE(0xa30000, 0xa30001) AM_WRITE(rockn_soundvolume_w) // Sound Volume
@ -517,10 +519,10 @@ static ADDRESS_MAP_START( rocknms_sub_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0xa48000, 0xa48001) AM_WRITENOP // YMZ280 Reset
AM_RANGE(0xb00000, 0xb00001) AM_WRITE(rocknms_sub2main_w) // MAIN <- SUB Communication
AM_RANGE(0xb20000, 0xb20001) AM_WRITENOP // ???
AM_RANGE(0xb40000, 0xb4000b) AM_WRITEONLY AM_BASE(&rocknms_sub_scroll_fg) // Foreground Scrolling
AM_RANGE(0xb40010, 0xb4001b) AM_WRITEONLY AM_BASE(&rocknms_sub_scroll_bg) // Background Scrolling
AM_RANGE(0xb40000, 0xb4000b) AM_WRITEONLY AM_BASE_MEMBER(tetrisp2_state, rocknms_sub_scroll_fg) // Foreground Scrolling
AM_RANGE(0xb40010, 0xb4001b) AM_WRITEONLY AM_BASE_MEMBER(tetrisp2_state, rocknms_sub_scroll_bg) // Background Scrolling
AM_RANGE(0xb4003e, 0xb4003f) AM_WRITENOP // scr_size
AM_RANGE(0xb60000, 0xb6002f) AM_WRITEONLY AM_BASE(&rocknms_sub_rotregs) // Rotation Registers
AM_RANGE(0xb60000, 0xb6002f) AM_WRITEONLY AM_BASE_MEMBER(tetrisp2_state, rocknms_sub_rotregs) // Rotation Registers
AM_RANGE(0xba0000, 0xba001f) AM_WRITE(rocknms_sub_systemregs_w) // system param
AM_RANGE(0xba001a, 0xba001b) AM_WRITENOP // Lev 4 irq ack
AM_RANGE(0xba001e, 0xba001f) AM_WRITENOP // Lev 2 irq ack
@ -1046,53 +1048,59 @@ static TIMER_CALLBACK( rockn_timer_sub_level1_callback )
static void init_rockn_timer(running_machine *machine)
{
tetrisp2_state *state = machine->driver_data<tetrisp2_state>();
machine->scheduler().timer_pulse(attotime::from_msec(32), FUNC(rockn_timer_level1_callback));
rockn_timer_l4 = machine->scheduler().timer_alloc(FUNC(rockn_timer_level4_callback));
state->rockn_timer_l4 = machine->scheduler().timer_alloc(FUNC(rockn_timer_level4_callback));
state_save_register_global_array(machine, tetrisp2_systemregs);
state_save_register_global_array(machine, rocknms_sub_systemregs);
state_save_register_global(machine, rockn_protectdata);
state_save_register_global(machine, rockn_adpcmbank);
state_save_register_global(machine, rockn_soundvolume);
state_save_register_global_array(machine, state->systemregs);
state_save_register_global_array(machine, state->rocknms_sub_systemregs);
state_save_register_global(machine, state->rockn_protectdata);
state_save_register_global(machine, state->rockn_adpcmbank);
state_save_register_global(machine, state->rockn_soundvolume);
}
static DRIVER_INIT( rockn )
{
tetrisp2_state *state = machine->driver_data<tetrisp2_state>();
init_rockn_timer(machine);
rockn_protectdata = 1;
state->rockn_protectdata = 1;
}
static DRIVER_INIT( rockn1 )
{
tetrisp2_state *state = machine->driver_data<tetrisp2_state>();
init_rockn_timer(machine);
rockn_protectdata = 1;
state->rockn_protectdata = 1;
}
static DRIVER_INIT( rockn2 )
{
tetrisp2_state *state = machine->driver_data<tetrisp2_state>();
init_rockn_timer(machine);
rockn_protectdata = 2;
state->rockn_protectdata = 2;
}
static DRIVER_INIT( rocknms )
{
tetrisp2_state *state = machine->driver_data<tetrisp2_state>();
init_rockn_timer(machine);
machine->scheduler().timer_pulse(attotime::from_msec(32), FUNC(rockn_timer_sub_level1_callback));
rockn_timer_sub_l4 = machine->scheduler().timer_alloc(FUNC(rockn_timer_sub_level4_callback));
state->rockn_timer_sub_l4 = machine->scheduler().timer_alloc(FUNC(rockn_timer_sub_level4_callback));
rockn_protectdata = 3;
state->rockn_protectdata = 3;
}
static DRIVER_INIT( rockn3 )
{
tetrisp2_state *state = machine->driver_data<tetrisp2_state>();
init_rockn_timer(machine);
rockn_protectdata = 4;
state->rockn_protectdata = 4;
}
static MACHINE_CONFIG_START( tetrisp2, driver_device )
static MACHINE_CONFIG_START( tetrisp2, tetrisp2_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, 12000000)
@ -1125,7 +1133,7 @@ static MACHINE_CONFIG_START( tetrisp2, driver_device )
MACHINE_CONFIG_END
static MACHINE_CONFIG_START( nndmseal, driver_device )
static MACHINE_CONFIG_START( nndmseal, tetrisp2_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, XTAL_12MHz)
@ -1156,7 +1164,7 @@ static MACHINE_CONFIG_START( nndmseal, driver_device )
MACHINE_CONFIG_END
static MACHINE_CONFIG_START( rockn, driver_device )
static MACHINE_CONFIG_START( rockn, tetrisp2_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, 12000000)
@ -1188,7 +1196,7 @@ static MACHINE_CONFIG_START( rockn, driver_device )
MACHINE_CONFIG_END
static MACHINE_CONFIG_START( rockn2, driver_device )
static MACHINE_CONFIG_START( rockn2, tetrisp2_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, 12000000)
@ -1220,7 +1228,7 @@ static MACHINE_CONFIG_START( rockn2, driver_device )
MACHINE_CONFIG_END
static MACHINE_CONFIG_START( rocknms, driver_device )
static MACHINE_CONFIG_START( rocknms, tetrisp2_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, 12000000)

View File

@ -66,24 +66,25 @@
#define COIN_PORT_TAG "COIN"
static UINT32 coin_status;
static TIMER_CALLBACK( clear_coin_status )
{
coin_status = 0;
vicdual_state *state = machine->driver_data<vicdual_state>();
state->coin_status = 0;
}
static void assert_coin_status(void)
static void assert_coin_status(running_machine *machine)
{
coin_status = 1;
vicdual_state *state = machine->driver_data<vicdual_state>();
state->coin_status = 1;
}
static CUSTOM_INPUT( vicdual_read_coin_status )
{
return coin_status;
vicdual_state *state = field->port->machine->driver_data<vicdual_state>();
return state->coin_status;
}
@ -189,44 +190,30 @@ int vicdual_is_cabinet_color(running_machine *machine)
*
*************************************/
static UINT8 *vicdual_videoram;
static UINT8 *vicdual_characterram;
static WRITE8_HANDLER( vicdual_videoram_w )
{
vicdual_state *state = space->machine->driver_data<vicdual_state>();
space->machine->primary_screen->update_now();
vicdual_videoram[offset] = data;
}
UINT8 vicdual_videoram_r(offs_t offset)
{
return vicdual_videoram[offset];
state->videoram[offset] = data;
}
static WRITE8_HANDLER( vicdual_characterram_w )
{
vicdual_state *state = space->machine->driver_data<vicdual_state>();
space->machine->primary_screen->update_now();
vicdual_characterram[offset] = data;
state->characterram[offset] = data;
}
UINT8 vicdual_characterram_r(offs_t offset)
{
return vicdual_characterram[offset];
}
/*************************************
*
* Root driver structure
*
*************************************/
static MACHINE_CONFIG_START( vicdual_root, driver_device )
static MACHINE_CONFIG_START( vicdual_root, vicdual_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, VICDUAL_MAIN_CPU_CLOCK)
@ -259,16 +246,16 @@ static READ8_HANDLER( depthch_io_r )
static WRITE8_HANDLER( depthch_io_w )
{
if (offset & 0x01) assert_coin_status();
if (offset & 0x01) assert_coin_status(space->machine);
if (offset & 0x04) depthch_audio_w(space, 0, data);
}
static ADDRESS_MAP_START( depthch_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_MIRROR(0x4000) AM_ROM
AM_RANGE(0x8000, 0x83ff) AM_MIRROR(0x7000) AM_RAM_WRITE(vicdual_videoram_w) AM_BASE(&vicdual_videoram)
AM_RANGE(0x8000, 0x83ff) AM_MIRROR(0x7000) AM_RAM_WRITE(vicdual_videoram_w) AM_BASE_MEMBER(vicdual_state, videoram)
AM_RANGE(0x8400, 0x87ff) AM_MIRROR(0x7000) AM_RAM
AM_RANGE(0x8800, 0x8fff) AM_MIRROR(0x7000) AM_RAM_WRITE(vicdual_characterram_w) AM_BASE(&vicdual_characterram)
AM_RANGE(0x8800, 0x8fff) AM_MIRROR(0x7000) AM_RAM_WRITE(vicdual_characterram_w) AM_BASE_MEMBER(vicdual_state, characterram)
ADDRESS_MAP_END
@ -341,7 +328,7 @@ static READ8_HANDLER( safari_io_r )
static WRITE8_HANDLER( safari_io_w )
{
if (offset & 0x01) assert_coin_status();
if (offset & 0x01) assert_coin_status(space->machine);
if (offset & 0x02) { /* safari_audio_w(0, data) */ }
}
@ -350,9 +337,9 @@ static ADDRESS_MAP_START( safari_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x4000, 0x7fff) AM_NOP /* unused */
AM_RANGE(0x8000, 0x8fff) AM_MIRROR(0x3000) AM_RAM
AM_RANGE(0xc000, 0xc3ff) AM_MIRROR(0x3000) AM_RAM_WRITE(vicdual_videoram_w) AM_BASE(&vicdual_videoram)
AM_RANGE(0xc000, 0xc3ff) AM_MIRROR(0x3000) AM_RAM_WRITE(vicdual_videoram_w) AM_BASE_MEMBER(vicdual_state, videoram)
AM_RANGE(0xc400, 0xc7ff) AM_MIRROR(0x3000) AM_RAM
AM_RANGE(0xc800, 0xcfff) AM_MIRROR(0x3000) AM_RAM_WRITE(vicdual_characterram_w) AM_BASE(&vicdual_characterram)
AM_RANGE(0xc800, 0xcfff) AM_MIRROR(0x3000) AM_RAM_WRITE(vicdual_characterram_w) AM_BASE_MEMBER(vicdual_state, characterram)
ADDRESS_MAP_END
@ -425,16 +412,16 @@ static READ8_HANDLER( frogs_io_r )
static WRITE8_HANDLER( frogs_io_w )
{
if (offset & 0x01) assert_coin_status();
if (offset & 0x01) assert_coin_status(space->machine);
if (offset & 0x02) frogs_audio_w(space, 0, data);
}
static ADDRESS_MAP_START( frogs_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_MIRROR(0x4000) AM_ROM
AM_RANGE(0x8000, 0x83ff) AM_MIRROR(0x7000) AM_RAM_WRITE(vicdual_videoram_w) AM_BASE(&vicdual_videoram)
AM_RANGE(0x8000, 0x83ff) AM_MIRROR(0x7000) AM_RAM_WRITE(vicdual_videoram_w) AM_BASE_MEMBER(vicdual_state, videoram)
AM_RANGE(0x8400, 0x87ff) AM_MIRROR(0x7000) AM_RAM
AM_RANGE(0x8800, 0x8fff) AM_MIRROR(0x7000) AM_RAM_WRITE(vicdual_characterram_w) AM_BASE(&vicdual_characterram)
AM_RANGE(0x8800, 0x8fff) AM_MIRROR(0x7000) AM_RAM_WRITE(vicdual_characterram_w) AM_BASE_MEMBER(vicdual_state, characterram)
ADDRESS_MAP_END
@ -545,7 +532,7 @@ static READ8_HANDLER( sspaceat_io_r )
static WRITE8_HANDLER( headon_io_w )
{
if (offset & 0x01) assert_coin_status();
if (offset & 0x01) assert_coin_status(space->machine);
if (offset & 0x02) headon_audio_w(space, 0, data);
if (offset & 0x04) { /* vicdual_palette_bank_w(0, data) */ } /* not written to */
}
@ -554,9 +541,9 @@ static WRITE8_HANDLER( headon_io_w )
static ADDRESS_MAP_START( headon_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x1fff) AM_MIRROR(0x6000) AM_ROM
AM_RANGE(0x8000, 0xbfff) AM_NOP /* unused */
AM_RANGE(0xc000, 0xc3ff) AM_MIRROR(0x3000) AM_RAM_WRITE(vicdual_videoram_w) AM_BASE(&vicdual_videoram)
AM_RANGE(0xc000, 0xc3ff) AM_MIRROR(0x3000) AM_RAM_WRITE(vicdual_videoram_w) AM_BASE_MEMBER(vicdual_state, videoram)
AM_RANGE(0xc400, 0xc7ff) AM_MIRROR(0x3000) AM_RAM
AM_RANGE(0xc800, 0xcfff) AM_MIRROR(0x3000) AM_RAM_WRITE(vicdual_characterram_w) AM_BASE(&vicdual_characterram)
AM_RANGE(0xc800, 0xcfff) AM_MIRROR(0x3000) AM_RAM_WRITE(vicdual_characterram_w) AM_BASE_MEMBER(vicdual_state, characterram)
ADDRESS_MAP_END
@ -746,7 +733,7 @@ static READ8_HANDLER( headon2_io_r )
static WRITE8_HANDLER( headon2_io_w )
{
if (offset & 0x01) assert_coin_status();
if (offset & 0x01) assert_coin_status(space->machine);
if (offset & 0x02) headon_audio_w(space, 0, data);
if (offset & 0x04) vicdual_palette_bank_w(space, 0, data);
if (offset & 0x08) { /* schematics show this as going into a shifer circuit, but never written to */ }
@ -757,7 +744,7 @@ static WRITE8_HANDLER( headon2_io_w )
static WRITE8_HANDLER( digger_io_w )
{
if (offset & 0x01) assert_coin_status();
if (offset & 0x01) assert_coin_status(space->machine);
if (offset & 0x02) { /* digger_audio_1_w(0, data) */ }
if (offset & 0x04)
{
@ -774,9 +761,9 @@ static WRITE8_HANDLER( digger_io_w )
static ADDRESS_MAP_START( headon2_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x1fff) AM_MIRROR(0x6000) AM_ROM
/* AM_RANGE(0x8000, 0x80ff) AM_MIRROR(0x3f00) */ /* schematics show this as battery backed RAM, but doesn't appear to be used */
AM_RANGE(0xc000, 0xc3ff) AM_MIRROR(0x3000) AM_RAM_WRITE(vicdual_videoram_w) AM_BASE(&vicdual_videoram)
AM_RANGE(0xc000, 0xc3ff) AM_MIRROR(0x3000) AM_RAM_WRITE(vicdual_videoram_w) AM_BASE_MEMBER(vicdual_state, videoram)
AM_RANGE(0xc400, 0xc7ff) AM_MIRROR(0x3000) AM_RAM
AM_RANGE(0xc800, 0xcfff) AM_MIRROR(0x3000) AM_RAM_WRITE(vicdual_characterram_w) AM_BASE(&vicdual_characterram)
AM_RANGE(0xc800, 0xcfff) AM_MIRROR(0x3000) AM_RAM_WRITE(vicdual_characterram_w) AM_BASE_MEMBER(vicdual_state, characterram)
ADDRESS_MAP_END
@ -962,7 +949,7 @@ static WRITE8_HANDLER( invho2_io_w )
{
if (offset & 0x01) invho2_audio_w(space, 0, data);
if (offset & 0x02) invinco_audio_w(space, 0, data);
if (offset & 0x08) assert_coin_status();
if (offset & 0x08) assert_coin_status(space->machine);
if (offset & 0x40) vicdual_palette_bank_w(space, 0, data);
}
@ -971,7 +958,7 @@ static WRITE8_HANDLER( invds_io_w )
{
if (offset & 0x01) invinco_audio_w(space, 0, data);
if (offset & 0x02) { /* deepscan_audio_w(0, data) */ }
if (offset & 0x08) assert_coin_status();
if (offset & 0x08) assert_coin_status(space->machine);
if (offset & 0x40) vicdual_palette_bank_w(space, 0, data);
}
@ -980,7 +967,7 @@ static WRITE8_HANDLER( sspacaho_io_w )
{
if (offset & 0x01) invho2_audio_w(space, 0, data);
if (offset & 0x02) { /* sspaceatt_audio_w(space, 0, data) */ }
if (offset & 0x08) assert_coin_status();
if (offset & 0x08) assert_coin_status(space->machine);
if (offset & 0x40) vicdual_palette_bank_w(space, 0, data);
}
@ -989,7 +976,7 @@ static WRITE8_HANDLER( tranqgun_io_w )
{
if (offset & 0x01) { /* tranqgun_audio_w(space, 0, data) */ }
if (offset & 0x02) vicdual_palette_bank_w(space, 0, data);
if (offset & 0x08) assert_coin_status();
if (offset & 0x08) assert_coin_status(space->machine);
}
@ -997,7 +984,7 @@ static WRITE8_HANDLER( spacetrk_io_w )
{
if (offset & 0x01) { /* spacetrk_audio_w(space, 0, data) */ }
if (offset & 0x02) { /* spacetrk_audio_w(space, 0, data) */ }
if (offset & 0x08) assert_coin_status();
if (offset & 0x08) assert_coin_status(space->machine);
if (offset & 0x40) vicdual_palette_bank_w(space, 0, data);
}
@ -1006,7 +993,7 @@ static WRITE8_HANDLER( carnival_io_w )
{
if (offset & 0x01) carnival_audio_1_w(space, 0, data);
if (offset & 0x02) carnival_audio_2_w(space, 0, data);
if (offset & 0x08) assert_coin_status();
if (offset & 0x08) assert_coin_status(space->machine);
if (offset & 0x40) vicdual_palette_bank_w(space, 0, data);
}
@ -1015,7 +1002,7 @@ static WRITE8_HANDLER( brdrline_io_w )
{
if (offset & 0x01) { /* brdrline_audio_w(space, 0, data) */ }
if (offset & 0x02) vicdual_palette_bank_w(space, 0, data);
if (offset & 0x08) assert_coin_status();
if (offset & 0x08) assert_coin_status(space->machine);
}
@ -1023,7 +1010,7 @@ static WRITE8_HANDLER( pulsar_io_w )
{
if (offset & 0x01) pulsar_audio_1_w(space, 0, data);
if (offset & 0x02) pulsar_audio_2_w(space, 0, data);
if (offset & 0x08) assert_coin_status();
if (offset & 0x08) assert_coin_status(space->machine);
if (offset & 0x40) vicdual_palette_bank_w(space, 0, data);
}
@ -1038,7 +1025,7 @@ static WRITE8_HANDLER( heiankyo_io_w )
/* heiankyo_audio_2_w(0, data & 0x3f); */
}
if (offset & 0x08) assert_coin_status();
if (offset & 0x08) assert_coin_status(space->machine);
}
@ -1046,16 +1033,16 @@ static WRITE8_HANDLER( alphaho_io_w )
{
if (offset & 0x01) { /* headon_audio_w(0, data) */ }
if (offset & 0x02) { /* alphaf_audio_w(0, data) */ }
if (offset & 0x08) assert_coin_status();
if (offset & 0x08) assert_coin_status(space->machine);
if (offset & 0x40) vicdual_palette_bank_w(space, 0, data);
}
static ADDRESS_MAP_START( vicdual_dualgame_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_MIRROR(0x4000) AM_ROM
AM_RANGE(0x8000, 0x83ff) AM_MIRROR(0x7000) AM_RAM_WRITE(vicdual_videoram_w) AM_BASE(&vicdual_videoram)
AM_RANGE(0x8000, 0x83ff) AM_MIRROR(0x7000) AM_RAM_WRITE(vicdual_videoram_w) AM_BASE_MEMBER(vicdual_state, videoram)
AM_RANGE(0x8400, 0x87ff) AM_MIRROR(0x7000) AM_RAM
AM_RANGE(0x8800, 0x8fff) AM_MIRROR(0x7000) AM_RAM_WRITE(vicdual_characterram_w) AM_BASE(&vicdual_characterram)
AM_RANGE(0x8800, 0x8fff) AM_MIRROR(0x7000) AM_RAM_WRITE(vicdual_characterram_w) AM_BASE_MEMBER(vicdual_state, characterram)
ADDRESS_MAP_END
@ -2056,23 +2043,23 @@ MACHINE_CONFIG_END
*
*************************************/
static UINT8 samurai_protection_data;
static WRITE8_HANDLER( samurai_protection_w )
{
samurai_protection_data = data;
vicdual_state *state = space->machine->driver_data<vicdual_state>();
state->samurai_protection_data = data;
}
static CUSTOM_INPUT( samurai_protection_r )
{
vicdual_state *state = field->port->machine->driver_data<vicdual_state>();
int offset = (FPTR)param;
UINT32 answer = 0;
if (samurai_protection_data == 0xab)
if (state->samurai_protection_data == 0xab)
answer = 0x02;
else if (samurai_protection_data == 0x1d)
else if (state->samurai_protection_data == 0x1d)
answer = 0x0c;
return (answer >> offset) & 0x01;
@ -2082,7 +2069,7 @@ static CUSTOM_INPUT( samurai_protection_r )
static WRITE8_HANDLER( samurai_io_w )
{
if (offset & 0x02) { /* samurai_audio_w(0, data) */ }
if (offset & 0x08) assert_coin_status();
if (offset & 0x08) assert_coin_status(space->machine);
if (offset & 0x40) vicdual_palette_bank_w(space, 0, data);
}
@ -2090,9 +2077,9 @@ static WRITE8_HANDLER( samurai_io_w )
/* dual game hardware */
static ADDRESS_MAP_START( samurai_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_MIRROR(0x4000) AM_ROM AM_WRITE(samurai_protection_w)
AM_RANGE(0x8000, 0x83ff) AM_MIRROR(0x7000) AM_RAM_WRITE(vicdual_videoram_w) AM_BASE(&vicdual_videoram)
AM_RANGE(0x8000, 0x83ff) AM_MIRROR(0x7000) AM_RAM_WRITE(vicdual_videoram_w) AM_BASE_MEMBER(vicdual_state, videoram)
AM_RANGE(0x8400, 0x87ff) AM_MIRROR(0x7000) AM_RAM
AM_RANGE(0x8800, 0x8fff) AM_MIRROR(0x7000) AM_RAM_WRITE(vicdual_characterram_w) AM_BASE(&vicdual_characterram)
AM_RANGE(0x8800, 0x8fff) AM_MIRROR(0x7000) AM_RAM_WRITE(vicdual_characterram_w) AM_BASE_MEMBER(vicdual_state, characterram)
ADDRESS_MAP_END
@ -2195,7 +2182,7 @@ static READ8_HANDLER( nsub_io_r )
static WRITE8_HANDLER( nsub_io_w )
{
if (offset & 0x01) assert_coin_status();
if (offset & 0x01) assert_coin_status(space->machine);
if (offset & 0x02) { /* nsub_audio_w(0, data) */ }
if (offset & 0x04) vicdual_palette_bank_w(space, 0, data);
}
@ -2204,9 +2191,9 @@ static WRITE8_HANDLER( nsub_io_w )
static ADDRESS_MAP_START( nsub_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_MIRROR(0x4000) AM_ROM
AM_RANGE(0x8000, 0xbfff) AM_NOP /* unused */
AM_RANGE(0xc000, 0xc3ff) AM_MIRROR(0x3000) AM_RAM_WRITE(vicdual_videoram_w) AM_BASE(&vicdual_videoram)
AM_RANGE(0xc000, 0xc3ff) AM_MIRROR(0x3000) AM_RAM_WRITE(vicdual_videoram_w) AM_BASE_MEMBER(vicdual_state, videoram)
AM_RANGE(0xc400, 0xc7ff) AM_MIRROR(0x3000) AM_RAM
AM_RANGE(0xc800, 0xcfff) AM_MIRROR(0x3000) AM_RAM_WRITE(vicdual_characterram_w) AM_BASE(&vicdual_characterram)
AM_RANGE(0xc800, 0xcfff) AM_MIRROR(0x3000) AM_RAM_WRITE(vicdual_characterram_w) AM_BASE_MEMBER(vicdual_state, characterram)
ADDRESS_MAP_END
@ -2291,7 +2278,7 @@ static READ8_HANDLER( invinco_io_r )
static WRITE8_HANDLER( invinco_io_w )
{
if (offset & 0x01) assert_coin_status();
if (offset & 0x01) assert_coin_status(space->machine);
if (offset & 0x02) invinco_audio_w(space, 0, data);
if (offset & 0x04) vicdual_palette_bank_w(space, 0, data);
}
@ -2300,9 +2287,9 @@ static WRITE8_HANDLER( invinco_io_w )
static ADDRESS_MAP_START( invinco_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_MIRROR(0x4000) AM_ROM
AM_RANGE(0x8000, 0xbfff) AM_NOP /* unused */
AM_RANGE(0xc000, 0xc3ff) AM_MIRROR(0x3000) AM_RAM_WRITE(vicdual_videoram_w) AM_BASE(&vicdual_videoram)
AM_RANGE(0xc000, 0xc3ff) AM_MIRROR(0x3000) AM_RAM_WRITE(vicdual_videoram_w) AM_BASE_MEMBER(vicdual_state, videoram)
AM_RANGE(0xc400, 0xc7ff) AM_MIRROR(0x3000) AM_RAM
AM_RANGE(0xc800, 0xcfff) AM_MIRROR(0x3000) AM_RAM_WRITE(vicdual_characterram_w) AM_BASE(&vicdual_characterram)
AM_RANGE(0xc800, 0xcfff) AM_MIRROR(0x3000) AM_RAM_WRITE(vicdual_characterram_w) AM_BASE_MEMBER(vicdual_state, characterram)
ADDRESS_MAP_END

View File

@ -1,3 +1,30 @@
class cclimber_state : public driver_device
{
public:
cclimber_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
UINT8 *videoram;
UINT8 *colorram;
UINT8 *spriteram;
UINT8 *bigsprite_videoram;
UINT8 *bigsprite_control;
UINT8 *column_scroll;
UINT8 *flip_screen;
UINT8 *swimmer_background_color;
UINT8 *swimmer_side_background_enabled;
UINT8 *swimmer_palettebank;
UINT8 *toprollr_bg_videoram;
UINT8 *toprollr_bg_coloram;
UINT8 yamato_p0;
UINT8 yamato_p1;
UINT8 toprollr_rombank;
tilemap_t *pf_tilemap;
tilemap_t *bs_tilemap;
tilemap_t *toproller_bg_tilemap;
};
/*----------- defined in machine/cclimber.c -----------*/
DRIVER_INIT( cclimber );
@ -8,22 +35,6 @@ DRIVER_INIT( ckongb );
/*----------- defined in video/cclimber.c -----------*/
extern UINT8 *cclimber_videoram;
extern UINT8 *cclimber_colorram;
extern UINT8 *cclimber_spriteram;
extern UINT8 *cclimber_bigsprite_videoram;
extern UINT8 *cclimber_bigsprite_control;
extern UINT8 *cclimber_column_scroll;
extern UINT8 *cclimber_flip_screen;
extern UINT8 *swimmer_background_color;
extern UINT8 *swimmer_side_background_enabled;
extern UINT8 *swimmer_palettebank;
extern UINT8 *toprollr_bg_videoram;
extern UINT8 *toprollr_bg_coloram;
WRITE8_HANDLER( cclimber_colorram_w );
WRITE8_HANDLER( cannonb_flip_screen_w );

View File

@ -1,12 +1,32 @@
class galpani2_state : public driver_device
{
public:
galpani2_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
UINT16 *bg8_0;
UINT16 *bg8_1;
UINT16 *palette_0;
UINT16 *palette_1;
UINT16 *bg8_0_scrollx;
UINT16 *bg8_1_scrollx;
UINT16 *bg8_0_scrolly;
UINT16 *bg8_1_scrolly;
UINT16 *bg15;
UINT16 eeprom_word;
UINT16 *ram;
UINT16 *ram2;
UINT16 old_mcu_nmi1;
UINT16 old_mcu_nmi2;
UINT16 *rombank;
bitmap_t *bg8_bitmap_0;
bitmap_t *bg8_bitmap_1;
bitmap_t *bg15_bitmap;
};
/*----------- defined in video/galpani2.c -----------*/
extern UINT16 *galpani2_bg8_0, *galpani2_bg8_1;
extern UINT16 *galpani2_palette_0, *galpani2_palette_1;
extern UINT16 *galpani2_bg8_0_scrollx, *galpani2_bg8_1_scrollx;
extern UINT16 *galpani2_bg8_0_scrolly, *galpani2_bg8_1_scrolly;
extern UINT16 *galpani2_bg15;
PALETTE_INIT( galpani2 );
VIDEO_START( galpani2 );
SCREEN_UPDATE( galpani2 );

View File

@ -6,15 +6,24 @@
***************************************************************************/
class namcond1_state : public driver_device
{
public:
namcond1_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
UINT8 h8_irq5_enabled;
UINT16 *shared_ram;
int p8;
};
/*----------- defined in machine/namcond1.c -----------*/
extern UINT8 namcond1_h8_irq5_enabled;
extern UINT16 *namcond1_shared_ram;
extern READ16_HANDLER( namcond1_shared_ram_r );
extern READ16_HANDLER( namcond1_cuskey_r );
extern WRITE16_HANDLER( namcond1_shared_ram_w );
extern WRITE16_HANDLER( namcond1_cuskey_w );
READ16_HANDLER( namcond1_shared_ram_r );
READ16_HANDLER( namcond1_cuskey_r );
WRITE16_HANDLER( namcond1_shared_ram_w );
WRITE16_HANDLER( namcond1_cuskey_w );
MACHINE_START( namcond1 );
MACHINE_RESET( namcond1 );

View File

@ -4,10 +4,34 @@
**************************************************************************/
/*----------- defined in video/pacman.c -----------*/
class pacman_state : public driver_device
{
public:
pacman_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
extern UINT8 *pacman_videoram;
extern UINT8 *pacman_colorram;
UINT8 cannonb_bit_to_read;
int mystery;
UINT8 counter;
int bigbucks_bank;
UINT8 *rocktrv2_prot_data;
UINT8 rocktrv2_question_bank;
UINT8 *videoram;
UINT8 *colorram;
UINT8 *s2650games_spriteram;
UINT8 *s2650games_tileram;
tilemap_t *bg_tilemap;
UINT8 charbank;
UINT8 spritebank;
UINT8 palettebank;
UINT8 colortablebank;
UINT8 flipscreen;
UINT8 bgpriority;
int xoffsethack;
};
/*----------- defined in video/pacman.c -----------*/
PALETTE_INIT( pacman );
VIDEO_START( pacman );
@ -28,8 +52,6 @@ WRITE8_HANDLER( pengo_gfxbank_w );
VIDEO_START( s2650games );
SCREEN_UPDATE( s2650games );
extern UINT8 *s2650games_spriteram;
extern UINT8 *s2650games_tileram;
WRITE8_HANDLER( s2650games_videoram_w );
WRITE8_HANDLER( s2650games_colorram_w );

View File

@ -1,6 +1,49 @@
/*----------- defined in drivers/seibuspi.c -----------*/
#include "machine/intelfsh.h"
extern UINT32 *spimainram;
#define FIFO_SIZE 512
class seibuspi_state : public driver_device
{
public:
seibuspi_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
UINT32 *spimainram;
UINT32 *spi_scrollram;
intel_e28f008sa_device *flash[2];
UINT8 *z80_rom;
int z80_prg_fifo_pos;
int z80_lastbank;
int fifoin_rpos;
int fifoin_wpos;
UINT8 fifoin_data[FIFO_SIZE];
int fifoin_read_request;
int fifoout_rpos;
int fifoout_wpos;
UINT8 fifoout_data[FIFO_SIZE];
int fifoout_read_request;
UINT8 sb_coin_latch;
UINT8 ejsakura_input_port;
tilemap_t *text_layer;
tilemap_t *back_layer;
tilemap_t *mid_layer;
tilemap_t *fore_layer;
UINT32 layer_bank;
UINT32 layer_enable;
UINT32 video_dma_length;
UINT32 video_dma_address;
UINT32 sprite_dma_length;
int rf2_layer_bank[3];
UINT32 *tilemap_ram;
UINT32 *palette_ram;
UINT32 *sprite_ram;
int mid_layer_offset;
int fore_layer_offset;
int text_layer_offset;
UINT32 bg_fore_layer_position;
UINT8 alpha_table[8192];
UINT8 sprite_bpp;
};
/*----------- defined in machine/spisprit.c -----------*/
@ -10,8 +53,6 @@ void seibuspi_sprite_decrypt(UINT8 *src, int romsize);
/*----------- defined in video/seibuspi.c -----------*/
extern UINT32 *spi_scrollram;
VIDEO_START( spi );
SCREEN_UPDATE( spi );
@ -22,7 +63,7 @@ READ32_HANDLER( spi_layer_bank_r );
WRITE32_HANDLER( spi_layer_bank_w );
WRITE32_HANDLER( spi_layer_enable_w );
void rf2_set_layer_banks(int banks);
void rf2_set_layer_banks(running_machine *machine, int banks);
WRITE32_HANDLER( tilemap_dma_start_w );
WRITE32_HANDLER( palette_dma_start_w );

View File

@ -1,22 +1,47 @@
/*----------- defined in drivers/tetrisp2.c -----------*/
class tetrisp2_state : public driver_device
{
public:
tetrisp2_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
extern UINT16 tetrisp2_systemregs[0x10];
UINT16 systemregs[0x10];
UINT16 *vram_bg;
UINT16 *scroll_bg;
UINT16 *vram_fg;
UINT16 *scroll_fg;
UINT16 *vram_rot;
UINT16 *rotregs;
UINT8 *priority;
UINT16 *rocknms_sub_vram_bg;
UINT16 *rocknms_sub_scroll_bg;
UINT16 *rocknms_sub_vram_fg;
UINT16 *rocknms_sub_scroll_fg;
UINT16 *rocknms_sub_vram_rot;
UINT16 *rocknms_sub_rotregs;
UINT16 *rocknms_sub_priority;
UINT16 rocknms_sub_systemregs[0x10];
UINT16 rockn_protectdata;
UINT16 rockn_adpcmbank;
UINT16 rockn_soundvolume;
emu_timer *rockn_timer_l4;
emu_timer *rockn_timer_sub_l4;
int bank_lo;
int bank_hi;
UINT16 *nvram;
UINT16 rocknms_main2sub;
UINT16 rocknms_sub2main;
int flipscreen_old;
tilemap_t *tilemap_bg;
tilemap_t *tilemap_fg;
tilemap_t *tilemap_rot;
tilemap_t *tilemap_sub_bg;
tilemap_t *tilemap_sub_fg;
tilemap_t *tilemap_sub_rot;
};
/*----------- defined in video/tetrisp2.c -----------*/
extern UINT16 *tetrisp2_vram_bg, *tetrisp2_scroll_bg;
extern UINT16 *tetrisp2_vram_fg, *tetrisp2_scroll_fg;
extern UINT16 *tetrisp2_vram_rot, *tetrisp2_rotregs;
extern UINT8 *tetrisp2_priority;
extern UINT16 *rocknms_sub_vram_bg, *rocknms_sub_scroll_bg;
extern UINT16 *rocknms_sub_vram_fg, *rocknms_sub_scroll_fg;
extern UINT16 *rocknms_sub_vram_rot, *rocknms_sub_rotregs;
extern UINT16 *rocknms_sub_priority;
WRITE16_HANDLER( tetrisp2_palette_w );
WRITE16_HANDLER( rocknms_sub_palette_w );
WRITE8_HANDLER( tetrisp2_priority_w );

View File

@ -22,10 +22,21 @@
#define VICDUAL_VSEND (0x0f0)
/*----------- defined in drivers/vicdual.c -----------*/
class vicdual_state : public driver_device
{
public:
vicdual_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
UINT8 vicdual_videoram_r(offs_t offset);
UINT8 vicdual_characterram_r(offs_t offset);
UINT32 coin_status;
UINT8 *videoram;
UINT8 *characterram;
UINT8 samurai_protection_data;
UINT8 palette_bank;
};
/*----------- defined in drivers/vicdual.c -----------*/
int vicdual_is_cabinet_color(running_machine *machine);

View File

@ -15,8 +15,6 @@ David Widel d_widel@hotmail.com
#include "emu.h"
#include "includes/pacman.h"
static INT8 counter=0;
static void acitya_decrypt_rom_8(running_machine *machine)
{
@ -158,25 +156,24 @@ static void acitya_decrypt_rom_B(running_machine *machine)
READ8_HANDLER( acitya_decrypt_rom )
{
pacman_state *state = space->machine->driver_data<pacman_state>();
if (offset & 0x01)
{
counter = counter - 1;
if (counter < 0)
counter = 0x0F;
state->counter = (state->counter - 1) & 0x0F;
}
else
{
counter = (counter + 1) & 0x0F;
state->counter = (state->counter + 1) & 0x0F;
}
switch(counter)
switch(state->counter)
{
case 0x08: memory_set_bank (space->machine, "bank1", 0); break;
case 0x09: memory_set_bank (space->machine, "bank1", 1); break;
case 0x0A: memory_set_bank (space->machine, "bank1", 2); break;
case 0x0B: memory_set_bank (space->machine, "bank1", 3); break;
default:
logerror("Invalid counter = %02X\n",counter);
logerror("Invalid counter = %02X\n",state->counter);
break;
}
@ -186,6 +183,7 @@ READ8_HANDLER( acitya_decrypt_rom )
MACHINE_START( acitya )
{
pacman_state *state = machine->driver_data<pacman_state>();
UINT8 *RAM = machine->region("maincpu")->base();
/* While the PAL supports up to 16 decryption methods, only four
@ -198,13 +196,14 @@ MACHINE_START( acitya )
memory_configure_bank(machine, "bank1", 0, 4, &RAM[0x10000], 0x4000);
state_save_register_global(machine, counter);
state_save_register_global(machine, state->counter);
}
MACHINE_RESET( acitya )
{
pacman_state *state = machine->driver_data<pacman_state>();
/* The initial state of the counter is 0x0B */
counter = 0x0B;
state->counter = 0x0B;
memory_set_bank(machine, "bank1", 3);
}

View File

@ -16,15 +16,16 @@
/* Perform basic machine initialisation */
UINT8 namcond1_h8_irq5_enabled;
MACHINE_START( namcond1 )
{
state_save_register_global(machine, namcond1_h8_irq5_enabled);
namcond1_state *state = machine->driver_data<namcond1_state>();
state_save_register_global(machine, state->h8_irq5_enabled);
}
MACHINE_RESET( namcond1 )
{
namcond1_state *state = machine->driver_data<namcond1_state>();
#ifdef MAME_DEBUG
/*UINT8 *ROM = machine->region(REGION_CPU1)->base();*/
/*UINT32 debug_trigger_addr;*/
@ -44,18 +45,18 @@ MACHINE_RESET( namcond1 )
#endif
// initialise MCU states
namcond1_h8_irq5_enabled = 0;
state->h8_irq5_enabled = 0;
// halt the MCU
cputag_set_input_line(machine, "mcu", INPUT_LINE_RESET, ASSERT_LINE);
}
// instance of the shared ram pointer
UINT16 *namcond1_shared_ram;
READ16_HANDLER( namcond1_shared_ram_r )
{
return namcond1_shared_ram[offset];
namcond1_state *state = space->machine->driver_data<namcond1_state>();
return state->shared_ram[offset];
}
// $c3ff00-$c3ffff
@ -79,26 +80,28 @@ READ16_HANDLER( namcond1_cuskey_r )
WRITE16_HANDLER( namcond1_shared_ram_w )
{
namcond1_state *state = space->machine->driver_data<namcond1_state>();
switch( offset )
{
default :
COMBINE_DATA( namcond1_shared_ram + offset );
COMBINE_DATA( state->shared_ram + offset );
break;
}
}
WRITE16_HANDLER( namcond1_cuskey_w )
{
namcond1_state *state = space->machine->driver_data<namcond1_state>();
switch( offset )
{
case (0x0a>>1):
// this is a kludge until we emulate the h8
if ((namcond1_h8_irq5_enabled == 0) && (data != 0x0000))
if ((state->h8_irq5_enabled == 0) && (data != 0x0000))
{
cputag_set_input_line(space->machine, "mcu", INPUT_LINE_RESET, CLEAR_LINE);
}
namcond1_h8_irq5_enabled = ( data != 0x0000 );
state->h8_irq5_enabled = ( data != 0x0000 );
break;
case (0x0c>>1):

View File

@ -64,8 +64,6 @@
#include "emu.h"
#include "includes/pacman.h"
static INT8 counter=0;
static void theglobp_decrypt_rom_8(running_machine *machine)
{
@ -212,25 +210,24 @@ static void theglobp_decrypt_rom_B(running_machine *machine)
READ8_HANDLER( theglobp_decrypt_rom )
{
pacman_state *state = space->machine->driver_data<pacman_state>();
if (offset & 0x01)
{
counter = counter - 1;
if (counter < 0)
counter = 0x0F;
state->counter = (state->counter - 1) & 0x0F;
}
else
{
counter = (counter + 1) & 0x0F;
state->counter = (state->counter + 1) & 0x0F;
}
switch(counter)
switch(state->counter)
{
case 0x08: memory_set_bank (space->machine, "bank1", 0); break;
case 0x09: memory_set_bank (space->machine, "bank1", 1); break;
case 0x0A: memory_set_bank (space->machine, "bank1", 2); break;
case 0x0B: memory_set_bank (space->machine, "bank1", 3); break;
default:
logerror("Invalid counter = %02X\n",counter);
logerror("Invalid counter = %02X\n",state->counter);
break;
}
@ -240,6 +237,7 @@ READ8_HANDLER( theglobp_decrypt_rom )
MACHINE_START( theglobp )
{
pacman_state *state = machine->driver_data<pacman_state>();
UINT8 *RAM = machine->region("maincpu")->base();
/* While the PAL supports up to 16 decryption methods, only four
@ -252,13 +250,14 @@ MACHINE_START( theglobp )
memory_configure_bank(machine, "bank1", 0, 4, &RAM[0x10000], 0x4000);
state_save_register_global(machine, counter);
state_save_register_global(machine, state->counter);
}
MACHINE_RESET( theglobp )
{
pacman_state *state = machine->driver_data<pacman_state>();
/* The initial state of the counter is 0x0A */
counter = 0x0A;
state->counter = 0x0A;
memory_set_bank(machine, "bank1", 2);
}

View File

@ -11,33 +11,13 @@
#include "includes/cclimber.h"
#define CCLIMBER_FLIP_X (cclimber_flip_screen[0] & 0x01)
#define CCLIMBER_FLIP_Y (cclimber_flip_screen[1] & 0x01)
#define CCLIMBER_FLIP_X (state->flip_screen[0] & 0x01)
#define CCLIMBER_FLIP_Y (state->flip_screen[1] & 0x01)
#define CCLIMBER_BG_PEN (0)
#define SWIMMER_SIDE_BG_PEN (0x120)
#define SWIMMER_BG_SPLIT (0x18 * 8)
#define YAMATO_SKY_PEN_BASE (0x60)
static tilemap_t *pf_tilemap;
static tilemap_t *bs_tilemap;
UINT8 *cclimber_videoram;
UINT8 *cclimber_colorram;
UINT8 *cclimber_spriteram;
UINT8 *cclimber_bigsprite_videoram;
UINT8 *cclimber_bigsprite_control;
UINT8 *cclimber_column_scroll;
UINT8 *cclimber_flip_screen;
UINT8 *swimmer_background_color;
UINT8 *swimmer_side_background_enabled;
UINT8 *swimmer_palettebank;
UINT8 *toprollr_bg_videoram;
UINT8 *toprollr_bg_coloram;
static tilemap_t *toproller_bg_tilemap;
/***************************************************************************
@ -318,25 +298,26 @@ PALETTE_INIT( toprollr )
static void swimmer_set_background_pen(running_machine *machine)
{
cclimber_state *state = machine->driver_data<cclimber_state>();
int bit0, bit1, bit2;
int r, g, b;
/* red component */
bit0 = 0;
bit1 = (*swimmer_background_color >> 6) & 0x01;
bit2 = (*swimmer_background_color >> 7) & 0x01;
bit1 = (*state->swimmer_background_color >> 6) & 0x01;
bit2 = (*state->swimmer_background_color >> 7) & 0x01;
r = 0x20 * bit0 + 0x40 * bit1 + 0x80 * bit2;
/* green component */
bit0 = (*swimmer_background_color >> 3) & 0x01;
bit1 = (*swimmer_background_color >> 4) & 0x01;
bit2 = (*swimmer_background_color >> 5) & 0x01;
bit0 = (*state->swimmer_background_color >> 3) & 0x01;
bit1 = (*state->swimmer_background_color >> 4) & 0x01;
bit2 = (*state->swimmer_background_color >> 5) & 0x01;
g = 0x20 * bit0 + 0x40 * bit1 + 0x80 * bit2;
/* blue component */
bit0 = (*swimmer_background_color >> 0) & 0x01;
bit1 = (*swimmer_background_color >> 1) & 0x01;
bit2 = (*swimmer_background_color >> 2) & 0x01;
bit0 = (*state->swimmer_background_color >> 0) & 0x01;
bit1 = (*state->swimmer_background_color >> 1) & 0x01;
bit2 = (*state->swimmer_background_color >> 2) & 0x01;
b = 0x20 * bit0 + 0x40 * bit1 + 0x80 * bit2;
palette_set_color(machine, CCLIMBER_BG_PEN, MAKE_RGB(r, g, b));
@ -346,34 +327,37 @@ static void swimmer_set_background_pen(running_machine *machine)
WRITE8_HANDLER( cclimber_colorram_w )
{
cclimber_state *state = space->machine->driver_data<cclimber_state>();
/* A5 is not connected, there is only 0x200 bytes of RAM */
cclimber_colorram[offset & ~0x20] = data;
cclimber_colorram[offset | 0x20] = data;
state->colorram[offset & ~0x20] = data;
state->colorram[offset | 0x20] = data;
}
WRITE8_HANDLER( cannonb_flip_screen_w )
{
cclimber_flip_screen[0] = data;
cclimber_flip_screen[1] = data;
cclimber_state *state = space->machine->driver_data<cclimber_state>();
state->flip_screen[0] = data;
state->flip_screen[1] = data;
}
static TILE_GET_INFO( cclimber_get_pf_tile_info )
{
cclimber_state *state = machine->driver_data<cclimber_state>();
int code, color;
int flags = TILE_FLIPYX(cclimber_colorram[tile_index] >> 6);
int flags = TILE_FLIPYX(state->colorram[tile_index] >> 6);
/* vertical flipping flips two adjacent characters */
if (flags & 0x02)
tile_index = tile_index ^ 0x20;
code = ((cclimber_colorram[tile_index] & 0x10) << 5) |
((cclimber_colorram[tile_index] & 0x20) << 3) |
cclimber_videoram[tile_index];
code = ((state->colorram[tile_index] & 0x10) << 5) |
((state->colorram[tile_index] & 0x20) << 3) |
state->videoram[tile_index];
color = cclimber_colorram[tile_index] & 0x0f;
color = state->colorram[tile_index] & 0x0f;
SET_TILE_INFO(0, code, color, flags);
}
@ -381,16 +365,17 @@ static TILE_GET_INFO( cclimber_get_pf_tile_info )
static TILE_GET_INFO( swimmer_get_pf_tile_info )
{
cclimber_state *state = machine->driver_data<cclimber_state>();
int code, color;
int flags = TILE_FLIPYX(cclimber_colorram[tile_index] >> 6);
int flags = TILE_FLIPYX(state->colorram[tile_index] >> 6);
/* vertical flipping flips two adjacent characters */
if (flags & 0x02)
tile_index = tile_index ^ 0x20;
code = ((cclimber_colorram[tile_index] & 0x10) << 4) | cclimber_videoram[tile_index];
color = ((*swimmer_palettebank & 0x01) << 4) | (cclimber_colorram[tile_index] & 0x0f);
code = ((state->colorram[tile_index] & 0x10) << 4) | state->videoram[tile_index];
color = ((*state->swimmer_palettebank & 0x01) << 4) | (state->colorram[tile_index] & 0x0f);
SET_TILE_INFO(0, code, color, flags);
}
@ -398,10 +383,11 @@ static TILE_GET_INFO( swimmer_get_pf_tile_info )
static TILE_GET_INFO( toprollr_get_pf_tile_info )
{
cclimber_state *state = machine->driver_data<cclimber_state>();
int code, attr, color;
attr = tile_index & 0x10 ? cclimber_colorram[tile_index & ~0x20] : cclimber_colorram[tile_index];
code = ((attr & 0x30) << 4) | cclimber_videoram[tile_index];
attr = tile_index & 0x10 ? state->colorram[tile_index & ~0x20] : state->colorram[tile_index];
code = ((attr & 0x30) << 4) | state->videoram[tile_index];
color = attr & 0x0f;
SET_TILE_INFO(0, code, color, 0);
@ -410,6 +396,7 @@ static TILE_GET_INFO( toprollr_get_pf_tile_info )
static TILE_GET_INFO( cclimber_get_bs_tile_info )
{
cclimber_state *state = machine->driver_data<cclimber_state>();
int code, color;
/* only the lower right is visible */
@ -418,8 +405,8 @@ static TILE_GET_INFO( cclimber_get_bs_tile_info )
/* the address doesn't use A4 of the coordinates, giving a 16x16 map */
tile_index = ((tile_index & 0x1e0) >> 1) | (tile_index & 0x0f);
code = ((cclimber_bigsprite_control[1] & 0x08) << 5) | cclimber_bigsprite_videoram[tile_index];
color = cclimber_bigsprite_control[1] & 0x07;
code = ((state->bigsprite_control[1] & 0x08) << 5) | state->bigsprite_videoram[tile_index];
color = state->bigsprite_control[1] & 0x07;
SET_TILE_INFO(2, code, color, 0);
}
@ -427,6 +414,7 @@ static TILE_GET_INFO( cclimber_get_bs_tile_info )
static TILE_GET_INFO( toprollr_get_bs_tile_info )
{
cclimber_state *state = machine->driver_data<cclimber_state>();
int code, color;
/* only the lower right is visible */
@ -435,8 +423,8 @@ static TILE_GET_INFO( toprollr_get_bs_tile_info )
/* the address doesn't use A4 of the coordinates, giving a 16x16 map */
tile_index = ((tile_index & 0x1e0) >> 1) | (tile_index & 0x0f);
code = ((cclimber_bigsprite_control[1] & 0x18) << 5) | cclimber_bigsprite_videoram[tile_index];
color = cclimber_bigsprite_control[1] & 0x07;
code = ((state->bigsprite_control[1] & 0x18) << 5) | state->bigsprite_videoram[tile_index];
color = state->bigsprite_control[1] & 0x07;
SET_TILE_INFO(2, code, color, 0);
}
@ -444,8 +432,9 @@ static TILE_GET_INFO( toprollr_get_bs_tile_info )
static TILE_GET_INFO( toproller_get_bg_tile_info )
{
int code = ((toprollr_bg_coloram[tile_index] & 0x40) << 2) | toprollr_bg_videoram[tile_index];
int color = toprollr_bg_coloram[tile_index] & 0x0f;
cclimber_state *state = machine->driver_data<cclimber_state>();
int code = ((state->toprollr_bg_coloram[tile_index] & 0x40) << 2) | state->toprollr_bg_videoram[tile_index];
int color = state->toprollr_bg_coloram[tile_index] & 0x0f;
SET_TILE_INFO(3, code, color, TILE_FLIPX);
}
@ -453,68 +442,73 @@ static TILE_GET_INFO( toproller_get_bg_tile_info )
VIDEO_START( cclimber )
{
pf_tilemap = tilemap_create(machine, cclimber_get_pf_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_transparent_pen(pf_tilemap, 0);
tilemap_set_scroll_cols(pf_tilemap, 32);
cclimber_state *state = machine->driver_data<cclimber_state>();
state->pf_tilemap = tilemap_create(machine, cclimber_get_pf_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_transparent_pen(state->pf_tilemap, 0);
tilemap_set_scroll_cols(state->pf_tilemap, 32);
bs_tilemap = tilemap_create(machine, cclimber_get_bs_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_scroll_cols(bs_tilemap, 1);
tilemap_set_scroll_rows(bs_tilemap, 1);
tilemap_set_transmask(bs_tilemap, 0, 0x01, 0); /* pen 0 is transaprent */
tilemap_set_transmask(bs_tilemap, 1, 0x0f, 0); /* all 4 pens are transparent */
state->bs_tilemap = tilemap_create(machine, cclimber_get_bs_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_scroll_cols(state->bs_tilemap, 1);
tilemap_set_scroll_rows(state->bs_tilemap, 1);
tilemap_set_transmask(state->bs_tilemap, 0, 0x01, 0); /* pen 0 is transaprent */
tilemap_set_transmask(state->bs_tilemap, 1, 0x0f, 0); /* all 4 pens are transparent */
}
VIDEO_START( swimmer )
{
pf_tilemap = tilemap_create(machine, swimmer_get_pf_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_transparent_pen(pf_tilemap, 0);
tilemap_set_scroll_cols(pf_tilemap, 32);
cclimber_state *state = machine->driver_data<cclimber_state>();
state->pf_tilemap = tilemap_create(machine, swimmer_get_pf_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_transparent_pen(state->pf_tilemap, 0);
tilemap_set_scroll_cols(state->pf_tilemap, 32);
bs_tilemap = tilemap_create(machine, cclimber_get_bs_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_scroll_cols(bs_tilemap, 1);
tilemap_set_scroll_rows(bs_tilemap, 1);
tilemap_set_transmask(bs_tilemap, 0, 0x01, 0); /* pen 0 is transaprent */
tilemap_set_transmask(bs_tilemap, 1, 0xff, 0); /* all 8 pens are transparent */
state->bs_tilemap = tilemap_create(machine, cclimber_get_bs_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_scroll_cols(state->bs_tilemap, 1);
tilemap_set_scroll_rows(state->bs_tilemap, 1);
tilemap_set_transmask(state->bs_tilemap, 0, 0x01, 0); /* pen 0 is transaprent */
tilemap_set_transmask(state->bs_tilemap, 1, 0xff, 0); /* all 8 pens are transparent */
}
VIDEO_START( toprollr )
{
pf_tilemap = tilemap_create(machine, toprollr_get_pf_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_transparent_pen(pf_tilemap, 0);
cclimber_state *state = machine->driver_data<cclimber_state>();
state->pf_tilemap = tilemap_create(machine, toprollr_get_pf_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_transparent_pen(state->pf_tilemap, 0);
toproller_bg_tilemap = tilemap_create(machine, toproller_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_scroll_rows(toproller_bg_tilemap, 1);
state->toproller_bg_tilemap = tilemap_create(machine, toproller_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_scroll_rows(state->toproller_bg_tilemap, 1);
bs_tilemap = tilemap_create(machine, toprollr_get_bs_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_scroll_cols(bs_tilemap, 1);
tilemap_set_scroll_rows(bs_tilemap, 1);
tilemap_set_transmask(bs_tilemap, 0, 0x01, 0); /* pen 0 is transaprent */
tilemap_set_transmask(bs_tilemap, 1, 0x0f, 0); /* all 4 pens are transparent */
state->bs_tilemap = tilemap_create(machine, toprollr_get_bs_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_scroll_cols(state->bs_tilemap, 1);
tilemap_set_scroll_rows(state->bs_tilemap, 1);
tilemap_set_transmask(state->bs_tilemap, 0, 0x01, 0); /* pen 0 is transaprent */
tilemap_set_transmask(state->bs_tilemap, 1, 0x0f, 0); /* all 4 pens are transparent */
}
static void draw_playfield(bitmap_t *bitmap, const rectangle *cliprect)
static void draw_playfield(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
{
cclimber_state *state = machine->driver_data<cclimber_state>();
int i;
tilemap_mark_all_tiles_dirty(pf_tilemap);
tilemap_set_flip(pf_tilemap, (CCLIMBER_FLIP_X ? TILEMAP_FLIPX : 0) |
tilemap_mark_all_tiles_dirty(state->pf_tilemap);
tilemap_set_flip(state->pf_tilemap, (CCLIMBER_FLIP_X ? TILEMAP_FLIPX : 0) |
(CCLIMBER_FLIP_Y ? TILEMAP_FLIPY : 0));
for (i = 0; i < 32; i++)
tilemap_set_scrolly(pf_tilemap, i, cclimber_column_scroll[i]);
tilemap_set_scrolly(state->pf_tilemap, i, state->column_scroll[i]);
tilemap_draw(bitmap, cliprect, pf_tilemap, 0, 0);
tilemap_draw(bitmap, cliprect, state->pf_tilemap, 0, 0);
}
static void cclimber_draw_bigsprite(bitmap_t *bitmap, const rectangle *cliprect)
static void cclimber_draw_bigsprite(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
{
UINT8 x = cclimber_bigsprite_control[3] - 8;
UINT8 y = cclimber_bigsprite_control[2];
int bigsprite_flip_x = (cclimber_bigsprite_control[1] & 0x10) >> 4;
int bigsprite_flip_y = (cclimber_bigsprite_control[1] & 0x20) >> 5;
cclimber_state *state = machine->driver_data<cclimber_state>();
UINT8 x = state->bigsprite_control[3] - 8;
UINT8 y = state->bigsprite_control[2];
int bigsprite_flip_x = (state->bigsprite_control[1] & 0x10) >> 4;
int bigsprite_flip_y = (state->bigsprite_control[1] & 0x20) >> 5;
if (bigsprite_flip_x)
x = 0x80 - x;
@ -522,56 +516,58 @@ static void cclimber_draw_bigsprite(bitmap_t *bitmap, const rectangle *cliprect)
if (bigsprite_flip_y)
y = 0x80 - y;
tilemap_mark_all_tiles_dirty(bs_tilemap);
tilemap_mark_all_tiles_dirty(state->bs_tilemap);
tilemap_set_flip(bs_tilemap, (bigsprite_flip_x ? TILEMAP_FLIPX : 0) |
tilemap_set_flip(state->bs_tilemap, (bigsprite_flip_x ? TILEMAP_FLIPX : 0) |
(CCLIMBER_FLIP_Y ^ bigsprite_flip_y ? TILEMAP_FLIPY : 0));
tilemap_set_scrollx(bs_tilemap, 0, x);
tilemap_set_scrolly(bs_tilemap, 0, y);
tilemap_set_scrollx(state->bs_tilemap, 0, x);
tilemap_set_scrolly(state->bs_tilemap, 0, y);
tilemap_draw(bitmap, cliprect, bs_tilemap, 0, 0);
tilemap_draw(bitmap, cliprect, state->bs_tilemap, 0, 0);
}
static void toprollr_draw_bigsprite(bitmap_t *bitmap, const rectangle *cliprect)
static void toprollr_draw_bigsprite(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
{
UINT8 x = cclimber_bigsprite_control[3] - 8;
UINT8 y = cclimber_bigsprite_control[2];
cclimber_state *state = machine->driver_data<cclimber_state>();
UINT8 x = state->bigsprite_control[3] - 8;
UINT8 y = state->bigsprite_control[2];
tilemap_mark_all_tiles_dirty(bs_tilemap);
tilemap_mark_all_tiles_dirty(state->bs_tilemap);
tilemap_set_flip(bs_tilemap, CCLIMBER_FLIP_Y ? TILEMAP_FLIPY : 0);
tilemap_set_flip(state->bs_tilemap, CCLIMBER_FLIP_Y ? TILEMAP_FLIPY : 0);
tilemap_set_scrollx(bs_tilemap, 0, x);
tilemap_set_scrolly(bs_tilemap, 0, y);
tilemap_set_scrollx(state->bs_tilemap, 0, x);
tilemap_set_scrolly(state->bs_tilemap, 0, y);
tilemap_draw(bitmap, cliprect, bs_tilemap, 0, 0);
tilemap_draw(bitmap, cliprect, state->bs_tilemap, 0, 0);
}
static void cclimber_draw_sprites(bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx)
{
cclimber_state *state = gfx->machine->driver_data<cclimber_state>();
int offs;
/* draw the sprites -- note that it is important to draw them exactly in this
order, to have the correct priorities. */
for (offs = 0x1c; offs >= 0; offs -= 4)
{
int x = cclimber_spriteram[offs + 3] + 1;
int x = state->spriteram[offs + 3] + 1;
/* x + 1 is evident in cclimber and ckong. It looks worse,
but it has been confirmed on several PCBs. */
int y = 240 - cclimber_spriteram[offs + 2];
int y = 240 - state->spriteram[offs + 2];
int code = ((cclimber_spriteram[offs + 1] & 0x10) << 3) |
((cclimber_spriteram[offs + 1] & 0x20) << 1) |
( cclimber_spriteram[offs + 0] & 0x3f);
int code = ((state->spriteram[offs + 1] & 0x10) << 3) |
((state->spriteram[offs + 1] & 0x20) << 1) |
( state->spriteram[offs + 0] & 0x3f);
int color = cclimber_spriteram[offs + 1] & 0x0f;
int color = state->spriteram[offs + 1] & 0x0f;
int flipx = cclimber_spriteram[offs + 0] & 0x40;
int flipy = cclimber_spriteram[offs + 0] & 0x80;
int flipx = state->spriteram[offs + 0] & 0x40;
int flipy = state->spriteram[offs + 0] & 0x80;
if (CCLIMBER_FLIP_X)
{
@ -592,23 +588,24 @@ static void cclimber_draw_sprites(bitmap_t *bitmap, const rectangle *cliprect, c
static void toprollr_draw_sprites(bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx)
{
cclimber_state *state = gfx->machine->driver_data<cclimber_state>();
int offs;
/* draw the sprites -- note that it is important to draw them exactly in this
order, to have the correct priorities. */
for (offs = 0x1c; offs >= 0; offs -= 4)
{
int x = cclimber_spriteram[offs + 3];
int y = 240 - cclimber_spriteram[offs + 2];
int x = state->spriteram[offs + 3];
int y = 240 - state->spriteram[offs + 2];
int code = ((cclimber_spriteram[offs + 1] & 0x10) << 3) |
((cclimber_spriteram[offs + 1] & 0x20) << 1) |
( cclimber_spriteram[offs + 0] & 0x3f);
int code = ((state->spriteram[offs + 1] & 0x10) << 3) |
((state->spriteram[offs + 1] & 0x20) << 1) |
( state->spriteram[offs + 0] & 0x3f);
int color = cclimber_spriteram[offs + 1] & 0x0f;
int color = state->spriteram[offs + 1] & 0x0f;
int flipx = cclimber_spriteram[offs + 0] & 0x40;
int flipy = cclimber_spriteram[offs + 0] & 0x80;
int flipx = state->spriteram[offs + 0] & 0x40;
int flipy = state->spriteram[offs + 0] & 0x80;
if (CCLIMBER_FLIP_X)
{
@ -629,23 +626,24 @@ static void toprollr_draw_sprites(bitmap_t *bitmap, const rectangle *cliprect, c
static void swimmer_draw_sprites(bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx)
{
cclimber_state *state = gfx->machine->driver_data<cclimber_state>();
int offs;
/* draw the sprites -- note that it is important to draw them exactly in this
order, to have the correct priorities. */
for (offs = 0x1c; offs >= 0; offs -= 4)
{
int x = cclimber_spriteram[offs + 3];
int y = 240 - cclimber_spriteram[offs + 2];
int x = state->spriteram[offs + 3];
int y = 240 - state->spriteram[offs + 2];
int code = ((cclimber_spriteram[offs + 1] & 0x10) << 2) |
(cclimber_spriteram[offs + 0] & 0x3f);
int code = ((state->spriteram[offs + 1] & 0x10) << 2) |
(state->spriteram[offs + 0] & 0x3f);
int color = ((*swimmer_palettebank & 0x01) << 4) |
(cclimber_spriteram[offs + 1] & 0x0f);
int color = ((*state->swimmer_palettebank & 0x01) << 4) |
(state->spriteram[offs + 1] & 0x0f);
int flipx = cclimber_spriteram[offs + 0] & 0x40;
int flipy = cclimber_spriteram[offs + 0] & 0x80;
int flipx = state->spriteram[offs + 0] & 0x40;
int flipy = state->spriteram[offs + 0] & 0x80;
if (CCLIMBER_FLIP_X)
{
@ -666,13 +664,14 @@ static void swimmer_draw_sprites(bitmap_t *bitmap, const rectangle *cliprect, co
SCREEN_UPDATE( cclimber )
{
cclimber_state *state = screen->machine->driver_data<cclimber_state>();
bitmap_fill(bitmap, cliprect, CCLIMBER_BG_PEN);
draw_playfield(bitmap, cliprect);
draw_playfield(screen->machine, bitmap, cliprect);
/* draw the "big sprite" under the regular sprites */
if ((cclimber_bigsprite_control[0] & 0x01))
if ((state->bigsprite_control[0] & 0x01))
{
cclimber_draw_bigsprite(bitmap, cliprect);
cclimber_draw_bigsprite(screen->machine, bitmap, cliprect);
cclimber_draw_sprites(bitmap, cliprect, screen->machine->gfx[1]);
}
@ -680,7 +679,7 @@ SCREEN_UPDATE( cclimber )
else
{
cclimber_draw_sprites(bitmap, cliprect, screen->machine->gfx[1]);
cclimber_draw_bigsprite(bitmap, cliprect);
cclimber_draw_bigsprite(screen->machine, bitmap, cliprect);
}
return 0;
@ -689,6 +688,7 @@ SCREEN_UPDATE( cclimber )
SCREEN_UPDATE( yamato )
{
cclimber_state *state = screen->machine->driver_data<cclimber_state>();
int i;
UINT8 *sky_rom = screen->machine->region("user1")->base() + 0x1200;
@ -701,12 +701,12 @@ SCREEN_UPDATE( yamato )
*BITMAP_ADDR16(bitmap, j, (i - 8) & 0xff) = pen;
}
draw_playfield(bitmap, cliprect);
draw_playfield(screen->machine, bitmap, cliprect);
/* draw the "big sprite" under the regular sprites */
if ((cclimber_bigsprite_control[0] & 0x01))
if ((state->bigsprite_control[0] & 0x01))
{
cclimber_draw_bigsprite(bitmap, cliprect);
cclimber_draw_bigsprite(screen->machine, bitmap, cliprect);
toprollr_draw_sprites(bitmap, cliprect, screen->machine->gfx[1]);
}
@ -714,7 +714,7 @@ SCREEN_UPDATE( yamato )
else
{
toprollr_draw_sprites(bitmap, cliprect, screen->machine->gfx[1]);
cclimber_draw_bigsprite(bitmap, cliprect);
cclimber_draw_bigsprite(screen->machine, bitmap, cliprect);
}
return 0;
@ -723,9 +723,10 @@ SCREEN_UPDATE( yamato )
SCREEN_UPDATE( swimmer )
{
cclimber_state *state = screen->machine->driver_data<cclimber_state>();
swimmer_set_background_pen(screen->machine);
if (*swimmer_side_background_enabled & 0x01)
if (*state->swimmer_side_background_enabled & 0x01)
{
if (CCLIMBER_FLIP_X)
{
@ -753,12 +754,12 @@ SCREEN_UPDATE( swimmer )
else
bitmap_fill(bitmap, cliprect, CCLIMBER_BG_PEN);
draw_playfield(bitmap, cliprect);
draw_playfield(screen->machine, bitmap, cliprect);
/* draw the "big sprite" under the regular sprites */
if ((cclimber_bigsprite_control[0] & 0x01))
if ((state->bigsprite_control[0] & 0x01))
{
cclimber_draw_bigsprite(bitmap, cliprect);
cclimber_draw_bigsprite(screen->machine, bitmap, cliprect);
swimmer_draw_sprites(bitmap, cliprect, screen->machine->gfx[1]);
}
@ -766,7 +767,7 @@ SCREEN_UPDATE( swimmer )
else
{
swimmer_draw_sprites(bitmap, cliprect, screen->machine->gfx[1]);
cclimber_draw_bigsprite(bitmap, cliprect);
cclimber_draw_bigsprite(screen->machine, bitmap, cliprect);
}
return 0;
@ -775,36 +776,37 @@ SCREEN_UPDATE( swimmer )
SCREEN_UPDATE( toprollr )
{
cclimber_state *state = screen->machine->driver_data<cclimber_state>();
rectangle scroll_area_clip = *cliprect;
scroll_area_clip.min_x = 4*8;
scroll_area_clip.max_x = 29*8-1;
bitmap_fill(bitmap, cliprect, CCLIMBER_BG_PEN);
tilemap_set_scrollx(toproller_bg_tilemap, 0, toprollr_bg_videoram[0]);
tilemap_set_flip(toproller_bg_tilemap, (CCLIMBER_FLIP_X ? TILEMAP_FLIPX : 0) |
tilemap_set_scrollx(state->toproller_bg_tilemap, 0, state->toprollr_bg_videoram[0]);
tilemap_set_flip(state->toproller_bg_tilemap, (CCLIMBER_FLIP_X ? TILEMAP_FLIPX : 0) |
(CCLIMBER_FLIP_Y ? TILEMAP_FLIPY : 0));
tilemap_mark_all_tiles_dirty(toproller_bg_tilemap);
tilemap_draw(bitmap, &scroll_area_clip, toproller_bg_tilemap, 0, 0);
tilemap_mark_all_tiles_dirty(state->toproller_bg_tilemap);
tilemap_draw(bitmap, &scroll_area_clip, state->toproller_bg_tilemap, 0, 0);
/* draw the "big sprite" over the regular sprites */
if ((cclimber_bigsprite_control[1] & 0x20))
if ((state->bigsprite_control[1] & 0x20))
{
toprollr_draw_sprites(bitmap, &scroll_area_clip, screen->machine->gfx[1]);
toprollr_draw_bigsprite(bitmap, &scroll_area_clip);
toprollr_draw_bigsprite(screen->machine, bitmap, &scroll_area_clip);
}
/* draw the "big sprite" under the regular sprites */
else
{
toprollr_draw_bigsprite(bitmap, &scroll_area_clip);
toprollr_draw_bigsprite(screen->machine, bitmap, &scroll_area_clip);
toprollr_draw_sprites(bitmap, &scroll_area_clip, screen->machine->gfx[1]);
}
tilemap_mark_all_tiles_dirty(pf_tilemap);
tilemap_set_flip(pf_tilemap, (CCLIMBER_FLIP_X ? TILEMAP_FLIPX : 0) |
tilemap_mark_all_tiles_dirty(state->pf_tilemap);
tilemap_set_flip(state->pf_tilemap, (CCLIMBER_FLIP_X ? TILEMAP_FLIPX : 0) |
(CCLIMBER_FLIP_Y ? TILEMAP_FLIPY : 0));
tilemap_draw(bitmap, cliprect, pf_tilemap, 0, 0);
tilemap_draw(bitmap, cliprect, state->pf_tilemap, 0, 0);
return 0;
}

View File

@ -24,25 +24,19 @@
***************************************************************************/
UINT16 *galpani2_bg8_0, *galpani2_bg8_1;
UINT16 *galpani2_palette_0, *galpani2_palette_1;
//UINT16 *galpani2_bg8_regs_0, *galpani2_bg8_regs_1;
UINT16 *galpani2_bg8_0_scrollx, *galpani2_bg8_1_scrollx;
UINT16 *galpani2_bg8_0_scrolly, *galpani2_bg8_1_scrolly;
static bitmap_t *galpani2_bg8_bitmap_0, *galpani2_bg8_bitmap_1;
#ifdef UNUSED_DEFINITION
#define galpani2_BG8_REGS_R( _n_ ) \
READ16_HANDLER( galpani2_bg8_regs_##_n_##_r ) \
{ \
galpani2_state *state = space->machine->driver_data<galpani2_state>(); \
switch (offset * 2) \
{ \
case 0x16: return space->machine->rand() & 1; \
default: \
logerror("CPU #0 PC %06X : Warning, bg8 #%d screen reg %04X read\n",cpu_get_pc(space->cpu),_n_,offset*2); \
} \
return galpani2_bg8_regs_##_n_[offset]; \
return state->bg8_regs_##_n_[offset]; \
}
/*
@ -55,25 +49,28 @@ READ16_HANDLER( galpani2_bg8_regs_##_n_##_r ) \
#define galpani2_BG8_REGS_W( _n_ ) \
WRITE16_HANDLER( galpani2_bg8_regs_##_n_##_w ) \
{ \
COMBINE_DATA(&galpani2_bg8_regs_##_n_[offset]); \
galpani2_state *state = space->machine->driver_data<galpani2_state>(); \
COMBINE_DATA(&state->bg8_regs_##_n_[offset]); \
}
#endif
#define galpani2_BG8_W( _n_ ) \
WRITE16_HANDLER( galpani2_bg8_##_n_##_w ) \
{ \
galpani2_state *state = space->machine->driver_data<galpani2_state>(); \
int x,y,pen; \
UINT16 newword = COMBINE_DATA(&galpani2_bg8_##_n_[offset]); \
UINT16 newword = COMBINE_DATA(&state->bg8_##_n_[offset]); \
pen = newword & 0xff; \
x = (offset % 512); /* 512 x 256 */ \
y = (offset / 512); \
*BITMAP_ADDR16(galpani2_bg8_bitmap_##_n_, y, x) = 0x4000 + pen; \
*BITMAP_ADDR16(state->bg8_bitmap_##_n_, y, x) = 0x4000 + pen; \
}
#define galpani2_BG8_PALETTE_W( _n_ ) \
WRITE16_HANDLER( galpani2_palette_##_n_##_w ) \
{ \
UINT16 newword = COMBINE_DATA(&galpani2_palette_##_n_[offset]); \
galpani2_state *state = space->machine->driver_data<galpani2_state>(); \
UINT16 newword = COMBINE_DATA(&state->palette_##_n_[offset]); \
palette_set_color_rgb( space->machine, offset + 0x4000 + _n_ * 0x100, pal5bit(newword >> 5), pal5bit(newword >> 10), pal5bit(newword >> 0) ); \
}
@ -100,19 +97,16 @@ galpani2_BG8_PALETTE_W( 1 )
***************************************************************************/
UINT16 *galpani2_bg15;
static bitmap_t *galpani2_bg15_bitmap;
/* 8 horizontal pages of 256x256 pixels? */
WRITE16_HANDLER( galpani2_bg15_w )
{
UINT16 newword = COMBINE_DATA(&galpani2_bg15[offset]);
galpani2_state *state = space->machine->driver_data<galpani2_state>();
UINT16 newword = COMBINE_DATA(&state->bg15[offset]);
int x = (offset % 256) + (offset / (256*256)) * 256 ;
int y = (offset / 256) % 256;
*BITMAP_ADDR16(galpani2_bg15_bitmap, y, x) = 0x4200 + (newword & 0x7fff);
*BITMAP_ADDR16(state->bg15_bitmap, y, x) = 0x4200 + (newword & 0x7fff);
}
@ -136,9 +130,10 @@ PALETTE_INIT( galpani2 )
VIDEO_START( galpani2 )
{
galpani2_bg15_bitmap = auto_bitmap_alloc(machine, 256*8, 256, BITMAP_FORMAT_INDEXED16);
galpani2_bg8_bitmap_0 = auto_bitmap_alloc(machine, 512, 256, BITMAP_FORMAT_INDEXED16);
galpani2_bg8_bitmap_1 = auto_bitmap_alloc(machine, 512, 256, BITMAP_FORMAT_INDEXED16);
galpani2_state *state = machine->driver_data<galpani2_state>();
state->bg15_bitmap = auto_bitmap_alloc(machine, 256*8, 256, BITMAP_FORMAT_INDEXED16);
state->bg8_bitmap_0 = auto_bitmap_alloc(machine, 512, 256, BITMAP_FORMAT_INDEXED16);
state->bg8_bitmap_1 = auto_bitmap_alloc(machine, 512, 256, BITMAP_FORMAT_INDEXED16);
VIDEO_START_CALL(kaneko16_sprites);
}
@ -154,6 +149,7 @@ VIDEO_START( galpani2 )
SCREEN_UPDATE( galpani2 )
{
galpani2_state *state = screen->machine->driver_data<galpani2_state>();
int layers_ctrl = -1;
#ifdef MAME_DEBUG
@ -175,7 +171,7 @@ if (input_code_pressed(screen->machine, KEYCODE_Z))
{
int x = 0;
int y = 0;
copyscrollbitmap_trans(bitmap, galpani2_bg15_bitmap,
copyscrollbitmap_trans(bitmap, state->bg15_bitmap,
1, &x, 1, &y,
cliprect,0x4200 + 0);
}
@ -188,18 +184,18 @@ if (input_code_pressed(screen->machine, KEYCODE_Z))
if (layers_ctrl & 0x2)
{
int x = - ( *galpani2_bg8_0_scrollx + 0x200 - 0x0f5 );
int y = - ( *galpani2_bg8_0_scrolly + 0x200 - 0x1be );
copyscrollbitmap_trans(bitmap, galpani2_bg8_bitmap_0,
int x = - ( *state->bg8_0_scrollx + 0x200 - 0x0f5 );
int y = - ( *state->bg8_0_scrolly + 0x200 - 0x1be );
copyscrollbitmap_trans(bitmap, state->bg8_bitmap_0,
1, &x, 1, &y,
cliprect,0x4000 + 0);
}
if (layers_ctrl & 0x4)
{
int x = - ( *galpani2_bg8_1_scrollx + 0x200 - 0x0f5 );
int y = - ( *galpani2_bg8_1_scrolly + 0x200 - 0x1be );
copyscrollbitmap_trans(bitmap, galpani2_bg8_bitmap_1,
int x = - ( *state->bg8_1_scrollx + 0x200 - 0x0f5 );
int y = - ( *state->bg8_1_scrolly + 0x200 - 0x1be );
copyscrollbitmap_trans(bitmap, state->bg8_bitmap_1,
1, &x, 1, &y,
cliprect,0x4000 + 0);
}

View File

@ -20,19 +20,6 @@
#include "includes/pacman.h"
#include "video/resnet.h"
UINT8 *pacman_videoram;
UINT8 *pacman_colorram;
static tilemap_t *bg_tilemap;
static UINT8 charbank;
static UINT8 spritebank;
static UINT8 palettebank;
static UINT8 colortablebank;
static UINT8 flipscreen;
static UINT8 bgpriority;
static int xoffsethack;
UINT8 *s2650games_spriteram;
UINT8 *s2650games_tileram;
static const rectangle spritevisiblearea =
{
@ -154,8 +141,9 @@ static TILEMAP_MAPPER( pacman_scan_rows )
static TILE_GET_INFO( pacman_get_tile_info )
{
int code = pacman_videoram[tile_index] | (charbank << 8);
int attr = (pacman_colorram[tile_index] & 0x1f) | (colortablebank << 5) | (palettebank << 6 );
pacman_state *state = machine->driver_data<pacman_state>();
int code = state->videoram[tile_index] | (state->charbank << 8);
int attr = (state->colorram[tile_index] & 0x1f) | (state->colortablebank << 5) | (state->palettebank << 6 );
SET_TILE_INFO(0,code,attr,0);
}
@ -168,61 +156,67 @@ static TILE_GET_INFO( pacman_get_tile_info )
static void init_save_state(running_machine *machine)
{
state_save_register_global(machine, charbank);
state_save_register_global(machine, spritebank);
state_save_register_global(machine, palettebank);
state_save_register_global(machine, colortablebank);
state_save_register_global(machine, flipscreen);
state_save_register_global(machine, bgpriority);
pacman_state *state = machine->driver_data<pacman_state>();
state_save_register_global(machine, state->charbank);
state_save_register_global(machine, state->spritebank);
state_save_register_global(machine, state->palettebank);
state_save_register_global(machine, state->colortablebank);
state_save_register_global(machine, state->flipscreen);
state_save_register_global(machine, state->bgpriority);
}
VIDEO_START( pacman )
{
pacman_state *state = machine->driver_data<pacman_state>();
init_save_state(machine);
charbank = 0;
spritebank = 0;
palettebank = 0;
colortablebank = 0;
flipscreen = 0;
bgpriority = 0;
state->charbank = 0;
state->spritebank = 0;
state->palettebank = 0;
state->colortablebank = 0;
state->flipscreen = 0;
state->bgpriority = 0;
/* In the Pac Man based games (NOT Pengo) the first two sprites must be offset */
/* one pixel to the left to get a more correct placement */
xoffsethack = 1;
state->xoffsethack = 1;
bg_tilemap = tilemap_create( machine, pacman_get_tile_info, pacman_scan_rows, 8, 8, 36, 28 );
state->bg_tilemap = tilemap_create( machine, pacman_get_tile_info, pacman_scan_rows, 8, 8, 36, 28 );
tilemap_set_scrolldx( bg_tilemap, 0, 384 - 288 );
tilemap_set_scrolldy( bg_tilemap, 0, 264 - 224 );
tilemap_set_scrolldx( state->bg_tilemap, 0, 384 - 288 );
tilemap_set_scrolldy( state->bg_tilemap, 0, 264 - 224 );
}
WRITE8_HANDLER( pacman_videoram_w )
{
pacman_videoram[offset] = data;
tilemap_mark_tile_dirty( bg_tilemap, offset );
pacman_state *state = space->machine->driver_data<pacman_state>();
state->videoram[offset] = data;
tilemap_mark_tile_dirty( state->bg_tilemap, offset );
}
WRITE8_HANDLER( pacman_colorram_w )
{
pacman_colorram[offset] = data;
tilemap_mark_tile_dirty( bg_tilemap, offset );
pacman_state *state = space->machine->driver_data<pacman_state>();
state->colorram[offset] = data;
tilemap_mark_tile_dirty( state->bg_tilemap, offset );
}
WRITE8_HANDLER( pacman_flipscreen_w )
{
flipscreen = data & 1;
tilemap_set_flip( bg_tilemap, flipscreen * ( TILEMAP_FLIPX + TILEMAP_FLIPY ) );
pacman_state *state = space->machine->driver_data<pacman_state>();
state->flipscreen = data & 1;
tilemap_set_flip( state->bg_tilemap, state->flipscreen * ( TILEMAP_FLIPX + TILEMAP_FLIPY ) );
}
SCREEN_UPDATE( pacman )
{
if (bgpriority != 0)
pacman_state *state = screen->machine->driver_data<pacman_state>();
if (state->bgpriority != 0)
bitmap_fill(bitmap,cliprect,0);
else
tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_OPAQUE,0);
tilemap_draw(bitmap,cliprect,state->bg_tilemap,TILEMAP_DRAW_OPAQUE,0);
if( screen->machine->generic.spriteram_size )
{
@ -242,10 +236,10 @@ SCREEN_UPDATE( pacman )
sx = 272 - spriteram_2[offs + 1];
sy = spriteram_2[offs] - 31;
color = ( spriteram[offs + 1] & 0x1f ) | (colortablebank << 5) | (palettebank << 6 );
color = ( spriteram[offs + 1] & 0x1f ) | (state->colortablebank << 5) | (state->palettebank << 6 );
drawgfx_transmask(bitmap,&spriteclip,screen->machine->gfx[1],
( spriteram[offs] >> 2 ) | (spritebank << 6),
( spriteram[offs] >> 2 ) | (state->spritebank << 6),
color,
spriteram[offs] & 1,spriteram[offs] & 2,
sx,sy,
@ -253,7 +247,7 @@ SCREEN_UPDATE( pacman )
/* also plot the sprite with wraparound (tunnel in Crush Roller) */
drawgfx_transmask(bitmap,&spriteclip,screen->machine->gfx[1],
( spriteram[offs] >> 2 ) | (spritebank << 6),
( spriteram[offs] >> 2 ) | (state->spritebank << 6),
color,
spriteram[offs] & 1,spriteram[offs] & 2,
sx - 256,sy,
@ -268,27 +262,27 @@ SCREEN_UPDATE( pacman )
sx = 272 - spriteram_2[offs + 1];
sy = spriteram_2[offs] - 31;
color = ( spriteram[offs + 1] & 0x1f ) | (colortablebank << 5) | (palettebank << 6 );
color = ( spriteram[offs + 1] & 0x1f ) | (state->colortablebank << 5) | (state->palettebank << 6 );
drawgfx_transmask(bitmap,&spriteclip,screen->machine->gfx[1],
( spriteram[offs] >> 2 ) | (spritebank << 6),
( spriteram[offs] >> 2 ) | (state->spritebank << 6),
color,
spriteram[offs] & 1,spriteram[offs] & 2,
sx,sy + xoffsethack,
sx,sy + state->xoffsethack,
colortable_get_transpen_mask(screen->machine->colortable, screen->machine->gfx[1], color & 0x3f, 0));
/* also plot the sprite with wraparound (tunnel in Crush Roller) */
drawgfx_transmask(bitmap,&spriteclip,screen->machine->gfx[1],
( spriteram[offs] >> 2 ) | (spritebank << 6),
( spriteram[offs] >> 2 ) | (state->spritebank << 6),
color,
spriteram[offs] & 2,spriteram[offs] & 1,
sx - 256,sy + xoffsethack,
sx - 256,sy + state->xoffsethack,
colortable_get_transpen_mask(screen->machine->colortable, screen->machine->gfx[1], color & 0x3f, 0));
}
}
if (bgpriority != 0)
tilemap_draw(bitmap,cliprect,bg_tilemap,0,0);
if (state->bgpriority != 0)
tilemap_draw(bitmap,cliprect,state->bg_tilemap,0,0);
return 0;
}
@ -301,48 +295,52 @@ SCREEN_UPDATE( pacman )
VIDEO_START( pengo )
{
pacman_state *state = machine->driver_data<pacman_state>();
init_save_state(machine);
charbank = 0;
spritebank = 0;
palettebank = 0;
colortablebank = 0;
flipscreen = 0;
bgpriority = 0;
state->charbank = 0;
state->spritebank = 0;
state->palettebank = 0;
state->colortablebank = 0;
state->flipscreen = 0;
state->bgpriority = 0;
xoffsethack = 0;
state->xoffsethack = 0;
bg_tilemap = tilemap_create( machine, pacman_get_tile_info, pacman_scan_rows, 8, 8, 36, 28 );
state->bg_tilemap = tilemap_create( machine, pacman_get_tile_info, pacman_scan_rows, 8, 8, 36, 28 );
tilemap_set_scrolldx( bg_tilemap, 0, 384 - 288 );
tilemap_set_scrolldy( bg_tilemap, 0, 264 - 224 );
tilemap_set_scrolldx( state->bg_tilemap, 0, 384 - 288 );
tilemap_set_scrolldy( state->bg_tilemap, 0, 264 - 224 );
}
WRITE8_HANDLER( pengo_palettebank_w )
{
if (palettebank != data)
pacman_state *state = space->machine->driver_data<pacman_state>();
if (state->palettebank != data)
{
palettebank = data;
tilemap_mark_all_tiles_dirty( bg_tilemap );
state->palettebank = data;
tilemap_mark_all_tiles_dirty( state->bg_tilemap );
}
}
WRITE8_HANDLER( pengo_colortablebank_w )
{
if (colortablebank != data)
pacman_state *state = space->machine->driver_data<pacman_state>();
if (state->colortablebank != data)
{
colortablebank = data;
tilemap_mark_all_tiles_dirty( bg_tilemap );
state->colortablebank = data;
tilemap_mark_all_tiles_dirty( state->bg_tilemap );
}
}
WRITE8_HANDLER( pengo_gfxbank_w )
{
if (charbank != (data & 1))
pacman_state *state = space->machine->driver_data<pacman_state>();
if (state->charbank != (data & 1))
{
spritebank = data & 1;
charbank = data & 1;
tilemap_mark_all_tiles_dirty( bg_tilemap );
state->spritebank = data & 1;
state->charbank = data & 1;
tilemap_mark_all_tiles_dirty( state->bg_tilemap );
}
}
@ -355,41 +353,44 @@ S2650 Games
static TILE_GET_INFO( s2650_get_tile_info )
{
pacman_state *state = machine->driver_data<pacman_state>();
int colbank, code, attr;
colbank = s2650games_tileram[tile_index & 0x1f] & 0x3;
colbank = state->s2650games_tileram[tile_index & 0x1f] & 0x3;
code = pacman_videoram[tile_index] + (colbank << 8);
attr = pacman_colorram[tile_index & 0x1f];
code = state->videoram[tile_index] + (colbank << 8);
attr = state->colorram[tile_index & 0x1f];
SET_TILE_INFO(0,code,attr & 0x1f,0);
}
VIDEO_START( s2650games )
{
pacman_state *state = machine->driver_data<pacman_state>();
init_save_state(machine);
charbank = 0;
spritebank = 0;
palettebank = 0;
colortablebank = 0;
flipscreen = 0;
bgpriority = 0;
state->charbank = 0;
state->spritebank = 0;
state->palettebank = 0;
state->colortablebank = 0;
state->flipscreen = 0;
state->bgpriority = 0;
xoffsethack = 1;
state->xoffsethack = 1;
bg_tilemap = tilemap_create( machine, s2650_get_tile_info,tilemap_scan_rows,8,8,32,32 );
state->bg_tilemap = tilemap_create( machine, s2650_get_tile_info,tilemap_scan_rows,8,8,32,32 );
tilemap_set_scroll_cols(bg_tilemap, 32);
tilemap_set_scroll_cols(state->bg_tilemap, 32);
}
SCREEN_UPDATE( s2650games )
{
pacman_state *state = screen->machine->driver_data<pacman_state>();
UINT8 *spriteram = screen->machine->generic.spriteram.u8;
UINT8 *spriteram_2 = screen->machine->generic.spriteram2.u8;
int offs;
tilemap_draw(bitmap,cliprect,bg_tilemap,0,0);
tilemap_draw(bitmap,cliprect,state->bg_tilemap,0,0);
for (offs = screen->machine->generic.spriteram_size - 2;offs > 2*2;offs -= 2)
{
@ -403,7 +404,7 @@ SCREEN_UPDATE( s2650games )
/* TODO: ?? */
drawgfx_transmask(bitmap,cliprect,screen->machine->gfx[1],
(spriteram[offs] >> 2) | ((s2650games_spriteram[offs] & 3) << 6),
(spriteram[offs] >> 2) | ((state->s2650games_spriteram[offs] & 3) << 6),
color,
spriteram[offs] & 1,spriteram[offs] & 2,
sx,sy,
@ -423,10 +424,10 @@ SCREEN_UPDATE( s2650games )
/* TODO: ?? */
drawgfx_transmask(bitmap,cliprect,screen->machine->gfx[1],
(spriteram[offs] >> 2) | ((s2650games_spriteram[offs] & 3)<<6),
(spriteram[offs] >> 2) | ((state->s2650games_spriteram[offs] & 3)<<6),
color,
spriteram[offs] & 1,spriteram[offs] & 2,
sx,sy + xoffsethack,
sx,sy + state->xoffsethack,
colortable_get_transpen_mask(screen->machine->colortable, screen->machine->gfx[1], color & 0x3f, 0));
}
return 0;
@ -434,27 +435,31 @@ SCREEN_UPDATE( s2650games )
WRITE8_HANDLER( s2650games_videoram_w )
{
pacman_videoram[offset] = data;
tilemap_mark_tile_dirty(bg_tilemap,offset);
pacman_state *state = space->machine->driver_data<pacman_state>();
state->videoram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap,offset);
}
WRITE8_HANDLER( s2650games_colorram_w )
{
pacman_state *state = space->machine->driver_data<pacman_state>();
int i;
pacman_colorram[offset & 0x1f] = data;
state->colorram[offset & 0x1f] = data;
for (i = offset; i < 0x0400; i += 32)
tilemap_mark_tile_dirty(bg_tilemap, i);
tilemap_mark_tile_dirty(state->bg_tilemap, i);
}
WRITE8_HANDLER( s2650games_scroll_w )
{
tilemap_set_scrolly(bg_tilemap, offset, data);
pacman_state *state = space->machine->driver_data<pacman_state>();
tilemap_set_scrolly(state->bg_tilemap, offset, data);
}
WRITE8_HANDLER( s2650games_tilesbank_w )
{
s2650games_tileram[offset] = data;
tilemap_mark_all_tiles_dirty(bg_tilemap);
pacman_state *state = space->machine->driver_data<pacman_state>();
state->s2650games_tileram[offset] = data;
tilemap_mark_all_tiles_dirty(state->bg_tilemap);
}
@ -494,6 +499,7 @@ static TILEMAP_MAPPER( jrpacman_scan_rows )
static TILE_GET_INFO( jrpacman_get_tile_info )
{
pacman_state *state = machine->driver_data<pacman_state>();
int color_index, code, attr;
if( tile_index < 1792 )
{
@ -504,32 +510,33 @@ static TILE_GET_INFO( jrpacman_get_tile_info )
color_index = tile_index + 0x80;
}
code = pacman_videoram[tile_index] | (charbank << 8);
attr = (pacman_videoram[color_index] & 0x1f) | (colortablebank << 5) | (palettebank << 6 );
code = state->videoram[tile_index] | (state->charbank << 8);
attr = (state->videoram[color_index] & 0x1f) | (state->colortablebank << 5) | (state->palettebank << 6 );
SET_TILE_INFO(0,code,attr,0);
}
static void jrpacman_mark_tile_dirty( int offset )
static void jrpacman_mark_tile_dirty( running_machine *machine, int offset )
{
pacman_state *state = machine->driver_data<pacman_state>();
if( offset < 0x20 )
{
/* line color - mark whole line as dirty */
int i;
for( i = 2 * 0x20; i < 56 * 0x20; i += 0x20 )
{
tilemap_mark_tile_dirty( bg_tilemap, offset + i );
tilemap_mark_tile_dirty( state->bg_tilemap, offset + i );
}
}
else if (offset < 1792)
{
/* tiles for playfield */
tilemap_mark_tile_dirty( bg_tilemap, offset );
tilemap_mark_tile_dirty( state->bg_tilemap, offset );
}
else
{
/* tiles & colors for top and bottom two rows */
tilemap_mark_tile_dirty( bg_tilemap, offset & ~0x80 );
tilemap_mark_tile_dirty( state->bg_tilemap, offset & ~0x80 );
}
}
@ -540,53 +547,59 @@ static void jrpacman_mark_tile_dirty( int offset )
***************************************************************************/
VIDEO_START( jrpacman )
{
pacman_state *state = machine->driver_data<pacman_state>();
init_save_state(machine);
charbank = 0;
spritebank = 0;
palettebank = 0;
colortablebank = 0;
flipscreen = 0;
bgpriority = 0;
state->charbank = 0;
state->spritebank = 0;
state->palettebank = 0;
state->colortablebank = 0;
state->flipscreen = 0;
state->bgpriority = 0;
xoffsethack = 1;
state->xoffsethack = 1;
bg_tilemap = tilemap_create( machine, jrpacman_get_tile_info,jrpacman_scan_rows,8,8,36,54 );
state->bg_tilemap = tilemap_create( machine, jrpacman_get_tile_info,jrpacman_scan_rows,8,8,36,54 );
tilemap_set_transparent_pen( bg_tilemap, 0 );
tilemap_set_scroll_cols( bg_tilemap, 36 );
tilemap_set_transparent_pen( state->bg_tilemap, 0 );
tilemap_set_scroll_cols( state->bg_tilemap, 36 );
}
WRITE8_HANDLER( jrpacman_videoram_w )
{
pacman_videoram[offset] = data;
jrpacman_mark_tile_dirty(offset);
pacman_state *state = space->machine->driver_data<pacman_state>();
state->videoram[offset] = data;
jrpacman_mark_tile_dirty(space->machine, offset);
}
WRITE8_HANDLER( jrpacman_charbank_w )
{
if (charbank != (data & 1))
pacman_state *state = space->machine->driver_data<pacman_state>();
if (state->charbank != (data & 1))
{
charbank = data & 1;
tilemap_mark_all_tiles_dirty(bg_tilemap);
state->charbank = data & 1;
tilemap_mark_all_tiles_dirty(state->bg_tilemap);
}
}
WRITE8_HANDLER( jrpacman_spritebank_w )
{
spritebank = (data & 1);
pacman_state *state = space->machine->driver_data<pacman_state>();
state->spritebank = (data & 1);
}
WRITE8_HANDLER( jrpacman_scroll_w )
{
pacman_state *state = space->machine->driver_data<pacman_state>();
int i;
for( i = 2; i < 34; i++ )
{
tilemap_set_scrolly( bg_tilemap, i, data );
tilemap_set_scrolly( state->bg_tilemap, i, data );
}
}
WRITE8_HANDLER( jrpacman_bgpriority_w )
{
bgpriority = (data & 1);
pacman_state *state = space->machine->driver_data<pacman_state>();
state->bgpriority = (data & 1);
}

View File

@ -1,151 +1,131 @@
#include "emu.h"
#include "includes/seibuspi.h"
static tilemap_t *text_layer;
static tilemap_t *back_layer;
static tilemap_t *mid_layer;
static tilemap_t *fore_layer;
UINT32 *spi_scrollram;
static UINT32 layer_bank;
static UINT32 layer_enable;
static UINT32 video_dma_length;
static UINT32 video_dma_address;
static UINT32 sprite_dma_length;
static int rf2_layer_bank[3];
static UINT32 *tilemap_ram;
static UINT32 *palette_ram;
static UINT32 *sprite_ram;
static int mid_layer_offset;
static int fore_layer_offset;
static int text_layer_offset;
static UINT32 bg_fore_layer_position;
static UINT8 alpha_table[8192];
static UINT8 sprite_bpp;
READ32_HANDLER( spi_layer_bank_r )
{
return layer_bank;
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
return state->layer_bank;
}
WRITE32_HANDLER( spi_layer_bank_w )
{
COMBINE_DATA( &layer_bank );
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
COMBINE_DATA( &state->layer_bank );
if (layer_bank & 0x80000000) {
fore_layer_offset = 0x1000 / 4;
mid_layer_offset = 0x2000 / 4;
text_layer_offset = 0x3000 / 4;
if (state->layer_bank & 0x80000000) {
state->fore_layer_offset = 0x1000 / 4;
state->mid_layer_offset = 0x2000 / 4;
state->text_layer_offset = 0x3000 / 4;
}
else {
fore_layer_offset = 0x800 / 4;
mid_layer_offset = 0x1000 / 4;
text_layer_offset = 0x1800 / 4;
state->fore_layer_offset = 0x800 / 4;
state->mid_layer_offset = 0x1000 / 4;
state->text_layer_offset = 0x1800 / 4;
}
}
void rf2_set_layer_banks(int banks)
void rf2_set_layer_banks(running_machine *machine, int banks)
{
if (rf2_layer_bank[0] != BIT(banks,0))
seibuspi_state *state = machine->driver_data<seibuspi_state>();
if (state->rf2_layer_bank[0] != BIT(banks,0))
{
rf2_layer_bank[0] = BIT(banks,0);
tilemap_mark_all_tiles_dirty(back_layer);
state->rf2_layer_bank[0] = BIT(banks,0);
tilemap_mark_all_tiles_dirty(state->back_layer);
}
if (rf2_layer_bank[1] != BIT(banks,1))
if (state->rf2_layer_bank[1] != BIT(banks,1))
{
rf2_layer_bank[1] = BIT(banks,1);
tilemap_mark_all_tiles_dirty(mid_layer);
state->rf2_layer_bank[1] = BIT(banks,1);
tilemap_mark_all_tiles_dirty(state->mid_layer);
}
if (rf2_layer_bank[2] != BIT(banks,2))
if (state->rf2_layer_bank[2] != BIT(banks,2))
{
rf2_layer_bank[2] = BIT(banks,2);
tilemap_mark_all_tiles_dirty(fore_layer);
state->rf2_layer_bank[2] = BIT(banks,2);
tilemap_mark_all_tiles_dirty(state->fore_layer);
}
}
#ifdef UNUSED_FUNCTION
READ32_HANDLER( spi_layer_enable_r )
{
return layer_enable;
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
return state->layer_enable;
}
#endif
WRITE32_HANDLER( spi_layer_enable_w )
{
COMBINE_DATA( &layer_enable );
tilemap_set_enable(back_layer, (layer_enable & 0x1) ^ 0x1);
tilemap_set_enable(mid_layer, ((layer_enable >> 1) & 0x1) ^ 0x1);
tilemap_set_enable(fore_layer, ((layer_enable >> 2) & 0x1) ^ 0x1);
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
COMBINE_DATA( &state->layer_enable );
tilemap_set_enable(state->back_layer, (state->layer_enable & 0x1) ^ 0x1);
tilemap_set_enable(state->mid_layer, ((state->layer_enable >> 1) & 0x1) ^ 0x1);
tilemap_set_enable(state->fore_layer, ((state->layer_enable >> 2) & 0x1) ^ 0x1);
}
WRITE32_HANDLER( tilemap_dma_start_w )
{
if (video_dma_address != 0)
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
if (state->video_dma_address != 0)
{
int i;
int index = (video_dma_address / 4) - 0x200;
int index = (state->video_dma_address / 4) - 0x200;
if (layer_bank & 0x80000000)
if (state->layer_bank & 0x80000000)
{
/* back layer */
for (i=0; i < 0x800/4; i++) {
UINT32 tile = spimainram[index];
if (tilemap_ram[i] != tile) {
tilemap_ram[i] = tile;
tilemap_mark_tile_dirty( back_layer, (i * 2) );
tilemap_mark_tile_dirty( back_layer, (i * 2) + 1 );
UINT32 tile = state->spimainram[index];
if (state->tilemap_ram[i] != tile) {
state->tilemap_ram[i] = tile;
tilemap_mark_tile_dirty( state->back_layer, (i * 2) );
tilemap_mark_tile_dirty( state->back_layer, (i * 2) + 1 );
}
index++;
}
/* back layer row scroll */
memcpy(&tilemap_ram[0x800/4], &spimainram[index], 0x800/4);
memcpy(&state->tilemap_ram[0x800/4], &state->spimainram[index], 0x800/4);
index += 0x800/4;
/* fore layer */
for (i=0; i < 0x800/4; i++) {
UINT32 tile = spimainram[index];
if (tilemap_ram[i+fore_layer_offset] != tile) {
tilemap_ram[i+fore_layer_offset] = tile;
tilemap_mark_tile_dirty( fore_layer, (i * 2) );
tilemap_mark_tile_dirty( fore_layer, (i * 2) + 1 );
UINT32 tile = state->spimainram[index];
if (state->tilemap_ram[i+state->fore_layer_offset] != tile) {
state->tilemap_ram[i+state->fore_layer_offset] = tile;
tilemap_mark_tile_dirty( state->fore_layer, (i * 2) );
tilemap_mark_tile_dirty( state->fore_layer, (i * 2) + 1 );
}
index++;
}
/* fore layer row scroll */
memcpy(&tilemap_ram[0x1800/4], &spimainram[index], 0x800/4);
memcpy(&state->tilemap_ram[0x1800/4], &state->spimainram[index], 0x800/4);
index += 0x800/4;
/* mid layer */
for (i=0; i < 0x800/4; i++) {
UINT32 tile = spimainram[index];
if (tilemap_ram[i+mid_layer_offset] != tile) {
tilemap_ram[i+mid_layer_offset] = tile;
tilemap_mark_tile_dirty( mid_layer, (i * 2) );
tilemap_mark_tile_dirty( mid_layer, (i * 2) + 1 );
UINT32 tile = state->spimainram[index];
if (state->tilemap_ram[i+state->mid_layer_offset] != tile) {
state->tilemap_ram[i+state->mid_layer_offset] = tile;
tilemap_mark_tile_dirty( state->mid_layer, (i * 2) );
tilemap_mark_tile_dirty( state->mid_layer, (i * 2) + 1 );
}
index++;
}
/* mid layer row scroll */
memcpy(&tilemap_ram[0x1800/4], &spimainram[index], 0x800/4);
memcpy(&state->tilemap_ram[0x1800/4], &state->spimainram[index], 0x800/4);
index += 0x800/4;
/* text layer */
for (i=0; i < 0x1000/4; i++) {
UINT32 tile = spimainram[index];
if (tilemap_ram[i+text_layer_offset] != tile) {
tilemap_ram[i+text_layer_offset] = tile;
tilemap_mark_tile_dirty( text_layer, (i * 2) );
tilemap_mark_tile_dirty( text_layer, (i * 2) + 1 );
UINT32 tile = state->spimainram[index];
if (state->tilemap_ram[i+state->text_layer_offset] != tile) {
state->tilemap_ram[i+state->text_layer_offset] = tile;
tilemap_mark_tile_dirty( state->text_layer, (i * 2) );
tilemap_mark_tile_dirty( state->text_layer, (i * 2) + 1 );
}
index++;
}
@ -154,44 +134,44 @@ WRITE32_HANDLER( tilemap_dma_start_w )
{
/* back layer */
for (i=0; i < 0x800/4; i++) {
UINT32 tile = spimainram[index];
if (tilemap_ram[i] != tile) {
tilemap_ram[i] = tile;
tilemap_mark_tile_dirty( back_layer, (i * 2) );
tilemap_mark_tile_dirty( back_layer, (i * 2) + 1 );
UINT32 tile = state->spimainram[index];
if (state->tilemap_ram[i] != tile) {
state->tilemap_ram[i] = tile;
tilemap_mark_tile_dirty( state->back_layer, (i * 2) );
tilemap_mark_tile_dirty( state->back_layer, (i * 2) + 1 );
}
index++;
}
/* fore layer */
for (i=0; i < 0x800/4; i++) {
UINT32 tile = spimainram[index];
if (tilemap_ram[i+fore_layer_offset] != tile) {
tilemap_ram[i+fore_layer_offset] = tile;
tilemap_mark_tile_dirty( fore_layer, (i * 2) );
tilemap_mark_tile_dirty( fore_layer, (i * 2) + 1 );
UINT32 tile = state->spimainram[index];
if (state->tilemap_ram[i+state->fore_layer_offset] != tile) {
state->tilemap_ram[i+state->fore_layer_offset] = tile;
tilemap_mark_tile_dirty( state->fore_layer, (i * 2) );
tilemap_mark_tile_dirty( state->fore_layer, (i * 2) + 1 );
}
index++;
}
/* mid layer */
for (i=0; i < 0x800/4; i++) {
UINT32 tile = spimainram[index];
if (tilemap_ram[i+mid_layer_offset] != tile) {
tilemap_ram[i+mid_layer_offset] = tile;
tilemap_mark_tile_dirty( mid_layer, (i * 2) );
tilemap_mark_tile_dirty( mid_layer, (i * 2) + 1 );
UINT32 tile = state->spimainram[index];
if (state->tilemap_ram[i+state->mid_layer_offset] != tile) {
state->tilemap_ram[i+state->mid_layer_offset] = tile;
tilemap_mark_tile_dirty( state->mid_layer, (i * 2) );
tilemap_mark_tile_dirty( state->mid_layer, (i * 2) + 1 );
}
index++;
}
/* text layer */
for (i=0; i < 0x1000/4; i++) {
UINT32 tile = spimainram[index];
if (tilemap_ram[i+text_layer_offset] != tile) {
tilemap_ram[i+text_layer_offset] = tile;
tilemap_mark_tile_dirty( text_layer, (i * 2) );
tilemap_mark_tile_dirty( text_layer, (i * 2) + 1 );
UINT32 tile = state->spimainram[index];
if (state->tilemap_ram[i+state->text_layer_offset] != tile) {
state->tilemap_ram[i+state->text_layer_offset] = tile;
tilemap_mark_tile_dirty( state->text_layer, (i * 2) );
tilemap_mark_tile_dirty( state->text_layer, (i * 2) + 1 );
}
index++;
}
@ -201,16 +181,17 @@ WRITE32_HANDLER( tilemap_dma_start_w )
WRITE32_HANDLER( palette_dma_start_w )
{
if (video_dma_address != 0)
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
if (state->video_dma_address != 0)
{
int i;
for (i=0; i < ((video_dma_length+1) * 2) / 4; i++)
for (i=0; i < ((state->video_dma_length+1) * 2) / 4; i++)
{
UINT32 color = spimainram[(video_dma_address / 4) + i - 0x200];
if (palette_ram[i] != color) {
palette_ram[i] = color;
palette_set_color_rgb( space->machine, (i * 2), pal5bit(palette_ram[i] >> 0), pal5bit(palette_ram[i] >> 5), pal5bit(palette_ram[i] >> 10) );
palette_set_color_rgb( space->machine, (i * 2) + 1, pal5bit(palette_ram[i] >> 16), pal5bit(palette_ram[i] >> 21), pal5bit(palette_ram[i] >> 26) );
UINT32 color = state->spimainram[(state->video_dma_address / 4) + i - 0x200];
if (state->palette_ram[i] != color) {
state->palette_ram[i] = color;
palette_set_color_rgb( space->machine, (i * 2), pal5bit(state->palette_ram[i] >> 0), pal5bit(state->palette_ram[i] >> 5), pal5bit(state->palette_ram[i] >> 10) );
palette_set_color_rgb( space->machine, (i * 2) + 1, pal5bit(state->palette_ram[i] >> 16), pal5bit(state->palette_ram[i] >> 21), pal5bit(state->palette_ram[i] >> 26) );
}
}
}
@ -218,24 +199,28 @@ WRITE32_HANDLER( palette_dma_start_w )
WRITE32_HANDLER( sprite_dma_start_w )
{
if (video_dma_address != 0)
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
if (state->video_dma_address != 0)
{
memcpy( sprite_ram, &spimainram[(video_dma_address / 4) - 0x200], sprite_dma_length);
memcpy( state->sprite_ram, &state->spimainram[(state->video_dma_address / 4) - 0x200], state->sprite_dma_length);
}
}
WRITE32_HANDLER( video_dma_length_w )
{
COMBINE_DATA( &video_dma_length );
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
COMBINE_DATA( &state->video_dma_length );
}
WRITE32_HANDLER( video_dma_address_w )
{
COMBINE_DATA( &video_dma_address );
seibuspi_state *state = space->machine->driver_data<seibuspi_state>();
COMBINE_DATA( &state->video_dma_address );
}
static void drawgfx_blend(bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, int sx, int sy)
{
seibuspi_state *state = gfx->machine->driver_data<seibuspi_state>();
const pen_t *pens = &gfx->machine->pens[gfx->color_base];
const UINT8 *dp;
int i, j;
@ -322,7 +307,7 @@ static void drawgfx_blend(bitmap_t *bitmap, const rectangle *cliprect, const gfx
for (j=y1; j <= y2; j++)
{
UINT32 *p = BITMAP_ADDR32(bitmap, j, 0);
UINT8 trans_pen = (1 << sprite_bpp) - 1;
UINT8 trans_pen = (1 << state->sprite_bpp) - 1;
int dp_i = (py * width) + px;
py += yd;
@ -331,8 +316,8 @@ static void drawgfx_blend(bitmap_t *bitmap, const rectangle *cliprect, const gfx
UINT8 pen = dp[dp_i];
if (pen != trans_pen)
{
int global_pen = pen + (color << sprite_bpp);
UINT8 alpha = alpha_table[global_pen];
int global_pen = pen + (color << state->sprite_bpp);
UINT8 alpha = state->alpha_table[global_pen];
if (alpha)
{
p[i] = alpha_blend_r32(p[i], pens[global_pen], 0x7f);
@ -360,6 +345,7 @@ static const int sprite_ytable[2][8] =
static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int pri_mask)
{
seibuspi_state *state = machine->driver_data<seibuspi_state>();
INT16 xpos, ypos;
int tile_num, color;
int width, height;
@ -369,33 +355,33 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
int x,y, x1, y1;
const gfx_element *gfx = machine->gfx[2];
if( layer_enable & 0x10 )
if( state->layer_enable & 0x10 )
return;
for( a = (sprite_dma_length / 4) - 2; a >= 0; a -= 2 ) {
tile_num = (sprite_ram[a + 0] >> 16) & 0xffff;
if( sprite_ram[a + 1] & 0x1000 )
for( a = (state->sprite_dma_length / 4) - 2; a >= 0; a -= 2 ) {
tile_num = (state->sprite_ram[a + 0] >> 16) & 0xffff;
if( state->sprite_ram[a + 1] & 0x1000 )
tile_num |= 0x10000;
if( !tile_num )
continue;
priority = (sprite_ram[a + 0] >> 6) & 0x3;
priority = (state->sprite_ram[a + 0] >> 6) & 0x3;
if( pri_mask != priority )
continue;
xpos = sprite_ram[a + 1] & 0x3ff;
xpos = state->sprite_ram[a + 1] & 0x3ff;
if( xpos & 0x200 )
xpos |= 0xfc00;
ypos = (sprite_ram[a + 1] >> 16) & 0x1ff;
ypos = (state->sprite_ram[a + 1] >> 16) & 0x1ff;
if( ypos & 0x100 )
ypos |= 0xfe00;
color = (sprite_ram[a + 0] & 0x3f);
color = (state->sprite_ram[a + 0] & 0x3f);
width = ((sprite_ram[a + 0] >> 8) & 0x7) + 1;
height = ((sprite_ram[a + 0] >> 12) & 0x7) + 1;
flip_x = (sprite_ram[a + 0] >> 11) & 0x1;
flip_y = (sprite_ram[a + 0] >> 15) & 0x1;
width = ((state->sprite_ram[a + 0] >> 8) & 0x7) + 1;
height = ((state->sprite_ram[a + 0] >> 12) & 0x7) + 1;
flip_x = (state->sprite_ram[a + 0] >> 11) & 0x1;
flip_y = (state->sprite_ram[a + 0] >> 15) & 0x1;
x1 = 0;
y1 = 0;
@ -425,8 +411,9 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
static TILE_GET_INFO( get_text_tile_info )
{
seibuspi_state *state = machine->driver_data<seibuspi_state>();
int offs = tile_index / 2;
int tile = (tilemap_ram[offs + text_layer_offset] >> ((tile_index & 0x1) ? 16 : 0)) & 0xffff;
int tile = (state->tilemap_ram[offs + state->text_layer_offset] >> ((tile_index & 0x1) ? 16 : 0)) & 0xffff;
int color = (tile >> 12) & 0xf;
tile &= 0xfff;
@ -436,13 +423,14 @@ static TILE_GET_INFO( get_text_tile_info )
static TILE_GET_INFO( get_back_tile_info )
{
seibuspi_state *state = machine->driver_data<seibuspi_state>();
int offs = tile_index / 2;
int tile = (tilemap_ram[offs] >> ((tile_index & 0x1) ? 16 : 0)) & 0xffff;
int tile = (state->tilemap_ram[offs] >> ((tile_index & 0x1) ? 16 : 0)) & 0xffff;
int color = (tile >> 13) & 0x7;
tile &= 0x1fff;
if( rf2_layer_bank[0] )
if( state->rf2_layer_bank[0] )
tile |= 0x4000;
SET_TILE_INFO(1, tile, color, 0);
@ -450,14 +438,15 @@ static TILE_GET_INFO( get_back_tile_info )
static TILE_GET_INFO( get_mid_tile_info )
{
seibuspi_state *state = machine->driver_data<seibuspi_state>();
int offs = tile_index / 2;
int tile = (tilemap_ram[offs + mid_layer_offset] >> ((tile_index & 0x1) ? 16 : 0)) & 0xffff;
int tile = (state->tilemap_ram[offs + state->mid_layer_offset] >> ((tile_index & 0x1) ? 16 : 0)) & 0xffff;
int color = (tile >> 13) & 0x7;
tile &= 0x1fff;
tile |= 0x2000;
if( rf2_layer_bank[1] )
if( state->rf2_layer_bank[1] )
tile |= 0x4000;
SET_TILE_INFO(1, tile, color + 16, 0);
@ -465,89 +454,92 @@ static TILE_GET_INFO( get_mid_tile_info )
static TILE_GET_INFO( get_fore_tile_info )
{
seibuspi_state *state = machine->driver_data<seibuspi_state>();
int offs = tile_index / 2;
int tile = (tilemap_ram[offs + fore_layer_offset] >> ((tile_index & 0x1) ? 16 : 0)) & 0xffff;
int tile = (state->tilemap_ram[offs + state->fore_layer_offset] >> ((tile_index & 0x1) ? 16 : 0)) & 0xffff;
int color = (tile >> 13) & 0x7;
tile &= 0x1fff;
tile |= bg_fore_layer_position;
tile |= state->bg_fore_layer_position;
if( rf2_layer_bank[2] )
if( state->rf2_layer_bank[2] )
tile |= 0x4000;
tile |= ((layer_bank >> 27) & 0x1) << 13;
tile |= ((state->layer_bank >> 27) & 0x1) << 13;
SET_TILE_INFO(1, tile, color + 8, 0);
}
VIDEO_START( spi )
{
seibuspi_state *state = machine->driver_data<seibuspi_state>();
int i;
int region_length;
text_layer = tilemap_create( machine, get_text_tile_info, tilemap_scan_rows, 8,8,64,32 );
back_layer = tilemap_create( machine, get_back_tile_info, tilemap_scan_cols, 16,16,32,32 );
mid_layer = tilemap_create( machine, get_mid_tile_info, tilemap_scan_cols, 16,16,32,32 );
fore_layer = tilemap_create( machine, get_fore_tile_info, tilemap_scan_cols, 16,16,32,32 );
state->text_layer = tilemap_create( machine, get_text_tile_info, tilemap_scan_rows, 8,8,64,32 );
state->back_layer = tilemap_create( machine, get_back_tile_info, tilemap_scan_cols, 16,16,32,32 );
state->mid_layer = tilemap_create( machine, get_mid_tile_info, tilemap_scan_cols, 16,16,32,32 );
state->fore_layer = tilemap_create( machine, get_fore_tile_info, tilemap_scan_cols, 16,16,32,32 );
tilemap_set_transparent_pen(text_layer, 31);
tilemap_set_transparent_pen(mid_layer, 63);
tilemap_set_transparent_pen(fore_layer, 63);
tilemap_set_transparent_pen(state->text_layer, 31);
tilemap_set_transparent_pen(state->mid_layer, 63);
tilemap_set_transparent_pen(state->fore_layer, 63);
tilemap_ram = auto_alloc_array_clear(machine, UINT32, 0x4000/4);
palette_ram = auto_alloc_array_clear(machine, UINT32, 0x3000/4);
sprite_ram = auto_alloc_array_clear(machine, UINT32, 0x1000/4);
state->tilemap_ram = auto_alloc_array_clear(machine, UINT32, 0x4000/4);
state->palette_ram = auto_alloc_array_clear(machine, UINT32, 0x3000/4);
state->sprite_ram = auto_alloc_array_clear(machine, UINT32, 0x1000/4);
sprite_bpp = 6;
sprite_dma_length = 0x1000;
state->sprite_bpp = 6;
state->sprite_dma_length = 0x1000;
for (i=0; i < 6144; i++) {
palette_set_color(machine, i, MAKE_RGB(0, 0, 0));
}
memset(alpha_table, 0, 6144 * sizeof(UINT8));
memset(state->alpha_table, 0, 6144 * sizeof(UINT8));
// sprites
//for (i = 1792; i < 1808; i++) { alpha_table[i] = 1; } // breaks rdft
for (i = 1840; i < 1856; i++) { alpha_table[i] = 1; }
for (i = 1920; i < 1952; i++) { alpha_table[i] = 1; }
//for (i = 1984; i < 2048; i++) { alpha_table[i] = 1; } // breaks batlball
//for (i = 3840; i < 3904; i++) { alpha_table[i] = 1; } // breaks rdft
for (i = 4032; i < 4096; i++) { alpha_table[i] = 1; }
//for (i = 1792; i < 1808; i++) { state->alpha_table[i] = 1; } // breaks rdft
for (i = 1840; i < 1856; i++) { state->alpha_table[i] = 1; }
for (i = 1920; i < 1952; i++) { state->alpha_table[i] = 1; }
//for (i = 1984; i < 2048; i++) { state->alpha_table[i] = 1; } // breaks batlball
//for (i = 3840; i < 3904; i++) { state->alpha_table[i] = 1; } // breaks rdft
for (i = 4032; i < 4096; i++) { state->alpha_table[i] = 1; }
// mid layer
for (i = 4960; i < 4992; i++) { alpha_table[i] = 1; } // breaks ejanhs
for (i = 5040; i < 5056; i++) { alpha_table[i] = 1; } // breaks ejanhs
for (i = 5104; i < 5120; i++) { alpha_table[i] = 1; }
for (i = 4960; i < 4992; i++) { state->alpha_table[i] = 1; } // breaks ejanhs
for (i = 5040; i < 5056; i++) { state->alpha_table[i] = 1; } // breaks ejanhs
for (i = 5104; i < 5120; i++) { state->alpha_table[i] = 1; }
// fore layer
for (i = 5552; i < 5568; i++) { alpha_table[i] = 1; } // breaks ejanhs
for (i = 5616; i < 5632; i++) { alpha_table[i] = 1; } // breaks ejanhs
for (i = 5552; i < 5568; i++) { state->alpha_table[i] = 1; } // breaks ejanhs
for (i = 5616; i < 5632; i++) { state->alpha_table[i] = 1; } // breaks ejanhs
// text layer
for (i = 6000; i < 6016; i++) { alpha_table[i] = 1; }
for (i = 6128; i < 6144; i++) { alpha_table[i] = 1; }
for (i = 6000; i < 6016; i++) { state->alpha_table[i] = 1; }
for (i = 6128; i < 6144; i++) { state->alpha_table[i] = 1; }
region_length = machine->region("gfx2")->bytes();
if (region_length <= 0x300000)
{
bg_fore_layer_position = 0x2000;
state->bg_fore_layer_position = 0x2000;
}
else if (region_length <= 0x600000)
{
bg_fore_layer_position = 0x4000;
state->bg_fore_layer_position = 0x4000;
}
else
{
bg_fore_layer_position = 0x8000;
state->bg_fore_layer_position = 0x8000;
}
}
#ifdef UNUSED_FUNCTION
static void set_rowscroll(tilemap_t *layer, int scroll, INT16* rows)
{
seibuspi_state *state = machine->driver_data<seibuspi_state>();
int i;
int x = spi_scrollram[scroll] & 0xffff;
int y = (spi_scrollram[scroll] >> 16) & 0xffff;
int x = state->spi_scrollram[scroll] & 0xffff;
int y = (state->spi_scrollram[scroll] >> 16) & 0xffff;
tilemap_set_scroll_rows(layer, 512);
for( i=0; i < 512; i++ ) {
tilemap_set_scrollx(layer, i, x + rows[i]);
@ -557,8 +549,9 @@ static void set_rowscroll(tilemap_t *layer, int scroll, INT16* rows)
static void set_scroll(tilemap_t *layer, int scroll)
{
int x = spi_scrollram[scroll] & 0xffff;
int y = (spi_scrollram[scroll] >> 16) & 0xffff;
seibuspi_state *state = machine->driver_data<seibuspi_state>();
int x = state->spi_scrollram[scroll] & 0xffff;
int y = (state->spi_scrollram[scroll] >> 16) & 0xffff;
tilemap_set_scrollx(layer, 0, x);
tilemap_set_scrolly(layer, 0, y);
}
@ -567,6 +560,7 @@ static void set_scroll(tilemap_t *layer, int scroll)
static void combine_tilemap(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, tilemap_t *tile, int x, int y, int opaque, INT16 *rowscroll)
{
seibuspi_state *state = machine->driver_data<seibuspi_state>();
int i,j;
UINT16 *s;
UINT32 *d;
@ -596,7 +590,7 @@ static void combine_tilemap(running_machine *machine, bitmap_t *bitmap, const re
if (opaque || (t[i & xscroll_mask] & (TILEMAP_PIXEL_LAYER0 | TILEMAP_PIXEL_LAYER1)))
{
UINT16 pen = s[i & xscroll_mask];
UINT8 alpha = alpha_table[pen];
UINT8 alpha = state->alpha_table[pen];
if (alpha)
{
*d = alpha_blend_r32(*d, machine->pens[pen], 0x7f);
@ -615,63 +609,65 @@ static void combine_tilemap(running_machine *machine, bitmap_t *bitmap, const re
SCREEN_UPDATE( spi )
{
seibuspi_state *state = screen->machine->driver_data<seibuspi_state>();
INT16 *back_rowscroll, *mid_rowscroll, *fore_rowscroll;
if( layer_bank & 0x80000000 ) {
back_rowscroll = (INT16*)&tilemap_ram[0x200];
mid_rowscroll = (INT16*)&tilemap_ram[0x600];
fore_rowscroll = (INT16*)&tilemap_ram[0xa00];
if( state->layer_bank & 0x80000000 ) {
back_rowscroll = (INT16*)&state->tilemap_ram[0x200];
mid_rowscroll = (INT16*)&state->tilemap_ram[0x600];
fore_rowscroll = (INT16*)&state->tilemap_ram[0xa00];
} else {
back_rowscroll = NULL;
mid_rowscroll = NULL;
fore_rowscroll = NULL;
}
if( layer_enable & 0x1 )
if( state->layer_enable & 0x1 )
bitmap_fill(bitmap, cliprect, 0);
if (!(layer_enable & 0x1))
combine_tilemap(screen->machine, bitmap, cliprect, back_layer, spi_scrollram[0] & 0xffff, (spi_scrollram[0] >> 16) & 0xffff, 1, back_rowscroll);
if (!(state->layer_enable & 0x1))
combine_tilemap(screen->machine, bitmap, cliprect, state->back_layer, state->spi_scrollram[0] & 0xffff, (state->spi_scrollram[0] >> 16) & 0xffff, 1, back_rowscroll);
draw_sprites(screen->machine, bitmap, cliprect, 0);
// if fore layer is enabled, draw priority 1 sprites behind mid layer
if (!(layer_enable & 0x4))
if (!(state->layer_enable & 0x4))
draw_sprites(screen->machine, bitmap, cliprect, 1);
if (!(layer_enable & 0x2))
combine_tilemap(screen->machine, bitmap, cliprect, mid_layer, spi_scrollram[1] & 0xffff, (spi_scrollram[1] >> 16) & 0xffff, 0, mid_rowscroll);
if (!(state->layer_enable & 0x2))
combine_tilemap(screen->machine, bitmap, cliprect, state->mid_layer, state->spi_scrollram[1] & 0xffff, (state->spi_scrollram[1] >> 16) & 0xffff, 0, mid_rowscroll);
// if fore layer is disabled, draw priority 1 sprites above mid layer
if ((layer_enable & 0x4))
if ((state->layer_enable & 0x4))
draw_sprites(screen->machine, bitmap, cliprect, 1);
draw_sprites(screen->machine, bitmap, cliprect, 2);
if (!(layer_enable & 0x4))
combine_tilemap(screen->machine, bitmap, cliprect, fore_layer, spi_scrollram[2] & 0xffff, (spi_scrollram[2] >> 16) & 0xffff, 0, fore_rowscroll);
if (!(state->layer_enable & 0x4))
combine_tilemap(screen->machine, bitmap, cliprect, state->fore_layer, state->spi_scrollram[2] & 0xffff, (state->spi_scrollram[2] >> 16) & 0xffff, 0, fore_rowscroll);
draw_sprites(screen->machine, bitmap, cliprect, 3);
combine_tilemap(screen->machine, bitmap, cliprect, text_layer, 0, 0, 0, NULL);
combine_tilemap(screen->machine, bitmap, cliprect, state->text_layer, 0, 0, 0, NULL);
return 0;
}
VIDEO_START( sys386f2 )
{
seibuspi_state *state = machine->driver_data<seibuspi_state>();
int i;
palette_ram = auto_alloc_array_clear(machine, UINT32, 0x4000/4);
sprite_ram = auto_alloc_array_clear(machine, UINT32, 0x2000/4);
state->palette_ram = auto_alloc_array_clear(machine, UINT32, 0x4000/4);
state->sprite_ram = auto_alloc_array_clear(machine, UINT32, 0x2000/4);
sprite_bpp = 8;
sprite_dma_length = 0x2000;
layer_enable = 0;
state->sprite_bpp = 8;
state->sprite_dma_length = 0x2000;
state->layer_enable = 0;
for (i=0; i < 8192; i++) {
palette_set_color(machine, i, MAKE_RGB(0, 0, 0));
}
memset(alpha_table, 0, 8192 * sizeof(UINT8));
memset(state->alpha_table, 0, 8192 * sizeof(UINT8));
}
SCREEN_UPDATE( sys386f2 )

View File

@ -35,22 +35,6 @@ To Do:
#include "includes/tetrisp2.h"
/* Variables needed by driver: */
UINT16 *tetrisp2_vram_bg, *tetrisp2_scroll_bg;
UINT16 *tetrisp2_vram_fg, *tetrisp2_scroll_fg;
UINT16 *tetrisp2_vram_rot, *tetrisp2_rotregs;
UINT8 *tetrisp2_priority;
UINT16 *rocknms_sub_vram_bg, *rocknms_sub_scroll_bg;
UINT16 *rocknms_sub_vram_fg, *rocknms_sub_scroll_fg;
UINT16 *rocknms_sub_vram_rot, *rocknms_sub_rotregs;
UINT16 *rocknms_sub_priority;
static int flipscreen_old;
/***************************************************************************
@ -86,38 +70,43 @@ WRITE16_HANDLER( rocknms_sub_palette_w )
WRITE8_HANDLER( tetrisp2_priority_w )
{
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
//if (ACCESSING_BITS_8_15)
{
data |= ((data & 0xff00) >> 8);
tetrisp2_priority[offset] = data;
state->priority[offset] = data;
}
}
WRITE8_HANDLER( rockn_priority_w )
{
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
//if (ACCESSING_BITS_8_15)
{
tetrisp2_priority[offset] = data;
state->priority[offset] = data;
}
}
WRITE16_HANDLER( rocknms_sub_priority_w )
{
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
if (ACCESSING_BITS_8_15)
{
rocknms_sub_priority[offset] = data;
state->rocknms_sub_priority[offset] = data;
}
}
READ16_HANDLER( nndmseal_priority_r )
{
return tetrisp2_priority[offset] | 0xff00;
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
return state->priority[offset] | 0xff00;
}
READ8_HANDLER( tetrisp2_priority_r )
{
return tetrisp2_priority[offset];
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
return state->priority[offset];
}
/***************************************************************************
@ -135,16 +124,15 @@ READ8_HANDLER( tetrisp2_priority_r )
***************************************************************************/
static tilemap_t *tilemap_bg, *tilemap_fg, *tilemap_rot;
static tilemap_t *tilemap_sub_bg, *tilemap_sub_fg, *tilemap_sub_rot;
#define NX_0 (0x40)
#define NY_0 (0x40)
static TILE_GET_INFO( get_tile_info_bg )
{
UINT16 code_hi = tetrisp2_vram_bg[ 2 * tile_index + 0];
UINT16 code_lo = tetrisp2_vram_bg[ 2 * tile_index + 1];
tetrisp2_state *state = machine->driver_data<tetrisp2_state>();
UINT16 code_hi = state->vram_bg[ 2 * tile_index + 0];
UINT16 code_lo = state->vram_bg[ 2 * tile_index + 1];
SET_TILE_INFO(
1,
code_hi,
@ -154,8 +142,9 @@ static TILE_GET_INFO( get_tile_info_bg )
WRITE16_HANDLER( tetrisp2_vram_bg_w )
{
COMBINE_DATA(&tetrisp2_vram_bg[offset]);
tilemap_mark_tile_dirty(tilemap_bg,offset/2);
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
COMBINE_DATA(&state->vram_bg[offset]);
tilemap_mark_tile_dirty(state->tilemap_bg,offset/2);
}
@ -165,8 +154,9 @@ WRITE16_HANDLER( tetrisp2_vram_bg_w )
static TILE_GET_INFO( get_tile_info_fg )
{
UINT16 code_hi = tetrisp2_vram_fg[ 2 * tile_index + 0];
UINT16 code_lo = tetrisp2_vram_fg[ 2 * tile_index + 1];
tetrisp2_state *state = machine->driver_data<tetrisp2_state>();
UINT16 code_hi = state->vram_fg[ 2 * tile_index + 0];
UINT16 code_lo = state->vram_fg[ 2 * tile_index + 1];
SET_TILE_INFO(
3,
code_hi,
@ -176,15 +166,17 @@ static TILE_GET_INFO( get_tile_info_fg )
WRITE16_HANDLER( tetrisp2_vram_fg_w )
{
COMBINE_DATA(&tetrisp2_vram_fg[offset]);
tilemap_mark_tile_dirty(tilemap_fg,offset/2);
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
COMBINE_DATA(&state->vram_fg[offset]);
tilemap_mark_tile_dirty(state->tilemap_fg,offset/2);
}
static TILE_GET_INFO( get_tile_info_rot )
{
UINT16 code_hi = tetrisp2_vram_rot[ 2 * tile_index + 0];
UINT16 code_lo = tetrisp2_vram_rot[ 2 * tile_index + 1];
tetrisp2_state *state = machine->driver_data<tetrisp2_state>();
UINT16 code_hi = state->vram_rot[ 2 * tile_index + 0];
UINT16 code_lo = state->vram_rot[ 2 * tile_index + 1];
SET_TILE_INFO(
2,
code_hi,
@ -194,14 +186,16 @@ static TILE_GET_INFO( get_tile_info_rot )
WRITE16_HANDLER( tetrisp2_vram_rot_w )
{
COMBINE_DATA(&tetrisp2_vram_rot[offset]);
tilemap_mark_tile_dirty(tilemap_rot,offset/2);
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
COMBINE_DATA(&state->vram_rot[offset]);
tilemap_mark_tile_dirty(state->tilemap_rot,offset/2);
}
static TILE_GET_INFO( get_tile_info_rocknms_sub_bg )
{
UINT16 code_hi = rocknms_sub_vram_bg[ 2 * tile_index + 0];
UINT16 code_lo = rocknms_sub_vram_bg[ 2 * tile_index + 1];
tetrisp2_state *state = machine->driver_data<tetrisp2_state>();
UINT16 code_hi = state->rocknms_sub_vram_bg[ 2 * tile_index + 0];
UINT16 code_lo = state->rocknms_sub_vram_bg[ 2 * tile_index + 1];
SET_TILE_INFO(
5,
code_hi,
@ -211,15 +205,17 @@ static TILE_GET_INFO( get_tile_info_rocknms_sub_bg )
WRITE16_HANDLER( rocknms_sub_vram_bg_w )
{
COMBINE_DATA(&rocknms_sub_vram_bg[offset]);
tilemap_mark_tile_dirty(tilemap_sub_bg,offset/2);
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
COMBINE_DATA(&state->rocknms_sub_vram_bg[offset]);
tilemap_mark_tile_dirty(state->tilemap_sub_bg,offset/2);
}
static TILE_GET_INFO( get_tile_info_rocknms_sub_fg )
{
UINT16 code_hi = rocknms_sub_vram_fg[ 2 * tile_index + 0];
UINT16 code_lo = rocknms_sub_vram_fg[ 2 * tile_index + 1];
tetrisp2_state *state = machine->driver_data<tetrisp2_state>();
UINT16 code_hi = state->rocknms_sub_vram_fg[ 2 * tile_index + 0];
UINT16 code_lo = state->rocknms_sub_vram_fg[ 2 * tile_index + 1];
SET_TILE_INFO(
7,
code_hi,
@ -229,15 +225,17 @@ static TILE_GET_INFO( get_tile_info_rocknms_sub_fg )
WRITE16_HANDLER( rocknms_sub_vram_fg_w )
{
COMBINE_DATA(&rocknms_sub_vram_fg[offset]);
tilemap_mark_tile_dirty(tilemap_sub_fg,offset/2);
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
COMBINE_DATA(&state->rocknms_sub_vram_fg[offset]);
tilemap_mark_tile_dirty(state->tilemap_sub_fg,offset/2);
}
static TILE_GET_INFO( get_tile_info_rocknms_sub_rot )
{
UINT16 code_hi = rocknms_sub_vram_rot[ 2 * tile_index + 0];
UINT16 code_lo = rocknms_sub_vram_rot[ 2 * tile_index + 1];
tetrisp2_state *state = machine->driver_data<tetrisp2_state>();
UINT16 code_hi = state->rocknms_sub_vram_rot[ 2 * tile_index + 0];
UINT16 code_lo = state->rocknms_sub_vram_rot[ 2 * tile_index + 1];
SET_TILE_INFO(
6,
code_hi,
@ -247,88 +245,93 @@ static TILE_GET_INFO( get_tile_info_rocknms_sub_rot )
WRITE16_HANDLER( rocknms_sub_vram_rot_w )
{
COMBINE_DATA(&rocknms_sub_vram_rot[offset]);
tilemap_mark_tile_dirty(tilemap_sub_rot,offset/2);
tetrisp2_state *state = space->machine->driver_data<tetrisp2_state>();
COMBINE_DATA(&state->rocknms_sub_vram_rot[offset]);
tilemap_mark_tile_dirty(state->tilemap_sub_rot,offset/2);
}
VIDEO_START( tetrisp2 )
{
flipscreen_old = -1;
tetrisp2_state *state = machine->driver_data<tetrisp2_state>();
state->flipscreen_old = -1;
tilemap_bg = tilemap_create( machine, get_tile_info_bg,tilemap_scan_rows,
state->tilemap_bg = tilemap_create( machine, get_tile_info_bg,tilemap_scan_rows,
16,16,NX_0,NY_0);
tilemap_fg = tilemap_create( machine, get_tile_info_fg,tilemap_scan_rows,
state->tilemap_fg = tilemap_create( machine, get_tile_info_fg,tilemap_scan_rows,
8,8,NX_1,NY_1);
tilemap_rot = tilemap_create( machine, get_tile_info_rot,tilemap_scan_rows,
state->tilemap_rot = tilemap_create( machine, get_tile_info_rot,tilemap_scan_rows,
16,16,NX_0*2,NY_0*2);
tilemap_set_transparent_pen(tilemap_bg,0);
tilemap_set_transparent_pen(tilemap_fg,0);
tilemap_set_transparent_pen(tilemap_rot,0);
tilemap_set_transparent_pen(state->tilemap_bg,0);
tilemap_set_transparent_pen(state->tilemap_fg,0);
tilemap_set_transparent_pen(state->tilemap_rot,0);
// should be smaller and mirrored like m32 I guess
tetrisp2_priority = auto_alloc_array(machine, UINT8, 0x40000);
state->priority = auto_alloc_array(machine, UINT8, 0x40000);
ms32_rearrange_sprites(machine, "gfx1");
}
VIDEO_START( nndmseal )
{
tetrisp2_state *state = machine->driver_data<tetrisp2_state>();
VIDEO_START_CALL( tetrisp2 );
tilemap_set_scrolldx(tilemap_bg, -4,-4);
tilemap_set_scrolldx(state->tilemap_bg, -4,-4);
}
VIDEO_START( rockntread )
{
flipscreen_old = -1;
tetrisp2_state *state = machine->driver_data<tetrisp2_state>();
state->flipscreen_old = -1;
tilemap_bg = tilemap_create( machine, get_tile_info_bg,tilemap_scan_rows,
state->tilemap_bg = tilemap_create( machine, get_tile_info_bg,tilemap_scan_rows,
16, 16, 256, 16); // rockn ms(main),1,2,3,4
tilemap_fg = tilemap_create( machine, get_tile_info_fg,tilemap_scan_rows,
state->tilemap_fg = tilemap_create( machine, get_tile_info_fg,tilemap_scan_rows,
8, 8, 64, 64);
tilemap_rot = tilemap_create( machine, get_tile_info_rot,tilemap_scan_rows,
state->tilemap_rot = tilemap_create( machine, get_tile_info_rot,tilemap_scan_rows,
16, 16, 128, 128);
tilemap_set_transparent_pen(tilemap_bg, 0);
tilemap_set_transparent_pen(tilemap_fg, 0);
tilemap_set_transparent_pen(tilemap_rot, 0);
tilemap_set_transparent_pen(state->tilemap_bg, 0);
tilemap_set_transparent_pen(state->tilemap_fg, 0);
tilemap_set_transparent_pen(state->tilemap_rot, 0);
// should be smaller and mirrored like m32 I guess
tetrisp2_priority = auto_alloc_array(machine, UINT8, 0x40000);
state->priority = auto_alloc_array(machine, UINT8, 0x40000);
ms32_rearrange_sprites(machine, "gfx1");
}
VIDEO_START( rocknms )
{
tetrisp2_state *state = machine->driver_data<tetrisp2_state>();
VIDEO_START_CALL( rockntread );
tilemap_sub_bg = tilemap_create(machine, get_tile_info_rocknms_sub_bg,tilemap_scan_rows,
state->tilemap_sub_bg = tilemap_create(machine, get_tile_info_rocknms_sub_bg,tilemap_scan_rows,
16, 16, 32, 256); // rockn ms(sub)
tilemap_sub_fg = tilemap_create(machine, get_tile_info_rocknms_sub_fg,tilemap_scan_rows,
state->tilemap_sub_fg = tilemap_create(machine, get_tile_info_rocknms_sub_fg,tilemap_scan_rows,
8, 8, 64, 64);
tilemap_sub_rot = tilemap_create( machine, get_tile_info_rocknms_sub_rot,tilemap_scan_rows,
state->tilemap_sub_rot = tilemap_create( machine, get_tile_info_rocknms_sub_rot,tilemap_scan_rows,
16, 16, 128, 128);
tilemap_set_transparent_pen(tilemap_sub_bg, 0);
tilemap_set_transparent_pen(tilemap_sub_fg, 0);
tilemap_set_transparent_pen(tilemap_sub_rot, 0);
tilemap_set_transparent_pen(state->tilemap_sub_bg, 0);
tilemap_set_transparent_pen(state->tilemap_sub_fg, 0);
tilemap_set_transparent_pen(state->tilemap_sub_rot, 0);
ms32_rearrange_sprites(machine, "gfx5");
}
@ -458,22 +461,23 @@ static void tetrisp2_draw_sprites(running_machine *machine, bitmap_t *bitmap, bi
SCREEN_UPDATE( tetrisp2 )
{
tetrisp2_state *state = screen->machine->driver_data<tetrisp2_state>();
int flipscreen;
int asc_pri;
int scr_pri;
int rot_pri;
int rot_ofsx, rot_ofsy;
flipscreen = (tetrisp2_systemregs[0x00] & 0x02);
flipscreen = (state->systemregs[0x00] & 0x02);
/* Black background color */
bitmap_fill(bitmap, cliprect, 0);
bitmap_fill(screen->machine->priority_bitmap, NULL, 0);
/* Flip Screen */
if (flipscreen != flipscreen_old)
if (flipscreen != state->flipscreen_old)
{
flipscreen_old = flipscreen;
state->flipscreen_old = flipscreen;
tilemap_set_flip_all(screen->machine, flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0);
}
@ -489,75 +493,76 @@ SCREEN_UPDATE( tetrisp2 )
rot_ofsy = 0x400;
}
tilemap_set_scrollx(tilemap_bg, 0, (((tetrisp2_scroll_bg[ 0 ] + 0x0014) + tetrisp2_scroll_bg[ 2 ] ) & 0xffff));
tilemap_set_scrolly(tilemap_bg, 0, (((tetrisp2_scroll_bg[ 3 ] + 0x0000) + tetrisp2_scroll_bg[ 5 ] ) & 0xffff));
tilemap_set_scrollx(state->tilemap_bg, 0, (((state->scroll_bg[ 0 ] + 0x0014) + state->scroll_bg[ 2 ] ) & 0xffff));
tilemap_set_scrolly(state->tilemap_bg, 0, (((state->scroll_bg[ 3 ] + 0x0000) + state->scroll_bg[ 5 ] ) & 0xffff));
tilemap_set_scrollx(tilemap_fg, 0, tetrisp2_scroll_fg[ 2 ]);
tilemap_set_scrolly(tilemap_fg, 0, tetrisp2_scroll_fg[ 5 ]);
tilemap_set_scrollx(state->tilemap_fg, 0, state->scroll_fg[ 2 ]);
tilemap_set_scrolly(state->tilemap_fg, 0, state->scroll_fg[ 5 ]);
tilemap_set_scrollx(tilemap_rot, 0, (tetrisp2_rotregs[ 0 ] - rot_ofsx));
tilemap_set_scrolly(tilemap_rot, 0, (tetrisp2_rotregs[ 2 ] - rot_ofsy));
tilemap_set_scrollx(state->tilemap_rot, 0, (state->rotregs[ 0 ] - rot_ofsx));
tilemap_set_scrolly(state->tilemap_rot, 0, (state->rotregs[ 2 ] - rot_ofsy));
asc_pri = scr_pri = rot_pri = 0;
if((tetrisp2_priority[0x2b00 / 2] & 0x00ff) == 0x0034)
if((state->priority[0x2b00 / 2] & 0x00ff) == 0x0034)
asc_pri++;
else
rot_pri++;
if((tetrisp2_priority[0x2e00 / 2] & 0x00ff) == 0x0034)
if((state->priority[0x2e00 / 2] & 0x00ff) == 0x0034)
asc_pri++;
else
scr_pri++;
if((tetrisp2_priority[0x3a00 / 2] & 0x00ff) == 0x000c)
if((state->priority[0x3a00 / 2] & 0x00ff) == 0x000c)
scr_pri++;
else
rot_pri++;
if (rot_pri == 0)
tilemap_draw(bitmap,cliprect, tilemap_rot, 0, 1 << 1);
tilemap_draw(bitmap,cliprect, state->tilemap_rot, 0, 1 << 1);
else if (scr_pri == 0)
tilemap_draw(bitmap,cliprect, tilemap_bg, 0, 1 << 0);
tilemap_draw(bitmap,cliprect, state->tilemap_bg, 0, 1 << 0);
else if (asc_pri == 0)
tilemap_draw(bitmap,cliprect, tilemap_fg, 0, 1 << 2);
tilemap_draw(bitmap,cliprect, state->tilemap_fg, 0, 1 << 2);
if (rot_pri == 1)
tilemap_draw(bitmap,cliprect, tilemap_rot, 0, 1 << 1);
tilemap_draw(bitmap,cliprect, state->tilemap_rot, 0, 1 << 1);
else if (scr_pri == 1)
tilemap_draw(bitmap,cliprect, tilemap_bg, 0, 1 << 0);
tilemap_draw(bitmap,cliprect, state->tilemap_bg, 0, 1 << 0);
else if (asc_pri == 1)
tilemap_draw(bitmap,cliprect, tilemap_fg, 0, 1 << 2);
tilemap_draw(bitmap,cliprect, state->tilemap_fg, 0, 1 << 2);
if (rot_pri == 2)
tilemap_draw(bitmap,cliprect, tilemap_rot, 0, 1 << 1);
tilemap_draw(bitmap,cliprect, state->tilemap_rot, 0, 1 << 1);
else if (scr_pri == 2)
tilemap_draw(bitmap,cliprect, tilemap_bg, 0, 1 << 0);
tilemap_draw(bitmap,cliprect, state->tilemap_bg, 0, 1 << 0);
else if (asc_pri == 2)
tilemap_draw(bitmap,cliprect, tilemap_fg, 0, 1 << 2);
tilemap_draw(bitmap,cliprect, state->tilemap_fg, 0, 1 << 2);
tetrisp2_draw_sprites(screen->machine, bitmap, screen->machine->priority_bitmap, cliprect, tetrisp2_priority, screen->machine->generic.spriteram.u16, screen->machine->generic.spriteram_size, 0, (tetrisp2_systemregs[0x00] & 0x02));
tetrisp2_draw_sprites(screen->machine, bitmap, screen->machine->priority_bitmap, cliprect, state->priority, screen->machine->generic.spriteram.u16, screen->machine->generic.spriteram_size, 0, (state->systemregs[0x00] & 0x02));
return 0;
}
SCREEN_UPDATE( rockntread )
{
tetrisp2_state *state = screen->machine->driver_data<tetrisp2_state>();
int flipscreen;
int asc_pri;
int scr_pri;
int rot_pri;
int rot_ofsx, rot_ofsy;
flipscreen = (tetrisp2_systemregs[0x00] & 0x02);
flipscreen = (state->systemregs[0x00] & 0x02);
/* Black background color */
bitmap_fill(bitmap, cliprect, 0);
bitmap_fill(screen->machine->priority_bitmap, NULL, 0);
/* Flip Screen */
if (flipscreen != flipscreen_old)
if (flipscreen != state->flipscreen_old)
{
flipscreen_old = flipscreen;
state->flipscreen_old = flipscreen;
tilemap_set_flip_all(screen->machine, flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0);
}
@ -573,54 +578,54 @@ SCREEN_UPDATE( rockntread )
rot_ofsy = 0x400;
}
tilemap_set_scrollx(tilemap_bg, 0, (((tetrisp2_scroll_bg[ 0 ] + 0x0014) + tetrisp2_scroll_bg[ 2 ] ) & 0xffff));
tilemap_set_scrolly(tilemap_bg, 0, (((tetrisp2_scroll_bg[ 3 ] + 0x0000) + tetrisp2_scroll_bg[ 5 ] ) & 0xffff));
tilemap_set_scrollx(state->tilemap_bg, 0, (((state->scroll_bg[ 0 ] + 0x0014) + state->scroll_bg[ 2 ] ) & 0xffff));
tilemap_set_scrolly(state->tilemap_bg, 0, (((state->scroll_bg[ 3 ] + 0x0000) + state->scroll_bg[ 5 ] ) & 0xffff));
tilemap_set_scrollx(tilemap_fg, 0, tetrisp2_scroll_fg[ 2 ]);
tilemap_set_scrolly(tilemap_fg, 0, tetrisp2_scroll_fg[ 5 ]);
tilemap_set_scrollx(state->tilemap_fg, 0, state->scroll_fg[ 2 ]);
tilemap_set_scrolly(state->tilemap_fg, 0, state->scroll_fg[ 5 ]);
tilemap_set_scrollx(tilemap_rot, 0, (tetrisp2_rotregs[ 0 ] - rot_ofsx));
tilemap_set_scrolly(tilemap_rot, 0, (tetrisp2_rotregs[ 2 ] - rot_ofsy));
tilemap_set_scrollx(state->tilemap_rot, 0, (state->rotregs[ 0 ] - rot_ofsx));
tilemap_set_scrolly(state->tilemap_rot, 0, (state->rotregs[ 2 ] - rot_ofsy));
asc_pri = scr_pri = rot_pri = 0;
if((tetrisp2_priority[0x2b00 / 2] & 0x00ff) == 0x0034)
if((state->priority[0x2b00 / 2] & 0x00ff) == 0x0034)
asc_pri++;
else
rot_pri++;
if((tetrisp2_priority[0x2e00 / 2] & 0x00ff) == 0x0034)
if((state->priority[0x2e00 / 2] & 0x00ff) == 0x0034)
asc_pri++;
else
scr_pri++;
if((tetrisp2_priority[0x3a00 / 2] & 0x00ff) == 0x000c)
if((state->priority[0x3a00 / 2] & 0x00ff) == 0x000c)
scr_pri++;
else
rot_pri++;
if (rot_pri == 0)
tilemap_draw(bitmap,cliprect, tilemap_rot, 0, 1 << 1);
tilemap_draw(bitmap,cliprect, state->tilemap_rot, 0, 1 << 1);
else if (scr_pri == 0)
tilemap_draw(bitmap,cliprect, tilemap_bg, 0, 1 << 0);
tilemap_draw(bitmap,cliprect, state->tilemap_bg, 0, 1 << 0);
else if (asc_pri == 0)
tilemap_draw(bitmap,cliprect, tilemap_fg, 0, 1 << 2);
tilemap_draw(bitmap,cliprect, state->tilemap_fg, 0, 1 << 2);
if (rot_pri == 1)
tilemap_draw(bitmap,cliprect, tilemap_rot, 0, 1 << 1);
tilemap_draw(bitmap,cliprect, state->tilemap_rot, 0, 1 << 1);
else if (scr_pri == 1)
tilemap_draw(bitmap,cliprect, tilemap_bg, 0, 1 << 0);
tilemap_draw(bitmap,cliprect, state->tilemap_bg, 0, 1 << 0);
else if (asc_pri == 1)
tilemap_draw(bitmap,cliprect, tilemap_fg, 0, 1 << 2);
tilemap_draw(bitmap,cliprect, state->tilemap_fg, 0, 1 << 2);
if (rot_pri == 2)
tilemap_draw(bitmap,cliprect, tilemap_rot, 0, 1 << 1);
tilemap_draw(bitmap,cliprect, state->tilemap_rot, 0, 1 << 1);
else if (scr_pri == 2)
tilemap_draw(bitmap,cliprect, tilemap_bg, 0, 1 << 0);
tilemap_draw(bitmap,cliprect, state->tilemap_bg, 0, 1 << 0);
else if (asc_pri == 2)
tilemap_draw(bitmap,cliprect, tilemap_fg, 0, 1 << 2);
tilemap_draw(bitmap,cliprect, state->tilemap_fg, 0, 1 << 2);
tetrisp2_draw_sprites(screen->machine, bitmap, screen->machine->priority_bitmap,cliprect, tetrisp2_priority, screen->machine->generic.spriteram.u16, screen->machine->generic.spriteram_size, 0, (tetrisp2_systemregs[0x00] & 0x02));
tetrisp2_draw_sprites(screen->machine, bitmap, screen->machine->priority_bitmap,cliprect, state->priority, screen->machine->generic.spriteram.u16, screen->machine->generic.spriteram_size, 0, (state->systemregs[0x00] & 0x02));
return 0;
}
@ -629,6 +634,7 @@ SCREEN_UPDATE( rockntread )
SCREEN_UPDATE( rocknms )
{
tetrisp2_state *state = screen->machine->driver_data<tetrisp2_state>();
int asc_pri;
int scr_pri;
int rot_pri;
@ -639,64 +645,64 @@ SCREEN_UPDATE( rocknms )
/* Black background color */
if (screen == left_screen)
{
tilemap_set_scrollx(tilemap_sub_bg, 0, rocknms_sub_scroll_bg[ 2 ] + 0x000);
tilemap_set_scrolly(tilemap_sub_bg, 0, rocknms_sub_scroll_bg[ 5 ] + 0x000);
tilemap_set_scrollx(tilemap_sub_fg, 0, rocknms_sub_scroll_fg[ 2 ] + 0x000);
tilemap_set_scrolly(tilemap_sub_fg, 0, rocknms_sub_scroll_fg[ 5 ] + 0x000);
tilemap_set_scrollx(tilemap_sub_rot, 0, rocknms_sub_rotregs[ 0 ] + 0x400);
tilemap_set_scrolly(tilemap_sub_rot, 0, rocknms_sub_rotregs[ 2 ] + 0x400);
tilemap_set_scrollx(state->tilemap_sub_bg, 0, state->rocknms_sub_scroll_bg[ 2 ] + 0x000);
tilemap_set_scrolly(state->tilemap_sub_bg, 0, state->rocknms_sub_scroll_bg[ 5 ] + 0x000);
tilemap_set_scrollx(state->tilemap_sub_fg, 0, state->rocknms_sub_scroll_fg[ 2 ] + 0x000);
tilemap_set_scrolly(state->tilemap_sub_fg, 0, state->rocknms_sub_scroll_fg[ 5 ] + 0x000);
tilemap_set_scrollx(state->tilemap_sub_rot, 0, state->rocknms_sub_rotregs[ 0 ] + 0x400);
tilemap_set_scrolly(state->tilemap_sub_rot, 0, state->rocknms_sub_rotregs[ 2 ] + 0x400);
bitmap_fill(bitmap, cliprect, screen->machine->pens[0x0000]);
bitmap_fill(screen->machine->priority_bitmap, cliprect, 0);
asc_pri = scr_pri = rot_pri = 0;
if((rocknms_sub_priority[0x2b00 / 2] & 0x00ff) == 0x0034)
if((state->rocknms_sub_priority[0x2b00 / 2] & 0x00ff) == 0x0034)
asc_pri++;
else
rot_pri++;
if((rocknms_sub_priority[0x2e00 / 2] & 0x00ff) == 0x0034)
if((state->rocknms_sub_priority[0x2e00 / 2] & 0x00ff) == 0x0034)
asc_pri++;
else
scr_pri++;
if((rocknms_sub_priority[0x3a00 / 2] & 0x00ff) == 0x000c)
if((state->rocknms_sub_priority[0x3a00 / 2] & 0x00ff) == 0x000c)
scr_pri++;
else
rot_pri++;
if (rot_pri == 0)
tilemap_draw(bitmap,cliprect, tilemap_sub_rot, 0, 1 << 1);
tilemap_draw(bitmap,cliprect, state->tilemap_sub_rot, 0, 1 << 1);
else if (scr_pri == 0)
tilemap_draw(bitmap,cliprect, tilemap_sub_bg, 0, 1 << 0);
tilemap_draw(bitmap,cliprect, state->tilemap_sub_bg, 0, 1 << 0);
else if (asc_pri == 0)
tilemap_draw(bitmap,cliprect, tilemap_sub_fg, 0, 1 << 2);
tilemap_draw(bitmap,cliprect, state->tilemap_sub_fg, 0, 1 << 2);
if (rot_pri == 1)
tilemap_draw(bitmap,cliprect, tilemap_sub_rot, 0, 1 << 1);
tilemap_draw(bitmap,cliprect, state->tilemap_sub_rot, 0, 1 << 1);
else if (scr_pri == 1)
tilemap_draw(bitmap,cliprect, tilemap_sub_bg, 0, 1 << 0);
tilemap_draw(bitmap,cliprect, state->tilemap_sub_bg, 0, 1 << 0);
else if (asc_pri == 1)
tilemap_draw(bitmap,cliprect, tilemap_sub_fg, 0, 1 << 2);
tilemap_draw(bitmap,cliprect, state->tilemap_sub_fg, 0, 1 << 2);
if (rot_pri == 2)
tilemap_draw(bitmap,cliprect, tilemap_sub_rot, 0, 1 << 1);
tilemap_draw(bitmap,cliprect, state->tilemap_sub_rot, 0, 1 << 1);
else if (scr_pri == 2)
tilemap_draw(bitmap,cliprect, tilemap_sub_bg, 0, 1 << 0);
tilemap_draw(bitmap,cliprect, state->tilemap_sub_bg, 0, 1 << 0);
else if (asc_pri == 2)
tilemap_draw(bitmap,cliprect, tilemap_sub_fg, 0, 1 << 2);
tilemap_draw(bitmap,cliprect, state->tilemap_sub_fg, 0, 1 << 2);
tetrisp2_draw_sprites(screen->machine, bitmap, screen->machine->priority_bitmap,cliprect, tetrisp2_priority, screen->machine->generic.spriteram2.u16, screen->machine->generic.spriteram2_size, 4, (tetrisp2_systemregs[0x00] & 0x02));
tetrisp2_draw_sprites(screen->machine, bitmap, screen->machine->priority_bitmap,cliprect, state->priority, screen->machine->generic.spriteram2.u16, screen->machine->generic.spriteram2_size, 4, (state->systemregs[0x00] & 0x02));
}
else if (screen == right_screen) /* game screen */
{
tilemap_set_scrollx(tilemap_bg, 0, tetrisp2_scroll_bg[ 2 ] + 0x000);
tilemap_set_scrolly(tilemap_bg, 0, tetrisp2_scroll_bg[ 5 ] + 0x000);
tilemap_set_scrollx(tilemap_fg, 0, tetrisp2_scroll_fg[ 2 ] + 0x000);
tilemap_set_scrolly(tilemap_fg, 0, tetrisp2_scroll_fg[ 5 ] + 0x000);
tilemap_set_scrollx(tilemap_rot, 0, tetrisp2_rotregs[ 0 ] + 0x400);
tilemap_set_scrolly(tilemap_rot, 0, tetrisp2_rotregs[ 2 ] + 0x400);
tilemap_set_scrollx(state->tilemap_bg, 0, state->scroll_bg[ 2 ] + 0x000);
tilemap_set_scrolly(state->tilemap_bg, 0, state->scroll_bg[ 5 ] + 0x000);
tilemap_set_scrollx(state->tilemap_fg, 0, state->scroll_fg[ 2 ] + 0x000);
tilemap_set_scrolly(state->tilemap_fg, 0, state->scroll_fg[ 5 ] + 0x000);
tilemap_set_scrollx(state->tilemap_rot, 0, state->rotregs[ 0 ] + 0x400);
tilemap_set_scrolly(state->tilemap_rot, 0, state->rotregs[ 2 ] + 0x400);
/* Black background color */
bitmap_fill(bitmap, cliprect, screen->machine->pens[0x0000]);
@ -704,43 +710,43 @@ SCREEN_UPDATE( rocknms )
asc_pri = scr_pri = rot_pri = 0;
if((tetrisp2_priority[0x2b00 / 2] & 0x00ff) == 0x0034)
if((state->priority[0x2b00 / 2] & 0x00ff) == 0x0034)
asc_pri++;
else
rot_pri++;
if((tetrisp2_priority[0x2e00 / 2] & 0x00ff) == 0x0034)
if((state->priority[0x2e00 / 2] & 0x00ff) == 0x0034)
asc_pri++;
else
scr_pri++;
if((tetrisp2_priority[0x3a00 / 2] & 0x00ff) == 0x000c)
if((state->priority[0x3a00 / 2] & 0x00ff) == 0x000c)
scr_pri++;
else
rot_pri++;
if (rot_pri == 0)
tilemap_draw(bitmap,cliprect, tilemap_rot, 0, 1 << 1);
tilemap_draw(bitmap,cliprect, state->tilemap_rot, 0, 1 << 1);
else if (scr_pri == 0)
tilemap_draw(bitmap,cliprect, tilemap_bg, 0, 1 << 0);
tilemap_draw(bitmap,cliprect, state->tilemap_bg, 0, 1 << 0);
else if (asc_pri == 0)
tilemap_draw(bitmap,cliprect, tilemap_fg, 0, 1 << 2);
tilemap_draw(bitmap,cliprect, state->tilemap_fg, 0, 1 << 2);
if (rot_pri == 1)
tilemap_draw(bitmap,cliprect, tilemap_rot, 0, 1 << 1);
tilemap_draw(bitmap,cliprect, state->tilemap_rot, 0, 1 << 1);
else if (scr_pri == 1)
tilemap_draw(bitmap,cliprect, tilemap_bg, 0, 1 << 0);
tilemap_draw(bitmap,cliprect, state->tilemap_bg, 0, 1 << 0);
else if (asc_pri == 1)
tilemap_draw(bitmap,cliprect, tilemap_fg, 0, 1 << 2);
tilemap_draw(bitmap,cliprect, state->tilemap_fg, 0, 1 << 2);
if (rot_pri == 2)
tilemap_draw(bitmap,cliprect, tilemap_rot, 0, 1 << 1);
tilemap_draw(bitmap,cliprect, state->tilemap_rot, 0, 1 << 1);
else if (scr_pri == 2)
tilemap_draw(bitmap,cliprect, tilemap_bg, 0, 1 << 0);
tilemap_draw(bitmap,cliprect, state->tilemap_bg, 0, 1 << 0);
else if (asc_pri == 2)
tilemap_draw(bitmap,cliprect, tilemap_fg, 0, 1 << 2);
tilemap_draw(bitmap,cliprect, state->tilemap_fg, 0, 1 << 2);
tetrisp2_draw_sprites(screen->machine, bitmap, screen->machine->priority_bitmap,cliprect, tetrisp2_priority, screen->machine->generic.spriteram.u16, screen->machine->generic.spriteram_size, 0, (tetrisp2_systemregs[0x00] & 0x02));
tetrisp2_draw_sprites(screen->machine, bitmap, screen->machine->priority_bitmap,cliprect, state->priority, screen->machine->generic.spriteram.u16, screen->machine->generic.spriteram_size, 0, (state->systemregs[0x00] & 0x02));
}
return 0;

View File

@ -8,9 +8,6 @@
#include "includes/vicdual.h"
static UINT8 palette_bank;
static const pen_t pens_from_color_prom[] =
{
RGB_BLACK,
@ -26,13 +23,15 @@ static const pen_t pens_from_color_prom[] =
WRITE8_HANDLER( vicdual_palette_bank_w )
{
vicdual_state *state = space->machine->driver_data<vicdual_state>();
space->machine->primary_screen->update_partial(space->machine->primary_screen->vpos());
palette_bank = data & 3;
state->palette_bank = data & 3;
}
SCREEN_UPDATE( vicdual_bw )
{
vicdual_state *state = screen->machine->driver_data<vicdual_state>();
UINT8 x = 0;
UINT8 y = cliprect->min_y;
UINT8 video_data = 0;
@ -48,11 +47,11 @@ SCREEN_UPDATE( vicdual_bw )
/* read the character code */
offs = (y >> 3 << 5) | (x >> 3);
char_code = vicdual_videoram_r(offs);
char_code = state->videoram[offs];
/* read the appropriate line of the character ram */
offs = (char_code << 3) | (y & 0x07);
video_data = vicdual_characterram_r(offs);
video_data = state->characterram[offs];
}
/* plot the current pixel */
@ -83,6 +82,7 @@ SCREEN_UPDATE( vicdual_bw )
SCREEN_UPDATE( vicdual_color )
{
vicdual_state *state = screen->machine->driver_data<vicdual_state>();
UINT8 *color_prom = (UINT8 *)screen->machine->region("proms")->base();
UINT8 x = 0;
UINT8 y = cliprect->min_y;
@ -101,14 +101,14 @@ SCREEN_UPDATE( vicdual_color )
/* read the character code */
offs = (y >> 3 << 5) | (x >> 3);
char_code = vicdual_videoram_r(offs);
char_code = state->videoram[offs];
/* read the appropriate line of the character ram */
offs = (char_code << 3) | (y & 0x07);
video_data = vicdual_characterram_r(offs);
video_data = state->characterram[offs];
/* get the foreground and background colors from the PROM */
offs = (char_code >> 5) | (palette_bank << 3);
offs = (char_code >> 5) | (state->palette_bank << 3);
back_pen = pens_from_color_prom[(color_prom[offs] >> 1) & 0x07];
fore_pen = pens_from_color_prom[(color_prom[offs] >> 5) & 0x07];
}