summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Michael Zapf <Michael.Zapf@mizapf.de>2017-05-25 00:32:44 +0200
committer Michael Zapf <Michael.Zapf@mizapf.de>2017-05-25 00:34:17 +0200
commit1e77ec65c1a1310f87a334b18deb204496fa9cfb (patch)
tree39e041179580b12f789565d98c99689d73e467b7
parent2cf7003f6b9b1603332e1c596785cf022db3e3b8 (diff)
ti99: Added console connector "ioport" with PEB as slot option
-rw-r--r--scripts/src/bus.lua2
-rw-r--r--src/devices/bus/ti99/internal/998board.cpp31
-rw-r--r--src/devices/bus/ti99/internal/998board.h7
-rw-r--r--src/devices/bus/ti99/internal/datamux.cpp36
-rw-r--r--src/devices/bus/ti99/internal/datamux.h8
-rw-r--r--src/devices/bus/ti99/internal/ioport.cpp173
-rw-r--r--src/devices/bus/ti99/internal/ioport.h101
-rw-r--r--src/devices/bus/ti99/joyport/handset.cpp14
-rw-r--r--src/devices/bus/ti99/peb/peribox.cpp160
-rw-r--r--src/devices/bus/ti99/peb/peribox.h64
-rw-r--r--src/devices/bus/ti99/ti99defs.h1
-rw-r--r--src/mame/drivers/geneve.cpp2
-rw-r--r--src/mame/drivers/ti99_4p.cpp2
-rw-r--r--src/mame/drivers/ti99_4x.cpp47
-rw-r--r--src/mame/drivers/ti99_8.cpp23
15 files changed, 442 insertions, 229 deletions
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua
index 8008ac4e67a..86eb10efc9b 100644
--- a/scripts/src/bus.lua
+++ b/scripts/src/bus.lua
@@ -2377,6 +2377,8 @@ if (BUSES["TI99"]~=null) then
MAME_DIR .. "src/devices/bus/ti99/internal/genboard.h",
MAME_DIR .. "src/devices/bus/ti99/internal/gromport.cpp",
MAME_DIR .. "src/devices/bus/ti99/internal/gromport.h",
+ MAME_DIR .. "src/devices/bus/ti99/internal/ioport.cpp",
+ MAME_DIR .. "src/devices/bus/ti99/internal/ioport.h",
MAME_DIR .. "src/devices/bus/ti99/colorbus/busmouse.cpp",
MAME_DIR .. "src/devices/bus/ti99/colorbus/busmouse.h",
MAME_DIR .. "src/devices/bus/ti99/colorbus/colorbus.cpp",
diff --git a/src/devices/bus/ti99/internal/998board.cpp b/src/devices/bus/ti99/internal/998board.cpp
index 65383d012aa..ea93c9b77cb 100644
--- a/src/devices/bus/ti99/internal/998board.cpp
+++ b/src/devices/bus/ti99/internal/998board.cpp
@@ -157,7 +157,7 @@ mainboard8_device::mainboard8_device(const machine_config &mconfig, const char *
m_sound(*owner, TISOUNDCHIP_TAG),
m_speech(*owner, SPEECHSYN_TAG),
m_gromport(*owner, GROMPORT_TAG),
- m_peb(*owner, PERIBOX_TAG),
+ m_ioport(*owner, TI99_IOPORT_TAG),
m_sram(*owner, SRAM_TAG),
m_dram(*owner, DRAM_TAG),
m_sgrom_idle(true),
@@ -214,9 +214,9 @@ READ8_MEMBER( mainboard8_device::debugger_read )
// Internal DSR, Hexbus DSR, or PEB
if (m_mofetta->hexbus_access_debug()) return m_rom1[(physical_address & 0x1fff) | 0x6000];
if (m_mofetta->intdsr_access_debug()) return m_rom1[(physical_address & 0x1fff) | 0x4000];
- m_peb->memen_in(ASSERT_LINE);
- m_peb->readz(space, physical_address & 0xffff, &value);
- m_peb->memen_in(CLEAR_LINE);
+ m_ioport->memen_in(ASSERT_LINE);
+ m_ioport->readz(space, physical_address & 0xffff, &value);
+ m_ioport->memen_in(CLEAR_LINE);
return value;
}
if ((physical_address & 0x00ffe000)==0x00ff6000)
@@ -295,10 +295,9 @@ WRITE8_MEMBER( mainboard8_device::debugger_write )
{
if (m_mofetta->hexbus_access_debug()) return;
if (m_mofetta->intdsr_access_debug()) return;
- m_peb->memen_in(ASSERT_LINE);
- m_peb->write(space, physical_address & 0xffff, data & 0xff);
- m_peb->memen_in(CLEAR_LINE);
- return;
+ m_ioport->memen_in(ASSERT_LINE);
+ m_ioport->write(space, physical_address & 0xffff, data & 0xff);
+ m_ioport->memen_in(CLEAR_LINE); return;
}
if ((physical_address & 0x00ffe000)==0x00ff6000)
{
@@ -325,7 +324,7 @@ WRITE8_MEMBER( mainboard8_device::debugger_write )
READ8Z_MEMBER(mainboard8_device::crureadz)
{
- m_peb->crureadz(space, offset, value);
+ m_ioport->crureadz(space, offset, value);
}
/*
@@ -334,7 +333,7 @@ READ8Z_MEMBER(mainboard8_device::crureadz)
WRITE8_MEMBER(mainboard8_device::cruwrite)
{
m_mofetta->cruwrite(space, offset, data);
- m_peb->cruwrite(space, offset, data);
+ m_ioport->cruwrite(space, offset, data);
}
// =============== Memory bus access ==================
@@ -508,7 +507,7 @@ WRITE_LINE_MEMBER( mainboard8_device::clock_in )
if (m_mofetta->dbc_out()==ASSERT_LINE)
{
- m_peb->write(*m_space, m_physical_address, m_latched_data);
+ m_ioport->write(*m_space, m_physical_address, m_latched_data);
m_pending_write = false;
if (TRACE_MEM) logerror("Write %04x (phys %06x, PEB) <- %02x\n", m_logical_address, m_physical_address, m_latched_data);
}
@@ -609,7 +608,7 @@ void mainboard8_device::set_paddress(int address)
if (TRACE_DETAIL) logerror("Setting physical address %06x\n", m_physical_address);
m_mofetta->set_address(*m_space, address, m_dbin_level);
- m_peb->setaddress_dbin(*m_space, address, m_dbin_level);
+ m_ioport->setaddress_dbin(*m_space, address, m_dbin_level);
}
WRITE_LINE_MEMBER( mainboard8_device::msast_in )
@@ -620,10 +619,10 @@ WRITE_LINE_MEMBER( mainboard8_device::msast_in )
if (state==CLEAR_LINE)
{
m_mofetta->pmemen_in(ASSERT_LINE);
- m_peb->memen_in(ASSERT_LINE);
+ m_ioport->memen_in(ASSERT_LINE);
}
m_mofetta->msast_in(state);
- m_peb->msast_in(state);
+ m_ioport->msast_in(state);
}
@@ -785,7 +784,7 @@ READ8_MEMBER( mainboard8_device::read )
if (m_mofetta->dbc_out()==ASSERT_LINE)
{
- m_peb->readz(*m_space, m_physical_address & 0xffff, &value);
+ m_ioport->readz(*m_space, m_physical_address & 0xffff, &value);
what = "PEB";
goto readdonephys;
}
@@ -815,7 +814,7 @@ void mainboard8_device::cycle_end()
m_vaquerro->memen_in(CLEAR_LINE);
m_amigo->memen_in(CLEAR_LINE);
m_mofetta->pmemen_in(CLEAR_LINE);
- m_peb->memen_in(CLEAR_LINE);
+ m_ioport->memen_in(CLEAR_LINE);
}
/*
diff --git a/src/devices/bus/ti99/internal/998board.h b/src/devices/bus/ti99/internal/998board.h
index d89e0a736e8..8ca94e7538f 100644
--- a/src/devices/bus/ti99/internal/998board.h
+++ b/src/devices/bus/ti99/internal/998board.h
@@ -21,7 +21,7 @@
#include "bus/ti99/ti99defs.h"
#include "gromport.h"
-#include "bus/ti99/peb/peribox.h"
+#include "bus/ti99/internal/ioport.h"
#include "machine/ram.h"
#include "machine/tmc0430.h"
#include "sound/sn76496.h"
@@ -509,8 +509,9 @@ private:
required_device<tms9928a_device> m_video;
required_device<sn76496_base_device> m_sound;
required_device<cd2501ecd_device> m_speech;
- required_device<gromport_device> m_gromport;
- required_device<bus::ti99::peb::peribox_device> m_peb;
+ required_device<bus::ti99::internal::gromport_device> m_gromport;
+ required_device<bus::ti99::internal::ioport_device> m_ioport;
+
required_device<ram_device> m_sram;
required_device<ram_device> m_dram;
diff --git a/src/devices/bus/ti99/internal/datamux.cpp b/src/devices/bus/ti99/internal/datamux.cpp
index d937c639c27..066c0d56dab 100644
--- a/src/devices/bus/ti99/internal/datamux.cpp
+++ b/src/devices/bus/ti99/internal/datamux.cpp
@@ -82,7 +82,7 @@ datamux_device::datamux_device(const machine_config &mconfig, const char *tag, d
: device_t(mconfig, TI99_DATAMUX, tag, owner, clock),
m_video(*owner, VDP_TAG),
m_sound(*owner, TISOUNDCHIP_TAG),
- m_peb(*owner, PERIBOX_TAG),
+ m_ioport(*owner, TI99_IOPORT_TAG),
m_gromport(*owner, GROMPORT_TAG),
m_ram16b(*owner, EXPRAM_TAG),
m_padram(*owner, PADRAM_TAG),
@@ -144,9 +144,9 @@ void datamux_device::read_all(address_space& space, uint16_t addr, uint8_t *valu
// GROMport (ROMs)
if ((addr & 0xe000)==0x6000) m_gromport->readz(space, addr, value);
- // PEB gets all accesses
- m_peb->readz(space, addr, value);
- m_peb->memen_in(CLEAR_LINE);
+ // I/O port gets all accesses
+ m_ioport->readz(space, addr, value);
+ m_ioport->memen_in(CLEAR_LINE);
}
void datamux_device::write_all(address_space& space, uint16_t addr, uint8_t value)
@@ -180,9 +180,9 @@ void datamux_device::write_all(address_space& space, uint16_t addr, uint8_t valu
if (m_video != nullptr) m_video->write(space, addr>>1, value); // A14 determines data or register write
}
- // PEB gets all accesses
- m_peb->write(space, addr, value);
- m_peb->memen_in(CLEAR_LINE);
+ // I/O port gets all accesses
+ m_ioport->write(space, addr, value);
+ m_ioport->memen_in(CLEAR_LINE);
}
void datamux_device::setaddress_all(address_space& space, uint16_t addr)
@@ -217,9 +217,9 @@ void datamux_device::setaddress_all(address_space& space, uint16_t addr)
// GROMport (ROMs)
m_gromport->romgq_line(iscartrom? ASSERT_LINE : CLEAR_LINE);
- // PEB gets all accesses
- m_peb->memen_in(ASSERT_LINE);
- m_peb->setaddress_dbin(space, addr, m_dbin);
+ // I/O port gets all accesses
+ m_ioport->memen_in(ASSERT_LINE);
+ m_ioport->setaddress_dbin(space, addr, m_dbin);
}
/*
@@ -263,10 +263,10 @@ uint16_t datamux_device::debugger_read(address_space& space, uint16_t addr)
m_gromport->readz(space, addrb, &hval);
m_gromport->romgq_line(CLEAR_LINE);
}
- m_peb->memen_in(ASSERT_LINE);
- m_peb->readz(space, addrb+1, &lval);
- m_peb->readz(space, addrb, &hval);
- m_peb->memen_in(CLEAR_LINE);
+ m_ioport->memen_in(ASSERT_LINE);
+ m_ioport->readz(space, addrb+1, &lval);
+ m_ioport->readz(space, addrb, &hval);
+ m_ioport->memen_in(CLEAR_LINE);
value = ((hval << 8)&0xff00) | (lval & 0xff);
}
}
@@ -309,10 +309,10 @@ void datamux_device::debugger_write(address_space& space, uint16_t addr, uint16_
m_gromport->romgq_line(CLEAR_LINE);
}
- m_peb->memen_in(ASSERT_LINE);
- m_peb->write(space, addr+1, data & 0xff);
- m_peb->write(space, addr, (data>>8) & 0xff);
- m_peb->memen_in(CLEAR_LINE);
+ m_ioport->memen_in(ASSERT_LINE);
+ m_ioport->write(space, addr+1, data & 0xff);
+ m_ioport->write(space, addr, (data>>8) & 0xff);
+ m_ioport->memen_in(CLEAR_LINE);
}
}
}
diff --git a/src/devices/bus/ti99/internal/datamux.h b/src/devices/bus/ti99/internal/datamux.h
index 3231f72297d..98d2ce97ee0 100644
--- a/src/devices/bus/ti99/internal/datamux.h
+++ b/src/devices/bus/ti99/internal/datamux.h
@@ -19,7 +19,7 @@
#include "bus/ti99/ti99defs.h"
#include "machine/tmc0430.h"
#include "gromport.h"
-#include "bus/ti99/peb/peribox.h"
+#include "bus/ti99/internal/ioport.h"
#include "sound/sn76496.h"
#include "video/tms9928a.h"
#include "machine/ram.h"
@@ -63,8 +63,8 @@ private:
// Link to the sound processor
optional_device<sn76496_base_device> m_sound;
- // Link to the peripheral expansion box
- required_device<bus::ti99::peb::peribox_device> m_peb;
+ // Link to the I/O port
+ required_device<bus::ti99::internal::ioport_device> m_ioport;
// Link to the cartridge port (aka GROM port)
required_device<gromport_device> m_gromport;
@@ -142,5 +142,5 @@ private:
} } } // end namespace bus::ti99::internal
DECLARE_DEVICE_TYPE_NS(TI99_DATAMUX, bus::ti99::internal, datamux_device)
-
+
#endif // MAME_BUS_TI99_INTERNAL_DATAMUX_H
diff --git a/src/devices/bus/ti99/internal/ioport.cpp b/src/devices/bus/ti99/internal/ioport.cpp
new file mode 100644
index 00000000000..8602bcd8028
--- /dev/null
+++ b/src/devices/bus/ti99/internal/ioport.cpp
@@ -0,0 +1,173 @@
+// license:LGPL-2.1+
+// copyright-holders:Michael Zapf
+/****************************************************************************
+ I/O port
+
+ This is the connector on the right side of the TI-99/4(A) console and the
+ TI-99/8 console.
+
+ XXXXXXXXXXXXXXXXXXX
+ XXXXXXXXXXXXXX+__________+XXXX rear
+ front XXXXXXXXXXXXXXXXXXXX+ +XXXX
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+ In previous MAME/MESS releases, the I/O port was not explicitly modeled,
+ making the Peripheral Expansion Box (PEB) a subdevice of the console.
+ With this change it becomes possible to emulate the side-car devices and
+ also game cartriges that were plugged into the I/O port.
+
+ However, this also means the PEB must be plugged into the I/O port
+ ("-ioport peb"), and that all PEB slot cards require an "ioport"
+ qualifier at the beginning like "-ioport:peb:slot8 hfdc".
+
+ -----
+
+ The TI-99/8 features a different layout with more lines, requiring
+ a specific adapter for connecting the Peripheral Expansion Box, called
+ the "Armadillo round cable interface". Despite offering this connection,
+ TI promoted a different peripheral concept by the "Hexbus". The I/O port
+ can be considered a support for legacy peripheral devices.
+
+ Since the TI-99/8 development was stopped with TI's withdrawal from the
+ home computer market, no specific peripheral cards were made available.
+ The legacy cards of the TI-99/4(A) can be used with limitations. However,
+ memory expansion cards do not work. Since the operating system inside the
+ 99/8 console already assumes that the Hexbus devices are used, it fails
+ to correctly operate the floppy controllers, and thus Extended Basic II
+ locks up on startup.
+
+ The lines of the 99/8 I/O port starting with P refer to the external bus
+ after the AMIGO custom chip, which translates the logical addresses
+ to physical addresses (hence the P). There was a first layout (v1) that
+ was changed in the last prototypes (v2).
+
+ TI-99/4(A) TI-99/8 (v2)
+
+ bot Front top top Rear bot
+ --------------------- ---------------------
+ +5V 1||2 SBE +5V/XBC 2||1 EXTINT*
+ RESET* 3||4 EXTINT* D2 4||3 AUDIOIN
+ A5 5||6 A10 D1 6||5 PA09
+ A4 7||8 A11 D3 8||7 D0
+ DBIN 9||10 A3 D5 10||9 D4
+ A12 11||12 READY D7 12||11 D6
+ LOAD* 13||14 A8 SRESET* 14||13 GND
+ A13 15||16 A14 MSAST* 16||15 GND
+ A7 17||18 A9 CRUCLK* 18||17 GND
+ A15/CRUOUT 19||20 A2 HOLD* 20||19 GND
+ GND 21||22 CRUCLK* PA11 22||21 PA12
+ GND 23||24 PHI3* PA15/CRUOUT 24||23 nc
+ GND 25||26 WE* SCLK 26||25 GND
+ GND 27||28 MBE* PA14 28||27 PA01
+ A6 29||30 A1 PA08 30||29 PA13
+ A0 31||32 MEMEN* PA00 32||31 PA05
+ CRUIN 33||34 D7 PA10 34||33 PA04
+ D4 35||36 D6 SRDY 36||35 CRUIN
+ D0 37||38 D5 PA06 38||37 PA07
+ D2 39||40 D1 PA03 40||39 PA02
+ IAQ 41||42 D3 PDBIN 42||41 IAQ/HOLDA
+ -5V 43||44 AUDIOIN LOAD* 44||43 GND
+ --------------------- PHI3* 46||45 GND
+ bot Rear top PMEMEN* 48||47 GND
+ PWE* 50||49 GND
+ -----------------------
+ top Front bot
+ May 2017, Michael Zapf
+
+*****************************************************************************/
+
+#include "emu.h"
+#include "ioport.h"
+#include "bus/ti99/peb/peribox.h"
+
+DEFINE_DEVICE_TYPE_NS(TI99_IOPORT, bus::ti99::internal, ioport_device, "ti99_ioport", "TI-99 I/O Port")
+
+namespace bus { namespace ti99 { namespace internal {
+
+ioport_device::ioport_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : bus8z_device(mconfig, TI99_IOPORT, tag, owner, clock),
+ device_slot_interface(mconfig, *this),
+ m_console_extint(*this),
+ m_console_ready(*this),
+ m_connected(nullptr)
+{
+}
+
+READ8Z_MEMBER(ioport_device::readz)
+{
+ if (m_connected != nullptr)
+ m_connected->readz(space, offset, value);
+}
+
+WRITE8_MEMBER(ioport_device::write)
+{
+ if (m_connected != nullptr)
+ m_connected->write(space, offset, data);
+}
+
+SETADDRESS_DBIN_MEMBER(ioport_device::setaddress_dbin)
+{
+ if (m_connected != nullptr)
+ m_connected->setaddress_dbin(space, offset, state);
+}
+
+READ8Z_MEMBER(ioport_device::crureadz)
+{
+ if (m_connected != nullptr)
+ m_connected->crureadz(space, offset, value);
+}
+
+WRITE8_MEMBER(ioport_device::cruwrite)
+{
+ if (m_connected != nullptr)
+ m_connected->cruwrite(space, offset, data);
+}
+
+WRITE_LINE_MEMBER(ioport_device::memen_in)
+{
+ if (m_connected != nullptr)
+ m_connected->memen_in(state);
+}
+
+WRITE_LINE_MEMBER(ioport_device::msast_in)
+{
+ if (m_connected != nullptr)
+ m_connected->msast_in(state);
+}
+
+WRITE_LINE_MEMBER(ioport_device::clock_in)
+{
+ if (m_connected != nullptr)
+ m_connected->clock_in(state);
+}
+
+void ioport_device::device_start()
+{
+ m_console_extint.resolve();
+ m_console_ready.resolve();
+ if (m_connected != nullptr)
+ m_connected->set_ioport(this);
+}
+
+void ioport_device::device_config_complete()
+{
+ m_connected = static_cast<ioport_attached_device*>(subdevices().first());
+}
+
+
+WRITE_LINE_MEMBER(ioport_attached_device::set_extint)
+{
+ m_ioport->m_console_extint(state);
+}
+
+WRITE_LINE_MEMBER(ioport_attached_device::set_ready)
+{
+ m_ioport->m_console_ready(state);
+}
+
+} } } // end namespace bus::ti99::internal
+
+SLOT_INTERFACE_START( ti99_io_port )
+ SLOT_INTERFACE("peb", TI99_PERIBOX)
+SLOT_INTERFACE_END
+
diff --git a/src/devices/bus/ti99/internal/ioport.h b/src/devices/bus/ti99/internal/ioport.h
new file mode 100644
index 00000000000..e6e5737acc2
--- /dev/null
+++ b/src/devices/bus/ti99/internal/ioport.h
@@ -0,0 +1,101 @@
+// license:LGPL-2.1+
+// copyright-holders:Michael Zapf
+/****************************************************************************
+ I/O port
+*****************************************************************************/
+
+#ifndef MAME_BUS_TI99_INTERNAL_IOPORT_H
+#define MAME_BUS_TI99_INTERNAL_IOPORT_H
+
+#pragma once
+
+#include "bus/ti99/ti99defs.h"
+
+namespace bus { namespace ti99 { namespace internal {
+
+extern const device_type IOPORT;
+
+class ioport_device;
+
+/********************************************************************
+ Common parent class of all devices attached to the I/O port
+********************************************************************/
+class ioport_attached_device : public bus8z_device
+{
+public:
+ ioport_attached_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : bus8z_device(mconfig, type, tag, owner, clock), m_ioport(nullptr)
+{ }
+
+ // Methods called from the console / ioport
+ virtual DECLARE_READ8Z_MEMBER( readz ) override { };
+ virtual DECLARE_WRITE8_MEMBER( write ) override { };
+ virtual DECLARE_SETADDRESS_DBIN_MEMBER( setaddress_dbin ) override { };
+ virtual DECLARE_READ8Z_MEMBER( crureadz ) { };
+ virtual DECLARE_WRITE8_MEMBER( cruwrite ) { };
+ virtual DECLARE_WRITE_LINE_MEMBER( memen_in ) { };
+ virtual DECLARE_WRITE_LINE_MEMBER( msast_in ) { };
+ virtual DECLARE_WRITE_LINE_MEMBER( clock_in ) { };
+
+ void set_ioport(ioport_device* ioport) { m_ioport = ioport; }
+
+protected:
+ // Methods called from the external device
+ DECLARE_WRITE_LINE_MEMBER( set_extint );
+ DECLARE_WRITE_LINE_MEMBER( set_ready );
+private:
+ ioport_device* m_ioport;
+};
+
+/********************************************************************
+ I/O port
+********************************************************************/
+
+class ioport_device : public bus8z_device, public device_slot_interface
+{
+ friend class ioport_attached_device;
+
+public:
+ ioport_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ template<class _Object> static devcb_base &static_set_extint_callback(device_t &device, _Object object) { return downcast<ioport_device &>(device).m_console_extint.set_callback(object); }
+ template<class _Object> static devcb_base &static_set_ready_callback(device_t &device, _Object object) { return downcast<ioport_device &>(device).m_console_ready.set_callback(object); }
+
+ // Methods called from the console
+ DECLARE_READ8Z_MEMBER( readz ) override;
+ DECLARE_WRITE8_MEMBER( write ) override;
+ DECLARE_SETADDRESS_DBIN_MEMBER( setaddress_dbin ) override;
+ DECLARE_READ8Z_MEMBER( crureadz );
+ DECLARE_WRITE8_MEMBER( cruwrite );
+ DECLARE_WRITE_LINE_MEMBER( memen_in );
+ DECLARE_WRITE_LINE_MEMBER( msast_in );
+ DECLARE_WRITE_LINE_MEMBER( clock_in );
+
+protected:
+ void device_start() override;
+ void device_config_complete() override;
+
+ // Methods called back from the external device
+ devcb_write_line m_console_extint; // EXTINT line
+ devcb_write_line m_console_ready; // READY line
+
+private:
+ ioport_attached_device* m_connected;
+};
+} } } // end namespace bus::ti99::internal
+
+DECLARE_DEVICE_TYPE_NS(TI99_IOPORT, bus::ti99::internal, ioport_device)
+
+SLOT_INTERFACE_EXTERN(ti99_io_port);
+
+#define MCFG_IOPORT_ADD( _tag ) \
+ MCFG_DEVICE_ADD(_tag, TI99_IOPORT, 0) \
+ MCFG_DEVICE_SLOT_INTERFACE(ti99_io_port, nullptr, false)
+
+#define MCFG_IOPORT_EXTINT_HANDLER( _extint ) \
+ devcb = &bus::ti99::internal::ioport_device::static_set_extint_callback( *device, DEVCB_##_extint );
+
+#define MCFG_IOPORT_READY_HANDLER( _ready ) \
+ devcb = &bus::ti99::internal::ioport_device::static_set_ready_callback( *device, DEVCB_##_ready );
+
+#endif /* __TI99IOPORT__ */
diff --git a/src/devices/bus/ti99/joyport/handset.cpp b/src/devices/bus/ti99/joyport/handset.cpp
index d638d169684..9266bc0f18d 100644
--- a/src/devices/bus/ti99/joyport/handset.cpp
+++ b/src/devices/bus/ti99/joyport/handset.cpp
@@ -45,8 +45,8 @@ DEFINE_DEVICE_TYPE_NS(TI99_HANDSET, bus::ti99::joyport, ti99_handset_device, "ti
namespace bus { namespace ti99 { namespace joyport {
-#define LOG logerror
-#define VERBOSE 1
+#define TRACE_HANDSET 0
+#define TRACE_JOYSTICK 0
static const char *const joynames[2][4] =
{
@@ -81,7 +81,7 @@ uint8_t ti99_handset_device::read_dev()
void ti99_handset_device::write_dev(uint8_t data)
{
- if (VERBOSE>7) LOG("ti99_handset_device: Set ack %d\n", data);
+ if (TRACE_HANDSET) logerror("Set ack %d\n", data);
set_acknowledge(data);
}
@@ -146,7 +146,7 @@ void ti99_handset_device::post_message(int message)
m_clock_high = true;
m_buf = ~message;
m_buflen = 3;
- if (VERBOSE>5) LOG("ti99_handset_device: trigger interrupt\n");
+ if (TRACE_HANDSET) logerror("trigger interrupt\n");
m_joyport->set_interrupt(ASSERT_LINE);
}
@@ -335,7 +335,7 @@ void ti99_handset_device::device_start()
void ti99_handset_device::device_reset()
{
- if (VERBOSE>5) LOG("ti99_handset_device: Reset\n");
+ if (TRACE_HANDSET) logerror("Reset\n");
m_delay_timer->enable(true);
m_buf = 0;
m_buflen = 0;
@@ -523,13 +523,13 @@ uint8_t ti99_twin_joystick_device::read_dev()
if (m_joystick==2) value = ioport("JOY2")->read();
else value = 0xff;
}
- if (VERBOSE>6) LOG("ti99_twin_joystick_device: joy%d = %02x\n", m_joystick, value);
+ if (TRACE_JOYSTICK) logerror("joy%d = %02x\n", m_joystick, value);
return value;
}
void ti99_twin_joystick_device::write_dev(uint8_t data)
{
- if (VERBOSE>7) LOG("ti99_twin_joystick_device: Select joystick %d\n", data);
+ if (TRACE_JOYSTICK) logerror("Select joystick %d\n", data);
m_joystick = data & 0x03;
}
diff --git a/src/devices/bus/ti99/peb/peribox.cpp b/src/devices/bus/ti99/peb/peribox.cpp
index 29de4b6c432..455f1d2c787 100644
--- a/src/devices/bus/ti99/peb/peribox.cpp
+++ b/src/devices/bus/ti99/peb/peribox.cpp
@@ -196,13 +196,19 @@ CRUCLK* 51||52 DBIN
#include "memex.h"
#include "horizon.h"
-DEFINE_DEVICE_TYPE_NS(PERIBOX, bus::ti99::peb, peribox_device, "peribox", "Peripheral expansion box")
-DEFINE_DEVICE_TYPE_NS(PERIBOX_SLOT, bus::ti99::peb, peribox_slot_device, "peribox_slot", "TI P-Box slot")
+// Peripheral box that is attached to the TI console (also TI with EVPC)
+// and has the Flex Cable Interface in slot 1
+// This is a device that plugs into the slot "ioport" of the console
+DEFINE_DEVICE_TYPE_NS(TI99_PERIBOX, bus::ti99::peb, peribox_device, "peribox", "Peripheral expansion box")
-DEFINE_DEVICE_TYPE_NS(PERIBOX_EV, bus::ti99::peb, peribox_ev_device, "peribox_ev", "Peripheral expansion box EVPC")
-DEFINE_DEVICE_TYPE_NS(PERIBOX_SG, bus::ti99::peb, peribox_sg_device, "peribox_sg", "Peripheral expansion box SGCPU")
-DEFINE_DEVICE_TYPE_NS(PERIBOX_GEN, bus::ti99::peb, peribox_gen_device, "peribox_gen", "Peripheral expansion box Geneve")
-DEFINE_DEVICE_TYPE_NS(PERIBOX_998, bus::ti99::peb, peribox_998_device, "peribox_998", "Peripheral expansion box 99/8")
+// Peripheral box which hosts the SGCPU card in slot 1
+DEFINE_DEVICE_TYPE_NS(TI99_PERIBOX_SG, bus::ti99::peb, peribox_sg_device, "peribox_sg", "Peripheral expansion box SGCPU")
+
+// Peripheral box which hosts the Geneve 9640 in slot 1
+DEFINE_DEVICE_TYPE_NS(TI99_PERIBOX_GEN, bus::ti99::peb, peribox_gen_device, "peribox_gen", "Peripheral expansion box Geneve")
+
+// Single slot of the PEB
+DEFINE_DEVICE_TYPE_NS(TI99_PERIBOX_SLOT, bus::ti99::peb, peribox_slot_device, "peribox_slot", "TI P-Box slot")
namespace bus { namespace ti99 { namespace peb {
@@ -226,9 +232,21 @@ namespace bus { namespace ti99 { namespace peb {
#define PEBSLOT7 "slot7"
#define PEBSLOT8 "slot8"
-peribox_device::peribox_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : peribox_device(mconfig, PERIBOX, tag, owner, clock)
+peribox_device::peribox_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock):
+ bus::ti99::internal::ioport_attached_device(mconfig, TI99_PERIBOX, tag, owner, clock),
+ m_slot1_inta(*this),
+ m_slot1_intb(*this),
+ m_slot1_lcp(*this),
+ m_slot1_ready(*this),
+ m_inta_flag(0),
+ m_intb_flag(0),
+ m_lcp_flag(0),
+ m_ready_flag(0),
+ m_msast(false),
+ m_memen(false),
+ m_ioport_connected(false)
{
+ for (int i=2; i <= 8; i++) m_slot[i] = nullptr;
// The address prefix is actually created by the "Flex cable interface"
// which sits in slot 1.
m_address_prefix = 0x70000;
@@ -237,13 +255,18 @@ peribox_device::peribox_device(const machine_config &mconfig, const char *tag, d
/*
Constructor called from subclasses.
*/
-peribox_device::peribox_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
- : bus8z_device(mconfig, type, tag, owner, clock),
- m_console_inta(*this),
- m_console_intb(*this),
- m_sgcpu_lcp(*this),
- m_datamux_ready(*this),
- m_inta_flag(0), m_intb_flag(0), m_ready_flag(0), m_address_prefix(0), m_msast(false), m_memen(false)
+peribox_device::peribox_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock):
+ bus::ti99::internal::ioport_attached_device(mconfig, TI99_PERIBOX, tag, owner, clock),
+ m_slot1_inta(*this),
+ m_slot1_intb(*this),
+ m_slot1_lcp(*this),
+ m_slot1_ready(*this),
+ m_inta_flag(0),
+ m_intb_flag(0),
+ m_ready_flag(0),
+ m_address_prefix(0),
+ m_msast(false),
+ m_memen(false)
{
for (int i=2; i <= 8; i++) m_slot[i] = nullptr;
}
@@ -372,7 +395,10 @@ void peribox_device::inta_join(int slot, int state)
else
m_inta_flag &= ~(1 << slot);
- m_console_inta((m_inta_flag != 0)? ASSERT_LINE : CLEAR_LINE);
+ if (m_ioport_connected)
+ set_extint((m_inta_flag != 0)? ASSERT_LINE : CLEAR_LINE);
+ else
+ m_slot1_inta((m_inta_flag != 0)? ASSERT_LINE : CLEAR_LINE);
}
void peribox_device::intb_join(int slot, int state)
@@ -383,7 +409,9 @@ void peribox_device::intb_join(int slot, int state)
else
m_intb_flag &= ~(1 << slot);
- m_console_intb((m_intb_flag != 0)? ASSERT_LINE : CLEAR_LINE);
+ // Not propagated to console
+ if (!m_ioport_connected)
+ m_slot1_intb((m_intb_flag != 0)? ASSERT_LINE : CLEAR_LINE);
}
void peribox_device::lcp_join(int slot, int state)
@@ -394,7 +422,9 @@ void peribox_device::lcp_join(int slot, int state)
else
m_lcp_flag &= ~(1 << slot);
- m_sgcpu_lcp((m_lcp_flag != 0)? ASSERT_LINE : CLEAR_LINE);
+ // Not propagated to console
+ if (!m_ioport_connected)
+ m_slot1_lcp((m_lcp_flag != 0)? ASSERT_LINE : CLEAR_LINE);
}
/*
@@ -409,7 +439,10 @@ void peribox_device::ready_join(int slot, int state)
else
m_ready_flag &= ~(1 << slot);
- m_datamux_ready((m_ready_flag != 0)? CLEAR_LINE : ASSERT_LINE);
+ if (m_ioport_connected)
+ set_ready((m_ready_flag != 0)? CLEAR_LINE : ASSERT_LINE);
+ else
+ m_slot1_ready((m_ready_flag != 0)? CLEAR_LINE : ASSERT_LINE);
}
void peribox_device::set_slot_loaded(int slot, peribox_slot_device* slotdev)
@@ -422,10 +455,12 @@ void peribox_device::device_start()
if (TRACE_EMU) logerror("%s: started\n", tag());
// Resolve the callback lines to the console
- m_console_inta.resolve();
- m_console_intb.resolve();
- m_sgcpu_lcp.resolve();
- m_datamux_ready.resolve();
+ m_slot1_inta.resolve();
+ m_slot1_intb.resolve();
+ m_slot1_lcp.resolve();
+ m_slot1_ready.resolve();
+
+ m_ioport_connected = (m_slot1_inta.isnull()); // TODO: init
if (TRACE_EMU)
{
@@ -454,6 +489,7 @@ void peribox_device::device_config_complete()
SLOT_INTERFACE_START( peribox_slot )
SLOT_INTERFACE("32kmem", TI99_32KMEM)
+ SLOT_INTERFACE("evpc", TI99_EVPC )
SLOT_INTERFACE("myarcmem", TI99_MYARCMEM)
SLOT_INTERFACE("samsmem", TI99_SAMSMEM)
SLOT_INTERFACE("pcode", TI99_P_CODE)
@@ -488,7 +524,7 @@ machine_config_constructor peribox_device::device_mconfig_additions() const
*****************************************************************************/
peribox_gen_device::peribox_gen_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : peribox_device(mconfig, PERIBOX_GEN, tag, owner, clock)
+ : peribox_device(mconfig, TI99_PERIBOX_GEN, tag, owner, clock)
{
// The Geneve sits in slot 1; there is no prefix here - it can control
// a maximum address space of 512 KiB in the box. With the Genmod
@@ -526,49 +562,11 @@ machine_config_constructor peribox_gen_device::device_mconfig_additions() const
}
/****************************************************************************
- A variant of the box used for the TI-99/8
-*****************************************************************************/
-
-peribox_998_device::peribox_998_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : peribox_device(mconfig, PERIBOX_998, tag, owner, clock)
-{
- m_address_prefix = 0x70000;
-}
-
-// The BwG controller will not run with the TI-99/8 for the same reason why
-// it won't work with the Geneve.
-// We don't have many options here. The P-Box is not the prefered device for
-// the 99/8; it was intended to use the Hexbus interface. None of the memory
-// expansions are really supposed to work here.
-SLOT_INTERFACE_START( peribox_slot998 )
- SLOT_INTERFACE("ide", TI99_IDE)
- SLOT_INTERFACE("usbsm", TI99_USBSM)
- SLOT_INTERFACE("tirs232", TI99_RS232)
- SLOT_INTERFACE("tifdc", TI99_FDC)
- SLOT_INTERFACE("hfdc", TI99_HFDC)
-SLOT_INTERFACE_END
-
-MACHINE_CONFIG_START( peribox_998_device )
- MCFG_PERIBOX_SLOT_ADD( PEBSLOT2, peribox_slot998 )
- MCFG_PERIBOX_SLOT_ADD( PEBSLOT3, peribox_slot998 )
- MCFG_PERIBOX_SLOT_ADD( PEBSLOT4, peribox_slot998 )
- MCFG_PERIBOX_SLOT_ADD( PEBSLOT5, peribox_slot998 )
- MCFG_PERIBOX_SLOT_ADD( PEBSLOT6, peribox_slot998 )
- MCFG_PERIBOX_SLOT_ADD( PEBSLOT7, peribox_slot998 )
- MCFG_PERIBOX_SLOT_ADD( PEBSLOT8, peribox_slot998 )
-MACHINE_CONFIG_END
-
-machine_config_constructor peribox_998_device::device_mconfig_additions() const
-{
- return MACHINE_CONFIG_NAME( peribox_998_device );
-}
-
-/****************************************************************************
A variant of the box used for the SGCPU (aka TI-99/4P).
*****************************************************************************/
peribox_sg_device::peribox_sg_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
-: peribox_device(mconfig, PERIBOX_SG, tag, owner, clock)
+: peribox_device(mconfig, TI99_PERIBOX_SG, tag, owner, clock)
{
m_address_prefix = 0x70000;
}
@@ -610,32 +608,6 @@ machine_config_constructor peribox_sg_device::device_mconfig_additions() const
return MACHINE_CONFIG_NAME( peribox_sg_device );
}
-/****************************************************************************
- Another variant of the box; used for the TI with EVPC. The EVPC is
- obviously required.
-*****************************************************************************/
-
-peribox_ev_device::peribox_ev_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : peribox_device(mconfig, PERIBOX_EV, tag, owner, clock)
-{
- m_address_prefix = 0x70000;
-}
-
-MACHINE_CONFIG_START( peribox_ev_device )
- MCFG_PERIBOX_SLOT_ADD_DEF( PEBSLOT2, peribox_ev_slot, "evpc" )
- MCFG_PERIBOX_SLOT_ADD( PEBSLOT3, peribox_slot )
- MCFG_PERIBOX_SLOT_ADD( PEBSLOT4, peribox_slot )
- MCFG_PERIBOX_SLOT_ADD( PEBSLOT5, peribox_slot )
- MCFG_PERIBOX_SLOT_ADD( PEBSLOT6, peribox_slot )
- MCFG_PERIBOX_SLOT_ADD( PEBSLOT7, peribox_slot )
- MCFG_PERIBOX_SLOT_ADD( PEBSLOT8, peribox_slot )
-MACHINE_CONFIG_END
-
-machine_config_constructor peribox_ev_device::device_mconfig_additions() const
-{
- return MACHINE_CONFIG_NAME( peribox_ev_device );
-}
-
/***************************************************************************
Implementation of a slot within the box.
****************************************************************************/
@@ -652,7 +624,7 @@ int peribox_slot_device::get_index_from_tagname()
}
peribox_slot_device::peribox_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : bus8z_device(mconfig, PERIBOX_SLOT, tag, owner, clock), device_slot_interface(mconfig, *this), m_card(nullptr), m_slotnumber(0)
+ : bus8z_device(mconfig, TI99_PERIBOX_SLOT, tag, owner, clock), device_slot_interface(mconfig, *this), m_card(nullptr), m_slotnumber(0)
{
}
@@ -718,14 +690,6 @@ void peribox_slot_device::device_config_complete()
}
/*
- Delivers the drives that are installed in the box. Called from a card.
-*/
-device_t* peribox_slot_device::get_drive(const char* name)
-{
- return owner()->subdevice(name);
-}
-
-/*
These methods are called from the expansion cards. They add the
slot number to identify the slot to the box.
*/
diff --git a/src/devices/bus/ti99/peb/peribox.h b/src/devices/bus/ti99/peb/peribox.h
index 4ee0e454f8e..6d9078110dd 100644
--- a/src/devices/bus/ti99/peb/peribox.h
+++ b/src/devices/bus/ti99/peb/peribox.h
@@ -17,6 +17,7 @@
#pragma once
#include "bus/ti99/ti99defs.h"
+#include "bus/ti99/internal/ioport.h"
namespace bus { namespace ti99 { namespace peb {
@@ -28,31 +29,32 @@ class peribox_slot_device;
See ti99defs.h for bus8z_device
******************************************************************************/
-class peribox_device : public bus8z_device
+class peribox_device : public bus::ti99::internal::ioport_attached_device
{
friend class peribox_slot_device;
public:
peribox_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> static devcb_base &static_set_inta_callback(device_t &device, Object &&cb) { return downcast<peribox_device &>(device).m_console_inta.set_callback(std::forward<Object>(cb)); }
- template <class Object> static devcb_base &static_set_intb_callback(device_t &device, Object &&cb) { return downcast<peribox_device &>(device).m_console_intb.set_callback(std::forward<Object>(cb)); }
- template <class Object> static devcb_base &static_set_ready_callback(device_t &device, Object &&cb) { return downcast<peribox_device &>(device).m_datamux_ready.set_callback(std::forward<Object>(cb)); }
- template <class Object> static devcb_base &static_set_lcp_callback(device_t &device, Object &&cb) { return downcast<peribox_device &>(device).m_sgcpu_lcp.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &static_set_inta_callback(device_t &device, Object &&cb) { return downcast<peribox_device &>(device).m_slot1_inta.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &static_set_intb_callback(device_t &device, Object &&cb) { return downcast<peribox_device &>(device).m_slot1_intb.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &static_set_ready_callback(device_t &device, Object &&cb) { return downcast<peribox_device &>(device).m_slot1_ready.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &static_set_lcp_callback(device_t &device, Object &&cb) { return downcast<peribox_device &>(device).m_slot1_lcp.set_callback(std::forward<Object>(cb)); }
// Next eight methods are called from the console
DECLARE_READ8Z_MEMBER(readz) override;
DECLARE_WRITE8_MEMBER(write) override;
DECLARE_SETADDRESS_DBIN_MEMBER(setaddress_dbin) override;
- DECLARE_READ8Z_MEMBER(crureadz);
- DECLARE_WRITE8_MEMBER(cruwrite);
+ DECLARE_READ8Z_MEMBER(crureadz) override;
+ DECLARE_WRITE8_MEMBER(cruwrite) override;
+
DECLARE_WRITE_LINE_MEMBER(senila);
DECLARE_WRITE_LINE_MEMBER(senilb);
- DECLARE_WRITE_LINE_MEMBER( memen_in );
- DECLARE_WRITE_LINE_MEMBER( msast_in );
+ DECLARE_WRITE_LINE_MEMBER( memen_in ) override;
+ DECLARE_WRITE_LINE_MEMBER( msast_in ) override;
- DECLARE_WRITE_LINE_MEMBER( clock_in );
+ DECLARE_WRITE_LINE_MEMBER( clock_in ) override;
// Part of configuration
void set_prefix(int prefix) { m_address_prefix = prefix; }
@@ -69,11 +71,11 @@ protected:
virtual machine_config_constructor device_mconfig_additions() const override;
- // Next three methods call back the console
- devcb_write_line m_console_inta; // INTA line (Box to console)
- devcb_write_line m_console_intb; // INTB line
- devcb_write_line m_sgcpu_lcp; // For EVPC with SGCPU only
- devcb_write_line m_datamux_ready; // READY line (to the datamux)
+ // Next three methods call back the console via slot 1
+ devcb_write_line m_slot1_inta; // INTA line (Box to console)
+ devcb_write_line m_slot1_intb; // INTB line
+ devcb_write_line m_slot1_lcp; // For EVPC with SGCPU only
+ devcb_write_line m_slot1_ready; // READY line (to the datamux)
void set_slot_loaded(int slot, peribox_slot_device* slotdev);
peribox_slot_device *m_slot[9]; // for the sake of simplicity we donate the first two positions (0,1)
@@ -98,23 +100,14 @@ protected:
// Memory enable.
bool m_memen;
+
+ // Configured as a slot device (of the ioport)
+ bool m_ioport_connected;
};
/************************************************************************
Specific Box compositions
************************************************************************/
-/*
- Variation for EVPC. We'd like to offer the EVPC slot device only if
- we started the ti99_4ev driver.
-*/
-class peribox_ev_device : public peribox_device
-{
-public:
- peribox_ev_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
-protected:
- virtual machine_config_constructor device_mconfig_additions() const override;
-};
/*
Variation for SGCPU (TI-99/4P). We put the EVPC and the HSGPL in slots 2 and 3.
@@ -183,8 +176,6 @@ public:
// called from the box itself
void set_genmod(bool set);
- device_t* get_drive(const char* name);
-
protected:
void device_start() override;
void device_config_complete() override;
@@ -244,11 +235,11 @@ protected:
};
#define MCFG_PERIBOX_SLOT_ADD(_tag, _slot_intf) \
- MCFG_DEVICE_ADD(_tag, PERIBOX_SLOT, 0) \
+ MCFG_DEVICE_ADD(_tag, TI99_PERIBOX_SLOT, 0) \
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, nullptr, false)
#define MCFG_PERIBOX_SLOT_ADD_DEF(_tag, _slot_intf, _default) \
- MCFG_DEVICE_ADD(_tag, PERIBOX_SLOT, 0) \
+ MCFG_DEVICE_ADD(_tag, TI99_PERIBOX_SLOT, 0) \
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _default, false)
#define MCFG_PERIBOX_INTA_HANDLER( _inta ) \
@@ -265,12 +256,9 @@ protected:
} } } // end namespace bus::ti99::peb
-DECLARE_DEVICE_TYPE_NS(PERIBOX, bus::ti99::peb, peribox_device)
-DECLARE_DEVICE_TYPE_NS(PERIBOX_SLOT, bus::ti99::peb, peribox_slot_device)
-
-DECLARE_DEVICE_TYPE_NS(PERIBOX_EV, bus::ti99::peb, peribox_ev_device)
-DECLARE_DEVICE_TYPE_NS(PERIBOX_SG, bus::ti99::peb, peribox_sg_device)
-DECLARE_DEVICE_TYPE_NS(PERIBOX_GEN, bus::ti99::peb, peribox_gen_device)
-DECLARE_DEVICE_TYPE_NS(PERIBOX_998, bus::ti99::peb, peribox_998_device)
+DECLARE_DEVICE_TYPE_NS(TI99_PERIBOX, bus::ti99::peb, peribox_device)
+DECLARE_DEVICE_TYPE_NS(TI99_PERIBOX_SLOT, bus::ti99::peb, peribox_slot_device)
+DECLARE_DEVICE_TYPE_NS(TI99_PERIBOX_SG, bus::ti99::peb, peribox_sg_device)
+DECLARE_DEVICE_TYPE_NS(TI99_PERIBOX_GEN, bus::ti99::peb, peribox_gen_device)
#endif // MAME_BUS_TI99_PEB_PERIBOX_H
diff --git a/src/devices/bus/ti99/ti99defs.h b/src/devices/bus/ti99/ti99defs.h
index 87d43c5c38c..1f0d549e2bb 100644
--- a/src/devices/bus/ti99/ti99defs.h
+++ b/src/devices/bus/ti99/ti99defs.h
@@ -24,6 +24,7 @@
#define GROM0_TAG "console_grom_0"
#define GROM1_TAG "console_grom_1"
#define GROM2_TAG "console_grom_2"
+#define TI99_IOPORT_TAG "ioport"
#define JOYPORT_TAG "joyport"
#define EVPC_CONN_TAG "evpc_conn"
#define DATAMUX_TAG "datamux_16_8"
diff --git a/src/mame/drivers/geneve.cpp b/src/mame/drivers/geneve.cpp
index fb21be489e1..aabe45821cd 100644
--- a/src/mame/drivers/geneve.cpp
+++ b/src/mame/drivers/geneve.cpp
@@ -720,7 +720,7 @@ static MACHINE_CONFIG_START( geneve_60hz )
MCFG_MM58274C_DAY1(0) // sunday
// Peripheral expansion box (Geneve composition)
- MCFG_DEVICE_ADD( PERIBOX_TAG, PERIBOX_GEN, 0)
+ MCFG_DEVICE_ADD( PERIBOX_TAG, TI99_PERIBOX_GEN, 0)
MCFG_PERIBOX_INTA_HANDLER( WRITELINE(geneve_state, inta) )
MCFG_PERIBOX_INTB_HANDLER( WRITELINE(geneve_state, intb) )
MCFG_PERIBOX_READY_HANDLER( WRITELINE(geneve_state, ext_ready) )
diff --git a/src/mame/drivers/ti99_4p.cpp b/src/mame/drivers/ti99_4p.cpp
index 304009a6139..2bc246202d7 100644
--- a/src/mame/drivers/ti99_4p.cpp
+++ b/src/mame/drivers/ti99_4p.cpp
@@ -1011,7 +1011,7 @@ static MACHINE_CONFIG_START( ti99_4p_60hz )
MCFG_TMS9901_INTLEVEL_HANDLER( WRITE8( ti99_4p_state, tms9901_interrupt) )
// Peripheral expansion box (SGCPU composition)
- MCFG_DEVICE_ADD( PERIBOX_TAG, PERIBOX_SG, 0)
+ MCFG_DEVICE_ADD( PERIBOX_TAG, TI99_PERIBOX_SG, 0)
MCFG_PERIBOX_INTA_HANDLER( WRITELINE(ti99_4p_state, extint) )
MCFG_PERIBOX_INTB_HANDLER( WRITELINE(ti99_4p_state, notconnected) )
MCFG_PERIBOX_READY_HANDLER( WRITELINE(ti99_4p_state, ready_line) )
diff --git a/src/mame/drivers/ti99_4x.cpp b/src/mame/drivers/ti99_4x.cpp
index cfd2ee57201..f7ac932a245 100644
--- a/src/mame/drivers/ti99_4x.cpp
+++ b/src/mame/drivers/ti99_4x.cpp
@@ -52,7 +52,7 @@
#include "bus/ti99/internal/evpcconn.h"
#include "bus/ti99/joyport/joyport.h"
-#include "bus/ti99/peb/peribox.h"
+#include "bus/ti99/internal/ioport.h"
#include "machine/ram.h"
#include "softlist.h"
@@ -82,7 +82,7 @@ public:
m_cpu(*this, "maincpu"),
m_tms9901(*this, TMS9901_TAG),
m_gromport(*this, GROMPORT_TAG),
- m_peribox(*this, PERIBOX_TAG),
+ m_ioport(*this, TI99_IOPORT_TAG),
m_joyport(*this, JOYPORT_TAG),
m_datamux(*this, DATAMUX_TAG),
m_video(*this, VDP_TAG),
@@ -167,7 +167,7 @@ private:
required_device<tms9900_device> m_cpu;
required_device<tms9901_device> m_tms9901;
required_device<bus::ti99::internal::gromport_device> m_gromport;
- required_device<bus::ti99::peb::peribox_device> m_peribox;
+ required_device<bus::ti99::internal::ioport_device> m_ioport;
required_device<bus::ti99::joyport::joyport_device> m_joyport;
required_device<bus::ti99::internal::datamux_device> m_datamux;
optional_device<tms9928a_device> m_video;
@@ -397,7 +397,7 @@ READ8_MEMBER( ti99_4x_state::cruread )
// The QI version does not propagate the CRU signals to the cartridge slot
if (m_model != MODEL_4QI) m_gromport->crureadz(space, offset<<4, &value);
- m_peribox->crureadz(space, offset<<4, &value);
+ m_ioport->crureadz(space, offset<<4, &value);
return value;
}
@@ -407,7 +407,7 @@ WRITE8_MEMBER( ti99_4x_state::cruwrite )
if (TRACE_CRU) logerror("ti99_4x: write access to CRU address %04x\n", offset << 1);
// The QI version does not propagate the CRU signals to the cartridge slot
if (m_model != MODEL_4QI) m_gromport->cruwrite(space, offset<<1, data);
- m_peribox->cruwrite(space, offset<<1, data);
+ m_ioport->cruwrite(space, offset<<1, data);
}
WRITE8_MEMBER( ti99_4x_state::external_operation )
@@ -637,7 +637,7 @@ READ8_MEMBER( ti99_4x_state::interrupt_level )
WRITE_LINE_MEMBER( ti99_4x_state::clock_out )
{
m_datamux->clock_in(state);
- m_peribox->clock_in(state);
+ m_ioport->clock_in(state);
}
/*
@@ -811,8 +811,6 @@ void ti99_4x_state::register_save_state()
MACHINE_START_MEMBER(ti99_4x_state,ti99_4)
{
- m_peribox->senila(CLEAR_LINE);
- m_peribox->senilb(CLEAR_LINE);
m_nready_combined = 0;
m_model = MODEL_4;
register_save_state();
@@ -875,11 +873,10 @@ static MACHINE_CONFIG_START( ti99_4 )
// Software list
MCFG_SOFTWARE_LIST_ADD("cart_list_ti99", "ti99_cart")
- // Peripheral expansion box
- MCFG_DEVICE_ADD( PERIBOX_TAG, PERIBOX, 0)
- MCFG_PERIBOX_INTA_HANDLER( WRITELINE(ti99_4x_state, extint) )
- MCFG_PERIBOX_INTB_HANDLER( WRITELINE(ti99_4x_state, notconnected) )
- MCFG_PERIBOX_READY_HANDLER( DEVWRITELINE(DATAMUX_TAG, bus::ti99::internal::datamux_device, ready_line) )
+ // Input/output port
+ MCFG_IOPORT_ADD( TI99_IOPORT_TAG )
+ MCFG_IOPORT_EXTINT_HANDLER( WRITELINE(ti99_4x_state, extint) )
+ MCFG_IOPORT_READY_HANDLER( DEVWRITELINE(DATAMUX_TAG, bus::ti99::internal::datamux_device, ready_line) )
// Sound hardware
MCFG_SPEAKER_STANDARD_MONO("sound_out")
@@ -935,8 +932,6 @@ MACHINE_CONFIG_END
MACHINE_START_MEMBER(ti99_4x_state,ti99_4a)
{
- m_peribox->senila(CLEAR_LINE);
- m_peribox->senilb(CLEAR_LINE);
m_nready_combined = 0;
m_model = MODEL_4A;
register_save_state();
@@ -995,11 +990,10 @@ static MACHINE_CONFIG_START( ti99_4a )
// Software list
MCFG_SOFTWARE_LIST_ADD("cart_list_ti99", "ti99_cart")
- // Peripheral expansion box
- MCFG_DEVICE_ADD( PERIBOX_TAG, PERIBOX, 0)
- MCFG_PERIBOX_INTA_HANDLER( WRITELINE(ti99_4x_state, extint) )
- MCFG_PERIBOX_INTB_HANDLER( WRITELINE(ti99_4x_state, notconnected) )
- MCFG_PERIBOX_READY_HANDLER( DEVWRITELINE(DATAMUX_TAG, bus::ti99::internal::datamux_device, ready_line) )
+ // Input/output port
+ MCFG_IOPORT_ADD( TI99_IOPORT_TAG )
+ MCFG_IOPORT_EXTINT_HANDLER( WRITELINE(ti99_4x_state, extint) )
+ MCFG_IOPORT_READY_HANDLER( DEVWRITELINE(DATAMUX_TAG, bus::ti99::internal::datamux_device, ready_line) )
// Sound hardware
MCFG_SPEAKER_STANDARD_MONO("sound_out")
@@ -1059,8 +1053,6 @@ MACHINE_CONFIG_END
MACHINE_START_MEMBER(ti99_4x_state, ti99_4qi)
{
- m_peribox->senila(CLEAR_LINE);
- m_peribox->senilb(CLEAR_LINE);
m_model = MODEL_4QI;
m_nready_combined = 0;
register_save_state();
@@ -1093,8 +1085,6 @@ MACHINE_CONFIG_END
MACHINE_START_MEMBER(ti99_4x_state, ti99_4ev)
{
- m_peribox->senila(CLEAR_LINE);
- m_peribox->senilb(CLEAR_LINE);
m_nready_combined = 0;
m_model = MODEL_4A;
// Removing the TMS9928a requires to add a replacement for the GROMCLK.
@@ -1159,11 +1149,10 @@ static MACHINE_CONFIG_START( ti99_4ev_60hz )
// Software list
MCFG_SOFTWARE_LIST_ADD("cart_list_ti99", "ti99_cart")
- // Peripheral expansion box
- MCFG_DEVICE_ADD( PERIBOX_TAG, PERIBOX_EV, 0)
- MCFG_PERIBOX_INTA_HANDLER( WRITELINE(ti99_4x_state, extint) )
- MCFG_PERIBOX_INTB_HANDLER( WRITELINE(ti99_4x_state, notconnected) )
- MCFG_PERIBOX_READY_HANDLER( DEVWRITELINE(DATAMUX_TAG, bus::ti99::internal::datamux_device, ready_line) )
+ // Input/output port
+ MCFG_IOPORT_ADD( TI99_IOPORT_TAG )
+ MCFG_IOPORT_EXTINT_HANDLER( WRITELINE(ti99_4x_state, extint) )
+ MCFG_IOPORT_READY_HANDLER( DEVWRITELINE(DATAMUX_TAG, bus::ti99::internal::datamux_device, ready_line) )
// Cassette drives
MCFG_SPEAKER_STANDARD_MONO("cass_out")
diff --git a/src/mame/drivers/ti99_8.cpp b/src/mame/drivers/ti99_8.cpp
index 62c6cb9f15c..0bf31fcdc76 100644
--- a/src/mame/drivers/ti99_8.cpp
+++ b/src/mame/drivers/ti99_8.cpp
@@ -185,7 +185,7 @@ Known Issues (MZ, 2010-11-07)
#include "bus/ti99/internal/gromport.h"
#include "bus/ti99/joyport/joyport.h"
-#include "bus/ti99/peb/peribox.h"
+#include "bus/ti99/internal/ioport.h"
#include "softlist.h"
#include "speaker.h"
@@ -218,7 +218,7 @@ public:
m_cpu(*this, "maincpu"),
m_tms9901(*this, TMS9901_TAG),
m_gromport(*this, GROMPORT_TAG),
- m_peribox(*this, PERIBOX_TAG),
+ m_ioport(*this, TI99_IOPORT_TAG),
m_mainboard(*this, MAINBOARD8_TAG),
m_joyport(*this, JOYPORT_TAG),
m_cassette(*this, "cassette")
@@ -276,7 +276,7 @@ private:
required_device<tms9995_device> m_cpu;
required_device<tms9901_device> m_tms9901;
required_device<bus::ti99::internal::gromport_device> m_gromport;
- required_device<bus::ti99::peb::peribox_device> m_peribox;
+ required_device<bus::ti99::internal::ioport_device> m_ioport;
required_device<bus::ti99::internal::mainboard8_device> m_mainboard;
required_device<bus::ti99::joyport::joyport_device> m_joyport;
required_device<cassette_image_device> m_cassette;
@@ -418,7 +418,7 @@ READ8_MEMBER( ti99_8_state::cruread )
// Also, we translate the bit addresses to base addresses
m_mainboard->crureadz(space, offset<<4, &value);
m_gromport->crureadz(space, offset<<4, &value);
- m_peribox->crureadz(space, offset<<4, &value);
+ m_ioport->crureadz(space, offset<<4, &value);
if (TRACE_CRU) logerror("ti99_8: CRU %04x -> %02x\n", offset<<4, value);
return value;
@@ -429,7 +429,7 @@ WRITE8_MEMBER( ti99_8_state::cruwrite )
if (TRACE_CRU) logerror("ti99_8: CRU %04x <- %x\n", offset<<1, data);
m_mainboard->cruwrite(space, offset<<1, data);
m_gromport->cruwrite(space, offset<<1, data);
- m_peribox->cruwrite(space, offset<<1, data);
+ m_ioport->cruwrite(space, offset<<1, data);
}
/***************************************************************************
@@ -685,10 +685,6 @@ WRITE_LINE_MEMBER( ti99_8_state::dbin_line )
MACHINE_START_MEMBER(ti99_8_state,ti99_8)
{
- m_peribox->senila(CLEAR_LINE);
- m_peribox->senilb(CLEAR_LINE);
- // m_mainboard->set_gromport(m_gromport);
-
// Need to configure the speech ROM for inverse bit order
speechrom_device* mem = subdevice<speechrom_device>(SPEECHROM_REG);
mem->set_reverse_bit_order(true);
@@ -762,11 +758,10 @@ static MACHINE_CONFIG_START( ti99_8 )
/* Software list */
MCFG_SOFTWARE_LIST_ADD("cart_list_ti99", "ti99_cart")
- // Peripheral expansion box
- MCFG_DEVICE_ADD( PERIBOX_TAG, PERIBOX_998, 0)
- MCFG_PERIBOX_INTA_HANDLER( WRITELINE(ti99_8_state, extint) )
- MCFG_PERIBOX_INTB_HANDLER( WRITELINE(ti99_8_state, notconnected) )
- MCFG_PERIBOX_READY_HANDLER( DEVWRITELINE(MAINBOARD8_TAG, bus::ti99::internal::mainboard8_device, pbox_ready) )
+ // I/O port
+ MCFG_IOPORT_ADD( TI99_IOPORT_TAG )
+ MCFG_IOPORT_EXTINT_HANDLER( WRITELINE(ti99_8_state, extint) )
+ MCFG_IOPORT_READY_HANDLER( DEVWRITELINE(MAINBOARD8_TAG, bus::ti99::internal::mainboard8_device, pbox_ready) )
// Sound hardware
MCFG_SPEAKER_STANDARD_MONO("sound_out")