New working machines

--------------------
Gerät 32620 (Sprach/Morsegenerator) [Dirk Best, natarii, Crypto Museum]

New working software list additions
--------------------
English (Polish speaker) [Crypto Museum]
German [Crypto Museum]
German (older) [Crypto Museum]
Spanish [Crypto Museum]

dac.h: Add AD7520 DAC
This commit is contained in:
Dirk Best 2022-12-10 12:30:06 +01:00
parent 03df3f088e
commit c3bf2135f2
5 changed files with 1050 additions and 0 deletions

81
hash/sprachmg.xml Normal file
View File

@ -0,0 +1,81 @@
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<!--
license:CC0
-->
<softwarelist name="sprachmg" description="Gerät 32620 (Sprach/Morsegenerator) Speech Modules">
<!-- Recreated from samples -->
<software name="english">
<description>English (Polish speaker)</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="rom" interface="sprachmg">
<dataarea name="pcb1" size="0xc000">
<rom name="32620_en-1.bin" offset="0x0000" size="0x2000" crc="f99a4f83" sha1="eed383b51ea5408905335f2ce9376bf828c4fd2e" status="baddump" />
<rom name="32620_en-2.bin" offset="0x2000" size="0x2000" crc="1be4c666" sha1="f3d8ab6e3782c2434f8312b252589ef066918e1d" status="baddump" />
<rom name="32620_en-3.bin" offset="0x4000" size="0x2000" crc="10e8e115" sha1="2721da167265b6c5aa49f33b6ea0d9f01c5350c5" status="baddump" />
<rom name="32620_en-4.bin" offset="0x6000" size="0x2000" crc="69ae7f4b" sha1="f582c487336ac94cbcc531435d0bad536426ce2c" status="baddump" />
<rom name="32620_en-5.bin" offset="0x8000" size="0x2000" crc="ac76f264" sha1="f01b026c3c8bab1d1aa8c15bce9c0883da5a2c27" status="baddump" />
<rom name="32620_en-6.bin" offset="0xa000" size="0x2000" crc="fbb240c9" sha1="1386529ce06836db5eb273cf0434cb2eeff165aa" status="baddump" />
</dataarea>
<dataarea name="pcb2" size="0xc000">
<rom name="32620_en-7.bin" offset="0x0000" size="0x2000" crc="0ad5e9e3" sha1="c27a45e2fdc9d5da91cb263d3157f51376155824" status="baddump" />
</dataarea>
</part>
</software>
<software name="german">
<description>German</description>
<year>1984</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="rom" interface="sprachmg">
<dataarea name="pcb1" size="0xc000">
<rom name="2620_8401-1.bin" offset="0x0000" size="0x2000" crc="05f58420" sha1="d7a81e337b1f97b861d1f39569d8b236266d1335" />
<rom name="2620_8401-2.bin" offset="0x2000" size="0x2000" crc="df8b0bb9" sha1="fe69b905819f95bfd17fdf41f8a1a68e0848c624" />
<rom name="2620_8401-3.bin" offset="0x4000" size="0x2000" crc="13554a48" sha1="04dec28efac7b974787db0d7b05df6cf364d9bb4" />
<rom name="2620_8401-4.bin" offset="0x6000" size="0x2000" crc="a41bc709" sha1="c054653c41ae1c3b0fd07cba07c5a8566ff63a7c" />
<rom name="2620_8401-5.bin" offset="0x8000" size="0x2000" crc="739c3547" sha1="5fcaab9ede8c9366f689ceeb763c862d2110d3c9" />
<rom name="2620_8401-6.bin" offset="0xa000" size="0x2000" crc="549b5994" sha1="6ab046dd14e12237615a90cac9cadd09cddd0f24" />
</dataarea>
</part>
</software>
<software name="germano">
<description>German (older)</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="rom" interface="sprachmg">
<dataarea name="pcb1" size="0xc000">
<rom name="2620_de-1.bin" offset="0x0000" size="0x2000" crc="2e475ce7" sha1="efd3da128f515e479547c9e4f4bb107dde8ea52d" />
<rom name="2620_de-2.bin" offset="0x2000" size="0x2000" crc="675ea7c8" sha1="a74cd99f8be98b85d356ae0c3c5c794d740a7445" />
<rom name="2620_de-3.bin" offset="0x4000" size="0x2000" crc="9d474786" sha1="f05e232c04de34aceaa63fe26a2d5dfb4c5a163a" />
<rom name="2620_de-4.bin" offset="0x6000" size="0x2000" crc="7f02ff72" sha1="e4d7db906a08d89602fd093b7a037a270e567536" />
<rom name="2620_de-5.bin" offset="0x8000" size="0x2000" crc="f20c8633" sha1="eebd61bab47d54e7688cdac287ceb1a110d46af7" />
<rom name="2620_de-6.bin" offset="0xa000" size="0x2000" crc="69a2d785" sha1="2c547b583dcc16208f0422e121cd482c3356528d" />
</dataarea>
</part>
</software>
<software name="spanish">
<description>Spanish</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="rom" interface="sprachmg">
<dataarea name="pcb1" size="0xc000">
<rom name="32620_es-1.bin" offset="0x0000" size="0x2000" crc="7357485a" sha1="ad001a9c147398a0908db4369283f5c82a28c4fb" />
<rom name="32620_es-2.bin" offset="0x2000" size="0x2000" crc="8eeb0e9b" sha1="ce3df4f47e942c7bdd277d5a619780f16be6ea00" />
<rom name="32620_es-3.bin" offset="0x4000" size="0x2000" crc="4210c86f" sha1="5714cf7fd4885dad29f7d9532434a7d547a6bebe" />
<rom name="32620_es-4.bin" offset="0x6000" size="0x2000" crc="e456d024" sha1="5cff9e63c3af02afcb4b63acf296138b6691638f" />
<rom name="32620_es-5.bin" offset="0x8000" size="0x2000" crc="580f8199" sha1="59296f6546fd54a0570bcf3390e35d457531a5f9" />
<rom name="32620_es-6.bin" offset="0xa000" size="0x2000" crc="37d2094b" sha1="2e956644509005c31bcd8da26088d062b2e70354" />
</dataarea>
<dataarea name="pcb2" size="0xc000">
<rom name="32620_es-7.bin" offset="0x0000" size="0x2000" crc="303bc783" sha1="7e97a241cf8af252ef5dfa7175008a78fac89739" />
<rom name="32620_es-8.bin" offset="0x2000" size="0x2000" crc="0718aa10" sha1="d2bf479a32e7dd6d7b421d87380b684f7b495899" />
</dataarea>
</part>
</software>
</softwarelist>

View File

@ -195,6 +195,7 @@ DAC_GENERATOR_EPILOG(_dac_type, _dac_class, _dac_description, _dac_shortname)
DAC_GENERATOR(AD557, ad557_device, dac_byte_device_base, dac_mapper_unsigned, 8, dac_gain_r2r, "AD557 DAC", "ad557")
DAC_GENERATOR(AD558, ad558_device, dac_byte_device_base, dac_mapper_unsigned, 8, dac_gain_r2r, "AD558 DAC", "ad558")
DAC_GENERATOR(AD7224, ad7224_device, dac_byte_device_base, dac_mapper_unsigned, 8, dac_gain_r2r, "AD7224 DAC", "ad7224")
DAC_GENERATOR(AD7520, ad7520_device, dac_word_device_base, dac_mapper_unsigned, 10, dac_gain_r2r, "AD7520 DAC", "ad7520")
DAC_GENERATOR(AD7521, ad7521_device, dac_word_device_base, dac_mapper_unsigned, 12, dac_gain_r2r, "AD7521 DAC", "ad7521")
DAC_GENERATOR(AD7523, ad7523_device, dac_byte_device_base, dac_mapper_unsigned, 8, dac_gain_r2r, "AD7523 DAC", "ad7523")
DAC_GENERATOR(AD7524, ad7524_device, dac_byte_device_base, dac_mapper_unsigned, 8, dac_gain_r2r, "AD7524 DAC", "ad7524")

440
src/mame/ddr/sprachmg.cpp Normal file
View File

@ -0,0 +1,440 @@
// license: BSD-3-Clause
// copyright-holders: natarii, Dirk Best
/***************************************************************************
Gerät 32620 (aka Sprach/Morsegenerator, Stimme and more)
Digital speech generator. Used by the Ministerium für Staatssicherheit
to send coded messages to agents using shortwave "Number Stations".
More info: https://www.cryptomuseum.com/spy/owvl/32620/index.htm
Hardware:
- UB880 (Z80)
- D2764D
- D446C x2
- UB8560D
- UB855D x2
- 9.832 MHz XTAL
- UB855D x2 (on expansion board)
- MBM2764-20 x12 (can be less, on speech module)
TODO:
- Tape input
- DAC gain
- Verify daisy chain
- Remote
Notes:
- Emulated is "version 2", it's possible that there are many hardware
variations (the available documention is for a slighly different
version for example)
- Serial protocol is undocumented (settings: 1200 Baud, 8-O-1) and
might not even be fully implemented in this version
- It uses a 10-bit DAC, but only 8 bits are used
***************************************************************************/
#include "emu.h"
#include "bus/generic/carts.h"
#include "bus/generic/slot.h"
#include "bus/rs232/rs232.h"
#include "cpu/z80/z80.h"
#include "machine/clock.h"
#include "machine/nvram.h"
#include "machine/z80daisy.h"
#include "machine/z80pio.h"
#include "machine/z80sio.h"
#include "sound/dac.h"
#include "softlist_dev.h"
#include "speaker.h"
#include "sprachmg.lh"
namespace {
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
class sprachmg_state : public driver_device
{
public:
sprachmg_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_pio(*this, "pio%u", 0U),
m_sio(*this, "sio"),
m_speech_module(*this, "speech"),
m_dac(*this, "dac"),
m_keys(*this, "keypad%u", 0U),
m_special(*this, "special"),
m_remote(*this, "remote"),
m_chargen(*this, "chargen"),
m_dmd(*this, "dot%u%u", 0U, 0U),
m_led_speech(*this, "led_speech"),
m_led_morse(*this, "led_morse"),
m_led_standard(*this, "led_standard"),
m_display_data(0x00),
m_key_scan(0x1f),
m_speech_select(0xff),
m_speech_module_pcb1(nullptr),
m_speech_module_pcb2(nullptr)
{ }
DECLARE_INPUT_CHANGED_MEMBER(keypad_res);
void sprachmg(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
private:
required_device<z80_device> m_maincpu;
required_device_array<z80pio_device, 4> m_pio;
required_device<z80sio_device> m_sio;
required_device<generic_slot_device> m_speech_module;
required_device<dac_word_interface> m_dac;
required_ioport_array<5> m_keys;
required_ioport m_special;
required_ioport m_remote;
required_region_ptr<uint8_t> m_chargen;
output_finder<8, 7> m_dmd;
output_finder<> m_led_speech;
output_finder<> m_led_morse;
output_finder<> m_led_standard;
void mem_map(address_map &map);
void io_map(address_map &map);
void display_data_w(uint8_t data);
void display_column_w(uint8_t data);
uint8_t key_r();
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(module_load);
uint8_t speech_r(offs_t offset);
void sys_w(uint8_t data);
uint8_t m_display_data;
uint8_t m_key_scan;
uint8_t m_speech_select;
uint8_t *m_speech_module_pcb1;
uint8_t *m_speech_module_pcb2;
};
//**************************************************************************
// ADDRESS MAPS
//**************************************************************************
void sprachmg_state::mem_map(address_map &map)
{
map(0x0000, 0x1fff).rom();
map(0x2000, 0x2fff).ram().share("nvram");
map(0x4000, 0xffff).r(FUNC(sprachmg_state::speech_r));
}
void sprachmg_state::io_map(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
map(0x7c, 0x7f).rw(m_pio[2], FUNC(z80pio_device::read), FUNC(z80pio_device::write)); // on expansion board
map(0xbc, 0xbf).rw(m_pio[3], FUNC(z80pio_device::read), FUNC(z80pio_device::write)); // on expansion board
map(0xc0, 0xc3).rw(m_sio, FUNC(z80sio_device::cd_ba_r), FUNC(z80sio_device::cd_ba_w));
map(0xc8, 0xcb).rw(m_pio[0], FUNC(z80pio_device::read), FUNC(z80pio_device::write));
map(0xd0, 0xd3).rw(m_pio[1], FUNC(z80pio_device::read), FUNC(z80pio_device::write));
}
//**************************************************************************
// INPUT PORT DEFINITIONS
//**************************************************************************
static INPUT_PORTS_START( sprachmg )
PORT_START("keypad0")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("EX")
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("<")
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME(">")
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("keypad1")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("SPC")
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+")
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_SLASH) PORT_NAME("/")
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_COLON) PORT_NAME(":")
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("CLR")
PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("keypad2")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("?")
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3 -")
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("MODE")
PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("keypad3")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("=")
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2 .")
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("OUT")
PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("keypad4")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0 NO")
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1 YES")
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("INP")
PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("special")
PORT_BIT(0x1f, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("STA/STP") PORT_WRITE_LINE_DEVICE_MEMBER("pio0", z80pio_device, pb5_w)
PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("remote")
PORT_BIT(0x3f, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("STA/STP (Remote)") PORT_WRITE_LINE_DEVICE_MEMBER("pio0", z80pio_device, pb6_w)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("reset")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RES") PORT_CHANGED_MEMBER(DEVICE_SELF, sprachmg_state, keypad_res, 0)
INPUT_PORTS_END
//**************************************************************************
// KEYPAD
//**************************************************************************
INPUT_CHANGED_MEMBER( sprachmg_state::keypad_res )
{
m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? CLEAR_LINE : ASSERT_LINE);
if (newval && !oldval)
m_sio->reset();
}
uint8_t sprachmg_state::key_r()
{
// 7------- not used
// -6------ start/stop on remote
// --5----- start/stop
// ---43210 keypad selected row
uint8_t data = 0xff;
for (unsigned i = 0; i < 5; i++)
if (BIT(m_key_scan, i) == 0)
data &= m_keys[i]->read();
data &= m_special->read();
data &= m_remote->read();
return data;
}
//**************************************************************************
// VIDEO EMULATION
//**************************************************************************
void sprachmg_state::display_data_w(uint8_t data)
{
m_display_data = data;
m_pio[1]->strobe_b(1);
m_pio[1]->strobe_b(0);
}
void sprachmg_state::display_column_w(uint8_t data)
{
for (unsigned i = 0; i < 7; i++)
m_dmd[data & 0x07][i] = m_chargen[0x100 + (i << 8) + m_display_data];
}
//**************************************************************************
// SPEECH MODULE
//**************************************************************************
DEVICE_IMAGE_LOAD_MEMBER( sprachmg_state::module_load )
{
if (!image.loaded_through_softlist())
{
image.seterror(image_error::UNSUPPORTED, "Speech modules can only be loaded using a software list");
return image_init_result::FAIL;
}
uint32_t pcb1_size = image.get_software_region_length("pcb1");
if (pcb1_size != 0xc000)
{
image.seterror(image_error::INVALIDIMAGE, "Invalid pcb1 region length");
return image_init_result::FAIL;
}
m_speech_module_pcb1 = image.get_software_region("pcb1");
uint32_t pcb2_size = image.get_software_region_length("pcb2");
if (pcb2_size > 0 && pcb2_size != 0xc000)
{
image.seterror(image_error::INVALIDIMAGE, "Invalid pcb2 region length");
return image_init_result::FAIL;
}
m_speech_module_pcb2 = image.get_software_region("pcb2");
return image_init_result::PASS;
}
uint8_t sprachmg_state::speech_r(offs_t offset)
{
if (BIT(m_speech_select, 1) == 0 && m_speech_module_pcb1)
return m_speech_module_pcb1[offset];
if (BIT(m_speech_select, 0) == 0 && m_speech_module_pcb2)
return m_speech_module_pcb2[offset];
return 0xff;
}
//**************************************************************************
// MACHINE EMULATION
//**************************************************************************
void sprachmg_state::sys_w(uint8_t data)
{
// 7------- speech card 1 (active low)
// -6------ speech card 2 (active low)
// --5----- led standard
// ---4---- led speech
// ----3--- led morse
// -----210 data to remote (ende, ausgabe, morse)
m_led_morse = BIT(data, 3);
m_led_speech = BIT(data, 4);
m_led_standard = BIT(data, 5);
m_speech_select = BIT(data, 6, 2);
}
void sprachmg_state::machine_start()
{
// resolve outputs
m_dmd.resolve();
m_led_speech.resolve();
m_led_morse.resolve();
m_led_standard.resolve();
// register for save states
save_item(NAME(m_display_data));
save_item(NAME(m_key_scan));
save_item(NAME(m_speech_select));
}
void sprachmg_state::machine_reset()
{
m_key_scan = 0x1f;
}
//**************************************************************************
// MACHINE DEFINTIONS
//**************************************************************************
static const z80_daisy_config z80_daisy_chain[] =
{
{ "pio0" },
{ "pio1" },
{ "sio" },
{ "pio2" },
{ "pio3" },
{ nullptr }
};
void sprachmg_state::sprachmg(machine_config &config)
{
Z80(config, m_maincpu, 9.8304_MHz_XTAL / 4);
m_maincpu->set_daisy_config(z80_daisy_chain);
m_maincpu->set_addrmap(AS_PROGRAM, &sprachmg_state::mem_map);
m_maincpu->set_addrmap(AS_IO, &sprachmg_state::io_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_NONE);
Z80PIO(config, m_pio[0], 9.8304_MHz_XTAL / 4);
m_pio[0]->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_pio[0]->out_pa_callback().set([this](uint8_t data) { m_key_scan = data & 0x1f; });
m_pio[0]->in_pb_callback().set(FUNC(sprachmg_state::key_r));
Z80PIO(config, m_pio[1], 9.8304_MHz_XTAL / 4);
m_pio[1]->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_pio[1]->out_pa_callback().set(FUNC(sprachmg_state::display_data_w));
m_pio[1]->out_pb_callback().set(FUNC(sprachmg_state::display_column_w));
Z80PIO(config, m_pio[2], 0);
m_pio[2]->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_pio[2]->out_pa_callback().set([this](uint8_t data) { m_dac->write(data); });
m_pio[2]->out_pb_callback().set(FUNC(sprachmg_state::sys_w));
Z80PIO(config, m_pio[3], 0);
m_pio[3]->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
// port a: tape
// port b: tape, dac gain
Z80SIO(config, m_sio, 9.8304_MHz_XTAL / 4);
m_sio->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_sio->out_txda_callback().set("rs232", FUNC(rs232_port_device::write_txd));
rs232_port_device &serial(RS232_PORT(config, "rs232", default_rs232_devices, nullptr));
serial.rxd_handler().set(m_sio, FUNC(z80sio_device::rxa_w));
clock_device &serclk(CLOCK(config, "serclk", 9.8304_MHz_XTAL / 4 / 128)); // cd4020b
serclk.signal_handler().set(m_sio, FUNC(z80sio_device::rxca_w));
serclk.signal_handler().append(m_sio, FUNC(z80sio_device::txca_w));
SPEAKER(config, "speaker").front_center();
AD7520(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 1.0);
GENERIC_CARTSLOT(config, m_speech_module, generic_plain_slot, "sprachmg");
m_speech_module->set_device_load(FUNC(sprachmg_state::module_load));
SOFTWARE_LIST(config, "module_list").set_original("sprachmg");
config.set_default_layout(layout_sprachmg);
}
//**************************************************************************
// ROM DEFINITIONS
//**************************************************************************
ROM_START( sprachmg )
ROM_REGION(0x2000, "maincpu", 0)
ROM_LOAD("bu01_8-87.bin", 0x0000, 0x2000, CRC(7d9a92a6) SHA1(c9ca4a0d118b2c30e2505de051671769ad08a1c5))
ROM_REGION(0x800, "chargen", 0)
ROM_LOAD("zg-625_1-12-86.bin", 0x000, 0x800, CRC(9ffd1e15) SHA1(759660404dfe479d13a1bdd4beb19e6035a34e17))
ROM_END
} // anonymous namespace
//**************************************************************************
// SYSTEM DRIVERS
//**************************************************************************
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1985, sprachmg, 0, 0, sprachmg, sprachmg, sprachmg_state, empty_init, "Institut für Kosmosforschung", "Gerät 32620 (Sprach/Morsegenerator)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )

View File

@ -0,0 +1,525 @@
<?xml version="1.0"?>
<!--
license: CC0
copyright-holders: natarii, Dirk Best
Gerät 32620 (Sprach-Morsegenerator)
-->
<mamelayout version="2">
<element name="panel">
<rect>
<bounds left="0" top="0" right="1" bottom="1" />
<color red="0.87" green="0.92" blue="0.86" />
</rect>
</element>
<element name="background">
<rect>
<bounds left="0" top="0" right="1" bottom="1" />
<color red="0.04" green="0.05" blue="0.03" />
</rect>
</element>
<element name="led">
<disk>
<bounds left="0" top="0" right="1" bottom="1" />
<color red="0.12" green="0.13" blue="0.10" />
</disk>
<disk state="0">
<bounds left="0.2" top="0.2" right="0.8" bottom="0.8" />
<color red="0.38" green="0.26" blue="0.22" />
</disk>
<disk state="1">
<bounds left="0.2" top="0.2" right="0.8" bottom="0.8" />
<color red="0.91" green="0.28" blue="0.29" />
</disk>
</element>
<element name="txt_speech">
<rect><color red="0.87" green="0.92" blue="0.86" /></rect>
<text string="SPEECH" align="2"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_morse">
<rect><color red="0.87" green="0.92" blue="0.86" /></rect>
<text string="MORSE" align="2"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_standard">
<rect><color red="0.87" green="0.92" blue="0.86" /></rect>
<text string="STANDARD" align="2"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="background_vqc10">
<rect>
<color red="0.20" green="0.02" blue="0.02" />
</rect>
</element>
<element name="matrix_vqc10">
<rect state="0">
<color red="0.64" green="0.13" blue="0.15" />
</rect>
<rect state="1">
<color red="1.00" green="0.51" blue="0.54" />
</rect>
</element>
<element name="matrix5dot_vqc10">
<rect>
<bounds left="0" top="0" right="9" bottom="1" />
<color red="0.30" green="0.03" blue="0.03" />
</rect>
<disk statemask="0x10" state="0">
<bounds x="0" /><color red="0.44" green="0.03" blue="0.05" />
</disk>
<disk statemask="0x10">
<bounds x="0" /><color red="1.00" green="0.41" blue="0.44" />
</disk>
<disk statemask="0x08" state="0">
<bounds x="2" /><color red="0.44" green="0.03" blue="0.05" />
</disk>
<disk statemask="0x08">
<bounds x="2" /><color red="1.00" green="0.41" blue="0.44" />
</disk>
<disk statemask="0x04" state="0">
<bounds x="4" /><color red="0.44" green="0.03" blue="0.05" />
</disk>
<disk statemask="0x04">
<bounds x="4" /><color red="1.00" green="0.41" blue="0.44" />
</disk>
<disk statemask="0x02" state="0">
<bounds x="6" /><color red="0.44" green="0.03" blue="0.05" />
</disk>
<disk statemask="0x02">
<bounds x="6" /><color red="1.00" green="0.41" blue="0.44" />
</disk>
<disk statemask="0x01" state="0">
<bounds x="8" /><color red="0.44" green="0.03" blue="0.05" />
</disk>
<disk statemask="0x01">
<bounds x="8" /><color red="1.00" green="0.41" blue="0.44" />
</disk>
</element>
<element name="button_white">
<rect>
<color red="0.79" green="0.77" blue="0.67" />
</rect>
<rect>
<color red="0.99" green="0.97" blue="0.87" />
<bounds left="0.05" top="0.05" right="0.95" bottom="0.95" />
</rect>
</element>
<element name="button_green">
<rect>
<color red="0.0" green="0.55" blue="0.38" />
</rect>
<rect>
<color red="0.02" green="0.75" blue="0.58" />
<bounds left="0.05" top="0.05" right="0.95" bottom="0.95" />
</rect>
</element>
<element name="button_red">
<rect>
<color red="0.80" green="0.17" blue="0.06" />
</rect>
<rect>
<color red="1.00" green="0.37" blue="0.26" />
<bounds left="0.05" top="0.05" right="0.95" bottom="0.95" />
</rect>
</element>
<element name="line">
<rect><color red="0.12" green="0.13" blue="0.10" /></rect>
</element>
<element name="txt_res">
<rect><color red="1.00" green="0.37" blue="0.26" /></rect>
<text string="RES"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_sta">
<rect><color red="0.02" green="0.75" blue="0.58" /></rect>
<text string="STA"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_stp">
<rect><color red="0.02" green="0.75" blue="0.58" /></rect>
<text string="STP"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_7">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string="7"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_8">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string="8"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_9">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string="9"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_colon">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string=":"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_right">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string=">"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_left">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string="&lt;"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_4">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string="4"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_5">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string="5"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_6">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string="6"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_slash">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string="/"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_mode">
<rect><color red="0.02" green="0.75" blue="0.58" /></rect>
<text string="MODE"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_inp">
<rect><color red="0.02" green="0.75" blue="0.58" /></rect>
<text string="INP"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_1">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string="1"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_yes">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string="YES"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_2">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string="2"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_dot">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string="."><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_3">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string="3"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_dash">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string="-"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_plus">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string="+"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_ex">
<rect><color red="0.02" green="0.75" blue="0.58" /></rect>
<text string="EX"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_out">
<rect><color red="0.02" green="0.75" blue="0.58" /></rect>
<text string="OUT"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_clr">
<rect><color red="0.02" green="0.75" blue="0.58" /></rect>
<text string="CLR"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_0">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string="0"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_no">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string="NO"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_equals">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string="="><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_questionmark">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string="?"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<element name="txt_spc">
<rect><color red="0.99" green="0.97" blue="0.87" /></rect>
<text string="SPC"><color red="0.12" green="0.13" blue="0.10" /></text>
</element>
<view name="Default Layout">
<element ref="panel">
<bounds left="0" top="0" right="529" bottom="445" />
</element>
<!-- LEDs -->
<element ref="txt_speech">
<bounds left="25" top="39" right="97" bottom="55" />
</element>
<element ref="led" name="led_speech">
<bounds left="103" top="35" right="129" bottom="61" />
</element>
<element ref="txt_morse">
<bounds left="25" top="71" right="97" bottom="87" />
</element>
<element ref="led" name="led_morse">
<bounds left="103" top="66" right="129" bottom="92" />
</element>
<element ref="txt_standard">
<bounds left="25" top="103" right="97" bottom="119" />
</element>
<element ref="led" name="led_standard">
<bounds left="103" top="99" right="129" bottom="125" />
</element>
<!-- Dot Matrix -->
<element ref="background">
<bounds left="167" top="54" right="440" bottom="104" />
</element>
<element ref="background_vqc10">
<bounds left="187" top="57" right="302" bottom="101" />
</element>
<repeat count="7">
<param name="y" start="65" increment="4" />
<param name="row" start="0" increment="1" />
<repeat count="4">
<param name="x" start="192" increment="29" />
<param name="idx" start="0" increment="1" />
<element ref="matrix5dot_vqc10" name="dot~idx~~row~">
<bounds x="~x~" y="~y~" width="18" height="2" />
</element>
</repeat>
</repeat>
<element ref="background_vqc10">
<bounds left="307" top="57" right="422" bottom="101" />
</element>
<repeat count="7">
<param name="y" start="65" increment="4" />
<param name="row" start="0" increment="1" />
<repeat count="4">
<param name="x" start="312" increment="29" />
<param name="idx" start="4" increment="1" />
<element ref="matrix5dot_vqc10" name="dot~idx~~row~">
<bounds x="~x~" y="~y~" width="18" height="2" />
</element>
</repeat>
</repeat>
<!-- Keypad -->
<element ref="background">
<bounds left="93" top="351" right="150" bottom="410" />
</element>
<element ref="background">
<bounds left="150" top="180" right="494" bottom="410" />
</element>
<element ref="button_red" inputtag="reset" inputmask="0x01">
<bounds x="152" y="182" width="55" height="55" />
</element>
<element ref="txt_res">
<bounds xc="180" yc="210" width="28" height="20" />
</element>
<element ref="button_green" inputtag="special" inputmask="0x20">
<bounds x="209" y="182" width="55" height="55" />
</element>
<element ref="txt_sta">
<bounds xc="237" yc="198" width="28" height="20" />
</element>
<element ref="line">
<bounds xc="237" yc="210" width="28" height="2" />
</element>
<element ref="txt_stp">
<bounds xc="237" yc="220" width="28" height="20" />
</element>
<element ref="button_white" inputtag="keypad4" inputmask="0x08">
<bounds x="266" y="182" width="55" height="55" />
</element>
<element ref="txt_7">
<bounds xc="294" yc="210" width="28" height="20" />
</element>
<element ref="button_white" inputtag="keypad3" inputmask="0x08">
<bounds x="323" y="182" width="55" height="55" />
</element>
<element ref="txt_8">
<bounds xc="351" yc="210" width="28" height="20" />
</element>
<element ref="button_white" inputtag="keypad2" inputmask="0x08">
<bounds x="380" y="182" width="55" height="55" />
</element>
<element ref="txt_9">
<bounds xc="408" yc="210" width="28" height="20" />
</element>
<element ref="button_white" inputtag="keypad1" inputmask="0x08">
<bounds x="437" y="182" width="55" height="55" />
</element>
<element ref="txt_colon">
<bounds xc="465" yc="210" width="28" height="20" />
</element>
<element ref="button_white" inputtag="keypad0" inputmask="0x08">
<bounds x="152" y="239" width="55" height="55" />
</element>
<element ref="txt_right">
<bounds xc="180" yc="267" width="28" height="20" />
</element>
<element ref="button_white" inputtag="keypad0" inputmask="0x04">
<bounds x="209" y="239" width="55" height="55" />
</element>
<element ref="txt_left">
<bounds xc="237" yc="267" width="28" height="20" />
</element>
<element ref="button_white" inputtag="keypad4" inputmask="0x04">
<bounds x="266" y="239" width="55" height="55" />
</element>
<element ref="txt_4">
<bounds xc="294" yc="267" width="28" height="20" />
</element>
<element ref="button_white" inputtag="keypad3" inputmask="0x04">
<bounds x="323" y="239" width="55" height="55" />
</element>
<element ref="txt_5">
<bounds xc="351" yc="267" width="28" height="20" />
</element>
<element ref="button_white" inputtag="keypad2" inputmask="0x04">
<bounds x="380" y="239" width="55" height="55" />
</element>
<element ref="txt_6">
<bounds xc="408" yc="267" width="28" height="20" />
</element>
<element ref="button_white" inputtag="keypad1" inputmask="0x04">
<bounds x="437" y="239" width="55" height="55" />
</element>
<element ref="txt_slash">
<bounds xc="465" yc="267" width="28" height="20" />
</element>
<element ref="button_green" inputtag="keypad2" inputmask="0x10">
<bounds x="152" y="296" width="55" height="55" />
</element>
<element ref="txt_mode">
<bounds xc="180" yc="324" width="38" height="20" />
</element>
<element ref="button_green" inputtag="keypad4" inputmask="0x10">
<bounds x="209" y="296" width="55" height="55" />
</element>
<element ref="txt_inp">
<bounds xc="237" yc="324" width="28" height="20" />
</element>
<element ref="button_white" inputtag="keypad4" inputmask="0x02">
<bounds x="266" y="296" width="55" height="55" />
</element>
<element ref="txt_1">
<bounds xc="294" yc="312" width="28" height="20" />
</element>
<element ref="line">
<bounds xc="294" yc="324" width="28" height="2" />
</element>
<element ref="txt_yes">
<bounds xc="294" yc="334" width="28" height="20" />
</element>
<element ref="button_white" inputtag="keypad3" inputmask="0x02">
<bounds x="323" y="296" width="55" height="55" />
</element>
<element ref="txt_2">
<bounds xc="351" yc="312" width="28" height="20" />
</element>
<element ref="line">
<bounds xc="351" yc="324" width="28" height="2" />
</element>
<element ref="txt_dot">
<bounds xc="351" yc="334" width="28" height="20" />
</element>
<element ref="button_white" inputtag="keypad2" inputmask="0x02">
<bounds x="380" y="296" width="55" height="55" />
</element>
<element ref="txt_3">
<bounds xc="408" yc="312" width="28" height="20" />
</element>
<element ref="line">
<bounds xc="408" yc="324" width="28" height="2" />
</element>
<element ref="txt_dash">
<bounds xc="408" yc="334" width="28" height="20" />
</element>
<element ref="button_white" inputtag="keypad1" inputmask="0x02">
<bounds x="437" y="296" width="55" height="55" />
</element>
<element ref="txt_plus">
<bounds xc="465" yc="324" width="28" height="20" />
</element>
<element ref="button_green" inputtag="keypad0" inputmask="0x02">
<bounds x="95" y="353" width="55" height="55" />
</element>
<element ref="txt_ex">
<bounds xc="123" yc="381" width="28" height="20" />
</element>
<element ref="button_green" inputtag="keypad3" inputmask="0x10">
<bounds x="152" y="353" width="55" height="55" />
</element>
<element ref="txt_out">
<bounds xc="180" yc="381" width="28" height="20" />
</element>
<element ref="button_green" inputtag="keypad1" inputmask="0x10">
<bounds x="209" y="353" width="55" height="55" />
</element>
<element ref="txt_clr">
<bounds xc="237" yc="381" width="28" height="20" />
</element>
<element ref="button_white" inputtag="keypad4" inputmask="0x01">
<bounds x="266" y="353" width="55" height="55" />
</element>
<element ref="txt_0">
<bounds xc="294" yc="369" width="28" height="20" />
</element>
<element ref="line">
<bounds xc="294" yc="381" width="28" height="2" />
</element>
<element ref="txt_no">
<bounds xc="294" yc="391" width="28" height="20" />
</element>
<element ref="button_white" inputtag="keypad3" inputmask="0x01">
<bounds x="323" y="353" width="55" height="55" />
</element>
<element ref="txt_equals">
<bounds xc="351" yc="381" width="28" height="20" />
</element>
<element ref="button_white" inputtag="keypad2" inputmask="0x01">
<bounds x="380" y="353" width="55" height="55" />
</element>
<element ref="txt_questionmark">
<bounds xc="408" yc="381" width="28" height="20" />
</element>
<element ref="button_white" inputtag="keypad1" inputmask="0x01">
<bounds x="437" y="353" width="55" height="55" />
</element>
<element ref="txt_spc">
<bounds xc="465" yc="381" width="28" height="20" />
</element>
</view>
</mamelayout>

View File

@ -45107,3 +45107,6 @@ mtu130
@source:yamaha/ymvl1.cpp
vl1
@source:ddr/sprachmg.cpp
sprachmg // 1985 Institut für Kosmosforschung