summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/geneve.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/geneve.cpp')
-rw-r--r--src/mame/drivers/geneve.cpp103
1 files changed, 69 insertions, 34 deletions
diff --git a/src/mame/drivers/geneve.cpp b/src/mame/drivers/geneve.cpp
index ddd8aacc807..c0f40b8769a 100644
--- a/src/mame/drivers/geneve.cpp
+++ b/src/mame/drivers/geneve.cpp
@@ -190,23 +190,38 @@
#include "sound/sn76496.h"
#include "bus/ti99/internal/genboard.h"
+#include "bus/ti99/internal/genkbd.h"
#include "bus/ti99/colorbus/colorbus.h"
#include "bus/ti99/joyport/joyport.h"
#include "bus/ti99/peb/peribox.h"
+#include "bus/pc_kbd/keyboards.h"
+#include "bus/pc_kbd/pc_kbdc.h"
+#include "bus/pc_kbd/pcxt83.h"
+#include "bus/pc_kbd/keytro.h"
+
#include "speaker.h"
#define LOG_WARN (1U<<1)
#define LOG_READY (1U<<2)
#define LOG_LINES (1U<<3)
#define LOG_CRU (1U<<4)
+#define LOG_CRUKEY (1U<<5)
// Minimum log should be settings and warnings
#define VERBOSE ( LOG_GENERAL | LOG_WARN )
#include "logmacro.h"
+
+void geneve_xt_keyboards(device_slot_interface &device)
+{
+ device.option_add(STR_KBD_KEYTRONIC_PC3270, PC_KBD_KEYTRONIC_PC3270);
+ device.option_add(STR_KBD_IBM_PC_XT_83, PC_KBD_IBM_PC_XT_83);
+ device.option_add(STR_KBD_GENEVE_XT_101_HLE, KBD_GENEVE_XT_101_HLE);
+}
+
class geneve_state : public driver_device
{
public:
@@ -214,11 +229,11 @@ public:
: driver_device(mconfig, type, tag),
m_cpu(*this, "maincpu"),
m_tms9901(*this, TI_TMS9901_TAG),
- m_keyboard(*this, GENEVE_KEYBOARD_TAG),
- m_mapper(*this, GENEVE_MAPPER_TAG),
+ m_gatearray(*this, GENEVE_GATE_ARRAY_TAG),
m_peribox(*this, TI_PERIBOX_TAG),
m_joyport(*this, TI_JOYPORT_TAG),
m_colorbus(*this, COLORBUS_TAG),
+ m_kbdconn(*this, GENEVE_KEYBOARD_CONN_TAG),
m_left_button(0)
{
}
@@ -240,9 +255,13 @@ private:
DECLARE_WRITE_LINE_MEMBER(VDP_reset);
DECLARE_WRITE_LINE_MEMBER(joystick_select);
DECLARE_WRITE_LINE_MEMBER(extbus_wait_states);
+ DECLARE_WRITE_LINE_MEMBER(keyboard_reset);
DECLARE_WRITE_LINE_MEMBER(video_wait_states);
DECLARE_WRITE_LINE_MEMBER(left_mouse_button);
+ DECLARE_WRITE_LINE_MEMBER(keyboard_clock_line);
+ DECLARE_WRITE_LINE_MEMBER(keyboard_data_line);
+
DECLARE_WRITE_LINE_MEMBER(clock_out);
void external_operation(offs_t offset, uint8_t data);
@@ -253,16 +272,17 @@ private:
required_device<tms9995_device> m_cpu;
required_device<tms9901_device> m_tms9901;
- required_device<bus::ti99::internal::geneve_keyboard_device> m_keyboard;
- required_device<bus::ti99::internal::geneve_mapper_device> m_mapper;
- required_device<bus::ti99::peb::peribox_device> m_peribox;
- required_device<bus::ti99::joyport::joyport_device> m_joyport;
+ required_device<bus::ti99::internal::geneve_gate_array_device> m_gatearray;
+ required_device<bus::ti99::peb::peribox_device> m_peribox;
+ required_device<bus::ti99::joyport::joyport_device> m_joyport;
required_device<bus::ti99::colorbus::v9938_colorbus_device> m_colorbus;
+ required_device<pc_kbdc_device> m_kbdconn;
DECLARE_WRITE_LINE_MEMBER( inta );
DECLARE_WRITE_LINE_MEMBER( intb );
DECLARE_WRITE_LINE_MEMBER( ext_ready );
DECLARE_WRITE_LINE_MEMBER( mapper_ready );
+ DECLARE_WRITE_LINE_MEMBER( keyboard_int );
virtual void machine_start() override;
virtual void machine_reset() override;
@@ -291,12 +311,12 @@ private:
void geneve_state::memmap(address_map &map)
{
- map(0x0000, 0xffff).rw(GENEVE_MAPPER_TAG, FUNC(bus::ti99::internal::geneve_mapper_device::readm), FUNC(bus::ti99::internal::geneve_mapper_device::writem));
+ map(0x0000, 0xffff).rw(GENEVE_GATE_ARRAY_TAG, FUNC(bus::ti99::internal::geneve_gate_array_device::readm), FUNC(bus::ti99::internal::geneve_gate_array_device::writem));
}
void geneve_state::memmap_setaddress(address_map &map)
{
- map(0x0000, 0xffff).w(GENEVE_MAPPER_TAG, FUNC(bus::ti99::internal::geneve_mapper_device::setaddress));
+ map(0x0000, 0xffff).w(GENEVE_GATE_ARRAY_TAG, FUNC(bus::ti99::internal::geneve_gate_array_device::setaddress));
}
/*
@@ -316,7 +336,7 @@ void geneve_state::crumap(address_map &map)
static INPUT_PORTS_START(geneve_common)
PORT_START( "BOOTROM" )
- PORT_CONFNAME( 0x03, GENEVE_EPROM, "Boot from" ) PORT_CHANGED_MEMBER(GENEVE_MAPPER_TAG, bus::ti99::internal::geneve_mapper_device, settings_changed, 3)
+ PORT_CONFNAME( 0x03, GENEVE_EPROM, "Boot from" ) PORT_CHANGED_MEMBER(GENEVE_GATE_ARRAY_TAG, bus::ti99::internal::geneve_gate_array_device, settings_changed, 3)
PORT_CONFSETTING( GENEVE_EPROM, "EPROM" )
PORT_CONFSETTING( GENEVE_PFM512, "PFM 512" )
PORT_CONFSETTING( GENEVE_PFM512A, "PFM 512A" )
@@ -343,10 +363,10 @@ static INPUT_PORTS_START(genmod)
PORT_INCLUDE(geneve_common)
PORT_START( "GENMODDIPS" )
- PORT_DIPNAME( GENEVE_GM_TURBO, 0x00, "Genmod Turbo mode") PORT_CHANGED_MEMBER(GENEVE_MAPPER_TAG, bus::ti99::internal::genmod_mapper_device, setgm_changed, 1)
+ PORT_DIPNAME( GENEVE_GM_TURBO, 0x00, "Genmod Turbo mode") PORT_CHANGED_MEMBER(GENEVE_GATE_ARRAY_TAG, bus::ti99::internal::genmod_gate_array_device, setgm_changed, 1)
PORT_CONFSETTING( 0x00, DEF_STR( Off ))
PORT_CONFSETTING( GENEVE_GM_TURBO, DEF_STR( On ))
- PORT_DIPNAME( GENEVE_GM_TIM, GENEVE_GM_TIM, "Genmod TI mode") PORT_CHANGED_MEMBER(GENEVE_MAPPER_TAG, bus::ti99::internal::genmod_mapper_device, setgm_changed, 2)
+ PORT_DIPNAME( GENEVE_GM_TIM, GENEVE_GM_TIM, "Genmod TI mode") PORT_CHANGED_MEMBER(GENEVE_GATE_ARRAY_TAG, bus::ti99::internal::genmod_gate_array_device, setgm_changed, 2)
PORT_CONFSETTING( 0x00, DEF_STR( Off ))
PORT_CONFSETTING( GENEVE_GM_TIM, DEF_STR( On ))
@@ -389,36 +409,36 @@ void geneve_state::cruwrite(offs_t offset, uint8_t data)
LOGMASKED(LOG_CRU, "Set capslock flag = %02x\n", data);
break;
case 8:
- LOGMASKED(LOG_CRU, "Set keyboard clock flag = %02x\n", data);
- m_keyboard->clock_control((data!=0)? ASSERT_LINE : CLEAR_LINE);
+ LOGMASKED(LOG_CRUKEY, "Set keyboard clock = %02x\n", data);
+ m_gatearray->set_keyboard_clock(data);
break;
case 9:
- LOGMASKED(LOG_CRU, "Set keyboard scan flag = %02x\n", data);
- m_keyboard->send_scancodes((data!=0)? ASSERT_LINE : CLEAR_LINE);
+ LOGMASKED(LOG_CRUKEY, "Enable keyboard shift reg = %02x\n", data);
+ m_gatearray->enable_shift_register(data);
break;
case 10:
LOGMASKED(LOG_CRU, "Geneve mode = %02x\n", data);
- m_mapper->set_geneve_mode(data!=0);
+ m_gatearray->set_geneve_mode(data!=0);
break;
case 11:
LOGMASKED(LOG_CRU, "Direct mode = %02x\n", data);
- m_mapper->set_direct_mode(data!=0);
+ m_gatearray->set_direct_mode(data!=0);
break;
case 12:
LOGMASKED(LOG_CRU, "Cartridge size 8K = %02x\n", data);
- m_mapper->set_cartridge_size((data!=0)? 0x2000 : 0x4000);
+ m_gatearray->set_cartridge_size((data!=0)? 0x2000 : 0x4000);
break;
case 13:
LOGMASKED(LOG_CRU, "Cartridge writable 6000 = %02x\n", data);
- m_mapper->set_cartridge_writable(0x6000, (data!=0));
+ m_gatearray->set_cartridge_writable(0x6000, (data!=0));
break;
case 14:
LOGMASKED(LOG_CRU, "Cartridge writable 7000 = %02x\n", data);
- m_mapper->set_cartridge_writable(0x7000, (data!=0));
+ m_gatearray->set_cartridge_writable(0x7000, (data!=0));
break;
case 15:
LOGMASKED(LOG_CRU, "Extra wait states = %02x\n", data==0);
- m_mapper->set_extra_waitstates(data==0); // let's use the inverse semantics
+ m_gatearray->set_extra_waitstates(data==0); // let's use the inverse semantics
break;
default:
LOGMASKED(LOG_WARN, "set CRU address %04x=%02x ignored\n", addroff, data);
@@ -531,6 +551,7 @@ WRITE_LINE_MEMBER( geneve_state::joystick_select )
m_joyport->write_port((state==ASSERT_LINE)? 1:2);
}
+
/*
Write external mem cycles (0=long, 1=short)
*/
@@ -546,11 +567,19 @@ WRITE_LINE_MEMBER( geneve_state::extbus_wait_states )
WRITE_LINE_MEMBER( geneve_state::video_wait_states )
{
LOGMASKED(LOG_LINES, "Video wait states set to %d\n", state);
- m_mapper->set_video_waitstates(state==ASSERT_LINE);
+ m_gatearray->set_video_waitstates(state==ASSERT_LINE);
m_video_wait = (state!=0)? ASSERT_LINE : CLEAR_LINE;
}
/*
+ Keyboard reset (active low).
+*/
+WRITE_LINE_MEMBER( geneve_state::keyboard_reset )
+{
+ LOGMASKED(LOG_CRUKEY, "Keyboard reset %d\n", state);
+}
+
+/*
Called by the 9901 core whenever the state of INTREQ and IC0-3 changes.
As with the TI-99/4A, the interrupt level is delivered as the offset,
but again it is ignored. Anyway, the TMS9995 has only two external inputs
@@ -635,7 +664,7 @@ void geneve_state::external_operation(offs_t offset, uint8_t data)
WRITE_LINE_MEMBER( geneve_state::clock_out )
{
m_tms9901->phi_line(state);
- m_mapper->clock_in(state);
+ m_gatearray->clock_in(state);
}
void geneve_state::init_geneve()
@@ -679,9 +708,10 @@ void geneve_state::geneve(machine_config &config)
{
geneve_common(config);
- // Mapper
- GENEVE_MAPPER(config, m_mapper, 0);
- m_mapper->ready_cb().set(FUNC(geneve_state::mapper_ready));
+ // Gate array
+ GENEVE_GATE_ARRAY(config, m_gatearray, 0);
+ m_gatearray->ready_cb().set(FUNC(geneve_state::mapper_ready));
+ m_gatearray->kbdint_cb().set(FUNC(geneve_state::keyboard_interrupt));
// Peripheral expansion box (Geneve composition)
TI99_PERIBOX_GEN(config, m_peribox, 0);
@@ -695,8 +725,9 @@ void geneve_state::genmod(machine_config &config)
geneve_common(config);
// Mapper
- GENMOD_MAPPER(config, m_mapper, 0);
- m_mapper->ready_cb().set(FUNC(geneve_state::mapper_ready));
+ GENMOD_GATE_ARRAY(config, m_gatearray, 0);
+ m_gatearray->ready_cb().set(FUNC(geneve_state::mapper_ready));
+ m_gatearray->kbdint_cb().set(FUNC(geneve_state::keyboard_interrupt));
// Peripheral expansion box (Geneve composition with Genmod and plugged-in Memex)
TI99_PERIBOX_GENMOD(config, m_peribox, 0);
@@ -737,12 +768,12 @@ void geneve_state::geneve_common(machine_config &config)
m_tms9901->p_out_cb(0).set(FUNC(geneve_state::peripheral_bus_reset));
m_tms9901->p_out_cb(1).set(FUNC(geneve_state::VDP_reset));
m_tms9901->p_out_cb(2).set(FUNC(geneve_state::joystick_select));
- m_tms9901->p_out_cb(4).set(GENEVE_MAPPER_TAG, FUNC(bus::ti99::internal::geneve_mapper_device::pfm_select_lsb));
- m_tms9901->p_out_cb(5).set(GENEVE_MAPPER_TAG, FUNC(bus::ti99::internal::geneve_mapper_device::pfm_output_enable));
- m_tms9901->p_out_cb(6).set(GENEVE_KEYBOARD_TAG, FUNC(bus::ti99::internal::geneve_keyboard_device::reset_line));
+ m_tms9901->p_out_cb(4).set(GENEVE_GATE_ARRAY_TAG, FUNC(bus::ti99::internal::geneve_gate_array_device::pfm_select_lsb));
+ m_tms9901->p_out_cb(5).set(GENEVE_GATE_ARRAY_TAG, FUNC(bus::ti99::internal::geneve_gate_array_device::pfm_output_enable));
+ m_tms9901->p_out_cb(6).set(FUNC(geneve_state::keyboard_reset));
m_tms9901->p_out_cb(7).set(FUNC(geneve_state::extbus_wait_states));
m_tms9901->p_out_cb(9).set(FUNC(geneve_state::video_wait_states));
- m_tms9901->p_out_cb(13).set(GENEVE_MAPPER_TAG, FUNC(bus::ti99::internal::geneve_mapper_device::pfm_select_msb));
+ m_tms9901->p_out_cb(13).set(GENEVE_GATE_ARRAY_TAG, FUNC(bus::ti99::internal::geneve_gate_array_device::pfm_select_msb));
m_tms9901->intreq_cb().set(FUNC(geneve_state::tms9901_interrupt));
// Clock
@@ -754,8 +785,12 @@ void geneve_state::geneve_common(machine_config &config)
soundgen.ready_cb().set(FUNC(geneve_state::ext_ready));
soundgen.add_route(ALL_OUTPUTS, "sound_out", 0.75);
- // User interface devices
- GENEVE_KEYBOARD(config, m_keyboard, 0).int_cb().set(FUNC(geneve_state::keyboard_interrupt));
+ // User interface devices: PC-style keyboard, joystick port, mouse connector
+ PC_KBDC(config, m_kbdconn, 0);
+ PC_KBDC_SLOT(config, "kbd", geneve_xt_keyboards, STR_KBD_GENEVE_XT_101_HLE).set_pc_kbdc_slot(m_kbdconn);
+ m_kbdconn->out_clock_cb().set(GENEVE_GATE_ARRAY_TAG, FUNC(bus::ti99::internal::geneve_gate_array_device::kbdclk));
+ m_kbdconn->out_data_cb().set(GENEVE_GATE_ARRAY_TAG, FUNC(bus::ti99::internal::geneve_gate_array_device::kbddata));
+
TI99_JOYPORT(config, m_joyport, 0, ti99_joyport_options_plain, "twinjoy");
V9938_COLORBUS(config, m_colorbus, 0, ti99_colorbus_options, nullptr);
m_colorbus->extra_button_cb().set(FUNC(geneve_state::left_mouse_button));