{
return ISCPUBOARD(BOARD_DKB, BOARD_DKB_SUB_WILDFIRE);
}
+static bool is_mtec_ematrix530(void)
+{
+ return ISCPUBOARD(BOARD_MTEC, BOARD_MTEC_SUB_EMATRIX530);
+}
static bool is_fusionforty(void)
{
return ISCPUBOARD(BOARD_RCS, BOARD_RCS_SUB_FUSIONFORTY);
} else {
v = blizzardea_bank.baseaddr[addr];
}
+ } else if (is_mtec_ematrix530()) {
+ v = blizzardea_bank.baseaddr[addr];
+ if ((addr & 0xf800) == 0xe800) {
+ if ((addr & 3) < 2) {
+ map_banks(&dummy_bank, 0x10000000 >> 16, 0x8000000 >> 16, 0);
+ if (custmem1_bank.allocated) {
+ map_banks(&custmem1_bank, (0x18000000 - custmem1_bank.allocated) >> 16, custmem1_bank.allocated >> 16, 0);
+ if (custmem1_bank.allocated < 128 * 1024 * 1024) {
+ map_banks(&custmem1_bank, (0x18000000 - 2 * custmem1_bank.allocated) >> 16, custmem1_bank.allocated >> 16, 0);
+ }
+ }
+ }
+ if ((addr & 3) >= 2) {
+ map_banks(&dummy_bank, 0x18000000 >> 16, 0x8000000 >> 16, 0);
+ if (custmem2_bank.allocated) {
+ map_banks(&custmem2_bank, 0x18000000 >> 16, custmem2_bank.allocated >> 16, 0);
+ if (custmem2_bank.allocated < 128 * 1024 * 1024) {
+ map_banks(&custmem2_bank, (0x18000000 + custmem2_bank.allocated) >> 16, custmem2_bank.allocated >> 16, 0);
+ }
+ }
+ }
+ }
} else {
v = blizzardea_bank.baseaddr[addr];
}
addr |= csmk2_flashaddressing;
flash_write(flashrom, addr, b);
}
+ } else if (is_mtec_ematrix530()) {
+ if ((addr & 0xf800) == 0xe800) {
+ if ((addr & 3) < 2) {
+ map_banks(&dummy_bank, 0x10000000 >> 16, 0x8000000 >> 16, 0);
+ if (custmem1_bank.allocated)
+ map_banks(&custmem1_bank, (0x18000000 - custmem1_bank.allocated) >> 16, custmem1_bank.allocated >> 16, 0);
+ }
+ if ((addr & 3) >= 2) {
+ map_banks(&dummy_bank, 0x18000000 >> 16, 0x8000000 >> 16, 0);
+ if (custmem2_bank.allocated)
+ map_banks(&custmem2_bank, 0x18000000 >> 16, custmem2_bank.allocated >> 16, 0);
+ }
+ }
}
}
blizzardf0_bank.mask = blizzardf0_bank.allocated - 1;
mapped_malloc(&blizzardf0_bank);
- } else if (is_kupke()) {
+ } else if (is_kupke() || is_mtec_ematrix530()) {
blizzardea_bank.allocated = 65536;
blizzardea_bank.mask = blizzardea_bank.allocated - 1;
b == BOARD_MEMORY_BLIZZARD_12xx ||
b == BOARD_MEMORY_BLIZZARD_PPC ||
b == BOARD_MEMORY_Z3 ||
- b == BOARD_MEMORY_25BITMEM;
+ b == BOARD_MEMORY_25BITMEM ||
+ b == BOARD_MEMORY_EMATRIX;
}
int cpuboard_memorytype(struct uae_prefs *p)
}
break;
+ case BOARD_MTEC:
+ switch (currprefs.cpuboard_subtype)
+ {
+ case BOARD_MTEC_SUB_EMATRIX530:
+ roms[0] = 144;
+ break;
+ }
+ break;
+
case BOARD_MACROSYSTEM:
switch(currprefs.cpuboard_subtype)
{
protect_roms(false);
cpuboard_non_byte_ea = true;
- if (is_dkb_wildfire()) {
+ if (is_mtec_ematrix530()) {
+ earom_size = 65536;
+ for (int i = 0; i < 32768; i++) {
+ uae_u8 b = 0xff;
+ zfile_fread(&b, 1, 1, autoconfig_rom);
+ blizzardea_bank.baseaddr[i * 2 + 0] = b;
+ blizzardea_bank.baseaddr[i * 2 + 1] = 0xff;
+ }
+ } else if (is_dkb_wildfire()) {
f0rom_size = 65536;
zfile_fread(blizzardf0_bank.baseaddr, 1, f0rom_size, autoconfig_rom);
flashrom = flash_new(blizzardf0_bank.baseaddr + 0, 32768, 65536, 0x20, flashrom_file, FLASHROM_EVERY_OTHER_BYTE | FLASHROM_PARALLEL_EEPROM);
NULL
}
};
+static const struct expansionboardsettings mtec_settings[] = {
+ {
+ _T("SCSI disabled"),
+ _T("scsioff")
+ },
+ {
+ NULL
+ }
+};
+static const struct cpuboardsubtype mtec_sub[] = {
+ {
+ _T("E-Matrix 530"),
+ _T("e-matrix530"),
+ ROMTYPE_CB_EMATRIX, 0,
+ ematrix_add_scsi_unit, EXPANSIONTYPE_SCSI,
+ BOARD_MEMORY_EMATRIX,
+ 128 * 1024 * 1024,
+ 0,
+ ncr_ematrix_autoconfig_init, NULL, BOARD_AUTOCONFIG_Z2, 1,
+ mtec_settings
+ },
+ {
+ NULL
+ }
+};
static const struct expansionboardsettings a26x0board_settings[] = {
{
_T("OSMODE (J304)"),
_T("MacroSystem"),
warpengine_sub, 0
},
+ {
+ BOARD_MTEC,
+ _T("M-Tec"),
+ mtec_sub, 0
+ },
{
BOARD_BLIZZARD,
_T("Phase 5 - Blizzard"),
#define BOARD_MEMORY_BLIZZARD_12xx 4
#define BOARD_MEMORY_BLIZZARD_PPC 5
#define BOARD_MEMORY_25BITMEM 6
+#define BOARD_MEMORY_EMATRIX 7
#define ISCPUBOARD(type,subtype) (cpuboards[currprefs.cpuboard_type].id == type && (type < 0 || currprefs.cpuboard_subtype == subtype))
#define BOARD_IC 10
#define BOARD_IC_ACA500 0
-
+#define BOARD_MTEC 11
+#define BOARD_MTEC_SUB_EMATRIX530 0
extern void fastlane_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
extern void oktagon_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
extern void masoboshi_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
+extern void ematrix_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
extern addrbank *ncr_fastlane_autoconfig_init(struct romconfig*);
extern addrbank *ncr_oktagon_autoconfig_init(struct romconfig*);
extern addrbank *ncr_dkb_autoconfig_init(struct romconfig*);
+extern addrbank *ncr_ematrix_autoconfig_init(struct romconfig *rc);
extern void cpuboard_ncr9x_scsi_put(uaecptr, uae_u32);
extern uae_u32 cpuboard_ncr9x_scsi_get(uaecptr);
#define ROMTYPE_CB_GOLEM030 0x00040010
#define ROMTYPE_CB_ACA500 0x00040011
#define ROMTYPE_CB_DBK_WF 0x00040012
+#define ROMTYPE_CB_EMATRIX 0x00040013
#define ROMTYPE_FREEZER 0x00080000
#define ROMTYPE_AR 0x00080001
p->fastmem2_size = p->cpuboardmem1_size;
} else if (cpuboard_memorytype(p) == BOARD_MEMORY_25BITMEM) {
p->mem25bit_size = p->cpuboardmem1_size;
+ } else if (cpuboard_memorytype(p) == BOARD_MEMORY_EMATRIX) {
+ int size = p->cpuboardmem1_size / (1024 * 1024);
+ if (size == 32 || size == 8 || size == 2) {
+ p->custom_memory_sizes[0] = p->cpuboardmem1_size / 2;
+ p->custom_memory_sizes[1] = p->cpuboardmem1_size / 2;
+ p->custom_memory_addrs[0] = 0x18000000 - p->custom_memory_sizes[0];
+ p->custom_memory_addrs[1] = 0x18000000;
+ } else {
+ p->custom_memory_sizes[0] = p->cpuboardmem1_size;
+ p->custom_memory_sizes[1] = 0;
+ p->custom_memory_addrs[0] = 0x18000000 - p->custom_memory_sizes[0];
+ p->custom_memory_addrs[1] = 0;
+ }
}
if (((p->chipmem_size & (p->chipmem_size - 1)) != 0 && p->chipmem_size != 0x180000)
}
if (p->mem25bit_size > 128 * 1024 * 1024 || (p->mem25bit_size & 0xfffff)) {
p->mem25bit_size = 0;
- error_log (_T("Unsupported 25bit RAM size"));
+ error_log(_T("Unsupported 25bit RAM size"));
}
if (p->mbresmem_low_size > 0x04000000 || (p->mbresmem_low_size & 0xfffff)) {
p->mbresmem_low_size = 0;
static struct ncr9x_state *ncr_oktagon2008_scsi[MAX_DUPLICATE_EXPANSION_BOARDS];
static struct ncr9x_state *ncr_masoboshi_scsi[MAX_DUPLICATE_EXPANSION_BOARDS];
static struct ncr9x_state *ncr_dkb1200_scsi;
+static struct ncr9x_state *ncr_ematrix530_scsi;
static struct ncr9x_state *ncr_units[MAX_NCR9X_UNITS + 1];
}
/* Fake DMA */
+
+static int fake_dma_read_ematrix(void *opaque, uint8_t *buf, int len)
+{
+ struct ncr9x_state *ncr = (struct ncr9x_state*)opaque;
+ ncr->states[0] = 1;
+ ncr->chipirq = true;
+ set_irq2(ncr);
+ ncr->fakedma_data_offset = 0;
+ ncr->fakedma_data_write_buffer = buf;
+ ncr->fakedma_data_size = len;
+ fakedma_buffer_size(ncr, len);
+ return 0;
+}
+static int fake_dma_write_ematrix(void *opaque, uint8_t *buf, int len)
+{
+ struct ncr9x_state *ncr = (struct ncr9x_state*)opaque;
+ ncr->states[0] = 1;
+ ncr->chipirq = true;
+ set_irq2(ncr);
+ ncr->fakedma_data_offset = 0;
+ fakedma_buffer_size(ncr, len);
+ memcpy(ncr->fakedma_data_buf, buf, len);
+ if (len & 1)
+ ncr->fakedma_data_buf[len] = 0;
+ ncr->fakedma_data_size = len;
+ return 0;
+}
+
static int fake_dma_read(void *opaque, uint8_t *buf, int len)
{
struct ncr9x_state *ncr = (struct ncr9x_state*)opaque;
ncr->fakedma_data_offset = 0;
ncr->fakedma_data_write_buffer = buf;
+ ncr->fakedma_data_size = len;
fakedma_buffer_size(ncr, len);
return 0;
}
return 0;
}
-/* Fake DMA */
static int fake2_dma_read(void *opaque, uint8_t *buf, int len)
{
struct ncr9x_state *ncr = (struct ncr9x_state*)opaque;
write_log(_T("DKB IO %08X PUT %02x %08x\n"), addr, val & 0xff, M68K_GETPC);
return;
}
+ } else if (ISCPUBOARD(BOARD_MTEC, BOARD_MTEC_SUB_EMATRIX530)) {
+ if ((addr & 0xf000) >= 0xe000) {
+ if ((addr & 0x3ff) <= 7) {
+ if (ncr->fakedma_data_offset < ncr->fakedma_data_size) {
+ ncr->fakedma_data_buf[ncr->fakedma_data_offset++] = val;
+ if (ncr->fakedma_data_offset == ncr->fakedma_data_size) {
+ memcpy(ncr->fakedma_data_write_buffer, ncr->fakedma_data_buf, ncr->fakedma_data_size);
+ esp_fake_dma_done(ncr->devobject.lsistate);
+ ncr->states[0] = 0;
+ }
+ }
+ }
+ return;
+ }
+ if (addr < 0xc000 || addr >= 0xe000)
+ return;
+ if (addr & 1)
+ return;
+ if (currprefs.cpuboard_settings & 1)
+ return;
+ reg_shift = 3;
}
if (!ncr->devobject.lsistate)
return;
write_log(_T("DKB IO GET %08x %08x\n"), addr, M68K_GETPC);
return 0;
}
+ } else if (ISCPUBOARD(BOARD_MTEC, BOARD_MTEC_SUB_EMATRIX530)) {
+ if ((addr & 0xf000) >= 0xe000) {
+ if ((addr & 0x3ff) <= 7) {
+ if (ncr->fakedma_data_offset >= ncr->fakedma_data_size) {
+ ncr->states[0] = 0;
+ return 0;
+ }
+ if (ncr->fakedma_data_offset == ncr->fakedma_data_size - 1) {
+ esp_fake_dma_done(ncr->devobject.lsistate);
+ ncr->states[0] = 0;
+ }
+ return ncr->fakedma_data_buf[ncr->fakedma_data_offset++];
+ }
+ return 0xff;
+ }
+ if ((addr & 1) && !(addr & 0x0800)) {
+ // dma request
+ return ncr->states[0] ? 0xff : 0x7f;
+ }
+ if ((addr & 1) && (addr & 0x0800)) {
+ // hardware revision?
+ return 0x7f;
+ }
+ if (addr & 1)
+ return 0x7f;
+ if (currprefs.cpuboard_settings & 1)
+ return 0x7f;
+ if (addr < 0xc000 || addr >= 0xe000)
+ return 0x7f;
+ reg_shift = 3;
}
if (!ncr->devobject.lsistate)
return v;
switch (addr)
{
case 0x48:
- if (isncr(ncr, ncr_oktagon2008_scsi)) {
- map_banks_z2(ncr->bank, expamem_z2_pointer >> 16, OKTAGON_BOARD_SIZE >> 16);
- ncr->configured = 1;
- expamem_next (ncr->bank, NULL);
- } else if (ncr == ncr_dkb1200_scsi) {
- map_banks_z2(ncr->bank, expamem_z2_pointer >> 16, DKB_BOARD_SIZE >> 16);
- ncr->configured = 1;
- expamem_next (ncr->bank, NULL);
- }
+ map_banks_z2(ncr->bank, expamem_z2_pointer >> 16, expamem_z2_size >> 16);
+ ncr->configured = 1;
ncr->baseaddress = expamem_z2_pointer;
+ expamem_next (ncr->bank, NULL);
break;
case 0x4c:
ncr->configured = 1;
return ncr->bank;
}
+addrbank *ncr_ematrix_autoconfig_init(struct romconfig *rc)
+{
+ int roms[2];
+ struct ncr9x_state *ncr = getscsi(rc);
+
+ if (!ncr)
+ return &expamem_null;
+
+ xfree(ncr->rom);
+ ncr->rom = NULL;
+
+ roms[0] = 144;
+ roms[1] = -1;
+
+ ncr->enabled = true;
+ memset(ncr->acmemory, 0xff, sizeof ncr->acmemory);
+ ncr->rom_start = 0;
+ ncr->rom_offset = 0;
+ ncr->rom_end = 0x8000;
+ ncr->io_start = 0x8000;
+ ncr->io_end = 0x10000;
+ ncr->bank = &ncr9x_bank_generic;
+ ncr->board_mask = 65535;
+
+ ncr9x_reset_board(ncr);
+
+ struct zfile *z = read_device_from_romconfig(rc, roms);
+ ncr->rom = xcalloc(uae_u8, 65536);
+ if (z) {
+ int i;
+ memset(ncr->rom, 0xff, 65536);
+
+ zfile_fseek(z, 32768, SEEK_SET);
+ for (i = 0; i < (sizeof ncr->acmemory) / 2; i++) {
+ uae_u8 b;
+ zfile_fread(&b, 1, 1, z);
+ ncr->acmemory[i * 2] = b;
+ }
+ for (;;) {
+ uae_u8 b;
+ if (!zfile_fread(&b, 1, 1, z))
+ break;
+ ncr->rom[i * 2] = b;
+ i++;
+ }
+ zfile_fclose(z);
+ }
+
+ return ncr->bank;
+}
void ncr_masoboshi_autoconfig_init(struct romconfig *rc, uaecptr baseaddress)
{
ncr9x_esp_scsi_init(ncr_masoboshi_scsi[ci->controller_type_unit], fake2_dma_read, fake2_dma_write, set_irq2_masoboshi);
}
+void ematrix_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
+{
+ ncr9x_add_scsi_unit(&ncr_ematrix530_scsi, ch, ci, rc);
+ ncr9x_esp_scsi_init(ncr_ematrix530_scsi, fake_dma_read_ematrix, fake_dma_write_ematrix, set_irq2);
+ esp_dma_enable(ncr_ematrix530_scsi->devobject.lsistate, 1);
+}
#endif
return NULL;
}
-#define NEXT_ROM_ID 144
+#define NEXT_ROM_ID 145
static struct romheader romheaders[] = {
{ _T("Freezer Cartridges"), 1 },
0x05d473f4, 0x574ec567, 0xcc67e06f, 0x91dcecb9, 0x8c204399, 0x5fe2a09f, NULL, NULL },
{ _T("DKB WildFire"), 1, 1, 1, 1, _T("WILDFIRE\0"), 18352, 143, 0, 0, ROMTYPE_CB_DBK_WF, 0, 0, NULL,
0xb2dae8c4, 0xcdfe2d96, 0xe44d4f8d, 0x3833a5e8, 0xb6c832fd, 0xc7b341a9, NULL, NULL },
+ { _T("M-Tec E-Matrix 530"), 0, 0, 0, 0, _T("EMATRIX530\0"), 65536, 144, 0, 0, ROMTYPE_CB_EMATRIX, 0, 0, NULL,
+ 0x3942d827, 0x5aaf118f, 0x61fc3083, 0x1435b87c, 0x8bdab6a4, 0x59b4ee22, NULL, NULL },
{ _T("Preferred Technologies Nexus"), 1, 0, 1, 0, _T("PTNEXUS\0"), 8192, 139, 0, 0, ROMTYPE_PTNEXUS, 0, 0, NULL,
0xf495879a, 0xa3bd0202, 0xe14aa5b6, 0x49d3ce88, 0x22975950, 0x6500dbc2, NULL, NULL },
int ids[2];
ids[0] = rd->id;
- ids[1] = 0;
+ ids[1] = -1;
return getromlistbyids(ids, NULL);
}