diff --git a/.gitattributes b/.gitattributes index 13af088c46c..95fb3e22b99 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2244,6 +2244,7 @@ src/mame/includes/phoenix.h svneol=native#text/plain src/mame/includes/polepos.h svneol=native#text/plain src/mame/includes/policetr.h svneol=native#text/plain src/mame/includes/poolshrk.h svneol=native#text/plain +src/mame/includes/pooyan.h svneol=native#text/plain src/mame/includes/psikyosh.h svneol=native#text/plain src/mame/includes/psx.h svneol=native#text/plain src/mame/includes/qix.h svneol=native#text/plain diff --git a/src/mame/drivers/pooyan.c b/src/mame/drivers/pooyan.c index d1f15da8122..e50fb690a62 100644 --- a/src/mame/drivers/pooyan.c +++ b/src/mame/drivers/pooyan.c @@ -1,103 +1,90 @@ /*************************************************************************** -Notes: -- Several people claim that colors are wrong, but the way the color PROMs - are used seems correct. + Pooyan - -Pooyan memory map (preliminary) - -driver by Allard Van Der Bas - -Thanks must go to Mike Cuddy for providing information on this one. - -Sound processor memory map. -0x3000-0x33ff RAM. -AY-8910 #1 : reg 0x5000 - wr 0x4000 - rd 0x4000 - -AY-8910 #2 : reg 0x7000 - wr 0x6000 - rd 0x6000 - -Main processor memory map. -0000-7fff ROM -8000-83ff color RAM -8400-87ff video RAM -8800-8fff RAM -9000-97ff sprite RAM (only areas 0x9010 and 0x9410 are used). - -memory mapped ports: - -read: -0xA000 Dipswitch 2 adddbtll - a = attract mode - ddd = difficulty 0=easy, 7=hardest. - b = bonus setting (easy/hard) - t = table / upright - ll = lives: 11=3, 10=4, 01=5, 00=255. - -0xA0E0 llllrrrr - l == left coin mech, r = right coinmech. - -0xA080 IN0 Port -0xA0A0 IN1 Port -0xA0C0 IN2 Port - -write: -0xA100 command for the audio CPU. -0xA180 NMI enable. (0xA180 == 1 = deliver NMI to CPU). - -0xA181 interrupt trigger on audio CPU. - -0xA183 maybe reset sound cpu? - -0xA184 ???? - -0xA187 Flip screen - -interrupts: -standard NMI at 0x66 + Original driver by Allard Van Der Bas + + This hardware is very similar to Time Pilot. ***************************************************************************/ #include "driver.h" +#include "deprecat.h" +#include "pooyan.h" #include "audio/timeplt.h" -extern WRITE8_HANDLER( pooyan_videoram_w ); -extern WRITE8_HANDLER( pooyan_colorram_w ); -extern WRITE8_HANDLER( pooyan_flipscreen_w ); - -extern PALETTE_INIT( pooyan ); -extern VIDEO_START( pooyan ); -extern VIDEO_UPDATE( pooyan ); +#define MASTER_CLOCK XTAL_18_432MHz -static ADDRESS_MAP_START( pooyan_map, ADDRESS_SPACE_PROGRAM, 8 ) + +static UINT8 irq_enable; + + +/************************************* + * + * Interrupts + * + *************************************/ + +static MACHINE_START( pooyan ) +{ + state_save_register_global(irq_enable); +} + + +static INTERRUPT_GEN( pooyan_interrupt ) +{ + if (irq_enable) + cpunum_set_input_line(machine, 0, INPUT_LINE_NMI, ASSERT_LINE); +} + + +static WRITE8_HANDLER( irq_enable_w ) +{ + irq_enable = data & 1; + if (!irq_enable) + cpunum_set_input_line(Machine, 0, INPUT_LINE_NMI, CLEAR_LINE); +} + + + +/************************************* + * + * Memory maps + * + *************************************/ + +static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x83ff) AM_RAM AM_WRITE(pooyan_colorram_w) AM_BASE(&colorram) AM_RANGE(0x8400, 0x87ff) AM_RAM AM_WRITE(pooyan_videoram_w) AM_BASE(&videoram) AM_RANGE(0x8800, 0x8fff) AM_RAM - AM_RANGE(0x9010, 0x903f) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size) - AM_RANGE(0x9410, 0x943f) AM_RAM AM_BASE(&spriteram_2) - AM_RANGE(0xa000, 0xa000) AM_READ(input_port_4_r) AM_WRITENOP /* DSW2 */ /* watchdog reset? */ - AM_RANGE(0xa028, 0xa028) AM_WRITENOP // ??? - AM_RANGE(0xa080, 0xa080) AM_READ(input_port_0_r) /* IN0 */ - AM_RANGE(0xa0a0, 0xa0a0) AM_READ(input_port_1_r) /* IN1 */ - AM_RANGE(0xa0c0, 0xa0c0) AM_READ(input_port_2_r) /* IN2 */ - AM_RANGE(0xa0e0, 0xa0e0) AM_READ(input_port_3_r) /* DSW1 */ - AM_RANGE(0xa100, 0xa100) AM_WRITE(soundlatch_w) - AM_RANGE(0xa180, 0xa180) AM_WRITE(interrupt_enable_w) - AM_RANGE(0xa181, 0xa181) AM_WRITE(timeplt_sh_irqtrigger_w) - AM_RANGE(0xa183, 0xa183) AM_WRITENOP // ??? - AM_RANGE(0xa187, 0xa187) AM_WRITE(pooyan_flipscreen_w) + AM_RANGE(0x9000, 0x90ff) AM_MIRROR(0x0b00) AM_RAM AM_BASE(&spriteram) + AM_RANGE(0x9400, 0x94ff) AM_MIRROR(0x0b00) AM_RAM AM_BASE(&spriteram_2) + AM_RANGE(0xa000, 0xa000) AM_MIRROR(0x5e7f) AM_READ_PORT("DSW1") + AM_RANGE(0xa080, 0xa080) AM_MIRROR(0x5e1f) AM_READ_PORT("IN0") + AM_RANGE(0xa0a0, 0xa0a0) AM_MIRROR(0x5e1f) AM_READ_PORT("IN1") + AM_RANGE(0xa0c0, 0xa0c0) AM_MIRROR(0x5e1f) AM_READ_PORT("IN2") + AM_RANGE(0xa0e0, 0xa0e0) AM_MIRROR(0x5e1f) AM_READ_PORT("DSW0") + AM_RANGE(0xa000, 0xa000) AM_MIRROR(0x5e7f) AM_WRITE(watchdog_reset_w) + AM_RANGE(0xa100, 0xa100) AM_MIRROR(0x5e7f) AM_WRITE(soundlatch_w) + AM_RANGE(0xa180, 0xa180) AM_MIRROR(0x5e78) AM_WRITE(irq_enable_w) + AM_RANGE(0xa181, 0xa181) AM_MIRROR(0x5e78) AM_WRITE(timeplt_sh_irqtrigger_w) + AM_RANGE(0xa183, 0xa183) AM_MIRROR(0x5e78) AM_WRITENOP // ??? + AM_RANGE(0xa187, 0xa187) AM_MIRROR(0x5e78) AM_WRITE(pooyan_flipscreen_w) ADDRESS_MAP_END + +/************************************* + * + * Port definitions + * + *************************************/ + static INPUT_PORTS_START( pooyan ) - PORT_START /* IN0 */ + PORT_START_TAG("IN0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) @@ -105,21 +92,21 @@ static INPUT_PORTS_START( pooyan ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START /* IN1 */ + PORT_START_TAG("IN1") PORT_BIT( 0x03, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_2WAY PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_2WAY PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START /* IN2 */ + PORT_START_TAG("IN2") PORT_BIT( 0x03, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_2WAY PORT_COCKTAIL PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_2WAY PORT_COCKTAIL PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START /* DSW0 */ + PORT_START_TAG("DSW0") PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) ) PORT_DIPSETTING( 0x02, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C ) ) @@ -154,7 +141,7 @@ static INPUT_PORTS_START( pooyan ) PORT_DIPSETTING( 0xa0, DEF_STR( 1C_6C ) ) PORT_DIPSETTING( 0x90, DEF_STR( 1C_7C ) ) - PORT_START /* DSW1 */ + PORT_START_TAG("DSW1") PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x02, "4" ) @@ -182,29 +169,33 @@ INPUT_PORTS_END +/************************************* + * + * Graphics layouts + * + *************************************/ + static const gfx_layout charlayout = { - 8,8, /* 8*8 characters */ - 256, /* 256 characters */ - 4, /* 4 bits per pixel */ - { 0x1000*8+4, 0x1000*8+0, 4, 0 }, - { 0, 1, 2, 3, 8*8+0,8*8+1,8*8+2,8*8+3 }, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, - 16*8 /* every char takes 16 consecutive bytes */ -}; -static const gfx_layout spritelayout = -{ - 16,16, /* 16*16 sprites */ - 64, /* 64 sprites */ - 4, /* 4 bits per pixel */ - { 0x1000*8+4, 0x1000*8+0, 4, 0 }, - { 0, 1, 2, 3, 8*8+0, 8*8+1, 8*8+2, 8*8+3, - 16*8+0, 16*8+1, 16*8+2, 16*8+3, 24*8+0, 24*8+1, 24*8+2, 24*8+3 }, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, - 32*8, 33*8, 34*8, 35*8, 36*8, 37*8, 38*8, 39*8 }, - 64*8 /* every sprite takes 64 consecutive bytes */ + 8,8, + RGN_FRAC(1,2), + 4, + { RGN_FRAC(1,2)+4, RGN_FRAC(1,2)+0, 4, 0 }, + { STEP4(0,1), STEP4(8*8,1) }, + { STEP8(0,8) }, + 16*8 }; +static const gfx_layout spritelayout = +{ + 16,16, + RGN_FRAC(1,2), + 4, + { RGN_FRAC(1,2)+4, RGN_FRAC(1,2)+0, 4, 0 }, + { STEP4(0,1), STEP4(8*8,1), STEP4(16*8,1), STEP4(24*8,1) }, + { STEP8(0,8), STEP8(32*8,8) }, + 64*8 +}; static GFXDECODE_START( pooyan ) @@ -214,15 +205,22 @@ GFXDECODE_END +/************************************* + * + * Machine drivers + * + *************************************/ + static MACHINE_DRIVER_START( pooyan ) /* basic machine hardware */ - MDRV_CPU_ADD(Z80, 3072000) /* 3.072 MHz (?) */ - MDRV_CPU_PROGRAM_MAP(pooyan_map, 0) - MDRV_CPU_VBLANK_INT(nmi_line_pulse,1) + MDRV_CPU_ADD(Z80, MASTER_CLOCK/3/2) + MDRV_CPU_PROGRAM_MAP(main_map,0) + MDRV_CPU_VBLANK_INT(pooyan_interrupt,1) MDRV_SCREEN_REFRESH_RATE(60) - MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION) + + MDRV_MACHINE_START(pooyan) /* video hardware */ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) @@ -230,8 +228,7 @@ static MACHINE_DRIVER_START( pooyan ) MDRV_SCREEN_SIZE(32*8, 32*8) MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) MDRV_GFXDECODE(pooyan) - MDRV_PALETTE_LENGTH(32) - MDRV_COLORTABLE_LENGTH(16*16+16*16) + MDRV_PALETTE_LENGTH(16*16+16*16) MDRV_PALETTE_INIT(pooyan) MDRV_VIDEO_START(pooyan) @@ -243,11 +240,11 @@ MACHINE_DRIVER_END -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ +/************************************* + * + * ROM definitions + * + *************************************/ ROM_START( pooyan ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) @@ -326,6 +323,12 @@ ROM_END -GAME( 1982, pooyan, 0, pooyan, pooyan, 0, ROT270, "Konami", "Pooyan", 0 ) -GAME( 1982, pooyans, pooyan, pooyan, pooyan, 0, ROT270, "[Konami] (Stern license)", "Pooyan (Stern)", 0 ) -GAME( 1982, pootan, pooyan, pooyan, pooyan, 0, ROT270, "bootleg", "Pootan", 0 ) +/************************************* + * + * Game drivers + * + *************************************/ + +GAME( 1982, pooyan, 0, pooyan, pooyan, 0, ROT270, "Konami", "Pooyan", GAME_SUPPORTS_SAVE ) +GAME( 1982, pooyans, pooyan, pooyan, pooyan, 0, ROT270, "[Konami] (Stern license)", "Pooyan (Stern)", GAME_SUPPORTS_SAVE ) +GAME( 1982, pootan, pooyan, pooyan, pooyan, 0, ROT270, "bootleg", "Pootan", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/timeplt.c b/src/mame/drivers/timeplt.c index 76553c52a2e..a5f5c09987d 100644 --- a/src/mame/drivers/timeplt.c +++ b/src/mame/drivers/timeplt.c @@ -45,6 +45,7 @@ ***************************************************************************/ #include "driver.h" +#include "deprecat.h" #include "timeplt.h" #include "audio/timeplt.h" @@ -53,9 +54,40 @@ +static UINT8 irq_enable; + + /************************************* * - * Memory maps + * Interrupts + * + *************************************/ + +static MACHINE_START( timeplt ) +{ + state_save_register_global(irq_enable); +} + + +static INTERRUPT_GEN( timeplt_interrupt ) +{ + if (irq_enable) + cpunum_set_input_line(machine, 0, INPUT_LINE_NMI, ASSERT_LINE); +} + + +static WRITE8_HANDLER( irq_enable_w ) +{ + irq_enable = data & 1; + if (!irq_enable) + cpunum_set_input_line(Machine, 0, INPUT_LINE_NMI, CLEAR_LINE); +} + + + +/************************************* + * + * Outputs * *************************************/ @@ -82,7 +114,7 @@ static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0xb400, 0xb4ff) AM_MIRROR(0x0b00) AM_RAM AM_BASE(&spriteram_2) AM_RANGE(0xc000, 0xc000) AM_MIRROR(0x0cff) AM_WRITE(soundlatch_w) AM_RANGE(0xc200, 0xc200) AM_MIRROR(0x0cff) AM_WRITE(watchdog_reset_w) - AM_RANGE(0xc300, 0xc300) AM_MIRROR(0x0cf1) AM_WRITE(interrupt_enable_w) + AM_RANGE(0xc300, 0xc300) AM_MIRROR(0x0cf1) AM_WRITE(irq_enable_w) AM_RANGE(0xc302, 0xc302) AM_MIRROR(0x0cf1) AM_WRITE(timeplt_flipscreen_w) AM_RANGE(0xc304, 0xc304) AM_MIRROR(0x0cf1) AM_WRITE(timeplt_sh_irqtrigger_w) AM_RANGE(0xc30a, 0xc30c) AM_MIRROR(0x0cf1) AM_WRITE(timeplt_coin_counter_w) @@ -291,9 +323,11 @@ static MACHINE_DRIVER_START( timeplt ) /* basic machine hardware */ MDRV_CPU_ADD(Z80, MASTER_CLOCK/3/2) /* not confirmed, but common for Konami games of the era */ MDRV_CPU_PROGRAM_MAP(main_map,0) - MDRV_CPU_VBLANK_INT(nmi_line_pulse,1) + MDRV_CPU_VBLANK_INT(timeplt_interrupt,1) MDRV_SCREEN_REFRESH_RATE(60) + + MDRV_MACHINE_START(timeplt) /* video hardware */ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) diff --git a/src/mame/includes/pooyan.h b/src/mame/includes/pooyan.h new file mode 100644 index 00000000000..93003e84b5a --- /dev/null +++ b/src/mame/includes/pooyan.h @@ -0,0 +1,15 @@ +/*************************************************************************** + + Pooyan + +***************************************************************************/ + +/*----------- defined in video/pooyan.c -----------*/ + +WRITE8_HANDLER( pooyan_videoram_w ); +WRITE8_HANDLER( pooyan_colorram_w ); +WRITE8_HANDLER( pooyan_flipscreen_w ); + +PALETTE_INIT( pooyan ); +VIDEO_START( pooyan ); +VIDEO_UPDATE( pooyan ); diff --git a/src/mame/video/pooyan.c b/src/mame/video/pooyan.c index 82b0c5b8df2..e024dfe3831 100644 --- a/src/mame/video/pooyan.c +++ b/src/mame/video/pooyan.c @@ -1,15 +1,16 @@ /*************************************************************************** - video.c - - Functions to emulate the video hardware of the machine. + Pooyan ***************************************************************************/ #include "driver.h" +#include "pooyan.h" static tilemap *bg_tilemap; + + /*************************************************************************** Convert the color PROMs into a more useable format. @@ -30,16 +31,13 @@ static tilemap *bg_tilemap; ***************************************************************************/ PALETTE_INIT( pooyan ) { + rgb_t palette[32]; int i; - #define TOTAL_COLORS(gfxn) (machine->gfx[gfxn]->total_colors * machine->gfx[gfxn]->color_granularity) - #define COLOR(gfxn,offs) (colortable[machine->drv->gfxdecodeinfo[gfxn].color_codes_start + offs]) - - for (i = 0;i < machine->drv->total_colors;i++) + for (i = 0;i < 32;i++) { int bit0,bit1,bit2,r,g,b; - /* red component */ bit0 = (*color_prom >> 0) & 0x01; bit1 = (*color_prom >> 1) & 0x01; @@ -56,19 +54,19 @@ PALETTE_INIT( pooyan ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(machine,i,MAKE_RGB(r,g,b)); + palette[i] = MAKE_RGB(r,g,b); color_prom++; } /* color_prom now points to the beginning of the char lookup table */ /* sprites */ - for (i = 0;i < TOTAL_COLORS(1);i++) - COLOR(1,i) = *(color_prom++) & 0x0f; + for (i = 0;i < 16*16;i++) + palette_set_color(machine, 16*16+i, palette[*color_prom++ & 0x0f]); /* characters */ - for (i = 0;i < TOTAL_COLORS(0);i++) - COLOR(0,i) = (*(color_prom++) & 0x0f) + 0x10; + for (i = 0;i < 16*16;i++) + palette_set_color(machine, i, palette[(*color_prom++ & 0x0f) + 0x10]); } WRITE8_HANDLER( pooyan_videoram_w ) @@ -112,9 +110,8 @@ static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const re { int offs; - for (offs = 0;offs < spriteram_size;offs += 2) + for (offs = 0x10;offs < 0x40;offs += 2) { - /* TRANSPARENCY_COLOR is needed for the scores */ /* Sprite flipscreen is supported by software */ drawgfx(bitmap,machine->gfx[1], spriteram[offs + 1], @@ -122,7 +119,7 @@ static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const re spriteram_2[offs] & 0x40, ~spriteram_2[offs] & 0x80, 240-spriteram[offs], spriteram_2[offs + 1], cliprect, - TRANSPARENCY_COLOR, 0); + TRANSPARENCY_PEN, 0); } }