mirror of
https://github.com/holub/mame
synced 2025-07-03 17:08:39 +03:00
New machines marked as NOT_WORKING
---------------------------------- Datacast Controller (The Stock Exchange) [Tony Jewell, Nigel Barnes]
This commit is contained in:
parent
840bfe4304
commit
f26a25384a
@ -4404,6 +4404,7 @@ files {
|
|||||||
MAME_DIR .. "src/mame/drivers/d6800.cpp",
|
MAME_DIR .. "src/mame/drivers/d6800.cpp",
|
||||||
MAME_DIR .. "src/mame/drivers/d6809.cpp",
|
MAME_DIR .. "src/mame/drivers/d6809.cpp",
|
||||||
MAME_DIR .. "src/mame/drivers/daruma.cpp",
|
MAME_DIR .. "src/mame/drivers/daruma.cpp",
|
||||||
|
MAME_DIR .. "src/mame/drivers/datacast.cpp",
|
||||||
MAME_DIR .. "src/mame/drivers/design.cpp",
|
MAME_DIR .. "src/mame/drivers/design.cpp",
|
||||||
MAME_DIR .. "src/mame/drivers/dg680.cpp",
|
MAME_DIR .. "src/mame/drivers/dg680.cpp",
|
||||||
MAME_DIR .. "src/mame/drivers/diablo1300.cpp",
|
MAME_DIR .. "src/mame/drivers/diablo1300.cpp",
|
||||||
|
256
src/mame/drivers/datacast.cpp
Normal file
256
src/mame/drivers/datacast.cpp
Normal file
@ -0,0 +1,256 @@
|
|||||||
|
// license:BSD-3-Clause
|
||||||
|
// copyright-holders:Nigel Barnes
|
||||||
|
/****************************************************************************
|
||||||
|
|
||||||
|
Datacast Controller by Defence Products
|
||||||
|
|
||||||
|
The PCB is named Datacast Controller, and the outer casing is customised
|
||||||
|
for 'The Stock Exchange'. Maybe other ROM variants exist for this
|
||||||
|
controller.
|
||||||
|
|
||||||
|
Hardware:
|
||||||
|
---------
|
||||||
|
CPU: 80186
|
||||||
|
|
||||||
|
RAM: HM62256 x 8
|
||||||
|
PCF8582
|
||||||
|
|
||||||
|
Video: SAA5240 + 2K RAM - Teletext Decoder
|
||||||
|
SAA5250 + 2K RAM - Teletext Acquisition and Control
|
||||||
|
SAA5231 - Teletext Video Processor
|
||||||
|
|
||||||
|
Serial: D8251 x 2 - USART
|
||||||
|
AY-5-8116 - Baud Rate Generator
|
||||||
|
MC145406 - Driver/Receiver
|
||||||
|
|
||||||
|
Ports: Printer
|
||||||
|
Modem
|
||||||
|
Monitor
|
||||||
|
Keypad
|
||||||
|
|
||||||
|
I2C Slave Devices:
|
||||||
|
------------------
|
||||||
|
22 SAA5240
|
||||||
|
A2 PCF8582
|
||||||
|
C0 ?
|
||||||
|
|
||||||
|
TODO:
|
||||||
|
- implement keypad
|
||||||
|
- complete SAA5240 emulation
|
||||||
|
- feed SAA5240 with teletext packets
|
||||||
|
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "emu.h"
|
||||||
|
#include "cpu/i86/i186.h"
|
||||||
|
#include "machine/i2cmem.h"
|
||||||
|
#include "machine/i8251.h"
|
||||||
|
#include "machine/com8116.h"
|
||||||
|
#include "machine/input_merger.h"
|
||||||
|
#include "machine/mm74c922.h"
|
||||||
|
#include "video/saa5240.h"
|
||||||
|
#include "bus/rs232/rs232.h"
|
||||||
|
#include "imagedev/bitbngr.h"
|
||||||
|
#include "screen.h"
|
||||||
|
|
||||||
|
|
||||||
|
class datacast_state : public driver_device
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
datacast_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||||
|
: driver_device(mconfig, type, tag)
|
||||||
|
, m_maincpu(*this, "maincpu")
|
||||||
|
, m_screen(*this, "screen")
|
||||||
|
, m_kb(*this, "74c923")
|
||||||
|
, m_cct(*this, "saa5240")
|
||||||
|
, m_ttd(*this , "ttd")
|
||||||
|
, m_i2cmem(*this, "i2cmem")
|
||||||
|
, m_usart(*this, "usart%u", 0)
|
||||||
|
, m_dbrg(*this, "dbrg")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void datacast(machine_config &config);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void machine_start() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint8_t keypad_r();
|
||||||
|
void keypad_w(uint8_t data);
|
||||||
|
uint8_t i2c_r();
|
||||||
|
void i2c_w(uint8_t data);
|
||||||
|
|
||||||
|
void mem_map(address_map &map);
|
||||||
|
void saa5240_map(address_map &map);
|
||||||
|
|
||||||
|
required_device<i80186_cpu_device> m_maincpu;
|
||||||
|
required_device<screen_device> m_screen;
|
||||||
|
required_device<mm74c923_device> m_kb;
|
||||||
|
required_device<saa5240a_device> m_cct;
|
||||||
|
required_device<bitbanger_device> m_ttd;
|
||||||
|
required_device<i2c_pcf8582_device> m_i2cmem;
|
||||||
|
required_device_array<i8251_device, 2> m_usart;
|
||||||
|
required_device<com8116_device> m_dbrg;
|
||||||
|
|
||||||
|
uint8_t m_key_col;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void datacast_state::machine_start()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void datacast_state::mem_map(address_map &map)
|
||||||
|
{
|
||||||
|
map(0x00000, 0x7ffff).ram();
|
||||||
|
map(0xc0000, 0xc0000).rw(FUNC(datacast_state::keypad_r), FUNC(datacast_state::keypad_w)).umask16(0x00ff);
|
||||||
|
map(0xc0080, 0xc0080).lr8([this]() { return 0xff; }, "dips"); // unknown purpose
|
||||||
|
map(0xc0100, 0xc010f).noprw(); //.rw(m_saa5250, FUNC(saa5250_device::read), FUNC(saa5250_device::write)).umask16(0x00ff);
|
||||||
|
map(0xc0180, 0xc0180).rw(FUNC(datacast_state::i2c_r), FUNC(datacast_state::i2c_w)).umask16(0x00ff);
|
||||||
|
map(0xc0200, 0xc0203).rw(m_usart[0], FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
|
||||||
|
map(0xc0280, 0xc0280).w(m_dbrg, FUNC(com8116_device::stt_str_w));
|
||||||
|
map(0xc0300, 0xc0303).rw(m_usart[1], FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
|
||||||
|
map(0xf0000, 0xfffff).rom().region("rom", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void datacast_state::saa5240_map(address_map &map)
|
||||||
|
{
|
||||||
|
map.global_mask(0x07ff);
|
||||||
|
map(0x0000, 0x07ff).ram();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static INPUT_PORTS_START(datacast)
|
||||||
|
PORT_START("X1")
|
||||||
|
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("1") PORT_CODE(KEYCODE_1)
|
||||||
|
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("2") PORT_CODE(KEYCODE_2)
|
||||||
|
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("3") PORT_CODE(KEYCODE_3)
|
||||||
|
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("4") PORT_CODE(KEYCODE_4)
|
||||||
|
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("5") PORT_CODE(KEYCODE_5)
|
||||||
|
|
||||||
|
PORT_START("X2")
|
||||||
|
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q)
|
||||||
|
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("W") PORT_CODE(KEYCODE_W)
|
||||||
|
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("E") PORT_CODE(KEYCODE_E)
|
||||||
|
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("R") PORT_CODE(KEYCODE_R)
|
||||||
|
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("T") PORT_CODE(KEYCODE_T)
|
||||||
|
|
||||||
|
PORT_START("X3")
|
||||||
|
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("A") PORT_CODE(KEYCODE_A)
|
||||||
|
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("S") PORT_CODE(KEYCODE_S)
|
||||||
|
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("D") PORT_CODE(KEYCODE_D)
|
||||||
|
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("F") PORT_CODE(KEYCODE_F)
|
||||||
|
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("G") PORT_CODE(KEYCODE_G)
|
||||||
|
|
||||||
|
PORT_START("X4")
|
||||||
|
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z)
|
||||||
|
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("X") PORT_CODE(KEYCODE_X)
|
||||||
|
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("C") PORT_CODE(KEYCODE_C)
|
||||||
|
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("V") PORT_CODE(KEYCODE_V)
|
||||||
|
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("B") PORT_CODE(KEYCODE_B)
|
||||||
|
INPUT_PORTS_END
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t datacast_state::keypad_r()
|
||||||
|
{
|
||||||
|
uint8_t data = (m_kb->read() << 0) | (m_kb->da_r() << 5);
|
||||||
|
logerror("keypad_r: %02x\n", data);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void datacast_state::keypad_w(uint8_t data)
|
||||||
|
{
|
||||||
|
m_key_col = data;
|
||||||
|
|
||||||
|
logerror("keypad_w: %02x\n", data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t datacast_state::i2c_r()
|
||||||
|
{
|
||||||
|
return m_i2cmem->read_sda() & m_cct->read_sda();
|
||||||
|
}
|
||||||
|
|
||||||
|
void datacast_state::i2c_w(uint8_t data)
|
||||||
|
{
|
||||||
|
m_i2cmem->write_sda(BIT(data, 0));
|
||||||
|
m_i2cmem->write_scl(BIT(data, 1));
|
||||||
|
|
||||||
|
m_cct->write_sda(BIT(data, 0));
|
||||||
|
m_cct->write_scl(BIT(data, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void datacast_state::datacast(machine_config &config)
|
||||||
|
{
|
||||||
|
I80186(config, m_maincpu, 16_MHz_XTAL);
|
||||||
|
m_maincpu->set_addrmap(AS_PROGRAM, &datacast_state::mem_map);
|
||||||
|
|
||||||
|
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||||
|
m_screen->set_raw(6_MHz_XTAL, 768, 0, 480, 312, 0, 250);
|
||||||
|
m_screen->set_screen_update("saa5240", FUNC(saa5240a_device::screen_update));
|
||||||
|
|
||||||
|
MM74C923(config, m_kb, 0);
|
||||||
|
m_kb->x1_rd_callback().set_ioport("X1");
|
||||||
|
m_kb->x2_rd_callback().set_ioport("X2");
|
||||||
|
m_kb->x3_rd_callback().set_ioport("X3");
|
||||||
|
m_kb->x4_rd_callback().set_ioport("X4");
|
||||||
|
|
||||||
|
//SAA5231(config, m_saa5231, 13.875_MHz_XTAL);
|
||||||
|
|
||||||
|
SAA5240A(config, m_cct, 6_MHz_XTAL);
|
||||||
|
m_cct->set_addrmap(0, &datacast_state::saa5240_map);
|
||||||
|
|
||||||
|
//SAA5250(config, m_saa5250, 0);
|
||||||
|
//m_saa5250->set_addrmap(0, &datacast_state::saa5250_map); // 2K RAM
|
||||||
|
|
||||||
|
I2C_PCF8582(config, m_i2cmem).set_e0(1);
|
||||||
|
|
||||||
|
COM8116(config, m_dbrg, 5.0688_MHz_XTAL); // AY-5-8116
|
||||||
|
m_dbrg->fr_handler().set(m_usart[0], FUNC(i8251_device::write_txc));
|
||||||
|
m_dbrg->fr_handler().append(m_usart[0], FUNC(i8251_device::write_rxc));
|
||||||
|
m_dbrg->ft_handler().set(m_usart[1], FUNC(i8251_device::write_txc));
|
||||||
|
m_dbrg->ft_handler().append(m_usart[1], FUNC(i8251_device::write_rxc));
|
||||||
|
|
||||||
|
input_merger_device &usartint(INPUT_MERGER_ANY_HIGH(config, "usartint"));
|
||||||
|
usartint.output_handler().set(m_maincpu, FUNC(i80186_cpu_device::int0_w));
|
||||||
|
|
||||||
|
I8251(config, m_usart[0], 0);
|
||||||
|
m_usart[0]->txd_handler().set("modem", FUNC(rs232_port_device::write_txd));
|
||||||
|
m_usart[0]->dtr_handler().set("modem", FUNC(rs232_port_device::write_dtr));
|
||||||
|
m_usart[0]->rts_handler().set("modem", FUNC(rs232_port_device::write_rts));
|
||||||
|
m_usart[0]->rxrdy_handler().set("usartint", FUNC(input_merger_device::in_w<0>));
|
||||||
|
m_usart[0]->txrdy_handler().set("usartint", FUNC(input_merger_device::in_w<1>));
|
||||||
|
|
||||||
|
rs232_port_device &modem(RS232_PORT(config, "modem", default_rs232_devices, "null_modem"));
|
||||||
|
modem.rxd_handler().set(m_usart[0], FUNC(i8251_device::write_rxd));
|
||||||
|
modem.dsr_handler().set(m_usart[0], FUNC(i8251_device::write_dsr));
|
||||||
|
|
||||||
|
I8251(config, m_usart[1], 0);
|
||||||
|
m_usart[1]->txd_handler().set("printer", FUNC(rs232_port_device::write_txd));
|
||||||
|
m_usart[1]->dtr_handler().set("printer", FUNC(rs232_port_device::write_dtr));
|
||||||
|
m_usart[1]->rts_handler().set("printer", FUNC(rs232_port_device::write_rts));
|
||||||
|
m_usart[1]->rxrdy_handler().set("usartint", FUNC(input_merger_device::in_w<2>));
|
||||||
|
m_usart[1]->txrdy_handler().set("usartint", FUNC(input_merger_device::in_w<3>));
|
||||||
|
|
||||||
|
rs232_port_device &printer(RS232_PORT(config, "printer", default_rs232_devices, nullptr));
|
||||||
|
printer.rxd_handler().set(m_usart[1], FUNC(i8251_device::write_rxd));
|
||||||
|
printer.dsr_handler().set(m_usart[1], FUNC(i8251_device::write_dsr));
|
||||||
|
|
||||||
|
// Teletext data is extracted from video signal by SAA5231.
|
||||||
|
// Use bitbanger to read a T42 teletext stream.
|
||||||
|
BITBANGER(config, m_ttd, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ROM_START(datacast)
|
||||||
|
ROM_REGION16_LE(0x10000, "rom", 0)
|
||||||
|
ROM_LOAD16_BYTE("v29.ic9", 0x0000, 0x8000, CRC(650e6d34) SHA1(0c8709ce8220bda5da8fd41b81e531fc6f7b8ee4))
|
||||||
|
ROM_LOAD16_BYTE("v29.ic10", 0x0001, 0x8000, CRC(bd39d683) SHA1(9d6cc2d3d6a26ca35e4e38beac64d31e345d6808))
|
||||||
|
ROM_END
|
||||||
|
|
||||||
|
|
||||||
|
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
|
||||||
|
SYST(1987, datacast, 0, 0, datacast, datacast, datacast_state, empty_init, "Defence Products", "Datacast Controller (The Stock Exchange)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
|
@ -11621,6 +11621,9 @@ thndzone4 // MAJ (c) 1991 Data East Corporation (World) -
|
|||||||
thndzonea // MAJ (c) 1991 Data East Corporation (World)
|
thndzonea // MAJ (c) 1991 Data East Corporation (World)
|
||||||
thndzonej // MAJ (c) 1991 Data East Corporation (Japan) - Some MASK ROMS stamped MAL
|
thndzonej // MAJ (c) 1991 Data East Corporation (Japan) - Some MASK ROMS stamped MAL
|
||||||
|
|
||||||
|
@source:datacast.cpp
|
||||||
|
datacast //
|
||||||
|
|
||||||
@source:datum.cpp
|
@source:datum.cpp
|
||||||
datum // 1982
|
datum // 1982
|
||||||
|
|
||||||
|
@ -214,6 +214,7 @@ d6800.cpp
|
|||||||
d6809.cpp
|
d6809.cpp
|
||||||
dai.cpp
|
dai.cpp
|
||||||
daruma.cpp
|
daruma.cpp
|
||||||
|
datacast.cpp
|
||||||
datum.cpp
|
datum.cpp
|
||||||
dbox.cpp
|
dbox.cpp
|
||||||
dccons.cpp
|
dccons.cpp
|
||||||
|
Loading…
Reference in New Issue
Block a user