From 989a275f22fb73198126745af47eb00c95a2c171 Mon Sep 17 00:00:00 2001 From: Fabio Priuli Date: Fri, 11 Dec 2009 10:51:55 +0000 Subject: [PATCH] Added driver data struct to airbustr.c and djboy.c. Now the latter also supports saves (the former already did). --- src/mame/drivers/airbustr.c | 173 +++++----- src/mame/drivers/djboy.c | 632 ++++++++++++++++++------------------ src/mame/video/airbustr.c | 94 +++--- src/mame/video/djboy.c | 68 ++-- 4 files changed, 504 insertions(+), 463 deletions(-) diff --git a/src/mame/drivers/airbustr.c b/src/mame/drivers/airbustr.c index d68ad6b2cf6..a0cc9bfc821 100644 --- a/src/mame/drivers/airbustr.c +++ b/src/mame/drivers/airbustr.c @@ -223,46 +223,32 @@ Code at 505: waits for bit 1 to go low, writes command, waits for bit #include "sound/2203intf.h" #include "sound/okim6295.h" #include "video/kan_pand.h" - -static UINT8 *devram; -static int soundlatch_status, soundlatch2_status; -static int master_addr; -static int slave_addr; - -extern UINT8 *airbustr_videoram2, *airbustr_colorram2; - -extern WRITE8_HANDLER( airbustr_videoram_w ); -extern WRITE8_HANDLER( airbustr_colorram_w ); -extern WRITE8_HANDLER( airbustr_videoram2_w ); -extern WRITE8_HANDLER( airbustr_colorram2_w ); -extern WRITE8_HANDLER( airbustr_scrollregs_w ); -extern VIDEO_START( airbustr ); -extern VIDEO_UPDATE( airbustr ); -extern VIDEO_EOF( airbustr ); +#include "includes/airbustr.h" /* Read/Write Handlers */ - static READ8_HANDLER( devram_r ) { - // There's an MCU here, possibly + airbustr_state *state = (airbustr_state *)space->machine->driver_data; + // There's an MCU here, possibly switch (offset) { /* Reading efe0 probably resets a watchdog mechanism that would reset the main cpu. We avoid this and patch the rom instead (main cpu has to be reset once at startup) */ case 0xfe0: - return watchdog_reset_r(space,0); + return watchdog_reset_r(space, 0); /* Reading a word at eff2 probably yelds the product of the words written to eff0 and eff2 */ case 0xff2: case 0xff3: { - int x = (devram[0xff0] + devram[0xff1] * 256) * - (devram[0xff2] + devram[0xff3] * 256); - if (offset == 0xff2) return (x & 0x00FF) >> 0; - else return (x & 0xFF00) >> 8; + int x = (state->devram[0xff0] + state->devram[0xff1] * 256) * (state->devram[0xff2] + state->devram[0xff3] * 256); + if (offset == 0xff2) + return (x & 0x00ff) >> 0; + else + return (x & 0xff00) >> 8; } break; /* Reading eff4, F0 times must yield at most 80-1 consecutive @@ -271,91 +257,88 @@ static READ8_HANDLER( devram_r ) return mame_rand(space->machine); default: - return devram[offset]; + return state->devram[offset]; } } static WRITE8_HANDLER( master_nmi_trigger_w ) { - cputag_set_input_line(space->machine, "slave", INPUT_LINE_NMI, PULSE_LINE); -} - -static void airbustr_bankswitch(running_machine *machine, const char *cpu, const char *bank, int data) -{ - UINT8 *ROM = memory_region(machine, cpu); - - if ((data & 0x07) < 3) - ROM = &ROM[0x4000 * (data & 0x07)]; - else - ROM = &ROM[0x10000 + 0x4000 * ((data & 0x07) - 3)]; - - memory_set_bankptr(machine, bank, ROM); + airbustr_state *state = (airbustr_state *)space->machine->driver_data; + cpu_set_input_line(state->slave, INPUT_LINE_NMI, PULSE_LINE); } static WRITE8_HANDLER( master_bankswitch_w ) { - airbustr_bankswitch(space->machine, "master", "bank1", data); + memory_set_bank(space->machine, "bank1", data & 0x07); } static WRITE8_HANDLER( slave_bankswitch_w ) { - const device_config *pandora = devtag_get_device(space->machine, "pandora"); - airbustr_bankswitch(space->machine, "slave", "bank2", data); + airbustr_state *state = (airbustr_state *)space->machine->driver_data; + + memory_set_bank(space->machine, "bank2", data & 0x07); flip_screen_set(space->machine, data & 0x10); // used at the end of levels, after defeating the boss, to leave trails - pandora_set_clear_bitmap(pandora, data&0x20); + pandora_set_clear_bitmap(state->pandora, data & 0x20); } static WRITE8_HANDLER( sound_bankswitch_w ) { - airbustr_bankswitch(space->machine, "audiocpu", "bank3", data); + memory_set_bank(space->machine, "bank3", data & 0x07); } static READ8_HANDLER( soundcommand_status_r ) { + airbustr_state *state = (airbustr_state *)space->machine->driver_data; + // bits: 2 <-> ? 1 <-> soundlatch full 0 <-> soundlatch2 empty - return 4 + soundlatch_status * 2 + (1 - soundlatch2_status); + return 4 + state->soundlatch_status * 2 + (1 - state->soundlatch2_status); } static READ8_HANDLER( soundcommand_r ) { - soundlatch_status = 0; // soundlatch has been read - return soundlatch_r(space,0); + airbustr_state *state = (airbustr_state *)space->machine->driver_data; + state->soundlatch_status = 0; // soundlatch has been read + return soundlatch_r(space, 0); } static READ8_HANDLER( soundcommand2_r ) { - soundlatch2_status = 0; // soundlatch2 has been read - return soundlatch2_r(space,0); + airbustr_state *state = (airbustr_state *)space->machine->driver_data; + state->soundlatch2_status = 0; // soundlatch2 has been read + return soundlatch2_r(space, 0); } static WRITE8_HANDLER( soundcommand_w ) { + airbustr_state *state = (airbustr_state *)space->machine->driver_data; soundlatch_w(space, 0, data); - soundlatch_status = 1; // soundlatch has been written - cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE); // cause a nmi to sub cpu + state->soundlatch_status = 1; // soundlatch has been written + cpu_set_input_line(state->audiocpu, INPUT_LINE_NMI, PULSE_LINE); // cause a nmi to sub cpu } static WRITE8_HANDLER( soundcommand2_w ) { + airbustr_state *state = (airbustr_state *)space->machine->driver_data; soundlatch2_w(space, 0, data); - soundlatch2_status = 1; // soundlatch2 has been written + state->soundlatch2_status = 1; // soundlatch2 has been written } static WRITE8_HANDLER( airbustr_paletteram_w ) { + airbustr_state *state = (airbustr_state *)space->machine->driver_data; int val; /* ! byte 1 ! ! byte 0 ! */ /* xGGG GGRR RRRB BBBB */ /* x432 1043 2104 3210 */ - space->machine->generic.paletteram.u8[offset] = data; - val = (space->machine->generic.paletteram.u8[offset | 1] << 8) | space->machine->generic.paletteram.u8[offset & ~1]; + state->paletteram[offset] = data; + val = (state->paletteram[offset | 1] << 8) | state->paletteram[offset & ~1]; - palette_set_color_rgb(space->machine, offset/2, pal5bit(val >> 5), pal5bit(val >> 10), pal5bit(val >> 0)); + palette_set_color_rgb(space->machine, offset / 2, pal5bit(val >> 5), pal5bit(val >> 10), pal5bit(val >> 0)); } static WRITE8_HANDLER( airbustr_coin_counter_w ) @@ -367,13 +350,12 @@ static WRITE8_HANDLER( airbustr_coin_counter_w ) } /* Memory Maps */ - static ADDRESS_MAP_START( master_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") AM_RANGE(0xc000, 0xcfff) AM_DEVREADWRITE("pandora", pandora_spriteram_r, pandora_spriteram_w) AM_RANGE(0xd000, 0xdfff) AM_RAM - AM_RANGE(0xe000, 0xefff) AM_RAM AM_BASE(&devram) // shared with protection device + AM_RANGE(0xe000, 0xefff) AM_RAM AM_BASE_MEMBER(airbustr_state, devram) // shared with protection device AM_RANGE(0xf000, 0xffff) AM_RAM AM_SHARE("share1") ADDRESS_MAP_END @@ -387,11 +369,11 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( slave_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank2") - AM_RANGE(0xc000, 0xc3ff) AM_RAM_WRITE(airbustr_videoram2_w) AM_BASE(&airbustr_videoram2) - AM_RANGE(0xc400, 0xc7ff) AM_RAM_WRITE(airbustr_colorram2_w) AM_BASE(&airbustr_colorram2) - AM_RANGE(0xc800, 0xcbff) AM_RAM_WRITE(airbustr_videoram_w) AM_BASE_GENERIC(videoram) - AM_RANGE(0xcc00, 0xcfff) AM_RAM_WRITE(airbustr_colorram_w) AM_BASE_GENERIC(colorram) - AM_RANGE(0xd000, 0xd5ff) AM_RAM_WRITE(airbustr_paletteram_w) AM_BASE_GENERIC(paletteram) + AM_RANGE(0xc000, 0xc3ff) AM_RAM_WRITE(airbustr_videoram2_w) AM_BASE_MEMBER(airbustr_state, videoram2) + AM_RANGE(0xc400, 0xc7ff) AM_RAM_WRITE(airbustr_colorram2_w) AM_BASE_MEMBER(airbustr_state, colorram2) + AM_RANGE(0xc800, 0xcbff) AM_RAM_WRITE(airbustr_videoram_w) AM_BASE_MEMBER(airbustr_state, videoram) + AM_RANGE(0xcc00, 0xcfff) AM_RAM_WRITE(airbustr_colorram_w) AM_BASE_MEMBER(airbustr_state, colorram) + AM_RANGE(0xd000, 0xd5ff) AM_RAM_WRITE(airbustr_paletteram_w) AM_BASE_MEMBER(airbustr_state, paletteram) AM_RANGE(0xd600, 0xdfff) AM_RAM AM_RANGE(0xe000, 0xefff) AM_RAM AM_RANGE(0xf000, 0xffff) AM_RAM AM_SHARE("share1") @@ -577,35 +559,66 @@ static const ym2203_interface ym2203_config = static INTERRUPT_GEN( master_interrupt ) { - master_addr ^= 0x02; - cpu_set_input_line_and_vector(device, 0, HOLD_LINE, master_addr); + airbustr_state *state = (airbustr_state *)device->machine->driver_data; + state->master_addr ^= 0x02; + cpu_set_input_line_and_vector(device, 0, HOLD_LINE, state->master_addr); } static INTERRUPT_GEN( slave_interrupt ) { - slave_addr ^= 0x02; - cpu_set_input_line_and_vector(device, 0, HOLD_LINE, slave_addr); + airbustr_state *state = (airbustr_state *)device->machine->driver_data; + state->slave_addr ^= 0x02; + cpu_set_input_line_and_vector(device, 0, HOLD_LINE, state->slave_addr); } /* Machine Initialization */ static MACHINE_START( airbustr ) { - state_save_register_global(machine, soundlatch_status); - state_save_register_global(machine, soundlatch2_status); - state_save_register_global(machine, master_addr); - state_save_register_global(machine, slave_addr); + airbustr_state *state = (airbustr_state *)machine->driver_data; + UINT8 *MASTER = memory_region(machine, "master"); + UINT8 *SLAVE = memory_region(machine, "slave"); + UINT8 *AUDIO = memory_region(machine, "audiocpu"); + + memory_configure_bank(machine, "bank1", 0, 3, &MASTER[0x00000], 0x4000); + memory_configure_bank(machine, "bank1", 3, 5, &MASTER[0x10000], 0x4000); + memory_configure_bank(machine, "bank2", 0, 3, &SLAVE[0x00000], 0x4000); + memory_configure_bank(machine, "bank2", 3, 5, &SLAVE[0x10000], 0x4000); + memory_configure_bank(machine, "bank3", 0, 3, &AUDIO[0x00000], 0x4000); + memory_configure_bank(machine, "bank3", 3, 5, &AUDIO[0x10000], 0x4000); + + state->master = devtag_get_device(machine, "master"); + state->slave = devtag_get_device(machine, "slave"); + state->audiocpu = devtag_get_device(machine, "audiocpu"); + state->pandora = devtag_get_device(machine, "pandora"); + + state_save_register_global(machine, state->soundlatch_status); + state_save_register_global(machine, state->soundlatch2_status); + state_save_register_global(machine, state->master_addr); + state_save_register_global(machine, state->slave_addr); + state_save_register_global(machine, state->bg_scrollx); + state_save_register_global(machine, state->bg_scrolly); + state_save_register_global(machine, state->fg_scrollx); + state_save_register_global(machine, state->fg_scrolly); + state_save_register_global(machine, state->highbits); } static MACHINE_RESET( airbustr ) { - const address_space *space = cputag_get_address_space(machine, "master", ADDRESS_SPACE_PROGRAM); - soundlatch_status = soundlatch2_status = 0; - master_addr = 0xff; - slave_addr = 0xfd; - master_bankswitch_w(space, 0, 0x02); - slave_bankswitch_w(space, 0, 0x02); - sound_bankswitch_w(space, 0, 0x02); + airbustr_state *state = (airbustr_state *)machine->driver_data; + + state->soundlatch_status = state->soundlatch2_status = 0; + state->master_addr = 0xff; + state->slave_addr = 0xfd; + state->bg_scrollx = 0; + state->bg_scrolly = 0; + state->fg_scrollx = 0; + state->fg_scrolly = 0; + state->highbits = 0; + + memory_set_bank(machine, "bank1", 0x02); + memory_set_bank(machine, "bank2", 0x02); + memory_set_bank(machine, "bank3", 0x02); } /* Machine Driver */ @@ -618,7 +631,11 @@ static const kaneko_pandora_interface airbustr_pandora_config = }; static MACHINE_DRIVER_START( airbustr ) - // basic machine hardware + + /* driver data */ + MDRV_DRIVER_DATA(airbustr_state) + + /* basic machine hardware */ MDRV_CPU_ADD("master", Z80, 6000000) // ??? MDRV_CPU_PROGRAM_MAP(master_map) MDRV_CPU_IO_MAP(master_io_map) @@ -640,7 +657,7 @@ static MACHINE_DRIVER_START( airbustr ) MDRV_MACHINE_RESET(airbustr) MDRV_WATCHDOG_TIME_INIT(SEC(3)) /* a guess, and certainly wrong */ - // video hardware + /* video hardware */ MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) @@ -656,7 +673,7 @@ static MACHINE_DRIVER_START( airbustr ) MDRV_VIDEO_UPDATE(airbustr) MDRV_VIDEO_EOF(airbustr) - // sound hardware + /* sound hardware */ MDRV_SPEAKER_STANDARD_MONO("mono") MDRV_SOUND_ADD("ymsnd", YM2203, 3000000) diff --git a/src/mame/drivers/djboy.c b/src/mame/drivers/djboy.c index fc1c1de4949..0314b8eac96 100644 --- a/src/mame/drivers/djboy.c +++ b/src/mame/drivers/djboy.c @@ -1,5 +1,5 @@ /* -DJ Boy (c)1989 Kanako +DJ Boy (c)1989 Kaneko Hardware has many similarities to Airbusters. @@ -159,76 +159,28 @@ Notes: #include "sound/2203intf.h" #include "sound/okim6295.h" #include "video/kan_pand.h" +#include "includes/djboy.h" -/* public functions from video/djboy.h */ -extern void djboy_set_videoreg( UINT8 data ); -extern WRITE8_HANDLER( djboy_scrollx_w ); -extern WRITE8_HANDLER( djboy_scrolly_w ); -extern WRITE8_HANDLER( djboy_videoram_w ); -extern WRITE8_HANDLER( djboy_paletteram_w ); -extern VIDEO_START( djboy ); -extern VIDEO_UPDATE( djboy ); -extern VIDEO_EOF( djboy ); - -/******************************************************************************/ /* KANEKO BEAST state */ -#define PROT_OUTPUT_BUFFER_SIZE 8 - -static int prot_busy_count; -static UINT8 prot_output_buffer[PROT_OUTPUT_BUFFER_SIZE]; -static int prot_available_data_count; -static int prot_offs; /* internal state */ -static UINT8 prot_ram[0x80]; /* internal RAM */ -static UINT8 prot_param[8]; - -static int coin; -static int complete; -static int lives[2]; -static int addr; -static int bankxor; - -static enum +static void ProtectionOut( running_machine *machine, int i, UINT8 data ) { - eDJBOY_ATTRACT_HIGHSCORE, - eDJBOY_ATTRACT_TITLE, - eDJBOY_ATTRACT_GAMEPLAY, - eDJBOY_PRESS_P1_START, - eDJBOY_PRESS_P1_OR_P2_START, - eDJBOY_ACTIVE_GAMEPLAY -} mDjBoyState; + djboy_state *state = (djboy_state *)machine->driver_data; -static enum -{ - ePROT_NORMAL, - ePROT_WRITE_BYTES, - ePROT_WRITE_BYTE, - ePROT_READ_BYTES, - ePROT_WAIT_DSW1_WRITEBACK, - ePROT_WAIT_DSW2_WRITEBACK, - ePROT_STORE_PARAM -} prot_mode; - -static void -ProtectionOut( int i, UINT8 data ) -{ - if( prot_available_data_count == i ) - { - prot_output_buffer[prot_available_data_count++] = data; - } + if (state->prot_available_data_count == i) + state->prot_output_buffer[state->prot_available_data_count++] = data; else { - logerror( "prot_output_buffer overflow!\n" ); + logerror("prot_output_buffer overflow!\n"); exit(1); } } /* ProtectionOut */ -static int -GetLives( running_machine *machine ) +static int GetLives( running_machine *machine ) { int dsw = input_port_read(machine, "DSW2"); - switch( dsw&0x30 ) + switch (dsw & 0x30) { case 0x10: return 3; case 0x00: return 5; @@ -238,370 +190,370 @@ GetLives( running_machine *machine ) return 0; } /* GetLives */ + static WRITE8_HANDLER( coinplus_w ) { + djboy_state *state = (djboy_state *)space->machine->driver_data; + int dsw = input_port_read(space->machine, "DSW1"); - coin_counter_w( space->machine, 0, data&1 ); - coin_counter_w( space->machine, 1, data&2 ); - if( data&1 ) + coin_counter_w(space->machine, 0, data & 1); + coin_counter_w(space->machine, 1, data & 2); + + if (data & 1) { /* TODO: coinage adjustments */ - logerror( "COIN A+\n" ); - switch( (dsw&0x30)>>4 ) + logerror("COIN A+\n"); + switch ((dsw & 0x30) >> 4) { - case 0: coin += 4; break; /* 1 coin, 1 credit */ - case 1: coin += 8; break; /* 1 coin, 2 credits */ - case 2: coin += 2; break; /* 2 coins, 1 credit */ - case 3: coin += 6; break; /* 2 coins, 3 credits */ + case 0: state->coin += 4; break; /* 1 coin, 1 credit */ + case 1: state->coin += 8; break; /* 1 coin, 2 credits */ + case 2: state->coin += 2; break; /* 2 coins, 1 credit */ + case 3: state->coin += 6; break; /* 2 coins, 3 credits */ } } - if( data&2 ) + if (data & 2) { - logerror( "COIN B+\n" ); - switch( (dsw&0xc0)>>6 ) + logerror("COIN B+\n"); + switch ((dsw & 0xc0) >> 6) { - case 0: coin += 4; break; /* 1 coin, 1 credit */ - case 1: coin += 8; break; /* 1 coin, 2 credits */ - case 2: coin += 2; break; /* 2 coins, 1 credit */ - case 3: coin += 6; break; /* 2 coins, 3 credits */ + case 0: state->coin += 4; break; /* 1 coin, 1 credit */ + case 1: state->coin += 8; break; /* 1 coin, 2 credits */ + case 2: state->coin += 2; break; /* 2 coins, 1 credit */ + case 3: state->coin += 6; break; /* 2 coins, 3 credits */ } } } /* coinplus_w */ -static void -OutputProtectionState( running_machine *machine, int i, int type ) +static void OutputProtectionState( running_machine *machine, int i, int type ) { + djboy_state *state = (djboy_state *)machine->driver_data; int io = ~input_port_read(machine, "IN0"); int dat = 0x00; - switch( mDjBoyState ) + switch (state->mDjBoyState) { case eDJBOY_ATTRACT_HIGHSCORE: - if( coin>=4 ) + if (state->coin >= 4) { dat = 0x01; - mDjBoyState = eDJBOY_PRESS_P1_START; - logerror( "COIN UP\n" ); + state->mDjBoyState = eDJBOY_PRESS_P1_START; + logerror("COIN UP\n"); } - else if( complete ) + else if (state->complete) { dat = 0x06; - mDjBoyState = eDJBOY_ATTRACT_TITLE; + state->mDjBoyState = eDJBOY_ATTRACT_TITLE; } break; case eDJBOY_ATTRACT_TITLE: - if( coin>=4 ) + if (state->coin >= 4) { dat = 0x01; - mDjBoyState = eDJBOY_PRESS_P1_START; - logerror( "COIN UP\n" ); + state->mDjBoyState = eDJBOY_PRESS_P1_START; + logerror("COIN UP\n"); } - else if( complete ) + else if (state->complete) { dat = 0x15; - mDjBoyState = eDJBOY_ATTRACT_GAMEPLAY; + state->mDjBoyState = eDJBOY_ATTRACT_GAMEPLAY; } break; case eDJBOY_ATTRACT_GAMEPLAY: - if( coin>=4 ) + if (state->coin>=4) { dat = 0x01; - mDjBoyState = eDJBOY_PRESS_P1_START; - logerror( "COIN UP\n" ); + state->mDjBoyState = eDJBOY_PRESS_P1_START; + logerror("COIN UP\n"); } - else if( complete ) + else if (state->complete) { dat = 0x0b; - mDjBoyState = eDJBOY_ATTRACT_HIGHSCORE; + state->mDjBoyState = eDJBOY_ATTRACT_HIGHSCORE; } break; case eDJBOY_PRESS_P1_START: - if( io&1 ) - { /* p1 start */ + if (io & 1) /* p1 start */ + { dat = 0x16; - mDjBoyState = eDJBOY_ACTIVE_GAMEPLAY; - logerror( "P1 START\n" ); + state->mDjBoyState = eDJBOY_ACTIVE_GAMEPLAY; + logerror("P1 START\n"); } - else if( coin>=8 ) + else if (state->coin >= 8) { dat = 0x05; - mDjBoyState = eDJBOY_PRESS_P1_OR_P2_START; - logerror( "COIN2 UP\n" ); + state->mDjBoyState = eDJBOY_PRESS_P1_OR_P2_START; + logerror("COIN2 UP\n"); } break; case eDJBOY_PRESS_P1_OR_P2_START: - if( io&1 ) - { /* p1 start */ + if (io & 1) /* p1 start */ + { dat = 0x16; - mDjBoyState = eDJBOY_ACTIVE_GAMEPLAY; - lives[0] = GetLives(machine); - logerror( "P1 START!\n" ); - coin-=4; + state->mDjBoyState = eDJBOY_ACTIVE_GAMEPLAY; + state->lives[0] = GetLives(machine); + logerror("P1 START!\n"); + state->coin -= 4; } - else if( io&2 ) - { /* p2 start */ + else if (io & 2) /* p2 start */ + { dat = 0x0a; - mDjBoyState = eDJBOY_ACTIVE_GAMEPLAY; - lives[0] = GetLives(machine); - lives[1] = GetLives(machine); - logerror( "P2 START!\n" ); - coin-=8; + state->mDjBoyState = eDJBOY_ACTIVE_GAMEPLAY; + state->lives[0] = GetLives(machine); + state->lives[1] = GetLives(machine); + logerror("P2 START!\n"); + state->coin -= 8; } break; case eDJBOY_ACTIVE_GAMEPLAY: - if( lives[0]==0 && lives[1]==0 && complete ) - { /* continue countdown complete */ - dat = 0x0f; - logerror( "countdown complete!\n" ); - mDjBoyState = eDJBOY_ATTRACT_HIGHSCORE; - } - else if( coin>=4 ) + if (state->lives[0] == 0 && state->lives[1] == 0 && state->complete) /* continue countdown complete */ { - if( (io&1) && lives[0]==0 ) + dat = 0x0f; + logerror("countdown complete!\n"); + state->mDjBoyState = eDJBOY_ATTRACT_HIGHSCORE; + } + else if (state->coin >= 4) + { + if ((io & 1) && state->lives[0] == 0) { dat = 0x12; /* continue (P1) */ - lives[0] = GetLives(machine); - mDjBoyState = eDJBOY_ACTIVE_GAMEPLAY; - coin-=4; - logerror( "P1 CONTINUE!\n" ); + state->lives[0] = GetLives(machine); + state->mDjBoyState = eDJBOY_ACTIVE_GAMEPLAY; + state->coin -= 4; + logerror("P1 CONTINUE!\n"); } - else if( (io&2) && lives[1]==0 ) + else if ((io & 2) && state->lives[1] == 0) { dat = 0x08; /* continue (P2) */ - lives[1] = GetLives(machine); - mDjBoyState = eDJBOY_ACTIVE_GAMEPLAY; - coin-=4; - logerror( "P2 CONTINUE!\n" ); + state->lives[1] = GetLives(machine); + state->mDjBoyState = eDJBOY_ACTIVE_GAMEPLAY; + state->coin -= 4; + logerror("P2 CONTINUE!\n"); } } break; } - complete = 0; - ProtectionOut( i, dat ); + state->complete = 0; + ProtectionOut(machine, i, dat); } /* OutputProtectionState */ -static void -CommonProt( running_machine *machine, int i, int type ) +static void CommonProt( running_machine *machine, int i, int type ) { - int displayedCredits = coin/4; - if( displayedCredits>9 ) - { + djboy_state *state = (djboy_state *)machine->driver_data; + int displayedCredits = state->coin / 4; + if (displayedCredits > 9) displayedCredits = 9; - } - ProtectionOut( i++, displayedCredits ); - ProtectionOut( i++, input_port_read(machine, "IN0") ); /* COIN/START */ - OutputProtectionState( machine, i, type ); + + ProtectionOut(machine, i++, displayedCredits); + ProtectionOut(machine, i++, input_port_read(machine, "IN0")); /* COIN/START */ + OutputProtectionState(machine, i, type); } /* CommonProt */ static WRITE8_HANDLER( beast_data_w ) { - prot_busy_count = 1; + djboy_state *state = (djboy_state *)space->machine->driver_data; - logerror( "0x%04x: prot_w(0x%02x)\n", cpu_get_pc(space->cpu), data ); + state->prot_busy_count = 1; - watchdog_reset_w(space,0,0); + logerror("0x%04x: prot_w(0x%02x)\n", cpu_get_pc(space->cpu), data); - if( prot_mode == ePROT_WAIT_DSW1_WRITEBACK ) + watchdog_reset_w(space, 0, 0); + + if (state->prot_mode == ePROT_WAIT_DSW1_WRITEBACK) { - logerror( "[DSW1_WRITEBACK]\n" ); - ProtectionOut( 0, input_port_read(space->machine, "DSW2") ); /* DSW2 */ - prot_mode = ePROT_WAIT_DSW2_WRITEBACK; + logerror("[DSW1_WRITEBACK]\n"); + ProtectionOut(space->machine, 0, input_port_read(space->machine, "DSW2")); /* DSW2 */ + state->prot_mode = ePROT_WAIT_DSW2_WRITEBACK; } - else if( prot_mode == ePROT_WAIT_DSW2_WRITEBACK ) + else if (state->prot_mode == ePROT_WAIT_DSW2_WRITEBACK) { - logerror( "[DSW2_WRITEBACK]\n" ); - prot_mode = ePROT_STORE_PARAM; - prot_offs = 0; + logerror("[DSW2_WRITEBACK]\n"); + state->prot_mode = ePROT_STORE_PARAM; + state->prot_offs = 0; } - else if( prot_mode == ePROT_STORE_PARAM ) + else if (state->prot_mode == ePROT_STORE_PARAM) { - logerror( "prot param[%d]: 0x%02x\n", prot_offs, data ); - if( prot_offs<8 ) - { - prot_param[prot_offs++] = data; - } - if( prot_offs == 8 ) - { - prot_mode = ePROT_NORMAL; - } + logerror("prot param[%d]: 0x%02x\n", state->prot_offs, data); + if (state->prot_offs < 8) + state->prot_param[state->prot_offs++] = data; + + if(state->prot_offs == 8) + state->prot_mode = ePROT_NORMAL; } - else if( prot_mode == ePROT_WRITE_BYTE ) + else if (state->prot_mode == ePROT_WRITE_BYTE) { /* pc == 0x79cd */ - prot_ram[(prot_offs++)&0x7f] = data; - prot_mode = ePROT_WRITE_BYTES; + state->prot_ram[(state->prot_offs++) & 0x7f] = data; + state->prot_mode = ePROT_WRITE_BYTES; } else { - switch( data ) + switch (data) { case 0x00: - if( prot_mode == ePROT_WRITE_BYTES ) + if (state->prot_mode == ePROT_WRITE_BYTES) { /* next byte is data to write to internal prot RAM */ - prot_mode = ePROT_WRITE_BYTE; + state->prot_mode = ePROT_WRITE_BYTE; } - else if( prot_mode == ePROT_READ_BYTES ) + else if (state->prot_mode == ePROT_READ_BYTES) { /* request next byte of internal prot RAM */ - ProtectionOut( 0, prot_ram[(prot_offs++)&0x7f] ); + ProtectionOut(space->machine, 0, state->prot_ram[(state->prot_offs++) & 0x7f]); } else - { - logerror( "UNEXPECTED PREFIX!\n" ); - } + logerror("UNEXPECTED PREFIX!\n"); break; case 0x01: // pc=7389 - OutputProtectionState( space->machine, 0, 0x01 ); + OutputProtectionState(space->machine, 0, 0x01); break; case 0x02: - CommonProt( space->machine,0,0x02 ); + CommonProt(space->machine, 0, 0x02); break; case 0x03: /* prepare for memory write to protection device ram (pc == 0x7987) */ // -> 0x02 - logerror( "[WRITE BYTES]\n" ); - prot_mode = ePROT_WRITE_BYTES; - prot_offs = 0; + logerror("[WRITE BYTES]\n"); + state->prot_mode = ePROT_WRITE_BYTES; + state->prot_offs = 0; break; case 0x04: - ProtectionOut( 0,0 ); // ? - ProtectionOut( 1,0 ); // ? - ProtectionOut( 2,0 ); // ? - ProtectionOut( 3,0 ); // ? - CommonProt( space->machine, 4,0x04 ); + ProtectionOut(space->machine, 0, 0); // ? + ProtectionOut(space->machine, 1, 0); // ? + ProtectionOut(space->machine, 2, 0); // ? + ProtectionOut(space->machine, 3, 0); // ? + CommonProt(space->machine, 4, 0x04); break; case 0x05: /* 0x71f4 */ - ProtectionOut( 0,input_port_read(space->machine, "IN1") ); // to $42 - ProtectionOut( 1,0 ); // ? - ProtectionOut( 2,input_port_read(space->machine, "IN2") ); // to $43 - ProtectionOut( 3,0 ); // ? - ProtectionOut( 4,0 ); // ? - CommonProt( space->machine, 5,0x05 ); + ProtectionOut(space->machine, 0, input_port_read(space->machine, "IN1")); // to $42 + ProtectionOut(space->machine, 1, 0); // ? + ProtectionOut(space->machine, 2, input_port_read(space->machine, "IN2")); // to $43 + ProtectionOut(space->machine, 3, 0); // ? + ProtectionOut(space->machine, 4, 0); // ? + CommonProt(space->machine, 5, 0x05); break; case 0x07: - CommonProt( space->machine, 0,0x07 ); + CommonProt(space->machine, 0, 0x07); break; case 0x08: /* pc == 0x727a */ - ProtectionOut( 0,input_port_read(space->machine, "IN0") ); /* COIN/START */ - ProtectionOut( 1,input_port_read(space->machine, "IN1") ); /* JOY1 */ - ProtectionOut( 2,input_port_read(space->machine, "IN2") ); /* JOY2 */ - ProtectionOut( 3,input_port_read(space->machine, "DSW1") ); /* DSW1 */ - ProtectionOut( 4,input_port_read(space->machine, "DSW2") ); /* DSW2 */ - CommonProt( space->machine, 5, 0x08 ); + ProtectionOut(space->machine, 0, input_port_read(space->machine, "IN0")); /* COIN/START */ + ProtectionOut(space->machine, 1, input_port_read(space->machine, "IN1")); /* JOY1 */ + ProtectionOut(space->machine, 2, input_port_read(space->machine, "IN2")); /* JOY2 */ + ProtectionOut(space->machine, 3, input_port_read(space->machine, "DSW1")); /* DSW1 */ + ProtectionOut(space->machine, 4, input_port_read(space->machine, "DSW2")); /* DSW2 */ + CommonProt(space->machine, 5, 0x08); break; case 0x09: - ProtectionOut( 0,0 ); // ? - ProtectionOut( 1,0 ); // ? - ProtectionOut( 2,0 ); // ? - CommonProt( space->machine, 3, 0x09 ); + ProtectionOut(space->machine, 0, 0); // ? + ProtectionOut(space->machine, 1, 0); // ? + ProtectionOut(space->machine, 2, 0); // ? + CommonProt(space->machine, 3, 0x09); break; case 0x0a: - CommonProt( space->machine,0,0x0a ); + CommonProt(space->machine, 0, 0x0a); break; case 0x0c: - CommonProt( space->machine,1,0x0c ); + CommonProt(space->machine, 1, 0x0c); break; case 0x0d: - CommonProt( space->machine,2,0x0d ); + CommonProt(space->machine, 2, 0x0d); break; case 0xfe: /* prepare for memory read from protection device ram (pc == 0x79ee, 0x7a3f) */ - if( prot_mode == ePROT_WRITE_BYTES ) + if (state->prot_mode == ePROT_WRITE_BYTES) { - prot_mode = ePROT_READ_BYTES; - logerror( "[READ BYTES]\n" ); + state->prot_mode = ePROT_READ_BYTES; + logerror("[READ BYTES]\n"); } else { - prot_mode = ePROT_WRITE_BYTES; - logerror( "[WRITE BYTES*]\n" ); + state->prot_mode = ePROT_WRITE_BYTES; + logerror("[WRITE BYTES*]\n"); } - prot_offs = 0; + state->prot_offs = 0; break; case 0xff: /* read DSW (pc == 0x714d) */ - ProtectionOut( 0,input_port_read(space->machine, "DSW1") ); /* DSW1 */ - prot_mode = ePROT_WAIT_DSW1_WRITEBACK; + ProtectionOut(space->machine, 0, input_port_read(space->machine, "DSW1")); /* DSW1 */ + state->prot_mode = ePROT_WAIT_DSW1_WRITEBACK; break; case 0xa9: /* 1-player game: P1 dies 2-player game: P2 dies */ - if( lives[0]>0 && lives[1]>0 ) + if (state->lives[0] > 0 && state->lives[1] > 0 ) { - lives[1]--; - logerror( "%02x P2 DIE(%d)\n", data, lives[1] ); + state->lives[1]--; + logerror("%02x P2 DIE(%d)\n", data, state->lives[1]); } - else if( lives[0]>0 ) + else if (state->lives[0] > 0) { - lives[0]--; - logerror( "%02x P1 DIE(%d)\n", data, lives[0] ); + state->lives[0]--; + logerror("%02x P1 DIE(%d)\n", data, state->lives[0]); } else { - logerror( "%02x COMPLETE.\n", data ); - complete = 0xa9; + logerror("%02x COMPLETE.\n", data); + state->complete = 0xa9; } break; case 0x92: /* p2 lost life; in 2-p game, P1 died */ - if( lives[0]>0 && lives[1]>0 ) + if (state->lives[0] > 0 && state->lives[1] > 0 ) { - lives[0]--; - logerror( "%02x P1 DIE(%d)\n", data, lives[0] ); + state->lives[0]--; + logerror("%02x P1 DIE(%d)\n", data, state->lives[0]); } - else if( lives[1]>0 ) + else if (state->lives[1] > 0) { - lives[1]--; - logerror( "%02x P2 DIE (%d)\n", data, lives[1] ); + state->lives[1]--; + logerror("%02x P2 DIE (%d)\n", data, state->lives[1]); } else { - logerror( "%02x COMPLETE.\n", data ); - complete = 0x92; + logerror("%02x COMPLETE.\n", data); + state->complete = 0x92; } break; case 0xa3: /* p2 bonus life */ - lives[1]++; - logerror( "%02x P2 BONUS(%d)\n", data, lives[1] ); + state->lives[1]++; + logerror("%02x P2 BONUS(%d)\n", data, state->lives[1]); break; case 0xa5: /* p1 bonus life */ - lives[0]++; - logerror( "%02x P1 BONUS(%d)\n", data, lives[0] ); + state->lives[0]++; + logerror("%02x P1 BONUS(%d)\n", data, state->lives[0]); break; case 0xad: /* 1p game start ack */ - logerror( "%02x 1P GAME START\n", data ); + logerror("%02x 1P GAME START\n", data); break; case 0xb0: /* 1p+2p game start ack */ - logerror( "%02x 1P+2P GAME START\n", data ); + logerror("%02x 1P+2P GAME START\n", data); break; case 0xb3: /* 1p continue ack */ - logerror( "%02x 1P CONTINUE\n", data ); + logerror("%02x 1P CONTINUE\n", data); break; case 0xb7: /* 2p continue ack */ - logerror( "%02x 2P CONTINUE\n", data ); + logerror("%02x 2P CONTINUE\n", data); break; default: case 0x97: case 0x9a: - logerror( "!!0x%04x: prot_w(0x%02x)\n", cpu_get_pc(space->cpu), data ); + logerror("!!0x%04x: prot_w(0x%02x)\n", cpu_get_pc(space->cpu), data); break; } } @@ -609,75 +561,56 @@ static WRITE8_HANDLER( beast_data_w ) static READ8_HANDLER( beast_data_r ) { /* port#4 */ + djboy_state *state = (djboy_state *)space->machine->driver_data; UINT8 data = 0x00; - if( prot_available_data_count ) + if (state->prot_available_data_count) { int i; - data = prot_output_buffer[0]; - prot_available_data_count--; - for( i=0; iprot_output_buffer[0]; + state->prot_available_data_count--; + for (i = 0; i < state->prot_available_data_count; i++) + state->prot_output_buffer[i] = state->prot_output_buffer[i + 1]; } else { - logerror( "prot_r: data expected!\n" ); + logerror("prot_r: data expected!\n"); } - logerror( "0x%04x: prot_r() == 0x%02x\n", cpu_get_pc(space->cpu), data ); + logerror("0x%04x: prot_r() == 0x%02x\n", cpu_get_pc(space->cpu), data); return data; } /* beast_data_r */ static READ8_HANDLER( beast_status_r ) { /* port 0xc */ + djboy_state *state = (djboy_state *)space->machine->driver_data; UINT8 result = 0; - if( prot_busy_count ) + + if (state->prot_busy_count) { - prot_busy_count--; - result |= 1<<3; + state->prot_busy_count--; + result |= 1 << 3; } - if( !prot_available_data_count ) + if (!state->prot_available_data_count) { - result |= 1<<2; + result |= 1 << 2; } return result; } /* beast_status_r */ /******************************************************************************/ -static DRIVER_INIT( djboy ) -{ - coin = 0; - complete = 0; - memset(lives, 0, sizeof(lives)); - addr = 0xff; - bankxor = 0x00; -} - -static DRIVER_INIT( djboyj ) -{ - DRIVER_INIT_CALL( djboy ); - bankxor = 0x1f; -} static WRITE8_HANDLER( trigger_nmi_on_cpu0 ) { - cputag_set_input_line(space->machine, "maincpu", INPUT_LINE_NMI, PULSE_LINE); + djboy_state *state = (djboy_state *)space->machine->driver_data; + cpu_set_input_line(state->maincpu, INPUT_LINE_NMI, PULSE_LINE); } static WRITE8_HANDLER( cpu0_bankswitch_w ) { - unsigned char *RAM = memory_region(space->machine, "maincpu"); - data ^= bankxor; - memory_set_bankptr(space->machine, "bank4",&RAM[0x10000]); /* unsure if/how this area is banked */ - if( data < 4 ) - { - RAM = &RAM[0x2000 * data]; - } - else - { - RAM = &RAM[0x10000 + 0x2000 * (data-4)]; - } - memory_set_bankptr(space->machine, "bank1",RAM); + djboy_state *state = (djboy_state *)space->machine->driver_data; + + data ^= state->bankxor; + memory_set_bank(space->machine, "bank1", data); + memory_set_bank(space->machine, "bank4", 0); /* unsure if/how this area is banked */ } /******************************************************************************/ @@ -690,25 +623,30 @@ static WRITE8_HANDLER( cpu0_bankswitch_w ) */ static WRITE8_HANDLER( cpu1_bankswitch_w ) { - UINT8 *RAM = memory_region(space->machine, "cpu1"); - djboy_set_videoreg( data ); - switch( data&0xf ) + djboy_state *state = (djboy_state *)space->machine->driver_data; + state->videoreg = data; + + switch (data & 0xf) { /* bs65.5y */ - case 0x00: memory_set_bankptr(space->machine, "bank2",&RAM[0x00000]); break; - case 0x01: memory_set_bankptr(space->machine, "bank2",&RAM[0x04000]); break; - case 0x02: memory_set_bankptr(space->machine, "bank2",&RAM[0x10000]); break; - case 0x03: memory_set_bankptr(space->machine, "bank2",&RAM[0x14000]); break; + case 0x00: + case 0x01: + case 0x02: + case 0x03: + memory_set_bank(space->machine, "bank2", (data & 0xf)); + break; /* bs101.6w */ - case 0x08: memory_set_bankptr(space->machine, "bank2",&RAM[0x18000]); break; - case 0x09: memory_set_bankptr(space->machine, "bank2",&RAM[0x1c000]); break; - case 0x0a: memory_set_bankptr(space->machine, "bank2",&RAM[0x20000]); break; - case 0x0b: memory_set_bankptr(space->machine, "bank2",&RAM[0x24000]); break; - case 0x0c: memory_set_bankptr(space->machine, "bank2",&RAM[0x28000]); break; - case 0x0d: memory_set_bankptr(space->machine, "bank2",&RAM[0x2c000]); break; - case 0x0e: memory_set_bankptr(space->machine, "bank2",&RAM[0x30000]); break; - case 0x0f: memory_set_bankptr(space->machine, "bank2",&RAM[0x34000]); break; + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + case 0x0f: + memory_set_bank(space->machine, "bank2", (data & 0xf) - 4); + break; default: break; @@ -719,23 +657,14 @@ static WRITE8_HANDLER( cpu1_bankswitch_w ) static WRITE8_HANDLER( trigger_nmi_on_sound_cpu2 ) { + djboy_state *state = (djboy_state *)space->machine->driver_data; soundlatch_w(space, 0, data); - cputag_set_input_line(space->machine, "cpu2", INPUT_LINE_NMI, PULSE_LINE); + cpu_set_input_line(state->cpu2, INPUT_LINE_NMI, PULSE_LINE); } /* trigger_nmi_on_sound_cpu2 */ static WRITE8_HANDLER( cpu2_bankswitch_w ) { - UINT8 *RAM = memory_region(space->machine, "cpu2"); - - if( data < 3 ) - { - RAM = &RAM[0x04000 * data]; - } - else - { - RAM = &RAM[0x10000 + 0x4000 * (data - 3)]; - } - memory_set_bankptr(space->machine, "bank3", RAM); + memory_set_bank(space->machine, "bank3", data); // shall we check data<0x07? } /******************************************************************************/ @@ -760,8 +689,8 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( cpu1_am, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank2") - AM_RANGE(0xc000, 0xcfff) AM_RAM_WRITE(djboy_videoram_w) AM_BASE_GENERIC(videoram) - AM_RANGE(0xd000, 0xd3ff) AM_RAM_WRITE(djboy_paletteram_w) AM_BASE_GENERIC(paletteram) + AM_RANGE(0xc000, 0xcfff) AM_RAM_WRITE(djboy_videoram_w) AM_BASE_MEMBER(djboy_state, videoram) + AM_RANGE(0xd000, 0xd3ff) AM_RAM_WRITE(djboy_paletteram_w) AM_BASE_MEMBER(djboy_state, paletteram) AM_RANGE(0xd400, 0xd8ff) AM_RAM AM_RANGE(0xe000, 0xffff) AM_RAM AM_SHARE("share1") ADDRESS_MAP_END @@ -903,8 +832,9 @@ GFXDECODE_END static INTERRUPT_GEN( djboy_interrupt ) { /* CPU1 uses interrupt mode 2. For now, just alternate the two interrupts. */ - addr ^= 0x02; - cpu_set_input_line_and_vector(device, 0, HOLD_LINE, addr); + djboy_state *state = (djboy_state *)device->machine->driver_data; + state->addr ^= 0x02; + cpu_set_input_line_and_vector(device, 0, HOLD_LINE, state->addr); } static const kaneko_pandora_interface djboy_pandora_config = @@ -914,7 +844,77 @@ static const kaneko_pandora_interface djboy_pandora_config = 0, 0 /* x_offs, y_offs */ }; + +static MACHINE_START( djboy ) +{ + djboy_state *state = (djboy_state *)machine->driver_data; + UINT8 *MAIN = memory_region(machine, "maincpu"); + UINT8 *CPU1 = memory_region(machine, "cpu1"); + UINT8 *CPU2 = memory_region(machine, "cpu2"); + + memory_configure_bank(machine, "bank1", 0, 4, &MAIN[0x00000], 0x2000); + memory_configure_bank(machine, "bank1", 4, 28, &MAIN[0x10000], 0x2000); + memory_configure_bank(machine, "bank2", 0, 2, &CPU1[0x00000], 0x4000); + memory_configure_bank(machine, "bank2", 2, 10, &CPU1[0x10000], 0x4000); + memory_configure_bank(machine, "bank3", 0, 3, &CPU2[0x00000], 0x4000); + memory_configure_bank(machine, "bank3", 3, 5, &CPU2[0x10000], 0x4000); + memory_configure_bank(machine, "bank4", 0, 1, &MAIN[0x10000], 0x3000); /* unsure if/how this area is banked */ + + state->maincpu = devtag_get_device(machine, "maincpu"); + state->cpu1 = devtag_get_device(machine, "cpu1"); + state->cpu2 = devtag_get_device(machine, "cpu2"); + state->pandora = devtag_get_device(machine, "pandora"); + + state_save_register_global(machine, state->videoreg); + state_save_register_global(machine, state->scrollx); + state_save_register_global(machine, state->scrolly); + + /* Kaneko BEAST */ + state_save_register_global(machine, state->coin); + state_save_register_global(machine, state->complete); + state_save_register_global(machine, state->addr); + state_save_register_global_array(machine, state->lives); + + state_save_register_global(machine, state->mDjBoyState ); + state_save_register_global(machine, state->prot_mode); + state_save_register_global(machine, state->prot_busy_count); + state_save_register_global(machine, state->prot_available_data_count); + state_save_register_global(machine, state->prot_offs); + state_save_register_global_array(machine, state->prot_output_buffer); + state_save_register_global_array(machine, state->prot_ram); + state_save_register_global_array(machine, state->prot_param); +} + +static MACHINE_RESET( djboy ) +{ + djboy_state *state = (djboy_state *)machine->driver_data; + + state->videoreg = 0; + state->scrollx = 0; + state->scrolly = 0; + + /* Kaneko BEAST */ + state->coin = 0; + state->complete = 0; + state->addr = 0xff; + state->lives[0] = 0; + state->lives[1] = 0; + + state->prot_busy_count = 0; + state->prot_available_data_count = 0; + state->prot_offs = 0; + + memset(state->prot_output_buffer, 0, PROT_OUTPUT_BUFFER_SIZE); + memset(state->prot_ram, 0, 0x80); + memset(state->prot_param, 0, 8); + + state->mDjBoyState = eDJBOY_ATTRACT_HIGHSCORE; + state->prot_mode = ePROT_NORMAL; +} + static MACHINE_DRIVER_START( djboy ) + MDRV_DRIVER_DATA(djboy_state) + MDRV_CPU_ADD("maincpu", Z80,6000000) MDRV_CPU_PROGRAM_MAP(cpu0_am) MDRV_CPU_IO_MAP(cpu0_port_am) @@ -932,6 +932,9 @@ static MACHINE_DRIVER_START( djboy ) MDRV_QUANTUM_TIME(HZ(6000)) + MDRV_MACHINE_START(djboy) + MDRV_MACHINE_RESET(djboy) + MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) @@ -1072,8 +1075,19 @@ ROM_START( djboyj ) ROM_END +static DRIVER_INIT( djboy ) +{ + djboy_state *state = (djboy_state *)machine->driver_data; + state->bankxor = 0x00; +} + +static DRIVER_INIT( djboyj ) +{ + djboy_state *state = (djboy_state *)machine->driver_data; + state->bankxor = 0x1f; +} /* YEAR, NAME, PARENT, MACHINE, INPUT, INIT, MNTR, COMPANY, FULLNAME, FLAGS */ -GAME( 1989, djboy, 0, djboy, djboy, djboy, ROT0, "Kaneko (American Sammy license)", "DJ Boy (set 1)", 0) // Sammy & Williams logos in FG ROM -GAME( 1989, djboya, djboy, djboy, djboy, djboy, ROT0, "Kaneko (American Sammy license)", "DJ Boy (set 2)", 0) // Sammy & Williams logos in FG ROM -GAME( 1989, djboyj, djboy, djboy, djboy, djboyj, ROT0, "Kaneko (Sega license)", "DJ Boy (Japan)", 0 ) // Sega logo in FG ROM +GAME( 1989, djboy, 0, djboy, djboy, djboy, ROT0, "Kaneko (American Sammy license)", "DJ Boy (set 1)", GAME_SUPPORTS_SAVE) // Sammy & Williams logos in FG ROM +GAME( 1989, djboya, djboy, djboy, djboy, djboy, ROT0, "Kaneko (American Sammy license)", "DJ Boy (set 2)", GAME_SUPPORTS_SAVE) // Sammy & Williams logos in FG ROM +GAME( 1989, djboyj, djboy, djboy, djboy, djboyj, ROT0, "Kaneko (Sega license)", "DJ Boy (Japan)", GAME_SUPPORTS_SAVE ) // Sega logo in FG ROM diff --git a/src/mame/video/airbustr.c b/src/mame/video/airbustr.c index 19da28cd0b5..7641d9f3ce7 100644 --- a/src/mame/video/airbustr.c +++ b/src/mame/video/airbustr.c @@ -31,35 +31,35 @@ **************************************************************************/ #include "driver.h" -#include "kan_pand.h" - -UINT8 *airbustr_videoram2, *airbustr_colorram2; -//int airbustr_clear_sprites; -static tilemap *bg_tilemap, *fg_tilemap; -static bitmap_t *sprites_bitmap; +#include "video/kan_pand.h" +#include "includes/airbustr.h" WRITE8_HANDLER( airbustr_videoram_w ) { - space->machine->generic.videoram.u8[offset] = data; - tilemap_mark_tile_dirty(bg_tilemap, offset); + airbustr_state *state = (airbustr_state *)space->machine->driver_data; + state->videoram[offset] = data; + tilemap_mark_tile_dirty(state->bg_tilemap, offset); } WRITE8_HANDLER( airbustr_colorram_w ) { - space->machine->generic.colorram.u8[offset] = data; - tilemap_mark_tile_dirty(bg_tilemap, offset); + airbustr_state *state = (airbustr_state *)space->machine->driver_data; + state->colorram[offset] = data; + tilemap_mark_tile_dirty(state->bg_tilemap, offset); } WRITE8_HANDLER( airbustr_videoram2_w ) { - airbustr_videoram2[offset] = data; - tilemap_mark_tile_dirty(fg_tilemap, offset); + airbustr_state *state = (airbustr_state *)space->machine->driver_data; + state->videoram2[offset] = data; + tilemap_mark_tile_dirty(state->fg_tilemap, offset); } WRITE8_HANDLER( airbustr_colorram2_w ) { - airbustr_colorram2[offset] = data; - tilemap_mark_tile_dirty(fg_tilemap, offset); + airbustr_state *state = (airbustr_state *)space->machine->driver_data; + state->colorram2[offset] = data; + tilemap_mark_tile_dirty(state->fg_tilemap, offset); } /* Scroll Registers @@ -76,29 +76,29 @@ WRITE8_HANDLER( airbustr_colorram2_w ) WRITE8_HANDLER( airbustr_scrollregs_w ) { - static int bg_scrollx, bg_scrolly, fg_scrollx, fg_scrolly, highbits; - + airbustr_state *state = (airbustr_state *)space->machine->driver_data; switch (offset) // offset 0 <-> port 4 { - case 0x00: fg_scrolly = data; break; // low 8 bits - case 0x02: fg_scrollx = data; break; - case 0x04: bg_scrolly = data; break; - case 0x06: bg_scrollx = data; break; - case 0x08: highbits = ~data; break; // complemented high bits + case 0x00: state->fg_scrolly = data; break; // low 8 bits + case 0x02: state->fg_scrollx = data; break; + case 0x04: state->bg_scrolly = data; break; + case 0x06: state->bg_scrollx = data; break; + case 0x08: state->highbits = ~data; break; // complemented high bits default: logerror("CPU #2 - port %02X written with %02X - PC = %04X\n", offset, data, cpu_get_pc(space->cpu)); } - tilemap_set_scrolly(bg_tilemap, 0, ((highbits << 5) & 0x100) + bg_scrolly); - tilemap_set_scrollx(bg_tilemap, 0, ((highbits << 6) & 0x100) + bg_scrollx); - tilemap_set_scrolly(fg_tilemap, 0, ((highbits << 7) & 0x100) + fg_scrolly); - tilemap_set_scrollx(fg_tilemap, 0, ((highbits << 8) & 0x100) + fg_scrollx); + tilemap_set_scrolly(state->bg_tilemap, 0, ((state->highbits << 5) & 0x100) + state->bg_scrolly); + tilemap_set_scrollx(state->bg_tilemap, 0, ((state->highbits << 6) & 0x100) + state->bg_scrollx); + tilemap_set_scrolly(state->fg_tilemap, 0, ((state->highbits << 7) & 0x100) + state->fg_scrolly); + tilemap_set_scrollx(state->fg_tilemap, 0, ((state->highbits << 8) & 0x100) + state->fg_scrollx); } static TILE_GET_INFO( get_fg_tile_info ) { - int attr = airbustr_colorram2[tile_index]; - int code = airbustr_videoram2[tile_index] + ((attr & 0x0f) << 8); + airbustr_state *state = (airbustr_state *)machine->driver_data; + int attr = state->colorram2[tile_index]; + int code = state->videoram2[tile_index] + ((attr & 0x0f) << 8); int color = attr >> 4; SET_TILE_INFO(0, code, color, 0); @@ -106,8 +106,9 @@ static TILE_GET_INFO( get_fg_tile_info ) static TILE_GET_INFO( get_bg_tile_info ) { - int attr = machine->generic.colorram.u8[tile_index]; - int code = machine->generic.videoram.u8[tile_index] + ((attr & 0x0f) << 8); + airbustr_state *state = (airbustr_state *)machine->driver_data; + int attr = state->colorram[tile_index]; + int code = state->videoram[tile_index] + ((attr & 0x0f) << 8); int color = (attr >> 4) + 16; SET_TILE_INFO(0, code, color, 0); @@ -115,36 +116,41 @@ static TILE_GET_INFO( get_bg_tile_info ) VIDEO_START( airbustr ) { - bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); - fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); + airbustr_state *state = (airbustr_state *)machine->driver_data; - sprites_bitmap = video_screen_auto_bitmap_alloc(machine->primary_screen); - state_save_register_global_bitmap(machine, sprites_bitmap); - tilemap_set_transparent_pen(fg_tilemap, 0); + state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); + state->fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_scrolldx(bg_tilemap, 0x094, 0x06a); - tilemap_set_scrolldy(bg_tilemap, 0x100, 0x1ff); - tilemap_set_scrolldx(fg_tilemap, 0x094, 0x06a); - tilemap_set_scrolldy(fg_tilemap, 0x100, 0x1ff); + state->sprites_bitmap = video_screen_auto_bitmap_alloc(machine->primary_screen); + tilemap_set_transparent_pen(state->fg_tilemap, 0); + + tilemap_set_scrolldx(state->bg_tilemap, 0x094, 0x06a); + tilemap_set_scrolldy(state->bg_tilemap, 0x100, 0x1ff); + tilemap_set_scrolldx(state->fg_tilemap, 0x094, 0x06a); + tilemap_set_scrolldy(state->fg_tilemap, 0x100, 0x1ff); + + state_save_register_global_bitmap(machine, state->sprites_bitmap); } VIDEO_UPDATE( airbustr ) { - const device_config *pandora = devtag_get_device(screen->machine, "pandora"); - tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0); + airbustr_state *state = (airbustr_state *)screen->machine->driver_data; + + tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0); + tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 0); // copy the sprite bitmap to the screen - pandora_update(pandora, bitmap, cliprect); + pandora_update(state->pandora, bitmap, cliprect); return 0; } VIDEO_EOF( airbustr ) { - const device_config *pandora = devtag_get_device(machine, "pandora"); + airbustr_state *state = (airbustr_state *)machine->driver_data; + // update the sprite bitmap - pandora_eof(pandora); + pandora_eof(state->pandora); } diff --git a/src/mame/video/djboy.c b/src/mame/video/djboy.c index c0979dcae73..66bd77fea64 100644 --- a/src/mame/video/djboy.c +++ b/src/mame/video/djboy.c @@ -4,58 +4,58 @@ * video hardware for DJ Boy */ #include "driver.h" -#include "kan_pand.h" - -static UINT8 djboy_videoreg, djboy_scrollx, djboy_scrolly; -static tilemap *background; - -void djboy_set_videoreg( UINT8 data ) -{ - djboy_videoreg = data; -} +#include "video/kan_pand.h" +#include "includes/djboy.h" WRITE8_HANDLER( djboy_scrollx_w ) { - djboy_scrollx = data; + djboy_state *state = (djboy_state *)space->machine->driver_data; + state->scrollx = data; } WRITE8_HANDLER( djboy_scrolly_w ) { - djboy_scrolly = data; + djboy_state *state = (djboy_state *)space->machine->driver_data; + state->scrolly = data; } static TILE_GET_INFO( get_bg_tile_info ) { - UINT8 attr = machine->generic.videoram.u8[tile_index + 0x800]; - int code = machine->generic.videoram.u8[tile_index] + (attr&0xf)*256; - int color = attr>>4; - if( color&8 ) - { + djboy_state *state = (djboy_state *)machine->driver_data; + UINT8 attr = state->videoram[tile_index + 0x800]; + int code = state->videoram[tile_index] + (attr & 0xf) * 256; + int color = attr >> 4; + + if (color & 8) code |= 0x1000; - } + SET_TILE_INFO(1, code, color, 0); /* no flip */ } WRITE8_HANDLER( djboy_videoram_w ) { - space->machine->generic.videoram.u8[offset] = data; - tilemap_mark_tile_dirty( background, offset & 0x7ff); + djboy_state *state = (djboy_state *)space->machine->driver_data; + + state->videoram[offset] = data; + tilemap_mark_tile_dirty(state->background, offset & 0x7ff); } VIDEO_START( djboy ) { - background = tilemap_create(machine, get_bg_tile_info,tilemap_scan_rows,16,16,64,32); + djboy_state *state = (djboy_state *)machine->driver_data; + state->background = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 64, 32); } WRITE8_HANDLER( djboy_paletteram_w ) { + djboy_state *state = (djboy_state *)space->machine->driver_data; int val; - space->machine->generic.paletteram.u8[offset] = data; + state->paletteram[offset] = data; offset &= ~1; - val = (space->machine->generic.paletteram.u8[offset]<<8) | space->machine->generic.paletteram.u8[offset+1]; + val = (state->paletteram[offset] << 8) | state->paletteram[offset + 1]; - palette_set_color_rgb(space->machine,offset/2,pal4bit(val >> 8),pal4bit(val >> 4),pal4bit(val >> 0)); + palette_set_color_rgb(space->machine, offset / 2, pal4bit(val >> 8), pal4bit(val >> 4), pal4bit(val >> 0)); } VIDEO_UPDATE( djboy ) @@ -66,19 +66,23 @@ VIDEO_UPDATE( djboy ) * ---x---- flipscreen? * ----xxxx ROM bank */ - const device_config *pandora = devtag_get_device(screen->machine, "pandora"); + djboy_state *state = (djboy_state *)screen->machine->driver_data; int scroll; - scroll = djboy_scrollx | ((djboy_videoreg&0xc0)<<2); - tilemap_set_scrollx( background, 0, scroll-0x391 ); - scroll = djboy_scrolly | ((djboy_videoreg&0x20)<<3); - tilemap_set_scrolly( background, 0, scroll ); - tilemap_draw( bitmap, cliprect,background,0,0 ); - pandora_update(pandora, bitmap, cliprect); + + scroll = state->scrollx | ((state->videoreg & 0xc0) << 2); + tilemap_set_scrollx(state->background, 0, scroll - 0x391); + + scroll = state->scrolly | ((state->videoreg & 0x20) << 3); + tilemap_set_scrolly(state->background, 0, scroll); + + tilemap_draw(bitmap, cliprect, state->background, 0, 0); + pandora_update(state->pandora, bitmap, cliprect); + return 0; } VIDEO_EOF( djboy ) { - const device_config *pandora = devtag_get_device(machine, "pandora"); - pandora_eof(pandora); + djboy_state *state = (djboy_state *)machine->driver_data; + pandora_eof(state->pandora); }