altos8600: add serial board [Carl]

This commit is contained in:
cracyc 2017-09-22 21:44:51 -05:00
parent 7b87813ea9
commit c960aa5cd3
5 changed files with 255 additions and 8 deletions

View File

@ -1392,6 +1392,7 @@ files {
MAME_DIR .. "src/mame/drivers/altos5.cpp",
MAME_DIR .. "src/mame/drivers/altos486.cpp",
MAME_DIR .. "src/mame/drivers/altos8600.cpp",
MAME_DIR .. "src/mame/machine/acs8600_ics.cpp",
}
createMESSProjects(_target, _subtarget, "ami")

View File

@ -10,6 +10,7 @@
#include "machine/i8255.h"
#include "machine/z80sio.h"
#include "machine/wd_fdc.h"
#include "machine/acs8600_ics.h"
#include "bus/rs232/rs232.h"
class altos8600_state : public driver_device
@ -25,6 +26,7 @@ public:
m_uart8274(*this, "uart8274"),
m_fdc(*this, "fd1797"),
m_ram(*this, RAM_TAG),
m_ics(*this, "ics"),
m_bios(*this, "bios")
{}
DECLARE_READ16_MEMBER(cpuram_r);
@ -55,8 +57,8 @@ public:
DECLARE_WRITE8_MEMBER(romport_w);
DECLARE_WRITE16_MEMBER(mode_w);
DECLARE_WRITE_LINE_MEMBER(cpuif_w);
DECLARE_WRITE_LINE_MEMBER(tmr0_w);
DECLARE_WRITE_LINE_MEMBER(fddrq_w);
DECLARE_WRITE8_MEMBER(ics_attn_w);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
@ -73,6 +75,7 @@ private:
required_device<i8274_new_device> m_uart8274;
required_device<fd1797_device> m_fdc;
required_device<ram_device> m_ram;
required_device<acs8600_ics_device> m_ics;
required_memory_region m_bios;
u8 m_mmuaddr[256], m_romport[4], m_dmamplex;
u16 m_mmuflags[256], m_mmuerr, m_mode, m_mmueaddr[2];
@ -93,12 +96,6 @@ void altos8600_state::machine_reset()
m_nmistat = false;
}
WRITE_LINE_MEMBER(altos8600_state::tmr0_w)
{
m_uart8274->rxca_w(state);
m_uart8274->txca_w(state);
}
WRITE_LINE_MEMBER(altos8600_state::cpuif_w)
{
if(m_user)
@ -218,6 +215,15 @@ WRITE8_MEMBER(altos8600_state::romport_w)
}
}
WRITE8_MEMBER(altos8600_state::ics_attn_w)
{
if(!offset)
{
m_ics->attn_w(ASSERT_LINE);
m_ics->attn_w(CLEAR_LINE);
}
}
WRITE16_MEMBER(altos8600_state::mode_w)
{
m_mode = data;
@ -420,6 +426,7 @@ static ADDRESS_MAP_START(dmac_io, AS_IO, 16, altos8600_state)
AM_RANGE(0x0060, 0x0067) AM_DEVREADWRITE8("pic8259_2", pic8259_device, read, write, 0x00ff)
AM_RANGE(0x0068, 0x006f) AM_DEVREADWRITE8("pic8259_3", pic8259_device, read, write, 0x00ff)
AM_RANGE(0x0070, 0x0077) AM_NOP
AM_RANGE(0x0078, 0x0079) AM_WRITE8(ics_attn_w, 0xffff)
AM_RANGE(0x0200, 0x03ff) AM_READWRITE(mmuflags_r, mmuflags_w)
AM_RANGE(0x0400, 0x05ff) AM_READWRITE(mmuaddr_r, mmuaddr_w)
AM_RANGE(0x0000, 0xffff) AM_READWRITE(nmi_r, nmi_w)
@ -497,7 +504,8 @@ static MACHINE_CONFIG_START(altos8600)
MCFG_DEVICE_ADD("pit", PIT8253, 0)
MCFG_PIT8253_CLK0(1228800)
MCFG_PIT8253_OUT0_HANDLER(WRITELINE(altos8600_state, tmr0_w))
MCFG_PIT8253_OUT1_HANDLER(DEVWRITELINE("uart8274", i8274_new_device, rxca_w))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("uart8274", i8274_new_device, txca_w))
MCFG_PIT8253_CLK1(1228800)
MCFG_PIT8253_OUT1_HANDLER(DEVWRITELINE("uart8274", i8274_new_device, rxtxcb_w))
MCFG_PIT8253_CLK2(1228800)
@ -510,6 +518,11 @@ static MACHINE_CONFIG_START(altos8600)
MCFG_FLOPPY_DRIVE_ADD("fd1797:1", altos8600_floppies, "8dd", floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("fd1797:2", altos8600_floppies, "8dd", floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("fd1797:3", altos8600_floppies, "8dd", floppy_image_device::default_floppy_formats)
MCFG_DEVICE_ADD("ics", ACS8600_ICS, 0)
MCFG_ACS8600_ICS_MAINCPU(":maincpu")
MCFG_ACS8600_ICS_IRQ1(DEVWRITELINE("pic8259_1", pic8259_device, ir5_w))
MCFG_ACS8600_ICS_IRQ2(DEVWRITELINE("pic8259_1", pic8259_device, ir6_w))
MACHINE_CONFIG_END
ROM_START(altos8600)

View File

@ -353,6 +353,8 @@ static MACHINE_CONFIG_DERIVED( neat, atvga )
MCFG_CPU_IO_MAP(neat_io)
MCFG_DEVICE_REMOVE("mb:rtc") // TODO: move this into the cs8221
MCFG_DS12885_ADD("mb:rtc")
MCFG_MC146818_IRQ_HANDLER(DEVWRITELINE("pic8259_slave", pic8259_device, ir0_w)) // this is in :mb
MCFG_MC146818_CENTURY_INDEX(0x32)
MCFG_CS8221_ADD("cs8221", "maincpu", "mb:isa", "bios")
MACHINE_CONFIG_END

View File

@ -0,0 +1,181 @@
// license:BSD-3-Clause
// copyright-holders:Carl
// TODO: multibus
#include "emu.h"
#include "machine/acs8600_ics.h"
#include "cpu/z80/z80.h"
#include "machine/z80sio.h"
#include "machine/am9513.h"
#include "bus/rs232/rs232.h"
DEFINE_DEVICE_TYPE(ACS8600_ICS, acs8600_ics_device, "acs8600_ics", "Altos ACS8600 Intelligent Serial Concentrator")
acs8600_ics_device::acs8600_ics_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, ACS8600_ICS, tag, owner, clock),
m_icscpu(*this, "icscpu"),
m_out_irq1_func(*this),
m_out_irq2_func(*this)
{
}
ROM_START(acs8600_ics)
ROM_REGION(0x1000, "icscpu", 0)
ROM_LOAD("162-13914-001.bin", 0x0000, 0x1000, CRC(ab41768a) SHA1(aee04574dea4c17112431536d3b7e3984b8afdc2))
ROM_END
const tiny_rom_entry *acs8600_ics_device::device_rom_region() const
{
return ROM_NAME(acs8600_ics);
}
WRITE8_MEMBER(acs8600_ics_device::hiaddr_w)
{
m_hiaddr = data;
}
WRITE8_MEMBER(acs8600_ics_device::ctrl_w)
{
m_ctrl = data;
m_out_irq1_func(BIT(data, 1) ? ASSERT_LINE : CLEAR_LINE);
}
READ8_MEMBER(acs8600_ics_device::hostram_r)
{
return m_maincpu_mem->read_byte((m_hiaddr << 16) | (BIT(m_ctrl, 0) << 15) | (offset & 0x7fff));
}
WRITE8_MEMBER(acs8600_ics_device::hostram_w)
{
m_maincpu_mem->write_byte((m_hiaddr << 16) | (BIT(m_ctrl, 0) << 15) | (offset & 0x7fff), data);
}
WRITE_LINE_MEMBER(acs8600_ics_device::attn_w)
{
m_icscpu->set_input_line(INPUT_LINE_NMI, state);
}
static ADDRESS_MAP_START(ics_mem, AS_PROGRAM, 8, acs8600_ics_device)
AM_RANGE(0x0000, 0x0fff) AM_ROM AM_REGION("icscpu", 0)
AM_RANGE(0x1000, 0x17ff) AM_RAM
AM_RANGE(0x8000, 0xffff) AM_READWRITE(hostram_r, hostram_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START(ics_io, AS_PROGRAM, 8, acs8600_ics_device)
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x00, 0x03) AM_DEVREADWRITE("sio1", z80sio_device, ba_cd_r, ba_cd_w)
AM_RANGE(0x04, 0x07) AM_DEVREADWRITE("sio2", z80sio_device, ba_cd_r, ba_cd_w)
AM_RANGE(0x08, 0x0b) AM_DEVREADWRITE("sio3", z80sio_device, ba_cd_r, ba_cd_w)
AM_RANGE(0x0c, 0x0f) AM_DEVREADWRITE("sio4", z80sio_device, ba_cd_r, ba_cd_w)
AM_RANGE(0x10, 0x11) AM_DEVREADWRITE("stc1", am9513_device, read8, write8)
AM_RANGE(0x14, 0x15) AM_DEVREADWRITE("stc2", am9513_device, read8, write8)
AM_RANGE(0x18, 0x18) AM_WRITE(ctrl_w)
AM_RANGE(0x1c, 0x1c) AM_WRITE(hiaddr_w)
ADDRESS_MAP_END
static const z80_daisy_config ics_daisy_chain[] =
{
"sio1",
"sio2",
"sio3",
"sio4",
nullptr
};
MACHINE_CONFIG_MEMBER( acs8600_ics_device::device_add_mconfig )
MCFG_CPU_ADD("icscpu", Z80, 4000000)
MCFG_CPU_PROGRAM_MAP(ics_mem)
MCFG_CPU_IO_MAP(ics_io)
MCFG_Z80_DAISY_CHAIN(ics_daisy_chain)
MCFG_DEVICE_ADD("stc1", AM9513, XTAL_18_432MHz)
MCFG_AM9513_OUT1_CALLBACK(DEVWRITELINE("sio1", z80sio_device, rxca_w))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("sio1", z80sio_device, txca_w))
MCFG_AM9513_OUT2_CALLBACK(DEVWRITELINE("sio1", z80sio_device, rxtxcb_w))
MCFG_AM9513_OUT3_CALLBACK(DEVWRITELINE("sio2", z80sio_device, rxca_w))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("sio2", z80sio_device, txca_w))
MCFG_AM9513_OUT4_CALLBACK(DEVWRITELINE("sio2", z80sio_device, rxtxcb_w))
MCFG_AM9513_OUT5_CALLBACK(DEVWRITELINE("sio3", z80sio_device, rxca_w))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("sio3", z80sio_device, txca_w))
MCFG_DEVICE_ADD("stc2", AM9513, XTAL_18_432MHz)
MCFG_AM9513_OUT2_CALLBACK(DEVWRITELINE("sio3", z80sio_device, rxtxcb_w))
MCFG_AM9513_OUT3_CALLBACK(DEVWRITELINE("sio4", z80sio_device, rxca_w))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("sio4", z80sio_device, txca_w))
MCFG_Z80SIO_ADD("sio1", XTAL_16MHz/4, 0, 0, 0, 0)
MCFG_Z80SIO_OUT_TXDA_CB(DEVWRITELINE("rs2321a", rs232_port_device, write_txd))
MCFG_Z80SIO_OUT_DTRA_CB(DEVWRITELINE("rs2321a", rs232_port_device, write_dtr))
MCFG_Z80SIO_OUT_RTSA_CB(DEVWRITELINE("rs2321a", rs232_port_device, write_rts))
MCFG_Z80SIO_OUT_TXDB_CB(DEVWRITELINE("rs2321b", rs232_port_device, write_txd))
MCFG_Z80SIO_OUT_DTRB_CB(DEVWRITELINE("rs2321b", rs232_port_device, write_dtr))
MCFG_Z80SIO_OUT_RTSB_CB(DEVWRITELINE("rs2321b", rs232_port_device, write_rts))
MCFG_RS232_PORT_ADD("rs2321a", default_rs232_devices, nullptr)
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("sio1", z80sio_device, rxa_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("sio1", z80sio_device, dcda_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("sio1", z80sio_device, ctsa_w))
MCFG_RS232_PORT_ADD("rs2321b", default_rs232_devices, nullptr)
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("sio1", z80sio_device, rxb_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("sio1", z80sio_device, dcdb_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("sio1", z80sio_device, ctsb_w))
MCFG_Z80SIO_ADD("sio2", XTAL_16MHz/4, 0, 0, 0, 0)
MCFG_Z80SIO_OUT_TXDA_CB(DEVWRITELINE("rs2322a", rs232_port_device, write_txd))
MCFG_Z80SIO_OUT_DTRA_CB(DEVWRITELINE("rs2322a", rs232_port_device, write_dtr))
MCFG_Z80SIO_OUT_RTSA_CB(DEVWRITELINE("rs2322a", rs232_port_device, write_rts))
MCFG_Z80SIO_OUT_TXDB_CB(DEVWRITELINE("rs2322b", rs232_port_device, write_txd))
MCFG_Z80SIO_OUT_DTRB_CB(DEVWRITELINE("rs2322b", rs232_port_device, write_dtr))
MCFG_Z80SIO_OUT_RTSB_CB(DEVWRITELINE("rs2322b", rs232_port_device, write_rts))
MCFG_RS232_PORT_ADD("rs2322a", default_rs232_devices, nullptr)
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("sio2", z80sio_device, rxa_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("sio2", z80sio_device, dcda_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("sio2", z80sio_device, ctsa_w))
MCFG_RS232_PORT_ADD("rs2322b", default_rs232_devices, nullptr)
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("sio2", z80sio_device, rxb_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("sio2", z80sio_device, dcdb_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("sio2", z80sio_device, ctsb_w))
MCFG_Z80SIO_ADD("sio3", XTAL_16MHz/4, 0, 0, 0, 0)
MCFG_Z80SIO_OUT_TXDA_CB(DEVWRITELINE("rs2323a", rs232_port_device, write_txd))
MCFG_Z80SIO_OUT_DTRA_CB(DEVWRITELINE("rs2323a", rs232_port_device, write_dtr))
MCFG_Z80SIO_OUT_RTSA_CB(DEVWRITELINE("rs2323a", rs232_port_device, write_rts))
MCFG_Z80SIO_OUT_TXDB_CB(DEVWRITELINE("rs2323b", rs232_port_device, write_txd))
MCFG_Z80SIO_OUT_DTRB_CB(DEVWRITELINE("rs2323b", rs232_port_device, write_dtr))
MCFG_Z80SIO_OUT_RTSB_CB(DEVWRITELINE("rs2323b", rs232_port_device, write_rts))
MCFG_RS232_PORT_ADD("rs2323a", default_rs232_devices, nullptr)
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("sio3", z80sio_device, rxa_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("sio3", z80sio_device, dcda_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("sio3", z80sio_device, ctsa_w))
MCFG_RS232_PORT_ADD("rs2323b", default_rs232_devices, nullptr)
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("sio3", z80sio_device, rxb_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("sio3", z80sio_device, dcdb_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("sio3", z80sio_device, ctsb_w))
MCFG_Z80SIO_ADD("sio4", XTAL_16MHz/4, 0, 0, 0, 0)
MCFG_Z80SIO_OUT_TXDA_CB(DEVWRITELINE("rs2324a", rs232_port_device, write_txd))
MCFG_Z80SIO_OUT_DTRA_CB(DEVWRITELINE("rs2324a", rs232_port_device, write_dtr))
MCFG_Z80SIO_OUT_RTSA_CB(DEVWRITELINE("rs2324a", rs232_port_device, write_rts))
MCFG_Z80SIO_OUT_TXDB_CB(DEVWRITELINE("rs2324b", rs232_port_device, write_txd))
MCFG_Z80SIO_OUT_DTRB_CB(DEVWRITELINE("rs2324b", rs232_port_device, write_dtr))
MCFG_Z80SIO_OUT_RTSB_CB(DEVWRITELINE("rs2324b", rs232_port_device, write_rts))
MCFG_RS232_PORT_ADD("rs2324a", default_rs232_devices, nullptr)
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("sio4", z80sio_device, rxa_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("sio4", z80sio_device, dcda_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("sio4", z80sio_device, ctsa_w))
MCFG_RS232_PORT_ADD("rs2324b", default_rs232_devices, nullptr)
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("sio4", z80sio_device, rxb_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("sio4", z80sio_device, dcdb_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("sio4", z80sio_device, ctsb_w))
MACHINE_CONFIG_END
void acs8600_ics_device::device_start()
{
m_maincpu_mem = &machine().device<cpu_device>(m_maincpu_tag)->space(AS_PROGRAM);
m_out_irq1_func.resolve_safe();
m_out_irq2_func.resolve_safe();
}

View File

@ -0,0 +1,50 @@
// license:BSD-3-Clause
// copyright-holders:Carl
#ifndef MAME_MACHINE_ACS8600_ICS_H_
#define MAME_MACHINE_ACS8600_ICS_H_
#pragma once
class acs8600_ics_device : public device_t
{
public:
acs8600_ics_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_WRITE8_MEMBER(hiaddr_w);
DECLARE_WRITE8_MEMBER(ctrl_w);
DECLARE_READ8_MEMBER(hostram_r);
DECLARE_WRITE8_MEMBER(hostram_w);
DECLARE_WRITE_LINE_MEMBER(attn_w);
template <class Object> static devcb_base &static_set_irq1_callback(device_t &device, Object &&cb) { return downcast<acs8600_ics_device &>(device).m_out_irq1_func.set_callback(std::forward<Object>(cb)); }
template <class Object> static devcb_base &static_set_irq2_callback(device_t &device, Object &&cb) { return downcast<acs8600_ics_device &>(device).m_out_irq2_func.set_callback(std::forward<Object>(cb)); }
static void static_set_maincpu_tag(device_t &device, const char *maincpu_tag) { downcast<acs8600_ics_device &>(device).m_maincpu_tag = maincpu_tag; }
const tiny_rom_entry *device_rom_region() const override;
protected:
virtual void device_start() override;
virtual void device_add_mconfig(machine_config &config) override;
private:
required_device<cpu_device> m_icscpu;
devcb_write_line m_out_irq1_func;
devcb_write_line m_out_irq2_func;
const char *m_maincpu_tag;
address_space *m_maincpu_mem;
u8 m_hiaddr, m_ctrl;
};
#define MCFG_ACS8600_ICS_MAINCPU(_maincpu_tag) \
acs8600_ics_device::static_set_maincpu_tag(*device, _maincpu_tag);
#define MCFG_ACS8600_ICS_IRQ1(_irq_line) \
devcb = &acs8600_ics_device::static_set_irq1_callback(*device, DEVCB_##_irq_line);
#define MCFG_ACS8600_ICS_IRQ2(_irq_line) \
devcb = &acs8600_ics_device::static_set_irq2_callback(*device, DEVCB_##_irq_line);
DECLARE_DEVICE_TYPE(ACS8600_ICS, acs8600_ics_device)
#endif