307 lines
8.8 KiB
C
307 lines
8.8 KiB
C
// license:BSD-3-Clause
|
|
// copyright-holders:Curt Coder
|
|
/**********************************************************************
|
|
|
|
Wang PC-PM040-B Remote Telecommunication controller emulation
|
|
|
|
Copyright MESS Team.
|
|
Visit http://mamedev.org for licensing and usage restrictions.
|
|
|
|
**********************************************************************/
|
|
|
|
#include "rtc.h"
|
|
|
|
|
|
|
|
//**************************************************************************
|
|
// MACROS/CONSTANTS
|
|
//**************************************************************************
|
|
|
|
#define OPTION_ID 0x1c
|
|
|
|
#define Z80_TAG "z80"
|
|
#define AM9517A_TAG "am9517"
|
|
#define Z80CTC_0_TAG "z80ctc_0"
|
|
#define Z80CTC_1_TAG "z80ctc_1"
|
|
#define Z80SIO_TAG "z80sio"
|
|
|
|
|
|
|
|
//**************************************************************************
|
|
// DEVICE DEFINITIONS
|
|
//**************************************************************************
|
|
|
|
const device_type WANGPC_RTC = &device_creator<wangpc_rtc_device>;
|
|
|
|
|
|
//-------------------------------------------------
|
|
// ROM( wangpc_rtc )
|
|
//-------------------------------------------------
|
|
|
|
ROM_START( wangpc_rtc )
|
|
ROM_REGION( 0x1000, Z80_TAG, 0 )
|
|
ROM_LOAD( "remotecomms-l28.bin", 0x0000, 0x1000, CRC(c05a1bee) SHA1(6b3f0d787d014b1fd3925812c905ddb63c5055f1) )
|
|
ROM_END
|
|
|
|
|
|
//-------------------------------------------------
|
|
// rom_region - device-specific ROM region
|
|
//-------------------------------------------------
|
|
|
|
const rom_entry *wangpc_rtc_device::device_rom_region() const
|
|
{
|
|
return ROM_NAME( wangpc_rtc );
|
|
}
|
|
|
|
|
|
//-------------------------------------------------
|
|
// ADDRESS_MAP( wangpc_rtc_mem )
|
|
//-------------------------------------------------
|
|
|
|
static ADDRESS_MAP_START( wangpc_rtc_mem, AS_PROGRAM, 8, wangpc_rtc_device )
|
|
AM_RANGE(0x0000, 0x0fff) AM_ROM AM_REGION(Z80_TAG, 0)
|
|
AM_RANGE(0x1000, 0xffff) AM_RAM
|
|
ADDRESS_MAP_END
|
|
|
|
|
|
//-------------------------------------------------
|
|
// ADDRESS_MAP( wangpc_rtc_io )
|
|
//-------------------------------------------------
|
|
|
|
static ADDRESS_MAP_START( wangpc_rtc_io, AS_IO, 8, wangpc_rtc_device )
|
|
ADDRESS_MAP_GLOBAL_MASK(0xff)
|
|
AM_RANGE(0x00, 0x03) AM_DEVREADWRITE(Z80SIO_TAG, z80sio0_device, cd_ba_r, cd_ba_w)
|
|
AM_RANGE(0x10, 0x1f) AM_DEVREADWRITE(AM9517A_TAG, am9517a_device, read, write)
|
|
AM_RANGE(0x20, 0x23) AM_DEVREADWRITE(Z80CTC_0_TAG, z80ctc_device, read, write)
|
|
AM_RANGE(0x30, 0x30) //AM_WRITE(clear_char_w)
|
|
AM_RANGE(0x31, 0x31) //AM_WRITE(set_char_w)
|
|
AM_RANGE(0x40, 0x40) AM_READ_PORT("SW1") //AM_WRITE(control_w)
|
|
AM_RANGE(0x44, 0x44) //AM_READ(i8086_status_r) AM_WRITE(reset_w)
|
|
AM_RANGE(0x48, 0x48) //AM_WRITE(dte_ready_w)
|
|
AM_RANGE(0x4c, 0x4c) //AM_READWRITE(8232_acu_r, 8232_acu_w)
|
|
AM_RANGE(0x50, 0x50) //AM_READ(outbound_data_r)
|
|
AM_RANGE(0x51, 0x52) //AM_WRITE(status_w)
|
|
AM_RANGE(0x54, 0x54) //AM_WRITE(enable_inbound_data_w)
|
|
AM_RANGE(0x51, 0x52) //AM_WRITE(inbound_data_w)
|
|
AM_RANGE(0x60, 0x63) AM_DEVREADWRITE(Z80CTC_1_TAG, z80ctc_device, read, write)
|
|
AM_RANGE(0x70, 0x70) //AM_READWRITE(led_toggle_r, odd_parity_w)
|
|
AM_RANGE(0x71, 0x71) //AM_WRITE(even_parity_w)
|
|
ADDRESS_MAP_END
|
|
|
|
|
|
//-------------------------------------------------
|
|
// z80_daisy_config wangpc_rtc_daisy_chain
|
|
//-------------------------------------------------
|
|
|
|
static const z80_daisy_config wangpc_rtc_daisy_chain[] =
|
|
{
|
|
{ Z80SIO_TAG },
|
|
{ Z80CTC_0_TAG },
|
|
{ Z80CTC_1_TAG },
|
|
{ NULL }
|
|
};
|
|
|
|
|
|
//-------------------------------------------------
|
|
// I8237_INTERFACE( dmac_intf )
|
|
//-------------------------------------------------
|
|
|
|
static I8237_INTERFACE( dmac_intf )
|
|
{
|
|
DEVCB_NULL,
|
|
DEVCB_NULL,
|
|
DEVCB_NULL,
|
|
DEVCB_NULL,
|
|
{ DEVCB_NULL,
|
|
DEVCB_NULL,
|
|
DEVCB_NULL,
|
|
DEVCB_NULL, },
|
|
{ DEVCB_NULL,
|
|
DEVCB_NULL,
|
|
DEVCB_NULL,
|
|
DEVCB_NULL, },
|
|
{ DEVCB_NULL,
|
|
DEVCB_NULL,
|
|
DEVCB_NULL,
|
|
DEVCB_NULL }
|
|
};
|
|
|
|
//-------------------------------------------------
|
|
// MACHINE_CONFIG_FRAGMENT( wangpc_rtc )
|
|
//-------------------------------------------------
|
|
|
|
static MACHINE_CONFIG_FRAGMENT( wangpc_rtc )
|
|
MCFG_CPU_ADD(Z80_TAG, Z80, 2000000)
|
|
MCFG_CPU_CONFIG(wangpc_rtc_daisy_chain)
|
|
MCFG_CPU_PROGRAM_MAP(wangpc_rtc_mem)
|
|
MCFG_CPU_IO_MAP(wangpc_rtc_io)
|
|
|
|
MCFG_I8237_ADD(AM9517A_TAG, 2000000, dmac_intf)
|
|
|
|
MCFG_DEVICE_ADD(Z80CTC_0_TAG, Z80CTC, 2000000)
|
|
MCFG_Z80CTC_INTR_CB(INPUTLINE(Z80_TAG, INPUT_LINE_IRQ0))
|
|
|
|
MCFG_DEVICE_ADD(Z80CTC_1_TAG, Z80CTC, 2000000)
|
|
MCFG_Z80CTC_INTR_CB(INPUTLINE(Z80_TAG, INPUT_LINE_IRQ0))
|
|
|
|
MCFG_Z80SIO0_ADD(Z80SIO_TAG, 2000000, 0, 0, 0, 0)
|
|
MCFG_Z80DART_OUT_INT_CB(INPUTLINE(Z80_TAG, INPUT_LINE_IRQ0))
|
|
MACHINE_CONFIG_END
|
|
|
|
|
|
//-------------------------------------------------
|
|
// machine_config_additions - device-specific
|
|
// machine configurations
|
|
//-------------------------------------------------
|
|
|
|
machine_config_constructor wangpc_rtc_device::device_mconfig_additions() const
|
|
{
|
|
return MACHINE_CONFIG_NAME( wangpc_rtc );
|
|
}
|
|
|
|
|
|
//-------------------------------------------------
|
|
// INPUT_PORTS( wangpc_rtc )
|
|
//-------------------------------------------------
|
|
|
|
INPUT_PORTS_START( wangpc_rtc )
|
|
PORT_START("SW1")
|
|
PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:1")
|
|
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
|
|
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
|
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2")
|
|
PORT_DIPSETTING( 0x02, DEF_STR( On ) )
|
|
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
|
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3")
|
|
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
|
|
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
|
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:4")
|
|
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
|
|
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
|
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:5")
|
|
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
|
|
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
|
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:6")
|
|
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
|
|
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
|
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:7")
|
|
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
|
|
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
|
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:8")
|
|
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
|
|
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
|
INPUT_PORTS_END
|
|
|
|
|
|
//-------------------------------------------------
|
|
// input_ports - device-specific input ports
|
|
//-------------------------------------------------
|
|
|
|
ioport_constructor wangpc_rtc_device::device_input_ports() const
|
|
{
|
|
return INPUT_PORTS_NAME( wangpc_rtc );
|
|
}
|
|
|
|
|
|
|
|
|
|
//**************************************************************************
|
|
// LIVE DEVICE
|
|
//**************************************************************************
|
|
|
|
//-------------------------------------------------
|
|
// wangpc_rtc_device - constructor
|
|
//-------------------------------------------------
|
|
|
|
wangpc_rtc_device::wangpc_rtc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
|
|
device_t(mconfig, WANGPC_RTC, "Wang PC-PM040-B", tag, owner, clock, "wangpc_rtc", __FILE__),
|
|
device_wangpcbus_card_interface(mconfig, *this),
|
|
m_maincpu(*this, Z80_TAG),
|
|
m_dmac(*this, AM9517A_TAG),
|
|
m_ctc0(*this, Z80CTC_0_TAG),
|
|
m_ctc1(*this, Z80CTC_1_TAG),
|
|
m_sio(*this, Z80SIO_TAG),
|
|
m_char_ram(*this, "char_ram")
|
|
{
|
|
}
|
|
|
|
|
|
//-------------------------------------------------
|
|
// device_start - device-specific startup
|
|
//-------------------------------------------------
|
|
|
|
void wangpc_rtc_device::device_start()
|
|
{
|
|
m_char_ram.allocate(0x100);
|
|
}
|
|
|
|
|
|
//-------------------------------------------------
|
|
// device_reset - device-specific reset
|
|
//-------------------------------------------------
|
|
|
|
void wangpc_rtc_device::device_reset()
|
|
{
|
|
}
|
|
|
|
|
|
//-------------------------------------------------
|
|
// wangpcbus_mrdc_r - memory read
|
|
//-------------------------------------------------
|
|
|
|
UINT16 wangpc_rtc_device::wangpcbus_mrdc_r(address_space &space, offs_t offset, UINT16 mem_mask)
|
|
{
|
|
UINT16 data = 0xffff;
|
|
|
|
return data;
|
|
}
|
|
|
|
|
|
//-------------------------------------------------
|
|
// wangpcbus_amwc_w - memory write
|
|
//-------------------------------------------------
|
|
|
|
void wangpc_rtc_device::wangpcbus_amwc_w(address_space &space, offs_t offset, UINT16 mem_mask, UINT16 data)
|
|
{
|
|
}
|
|
|
|
|
|
//-------------------------------------------------
|
|
// wangpcbus_iorc_r - I/O read
|
|
//-------------------------------------------------
|
|
|
|
UINT16 wangpc_rtc_device::wangpcbus_iorc_r(address_space &space, offs_t offset, UINT16 mem_mask)
|
|
{
|
|
UINT16 data = 0xffff;
|
|
|
|
if (sad(offset))
|
|
{
|
|
switch (offset & 0x7f)
|
|
{
|
|
case 0xfe/2:
|
|
data = 0xff00 | OPTION_ID;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return data;
|
|
}
|
|
|
|
|
|
//-------------------------------------------------
|
|
// wangpcbus_aiowc_w - I/O write
|
|
//-------------------------------------------------
|
|
|
|
void wangpc_rtc_device::wangpcbus_aiowc_w(address_space &space, offs_t offset, UINT16 mem_mask, UINT16 data)
|
|
{
|
|
if (sad(offset))
|
|
{
|
|
switch (offset & 0x7f)
|
|
{
|
|
case 0xfc/2:
|
|
device_reset();
|
|
break;
|
|
}
|
|
}
|
|
}
|