diff options
author | 2019-09-25 14:33:12 -0400 | |
---|---|---|
committer | 2019-09-25 14:33:12 -0400 | |
commit | 25ed9f53f67a9e912c2559c9ca79bd43011b7e90 (patch) | |
tree | c7ac3fe0da8012d08c3efcc44852f15b7c4b79e1 | |
parent | 90e360901c068fe1bcee9d2239c5989e5b113988 (diff) |
wgp: Read inputs through ADC device (nw)
-rw-r--r-- | src/mame/drivers/wgp.cpp | 104 | ||||
-rw-r--r-- | src/mame/includes/wgp.h | 10 |
2 files changed, 53 insertions, 61 deletions
diff --git a/src/mame/drivers/wgp.cpp b/src/mame/drivers/wgp.cpp index e60d4adf1ea..6d849bc8f0d 100644 --- a/src/mame/drivers/wgp.cpp +++ b/src/mame/drivers/wgp.cpp @@ -402,6 +402,7 @@ Stephh's notes (based on the game M68000 code and some tests) : #include "cpu/z80/z80.h" #include "cpu/m68000/m68000.h" +#include "machine/adc0808.h" #include "sound/2610intf.h" #include "screen.h" #include "speaker.h" @@ -442,9 +443,6 @@ void wgp_state::device_timer(emu_timer &timer, device_timer_id id, int param, vo case TIMER_INTERRUPT4: m_maincpu->set_input_line(4, HOLD_LINE); break; - case TIMER_INTERRUPT6: - m_maincpu->set_input_line(6, HOLD_LINE); - break; /* 68000 B */ case TIMER_CPUB_INTERRUPT6: m_subcpu->set_input_line(6, HOLD_LINE); /* assumes Z80 sandwiched between the 68Ks */ @@ -513,79 +511,63 @@ void wgp_state::rotate_port_w(offs_t offset, u16 data) } } +u8 wgp_state::accel_r() +{ + if (m_fake.read_safe(0) & 0x40) // pressing accel + return 0xff; + else + return 0x00; +} -#define STEER_PORT_TAG "STEER" -#define UNKNOWN_PORT_TAG "UNKNOWN" -#define FAKE_PORT_TAG "FAKE" - -u16 wgp_state::adinput_r(offs_t offset) +u8 wgp_state::steer_r() { int steer = 0x40; int fake = m_fake.read_safe(0); - if (!(fake & 0x10)) /* Analogue steer (the real control method) */ + if (!(fake & 0x10)) // Analogue steer (the real control method) { - /* Reduce span to 0x80 */ + // Reduce span to 0x80 steer = (m_steer.read_safe(0) * 0x80) / 0x100; } - else /* Digital steer */ + else // Digital steer { - if (fake & 0x08) /* pressing down */ + if (fake & 0x08) // pressing down steer = 0x20; - if (fake & 0x04) /* pressing up */ + if (fake & 0x04) // pressing up steer = 0x60; - if (fake & 0x02) /* pressing right */ + if (fake & 0x02) // pressing right steer = 0x00; - if (fake & 0x01) /* pressing left */ + if (fake & 0x01) // pressing left steer = 0x80; } - switch (offset) - { - case 0x00: - { - if (fake & 0x40) /* pressing accel */ - return 0xff; - else - return 0x00; - } - - case 0x01: - return steer; - - case 0x02: - return 0xc0; /* steer offset, correct acc. to service mode */ - - case 0x03: - return 0xbf; /* accel offset, correct acc. to service mode */ - - case 0x04: - { - if (fake & 0x80) /* pressing brake */ - return 0xcf; - else - return 0xff; - } - - case 0x05: - return m_unknown.read_safe(0); /* unknown */ - } + return steer; +} -logerror("CPU #0 PC %06x: warning - read unmapped a/d input offset %06x\n",m_maincpu->pc(),offset); +u8 wgp_state::steer_offset_r() +{ + return 0xc0; // steer offset, correct acc. to service mode +} - return 0xff; +u8 wgp_state::accel_offset_r() +{ + return 0xbf; // accel offset, correct acc. to service mode } -void wgp_state::adinput_w(u16 data) +u8 wgp_state::brake_r() { - /* Each write invites a new interrupt as soon as the - hardware has got the next a/d conversion ready. We set a token - delay of 10000 cycles although our inputs are always ready. */ + if (m_fake.read_safe(0) & 0x80) // pressing brake + return 0xcf; + else + return 0xff; +} - m_int6_timer->adjust(m_maincpu->cycles_to_attotime(10000)); +u8 wgp_state::unknown_r() +{ + return m_unknown.read_safe(0); // unknown } void wgp_state::coins_w(u8 data) @@ -617,7 +599,7 @@ void wgp_state::main_map(address_map &map) map(0x140000, 0x143fff).ram().share("sharedram"); map(0x180000, 0x18000f).rw(m_tc0220ioc, FUNC(tc0220ioc_device::read), FUNC(tc0220ioc_device::write)).umask16(0xff00); map(0x1c0000, 0x1c0001).w(FUNC(wgp_state::cpua_ctrl_w)); - map(0x200000, 0x20000f).rw(FUNC(wgp_state::adinput_r), FUNC(wgp_state::adinput_w)); + map(0x200000, 0x20000f).rw("adc", FUNC(adc0809_device::data_r), FUNC(adc0809_device::address_offset_start_w)).umask16(0x00ff); map(0x300000, 0x30ffff).rw(m_tc0100scn, FUNC(tc0100scn_device::ram_r), FUNC(tc0100scn_device::ram_w)); /* tilemaps */ map(0x320000, 0x32000f).rw(m_tc0100scn, FUNC(tc0100scn_device::ctrl_r), FUNC(tc0100scn_device::ctrl_w)); map(0x400000, 0x40bfff).ram().share("spritemap"); /* sprite tilemaps */ @@ -757,14 +739,14 @@ static INPUT_PORTS_START( wgp_no_joy_generic ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 ) - PORT_START(STEER_PORT_TAG) + PORT_START("STEER") PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_SENSITIVITY(20) PORT_KEYDELTA(25) PORT_REVERSE PORT_PLAYER(1) - PORT_START(UNKNOWN_PORT_TAG) + PORT_START("UNKNOWN") PORT_BIT( 0xff, 0x00, IPT_AD_STICK_Y ) PORT_SENSITIVITY(20) PORT_KEYDELTA(10) PORT_PLAYER(2) /* fake inputs, allowing digital steer etc. */ - PORT_START(FAKE_PORT_TAG) + PORT_START("FAKE") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_PLAYER(1) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_PLAYER(1) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_4WAY PORT_PLAYER(1) @@ -869,7 +851,6 @@ void wgp_state::machine_start() { m_z80bank->configure_entries(0, 4, memregion("audiocpu")->base(), 0x4000); - m_int6_timer = timer_alloc(TIMER_INTERRUPT6); m_cpub_int6_timer = timer_alloc(TIMER_CPUB_INTERRUPT6); save_item(NAME(m_cpua_ctrl)); @@ -900,6 +881,15 @@ void wgp_state::wgp(machine_config &config) m_tc0220ioc->write_4_callback().set(FUNC(wgp_state::coins_w)); m_tc0220ioc->read_7_callback().set_ioport("IN2"); + adc0809_device &adc(ADC0809(config, "adc", 16_MHz_XTAL / 32)); // TODO: verify divider + adc.eoc_ff_callback().set_inputline(m_maincpu, M68K_IRQ_6); + adc.in_callback<0>().set(FUNC(wgp_state::accel_r)); + adc.in_callback<1>().set(FUNC(wgp_state::steer_r)); + adc.in_callback<2>().set(FUNC(wgp_state::steer_offset_r)); + adc.in_callback<3>().set(FUNC(wgp_state::accel_offset_r)); + adc.in_callback<4>().set(FUNC(wgp_state::brake_r)); + adc.in_callback<5>().set(FUNC(wgp_state::unknown_r)); + /* video hardware */ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_refresh_hz(60); diff --git a/src/mame/includes/wgp.h b/src/mame/includes/wgp.h index a6b16d9ec51..7b6f64f5e1e 100644 --- a/src/mame/includes/wgp.h +++ b/src/mame/includes/wgp.h @@ -50,7 +50,6 @@ protected: enum { TIMER_INTERRUPT4, - TIMER_INTERRUPT6, TIMER_CPUB_INTERRUPT6 }; @@ -65,8 +64,12 @@ private: void cpua_ctrl_w(u16 data); u16 lan_status_r(); void rotate_port_w(offs_t offset, u16 data); - u16 adinput_r(offs_t offset); - void adinput_w(u16 data); + u8 accel_r(); + u8 steer_r(); + u8 steer_offset_r(); + u8 accel_offset_r(); + u8 brake_r(); + u8 unknown_r(); void sound_bankswitch_w(u8 data); void pivram_word_w(offs_t offset, u16 data, u16 mem_mask = ~0); void piv_ctrl_word_w(offs_t offset, u16 data, u16 mem_mask = ~0); @@ -106,7 +109,6 @@ private: /* misc */ u16 m_cpua_ctrl; u16 m_port_sel; - emu_timer *m_int6_timer; emu_timer *m_cpub_int6_timer; /* devices */ |