summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/cbmiec/mps1200.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/cbmiec/mps1200.cpp')
-rw-r--r--src/devices/bus/cbmiec/mps1200.cpp317
1 files changed, 317 insertions, 0 deletions
diff --git a/src/devices/bus/cbmiec/mps1200.cpp b/src/devices/bus/cbmiec/mps1200.cpp
new file mode 100644
index 00000000000..6ceac358d2e
--- /dev/null
+++ b/src/devices/bus/cbmiec/mps1200.cpp
@@ -0,0 +1,317 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/**********************************************************************
+
+ Commodore MPS-1200 & MPS-1250 printers (skeleton)
+
+ The MPS-1200's CPU board was originally designed for a standard
+ Centronics parallel interface (Y8300). However, an alternate
+ "Basic Interface Pack" board (Y8306) instead supported the IEC bus
+ using some extra LSTTL glue logic to convert serial data input to
+ the parallel format read by the CPU. The later MPS-1250 board
+ (Y8307) had hardware to support both serial and parallel
+ interfaces, but only used one at a time.
+
+**********************************************************************/
+
+#include "emu.h"
+#include "mps1200.h"
+
+#include "cpu/m6502/m50734.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+// device type definitions
+DEFINE_DEVICE_TYPE(MPS1200, mps1200_device, "mps1200", "Commodore MPS-1200 Dot Matrix Printer")
+DEFINE_DEVICE_TYPE(MPS1250, mps1250_device, "mps1250", "Commodore MPS-1250 Dot Matrix Printer")
+
+
+//-------------------------------------------------
+// mps1200_device - constructor
+//-------------------------------------------------
+
+mps1200_device::mps1200_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_cbm_iec_interface(mconfig, *this)
+ , m_mpscpu(*this, "mpscpu")
+{
+}
+
+mps1200_device::mps1200_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : mps1200_device(mconfig, MPS1200, tag, owner, clock)
+{
+}
+
+
+//-------------------------------------------------
+// mps1250_device - constructor
+//-------------------------------------------------
+
+mps1250_device::mps1250_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : mps1200_device(mconfig, MPS1250, tag, owner, clock)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void mps1200_device::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// cbm_iec_atn - ATN line handler
+//-------------------------------------------------
+
+void mps1200_device::cbm_iec_atn(int state)
+{
+ // TODO
+}
+
+
+//-------------------------------------------------
+// cbm_iec_data - serial data line handler
+//-------------------------------------------------
+
+void mps1200_device::cbm_iec_data(int state)
+{
+ // TODO
+}
+
+
+//-------------------------------------------------
+// cbm_iec_reset - reset line handler
+//-------------------------------------------------
+
+void mps1200_device::cbm_iec_reset(int state)
+{
+ // TODO
+}
+
+
+//-------------------------------------------------
+// mem_map - address map for main memory space
+//-------------------------------------------------
+
+void mps1200_device::mem_map(address_map &map)
+{
+ map(0x0000, 0x1fff).mirror(0x6000).ram().share("ram"); // M5M5165P-12
+ map(0x8000, 0xffff).rom().region("firmware", 0x8000);
+}
+
+
+//-------------------------------------------------
+// data_map - address map for data memory space
+//-------------------------------------------------
+
+void mps1200_device::data_map(address_map &map)
+{
+ map(0x0000, 0x1fff).mirror(0x6000).ram().share("ram");
+ map(0x8000, 0xffff).rom().region("firmware", 0);
+}
+
+
+//-------------------------------------------------
+// device_add_mconfig - device-specific config
+//-------------------------------------------------
+
+void mps1200_device::device_add_mconfig(machine_config &config)
+{
+ M50734(config, m_mpscpu, 8_MHz_XTAL);
+ m_mpscpu->set_addrmap(AS_PROGRAM, &mps1200_device::mem_map);
+ m_mpscpu->set_addrmap(AS_DATA, &mps1200_device::data_map);
+}
+
+
+//**************************************************************************
+// INPUT PORTS
+//**************************************************************************
+
+static INPUT_PORTS_START(mps1200)
+ PORT_START("SW")
+ PORT_DIPNAME(0x0080, 0x0080, "Device Number" ) PORT_DIPLOCATION("SW1:1")
+ PORT_DIPSETTING(0x0080, "4" )
+ PORT_DIPSETTING(0x0000, "5" )
+ PORT_DIPNAME(0x0040, 0x0040, "ASCII Translation" ) PORT_DIPLOCATION("SW1:2")
+ PORT_DIPSETTING(0x0040, "PET ASCII" )
+ PORT_DIPSETTING(0x0000, "ASCII" ) // access to full ascii character set
+ PORT_DIPNAME(0x0020, 0x0020, "Control Code Mode" ) PORT_DIPLOCATION("SW1:3")
+ PORT_DIPSETTING(0x0020, "Commodore" )
+ PORT_DIPSETTING(0x0000, "Epson FX" ) // access to escape control codes when using Epson printer driver (software-specific use)
+ PORT_DIPNAME(0x0010, 0x0010, "Print Quality" ) PORT_DIPLOCATION("SW1:4")
+ PORT_DIPSETTING(0x0010, "Draft" )
+ PORT_DIPSETTING(0x0000, "NLQ" )
+ PORT_DIPNAME(0x0008, 0x0008, "Page Length" ) PORT_DIPLOCATION("SW1:5")
+ PORT_DIPSETTING(0x0008, "11 inch" )
+ PORT_DIPSETTING(0x0000, "12 inch" )
+ PORT_DIPNAME(0x0004, 0x0000, "Paper End Detect" ) PORT_DIPLOCATION("SW1:6")
+ PORT_DIPSETTING(0x0004, "Enabled" ) // when enabled printer stops printing 2 inches before end of page and beeps to change paper
+ PORT_DIPSETTING(0x0000, "Disabled" ) // so generally leave this disabled (ON) to allow printing closer to the end of a page
+ PORT_DIPNAME(0x0002, 0x0002, "Automatic Line Feed" ) PORT_DIPLOCATION("SW1:7") // only does something if sw1:3 is on, otherwise ignored
+ PORT_DIPSETTING(0x0002, "Disabled" )
+ PORT_DIPSETTING(0x0000, "Enabled" )
+ PORT_DIPNAME(0x0001, 0x0001, "Character Spacing" ) PORT_DIPLOCATION("SW1:8")
+ PORT_DIPSETTING(0x0001, "Pica / 10 cpi" ) // 10 characters per inch (standard character spacing)
+ PORT_DIPSETTING(0x0000, "Compressed / 17 cpi") // 17 characters per inch
+
+ PORT_DIPNAME(0xe000, 0xe000, "International Character Set" ) PORT_DIPLOCATION("SW2:1,2,3")
+ PORT_DIPSETTING(0xe000, "US/UK/Netherlands" ) // off off off US/UK/Netherlands (default all off)
+ PORT_DIPSETTING(0xc000, "Switzerland" ) // on on off Switzerland
+ PORT_DIPSETTING(0xa000, "Italy" ) // on off on Italy
+ PORT_DIPSETTING(0x8000, DEF_STR(Unused)) // on off off Unused
+ PORT_DIPSETTING(0x6000, "France/Belgium" ) // off on on France/Belgium
+ PORT_DIPSETTING(0x4000, "Sweden/Finland" ) // off on off Sweden/Finland
+ PORT_DIPSETTING(0x2000, "Denmark/Norway" ) // off off on Denmark/Norway
+ PORT_DIPSETTING(0x0000, "Spain" ) // on on on Spain
+ PORT_DIPNAME(0x1000, 0x1000, DEF_STR(Unused)) PORT_DIPLOCATION("SW2:4")
+ PORT_DIPSETTING(0x1000, DEF_STR(Off))
+ PORT_DIPSETTING(0x0000, DEF_STR(On))
+ PORT_BIT(0x0f00, IP_ACTIVE_HIGH, IPT_UNUSED)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START(mps1250) // all DIP switches correct as per manual
+ PORT_START("SW") // all off = acts like Commodore VIC-1525 or MPS-803
+ PORT_DIPNAME(0x0080, 0x0080, "Interface" ) PORT_DIPLOCATION("SW1:1")
+ PORT_DIPSETTING(0x0080, "Commodore Serial IEC" ) // use with VIC20/C64/C128
+ PORT_DIPSETTING(0x0000, "Parallel" ) // use with PC or Amiga
+
+// when sw1:1 is off (IEC mode) these settings apply....
+ PORT_DIPNAME(0x0040, 0x0040, "ASCII Translation" ) PORT_DIPLOCATION("SW1:2") PORT_CONDITION("SW", 0x80, EQUALS, 0x80)
+ PORT_DIPSETTING(0x0040, "PET ASCII" )
+ PORT_DIPSETTING(0x0000, "ASCII" ) // access to full ascii character set
+ PORT_DIPNAME(0x0020, 0x0020, "Control Code Mode" ) PORT_DIPLOCATION("SW1:3") PORT_CONDITION("SW", 0x80, EQUALS, 0x80)
+ PORT_DIPSETTING(0x0020, "Commodore" )
+ PORT_DIPSETTING(0x0000, "Epson FX" ) // access to escape control codes when using Epson printer driver (software-specific use)
+ PORT_DIPNAME(0x0010, 0x0010, "Print Quality" ) PORT_DIPLOCATION("SW1:4") PORT_CONDITION("SW", 0x80, EQUALS, 0x80)
+ PORT_DIPSETTING(0x0010, "Draft" )
+ PORT_DIPSETTING(0x0000, "NLQ" )
+ PORT_DIPNAME(0x0008, 0x0008, "Device Number" ) PORT_DIPLOCATION("SW1:5") PORT_CONDITION("SW", 0x80, EQUALS, 0x80)
+ PORT_DIPSETTING(0x0008, "4" )
+ PORT_DIPSETTING(0x0000, "5" )
+ PORT_DIPNAME(0x0004, 0x0000, "Paper End Detect" ) PORT_DIPLOCATION("SW1:6") PORT_CONDITION("SW", 0x80, EQUALS, 0x80)
+ PORT_DIPSETTING(0x0004, "Enabled" ) // when enabled printer stops printing 2 inches before end of page and beeps to change paper
+ PORT_DIPSETTING(0x0000, "Disabled" ) // so generally leave this disabled (ON) to allow printing closer to the end of a page
+ PORT_DIPNAME(0x0002, 0x0002, "Automatic Line Feed" ) PORT_DIPLOCATION("SW1:7") PORT_CONDITION("SW", 0x80, EQUALS, 0x80) // only does something if sw1:3 is on, otherwise ignored
+ PORT_DIPSETTING(0x0002, "Disabled" )
+ PORT_DIPSETTING(0x0000, "Enabled" ) // adds a line feed to each carriage return received
+ PORT_DIPNAME(0x0001, 0x0001, "Character Spacing" ) PORT_DIPLOCATION("SW1:8") PORT_CONDITION("SW", 0x80, EQUALS, 0x80)
+ PORT_DIPSETTING(0x0001, "Pica / 10 cpi" ) // 10 characters per inch (standard character spacing)
+ PORT_DIPSETTING(0x0000, "Compressed / 17 cpi") // 17 characters per inch
+
+// when sw1:1 is on (parallel mode) these settings apply....
+ PORT_DIPNAME(0x0040, 0x0040, "Automatic Line Feed" ) PORT_DIPLOCATION("SW1:2") PORT_CONDITION("SW", 0x80, EQUALS, 0x00)
+ PORT_DIPSETTING(0x0040, "Disabled" )
+ PORT_DIPSETTING(0x0000, "Enabled" ) // adds a line feed (LF) to each carriage return received
+ PORT_DIPNAME(0x0030, 0x0030, "Printer Configuration" ) PORT_DIPLOCATION("SW1:3,4") PORT_CONDITION("SW", 0x80, EQUALS, 0x00)
+ PORT_DIPSETTING(0x0030, "Epson #1" ) // off off (best for use with Amiga or PC and Epson printer driver)
+ PORT_DIPSETTING(0x0020, "Epson #2" ) // on off (gives access to full list of international character sets)
+ PORT_DIPSETTING(0x0010, "Epson #3" ) // off on (gives access to partial list of international character sets and other options)
+ PORT_DIPSETTING(0x0000, "IBM Graphics Printer" ) // on on (for use with IBM-compatible PC)
+
+// when Epson #1 is selected these settings apply....
+ PORT_DIPNAME(0x0008, 0x0008, "ASCII Codes 128-159" ) PORT_DIPLOCATION("SW1:5") PORT_CONDITION("SW", 0xb0, EQUALS, 0x30)
+ PORT_DIPSETTING(0x0008, "High-bit Control Codes" ) // standard characters
+ PORT_DIPSETTING(0x0000, "Line and Block Graphics" ) // graphics characters
+ PORT_DIPNAME(0x0004, 0x0004, "Zero" ) PORT_DIPLOCATION("SW1:6") PORT_CONDITION("SW", 0xb0, EQUALS, 0x30)
+ PORT_DIPSETTING(0x0004, "Not Slashed" )
+ PORT_DIPSETTING(0x0000, "Slashed" )
+ PORT_DIPNAME(0x0002, 0x0002, "Print Quality" ) PORT_DIPLOCATION("SW1:7") PORT_CONDITION("SW", 0xb0, EQUALS, 0x30) // only active if sw1:3 is on
+ PORT_DIPSETTING(0x0002, "Draft" )
+ PORT_DIPSETTING(0x0000, "NLQ" )
+ PORT_DIPNAME(0x0001, 0x0001, "Character Spacing" ) PORT_DIPLOCATION("SW1:8") PORT_CONDITION("SW", 0xb0, EQUALS, 0x30)
+ PORT_DIPSETTING(0x0001, "Pica / 10 cpi" ) // 10 characters per inch (standard character spacing)
+ PORT_DIPSETTING(0x0000, "Compressed / 17 cpi") // 17 characters per inch
+
+// when Epson #2 is selected these settings apply....
+ PORT_DIPNAME(0x000e, 0x000e, "International Character Set" ) PORT_DIPLOCATION("SW1:5,6,7") PORT_CONDITION("SW", 0xb0, EQUALS, 0x20)
+ PORT_DIPSETTING(0x000e, "USA" ) // off off off USA
+ PORT_DIPSETTING(0x000c, "England" ) // on on off England
+ PORT_DIPSETTING(0x000a, "Sweden" ) // on off on Sweden
+ PORT_DIPSETTING(0x0008, "France" ) // on off off Unused
+ PORT_DIPSETTING(0x0006, "Italy" ) // off on on Italy
+ PORT_DIPSETTING(0x0004, "Germany" ) // off on off Germany
+ PORT_DIPSETTING(0x0002, "Denmark" ) // off off on Denmark
+ PORT_DIPSETTING(0x0000, "Spain" ) // on on on Spain
+ PORT_DIPNAME(0x0001, 0x0001, "Page Length" ) PORT_DIPLOCATION("SW1:8") PORT_CONDITION("SW", 0xb0, EQUALS, 0x20)
+ PORT_DIPSETTING(0x0001, "11 inch" )
+ PORT_DIPSETTING(0x0000, "12 inch" )
+
+// when Epson #3 is selected these settings apply....
+ PORT_DIPNAME(0x0008, 0x0008, "ASCII Codes 128-159" ) PORT_DIPLOCATION("SW1:5") PORT_CONDITION("SW", 0xb0, EQUALS, 0x10)
+ PORT_DIPSETTING(0x0008, "High-bit Control Codes" ) // standard characters
+ PORT_DIPSETTING(0x0000, "Line and Block Graphics" ) // graphics characters
+ PORT_DIPNAME(0x0006, 0x0006, "International Character Set" ) PORT_DIPLOCATION("SW1:6,7") PORT_CONDITION("SW", 0xb0, EQUALS, 0x10)
+ PORT_DIPSETTING(0x0006, "USA" ) // off off USA
+ PORT_DIPSETTING(0x0004, "France" ) // on off France
+ PORT_DIPSETTING(0x0002, "Germany" ) // off on Germany
+ PORT_DIPSETTING(0x0000, "England" ) // on on England
+ PORT_DIPNAME(0x0001, 0x0001, "Character Spacing" ) PORT_DIPLOCATION("SW1:8") PORT_CONDITION("SW", 0xb0, EQUALS, 0x10)
+ PORT_DIPSETTING(0x0001, "Pica / 10 cpi" ) // 10 characters per inch (standard character spacing)
+ PORT_DIPSETTING(0x0000, "Compressed / 17 cpi") // 17 characters per inch
+
+// when IBM Graphics Printer #1 is selected these settings apply....
+ PORT_DIPNAME(0x0008, 0x0008, "ASCII Codes 128-159" ) PORT_DIPLOCATION("SW1:5") PORT_CONDITION("SW", 0xb0, EQUALS, 0x00)
+ PORT_DIPSETTING(0x0008, "High-bit Control Codes" ) // IBM-graphics set 1
+ PORT_DIPSETTING(0x0000, "Accented Characters" ) // IBM-graphics set 2
+ PORT_DIPNAME(0x0004, 0x0004, "Line Spacing" ) PORT_DIPLOCATION("SW1:6") PORT_CONDITION("SW", 0xb0, EQUALS, 0x00)
+ PORT_DIPSETTING(0x0004, "1/6 inch" )
+ PORT_DIPSETTING(0x0000, "1/8 inch" )
+ PORT_DIPNAME(0x0002, 0x0002, "Auto Carriage Return" ) PORT_DIPLOCATION("SW1:7") PORT_CONDITION("SW", 0xb0, EQUALS, 0x00)
+ PORT_DIPSETTING(0x0002, "Enabled" ) // carriage return (CR) is inserted when printer receives a line feed
+ PORT_DIPSETTING(0x0000, "Disabled" )
+ PORT_DIPNAME(0x0001, 0x0001, "Buffer-Full Printing" ) PORT_DIPLOCATION("SW1:8") PORT_CONDITION("SW", 0xb0, EQUALS, 0x00)
+ PORT_DIPSETTING(0x0001, "Enabled" ) // Determines how the printer acts when receiving more characters than will fit on one line without a
+ PORT_DIPSETTING(0x0000, "Disabled" ) // carriage return received. 'Enabled' will insert a line feed at the right hard margin and 'disabled'
+ // will return the carriage to the left margin and the remaining characters will overwrite the line.
+ PORT_BIT(0x0f00, IP_ACTIVE_HIGH, IPT_UNUSED)
+INPUT_PORTS_END
+
+
+//-------------------------------------------------
+// device_input_ports - device-specific ports
+//-------------------------------------------------
+
+ioport_constructor mps1200_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(mps1200);
+}
+
+ioport_constructor mps1250_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(mps1250);
+}
+
+
+//**************************************************************************
+// ROM DEFINITIONS
+//**************************************************************************
+
+ROM_START(mps1200)
+ ROM_REGION(0x10000, "firmware", 0)
+ ROM_LOAD("mps1200-k405-0202.bin", 0x00000, 0x10000, CRC(87aa884a) SHA1(0ceb753c17599bc69458cfbb1cb3e81c2b60d107)) // "VER 1.01" "JUL-24-86" "Y8306 COMMODORE B.I.P."
+ROM_END
+
+ROM_START(mps1250)
+ ROM_REGION(0x10000, "firmware", 0)
+ ROM_LOAD("mps1250_k111_0201.bin", 0x00000, 0x10000, CRC(f2de9b69) SHA1(bb7357e83497b333e3f95548d94970003b2dfa9d)) // "VER 1.34" "MAR-03-87" "Y8307 COMMODORE DUAL B.I.P."
+ROM_END
+
+//-------------------------------------------------
+// device_rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const tiny_rom_entry *mps1200_device::device_rom_region() const
+{
+ return ROM_NAME(mps1200);
+}
+
+const tiny_rom_entry *mps1250_device::device_rom_region() const
+{
+ return ROM_NAME(mps1250);
+}