summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/next.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/next.cpp')
-rw-r--r--src/mame/drivers/next.cpp1235
1 files changed, 0 insertions, 1235 deletions
diff --git a/src/mame/drivers/next.cpp b/src/mame/drivers/next.cpp
deleted file mode 100644
index a999b0d64d3..00000000000
--- a/src/mame/drivers/next.cpp
+++ /dev/null
@@ -1,1235 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Olivier Galibert
-/***************************************************************************
-
- NeXT
-
- TODO:
-
- - Hook up the sound output, it is shared with the keyboard port
-
- - Implement more of the scc and its dma interactions so that the
- start up test passes, but not before sound out is done (if the scc
- test passes all the other test pass up to sound out which
- infloops)
-
- - Really implement the MO, it's only faking it for the startup test right now
-
- - Fix the networking
-
- - Find out why netbsd goes to hell even before loading the kernel
-
- Memory map and other bits can be found here:
- http://fxr.watson.org/fxr/source/arch/next68k/include/cpu.h?v=NETBSD5#L366
-
-****************************************************************************/
-
-
-#include "emu.h"
-#include "includes/next.h"
-
-#include "bus/nscsi/cd.h"
-#include "bus/nscsi/hd.h"
-#include "screen.h"
-#include "softlist.h"
-
-#include "formats/mfi_dsk.h"
-#include "formats/pc_dsk.h"
-
-
-uint32_t next_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
-{
- // We don't handle partial updates, but we don't generate them either :-)
- if(cliprect.min_x || cliprect.min_y || cliprect.max_x+1 != screen_sx || cliprect.max_y+1 != screen_sy)
- return 0;
-
- // 0,1,2,4=0b000000, 3=2c000000, 5,8,9=0c000000
- // 1152x832 (0,1,2,3c,4)
- // 1120x832 (8)
- // 832x624 (5c,9c)
- if(screen_color) {
- const uint32_t *vr = vram;
- for(int y=0; y<screen_sy; y++) {
- uint32_t *pix = reinterpret_cast<uint32_t *>(bitmap.raw_pixptr(y));
- for(int x=0; x<screen_sx; x+=2) {
- uint32_t v = *vr++;
- for(int xi=0; xi<2; xi++) {
- uint16_t pen = (v >> (16-(xi*16))) & 0xffff;
- uint32_t r = (pen & 0xf000) >> 12;
- uint32_t g = (pen & 0x0f00) >> 8;
- uint32_t b = (pen & 0x00f0) >> 4;
- uint32_t col = (r << 20) | (r << 16) | (g << 12) | (g << 8) | (b << 4) | b;
- *pix++ = col;
- }
- }
- vr += screen_skip;
- }
- } else {
- static uint32_t colors[4] = { 0xffffff, 0xaaaaaa, 0x555555, 0x000000 };
- const uint32_t *vr = vram;
- for(int y=0; y<screen_sy; y++) {
- uint32_t *pix = reinterpret_cast<uint32_t *>(bitmap.raw_pixptr(y));
- for(int x=0; x<screen_sx; x+=16) {
- uint32_t v = *vr++;
- for(int xi=0; xi<16; xi++)
- *pix++ = colors[(v >> (30-(xi*2))) & 0x3];
- }
- vr += screen_skip;
- }
- }
-
- return 0;
-}
-
-/* map ROM at 0x01000000-0x0101ffff? */
-READ32_MEMBER( next_state::rom_map_r )
-{
- if(0 && !machine().side_effects_disabled())
- printf("%08x ROM MAP?\n",maincpu->pc());
- return 0x01000000;
-}
-
-READ32_MEMBER( next_state::scr2_r )
-{
- if(0 && !machine().side_effects_disabled())
- printf("%08x\n",maincpu->pc());
- /*
- x--- ---- ---- ---- ---- ---- ---- ---- dsp reset
- -x-- ---- ---- ---- ---- ---- ---- ---- dsp block end
- --x- ---- ---- ---- ---- ---- ---- ---- dsp unpacked
- ---x ---- ---- ---- ---- ---- ---- ---- dsp mode b
- ---- x--- ---- ---- ---- ---- ---- ---- dsp mode a
- ---- -x-- ---- ---- ---- ---- ---- ---- remote int
- ---- ---x ---- ---- ---- ---- ---- ---- local int
- ---- ---- ---x ---- ---- ---- ---- ---- dram 256k
- ---- ---- ---- ---x ---- ---- ---- ---- dram 1m
- ---- ---- ---- ---- x--- ---- ---- ---- "timer on ipl7"
- ---- ---- ---- ---- -xxx ---- ---- ---- rom waitstates
- ---- ---- ---- ---- ---- x--- ---- ---- ROM 1M
- ---- ---- ---- ---- ---- -x-- ---- ---- MCS1850 rtdata
- ---- ---- ---- ---- ---- --x- ---- ---- MCS1850 rtclk
- ---- ---- ---- ---- ---- ---x ---- ---- MCS1850 rtce
- ---- ---- ---- ---- ---- ---- x--- ---- rom overlay
- ---- ---- ---- ---- ---- ---- -x-- ---- dsp ie
- ---- ---- ---- ---- ---- ---- --x- ---- mem en
- ---- ---- ---- ---- ---- ---- ---- ---x led
-
- 68040-25, 100ns, 32M: 00000c80
- 68040-25, 100ns, 20M: 00ff0c80
-
- */
-
- uint32_t data = scr2 & 0xfffffbff;
-
- data |= rtc->sdo_r() << 10;
-
- return data;
-}
-
-WRITE32_MEMBER( next_state::scr2_w )
-{
- if(0 && !machine().side_effects_disabled())
- printf("scr2_w %08x (%08x)\n", data, maincpu->pc());
- COMBINE_DATA(&scr2);
-
- rtc->ce_w(BIT(scr2, 8));
- rtc->sdi_w(BIT(scr2, 10));
- rtc->sck_w(BIT(scr2, 9));
- irq_set(0, scr2 & 0x01000000);
- irq_set(1, scr2 & 0x02000000);
-}
-
-READ32_MEMBER( next_state::scr1_r )
-{
- /*
- xxxx ---- ---- ---- ---- ---- ---- ---- slot ID
- ---- ---- xxxx xxxx ---- ---- ---- ---- DMA type
- ---- ---- ---- ---- xxxx ---- ---- ---- machine type
- ---- ---- ---- ---- ---- xxxx ---- ---- board revision
- ---- ---- ---- ---- ---- ---- -xx- ---- video mem speed
- ---- ---- ---- ---- ---- ---- ---x x--- mem speed
- ---- ---- ---- ---- ---- ---- ---- -xxx cpu speed 16/20/25/33/40/50/66/80
-
- machine types:
- 0 NeXT_CUBE
- 1 NeXT_WARP9
- 2 NeXT_X15
- 3 NeXT_WARP9C
- 4 NeXT_Turbo
- 5 NeXT_TurboC
- 6 Unknown
- 7 Unknown
- 8 NeXT_TurboCube
- 9 NeXT_TurboCubeC
-
- 68040-25: 00011102
- 68040-25: 00013002 (non-turbo, color)
- */
-
- return scr1;
-}
-
-// Interrupt subsystem
-// source bit level
-// nmi 31 7 *
-// pfail 30 7
-// timer 29 6 *
-// enetxdma 28 6 *
-// enetrdma 27 6 *
-// scsidma 26 6 *
-// diskdma 25 6
-// prndma 24 6 *
-// sndoutdma 23 6
-// sndindma 22 6
-// sccdma 21 6
-// dspdma 20 6
-// m2rdma 19 6
-// r2mdma 18 6
-// scc 17 5
-// remote 16 5 *
-// bus 15 5 *
-// dsp4 14 4
-// disk/cvid 13 3
-// scsi 12 3 *
-// printer 11 3
-// enetx 10 3 *
-// enetr 9 3
-// soundovr 8 3 *
-// phone 7 3 * -- floppy
-// dsp3 6 3
-// video 5 3
-// monitor 4 3
-// kbdmouse 3 3 *
-// power 2 3 *
-// softint1 1 2 *
-// softint0 0 1 *
-
-void next_state::irq_set(int id, bool raise)
-{
- uint32_t mask = 1U << id;
- uint32_t old_status = irq_status;
- if(raise)
- irq_status |= mask;
- else
- irq_status &= ~mask;
- if(old_status != irq_status)
- irq_check();
-}
-
-
-READ32_MEMBER( next_state::irq_status_r )
-{
- return irq_status;
-}
-
-READ32_MEMBER( next_state::irq_mask_r )
-{
- return irq_mask;
-}
-
-WRITE32_MEMBER( next_state::irq_mask_w )
-{
- COMBINE_DATA(&irq_mask);
- irq_check();
-}
-
-void next_state::irq_check()
-{
- uint32_t act = irq_status & (irq_mask | 0x80000000);
- int bit;
- for(bit=31; bit >= 0 && !(act & (1U << bit)); bit--);
-
- int level;
- if (bit < 0) level = 0;
- else if(bit < 1) level = 1;
- else if(bit < 2) level = 2;
- else if(bit < 14) level = 3;
- else if(bit < 15) level = 4;
- else if(bit < 18) level = 5;
- else if(bit < 30) level = 6;
- else level = 7;
-
- logerror("IRQ info %08x/%08x - %d\n", irq_status, irq_mask, level);
-
- if(level != irq_level) {
- maincpu->set_input_line(irq_level, CLEAR_LINE);
- maincpu->set_input_line(level, ASSERT_LINE);
- irq_level = level;
- }
-}
-
-char const *const next_state::dma_targets[0x20] = {
- nullptr, "scsi", nullptr, nullptr, "soundout", "disk", nullptr, nullptr,
- "soundin", "printer", nullptr, nullptr, "scc", "dsp", nullptr, nullptr,
- "s-enetx", "enetx", nullptr, nullptr, "s-enetr", "enetr", nullptr, nullptr,
- "video", nullptr, nullptr, nullptr, "r2m", "m2r", nullptr, nullptr
-};
-
-int const next_state::dma_irqs[0x20] = {
- -1, 26, -1, -1, 23, 25, -1, -1, 22, 24, -1, -1, 21, 20, -1, -1,
- -1, 28, -1, -1, -1, 27, -1, -1, 5, -1, -1, -1, 18, 19, -1, -1
-};
-
-bool const next_state::dma_has_saved[0x20] = {
- false, false, false, false, false, false, false, false,
- false, false, false, false, false, false, false, false,
- false, true, false, false, false, true, false, false,
- false, false, false, false, false, false, false, false,
-};
-
-const char *next_state::dma_name(int slot)
-{
- static char buf[32];
- if(dma_targets[slot])
- return dma_targets[slot];
- sprintf(buf, "<%02x>", slot);
- return buf;
-}
-
-void next_state::dma_drq_w(int slot, bool state)
-{
- // fprintf(stderr, "DMA drq_w %d, %d\n", slot, state);
- dma_slot &ds = dma_slots[slot];
- ds.drq = state;
- if(state && (ds.state & DMA_ENABLE)) {
- address_space &space = maincpu->space(AS_PROGRAM);
- if(ds.state & DMA_READ) {
- while(ds.drq) {
- dma_check_update(slot);
- uint8_t val;
- bool eof;
- bool err;
- dma_read(slot, val, eof, err);
- if(err) {
- ds.state = (ds.state & ~DMA_ENABLE) | DMA_BUSEXC;
- logerror("DMA: bus error on read slot %d\n", slot);
- return;
- }
- space.write_byte(ds.current++, val);
- dma_check_end(slot, eof);
- if(!(ds.state & DMA_ENABLE))
- return;
- }
- } else {
- while(ds.drq) {
- dma_check_update(slot);
- uint8_t val = space.read_byte(ds.current++);
- bool eof = ds.current == (ds.limit & 0x7fffffff) && (ds.limit & 0x80000000);
- bool err;
- dma_write(slot, val, eof, err);
- if(err) {
- ds.state = (ds.state & ~DMA_ENABLE) | DMA_BUSEXC;
- logerror("DMA: bus error on write slot %d\n", slot);
- return;
- }
- dma_check_end(slot, false);
- if(!(ds.state & DMA_ENABLE))
- return;
- }
- }
- }
-}
-
-void next_state::dma_read(int slot, uint8_t &val, bool &eof, bool &err)
-{
- err = false;
- eof = false;
- switch(slot) {
- case 1:
- if(fdc && fdc->get_drq()) {
- val = fdc->dma_r();
- if(eof) {
- fdc->tc_w(true);
- fdc->tc_w(false);
- }
- } else
- val = scsi->dma_r();
- break;
-
- case 5:
- val = mo->dma_r();
- break;
-
- case 21:
- net->rx_dma_r(val, eof);
- logerror("dma read net %02x %s\n", val, eof ? "eof" : "");
- break;
-
- default:
- err = true;
- val = 0;
- break;
- }
-}
-
-void next_state::dma_write(int slot, uint8_t data, bool eof, bool &err)
-{
- err = false;
- switch(slot) {
- case 1:
- if(fdc && fdc->get_drq()) {
- fdc->dma_w(data);
- if(eof) {
- fdc->tc_w(true);
- fdc->tc_w(false);
- }
- } else
- scsi->dma_w(data);
- break;
-
- case 4:
- break;
-
- case 5:
- mo->dma_w(data);
- break;
-
- case 17:
- net->tx_dma_w(data, eof);
- break;
-
- default:
- err = true;
- break;
- }
-}
-
-void next_state::dma_check_update(int slot)
-{
- dma_slot &ds = dma_slots[slot];
- if(ds.restart) {
- ds.current = ds.start;
- ds.restart = false;
- }
-}
-
-void next_state::dma_end(int slot)
-{
- dma_slot &ds = dma_slots[slot];
- if(dma_has_saved[slot]) {
- dma_slot &ds1 = dma_slots[(slot-1) & 31];
- ds1.current = ds.start;
- ds1.limit = ds.current;
- }
-
- if(!ds.supdate)
- ds.state &= ~DMA_ENABLE;
- else {
- ds.start = ds.chain_start;
- ds.limit = ds.chain_limit;
- ds.restart = true;
- ds.supdate = false;
- ds.state &= ~DMA_SUPDATE;
- }
- ds.state |= DMA_COMPLETE;
- logerror("dma end slot %d irq %d\n", slot, dma_irqs[slot]);
- if(dma_irqs[slot] >= 0)
- irq_set(dma_irqs[slot], true);
-}
-
-void next_state::dma_check_end(int slot, bool eof)
-{
- dma_slot &ds = dma_slots[slot];
- if(eof || ds.current == (ds.limit & 0x7fffffff))
- dma_end(slot);
-}
-
-READ32_MEMBER( next_state::dma_regs_r)
-{
- int slot = offset >> 2;
- int reg = offset & 3;
-
- uint32_t res;
-
- switch(reg) {
- case 0:
- res = dma_slots[slot].current;
- break;
- case 1:
- res = dma_slots[slot].limit;
- break;
- case 2:
- res = dma_slots[slot].chain_start;
- break;
- case 3: default:
- res = dma_slots[slot].chain_limit;
- break;
- }
-
- const char *name = dma_name(slot);
- logerror("dma_regs_r %s:%d %08x (%08x)\n", name, reg, res, maincpu->pc());
-
- return res;
-}
-
-WRITE32_MEMBER( next_state::dma_regs_w)
-{
- int slot = offset >> 2;
- int reg = offset & 3;
-
- const char *name = dma_name(slot);
-
- logerror("dma_regs_w %s:%d %08x (%08x)\n", name, reg, data, maincpu->pc());
- switch(reg) {
- case 0:
- dma_slots[slot].start = data;
- dma_slots[slot].current = data;
- break;
- case 1:
- dma_slots[slot].limit = data;
- break;
- case 2:
- dma_slots[slot].chain_start = data;
- break;
- case 3:
- dma_slots[slot].chain_limit = data;
- break;
- }
-}
-
-READ32_MEMBER( next_state::dma_ctrl_r)
-{
- int slot = offset >> 2;
- int reg = offset & 3;
-
- const char *name = dma_name(slot);
-
- if(maincpu->pc() != 0x409bb4e)
- logerror("dma_ctrl_r %s:%d %02x (%08x)\n", name, reg, dma_slots[slot].state, maincpu->pc());
-
- return reg ? 0 : dma_slots[slot].state << 24;
-}
-
-WRITE32_MEMBER( next_state::dma_ctrl_w)
-{
- int slot = offset >> 2;
- int reg = offset & 3;
- const char *name = dma_name(slot);
- logerror("dma_ctrl_w %s:%d %08x @ %08x (%08x)\n", name, reg, data, mem_mask, maincpu->pc());
- if(!reg) {
- if(ACCESSING_BITS_16_23)
- dma_do_ctrl_w(slot, data >> 16);
- else if(ACCESSING_BITS_24_31)
- dma_do_ctrl_w(slot, data >> 24);
- }
-}
-
-void next_state::dma_do_ctrl_w(int slot, uint8_t data)
-{
- const char *name = dma_name(slot);
-#if 0
- fprintf(stderr, "dma_ctrl_w %s %02x (%08x)\n", name, data, maincpu->pc());
-
- fprintf(stderr, " ->%s%s%s%s%s%s%s\n",
- data & DMA_SETENABLE ? " enable" : "",
- data & DMA_SETSUPDATE ? " supdate" : "",
- data & DMA_SETREAD ? " read" : "",
- data & DMA_CLRCOMPLETE ? " complete" : "",
- data & DMA_RESET ? " reset" : "",
- data & DMA_INITBUF ? " initbuf" : "",
- data & DMA_INITBUFTURBO ? " initbufturbo" : "");
-#endif
- if(data & DMA_SETENABLE)
- logerror("dma enable %s %s %08x (%08x)\n", name, data & DMA_SETREAD ? "read" : "write", (dma_slots[slot].limit-dma_slots[slot].start) & 0x7fffffff, maincpu->pc());
-
- dma_slot &ds = dma_slots[slot];
- if(data & (DMA_RESET|DMA_INITBUF|DMA_INITBUFTURBO)) {
- ds.state = 0;
- if(dma_irqs[slot] >= 0)
- irq_set(dma_irqs[slot], false);
- }
- if(data & DMA_SETSUPDATE) {
- ds.state |= DMA_SUPDATE;
- ds.supdate = true;
- }
- if(data & DMA_SETREAD)
- ds.state |= DMA_READ;
- if(data & DMA_CLRCOMPLETE) {
- ds.state &= ~DMA_COMPLETE;
- if(dma_irqs[slot] >= 0)
- irq_set(dma_irqs[slot], false);
- }
- if(data & DMA_SETENABLE) {
- ds.state |= DMA_ENABLE;
- // fprintf(stderr, "dma slot %d drq=%s\n", slot, ds.drq ? "on" : "off");
- if(ds.drq)
- dma_drq_w(slot, ds.drq);
- }
-}
-
-int const next_state::scsi_clocks[4] = { 10000000, 12000000, 20000000, 16000000 };
-
-READ32_MEMBER( next_state::scsictrl_r )
-{
- uint32_t res = (scsictrl << 24) | (scsistat << 16);
- logerror("scsictrl_read %08x @ %08x (%08x)\n", res, mem_mask, maincpu->pc());
- return res;
-}
-
-WRITE32_MEMBER( next_state::scsictrl_w )
-{
- if(ACCESSING_BITS_24_31) {
- scsictrl = data >> 24;
- if(scsictrl & 0x02)
- scsi->reset();
- scsi->set_clock(scsi_clocks[scsictrl >> 6]);
-
- logerror("SCSIctrl %dMHz int=%s dma=%s dmadir=%s%s%s dest=%s (%08x)\n",
- scsi_clocks[scsictrl >> 6]/1000000,
- scsictrl & 0x20 ? "on" : "off",
- scsictrl & 0x10 ? "on" : "off",
- scsictrl & 0x08 ? "read" : "write",
- scsictrl & 0x04 ? " flush" : "",
- scsictrl & 0x02 ? " reset" : "",
- scsictrl & 0x01 ? "wd3392" : "ncr5390",
- maincpu->pc());
- }
- if(ACCESSING_BITS_16_23) {
- scsistat = data >> 16;
- logerror("SCSIstat %02x (%08x)\n", data, maincpu->pc());
- }
-}
-
-READ32_MEMBER( next_state::event_counter_r)
-{
- // Event counters, around that time, are usually fixed-frequency counters.
- // This one being 1MHz seems to make sense
-
- // The v74 rom seems pretty convinced that it's 20 bits only.
-
- if(ACCESSING_BITS_24_31)
- eventc_latch = machine().time().as_ticks(1000000) & 0xfffff;
- return eventc_latch;
-}
-
-READ32_MEMBER( next_state::dsp_r)
-{
- return 0x7fffffff;
-}
-
-WRITE32_MEMBER( next_state::fdc_control_w )
-{
- logerror("FDC write %02x (%08x)\n", data >> 24, maincpu->pc());
-}
-
-READ32_MEMBER( next_state::fdc_control_r )
-{
- // Type of floppy present
- // 0 = no floppy in drive
- // 1 = ed
- // 2 = hd
- // 3 = dd
-
- // The rom strangely can't boot on anything else than ED, it has
- // code for the other densities but forces ED for some mysterious
- // reason. The kernel otoh behaves as expected.
-
- if(fdc) {
- floppy_image_device *fdev = floppy0->get_device();
- if(fdev->exists()) {
- uint32_t variant = fdev->get_variant();
- switch(variant) {
- case floppy_image::SSSD:
- case floppy_image::SSDD:
- case floppy_image::DSDD:
- return 3 << 24;
-
- case floppy_image::DSHD:
- return 2 << 24;
-
- case floppy_image::DSED:
- return 1 << 24;
- }
- }
- }
-
- return 0 << 24;
-}
-
-READ32_MEMBER( next_state::phy_r )
-{
- logerror("phy_r %d %08x (%08x)\n", offset, phy[offset], maincpu->pc());
- return phy[offset] | (0 << 24);
-}
-
-WRITE32_MEMBER( next_state::phy_w )
-{
- COMBINE_DATA(phy+offset);
- logerror("phy_w %d %08x (%08x)\n", offset, phy[offset], maincpu->pc());
-}
-
-void next_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
-{
- irq_set(29, true);
- timer_data = timer_next_data;
- if(timer_ctrl & 0x40000000)
- timer_start();
- else
- timer_ctrl &= 0x7fffffff;
-}
-
-READ32_MEMBER( next_state::timer_data_r )
-{
- if(timer_ctrl & 0x80000000)
- timer_update();
- return timer_data;
-}
-
-WRITE32_MEMBER( next_state::timer_data_w )
-{
- if(timer_ctrl & 0x80000000) {
- COMBINE_DATA(&timer_next_data);
- timer_next_data &= 0xffff0000;
- } else {
- COMBINE_DATA(&timer_data);
- timer_data &= 0xffff0000;
- }
-}
-
-READ32_MEMBER( next_state::timer_ctrl_r )
-{
- irq_set(29, false);
- return timer_ctrl;
-}
-
-WRITE32_MEMBER( next_state::timer_ctrl_w )
-{
- bool oldact = timer_ctrl & 0x80000000;
- COMBINE_DATA(&timer_ctrl);
- bool newact = timer_ctrl & 0x80000000;
- if(oldact != newact) {
- if(oldact) {
- timer_update();
- irq_set(29, false);
- } else {
- timer_next_data = timer_data;
- timer_start();
- }
- }
-}
-
-void next_state::timer_update()
-{
- int delta = timer_vbase - (machine().time() - timer_tbase).as_ticks(1000000);
- if(delta < 0)
- delta = 0;
- timer_data = delta << 16;
-}
-
-void next_state::timer_start()
-{
- timer_tbase = machine().time();
- timer_vbase = timer_data >> 16;
- timer_tm->adjust(attotime::from_usec(timer_vbase));
-}
-
-WRITE_LINE_MEMBER(next_state::scc_irq)
-{
- irq_set(17, state);
-}
-
-WRITE_LINE_MEMBER(next_state::keyboard_irq)
-{
- irq_set(3, state);
-}
-
-WRITE_LINE_MEMBER(next_state::power_irq)
-{
- irq_set(2, state);
-}
-
-WRITE_LINE_MEMBER(next_state::nmi_irq)
-{
- irq_set(31, state);
-}
-
-WRITE_LINE_MEMBER(next_state::fdc_irq)
-{
- irq_set(7, state);
-}
-
-WRITE_LINE_MEMBER(next_state::fdc_drq)
-{
- dma_drq_w(1, state);
-}
-
-WRITE_LINE_MEMBER(next_state::net_tx_irq)
-{
- irq_set(10, state);
-}
-
-WRITE_LINE_MEMBER(next_state::net_rx_irq)
-{
- irq_set(9, state);
-}
-
-WRITE_LINE_MEMBER(next_state::net_tx_drq)
-{
- dma_drq_w(17, state);
-}
-
-WRITE_LINE_MEMBER(next_state::net_rx_drq)
-{
- dma_drq_w(21, state);
-}
-
-WRITE_LINE_MEMBER(next_state::mo_irq)
-{
- irq_set(13, state);
-}
-
-WRITE_LINE_MEMBER(next_state::mo_drq)
-{
- dma_drq_w(5, state);
-}
-
-WRITE_LINE_MEMBER(next_state::scsi_irq)
-{
- irq_set(12, state);
-}
-
-WRITE_LINE_MEMBER(next_state::scsi_drq)
-{
- dma_drq_w(1, state);
-}
-
-WRITE8_MEMBER(next_state::ramdac_w)
-{
- switch(offset) {
- case 0:
- switch(data) {
- case 0x05:
- if(screen_color)
- irq_set(13, false);
- else
- irq_set(5, false);
- vbl_enabled = false;
- break;
-
- case 0x06:
- vbl_enabled = true;
- break;
-
- default:
- fprintf(stderr, "ramdac_w %d, %02x\n", offset, data);
- break;
- }
- break;
-
- default:
- fprintf(stderr, "ramdac_w %d, %02x\n", offset, data);
- break;
- }
-}
-
-void next_state::setup(uint32_t _scr1, int size_x, int size_y, int skip, bool color)
-{
- scr1 = _scr1;
- screen_sx = size_x;
- screen_sy = size_y;
- screen_skip = skip;
- screen_color = color;
-}
-
-void next_state::machine_start()
-{
- save_item(NAME(scr2));
- save_item(NAME(irq_status));
- save_item(NAME(irq_mask));
- save_item(NAME(irq_level));
- save_item(NAME(phy));
- save_item(NAME(scsictrl));
- save_item(NAME(scsistat));
- save_item(NAME(timer_tbase));
- save_item(NAME(timer_vbase));
- save_item(NAME(timer_data));
- save_item(NAME(timer_next_data));
- save_item(NAME(timer_ctrl));
- save_item(NAME(eventc_latch));
- save_item(NAME(esp));
-
- for(int i=0; i<0x20; i++) {
- save_item(NAME(dma_slots[i].start), i);
- save_item(NAME(dma_slots[i].limit), i);
- save_item(NAME(dma_slots[i].chain_start), i);
- save_item(NAME(dma_slots[i].chain_limit), i);
- save_item(NAME(dma_slots[i].current), i);
- save_item(NAME(dma_slots[i].state), i);
- save_item(NAME(dma_slots[i].supdate), i);
- save_item(NAME(dma_slots[i].restart), i);
- save_item(NAME(dma_slots[i].drq), i);
- }
-
- timer_tm = timer_alloc(0);
-}
-
-void next_state::machine_reset()
-{
- scr2 = 0;
- irq_status = 0;
- irq_mask = 0;
- irq_level = 0;
- esp = 0;
- scsictrl = 0;
- scsistat = 0;
- phy[0] = phy[1] = 0;
- eventc_latch = 0;
- timer_vbase = 0;
- timer_data = 0;
- timer_next_data = 0;
- timer_ctrl = 0;
- vbl_enabled = true;
- dma_drq_w(4, true); // soundout
-}
-
-WRITE_LINE_MEMBER(next_state::vblank_w)
-{
- if(vbl_enabled) {
- if(screen_color)
- irq_set(13, state);
- else
- irq_set(5, state);
- }
-}
-
-void next_state::next_mem(address_map &map)
-{
- map(0x00000000, 0x0001ffff).rom().region("user1", 0);
- map(0x01000000, 0x0101ffff).rom().region("user1", 0);
- map(0x02000000, 0x020001ff).mirror(0x300200).rw(FUNC(next_state::dma_ctrl_r), FUNC(next_state::dma_ctrl_w));
- map(0x02004000, 0x020041ff).mirror(0x300200).rw(FUNC(next_state::dma_regs_r), FUNC(next_state::dma_regs_w));
- map(0x02006000, 0x0200600f).mirror(0x300000).m(net, FUNC(mb8795_device::map));
-// map(0x02006010, 0x02006013).mirror(0x300000); memory timing
- map(0x02007000, 0x02007003).mirror(0x300000).r(FUNC(next_state::irq_status_r));
- map(0x02007800, 0x02007803).mirror(0x300000).rw(FUNC(next_state::irq_mask_r), FUNC(next_state::irq_mask_w));
- map(0x02008000, 0x02008003).mirror(0x300000).r(FUNC(next_state::dsp_r));
- map(0x0200c000, 0x0200c003).mirror(0x300000).r(FUNC(next_state::scr1_r));
- map(0x0200c800, 0x0200c803).mirror(0x300000).r(FUNC(next_state::rom_map_r));
- map(0x0200d000, 0x0200d003).mirror(0x300000).rw(FUNC(next_state::scr2_r), FUNC(next_state::scr2_w));
-// map(0x0200d800, 0x0200d803).mirror(0x300000); RMTINT
- map(0x0200e000, 0x0200e00b).mirror(0x300000).m(keyboard, FUNC(nextkbd_device::amap));
-// map(0x0200f000, 0x0200f003).mirror(0x300000); printer
-// map(0x02010000, 0x02010003).mirror(0x300000); brightness
- map(0x02012000, 0x0201201f).mirror(0x300000).m(mo, FUNC(nextmo_device::map));
- map(0x02014000, 0x0201400f).mirror(0x300000).m(scsi, FUNC(ncr5390_device::map));
- map(0x02014020, 0x02014023).mirror(0x300000).rw(FUNC(next_state::scsictrl_r), FUNC(next_state::scsictrl_w));
- map(0x02016000, 0x02016003).mirror(0x300000).rw(FUNC(next_state::timer_data_r), FUNC(next_state::timer_data_w));
- map(0x02016004, 0x02016007).mirror(0x300000).rw(FUNC(next_state::timer_ctrl_r), FUNC(next_state::timer_ctrl_w));
- map(0x02018000, 0x02018003).mirror(0x300000).rw(scc, FUNC(scc8530_legacy_device::reg_r), FUNC(scc8530_legacy_device::reg_w));
-// map(0x02018004, 0x02018007).mirror(0x300000); SCC CLK
-// map(0x02018190, 0x02018197).mirror(0x300000); warp 9c DRAM timing
-// map(0x02018198, 0x0201819f).mirror(0x300000); warp 9c VRAM timing
- map(0x0201a000, 0x0201a003).mirror(0x300000).r(FUNC(next_state::event_counter_r)); // EVENTC
-// map(0x020c0000, 0x020c0004).mirror(0x300000); BMAP
- map(0x020c0030, 0x020c0037).mirror(0x300000).rw(FUNC(next_state::phy_r), FUNC(next_state::phy_w));
- map(0x04000000, 0x07ffffff).ram(); //work ram
-// map(0x0c000000, 0x0c03ffff) video RAM w A+B-AB function
-// map(0x0d000000, 0x0d03ffff) video RAM w (1-A)B function
-// map(0x0e000000, 0x0e03ffff) video RAM w ceil(A+B) function
-// map(0x0f000000, 0x0f03ffff) video RAM w AB function
-// map(0x10000000, 0x1003ffff) main RAM w A+B-AB function
-// map(0x14000000, 0x1403ffff) main RAM w (1-A)B function
-// map(0x18000000, 0x1803ffff) main RAM w ceil(A+B) function
-// map(0x1c000000, 0x1c03ffff) main RAM w AB function
-}
-
-void next_state::next_0b_m_nofdc_mem(address_map &map)
-{
- next_mem(map);
- map(0x0b000000, 0x0b03ffff).ram().share("vram");
-}
-
-void next_state::next_fdc_mem(address_map &map)
-{
- next_mem(map);
- map(0x02014100, 0x02014107).mirror(0x300000).m(fdc, FUNC(n82077aa_device::map));
- map(0x02014108, 0x0201410b).mirror(0x300000).rw(FUNC(next_state::fdc_control_r), FUNC(next_state::fdc_control_w));
-}
-
-void next_state::next_0b_m_mem(address_map &map)
-{
- next_fdc_mem(map);
- map(0x0b000000, 0x0b03ffff).ram().share("vram");
-}
-
-void next_state::next_0c_m_mem(address_map &map)
-{
- next_fdc_mem(map);
- map(0x0c000000, 0x0c1fffff).ram().share("vram");
-}
-
-void next_state::next_0c_c_mem(address_map &map)
-{
- next_fdc_mem(map);
- map(0x0c000000, 0x0c1fffff).ram().share("vram");
- map(0x02018180, 0x02018183).mirror(0x300000).w(FUNC(next_state::ramdac_w));
-}
-
-void next_state::next_2c_c_mem(address_map &map)
-{
- next_fdc_mem(map);
- map(0x2c000000, 0x2c1fffff).ram().share("vram");
- map(0x02018180, 0x02018183).mirror(0x300000).w(FUNC(next_state::ramdac_w));
-}
-
-
-/* Input ports */
-static INPUT_PORTS_START( next )
-INPUT_PORTS_END
-
-FLOPPY_FORMATS_MEMBER( next_state::floppy_formats )
- FLOPPY_PC_FORMAT
-FLOPPY_FORMATS_END
-
-static void next_floppies(device_slot_interface &device)
-{
- device.option_add("35ed", FLOPPY_35_ED);
-}
-
-static void next_scsi_devices(device_slot_interface &device)
-{
- device.option_add("cdrom", NSCSI_CDROM);
- device.option_add("harddisk", NSCSI_HARDDISK);
- device.option_add_internal("ncr5390", NCR5390);
-}
-
-void next_state::ncr5390(device_t *device)
-{
- ncr5390_device &adapter = downcast<ncr5390_device &>(*device);
-
- adapter.set_clock(10000000);
- adapter.irq_handler_cb().set(*this, FUNC(next_state::scsi_irq));
- adapter.drq_handler_cb().set(*this, FUNC(next_state::scsi_drq));
-}
-
-void next_state::next_base(machine_config &config)
-{
- /* video hardware */
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_refresh_hz(60);
- screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
- screen.set_screen_update(FUNC(next_state::screen_update));
- screen.set_size(1120, 900);
- screen.set_visarea(0, 1120-1, 0, 832-1);
- screen.screen_vblank().set(FUNC(next_state::vblank_w));
-
- // devices
- NSCSI_BUS(config, "scsibus");
-
- MCCS1850(config, rtc, XTAL(32'768));
-
- SCC8530(config, scc, XTAL(25'000'000));
- scc->intrq_callback().set(FUNC(next_state::scc_irq));
-
- NEXTKBD(config, keyboard, 0);
- keyboard->int_change_wr_callback().set(FUNC(next_state::keyboard_irq));
- keyboard->int_power_wr_callback().set(FUNC(next_state::power_irq));
- keyboard->int_nmi_wr_callback().set(FUNC(next_state::nmi_irq));
-
- NSCSI_CONNECTOR(config, "scsibus:0", next_scsi_devices, "harddisk");
- NSCSI_CONNECTOR(config, "scsibus:1", next_scsi_devices, "cdrom");
- NSCSI_CONNECTOR(config, "scsibus:2", next_scsi_devices, nullptr);
- NSCSI_CONNECTOR(config, "scsibus:3", next_scsi_devices, nullptr);
- NSCSI_CONNECTOR(config, "scsibus:4", next_scsi_devices, nullptr);
- NSCSI_CONNECTOR(config, "scsibus:5", next_scsi_devices, nullptr);
- NSCSI_CONNECTOR(config, "scsibus:6", next_scsi_devices, nullptr);
- NSCSI_CONNECTOR(config, "scsibus:7", next_scsi_devices, "ncr5390", true).set_option_machine_config("ncr5390", [this] (device_t *device) { ncr5390(device); });
-
- MB8795(config, net, 0);
- net->tx_irq().set(FUNC(next_state::net_tx_irq));
- net->rx_irq().set(FUNC(next_state::net_rx_irq));
- net->tx_drq().set(FUNC(next_state::net_tx_drq));
- net->rx_drq().set(FUNC(next_state::net_rx_drq));
-
- NEXTMO(config, mo, 0);
- mo->irq_wr_callback().set(FUNC(next_state::mo_irq));
- mo->drq_wr_callback().set(FUNC(next_state::mo_drq));
-}
-
-void next_state::next(machine_config &config)
-{
- next_base(config);
- M68030(config, maincpu, XTAL(25'000'000));
- maincpu->set_addrmap(AS_PROGRAM, &next_state::next_0b_m_nofdc_mem);
-}
-
-void next_state::next_fdc_base(machine_config &config)
-{
- next_base(config);
-
- N82077AA(config, fdc, n82077aa_device::mode_t::PS2);
- fdc->intrq_wr_callback().set(FUNC(next_state::fdc_irq));
- fdc->drq_wr_callback().set(FUNC(next_state::fdc_drq));
- FLOPPY_CONNECTOR(config, "fdc:0", next_floppies, "35ed", next_state::floppy_formats);
-
- // software list
- SOFTWARE_LIST(config, "flop_list").set_original("next");
-}
-
-void next_state::nexts(machine_config &config)
-{
- next_fdc_base(config);
- M68040(config, maincpu, XTAL(25'000'000));
- maincpu->set_addrmap(AS_PROGRAM, &next_state::next_0b_m_mem);
-}
-
-void next_state::nexts2(machine_config &config)
-{
- next_fdc_base(config);
- M68040(config, maincpu, XTAL(25'000'000));
- maincpu->set_addrmap(AS_PROGRAM, &next_state::next_0b_m_mem);
-}
-
-void next_state::nextsc(machine_config &config)
-{
- next_fdc_base(config);
- M68040(config, maincpu, XTAL(25'000'000));
- maincpu->set_addrmap(AS_PROGRAM, &next_state::next_2c_c_mem);
-}
-
-void next_state::nextst(machine_config &config)
-{
- next_fdc_base(config);
- M68040(config, maincpu, XTAL(33'000'000));
- maincpu->set_addrmap(AS_PROGRAM, &next_state::next_0b_m_mem);
-}
-
-void next_state::nextstc(machine_config &config)
-{
- next_fdc_base(config);
- M68040(config, maincpu, XTAL(33'000'000));
- maincpu->set_addrmap(AS_PROGRAM, &next_state::next_0c_c_mem);
- subdevice<screen_device>("screen")->set_visarea(0, 832-1, 0, 624-1);
-}
-
-void next_state::nextct(machine_config &config)
-{
- next_fdc_base(config);
- M68040(config, maincpu, XTAL(33'000'000));
- maincpu->set_addrmap(AS_PROGRAM, &next_state::next_0c_m_mem);
-}
-
-void next_state::nextctc(machine_config &config)
-{
- next_fdc_base(config);
- M68040(config, maincpu, XTAL(33'000'000));
- maincpu->set_addrmap(AS_PROGRAM, &next_state::next_0c_c_mem);
- subdevice<screen_device>("screen")->set_visarea(0, 832-1, 0, 624-1);
-}
-
-/* ROM definition */
-#define ROM_NEXT_V1 \
- ROM_REGION32_BE( 0x20000, "user1", ROMREGION_ERASEFF ) \
- ROM_SYSTEM_BIOS( 0, "v12", "v1.2" ) /* MAC address/serial number word at 0xC: 005AD0 */ \
- ROMX_LOAD( "rev_1.2.bin", 0x0000, 0x10000, CRC(7070bd78) SHA1(e34418423da61545157e36b084e2068ad41c9e24), ROM_BIOS(0)) /* Label: "(C) 1990 NeXT, Inc. // All Rights Reserved. // Release 1.2 // 1142.02", underlabel exists but unknown */ \
- ROM_SYSTEM_BIOS( 1, "v10", "v1.0 v41" ) /* MAC address/serial number word at 0xC: 003090 */ \
- ROMX_LOAD( "rev_1.0_v41.bin", 0x0000, 0x10000, CRC(54df32b9) SHA1(06e3ecf09ab67a571186efd870e6b44028612371), ROM_BIOS(1)) /* Label: "(C) 1989 NeXT, Inc. // All Rights Reserved. // Release 1.0 // 1142.00", underlabel: "MYF // 1.0.41 // 0D5C" */ \
- ROM_SYSTEM_BIOS( 2, "v10p", "v1.0 v41 alternate" ) /* MAC address/serial number word at 0xC: 0023D9 */ \
- ROMX_LOAD( "rev_1.0_proto.bin", 0x0000, 0x10000, CRC(f44974f9) SHA1(09eaf9f5d47e379cfa0e4dc377758a97d2869ddc), ROM_BIOS(2)) /* Label: "(C) 1989 NeXT, Inc. // All Rights Reserved. // Release 1.0 // 1142.00", no underlabel */
-
-#define ROM_NEXT_V2 \
- ROM_REGION32_BE( 0x20000, "user1", ROMREGION_ERASEFF ) \
- ROM_SYSTEM_BIOS( 0, "v25", "v2.5 v66" ) /* MAC address/serial number word at 0xC: 00F302 */ \
- ROMX_LOAD( "rev_2.5_v66.bin", 0x0000, 0x20000, CRC(f47e0bfe) SHA1(b3534796abae238a0111299fc406a9349f7fee24), ROM_BIOS(0)) \
- ROM_SYSTEM_BIOS( 1, "v24", "v2.4 v65" ) /* MAC address/serial number word at 0xC: 00A634 */ \
- ROMX_LOAD( "rev_2.4_v65.bin", 0x0000, 0x20000, CRC(74e9e541) SHA1(67d195351288e90818336c3a84d55e6a070960d2), ROM_BIOS(1)) \
- ROM_SYSTEM_BIOS( 2, "v22", "v2.2 v63" ) /* MAC address/serial number word at 0xC: 00894C */ \
- ROMX_LOAD( "rev_2.2_v63.bin", 0x0000, 0x20000, CRC(739d7c07) SHA1(48ffe54cf2038782a92a0850337c5c6213c98571), ROM_BIOS(2)) /* Label: "(C) 1990 NeXT Computer, Inc. // All Rights Reserved. // Release 2.1 // 2918.AB" */ \
- ROM_SYSTEM_BIOS( 3, "v21", "v2.1 v59" ) /* MAC address/serial number word at 0xC: 0072FE */ \
- ROMX_LOAD( "rev_2.1_v59.bin", 0x0000, 0x20000, CRC(f20ef956) SHA1(09586c6de1ca73995f8c9b99870ee3cc9990933a), ROM_BIOS(3)) \
- ROM_SYSTEM_BIOS( 4, "v12", "v1.2 v58" ) /* MAC address/serial number word at 0xC: 006372 */ \
- ROMX_LOAD( "rev_1.2_v58.bin", 0x0000, 0x20000, CRC(b815b6a4) SHA1(97d8b09d03616e1487e69d26609487486db28090), ROM_BIOS(4)) /* Label: "V58 // (C) 1990 NeXT, Inc. // All Rights Reserved // Release 1.2 // 1142.02" */
-
-#define ROM_NEXT_V3 \
- ROM_REGION32_BE( 0x20000, "user1", ROMREGION_ERASEFF ) \
- ROM_SYSTEM_BIOS( 0, "v33", "v3.3 v74" ) /* MAC address/serial number word at 0xC: 123456 */ \
- ROMX_LOAD( "rev_3.3_v74.bin", 0x0000, 0x20000, CRC(fbc3a2cd) SHA1(a9bef655f26f97562de366e4a33bb462e764c929), ROM_BIOS(0)) \
- ROM_SYSTEM_BIOS( 1, "v32", "v3.2 v72" ) /* MAC address/serial number word at 0xC: 012f31 */ \
- ROMX_LOAD( "rev_3.2_v72.bin", 0x0000, 0x20000, CRC(e750184f) SHA1(ccebf03ed090a79c36f761265ead6cd66fb04329), ROM_BIOS(1)) \
- ROM_SYSTEM_BIOS( 2, "v30", "v3.0 v70" ) /* MAC address/serial number word at 0xC: 0106e8 */ \
- ROMX_LOAD( "rev_3.0_v70.bin", 0x0000, 0x20000, CRC(37250453) SHA1(a7e42bd6a25c61903c8ca113d0b9a624325ee6cf), ROM_BIOS(2))
-
-
-ROM_START(next)
- ROM_NEXT_V1
-ROM_END
-
-ROM_START(nexts)
- ROM_NEXT_V2
-ROM_END
-
-ROM_START(nexts2)
- ROM_NEXT_V2
-ROM_END
-
-ROM_START(nextsc)
- ROM_NEXT_V2
-ROM_END
-
-ROM_START(nextst)
- ROM_NEXT_V3
-ROM_END
-
-ROM_START(nextstc)
- ROM_NEXT_V3
-ROM_END
-
-ROM_START(nextct)
- ROM_NEXT_V3
-ROM_END
-
-ROM_START(nextctc)
- ROM_NEXT_V3
-ROM_END
-
-void next_state::init_next()
-{
- setup(0x00010002, 1120, 832, 2, false);
-}
-
-void next_state::init_nexts()
-{
- setup(0x00011002, 1120, 832, 2, false);
-}
-
-void next_state::init_nexts2()
-{
- setup(0x00012102, 1120, 832, 2, false);
-}
-
-void next_state::init_nextsc()
-{
- setup(0x00013102, 1120, 832, 16, true);
-}
-
-void next_state::init_nextst()
-{
- setup(0x00014103, 1120, 832, 2, false);
-}
-
-void next_state::init_nextstc()
-{
- setup(0x00015103, 832, 624, 0, true);
-}
-
-void next_state::init_nextct()
-{
- setup(0x00018103, 1120, 832, 0, false);
-}
-
-void next_state::init_nextctc()
-{
- setup(0x00019103, 832, 624, 0, true);
-}
-
-/* Driver */
-
-// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1987, next, 0, 0, next, next, next_state, init_next, "Next Software Inc", "NeXT Cube", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
-COMP( 1990, nexts, 0, 0, nexts, next, next_state, init_nexts, "Next Software Inc", "NeXTstation", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
-COMP( 1990, nexts2, nexts, 0, nexts2, next, next_state, init_nexts2, "Next Software Inc", "NeXTstation (X15 variant)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
-COMP( 1990, nextsc, nexts, 0, nextsc, next, next_state, init_nextsc, "Next Software Inc", "NeXTstation color", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
-COMP( 1990, nextst, 0, 0, nextst, next, next_state, init_nextst, "Next Software Inc", "NeXTstation turbo", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
-COMP( 1990, nextstc, nextst, 0, nextstc, next, next_state, init_nextstc, "Next Software Inc", "NeXTstation turbo color", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
-COMP( ????, nextct, nextst, 0, nextct, next, next_state, init_nextct, "Next Software Inc", "NeXT Cube turbo", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
-COMP( ????, nextctc, nextst, 0, nextctc, next, next_state, init_nextctc, "Next Software Inc", "NeXT Cube turbo color", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )