// license:BSD-3-Clause
// copyright-holders:Curt Coder
/**********************************************************************
Intel 80130 iRMX Operating System Processor emulation
**********************************************************************/
#include "emu.h"
#include "i80130.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
// device type definition
DEFINE_DEVICE_TYPE(I80130, i80130_device, "i80130", "I80130")
void i80130_device::rom_map(address_map &map)
{
//AM_RANGE(0x0000, 0x3fff) AM_ROM AM_REGION("rom", 0)
}
void i80130_device::io_map(address_map &map)
{
map(0x00, 0x0f).rw(FUNC(i80130_device::io_r), FUNC(i80130_device::io_w));
//AM_RANGE(0x00, 0x01) AM_MIRROR(0x2) AM_DEVREADWRITE8("pic", pic8259_device, read, write, 0x00ff)
//AM_RANGE(0x08, 0x0f) AM_DEVREADWRITE8("pit", pit8254_device, read, write, 0x00ff)
}
READ16_MEMBER( i80130_device::io_r )
{
uint16_t data = 0;
switch (offset)
{
case 0: case 1:
if (ACCESSING_BITS_0_7)
{
data = m_pic->read(space, offset & 0x01);
}
break;
case 4: case 5: case 6: case 7:
if (ACCESSING_BITS_0_7)
{
data = m_pit->read(space, offset & 0x03);
}
break;
}
return data;
}
WRITE16_MEMBER( i80130_device::io_w )
{
switch (offset)
{
case 0: case 1:
if (ACCESSING_BITS_0_7)
{
m_pic->write(space, offset & 0x01, data & 0xff);
}
break;
case 4: case 5: case 6: case 7:
if (ACCESSING_BITS_0_7)
{
m_pit->write(space, offset & 0x03, data & 0xff);
}
break;
}
}
//-------------------------------------------------
// ROM( i80130 )
//-------------------------------------------------
ROM_START( i80130 )
ROM_REGION16_LE( 0x4000, "rom", 0 )
ROM_LOAD( "80130", 0x0000, 0x4000, NO_DUMP )
ROM_END
//-------------------------------------------------
// rom_region - device-specific ROM region
//-------------------------------------------------
const tiny_rom_entry *i80130_device::device_rom_region() const
{
return ROM_NAME( i80130 );
}
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
MACHINE_CONFIG_START(i80130_device::device_add_mconfig)
MCFG_DEVICE_ADD("pic", PIC8259, 0)
MCFG_PIC8259_OUT_INT_CB(WRITELINE(*this, i80130_device, irq_w))
MCFG_DEVICE_ADD("pit", PIT8254, 0)
MCFG_PIT8253_CLK0(0)
MCFG_PIT8253_OUT0_HANDLER(WRITELINE(*this, i80130_device, systick_w))
MCFG_PIT8253_CLK1(0)
MCFG_PIT8253_OUT1_HANDLER(WRITELINE(*this, i80130_device, delay_w))
MCFG_PIT8253_CLK2(0)
MCFG_PIT8253_OUT2_HANDLER(WRITELINE(*this, i80130_device, baud_w))
MACHINE_CONFIG_END
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// i80130_device - constructor
//-------------------------------------------------
i80130_device::i80130_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, I80130, tag, owner, clock),
m_pic(*this, "pic"),
m_pit(*this, "pit"),
m_write_irq(*this),
m_write_ack(*this),
m_write_lir(*this),
m_write_systick(*this),
m_write_delay(*this),
m_write_baud(*this)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void i80130_device::device_start()
{
// resolve callbacks
m_write_irq.resolve_safe();
m_write_ack.resolve_safe();
m_write_lir.resolve_safe();
m_write_systick.resolve_safe();
m_write_delay.resolve_safe();
m_write_baud.resolve_safe();
}
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
void i80130_device::device_reset()
{
// set PIT clocks
m_pit->set_clockin(0, clock());
m_pit->set_clockin(1, clock());
m_pit->set_clockin(2, clock());
}