Merge pull request #1698 from JoakimLarsson/mizar

Added UPD7201 device type to z80sio.cpp and used it in mzr8105.cpp, p…
This commit is contained in:
R. Belmont 2016-11-15 21:18:35 -05:00 committed by GitHub
commit 4d533249fd
3 changed files with 200 additions and 150 deletions

View File

@ -55,7 +55,15 @@
#define VERBOSE 0
#define LOG(x) do { if (VERBOSE) logerror x; } while (0)
#define LOGPRINT(x) { do { if (VERBOSE) logerror x; } while (0); }
#define LOG(x) {}
#define LOGR(x) {}
#define LOGSETUP(x) {} LOGPRINT(x)
#define LOGINT(x) {}
#define LOGTX(x) {}
#define LOGRCV(x) {}
#define LOGCTS(x) {} LOGPRINT(x)
#define LOGDCD(x) {} LOGPRINT(x)
#if VERBOSE == 2
#define logerror printf
#endif
@ -71,8 +79,6 @@
#define CHANA_TAG "cha"
#define CHANB_TAG "chb"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
@ -80,6 +86,7 @@
// device type definition
const device_type Z80SIO = &device_creator<z80sio_device>;
const device_type Z80SIO_CHANNEL = &device_creator<z80sio_channel>;
const device_type UPD7201N = &device_creator<upd7201N_device>; // Remove trailing N when z80dart.cpp's 7201 implementation is fully replaced
//-------------------------------------------------
// device_mconfig_additions -
@ -163,6 +170,9 @@ z80sio_device::z80sio_device(const machine_config &mconfig, const char *tag, dev
elem = 0;
}
upd7201N_device::upd7201N_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: z80sio_device(mconfig, UPD7201N, "UPD 7201", tag, owner, clock, TYPE_UPD7201, "upd7201", __FILE__){ }
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
@ -219,7 +229,7 @@ int z80sio_device::z80daisy_irq_state()
int i;
LOG(("%s %s A:%d%d%d%d B:%d%d%d%d ",FUNCNAME, tag(),
LOGINT(("%s %s A:%d%d%d%d B:%d%d%d%d ",FUNCNAME, tag(),
m_int_state[0], m_int_state[1], m_int_state[2], m_int_state[3],
m_int_state[4], m_int_state[5], m_int_state[6], m_int_state[7]));
@ -235,7 +245,7 @@ int z80sio_device::z80daisy_irq_state()
state |= m_int_state[i];
}
LOG(("Interrupt State %u\n", state));
LOGINT(("Interrupt State %u\n", state));
return state;
}
@ -248,7 +258,7 @@ int z80sio_device::z80daisy_irq_ack()
{
int i;
LOG(("%s %s \n",FUNCNAME, tag()));
LOGINT(("%s %s \n",FUNCNAME, tag()));
// loop over all interrupt sources
for (i = 0; i < 8; i++)
@ -280,7 +290,7 @@ void z80sio_device::z80daisy_irq_reti()
{
int i;
LOG(("%s %s \n",FUNCNAME, tag()));
LOGINT(("%s %s \n",FUNCNAME, tag()));
// loop over all interrupt sources
for (i = 0; i < 8; i++)
@ -304,7 +314,7 @@ void z80sio_device::z80daisy_irq_reti()
//-------------------------------------------------
void z80sio_device::check_interrupts()
{
LOG(("%s %s \n",FUNCNAME, tag()));
LOGINT(("%s %s \n",FUNCNAME, tag()));
int state = (z80daisy_irq_state() & Z80_DAISY_INT) ? ASSERT_LINE : CLEAR_LINE;
m_out_int_cb(state);
}
@ -315,7 +325,7 @@ void z80sio_device::check_interrupts()
//-------------------------------------------------
void z80sio_device::reset_interrupts()
{
LOG(("%s %s \n",FUNCNAME, tag()));
LOGINT(("%s %s \n",FUNCNAME, tag()));
// reset internal interrupt sources
for (auto & elem : m_int_state)
{
@ -334,7 +344,7 @@ void z80sio_device::trigger_interrupt(int index, int state)
uint8_t vector = m_chanB->m_wr2;
int priority;
LOG(("%s %s \n",FUNCNAME, tag()));
LOGINT(("%s %s \n",FUNCNAME, tag()));
#if 0
if((m_variant == TYPE_I8274) || (m_variant == TYPE_UPD7201))
@ -402,7 +412,7 @@ void z80sio_device::trigger_interrupt(int index, int state)
//-------------------------------------------------
int z80sio_device::m1_r()
{
LOG(("%s %s \n",FUNCNAME, tag()));
LOGINT(("%s %s \n",FUNCNAME, tag()));
return z80daisy_irq_ack();
}
@ -596,7 +606,7 @@ void z80sio_channel::tra_callback()
{
if (!(m_wr5 & WR5_TX_ENABLE))
{
LOG(("%d %s() \"%s \"Channel %c transmit mark 1 m_wr5:%02x\n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index, m_wr5));
LOG(("%s() \"%s \"Channel %c transmit mark 1 m_wr5:%02x\n", FUNCNAME, m_owner->tag(), 'A' + m_index, m_wr5));
// transmit mark
if (m_index == z80sio_device::CHANNEL_A)
m_uart->m_out_txda_cb(1);
@ -605,7 +615,7 @@ void z80sio_channel::tra_callback()
}
else if (m_wr5 & WR5_SEND_BREAK)
{
LOG(("%d %s() \"%s \"Channel %c send break 1 m_wr5:%02x\n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index, m_wr5));
LOG(("%s() \"%s \"Channel %c send break 1 m_wr5:%02x\n", FUNCNAME, m_owner->tag(), 'A' + m_index, m_wr5));
// transmit break
if (m_index == z80sio_device::CHANNEL_A)
m_uart->m_out_txda_cb(0);
@ -616,7 +626,7 @@ void z80sio_channel::tra_callback()
{
int db = transmit_register_get_data_bit();
LOG(("%d %s() \"%s \"Channel %c transmit data bit %d m_wr5:%02x\n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index, db, m_wr5));
LOG(("%s() \"%s \"Channel %c transmit data bit %d m_wr5:%02x\n", FUNCNAME, m_owner->tag(), 'A' + m_index, db, m_wr5));
// transmit data
if (m_index == z80sio_device::CHANNEL_A)
m_uart->m_out_txda_cb(db);
@ -625,7 +635,7 @@ void z80sio_channel::tra_callback()
}
else
{
LOG(("%d %s() \"%s \"Channel %c Failed to transmit m_wr5:%02x\n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index, m_wr5));
LOG(("%s() \"%s \"Channel %c Failed to transmit m_wr5:%02x\n", FUNCNAME, m_owner->tag(), 'A' + m_index, m_wr5));
logerror("%s \"%s \"Channel %c Failed to transmit\n", FUNCNAME, m_owner->tag(), 'A' + m_index);
}
}
@ -639,7 +649,7 @@ void z80sio_channel::tra_complete()
LOG(("%s %s\n",FUNCNAME, tag()));
if ((m_wr5 & WR5_TX_ENABLE) && !(m_wr5 & WR5_SEND_BREAK) && !(m_rr0 & RR0_TX_BUFFER_EMPTY))
{
LOG(("%d %s() \"%s \"Channel %c Transmit Data Byte '%02x' m_wr5:%02x\n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index, m_tx_data, m_wr5));
LOG(("%s() \"%s \"Channel %c Transmit Data Byte '%02x' m_wr5:%02x\n", FUNCNAME, m_owner->tag(), 'A' + m_index, m_tx_data, m_wr5));
transmit_register_setup(m_tx_data);
@ -651,7 +661,7 @@ void z80sio_channel::tra_complete()
}
else if (m_wr5 & WR5_SEND_BREAK)
{
LOG(("%d %s() \"%s \"Channel %c Transmit Break 0 m_wr5:%02x\n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index, m_wr5));
LOG(("%s() \"%s \"Channel %c Transmit Break 0 m_wr5:%02x\n", FUNCNAME, m_owner->tag(), 'A' + m_index, m_wr5));
// transmit break
if (m_index == z80sio_device::CHANNEL_A)
m_uart->m_out_txda_cb(0);
@ -660,7 +670,7 @@ void z80sio_channel::tra_complete()
}
else
{
LOG(("%d %s() \"%s \"Channel %c Transmit Mark 1 m_wr5:%02x\n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index, m_wr5));
LOG(("%s() \"%s \"Channel %c Transmit Mark 1 m_wr5:%02x\n", FUNCNAME, m_owner->tag(), 'A' + m_index, m_wr5));
// transmit mark
if (m_index == z80sio_device::CHANNEL_A)
m_uart->m_out_txda_cb(1);
@ -671,7 +681,7 @@ void z80sio_channel::tra_complete()
// if transmit buffer is empty
if (m_rr0 & RR0_TX_BUFFER_EMPTY)
{
LOG(("%d %s() \"%s \"Channel %c Transmit buffer empty m_wr5:%02x\n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index, m_wr5));
LOG(("%s() \"%s \"Channel %c Transmit buffer empty m_wr5:%02x\n", FUNCNAME, m_owner->tag(), 'A' + m_index, m_wr5));
// then all characters have been sent
m_rr1 |= RR1_ALL_SENT;
@ -689,13 +699,13 @@ void z80sio_channel::rcv_callback()
{
if (m_wr3 & WR3_RX_ENABLE)
{
LOG(("%d %s() \"%s \"Channel %c Received Data Bit %d\n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index, m_rxd));
LOG(("%s() \"%s \"Channel %c Received Data Bit %d\n", FUNCNAME, m_owner->tag(), 'A' + m_index, m_rxd));
receive_register_update_bit(m_rxd);
}
#if 0
else
{
LOG(("%d %s() \"%s \"Channel %c Received Data Bit but receiver is disabled\n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index));
LOG(("%s() \"%s \"Channel %c Received Data Bit but receiver is disabled\n", FUNCNAME, m_owner->tag(), 'A' + m_index));
logerror("Z80SIO %s() \"%s \"Channel %c Received data dit but receiver is disabled\n", __func__, m_owner->tag(), 'A' + m_index);
}
#endif
@ -711,7 +721,7 @@ void z80sio_channel::rcv_complete()
receive_register_extract();
data = get_received_char();
LOG(("%d %s() \"%s \"Channel %c Received Data %02x\n", machine().firstcpu->total_cycles(), FUNCNAME, m_owner->tag(), 'A' + m_index, data));
LOG(("%s() \"%s \"Channel %c Received Data %02x\n", FUNCNAME, m_owner->tag(), 'A' + m_index, data));
receive_data(data);
}
@ -722,7 +732,7 @@ void z80sio_channel::rcv_complete()
int z80sio_channel::get_clock_mode()
{
LOG(("%s %s\n",FUNCNAME, tag()));
//LOG(("%s %s\n",FUNCNAME, tag()));
int clocks = 1;
switch (m_wr4 & WR4_CLOCK_RATE_MASK)
@ -1066,6 +1076,7 @@ void z80sio_channel::control_write(uint8_t data)
if (reg != 0)
{
LOGSETUP((" * %s %c Reg %02x <- %02x \n", m_owner->tag(), 'A' + m_index, reg, data));
// mask out register index
m_wr0 &= ~WR0_REGISTER_MASK;
}
@ -1074,14 +1085,14 @@ void z80sio_channel::control_write(uint8_t data)
switch (reg)
{
case REG_WR0_COMMAND_REGPT: do_sioreg_wr0(data); break;
case REG_WR1_INT_DMA_ENABLE: do_sioreg_wr1(data); m_uart->check_interrupts(); break;
case REG_WR2_INT_VECTOR: do_sioreg_wr2(data); break;
case REG_WR3_RX_CONTROL: do_sioreg_wr3(data); update_serial(); break;
case REG_WR4_RX_TX_MODES: do_sioreg_wr4(data); update_serial(); break;
case REG_WR5_TX_CONTROL: do_sioreg_wr5(data); update_serial(); update_rts(); break;
case REG_WR6_SYNC_OR_SDLC_A: do_sioreg_wr6(data); break;
case REG_WR7_SYNC_OR_SDLC_F: do_sioreg_wr7(data); break;
case REG_WR0_COMMAND_REGPT: do_sioreg_wr0(data); break;
case REG_WR1_INT_DMA_ENABLE: do_sioreg_wr1(data); m_uart->check_interrupts(); break;
case REG_WR2_INT_VECTOR: do_sioreg_wr2(data); break;
case REG_WR3_RX_CONTROL: do_sioreg_wr3(data); update_serial(); break;
case REG_WR4_RX_TX_MODES: do_sioreg_wr4(data); update_serial(); break;
case REG_WR5_TX_CONTROL: do_sioreg_wr5(data); update_serial(); update_rts(); break;
case REG_WR6_SYNC_OR_SDLC_A: do_sioreg_wr6(data); break;
case REG_WR7_SYNC_OR_SDLC_F: do_sioreg_wr7(data); break;
default:
logerror("Z80SIO \"%s\" Channel %c : Unsupported WRx register:%02x\n", m_owner->tag(), 'A' + m_index, reg);
}

View File

@ -66,9 +66,18 @@
MCFG_DEVICE_ADD(_tag, Z80SIO, _clock) \
MCFG_Z80SIO_OFFSETS(_rxa, _txa, _rxb, _txb)
#define MCFG_UPD7201_ADD(_tag, _clock, _rxa, _txa, _rxb, _txb) \
MCFG_DEVICE_ADD(_tag, UPD7201N, _clock) \
MCFG_Z80SIO_OFFSETS(_rxa, _txa, _rxb, _txb)
/* Generic macros */
#define MCFG_Z80SIO_OFFSETS(_rxa, _txa, _rxb, _txb) \
z80sio_device::configure_channels(*device, _rxa, _txa, _rxb, _txb);
#define MCFG_Z80SIO_OUT_INT_CB(_devcb) \
devcb = &z80sio_device::set_out_int_callback(*device, DEVCB_##_devcb);
// Port A callbacks
#define MCFG_Z80SIO_OUT_TXDA_CB(_devcb) \
devcb = &z80sio_device::set_out_txda_callback(*device, DEVCB_##_devcb);
@ -84,6 +93,13 @@
#define MCFG_Z80SIO_OUT_SYNCA_CB(_devcb) \
devcb = &z80sio_device::set_out_synca_callback(*device, DEVCB_##_devcb);
#define MCFG_Z80SIO_OUT_RXDRQA_CB(_devcb) \
devcb = &z80sio_device::set_out_rxdrqa_callback(*device, DEVCB_##_devcb);
#define MCFG_Z80SIO_OUT_TXDRQA_CB(_devcb) \
devcb = &z80sio_device::set_out_txdrqa_callback(*device, DEVCB_##_devcb);
// Port B callbacks
#define MCFG_Z80SIO_OUT_TXDB_CB(_devcb) \
devcb = &z80sio_device::set_out_txdb_callback(*device, DEVCB_##_devcb);
@ -99,15 +115,6 @@
#define MCFG_Z80SIO_OUT_SYNCB_CB(_devcb) \
devcb = &z80sio_device::set_out_syncb_callback(*device, DEVCB_##_devcb);
#define MCFG_Z80SIO_OUT_INT_CB(_devcb) \
devcb = &z80sio_device::set_out_int_callback(*device, DEVCB_##_devcb);
#define MCFG_Z80SIO_OUT_RXDRQA_CB(_devcb) \
devcb = &z80sio_device::set_out_rxdrqa_callback(*device, DEVCB_##_devcb);
#define MCFG_Z80SIO_OUT_TXDRQA_CB(_devcb) \
devcb = &z80sio_device::set_out_txdrqa_callback(*device, DEVCB_##_devcb);
#define MCFG_Z80SIO_OUT_RXDRQB_CB(_devcb) \
devcb = &z80sio_device::set_out_rxdrqb_callback(*device, DEVCB_##_devcb);
@ -403,7 +410,7 @@ class z80sio_device : public device_t,
{
friend class z80sio_channel;
public:
public:
// construction/destruction
z80sio_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source);
z80sio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
@ -486,7 +493,8 @@ protected:
enum
{
TYPE_Z80SIO
TYPE_Z80SIO = 0x001,
TYPE_UPD7201 = 0x002
};
enum
@ -526,8 +534,15 @@ protected:
int m_variant;
};
class upd7201N_device : public z80sio_device
{
public :
upd7201N_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
};
// device type definition
extern const device_type Z80SIO;
extern const device_type Z80SIO_CHANNEL;
extern const device_type UPD7201N;
#endif

View File

@ -102,20 +102,24 @@
*
* Known boards from Mizar:
*
*-Comp.Os.Vxworks diguest mailing list May 1992: VxWorks Drivers Available from Mizar:
* EMX 7320 Serial I/O Board
* EMX 7550 Ethernet Controller Board (AMD 7990 Lance) MAC: 00:80:F8 MIZAR, INC.
* MZX 414
* MZ 7122
* MZ 7132
* MZ 7300 Serial I/O Board (Z8530)
* EMX 7320 Serial I/O Board
* MZ 7400 Disk Controller Board (WD 2010; WD 1772)
* MZ 7500 IEEE-488 (GPIB) Interface Board
* EMX 7550 Ethernet Controller Board (AMD 7990 Lance) MAC: 00:80:F8 MIZAR, INC.
* MZ 7772
* MZ 7810 I/O Expansion Module (6681 DUART)
* MZ 7831 SCSI Expansion Module (WD 33C93A)
* MZ 7850 Ethernet Expansion Module (WD 83C690)
* MZ 8505 IEEE-488 (GPIB) Interface Board"
*- Other sources:
* MZ 8000 ??
* MZ 8105 3U 68000 CPU board
* MZ 8300 3U serial board, 2 NEC 7201 (Z80 DART) and 1 AMD CTS9513 5 x 16 bit Counter/Timer
* MZ 8115
* MZ 8300 3U serial board, 2 NEC 7201 and 1 AMD CTS9513 5 x 16 bit Counter/Timer
* MZ 8310 timing module 2 x AM9513
* MZ 8505 IEEE-488 (GPIB) Interface Board"
*
* From http://www.megalextoria.com/forum2/index.php?t=msg&goto=73945&
*--------------------------------------------------------------------
@ -155,25 +159,50 @@
* - Dump the ROMs (DONE)
* - Setup a working address map (DONE)
* - Add VME bus driver (Faked one)
* - understand what other device is expected in VME space ff0011-13
*
****************************************************************************/
#include "emu.h"
#include "cpu/m68000/m68000.h"
#include "machine/z80dart.h"
#include "bus/rs232/rs232.h"
#include "machine/clock.h"
#include "softlist.h"
// The board needs a SIO board to get a user interface so lets fake one until the VME devices is done
#define FAKEVME 1
// There are two user prom sockets
#define CARDSLOT 0
#if FAKEVME
#include "machine/z80sio.h"
#endif
#if CARDSLOT // Awaiting info on how to boot the user eproms
#include "bus/generic/slot.h"
#include "bus/generic/carts.h"
#endif
#define LOG(x) x
#define VERBOSE 0
#define LOGPRINT(x) { do { if (VERBOSE) logerror x; } while (0); }
#define LOG(x) {} LOGPRINT(x)
#define LOGR(x) {} LOGPRINT(x)
#define LOGSETUP(x) {} LOGPRINT(x)
#define LOGINT(x) {} LOGPRINT(x)
#if VERBOSE >= 2
#define logerror printf
#endif
#ifdef _MSC_VER
#define LLFORMAT "%I64%"
#define FUNCNAME __func__
#else
#define LLFORMAT "%lld"
#define FUNCNAME __PRETTY_FUNCTION__
#endif
/* These values are borrowed just to get the terminal going and should be replaced
* once a proper serial board hardware (ie MZ 8300) is found and emulated. */
@ -184,59 +213,56 @@ class mzr8105_state : public driver_device
{
public:
mzr8105_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device (mconfig, type, tag),
m_maincpu (*this, "maincpu")
,m_updterm(*this, "upd")
// ,m_cart(*this, "exp_rom1")
driver_device (mconfig, type, tag)
,m_maincpu (*this, "maincpu")
,m_updterm(*this, "upd")
#if CARDSLOT
,m_cart(*this, "exp_rom1")
#endif
{
}
DECLARE_READ16_MEMBER (vme_a24_r);
DECLARE_WRITE16_MEMBER (vme_a24_w);
DECLARE_READ16_MEMBER (vme_a16_r);
DECLARE_WRITE16_MEMBER (vme_a16_w);
virtual void machine_start () override;
DECLARE_WRITE_LINE_MEMBER (write_updterm_clock);
DECLARE_READ16_MEMBER (vme_a24_r);
DECLARE_WRITE16_MEMBER (vme_a24_w);
DECLARE_READ16_MEMBER (vme_a16_r);
DECLARE_WRITE16_MEMBER (vme_a16_w);
virtual void machine_start () override;
DECLARE_WRITE_LINE_MEMBER (write_updterm_clock);
#if CARDSLOT
// User EPROM/SRAM slot(s)
int mzr8105_load_cart(device_image_interface &image, generic_slot_device *slot);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER (exp1_load) { return mzr8105_load_cart(image, m_cart); }
DECLARE_READ16_MEMBER (read16_rom);
// User EPROM/SRAM slot(s)
int mzr8105_load_cart(device_image_interface &image, generic_slot_device *slot);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER (exp1_load) { return mzr8105_load_cart(image, m_cart); }
DECLARE_READ16_MEMBER (read16_rom);
#endif
protected:
private:
required_device<cpu_device> m_maincpu;
required_device<upd7201_device> m_updterm;
// Pointer to System ROMs needed by bootvect_r
// uint16_t *m_sysrom;
required_device<cpu_device> m_maincpu;
required_device<upd7201N_device> m_updterm;
#if CARDSLOT
uint16_t *m_usrrom;
required_device<generic_slot_device> m_cart;
uint16_t *m_usrrom;
required_device<generic_slot_device> m_cart;
#endif
};
static ADDRESS_MAP_START (mzr8105_mem, AS_PROGRAM, 16, mzr8105_state)
ADDRESS_MAP_UNMAP_HIGH
//AM_RANGE (0x000000, 0x000007) AM_ROM AM_READ (bootvect_r) /* Not verified */
AM_RANGE (0x000000, 0x003fff) AM_ROM /* System EPROM Area 16Kb OS9 DEBUG - not verified */
AM_RANGE (0x004000, 0x01ffff) AM_ROM /* System EPROM Area 112Kb for System ROM - not verified */
AM_RANGE (0x020000, 0x03ffff) AM_RAM /* Not verified */
//AM_RANGE (0x0a0000, 0x0bffff) AM_ROM /* User EPROM/SRAM Area, max 128Kb mapped by a cartslot */
//AM_RANGE (0x0c0080, 0x0c0081) AM_DEVREADWRITE8 ("aciaterm", acia6850_device, status_r, control_w, 0xff00)
//AM_RANGE (0x0c0082, 0x0c0083) AM_DEVREADWRITE8 ("aciaterm", acia6850_device, data_r, data_w, 0xff00)
AM_RANGE(0x100000, 0xfeffff) AM_READWRITE(vme_a24_r, vme_a24_w) /* VMEbus Rev B addresses (24 bits) - not verified */
//AM_RANGE(0xff0000, 0xffffff) AM_READWRITE(vme_a16_r, vme_a16_w) /* VMEbus Rev B addresses (16 bits) - not verified */
// Faking a Mizar 8300 SIO BOARD in VME A16 adress space
AM_RANGE (0xFF0000, 0xFF0001) AM_DEVREADWRITE8("upd", upd7201_device, da_r, da_w, 0x00ff) /* Dual serial port NEC uPD7201 */
AM_RANGE (0xFF0002, 0xFF0003) AM_DEVREADWRITE8("upd", upd7201_device, ca_r, ca_w, 0x00ff) /* Dual serial port NEC uPD7201 */
AM_RANGE (0xFF0004, 0xFF0005) AM_DEVREADWRITE8("upd", upd7201_device, db_r, db_w, 0x00ff) /* Dual serial port NEC uPD7201 */
AM_RANGE (0xFF0006, 0xFF0007) AM_DEVREADWRITE8("upd", upd7201_device, cb_r, cb_w, 0x00ff) /* Dual serial port NEC uPD7201 */
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE (0x000000, 0x003fff) AM_ROM AM_REGION("roms", 0x000000) /* System EPROM Area 16Kb OS9 DEBUG - not verified */
AM_RANGE (0x004000, 0x01ffff) AM_ROM AM_REGION("roms", 0x004000)/* System EPROM Area 112Kb for System ROM - not verified */
AM_RANGE (0x020000, 0x03ffff) AM_RAM /* Not verified */
// AM_RANGE (0x0a0000, 0x0bffff) AM_ROM /* User EPROM/SRAM Area, max 128Kb mapped by a cartslot */
// AM_RANGE(0x100000, 0xfeffff) AM_READWRITE(vme_a24_r, vme_a24_w) /* VMEbus Rev B addresses (24 bits) - not verified */
// AM_RANGE(0xff0000, 0xffffff) AM_READWRITE(vme_a16_r, vme_a16_w) /* VMEbus Rev B addresses (16 bits) - not verified */
#if FAKEVME
// Faking a Mizar 8300 SIO UPD7201 BOARD in VME A16 adress space
AM_RANGE (0xFF0000, 0xFF0001) AM_DEVREADWRITE8("upd", upd7201N_device, db_r, db_w, 0x00ff)
AM_RANGE (0xFF0002, 0xFF0003) AM_DEVREADWRITE8("upd", upd7201N_device, cb_r, cb_w, 0x00ff)
AM_RANGE (0xFF0004, 0xFF0005) AM_DEVREADWRITE8("upd", upd7201N_device, da_r, da_w, 0x00ff)
AM_RANGE (0xFF0006, 0xFF0007) AM_DEVREADWRITE8("upd", upd7201N_device, ca_r, ca_w, 0x00ff)
#endif
ADDRESS_MAP_END
/* Input ports */
@ -246,50 +272,50 @@ INPUT_PORTS_END
/* Start it up */
void mzr8105_state::machine_start ()
{
LOG (logerror ("machine_start\n"));
LOG(("%s()\n", FUNCNAME));
#if CARDSLOT
/* Map user ROM/RAM socket(s) */
if (m_cart->exists())
{
m_usrrom = (uint16_t*)m_cart->get_rom_base();
m_maincpu->space(AS_PROGRAM).install_read_handler(0xa0000, 0xbffff, read16_delegate(FUNC(generic_slot_device::read16_rom), (generic_slot_device*)m_cart));
}
/* Map user ROM/RAM socket(s) */
if (m_cart->exists())
{
m_usrrom = (uint16_t*)m_cart->get_rom_base();
m_maincpu->space(AS_PROGRAM).install_read_handler(0xa0000, 0xbffff, read16_delegate(FUNC(generic_slot_device::read16_rom), (generic_slot_device*)m_cart));
}
#endif
}
/* Dummy VME access methods until the VME bus device is ready for use */
READ16_MEMBER (mzr8105_state::vme_a24_r){
LOG (logerror ("vme_a24_r\n"));
return (uint16_t) 0;
LOG(("%s()\n", FUNCNAME));
return (uint16_t) 0;
}
WRITE16_MEMBER (mzr8105_state::vme_a24_w){
LOG (logerror ("vme_a24_w\n"));
LOG(("%s()\n", FUNCNAME));
}
READ16_MEMBER (mzr8105_state::vme_a16_r){
LOG (logerror ("vme_16_r\n"));
return (uint16_t) 0;
LOG(("%s()\n", FUNCNAME));
return (uint16_t) 0;
}
WRITE16_MEMBER (mzr8105_state::vme_a16_w){
LOG (logerror ("vme_a16_w\n"));
LOG(("%s()\n", FUNCNAME));
}
#if CARDSLOT
/*
* 4. The USER EPROM Area
* The USER EPROM Area
*/
// Implementation of static 2 x 64K EPROM in sockets U1/U3 as 16 bit wide cartridge for easier
// software handling. TODO: make configurable according to table above.
static MACHINE_CONFIG_FRAGMENT( mzr8105_eprom_sockets )
MCFG_GENERIC_CARTSLOT_ADD("exp_rom1", generic_plain_slot, "mzr8105_cart")
MCFG_GENERIC_EXTENSIONS("bin,rom")
MCFG_GENERIC_WIDTH(GENERIC_ROM16_WIDTH)
MCFG_GENERIC_ENDIAN(ENDIANNESS_BIG)
MCFG_GENERIC_LOAD(mzr8105_state, exp1_load)
// MCFG_SOFTWARE_LIST_ADD("cart_list", "mzr8105_cart")
MCFG_GENERIC_CARTSLOT_ADD("exp_rom1", generic_plain_slot, "mzr8105_cart")
MCFG_GENERIC_EXTENSIONS("bin,rom")
MCFG_GENERIC_WIDTH(GENERIC_ROM16_WIDTH)
MCFG_GENERIC_ENDIAN(ENDIANNESS_BIG)
MCFG_GENERIC_LOAD(mzr8105_state, exp1_load)
// MCFG_SOFTWARE_LIST_ADD("cart_list", "mzr8105_cart")
MACHINE_CONFIG_END
/***************************
@ -297,74 +323,72 @@ MACHINE_CONFIG_END
****************************/
int mzr8105_state::mzr8105_load_cart(device_image_interface &image, generic_slot_device *slot)
{
uint32_t size = slot->common_get_size("rom");
uint32_t size = slot->common_get_size("rom");
if (size > 0x20000) // Max 128Kb - not verified
{
LOG( printf("Cartridge size exceeding max size (128Kb): %d\n", size) );
image.seterror(IMAGE_ERROR_UNSPECIFIED, "Cartridge size exceeding max size (128Kb)");
return IMAGE_INIT_FAIL;
}
if (size > 0x20000) // Max 128Kb - not verified
{
LOG(("Cartridge size exceeding max size (128Kb): %d\n", size) );
image.seterror(IMAGE_ERROR_UNSPECIFIED, "Cartridge size exceeding max size (128Kb)");
return IMAGE_INIT_FAIL;
}
slot->rom_alloc(size, GENERIC_ROM16_WIDTH, ENDIANNESS_BIG);
slot->common_load_rom(slot->get_rom_base(), size, "rom");
slot->rom_alloc(size, GENERIC_ROM16_WIDTH, ENDIANNESS_BIG);
slot->common_load_rom(slot->get_rom_base(), size, "rom");
return IMAGE_INIT_PASS;
return IMAGE_INIT_PASS;
}
#endif
WRITE_LINE_MEMBER (mzr8105_state::write_updterm_clock){
m_updterm->txca_w (state);
m_updterm->rxca_w (state);
m_updterm->txcb_w (state);
m_updterm->rxcb_w (state);
}
/*
* Machine configuration
*/
static MACHINE_CONFIG_START (mzr8105, mzr8105_state)
/* basic machine hardware */
MCFG_CPU_ADD ("maincpu", M68000, XTAL_10MHz)
MCFG_CPU_PROGRAM_MAP (mzr8105_mem)
MCFG_CPU_ADD ("maincpu", M68000, XTAL_10MHz)
MCFG_CPU_PROGRAM_MAP (mzr8105_mem)
/* Terminal Port config */
MCFG_UPD7201_ADD("upd", XTAL_4MHz, 0, 0, 0, 0 )
MCFG_Z80DART_OUT_TXDA_CB(DEVWRITELINE("rs232trm", rs232_port_device, write_txd))
MCFG_Z80DART_OUT_DTRA_CB(DEVWRITELINE("rs232trm", rs232_port_device, write_dtr))
MCFG_Z80DART_OUT_RTSA_CB(DEVWRITELINE("rs232trm", rs232_port_device, write_rts))
MCFG_UPD7201_ADD("upd", XTAL_4MHz, 0, 0, 0, 0 )
MCFG_Z80SIO_OUT_TXDB_CB(DEVWRITELINE("rs232trm", rs232_port_device, write_txd))
MCFG_Z80SIO_OUT_DTRB_CB(DEVWRITELINE("rs232trm", rs232_port_device, write_dtr))
MCFG_Z80SIO_OUT_RTSB_CB(DEVWRITELINE("rs232trm", rs232_port_device, write_rts))
MCFG_RS232_PORT_ADD ("rs232trm", default_rs232_devices, "terminal")
MCFG_RS232_RXD_HANDLER (DEVWRITELINE ("upd", upd7201N_device, rxb_w))
MCFG_RS232_CTS_HANDLER (DEVWRITELINE ("upd", upd7201N_device, ctsb_w))
MCFG_RS232_PORT_ADD ("rs232trm", default_rs232_devices, "terminal")
MCFG_RS232_RXD_HANDLER (DEVWRITELINE ("upd", upd7201_device, rxa_w))
MCFG_RS232_CTS_HANDLER (DEVWRITELINE ("upd", upd7201_device, ctsa_w))
MCFG_DEVICE_ADD ("updterm_clock", CLOCK, UPD_CLOCK)
MCFG_CLOCK_SIGNAL_HANDLER (WRITELINE (mzr8105_state, write_updterm_clock))
MCFG_DEVICE_ADD ("updterm_clock", CLOCK, UPD_CLOCK)
MCFG_CLOCK_SIGNAL_HANDLER (WRITELINE (mzr8105_state, write_updterm_clock))
#if CARDSLOT
// EPROM sockets
MCFG_FRAGMENT_ADD(mzr8105_eprom_sockets)
MCFG_FRAGMENT_ADD(mzr8105_eprom_sockets)
#endif
MACHINE_CONFIG_END
/* ROM definitions */
ROM_START (mzr8105)
ROM_REGION (0x1000000, "maincpu", 0)
ROM_LOAD16_BYTE ("mzros9LB.bin", 0x000001, 0x2000, CRC (7c6a354d) SHA1 (2721eb649c8046dbcb517a36a97dc0816cd133f2))
ROM_LOAD16_BYTE ("mzros9HB.bin", 0x000000, 0x2000, CRC (d18e69a6) SHA1 (a00b68f4d649bcc09a29361f8692e52be12b3792))
/*
* System ROM information
*
* The ROMs contains an OS9 bootloader. It is position independent but reset vector suggests that it sits flat on adress 0 (zero)
*
* We got a prompt but the command reportoair are very sparse to non OS9 users so investigation needed.
*
/* UPD7201 init sequence
* :upd B Reg 02 <- 04 Interrupt vector
* :upd B Reg 06 <- 00 Sync byte
* :upd B Reg 07 <- 00 Sync byte
* :upd B Reg 03 <- c1 Rx 8 bit chars + Rx enable
* :upd B Reg 04 <- 44 16x clock, 1 stop bit ( == async mode), no parity
* :upd B Reg 05 <- 68 Tx 8 bit chars + Tx enable
*/
ROM_START (mzr8105)
ROM_REGION (0x20000, "roms", 0)
/* The ROMs contains an OS9 bootloader. It is position independent but reset vector suggests that it sits flat on adress 0 (zero) */
ROM_LOAD16_BYTE ("mzros9LB.bin", 0x000000, 0x2000, CRC (7c6a354d) SHA1 (2721eb649c8046dbcb517a36a97dc0816cd133f2))
ROM_LOAD16_BYTE ("mzros9HB.bin", 0x000001, 0x2000, CRC (d18e69a6) SHA1 (a00b68f4d649bcc09a29361f8692e52be12b3792))
ROM_END
/* Driver */
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
COMP (1987, mzr8105, 0, 0, mzr8105, mzr8105, driver_device, 0, "Mizar Inc", "Mizar VME8105", MACHINE_IS_SKELETON )
COMP (1987, mzr8105, 0, 0, mzr8105, mzr8105, driver_device, 0, "Mizar Inc", "Mizar VME8105", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_TYPE_COMPUTER )