From cb811612ced1c3aa9a4833393ee7d218bdb1f290 Mon Sep 17 00:00:00 2001 From: arbee Date: Thu, 28 Jul 2016 23:02:21 -0400 Subject: [PATCH] tv990/995: Add save state support and PC-style LPT port. [R. Belmont] --- src/mame/drivers/tv990.cpp | 72 ++++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/src/mame/drivers/tv990.cpp b/src/mame/drivers/tv990.cpp index 4f1b7b163c9..124e05d86a2 100644 --- a/src/mame/drivers/tv990.cpp +++ b/src/mame/drivers/tv990.cpp @@ -3,10 +3,10 @@ /*************************************************************************** TeleVideo 990/995 terminal - + Driver by Carl and R. Belmont Thanks to Al Kossow. - + H/W: 68000-P16 CPU (clock unknown, above 10 MHz it outruns the AT keyboard controller) 16C452 dual 16450 (PC/AT standard) UART + PC-compatible Centronics (integrated into @@ -14,7 +14,7 @@ AMI MEGA-KBD-H-Q PS/2 keyboard interface on 990, PS/2 8042 on 995 Televideo ASIC marked "134446-00 TVI1111-0 427" 3x AS7C256 (32K x 8 SRAM) - + IRQs: 2 = PS/2 keyboard 3 = Centronics @@ -24,7 +24,7 @@ Video modes include 80 or 132 wide by 24, 25, 42, 43, 48, or 49 lines high plus an optional status bar - Modes include TeleVideo 990, 950, and 955, Wyse WY-60, WY-150/120/50+/50, ANSI, + Modes include TeleVideo 990, 950, and 955, Wyse WY-60, WY-150/120/50+/50, ANSI, DEC VT320/220, VT100/52, SCO Console, and PC TERM. ****************************************************************************/ @@ -34,13 +34,15 @@ #include "machine/ins8250.h" #include "machine/8042kbdc.h" #include "bus/rs232/rs232.h" +#include "machine/pc_lpt.h" #include "machine/nvram.h" #include "sound/beep.h" -#define UART0_TAG "ns16450_0" -#define UART1_TAG "ns16450_1" +#define UART0_TAG "ns16450_0" +#define UART1_TAG "ns16450_1" #define RS232A_TAG "rs232a" #define RS232B_TAG "rs232b" +#define LPT_TAG "lpt" class tv990_state : public driver_device { @@ -71,16 +73,18 @@ public: virtual void machine_reset() override; virtual void machine_start() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; - + virtual void device_post_load() override; + UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - + DECLARE_READ16_MEMBER(tvi1111_r); DECLARE_WRITE16_MEMBER(tvi1111_w); DECLARE_READ8_MEMBER(kbdc_r); DECLARE_WRITE8_MEMBER(kbdc_w); - - WRITE_LINE_MEMBER(uart0_irq); - WRITE_LINE_MEMBER(uart1_irq); + + DECLARE_WRITE_LINE_MEMBER(uart0_irq); + DECLARE_WRITE_LINE_MEMBER(uart1_irq); + DECLARE_WRITE_LINE_MEMBER(lpt_irq); INTERRUPT_GEN_MEMBER(vblank); DECLARE_INPUT_CHANGED_MEMBER(color); @@ -100,7 +104,7 @@ INTERRUPT_GEN_MEMBER(tv990_state::vblank) void tv990_state::machine_start() { m_rowtimer = timer_alloc(); - + save_item(NAME(tvi1111_regs)); save_item(NAME(m_rowh)); save_item(NAME(m_width)); @@ -124,11 +128,16 @@ WRITE_LINE_MEMBER(tv990_state::uart1_irq) m_maincpu->set_input_line(M68K_IRQ_4, state); } +WRITE_LINE_MEMBER(tv990_state::lpt_irq) +{ + m_maincpu->set_input_line(M68K_IRQ_3, state); +} + READ16_MEMBER(tv990_state::tvi1111_r) { if (offset == (0x32/2)) { - tvi1111_regs[offset] |= 8; // loop at 109ca wants this set + tvi1111_regs[offset] |= 8; // loop at 109ca wants this set } else if(offset == 0x1d) { @@ -230,7 +239,7 @@ UINT32 tv990_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, c attr ^= attrchg; } - if (attr & 0x4) // inverse video? + if (attr & 0x4) // inverse video? { palette[1] = m_palette->pen(0); palette[0] = (attr & 0x10) ? m_palette->pen(1) : m_palette->pen(2); @@ -295,13 +304,14 @@ WRITE8_MEMBER(tv990_state::kbdc_w) static ADDRESS_MAP_START(tv990_mem, AS_PROGRAM, 16, tv990_state) AM_RANGE(0x000000, 0x03ffff) AM_ROM AM_REGION("maincpu", 0) - AM_RANGE(0x060000, 0x06ffff) AM_RAM AM_SHARE("vram") // character/attribute RAM - AM_RANGE(0X080000, 0X087fff) AM_RAM AM_SHARE("fontram") // font RAM + AM_RANGE(0x060000, 0x06ffff) AM_RAM AM_SHARE("vram") // character/attribute RAM + AM_RANGE(0X080000, 0X087fff) AM_RAM AM_SHARE("fontram") // font RAM AM_RANGE(0x090000, 0x0900ff) AM_READWRITE(tvi1111_r, tvi1111_w) AM_RANGE(0x0a0000, 0x0a000f) AM_DEVREADWRITE8(UART0_TAG, ns16450_device, ins8250_r, ins8250_w, 0x00ff) AM_RANGE(0x0a0010, 0x0a001f) AM_DEVREADWRITE8(UART1_TAG, ns16450_device, ins8250_r, ins8250_w, 0x00ff) + AM_RANGE(0x0a0028, 0x0a002d) AM_DEVREADWRITE8(LPT_TAG, pc_lpt_device, read, write, 0x00ff) AM_RANGE(0x0b0000, 0x0b0003) AM_READWRITE8(kbdc_r, kbdc_w, 0x00ff) - AM_RANGE(0x0c0000, 0x0c7fff) AM_RAM AM_SHARE("nvram")// work RAM + AM_RANGE(0x0c0000, 0x0c7fff) AM_RAM AM_SHARE("nvram")// work RAM ADDRESS_MAP_END /* Input ports */ @@ -339,19 +349,24 @@ INPUT_CHANGED_MEMBER(tv990_state::color) void tv990_state::machine_reset() { m_rowtimer->adjust(m_screen->time_until_pos(0)); - + memset(tvi1111_regs, 0, sizeof(tvi1111_regs)); m_rowh = 16; m_width = 80; m_height = 50; } +void tv990_state::device_post_load() +{ + m_screen->set_visible_area(0, m_width * 16 - 1, 0, m_height * m_rowh - 1); +} + static MACHINE_CONFIG_START( tv990, tv990_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M68000, 14967500) // verified (59.86992/4) + MCFG_CPU_ADD("maincpu", M68000, 14967500) // verified (59.86992/4) MCFG_CPU_PROGRAM_MAP(tv990_mem) MCFG_CPU_VBLANK_INT_DRIVER("screen", tv990_state, vblank) - + MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green) MCFG_SCREEN_UPDATE_DRIVER(tv990_state, screen_update) MCFG_SCREEN_SIZE(132*16, 50*16) @@ -370,6 +385,9 @@ static MACHINE_CONFIG_START( tv990, tv990_state ) MCFG_INS8250_OUT_RTS_CB(DEVWRITELINE(RS232B_TAG, rs232_port_device, write_rts)) MCFG_INS8250_OUT_TX_CB(DEVWRITELINE(RS232B_TAG, rs232_port_device, write_txd)) MCFG_INS8250_OUT_INT_CB(WRITELINE(tv990_state, uart1_irq)) + + MCFG_DEVICE_ADD(LPT_TAG, PC_LPT, 0) + MCFG_PC_LPT_IRQ_HANDLER(WRITELINE(tv990_state, lpt_irq)) MCFG_RS232_PORT_ADD(RS232A_TAG, default_rs232_devices, nullptr) MCFG_RS232_RXD_HANDLER(DEVWRITELINE(UART0_TAG, ns16450_device, rx_w)) @@ -380,7 +398,7 @@ static MACHINE_CONFIG_START( tv990, tv990_state ) MCFG_RS232_RXD_HANDLER(DEVWRITELINE(UART1_TAG, ns16450_device, rx_w)) MCFG_RS232_DCD_HANDLER(DEVWRITELINE(UART1_TAG, ns16450_device, dcd_w)) MCFG_RS232_CTS_HANDLER(DEVWRITELINE(UART1_TAG, ns16450_device, cts_w)) - + MCFG_DEVICE_ADD("pc_kbdc", KBDC8042, 0) MCFG_KBDC8042_KEYBOARD_TYPE(KBDC8042_AT386) MCFG_KBDC8042_INPUT_BUFFER_FULL_CB(INPUTLINE("maincpu", M68K_IRQ_2)) @@ -395,16 +413,16 @@ MACHINE_CONFIG_END /* ROM definition */ ROM_START( tv990 ) ROM_REGION( 0x40000, "maincpu", 0 ) - ROM_LOAD16_BYTE( "180003-89_u3.bin", 0x000000, 0x010000, CRC(0465fc55) SHA1(b8874ce54bf2bf4f77664194d2f23c0e4e6ccbe9) ) - ROM_LOAD16_BYTE( "180003-90_u4.bin", 0x000001, 0x010000, CRC(fad7d77d) SHA1(f1114a4a07c8b4ffa0323a2e7ce03d82a386f7d3) ) + ROM_LOAD16_BYTE( "180003-89_u3.bin", 0x000000, 0x010000, CRC(0465fc55) SHA1(b8874ce54bf2bf4f77664194d2f23c0e4e6ccbe9) ) + ROM_LOAD16_BYTE( "180003-90_u4.bin", 0x000001, 0x010000, CRC(fad7d77d) SHA1(f1114a4a07c8b4ffa0323a2e7ce03d82a386f7d3) ) ROM_END ROM_START( tv995 ) ROM_REGION( 0x40000, "maincpu", 0 ) - ROM_LOAD16_BYTE( "995-65_u3.bin", 0x000000, 0x020000, CRC(2d71b6fe) SHA1(a2a3406c19308eb9232db319ea8f151949b2ac74) ) - ROM_LOAD16_BYTE( "995-65_u4.bin", 0x000001, 0x020000, CRC(dc002af2) SHA1(9608e7a729c5ac0fc58f673eaf441d2f4f591ec6) ) + ROM_LOAD16_BYTE( "995-65_u3.bin", 0x000000, 0x020000, CRC(2d71b6fe) SHA1(a2a3406c19308eb9232db319ea8f151949b2ac74) ) + ROM_LOAD16_BYTE( "995-65_u4.bin", 0x000001, 0x020000, CRC(dc002af2) SHA1(9608e7a729c5ac0fc58f673eaf441d2f4f591ec6) ) ROM_END /* Driver */ -COMP( 1992, tv990, 0, 0, tv990, tv990, driver_device, 0, "TeleVideo", "TeleVideo 990", 0) -COMP( 1994, tv995, 0, 0, tv990, tv990, driver_device, 0, "TeleVideo", "TeleVideo 995-65", 0) +COMP( 1992, tv990, 0, 0, tv990, tv990, driver_device, 0, "TeleVideo", "TeleVideo 990", MACHINE_SUPPORTS_SAVE) +COMP( 1994, tv995, 0, 0, tv990, tv990, driver_device, 0, "TeleVideo", "TeleVideo 995-65", MACHINE_SUPPORTS_SAVE)