New machines added as NOT_WORKING:

- TeleVideo 990 [R. Belmont, Al Kossow]
This commit is contained in:
arbee 2016-07-17 15:52:07 -04:00
parent 4992a769c6
commit 843bdf4b4a
3 changed files with 315 additions and 0 deletions

311
src/mame/drivers/tv990.cpp Normal file
View File

@ -0,0 +1,311 @@
// license:BSD-3-Clause
// copyright-holders:R. Belmont
/***************************************************************************
TeleVideo 990 terminal
Preliminary driver by R. Belmont
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
AMI MEGA-KBD-H-Q PS/2 keyboard interface
Televideo ASIC marked "134446-00 TVI1111-0 427"
3x AS7C256 (32K x 8 SRAM)
IRQs:
2 = PS/2 keyboard
3 = Centronics
4 = UART 1
5 = UART 0
6 = VBL (9003b is status, write 3 to 9003b to reset
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,
DEC VT320/220, VT100/52, SCO Console, and PC TERM.
ASIC registers:
0x01 = possibly width (80 written at startup)
0x09 = possibly height (50 written at startup; 49 + the status bar)
0x16 = cursor X position
Status bar is out of the way of used VRAM at offset 0x36b0.
****************************************************************************/
#include "emu.h"
#include "cpu/m68000/m68000.h"
#include "machine/ins8250.h"
#include "machine/at_keybc.h"
#include "bus/rs232/rs232.h"
#include "bus/pc_kbd/pc_kbdc.h"
#include "bus/pc_kbd/keyboards.h"
#define UART0_TAG "ns16450_0"
#define UART1_TAG "ns16450_1"
#define RS232A_TAG "rs232a"
#define RS232B_TAG "rs232b"
class tv990_state : public driver_device
{
public:
tv990_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_vram(*this, "vram"),
m_fontram(*this, "fontram"),
m_uart0(*this, UART0_TAG),
m_uart1(*this, UART1_TAG),
m_keybc(*this, "keybc")
{
}
required_device<m68000_device> m_maincpu;
required_shared_ptr<UINT16> m_vram;
required_shared_ptr<UINT16> m_fontram;
required_device<ns16450_device> m_uart0, m_uart1;
required_device<at_keyboard_controller_device> m_keybc;
virtual void machine_reset() override;
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_READ16_MEMBER(tvi1111_r);
DECLARE_WRITE16_MEMBER(tvi1111_w);
DECLARE_READ16_MEMBER(keyb_r);
DECLARE_WRITE16_MEMBER(keyb_w);
WRITE_LINE_MEMBER(keybc_irq);
WRITE_LINE_MEMBER(uart0_irq);
WRITE_LINE_MEMBER(uart1_irq);
private:
UINT16 tvi1111_regs[0xff/2];
};
WRITE_LINE_MEMBER(tv990_state::keybc_irq)
{
m_maincpu->set_input_line(M68K_IRQ_2, state);
}
WRITE_LINE_MEMBER(tv990_state::uart0_irq)
{
m_maincpu->set_input_line(M68K_IRQ_5, state);
}
WRITE_LINE_MEMBER(tv990_state::uart1_irq)
{
m_maincpu->set_input_line(M68K_IRQ_4, state);
}
READ16_MEMBER(tv990_state::tvi1111_r)
{
if (offset == (0x32/2))
{
tvi1111_regs[offset] |= 8; // loop at 109ca wants this set
}
return tvi1111_regs[offset];
}
WRITE16_MEMBER(tv990_state::tvi1111_w)
{
#if 0
//if ((offset != 0x50) && (offset != 0x68) && (offset != 0x1d))
{
if (mem_mask == 0x00ff)
{
printf("%x (%d) to ASIC @ %x (mask %04x)\n", data & 0xff, data & 0xff, offset, mem_mask);
}
else if (mem_mask == 0xff00)
{
printf("%x (%d) to ASIC @ %x (mask %04x)\n", data & 0xff, data & 0xff, offset, mem_mask);
}
else
{
printf("%x (%d) to ASIC @ %x (mask %04x)\n", data, data, offset, mem_mask);
}
}
#endif
COMBINE_DATA(&tvi1111_regs[offset]);
}
UINT32 tv990_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
UINT32 *scanline;
int x, y;
UINT8 pixels, pixels2;
static const UINT32 palette[2] = { 0, 0xffffff };
static const UINT32 invpalette[2] = { 0xffffff, 0 };
UINT16 *vram = (UINT16 *)m_vram.target();
UINT8 *fontram = (UINT8 *)m_fontram.target();
UINT16 *curchar;
UINT8 *fontptr;
for (y = 0; y < 50; y++)
{
if (y == 49)
{
curchar = &vram[14000/2];
}
else
{
curchar = &vram[80 * y];
}
for (x = 0; x < 80; x++)
{
fontptr = (UINT8 *)&fontram[((curchar[x]>>8) & 0xff) * 64];
for (int chary = 0; chary < 16; chary++)
{
scanline = &bitmap.pix32((y*16)+chary, (x*16));
pixels = *fontptr++;
pixels2 = *fontptr++;
if (curchar[x] & 0x4) // inverse video?
{
*scanline++ = invpalette[(pixels>>7)&1];
*scanline++ = invpalette[(pixels2>>7)&1];
*scanline++ = invpalette[(pixels>>6)&1];
*scanline++ = invpalette[(pixels2>>6)&1];
*scanline++ = invpalette[(pixels>>5)&1];
*scanline++ = invpalette[(pixels2>>5)&1];
*scanline++ = invpalette[(pixels>>4)&1];
*scanline++ = invpalette[(pixels2>>4)&1];
*scanline++ = invpalette[(pixels>>3)&1];
*scanline++ = invpalette[(pixels2>>3)&1];
*scanline++ = invpalette[(pixels>>2)&1];
*scanline++ = invpalette[(pixels2>>2)&1];
*scanline++ = invpalette[(pixels>>1)&1];
*scanline++ = invpalette[(pixels2>>1)&1];
*scanline++ = invpalette[(pixels&1)];
*scanline++ = invpalette[(pixels2&1)];
}
else
{
*scanline++ = palette[(pixels>>7)&1];
*scanline++ = palette[(pixels2>>7)&1];
*scanline++ = palette[(pixels>>6)&1];
*scanline++ = palette[(pixels2>>6)&1];
*scanline++ = palette[(pixels>>5)&1];
*scanline++ = palette[(pixels2>>5)&1];
*scanline++ = palette[(pixels>>4)&1];
*scanline++ = palette[(pixels2>>4)&1];
*scanline++ = palette[(pixels>>3)&1];
*scanline++ = palette[(pixels2>>3)&1];
*scanline++ = palette[(pixels>>2)&1];
*scanline++ = palette[(pixels2>>2)&1];
*scanline++ = palette[(pixels>>1)&1];
*scanline++ = palette[(pixels2>>1)&1];
*scanline++ = palette[(pixels&1)];
*scanline++ = palette[(pixels2&1)];
}
}
}
}
return 0;
}
// 2ac = test
READ16_MEMBER(tv990_state::keyb_r)
{
UINT8 rv = 0;
if (offset == 0)
{
rv = m_keybc->data_r(space, 0);
}
else
{
rv = m_keybc->status_r(space, 0);
}
return rv;
}
WRITE16_MEMBER(tv990_state::keyb_w)
{
if (offset == 0)
{
m_keybc->data_w(space, 0, data);
}
else
{
m_keybc->command_w(space, 0, data);
}
}
static ADDRESS_MAP_START(tv990_mem, AS_PROGRAM, 16, tv990_state)
AM_RANGE(0x000000, 0x01ffff) AM_ROM AM_REGION("maincpu", 0)
AM_RANGE(0x060000, 0x063fff) 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(0x0b0000, 0x0b0003) AM_READWRITE(keyb_r, keyb_w)
AM_RANGE(0x0c0000, 0x0c7fff) AM_RAM // work RAM
ADDRESS_MAP_END
/* Input ports */
static INPUT_PORTS_START( tv990 )
INPUT_PORTS_END
void tv990_state::machine_reset()
{
}
static MACHINE_CONFIG_START( tv990, tv990_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, XTAL_10MHz) // real speed unclear, this is as fast as you can go without outrunning the AT keyboard controller, but real 990 uses an HLE reproduction
MCFG_CPU_PROGRAM_MAP(tv990_mem)
MCFG_CPU_VBLANK_INT_DRIVER("screen", tv990_state, irq6_line_hold)
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_UPDATE_DRIVER(tv990_state, screen_update)
MCFG_SCREEN_SIZE(132*16, 50*16)
MCFG_SCREEN_VISIBLE_AREA(0, (80*16)-1, 0, (50*16)-1)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_DEVICE_ADD( UART0_TAG, NS16450, XTAL_1_8432MHz )
MCFG_INS8250_OUT_TX_CB(DEVWRITELINE(RS232A_TAG, rs232_port_device, write_txd))
MCFG_INS8250_OUT_INT_CB(WRITELINE(tv990_state, uart0_irq))
MCFG_DEVICE_ADD( UART1_TAG, NS16450, XTAL_1_8432MHz )
MCFG_INS8250_OUT_TX_CB(DEVWRITELINE(RS232B_TAG, rs232_port_device, write_txd))
MCFG_INS8250_OUT_INT_CB(WRITELINE(tv990_state, uart0_irq))
MCFG_RS232_PORT_ADD(RS232A_TAG, default_rs232_devices, nullptr)
MCFG_RS232_RXD_HANDLER(DEVWRITELINE(UART0_TAG, ns16450_device, rx_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE(UART0_TAG, ns16450_device, dcd_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE(UART0_TAG, ns16450_device, cts_w))
MCFG_RS232_PORT_ADD(RS232B_TAG, default_rs232_devices, nullptr)
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("keybc", AT_KEYBOARD_CONTROLLER, XTAL_12MHz)
MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_CLOCK_CB(DEVWRITELINE("pc_kbdc", pc_kbdc_device, clock_write_from_mb))
MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_DATA_CB(DEVWRITELINE("pc_kbdc", pc_kbdc_device, data_write_from_mb))
MCFG_AT_KEYBOARD_CONTROLLER_INPUT_BUFFER_FULL_CB(WRITELINE(tv990_state, keybc_irq))
MCFG_DEVICE_ADD("pc_kbdc", PC_KBDC, 0)
MCFG_PC_KBDC_OUT_CLOCK_CB(DEVWRITELINE("keybc", at_keyboard_controller_device, keyboard_clock_w))
MCFG_PC_KBDC_OUT_DATA_CB(DEVWRITELINE("keybc", at_keyboard_controller_device, keyboard_data_w))
MCFG_PC_KBDC_SLOT_ADD("pc_kbdc", "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)
MACHINE_CONFIG_END
/* ROM definition */
ROM_START( tv990 )
ROM_REGION( 0x20000, "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_END
/* Driver */
COMP( 1992, tv990, 0, 0, tv990, tv990, driver_device, 0, "TeleVideo", "TeleVideo 990", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)

View File

@ -35722,6 +35722,9 @@ tutor // 1983? Tomy Tutor
@source:tv950.cpp
tv950 //
@source:tv990.cpp
tv990 // 1992? Televideo
@source:tvc.cpp
tvc64 //
tvc64p //

View File

@ -618,6 +618,7 @@ ts816.cpp
tsispch.cpp
tutor.cpp
tv950.cpp
tv990.cpp
tvc.cpp
tvgame.cpp
tx0.cpp