diff --git a/src/mame/drivers/airbustr.c b/src/mame/drivers/airbustr.c index d91ccc388e0..d68ad6b2cf6 100644 --- a/src/mame/drivers/airbustr.c +++ b/src/mame/drivers/airbustr.c @@ -299,12 +299,13 @@ static WRITE8_HANDLER( master_bankswitch_w ) static WRITE8_HANDLER( slave_bankswitch_w ) { + const device_config *pandora = devtag_get_device(space->machine, "pandora"); airbustr_bankswitch(space->machine, "slave", "bank2", data); flip_screen_set(space->machine, data & 0x10); // used at the end of levels, after defeating the boss, to leave trails - pandora_set_clear_bitmap(data&0x20); + pandora_set_clear_bitmap(pandora, data&0x20); } static WRITE8_HANDLER( sound_bankswitch_w ) @@ -370,7 +371,7 @@ static WRITE8_HANDLER( airbustr_coin_counter_w ) 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_READWRITE(pandora_spriteram_r, pandora_spriteram_w) + 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(0xf000, 0xffff) AM_RAM AM_SHARE("share1") @@ -609,6 +610,13 @@ static MACHINE_RESET( airbustr ) /* Machine Driver */ +static const kaneko_pandora_interface airbustr_pandora_config = +{ + "screen", /* screen tag */ + 1, /* gfx_region */ + 0, 0 /* x_offs, y_offs */ +}; + static MACHINE_DRIVER_START( airbustr ) // basic machine hardware MDRV_CPU_ADD("master", Z80, 6000000) // ??? @@ -628,12 +636,11 @@ static MACHINE_DRIVER_START( airbustr ) MDRV_QUANTUM_TIME(HZ(6000)) // Palette RAM is filled by sub cpu with data supplied by main cpu // Maybe a high value is safer in order to avoid glitches - MDRV_MACHINE_START(airbustr) + MDRV_MACHINE_START(airbustr) MDRV_MACHINE_RESET(airbustr) MDRV_WATCHDOG_TIME_INIT(SEC(3)) /* a guess, and certainly wrong */ // video hardware - MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) @@ -643,6 +650,8 @@ static MACHINE_DRIVER_START( airbustr ) MDRV_GFXDECODE(airbustr) MDRV_PALETTE_LENGTH(768) + MDRV_KANEKO_PANDORA_ADD("pandora", airbustr_pandora_config) + MDRV_VIDEO_START(airbustr) MDRV_VIDEO_UPDATE(airbustr) MDRV_VIDEO_EOF(airbustr) diff --git a/src/mame/drivers/djboy.c b/src/mame/drivers/djboy.c index f0ab73c25b4..fc1c1de4949 100644 --- a/src/mame/drivers/djboy.c +++ b/src/mame/drivers/djboy.c @@ -743,7 +743,7 @@ static WRITE8_HANDLER( cpu2_bankswitch_w ) static ADDRESS_MAP_START( cpu0_am, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0xafff) AM_ROMBANK("bank4") - AM_RANGE(0xb000, 0xbfff) AM_READWRITE( pandora_spriteram_r, pandora_spriteram_w ) + AM_RANGE(0xb000, 0xbfff) AM_DEVREADWRITE("pandora", pandora_spriteram_r, pandora_spriteram_w) AM_RANGE(0xc000, 0xdfff) AM_ROMBANK("bank1") AM_RANGE(0xe000, 0xefff) AM_RAM AM_SHARE("share1") AM_RANGE(0xf000, 0xf7ff) AM_RAM @@ -907,6 +907,13 @@ static INTERRUPT_GEN( djboy_interrupt ) cpu_set_input_line_and_vector(device, 0, HOLD_LINE, addr); } +static const kaneko_pandora_interface djboy_pandora_config = +{ + "screen", /* screen tag */ + 0, /* gfx_region */ + 0, 0 /* x_offs, y_offs */ +}; + static MACHINE_DRIVER_START( djboy ) MDRV_CPU_ADD("maincpu", Z80,6000000) MDRV_CPU_PROGRAM_MAP(cpu0_am) @@ -935,6 +942,8 @@ static MACHINE_DRIVER_START( djboy ) MDRV_GFXDECODE(djboy) MDRV_PALETTE_LENGTH(0x200) + MDRV_KANEKO_PANDORA_ADD("pandora", djboy_pandora_config) + MDRV_VIDEO_START(djboy) MDRV_VIDEO_UPDATE(djboy) MDRV_VIDEO_EOF(djboy) diff --git a/src/mame/drivers/galpanic.c b/src/mame/drivers/galpanic.c index 05456a86071..4dcd9deebb6 100644 --- a/src/mame/drivers/galpanic.c +++ b/src/mame/drivers/galpanic.c @@ -137,7 +137,8 @@ VIDEO_UPDATE( comad ); static VIDEO_EOF( galpanic ) { - pandora_eof(machine); + const device_config *pandora = devtag_get_device(machine, "pandora"); + pandora_eof(pandora); } static INTERRUPT_GEN( galpanic_interrupt ) @@ -162,6 +163,8 @@ static INTERRUPT_GEN( galhustl_interrupt ) static WRITE16_HANDLER( galpanic_6295_bankswitch_w ) { + const device_config *pandora = devtag_get_device(space->machine, "pandora"); + if (ACCESSING_BITS_8_15) { UINT8 *rom = memory_region(space->machine, "oki"); @@ -169,7 +172,7 @@ static WRITE16_HANDLER( galpanic_6295_bankswitch_w ) memcpy(&rom[0x30000],&rom[0x40000 + ((data >> 8) & 0x0f) * 0x10000],0x10000); // used before title screen - pandora_set_clear_bitmap((data & 0x8000)>>15); + pandora_set_clear_bitmap(pandora, (data & 0x8000)>>15); } } @@ -186,9 +189,11 @@ static WRITE16_HANDLER( galpania_6295_bankswitch_w ) #ifdef UNUSED_FUNCTION static WRITE16_HANDLER( galpania_misc_w ) { + const device_config *pandora = devtag_get_device(machine, "pandora"); + if (ACCESSING_BITS_0_7) { - pandora_set_clear_bitmap( data & 0x0004 ); + pandora_set_clear_bitmap(pandora, data & 0x0004); } // other bits unknown ! @@ -223,7 +228,7 @@ static ADDRESS_MAP_START( galpanic_map, ADDRESS_SPACE_PROGRAM, 16 ) AM_RANGE(0x500000, 0x51ffff) AM_RAM AM_BASE(&galpanic_fgvideoram) AM_SIZE(&galpanic_fgvideoram_size) AM_RANGE(0x520000, 0x53ffff) AM_RAM_WRITE(galpanic_bgvideoram_w) AM_BASE(&galpanic_bgvideoram) /* + work RAM */ AM_RANGE(0x600000, 0x6007ff) AM_RAM_WRITE(galpanic_paletteram_w) AM_BASE_GENERIC(paletteram) /* 1024 colors, but only 512 seem to be used */ - AM_RANGE(0x700000, 0x701fff) AM_READWRITE(pandora_spriteram_LSB_r, pandora_spriteram_LSB_w) + AM_RANGE(0x700000, 0x701fff) AM_DEVREADWRITE("pandora", pandora_spriteram_LSB_r, pandora_spriteram_LSB_w) AM_RANGE(0x702000, 0x704fff) AM_RAM AM_RANGE(0x800000, 0x800001) AM_READ_PORT("DSW1_P1") AM_RANGE(0x800002, 0x800003) AM_READ_PORT("DSW2_P2") @@ -868,6 +873,13 @@ static GFXDECODE_START( galpanic ) GFXDECODE_END +static const kaneko_pandora_interface galpanic_pandora_config = +{ + "screen", /* screen tag */ + 0, /* gfx_region */ + 0, -16 /* x_offs, y_offs */ +}; + static MACHINE_DRIVER_START( galpanic ) @@ -887,6 +899,8 @@ static MACHINE_DRIVER_START( galpanic ) MDRV_GFXDECODE(galpanic) MDRV_PALETTE_LENGTH(1024 + 32768) + MDRV_KANEKO_PANDORA_ADD("pandora", galpanic_pandora_config) + MDRV_PALETTE_INIT(galpanic) MDRV_VIDEO_START(galpanic) MDRV_VIDEO_UPDATE(galpanic) @@ -917,6 +931,8 @@ static MACHINE_DRIVER_START( comad ) MDRV_CPU_REPLACE("maincpu", M68000, 10000000) MDRV_CPU_PROGRAM_MAP(comad_map) + MDRV_DEVICE_REMOVE("pandora") + /* video hardware */ MDRV_VIDEO_UPDATE(comad) MDRV_VIDEO_EOF(0) diff --git a/src/mame/drivers/hvyunit.c b/src/mame/drivers/hvyunit.c index 1efc7b13daa..12708777d32 100644 --- a/src/mame/drivers/hvyunit.c +++ b/src/mame/drivers/hvyunit.c @@ -286,7 +286,6 @@ static TILE_GET_INFO( get_bg_tile_info ) static VIDEO_START(hvyunit) { bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); - pandora_start(machine,0,0,0); } #define SX_POS 152 @@ -294,7 +293,7 @@ static VIDEO_START(hvyunit) static VIDEO_UPDATE(hvyunit) { - + const device_config *pandora = devtag_get_device(screen->machine, "pandora"); tilemap_set_scrollx( bg_tilemap,0, ((port0_data&0x40)<<2)+ hu_scrollx + SX_POS); //TODO tilemap_set_scrolly( bg_tilemap,0, ((port0_data&0x80)<<1)+ hu_scrolly + SY_POS); // TODO @@ -302,13 +301,14 @@ static VIDEO_UPDATE(hvyunit) bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine)); tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); - pandora_update(screen->machine,bitmap,cliprect); + pandora_update(pandora, bitmap, cliprect); return 0; } static VIDEO_EOF(hvyunit) { - pandora_eof(machine); + const device_config *pandora = devtag_get_device(machine, "pandora"); + pandora_eof(pandora); } static WRITE8_HANDLER( trigger_nmi_on_sound_cpu2 ) @@ -349,7 +349,7 @@ static WRITE8_HANDLER( hu_colorram_w ) static ADDRESS_MAP_START( master_memory, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") - AM_RANGE(0xc000, 0xcfff) AM_READWRITE( pandora_spriteram_r, pandora_spriteram_w ) + 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_SHARE("share1") AM_RANGE(0xf000, 0xffff) AM_RAM @@ -630,6 +630,13 @@ static INTERRUPT_GEN( hvyunit_interrupt ) cpu_set_input_line_and_vector(device, 0, HOLD_LINE, addr); } +static const kaneko_pandora_interface hvyunit_pandora_config = +{ + "screen", /* screen tag */ + 0, /* gfx_region */ + 0, 0 /* x_offs, y_offs */ +}; + static MACHINE_DRIVER_START( hvyunit ) @@ -661,6 +668,8 @@ static MACHINE_DRIVER_START( hvyunit ) MDRV_GFXDECODE(hvyunit) MDRV_PALETTE_LENGTH(0x800) + MDRV_KANEKO_PANDORA_ADD("pandora", hvyunit_pandora_config) + MDRV_VIDEO_START(hvyunit) MDRV_VIDEO_UPDATE(hvyunit) MDRV_VIDEO_EOF(hvyunit) diff --git a/src/mame/drivers/sandscrp.c b/src/mame/drivers/sandscrp.c index ef2b5d79096..23502d41ca9 100644 --- a/src/mame/drivers/sandscrp.c +++ b/src/mame/drivers/sandscrp.c @@ -122,9 +122,10 @@ static INTERRUPT_GEN( sandscrp_interrupt ) static VIDEO_EOF( sandscrp ) { + const device_config *pandora = devtag_get_device(machine, "pandora"); sprite_irq = 1; update_irq_state(machine); - pandora_eof(machine); + pandora_eof(pandora); } /* Reads the cause of the interrupt */ @@ -213,7 +214,7 @@ static ADDRESS_MAP_START( sandscrp, ADDRESS_SPACE_PROGRAM, 16 ) AM_RANGE(0x401000, 0x401fff) AM_RAM_WRITE(kaneko16_vram_0_w) AM_BASE(&kaneko16_vram_0) // AM_RANGE(0x402000, 0x402fff) AM_RAM AM_BASE(&kaneko16_vscroll_1) // AM_RANGE(0x403000, 0x403fff) AM_RAM AM_BASE(&kaneko16_vscroll_0) // - AM_RANGE(0x500000, 0x501fff) AM_READWRITE(pandora_spriteram_LSB_r, pandora_spriteram_LSB_w ) // sprites + AM_RANGE(0x500000, 0x501fff) AM_DEVREADWRITE("pandora", pandora_spriteram_LSB_r, pandora_spriteram_LSB_w ) // sprites AM_RANGE(0x600000, 0x600fff) AM_RAM_WRITE(paletteram16_xGGGGGRRRRRBBBBB_word_w) AM_BASE_GENERIC(paletteram) // Palette AM_RANGE(0xa00000, 0xa00001) AM_WRITE(sandscrp_coin_counter_w) // Coin Counters (Lockout unused) AM_RANGE(0xb00000, 0xb00001) AM_READ_PORT("P1") @@ -431,6 +432,13 @@ static const ym2203_interface ym2203_intf_sandscrp = }; +static const kaneko_pandora_interface sandscrp_pandora_config = +{ + "screen", /* screen tag */ + 0, /* gfx_region */ + 0, 0 /* x_offs, y_offs */ +}; + static MACHINE_DRIVER_START( sandscrp ) /* basic machine hardware */ @@ -457,6 +465,8 @@ static MACHINE_DRIVER_START( sandscrp ) MDRV_GFXDECODE(sandscrp) MDRV_PALETTE_LENGTH(2048) + MDRV_KANEKO_PANDORA_ADD("pandora", sandscrp_pandora_config) + MDRV_VIDEO_START(sandscrp_1xVIEW2) MDRV_VIDEO_EOF(sandscrp) MDRV_VIDEO_UPDATE(sandscrp) diff --git a/src/mame/drivers/snowbros.c b/src/mame/drivers/snowbros.c index 015f7acfeb4..99db9869702 100644 --- a/src/mame/drivers/snowbros.c +++ b/src/mame/drivers/snowbros.c @@ -82,21 +82,19 @@ static WRITE16_HANDLER( snowbros_flipscreen_w ) static VIDEO_UPDATE( snowbros ) { + const device_config *pandora = devtag_get_device(screen->machine, "pandora"); + /* This clears & redraws the entire screen each pass */ bitmap_fill(bitmap,cliprect,0xf0); - pandora_update(screen->machine,bitmap,cliprect); + pandora_update(pandora, bitmap, cliprect); return 0; } -static VIDEO_START( snowbros ) -{ - pandora_start(machine,0,0,0); -} - static VIDEO_EOF( snowbros ) { - pandora_eof(machine); + const device_config *pandora = devtag_get_device(machine, "pandora"); + pandora_eof(pandora); } @@ -185,7 +183,7 @@ static ADDRESS_MAP_START( snowbros_map, ADDRESS_SPACE_PROGRAM, 16 ) AM_RANGE(0x500002, 0x500003) AM_READ_PORT("DSW2") AM_RANGE(0x500004, 0x500005) AM_READ_PORT("SYSTEM") AM_RANGE(0x600000, 0x6001ff) AM_RAM_WRITE(paletteram16_xBBBBBGGGGGRRRRR_word_w) AM_BASE_GENERIC(paletteram) - AM_RANGE(0x700000, 0x701fff) AM_READWRITE(pandora_spriteram_LSB_r,pandora_spriteram_LSB_w) + AM_RANGE(0x700000, 0x701fff) AM_DEVREADWRITE("pandora", pandora_spriteram_LSB_r, pandora_spriteram_LSB_w) AM_RANGE(0x800000, 0x800001) AM_WRITE(snowbros_irq4_ack_w) /* IRQ 4 acknowledge */ AM_RANGE(0x900000, 0x900001) AM_WRITE(snowbros_irq3_ack_w) /* IRQ 3 acknowledge */ AM_RANGE(0xa00000, 0xa00001) AM_WRITE(snowbros_irq2_ack_w) /* IRQ 2 acknowledge */ @@ -366,7 +364,7 @@ static ADDRESS_MAP_START( hyperpac_map, ADDRESS_SPACE_PROGRAM, 16 ) AM_RANGE(0x500004, 0x500005) AM_READ_PORT("SYSTEM") AM_RANGE(0x600000, 0x6001ff) AM_RAM_WRITE(paletteram16_xBBBBBGGGGGRRRRR_word_w) AM_BASE_GENERIC(paletteram) - AM_RANGE(0x700000, 0x701fff) AM_READWRITE(pandora_spriteram_LSB_r,pandora_spriteram_LSB_w) + AM_RANGE(0x700000, 0x701fff) AM_DEVREADWRITE("pandora", pandora_spriteram_LSB_r,pandora_spriteram_LSB_w) AM_RANGE(0x800000, 0x800001) AM_WRITE(snowbros_irq4_ack_w) /* IRQ 4 acknowledge */ AM_RANGE(0x900000, 0x900001) AM_WRITE(snowbros_irq3_ack_w) /* IRQ 3 acknowledge */ AM_RANGE(0xa00000, 0xa00001) AM_WRITE(snowbros_irq2_ack_w) /* IRQ 2 acknowledge */ @@ -517,7 +515,7 @@ static ADDRESS_MAP_START( finalttr_map, ADDRESS_SPACE_PROGRAM, 16 ) AM_RANGE(0x500004, 0x500005) AM_READ_PORT("SYSTEM") AM_RANGE(0x600000, 0x6001ff) AM_RAM_WRITE(paletteram16_xBBBBBGGGGGRRRRR_word_w) AM_BASE_GENERIC(paletteram) - AM_RANGE(0x700000, 0x701fff) AM_READWRITE(pandora_spriteram_LSB_r,pandora_spriteram_LSB_w) + AM_RANGE(0x700000, 0x701fff) AM_DEVREADWRITE("pandora", pandora_spriteram_LSB_r, pandora_spriteram_LSB_w) AM_RANGE(0x800000, 0x800001) AM_WRITE(snowbros_irq4_ack_w) /* IRQ 4 acknowledge */ AM_RANGE(0x900000, 0x900001) AM_WRITE(snowbros_irq3_ack_w) /* IRQ 3 acknowledge */ AM_RANGE(0xa00000, 0xa00001) AM_WRITE(snowbros_irq2_ack_w) /* IRQ 2 acknowledge */ @@ -1514,6 +1512,13 @@ static MACHINE_RESET (finalttr) hyperpac_ram[0x2000/2 + i] = PROTDATA[i]; } +static const kaneko_pandora_interface snowbros_pandora_config = +{ + "screen", /* screen tag */ + 0, /* gfx_region */ + 0, 0 /* x_offs, y_offs */ +}; + static MACHINE_DRIVER_START( snowbros ) /* basic machine hardware */ @@ -1536,10 +1541,11 @@ static MACHINE_DRIVER_START( snowbros ) MDRV_GFXDECODE(snowbros) MDRV_PALETTE_LENGTH(256) - MDRV_VIDEO_START(snowbros) MDRV_VIDEO_UPDATE(snowbros) MDRV_VIDEO_EOF(snowbros) + MDRV_KANEKO_PANDORA_ADD("pandora", snowbros_pandora_config) + /* sound hardware */ MDRV_SPEAKER_STANDARD_MONO("mono") @@ -1555,6 +1561,8 @@ static MACHINE_DRIVER_START( wintbob ) MDRV_CPU_REPLACE("maincpu", M68000, 10000000) /* 10mhz - Confirmed */ MDRV_CPU_PROGRAM_MAP(wintbob_map) + MDRV_DEVICE_REMOVE("pandora") + /* video hardware */ MDRV_GFXDECODE(wb) MDRV_VIDEO_UPDATE(wintbob) diff --git a/src/mame/video/airbustr.c b/src/mame/video/airbustr.c index f5ec77765f3..19da28cd0b5 100644 --- a/src/mame/video/airbustr.c +++ b/src/mame/video/airbustr.c @@ -119,9 +119,8 @@ VIDEO_START( airbustr ) fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); sprites_bitmap = video_screen_auto_bitmap_alloc(machine->primary_screen); - state_save_register_global_bitmap(machine, sprites_bitmap); + state_save_register_global_bitmap(machine, sprites_bitmap); tilemap_set_transparent_pen(fg_tilemap, 0); - pandora_start(machine,1,0,0); tilemap_set_scrolldx(bg_tilemap, 0x094, 0x06a); tilemap_set_scrolldy(bg_tilemap, 0x100, 0x1ff); @@ -132,18 +131,20 @@ VIDEO_START( airbustr ) 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); // copy the sprite bitmap to the screen - pandora_update(screen->machine, bitmap, cliprect); + pandora_update(pandora, bitmap, cliprect); return 0; } VIDEO_EOF( airbustr ) { + const device_config *pandora = devtag_get_device(machine, "pandora"); // update the sprite bitmap - pandora_eof(machine); + pandora_eof(pandora); } diff --git a/src/mame/video/djboy.c b/src/mame/video/djboy.c index 7c289533645..c0979dcae73 100644 --- a/src/mame/video/djboy.c +++ b/src/mame/video/djboy.c @@ -45,7 +45,6 @@ WRITE8_HANDLER( djboy_videoram_w ) VIDEO_START( djboy ) { background = tilemap_create(machine, get_bg_tile_info,tilemap_scan_rows,16,16,64,32); - pandora_start(machine,0,0,0); } WRITE8_HANDLER( djboy_paletteram_w ) @@ -67,17 +66,19 @@ VIDEO_UPDATE( djboy ) * ---x---- flipscreen? * ----xxxx ROM bank */ + const device_config *pandora = devtag_get_device(screen->machine, "pandora"); 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(screen->machine,bitmap,cliprect); + pandora_update(pandora, bitmap, cliprect); return 0; } VIDEO_EOF( djboy ) { - pandora_eof(machine); + const device_config *pandora = devtag_get_device(machine, "pandora"); + pandora_eof(pandora); } diff --git a/src/mame/video/galpanic.c b/src/mame/video/galpanic.c index cac510121e3..da2dae7b923 100644 --- a/src/mame/video/galpanic.c +++ b/src/mame/video/galpanic.c @@ -10,8 +10,6 @@ VIDEO_START( galpanic ) { machine->generic.tmpbitmap = video_screen_auto_bitmap_alloc(machine->primary_screen); sprites_bitmap = video_screen_auto_bitmap_alloc(machine->primary_screen); - - pandora_start(machine,0,0, -16); } PALETTE_INIT( galpanic ) @@ -103,12 +101,14 @@ static void draw_fgbitmap(bitmap_t *bitmap, const rectangle *cliprect) VIDEO_UPDATE( galpanic ) { + const device_config *pandora = devtag_get_device(screen->machine, "pandora"); + /* copy the temporary bitmap to the screen */ copybitmap(bitmap,screen->machine->generic.tmpbitmap,0,0,0,0,cliprect); draw_fgbitmap(bitmap, cliprect); - pandora_update(screen->machine,bitmap,cliprect); + pandora_update(pandora, bitmap, cliprect); return 0; } diff --git a/src/mame/video/kan_pand.c b/src/mame/video/kan_pand.c index ec12393b087..54e25ea5ce7 100644 --- a/src/mame/video/kan_pand.c +++ b/src/mame/video/kan_pand.c @@ -1,79 +1,114 @@ -/* kan_pand.c Kaneko Pandora Sprite Chip - GFX processor - PX79C480FP-3 (KANEKO, Pandora-Chip) +/*********************************************************************** - This emulates the Kaneko Pandora Sprite Chip - which is found on several Kaneko boards. + Kaneko Pandora Sprite Chip + GFX processor - PX79C480FP-3 (KANEKO, Pandora-Chip) - there several bootleg variants of this chip, - these are emulated in kan_panb.c instead. + This emulates the Kaneko Pandora Sprite Chip + which is found on several Kaneko boards. - Original Games using this Chip + there several bootleg variants of this chip, + these are emulated in kan_panb.c instead. - Snow Bros - Air Buster - DJ Boy - Heavy Unit - Sand Scorpian - Gals Panic (1st release) + Original Games using this Chip - The SemiCom games are also using this because - their bootleg chip appears to function in an - identical way. + Snow Bros + Air Buster + DJ Boy + Heavy Unit + Sand Scorpion + Gals Panic (1st release) - Rendering appears to be done to a framebuffer - and the video system can be instructed not to - clear this, allowing for 'sprite trail' effects - as used by Air Buster. + The SemiCom games are also using this because + their bootleg chip appears to function in an + identical way. - The chip appears to be an 8-bit chip, and - when used on 16-bit CPUs only the MSB or LSB - of the data lines are connected. Address Lines - also appear to be swapped around on one of the - hookups. + Rendering appears to be done to a framebuffer + and the video system can be instructed not to + clear this, allowing for 'sprite trail' effects + as used by Air Buster. - to use this in a driver you must hook functions to - VIDEO_START (allocates ram used by chip) - VIDEO_UPDATE (copies framebuffer to screen) - and - VIDEO_EOF (renders the sprites to the framebuffer) + The chip appears to be an 8-bit chip, and + when used on 16-bit CPUs only the MSB or LSB + of the data lines are connected. Address Lines + also appear to be swapped around on one of the + hookups. - spriteram should be accessed only with the - pandora_spriteram_r / pandora_spriteram_w or - pandora_spriteram_LSB_r / pandora_spriteram_LSB_w - handlers, depending on the CPU being used with it. + to use this in a driver you must hook functions to + VIDEO_UPDATE (copies framebuffer to screen) + and + VIDEO_EOF (renders the sprites to the framebuffer) -*/ + also, you have to add the correspondent device in MACHINE_DRIVER + + spriteram should be accessed only with the + pandora_spriteram_r / pandora_spriteram_w or + pandora_spriteram_LSB_r / pandora_spriteram_LSB_w + handlers, depending on the CPU being used with it. + +***********************************************************************/ #include "driver.h" -#include "kan_pand.h" +#include "video/kan_pand.h" -static UINT8* pandora_spriteram; -static UINT8 pandora_region; -static bitmap_t *pandora_sprites_bitmap; /* bitmap to render sprites to, Pandora seems to be frame'buffered' */ -static int pandora_clear_bitmap; -static int pandora_xoffset, pandora_yoffset; - -void pandora_set_clear_bitmap(int clear) +typedef struct _kaneko_pandora_state kaneko_pandora_state; +struct _kaneko_pandora_state { - pandora_clear_bitmap = clear; + const device_config *screen; + UINT8 * spriteram; + bitmap_t *sprites_bitmap; /* bitmap to render sprites to, Pandora seems to be frame'buffered' */ + int clear_bitmap; + UINT8 region; + int xoffset, yoffset; +}; + +/***************************************************************************** + INLINE FUNCTIONS +*****************************************************************************/ + +INLINE kaneko_pandora_state *get_safe_token( const device_config *device ) +{ + assert(device != NULL); + assert(device->token != NULL); + assert(device->type == KANEKO_PANDORA); + + return (kaneko_pandora_state *)device->token; } -void pandora_update(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect) +INLINE const kaneko_pandora_interface *get_interface( const device_config *device ) { - if (!pandora_sprites_bitmap) + assert(device != NULL); + assert((device->type == KANEKO_PANDORA)); + return (const kaneko_pandora_interface *) device->static_config; +} + +/***************************************************************************** + IMPLEMENTATION +*****************************************************************************/ + +void pandora_set_clear_bitmap( const device_config *device, int clear ) +{ + kaneko_pandora_state *pandora = get_safe_token(device); + pandora->clear_bitmap = clear; +} + +void pandora_update( const device_config *device, bitmap_t *bitmap, const rectangle *cliprect ) +{ + kaneko_pandora_state *pandora = get_safe_token(device); + + if (!pandora->sprites_bitmap) { printf("ERROR: pandora_update with no pandora_sprites_bitmap\n"); return; } - copybitmap_trans(bitmap,pandora_sprites_bitmap,0,0,0,0,cliprect,0); + copybitmap_trans(bitmap, pandora->sprites_bitmap, 0, 0, 0, 0, cliprect, 0); } -static void pandora_draw(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect) +static void pandora_draw( const device_config *device, bitmap_t *bitmap, const rectangle *cliprect ) { - - int sx=0, sy=0, x=0, y=0, offs; + kaneko_pandora_state *pandora = get_safe_token(device); + int sx = 0, sy = 0, x = 0, y = 0, offs; /* @@ -95,18 +130,20 @@ static void pandora_draw(running_machine *machine, bitmap_t *bitmap, const recta * 7 | .x...... | Flip Sprite X-Axis */ - for (offs = 0;offs < 0x1000;offs += 8) + for (offs = 0; offs < 0x1000; offs += 8) { - int dx = pandora_spriteram[offs+4]; - int dy = pandora_spriteram[offs+5]; - int tilecolour = pandora_spriteram[offs+3]; - int attr = pandora_spriteram[offs+7]; + int dx = pandora->spriteram[offs + 4]; + int dy = pandora->spriteram[offs + 5]; + int tilecolour = pandora->spriteram[offs + 3]; + int attr = pandora->spriteram[offs + 7]; int flipx = attr & 0x80; int flipy = (attr & 0x40) << 1; - int tile = ((attr & 0x3f) << 8) + (pandora_spriteram[offs+6] & 0xff); + int tile = ((attr & 0x3f) << 8) + (pandora->spriteram[offs + 6] & 0xff); - if (tilecolour & 1) dx |= 0x100; - if (tilecolour & 2) dy |= 0x100; + if (tilecolour & 1) + dx |= 0x100; + if (tilecolour & 2) + dy |= 0x100; if (tilecolour & 4) { @@ -119,7 +156,7 @@ static void pandora_draw(running_machine *machine, bitmap_t *bitmap, const recta y = dy; } - if (flip_screen_get(machine)) + if (flip_screen_get(device->machine)) { sx = 240 - x; sy = 240 - y; @@ -133,16 +170,18 @@ static void pandora_draw(running_machine *machine, bitmap_t *bitmap, const recta } /* global offset */ - sx+=pandora_xoffset; - sy+=pandora_yoffset; + sx += pandora->xoffset; + sy += pandora->yoffset; - sx &=0x1ff; - sy &=0x1ff; + sx &= 0x1ff; + sy &= 0x1ff; - if (sx&0x100) sx-=0x200; - if (sy&0x100) sy-=0x200; + if (sx & 0x100) + sx -= 0x200; + if (sy & 0x100) + sy -= 0x200; - drawgfx_transpen(bitmap,cliprect,machine->gfx[pandora_region], + drawgfx_transpen(bitmap,cliprect,device->machine->gfx[pandora->region], tile, (tilecolour & 0xf0) >> 4, flipx, flipy, @@ -150,100 +189,140 @@ static void pandora_draw(running_machine *machine, bitmap_t *bitmap, const recta } } -void pandora_eof(running_machine *machine) +void pandora_eof( const device_config *device ) { - assert(pandora_spriteram != NULL); + kaneko_pandora_state *pandora = get_safe_token(device); + assert(pandora->spriteram != NULL); // the games can disable the clearing of the sprite bitmap, to leave sprite trails - if (pandora_clear_bitmap) bitmap_fill(pandora_sprites_bitmap,video_screen_get_visible_area(machine->primary_screen),0); + if (pandora->clear_bitmap) + bitmap_fill(pandora->sprites_bitmap, video_screen_get_visible_area(pandora->screen), 0); - pandora_draw(machine, pandora_sprites_bitmap, video_screen_get_visible_area(machine->primary_screen)); + pandora_draw(device, pandora->sprites_bitmap, video_screen_get_visible_area(pandora->screen)); } -void pandora_start(running_machine *machine, UINT8 region, int x, int y) +/***************************************************************************** + DEVICE HANDLERS +*****************************************************************************/ + +WRITE8_DEVICE_HANDLER ( pandora_spriteram_w ) { - pandora_region = region; - pandora_xoffset = x; - pandora_yoffset = y; - pandora_spriteram = auto_alloc_array(machine, UINT8, 0x1000); - memset(pandora_spriteram,0x00, 0x1000); + kaneko_pandora_state *pandora = get_safe_token(device); - pandora_sprites_bitmap = video_screen_auto_bitmap_alloc(machine->primary_screen); - pandora_clear_bitmap = 1; - - state_save_register_global(machine, pandora_clear_bitmap); - state_save_register_global_pointer(machine, pandora_spriteram, 0x1000); - state_save_register_global_bitmap(machine, pandora_sprites_bitmap); -} - - -WRITE8_HANDLER ( pandora_spriteram_w ) -{ // it's either hooked up oddly on this, or on the 16-bit games // either way, we swap the address lines so that the spriteram is in the same format offset = BITSWAP16(offset, 15,14,13,12, 11, 7,6,5,4,3,2,1,0, 10,9,8 ); - if (!pandora_spriteram) + if (!pandora->spriteram) { - printf("ERROR: pandora_spriteram_w with no pandora_spriteram\n"); + printf("ERROR: pandora->spriteram_w with no pandora_spriteram\n"); return; } - if (offset>=0x1000) + if (offset >= 0x1000) { - logerror("pandora_spriteram_w write past spriteram, offset %04x %02x\n",offset,data); + logerror("pandora->spriteram_w write past spriteram, offset %04x %02x\n", offset, data); return; } - pandora_spriteram[offset] = data; + + pandora->spriteram[offset] = data; } -READ8_HANDLER( pandora_spriteram_r ) +READ8_DEVICE_HANDLER( pandora_spriteram_r ) { + kaneko_pandora_state *pandora = get_safe_token(device); + // it's either hooked up oddly on this, or ont the 16-bit games // either way, we swap the address lines so that the spriteram is in the same format offset = BITSWAP16(offset, 15,14,13,12, 11, 7,6,5,4,3,2,1,0, 10,9,8 ); - if (!pandora_spriteram) + if (!pandora->spriteram) { - printf("ERROR: pandora_spriteram_r with no pandora_spriteram\n"); + printf("ERROR: pandora->spriteram_r with no pandora_spriteram\n"); return 0x00; } - if (offset>=0x1000) + if (offset >= 0x1000) { - logerror("pandora_spriteram_r read past spriteram, offset %04x\n",offset ); + logerror("pandora->spriteram_r read past spriteram, offset %04x\n", offset); return 0x00; } - return pandora_spriteram[offset]; + return pandora->spriteram[offset]; } /* I don't know if this MSB/LSB mirroring is correct, or if there is twice as much ram, with half of it unused */ -WRITE16_HANDLER( pandora_spriteram_LSB_w ) +WRITE16_DEVICE_HANDLER( pandora_spriteram_LSB_w ) { - if (!pandora_spriteram) + kaneko_pandora_state *pandora = get_safe_token(device); + + if (!pandora->spriteram) { - printf("ERROR: pandora_spriteram_LSB_w with no pandora_spriteram\n"); + printf("ERROR: pandora->spriteram_LSB_w with no pandora_spriteram\n"); return; } if (ACCESSING_BITS_8_15) { - pandora_spriteram[offset] = (data>>8)&0xff; + pandora->spriteram[offset] = (data >> 8) & 0xff; } if (ACCESSING_BITS_0_7) { - pandora_spriteram[offset] = data&0xff; + pandora->spriteram[offset] = data & 0xff; } } -READ16_HANDLER( pandora_spriteram_LSB_r ) +READ16_DEVICE_HANDLER( pandora_spriteram_LSB_r ) { - if (!pandora_spriteram) + kaneko_pandora_state *pandora = get_safe_token(device); + + if (!pandora->spriteram) { printf("ERROR: pandora_spriteram_LSB_r with no pandora_spriteram\n"); return 0x0000; } - return pandora_spriteram[offset]|(pandora_spriteram[offset]<<8); + return pandora->spriteram[offset] | (pandora->spriteram[offset] << 8); } + + +/***************************************************************************** + DEVICE INTERFACE +*****************************************************************************/ + +static DEVICE_START( kaneko_pandora ) +{ + kaneko_pandora_state *pandora = get_safe_token(device); + const kaneko_pandora_interface *intf = get_interface(device); + + pandora->screen = devtag_get_device(device->machine, intf->screen); + pandora->region = intf->gfx_region; + pandora->xoffset = intf->x; + pandora->yoffset = intf->y; + + pandora->spriteram = auto_alloc_array(device->machine, UINT8, 0x1000); + + pandora->sprites_bitmap = video_screen_auto_bitmap_alloc(pandora->screen); + + state_save_register_device_item(device, 0, pandora->clear_bitmap); + state_save_register_device_item_pointer(device, 0, pandora->spriteram, 0x1000); + state_save_register_device_item_bitmap(device, 0, pandora->sprites_bitmap); +} + +static DEVICE_RESET( kaneko_pandora ) +{ + kaneko_pandora_state *pandora = get_safe_token(device); + + memset(pandora->spriteram, 0x00, 0x1000); + + pandora->clear_bitmap = 1; +} + +static const char DEVTEMPLATE_SOURCE[] = __FILE__; + +#define DEVTEMPLATE_ID( p, s ) p##kaneko_pandora##s +#define DEVTEMPLATE_FEATURES DT_HAS_START | DT_HAS_RESET +#define DEVTEMPLATE_NAME "Kaneko Pandora - PX79C480FP-3" +#define DEVTEMPLATE_FAMILY "Kaneko Video Chips" +#define DEVTEMPLATE_CLASS DEVICE_CLASS_VIDEO +#include "devtempl.h" diff --git a/src/mame/video/kan_pand.h b/src/mame/video/kan_pand.h index ee6701da01f..26c88f56d42 100644 --- a/src/mame/video/kan_pand.h +++ b/src/mame/video/kan_pand.h @@ -1,11 +1,60 @@ -/* kan_pand.h */ +/************************************************************************* -void pandora_start(running_machine *machine, UINT8 region, int x, int y); -void pandora_update(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect); -void pandora_eof(running_machine *machine); -void pandora_set_clear_bitmap(int clear); + kan_pand.h + + Implementation of Kaneko Pandora sprite chip + +**************************************************************************/ + +#ifndef __KAN_PAND_H__ +#define __KAN_PAND_H__ + +#include "devcb.h" + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +typedef struct _kaneko_pandora_interface kaneko_pandora_interface; +struct _kaneko_pandora_interface +{ + const char *screen; + UINT8 gfx_region; + int x; + int y; +}; + +/*************************************************************************** + FUNCTION PROTOTYPES +***************************************************************************/ + +DEVICE_GET_INFO( kaneko_pandora ); + + +/*************************************************************************** + DEVICE CONFIGURATION MACROS +***************************************************************************/ + +#define KANEKO_PANDORA DEVICE_GET_INFO_NAME( kaneko_pandora ) + +#define MDRV_KANEKO_PANDORA_ADD(_tag, _interface) \ + MDRV_DEVICE_ADD(_tag, KANEKO_PANDORA, 0) \ + MDRV_DEVICE_CONFIG(_interface) + + +/*************************************************************************** + DEVICE I/O FUNCTIONS +***************************************************************************/ + +void pandora_update(const device_config *device, bitmap_t *bitmap, const rectangle *cliprect); +void pandora_eof(const device_config *device); +void pandora_set_clear_bitmap(const device_config *device, int clear); + +WRITE8_DEVICE_HANDLER ( pandora_spriteram_w ); +READ8_DEVICE_HANDLER( pandora_spriteram_r ); + +WRITE16_DEVICE_HANDLER( pandora_spriteram_LSB_w ); +READ16_DEVICE_HANDLER( pandora_spriteram_LSB_r ); + +#endif /* __KAN_PAND_H__ */ -WRITE8_HANDLER ( pandora_spriteram_w ); -READ8_HANDLER( pandora_spriteram_r ); -WRITE16_HANDLER( pandora_spriteram_LSB_w ); -READ16_HANDLER( pandora_spriteram_LSB_r ); diff --git a/src/mame/video/kaneko16.c b/src/mame/video/kaneko16.c index e8fbaebc70e..f8302169390 100644 --- a/src/mame/video/kaneko16.c +++ b/src/mame/video/kaneko16.c @@ -235,7 +235,6 @@ VIDEO_START( kaneko16_2xVIEW2 ) VIDEO_START( sandscrp_1xVIEW2 ) { VIDEO_START_CALL(kaneko16_1xVIEW2); - pandora_start(machine,0,0,0); tilemap_set_scrolldy( kaneko16_tmap_0, 0, 256 - 1 ); tilemap_set_scrolldy( kaneko16_tmap_1, 0, 256 - 1 ); @@ -1122,6 +1121,7 @@ VIDEO_UPDATE( galsnew ) VIDEO_UPDATE( sandscrp ) { + const device_config *pandora = devtag_get_device(screen->machine, "pandora"); kaneko16_fill_bitmap(screen->machine,bitmap,cliprect); // if the display is disabled, do nothing? @@ -1130,7 +1130,7 @@ VIDEO_UPDATE( sandscrp ) VIDEO_UPDATE_CALL(common); // copy sprite bitmap to screen - pandora_update(screen->machine,bitmap,cliprect); + pandora_update(pandora, bitmap, cliprect); return 0; }