From 561c7ea8d17ee9cb8978e5e3fb8a3c5bad89fdac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Banaan=20Ananas?= Date: Wed, 26 Dec 2012 17:56:51 +0000 Subject: [PATCH] added armadillo trackball --- src/mame/drivers/namcos22.c | 77 +++++++++++++++++++++++++++++++++++- src/mame/includes/namcos22.h | 7 +++- 2 files changed, 82 insertions(+), 2 deletions(-) diff --git a/src/mame/drivers/namcos22.c b/src/mame/drivers/namcos22.c index e6ed4f6c706..7a34a2fb304 100644 --- a/src/mame/drivers/namcos22.c +++ b/src/mame/drivers/namcos22.c @@ -2938,7 +2938,14 @@ void namcos22_state::machine_reset() InitDSP(machine()); } +void namcos22_state::machine_start() +{ + ; +} + static MACHINE_CONFIG_START( namcos22s, namcos22_state ) + + /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68EC020,SS22_MASTER_CLOCK/2) MCFG_CPU_PROGRAM_MAP(namcos22s_am) MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos22_state, namcos22s_interrupt) @@ -2965,6 +2972,8 @@ static MACHINE_CONFIG_START( namcos22s, namcos22_state ) // MCFG_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE) MCFG_NVRAM_HANDLER(namcos22) + + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) MCFG_SCREEN_UPDATE_DRIVER(namcos22_state, screen_update_namcos22s) @@ -2986,10 +2995,66 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( timecris, namcos22s ) + /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(timecris_am) MACHINE_CONFIG_END + +TIMER_CALLBACK_MEMBER(namcos22_state::adillor_trackball_interrupt) +{ + generic_pulse_irq_line(m_mcu, param ? M37710_LINE_TIMERA2TICK : M37710_LINE_TIMERA3TICK, 1); + m_ar_tb_interrupt[param]->adjust(m_ar_tb_reload[param], param); +} + +TIMER_DEVICE_CALLBACK_MEMBER(namcos22_state::adillor_trackball_update) +{ + // arbitrary timer for reading trackball + for (int axis = 0; axis < 2; axis++) + { + UINT16 ipt = ioport(axis ? "TRACKY" : "TRACKX")->read(); + if (ipt > 0 && ipt < 0x8000) + { + // optical trackball, tied to mcu A2/A3 timer (speed determines frequency) + // note that it is rotated by 45 degrees, so instead of axes like (+), they are like (x) + // (not yet tested on a real trackball, values below still need to be tweaked) + const int cap = 256; + const int maxspeed = 500; + const int sensitivity = 50; + + if (ipt > cap) ipt = cap; + ipt = cap - ipt; + + attotime freq = attotime::from_usec(maxspeed + sensitivity * ipt); + m_ar_tb_reload[axis] = freq; + m_ar_tb_interrupt[axis]->adjust(min(freq, m_ar_tb_interrupt[axis]->remaining()), axis); + + } + else + { + // backwards or not moving + m_ar_tb_reload[axis] = attotime::never; + m_ar_tb_interrupt[axis]->adjust(attotime::never, axis); + } + } +} + +MACHINE_START_MEMBER(namcos22_state,adillor) +{ + machine_start(); + + for (int axis = 0; axis < 2; axis++) + m_ar_tb_interrupt[axis] = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(namcos22_state::adillor_trackball_interrupt),this)); +} + +static MACHINE_CONFIG_DERIVED( adillor, namcos22s ) + + /* basic machine hardware */ + MCFG_TIMER_DRIVER_ADD_PERIODIC("ar_tb_upd", namcos22_state, adillor_trackball_update, attotime::from_msec(20)) + + MCFG_MACHINE_START_OVERRIDE(namcos22_state,adillor) +MACHINE_CONFIG_END + /*********************************************************************************/ /* Namco System 22 */ @@ -3197,6 +3262,8 @@ ADDRESS_MAP_END static MACHINE_CONFIG_START( namcos22, namcos22_state ) + + /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68020,SS22_MASTER_CLOCK/2) /* 25 MHz? */ MCFG_CPU_PROGRAM_MAP(namcos22_am) MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos22_state, namcos22_interrupt) @@ -3220,6 +3287,8 @@ static MACHINE_CONFIG_START( namcos22, namcos22_state ) // MCFG_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE) MCFG_NVRAM_HANDLER(namcos22) + + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) MCFG_SCREEN_UPDATE_DRIVER(namcos22_state, screen_update_namcos22) @@ -5111,6 +5180,12 @@ static INPUT_PORTS_START( adillor ) PORT_START("MCUP5B") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0xfe, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("TRACKX") + PORT_BIT( 0xffff, 0x0000, IPT_TRACKBALL_X ) PORT_SENSITIVITY(100) PORT_KEYDELTA(200) PORT_RESET + + PORT_START("TRACKY") + PORT_BIT( 0xffff, 0x0000, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(100) PORT_KEYDELTA(200) PORT_RESET PORT_REVERSE INPUT_PORTS_END /* Armadillo Racing */ static INPUT_PORTS_START( propcycl ) @@ -5801,4 +5876,4 @@ GAME( 1996, tokyowar, 0, namcos22s, tokyowar, namcos22_state, tokyowar, GAME( 1996, aquajet, 0, namcos22s, aquajet, namcos22_state, aquajet, ROT0, "Namco", "Aqua Jet (Rev. AJ2 Ver.B)" , GAME_IMPERFECT_SOUND|GAME_IMPERFECT_GRAPHICS ) // 96/09/20 14:28:30 GAME( 1996, alpinr2b, 0, namcos22s, alpiner, namcos22_state, alpiner2, ROT0, "Namco", "Alpine Racer 2 (Rev. ARS2 Ver.B)" , GAME_IMPERFECT_SOUND|GAME_IMPERFECT_GRAPHICS ) // 97/01/10 17:10:59 GAME( 1996, alpinr2a, alpinr2b, namcos22s, alpiner, namcos22_state, alpiner2, ROT0, "Namco", "Alpine Racer 2 (Rev. ARS2 Ver.A)" , GAME_IMPERFECT_SOUND|GAME_IMPERFECT_GRAPHICS ) // 96/12/06 13:45:05 -GAME( 1996, adillor, 0, namcos22s, adillor, namcos22_state, adillor, ROT0, "Namco", "Armadillo Racing (Rev. AM1 Ver.A)" , GAME_IMPERFECT_SOUND|GAME_IMPERFECT_GRAPHICS|GAME_NOT_WORKING ) // 97/04/07 19:19:41. needs trackball hookup +GAME( 1996, adillor, 0, adillor, adillor, namcos22_state, adillor, ROT0, "Namco", "Armadillo Racing (Rev. AM1 Ver.A)" , GAME_IMPERFECT_SOUND|GAME_IMPERFECT_GRAPHICS ) // 97/04/07 19:19:41 diff --git a/src/mame/includes/namcos22.h b/src/mame/includes/namcos22.h index 5d81e8c1721..a32ea6fbe9c 100644 --- a/src/mame/includes/namcos22.h +++ b/src/mame/includes/namcos22.h @@ -76,7 +76,8 @@ public: optional_shared_ptr m_czram; int m_mbEnableDspIrqs; - + attotime m_ar_tb_reload[2]; + emu_timer *m_ar_tb_interrupt[2]; UINT16 m_mMasterBIOZ; UINT32 *m_mpPointRAM; UINT32 m_old_coin_state; @@ -254,6 +255,8 @@ public: DECLARE_DRIVER_INIT(alpinesa); TILE_GET_INFO_MEMBER(TextTilemapGetInfo); virtual void machine_reset(); + virtual void machine_start(); + DECLARE_MACHINE_START(adillor); DECLARE_VIDEO_START(namcos22s); DECLARE_VIDEO_START(namcos22); DECLARE_VIDEO_START(common); @@ -261,6 +264,8 @@ public: UINT32 screen_update_namcos22(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); INTERRUPT_GEN_MEMBER(namcos22s_interrupt); INTERRUPT_GEN_MEMBER(namcos22_interrupt); + TIMER_DEVICE_CALLBACK_MEMBER(adillor_trackball_update); + TIMER_CALLBACK_MEMBER(adillor_trackball_interrupt); TIMER_CALLBACK_MEMBER(alpine_steplock_callback); TIMER_DEVICE_CALLBACK_MEMBER(dsp_master_serial_irq); TIMER_DEVICE_CALLBACK_MEMBER(dsp_slave_serial_irq);