diff options
| author | 2017-09-23 01:00:47 -0400 | |
|---|---|---|
| committer | 2017-09-23 01:01:47 -0400 | |
| commit | d99cfb1ebf5682fd02920f2104adfecb8837d9b7 (patch) | |
| tree | f56d1ba4b75ee5964ec9422d4fd122a2ac8ed3c4 /src | |
| parent | ce5f0e885a99d69e1c8984c06a1ccc7bf9841f32 (diff) | |
codata: Add uPD7201 + Am9513 and hook up their interrupts (nw)
am9513: A few more notes (nw)
Diffstat (limited to 'src')
| -rw-r--r-- | src/devices/machine/am9513.cpp | 8 | ||||
| -rw-r--r-- | src/mame/drivers/codata.cpp | 68 |
2 files changed, 38 insertions, 38 deletions
diff --git a/src/devices/machine/am9513.cpp b/src/devices/machine/am9513.cpp index 1e572647e15..f41711fbfcd 100644 --- a/src/devices/machine/am9513.cpp +++ b/src/devices/machine/am9513.cpp @@ -6,8 +6,12 @@ The Am9513 is a five-channel counter/timer circuit introduced by AMD around 1980. (It was also sold as the AmZ8073, apparently due - to a licensing deal with Zilog.) Clock source, edge selection, - gating and retriggering are programmable for each channel. + to a licensing deal with Zilog to develop Z8000 peripherals. No + company is known to have second-sourced the device, however.) + Clock source, edge selection, gating and retriggering are + programmable for each channel. There is also a frequency divider + which can take any of the 15 normal counter inputs and divide it + by any number between 1 and 16. All internal counters are 16 bits wide (except the internal 4-bit counter for the FOUT divider, which is not externally accessible). diff --git a/src/mame/drivers/codata.cpp b/src/mame/drivers/codata.cpp index 4285ed97df7..da13cfd1723 100644 --- a/src/mame/drivers/codata.cpp +++ b/src/mame/drivers/codata.cpp @@ -13,9 +13,9 @@ #include "emu.h" #include "cpu/m68000/m68000.h" -#include "machine/terminal.h" - -#define TERMINAL_TAG "terminal" +#include "bus/rs232/rs232.h" +#include "machine/am9513.h" +#include "machine/z80sio.h" class codata_state : public driver_device { @@ -23,32 +23,24 @@ public: codata_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_p_base(*this, "rambase"), - m_terminal(*this, TERMINAL_TAG), m_maincpu(*this, "maincpu") { } - DECLARE_READ16_MEMBER(keyin_r); - DECLARE_READ16_MEMBER(status_r); - void kbd_put(u8 data); - private: - uint8_t m_term_data; virtual void machine_reset() override; required_shared_ptr<uint16_t> m_p_base; - required_device<generic_terminal_device> m_terminal; required_device<cpu_device> m_maincpu; }; static ADDRESS_MAP_START(codata_mem, AS_PROGRAM, 16, codata_state) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x000000, 0x0fffff) AM_RAM AM_SHARE("rambase") + AM_RANGE(0x000000, 0x1fffff) AM_RAM AM_SHARE("rambase") AM_RANGE(0x200000, 0x203fff) AM_ROM AM_REGION("user1", 0); AM_RANGE(0x400000, 0x403fff) AM_ROM AM_REGION("user1", 0x4000); - AM_RANGE(0x600000, 0x600001) AM_READ(keyin_r) AM_DEVWRITE8(TERMINAL_TAG, generic_terminal_device, write, 0xff00) - AM_RANGE(0x600002, 0x600003) AM_READ(status_r) - //AM_RANGE(0x600000, 0x600003) uPD7201 SIO - //AM_RANGE(0x800000, 0x800003) AM9513 5 channel timer + AM_RANGE(0x600000, 0x600007) AM_MIRROR(0x1ffff8) AM_DEVREADWRITE8("uart", upd7201_new_device, ba_cd_r, ba_cd_w, 0xff00) + AM_RANGE(0x800000, 0x800003) AM_MIRROR(0x1ffffc) AM_DEVREADWRITE("timer", am9513_device, read16, write16) + AM_RANGE(0xe00000, 0xe00001) AM_MIRROR(0x1ffffe) AM_READ_PORT("INPUT") //AM_RANGE(0xa00000, 0xbfffff) page map (rw) //AM_RANGE(0xc00000, 0xdfffff) segment map (rw), context register (r) //AM_RANGE(0xe00000, 0xffffff) context register (w), 16-bit parallel input port (r) @@ -56,31 +48,15 @@ ADDRESS_MAP_END /* Input ports */ static INPUT_PORTS_START( codata ) + PORT_START("INPUT") + PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END -READ16_MEMBER( codata_state::keyin_r ) -{ - uint16_t ret = m_term_data; - m_term_data = 0; - return ret << 8; -} - -READ16_MEMBER( codata_state::status_r ) -{ - return (m_term_data) ? 0x500 : 0x400; -} - -void codata_state::kbd_put(u8 data) -{ - m_term_data = data; -} - void codata_state::machine_reset() { uint8_t* RAM = memregion("user1")->base(); memcpy(m_p_base, RAM, 16); - m_term_data = 0; m_maincpu->reset(); } @@ -89,9 +65,29 @@ static MACHINE_CONFIG_START( codata ) MCFG_CPU_ADD("maincpu",M68000, XTAL_16MHz / 2) MCFG_CPU_PROGRAM_MAP(codata_mem) - /* video hardware */ - MCFG_DEVICE_ADD(TERMINAL_TAG, GENERIC_TERMINAL, 0) - MCFG_GENERIC_TERMINAL_KEYBOARD_CB(PUT(codata_state, kbd_put)) + MCFG_DEVICE_ADD("uart", UPD7201_NEW, XTAL_16MHz / 4) + MCFG_Z80SIO_OUT_TXDA_CB(DEVWRITELINE("rs423a", rs232_port_device, write_txd)) + MCFG_Z80SIO_OUT_DTRA_CB(DEVWRITELINE("rs423a", rs232_port_device, write_dtr)) + MCFG_Z80SIO_OUT_RTSA_CB(DEVWRITELINE("rs423a", rs232_port_device, write_rts)) + MCFG_Z80SIO_OUT_TXDB_CB(DEVWRITELINE("rs423b", rs232_port_device, write_txd)) + MCFG_Z80SIO_OUT_INT_CB(INPUTLINE("maincpu", M68K_IRQ_5)) + + MCFG_DEVICE_ADD("timer", AM9513A, 3993600) // actually XTAL_16MHz / 4, which produces 9615 baud when divided + MCFG_AM9513_OUT1_CALLBACK(NOOP) // Timer 1 = "Abort/Reset" (watchdog) + MCFG_AM9513_OUT2_CALLBACK(INPUTLINE("maincpu", M68K_IRQ_6)) // Timer 2 + MCFG_AM9513_OUT3_CALLBACK(INPUTLINE("maincpu", M68K_IRQ_7)) // Refresh + MCFG_AM9513_OUT4_CALLBACK(DEVWRITELINE("uart", upd7201_new_device, rxca_w)) + MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("uart", upd7201_new_device, txca_w)) + MCFG_AM9513_OUT5_CALLBACK(DEVWRITELINE("uart", upd7201_new_device, rxcb_w)) + MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("uart", upd7201_new_device, txcb_w)) + + MCFG_RS232_PORT_ADD("rs423a", default_rs232_devices, "terminal") + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("uart", upd7201_new_device, rxa_w)) + MCFG_RS232_DSR_HANDLER(DEVWRITELINE("uart", upd7201_new_device, dcda_w)) + MCFG_RS232_CTS_HANDLER(DEVWRITELINE("uart", upd7201_new_device, ctsa_w)) + + MCFG_RS232_PORT_ADD("rs423b", default_rs232_devices, nullptr) + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("uart", upd7201_new_device, rxb_w)) MACHINE_CONFIG_END /* ROM definition */ |
