apple2, apple2e, apple2gs: Generic emulation of Game I/O connector. Joysticks are now slot devices.

mbc55x: Add Game I/O port
This commit is contained in:
AJR 2019-06-10 16:32:11 -04:00
parent c5be2b3fe8
commit 7e54e1263b
11 changed files with 671 additions and 248 deletions

View File

@ -2124,6 +2124,20 @@ if (BUSES["A2BUS"]~=null) then
}
end
---------------------------------------------------
--
--@src/devices/bus/a2gameio/gameio.h,BUSES["A2GAMEIO"] = true
---------------------------------------------------
if (BUSES["A2GAMEIO"]~=null) then
files {
MAME_DIR .. "src/devices/bus/a2gameio/gameio.cpp",
MAME_DIR .. "src/devices/bus/a2gameio/gameio.h",
MAME_DIR .. "src/devices/bus/a2gameio/joystick.cpp",
MAME_DIR .. "src/devices/bus/a2gameio/joystick.h",
}
end
---------------------------------------------------
--
--@src/devices/bus/nubus/nubus.h,BUSES["NUBUS"] = true

View File

@ -707,6 +707,7 @@ MACHINES["XC1700E"] = true
BUSES["A1BUS"] = true
BUSES["A2BUS"] = true
BUSES["A2GAMEIO"] = true
BUSES["A7800"] = true
BUSES["A800"] = true
BUSES["ABCBUS"] = true

View File

@ -0,0 +1,197 @@
// license:BSD-3-Clause
// copyright-holders:AJR
/*********************************************************************
Apple II Game I/O Connector
This 16-pin DIP socket is described in the Apple II Reference
Manual (January 1978) as "a means of connecting paddle controls,
lights and switches to the APPLE II for use in controlling video
games, etc." The connector provides for four analog "paddle"
input signals (0-150 resistance) which are converted to
digital pulses by a NE558 quad timer on the main board. The
connector also provides several digital switch inputs and
"annunciator" outputs, all LS/TTL compatible.
While pins 9 and 16 are unconnected on the Apple II, they provide
additional digital output and input pins respectively on the Sanyo
MBC-550/555 (which uses 74LS123 monostables instead of a NE558).
The Apple //gs also recognizes a switch input 3, though this is
placed on pin 9 of the internal connector rather than 16.
The Apple IIe, IIc and IIgs also have an external DE-9 connector
that carries a subset of the signals, excluding the annunciator
outputs and utility strobe (which the IIc and IIgs do not have).
**********************************************************************
____________
+5V 1 |* | 16 (SW3)
SW0 2 | | 15 AN0
SW1 3 | | 14 AN1
SW2 4 | | 13 AN2
/STB 5 | GAME I/O | 12 AN3
PDL0 6 | | 11 PDL3
PDL2 7 | | 10 PDL1
GND 8 | | 9 (AN4/SW3)
------------
---------------------------------
\ PDL0 PDL2 GND +5V SW1 /
\ (5) (4) (3) (2) (1) /
\ (9) (8) (7) (6) /
\ PDL3 PDL1 SW0 SW2 /
\_______________________/
*********************************************************************/
#include "emu.h"
#include "bus/a2gameio/gameio.h"
#include "bus/a2gameio/joystick.h"
//**************************************************************************
// CONNECTOR DEVICE IMPLEMENTATION
//**************************************************************************
// device type definition
DEFINE_DEVICE_TYPE(APPLE2_GAMEIO, apple2_gameio_device, "a2gameio", "Apple II Game I/O Connector")
apple2_gameio_device::apple2_gameio_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, APPLE2_GAMEIO, tag, owner, clock)
, device_slot_interface(mconfig, *this)
, m_intf(nullptr)
{
}
void apple2_gameio_device::default_options(device_slot_interface &slot)
{
slot.option_add("joy", APPLE2_JOYSTICK);
}
void apple2_gameio_device::device_config_complete()
{
m_intf = dynamic_cast<device_a2gameio_interface *>(get_card_device());
}
void apple2_gameio_device::device_start()
{
}
//**************************************************************************
// PASSTHROUGH HANDLERS
//**************************************************************************
u8 apple2_gameio_device::pdl0_r()
{
if (m_intf != nullptr)
return m_intf->pdl0_r();
return 0;
}
u8 apple2_gameio_device::pdl1_r()
{
if (m_intf != nullptr)
return m_intf->pdl1_r();
return 0;
}
u8 apple2_gameio_device::pdl2_r()
{
if (m_intf != nullptr)
return m_intf->pdl2_r();
return 0;
}
u8 apple2_gameio_device::pdl3_r()
{
if (m_intf != nullptr)
return m_intf->pdl3_r();
return 0;
}
READ_LINE_MEMBER(apple2_gameio_device::sw0_r)
{
if (m_intf != nullptr)
return m_intf->sw0_r();
return 1;
}
READ_LINE_MEMBER(apple2_gameio_device::sw1_r)
{
if (m_intf != nullptr)
return m_intf->sw1_r();
return 1;
}
READ_LINE_MEMBER(apple2_gameio_device::sw2_r)
{
if (m_intf != nullptr)
return m_intf->sw2_r();
return 1;
}
READ_LINE_MEMBER(apple2_gameio_device::sw3_r)
{
if (m_intf != nullptr)
return m_intf->sw3_r();
return 1;
}
WRITE_LINE_MEMBER(apple2_gameio_device::an0_w)
{
if (m_intf != nullptr)
m_intf->an0_w(state);
}
WRITE_LINE_MEMBER(apple2_gameio_device::an1_w)
{
if (m_intf != nullptr)
m_intf->an1_w(state);
}
WRITE_LINE_MEMBER(apple2_gameio_device::an2_w)
{
if (m_intf != nullptr)
m_intf->an2_w(state);
}
WRITE_LINE_MEMBER(apple2_gameio_device::an3_w)
{
if (m_intf != nullptr)
m_intf->an3_w(state);
}
WRITE_LINE_MEMBER(apple2_gameio_device::an4_w)
{
if (m_intf != nullptr)
m_intf->an4_w(state);
}
WRITE_LINE_MEMBER(apple2_gameio_device::strobe_w)
{
if (m_intf != nullptr)
m_intf->strobe_w(state);
}
//**************************************************************************
// GAME I/O DEVICE INTERFACE
//**************************************************************************
device_a2gameio_interface::device_a2gameio_interface(const machine_config &mconfig, device_t &device)
: device_slot_card_interface(mconfig, device)
{
}
device_a2gameio_interface::~device_a2gameio_interface()
{
}

View File

@ -0,0 +1,108 @@
// license:BSD-3-Clause
// copyright-holders:AJR
/*********************************************************************
Apple II Game I/O Connector
*********************************************************************/
#ifndef MAME_BUS_A2GAMEIO_GAMEIO_H
#define MAME_BUS_A2GAMEIO_GAMEIO_H 1
#pragma once
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// forward declaration
class device_a2gameio_interface;
// ======================> apple2_gameio_device
class apple2_gameio_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
apple2_gameio_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
template <typename T>
apple2_gameio_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt)
: apple2_gameio_device(mconfig, tag, owner, 0U)
{
option_reset();
opts(*this);
set_default_option(dflt);
set_fixed(false);
}
// standard options
static void default_options(device_slot_interface &slot);
// analog paddles
u8 pdl0_r();
u8 pdl1_r();
u8 pdl2_r();
u8 pdl3_r();
// digital switches
DECLARE_READ_LINE_MEMBER(sw0_r);
DECLARE_READ_LINE_MEMBER(sw1_r);
DECLARE_READ_LINE_MEMBER(sw2_r);
DECLARE_READ_LINE_MEMBER(sw3_r);
// annunciator outputs
DECLARE_WRITE_LINE_MEMBER(an0_w);
DECLARE_WRITE_LINE_MEMBER(an1_w);
DECLARE_WRITE_LINE_MEMBER(an2_w);
DECLARE_WRITE_LINE_MEMBER(an3_w);
DECLARE_WRITE_LINE_MEMBER(an4_w);
// utility strobe (active low)
DECLARE_WRITE_LINE_MEMBER(strobe_w);
protected:
// device-level overrides
virtual void device_config_complete() override;
virtual void device_start() override;
private:
// selected device
device_a2gameio_interface *m_intf;
};
// ======================> device_a2gameio_interface
class device_a2gameio_interface : public device_slot_card_interface
{
friend class apple2_gameio_device;
protected:
// construction/destruction
device_a2gameio_interface(const machine_config &mconfig, device_t &device);
virtual ~device_a2gameio_interface();
// optional input overrides
virtual u8 pdl0_r() { return 0; }
virtual u8 pdl1_r() { return 0; }
virtual u8 pdl2_r() { return 0; }
virtual u8 pdl3_r() { return 0; }
virtual DECLARE_READ_LINE_MEMBER(sw0_r) { return 1; }
virtual DECLARE_READ_LINE_MEMBER(sw1_r) { return 1; }
virtual DECLARE_READ_LINE_MEMBER(sw2_r) { return 1; }
virtual DECLARE_READ_LINE_MEMBER(sw3_r) { return 1; }
// optional output overrides
virtual DECLARE_WRITE_LINE_MEMBER(an0_w) { }
virtual DECLARE_WRITE_LINE_MEMBER(an1_w) { }
virtual DECLARE_WRITE_LINE_MEMBER(an2_w) { }
virtual DECLARE_WRITE_LINE_MEMBER(an3_w) { }
virtual DECLARE_WRITE_LINE_MEMBER(an4_w) { }
virtual DECLARE_WRITE_LINE_MEMBER(strobe_w) { }
};
// device type declaration
DECLARE_DEVICE_TYPE(APPLE2_GAMEIO, apple2_gameio_device)
#endif // MAME_BUS_A2GAMEIO_GAMEIO_H

View File

@ -0,0 +1,133 @@
// license:BSD-3-Clause
// copyright-holders:R. Belmont
/*********************************************************************
Apple II analog joysticks
*********************************************************************/
#include "emu.h"
#include "bus/a2gameio/joystick.h"
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
// device type definition
DEFINE_DEVICE_TYPE(APPLE2_JOYSTICK, apple2_joystick_device, "a2joy", "Apple II analog joysticks")
//**************************************************************************
// PARAMETERS
//**************************************************************************
#define JOYSTICK_DELTA 80
#define JOYSTICK_SENSITIVITY 50
#define JOYSTICK_AUTOCENTER 80
//**************************************************************************
// INPUT PORTS
//**************************************************************************
static INPUT_PORTS_START( apple2_joystick )
PORT_START("joystick_1_x") /* Joystick 1 X Axis */
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X) PORT_NAME("P1 Joystick X")
PORT_SENSITIVITY(JOYSTICK_SENSITIVITY)
PORT_KEYDELTA(JOYSTICK_DELTA)
PORT_CENTERDELTA(JOYSTICK_AUTOCENTER)
PORT_MINMAX(0,0xff) PORT_PLAYER(1)
PORT_CODE_DEC(KEYCODE_4_PAD) PORT_CODE_INC(KEYCODE_6_PAD)
PORT_CODE_DEC(JOYCODE_X_LEFT_SWITCH) PORT_CODE_INC(JOYCODE_X_RIGHT_SWITCH)
PORT_START("joystick_1_y") /* Joystick 1 Y Axis */
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y) PORT_NAME("P1 Joystick Y")
PORT_SENSITIVITY(JOYSTICK_SENSITIVITY)
PORT_KEYDELTA(JOYSTICK_DELTA)
PORT_CENTERDELTA(JOYSTICK_AUTOCENTER)
PORT_MINMAX(0,0xff) PORT_PLAYER(1)
PORT_CODE_DEC(KEYCODE_8_PAD) PORT_CODE_INC(KEYCODE_2_PAD)
PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH) PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH)
PORT_START("joystick_2_x") /* Joystick 2 X Axis */
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X) PORT_NAME("P2 Joystick X")
PORT_SENSITIVITY(JOYSTICK_SENSITIVITY)
PORT_KEYDELTA(JOYSTICK_DELTA)
PORT_CENTERDELTA(JOYSTICK_AUTOCENTER)
PORT_MINMAX(0,0xff) PORT_PLAYER(2)
PORT_CODE_DEC(JOYCODE_X_LEFT_SWITCH) PORT_CODE_INC(JOYCODE_X_RIGHT_SWITCH)
PORT_START("joystick_2_y") /* Joystick 2 Y Axis */
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y) PORT_NAME("P2 Joystick Y")
PORT_SENSITIVITY(JOYSTICK_SENSITIVITY)
PORT_KEYDELTA(JOYSTICK_DELTA)
PORT_CENTERDELTA(JOYSTICK_AUTOCENTER)
PORT_MINMAX(0,0xff) PORT_PLAYER(2)
PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH) PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH)
PORT_START("joystick_buttons")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(1) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(JOYCODE_BUTTON1)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_PLAYER(1) PORT_CODE(KEYCODE_ENTER_PAD)PORT_CODE(JOYCODE_BUTTON2)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(2) PORT_CODE(JOYCODE_BUTTON1)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_PLAYER(2) PORT_CODE(JOYCODE_BUTTON2)
INPUT_PORTS_END
//**************************************************************************
// DEVICE IMPLEMENTATION
//**************************************************************************
apple2_joystick_device::apple2_joystick_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, APPLE2_JOYSTICK, tag, owner, clock)
, device_a2gameio_interface(mconfig, *this)
, m_joy_x(*this, "joystick_%u_x", 1U)
, m_joy_y(*this, "joystick_%u_y", 1U)
, m_buttons(*this, "joystick_buttons")
{
}
ioport_constructor apple2_joystick_device::device_input_ports() const
{
return INPUT_PORTS_NAME(apple2_joystick);
}
void apple2_joystick_device::device_start()
{
}
u8 apple2_joystick_device::pdl0_r()
{
return m_joy_x[0]->read();
}
u8 apple2_joystick_device::pdl1_r()
{
return m_joy_y[0]->read();
}
u8 apple2_joystick_device::pdl2_r()
{
return m_joy_x[1]->read();
}
u8 apple2_joystick_device::pdl3_r()
{
return m_joy_x[1]->read();
}
READ_LINE_MEMBER(apple2_joystick_device::sw0_r)
{
return BIT(m_buttons->read(), 4);
}
READ_LINE_MEMBER(apple2_joystick_device::sw1_r)
{
return BIT(m_buttons->read(), 5);
}
READ_LINE_MEMBER(apple2_joystick_device::sw2_r)
{
return BIT(m_buttons->read(), 6);
}
READ_LINE_MEMBER(apple2_joystick_device::sw3_r)
{
return BIT(m_buttons->read(), 7);
}

View File

@ -0,0 +1,49 @@
// license:BSD-3-Clause
// copyright-holders:R. Belmont
/*********************************************************************
Apple II analog joysticks
*********************************************************************/
#ifndef MAME_BUS_A2GAMEIO_JOYSTICK_H
#define MAME_BUS_A2GAMEIO_JOYSTICK_H 1
#pragma once
#include "bus/a2gameio/gameio.h"
// ======================> apple2_joystick_device
class apple2_joystick_device : public device_t, public device_a2gameio_interface
{
public:
// construction/destruction
apple2_joystick_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
// device-level overrides
virtual ioport_constructor device_input_ports() const override;
virtual void device_start() override;
// device_a2gameio_interface overrides
virtual u8 pdl0_r() override;
virtual u8 pdl1_r() override;
virtual u8 pdl2_r() override;
virtual u8 pdl3_r() override;
virtual DECLARE_READ_LINE_MEMBER(sw0_r) override;
virtual DECLARE_READ_LINE_MEMBER(sw1_r) override;
virtual DECLARE_READ_LINE_MEMBER(sw2_r) override;
virtual DECLARE_READ_LINE_MEMBER(sw3_r) override;
private:
// input ports
required_ioport_array<2> m_joy_x;
required_ioport_array<2> m_joy_y;
required_ioport m_buttons;
};
// device type declaration
DECLARE_DEVICE_TYPE(APPLE2_JOYSTICK, apple2_joystick_device)
#endif // MAME_BUS_A2GAMEIO_JOYSTICK_H

View File

@ -87,6 +87,8 @@ II Plus: RAM options reduced to 16/32/48 KB.
#include "bus/a2bus/ssprite.h"
#include "bus/a2bus/ssbapple.h"
#include "bus/a2gameio/gameio.h"
#include "screen.h"
#include "softlist.h"
#include "speaker.h"
@ -114,11 +116,7 @@ public:
m_video(*this, A2_VIDEO_TAG),
m_a2common(*this, "a2common"),
m_a2bus(*this, "a2bus"),
m_joy1x(*this, "joystick_1_x"),
m_joy1y(*this, "joystick_1_y"),
m_joy2x(*this, "joystick_2_x"),
m_joy2y(*this, "joystick_2_y"),
m_joybuttons(*this, "joystick_buttons"),
m_gameio(*this, "gameio"),
m_kbspecial(*this, "keyb_special"),
m_kbrepeat(*this, "keyb_repeat"),
m_resetdip(*this, "reset_dip"),
@ -137,7 +135,7 @@ public:
required_device<a2_video_device> m_video;
required_device<apple2_common_device> m_a2common;
required_device<a2bus_device> m_a2bus;
required_ioport m_joy1x, m_joy1y, m_joy2x, m_joy2y, m_joybuttons;
required_device<apple2_gameio_device> m_gameio;
required_ioport m_kbspecial;
required_ioport m_kbrepeat;
optional_ioport m_resetdip;
@ -175,10 +173,7 @@ public:
DECLARE_WRITE_LINE_MEMBER(mix_w);
DECLARE_WRITE_LINE_MEMBER(scr_w);
DECLARE_WRITE_LINE_MEMBER(res_w);
DECLARE_WRITE_LINE_MEMBER(an0_w);
DECLARE_WRITE_LINE_MEMBER(an1_w);
DECLARE_WRITE_LINE_MEMBER(an2_w);
DECLARE_WRITE_LINE_MEMBER(an3_w);
DECLARE_READ8_MEMBER(c080_r);
DECLARE_WRITE8_MEMBER(c080_w);
DECLARE_READ8_MEMBER(c100_r);
@ -219,7 +214,6 @@ private:
int m_cnxx_slot;
bool m_page2;
bool m_an0, m_an1, m_an2, m_an3;
uint8_t *m_ram_ptr;
int m_ram_size;
@ -352,10 +346,6 @@ void apple2_state::machine_start()
save_item(NAME(m_inh_bank));
save_item(NAME(m_cnxx_slot));
save_item(NAME(m_page2));
save_item(NAME(m_an0));
save_item(NAME(m_an1));
save_item(NAME(m_an2));
save_item(NAME(m_an3));
save_item(NAME(m_anykeydown));
// setup video pointers
@ -370,7 +360,6 @@ void apple2_state::machine_reset()
m_inh_slot = 0;
m_cnxx_slot = -1;
m_page2 = false;
m_an0 = m_an1 = m_an2 = m_an3 = false;
m_anykeydown = false;
}
@ -553,27 +542,11 @@ WRITE_LINE_MEMBER(apple2_state::res_w)
m_video->m_hires = state;
}
WRITE_LINE_MEMBER(apple2_state::an0_w)
{
m_an0 = state;
}
WRITE_LINE_MEMBER(apple2_state::an1_w)
{
m_an1 = state;
}
WRITE_LINE_MEMBER(apple2_state::an2_w)
{
m_an2 = state;
m_video->m_an2 = state;
}
WRITE_LINE_MEMBER(apple2_state::an3_w)
{
m_an3 = state;
}
READ8_MEMBER(apple2_state::keyb_data_r)
{
// keyboard latch
@ -630,7 +603,9 @@ READ8_MEMBER(apple2_state::utility_strobe_r)
WRITE8_MEMBER(apple2_state::utility_strobe_w)
{
// pulses pin 5 of game I/O connector
// low pulse on pin 5 of game I/O connector
m_gameio->strobe_w(0);
m_gameio->strobe_w(1);
}
READ8_MEMBER(apple2_state::switches_r)
@ -651,18 +626,18 @@ READ8_MEMBER(apple2_state::flags_r)
return (m_cassette->input() > 0.0 ? 0x80 : 0) | uFloatingBus7;
case 1: // button 0
return ((m_joybuttons->read() & 0x10) ? 0x80 : 0) | uFloatingBus7;
return (m_gameio->sw0_r() ? 0x80 : 0) | uFloatingBus7;
case 2: // button 1
return ((m_joybuttons->read() & 0x20) ? 0x80 : 0) | uFloatingBus7;
return (m_gameio->sw1_r() ? 0x80 : 0) | uFloatingBus7;
case 3: // button 2
// check if SHIFT key mod configured
if (m_sysconfig->read() & 0x04)
{
return (((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0) | uFloatingBus7;
return ((m_gameio->sw2_r() || (m_kbspecial->read() & 0x06)) ? 0x80 : 0) | uFloatingBus7;
}
return ((m_joybuttons->read() & 0x40) ? 0x80 : 0) | (read_floatingbus() & 0x7f);
return (m_gameio->sw2_r() ? 0x80 : 0) | (read_floatingbus() & 0x7f);
case 4: // joy 1 X axis
return ((machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0) | uFloatingBus7;
@ -690,10 +665,10 @@ READ8_MEMBER(apple2_state::controller_strobe_r)
WRITE8_MEMBER(apple2_state::controller_strobe_w)
{
m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_joy1x->read();
m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_joy1y->read();
m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_joy2x->read();
m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_joy2y->read();
m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl0_r();
m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl1_r();
m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl2_r();
m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl3_r();
}
READ8_MEMBER(apple2_state::c080_r)
@ -1116,51 +1091,6 @@ TIMER_DEVICE_CALLBACK_MEMBER(apple2_state::ay3600_repeat)
INPUT PORTS
***************************************************************************/
static INPUT_PORTS_START( apple2_joystick )
PORT_START("joystick_1_x") /* Joystick 1 X Axis */
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X) PORT_NAME("P1 Joystick X")
PORT_SENSITIVITY(JOYSTICK_SENSITIVITY)
PORT_KEYDELTA(JOYSTICK_DELTA)
PORT_CENTERDELTA(JOYSTICK_AUTOCENTER)
PORT_MINMAX(0,0xff) PORT_PLAYER(1)
PORT_CODE_DEC(KEYCODE_4_PAD) PORT_CODE_INC(KEYCODE_6_PAD)
PORT_CODE_DEC(JOYCODE_X_LEFT_SWITCH) PORT_CODE_INC(JOYCODE_X_RIGHT_SWITCH)
PORT_START("joystick_1_y") /* Joystick 1 Y Axis */
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y) PORT_NAME("P1 Joystick Y")
PORT_SENSITIVITY(JOYSTICK_SENSITIVITY)
PORT_KEYDELTA(JOYSTICK_DELTA)
PORT_CENTERDELTA(JOYSTICK_AUTOCENTER)
PORT_MINMAX(0,0xff) PORT_PLAYER(1)
PORT_CODE_DEC(KEYCODE_8_PAD) PORT_CODE_INC(KEYCODE_2_PAD)
PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH) PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH)
PORT_START("joystick_2_x") /* Joystick 2 X Axis */
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X) PORT_NAME("P2 Joystick X")
PORT_SENSITIVITY(JOYSTICK_SENSITIVITY)
PORT_KEYDELTA(JOYSTICK_DELTA)
PORT_CENTERDELTA(JOYSTICK_AUTOCENTER)
PORT_MINMAX(0,0xff) PORT_PLAYER(2)
PORT_CODE_DEC(JOYCODE_X_LEFT_SWITCH) PORT_CODE_INC(JOYCODE_X_RIGHT_SWITCH)
PORT_START("joystick_2_y") /* Joystick 2 Y Axis */
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y) PORT_NAME("P2 Joystick Y")
PORT_SENSITIVITY(JOYSTICK_SENSITIVITY)
PORT_KEYDELTA(JOYSTICK_DELTA)
PORT_CENTERDELTA(JOYSTICK_AUTOCENTER)
PORT_MINMAX(0,0xff) PORT_PLAYER(2)
PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH) PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH)
PORT_START("joystick_buttons")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(1) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(JOYCODE_BUTTON1)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_PLAYER(1) PORT_CODE(KEYCODE_ENTER_PAD)PORT_CODE(JOYCODE_BUTTON2)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(2) PORT_CODE(JOYCODE_BUTTON1)
INPUT_PORTS_END
INPUT_PORTS_START( apple2_gameport )
PORT_INCLUDE( apple2_joystick )
INPUT_PORTS_END
INPUT_PORTS_START( apple2_sysconfig )
PORT_START("a2_config")
PORT_CONFNAME(0x03, 0x00, "Composite monitor type")
@ -1317,9 +1247,6 @@ static INPUT_PORTS_START( apple2 )
PORT_START("keyb_repeat")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("REPT") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\')
/* other devices */
PORT_INCLUDE( apple2_gameport )
PORT_INCLUDE(apple2_sysconfig)
INPUT_PORTS_END
@ -1419,10 +1346,13 @@ void apple2_state::apple2_common(machine_config &config)
m_softlatch->q_out_cb<1>().set(FUNC(apple2_state::mix_w));
m_softlatch->q_out_cb<2>().set(FUNC(apple2_state::scr_w));
m_softlatch->q_out_cb<3>().set(FUNC(apple2_state::res_w));
m_softlatch->q_out_cb<4>().set(FUNC(apple2_state::an0_w));
m_softlatch->q_out_cb<5>().set(FUNC(apple2_state::an1_w));
m_softlatch->q_out_cb<6>().set(FUNC(apple2_state::an2_w));
m_softlatch->q_out_cb<7>().set(FUNC(apple2_state::an3_w));
m_softlatch->q_out_cb<4>().set(m_gameio, FUNC(apple2_gameio_device::an0_w));
m_softlatch->q_out_cb<5>().set(m_gameio, FUNC(apple2_gameio_device::an1_w));
m_softlatch->q_out_cb<6>().set(m_gameio, FUNC(apple2_gameio_device::an2_w));
m_softlatch->q_out_cb<6>().append(FUNC(apple2_state::an2_w));
m_softlatch->q_out_cb<7>().set(m_gameio, FUNC(apple2_gameio_device::an3_w));
APPLE2_GAMEIO(config, m_gameio, apple2_gameio_device::default_options, nullptr);
/* keyboard controller */
AY3600(config, m_ay3600, 0);

View File

@ -156,6 +156,8 @@ Address bus A0-A11 is Y0-Y11
#include "bus/a2bus/transwarp.h"
#include "bus/a2bus/a2vulcan.h"
#include "bus/a2gameio/gameio.h"
#include "bus/rs232/rs232.h"
#include "screen.h"
@ -220,11 +222,7 @@ public:
m_video(*this, A2_VIDEO_TAG),
m_a2bus(*this, A2_BUS_TAG),
m_a2eauxslot(*this, A2_AUXSLOT_TAG),
m_joy1x(*this, "joystick_1_x"),
m_joy1y(*this, "joystick_1_y"),
m_joy2x(*this, "joystick_2_x"),
m_joy2y(*this, "joystick_2_y"),
m_joybuttons(*this, "joystick_buttons"),
m_gameio(*this, "gameio"),
m_mouseb(*this, MOUSE_BUTTON_TAG),
m_mousex(*this, MOUSE_XAXIS_TAG),
m_mousey(*this, MOUSE_YAXIS_TAG),
@ -263,7 +261,7 @@ public:
required_device<a2_video_device> m_video;
required_device<a2bus_device> m_a2bus;
optional_device<a2eauxslot_device> m_a2eauxslot;
required_ioport m_joy1x, m_joy1y, m_joy2x, m_joy2y, m_joybuttons;
required_device<apple2_gameio_device> m_gameio;
optional_ioport m_mouseb, m_mousex, m_mousey;
optional_memory_region m_kbdrom;
required_ioport m_kbspecial;
@ -977,6 +975,10 @@ void apple2e_state::machine_reset()
m_video->m_monohgr = false;
if(m_iscecm) m_video->m_monohgr = true;
m_an0 = m_an1 = m_an2 = m_an3 = false;
m_gameio->an0_w(0);
m_gameio->an1_w(0);
m_gameio->an2_w(0);
m_gameio->an3_w(0);
m_vbl = m_vblmask = false;
m_slotc3rom = false;
m_romswitch = false;
@ -1534,6 +1536,14 @@ void apple2e_state::do_io(int offset, bool is_iic)
}
break;
case 0x40: // utility strobe (not available on IIc)
if (!is_iic)
{
m_gameio->strobe_w(0);
m_gameio->strobe_w(1);
}
break;
case 0x48: // (IIc only) clear mouse X/Y interrupt flags
m_xirq = m_yirq = false;
lower_irq(IRQ_MOUSEXY);
@ -1595,28 +1605,44 @@ void apple2e_state::do_io(int offset, bool is_iic)
break;
case 0x58: // AN0 off
m_an0 = false; break;
m_an0 = false;
m_gameio->an0_w(0);
break;
case 0x59: // AN0 on
m_an0 = true; break;
m_an0 = true;
m_gameio->an0_w(1);
break;
case 0x5a: // AN1 off
m_an1 = false; break;
m_an1 = false;
m_gameio->an1_w(0);
break;
case 0x5b: // AN1 on
m_an1 = true; break;
m_an1 = true;
m_gameio->an1_w(1);
break;
case 0x5c: // AN2 off
m_an2 = false; break;
m_an2 = false;
m_gameio->an2_w(0);
break;
case 0x5d: // AN2 on
m_an2 = true; break;
m_an2 = true;
m_gameio->an2_w(1);
break;
case 0x5e: // AN3 off
m_an3 = false; break;
m_an3 = false;
m_gameio->an3_w(0);
break;
case 0x5f: // AN3 on
m_an3 = true; break;
m_an3 = true;
m_gameio->an3_w(1);
break;
case 0x68: // IIgs STATE register, which ProDOS touches
break;
@ -1630,10 +1656,10 @@ void apple2e_state::do_io(int offset, bool is_iic)
lower_irq(IRQ_VBL);
}
m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_joy1x->read();
m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_joy1y->read();
m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_joy2x->read();
m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_joy2y->read();
m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl0_r();
m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl1_r();
m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl2_r();
m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl3_r();
break;
default:
@ -1716,15 +1742,15 @@ READ8_MEMBER(apple2e_state::c000_r)
case 0x61: // button 0 or Open Apple
case 0x69:
return (((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0) | uFloatingBus7;
return ((m_gameio->sw0_r() || (m_kbspecial->read() & 0x10)) ? 0x80 : 0) | uFloatingBus7;
case 0x62: // button 1 or Solid Apple
case 0x6a:
return (((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0) | uFloatingBus7;
return ((m_gameio->sw1_r() || (m_kbspecial->read() & 0x20)) ? 0x80 : 0) | uFloatingBus7;
case 0x63: // button 2 or SHIFT key
case 0x6b:
return (((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0) | uFloatingBus7;
return ((m_gameio->sw2_r() || (m_kbspecial->read() & 0x06)) ? 0x80 : 0) | uFloatingBus7;
case 0x64: // joy 1 X axis
case 0x6c:
@ -1967,11 +1993,11 @@ READ8_MEMBER(apple2e_state::c000_iic_r)
case 0x61: // button 0 or Open Apple or mouse button 1
case 0x69:
return (((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0) | uFloatingBus7;
return ((m_gameio->sw0_r() || (m_kbspecial->read() & 0x10)) ? 0x80 : 0) | uFloatingBus7;
case 0x62: // button 1 or Solid Apple
case 0x6a:
return (((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0) | uFloatingBus7;
return ((m_gameio->sw1_r() || (m_kbspecial->read() & 0x20)) ? 0x80 : 0) | uFloatingBus7;
case 0x63: // mouse button 2 (no other function on IIc)
case 0x6b:
@ -3125,51 +3151,6 @@ TIMER_DEVICE_CALLBACK_MEMBER(apple2e_state::ay3600_repeat)
INPUT PORTS
***************************************************************************/
static INPUT_PORTS_START( apple2_joystick )
PORT_START("joystick_1_x") /* Joystick 1 X Axis */
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X) PORT_NAME("P1 Joystick X")
PORT_SENSITIVITY(JOYSTICK_SENSITIVITY)
PORT_KEYDELTA(JOYSTICK_DELTA)
PORT_CENTERDELTA(JOYSTICK_AUTOCENTER)
PORT_MINMAX(0,0xff) PORT_PLAYER(1)
PORT_CODE_DEC(KEYCODE_4_PAD) PORT_CODE_INC(KEYCODE_6_PAD)
PORT_CODE_DEC(JOYCODE_X_LEFT_SWITCH) PORT_CODE_INC(JOYCODE_X_RIGHT_SWITCH)
PORT_START("joystick_1_y") /* Joystick 1 Y Axis */
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y) PORT_NAME("P1 Joystick Y")
PORT_SENSITIVITY(JOYSTICK_SENSITIVITY)
PORT_KEYDELTA(JOYSTICK_DELTA)
PORT_CENTERDELTA(JOYSTICK_AUTOCENTER)
PORT_MINMAX(0,0xff) PORT_PLAYER(1)
PORT_CODE_DEC(KEYCODE_8_PAD) PORT_CODE_INC(KEYCODE_2_PAD)
PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH) PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH)
PORT_START("joystick_2_x") /* Joystick 2 X Axis */
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X) PORT_NAME("P2 Joystick X")
PORT_SENSITIVITY(JOYSTICK_SENSITIVITY)
PORT_KEYDELTA(JOYSTICK_DELTA)
PORT_CENTERDELTA(JOYSTICK_AUTOCENTER)
PORT_MINMAX(0,0xff) PORT_PLAYER(2)
PORT_CODE_DEC(JOYCODE_X_LEFT_SWITCH) PORT_CODE_INC(JOYCODE_X_RIGHT_SWITCH)
PORT_START("joystick_2_y") /* Joystick 2 Y Axis */
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y) PORT_NAME("P2 Joystick Y")
PORT_SENSITIVITY(JOYSTICK_SENSITIVITY)
PORT_KEYDELTA(JOYSTICK_DELTA)
PORT_CENTERDELTA(JOYSTICK_AUTOCENTER)
PORT_MINMAX(0,0xff) PORT_PLAYER(2)
PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH) PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH)
PORT_START("joystick_buttons")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(1) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(JOYCODE_BUTTON1)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_PLAYER(1) PORT_CODE(KEYCODE_ENTER_PAD)PORT_CODE(JOYCODE_BUTTON2)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(2) PORT_CODE(JOYCODE_BUTTON1)
INPUT_PORTS_END
static INPUT_PORTS_START( apple2_gameport )
PORT_INCLUDE( apple2_joystick )
INPUT_PORTS_END
static INPUT_PORTS_START( apple2_sysconfig )
PORT_START("a2_config")
PORT_CONFNAME(0x03, 0x00, "Composite monitor type")
@ -3470,7 +3451,7 @@ static INPUT_PORTS_START( ceci )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET") PORT_CODE(KEYCODE_F12)
PORT_INCLUDE( apple2_gameport )
PORT_INCLUDE( apple2_sysconfig )
INPUT_PORTS_END
@ -3583,7 +3564,7 @@ static INPUT_PORTS_START( cece )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET") PORT_CODE(KEYCODE_F12)
PORT_INCLUDE( apple2_gameport )
PORT_INCLUDE( apple2_sysconfig )
INPUT_PORTS_END
@ -3696,7 +3677,7 @@ static INPUT_PORTS_START( cecg )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET") PORT_CODE(KEYCODE_F12)
PORT_INCLUDE( apple2_gameport )
PORT_INCLUDE( apple2_sysconfig )
INPUT_PORTS_END
@ -3809,7 +3790,7 @@ static INPUT_PORTS_START( cecm )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET") PORT_CODE(KEYCODE_F12)
PORT_INCLUDE( apple2_gameport )
PORT_INCLUDE( apple2_sysconfig )
INPUT_PORTS_END
@ -3922,19 +3903,17 @@ static INPUT_PORTS_START( cec2000 )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET") PORT_CODE(KEYCODE_F12)
PORT_INCLUDE( apple2_gameport )
PORT_INCLUDE( apple2_sysconfig )
INPUT_PORTS_END
static INPUT_PORTS_START( apple2e )
PORT_INCLUDE( apple2e_common )
PORT_INCLUDE( apple2_gameport )
PORT_INCLUDE( apple2_sysconfig )
INPUT_PORTS_END
static INPUT_PORTS_START( apple2c )
PORT_INCLUDE( apple2e_common )
PORT_INCLUDE( apple2_gameport )
PORT_INCLUDE( apple2c_sysconfig )
PORT_START(MOUSE_BUTTON_TAG) /* Mouse - button */
@ -4065,7 +4044,6 @@ static INPUT_PORTS_START( apple2euk )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Solid Apple") PORT_CODE(KEYCODE_RALT)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET") PORT_CODE(KEYCODE_F12)
PORT_INCLUDE( apple2_gameport )
PORT_INCLUDE(apple2_sysconfig)
INPUT_PORTS_END
@ -4187,7 +4165,6 @@ static INPUT_PORTS_START( apple2ees )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Solid Apple") PORT_CODE(KEYCODE_RALT)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET") PORT_CODE(KEYCODE_F12)
PORT_INCLUDE( apple2_gameport )
PORT_INCLUDE(apple2_sysconfig)
INPUT_PORTS_END
@ -4309,7 +4286,6 @@ static INPUT_PORTS_START( apple2efr ) // French AZERTY keyboard (Apple uses th
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Solid Apple") PORT_CODE(KEYCODE_RALT)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET") PORT_CODE(KEYCODE_F12)
PORT_INCLUDE( apple2_gameport )
PORT_INCLUDE(apple2_sysconfig)
INPUT_PORTS_END
@ -4431,7 +4407,6 @@ INPUT_PORTS_START( apple2ep )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Solid Apple") PORT_CODE(KEYCODE_RALT)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET") PORT_CODE(KEYCODE_F12)
PORT_INCLUDE( apple2_gameport )
PORT_INCLUDE(apple2_sysconfig)
INPUT_PORTS_END
@ -4602,6 +4577,8 @@ void apple2e_state::apple2e(machine_config &config)
m_a2eauxslot->out_nmi_callback().set(FUNC(apple2e_state::a2bus_nmi_w));
A2EAUXSLOT_SLOT(config, "aux", m_a2eauxslot, apple2eaux_cards, "ext80");
APPLE2_GAMEIO(config, m_gameio, apple2_gameio_device::default_options, nullptr);
/* softlist config for baseline A2E
By default, filter lists where possible to compatible disks for A2E */
SOFTWARE_LIST(config, "flop525_clean").set_original("apple2_flop_clcracked");

View File

@ -89,6 +89,8 @@
#include "bus/a2bus/a2vulcan.h"
//#include "bus/a2bus/pc_xporter.h"
#include "bus/a2gameio/gameio.h"
// various timing standards
#define A2GS_MASTER_CLOCK (XTAL(28'636'363))
#define A2GS_14M (A2GS_MASTER_CLOCK/2)
@ -161,11 +163,7 @@ public:
m_video(*this, A2GS_VIDEO_TAG),
m_a2bus(*this, A2GS_BUS_TAG),
m_a2common(*this, "a2common"),
m_joy1x(*this, "joystick_1_x"),
m_joy1y(*this, "joystick_1_y"),
m_joy2x(*this, "joystick_2_x"),
m_joy2y(*this, "joystick_2_y"),
m_joybuttons(*this, "joystick_buttons"),
m_gameio(*this, "gameio"),
m_speaker(*this, A2GS_SPEAKER_TAG),
m_upperbank(*this, A2GS_UPPERBANK_TAG),
m_upperaux(*this, A2GS_AUXUPPER_TAG),
@ -219,7 +217,7 @@ public:
required_device<a2_video_device> m_video;
required_device<a2bus_device> m_a2bus;
required_device<apple2_common_device> m_a2common;
required_ioport m_joy1x, m_joy1y, m_joy2x, m_joy2y, m_joybuttons;
required_device<apple2_gameio_device> m_gameio;
required_device<speaker_sound_device> m_speaker;
required_device<address_map_bank_device> m_upperbank, m_upperaux, m_upper00, m_upper01;
required_device<address_map_bank_device> m_c100bank, m_c300bank, m_c400bank, m_c800bank;
@ -1339,6 +1337,10 @@ void apple2gs_state::machine_reset()
m_page2 = false;
m_video->m_page2 = false;
m_an0 = m_an1 = m_an2 = m_an3 = false;
m_gameio->an0_w(0);
m_gameio->an1_w(0);
m_gameio->an2_w(0);
m_gameio->an3_w(0);
m_vbl = false;
m_slotc3rom = false;
m_irqmask = 0;
@ -1868,28 +1870,44 @@ void apple2gs_state::do_io(address_space &space, int offset)
break;
case 0x58: // AN0 off
m_an0 = false; break;
m_an0 = false;
m_gameio->an0_w(0);
break;
case 0x59: // AN0 on
m_an0 = true; break;
m_an0 = true;
m_gameio->an0_w(1);
break;
case 0x5a: // AN1 off
m_an1 = false; break;
m_an1 = false;
m_gameio->an1_w(0);
break;
case 0x5b: // AN1 on
m_an1 = true; break;
m_an1 = true;
m_gameio->an1_w(1);
break;
case 0x5c: // AN2 off
m_an2 = false; break;
m_an2 = false;
m_gameio->an2_w(0);
break;
case 0x5d: // AN2 on
m_an2 = true; break;
m_an2 = true;
m_gameio->an2_w(1);
break;
case 0x5e: // AN3 off
m_an3 = false; break;
m_an3 = false;
m_gameio->an3_w(0);
break;
case 0x5f: // AN3 on
m_an3 = true; break;
m_an3 = true;
m_gameio->an3_w(1);
break;
case 0x68: // STATE
break;
@ -1897,10 +1915,10 @@ void apple2gs_state::do_io(address_space &space, int offset)
// trigger joypad read
case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77:
case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f:
m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_joy1x->read();
m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_joy1y->read();
m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_joy2x->read();
m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_joy2y->read();
m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl0_r();
m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl1_r();
m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl2_r();
m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl3_r();
break;
default:
@ -2285,16 +2303,16 @@ READ8_MEMBER(apple2gs_state::c000_r)
return (m_an3 ? INTFLAG_AN3 : 0x00) | m_intflag;
case 0x60: // button 3 on IIgs
return (m_joybuttons->read() & 0x80) | uFloatingBus7;
return m_gameio->sw3_r() | uFloatingBus7;
case 0x61: // button 0 or Open Apple
return (((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0) | uFloatingBus7;
return ((m_gameio->sw0_r() || (m_kbspecial->read() & 0x10)) ? 0x80 : 0) | uFloatingBus7;
case 0x62: // button 1 or Solid Apple
return (((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0) | uFloatingBus7;
return ((m_gameio->sw1_r() || (m_kbspecial->read() & 0x20)) ? 0x80 : 0) | uFloatingBus7;
case 0x63: // button 2 or SHIFT key
return (((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0) | uFloatingBus7;
return ((m_gameio->sw2_r() || (m_kbspecial->read() & 0x06)) ? 0x80 : 0) | uFloatingBus7;
case 0x64: // joy 1 X axis
return ((machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0) | uFloatingBus7;
@ -2322,10 +2340,10 @@ READ8_MEMBER(apple2gs_state::c000_r)
// todo: does reading these on the IIgs also trigger the joysticks?
if (!machine().side_effects_disabled())
{
m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_joy1x->read();
m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_joy1y->read();
m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_joy2x->read();
m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_joy2y->read();
m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl0_r();
m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl1_r();
m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl2_r();
m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl3_r();
}
return m_rom[offset + 0x3c000];
@ -4202,48 +4220,6 @@ static const floppy_interface apple2gs_floppy525_floppy_interface =
INPUT PORTS
***************************************************************************/
static INPUT_PORTS_START( apple2gs_gameport )
PORT_START("joystick_1_x") /* Joystick 1 X Axis */
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X) PORT_NAME("P1 Joystick X")
PORT_SENSITIVITY(JOYSTICK_SENSITIVITY)
PORT_KEYDELTA(JOYSTICK_DELTA)
PORT_CENTERDELTA(JOYSTICK_AUTOCENTER)
PORT_MINMAX(0,0xff) PORT_PLAYER(1)
PORT_CODE_DEC(KEYCODE_4_PAD) PORT_CODE_INC(KEYCODE_6_PAD)
PORT_CODE_DEC(JOYCODE_X_LEFT_SWITCH) PORT_CODE_INC(JOYCODE_X_RIGHT_SWITCH)
PORT_START("joystick_1_y") /* Joystick 1 Y Axis */
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y) PORT_NAME("P1 Joystick Y")
PORT_SENSITIVITY(JOYSTICK_SENSITIVITY)
PORT_KEYDELTA(JOYSTICK_DELTA)
PORT_CENTERDELTA(JOYSTICK_AUTOCENTER)
PORT_MINMAX(0,0xff) PORT_PLAYER(1)
PORT_CODE_DEC(KEYCODE_8_PAD) PORT_CODE_INC(KEYCODE_2_PAD)
PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH) PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH)
PORT_START("joystick_2_x") /* Joystick 2 X Axis */
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X) PORT_NAME("P2 Joystick X")
PORT_SENSITIVITY(JOYSTICK_SENSITIVITY)
PORT_KEYDELTA(JOYSTICK_DELTA)
PORT_CENTERDELTA(JOYSTICK_AUTOCENTER)
PORT_MINMAX(0,0xff) PORT_PLAYER(2)
PORT_CODE_DEC(JOYCODE_X_LEFT_SWITCH) PORT_CODE_INC(JOYCODE_X_RIGHT_SWITCH)
PORT_START("joystick_2_y") /* Joystick 2 Y Axis */
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y) PORT_NAME("P2 Joystick Y")
PORT_SENSITIVITY(JOYSTICK_SENSITIVITY)
PORT_KEYDELTA(JOYSTICK_DELTA)
PORT_CENTERDELTA(JOYSTICK_AUTOCENTER)
PORT_MINMAX(0,0xff) PORT_PLAYER(2)
PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH) PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH)
PORT_START("joystick_buttons")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(1) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(JOYCODE_BUTTON1)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_PLAYER(1) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CODE(JOYCODE_BUTTON2)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(2) PORT_CODE(JOYCODE_BUTTON1)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(2) PORT_CODE(JOYCODE_BUTTON2)
INPUT_PORTS_END
/*
Apple IIe platinum and IIgs upgrade key matrix
@ -4488,8 +4464,6 @@ INPUT_PORTS_START( apple2gs )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Solid Apple") PORT_CODE(KEYCODE_RALT)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET") PORT_CODE(KEYCODE_F12)
PORT_INCLUDE(apple2gs_gameport)
PORT_START("adb_mouse_x")
PORT_BIT( 0x7f, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(0)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_CODE(MOUSECODE_BUTTON2) PORT_NAME("Mouse Button 1")
@ -4598,6 +4572,8 @@ void apple2gs_state::apple2gs(machine_config &config)
APPLE2_COMMON(config, m_a2common, A2GS_14M);
m_a2common->set_GS_cputag(m_maincpu);
APPLE2_GAMEIO(config, m_gameio, apple2_gameio_device::default_options, nullptr);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60);
m_screen->set_size(704, 262); // 640+32+32 for the borders

View File

@ -15,7 +15,6 @@
#include "includes/mbc55x.h"
#include "bus/isa/isa.h"
#include "bus/isa/isa_cards.h"
//#include "bus/pc_joy/pc_joy.h"
#include "bus/rs232/rs232.h"
#include "machine/clock.h"
#include "machine/i8087.h"
@ -81,11 +80,16 @@ void mbc55x_state::iodecode_w(offs_t offset, uint8_t data)
uint8_t mbc55x_state::game_io_r()
{
return 0xff;
}
u8 result = m_gameio->sw3_r();
result |= m_gameio->sw2_r() << 1;
result |= m_gameio->sw1_r() << 2;
result |= m_gameio->sw0_r() << 3;
void mbc55x_state::game_io_w(uint8_t data)
{
for (int i = 0; i < 4; i++)
if (machine().time().as_double() < m_ls123_clear_time[i])
result |= 1 << (4 + i);
return result;
}
uint8_t mbc55x_state::printer_status_r()
@ -103,6 +107,26 @@ void mbc55x_state::printer_data_w(uint8_t data)
m_printer->write_data2(!BIT(data, 2));
m_printer->write_data1(!BIT(data, 1));
m_printer->write_data0(!BIT(data, 0));
m_gameio->an0_w(!BIT(data, 0));
m_gameio->an1_w(!BIT(data, 1));
m_gameio->an2_w(!BIT(data, 2));
m_gameio->an3_w(!BIT(data, 3));
m_gameio->an4_w(!BIT(data, 4));
m_gameio->strobe_w(!BIT(data, 5));
if (m_ls123_strobe != BIT(data, 7))
{
if (BIT(data, 7))
{
m_ls123_clear_time[0] = machine().time().as_double() + m_x_calibration * m_gameio->pdl0_r();
m_ls123_clear_time[1] = machine().time().as_double() + m_y_calibration * m_gameio->pdl1_r();
m_ls123_clear_time[2] = machine().time().as_double() + m_x_calibration * m_gameio->pdl2_r();
m_ls123_clear_time[3] = machine().time().as_double() + m_y_calibration * m_gameio->pdl3_r();
}
m_ls123_strobe = BIT(data, 7);
}
}
void mbc55x_state::disk_select_w(uint8_t data)
@ -194,8 +218,15 @@ void mbc55x_state::machine_reset()
void mbc55x_state::machine_start()
{
// FIXME: values copied from apple2.cpp
m_x_calibration = attotime::from_nsec(10800).as_double();
m_y_calibration = attotime::from_nsec(10800).as_double();
m_printer_status = 0xff;
m_ls123_strobe = true;
std::fill(std::begin(m_ls123_clear_time), std::end(m_ls123_clear_time), 0.0);
m_kb_uart->write_cts(0);
}
@ -284,7 +315,6 @@ void mbc55x_state::mbc55x(machine_config &config)
I8255(config, m_ppi);
m_ppi->in_pa_callback().set(FUNC(mbc55x_state::game_io_r));
m_ppi->out_pa_callback().set(FUNC(mbc55x_state::game_io_w));
m_ppi->out_pb_callback().set(FUNC(mbc55x_state::printer_data_w));
m_ppi->in_pc_callback().set(FUNC(mbc55x_state::printer_status_r));
m_ppi->out_pc_callback().set(FUNC(mbc55x_state::disk_select_w));
@ -331,6 +361,8 @@ void mbc55x_state::mbc55x(machine_config &config)
INPUT_MERGER_ANY_HIGH(config, "sioint").output_handler().set(m_pic, FUNC(pic8259_device::ir2_w));
APPLE2_GAMEIO(config, m_gameio, apple2_gameio_device::default_options, nullptr);
CENTRONICS(config, m_printer, centronics_devices, nullptr);
m_printer->busy_handler().set(FUNC(mbc55x_state::printer_busy_w)).invert(); // LS14 Schmitt trigger
m_printer->busy_handler().append(m_pic, FUNC(pic8259_device::ir4_w)).invert();

View File

@ -12,6 +12,7 @@
#pragma once
#include "bus/a2gameio/gameio.h"
#include "bus/centronics/ctronics.h"
#include "cpu/i86/i86.h"
#include "imagedev/floppy.h"
@ -81,6 +82,7 @@ public:
m_pic(*this, PIC8259_TAG),
m_fdc(*this, FDC_TAG),
m_floppy(*this, FDC_TAG ":%u", 0U),
m_gameio(*this, "gameio"),
m_printer(*this, "printer"),
m_speaker(*this, "speaker"),
m_ram(*this, RAM_TAG),
@ -108,7 +110,6 @@ private:
uint8_t vram_page_r();
void vram_page_w(uint8_t data);
uint8_t game_io_r();
void game_io_w(uint8_t data);
uint8_t printer_status_r();
void printer_data_w(uint8_t data);
void disk_select_w(uint8_t data);
@ -135,6 +136,7 @@ private:
required_device<pic8259_device> m_pic;
required_device<fd1793_device> m_fdc;
required_device_array<floppy_connector, 4> m_floppy;
required_device<apple2_gameio_device> m_gameio;
required_device<centronics_device> m_printer;
required_device<speaker_sound_device> m_speaker;
required_device<ram_device> m_ram;
@ -145,6 +147,10 @@ private:
uint8_t m_vram_page;
uint8_t m_printer_status;
double m_x_calibration, m_y_calibration;
bool m_ls123_strobe;
double m_ls123_clear_time[4];
void video_debug(int ref, const std::vector<std::string> &params);
};