ti99: Moved Hexbus one level up

This commit is contained in:
Michael Zapf 2017-07-10 17:48:08 +02:00
parent a725cd2ba8
commit 7d98022797
9 changed files with 108 additions and 55 deletions

View File

@ -767,6 +767,19 @@ if (BUSES["GENERIC"]~=null) then
}
end
---------------------------------------------------
--
--@src/devices/bus/hexbus/hexbus.h,BUSES["HEXBUS"] = true
---------------------------------------------------
if (BUSES["HEXBUS"]~=null) then
files {
MAME_DIR .. "src/devices/bus/hexbus/hexbus.cpp",
MAME_DIR .. "src/devices/bus/hexbus/hexbus.h",
MAME_DIR .. "src/devices/bus/hexbus/hx5102.cpp",
MAME_DIR .. "src/devices/bus/hexbus/hx5102.h",
}
end
---------------------------------------------------
--
@ -2388,7 +2401,6 @@ end
--@src/devices/bus/ti99/joyport/joyport.h,BUSES["TI99"] = true
--@src/devices/bus/ti99/peb/peribox.h,BUSES["TI99"] = true
--@src/devices/bus/ti99/internal/genboard.h,BUSES["TI99"] = true
--@src/devices/bus/ti99/hexbus/hexbus.h,BUSES["TI99"] = true
---------------------------------------------------
if (BUSES["TI99"]~=null) then
@ -2418,10 +2430,6 @@ if (BUSES["TI99"]~=null) then
MAME_DIR .. "src/devices/bus/ti99/gromport/multiconn.h",
MAME_DIR .. "src/devices/bus/ti99/gromport/singleconn.cpp",
MAME_DIR .. "src/devices/bus/ti99/gromport/singleconn.h",
MAME_DIR .. "src/devices/bus/ti99/hexbus/hexbus.cpp",
MAME_DIR .. "src/devices/bus/ti99/hexbus/hexbus.h",
MAME_DIR .. "src/devices/bus/ti99/hexbus/hx5102.cpp",
MAME_DIR .. "src/devices/bus/ti99/hexbus/hx5102.h",
MAME_DIR .. "src/devices/bus/ti99/joyport/handset.cpp",
MAME_DIR .. "src/devices/bus/ti99/joyport/handset.h",
MAME_DIR .. "src/devices/bus/ti99/joyport/joyport.cpp",

View File

@ -662,6 +662,7 @@ BUSES["GAMEBOY"] = true
BUSES["GAMEGEAR"] = true
BUSES["GBA"] = true
BUSES["GENERIC"] = true
BUSES["HEXBUS"] = true
BUSES["HPHIL"] = true
BUSES["HPDIO"] = true
BUSES["IEEE488"] = true

View File

@ -1,4 +1,4 @@
// license:LGPL-2.1+
// license:BSD-3-Clause
// copyright-holders:Michael Zapf
/****************************************************************************
@ -108,7 +108,7 @@
direction. Also, reading from the bus is the product of all active output
buffers. With no active device, the bus lines are pulled high.
Every Hexbus device has an interface "device_ti_hexbus_interface" which
Every Hexbus device has an interface "device_hexbus_interface" which
allows it to plug into a preceding Hexbus socket.
Since the signal propagation is the same for all devices, there is a
@ -119,12 +119,15 @@
Reading is simpler, because we assume that changes can only be done by
writing to the bus.
The "hexbus_chained_device" implements the "device_ti_hexbus_interface"
The "hexbus_chained_device" implements the "device_hexbus_interface"
and holds references to up to two Hexbus instances, one for each direction.
The computer console will not offer an inbound Hexbus connection, only
an outbound one, and possibly there is some device that must be connected
at the end, without further outbound connections.
By default, instances of "hexbus_chained_device" own an outbound
hexbus slot as a subdevice; this may be overwritten by subclasses.
References
----------
@ -143,12 +146,12 @@
#include "hx5102.h"
// Hexbus instance
DEFINE_DEVICE_TYPE_NS(TI_HEXBUS, bus::ti99::hexbus, hexbus_device, "ti_hexbus", "Hexbus")
DEFINE_DEVICE_TYPE_NS(HEXBUS, bus::hexbus, hexbus_device, "hexbus", "Hexbus")
namespace bus { namespace ti99 { namespace hexbus {
namespace bus { namespace hexbus {
hexbus_device::hexbus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, TI_HEXBUS, tag, owner, clock),
device_t(mconfig, HEXBUS, tag, owner, clock),
device_slot_interface(mconfig, *this),
m_next_dev(nullptr)
{
@ -156,7 +159,7 @@ hexbus_device::hexbus_device(const machine_config &mconfig, const char *tag, dev
void hexbus_device::device_start()
{
m_next_dev = dynamic_cast<device_ti_hexbus_interface *>(get_card_device());
m_next_dev = dynamic_cast<device_hexbus_interface *>(get_card_device());
}
/*
@ -201,7 +204,7 @@ uint8_t hexbus_device::read(int dir)
hexbus_chained_device::hexbus_chained_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock):
device_t(mconfig, type, tag, owner, clock),
device_ti_hexbus_interface(mconfig, *this)
device_hexbus_interface(mconfig, *this)
{
m_hexbus_inbound = dynamic_cast<hexbus_device *>(owner);
m_myvalue = 0xff;
@ -298,9 +301,9 @@ MACHINE_CONFIG_END
// ------------------------------------------------------------------------
} } } // end namespace bus::ti99::hexbus
} } // end namespace bus::hexbus
SLOT_INTERFACE_START( ti_hexbus_conn )
SLOT_INTERFACE("hx5102", TI_HX5102)
SLOT_INTERFACE_START( hexbus_conn )
SLOT_INTERFACE("hx5102", HX5102)
SLOT_INTERFACE_END

View File

@ -1,4 +1,4 @@
// license:LGPL-2.1+
// license:BSD-3-Clause
// copyright-holders:Michael Zapf
/****************************************************************************
@ -10,14 +10,12 @@
*****************************************************************************/
#ifndef MAME_BUS_TI99_HEXBUS_HEXBUS_H
#define MAME_BUS_TI99_HEXBUS_HEXBUS_H
#ifndef MAME_BUS_HEXBUS_HEXBUS_H
#define MAME_BUS_HEXBUS_HEXBUS_H
#pragma once
#include "bus/ti99/ti99defs.h"
namespace bus { namespace ti99 { namespace hexbus {
namespace bus { namespace hexbus {
enum
{
@ -32,14 +30,14 @@ class hexbus_chained_device;
Interface for a device that connects to the Hexbus
********************************************************************/
class device_ti_hexbus_interface : public device_slot_card_interface
class device_hexbus_interface : public device_slot_card_interface
{
public:
virtual uint8_t bus_read(int dir) =0;
virtual void bus_write(int dir, uint8_t data) =0;
protected:
device_ti_hexbus_interface(const machine_config &mconfig, device_t &device) :
device_hexbus_interface(const machine_config &mconfig, device_t &device) :
device_slot_card_interface(mconfig, device) { }
};
@ -47,7 +45,7 @@ protected:
Common parent class of all devices attached to the hexbus port
This class implements the signal propagation in both directions
********************************************************************/
class hexbus_chained_device : public device_t, public device_ti_hexbus_interface
class hexbus_chained_device : public device_t, public device_hexbus_interface
{
friend class hexbus_device;
@ -58,6 +56,8 @@ public:
protected:
virtual void device_add_mconfig(machine_config &config) override;
void set_outbound_hexbus(hexbus_device *outbound) { m_hexbus_outbound = outbound; }
// Link to the inbound Hexbus (if not null, see Oso chip)
hexbus_device *m_hexbus_inbound;
@ -78,7 +78,6 @@ protected:
// For interrupts
virtual void hexbus_value_changed(uint8_t data) { };
private:
uint8_t m_myvalue;
};
@ -102,7 +101,7 @@ public:
protected:
void device_start() override;
device_ti_hexbus_interface *m_next_dev;
device_hexbus_interface *m_next_dev;
private:
// owner of this Hexbus socket; may be the owning component or another
@ -112,13 +111,13 @@ private:
};
#define MCFG_HEXBUS_ADD( _tag ) \
MCFG_DEVICE_ADD(_tag, TI_HEXBUS, 0) \
MCFG_DEVICE_SLOT_INTERFACE( ti_hexbus_conn, nullptr, false)
MCFG_DEVICE_ADD(_tag, HEXBUS, 0) \
MCFG_DEVICE_SLOT_INTERFACE( hexbus_conn, nullptr, false)
} } } // end namespace bus::ti99::hexbus
} } // end namespace bus::hexbus
SLOT_INTERFACE_EXTERN( ti_hexbus_conn );
SLOT_INTERFACE_EXTERN( hexbus_conn );
DECLARE_DEVICE_TYPE_NS(TI_HEXBUS, bus::ti99::hexbus, hexbus_device)
DECLARE_DEVICE_TYPE_NS(HEXBUS, bus::hexbus, hexbus_device)
#endif // MAME_BUS_TI99_HEXBUS_HEXBUS_H
#endif // MAME_BUS_HEXBUS_HEXBUS_H

View File

@ -1,4 +1,4 @@
// license:LGPL-2.1+
// license:BSD-3-Clause
// copyright-holders:Michael Zapf
/****************************************************************************
@ -17,12 +17,12 @@
#define TRACE_HEXBUS 0
DEFINE_DEVICE_TYPE_NS(TI_HX5102, bus::ti99::hexbus, hx5102_device, "ti_hx5102", "TI Hexbus Floppy")
DEFINE_DEVICE_TYPE_NS(HX5102, bus::hexbus, hx5102_device, "hx5102", "TI Hexbus Floppy")
namespace bus { namespace ti99 { namespace hexbus {
namespace bus { namespace hexbus {
hx5102_device::hx5102_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock):
hexbus_chained_device(mconfig, TI_HX5102, tag, owner, clock)
hexbus_chained_device(mconfig, HX5102, tag, owner, clock)
{
}
@ -31,5 +31,5 @@ void hx5102_device::hexbus_value_changed(uint8_t data)
if (TRACE_HEXBUS) logerror("Hexbus value changed to %02x\n", data);
}
} } } // end namespace bus::ti99::hexbus
} } // end namespace bus::hexbus

View File

@ -1,4 +1,4 @@
// license:LGPL-2.1+
// license:BSD-3-Clause
// copyright-holders:Michael Zapf
/****************************************************************************
@ -12,14 +12,14 @@
*****************************************************************************/
#ifndef MAME_BUS_TI99_HEXBUS_HX5102_H
#define MAME_BUS_TI99_HEXBUS_HX5102_H
#ifndef MAME_BUS_HEXBUS_HX5102_H
#define MAME_BUS_HEXBUS_HX5102_H
#pragma once
#include "hexbus.h"
namespace bus { namespace ti99 { namespace hexbus {
namespace bus { namespace hexbus {
class hx5102_device : public hexbus_chained_device
{
@ -28,8 +28,8 @@ public:
void hexbus_value_changed(uint8_t data) override;
};
} } } // end namespace bus::ti99::hexbus
} } // end namespace bus::hexbus
DECLARE_DEVICE_TYPE_NS(TI_HX5102, bus::ti99::hexbus, hx5102_device)
DECLARE_DEVICE_TYPE_NS(HX5102, bus::hexbus, hx5102_device)
#endif // MAME_BUS_TI99_HEXBUS_HX5102_H
#endif // MAME_BUS_HEXBUS_HX5102_H

View File

@ -426,6 +426,9 @@ WRITE_LINE_MEMBER( mainboard8_device::clock_in )
m_mofetta->skdrcs_in(m_amigo->skdrcs_out());
// Clock to Oso
m_oso->clock_in(state);
int gromclk = m_mofetta->gromclk_out();
if (gromclk != m_gromclk) // when it changed, propagate to the GROMs
@ -2227,12 +2230,27 @@ enum
SHSK = 0x01
};
/* Control register bits */
enum
{
WIEN = 0x80,
RIEN = 0x40,
BAVIAEN = 0x20,
BAVAIEN = 0x10,
BAVC = 0x08,
WEN = 0x04,
REN = 0x02,
CR7 = 0x01
};
oso_device::oso_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
bus::ti99::hexbus::hexbus_chained_device(mconfig, TI99_OSO, tag, owner, clock),
bus::hexbus::hexbus_chained_device(mconfig, TI99_OSO, tag, owner, clock),
m_data(0),
m_status(0),
m_status(0xff),
m_control(0),
m_xmit(0)
m_xmit(0),
m_clkcount(0),
m_xmit_send(0)
{
m_hexbus_inbound = nullptr;
m_hexbus_outbound = nullptr;
@ -2277,9 +2295,7 @@ WRITE8_MEMBER( oso_device::write )
// write 5FF8: write transmit register
if (TRACE_OSO) logerror("Write transmit register %02x\n", data);
m_xmit = data;
hexbus_write(data);
// We set the status register directly in order to prevent lock-ups
// until we have a complete Hexbus implementation
m_xmit_send = 2;
m_status |= HSKWT;
break;
case 1:
@ -2299,13 +2315,31 @@ void oso_device::hexbus_value_changed(uint8_t data)
if (TRACE_OSO) logerror("Hexbus value changed to %02x\n", data);
}
/*
Phi3 incoming clock pulse
*/
WRITE_LINE_MEMBER( oso_device::clock_in )
{
if (state==ASSERT_LINE) m_clkcount++;
if (m_clkcount > 30 && ((m_control & WEN)!=0) && (m_xmit_send > 0))
{
if (TRACE_OSO) logerror("Write nibble %d\n", 3-m_xmit_send);
hexbus_write(((m_xmit & 0x0c)<<4) | (m_xmit & 0x03));
m_xmit >>= 4;
m_clkcount = 0;
m_xmit_send--;
}
}
void oso_device::device_start()
{
logerror("Starting\n");
m_status = m_xmit = m_control = m_data = 0;
m_hexbus_outbound = dynamic_cast<bus::ti99::hexbus::hexbus_device*>(machine().device(TI_HEXBUS_TAG));
m_hexbus_outbound = dynamic_cast<bus::hexbus::hexbus_device*>(machine().device(TI_HEXBUS_TAG));
// Establish callback for inbound propagations
m_hexbus_outbound->set_chain_element(this);
// Establish callback
m_hexbus_outbound->set_chain_element(this);

View File

@ -20,7 +20,7 @@
#include "bus/ti99/ti99defs.h"
#include "bus/ti99/gromport/gromport.h"
#include "bus/ti99/hexbus/hexbus.h"
#include "bus/hexbus/hexbus.h"
#include "bus/ti99/internal/ioport.h"
#include "machine/ram.h"
@ -422,21 +422,29 @@ private:
/*
Custom chip: OSO
*/
class oso_device : public bus::ti99::hexbus::hexbus_chained_device
class oso_device : public bus::hexbus::hexbus_chained_device
{
public:
oso_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
void device_start() override;
// Don't add a hexbus connector; we use the one from the driver instance
virtual void device_add_mconfig(machine_config &config) override { };
void hexbus_value_changed(uint8_t data) override;
WRITE_LINE_MEMBER( clock_in );
private:
uint8_t m_data;
uint8_t m_status;
uint8_t m_control;
uint8_t m_xmit;
int m_clkcount;
int m_xmit_send;
};
class mainboard8_device : public device_t

View File

@ -183,7 +183,7 @@ Known Issues (MZ, 2010-11-07)
#include "bus/ti99/internal/998board.h"
#include "bus/ti99/gromport/gromport.h"
#include "bus/ti99/hexbus/hexbus.h"
#include "bus/hexbus/hexbus.h"
#include "bus/ti99/joyport/joyport.h"
#include "bus/ti99/internal/ioport.h"