From 6b601f90320a80c325d8a2b397b124a2df1afb54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felipe=20Corr=C3=AAa=20da=20Silva=20Sanches?= Date: Tue, 23 Jun 2015 16:36:38 -0300 Subject: [PATCH] Daruma DS348 dot-matrix printer skeleton driver. --- scripts/target/mame/mess.lua | 3 +- src/mame/mess.lst | 1 + src/mess/drivers/daruma.c | 169 +++++++++++++++++++++++++++++++++++ 3 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 src/mess/drivers/daruma.c diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 9a637806a6b..5aa25d79d3b 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -2587,7 +2587,8 @@ files { MAME_DIR .. "src/mess/drivers/cxhumax.c", MAME_DIR .. "src/mess/drivers/czk80.c", MAME_DIR .. "src/mess/drivers/d6800.c", - MAME_DIR .. "src/mess/drivers/d6809.c", + MAME_DIR .. "src/mess/drivers/d6809.c", + MAME_DIR .. "src/mess/drivers/daruma.c", MAME_DIR .. "src/mess/drivers/digel804.c", MAME_DIR .. "src/mess/drivers/dim68k.c", MAME_DIR .. "src/mess/drivers/dm7000.c", diff --git a/src/mame/mess.lst b/src/mame/mess.lst index a9c1ac317bd..24d19df97b7 100644 --- a/src/mame/mess.lst +++ b/src/mame/mess.lst @@ -2277,6 +2277,7 @@ bcs3b bcs3c bob85 c80 +ds348 //Sigtron Daruma mc1000 d6809 mk85 diff --git a/src/mess/drivers/daruma.c b/src/mess/drivers/daruma.c new file mode 100644 index 00000000000..03e19e82a76 --- /dev/null +++ b/src/mess/drivers/daruma.c @@ -0,0 +1,169 @@ +// license:GPL-2.0+ +// copyright-holders: Felipe Sanches +/*************************************************************************** + + Sigtron Daruma DS348 dot-matrix printer + https://www.hardstand.com.br/daruma/ds348 + + Driver by Felipe Correa da Silva Sanches + + Model: Print Plus - DS348 + Manufacturer: Sigtron Daruma + Firmware version 1.1 + Release Date: May 8th/1998 + PCB: SIGTRON DS348 REV.B + +***************************************************************************/ + +#include "emu.h" +#include "cpu/mcs51/mcs51.h" +#include "sound/speaker.h" +//TODO: #include "ds348.lh" + +class daruma_state : public driver_device +{ +public: + daruma_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_speaker(*this, "speaker") { } + + DECLARE_WRITE8_MEMBER(port_w); + DECLARE_READ8_MEMBER(port_r); + + DECLARE_READ8_MEMBER(dev0_r); + DECLARE_WRITE8_MEMBER(dev1_w); + DECLARE_WRITE8_MEMBER(dev2_w); + DECLARE_READ8_MEMBER(dev4_r); + required_device m_maincpu; + required_device m_speaker; + char port0, port1, port2, port3; +}; + +WRITE8_MEMBER(daruma_state::port_w) +{ +// printf("port_w: write %02X to PORT (offset=%02X)\n", data, offset); + switch(offset) + { + case MCS51_PORT_P0: port0=data; + case MCS51_PORT_P1: port1=data; + case MCS51_PORT_P2: port2=data; + case MCS51_PORT_P3: port3=data; + } +} + +READ8_MEMBER(daruma_state::port_r) +{ + switch(offset) + { + case MCS51_PORT_P0: printf("port_r: read %02X from PORT0\n", port0); return port0; + case MCS51_PORT_P1: printf("port_r: read %02X from PORT1\n", port1); return port1; + case MCS51_PORT_P2: printf("port_r: read %02X from PORT2\n", port2); return port2; + case MCS51_PORT_P3: printf("port_r: read %02X from PORT3\n", port3); return port3; + } + return 0; +} + +READ8_MEMBER(daruma_state::dev0_r) +{ + return 0xFF; +} + +READ8_MEMBER(daruma_state::dev4_r) +{ + return ioport("switches")->read(); +} + +WRITE8_MEMBER(daruma_state::dev1_w) +{ + //while attempting to identify which bit is used for + //controlling the buzzer, here's what I heard from each of + //the signals on this address: + + //0x80 serial comm.? (noise) + //0x20 LED? (3 clicks) + //0x10 LED? (1 click) + //0x08 serial comm.? click & noise + //0x04 LED? (2 clicks) + //0x02 motor control or printer heads? (I hear a series of rhythmic pulses) + //0x01 LED? (2 clicks) + m_speaker->level_w(data & 0x02); +} + +WRITE8_MEMBER(daruma_state::dev2_w) +{ + //while attempting to identify which bit is used for + //controlling the buzzer, here's what I heard from each of + //the signals on this address: + + //0x80: LED? (3 clicks) + //0x40: unused? + //0x20: unused? + //0x10: low freq brief beep followed by a click + //0x08: low freq brief noise followed by a click + //0x04: low freq brief beep followed by a click + //0x02: low freq brief beep followed by a click + //0x01: low freq brief noise + //m_speaker->level_w(data & 0x01); +} + +static ADDRESS_MAP_START( mem_prg, AS_PROGRAM, 8, daruma_state ) + AM_RANGE(0x0000, 0xffff) AM_ROM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( mem_io, AS_IO, 8, daruma_state ) + AM_RANGE(0x0000, 0x0000) AM_READ(dev0_r) + AM_RANGE(0x1000, 0x1000) AM_WRITE(dev1_w) +// AM_RANGE(0x2000, 0x2000) AM_WRITE(dev2_w) +// AM_RANGE(0x3000, 0x3000) AM_WRITE(dev3_w) + AM_RANGE(0x4000, 0x4000) AM_READ(dev4_r) + AM_RANGE(0x8000, 0xffff) AM_RAM /* 32K CMOS SRAM (HYUNDAY hy62256a) */ + AM_RANGE(MCS51_PORT_P0, MCS51_PORT_P3) AM_READWRITE(port_r, port_w) +ADDRESS_MAP_END + +//TODO: These buttons and switches are all guesses. We'll need to further investigate this. +static INPUT_PORTS_START( daruma ) + PORT_START("buttons") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Paper A") PORT_CODE(KEYCODE_A) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Paper B") PORT_CODE(KEYCODE_B) + + PORT_START("switches") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN) + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN) + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Limit Switch") PORT_CODE(KEYCODE_S) + +INPUT_PORTS_END + +static MACHINE_CONFIG_START( daruma, daruma_state ) + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", I80C32,11059200) //verified on pcb + MCFG_CPU_PROGRAM_MAP(mem_prg) + MCFG_CPU_IO_MAP(mem_io) + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) + MCFG_SOUND_ROUTE(0, "mono", 1.00) + +/* TODO: + MCFG_DEFAULT_LAYOUT(layout_daruma) + + Motors: MTA011 + http://pdf.datasheetcatalog.com/datasheet/Shindengen/mXstzvq.pdf + + The motor controller suposedly is used to cut the paper strip out after finishing printing something. +*/ +MACHINE_CONFIG_END + +ROM_START( ds348 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "daruma_ds348_v1_1.rom", 0x0000, 0x10000, CRC(10bf9036) SHA1(d654a13bc582f5384e759ec6fe5309a642bd8e18) ) +ROM_END + +/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ +COMP( 1998, ds348, 0, 0, daruma, daruma, driver_device, 0, "Sigtron Daruma", "Print Plus DS348 - Dot matrix printer", GAME_NOT_WORKING | GAME_NO_SOUND)