diff --git a/src/mame/drivers/ohmygod.c b/src/mame/drivers/ohmygod.c index c2b00005395..324d433113c 100644 --- a/src/mame/drivers/ohmygod.c +++ b/src/mame/drivers/ohmygod.c @@ -14,58 +14,40 @@ Notes: #include "emu.h" #include "cpu/m68000/m68000.h" #include "sound/okim6295.h" +#include "includes/ohmygod.h" -extern UINT16 *ohmygod_videoram; - -WRITE16_HANDLER( ohmygod_videoram_w ); -WRITE16_HANDLER( ohmygod_spritebank_w ); -WRITE16_HANDLER( ohmygod_scrollx_w ); -WRITE16_HANDLER( ohmygod_scrolly_w ); -VIDEO_START( ohmygod ); -VIDEO_UPDATE( ohmygod ); - - -static int adpcm_bank_shift; -static int sndbank; - -static MACHINE_RESET( ohmygod ) -{ - UINT8 *rom = memory_region(machine, "oki"); - - sndbank = 0; - memcpy(rom + 0x20000,rom + 0x40000 + 0x20000 * sndbank,0x20000); -} - static WRITE16_HANDLER( ohmygod_ctrl_w ) { + ohmygod_state *state = (ohmygod_state *)space->machine->driver_data; + if (ACCESSING_BITS_0_7) { UINT8 *rom = memory_region(space->machine, "oki"); /* ADPCM bank switch */ - if (sndbank != ((data >> adpcm_bank_shift) & 0x0f)) + if (state->sndbank != ((data >> state->adpcm_bank_shift) & 0x0f)) { - sndbank = (data >> adpcm_bank_shift) & 0x0f; - memcpy(rom + 0x20000,rom + 0x40000 + 0x20000 * sndbank,0x20000); + state->sndbank = (data >> state->adpcm_bank_shift) & 0x0f; + memcpy(rom + 0x20000, rom + 0x40000 + 0x20000 * state->sndbank, 0x20000); } } if (ACCESSING_BITS_8_15) { - coin_counter_w(space->machine, 0,data & 0x1000); - coin_counter_w(space->machine, 1,data & 0x2000); + coin_counter_w(space->machine, 0, data & 0x1000); + coin_counter_w(space->machine, 1, data & 0x2000); } } static ADDRESS_MAP_START( ohmygod_map, ADDRESS_SPACE_PROGRAM, 16 ) AM_RANGE(0x000000, 0x07ffff) AM_ROM AM_RANGE(0x300000, 0x303fff) AM_RAM - AM_RANGE(0x304000, 0x307fff) AM_RAM_WRITE(ohmygod_videoram_w) AM_BASE(&ohmygod_videoram) + AM_RANGE(0x304000, 0x307fff) AM_RAM_WRITE(ohmygod_videoram_w) AM_BASE_MEMBER(ohmygod_state, videoram) AM_RANGE(0x308000, 0x30ffff) AM_RAM AM_RANGE(0x400000, 0x400001) AM_WRITE(ohmygod_scrollx_w) AM_RANGE(0x400002, 0x400003) AM_WRITE(ohmygod_scrolly_w) AM_RANGE(0x600000, 0x6007ff) AM_RAM_WRITE(paletteram16_xGGGGGRRRRRBBBBB_word_w) AM_BASE_GENERIC(paletteram) - AM_RANGE(0x700000, 0x703fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) + AM_RANGE(0x700000, 0x703fff) AM_RAM AM_BASE_SIZE_MEMBER(ohmygod_state, spriteram, spriteram_size) AM_RANGE(0x704000, 0x707fff) AM_RAM AM_RANGE(0x708000, 0x70ffff) AM_RAM /* Work RAM */ AM_RANGE(0x800000, 0x800001) AM_READ_PORT("P1") @@ -312,16 +294,44 @@ GFXDECODE_END +static MACHINE_START( ohmygod ) +{ + ohmygod_state *state = (ohmygod_state *)machine->driver_data; + + state_save_register_global(machine, state->spritebank); + state_save_register_global(machine, state->scrollx); + state_save_register_global(machine, state->scrolly); + state_save_register_global(machine, state->sndbank); +} + +static MACHINE_RESET( ohmygod ) +{ + ohmygod_state *state = (ohmygod_state *)machine->driver_data; + UINT8 *rom = memory_region(machine, "oki"); + + state->sndbank = 0; + memcpy(rom + 0x20000, rom + 0x40000 + 0x20000 * state->sndbank, 0x20000); + + state->spritebank = 0; + state->scrollx = 0; + state->scrolly = 0; +} + static MACHINE_DRIVER_START( ohmygod ) + /* driver data */ + MDRV_DRIVER_DATA(ohmygod_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 12000000) MDRV_CPU_PROGRAM_MAP(ohmygod_map) MDRV_CPU_VBLANK_INT("screen", irq1_line_hold) - MDRV_MACHINE_RESET(ohmygod) MDRV_WATCHDOG_TIME_INIT(SEC(3)) /* a guess, and certainly wrong */ + MDRV_MACHINE_START(ohmygod) + MDRV_MACHINE_RESET(ohmygod) + /* video hardware */ MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_REFRESH_RATE(60) @@ -387,14 +397,16 @@ ROM_END static DRIVER_INIT( ohmygod ) { - adpcm_bank_shift = 4; + ohmygod_state *state = (ohmygod_state *)machine->driver_data; + state->adpcm_bank_shift = 4; } static DRIVER_INIT( naname ) { - adpcm_bank_shift = 0; + ohmygod_state *state = (ohmygod_state *)machine->driver_data; + state->adpcm_bank_shift = 0; } -GAME( 1993, ohmygod, 0, ohmygod, ohmygod, ohmygod, ROT0, "Atlus", "Oh My God! (Japan)", GAME_NO_COCKTAIL ) -GAME( 1994, naname, 0, ohmygod, naname, naname, ROT0, "Atlus", "Naname de Magic! (Japan)", GAME_NO_COCKTAIL ) +GAME( 1993, ohmygod, 0, ohmygod, ohmygod, ohmygod, ROT0, "Atlus", "Oh My God! (Japan)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) +GAME( 1994, naname, 0, ohmygod, naname, naname, ROT0, "Atlus", "Naname de Magic! (Japan)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/ojankohs.c b/src/mame/drivers/ojankohs.c index 7183ace02d6..921c3035a55 100644 --- a/src/mame/drivers/ojankohs.c +++ b/src/mame/drivers/ojankohs.c @@ -20,8 +20,8 @@ Driver by Takahiro Nogi 2000/06/10 - Driver by Uki 2001/12/10 - -******************************************************************************/ -/****************************************************************************** +****************************************************************************** + Memo: - Sometimes RAM check in testmode fails (reason unknown). @@ -33,115 +33,90 @@ Memo: #include "emu.h" #include "cpu/z80/z80.h" +#include "includes/ojankohs.h" #include "sound/ay8910.h" #include "sound/msm5205.h" -VIDEO_UPDATE( ojankohs ); -PALETTE_INIT( ojankoy ); -VIDEO_START( ojankohs ); -VIDEO_START( ojankoy ); -WRITE8_HANDLER( ojankohs_palette_w ); -WRITE8_HANDLER( ccasino_palette_w ); -WRITE8_HANDLER( ojankohs_videoram_w ); -WRITE8_HANDLER( ojankohs_colorram_w ); -WRITE8_HANDLER( ojankohs_gfxreg_w ); -WRITE8_HANDLER( ojankohs_flipscreen_w ); -VIDEO_UPDATE( ojankoc ); -VIDEO_START( ojankoc ); -WRITE8_HANDLER( ojankoc_palette_w ); -WRITE8_HANDLER( ojankoc_videoram_w ); -void ojankoc_flipscreen(const address_space *space, int data); - - -static int ojankohs_portselect; -static int ojankohs_adpcm_reset; -static int ojankohs_adpcm_data; -static int ojankohs_vclk_left; - - -static MACHINE_RESET( ojankohs ) -{ - ojankohs_portselect = 0; - - ojankohs_adpcm_reset = 0; - ojankohs_adpcm_data = 0; - ojankohs_vclk_left = 0; -} - static WRITE8_HANDLER( ojankohs_rombank_w ) { - UINT8 *ROM = memory_region(space->machine, "maincpu"); - - memory_set_bankptr(space->machine, "bank1", &ROM[0x10000 + (0x4000 * (data & 0x3f))]); + memory_set_bank(space->machine, "bank1", data & 0x3f); } static WRITE8_HANDLER( ojankoy_rombank_w ) { - UINT8 *ROM = memory_region(space->machine, "maincpu"); + ojankohs_state *state = (ojankohs_state *)space->machine->driver_data; - memory_set_bankptr(space->machine, "bank1", &ROM[0x10000 + (0x4000 * (data & 0x1f))]); + memory_set_bank(space->machine, "bank1", data & 0x1f); - ojankohs_adpcm_reset = ((data & 0x20) >> 5); - if (!ojankohs_adpcm_reset) ojankohs_vclk_left = 0; + state->adpcm_reset = BIT(data, 5); + if (!state->adpcm_reset) + state->vclk_left = 0; - msm5205_reset_w(devtag_get_device(space->machine, "msm"), !ojankohs_adpcm_reset); + msm5205_reset_w(state->msm, !state->adpcm_reset); } static WRITE8_DEVICE_HANDLER( ojankohs_adpcm_reset_w ) { - ojankohs_adpcm_reset = (data & 0x01); - ojankohs_vclk_left = 0; + ojankohs_state *state = (ojankohs_state *)device->machine->driver_data; + state->adpcm_reset = BIT(data, 0); + state->vclk_left = 0; - msm5205_reset_w(device, !ojankohs_adpcm_reset); + msm5205_reset_w(device, !state->adpcm_reset); } static WRITE8_HANDLER( ojankohs_msm5205_w ) { - ojankohs_adpcm_data = data; - ojankohs_vclk_left = 2; + ojankohs_state *state = (ojankohs_state *)space->machine->driver_data; + state->adpcm_data = data; + state->vclk_left = 2; } -static void ojankohs_adpcm_int(running_device *device) +static void ojankohs_adpcm_int( running_device *device ) { + ojankohs_state *state = (ojankohs_state *)device->machine->driver_data; + /* skip if we're reset */ - if (!ojankohs_adpcm_reset) + if (!state->adpcm_reset) return; /* clock the data through */ - if (ojankohs_vclk_left) { - msm5205_data_w(device, (ojankohs_adpcm_data >> 4)); - ojankohs_adpcm_data <<= 4; - ojankohs_vclk_left--; + if (state->vclk_left) + { + msm5205_data_w(device, (state->adpcm_data >> 4)); + state->adpcm_data <<= 4; + state->vclk_left--; } /* generate an NMI if we're out of data */ - if (!ojankohs_vclk_left) - cputag_set_input_line(device->machine, "maincpu", INPUT_LINE_NMI, PULSE_LINE); + if (!state->vclk_left) + cpu_set_input_line(state->maincpu, INPUT_LINE_NMI, PULSE_LINE); } static WRITE8_HANDLER( ojankoc_ctrl_w ) { - UINT8 *BANKROM = memory_region(space->machine, "user1"); - UINT32 bank_address = (data & 0x0f) * 0x8000; + ojankohs_state *state = (ojankohs_state *)space->machine->driver_data; - memory_set_bankptr(space->machine, "bank1", &BANKROM[bank_address]); + memory_set_bank(space->machine, "bank1", data & 0x0f); - ojankohs_adpcm_reset = ((data & 0x10) >> 4); - msm5205_reset_w(devtag_get_device(space->machine, "msm"), (!(data & 0x10) >> 4)); + state->adpcm_reset = BIT(data, 4); + msm5205_reset_w(state->msm, !BIT(data, 4)); ojankoc_flipscreen(space, data); } static WRITE8_HANDLER( ojankohs_portselect_w ) { - ojankohs_portselect = data; + ojankohs_state *state = (ojankohs_state *)space->machine->driver_data; + state->portselect = data; } static READ8_HANDLER( ojankohs_keymatrix_r ) { + ojankohs_state *state = (ojankohs_state *)space->machine->driver_data; int ret; - switch (ojankohs_portselect) { + switch (state->portselect) + { case 0x01: ret = input_port_read(space->machine, "KEY0"); break; case 0x02: ret = input_port_read(space->machine, "KEY1"); break; case 0x04: ret = input_port_read(space->machine, "KEY2"); break; @@ -156,7 +131,7 @@ static READ8_HANDLER( ojankohs_keymatrix_r ) ret &= input_port_read(space->machine, "KEY4"); break; default: ret = 0xff; - logerror("PC:%04X unknown %02X\n", cpu_get_pc(space->cpu), ojankohs_portselect); + logerror("PC:%04X unknown %02X\n", cpu_get_pc(space->cpu), state->portselect); break; } @@ -165,6 +140,7 @@ static READ8_HANDLER( ojankohs_keymatrix_r ) static READ8_HANDLER( ojankoc_keymatrix_r ) { + ojankohs_state *state = (ojankohs_state *)space->machine->driver_data; int i; int ret = 0; static const char *const keynames[2][5] = @@ -173,8 +149,9 @@ static READ8_HANDLER( ojankoc_keymatrix_r ) { "KEY5", "KEY6", "KEY7", "KEY8", "KEY9" } }; - for (i = 0; i < 5; i++) { - if (~ojankohs_portselect & (1 << i)) + for (i = 0; i < 5; i++) + { + if (!BIT(state->portselect, i)) ret |= input_port_read(space->machine, keynames[offset][i]); } @@ -211,12 +188,12 @@ static READ8_HANDLER( ccasino_dipsw4_r ) static WRITE8_HANDLER( ojankoy_coinctr_w ) { - coin_counter_w( space->machine, 0, (data & 0x01)); + coin_counter_w(space->machine, 0, BIT(data, 0)); } static WRITE8_HANDLER( ccasino_coinctr_w ) { - coin_counter_w(space->machine, 0, (data & 0x02)); + coin_counter_w(space->machine, 0, BIT(data, 1)); } @@ -299,7 +276,7 @@ ADDRESS_MAP_END static INPUT_PORTS_START( mahjong_p1 ) - PORT_START("KEY0") /* PORT 1-0 */ + PORT_START("KEY0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_A ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_E ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_I ) @@ -309,7 +286,7 @@ static INPUT_PORTS_START( mahjong_p1 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("KEY1") /* PORT 1-1 */ + PORT_START("KEY1") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_B ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_F ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_J ) @@ -319,7 +296,7 @@ static INPUT_PORTS_START( mahjong_p1 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("KEY2") /* PORT 1-2 */ + PORT_START("KEY2") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_C ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_G ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_K ) @@ -329,7 +306,7 @@ static INPUT_PORTS_START( mahjong_p1 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("KEY3") /* PORT 1-3 */ + PORT_START("KEY3") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_D ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_H ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_L ) @@ -339,7 +316,7 @@ static INPUT_PORTS_START( mahjong_p1 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("KEY4") /* PORT 1-4 */ + PORT_START("KEY4") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_LAST_CHANCE ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_SCORE ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_DOUBLE_UP ) @@ -351,7 +328,7 @@ static INPUT_PORTS_START( mahjong_p1 ) INPUT_PORTS_END static INPUT_PORTS_START( ojankohs ) - PORT_START("IN0") /* TEST SW */ + PORT_START("IN0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE3 ) // MEMORY RESET PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE2 ) // ANALYZER @@ -361,7 +338,7 @@ static INPUT_PORTS_START( ojankohs ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("IN1") /* COIN SW */ + PORT_START("IN1") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -412,7 +389,7 @@ static INPUT_PORTS_START( ojankohs ) INPUT_PORTS_END static INPUT_PORTS_START( ojankoy ) - PORT_START("IN0") /* TEST SW */ + PORT_START("IN0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE3 ) // MEMORY RESET PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE2 ) // ANALYZER @@ -422,7 +399,7 @@ static INPUT_PORTS_START( ojankoy ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("IN1") /* COIN SW */ + PORT_START("IN1") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -483,7 +460,7 @@ static INPUT_PORTS_START( ojankoy ) INPUT_PORTS_END static INPUT_PORTS_START( ccasino ) - PORT_START("IN0") /* TEST SW */ + PORT_START("IN0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE3 ) // MEMORY RESET PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE2 ) // ANALYZER @@ -493,7 +470,7 @@ static INPUT_PORTS_START( ccasino ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("IN1") /* COIN SW */ + PORT_START("IN1") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -661,7 +638,7 @@ static INPUT_PORTS_START( ojankoc ) PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("KEY0") /* PORT 1-0 */ + PORT_START("KEY0") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_MAHJONG_A ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_MAHJONG_E ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_MAHJONG_I ) @@ -671,7 +648,7 @@ static INPUT_PORTS_START( ojankoc ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_START("KEY1") /* PORT 1-1 */ + PORT_START("KEY1") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_MAHJONG_B ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_MAHJONG_F ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_MAHJONG_J ) @@ -681,7 +658,7 @@ static INPUT_PORTS_START( ojankoc ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_START("KEY2") /* PORT 1-2 */ + PORT_START("KEY2") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_MAHJONG_C ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_MAHJONG_G ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_MAHJONG_K ) @@ -691,7 +668,7 @@ static INPUT_PORTS_START( ojankoc ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_START("KEY3") /* PORT 1-3 */ + PORT_START("KEY3") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_MAHJONG_D ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_MAHJONG_H ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_MAHJONG_L ) @@ -701,7 +678,7 @@ static INPUT_PORTS_START( ojankoc ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_START("KEY4") /* PORT 1-4 */ + PORT_START("KEY4") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_MAHJONG_LAST_CHANCE ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_MAHJONG_SCORE ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_MAHJONG_DOUBLE_UP ) @@ -711,7 +688,7 @@ static INPUT_PORTS_START( ojankoc ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_START("KEY5") /* PORT 2-0 */ + PORT_START("KEY5") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_MAHJONG_A ) PORT_PLAYER(2) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_MAHJONG_E ) PORT_PLAYER(2) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_MAHJONG_I ) PORT_PLAYER(2) @@ -720,7 +697,7 @@ static INPUT_PORTS_START( ojankoc ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START2 ) PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_START("KEY6") /* PORT 2-1 */ + PORT_START("KEY6") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_MAHJONG_B ) PORT_PLAYER(2) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_MAHJONG_F ) PORT_PLAYER(2) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_MAHJONG_J ) PORT_PLAYER(2) @@ -729,7 +706,7 @@ static INPUT_PORTS_START( ojankoc ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_MAHJONG_BET ) PORT_PLAYER(2) PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_START("KEY7") /* PORT 2-2 */ + PORT_START("KEY7") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_MAHJONG_C ) PORT_PLAYER(2) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_MAHJONG_G ) PORT_PLAYER(2) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_MAHJONG_K ) PORT_PLAYER(2) @@ -738,7 +715,7 @@ static INPUT_PORTS_START( ojankoc ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_START("KEY8") /* PORT 2-3 */ + PORT_START("KEY8") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_MAHJONG_D ) PORT_PLAYER(2) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_MAHJONG_H ) PORT_PLAYER(2) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_MAHJONG_L ) PORT_PLAYER(2) @@ -747,7 +724,7 @@ static INPUT_PORTS_START( ojankoc ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_START("KEY9") /* PORT 2-4 */ + PORT_START("KEY9") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_MAHJONG_LAST_CHANCE ) PORT_PLAYER(2) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_MAHJONG_SCORE ) PORT_PLAYER(2) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_MAHJONG_DOUBLE_UP ) PORT_PLAYER(2) @@ -815,14 +792,82 @@ static const msm5205_interface msm5205_config = }; +static MACHINE_START( common ) +{ + ojankohs_state *state = (ojankohs_state *)machine->driver_data; + + state->maincpu = devtag_get_device(machine, "maincpu"); + state->msm = devtag_get_device(machine, "msm"); + + state_save_register_global(machine, state->gfxreg); + state_save_register_global(machine, state->flipscreen); + state_save_register_global(machine, state->flipscreen_old); + state_save_register_global(machine, state->scrollx); + state_save_register_global(machine, state->scrolly); + state_save_register_global(machine, state->screen_refresh); + state_save_register_global(machine, state->portselect); + state_save_register_global(machine, state->adpcm_reset); + state_save_register_global(machine, state->adpcm_data); + state_save_register_global(machine, state->vclk_left); +} + +static MACHINE_START( ojankohs ) +{ + UINT8 *ROM = memory_region(machine, "maincpu"); + + memory_configure_bank(machine, "bank1", 0, 0x40, &ROM[0x10000], 0x4000); + + MACHINE_START_CALL(common); +} + +static MACHINE_START( ojankoy ) +{ + UINT8 *ROM = memory_region(machine, "maincpu"); + + memory_configure_bank(machine, "bank1", 0, 0x20, &ROM[0x10000], 0x4000); + + MACHINE_START_CALL(common); +} + +static MACHINE_START( ojankoc ) +{ + UINT8 *ROM = memory_region(machine, "user1"); + + memory_configure_bank(machine, "bank1", 0, 0x10, &ROM[0x0000], 0x8000); + + MACHINE_START_CALL(common); +} + +static MACHINE_RESET( ojankohs ) +{ + ojankohs_state *state = (ojankohs_state *)machine->driver_data; + + state->portselect = 0; + + state->adpcm_reset = 0; + state->adpcm_data = 0; + state->vclk_left = 0; + + state->gfxreg = 0; + state->flipscreen = 0; + state->flipscreen_old = 0; + state->scrollx = 0; + state->scrolly = 0; + state->screen_refresh = 0; +} + static MACHINE_DRIVER_START( ojankohs ) + /* driver data */ + MDRV_DRIVER_DATA(ojankohs_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", Z80,12000000/2) /* 6.00 MHz ? */ MDRV_CPU_PROGRAM_MAP(ojankohs_map) MDRV_CPU_IO_MAP(ojankohs_io_map) MDRV_CPU_VBLANK_INT("screen", irq0_line_hold) + MDRV_MACHINE_START(ojankohs) MDRV_MACHINE_RESET(ojankohs) MDRV_NVRAM_HANDLER(generic_0fill) @@ -854,12 +899,16 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( ojankoy ) + /* driver data */ + MDRV_DRIVER_DATA(ojankohs_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", Z80,12000000/2) /* 6.00 MHz ? */ MDRV_CPU_PROGRAM_MAP(ojankoy_map) MDRV_CPU_IO_MAP(ojankoy_io_map) MDRV_CPU_VBLANK_INT("screen", irq0_line_hold) + MDRV_MACHINE_START(ojankoy) MDRV_MACHINE_RESET(ojankohs) MDRV_NVRAM_HANDLER(generic_0fill) @@ -892,12 +941,16 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( ccasino ) + /* driver data */ + MDRV_DRIVER_DATA(ojankohs_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", Z80,12000000/2) /* 6.00 MHz ? */ MDRV_CPU_PROGRAM_MAP(ojankoy_map) MDRV_CPU_IO_MAP(ccasino_io_map) MDRV_CPU_VBLANK_INT("screen", irq0_line_hold) + MDRV_MACHINE_START(ojankohs) MDRV_MACHINE_RESET(ojankohs) MDRV_NVRAM_HANDLER(generic_0fill) @@ -929,12 +982,16 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( ojankoc ) + /* driver data */ + MDRV_DRIVER_DATA(ojankohs_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", Z80,8000000/2) /* 4.00 MHz */ MDRV_CPU_PROGRAM_MAP(ojankoc_map) MDRV_CPU_IO_MAP(ojankoc_io_map) MDRV_CPU_VBLANK_INT("screen", irq0_line_hold) + MDRV_MACHINE_START(ojankoc) MDRV_MACHINE_RESET(ojankohs) MDRV_NVRAM_HANDLER(generic_0fill) @@ -1056,8 +1113,8 @@ ROM_START( ojankoc ) ROM_END -GAME( 1986, ojankoc, 0, ojankoc, ojankoc, 0, ROT0, "V-System Co.", "Ojanko Club (Japan)", 0 ) -GAME( 1986, ojankoy, 0, ojankoy, ojankoy, 0, ROT0, "V-System Co.", "Ojanko Yakata (Japan)", 0 ) -GAME( 1987, ojanko2, 0, ojankoy, ojankoy, 0, ROT0, "V-System Co.", "Ojanko Yakata 2bankan (Japan)", 0 ) -GAME( 1987, ccasino, 0, ccasino, ccasino, 0, ROT0, "V-System Co.", "Chinese Casino [BET] (Japan)", 0 ) -GAME( 1988, ojankohs, 0, ojankohs, ojankohs, 0, ROT0, "V-System Co.", "Ojanko High School (Japan)", 0 ) +GAME( 1986, ojankoc, 0, ojankoc, ojankoc, 0, ROT0, "V-System Co.", "Ojanko Club (Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1986, ojankoy, 0, ojankoy, ojankoy, 0, ROT0, "V-System Co.", "Ojanko Yakata (Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1987, ojanko2, 0, ojankoy, ojankoy, 0, ROT0, "V-System Co.", "Ojanko Yakata 2bankan (Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1987, ccasino, 0, ccasino, ccasino, 0, ROT0, "V-System Co.", "Chinese Casino [BET] (Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1988, ojankohs, 0, ojankohs, ojankohs, 0, ROT0, "V-System Co.", "Ojanko High School (Japan)", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/olibochu.c b/src/mame/drivers/olibochu.c index 7dc8f195960..e65e31086f8 100644 --- a/src/mame/drivers/olibochu.c +++ b/src/mame/drivers/olibochu.c @@ -56,9 +56,30 @@ $7004 writes, related to $7000 reads #include "deprecat.h" #include "sound/ay8910.h" -static UINT8 *videoram; -static UINT8 *colorram; -static tilemap_t *bg_tilemap; +class olibochu_state +{ +public: + static void *alloc(running_machine &machine) { return auto_alloc_clear(&machine, olibochu_state(machine)); } + + olibochu_state(running_machine &machine) { } + + /* memory pointers */ + UINT8 * videoram; + UINT8 * colorram; + UINT8 * spriteram; + UINT8 * spriteram2; +// UINT8 * paletteram; // currently this uses generic palette handling + size_t spriteram_size; + size_t spriteram2_size; + + /* video-related */ + tilemap_t *bg_tilemap; + + /* misc */ + int cmd; +}; + + static PALETTE_INIT( olibochu ) { @@ -77,20 +98,20 @@ static PALETTE_INIT( olibochu ) pen = (color_prom[0x120 + (i - 0x100)] & 0x0f) | 0x00; /* red component */ - bit0 = (color_prom[pen] >> 0) & 0x01; - bit1 = (color_prom[pen] >> 1) & 0x01; - bit2 = (color_prom[pen] >> 2) & 0x01; + bit0 = BIT(color_prom[pen], 0); + bit1 = BIT(color_prom[pen], 1); + bit2 = BIT(color_prom[pen], 2); r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; /* green component */ - bit0 = (color_prom[pen] >> 3) & 0x01; - bit1 = (color_prom[pen] >> 4) & 0x01; - bit2 = (color_prom[pen] >> 5) & 0x01; + bit0 = BIT(color_prom[pen], 3); + bit1 = BIT(color_prom[pen], 4); + bit2 = BIT(color_prom[pen], 5); g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; /* blue component */ - bit0 = (color_prom[pen] >> 6) & 0x01; - bit1 = (color_prom[pen] >> 7) & 0x01; + bit0 = BIT(color_prom[pen], 6); + bit1 = BIT(color_prom[pen], 7); b = 0x4f * bit0 + 0xa8 * bit1; palette_set_color(machine, i, MAKE_RGB(r, g, b)); @@ -99,14 +120,16 @@ static PALETTE_INIT( olibochu ) static WRITE8_HANDLER( olibochu_videoram_w ) { - videoram[offset] = data; - tilemap_mark_tile_dirty(bg_tilemap, offset); + olibochu_state *state = (olibochu_state *)space->machine->driver_data; + state->videoram[offset] = data; + tilemap_mark_tile_dirty(state->bg_tilemap, offset); } static WRITE8_HANDLER( olibochu_colorram_w ) { - colorram[offset] = data; - tilemap_mark_tile_dirty(bg_tilemap, offset); + olibochu_state *state = (olibochu_state *)space->machine->driver_data; + state->colorram[offset] = data; + tilemap_mark_tile_dirty(state->bg_tilemap, offset); } static WRITE8_HANDLER( olibochu_flipscreen_w ) @@ -122,8 +145,9 @@ static WRITE8_HANDLER( olibochu_flipscreen_w ) static TILE_GET_INFO( get_bg_tile_info ) { - int attr = colorram[tile_index]; - int code = videoram[tile_index] + ((attr & 0x20) << 3); + olibochu_state *state = (olibochu_state *)machine->driver_data; + int attr = state->colorram[tile_index]; + int code = state->videoram[tile_index] + ((attr & 0x20) << 3); int color = (attr & 0x1f) + 0x20; int flags = ((attr & 0x40) ? TILE_FLIPX : 0) | ((attr & 0x80) ? TILE_FLIPY : 0); @@ -132,27 +156,27 @@ static TILE_GET_INFO( get_bg_tile_info ) static VIDEO_START( olibochu ) { - bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, - 8, 8, 32, 32); + olibochu_state *state = (olibochu_state *)machine->driver_data; + state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect ) { - UINT8 *spriteram = machine->generic.spriteram.u8; - UINT8 *spriteram_2 = machine->generic.spriteram2.u8; + olibochu_state *state = (olibochu_state *)machine->driver_data; + UINT8 *spriteram = state->spriteram; + UINT8 *spriteram_2 = state->spriteram2; int offs; /* 16x16 sprites */ - - for (offs = 0;offs < machine->generic.spriteram_size;offs += 4) + for (offs = 0; offs < state->spriteram_size; offs += 4) { - int attr = spriteram[offs+1]; + int attr = spriteram[offs + 1]; int code = spriteram[offs]; int color = attr & 0x3f; int flipx = attr & 0x40; int flipy = attr & 0x80; - int sx = spriteram[offs+3]; - int sy = ((spriteram[offs+2] + 8) & 0xff) - 8; + int sx = spriteram[offs + 3]; + int sy = ((spriteram[offs + 2] + 8) & 0xff) - 8; if (flip_screen_get(machine)) { @@ -170,16 +194,15 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta } /* 8x8 sprites */ - - for (offs = 0;offs < machine->generic.spriteram2_size;offs += 4) + for (offs = 0; offs < state->spriteram2_size; offs += 4) { - int attr = spriteram_2[offs+1]; + int attr = spriteram_2[offs + 1]; int code = spriteram_2[offs]; int color = attr & 0x3f; int flipx = attr & 0x40; int flipy = attr & 0x80; - int sx = spriteram_2[offs+3]; - int sy = spriteram_2[offs+2]; + int sx = spriteram_2[offs + 3]; + int sy = spriteram_2[offs + 2]; if (flip_screen_get(machine)) { @@ -199,7 +222,8 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta static VIDEO_UPDATE( olibochu ) { - tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); + olibochu_state *state = (olibochu_state *)screen->machine->driver_data; + tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0); draw_sprites(screen->machine, bitmap, cliprect); return 0; } @@ -207,23 +231,25 @@ static VIDEO_UPDATE( olibochu ) static WRITE8_HANDLER( sound_command_w ) { - static int cmd; + olibochu_state *state = (olibochu_state *)space->machine->driver_data; int c; - if (offset == 0) cmd = (cmd & 0x00ff) | (data << 8); - else cmd = (cmd & 0xff00) | data; + if (offset == 0) + state->cmd = (state->cmd & 0x00ff) | (data << 8); + else + state->cmd = (state->cmd & 0xff00) | data; - for (c = 15;c >= 0;c--) - if (cmd & (1 << c)) break; + for (c = 15; c >= 0; c--) + if (state->cmd & (1 << c)) break; - if (c >= 0) soundlatch_w(space,0,15-c); + if (c >= 0) soundlatch_w(space, 0, 15 - c); } static ADDRESS_MAP_START( olibochu_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM - AM_RANGE(0x8000, 0x83ff) AM_RAM_WRITE(olibochu_videoram_w) AM_BASE(&videoram) - AM_RANGE(0x8400, 0x87ff) AM_RAM_WRITE(olibochu_colorram_w) AM_BASE(&colorram) + AM_RANGE(0x8000, 0x83ff) AM_RAM_WRITE(olibochu_videoram_w) AM_BASE_MEMBER(olibochu_state, videoram) + AM_RANGE(0x8400, 0x87ff) AM_RAM_WRITE(olibochu_colorram_w) AM_BASE_MEMBER(olibochu_state, colorram) AM_RANGE(0x9000, 0x903f) AM_RAM //??? AM_RANGE(0x9800, 0x983f) AM_RAM //??? AM_RANGE(0xa000, 0xa000) AM_READ_PORT("IN0") @@ -234,8 +260,8 @@ static ADDRESS_MAP_START( olibochu_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0xa005, 0xa005) AM_READ_PORT("DSW2") AM_RANGE(0xa800, 0xa801) AM_WRITE(sound_command_w) AM_RANGE(0xa802, 0xa802) AM_WRITE(olibochu_flipscreen_w) /* bit 6 = enable sound? */ - AM_RANGE(0xf400, 0xf41f) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) - AM_RANGE(0xf440, 0xf47f) AM_RAM AM_BASE_SIZE_GENERIC(spriteram2) + AM_RANGE(0xf400, 0xf41f) AM_RAM AM_BASE_SIZE_MEMBER(olibochu_state, spriteram, spriteram_size) + AM_RANGE(0xf440, 0xf47f) AM_RAM AM_BASE_SIZE_MEMBER(olibochu_state, spriteram2, spriteram2_size) AM_RANGE(0xf000, 0xffff) AM_RAM ADDRESS_MAP_END @@ -397,8 +423,25 @@ static INTERRUPT_GEN( olibochu_interrupt ) cpu_set_input_line_and_vector(device, 0, HOLD_LINE, 0xd7); /* RST 10h */ } +static MACHINE_START( olibochu ) +{ + olibochu_state *state = (olibochu_state *)machine->driver_data; + + state_save_register_global(machine, state->cmd); +} + +static MACHINE_RESET( olibochu ) +{ + olibochu_state *state = (olibochu_state *)machine->driver_data; + + state->cmd = 0; +} + static MACHINE_DRIVER_START( olibochu ) + /* driver data */ + MDRV_DRIVER_DATA(olibochu_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", Z80, 4000000) /* 4 MHz ?? */ MDRV_CPU_PROGRAM_MAP(olibochu_map) @@ -410,6 +453,9 @@ static MACHINE_DRIVER_START( olibochu ) // MDRV_QUANTUM_PERFECT_CPU("maincpu") + MDRV_MACHINE_START(olibochu) + MDRV_MACHINE_RESET(olibochu) + /* video hardware */ MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_REFRESH_RATE(60) @@ -477,4 +523,4 @@ ROM_END -GAME( 1981, olibochu, 0, olibochu, olibochu, 0, ROT270, "Irem + GDI", "Oli-Boo-Chu", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1981, olibochu, 0, olibochu, olibochu, 0, ROT270, "Irem + GDI", "Oli-Boo-Chu", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/video/ohmygod.c b/src/mame/video/ohmygod.c index c154a0ad56e..343c03957d5 100644 --- a/src/mame/video/ohmygod.c +++ b/src/mame/video/ohmygod.c @@ -1,12 +1,5 @@ #include "emu.h" - - -UINT16 *ohmygod_videoram; - -static int spritebank; -static tilemap_t *bg_tilemap; - - +#include "includes/ohmygod.h" /*************************************************************************** @@ -16,8 +9,9 @@ static tilemap_t *bg_tilemap; static TILE_GET_INFO( get_tile_info ) { - UINT16 code = ohmygod_videoram[2*tile_index+1]; - UINT16 attr = ohmygod_videoram[2*tile_index]; + ohmygod_state *state = (ohmygod_state *)machine->driver_data; + UINT16 code = state->videoram[2 * tile_index + 1]; + UINT16 attr = state->videoram[2 * tile_index]; SET_TILE_INFO( 0, code, @@ -35,7 +29,8 @@ static TILE_GET_INFO( get_tile_info ) VIDEO_START( ohmygod ) { - bg_tilemap = tilemap_create(machine, get_tile_info,tilemap_scan_rows,8,8,64,64); + ohmygod_state *state = (ohmygod_state *)machine->driver_data; + state->bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 64, 64); } @@ -48,28 +43,30 @@ VIDEO_START( ohmygod ) WRITE16_HANDLER( ohmygod_videoram_w ) { - COMBINE_DATA(&ohmygod_videoram[offset]); - tilemap_mark_tile_dirty(bg_tilemap,offset/2); + ohmygod_state *state = (ohmygod_state *)space->machine->driver_data; + COMBINE_DATA(&state->videoram[offset]); + tilemap_mark_tile_dirty(state->bg_tilemap, offset / 2); } WRITE16_HANDLER( ohmygod_spritebank_w ) { + ohmygod_state *state = (ohmygod_state *)space->machine->driver_data; if (ACCESSING_BITS_8_15) - spritebank = data & 0x8000; + state->spritebank = data & 0x8000; } WRITE16_HANDLER( ohmygod_scrollx_w ) { - static UINT16 scroll; - COMBINE_DATA(&scroll); - tilemap_set_scrollx(bg_tilemap,0,scroll - 0x81ec); + ohmygod_state *state = (ohmygod_state *)space->machine->driver_data; + COMBINE_DATA(&state->scrollx); + tilemap_set_scrollx(state->bg_tilemap, 0, state->scrollx - 0x81ec); } WRITE16_HANDLER( ohmygod_scrolly_w ) { - static UINT16 scroll; - COMBINE_DATA(&scroll); - tilemap_set_scrolly(bg_tilemap,0,scroll - 0x81ef); + ohmygod_state *state = (ohmygod_state *)space->machine->driver_data; + COMBINE_DATA(&state->scrolly); + tilemap_set_scrolly(state->bg_tilemap, 0, state->scrolly - 0x81ef); } @@ -79,24 +76,26 @@ WRITE16_HANDLER( ohmygod_scrolly_w ) ***************************************************************************/ -static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect ) { - UINT16 *spriteram16 = machine->generic.spriteram.u16; + ohmygod_state *state = (ohmygod_state *)machine->driver_data; + UINT16 *spriteram = state->spriteram; int offs; - for (offs = 0;offs < machine->generic.spriteram_size/4;offs += 4) + for (offs = 0; offs < state->spriteram_size / 4; offs += 4) { - int sx,sy,code,color,flipx; + int sx, sy, code, color, flipx; UINT16 *sr; - sr = spritebank ? (spriteram16+machine->generic.spriteram_size/4) : spriteram16; + sr = state->spritebank ? (spriteram + state->spriteram_size / 4) : spriteram; - code = sr[offs+3] & 0x0fff; - color = sr[offs+2] & 0x000f; - sx = sr[offs+0] - 29; - sy = sr[offs+1]; - if (sy >= 32768) sy -= 65536; - flipx = sr[offs+3] & 0x8000; + code = sr[offs + 3] & 0x0fff; + color = sr[offs + 2] & 0x000f; + sx = sr[offs + 0] - 29; + sy = sr[offs + 1]; + if (sy >= 32768) + sy -= 65536; + flipx = sr[offs + 3] & 0x8000; drawgfx_transpen(bitmap,cliprect,machine->gfx[1], code, @@ -108,7 +107,9 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan VIDEO_UPDATE( ohmygod ) { - tilemap_draw(bitmap,cliprect,bg_tilemap,0,0); - draw_sprites(screen->machine,bitmap,cliprect); + ohmygod_state *state = (ohmygod_state *)screen->machine->driver_data; + + tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0); + draw_sprites(screen->machine, bitmap, cliprect); return 0; } diff --git a/src/mame/video/ojankohs.c b/src/mame/video/ojankohs.c index e3d05e6126c..455312aac02 100644 --- a/src/mame/video/ojankohs.c +++ b/src/mame/video/ojankohs.c @@ -9,20 +9,7 @@ #include "emu.h" #include "cpu/z80/z80.h" - - -static UINT8 *ojankohs_videoram; -static UINT8 *ojankohs_colorram; -static UINT8 *ojankohs_paletteram; -static int ojankohs_gfxreg; -static int ojankohs_flipscreen; -static int ojankohs_scrollx, ojankohs_scrolly; -static tilemap_t *ojankohs_tilemap; -static int ojankoc_screen_refresh; -static bitmap_t *ojankoc_tmpbitmap; - -WRITE8_HANDLER( ojankoc_videoram_w ); - +#include "includes/ojankohs.h" /****************************************************************************** @@ -35,24 +22,25 @@ PALETTE_INIT( ojankoy ) int i; int bit0, bit1, bit2, bit3, bit4, r, g, b; - for (i = 0; i < machine->config->total_colors; i++) { - bit0 = (color_prom[0] >> 2) & 0x01; - bit1 = (color_prom[0] >> 3) & 0x01; - bit2 = (color_prom[0] >> 4) & 0x01; - bit3 = (color_prom[0] >> 5) & 0x01; - bit4 = (color_prom[0] >> 6) & 0x01; + for (i = 0; i < machine->config->total_colors; i++) + { + bit0 = BIT(color_prom[0], 2); + bit1 = BIT(color_prom[0], 3); + bit2 = BIT(color_prom[0], 4); + bit3 = BIT(color_prom[0], 5); + bit4 = BIT(color_prom[0], 6); r = 0x08 * bit0 + 0x11 * bit1 + 0x21 * bit2 + 0x43 * bit3 + 0x82 * bit4; - bit0 = (color_prom[machine->config->total_colors] >> 5) & 0x01; - bit1 = (color_prom[machine->config->total_colors] >> 6) & 0x01; - bit2 = (color_prom[machine->config->total_colors] >> 7) & 0x01; - bit3 = (color_prom[0] >> 0) & 0x01; - bit4 = (color_prom[0] >> 1) & 0x01; + bit0 = BIT(color_prom[machine->config->total_colors], 5); + bit1 = BIT(color_prom[machine->config->total_colors], 6); + bit2 = BIT(color_prom[machine->config->total_colors], 7); + bit3 = BIT(color_prom[0], 0); + bit4 = BIT(color_prom[0], 1); g = 0x08 * bit0 + 0x11 * bit1 + 0x21 * bit2 + 0x43 * bit3 + 0x82 * bit4; - bit0 = (color_prom[machine->config->total_colors] >> 0) & 0x01; - bit1 = (color_prom[machine->config->total_colors] >> 1) & 0x01; - bit2 = (color_prom[machine->config->total_colors] >> 2) & 0x01; - bit3 = (color_prom[machine->config->total_colors] >> 3) & 0x01; - bit4 = (color_prom[machine->config->total_colors] >> 4) & 0x01; + bit0 = BIT(color_prom[machine->config->total_colors], 0); + bit1 = BIT(color_prom[machine->config->total_colors], 1); + bit2 = BIT(color_prom[machine->config->total_colors], 2); + bit3 = BIT(color_prom[machine->config->total_colors], 3); + bit4 = BIT(color_prom[machine->config->total_colors], 4); b = 0x08 * bit0 + 0x11 * bit1 + 0x21 * bit2 + 0x43 * bit3 + 0x82 * bit4; palette_set_color(machine, i, MAKE_RGB(r, g, b)); @@ -62,55 +50,57 @@ PALETTE_INIT( ojankoy ) WRITE8_HANDLER( ojankohs_palette_w ) { + ojankohs_state *state = (ojankohs_state *)space->machine->driver_data; int r, g, b; - ojankohs_paletteram[offset] = data; + state->paletteram[offset] = data; offset &= 0x7fe; - r = (ojankohs_paletteram[offset + 0] & 0x7c) >> 2; - g = ((ojankohs_paletteram[offset + 0] & 0x03) << 3) | - ((ojankohs_paletteram[offset + 1] & 0xe0) >> 5); - b = (ojankohs_paletteram[offset + 1] & 0x1f) >> 0; + r = (state->paletteram[offset + 0] & 0x7c) >> 2; + g = ((state->paletteram[offset + 0] & 0x03) << 3) | ((state->paletteram[offset + 1] & 0xe0) >> 5); + b = (state->paletteram[offset + 1] & 0x1f) >> 0; - palette_set_color_rgb(space->machine,offset >> 1, pal5bit(r), pal5bit(g), pal5bit(b)); + palette_set_color_rgb(space->machine, offset >> 1, pal5bit(r), pal5bit(g), pal5bit(b)); } WRITE8_HANDLER( ccasino_palette_w ) { + ojankohs_state *state = (ojankohs_state *)space->machine->driver_data; int r, g, b; /* get top 8 bits of the I/O port address */ offset = (offset << 8) | (cpu_get_reg(space->cpu, Z80_BC) >> 8); - ojankohs_paletteram[offset] = data; + state->paletteram[offset] = data; offset &= 0x7fe; - r = (ojankohs_paletteram[offset + 0] & 0x7c) >> 2; - g = ((ojankohs_paletteram[offset + 0] & 0x03) << 3) | - ((ojankohs_paletteram[offset + 1] & 0xe0) >> 5); - b = (ojankohs_paletteram[offset + 1] & 0x1f) >> 0; + r = (state->paletteram[offset + 0] & 0x7c) >> 2; + g = ((state->paletteram[offset + 0] & 0x03) << 3) | ((state->paletteram[offset + 1] & 0xe0) >> 5); + b = (state->paletteram[offset + 1] & 0x1f) >> 0; - palette_set_color_rgb(space->machine,offset >> 1, pal5bit(r), pal5bit(g), pal5bit(b)); + palette_set_color_rgb(space->machine, offset >> 1, pal5bit(r), pal5bit(g), pal5bit(b)); } WRITE8_HANDLER( ojankoc_palette_w ) { + ojankohs_state *state = (ojankohs_state *)space->machine->driver_data; int r, g, b, color; - if (ojankohs_paletteram[offset] == data) return; + if (state->paletteram[offset] == data) + return; - ojankohs_paletteram[offset] = data; - ojankoc_screen_refresh = 1; + state->paletteram[offset] = data; + state->screen_refresh = 1; - color = (ojankohs_paletteram[offset & 0x1e] << 8) | ojankohs_paletteram[offset | 0x01]; + color = (state->paletteram[offset & 0x1e] << 8) | state->paletteram[offset | 0x01]; r = (color >> 10) & 0x1f; g = (color >> 5) & 0x1f; b = (color >> 0) & 0x1f; - palette_set_color_rgb(space->machine,offset >> 1, pal5bit(r), pal5bit(g), pal5bit(b)); + palette_set_color_rgb(space->machine, offset >> 1, pal5bit(r), pal5bit(g), pal5bit(b)); } @@ -122,53 +112,63 @@ WRITE8_HANDLER( ojankoc_palette_w ) WRITE8_HANDLER( ojankohs_videoram_w ) { - ojankohs_videoram[offset] = data; - tilemap_mark_tile_dirty(ojankohs_tilemap, offset); + ojankohs_state *state = (ojankohs_state *)space->machine->driver_data; + state->videoram[offset] = data; + tilemap_mark_tile_dirty(state->tilemap, offset); } WRITE8_HANDLER( ojankohs_colorram_w ) { - ojankohs_colorram[offset] = data; - tilemap_mark_tile_dirty(ojankohs_tilemap, offset); + ojankohs_state *state = (ojankohs_state *)space->machine->driver_data; + state->colorram[offset] = data; + tilemap_mark_tile_dirty(state->tilemap, offset); } WRITE8_HANDLER( ojankohs_gfxreg_w ) { - if (ojankohs_gfxreg != data) { - ojankohs_gfxreg = data; - tilemap_mark_all_tiles_dirty(ojankohs_tilemap); + ojankohs_state *state = (ojankohs_state *)space->machine->driver_data; + + if (state->gfxreg != data) + { + state->gfxreg = data; + tilemap_mark_all_tiles_dirty(state->tilemap); } } WRITE8_HANDLER( ojankohs_flipscreen_w ) { - if (ojankohs_flipscreen != (data & 0x01)) { + ojankohs_state *state = (ojankohs_state *)space->machine->driver_data; - ojankohs_flipscreen = data & 0x01; + if (state->flipscreen != BIT(data, 0)) + { - tilemap_set_flip_all(space->machine, ojankohs_flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); + state->flipscreen = BIT(data, 0); - if (ojankohs_flipscreen) { - ojankohs_scrollx = -0xe0; - ojankohs_scrolly = -0x20; + tilemap_set_flip_all(space->machine, state->flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); + + if (state->flipscreen) + { + state->scrollx = -0xe0; + state->scrolly = -0x20; } - else { - ojankohs_scrollx = 0; - ojankohs_scrolly = 0; + else + { + state->scrollx = 0; + state->scrolly = 0; } } } static TILE_GET_INFO( ojankohs_get_tile_info ) { - int tile, color; + ojankohs_state *state = (ojankohs_state *)machine->driver_data; + int tile = state->videoram[tile_index] | ((state->colorram[tile_index] & 0x0f) << 8); + int color = (state->colorram[tile_index] & 0xe0) >> 5; - tile = ojankohs_videoram[tile_index] | ((ojankohs_colorram[tile_index] & 0x0f) << 8); - color = (ojankohs_colorram[tile_index] & 0xe0) >> 5; - - if (ojankohs_colorram[tile_index] & 0x10) { - tile |= (ojankohs_gfxreg & 0x07) << 12; - color |= (ojankohs_gfxreg & 0xe0) >> 2; + if (state->colorram[tile_index] & 0x10) + { + tile |= (state->gfxreg & 0x07) << 12; + color |= (state->gfxreg & 0xe0) >> 2; } SET_TILE_INFO(0, tile, color, 0); @@ -176,12 +176,11 @@ static TILE_GET_INFO( ojankohs_get_tile_info ) static TILE_GET_INFO( ojankoy_get_tile_info ) { - int tile, color, flipx, flipy; - - tile = ojankohs_videoram[tile_index] | (ojankohs_videoram[tile_index + 0x1000] << 8); - color = ojankohs_colorram[tile_index] & 0x3f; - flipx = ((ojankohs_colorram[tile_index] & 0x40) >> 6) ? TILEMAP_FLIPX : 0; - flipy = ((ojankohs_colorram[tile_index] & 0x80) >> 7) ? TILEMAP_FLIPY : 0; + ojankohs_state *state = (ojankohs_state *)machine->driver_data; + int tile = state->videoram[tile_index] | (state->videoram[tile_index + 0x1000] << 8); + int color = state->colorram[tile_index] & 0x3f; + int flipx = ((state->colorram[tile_index] & 0x40) >> 6) ? TILEMAP_FLIPX : 0; + int flipy = ((state->colorram[tile_index] & 0x80) >> 7) ? TILEMAP_FLIPY : 0; SET_TILE_INFO(0, tile, color, (flipx | flipy)); } @@ -193,61 +192,67 @@ static TILE_GET_INFO( ojankoy_get_tile_info ) ******************************************************************************/ -void ojankoc_flipscreen(const address_space *space, int data) +void ojankoc_flipscreen( const address_space *space, int data ) { - static int ojankoc_flipscreen_old = 0; + ojankohs_state *state = (ojankohs_state *)space->machine->driver_data; int x, y; UINT8 color1, color2; - ojankohs_flipscreen = (data & 0x80) >> 7; + state->flipscreen = BIT(data, 7); - if (ojankohs_flipscreen == ojankoc_flipscreen_old) return; + if (state->flipscreen == state->flipscreen_old) + return; - for (y = 0; y < 0x40; y++) { - for (x = 0; x < 0x100; x++) { - color1 = ojankohs_videoram[0x0000 + ((y * 256) + x)]; - color2 = ojankohs_videoram[0x3fff - ((y * 256) + x)]; + for (y = 0; y < 0x40; y++) + { + for (x = 0; x < 0x100; x++) + { + color1 = state->videoram[0x0000 + ((y * 256) + x)]; + color2 = state->videoram[0x3fff - ((y * 256) + x)]; ojankoc_videoram_w(space, 0x0000 + ((y * 256) + x), color2); ojankoc_videoram_w(space, 0x3fff - ((y * 256) + x), color1); - color1 = ojankohs_videoram[0x4000 + ((y * 256) + x)]; - color2 = ojankohs_videoram[0x7fff - ((y * 256) + x)]; + color1 = state->videoram[0x4000 + ((y * 256) + x)]; + color2 = state->videoram[0x7fff - ((y * 256) + x)]; ojankoc_videoram_w(space, 0x4000 + ((y * 256) + x), color2); ojankoc_videoram_w(space, 0x7fff - ((y * 256) + x), color1); } } - ojankoc_flipscreen_old = ojankohs_flipscreen; + state->flipscreen_old = state->flipscreen; } WRITE8_HANDLER( ojankoc_videoram_w ) { + ojankohs_state *state = (ojankohs_state *)space->machine->driver_data; int i; UINT8 x, y, xx, px, py ; UINT8 color, color1, color2; - ojankohs_videoram[offset] = data; + state->videoram[offset] = data; - color1 = ojankohs_videoram[offset & 0x3fff]; - color2 = ojankohs_videoram[offset | 0x4000]; + color1 = state->videoram[offset & 0x3fff]; + color2 = state->videoram[offset | 0x4000]; y = offset >> 6; x = (offset & 0x3f) << 2; xx = 0; - if (ojankohs_flipscreen) { + if (state->flipscreen) + { x = 0xfc - x; y = 0xff - y; xx = 3; } - for (i = 0; i < 4; i++) { + for (i = 0; i < 4; i++) + { color = ((color1 & 0x01) >> 0) | ((color1 & 0x10) >> 3) | ((color2 & 0x01) << 2) | ((color2 & 0x10) >> 1); px = x + (i ^ xx); py = y; - *BITMAP_ADDR16(ojankoc_tmpbitmap, py, px) = color; + *BITMAP_ADDR16(state->tmpbitmap, py, px) = color; color1 >>= 1; color2 >>= 1; @@ -263,25 +268,43 @@ WRITE8_HANDLER( ojankoc_videoram_w ) VIDEO_START( ojankohs ) { - ojankohs_tilemap = tilemap_create(machine, ojankohs_get_tile_info, tilemap_scan_rows, 8, 4, 64, 64); - ojankohs_videoram = auto_alloc_array(machine, UINT8, 0x2000); - ojankohs_colorram = auto_alloc_array(machine, UINT8, 0x1000); - ojankohs_paletteram = auto_alloc_array(machine, UINT8, 0x800); + ojankohs_state *state = (ojankohs_state *)machine->driver_data; + + state->tilemap = tilemap_create(machine, ojankohs_get_tile_info, tilemap_scan_rows, 8, 4, 64, 64); + state->videoram = auto_alloc_array(machine, UINT8, 0x2000); + state->colorram = auto_alloc_array(machine, UINT8, 0x1000); + state->paletteram = auto_alloc_array(machine, UINT8, 0x800); + + state_save_register_global_pointer(machine, state->videoram, 0x2000); + state_save_register_global_pointer(machine, state->colorram, 0x1000); + state_save_register_global_pointer(machine, state->paletteram, 0x800); } VIDEO_START( ojankoy ) { - ojankohs_tilemap = tilemap_create(machine, ojankoy_get_tile_info, tilemap_scan_rows, 8, 4, 64, 64); - ojankohs_videoram = auto_alloc_array(machine, UINT8, 0x2000); - ojankohs_colorram = auto_alloc_array(machine, UINT8, 0x1000); - ojankohs_paletteram = auto_alloc_array(machine, UINT8, 0x800); + ojankohs_state *state = (ojankohs_state *)machine->driver_data; + + state->tilemap = tilemap_create(machine, ojankoy_get_tile_info, tilemap_scan_rows, 8, 4, 64, 64); + state->videoram = auto_alloc_array(machine, UINT8, 0x2000); + state->colorram = auto_alloc_array(machine, UINT8, 0x1000); + state->paletteram = auto_alloc_array(machine, UINT8, 0x800); + + state_save_register_global_pointer(machine, state->videoram, 0x2000); + state_save_register_global_pointer(machine, state->colorram, 0x1000); + state_save_register_global_pointer(machine, state->paletteram, 0x800); } VIDEO_START( ojankoc ) { - ojankoc_tmpbitmap = video_screen_auto_bitmap_alloc(machine->primary_screen); - ojankohs_videoram = auto_alloc_array(machine, UINT8, 0x8000); - ojankohs_paletteram = auto_alloc_array(machine, UINT8, 0x20); + ojankohs_state *state = (ojankohs_state *)machine->driver_data; + + state->tmpbitmap = video_screen_auto_bitmap_alloc(machine->primary_screen); + state->videoram = auto_alloc_array(machine, UINT8, 0x8000); + state->paletteram = auto_alloc_array(machine, UINT8, 0x20); + + state_save_register_global_pointer(machine, state->videoram, 0x8000); + state_save_register_global_pointer(machine, state->paletteram, 0x20); + state_save_register_global_bitmap(machine, state->tmpbitmap); } @@ -293,28 +316,32 @@ VIDEO_START( ojankoc ) VIDEO_UPDATE( ojankohs ) { - tilemap_set_scrollx(ojankohs_tilemap, 0, ojankohs_scrollx); - tilemap_set_scrolly(ojankohs_tilemap, 0, ojankohs_scrolly); + ojankohs_state *state = (ojankohs_state *)screen->machine->driver_data; - tilemap_draw(bitmap, cliprect, ojankohs_tilemap, 0, 0); + tilemap_set_scrollx(state->tilemap, 0, state->scrollx); + tilemap_set_scrolly(state->tilemap, 0, state->scrolly); + + tilemap_draw(bitmap, cliprect, state->tilemap, 0, 0); return 0; } VIDEO_UPDATE( ojankoc ) { + ojankohs_state *state = (ojankohs_state *)screen->machine->driver_data; int offs; - if (ojankoc_screen_refresh) + if (state->screen_refresh) { const address_space *space = cputag_get_address_space(screen->machine, "maincpu", ADDRESS_SPACE_PROGRAM); /* redraw bitmap */ - for (offs = 0; offs < 0x8000; offs++) { - ojankoc_videoram_w(space, offs, ojankohs_videoram[offs]); + for (offs = 0; offs < 0x8000; offs++) + { + ojankoc_videoram_w(space, offs, state->videoram[offs]); } - ojankoc_screen_refresh = 0; + state->screen_refresh = 0; } - copybitmap(bitmap, ojankoc_tmpbitmap, 0, 0, 0, 0, cliprect); + copybitmap(bitmap, state->tmpbitmap, 0, 0, 0, 0, cliprect); return 0; }