summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/swtpc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/swtpc.cpp')
-rw-r--r--src/mame/drivers/swtpc.cpp199
1 files changed, 132 insertions, 67 deletions
diff --git a/src/mame/drivers/swtpc.cpp b/src/mame/drivers/swtpc.cpp
index aa73c8fadca..cd7acfc2461 100644
--- a/src/mame/drivers/swtpc.cpp
+++ b/src/mame/drivers/swtpc.cpp
@@ -2,26 +2,24 @@
// copyright-holders:Robbbert
/***************************************************************************
- SWTPC 6800
+ SWTPC 6800 Computer System
10/12/2009 Skeleton driver.
http://www.swtpc.com/mholley/swtpc_6800.htm
- bios 0 (SWTBUG) is made for a PIA (parallel) interface.
- bios 1 (MIKBUG) is made for a ACIA (serial) interface at the same address.
+ MIKBUG is made for a PIA (parallel) interface.
+ SWTBUG is made for a ACIA (serial) interface at the same address.
MIKBUG will actually read the bits as they arrive and assemble a byte.
-
- Since the interface is optional, it is not on the schematics, so I've
- looked at the code and come up with something horrible that works.
+ Its delay loops are based on an underclocked XTAL.
Note: All commands must be in uppercase. See the SWTBUG manual.
ToDo:
- - Add PIA and work out the best way to hook up the keyboard. As can be
- seen from the code below, it might be tricky.
+ - Add more SS-50 interface slot options
+ - Emulate MP-A2 revision of CPU board, with four 2716 ROM sockets
+ and allowance for extra RAM boards at A000-BFFF and C000-DFFF
- - Finish conversion to modern.
Commands:
B Breakpoint
@@ -42,59 +40,42 @@ Z Goto Prom (0xC000)
#include "emu.h"
#include "cpu/m6800/m6800.h"
-#include "machine/terminal.h"
-
-#define TERMINAL_TAG "terminal"
+#include "machine/input_merger.h"
+#include "machine/mc14411.h"
+#include "machine/ram.h"
+#include "bus/ss50/interface.h"
+#include "bus/ss50/mps.h"
class swtpc_state : public driver_device
{
public:
swtpc_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_terminal(*this, TERMINAL_TAG)
- {
- }
-
- DECLARE_READ8_MEMBER(swtpc_status_r);
- DECLARE_READ8_MEMBER(swtpc_terminal_r);
- DECLARE_READ8_MEMBER(swtpc_tricky_r);
- void kbd_put(u8 data);
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_ram(*this, "ram")
+ , m_brg(*this, "brg")
+ { }
-protected:
- virtual void machine_reset() override;
+ virtual void machine_start() override;
+private:
required_device<cpu_device> m_maincpu;
- required_device<generic_terminal_device> m_terminal;
- uint8_t m_term_data;
+ required_device<ram_device> m_ram;
+ required_device<mc14411_device> m_brg;
};
-// bit 0 - ready to receive a character; bit 1 - ready to send a character to the terminal
-READ8_MEMBER( swtpc_state::swtpc_status_r )
-{
- return (m_term_data) ? 3 : 0x82;
-}
-
-READ8_MEMBER( swtpc_state::swtpc_terminal_r )
-{
- uint8_t ret = m_term_data;
- m_term_data = 0;
- return ret;
-}
-
-READ8_MEMBER( swtpc_state::swtpc_tricky_r )
-{
- uint8_t ret = m_term_data;
- return ret;
-}
-
-static ADDRESS_MAP_START(swtpc_mem, AS_PROGRAM, 8, swtpc_state)
+static ADDRESS_MAP_START(mem_map, AS_PROGRAM, 8, swtpc_state)
ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE( 0x8004, 0x8004 ) AM_READ(swtpc_status_r)
- AM_RANGE( 0x8005, 0x8005 ) AM_READ(swtpc_terminal_r) AM_DEVWRITE(TERMINAL_TAG, generic_terminal_device, write)
- AM_RANGE( 0x8007, 0x8007 ) AM_READ(swtpc_tricky_r)
- AM_RANGE( 0xa000, 0xa07f ) AM_RAM
- AM_RANGE( 0xe000, 0xe3ff ) AM_MIRROR(0x1c00) AM_ROM
+ AM_RANGE(0x8000, 0x8003) AM_MIRROR(0x1fc0) AM_DEVREADWRITE("io0", ss50_interface_port_device, read, write)
+ AM_RANGE(0x8004, 0x8007) AM_MIRROR(0x1fc0) AM_DEVREADWRITE("io1", ss50_interface_port_device, read, write)
+ AM_RANGE(0x8008, 0x800b) AM_MIRROR(0x1fc0) AM_DEVREADWRITE("io2", ss50_interface_port_device, read, write)
+ AM_RANGE(0x800c, 0x800f) AM_MIRROR(0x1fc0) AM_DEVREADWRITE("io3", ss50_interface_port_device, read, write)
+ AM_RANGE(0x8010, 0x8013) AM_MIRROR(0x1fc0) AM_DEVREADWRITE("io4", ss50_interface_port_device, read, write)
+ AM_RANGE(0x8014, 0x8017) AM_MIRROR(0x1fc0) AM_DEVREADWRITE("io5", ss50_interface_port_device, read, write)
+ AM_RANGE(0x8018, 0x801b) AM_MIRROR(0x1fc0) AM_DEVREADWRITE("io6", ss50_interface_port_device, read, write)
+ AM_RANGE(0x801c, 0x801f) AM_MIRROR(0x1fc0) AM_DEVREADWRITE("io7", ss50_interface_port_device, read, write)
+ AM_RANGE(0xa000, 0xa07f) AM_RAM // MCM6810
+ AM_RANGE(0xe000, 0xe3ff) AM_MIRROR(0x1c00) AM_ROM AM_REGION("mcm6830", 0)
ADDRESS_MAP_END
/* Input ports */
@@ -102,36 +83,120 @@ static INPUT_PORTS_START( swtpc )
INPUT_PORTS_END
-void swtpc_state::machine_reset()
+void swtpc_state::machine_start()
{
-}
+ m_brg->rsa_w(0);
+ m_brg->rsb_w(1);
-void swtpc_state::kbd_put(u8 data)
-{
- m_term_data = data;
+ m_maincpu->space(AS_PROGRAM).install_ram(0, m_ram->size() - 1, m_ram->pointer());
}
static MACHINE_CONFIG_START( swtpc )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", M6800, XTAL_1MHz)
- MCFG_CPU_PROGRAM_MAP(swtpc_mem)
+ MCFG_CPU_ADD("maincpu", M6800, XTAL_1_8432MHz / 2)
+ MCFG_CPU_PROGRAM_MAP(mem_map)
+
+ MCFG_DEVICE_ADD("brg", MC14411, XTAL_1_8432MHz)
+ MCFG_MC14411_F7_CB(DEVWRITELINE("io0", ss50_interface_port_device, f600_1200_w)) // 1200b
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io1", ss50_interface_port_device, f600_1200_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io2", ss50_interface_port_device, f600_1200_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io3", ss50_interface_port_device, f600_1200_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io4", ss50_interface_port_device, f600_1200_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io5", ss50_interface_port_device, f600_1200_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io6", ss50_interface_port_device, f600_1200_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io7", ss50_interface_port_device, f600_1200_w))
+ MCFG_MC14411_F8_CB(DEVWRITELINE("io0", ss50_interface_port_device, f600_4800_w)) // 600b
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io1", ss50_interface_port_device, f600_4800_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io2", ss50_interface_port_device, f600_4800_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io3", ss50_interface_port_device, f600_4800_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io4", ss50_interface_port_device, f600_4800_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io5", ss50_interface_port_device, f600_4800_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io6", ss50_interface_port_device, f600_4800_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io7", ss50_interface_port_device, f600_4800_w))
+ MCFG_MC14411_F9_CB(DEVWRITELINE("io0", ss50_interface_port_device, f300_w)) // 300b
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io1", ss50_interface_port_device, f300_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io2", ss50_interface_port_device, f300_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io3", ss50_interface_port_device, f300_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io4", ss50_interface_port_device, f300_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io5", ss50_interface_port_device, f300_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io6", ss50_interface_port_device, f300_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io7", ss50_interface_port_device, f300_w))
+ MCFG_MC14411_F11_CB(DEVWRITELINE("io0", ss50_interface_port_device, f150_9600_w)) // 150b
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io1", ss50_interface_port_device, f150_9600_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io2", ss50_interface_port_device, f150_9600_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io3", ss50_interface_port_device, f150_9600_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io4", ss50_interface_port_device, f150_9600_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io5", ss50_interface_port_device, f150_9600_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io6", ss50_interface_port_device, f150_9600_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io7", ss50_interface_port_device, f150_9600_w))
+ MCFG_MC14411_F13_CB(DEVWRITELINE("io0", ss50_interface_port_device, f110_w)) // 110b
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io1", ss50_interface_port_device, f110_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io2", ss50_interface_port_device, f110_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io3", ss50_interface_port_device, f110_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io4", ss50_interface_port_device, f110_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io5", ss50_interface_port_device, f110_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io6", ss50_interface_port_device, f110_w))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("io7", ss50_interface_port_device, f110_w))
+
+ MCFG_SS50_INTERFACE_PORT_ADD("io0", default_2rs_devices, nullptr)
+ MCFG_SS50_INTERFACE_IRQ_CALLBACK(DEVWRITELINE("mainirq", input_merger_device, in_w<0>))
+ MCFG_SS50_INTERFACE_FIRQ_CALLBACK(DEVWRITELINE("mainnmi", input_merger_device, in_w<0>))
+ MCFG_SS50_INTERFACE_PORT_ADD("io1", default_2rs_devices, "mps")
+ MCFG_SS50_INTERFACE_IRQ_CALLBACK(DEVWRITELINE("mainirq", input_merger_device, in_w<1>))
+ MCFG_SS50_INTERFACE_FIRQ_CALLBACK(DEVWRITELINE("mainnmi", input_merger_device, in_w<1>))
+ MCFG_SS50_INTERFACE_PORT_ADD("io2", default_2rs_devices, nullptr)
+ MCFG_SS50_INTERFACE_IRQ_CALLBACK(DEVWRITELINE("mainirq", input_merger_device, in_w<2>))
+ MCFG_SS50_INTERFACE_FIRQ_CALLBACK(DEVWRITELINE("mainnmi", input_merger_device, in_w<2>))
+ MCFG_SS50_INTERFACE_PORT_ADD("io3", default_2rs_devices, nullptr)
+ MCFG_SS50_INTERFACE_IRQ_CALLBACK(DEVWRITELINE("mainirq", input_merger_device, in_w<3>))
+ MCFG_SS50_INTERFACE_FIRQ_CALLBACK(DEVWRITELINE("mainnmi", input_merger_device, in_w<3>))
+ MCFG_SS50_INTERFACE_PORT_ADD("io4", default_2rs_devices, nullptr)
+ MCFG_SS50_INTERFACE_IRQ_CALLBACK(DEVWRITELINE("mainirq", input_merger_device, in_w<4>))
+ MCFG_SS50_INTERFACE_FIRQ_CALLBACK(DEVWRITELINE("mainnmi", input_merger_device, in_w<4>))
+ MCFG_SS50_INTERFACE_PORT_ADD("io5", default_2rs_devices, nullptr)
+ MCFG_SS50_INTERFACE_IRQ_CALLBACK(DEVWRITELINE("mainirq", input_merger_device, in_w<5>))
+ MCFG_SS50_INTERFACE_FIRQ_CALLBACK(DEVWRITELINE("mainnmi", input_merger_device, in_w<5>))
+ MCFG_SS50_INTERFACE_PORT_ADD("io6", default_2rs_devices, nullptr)
+ MCFG_SS50_INTERFACE_IRQ_CALLBACK(DEVWRITELINE("mainirq", input_merger_device, in_w<6>))
+ MCFG_SS50_INTERFACE_FIRQ_CALLBACK(DEVWRITELINE("mainnmi", input_merger_device, in_w<6>))
+ MCFG_SS50_INTERFACE_PORT_ADD("io7", default_2rs_devices, nullptr)
+ MCFG_SS50_INTERFACE_IRQ_CALLBACK(DEVWRITELINE("mainirq", input_merger_device, in_w<7>))
+ MCFG_SS50_INTERFACE_FIRQ_CALLBACK(DEVWRITELINE("mainnmi", input_merger_device, in_w<7>))
+
+ MCFG_INPUT_MERGER_ANY_HIGH("mainirq")
+ MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6800_IRQ_LINE))
+ MCFG_INPUT_MERGER_ANY_HIGH("mainnmi")
+ MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", INPUT_LINE_NMI))
+
+ MCFG_RAM_ADD(RAM_TAG)
+ MCFG_RAM_DEFAULT_SIZE("2K")
+ MCFG_RAM_EXTRA_OPTIONS("4K,8K,12K,16K,20K,24K,28K,32K")
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_DERIVED( swtpcm, swtpc )
+ MCFG_CPU_MODIFY("maincpu")
+ MCFG_CPU_CLOCK(XTAL_1_7971MHz / 2)
+ MCFG_DEVICE_MODIFY("brg")
+ MCFG_DEVICE_CLOCK(XTAL_1_7971MHz)
- /* video hardware */
- MCFG_DEVICE_ADD(TERMINAL_TAG, GENERIC_TERMINAL, 0)
- MCFG_GENERIC_TERMINAL_KEYBOARD_CB(PUT(swtpc_state, kbd_put))
+ MCFG_DEVICE_MODIFY("io1")
+ MCFG_SLOT_DEFAULT_OPTION("mpc")
MACHINE_CONFIG_END
/* ROM definition */
ROM_START( swtpc )
- ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
- ROM_SYSTEM_BIOS( 0, "swt", "SWTBUG" )
- ROMX_LOAD( "swtbug.bin", 0xe000, 0x0400, CRC(f9130ef4) SHA1(089b2d2a56ce9526c3e78ce5d49ce368b9eabc0c), ROM_BIOS(1))
- ROM_SYSTEM_BIOS( 1, "mik", "MIKBUG" )
- ROMX_LOAD( "mikbug.bin", 0xe000, 0x0400, CRC(e7f4d9d0) SHA1(5ad585218f9c9c70f38b3c74e3ed5dfe0357621c), ROM_BIOS(2))
+ ROM_REGION( 0x0400, "mcm6830", 0 )
+ ROM_LOAD("swtbug.bin", 0x0000, 0x0400, CRC(f9130ef4) SHA1(089b2d2a56ce9526c3e78ce5d49ce368b9eabc0c))
+ROM_END
+
+ROM_START( swtpcm )
+ ROM_REGION( 0x0400, "mcm6830", 0 )
+ ROM_LOAD("mikbug.bin", 0x0000, 0x0400, CRC(e7f4d9d0) SHA1(5ad585218f9c9c70f38b3c74e3ed5dfe0357621c))
ROM_END
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS
-COMP( 1975, swtpc, 0, 0, swtpc, swtpc, swtpc_state, 0, "Southwest Technical Products Corporation", "SWTPC 6800", MACHINE_NO_SOUND)
+COMP( 1977, swtpc, 0, 0, swtpc, swtpc, swtpc_state, 0, "Southwest Technical Products Corporation", "SWTPC 6800 Computer System (with SWTBUG)", MACHINE_NO_SOUND_HW )
+COMP( 1975, swtpcm, swtpc, 0, swtpcm, swtpc, swtpc_state, 0, "Southwest Technical Products Corporation", "SWTPC 6800 Computer System (with MIKBUG)", MACHINE_NO_SOUND_HW )