(nw) uarts for mccpm, mice ; other cleanups

This commit is contained in:
Robbbert 2017-09-17 23:01:17 +10:00
parent ade1b74365
commit 166235420f
5 changed files with 106 additions and 116 deletions

View File

@ -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;

View File

@ -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

View File

@ -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")
{ }
required_device<cpu_device> m_maincpu;
required_device<generic_terminal_device> m_terminal;
DECLARE_READ8_MEMBER(mccpm_f0_r);
DECLARE_READ8_MEMBER(mccpm_f1_r);
void kbd_put(u8 data);
required_shared_ptr<uint8_t> m_p_ram;
uint8_t m_term_data;
DECLARE_WRITE_LINE_MEMBER(clock_tick);
private:
virtual void machine_reset() override;
required_device<cpu_device> m_maincpu;
required_shared_ptr<uint8_t> m_p_ram;
required_device<z80sio_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 */

View File

@ -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<cpu_device> m_maincpu;
required_device<generic_terminal_device> m_terminal;
uint8_t m_term_data;
private:
virtual void machine_reset() override;
required_device<cpu_device> m_maincpu;
required_device<i8251_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 )
{
m_term_data = data;
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_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 )

View File

@ -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;