added armadillo trackball

This commit is contained in:
Michaël Banaan Ananas 2012-12-26 17:56:51 +00:00
parent 5952ee950c
commit 561c7ea8d1
2 changed files with 82 additions and 2 deletions

View File

@ -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

View File

@ -76,7 +76,8 @@ public:
optional_shared_ptr<UINT32> 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);