(MESS) abc800: Xebec WIP. (nw)

This commit is contained in:
Curt Coder 2013-10-25 19:40:41 +00:00
parent 6812ae93ef
commit 85e1ff6ff8
5 changed files with 382 additions and 23 deletions

View File

@ -150,7 +150,7 @@ static ADDRESS_MAP_START( luxor_55_21046_io, AS_IO, 8, luxor_55_21046_device )
AM_RANGE(0x50, 0x50) AM_MIRROR(0xff0f) AM_MASK(0xff00) AM_READ(_9a_r)
AM_RANGE(0x60, 0x63) AM_MIRROR(0xff0c) AM_DEVREAD(SAB1793_TAG, fd1793_t, read)
AM_RANGE(0x70, 0x73) AM_MIRROR(0xff0c) AM_DEVWRITE(SAB1793_TAG, fd1793_t, write)
AM_RANGE(0x80, 0x80) AM_MIRROR(0xff0f) AM_DEVREADWRITE_LEGACY(Z80DMA_TAG, z80dma_r, z80dma_w)
AM_RANGE(0x80, 0x80) AM_MIRROR(0xff0f) AM_DEVREADWRITE(Z80DMA_TAG, z80dma_device, read, write)
ADDRESS_MAP_END
@ -547,6 +547,16 @@ void luxor_55_21046_device::abcbus_c3(UINT8 data)
}
//-------------------------------------------------
// abcbus_c4 -
//-------------------------------------------------
void luxor_55_21046_device::abcbus_c4(UINT8 data)
{
// TODO connected to PAL16R4 pin 2
}
//**************************************************************************
// IMPLEMENTATION

View File

@ -92,6 +92,7 @@ protected:
virtual UINT8 abcbus_stat();
virtual void abcbus_c1(UINT8 data);
virtual void abcbus_c3(UINT8 data);
virtual void abcbus_c4(UINT8 data);
private:
required_device<cpu_device> m_maincpu;

View File

@ -21,6 +21,9 @@
#define Z80DMA_TAG "6a"
#define SASIBUS_TAG "sasi"
#define STAT_DIR \
BIT(m_stat, 6)
//**************************************************************************
@ -58,7 +61,10 @@ const rom_entry *luxor_55_21056_device::device_rom_region() const
//-------------------------------------------------
static ADDRESS_MAP_START( luxor_55_21056_mem, AS_PROGRAM, 8, luxor_55_21056_device )
AM_RANGE(0x0000, 0x07ff) AM_ROM AM_REGION(Z80_TAG, 0)
ADDRESS_MAP_UNMAP_HIGH
ADDRESS_MAP_GLOBAL_MASK(0x3fff)
AM_RANGE(0x0000, 0x07ff) AM_MIRROR(0x1800) AM_ROM AM_REGION(Z80_TAG, 0)
AM_RANGE(0x2000, 0x3fff) AM_RAM
ADDRESS_MAP_END
@ -67,6 +73,17 @@ ADDRESS_MAP_END
//-------------------------------------------------
static ADDRESS_MAP_START( luxor_55_21056_io, AS_IO, 8, luxor_55_21056_device )
ADDRESS_MAP_UNMAP_HIGH
ADDRESS_MAP_GLOBAL_MASK(0xf8)
AM_RANGE(0x00, 0x00) AM_MIRROR(0xf0) AM_DEVREADWRITE(Z80DMA_TAG, z80dma_device, read, write)
AM_RANGE(0x08, 0x08) AM_READ(sasi_status_r)
AM_RANGE(0x18, 0x18) AM_WRITE(stat_w)
AM_RANGE(0x28, 0x28) AM_READ(out_r)
AM_RANGE(0x38, 0x38) AM_WRITE(inp_w)
AM_RANGE(0x48, 0x48) AM_READWRITE(sasi_data_r, sasi_data_w)
AM_RANGE(0x58, 0x58) AM_READWRITE(rdy_reset_r, rdy_reset_w)
AM_RANGE(0x68, 0x68) AM_READWRITE(sasi_sel_r, sasi_sel_w)
AM_RANGE(0x78, 0x78) AM_READWRITE(sasi_rst_r, sasi_rst_w)
ADDRESS_MAP_END
@ -76,7 +93,8 @@ ADDRESS_MAP_END
static const z80_daisy_config daisy_chain[] =
{
{ Z80DMA_TAG }
{ Z80DMA_TAG },
{ NULL }
};
@ -84,28 +102,24 @@ static const z80_daisy_config daisy_chain[] =
// Z80DMA_INTERFACE( dma_intf )
//-------------------------------------------------
READ8_MEMBER(luxor_55_21056_device::memory_read_byte)
READ8_MEMBER( luxor_55_21056_device::memory_read_byte )
{
address_space& prog_space = m_maincpu->space(AS_PROGRAM);
return prog_space.read_byte(offset);
return m_maincpu->space(AS_PROGRAM).read_byte(offset);
}
WRITE8_MEMBER(luxor_55_21056_device::memory_write_byte)
WRITE8_MEMBER( luxor_55_21056_device::memory_write_byte )
{
address_space& prog_space = m_maincpu->space(AS_PROGRAM);
return prog_space.write_byte(offset, data);
return m_maincpu->space(AS_PROGRAM).write_byte(offset, data);
}
READ8_MEMBER(luxor_55_21056_device::io_read_byte)
READ8_MEMBER( luxor_55_21056_device::io_read_byte )
{
address_space& prog_space = m_maincpu->space(AS_IO);
return prog_space.read_byte(offset);
return m_maincpu->space(AS_IO).read_byte(offset);
}
WRITE8_MEMBER(luxor_55_21056_device::io_write_byte)
WRITE8_MEMBER( luxor_55_21056_device::io_write_byte )
{
address_space& prog_space = m_maincpu->space(AS_IO);
return prog_space.write_byte(offset, data);
return m_maincpu->space(AS_IO).write_byte(offset, data);
}
static Z80DMA_INTERFACE( dma_intf )
@ -119,6 +133,31 @@ static Z80DMA_INTERFACE( dma_intf )
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, luxor_55_21056_device, io_write_byte),
};
WRITE_LINE_MEMBER( luxor_55_21056_device::sasi_bsy_w )
{
if (state)
{
m_sasibus->scsi_sel_w(0);
}
}
WRITE_LINE_MEMBER( luxor_55_21056_device::sasi_io_w )
{
if (!state)
{
m_sasibus->scsi_data_w(m_sasi_data ^ 0xff);
}
}
WRITE_LINE_MEMBER( luxor_55_21056_device::sasi_req_w )
{
if (state)
{
m_req = 1;
m_sasibus->scsi_ack_w(!m_req);
}
}
//-------------------------------------------------
// MACHINE_DRIVER( luxor_55_21056 )
@ -135,6 +174,9 @@ static MACHINE_CONFIG_FRAGMENT( luxor_55_21056 )
MCFG_SCSIBUS_ADD(SASIBUS_TAG)
MCFG_SCSIDEV_ADD(SASIBUS_TAG ":harddisk0", SCSIHD, SCSI_ID_0)
MCFG_SCSICB_ADD(SASIBUS_TAG ":host")
MCFG_SCSICB_BSY_HANDLER(DEVWRITELINE(DEVICE_SELF_OWNER, luxor_55_21056_device, sasi_bsy_w))
MCFG_SCSICB_IO_HANDLER(DEVWRITELINE(DEVICE_SELF_OWNER, luxor_55_21056_device, sasi_io_w))
MCFG_SCSICB_REQ_HANDLER(DEVWRITELINE(DEVICE_SELF_OWNER, luxor_55_21056_device, sasi_req_w))
MACHINE_CONFIG_END
@ -162,7 +204,13 @@ luxor_55_21056_device::luxor_55_21056_device(const machine_config &mconfig, cons
: device_t(mconfig, LUXOR_55_21056, "ABC XEBEC", tag, owner, clock, "luxor_55_21056", __FILE__),
device_abcbus_card_interface(mconfig, *this),
m_maincpu(*this, Z80_TAG),
m_sasibus(*this, SASIBUS_TAG)
m_dma(*this, Z80DMA_TAG),
m_sasibus(*this, SASIBUS_TAG ":host"),
m_cs(0),
m_rdy(0),
m_req(1),
m_stat(0),
m_sasi_data(0)
{
}
@ -182,6 +230,7 @@ void luxor_55_21056_device::device_start()
void luxor_55_21056_device::device_reset()
{
m_stat = 0;
}
@ -197,3 +246,265 @@ void luxor_55_21056_device::device_reset()
void luxor_55_21056_device::abcbus_cs(UINT8 data)
{
}
//-------------------------------------------------
// abcbus_stat -
//-------------------------------------------------
UINT8 luxor_55_21056_device::abcbus_stat()
{
UINT8 data = 0xff;
if (m_cs)
{
data = m_stat & 0xfe;
data |= m_rdy;
}
return data;
}
//-------------------------------------------------
// abcbus_inp -
//-------------------------------------------------
UINT8 luxor_55_21056_device::abcbus_inp()
{
UINT8 data = 0xff;
if (m_cs && !STAT_DIR)
{
data = m_inp;
set_rdy(!m_rdy);
}
return data;
}
//-------------------------------------------------
// abcbus_utp -
//-------------------------------------------------
void luxor_55_21056_device::abcbus_utp(UINT8 data)
{
if (m_cs)
{
m_out = data;
set_rdy(!m_rdy);
}
}
//-------------------------------------------------
// abcbus_c1 -
//-------------------------------------------------
void luxor_55_21056_device::abcbus_c1(UINT8 data)
{
if (m_cs)
{
m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
}
}
//-------------------------------------------------
// abcbus_c3 -
//-------------------------------------------------
void luxor_55_21056_device::abcbus_c3(UINT8 data)
{
if (m_cs)
{
m_maincpu->reset();
}
}
//-------------------------------------------------
// sasi_status_r -
//-------------------------------------------------
READ8_MEMBER( luxor_55_21056_device::sasi_status_r )
{
/*
bit description
0 RDY
1 REQ
2 I/O
3 C/D
4 MSG
5 BSY
6
7
*/
UINT8 data = 0;
data |= m_rdy;
data |= (!m_req || !m_sasibus->scsi_req_r()) << 1;
data |= !m_sasibus->scsi_io_r() << 2;
data |= m_sasibus->scsi_cd_r() << 3;
data |= m_sasibus->scsi_msg_r() << 4;
data |= m_sasibus->scsi_bsy_r() << 5;
return data ^ 0xff;
}
//-------------------------------------------------
// stat_w -
//-------------------------------------------------
WRITE8_MEMBER( luxor_55_21056_device::stat_w )
{
m_stat = data;
}
//-------------------------------------------------
// out_r -
//-------------------------------------------------
READ8_MEMBER( luxor_55_21056_device::out_r )
{
UINT8 data = m_out;
set_rdy(!m_rdy);
return data;
}
//-------------------------------------------------
// inp_w -
//-------------------------------------------------
WRITE8_MEMBER( luxor_55_21056_device::inp_w )
{
m_inp = data;
set_rdy(!m_rdy);
}
//-------------------------------------------------
// sasi_data_r -
//-------------------------------------------------
READ8_MEMBER( luxor_55_21056_device::sasi_data_r )
{
UINT8 data = m_sasibus->scsi_data_r();
m_req = !m_sasibus->scsi_req_r();
m_sasibus->scsi_ack_w(!m_req);
return data ^ 0xff;
}
//-------------------------------------------------
// sasi_data_w -
//-------------------------------------------------
WRITE8_MEMBER( luxor_55_21056_device::sasi_data_w )
{
m_sasi_data = data;
if (!m_sasibus->scsi_io_r())
{
m_sasibus->scsi_data_w(m_sasi_data ^ 0xff);
}
m_req = !m_sasibus->scsi_req_r();
m_sasibus->scsi_ack_w(!m_req);
}
//-------------------------------------------------
// rdy_reset_r -
//-------------------------------------------------
READ8_MEMBER( luxor_55_21056_device::rdy_reset_r )
{
rdy_reset_w(space, offset, 0xff);
return 0xff;
}
//-------------------------------------------------
// rdy_reset_w -
//-------------------------------------------------
WRITE8_MEMBER( luxor_55_21056_device::rdy_reset_w )
{
set_rdy(STAT_DIR);
}
//-------------------------------------------------
// sasi_sel_r -
//-------------------------------------------------
READ8_MEMBER( luxor_55_21056_device::sasi_sel_r )
{
sasi_sel_w(space, offset, 0xff);
return 0xff;
}
//-------------------------------------------------
// sasi_sel_w -
//-------------------------------------------------
WRITE8_MEMBER( luxor_55_21056_device::sasi_sel_w )
{
m_sasibus->scsi_sel_w(m_sasibus->scsi_bsy_r());
}
//-------------------------------------------------
// sasi_rst_r -
//-------------------------------------------------
READ8_MEMBER( luxor_55_21056_device::sasi_rst_r )
{
sasi_rst_w(space, offset, 0xff);
return 0xff;
}
//-------------------------------------------------
// sasi_rst_w -
//-------------------------------------------------
WRITE8_MEMBER( luxor_55_21056_device::sasi_rst_w )
{
m_sasibus->scsi_rst_w(1);
m_sasibus->scsi_rst_w(0);
}
//-------------------------------------------------
// set_rdy -
//-------------------------------------------------
void luxor_55_21056_device::set_rdy(int state)
{
m_rdy = state;
m_dma->rdy_w(m_rdy);
}

View File

@ -11,8 +11,8 @@
#pragma once
#ifndef __ABC_XEBEC__
#define __ABC_XEBEC__
#ifndef __LUXOR_55_21056__
#define __LUXOR_55_21056__
#include "emu.h"
#include "abcbus.h"
@ -21,6 +21,7 @@
#include "machine/scsibus.h"
#include "machine/scsicb.h"
#include "machine/scsihd.h"
#include "machine/z80dma.h"
@ -41,10 +42,27 @@ public:
virtual const rom_entry *device_rom_region() const;
virtual machine_config_constructor device_mconfig_additions() const;
DECLARE_READ8_MEMBER(memory_read_byte);
DECLARE_WRITE8_MEMBER(memory_write_byte);
DECLARE_READ8_MEMBER(io_read_byte);
DECLARE_WRITE8_MEMBER(io_write_byte);
DECLARE_READ8_MEMBER( sasi_status_r );
DECLARE_WRITE8_MEMBER( stat_w );
DECLARE_READ8_MEMBER( out_r );
DECLARE_WRITE8_MEMBER( inp_w );
DECLARE_READ8_MEMBER( sasi_data_r );
DECLARE_WRITE8_MEMBER( sasi_data_w );
DECLARE_READ8_MEMBER( rdy_reset_r );
DECLARE_WRITE8_MEMBER( rdy_reset_w );
DECLARE_READ8_MEMBER( sasi_sel_r );
DECLARE_WRITE8_MEMBER( sasi_sel_w );
DECLARE_READ8_MEMBER( sasi_rst_r );
DECLARE_WRITE8_MEMBER( sasi_rst_w );
DECLARE_READ8_MEMBER( memory_read_byte );
DECLARE_WRITE8_MEMBER( memory_write_byte );
DECLARE_READ8_MEMBER( io_read_byte );
DECLARE_WRITE8_MEMBER( io_write_byte );
DECLARE_WRITE_LINE_MEMBER( sasi_bsy_w );
DECLARE_WRITE_LINE_MEMBER( sasi_io_w );
DECLARE_WRITE_LINE_MEMBER( sasi_req_w );
protected:
// device-level overrides
@ -53,10 +71,27 @@ protected:
// device_abcbus_interface overrides
virtual void abcbus_cs(UINT8 data);
virtual UINT8 abcbus_inp();
virtual void abcbus_utp(UINT8 data);
virtual UINT8 abcbus_stat();
virtual void abcbus_c1(UINT8 data);
virtual void abcbus_c3(UINT8 data);
private:
void set_rdy(int state);
required_device<cpu_device> m_maincpu;
required_device<scsibus_device> m_sasibus;
required_device<z80dma_device> m_dma;
required_device<scsicb_device> m_sasibus;
int m_cs;
int m_rdy;
int m_req;
UINT8 m_inp;
UINT8 m_out;
UINT8 m_stat;
UINT8 m_sasi_data;
};

View File

@ -85,6 +85,8 @@ public:
UINT8 read();
void write(UINT8 data);
DECLARE_READ8_MEMBER( read ) { return read(); }
DECLARE_WRITE8_MEMBER( write ) { write(data); }
void rdy_w(int state);
void wait_w(int state);