mirror of
https://github.com/holub/mame
synced 2025-07-03 00:56:03 +03:00
(nw) uarts for mccpm, mice ; other cleanups
This commit is contained in:
parent
ade1b74365
commit
166235420f
@ -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;
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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 )
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user