mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
sun2: MMU fixes, both VME and Multibus variants now POST and show something. [R. Belmont]
This commit is contained in:
parent
a9c3db7a98
commit
cb7209eb9d
@ -68,6 +68,7 @@
|
||||
|
||||
|
||||
25/08/2009 Skeleton driver.
|
||||
31/05/2016 Main screen turn on.
|
||||
|
||||
How the architecture works:
|
||||
- There are 3 address sub-spaces: CPU layer, MMU layer, and device layer
|
||||
@ -100,18 +101,17 @@ How the architecture works:
|
||||
There are 8 hardware contexts. Supervisor and User FCs can have different contexts.
|
||||
|
||||
Segment map is 4096 entries, from bits 23-15 of the virtual address + 3 context bits.
|
||||
Entries are 8 bits, which point to a page map entry group (PMEG).
|
||||
Entries are 8 bits, which point to a page map entry group (PMEG), which is 16 consecutive
|
||||
page table entries (32 KB of space).
|
||||
|
||||
Page map is 4096 entries each mapping a 2K page. There are 256 groups of 16 entries;
|
||||
the PMEG points to these 256 groups. The page map contains a 20-bit page number,
|
||||
which combines with the 11 low bits of the original address to get a 31-bit physical address.
|
||||
The entry from 0-15 is picked with bits 15-11 of the original address.
|
||||
|
||||
There is an "address hole" between virtual addresses 0x600000 and 0xDFFFFF. Page table
|
||||
number generation skips from 0x5FFFFF to 0xE00000. Thus the last two megs of the lower 8 MB
|
||||
are replaced by the last two megs of the upper 8 MB (ROM and I/O).
|
||||
|
||||
ef0942 = time to set up the maps for the data (middle of function mapmem() in sunmon.c)
|
||||
Page map entries are written to the PMEG determined by their segment map entry; you must
|
||||
set the segment map validly in order to write to the page map. This is how they get away
|
||||
with having 16 MB of segment entries and only 8 MB of PMEGs.
|
||||
|
||||
****************************************************************************/
|
||||
|
||||
@ -129,10 +129,6 @@ How the architecture works:
|
||||
#define PM_ACCESSED (0x00200000) // accessed flag
|
||||
#define PM_MODIFIED (0x00100000) // modified flag
|
||||
|
||||
#define HOLE_PAGE (4096) // fake page to redirect the address hole to, as TME does
|
||||
#define HOLE_START (0x800000>>1) // if set to real value of 600000, the page map address line test fails
|
||||
#define HOLE_END (0xDFFFFF>>1)
|
||||
|
||||
class sun2_state : public driver_device
|
||||
{
|
||||
public:
|
||||
@ -140,15 +136,19 @@ public:
|
||||
: driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_rom(*this, "bootprom"),
|
||||
m_idprom(*this, "idprom"),
|
||||
m_ram(*this, RAM_TAG),
|
||||
m_type0space(*this, "type0"),
|
||||
m_type1space(*this, "type1"),
|
||||
m_type2space(*this, "type2"),
|
||||
m_type3space(*this, "type3"),
|
||||
m_bw2_vram(*this, "bw2_vram")
|
||||
{ }
|
||||
|
||||
required_device<m68010_device> m_maincpu;
|
||||
required_memory_region m_rom;
|
||||
required_memory_region m_rom, m_idprom;
|
||||
required_device<ram_device> m_ram;
|
||||
required_device<address_map_bank_device> m_type1space;
|
||||
required_device<address_map_bank_device> m_type0space, m_type1space, m_type2space, m_type3space;
|
||||
required_shared_ptr<UINT16> m_bw2_vram;
|
||||
|
||||
virtual void machine_start() override;
|
||||
@ -156,31 +156,33 @@ public:
|
||||
|
||||
DECLARE_READ16_MEMBER( tl_mmu_r );
|
||||
DECLARE_WRITE16_MEMBER( tl_mmu_w );
|
||||
DECLARE_READ16_MEMBER( video_ctrl_r );
|
||||
DECLARE_WRITE16_MEMBER( video_ctrl_w );
|
||||
DECLARE_READ16_MEMBER( test_r );
|
||||
DECLARE_WRITE16_MEMBER( test_w );
|
||||
DECLARE_READ16_MEMBER( ram_r );
|
||||
DECLARE_WRITE16_MEMBER( ram_w );
|
||||
|
||||
UINT32 bw2_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
|
||||
private:
|
||||
UINT16 *m_rom_ptr, *m_ram_ptr;
|
||||
UINT8 *m_idprom_ptr;
|
||||
UINT16 m_diagreg, m_sysenable, m_buserror;
|
||||
UINT16 m_context;
|
||||
UINT8 m_segmap[8][512];
|
||||
UINT32 m_pagemap[4097];
|
||||
UINT32 m_ram_size, m_ram_size_words;
|
||||
UINT16 m_bw2_ctrl;
|
||||
};
|
||||
|
||||
READ16_MEMBER( sun2_state::test_r )
|
||||
READ16_MEMBER( sun2_state::ram_r )
|
||||
{
|
||||
printf("test_r @ %x\n", offset << 1);
|
||||
|
||||
if (offset < m_ram_size_words) return m_ram_ptr[offset];
|
||||
return 0xffff;
|
||||
}
|
||||
|
||||
WRITE16_MEMBER( sun2_state::test_w )
|
||||
WRITE16_MEMBER( sun2_state::ram_w )
|
||||
{
|
||||
printf("test_w %x @ %x\n", data, offset << 1);
|
||||
if (offset < m_ram_size_words) COMBINE_DATA(&m_ram_ptr[offset]);
|
||||
}
|
||||
|
||||
READ16_MEMBER( sun2_state::tl_mmu_r )
|
||||
@ -191,22 +193,22 @@ READ16_MEMBER( sun2_state::tl_mmu_r )
|
||||
{
|
||||
if (offset & 0x4) // set for CPU space
|
||||
{
|
||||
switch (offset)
|
||||
switch (offset & 7)
|
||||
{
|
||||
case 4:
|
||||
printf("sun2: Read IDPROM @ %x\n", offset<<1);
|
||||
return 0xffff;
|
||||
//printf("sun2: Read IDPROM @ %x (PC=%x)\n", offset<<1, m_maincpu->pc);
|
||||
return m_idprom_ptr[(offset>>10) & 0x1f]<<8;
|
||||
|
||||
case 5:
|
||||
printf("sun2: Read diag reg\n");
|
||||
//printf("sun2: Read diag reg\n");
|
||||
return m_diagreg;
|
||||
|
||||
case 6:
|
||||
printf("sun2: Read bus error\n");
|
||||
//printf("sun2: Read bus error @ PC %x\n", m_maincpu->pc);
|
||||
return m_buserror;
|
||||
|
||||
case 7:
|
||||
printf("sun2: Read sysenable\n");
|
||||
//printf("sun2: Read sysenable\n");
|
||||
return m_sysenable;
|
||||
}
|
||||
}
|
||||
@ -218,20 +220,9 @@ READ16_MEMBER( sun2_state::tl_mmu_r )
|
||||
{
|
||||
case 0: // page map
|
||||
case 1:
|
||||
page = (offset >> 10) & 0x1fff;
|
||||
|
||||
if (offset >= HOLE_START)
|
||||
{
|
||||
if (offset <= HOLE_END)
|
||||
{
|
||||
page = HOLE_PAGE;
|
||||
}
|
||||
else
|
||||
{
|
||||
page &= 0xfff;
|
||||
}
|
||||
}
|
||||
|
||||
page = m_segmap[m_context & 7][offset >> 14] << 4;
|
||||
page += ((offset >> 10) & 0xf);
|
||||
|
||||
//printf("sun2: Read page map at %x (entry %d)\n", offset<<1, page);
|
||||
if (offset & 1) // low-order 16 bits
|
||||
{
|
||||
@ -262,21 +253,12 @@ READ16_MEMBER( sun2_state::tl_mmu_r )
|
||||
return m_rom_ptr[offset & 0x3fff];
|
||||
}
|
||||
|
||||
int super_verbose = 0;
|
||||
if ((offset >= (0xef6600>>1)) && (offset <= (0xef6900>>1)))
|
||||
{
|
||||
super_verbose = 1;
|
||||
}
|
||||
|
||||
// it's translation time
|
||||
UINT8 context = (fc & 4) ? ((m_context >> 8) & 7) : (m_context & 7);
|
||||
UINT8 pmeg = m_segmap[context][offset >> 14];
|
||||
UINT32 entry = (pmeg << 4) + ((offset >> 10) & 0xf);
|
||||
|
||||
if (super_verbose)
|
||||
{
|
||||
//printf("sun2: Context = %d, pmeg = %d, offset >> 14 = %x, entry = %d, page = %d\n", context, pmeg, offset >> 14, entry, (offset >> 10) & 0xf);
|
||||
}
|
||||
// printf("sun2: Context = %d, pmeg = %d, offset >> 14 = %x, entry = %d, page = %d\n", context, pmeg, offset >> 14, entry, (offset >> 10) & 0xf);
|
||||
|
||||
m_pagemap[entry] |= PM_ACCESSED;
|
||||
if (m_pagemap[entry] & PM_VALID)
|
||||
@ -284,17 +266,15 @@ READ16_MEMBER( sun2_state::tl_mmu_r )
|
||||
UINT32 tmp = (m_pagemap[entry] & 0xfffff) << 10;
|
||||
tmp |= (offset & 0x3ff);
|
||||
|
||||
//if ((!space.debugger_access()) && (super_verbose))
|
||||
// printf("sun2: Translated addr: %08x, type %d (page %d page entry %08x, orig virt %08x, FC %d)\n", tmp << 1, (m_pagemap[entry] >> 22) & 7, entry, m_pagemap[entry], offset<<1, fc);
|
||||
// if (!space.debugger_access())
|
||||
// printf("sun2: Translated addr: %08x, type %d (page %d page entry %08x, orig virt %08x, FC %d)\n", tmp << 1, (m_pagemap[entry] >> 22) & 7, entry, m_pagemap[entry], offset<<1, fc);
|
||||
|
||||
switch ((m_pagemap[entry] >> 22) & 7)
|
||||
{
|
||||
case 0: // main RAM space
|
||||
//printf("read main RAM @ %x\n", offset<<1);
|
||||
if (tmp < m_ram_size_words) return m_ram_ptr[tmp];
|
||||
return 0xffff;
|
||||
case 0: // type 0 space
|
||||
return m_type0space->read16(space, tmp, mem_mask);
|
||||
|
||||
case 1: // device space
|
||||
case 1: // type 1 space
|
||||
// EPROM space is special: the MMU has a trap door
|
||||
// where the original bits of the virtual address are
|
||||
// restored so that the entire 32K EPROM can be
|
||||
@ -302,26 +282,29 @@ READ16_MEMBER( sun2_state::tl_mmu_r )
|
||||
// obvious in the sun2 manual, but the sun3 manual
|
||||
// (sun3 has the same mechanism) explains it well.
|
||||
// the 2/50 ROM tests this specifically at $EF0DF0.
|
||||
if ((tmp >= (0x7f0000>>1)) && (tmp <= (0x7f07ff>>1)))
|
||||
if (m_idprom_ptr[1] == 0x02) // 2/50 VMEbus has EPROM at 0x7F0000
|
||||
{
|
||||
if (super_verbose)
|
||||
if ((tmp >= (0x7f0000>>1)) && (tmp <= (0x7f07ff>>1)))
|
||||
{
|
||||
printf("sun2: extra-magic EPROM bypass @ %x\n", (offset & 0x3fff) << 1);
|
||||
return m_rom_ptr[offset & 0x3fff];
|
||||
}
|
||||
}
|
||||
else // Multibus has EPROM at 0x000000
|
||||
{
|
||||
if (tmp <= (0x7ff>>1))
|
||||
{
|
||||
return m_rom_ptr[offset & 0x3fff];
|
||||
}
|
||||
|
||||
return m_rom_ptr[offset & 0x3fff];
|
||||
}
|
||||
|
||||
//printf("read device space @ %x\n", tmp<<1);
|
||||
return m_type1space->read16(space, tmp, mem_mask);
|
||||
|
||||
case 2: // VME space
|
||||
//printf("Read VME2 @ %x\n", tmp<<1);
|
||||
break;
|
||||
case 2: // type 2 space
|
||||
return m_type2space->read16(space, tmp, mem_mask);
|
||||
|
||||
case 3: // more VME
|
||||
//printf("Read VME3 @ %x\n", tmp<<1);
|
||||
break;
|
||||
case 3: // type 3 space
|
||||
return m_type3space->read16(space, tmp, mem_mask);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -344,7 +327,7 @@ WRITE16_MEMBER( sun2_state::tl_mmu_w )
|
||||
{
|
||||
if (offset & 0x4) // set for CPU space
|
||||
{
|
||||
switch (offset)
|
||||
switch (offset & 7)
|
||||
{
|
||||
case 4:
|
||||
//printf("sun2: Write? IDPROM @ %x\n", offset<<1);
|
||||
@ -373,7 +356,7 @@ WRITE16_MEMBER( sun2_state::tl_mmu_w )
|
||||
return;
|
||||
|
||||
case 7:
|
||||
printf("sun2: Write %04x to system enable\n", data);
|
||||
//printf("sun2: Write %04x to system enable\n", data);
|
||||
COMBINE_DATA(&m_sysenable);
|
||||
return;
|
||||
}
|
||||
@ -386,20 +369,10 @@ WRITE16_MEMBER( sun2_state::tl_mmu_w )
|
||||
{
|
||||
case 0: // page map
|
||||
case 1:
|
||||
page = (offset >> 10) & 0xfff;
|
||||
if (offset >= HOLE_START)
|
||||
{
|
||||
if (offset <= HOLE_END)
|
||||
{
|
||||
page = HOLE_PAGE;
|
||||
}
|
||||
else
|
||||
{
|
||||
page &= 0xfff;
|
||||
}
|
||||
}
|
||||
page = m_segmap[m_context & 7][offset >> 14] << 4;
|
||||
page += ((offset >> 10) & 0xf);
|
||||
|
||||
printf("sun2: Write %04x to page map at %x (entry %d), ", data, offset<<1, page);
|
||||
//printf("sun2: Write %04x to page map at %x (entry %d), ", data, offset<<1, page);
|
||||
if (offset & 1) // low-order 16 bits
|
||||
{
|
||||
m_pagemap[page] &= 0xffff0000;
|
||||
@ -410,11 +383,11 @@ WRITE16_MEMBER( sun2_state::tl_mmu_w )
|
||||
m_pagemap[page] &= 0x0000ffff;
|
||||
m_pagemap[page] |= (data<<16);
|
||||
}
|
||||
printf("entry now %08x (adr %08x PC=%x)\n", m_pagemap[page], (m_pagemap[page] & 0xfffff) << 11, m_maincpu->pc);
|
||||
//printf("entry now %08x (adr %08x PC=%x)\n", m_pagemap[page], (m_pagemap[page] & 0xfffff) << 11, m_maincpu->pc);
|
||||
return;
|
||||
|
||||
case 2: // segment map
|
||||
printf("sun2: Write %02x to segment map at %x (entry %d, user ctx %d PC=%x)\n", data & 0xff, offset<<1, offset>>14, m_context & 7, m_maincpu->pc);
|
||||
//printf("sun2: Write %02x to segment map at %x (entry %d, user ctx %d PC=%x)\n", data & 0xff, offset<<1, offset>>14, m_context & 7, m_maincpu->pc);
|
||||
m_segmap[m_context & 7][offset >> 14] = data & 0xff;
|
||||
return;
|
||||
|
||||
@ -441,21 +414,21 @@ WRITE16_MEMBER( sun2_state::tl_mmu_w )
|
||||
|
||||
switch ((m_pagemap[entry] >> 22) & 7)
|
||||
{
|
||||
case 0: // main RAM space
|
||||
if (tmp < m_ram_size_words) COMBINE_DATA(&m_ram_ptr[tmp]);
|
||||
case 0: // type 0
|
||||
m_type0space->write16(space, tmp, data, mem_mask);
|
||||
return;
|
||||
|
||||
case 1: // device space
|
||||
case 1: // type 1
|
||||
//printf("write device space @ %x\n", tmp<<1);
|
||||
m_type1space->write16(space, tmp, data, mem_mask);
|
||||
return;
|
||||
|
||||
case 2: // VME space
|
||||
printf("Write VME space\n");
|
||||
case 2: // type 2
|
||||
m_type2space->write16(space, tmp, data, mem_mask);
|
||||
break;
|
||||
|
||||
case 3: // more VME
|
||||
printf("Write 2nd VME space\n");
|
||||
case 3: // type 3
|
||||
m_type3space->write16(space, tmp, data, mem_mask);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -468,25 +441,72 @@ WRITE16_MEMBER( sun2_state::tl_mmu_w )
|
||||
}
|
||||
|
||||
// BW2 video control
|
||||
READ16_MEMBER( sun2_state::video_ctrl_r )
|
||||
{
|
||||
return m_bw2_ctrl;
|
||||
}
|
||||
|
||||
WRITE16_MEMBER( sun2_state::video_ctrl_w )
|
||||
{
|
||||
printf("sun2: BW2: %x to video_ctrl\n", data);
|
||||
//printf("sun2: BW2: %x to video_ctrl\n", data);
|
||||
COMBINE_DATA(&m_bw2_ctrl);
|
||||
}
|
||||
|
||||
static ADDRESS_MAP_START(sun2_mem, AS_PROGRAM, 16, sun2_state)
|
||||
AM_RANGE(0x000000, 0xffffff) AM_READWRITE( tl_mmu_r, tl_mmu_w )
|
||||
ADDRESS_MAP_END
|
||||
|
||||
// VME memory spaces
|
||||
// type 0 device space
|
||||
static ADDRESS_MAP_START(vmetype0space_map, AS_PROGRAM, 16, sun2_state)
|
||||
AM_RANGE(0x000000, 0x7fffff) AM_READWRITE(ram_r, ram_w)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
// type 1 device space
|
||||
static ADDRESS_MAP_START(type1space_map, AS_PROGRAM, 16, sun2_state)
|
||||
static ADDRESS_MAP_START(vmetype1space_map, AS_PROGRAM, 16, sun2_state)
|
||||
AM_RANGE(0x000000, 0x01ffff) AM_RAM AM_SHARE("bw2_vram")
|
||||
AM_RANGE(0x020000, 0x020001) AM_READWRITE( video_ctrl_r, video_ctrl_w )
|
||||
AM_RANGE(0x7f0000, 0x7f07ff) AM_ROM AM_REGION("bootprom", 0) // uses MMU loophole to read 32k from a 2k window
|
||||
// 7f0800-7f0fff: Ethernet interface
|
||||
// 7f1000-7f17ff: AM9518 encryption processor
|
||||
// 7f1800-7f1fff: Keyboard/mouse SCC8530
|
||||
// 7f2000-7f27ff: RS232 ports SCC8530
|
||||
// 7f2800-7f2fff: AM9513 timer
|
||||
AM_RANGE(0xc20000, 0xc20001) AM_WRITE( video_ctrl_w )
|
||||
ADDRESS_MAP_END
|
||||
|
||||
// type 2 device space
|
||||
static ADDRESS_MAP_START(vmetype2space_map, AS_PROGRAM, 16, sun2_state)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
// type 3 device space
|
||||
static ADDRESS_MAP_START(vmetype3space_map, AS_PROGRAM, 16, sun2_state)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
// Multibus memory spaces
|
||||
// type 0 device space
|
||||
static ADDRESS_MAP_START(mbustype0space_map, AS_PROGRAM, 16, sun2_state)
|
||||
AM_RANGE(0x000000, 0x3fffff) AM_READWRITE(ram_r, ram_w)
|
||||
// 7f80000-7f807ff: Keyboard/mouse SCC8530
|
||||
AM_RANGE(0x7f00000, 0x7f1ffff) AM_RAM AM_SHARE("bw2_vram")
|
||||
AM_RANGE(0x7f81800, 0x7f81801) AM_READWRITE( video_ctrl_r, video_ctrl_w )
|
||||
ADDRESS_MAP_END
|
||||
|
||||
// type 1 device space
|
||||
static ADDRESS_MAP_START(mbustype1space_map, AS_PROGRAM, 16, sun2_state)
|
||||
AM_RANGE(0x000000, 0x0007ff) AM_ROM AM_REGION("bootprom", 0) // uses MMU loophole to read 32k from a 2k window
|
||||
// 001000-0017ff: AM9518 encryption processor
|
||||
// 001800-001fff: Keyboard/mouse parallel port
|
||||
// 002000-0027ff: RS232 ports SCC8530
|
||||
// 002800-002fff: AM9513 timer
|
||||
// 003800-003fff: MM58167 RTC
|
||||
ADDRESS_MAP_END
|
||||
|
||||
// type 2 device space (Multibus memory space)
|
||||
static ADDRESS_MAP_START(mbustype2space_map, AS_PROGRAM, 16, sun2_state)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
// type 3 device space (Multibus I/O space)
|
||||
static ADDRESS_MAP_START(mbustype3space_map, AS_PROGRAM, 16, sun2_state)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
UINT32 sun2_state::bw2_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
@ -497,12 +517,14 @@ UINT32 sun2_state::bw2_update(screen_device &screen, bitmap_rgb32 &bitmap, const
|
||||
static const UINT32 palette[2] = { 0, 0xffffff };
|
||||
UINT8 *m_vram = (UINT8 *)m_bw2_vram.target();
|
||||
|
||||
if (!(m_bw2_ctrl & 0x8000)) return 0;
|
||||
|
||||
for (y = 0; y < 900; y++)
|
||||
{
|
||||
scanline = &bitmap.pix32(y);
|
||||
for (x = 0; x < 1152/8; x++)
|
||||
{
|
||||
pixels = m_vram[(y * (1152/8)) + (BYTE4_XOR_BE(x))];
|
||||
pixels = m_vram[(y * (1152/8)) + x ^ 1];
|
||||
|
||||
*scanline++ = palette[(pixels>>7)&1];
|
||||
*scanline++ = palette[(pixels>>6)&1];
|
||||
@ -525,6 +547,7 @@ INPUT_PORTS_END
|
||||
void sun2_state::machine_start()
|
||||
{
|
||||
m_rom_ptr = (UINT16 *)m_rom->base();
|
||||
m_idprom_ptr = (UINT8 *)m_idprom->base();
|
||||
m_ram_ptr = (UINT16 *)m_ram->pointer();
|
||||
m_ram_size = m_ram->size();
|
||||
m_ram_size_words = m_ram_size >> 1;
|
||||
@ -542,18 +565,85 @@ void sun2_state::machine_reset()
|
||||
m_maincpu->reset();
|
||||
}
|
||||
|
||||
static MACHINE_CONFIG_START( sun2, sun2_state )
|
||||
static MACHINE_CONFIG_START( sun2vme, sun2_state )
|
||||
/* basic machine hardware */
|
||||
MCFG_CPU_ADD("maincpu", M68010, 16670000)
|
||||
MCFG_CPU_PROGRAM_MAP(sun2_mem)
|
||||
|
||||
MCFG_RAM_ADD(RAM_TAG)
|
||||
MCFG_RAM_DEFAULT_SIZE("2M")
|
||||
MCFG_RAM_EXTRA_OPTIONS("4M,6M,8M")
|
||||
MCFG_RAM_DEFAULT_VALUE(0x00)
|
||||
|
||||
// MMU Type 0 device space
|
||||
MCFG_DEVICE_ADD("type0", ADDRESS_MAP_BANK, 0)
|
||||
MCFG_DEVICE_PROGRAM_MAP(vmetype0space_map)
|
||||
MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
|
||||
MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
|
||||
MCFG_ADDRESS_MAP_BANK_STRIDE(0x1000000)
|
||||
|
||||
// MMU Type 1 device space
|
||||
MCFG_DEVICE_ADD("type1", ADDRESS_MAP_BANK, 0)
|
||||
MCFG_DEVICE_PROGRAM_MAP(type1space_map)
|
||||
MCFG_DEVICE_PROGRAM_MAP(vmetype1space_map)
|
||||
MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
|
||||
MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
|
||||
MCFG_ADDRESS_MAP_BANK_STRIDE(0x1000000)
|
||||
|
||||
// MMU Type 2 device space
|
||||
MCFG_DEVICE_ADD("type2", ADDRESS_MAP_BANK, 0)
|
||||
MCFG_DEVICE_PROGRAM_MAP(vmetype2space_map)
|
||||
MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
|
||||
MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
|
||||
MCFG_ADDRESS_MAP_BANK_STRIDE(0x1000000)
|
||||
|
||||
// MMU Type 3 device space
|
||||
MCFG_DEVICE_ADD("type3", ADDRESS_MAP_BANK, 0)
|
||||
MCFG_DEVICE_PROGRAM_MAP(vmetype3space_map)
|
||||
MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
|
||||
MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
|
||||
MCFG_ADDRESS_MAP_BANK_STRIDE(0x1000000)
|
||||
|
||||
MCFG_SCREEN_ADD("bwtwo", RASTER)
|
||||
MCFG_SCREEN_UPDATE_DRIVER(sun2_state, bw2_update)
|
||||
MCFG_SCREEN_SIZE(1152,900)
|
||||
MCFG_SCREEN_VISIBLE_AREA(0, 1152-1, 0, 900-1)
|
||||
MCFG_SCREEN_REFRESH_RATE(72)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
static MACHINE_CONFIG_START( sun2mbus, sun2_state )
|
||||
/* basic machine hardware */
|
||||
MCFG_CPU_ADD("maincpu", M68010, 16670000)
|
||||
MCFG_CPU_PROGRAM_MAP(sun2_mem)
|
||||
|
||||
MCFG_RAM_ADD(RAM_TAG)
|
||||
MCFG_RAM_DEFAULT_SIZE("2M")
|
||||
MCFG_RAM_EXTRA_OPTIONS("4M")
|
||||
MCFG_RAM_DEFAULT_VALUE(0x00)
|
||||
|
||||
// MMU Type 0 device space
|
||||
MCFG_DEVICE_ADD("type0", ADDRESS_MAP_BANK, 0)
|
||||
MCFG_DEVICE_PROGRAM_MAP(mbustype0space_map)
|
||||
MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
|
||||
MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
|
||||
MCFG_ADDRESS_MAP_BANK_STRIDE(0x1000000)
|
||||
|
||||
// MMU Type 1 device space
|
||||
MCFG_DEVICE_ADD("type1", ADDRESS_MAP_BANK, 0)
|
||||
MCFG_DEVICE_PROGRAM_MAP(mbustype1space_map)
|
||||
MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
|
||||
MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
|
||||
MCFG_ADDRESS_MAP_BANK_STRIDE(0x1000000)
|
||||
|
||||
// MMU Type 2 device space
|
||||
MCFG_DEVICE_ADD("type2", ADDRESS_MAP_BANK, 0)
|
||||
MCFG_DEVICE_PROGRAM_MAP(mbustype2space_map)
|
||||
MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
|
||||
MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
|
||||
MCFG_ADDRESS_MAP_BANK_STRIDE(0x1000000)
|
||||
|
||||
// MMU Type 3 device space
|
||||
MCFG_DEVICE_ADD("type3", ADDRESS_MAP_BANK, 0)
|
||||
MCFG_DEVICE_PROGRAM_MAP(mbustype3space_map)
|
||||
MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
|
||||
MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
|
||||
MCFG_ADDRESS_MAP_BANK_STRIDE(0x1000000)
|
||||
@ -569,16 +659,22 @@ MACHINE_CONFIG_END
|
||||
ROM_START( sun2_120 )
|
||||
ROM_REGION( 0x8000, "bootprom", ROMREGION_ERASEFF )
|
||||
ROM_LOAD16_WORD_SWAP( "sun2-multi-rev-r.bin", 0x0000, 0x8000, CRC(4df0df77) SHA1(4d6bcf09ddc9cc8f5823847b8ea88f98fe4a642e))
|
||||
|
||||
ROM_REGION( 0x20, "idprom", ROMREGION_ERASEFF)
|
||||
ROM_LOAD( "sun2120-idprom.bin", 0x000000, 0x000020, CRC(eec8cd1d) SHA1(6a78dc0ea6f9cc7687cffea754d65864fb751ebf) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( sun2_50)
|
||||
ROM_START( sun2_50 )
|
||||
ROM_REGION( 0x8000, "bootprom", ROMREGION_ERASEFF )
|
||||
ROM_LOAD16_BYTE( "250_q_8.rom", 0x0001, 0x4000, CRC(5bfacb5c) SHA1(ec7fb3fb0217b0138ba4748b7c79b8ff0cad896b))
|
||||
ROM_LOAD16_BYTE( "250_q_0.rom", 0x0000, 0x4000, CRC(2ee29abe) SHA1(82f52b9f25e92387329581f7c8ba50a171784968))
|
||||
|
||||
ROM_REGION( 0x20, "idprom", ROMREGION_ERASEFF)
|
||||
ROM_LOAD( "sun250-idprom.bin", 0x000000, 0x000020, CRC(927744ab) SHA1(d29302b69128165e69dd3a79b8c8d45f2163b88a) )
|
||||
ROM_END
|
||||
|
||||
/* Driver */
|
||||
|
||||
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
|
||||
COMP( 1984, sun2_50, 0, 0, sun2, sun2, driver_device, 0, "Sun Microsystems", "Sun 2/50", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
|
||||
COMP( 1984, sun2_120, 0, 0, sun2, sun2, driver_device, 0, "Sun Microsystems", "Sun 2/120", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
|
||||
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
|
||||
COMP( 1984, sun2_50, 0, 0, sun2vme, sun2, driver_device, 0, "Sun Microsystems", "Sun 2/50", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
|
||||
COMP( 1984, sun2_120, 0, 0, sun2mbus, sun2, driver_device, 0, "Sun Microsystems", "Sun 2/120", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
|
||||
|
Loading…
Reference in New Issue
Block a user