diff options
Diffstat (limited to 'src/devices/bus/wangpc/tig.c')
-rw-r--r-- | src/devices/bus/wangpc/tig.c | 324 |
1 files changed, 324 insertions, 0 deletions
diff --git a/src/devices/bus/wangpc/tig.c b/src/devices/bus/wangpc/tig.c new file mode 100644 index 00000000000..a2b7214c054 --- /dev/null +++ b/src/devices/bus/wangpc/tig.c @@ -0,0 +1,324 @@ +// license:BSD-3-Clause +// copyright-holders:Curt Coder +/********************************************************************** + + Wang PC Text/Image/Graphics controller emulation + +**********************************************************************/ + +/* + + TODO: + + - all + +*/ + +#include "tig.h" + + + +//************************************************************************** +// MACROS/CONSTANTS +//************************************************************************** + +#define LOG 1 + +#define OPTION_ID_0 0x13 +#define OPTION_ID_1 0x17 + +#define UPD7720_0_TAG "upd7220_0" +#define UPD7720_1_TAG "upd7220_1" +#define SCREEN_TAG "screen" + +#define DMA_GRAPHICS BIT(m_option, 0) +#define DMA_DREQ1 BIT(m_option, 1) +#define DMA_DREQ2 BIT(m_option, 2) +#define DMA_DREQ3 BIT(m_option, 3) +#define DMA_ID BIT(m_option, 4) + +#define ATTR_ALT_FONT BIT(data, 8) +#define ATTR_UNDERSCORE BIT(data, 9) +#define ATTR_BLINK BIT(data, 10) +#define ATTR_REVERSE BIT(data, 11) +#define ATTR_BLANK BIT(data, 12) +#define ATTR_BOLD BIT(data, 13) +#define ATTR_SUBSCRIPT BIT(data, 14) +#define ATTR_SUPERSCRIPT BIT(data, 15) + + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type WANGPC_TIG = &device_creator<wangpc_tig_device>; + + +//------------------------------------------------- +// ROM( wangpc_tig ) +//------------------------------------------------- + +ROM_START( wangpc_tig ) + ROM_REGION( 0x100, "plds", 0 ) + ROM_LOAD( "377-3072.l26", 0x000, 0x100, NO_DUMP ) // PAL10L8 + ROM_LOAD( "377-3073.l16", 0x000, 0x100, NO_DUMP ) // PAL10L8 +ROM_END + + +//------------------------------------------------- +// rom_region - device-specific ROM region +//------------------------------------------------- + +const rom_entry *wangpc_tig_device::device_rom_region() const +{ + return ROM_NAME( wangpc_tig ); +} + + +//------------------------------------------------- +// UPD7220_INTERFACE( hgdc0_intf ) +//------------------------------------------------- + +static ADDRESS_MAP_START( upd7220_0_map, AS_0, 16, wangpc_tig_device ) + ADDRESS_MAP_GLOBAL_MASK(0x7fff) + AM_RANGE(0x0000, 0x0fff) AM_MIRROR(0x1000) AM_RAM // frame buffer + AM_RANGE(0x4000, 0x7fff) AM_RAM // font memory +ADDRESS_MAP_END + +UPD7220_DRAW_TEXT_LINE_MEMBER( wangpc_tig_device::hgdc_draw_text ) +{ +} + + +//------------------------------------------------- +// UPD7220_INTERFACE( hgdc1_intf ) +//------------------------------------------------- + +static ADDRESS_MAP_START( upd7220_1_map, AS_0, 16, wangpc_tig_device ) + ADDRESS_MAP_GLOBAL_MASK(0xffff) + AM_RANGE(0x0000, 0xffff) AM_RAM // graphics memory +ADDRESS_MAP_END + +UPD7220_DISPLAY_PIXELS_MEMBER( wangpc_tig_device::hgdc_display_pixels ) +{ +} + + +//------------------------------------------------- +// MACHINE_CONFIG_FRAGMENT( wangpc_tig ) +//------------------------------------------------- + +static MACHINE_CONFIG_FRAGMENT( wangpc_tig ) + MCFG_SCREEN_ADD(SCREEN_TAG, RASTER) + MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, wangpc_tig_device, screen_update) + MCFG_SCREEN_SIZE(80*10, 25*12) + MCFG_SCREEN_VISIBLE_AREA(0, 80*10-1, 0, 25*12-1) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) + MCFG_SCREEN_REFRESH_RATE(60) + + MCFG_PALETTE_ADD_MONOCHROME_GREEN_HIGHLIGHT("palette") + + MCFG_DEVICE_ADD(UPD7720_0_TAG, UPD7220, XTAL_52_832MHz/28) + MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_0_map) + MCFG_UPD7220_DRAW_TEXT_CALLBACK_OWNER(wangpc_tig_device, hgdc_draw_text) + MCFG_VIDEO_SET_SCREEN(SCREEN_TAG) + + MCFG_DEVICE_ADD(UPD7720_1_TAG, UPD7220, XTAL_52_832MHz/28) + MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_1_map) + MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(wangpc_tig_device, hgdc_display_pixels) + MCFG_VIDEO_SET_SCREEN(SCREEN_TAG) +MACHINE_CONFIG_END + + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +machine_config_constructor wangpc_tig_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( wangpc_tig ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// wangpc_tig_device - constructor +//------------------------------------------------- + +wangpc_tig_device::wangpc_tig_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, WANGPC_TIG, "Wang PC TIG Controller", tag, owner, clock, "wangpc_tig", __FILE__), + device_wangpcbus_card_interface(mconfig, *this), + m_hgdc0(*this, UPD7720_0_TAG), + m_hgdc1(*this, UPD7720_1_TAG), + m_option(0), + m_palette(*this, "palette") +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void wangpc_tig_device::device_start() +{ + // state saving + save_item(NAME(m_option)); + save_item(NAME(m_attr)); + save_item(NAME(m_underline)); +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void wangpc_tig_device::device_reset() +{ + m_option = 0; +} + + +//------------------------------------------------- +// screen_update - +//------------------------------------------------- + +UINT32 wangpc_tig_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + m_hgdc0->screen_update(screen, bitmap, cliprect); + m_hgdc1->screen_update(screen, bitmap, cliprect); + + return 0; +} + + +//------------------------------------------------- +// wangpcbus_iorc_r - I/O read +//------------------------------------------------- + +UINT16 wangpc_tig_device::wangpcbus_iorc_r(address_space &space, offs_t offset, UINT16 mem_mask) +{ + UINT16 data = 0xffff; + + if (sad(offset)) + { + switch (offset & 0x7f) + { + case 0x20/2: + case 0x22/2: + data = m_hgdc0->read(space, offset); + break; + + case 0x24/2: + case 0x26/2: + data = m_hgdc1->read(space, offset); + break; + + case 0xfe/2: + data = 0xff00 | (DMA_ID ? OPTION_ID_1 : OPTION_ID_0); + break; + } + } + + return data; +} + + +//------------------------------------------------- +// wangpcbus_aiowc_w - I/O write +//------------------------------------------------- + +void wangpc_tig_device::wangpcbus_aiowc_w(address_space &space, offs_t offset, UINT16 mem_mask, UINT16 data) +{ + if (sad(offset) && ACCESSING_BITS_0_7) + { + switch (offset & 0x7f) + { + case 0x00/2: case 0x02/2: case 0x04/2: case 0x06/2: case 0x08/2: case 0x0a/2: case 0x0c/2: case 0x0e/2: + case 0x10/2: case 0x12/2: case 0x14/2: case 0x16/2: case 0x18/2: case 0x1a/2: case 0x1c/2: case 0x1e/2: + if (LOG) logerror("TIG attribute %u: %02x\n", offset, data & 0xff); + + m_attr[offset] = data & 0xff; + break; + + case 0x20/2: + case 0x22/2: + m_hgdc0->write(space, offset, data); + break; + + case 0x24/2: + case 0x26/2: + m_hgdc1->write(space, offset, data); + break; + + case 0x28/2: + if (LOG) logerror("TIG underline %02x\n", data & 0xff); + + m_underline = data & 0xff; + break; + + case 0x2a/2: + if (LOG) logerror("TIG option %02x\n", data & 0xff); + + m_option = data & 0xff; + break; + + case 0xfc/2: + device_reset(); + break; + } + } +} + + +//------------------------------------------------- +// wangpcbus_dack_r - DMA read +//------------------------------------------------- + +UINT8 wangpc_tig_device::wangpcbus_dack_r(address_space &space, int line) +{ + UINT8 data = 0; + + if (DMA_GRAPHICS) + { + data = m_hgdc1->dack_r(space, 0); + } + else + { + data = m_hgdc0->dack_r(space, 0); + } + + return data; +} + + +//------------------------------------------------- +// wangpcbus_dack_w - DMA write +//------------------------------------------------- + +void wangpc_tig_device::wangpcbus_dack_w(address_space &space, int line, UINT8 data) +{ + if (DMA_GRAPHICS) + { + m_hgdc1->dack_w(space, 0, data); + } + else + { + m_hgdc0->dack_w(space, 0, data); + } +} + + +//------------------------------------------------- +// wangpcbus_have_dack - DMA acknowledge +//------------------------------------------------- + +bool wangpc_tig_device::wangpcbus_have_dack(int line) +{ + return (line == 1 && DMA_DREQ1) || (line == 2 && DMA_DREQ2) || (line == 3 && DMA_DREQ3); +} |