configurable ram, improved system regs, enum masks

also initial implementation of unmapped memory handler
This commit is contained in:
Patrick Mackinlay 2017-06-20 13:10:29 +07:00
parent d4b5731dd9
commit 8bb75751d2
2 changed files with 271 additions and 143 deletions

View File

@ -3,7 +3,7 @@
#include "emu.h"
#define NEW_SCSI 0
#define NEW_SCSI 1
#include "includes/interpro.h"
#include "debugger.h"
@ -20,91 +20,81 @@
// machine start
void interpro_state::machine_start()
{
m_system_reg[SREG_CTRL2] = CTRL2_COLDSTART | CTRL2_PWRENA | CTRL2_PWRUP;
m_sreg_ctrl2 = CTRL2_COLDSTART | CTRL2_PWRENA | CTRL2_PWRUP;
}
void interpro_state::machine_reset()
{
// flash rom requires the following values
m_system_reg[SREG_ERROR] = 0x00;
m_system_reg[SREG_STATUS] = 0x400;
m_system_reg[SREG_CTRL1] = CTRL1_FLOPRDY;
m_sreg_error = 0x00;
m_sreg_status = 0x400;
m_sreg_ctrl1 = CTRL1_FLOPRDY;
}
WRITE16_MEMBER(interpro_state::system_w)
WRITE16_MEMBER(interpro_state::sreg_ctrl1_w)
{
switch (offset)
{
case SREG_LED:
LOG_SYSTEM("LED value %d at %s\n", data, machine().describe_context());
break;
LOG_SYSTEM("system control register 1 write data 0x%x (%s)\n", data, machine().describe_context());
case SREG_STATUS: // not sure if writable?
break;
case SREG_CTRL1:
LOG_SYSTEM("system control register 1 write data 0x%x pc %s\n", data, machine().describe_context());
if ((data ^ m_system_reg[offset]) & CTRL1_LEDDP)
if ((data ^ m_sreg_ctrl1) & CTRL1_LEDDP)
LOG_SYSTEM("LED decimal point %s\n", data & CTRL1_LEDDP ? "on" : "off");
m_system_reg[offset] = data;
break;
m_sreg_ctrl1 = data;
}
case SREG_CTRL2:
LOG_SYSTEM("system control register 2 write data 0x%x at %s\n", data, machine().describe_context());
WRITE16_MEMBER(interpro_state::sreg_ctrl2_w)
{
LOG_SYSTEM("system control register 2 write data 0x%x (%s)\n", data, machine().describe_context());
if (data & CTRL2_RESET)
{
m_system_reg[SREG_CTRL2] &= ~CTRL2_COLDSTART;
m_sreg_ctrl1 &= ~CTRL2_COLDSTART;
machine().schedule_soft_reset();
}
else
m_system_reg[offset] = data & 0x0f; // top four bits are not persistent
break;
}
m_sreg_ctrl1 = data & CTRL2_WMASK;
}
READ16_MEMBER(interpro_state::system_r)
READ16_MEMBER(interpro_state::sreg_error_r)
{
LOG_SYSTEM("system register read offset %d at %s\n", offset, machine().describe_context());
switch (offset)
{
case SREG_ERROR:
case SREG_STATUS:
case SREG_CTRL1:
case SREG_CTRL2:
default:
return m_system_reg[offset];
break;
}
u16 result = m_sreg_error;
// clear error register on read
m_sreg_error = 0;
return result;
}
READ32_MEMBER(interpro_state::idprom_r)
READ8_MEMBER(interpro_state::idprom_r)
{
LOG_IDPROM("idprom read offset 0x%x mask 0x%08x at %s\n", offset, mem_mask, machine().describe_context());
// abitrary fake number for now, not working properly
u32 speed = 20000000;
u32 speed1 = speed >> 24;
u32 speed2 = speed >> 16;
u32 speed3 = speed >> 8;
// compute femtoseconds per cycle from main cpu clock
u32 speed = 1'000'000'000'000'000 / m_maincpu->clock();
static uint8_t idprom[] = {
static u8 idprom[] = {
// module type id
'M', 'P', 'C', 'B',
'0', '1', '4', '5',
0x00, 0x00, 0x00, 0x00, // board type MSMT/MPCB - detected by feature[3]
'1', '2', '3', // board number
'A', // board revision
// ECO bytes
0x87, 0x65, 0x43, 0x21,
0xbb, 0xcc, 0xdd, 0xee,
// the following 8 bytes are "feature bytes"
// the feature bytes contain a 32 bit word which is divided by 40000
// if they're empty, a default value of 50 000 000 is used
// perhaps this is a system speed (50MHz)?
0x2, 0x34, 0x56, 0x78,
(u8)speed, (u8)speed3, (u8)speed2, (u8)speed1,
// for a 2700/2800/2500 system board, the first feature byte selects the variant
// model = (feature[0] & 0x2) ? (feature[0] & 0x8 ? 2700 : 2800) : 2500
// 0x0a, // 2700 series
0x02, // 2800 series
// 0x00, // 2500 series
0x00, 0x00,
0x80, // board type, 0x80 = MPCB, 0x00 = MSMT
// for the system boards, these bytes contain cpu clock speed (as femtoseconds per cycle, big-endian)
(u8)(speed >> 24), (u8)(speed >> 16), (u8)(speed >> 8), (u8)(speed >> 0),
// reserved bytes
0xff, 0xff,
@ -113,8 +103,14 @@ READ32_MEMBER(interpro_state::idprom_r)
// boot rom tests for family == 0x41 or 0x42
// if so, speed read from feature bytes 2 & 3
// if not, read speed from feature bytes 4-7
0x41, 0x00, // 2800-series CPU
//0x24, 0x00, // 2000-series system board
//0x24, 0x00, // 2000
// 0x31, 0x00, // 2400
0x39, 0x00, // 2700/2800/2500 depending on first feature byte (0xa, 0x2, 0x0)
// 0x40, 0x00, // 6700
// 0x41, 0x00, // idprom reports as 2800 series cpu?
//0x42, 0x00, // 6800 series
// footprint and checksum
0x55, 0xaa, 0x55, 0x00
@ -124,13 +120,13 @@ READ32_MEMBER(interpro_state::idprom_r)
{
case 0x1f:
{
uint8_t sum = 0;
u8 sum = 0;
// compute the checksum (sum of all bytes must be == 0x00)
for (int i = 0; i < 0x20; i++)
sum += idprom[i];
return 0x100 - (sum & 0xff);
return 0x100 - sum;
}
default:
@ -138,19 +134,74 @@ READ32_MEMBER(interpro_state::idprom_r)
}
}
READ32_MEMBER(interpro_state::slot0_r)
READ8_MEMBER(interpro_state::slot0_r)
{
#if 0
// a known graphics board idprom
static uint8_t slot0[] = {
static u8 slot0[] = {
0x00, 0x00, 0x00, 0x00, '9', '6', '3', 'A', // board
0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // eco
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // features
0xff, 0xff, // reserved
0x22, 0x00, // family
0x55, 0xaa, 0x55, 0x00
0x55, 0xaa, 0x55, // footprint
0x00 // checksum
};
#else
static u8 slot0[] = {
0x00, 0x00, 0x00, 0x00, '1', '1', '1', 'A', // board
0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // eco
0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, // features
0xff, 0xff, // reserved
0x05, 0x00, // family
0x55, 0xaa, 0x55, // footprint
0x00 // checksum
};
#endif
switch (offset)
{
case 0x1f:
{
u8 sum = 0;
return ((uint8_t *)&slot0)[offset % 32];
// compute the checksum (sum of all bytes must be == 0x00)
for (int i = 0; i < 0x20; i++)
sum += slot0[i];
return 0x100 - sum;
}
default:
return slot0[offset];
}
}
READ32_MEMBER(interpro_state::unmapped_r)
{
// check if non-existent memory errors are enabled
if (m_srarb->tmctrl_r(space, offset, mem_mask) & interpro_srarb_device::TMCTRL_ENNEM)
{
// flag non-existent memory error in system error register
m_sreg_error |= (ERROR_SRXNEM | ERROR_SRXVALID);
// tell ioga to raise a bus error
m_ioga->bus_error(space, interpro_ioga_device::BINFO_BERR | interpro_ioga_device::BINFO_SNAPOK, offset << 2);
}
return space.unmap();
}
WRITE32_MEMBER(interpro_state::unmapped_w)
{
// check if non-existent memory errors are enabled
if (m_srarb->tmctrl_r(space, offset, mem_mask) & interpro_srarb_device::TMCTRL_ENNEM)
{
// flag non-existent memory error in system error register
m_sreg_error |= (ERROR_SRXNEM | ERROR_SRXVALID);
// tell ioga to raise a bus error
m_ioga->bus_error(space, interpro_ioga_device::BINFO_BERR | interpro_ioga_device::BINFO_SNAPOK, offset << 2);
}
}
WRITE8_MEMBER(interpro_state::rtc_w)
@ -271,6 +322,19 @@ WRITE8_MEMBER(interpro_state::scsi_dma_w)
DRIVER_INIT_MEMBER(interpro_state, ip2800)
{
// FIXME: not all memory sizes are reported properly using fdm "5 inqhw" and "optimum_memory" commands
// 16 = reports 16M, banks empty?
// 32 = reports 16M, banks empty?
// 64 = reports 128M, 16x8
// 128 = reports 128M, 16x8
// 256 = reports 256M, 32x8
// grab the main memory space from the mmu
address_space &space = m_mmu->space(AS_0);
// map the configured ram
space.install_ram(0, m_ram->mask(), m_ram->pointer());
}
#if NEW_SCSI
@ -280,7 +344,7 @@ static SLOT_INTERFACE_START(interpro_scsi_devices)
SLOT_INTERFACE_INTERNAL(INTERPRO_SCSI_ADAPTER_TAG, NCR53C94)
SLOT_INTERFACE_END
static MACHINE_CONFIG_FRAGMENT(interpro_scsi_adapter)
static MACHINE_CONFIG_START(interpro_scsi_adapter)
MCFG_DEVICE_CLOCK(XTAL_12_5MHz)
MCFG_NCR5390_IRQ_HANDLER(DEVWRITELINE(":" INTERPRO_IOGA_TAG, interpro_ioga_device, ir0_w))
MCFG_NCR5390_DRQ_HANDLER(DEVWRITELINE(":" INTERPRO_IOGA_TAG, interpro_ioga_device, drq_scsi))
@ -296,50 +360,49 @@ static ADDRESS_MAP_START(clipper_data_map, AS_DATA, 32, interpro_state)
AM_RANGE(0x00000000, 0xffffffff) AM_DEVREADWRITE32(INTERPRO_MMU_TAG, cammu_device, data_r, data_w, 0xffffffff)
ADDRESS_MAP_END
// these maps represent the real main, i/o and boot spaces of the system
static ADDRESS_MAP_START(interpro_main_map, AS_0, 32, interpro_state)
AM_RANGE(0x00000000, 0x00ffffff) AM_RAM // 16M RAM
AM_RANGE(0x40000000, 0x4000003f) AM_DEVICE(INTERPRO_MCGA_TAG, interpro_fmcc_device, map)
AM_RANGE(0x4f007e00, 0x4f007eff) AM_DEVICE(INTERPRO_SGA_TAG, interpro_sga_device, map)
AM_RANGE(0x7f000100, 0x7f00011f) AM_DEVICE8(INTERPRO_FDC_TAG, n82077aa_device, map, 0xff)
AM_RANGE(0x7f000200, 0x7f0002ff) AM_DEVICE(INTERPRO_SRARB_TAG, interpro_srarb_device, map)
AM_RANGE(0x7f000300, 0x7f00030f) AM_READWRITE16(system_r, system_w, 0xffff)
AM_RANGE(0x7f000400, 0x7f00040f) AM_DEVREADWRITE8(INTERPRO_SCC1_TAG, scc85c30_device, ba_cd_inv_r, ba_cd_inv_w, 0xff)
AM_RANGE(0x7f000410, 0x7f00041f) AM_DEVREADWRITE8(INTERPRO_SCC2_TAG, scc85230_device, ba_cd_inv_r, ba_cd_inv_w, 0xff)
AM_RANGE(0x7f000500, 0x7f0006ff) AM_READWRITE8(rtc_r, rtc_w, 0xff)
AM_RANGE(0x7f000700, 0x7f00077f) AM_READ(idprom_r)
AM_RANGE(0x7f001000, 0x7f001fff) AM_READWRITE8(scsi_r, scsi_w, 0x0000ff00)
AM_RANGE(0x7f0fff00, 0x7f0fffff) AM_DEVICE(INTERPRO_IOGA_TAG, interpro_ioga_device, map)
AM_RANGE(0x7f100000, 0x7f11ffff) AM_ROM AM_REGION(INTERPRO_EPROM_TAG, 0)
AM_RANGE(0x7f180000, 0x7f1bffff) AM_ROM AM_REGION(INTERPRO_FLASH_TAG, 0)
AM_RANGE(0x08000000, 0x08000fff) AM_NOP // bogus
AM_RANGE(0x8f000000, 0x8f0fffff) AM_NOP // AM_READ(slot0_r)
ADDRESS_MAP_END
static ADDRESS_MAP_START(interpro_io_map, AS_1, 32, interpro_state)
AM_RANGE(0x00000000, 0x00001fff) AM_DEVICE(INTERPRO_MMU_TAG, cammu_device, map)
static ADDRESS_MAP_START(interpro_common_map, AS_0, 32, interpro_state)
AM_RANGE(0x40000000, 0x4000004f) AM_DEVICE(INTERPRO_MCGA_TAG, interpro_fmcc_device, map)
AM_RANGE(0x4f007e00, 0x4f007eff) AM_DEVICE(INTERPRO_SGA_TAG, interpro_sga_device, map)
AM_RANGE(0x7f000100, 0x7f00011f) AM_DEVICE8(INTERPRO_FDC_TAG, n82077aa_device, map, 0xff)
AM_RANGE(0x7f000200, 0x7f0002ff) AM_DEVICE(INTERPRO_SRARB_TAG, interpro_srarb_device, map)
AM_RANGE(0x7f000300, 0x7f00030f) AM_READWRITE16(system_r, system_w, 0xffff)
AM_RANGE(0x7f000300, 0x7f000303) AM_READ16(sreg_error_r, 0xffff)
AM_RANGE(0x7f000304, 0x7f000307) AM_READWRITE16(sreg_status_r, sreg_led_w, 0xffff)
AM_RANGE(0x7f000308, 0x7f00030b) AM_READWRITE16(sreg_ctrl1_r, sreg_ctrl1_w, 0xffff)
AM_RANGE(0x7f00030c, 0x7f00030f) AM_READWRITE16(sreg_ctrl2_r, sreg_ctrl2_w, 0xffff)
AM_RANGE(0x7f00031c, 0x7f00031f) AM_READWRITE16(sreg_ctrl3_r, sreg_ctrl3_w, 0xffff)
AM_RANGE(0x7f000400, 0x7f00040f) AM_DEVREADWRITE8(INTERPRO_SCC1_TAG, scc85c30_device, ba_cd_inv_r, ba_cd_inv_w, 0xff)
AM_RANGE(0x7f000410, 0x7f00041f) AM_DEVREADWRITE8(INTERPRO_SCC2_TAG, scc85230_device, ba_cd_inv_r, ba_cd_inv_w, 0xff)
AM_RANGE(0x7f000500, 0x7f0006ff) AM_READWRITE8(rtc_r, rtc_w, 0xff)
AM_RANGE(0x7f000700, 0x7f00077f) AM_READ(idprom_r)
AM_RANGE(0x7f000700, 0x7f00077f) AM_READ8(idprom_r, 0xff)
AM_RANGE(0x7f001000, 0x7f001fff) AM_READWRITE8(scsi_r, scsi_w, 0x0000ff00)
AM_RANGE(0x7f0fff00, 0x7f0fffff) AM_DEVICE(INTERPRO_IOGA_TAG, interpro_ioga_device, map)
AM_RANGE(0x08000000, 0x08000fff) AM_NOP // bogus
AM_RANGE(0x8f000000, 0x8f0fffff) AM_NOP // AM_READ(slot0_r)
AM_RANGE(0x87000000, 0x8700007f) AM_READ8(slot0_r, 0xff)
// 2800 (CBUS?) slots are mapped as follows
AM_RANGE(0x87000000, 0x8700007f) AM_MIRROR(0x78000000) AM_READWRITE(unmapped_r, unmapped_w)
ADDRESS_MAP_END
// these maps represent the real main, i/o and boot spaces of the system
static ADDRESS_MAP_START(interpro_main_map, AS_0, 32, interpro_state)
AM_RANGE(0x00000000, 0x00ffffff) AM_RAM AM_SHARE(RAM_TAG)
AM_RANGE(0x7f100000, 0x7f11ffff) AM_ROM AM_REGION(INTERPRO_EPROM_TAG, 0)
AM_RANGE(0x7f180000, 0x7f1bffff) AM_ROM AM_REGION(INTERPRO_FLASH_TAG, 0)
AM_IMPORT_FROM(interpro_common_map)
ADDRESS_MAP_END
static ADDRESS_MAP_START(interpro_io_map, AS_1, 32, interpro_state)
AM_RANGE(0x00000000, 0x00001fff) AM_DEVICE(INTERPRO_MMU_TAG, cammu_device, map)
AM_IMPORT_FROM(interpro_common_map)
ADDRESS_MAP_END
static ADDRESS_MAP_START(interpro_boot_map, AS_2, 32, interpro_state)
@ -360,7 +423,7 @@ static INPUT_PORTS_START(ip2800)
INPUT_PORTS_END
static MACHINE_CONFIG_START(ip2800)
MCFG_CPU_ADD(INTERPRO_CPU_TAG, CLIPPER_C400, XTAL_10MHz)
MCFG_CPU_ADD(INTERPRO_CPU_TAG, CLIPPER_C400, XTAL_12_5MHz)
MCFG_CPU_PROGRAM_MAP(clipper_insn_map)
MCFG_CPU_DATA_MAP(clipper_data_map)
MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE(INTERPRO_IOGA_TAG, interpro_ioga_device, inta_cb)
@ -371,26 +434,47 @@ static MACHINE_CONFIG_START(ip2800)
MCFG_DEVICE_ADDRESS_MAP(AS_2, interpro_boot_map)
MCFG_CAMMU_SSW_CB(DEVREAD32(INTERPRO_CPU_TAG, clipper_device, ssw))
// serial controllers and rs232 bus
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("16M")
MCFG_RAM_EXTRA_OPTIONS("32M,64M,128M,256M")
// TODO: work out serial port assignments for mouse, console, keyboard and ?
// first serial controller and devices
MCFG_SCC85C30_ADD(INTERPRO_SCC1_TAG, XTAL_4_9152MHz, 0, 0, 0, 0)
MCFG_Z80SCC_OUT_TXDA_CB(DEVWRITELINE("rs232a", rs232_port_device, write_txd))
MCFG_Z80SCC_OUT_TXDB_CB(DEVWRITELINE("rs232b", rs232_port_device, write_txd))
MCFG_Z80SCC_OUT_TXDA_CB(DEVWRITELINE(INTERPRO_SERIAL1_TAG, rs232_port_device, write_txd))
MCFG_Z80SCC_OUT_TXDB_CB(DEVWRITELINE(INTERPRO_SERIAL2_TAG, rs232_port_device, write_txd))
MCFG_Z80SCC_OUT_INT_CB(DEVWRITELINE(INTERPRO_IOGA_TAG, interpro_ioga_device, ir11_w))
MCFG_RS232_PORT_ADD("rs232a", default_rs232_devices, nullptr)
// is this the keyboard port?
MCFG_RS232_PORT_ADD(INTERPRO_SERIAL1_TAG, default_rs232_devices, nullptr) // "keyboard"
MCFG_RS232_RXD_HANDLER(DEVWRITELINE(INTERPRO_SCC1_TAG, z80scc_device, rxa_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE(INTERPRO_SCC1_TAG, z80scc_device, dcda_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE(INTERPRO_SCC1_TAG, z80scc_device, ctsa_w))
// the following port is known as "port 2"
MCFG_RS232_PORT_ADD("rs232b", default_rs232_devices, "terminal")
// eprom uses this serial port for console (show_config calls "port 2")
MCFG_RS232_PORT_ADD(INTERPRO_SERIAL2_TAG, default_rs232_devices, "terminal")
MCFG_RS232_RXD_HANDLER(DEVWRITELINE(INTERPRO_SCC1_TAG, z80scc_device, rxb_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE(INTERPRO_SCC1_TAG, z80scc_device, dcdb_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE(INTERPRO_SCC1_TAG, z80scc_device, ctsb_w))
// second serial controller and devices
MCFG_SCC85230_ADD(INTERPRO_SCC2_TAG, XTAL_4_9152MHz, 0, 0, 0, 0)
MCFG_Z80SCC_OUT_TXDA_CB(DEVWRITELINE(INTERPRO_SERIAL3_TAG, rs232_port_device, write_txd))
MCFG_Z80SCC_OUT_TXDB_CB(DEVWRITELINE(INTERPRO_SERIAL4_TAG, rs232_port_device, write_txd))
MCFG_Z80SCC_OUT_INT_CB(DEVWRITELINE(INTERPRO_IOGA_TAG, interpro_ioga_device, ir11_w))
MCFG_RS232_PORT_ADD(INTERPRO_SERIAL3_TAG, default_rs232_devices, nullptr)
MCFG_RS232_RXD_HANDLER(DEVWRITELINE(INTERPRO_SCC1_TAG, z80scc_device, rxa_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE(INTERPRO_SCC1_TAG, z80scc_device, dcda_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE(INTERPRO_SCC1_TAG, z80scc_device, ctsa_w))
MCFG_RS232_PORT_ADD(INTERPRO_SERIAL4_TAG, default_rs232_devices, nullptr) //"terminal")
MCFG_RS232_RXD_HANDLER(DEVWRITELINE(INTERPRO_SCC1_TAG, z80scc_device, rxb_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE(INTERPRO_SCC1_TAG, z80scc_device, dcdb_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE(INTERPRO_SCC1_TAG, z80scc_device, ctsb_w))
// real-time clock/non-volatile memory
MCFG_MC146818_ADD(INTERPRO_RTC_TAG, XTAL_32_768kHz)
MCFG_MC146818_UTC(true)
@ -408,9 +492,9 @@ static MACHINE_CONFIG_START(ip2800)
#if NEW_SCSI
MCFG_NSCSI_BUS_ADD(INTERPRO_SCSI_TAG)
MCFG_NSCSI_ADD(INTERPRO_SCSI_TAG ":0", interpro_scsi_devices, "harddisk", false)
MCFG_NSCSI_ADD(INTERPRO_SCSI_TAG ":1", interpro_scsi_devices, "cdrom", false)
MCFG_NSCSI_ADD(INTERPRO_SCSI_TAG ":1", interpro_scsi_devices, nullptr, false)
MCFG_NSCSI_ADD(INTERPRO_SCSI_TAG ":2", interpro_scsi_devices, nullptr, false)
MCFG_NSCSI_ADD(INTERPRO_SCSI_TAG ":3", interpro_scsi_devices, nullptr, false)
MCFG_NSCSI_ADD(INTERPRO_SCSI_TAG ":3", interpro_scsi_devices, "cdrom", false)
MCFG_NSCSI_ADD(INTERPRO_SCSI_TAG ":4", interpro_scsi_devices, nullptr, false)
MCFG_NSCSI_ADD(INTERPRO_SCSI_TAG ":5", interpro_scsi_devices, nullptr, false)
MCFG_NSCSI_ADD(INTERPRO_SCSI_TAG ":6", interpro_scsi_devices, nullptr, false)
@ -419,7 +503,7 @@ static MACHINE_CONFIG_START(ip2800)
#else
MCFG_DEVICE_ADD(INTERPRO_SCSI_TAG, SCSI_PORT, 0)
MCFG_SCSIDEV_ADD(INTERPRO_SCSI_TAG ":" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_0)
MCFG_SCSIDEV_ADD(INTERPRO_SCSI_TAG ":" SCSI_PORT_DEVICE2, "cdrom", SCSICD, SCSI_ID_3)
MCFG_SCSIDEV_ADD(INTERPRO_SCSI_TAG ":" SCSI_PORT_DEVICE3, "cdrom", SCSICD, SCSI_ID_3)
MCFG_DEVICE_ADD(INTERPRO_SCSI_ADAPTER_TAG, NCR539X, XTAL_12_5MHz)
MCFG_LEGACY_SCSI_PORT(INTERPRO_SCSI_TAG)

View File

@ -9,6 +9,8 @@
#include "cpu/clipper/clipper.h"
#include "machine/cammu.h"
#include "machine/ram.h"
#include "machine/interpro_ioga.h"
#include "machine/interpro_mcga.h"
#include "machine/interpro_sga.h"
@ -39,7 +41,11 @@
#define INTERPRO_RTC_TAG "rtc"
#define INTERPRO_SCC1_TAG "scc1"
#define INTERPRO_SERIAL1_TAG "serial1"
#define INTERPRO_SERIAL2_TAG "serial2"
#define INTERPRO_SCC2_TAG "scc2"
#define INTERPRO_SERIAL3_TAG "serial3"
#define INTERPRO_SERIAL4_TAG "serial4"
#define INTERPRO_EPROM_TAG "eprom"
#define INTERPRO_FLASH_TAG "flash"
#define INTERPRO_TERMINAL_TAG "terminal"
@ -52,36 +58,6 @@
#define INTERPRO_SGA_TAG "sga"
#define INTERPRO_SRARB_TAG "srarb"
// system board register offsets
#define SREG_LED 0
#define SREG_ERROR 0
#define SREG_STATUS 1
#define SREG_CTRL1 2
#define SREG_CTRL2 3
// control register 1
#define CTRL1_FLOPLOW 0x0001
#define CTRL1_FLOPRDY 0x0002
#define CTRL1_LEDENA 0x0004
#define CTRL1_LEDDP 0x0008
#define CTRL1_ETHLOOP 0x0010
#define CTRL1_ETHDTR 0x0020
#define CTRL1_ETHRMOD 0x0040
#define CTRL1_CLIPRESET 0x0040
#define CTRL1_FIFOACTIVE 0x0080
// control register 2
#define CTRL2_PWRUP 0x0001
#define CTRL2_PWRENA 0x0002
#define CTRL2_HOLDOFF 0x0004
#define CTRL2_EXTNMIENA 0x0008
#define CTRL2_COLDSTART 0x0010
#define CTRL2_RESET 0x0020
#define CTRL2_BUSENA 0x0040
#define CTRL2_FRCPARITY 0x0080
#define CTRL2_FLASHEN 0x0080
#define CTRL2_WMASK 0x000f
class interpro_state : public driver_device
{
public:
@ -89,6 +65,7 @@ public:
: driver_device(mconfig, type, tag),
m_maincpu(*this, INTERPRO_CPU_TAG),
m_mmu(*this, INTERPRO_MMU_TAG),
m_ram(*this, RAM_TAG),
m_scc1(*this, INTERPRO_SCC1_TAG),
m_scc2(*this, INTERPRO_SCC2_TAG),
m_rtc(*this, INTERPRO_RTC_TAG),
@ -108,6 +85,8 @@ public:
required_device<clipper_device> m_maincpu;
required_device<cammu_device> m_mmu;
required_device<ram_device> m_ram;
// FIXME: not sure which one is the escc
required_device<z80scc_device> m_scc1;
required_device<z80scc_device> m_scc2;
@ -127,14 +106,73 @@ public:
DECLARE_DRIVER_INIT(ip2800);
DECLARE_WRITE16_MEMBER(system_w);
DECLARE_READ16_MEMBER(system_r);
enum sreg_error_mask
{
ERROR_BPID4 = 0x0001,
ERROR_SRXMMBE = 0x0002,
ERROR_SRXHOG = 0x0004,
ERROR_SRXNEM = 0x0008,
ERROR_SRXVALID = 0x0010,
ERROR_CBUSNMI = 0x0020,
ERROR_CBUSBG = 0x00c0,
ERROR_BG = 0x0070,
ERROR_BUSHOG = 0x0080
};
DECLARE_READ16_MEMBER(sreg_error_r);
DECLARE_WRITE16_MEMBER(sreg_led_w) { m_sreg_led = data; }
enum sreg_status_mask
{
STATUS_YELLOW_ZONE = 0x0001,
STATUS_SRNMI = 0x0002,
STATUS_PWRLOSS = 0x0004,
STATUS_RED_ZONE = 0x0008,
STATUS_BP = 0x00f0
};
DECLARE_READ16_MEMBER(sreg_status_r) { return m_sreg_status; }
enum sreg_ctrl1_mask
{
CTRL1_FLOPLOW = 0x0001,
CTRL1_FLOPRDY = 0x0002,
CTRL1_LEDENA = 0x0004,
CTRL1_LEDDP = 0x0008,
CTRL1_ETHLOOP = 0x0010,
CTRL1_ETHDTR = 0x0020,
CTRL1_ETHRMOD = 0x0040,
CTRL1_CLIPRESET = 0x0040,
CTRL1_FIFOACTIVE = 0x0080
};
DECLARE_READ16_MEMBER(sreg_ctrl1_r) { return m_sreg_ctrl1; }
DECLARE_WRITE16_MEMBER(sreg_ctrl1_w);
enum sreg_ctrl2_mask
{
CTRL2_PWRUP = 0x0001,
CTRL2_PWRENA = 0x0002,
CTRL2_HOLDOFF = 0x0004,
CTRL2_EXTNMIENA = 0x0008,
CTRL2_COLDSTART = 0x0010,
CTRL2_RESET = 0x0020,
CTRL2_BUSENA = 0x0040,
CTRL2_FRCPARITY = 0x0080,
CTRL2_FLASHEN = 0x0080,
CTRL2_WMASK = 0x000f
};
DECLARE_READ16_MEMBER(sreg_ctrl2_r) { return m_sreg_ctrl2; }
DECLARE_WRITE16_MEMBER(sreg_ctrl2_w);
DECLARE_READ16_MEMBER(sreg_ctrl3_r) { return m_sreg_ctrl3; }
DECLARE_WRITE16_MEMBER(sreg_ctrl3_w) { m_sreg_ctrl3 = data; }
DECLARE_WRITE8_MEMBER(rtc_w);
DECLARE_READ8_MEMBER(rtc_r);
DECLARE_READ32_MEMBER(idprom_r);
DECLARE_READ32_MEMBER(slot0_r);
DECLARE_READ8_MEMBER(idprom_r);
DECLARE_READ8_MEMBER(slot0_r);
DECLARE_READ32_MEMBER(unmapped_r);
DECLARE_WRITE32_MEMBER(unmapped_w);
DECLARE_READ8_MEMBER(scsi_r);
DECLARE_WRITE8_MEMBER(scsi_w);
@ -148,7 +186,13 @@ protected:
virtual void machine_reset() override;
private:
u16 m_system_reg[4];
u16 m_sreg_error;
u16 m_sreg_led;
u16 m_sreg_status;
u16 m_sreg_ctrl1;
u16 m_sreg_ctrl2;
u16 m_sreg_ctrl3;
};
#endif // MAME_INCLUDES_INTERPRO_H