summaryrefslogtreecommitdiffstats
path: root/src/mame/drivers/pipbug.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/pipbug.cpp')
-rw-r--r--src/mame/drivers/pipbug.cpp182
1 files changed, 182 insertions, 0 deletions
diff --git a/src/mame/drivers/pipbug.cpp b/src/mame/drivers/pipbug.cpp
new file mode 100644
index 00000000000..c6050fb81cf
--- /dev/null
+++ b/src/mame/drivers/pipbug.cpp
@@ -0,0 +1,182 @@
+// license:BSD-3-Clause
+// copyright-holders:Robbbert
+/***************************************************************************
+
+ PIPBUG
+
+ 08/04/2010 Skeleton driver.
+ 16/05/2012 Connected to serial terminal.. working
+
+ All input must be in uppercase.
+
+ Commands:
+ A - See and alter memory
+ B - Set breakpoint (2 permitted)
+ C - Clear breakpoint
+ D - Dump memory to paper tape
+ G - Go to address, run
+ L - Load memory from paper tape
+ S - See and alter registers
+
+ PIPBUG isn't a computer; it is a the name of the bios used
+ in a number of small 2650-based computers from 1976 to 1978.
+ Examples include Baby 2650, Eurocard 2650, etc., plus Signetics
+ own PC1001, PC1500, and KT9500 systems. PIPBUG was written by Signetics.
+
+ The sole means of communication is via a serial terminal.
+ PIPBUG uses the SENSE and FLAG pins as serial lines, thus
+ there is no need for a UART. The baud rate is 110.
+
+ The Baby 2650 (featured in Electronics Australia magazine in
+ March 1977) has 256 bytes of RAM.
+
+ The terminal is expected to have a papertape device attached, and
+ use it to save and load programs. PIPBUG still thinks it is talking
+ to the terminal, when in fact the data is flowing to the papertape
+ reader and punch.
+
+****************************************************************************/
+
+#include "bus/rs232/rs232.h"
+#include "cpu/s2650/s2650.h"
+#include "machine/terminal.h"
+#include "imagedev/snapquik.h"
+
+
+class pipbug_state : public driver_device
+{
+public:
+ pipbug_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_rs232(*this, "rs232"),
+ m_maincpu(*this, "maincpu")
+ {
+ }
+
+ DECLARE_WRITE8_MEMBER(pipbug_ctrl_w);
+ required_device<rs232_port_device> m_rs232;
+ required_device<cpu_device> m_maincpu;
+ DECLARE_QUICKLOAD_LOAD_MEMBER( pipbug );
+};
+
+WRITE8_MEMBER( pipbug_state::pipbug_ctrl_w )
+{
+// 0x80 is written here - not connected in the baby 2650
+}
+
+static ADDRESS_MAP_START(pipbug_mem, AS_PROGRAM, 8, pipbug_state)
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE( 0x0000, 0x03ff) AM_ROM
+ AM_RANGE( 0x0400, 0x7fff) AM_RAM
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START(pipbug_io, AS_IO, 8, pipbug_state)
+// ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(S2650_CTRL_PORT, S2650_CTRL_PORT) AM_WRITE(pipbug_ctrl_w)
+ AM_RANGE(S2650_SENSE_PORT, S2650_SENSE_PORT) AM_READNOP // this has to return zero or the parameter to write_sense is ignored
+ADDRESS_MAP_END
+
+/* Input ports */
+static INPUT_PORTS_START( pipbug )
+INPUT_PORTS_END
+
+static DEVICE_INPUT_DEFAULTS_START( terminal )
+ DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_110 )
+ DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_110 )
+ DEVICE_INPUT_DEFAULTS( "RS232_STARTBITS", 0xff, RS232_STARTBITS_1 )
+ DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_7 )
+ DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_EVEN )
+ DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_1 )
+DEVICE_INPUT_DEFAULTS_END
+
+QUICKLOAD_LOAD_MEMBER( pipbug_state, pipbug )
+{
+ address_space &space = m_maincpu->space(AS_PROGRAM);
+ int i;
+ int quick_addr = 0x440;
+ int exec_addr;
+ int quick_length;
+ dynamic_buffer quick_data;
+ int read_;
+ int result = IMAGE_INIT_FAIL;
+
+ quick_length = image.length();
+ if (quick_length < 0x0444)
+ {
+ image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too short");
+ image.message(" File too short");
+ }
+ else if (quick_length > 0x8000)
+ {
+ image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too long");
+ image.message(" File too long");
+ }
+ else
+ {
+ quick_data.resize(quick_length);
+ read_ = image.fread( &quick_data[0], quick_length);
+ if (read_ != quick_length)
+ {
+ image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Cannot read the file");
+ image.message(" Cannot read the file");
+ }
+ else if (quick_data[0] != 0xc4)
+ {
+ image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Invalid header");
+ image.message(" Invalid header");
+ }
+ else
+ {
+ exec_addr = quick_data[1] * 256 + quick_data[2];
+
+ if (exec_addr >= quick_length)
+ {
+ image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Exec address beyond end of file");
+ image.message(" Exec address beyond end of file");
+ }
+ else
+ {
+ for (i = quick_addr; i < read_; i++)
+ space.write_byte(i, quick_data[i]);
+
+ /* display a message about the loaded quickload */
+ image.message(" Quickload: size=%04X : exec=%04X",quick_length,exec_addr);
+
+ // Start the quickload
+ m_maincpu->set_state_int(S2650_PC, exec_addr);
+
+ result = IMAGE_INIT_PASS;
+ }
+ }
+ }
+
+ return result;
+}
+
+static MACHINE_CONFIG_START( pipbug, pipbug_state )
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu",S2650, XTAL_1MHz)
+ MCFG_CPU_PROGRAM_MAP(pipbug_mem)
+ MCFG_CPU_IO_MAP(pipbug_io)
+ MCFG_S2650_FLAG_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd))
+
+ /* video hardware */
+ MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "terminal")
+ MCFG_RS232_RXD_HANDLER(DEVWRITELINE("maincpu", s2650_device, write_sense))
+ MCFG_DEVICE_CARD_DEVICE_INPUT_DEFAULTS("terminal", terminal)
+
+ /* quickload */
+ MCFG_QUICKLOAD_ADD("quickload", pipbug_state, pipbug, "pgm", 1)
+MACHINE_CONFIG_END
+
+
+/* ROM definition */
+ROM_START( pipbug )
+ ROM_REGION( 0x8000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "pipbug.rom", 0x0000, 0x0400, CRC(f242b93e) SHA1(f82857cc882e6b5fc9f00b20b375988024f413ff))
+ROM_END
+
+/* Driver */
+
+/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
+COMP( 1979, pipbug, 0, 0, pipbug, pipbug, driver_device, 0, "Signetics", "PIPBUG", MACHINE_NO_SOUND_HW )