summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/votrtnt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/votrtnt.c')
-rw-r--r--src/mame/drivers/votrtnt.c151
1 files changed, 151 insertions, 0 deletions
diff --git a/src/mame/drivers/votrtnt.c b/src/mame/drivers/votrtnt.c
new file mode 100644
index 00000000000..65c1e79dddf
--- /dev/null
+++ b/src/mame/drivers/votrtnt.c
@@ -0,0 +1,151 @@
+// license:BSD-3-Clause
+// copyright-holders:Jonathan Gevaryahu
+/******************************************************************************
+*
+* Votrax Type 'N Talk Driver
+* By Jonathan Gevaryahu AKA Lord Nightmare
+* with loads of help (dumping, code disassembly, schematics, and other
+* documentation) from Kevin 'kevtris' Horton
+*
+* The Votrax TNT was sold from some time in early 1981 until at least 1983.
+*
+* 2011-02-27 The TNT communicates with its host via serial (RS-232) by
+* using a 6850 ACIA. It will echo whatever is sent, back to the
+* host. In order that we can examine it, I have connected the
+* 'terminal' so we can enter data, and see what gets sent back.
+* I've also connected the 'votrax' device, but it is far from
+* complete (the sounds are not understandable).
+*
+* ACIA status code is set to E2 for no data and E3 for data.
+*
+* On the CPU, A12 and A15 are not connected. A13 and A14 are used
+* to select devices. A0-A9 address RAM. A0-A11 address ROM.
+* A0 switches the ACIA between status/command, and data in/out.
+*
+* Special codes: The Type 'N Talk will take notice of certain codes. They
+* are: 08, 0D, 1B, 20. I didn't investigate what the codes do.
+*
+* ToDo:
+* - Votrax device needs considerable improvement in sound quality.
+*
+*
+******************************************************************************/
+
+/* Core includes */
+#include "bus/rs232/rs232.h"
+#include "cpu/m6800/m6800.h"
+#include "machine/6850acia.h"
+#include "machine/clock.h"
+#include "sound/votrax.h"
+#include "votrtnt.lh"
+
+
+class votrtnt_state : public driver_device
+{
+public:
+ votrtnt_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_votrax(*this, "votrax"),
+ m_acia(*this, "acia")
+ {
+ }
+
+ DECLARE_WRITE_LINE_MEMBER(write_acia_clock);
+
+private:
+ required_device<cpu_device> m_maincpu;
+ required_device<votrax_sc01_device> m_votrax;
+ required_device<acia6850_device> m_acia;
+};
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+static ADDRESS_MAP_START(6802_mem, AS_PROGRAM, 8, votrtnt_state)
+ ADDRESS_MAP_UNMAP_HIGH
+ ADDRESS_MAP_GLOBAL_MASK(0x6fff)
+ AM_RANGE(0x0000, 0x03ff) AM_RAM AM_MIRROR(0xc00)/* RAM, 2114*2 (0x400 bytes) mirrored 4x */
+ AM_RANGE(0x2000, 0x2000) AM_MIRROR(0xffe) AM_DEVREADWRITE("acia", acia6850_device, status_r, control_w)
+ AM_RANGE(0x2001, 0x2001) AM_MIRROR(0xffe) AM_DEVREADWRITE("acia", acia6850_device, data_r, data_w)
+ AM_RANGE(0x4000, 0x5fff) AM_DEVWRITE("votrax", votrax_sc01_device, write) /* low 6 bits write to 6 bit input of sc-01-a; high 2 bits are ignored (but by adding a buffer chip could be made to control the inflection bits of the sc-01-a which are normally grounded on the tnt) */
+ AM_RANGE(0x6000, 0x6fff) AM_ROM /* ROM in potted block */
+ADDRESS_MAP_END
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START(votrtnt)
+ PORT_START("DSW1") /* not connected to cpu, each switch is connected directly to the output of a 4040 counter dividing the cpu m1? clock to feed the 6850 ACIA. Setting more than one switch on is a bad idea. see tnt_schematic.jpg */
+ PORT_DIPNAME( 0xFF, 0x80, "Baud Rate" ) PORT_DIPLOCATION("SW1:1,2,3,4,5,6,7,8")
+ PORT_DIPSETTING( 0x01, "75" )
+ PORT_DIPSETTING( 0x02, "150" )
+ PORT_DIPSETTING( 0x04, "300" )
+ PORT_DIPSETTING( 0x08, "600" )
+ PORT_DIPSETTING( 0x10, "1200" )
+ PORT_DIPSETTING( 0x20, "2400" )
+ PORT_DIPSETTING( 0x40, "4800" )
+ PORT_DIPSETTING( 0x80, "9600" )
+INPUT_PORTS_END
+
+
+WRITE_LINE_MEMBER(votrtnt_state::write_acia_clock)
+{
+ m_acia->write_txc(state);
+ m_acia->write_rxc(state);
+}
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+static MACHINE_CONFIG_START( votrtnt, votrtnt_state )
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", M6802, XTAL_2_4576MHz) /* 2.4576MHz XTAL, verified; divided by 4 inside the m6802*/
+ MCFG_CPU_PROGRAM_MAP(6802_mem)
+
+ /* video hardware */
+ //MCFG_DEFAULT_LAYOUT(layout_votrtnt)
+
+ /* serial hardware */
+ MCFG_DEVICE_ADD("acia", ACIA6850, 0)
+ MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd))
+ MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts))
+
+ MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "terminal")
+ MCFG_RS232_RXD_HANDLER(DEVWRITELINE("acia", acia6850_device, write_rxd))
+ MCFG_RS232_CTS_HANDLER(DEVWRITELINE("acia", acia6850_device, write_cts))
+
+ MCFG_DEVICE_ADD("acia_clock", CLOCK, 153600)
+ MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(votrtnt_state, write_acia_clock))
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_DEVICE_ADD("votrax", VOTRAX_SC01, 720000) /* 720kHz? needs verify */
+ MCFG_VOTRAX_SC01_REQUEST_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0))
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+MACHINE_CONFIG_END
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START(votrtnt)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("cn49752n.bin", 0x6000, 0x1000, CRC(a44e1af3) SHA1(af83b9e84f44c126b24ee754a22e34ca992a8d3d)) /* 2332 mask rom inside potted brick */
+ROM_END
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+COMP( 1980, votrtnt, 0, 0, votrtnt, votrtnt, driver_device, 0, "Votrax", "Type 'N Talk", MACHINE_NOT_WORKING )