diff options
author | Aaron Giles <aaron@aarongiles.com> | 2007-12-17 16:41:39 +0000 |
---|---|---|
committer | Aaron Giles <aaron@aarongiles.com> | 2007-12-17 16:41:39 +0000 |
commit | 507ca2d27520118151a2556d96b9a15aac768876 (patch) | |
tree | 46bb2585f4114b1dfc157c3bfe60238d23877e7a /src/mame/drivers/midzeus.c | |
parent | df34329a478833efbd542a424ce1813a11214d4a (diff) |
Changes for MAME 0.121u4.mame0121u4
Diffstat (limited to 'src/mame/drivers/midzeus.c')
-rw-r--r-- | src/mame/drivers/midzeus.c | 153 |
1 files changed, 116 insertions, 37 deletions
diff --git a/src/mame/drivers/midzeus.c b/src/mame/drivers/midzeus.c index 807c290bfdb..0ee6d1f89f6 100644 --- a/src/mame/drivers/midzeus.c +++ b/src/mame/drivers/midzeus.c @@ -25,6 +25,14 @@ #define CPU_CLOCK 60000000 +#define BEAM_DY 3 +#define BEAM_DX 3 +#define BEAM_XOFFS 20 /* table in the code indicates an offset of 20 with a beam height of 7 */ + +static UINT32 gun_control; +static UINT8 gun_irq_state; +static emu_timer * gun_timer[2]; +static INT32 gun_x[2], gun_y[2]; static UINT32 *ram_base; static UINT8 cmos_protected; @@ -34,6 +42,9 @@ static emu_timer *timer[2]; static UINT32 *tms32031_control; +static TIMER_CALLBACK( invasn_gun_callback ); + + /************************************* * @@ -49,6 +60,9 @@ static MACHINE_RESET( midzeus ) timer[0] = timer_alloc(NULL, NULL); timer[1] = timer_alloc(NULL, NULL); + + gun_timer[0] = timer_alloc(invasn_gun_callback, NULL); + gun_timer[1] = timer_alloc(invasn_gun_callback, NULL); } @@ -124,6 +138,82 @@ static WRITE32_HANDLER( tms32031_control_w ) } +/************************************* + * + * Lightgun handling + * + *************************************/ + +static void update_gun_irq(void) +{ + if (gun_irq_state & gun_control & 0x03) + cpunum_set_input_line(0, 3, ASSERT_LINE); + else + cpunum_set_input_line(0, 3, CLEAR_LINE); +} + + +static TIMER_CALLBACK( invasn_gun_callback ) +{ + int player = param; + int beamy = video_screen_get_vpos(0); + + gun_irq_state |= 0x01 << player; + update_gun_irq(); + + beamy++; + if (beamy <= machine->screen[0].visarea.max_y && beamy <= gun_y[player] + BEAM_DY) + timer_adjust(gun_timer[player], video_screen_get_time_until_pos(0, beamy, MAX(0, gun_x[player] - BEAM_DX)), player, attotime_never); +} + + +static WRITE32_HANDLER( invasn_gun_w ) +{ + UINT32 old_control = gun_control; + int player; + + COMBINE_DATA(&gun_control); + + /* bits 0-1 enable IRQs (?) */ + /* bits 2-3 reset IRQ states */ + gun_irq_state &= ~((gun_control >> 2) & 3); + update_gun_irq(); + + for (player = 0; player < 2; player++) + { + UINT8 pmask = 0x04 << player; + if (((old_control ^ gun_control) & pmask) != 0 && (gun_control & pmask) == 0) + { + const rectangle *visarea = &Machine->screen[0].visarea; + static const char *names[2][2] = + { + { "GUNX1", "GUNY1" }, + { "GUNX2", "GUNY2" } + }; + gun_x[player] = readinputportbytag(names[player][0]) * (visarea->max_x + 1 - visarea->min_x) / 255 + visarea->min_x + BEAM_XOFFS; + gun_y[player] = readinputportbytag(names[player][1]) * (visarea->max_y + 1 - visarea->min_y) / 255 + visarea->min_y; + timer_adjust(gun_timer[player], video_screen_get_time_until_pos(0, MAX(0, gun_y[player] - BEAM_DY), MAX(0, gun_x[player] - BEAM_DX)), player, attotime_never); + } + } +} + +static READ32_HANDLER( invasn_gun_r ) +{ + int beamx = video_screen_get_hpos(0); + int beamy = video_screen_get_vpos(0); + UINT32 result = 0xffff; + int player; + + for (player = 0; player < 2; player++) + { + int diffx = beamx - gun_x[player]; + int diffy = beamy - gun_y[player]; + if (diffx >= -BEAM_DX && diffx <= BEAM_DX && diffy >= -BEAM_DY && diffy <= BEAM_DY) + result ^= 0x1000 << player; + } + return result; +} + /************************************* * @@ -155,7 +245,6 @@ static ADDRESS_MAP_START( zeus_map, ADDRESS_SPACE_PROGRAM, 32 ) AM_RANGE(0x880000, 0x8803ff) AM_READWRITE(zeus_r, zeus_w) AM_BASE(&zeusbase) AM_RANGE(0x8d0000, 0x8d0003) AM_READWRITE(unknown_8d0000_r, unknown_8d0000_w) AM_BASE(&unknown_8d0000) AM_RANGE(0x990000, 0x99000f) AM_READWRITE(midway_ioasic_r, midway_ioasic_w) -//9d0000 -- page select? AM_RANGE(0x9e0000, 0x9e0000) AM_WRITENOP // watchdog? AM_RANGE(0x9f0000, 0x9f7fff) AM_READWRITE(cmos_r, cmos_w) AM_BASE(&generic_nvram32) AM_SIZE(&generic_nvram_size) AM_RANGE(0x9f8000, 0x9f8000) AM_WRITE(cmos_protect_w) @@ -171,7 +260,6 @@ static ADDRESS_MAP_START( zeus2_map, ADDRESS_SPACE_PROGRAM, 32 ) AM_RANGE(0x880000, 0x8801ff) AM_READWRITE(zeus2_r, zeus2_w) AM_BASE(&zeusbase) AM_RANGE(0x8d0000, 0x8d0003) AM_READWRITE(unknown_8d0000_r, unknown_8d0000_w) AM_BASE(&unknown_8d0000) AM_RANGE(0x990000, 0x99000f) AM_READWRITE(midway_ioasic_r, midway_ioasic_w) -//9d0000 -- page select? AM_RANGE(0x9e0000, 0x9e0000) AM_WRITENOP // watchdog? AM_RANGE(0x9f0000, 0x9f7fff) AM_READWRITE(cmos_r, cmos_w) AM_BASE(&generic_nvram32) AM_SIZE(&generic_nvram_size) AM_RANGE(0x9f8000, 0x9f8000) AM_WRITE(cmos_protect_w) @@ -364,32 +452,27 @@ static INPUT_PORTS_START( invasn ) PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BILL1 ) /* Bill */ PORT_START - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_8WAY - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_8WAY - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_8WAY - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_8WAY - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) - PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_8WAY - PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_8WAY - PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_8WAY - PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_8WAY - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) - PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x000f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x00e0, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x0f00, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0xe000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1) - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(1) - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(2) - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(2) - PORT_BIT( 0xff80, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START_TAG("GUNX1") /* fake analog X */ + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) + + PORT_START_TAG("GUNY1") /* fake analog Y */ + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(70) PORT_KEYDELTA(10) + + PORT_START_TAG("GUNX2") /* fake analog X */ + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) PORT_PLAYER(2) + + PORT_START_TAG("GUNY2") /* fake analog Y */ + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(70) PORT_KEYDELTA(10) PORT_PLAYER(2) INPUT_PORTS_END @@ -782,15 +865,11 @@ static DRIVER_INIT( mk4 ) } -static READ32_HANDLER( gun_r ) -{ - return ~0; -} static DRIVER_INIT( invasn ) { dcs2_init(0, 0); - midway_ioasic_init(MIDWAY_IOASIC_STANDARD, 461/* unknown */, 94, NULL); - memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x9c0000, 0x9c0000, 0, 0, gun_r); + midway_ioasic_init(MIDWAY_IOASIC_STANDARD, 468/* or 488 */, 94, NULL); + memory_install_readwrite32_handler(0, ADDRESS_SPACE_PROGRAM, 0x9c0000, 0x9c0000, 0, 0, invasn_gun_r, invasn_gun_w); } @@ -816,8 +895,8 @@ static DRIVER_INIT( thegrid ) * *************************************/ -GAME( 1997, mk4, 0, midzeus, mk4, mk4, ROT0, "Midway", "Mortal Kombat 4 (3.0)", GAME_NOT_WORKING | GAME_NO_SOUND ) -GAME( 1997, mk4a, mk4, midzeus, mk4, mk4, ROT0, "Midway", "Mortal Kombat 4 (2.1)", GAME_NOT_WORKING | GAME_NO_SOUND ) -GAME( 1999, invasn, 0, midzeus, invasn, invasn, ROT0, "Midway", "Invasion (Midway)", GAME_NOT_WORKING | GAME_NO_SOUND ) -GAME( 1999, crusnexo, 0, midzeus2, crusnexo, crusnexo, ROT0, "Midway", "Cruis'n Exotica", GAME_NOT_WORKING | GAME_NO_SOUND ) -GAME( 2001, thegrid, 0, midzeus2, thegrid, thegrid, ROT0, "Midway", "The Grid (version 1.1)", GAME_NOT_WORKING | GAME_NO_SOUND ) +GAME( 1997, mk4, 0, midzeus, mk4, mk4, ROT0, "Midway", "Mortal Kombat 4 (3.0)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1997, mk4a, mk4, midzeus, mk4, mk4, ROT0, "Midway", "Mortal Kombat 4 (2.1)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1999, invasn, 0, midzeus, invasn, invasn, ROT0, "Midway", "Invasion (Midway)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS ) +GAME( 1999, crusnexo, 0, midzeus2, crusnexo, crusnexo, ROT0, "Midway", "Cruis'n Exotica", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_NO_SOUND ) +GAME( 2001, thegrid, 0, midzeus2, thegrid, thegrid, ROT0, "Midway", "The Grid (version 1.1)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_NO_SOUND ) |