From a3cdd96349e30cb16f9eebfa7efcded628704f4f Mon Sep 17 00:00:00 2001 From: Sergey Svishchev Date: Thu, 29 Jun 2017 02:18:56 +0300 Subject: att4425: new skeleton (AT&T 4425 / Teletype 56D text terminal) --- scripts/target/mame/mess.lua | 1 + src/mame/drivers/att4425.cpp | 289 +++++++++++++++++++++++++++++++++++++++++++ src/mame/mame.lst | 3 + src/mame/mess.flt | 1 + 4 files changed, 294 insertions(+) create mode 100644 src/mame/drivers/att4425.cpp diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 11b29b685e6..e985419a17e 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -3391,6 +3391,7 @@ files { MAME_DIR .. "src/mame/drivers/anzterm.cpp", MAME_DIR .. "src/mame/drivers/applix.cpp", MAME_DIR .. "src/mame/drivers/argox.cpp", + MAME_DIR .. "src/mame/drivers/att4425.cpp", MAME_DIR .. "src/mame/drivers/attache.cpp", MAME_DIR .. "src/mame/drivers/aussiebyte.cpp", MAME_DIR .. "src/mame/includes/aussiebyte.h", diff --git a/src/mame/drivers/att4425.cpp b/src/mame/drivers/att4425.cpp new file mode 100644 index 00000000000..ba7a96e8b76 --- /dev/null +++ b/src/mame/drivers/att4425.cpp @@ -0,0 +1,289 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/*************************************************************************** + + AT&T model 4425 text terminal with mosaic graphics character set + Also known as Teletype model 56D. + + Skeleton driver. This terminal is supported by netpbm -- pbmto4425(1) + + To do: + - keyboard + - everything else + +****************************************************************************/ + + +#include "emu.h" + +#include "cpu/z80/z80.h" +#include "machine/clock.h" +#include "machine/i8251.h" +#include "machine/ram.h" +#include "machine/z80ctc.h" +#include "machine/z80sio.h" + +#include "bus/rs232/rs232.h" +#include "machine/keyboard.h" + +#include "screen.h" + + +#define SCREEN_TAG "screen" +#define Z80_TAG "maincpu" +#define Z80CTC_TAG "z80ctc" +#define Z80SIO_TAG "z80sio" +#define RS232_A_TAG "sioa" +#define RS232_B_TAG "siob" +#define I8251_TAG "i8251" + +class att4425_state : public driver_device +{ +public: + att4425_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, Z80_TAG) + , m_i8251(*this, I8251_TAG) + , m_sio(*this, Z80SIO_TAG) + , m_p_videoram(*this, "videoram") + , m_p_chargen(*this, "chargen") + , m_screen(*this, SCREEN_TAG) + { } + + DECLARE_WRITE_LINE_MEMBER(write_line_clock); + DECLARE_WRITE_LINE_MEMBER(write_keyboard_clock); + + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + +private: + virtual void machine_start() override; + virtual void video_start() override; + + required_device m_maincpu; + required_device m_i8251; + required_device m_sio; + required_shared_ptr m_p_videoram; + required_region_ptr m_p_chargen; + required_device m_screen; +}; + +/* Memory Maps */ + +static ADDRESS_MAP_START( att4425_mem, AS_PROGRAM, 8, att4425_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM AM_REGION(Z80_TAG, 0) + AM_RANGE(0x8000, 0xffff) AM_RAM AM_SHARE("videoram") // c000..f7af? +ADDRESS_MAP_END + +static ADDRESS_MAP_START( att4425_io, AS_IO, 8, att4425_state ) + AM_RANGE(0x0000, 0x0000) AM_MIRROR(0xff00) AM_DEVREADWRITE(I8251_TAG, i8251_device, data_r, data_w) + AM_RANGE(0x0001, 0x0001) AM_MIRROR(0xff00) AM_DEVREADWRITE(I8251_TAG, i8251_device, status_r, control_w) + AM_RANGE(0x0008, 0x0008) AM_MIRROR(0xff00) AM_UNMAP // write 08 + AM_RANGE(0x0010, 0x0010) AM_MIRROR(0xff00) AM_UNMAP // write 10 + AM_RANGE(0x0014, 0x0015) AM_MIRROR(0xff00) AM_UNMAP // NVRAM? read 14, 15; write 14 + AM_RANGE(0x0018, 0x001b) AM_MIRROR(0xff00) AM_DEVREADWRITE(Z80CTC_TAG, z80ctc_device, read, write) + AM_RANGE(0x001c, 0x001f) AM_MIRROR(0xff00) AM_DEVREADWRITE(Z80SIO_TAG, z80sio_device, ba_cd_r, ba_cd_w) +ADDRESS_MAP_END + +/* Input Ports */ + +static INPUT_PORTS_START( att4425 ) +INPUT_PORTS_END + +/* Video */ + +void att4425_state::video_start() +{ +} + +uint32_t att4425_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + uint8_t y, ra, gfx, fg, bg, chr, attr; + uint16_t sy = 0, ma, x, ca; + + fg = 2; + bg = 0; + + for (y = 0; y < 27; y++) + { + ma = 0x7e9c + 4 * (81 - 27 + y); + ma = (m_p_videoram[ma] << 8) + m_p_videoram[ma + 1] - 0x8000; + + for (ra = 0; ra < 13; ra++) + { + uint16_t *p = &bitmap.pix16(sy++); + + for (x = ma; x < ma + 160; x += 2) + { + chr = m_p_videoram[x + 1]; + attr = m_p_videoram[x]; + ca = (chr << 4) & 0x7f0; + + // font 2 + if (attr & 0x01) + ca += 0x0800; + + // underline + if (attr & 0x10 && ra == 12) + gfx = 0xff; + else + gfx = m_p_chargen[ca | ra] ^ 255; + + // dim + if (attr & 0x02) + fg = 1; + else + fg = 2; + + // conceal + if (attr & 0x04) + fg = bg; + + // reverse video + if (attr & 0x20) + gfx ^= 255; + + /* Display a scanline of a character */ + *p++ = BIT(gfx, 7) ? fg : bg; + *p++ = BIT(gfx, 6) ? fg : bg; + *p++ = BIT(gfx, 5) ? fg : bg; + *p++ = BIT(gfx, 4) ? fg : bg; + *p++ = BIT(gfx, 3) ? fg : bg; + *p++ = BIT(gfx, 2) ? fg : bg; + *p++ = BIT(gfx, 1) ? fg : bg; + *p++ = BIT(gfx, 0) ? fg : bg; + *p++ = bg; + } + } + ma += 160; + } + return 0; +} + +static const gfx_layout att4425_charlayout = +{ + 8, 13, + RGN_FRAC(1,1), + 1, + { 0 }, + { STEP8(0,1) }, + { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, }, + 16*8 +}; + +static GFXDECODE_START( att4425 ) + GFXDECODE_ENTRY( "chargen", 0x0000, att4425_charlayout, 0, 1 ) +GFXDECODE_END + +/* Machine Initialization */ + +void att4425_state::machine_start() +{ +} + +/* Machine Driver */ + +WRITE_LINE_MEMBER(att4425_state::write_line_clock) +{ + m_sio->rxca_w(state); + m_sio->txca_w(state); + m_sio->rxtxcb_w(state); +} + +WRITE_LINE_MEMBER(att4425_state::write_keyboard_clock) +{ + m_i8251->write_txc(state); + m_i8251->write_rxc(state); +} + +static const z80_daisy_config att4425_daisy_chain[] = +{ + // XXX order is unknown + { Z80SIO_TAG }, + { Z80CTC_TAG }, + { nullptr } +}; + +static MACHINE_CONFIG_START( att4425 ) + /* basic machine hardware */ + MCFG_CPU_ADD(Z80_TAG, Z80, XTAL_32MHz/8) // XXX + MCFG_CPU_PROGRAM_MAP(att4425_mem) + MCFG_CPU_IO_MAP(att4425_io) + MCFG_Z80_DAISY_CHAIN(att4425_daisy_chain) + + /* video hardware */ + MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green()) + MCFG_SCREEN_REFRESH_RATE(50) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ + MCFG_SCREEN_UPDATE_DRIVER(att4425_state, screen_update) + MCFG_SCREEN_PALETTE("palette") + MCFG_SCREEN_SIZE(720, 351) + MCFG_SCREEN_VISIBLE_AREA(0, 720-1, 0, 351-1) + MCFG_GFXDECODE_ADD("gfxdecode", "palette", att4425) + MCFG_PALETTE_ADD_MONOCHROME_HIGHLIGHT("palette") + + // ch.3 -- timer? + MCFG_DEVICE_ADD(Z80CTC_TAG, Z80CTC, XTAL_32MHz) // XXX + MCFG_Z80CTC_INTR_CB(INPUTLINE(Z80_TAG, INPUT_LINE_IRQ0)) +#ifdef notdef + MCFG_Z80CTC_ZC0_CB(DEVWRITELINE(Z80SIO_TAG, z80sio_device, rxca_w)) + MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE(Z80SIO_TAG, z80sio_device, txca_w)) + MCFG_Z80CTC_ZC2_CB(DEVWRITELINE(Z80SIO_TAG, z80sio_device, rxtxcb_w)) +#endif + + MCFG_Z80SIO_ADD(Z80SIO_TAG, 4800, 0, 0, 0, 0) // XXX + MCFG_Z80SIO_OUT_INT_CB(INPUTLINE(Z80_TAG, INPUT_LINE_IRQ0)) + MCFG_Z80SIO_OUT_TXDA_CB(DEVWRITELINE(RS232_A_TAG, rs232_port_device, write_txd)) + MCFG_Z80SIO_OUT_DTRA_CB(DEVWRITELINE(RS232_A_TAG, rs232_port_device, write_dtr)) + MCFG_Z80SIO_OUT_RTSA_CB(DEVWRITELINE(RS232_A_TAG, rs232_port_device, write_rts)) + MCFG_Z80SIO_OUT_TXDB_CB(DEVWRITELINE(RS232_B_TAG, rs232_port_device, write_txd)) + + // host + MCFG_RS232_PORT_ADD(RS232_A_TAG, default_rs232_devices, "null_modem") + MCFG_RS232_RXD_HANDLER(DEVWRITELINE(Z80SIO_TAG, z80sio_device, rxa_w)) + MCFG_RS232_DCD_HANDLER(DEVWRITELINE(Z80SIO_TAG, z80sio_device, dcda_w)) + MCFG_RS232_CTS_HANDLER(DEVWRITELINE(Z80SIO_TAG, z80sio_device, ctsa_w)) + + // aux printer? + MCFG_RS232_PORT_ADD(RS232_B_TAG, default_rs232_devices, "printer") + MCFG_RS232_RXD_HANDLER(DEVWRITELINE(Z80SIO_TAG, z80sio_device, rxb_w)) + + // XXX + MCFG_DEVICE_ADD("line_clock", CLOCK, 9600*64) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(att4425_state, write_line_clock)) + + MCFG_DEVICE_ADD(I8251_TAG, I8251, 0) + MCFG_I8251_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd)) + MCFG_I8251_DTR_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_dtr)) + MCFG_I8251_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts)) + + MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "keyboard") + MCFG_RS232_RXD_HANDLER(DEVWRITELINE(I8251_TAG, i8251_device, write_rxd)) + MCFG_RS232_CTS_HANDLER(DEVWRITELINE(I8251_TAG, i8251_device, write_cts)) + MCFG_RS232_DSR_HANDLER(DEVWRITELINE(I8251_TAG, i8251_device, write_dsr)) + + // XXX + MCFG_DEVICE_ADD("keyboard_clock", CLOCK, 4800*64) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(att4425_state, write_keyboard_clock)) + + MCFG_RAM_ADD(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("32K") + MCFG_RAM_DEFAULT_VALUE(0) +MACHINE_CONFIG_END + +/* ROMs */ + +ROM_START( att4425 ) + ROM_REGION( 0x8000, Z80_TAG, 0 ) + ROM_LOAD( "455773-1.bin", 0x0000, 0x2000, CRC(d216515b) SHA1(6e098c35f8fe6be4f28a577a43145c92972041b1) ) + ROM_LOAD( "455774-1.bin", 0x2000, 0x2000, CRC(636c069a) SHA1(c00648eae44c574b983de6a0ba6cf74a7f07b098) ) + ROM_LOAD( "456305-1.bin", 0x4000, 0x2000, CRC(43cbf638) SHA1(939569e65957370ab8e60d4f90179373b72b9573) ) + ROM_LOAD( "456306-1.bin", 0x6000, 0x2000, CRC(e4f2b0f1) SHA1(c80c2b7219b313b4924834b0a9d1d42536d1ae63) ) + + ROM_REGION( 0x2000, "chargen", 0 ) + ROM_LOAD( "char.bin", 0x0000, 0x2000, CRC(cca962cc) SHA1(201d97b954f782ceae8d17a08fb9a1c4d5ae7a58) ) +ROM_END + +/* System Drivers */ + +// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS +COMP( 1983, att4425, 0, 0, att4425, att4425, att4425_state, 0, "AT&T", "AT&T Teletype 4425", MACHINE_IS_SKELETON ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 8e8259f60b0..1a2a0aa55bc 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -2543,6 +2543,9 @@ shpinxii // Sphinx II splmastr // Spell Master tajmah // Tajmahal +@source:att4425.cpp +att4425 // + @source:attache.cpp attache // diff --git a/src/mame/mess.flt b/src/mame/mess.flt index a38656c8475..50dca726e29 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -65,6 +65,7 @@ atarist.cpp atm.cpp atom.cpp atpci.cpp +att4425.cpp attache.cpp aussiebyte.cpp avigo.cpp -- cgit v1.2.3