From 166235420ffabbd5a89377cb1e91ac33b23f1182 Mon Sep 17 00:00:00 2001 From: Robbbert Date: Sun, 17 Sep 2017 23:01:17 +1000 Subject: (nw) uarts for mccpm, mice ; other cleanups --- src/devices/machine/i8155.cpp | 3 +- src/mame/drivers/mcb216.cpp | 18 ++++---- src/mame/drivers/mccpm.cpp | 103 +++++++++++++++--------------------------- src/mame/drivers/mice.cpp | 96 +++++++++++++++++++++++---------------- src/mame/drivers/pimps.cpp | 2 +- 5 files changed, 106 insertions(+), 116 deletions(-) diff --git a/src/devices/machine/i8155.cpp b/src/devices/machine/i8155.cpp index 721575f1468..fcb44bafe30 100644 --- a/src/devices/machine/i8155.cpp +++ b/src/devices/machine/i8155.cpp @@ -460,7 +460,8 @@ void i8155_device::register_w(int offset, uint8_t data) { // load mode and CNT length and start immediately after loading (if timer is not running) m_counter = m_count_length & 0x3fff; - m_timer->adjust(attotime::zero, 0, attotime::from_hz(clock())); + if (clock() > 0) // a clock of 0 causes MAME to freeze. + m_timer->adjust(attotime::zero, 0, attotime::from_hz(clock())); // clear timer command so this won't execute twice m_command &= ~COMMAND_TM_MASK; diff --git a/src/mame/drivers/mcb216.cpp b/src/mame/drivers/mcb216.cpp index 0190e2b4100..ded1dc04ba9 100644 --- a/src/mame/drivers/mcb216.cpp +++ b/src/mame/drivers/mcb216.cpp @@ -9,7 +9,7 @@ TODO: - Find out cpu clock speed - - Find out what UART type is used + - Find out what UART type is used (init byte = 94) Memory allocation - 0000 to 0FFF - standard roms @@ -36,17 +36,15 @@ #include "cpu/z80/z80.h" #include "machine/terminal.h" -#define TERMINAL_TAG "terminal" class mcb216_state : public driver_device { public: mcb216_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_terminal(*this, TERMINAL_TAG) - { - } + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_terminal(*this, "terminal") + { } void kbd_put(u8 data); DECLARE_READ8_MEMBER(keyin_r); @@ -70,7 +68,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START(mcb216_io, AS_IO, 8, mcb216_state) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x00) AM_READ(status_r) - AM_RANGE(0x01, 0x01) AM_READ(keyin_r) AM_DEVWRITE(TERMINAL_TAG, generic_terminal_device, write) + AM_RANGE(0x01, 0x01) AM_READ(keyin_r) AM_DEVWRITE("terminal", generic_terminal_device, write) ADDRESS_MAP_END static ADDRESS_MAP_START(cb308_mem, AS_PROGRAM, 8, mcb216_state) @@ -123,7 +121,7 @@ static MACHINE_CONFIG_START( mcb216 ) MCFG_MACHINE_RESET_OVERRIDE(mcb216_state, mcb216) /* video hardware */ - MCFG_DEVICE_ADD(TERMINAL_TAG, GENERIC_TERMINAL, 0) + MCFG_DEVICE_ADD("terminal", GENERIC_TERMINAL, 0) MCFG_GENERIC_TERMINAL_KEYBOARD_CB(PUT(mcb216_state, kbd_put)) MACHINE_CONFIG_END @@ -135,7 +133,7 @@ static MACHINE_CONFIG_START( cb308 ) MCFG_MACHINE_RESET_OVERRIDE(mcb216_state, cb308) /* video hardware */ - MCFG_DEVICE_ADD(TERMINAL_TAG, GENERIC_TERMINAL, 0) + MCFG_DEVICE_ADD("terminal", GENERIC_TERMINAL, 0) MCFG_GENERIC_TERMINAL_KEYBOARD_CB(PUT(mcb216_state, kbd_put)) MACHINE_CONFIG_END diff --git a/src/mame/drivers/mccpm.cpp b/src/mame/drivers/mccpm.cpp index 03003623456..a56ba8a2002 100644 --- a/src/mame/drivers/mccpm.cpp +++ b/src/mame/drivers/mccpm.cpp @@ -19,93 +19,51 @@ Z - print 'EFFF' URL for v3.4: http://www.hanshehl.de/mc-prog.htm (German language) -I/O ports (my guess) +unknown I/O ports (my guess) 30 - fdc (1st drive) 40 - fdc (2nd drive) -F0 - terminal in/out -F1 - terminal status - -SIO? - F0 to F3 -PIO A-Data 0F4h, A-Command 0F5h, B-Data 0F6h, B-Command 0F7h - -'maincpu' (F59C): unmapped i/o memory write to 00F1 = 01 & FF -'maincpu' (F59C): unmapped i/o memory write to 00F1 = 00 & FF -'maincpu' (F59C): unmapped i/o memory write to 00F1 = 03 & FF -'maincpu' (F59C): unmapped i/o memory write to 00F1 = E1 & FF -'maincpu' (F59C): unmapped i/o memory write to 00F1 = 04 & FF -'maincpu' (F59C): unmapped i/o memory write to 00F1 = 4C & FF -'maincpu' (F59C): unmapped i/o memory write to 00F1 = 05 & FF -'maincpu' (F59C): unmapped i/o memory write to 00F1 = EA & FF -'maincpu' (F5A5): unmapped i/o memory write to 00F3 = 01 & FF -'maincpu' (F5A5): unmapped i/o memory write to 00F3 = 00 & FF -'maincpu' (F5A5): unmapped i/o memory write to 00F3 = 03 & FF -'maincpu' (F5A5): unmapped i/o memory write to 00F3 = E1 & FF -'maincpu' (F5A5): unmapped i/o memory write to 00F3 = 04 & FF -'maincpu' (F5A5): unmapped i/o memory write to 00F3 = 4C & FF -'maincpu' (F5A5): unmapped i/o memory write to 00F3 = 05 & FF -'maincpu' (F5A5): unmapped i/o memory write to 00F3 = EA & FF -'maincpu' (F5A9): unmapped i/o memory write to 00F5 = CF & FF -'maincpu' (F5AD): unmapped i/o memory write to 00F5 = 7F & FF -'maincpu' (F5B1): unmapped i/o memory write to 00F7 = CF & FF -'maincpu' (F5B4): unmapped i/o memory write to 00F7 = 00 & FF -'maincpu' (F149): unmapped i/o memory write to 0040 = D0 & FF -'maincpu' (F14B): unmapped i/o memory write to 0030 = D0 & FF + ****************************************************************************/ #include "emu.h" #include "cpu/z80/z80.h" -#include "machine/terminal.h" +#include "machine/z80pio.h" +#include "machine/z80sio.h" +#include "machine/clock.h" +#include "bus/rs232/rs232.h" -#define TERMINAL_TAG "terminal" class mccpm_state : public driver_device { public: mccpm_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_terminal(*this, TERMINAL_TAG), - m_p_ram(*this, "p_ram") - { - } + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_p_ram(*this, "ram") + , m_sio(*this, "sio") + { } + + DECLARE_WRITE_LINE_MEMBER(clock_tick); +private: + virtual void machine_reset() override; required_device m_maincpu; - required_device m_terminal; - DECLARE_READ8_MEMBER(mccpm_f0_r); - DECLARE_READ8_MEMBER(mccpm_f1_r); - void kbd_put(u8 data); required_shared_ptr m_p_ram; - uint8_t m_term_data; - virtual void machine_reset() override; + required_device m_sio; }; - -READ8_MEMBER( mccpm_state::mccpm_f0_r ) -{ - uint8_t ret = m_term_data; - m_term_data = 0; - return ret; -} - -// bit 0 - key pressed -// bit 2 - ready to send to terminal -READ8_MEMBER( mccpm_state::mccpm_f1_r ) -{ - return (m_term_data) ? 5 : 4; -} - static ADDRESS_MAP_START(mccpm_mem, AS_PROGRAM, 8, mccpm_state) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0000, 0xffff) AM_RAM AM_SHARE("p_ram") + AM_RANGE(0x0000, 0xffff) AM_RAM AM_SHARE("ram") ADDRESS_MAP_END static ADDRESS_MAP_START( mccpm_io, AS_IO, 8, mccpm_state) ADDRESS_MAP_UNMAP_HIGH ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0xf0, 0xf0) AM_READ(mccpm_f0_r) AM_DEVWRITE(TERMINAL_TAG, generic_terminal_device, write) - AM_RANGE(0xf1, 0xf1) AM_READ(mccpm_f1_r) + AM_RANGE(0xf0, 0xf3) AM_DEVREADWRITE("sio", z80sio_device, ba_cd_r, ba_cd_w) + AM_RANGE(0xf4, 0xf7) AM_DEVREADWRITE("pio", z80pio_device, read_alt, write_alt) // init bytes look like those for a Z80PIO ADDRESS_MAP_END /* Input ports */ @@ -119,9 +77,10 @@ void mccpm_state::machine_reset() memcpy(m_p_ram, bios, 0x1000); } -void mccpm_state::kbd_put(u8 data) +WRITE_LINE_MEMBER( mccpm_state::clock_tick ) { - m_term_data = data; + m_sio->txca_w(state); + m_sio->rxca_w(state); } static MACHINE_CONFIG_START( mccpm ) @@ -130,9 +89,21 @@ static MACHINE_CONFIG_START( mccpm ) MCFG_CPU_PROGRAM_MAP(mccpm_mem) MCFG_CPU_IO_MAP(mccpm_io) - /* video hardware */ - MCFG_DEVICE_ADD(TERMINAL_TAG, GENERIC_TERMINAL, 0) - MCFG_GENERIC_TERMINAL_KEYBOARD_CB(PUT(mccpm_state, kbd_put)) + /* Devices */ + MCFG_DEVICE_ADD("uart_clock", CLOCK, 153600) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(mccpm_state, clock_tick)) + + MCFG_Z80SIO_ADD("sio", XTAL_4MHz, 0, 0, 0, 0) + MCFG_Z80SIO_OUT_INT_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0)) + MCFG_Z80SIO_OUT_TXDA_CB(DEVWRITELINE("rs232", rs232_port_device, write_txd)) + MCFG_Z80SIO_OUT_DTRA_CB(DEVWRITELINE("rs232", rs232_port_device, write_dtr)) + MCFG_Z80SIO_OUT_RTSA_CB(DEVWRITELINE("rs232", rs232_port_device, write_rts)) + + MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "terminal") + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("sio", z80sio_device, rxa_w)) + MCFG_RS232_CTS_HANDLER(DEVWRITELINE("sio", z80sio_device, ctsa_w)) + + MCFG_DEVICE_ADD("pio", Z80PIO, XTAL_4MHz) MACHINE_CONFIG_END /* ROM definition */ diff --git a/src/mame/drivers/mice.cpp b/src/mame/drivers/mice.cpp index 61661a6965a..d03c0959df4 100644 --- a/src/mame/drivers/mice.cpp +++ b/src/mame/drivers/mice.cpp @@ -2,7 +2,7 @@ // copyright-holders:Miodrag Milanovic, Robbbert /*************************************************************************** -Microtek International Inc MICE +Microtek International Inc MICE (Micro-In-Circuit Emulator) 2013-08-27 Skeleton driver. @@ -13,61 +13,59 @@ Each CPU has a plugin card with various chips. The usual complement is The connection to the outside world is via RS232 to a terminal. +No schematic or manuals available. This driver is guesswork. + +There's a mistake in the boot rom: if the test of the 8155 or 8255 fail, it +attempts to write a suitable message to the screen, but as the 8251 hasn't +yet been initialised, it hangs. + +After successfully testing the hardware, it goes off waiting for something +to happen, and this is why there's no output to the screen. + ****************************************************************************/ #include "emu.h" #include "cpu/i8085/i8085.h" -#include "machine/terminal.h" - -#define TERMINAL_TAG "terminal" +#include "machine/i8155.h" +#include "machine/i8251.h" +#include "machine/i8255.h" +#include "machine/clock.h" +#include "bus/rs232/rs232.h" class mice_state : public driver_device { public: mice_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_terminal(*this, TERMINAL_TAG) - { - } + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_uart(*this, "uart") + { } - DECLARE_READ8_MEMBER(port50_r); - DECLARE_READ8_MEMBER(port51_r); - void kbd_put(u8 data); + DECLARE_READ8_MEMBER(rpt_pc_r); + DECLARE_WRITE_LINE_MEMBER(clock_tick); -protected: - required_device m_maincpu; - required_device m_terminal; - - uint8_t m_term_data; +private: virtual void machine_reset() override; + required_device m_maincpu; + required_device m_uart; }; -READ8_MEMBER( mice_state::port50_r ) -{ - uint8_t ret = m_term_data; - m_term_data = 0; - return ret; -} - -READ8_MEMBER( mice_state::port51_r ) -{ - return (m_term_data) ? 5 : 1; -} - static ADDRESS_MAP_START(mice_mem, AS_PROGRAM, 8, mice_state) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE( 0x0000, 0x5fff ) AM_ROM AM_REGION("mice_6502", 0) - AM_RANGE( 0x6000, 0xffff ) AM_RAM + AM_RANGE(0x0000, 0x3fff) AM_ROM AM_REGION("mice_6502", 0) + AM_RANGE(0x4400, 0x47ff) AM_RAM //(U13) + AM_RANGE(0x6000, 0x60ff) AM_DEVREADWRITE("rpt", i8155_device, memory_r, memory_w) ADDRESS_MAP_END static ADDRESS_MAP_START(mice_io, AS_IO, 8, mice_state) ADDRESS_MAP_UNMAP_HIGH ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0x50, 0x50) AM_READ(port50_r) AM_DEVWRITE(TERMINAL_TAG, generic_terminal_device, write) - AM_RANGE(0x51, 0x51) AM_READ(port51_r) + AM_RANGE(0x50, 0x50) AM_DEVREADWRITE("uart", i8251_device, data_r, data_w) + AM_RANGE(0x51, 0x51) AM_DEVREADWRITE("uart", i8251_device, status_r, control_w) + AM_RANGE(0x60, 0x67) AM_DEVREADWRITE("rpt", i8155_device, io_r, io_w) + AM_RANGE(0x70, 0x73) AM_DEVREADWRITE("ppi", i8255_device, read, write) ADDRESS_MAP_END /* Input ports */ @@ -79,9 +77,17 @@ void mice_state::machine_reset() { } -void mice_state::kbd_put(u8 data) +// This port presumably connects to dipswitches to set the serial protocol +READ8_MEMBER( mice_state::rpt_pc_r ) +{ + return 0xef; // select our default rs232 settings +} + +// source of baud frequency is not known, so we invent a clock +WRITE_LINE_MEMBER( mice_state::clock_tick ) { - m_term_data = data; + m_uart->write_txc(state); + m_uart->write_rxc(state); } static MACHINE_CONFIG_START( mice ) @@ -91,8 +97,22 @@ static MACHINE_CONFIG_START( mice ) MCFG_CPU_IO_MAP(mice_io) /* video hardware */ - MCFG_DEVICE_ADD(TERMINAL_TAG, GENERIC_TERMINAL, 0) - MCFG_GENERIC_TERMINAL_KEYBOARD_CB(PUT(mice_state, kbd_put)) + MCFG_DEVICE_ADD("uart_clock", CLOCK, 153600) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(mice_state, clock_tick)) + + MCFG_DEVICE_ADD("uart", I8251, 0) + MCFG_I8251_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd)) + MCFG_I8251_DTR_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_dtr)) + MCFG_I8251_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts)) + + MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "terminal") + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("uart", i8251_device, write_rxd)) + MCFG_RS232_DSR_HANDLER(DEVWRITELINE("uart", i8251_device, write_dsr)) + MCFG_RS232_CTS_HANDLER(DEVWRITELINE("uart", i8251_device, write_cts)) + + MCFG_DEVICE_ADD("rpt", I8155, 1000) // this value is the timer clock, no idea what it should be. + MCFG_I8155_IN_PORTC_CB(READ8(mice_state, rpt_pc_r)) + MCFG_DEVICE_ADD("ppi", I8255, 0) MACHINE_CONFIG_END /* ROM definition */ @@ -121,4 +141,4 @@ ROM_END /* Driver */ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1980, mice, 0, 0, mice, mice, mice_state, 0, "Microtek International Inc", "Mice", MACHINE_IS_SKELETON ) +COMP( 1981, mice, 0, 0, mice, mice, mice_state, 0, "Microtek International Inc", "Mice", MACHINE_IS_SKELETON ) diff --git a/src/mame/drivers/pimps.cpp b/src/mame/drivers/pimps.cpp index a54a19982cd..d00c157f902 100644 --- a/src/mame/drivers/pimps.cpp +++ b/src/mame/drivers/pimps.cpp @@ -84,7 +84,7 @@ public: , m_uart2(*this, "uart2") { } - DECLARE_WRITE_LINE_MEMBER( clock_tick ); + DECLARE_WRITE_LINE_MEMBER(clock_tick); private: virtual void machine_reset() override; -- cgit v1.2.3