summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/sun3.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/sun3.cpp')
-rw-r--r--src/mame/drivers/sun3.cpp73
1 files changed, 72 insertions, 1 deletions
diff --git a/src/mame/drivers/sun3.cpp b/src/mame/drivers/sun3.cpp
index 76f36d39ee0..0e51c328214 100644
--- a/src/mame/drivers/sun3.cpp
+++ b/src/mame/drivers/sun3.cpp
@@ -187,9 +187,14 @@ fefc34a - start of mem_size, which queries ECC registers for each memory board
#include "machine/timekpr.h"
#include "machine/timer.h"
#include "machine/z80scc.h"
+#include "machine/am79c90.h"
+#include "machine/ncr5380n.h"
+#include "machine/nscsi_cd.h"
+#include "machine/nscsi_hd.h"
#include "bus/rs232/rs232.h"
#include "bus/sunkbd/sunkbd.h"
+#include "bus/sunmouse/sunmouse.h"
#include "screen.h"
@@ -200,6 +205,7 @@ fefc34a - start of mem_size, which queries ECC registers for each memory board
#define RS232A_TAG "rs232a"
#define RS232B_TAG "rs232b"
#define KEYBOARD_TAG "keyboard"
+#define MOUSE_TAG "mouseport"
// page table entry constants
#define PM_VALID (0x80000000) // page is valid
@@ -225,6 +231,8 @@ public:
m_maincpu(*this, "maincpu"),
m_scc1(*this, SCC1_TAG),
m_scc2(*this, SCC2_TAG),
+ m_scsibus(*this, "scsibus"),
+ m_scsi(*this, "scsibus:7:ncr5380"),
m_p_ram(*this, "p_ram"),
m_bw2_vram(*this, "bw2_vram"),
m_type0space(*this, "type0"),
@@ -233,7 +241,8 @@ public:
m_type3space(*this, "type3"),
m_rom(*this, "user1"),
m_idprom(*this, "idprom"),
- m_ram(*this, RAM_TAG)
+ m_ram(*this, RAM_TAG),
+ m_lance(*this, "lance")
{ }
void sun3(machine_config &config);
@@ -242,10 +251,15 @@ public:
void sun3200(machine_config &config);
void sun3_50(machine_config &config);
+ void ncr5380(device_t *device);
+
private:
required_device<m68020_device> m_maincpu;
required_device<z80scc_device> m_scc1;
required_device<z80scc_device> m_scc2;
+ required_device<nscsi_bus_device> m_scsibus;
+ required_device<ncr5380n_device> m_scsi;
+
virtual void machine_start() override;
virtual void machine_reset() override;
@@ -254,6 +268,7 @@ private:
optional_device<address_map_bank_device> m_type0space, m_type1space, m_type2space, m_type3space;
required_memory_region m_rom, m_idprom;
required_device<ram_device> m_ram;
+ required_device<am79c90_device> m_lance;
DECLARE_READ32_MEMBER( tl_mmu_r );
DECLARE_WRITE32_MEMBER( tl_mmu_w );
@@ -295,6 +310,27 @@ private:
uint32_t m_cache_tags[0x4000], m_cache_data[0x4000];
};
+static void sun_cdrom(device_t *device)
+{
+ downcast<nscsi_cdrom_device &>(*device).set_block_size(512);
+}
+
+void sun3_state::ncr5380(device_t *device)
+{
+ devcb_base *devcb;
+ (void)devcb;
+ MCFG_DEVICE_CLOCK(10000000)
+// MCFG_NCR5380N_DRQ_HANDLER(WRITELINE(*this, sun3_state, drq_w))
+}
+
+static void scsi_devices(device_slot_interface &device)
+{
+ device.option_add("cdrom", NSCSI_CDROM);
+ device.option_add("harddisk", NSCSI_HARDDISK);
+ device.option_add_internal("ncr5380", NCR5380N);
+ device.set_option_machine_config("cdrom", sun_cdrom);
+}
+
READ32_MEMBER( sun3_state::ram_r )
{
if (m_ecc[0] == 0x10c00000)
@@ -750,6 +786,8 @@ void sun3_state::vmetype1space_map(address_map &map)
map(0x00080000, 0x0008000f).rw(FUNC(sun3_state::parity_r), FUNC(sun3_state::parity_w));
map(0x000a0000, 0x000a0003).rw(FUNC(sun3_state::irqctrl_r), FUNC(sun3_state::irqctrl_w));
map(0x00100000, 0x0010ffff).rom().region("user1", 0);
+ map(0x00120000, 0x00120003).rw(m_lance, FUNC(am79c90_device::regs_r), FUNC(am79c90_device::regs_w));
+ map(0x00140000, 0x00140007).rw(m_scsi, FUNC(ncr5380n_device::read), FUNC(ncr5380n_device::write)).umask32(0xffffffff);
map(0x001e0000, 0x001e00ff).rw(FUNC(sun3_state::ecc_r), FUNC(sun3_state::ecc_w));
}
@@ -1001,9 +1039,12 @@ MACHINE_CONFIG_START(sun3_state::sun3)
SCC8530N(config, m_scc1, 4.9152_MHz_XTAL);
m_scc1->out_txda_callback().set(KEYBOARD_TAG, FUNC(sun_keyboard_port_device::write_txd));
+ m_scc1->out_txdb_callback().set(MOUSE_TAG, FUNC(sun_mouse_port_device::write_txd));
SUNKBD_PORT(config, KEYBOARD_TAG, default_sun_keyboard_devices, "type3hle").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxa_w));
+ SUNMOUSE_PORT(config, MOUSE_TAG, default_sun_mouse_devices, "hle1200").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxb_w));
+
SCC8530N(config, m_scc2, 4.9152_MHz_XTAL);
m_scc2->out_txda_callback().set(RS232A_TAG, FUNC(rs232_port_device::write_txd));
m_scc2->out_txdb_callback().set(RS232B_TAG, FUNC(rs232_port_device::write_txd));
@@ -1017,6 +1058,19 @@ MACHINE_CONFIG_START(sun3_state::sun3)
MCFG_RS232_RXD_HANDLER(WRITELINE(m_scc2, z80scc_device, rxb_w))
MCFG_RS232_DCD_HANDLER(WRITELINE(m_scc2, z80scc_device, dcdb_w))
MCFG_RS232_CTS_HANDLER(WRITELINE(m_scc2, z80scc_device, ctsb_w))
+
+ AM79C90(config, m_lance, 10'000'000); // clock is a guess
+
+ MCFG_NSCSI_BUS_ADD("scsibus")
+ MCFG_NSCSI_ADD("scsibus:0", scsi_devices, nullptr, false)
+ MCFG_NSCSI_ADD("scsibus:1", scsi_devices, "harddisk", false)
+ MCFG_NSCSI_ADD("scsibus:2", scsi_devices, nullptr, false)
+ MCFG_NSCSI_ADD("scsibus:3", scsi_devices, nullptr, false)
+ MCFG_NSCSI_ADD("scsibus:4", scsi_devices, nullptr, false)
+ MCFG_NSCSI_ADD("scsibus:5", scsi_devices, nullptr, false)
+ MCFG_NSCSI_ADD("scsibus:6", scsi_devices, "cdrom", false)
+ MCFG_NSCSI_ADD("scsibus:7", scsi_devices, "ncr5380", true)
+ MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr5380", [this] (device_t *device) { ncr5380(device); })
MACHINE_CONFIG_END
// Sun 3/60
@@ -1035,6 +1089,7 @@ MACHINE_CONFIG_END
// Sun 3/E
MACHINE_CONFIG_START(sun3_state::sun3e)
sun3(config);
+
MCFG_DEVICE_REPLACE("maincpu", M68020, 20000000)
MCFG_DEVICE_PROGRAM_MAP(sun3_mem)
MACHINE_CONFIG_END
@@ -1059,6 +1114,8 @@ MACHINE_CONFIG_START(sun3_state::sun3_50)
MCFG_DEVICE_ADD("maincpu", M68020, 15700000)
MCFG_DEVICE_PROGRAM_MAP(sun3_mem)
+ AM79C90(config, m_lance, 10'000'000); // clock is a guess
+
MCFG_SCREEN_ADD("bwtwo", RASTER)
MCFG_SCREEN_UPDATE_DRIVER(sun3_state, bw2_350_update)
MCFG_SCREEN_SIZE(1600,1100)
@@ -1085,9 +1142,12 @@ MACHINE_CONFIG_START(sun3_state::sun3_50)
SCC8530N(config, m_scc1, 4.9152_MHz_XTAL);
m_scc1->out_txda_callback().set(KEYBOARD_TAG, FUNC(sun_keyboard_port_device::write_txd));
+ m_scc1->out_txdb_callback().set(MOUSE_TAG, FUNC(sun_mouse_port_device::write_txd));
SUNKBD_PORT(config, KEYBOARD_TAG, default_sun_keyboard_devices, "type3hle").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxa_w));
+ SUNMOUSE_PORT(config, MOUSE_TAG, default_sun_mouse_devices, "hle1200").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxb_w));
+
SCC8530N(config, m_scc2, 4.9152_MHz_XTAL);
m_scc2->out_txda_callback().set(RS232A_TAG, FUNC(rs232_port_device::write_txd));
m_scc2->out_txdb_callback().set(RS232B_TAG, FUNC(rs232_port_device::write_txd));
@@ -1101,6 +1161,17 @@ MACHINE_CONFIG_START(sun3_state::sun3_50)
MCFG_RS232_RXD_HANDLER(WRITELINE(m_scc2, z80scc_device, rxb_w))
MCFG_RS232_DCD_HANDLER(WRITELINE(m_scc2, z80scc_device, dcdb_w))
MCFG_RS232_CTS_HANDLER(WRITELINE(m_scc2, z80scc_device, ctsb_w))
+
+ MCFG_NSCSI_BUS_ADD("scsibus")
+ MCFG_NSCSI_ADD("scsibus:0", scsi_devices, nullptr, false)
+ MCFG_NSCSI_ADD("scsibus:1", scsi_devices, "harddisk", false)
+ MCFG_NSCSI_ADD("scsibus:2", scsi_devices, nullptr, false)
+ MCFG_NSCSI_ADD("scsibus:3", scsi_devices, nullptr, false)
+ MCFG_NSCSI_ADD("scsibus:4", scsi_devices, nullptr, false)
+ MCFG_NSCSI_ADD("scsibus:5", scsi_devices, nullptr, false)
+ MCFG_NSCSI_ADD("scsibus:6", scsi_devices, "cdrom", false)
+ MCFG_NSCSI_ADD("scsibus:7", scsi_devices, "ncr5380", true)
+ MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr5380", [this] (device_t *device) { ncr5380(device); })
MACHINE_CONFIG_END
/* ROM definition */