diff --git a/src/mame/miltonbradley/vectrex.cpp b/src/mame/miltonbradley/vectrex.cpp index 80a1b1de..2a558407 100644 --- a/src/mame/miltonbradley/vectrex.cpp +++ b/src/mame/miltonbradley/vectrex.cpp @@ -114,7 +114,7 @@ void vectrex_base_state::vectrex_base(machine_config &config) MC1408(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // mc1408.ic301 (also used for vector generation) AY8912(config, m_ay8912, 6_MHz_XTAL / 4); - m_ay8912->port_a_read_callback().set_ioport("BUTTONS"); + m_ay8912->port_a_read_callback().set(FUNC(vectrex_base_state::buttons_r)); m_ay8912->port_a_write_callback().set(FUNC(vectrex_base_state::psg_port_w)); m_ay8912->add_route(ALL_OUTPUTS, "speaker", 0.2); diff --git a/src/mame/miltonbradley/vectrex.h b/src/mame/miltonbradley/vectrex.h index 48c803ca..10efd4f6 100644 --- a/src/mame/miltonbradley/vectrex.h +++ b/src/mame/miltonbradley/vectrex.h @@ -62,6 +62,7 @@ protected: void update_vector(); uint8_t via_pb_r(); uint8_t via_pa_r(); + uint8_t buttons_r(); void via_pb_w(uint8_t data); void via_pa_w(uint8_t data); void via_ca2_w(int state); diff --git a/src/mame/miltonbradley/vectrex_m.cpp b/src/mame/miltonbradley/vectrex_m.cpp index e47e698b..27a50cbc 100644 --- a/src/mame/miltonbradley/vectrex_m.cpp +++ b/src/mame/miltonbradley/vectrex_m.cpp @@ -2,6 +2,8 @@ // copyright-holders:Mathis Rosenhauer #include "emu.h" + +#include #include "vectrex.h" #include "cpu/m6809/m6809.h" @@ -174,9 +176,32 @@ void vectrex_base_state::via_irq(int state) } +/* Game controllers and touch controls, set by the page once per browser frame. + Sticks are -127 to 127, up and right positive. A stick at 0 leaves the keys + in charge. Buttons: bits 0-3 controller 1, bits 4-7 controller 2. */ +static int8_t s_web_stick[4]; +static uint8_t s_web_buttons; + +extern "C" EMSCRIPTEN_KEEPALIVE void vectrex_web_input(int x1, int y1, int x2, int y2, int buttons) +{ + s_web_stick[0] = x1; + s_web_stick[1] = y1; + s_web_stick[2] = x2; + s_web_stick[3] = y2; + s_web_buttons = buttons; +} + + +uint8_t vectrex_base_state::buttons_r() +{ + return m_io_buttons->read() & ~s_web_buttons; +} + + uint8_t vectrex_base_state::via_pb_r() { - int pot = m_io_contr[(m_via_out[PORTB] & 0x6) >> 1]->read() - 0x80; + const int axis = (m_via_out[PORTB] & 0x6) >> 1; + int pot = s_web_stick[axis] ? s_web_stick[axis] : m_io_contr[axis]->read() - 0x80; if (pot > (signed char)m_via_out[PORTA]) m_via_out[PORTB] |= 0x20;