mcb216, cb308: Replace UART with TMS5501

This commit is contained in:
AJR 2018-03-04 23:16:35 -05:00
parent 76add106d2
commit a9b11e7182
2 changed files with 56 additions and 70 deletions

View File

@ -82,6 +82,17 @@ public:
virtual void io_map(address_map &map);
DECLARE_READ8_MEMBER( rb_r );
DECLARE_READ8_MEMBER( xi_r );
DECLARE_READ8_MEMBER( rst_r );
DECLARE_READ8_MEMBER( sta_r );
DECLARE_WRITE8_MEMBER( cmd_w );
DECLARE_WRITE8_MEMBER( rr_w );
DECLARE_WRITE8_MEMBER( tb_w );
DECLARE_WRITE8_MEMBER( xo_w );
DECLARE_WRITE8_MEMBER( mr_w );
DECLARE_WRITE8_MEMBER( tmr_w );
protected:
// device-level overrides
virtual void device_start() override;
@ -172,17 +183,6 @@ private:
int m_xi7;
emu_timer *m_timer[5];
DECLARE_READ8_MEMBER( rb_r );
DECLARE_READ8_MEMBER( xi_r );
DECLARE_READ8_MEMBER( rst_r );
DECLARE_READ8_MEMBER( sta_r );
DECLARE_WRITE8_MEMBER( cmd_w );
DECLARE_WRITE8_MEMBER( rr_w );
DECLARE_WRITE8_MEMBER( tb_w );
DECLARE_WRITE8_MEMBER( xo_w );
DECLARE_WRITE8_MEMBER( mr_w );
DECLARE_WRITE8_MEMBER( tmr_w );
};

View File

@ -33,7 +33,7 @@ only storage is paper-tape.
#include "emu.h"
#include "cpu/z80/z80.h"
#include "machine/ay31015.h"
#include "machine/tms5501.h"
#include "bus/rs232/rs232.h"
@ -43,15 +43,16 @@ public:
mcb216_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_uart(*this, "uart")
, m_tms5501(*this, "tms5501")
{ }
DECLARE_READ8_MEMBER(port00_r);
DECLARE_READ8_MEMBER(port01_r);
DECLARE_WRITE8_MEMBER(port01_w);
DECLARE_READ8_MEMBER(tms5501_status_r);
DECLARE_MACHINE_RESET(mcb216);
DECLARE_MACHINE_RESET(cb308);
IRQ_CALLBACK_MEMBER(irq_callback);
void mcb216(machine_config &config);
void cb308(machine_config &config);
void cb308_mem(address_map &map);
@ -59,9 +60,16 @@ public:
void mcb216_mem(address_map &map);
private:
required_device<cpu_device> m_maincpu;
required_device<ay31015_device> m_uart;
required_device<tms5501_device> m_tms5501;
};
READ8_MEMBER(mcb216_state::tms5501_status_r)
{
// D7 D6 D5 D4 D3 D2 D1 D0
// TBE RDA IPG TBE RDA SRV ORE FME
return bitswap<8>(m_tms5501->sta_r(space, 0), 4, 3, 5, 4, 3, 2, 1, 0);
}
ADDRESS_MAP_START(mcb216_state::mcb216_mem)
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0x0000, 0x0fff) AM_ROM AM_REGION("roms", 0)
@ -71,8 +79,13 @@ ADDRESS_MAP_END
ADDRESS_MAP_START(mcb216_state::mcb216_io)
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x00, 0x00) AM_READ(port00_r)
AM_RANGE(0x01, 0x01) AM_READWRITE(port01_r,port01_w)
// 74904 PROM provides custom remapping for TMS5501 registers
AM_RANGE(0x00, 0x00) AM_READ(tms5501_status_r) AM_DEVWRITE("tms5501", tms5501_device, rr_w)
AM_RANGE(0x01, 0x01) AM_DEVREADWRITE("tms5501", tms5501_device, rb_r, tb_w)
AM_RANGE(0x02, 0x02) AM_DEVWRITE("tms5501", tms5501_device, cmd_w)
AM_RANGE(0x03, 0x03) AM_DEVREADWRITE("tms5501", tms5501_device, rst_r, mr_w)
AM_RANGE(0x04, 0x04) AM_DEVREADWRITE("tms5501", tms5501_device, xi_r, xo_w)
AM_RANGE(0x05, 0x09) AM_DEVWRITE("tms5501", tms5501_device, tmr_w)
ADDRESS_MAP_END
ADDRESS_MAP_START(mcb216_state::cb308_mem)
@ -87,85 +100,52 @@ static INPUT_PORTS_START( mcb216 )
INPUT_PORTS_END
READ8_MEMBER( mcb216_state::port01_r )
IRQ_CALLBACK_MEMBER(mcb216_state::irq_callback)
{
m_uart->write_rdav(0);
u8 result = m_uart->get_received_data();
m_uart->write_rdav(1);
return result;
}
// 0x40 - a keystroke is available
// 0x80 - ok to send to terminal
READ8_MEMBER( mcb216_state::port00_r )
{
return (m_uart->dav_r() << 6) | (m_uart->tbmt_r() << 7);
}
WRITE8_MEMBER( mcb216_state::port01_w )
{
m_uart->set_transmit_data(data);
return m_tms5501->get_vector();
}
MACHINE_RESET_MEMBER( mcb216_state, mcb216 )
{
m_uart->write_xr(0);
m_uart->write_xr(1);
m_uart->write_swe(0);
m_uart->write_np(1);
m_uart->write_tsb(0);
m_uart->write_nb1(1);
m_uart->write_nb2(1);
m_uart->write_eps(1);
m_uart->write_cs(1);
m_uart->write_cs(0);
}
MACHINE_RESET_MEMBER( mcb216_state, cb308 )
{
m_uart->write_xr(0);
m_uart->write_xr(1);
m_uart->write_swe(0);
m_uart->write_np(1);
m_uart->write_tsb(0);
m_uart->write_nb1(1);
m_uart->write_nb2(1);
m_uart->write_eps(1);
m_uart->write_cs(1);
m_uart->write_cs(0);
m_maincpu->set_state_int(Z80_PC, 0xe000);
}
MACHINE_CONFIG_START(mcb216_state::mcb216)
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, 4000000)
MCFG_CPU_ADD("maincpu", Z80, 8_MHz_XTAL / 2)
MCFG_CPU_PROGRAM_MAP(mcb216_mem)
MCFG_CPU_IO_MAP(mcb216_io)
MCFG_CPU_IRQ_ACKNOWLEDGE_DRIVER(mcb216_state, irq_callback)
MCFG_MACHINE_RESET_OVERRIDE(mcb216_state, mcb216)
/* video hardware */
MCFG_DEVICE_ADD("uart", AY51013, 0) // exact uart type is unknown
MCFG_AY51013_TX_CLOCK(153600)
MCFG_AY51013_RX_CLOCK(153600)
MCFG_AY51013_READ_SI_CB(DEVREADLINE("rs232", rs232_port_device, rxd_r))
MCFG_AY51013_WRITE_SO_CB(DEVWRITELINE("rs232", rs232_port_device, write_txd))
MCFG_DEVICE_ADD("tms5501", TMS5501, 8_MHz_XTAL / 4)
MCFG_TMS5501_XMT_CALLBACK(DEVWRITELINE("rs232", rs232_port_device, write_txd))
MCFG_TMS5501_IRQ_CALLBACK(INPUTLINE("maincpu", 0))
MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "terminal")
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("tms5501", tms5501_device, rcv_w))
MACHINE_CONFIG_END
MACHINE_CONFIG_START(mcb216_state::cb308)
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, 4000000)
MCFG_CPU_ADD("maincpu", Z80, 8_MHz_XTAL / 2)
MCFG_CPU_PROGRAM_MAP(cb308_mem)
MCFG_CPU_IO_MAP(mcb216_io)
MCFG_CPU_IRQ_ACKNOWLEDGE_DRIVER(mcb216_state, irq_callback)
MCFG_MACHINE_RESET_OVERRIDE(mcb216_state, cb308)
/* video hardware */
MCFG_DEVICE_ADD("uart", AY51013, 0) // exact uart type is unknown
MCFG_AY51013_TX_CLOCK(153600)
MCFG_AY51013_RX_CLOCK(153600)
MCFG_AY51013_READ_SI_CB(DEVREADLINE("rs232", rs232_port_device, rxd_r))
MCFG_AY51013_WRITE_SO_CB(DEVWRITELINE("rs232", rs232_port_device, write_txd))
MCFG_DEVICE_ADD("tms5501", TMS5501, 8_MHz_XTAL / 4)
MCFG_TMS5501_XMT_CALLBACK(DEVWRITELINE("rs232", rs232_port_device, write_txd))
MCFG_TMS5501_IRQ_CALLBACK(INPUTLINE("maincpu", 0))
MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "terminal")
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("tms5501", tms5501_device, rcv_w))
MACHINE_CONFIG_END
/* ROM definition */
@ -173,6 +153,9 @@ ROM_START( mcb216 )
ROM_REGION(0x1000, "roms", 0)
ROM_LOAD( "mcb216r0", 0x0000, 0x0800, CRC(86d20cea) SHA1(9fb8fdbcb8d31bd3304a0b3339c7f423188e9d37) )
ROM_LOAD( "mcb216r1", 0x0800, 0x0800, CRC(68a25b2c) SHA1(3eadd4a5d65726f767742deb4b51a97df813f37d) )
ROM_REGION(0x20, "prom", 0)
ROM_LOAD( "74904.ic25", 0x00, 0x20, NO_DUMP ) // TBP18S030 or equivalent
ROM_END
ROM_START( cb308 )
@ -181,6 +164,9 @@ ROM_START( cb308 )
ROM_LOAD( "cb308r1", 0x0400, 0x0400, CRC(03191ac1) SHA1(84665dfc797c9f51bb659291b18399986ed846fb) )
ROM_LOAD( "cb308r2", 0x0800, 0x0400, CRC(695ea521) SHA1(efe36a712e2a038ee804e556c5ebe05443cf798e) )
ROM_LOAD( "cb308r3", 0x0c00, 0x0400, CRC(e3e4a778) SHA1(a7c14458f8636d860ae25b10387fa6f7f2ef6ef9) )
ROM_REGION(0x20, "prom", 0)
ROM_LOAD( "74904.ic25", 0x00, 0x20, NO_DUMP ) // TBP18S030 or equivalent
ROM_END
/* Driver */