#define BOARD_AUTOCONFIG_Z2 2
#define BOARD_AUTOCONFIG_Z3 3
-#define BOARD_NONAUTOCONFIG 4
-#define BOARD_IGNORE 5
+#define BOARD_NONAUTOCONFIG_BEFORE 4
+#define BOARD_NONAUTOCONFIG_AFTER_Z2 5
+#define BOARD_NONAUTOCONFIG_AFTER_Z3 6
+#define BOARD_IGNORE 7
#define EXP_DEBUG 0
static uae_u16 uae_id;
+static bool isnonautoconfig(int v)
+{
+ return v == BOARD_NONAUTOCONFIG_AFTER_Z2 ||
+ v == BOARD_NONAUTOCONFIG_AFTER_Z3 ||
+ v == BOARD_NONAUTOCONFIG_BEFORE;
+}
+
/* ********************************************************** */
/* Please note: ZorroIII implementation seems to work different
if (ecard >= cardno)
break;
struct card_data *ec = &cards[ecard];
- if (ec->initrc && ec->zorro == BOARD_NONAUTOCONFIG) {
+ if (ec->initrc && isnonautoconfig(ec->zorro)) {
ec->initrc(cards[ecard].rc);
} else {
call_card_init(ecard);
} else if (boardnum == 0) {
for (int i = 0; expansionroms[i].name; i++) {
const struct expansionromtype *erc = &expansionroms[i];
- if (erc->zorro == zorro && cfgfile_board_enabled(&currprefs, erc->romtype, 0)) {
+ if (((erc->zorro == zorro) || (zorro < 0 && erc->zorro >= BOARD_NONAUTOCONFIG_BEFORE)) && cfgfile_board_enabled(&currprefs, erc->romtype, 0)) {
struct romconfig *rc = get_device_romconfig(&currprefs, erc->romtype, 0);
if (erc->subtypes) {
const struct expansionsubromtype *srt = &erc->subtypes[rc->subtype];
}
}
- fastmem_autoconfig(boardnum, 2, type, serial, allocated);
+ fastmem_autoconfig(boardnum, BOARD_AUTOCONFIG_Z2, type, serial, allocated);
+ fastmem_autoconfig(boardnum, -1, type, serial, allocated);
return NULL;
}
code = Z3_MEM_16MB; /* Z3 physical board size is always at least 16M */
expamem_init_clear ();
- fastmem_autoconfig(boardnum, 3, add_memory | zorroIII | code, 1, allocated);
+ fastmem_autoconfig(boardnum, BOARD_AUTOCONFIG_Z3, add_memory | zorroIII | code, 1, allocated);
map_banks_z3(bank, start >> 16, size >> 16);
return NULL;
}
}
// add possible non-autoconfig boards
- add_cpu_expansions(BOARD_NONAUTOCONFIG);
+ add_cpu_expansions(BOARD_NONAUTOCONFIG_BEFORE);
+ add_expansions(BOARD_NONAUTOCONFIG_BEFORE);
bool fastmem_after = false;
if (currprefs.fastmem_autoconfig) {
add_cpu_expansions(BOARD_AUTOCONFIG_Z2);
add_expansions(BOARD_AUTOCONFIG_Z2);
+ add_cpu_expansions(BOARD_NONAUTOCONFIG_AFTER_Z2);
+ add_expansions(BOARD_NONAUTOCONFIG_AFTER_Z2);
+
if (fastmem_after && currprefs.fastmem_autoconfig) {
if (fastmem_bank.baseaddr != NULL && (fastmem_bank.allocated <= 262144 || currprefs.chipmem_size <= 2 * 1024 * 1024)) {
cards[cardno].flags = 0;
}
- add_expansions(BOARD_NONAUTOCONFIG);
+ add_cpu_expansions(BOARD_NONAUTOCONFIG_AFTER_Z3);
+ add_expansions(BOARD_NONAUTOCONFIG_AFTER_Z3);
expamem_z3_pointer = 0;
expamem_z3_sum = 0;
_T("FPU (DOSBox CPU only)"),
_T("fpu")
},
+ { // 23 - 25
+ _T("CPU Arch (DOSBox CPU only)\0") _T("auto") _T("386\0") _T("386_prefetch\0") _T("386_slow\0") _T("486_slow\0") _T("486_prefetch\0") _T("pentium_slow\0"),
+ _T("cpuarch\0") _T("auto") _T("386\0") _T("386_prefetch\0") _T("386_slow\0") _T("486_slow\0") _T("486_prefetch\0") _T("pentium_slow\0"),
+ true, false, 0
+ },
{
NULL
}
_T("Disable parallel port emulation (J11)"),
_T("parport_card")
},
- { // 19 - 22
+ { // 19 - 21
_T("CPU core\0") _T("Fake86\0") _T("DOSBox simple\0") _T("DOSBox normal\0") _T("DOSBox full\0") _T("DOSBox auto\0"),
_T("cpu\0") _T("fake86\0") _T("dbsimple\0") _T("dbnormal\0") _T("dbfull\0") _T("dbauto\0"),
true, false, 19 - 13
},
+ { // 22
+ _T("FPU (DOSBox CPU only)"),
+ _T("fpu")
+ },
+ { // 23 - 25
+ _T("CPU Arch (DOSBox CPU only)\0") _T("auto") _T("386\0") _T("386_prefetch\0") _T("386_slow\0") _T("486_slow\0") _T("486_prefetch\0") _T("pentium_slow\0"),
+ _T("cpuarch\0") _T("auto") _T("386\0") _T("386_prefetch\0") _T("386_slow\0") _T("486_slow\0") _T("486_prefetch\0") _T("pentium_slow\0"),
+ true, false, 0
+ },
{
NULL
}
},
{
_T("grex"), _T("G-REX"), _T("DCE"),
- grex_init, NULL, NULL, ROMTYPE_GREX | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, true,
+ grex_init, NULL, NULL, ROMTYPE_GREX | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
NULL, 0,
false, EXPANSIONTYPE_PCI_BRIDGE
},
},
{
_T("dataflyerscsiplus"), _T("DataFlyer SCSI+"), _T("Expansion Systems"),
- dataflyer_init, NULL, dataflyer_add_scsi_unit, ROMTYPE_DATAFLYER | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, true,
+ dataflyer_init, NULL, dataflyer_add_scsi_unit, ROMTYPE_DATAFLYER | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
NULL, 0,
false, EXPANSIONTYPE_SCSI
},
},
{
_T("kommos"), _T("A500/A2000 SCSI"), _T("Jürgen Kommos"),
- kommos_init, NULL, kommos_add_scsi_unit, ROMTYPE_KOMMOS, 0, 0, BOARD_NONAUTOCONFIG, true,
+ kommos_init, NULL, kommos_add_scsi_unit, ROMTYPE_KOMMOS, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
NULL, 0,
false, EXPANSIONTYPE_SCSI
},
true, EXPANSIONTYPE_SCSI,
2079, 3, 0
},
+ {
+ _T("multievolution"), _T("Multi Evolution 500/2000"), _T("MacroSystem"),
+ ncr_multievolution_init, NULL, multievolution_add_scsi_unit, ROMTYPE_MEVOLUTION, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
+ NULL, 0,
+ false, EXPANSIONTYPE_SCSI,
+ 18260, 8, 0, true
+ },
{
_T("paradox"), _T("Paradox SCSI"), _T("Mainhattan Data"),
- paradox_init, NULL, paradox_add_scsi_unit, ROMTYPE_PARADOX | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, false,
+ paradox_init, NULL, paradox_add_scsi_unit, ROMTYPE_PARADOX | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, false,
NULL, 0,
true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_PARALLEL_ADAPTER
},
#if 0 /* driver is MIA, 3rd party ScottDevice driver is not enough for full implementation. */
{
_T("microforge"), _T("Hard Disk"), _T("Micro Forge"),
- microforge_init, NULL, microforge_add_scsi_unit, ROMTYPE_MICROFORGE | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, true,
+ microforge_init, NULL, microforge_add_scsi_unit, ROMTYPE_MICROFORGE | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
NULL, 0,
false, EXPANSIONTYPE_SASI | EXPANSIONTYPE_SCSI
},
{
_T("omtiadapter"), _T("OMTI-Adapter"), _T("C't"),
- omtiadapter_init, NULL, omtiadapter_scsi_unit, ROMTYPE_OMTIADAPTER | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, true,
+ omtiadapter_init, NULL, omtiadapter_scsi_unit, ROMTYPE_OMTIADAPTER | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
NULL, 0,
false, EXPANSIONTYPE_CUSTOM | EXPANSIONTYPE_SCSI
},
{
_T("alf1"), _T("A.L.F."), _T("Elaborate Bytes"),
- alf1_init, NULL, alf1_add_scsi_unit, ROMTYPE_ALF1 | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, true,
+ alf1_init, NULL, alf1_add_scsi_unit, ROMTYPE_ALF1 | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
NULL, 0,
false, EXPANSIONTYPE_CUSTOM | EXPANSIONTYPE_SCSI
},
{
_T("promigos"), _T("Promigos"), _T("Flesch und Hörnemann"),
- promigos_init, NULL, promigos_add_scsi_unit, ROMTYPE_PROMIGOS | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, true,
+ promigos_init, NULL, promigos_add_scsi_unit, ROMTYPE_PROMIGOS | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
NULL, 0,
false, EXPANSIONTYPE_CUSTOM | EXPANSIONTYPE_SCSI
},
{
_T("tecmar"), _T("T-Card/T-Disk"), _T("Tecmar"),
- tecmar_init, NULL, tecmar_add_scsi_unit, ROMTYPE_TECMAR | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, true,
+ tecmar_init, NULL, tecmar_add_scsi_unit, ROMTYPE_TECMAR | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
NULL, 0,
false, EXPANSIONTYPE_SASI | EXPANSIONTYPE_SCSI
},
{
_T("system2000"), _T("System 2000"), _T("Vortex"),
- system2000_init, NULL, system2000_add_scsi_unit, ROMTYPE_SYSTEM2000 | ROMTYPE_NONE, 0, 0, BOARD_NONAUTOCONFIG, true,
+ system2000_init, NULL, system2000_add_scsi_unit, ROMTYPE_SYSTEM2000 | ROMTYPE_NONE, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
NULL, 0,
false, EXPANSIONTYPE_CUSTOM | EXPANSIONTYPE_SCSI
},
{
_T("xebec"), _T("9720H"), _T("Xebec"),
- xebec_init, NULL, xebec_add_scsi_unit, ROMTYPE_XEBEC | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, true,
+ xebec_init, NULL, xebec_add_scsi_unit, ROMTYPE_XEBEC | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
NULL, 0,
false, EXPANSIONTYPE_SASI | EXPANSIONTYPE_SCSI
},
#if 0
{
_T("x86_xt_hd"), _T("x86 XT"), _T("x86"),
- x86_xt_hd_init, NULL, x86_add_xt_hd_unit, ROMTYPE_X86_HD | ROMTYPE_NONE, 0, 0, BOARD_NONAUTOCONFIG, true,
+ x86_xt_hd_init, NULL, x86_add_xt_hd_unit, ROMTYPE_X86_HD | ROMTYPE_NONE, 0, 0, BOARD_NONAUTOCONFIG_AFTER_Z2, true,
NULL, 0,
false, EXPANSIONTYPE_CUSTOM | EXPANSIONTYPE_SCSI
},
#endif
{
_T("x86athdprimary"), _T("AT IDE Primary"), _T("x86"),
- x86_at_hd_init_1, NULL, x86_add_at_hd_unit_1, ROMTYPE_X86_AT_HD1 | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, true,
+ x86_at_hd_init_1, NULL, x86_add_at_hd_unit_1, ROMTYPE_X86_AT_HD1 | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_AFTER_Z2, true,
NULL, 0,
false, EXPANSIONTYPE_IDE
},
{
_T("x86athdsecondary"), _T("AT IDE Secondary"), _T("x86"),
- x86_at_hd_init_2, NULL, x86_add_at_hd_unit_2, ROMTYPE_X86_AT_HD2 | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, true,
+ x86_at_hd_init_2, NULL, x86_add_at_hd_unit_2, ROMTYPE_X86_AT_HD2 | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_AFTER_Z2, true,
NULL, 0,
false, EXPANSIONTYPE_IDE
},
{
_T("x86athdxt"), _T("XTIDE Universal BIOS HD"), _T("x86"),
- x86_at_hd_init_xt, NULL, x86_add_at_hd_unit_xt, ROMTYPE_X86_XT_IDE | ROMTYPE_NONE, 0, 0, BOARD_NONAUTOCONFIG, true,
+ x86_at_hd_init_xt, NULL, x86_add_at_hd_unit_xt, ROMTYPE_X86_XT_IDE | ROMTYPE_NONE, 0, 0, BOARD_NONAUTOCONFIG_AFTER_Z2, true,
NULL, 0,
false, EXPANSIONTYPE_IDE,
0, 0, 0, false, NULL,
BOARD_MEMORY_HIGHMEM,
128 * 1024 * 1024,
0,
- dkb_wildfire_pci_init, NULL, BOARD_NONAUTOCONFIG, 0
+ dkb_wildfire_pci_init, NULL, BOARD_NONAUTOCONFIG_BEFORE, 0
},
{
NULL
SCSIDevice *scsid[8];
SCSIBus scsibus;
uae_u32 board_mask;
+ uae_u32 board_mask2;
uae_u8 *rom;
uae_u8 acmemory[128];
int configured;
uaecptr baseaddress;
+ uaecptr baseaddress2;
uae_u32 expamem_hi;
uae_u32 expamem_lo;
bool enabled;
addrbank *bank;
bool chipirq, boardirq, boardirqlatch;
bool intena;
+ bool irq6;
void (*irq_func)(struct ncr9x_state*);
int led;
uaecptr dma_ptr;
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_multievolution_scsi;
static struct ncr9x_state *ncr_units[MAX_NCR9X_UNITS + 1];
{
for (int i = 0; ncr_units[i]; i++) {
if (ncr_units[i]->boardirq) {
- INTREQ_0(0x8000 | 0x0008);
+ if (ncr_units[i]->irq6)
+ INTREQ_0(0x8000 | 0x2000);
+ else
+ INTREQ_0(0x8000 | 0x0008);
return;
}
}
uaecptr oldaddr = addr;
addr &= ncr->board_mask;
- if (isncr(ncr, ncr_masoboshi_scsi)) {
+ if (ncr == ncr_multievolution_scsi) {
+ reg_shift = 1;
+ if (addr & 0x1000) {
+ 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);
+ }
+ }
+ return;
+ }
+ } else if (isncr(ncr, ncr_masoboshi_scsi)) {
if (addr >= 0xf040 && addr < 0xf048) {
if (addr == 0xf040)
uaecptr oldaddr = addr;
addr &= ncr->board_mask;
- if (isncr(ncr, ncr_masoboshi_scsi)) {
+
+ if (ncr == ncr_multievolution_scsi) {
+
+ reg_shift = 1;
+ if (addr & 0x1000) {
+ if (ncr->fakedma_data_offset >= ncr->fakedma_data_size)
+ return 0;
+ if (ncr->fakedma_data_offset == ncr->fakedma_data_size - 1) {
+ esp_fake_dma_done(ncr->devobject.lsistate);
+ //write_log(_T("MultiEvolution fake dma finished\n"));
+ }
+ v = ncr->fakedma_data_buf[ncr->fakedma_data_offset++];
+ //write_log(_T("MultiEvolution fake dma %02x %d/%d\n"), v, ncr->fakedma_data_offset, ncr->fakedma_data_size);
+ return v;
+ }
+
+ } else if (isncr(ncr, ncr_masoboshi_scsi)) {
if (addr == MASOBOSHI_ESP_ADDR + 3 * 2 && (ncr->states[0] & 0x80))
return 2;
return ncr_units[i];
if ((addr & ~ncr_units[i]->board_mask) == ncr_units[i]->baseaddress)
return ncr_units[i];
+ if (ncr_units[i]->baseaddress2 && (addr & ~ncr_units[i]->board_mask2) == ncr_units[i]->baseaddress2)
+ return ncr_units[i];
}
return NULL;
}
return ncr9x_lget(ncr, addr);
return 0;
}
+uae_u8 *REGPARAM2 ncr9x_generic_xlate(uaecptr addr)
+{
+ struct ncr9x_state *ncr = getscsiboard(addr);
+ if (!ncr)
+ return NULL;
+ addr &= ncr->board_mask;
+ return ncr->rom + addr;
+
+}
+int REGPARAM2 ncr9x_generic_check(uaecptr a, uae_u32 b)
+{
+ struct ncr9x_state *ncr = getscsiboard(a);
+ if (!ncr)
+ return 0;
+ a &= ncr->board_mask;
+ if (a >= ncr->rom_start && a + b < ncr->rom_end)
+ return 1;
+ return 0;
+}
+
static addrbank ncr9x_bank_generic = {
ncr9x_generic_lget, ncr9x_generic_wget, ncr9x_generic_bget,
ncr9x_generic_lput, ncr9x_generic_wput, ncr9x_generic_bput,
- default_xlate, default_check, NULL, NULL, _T("53C94/FAS216"),
- dummy_lgeti, dummy_wgeti, ABFLAG_IO
+ ncr9x_generic_xlate, ncr9x_generic_check, NULL, NULL, _T("53C94/FAS216"),
+ ncr9x_generic_lget, ncr9x_generic_wget, ABFLAG_IO | ABFLAG_SAFE
};
uae_u32 cpuboard_ncr9x_scsi_get(uaecptr addr)
}
}
+addrbank *ncr_multievolution_init(struct romconfig *rc)
+{
+ struct ncr9x_state *ncr = getscsi(rc);
+
+ xfree(ncr->rom);
+ ncr->rom = NULL;
+
+ if (!ncr)
+ return &expamem_null;
+
+ ncr->bank = &ncr9x_bank_generic;
+ ncr->enabled = true;
+ ncr->rom = xcalloc(uae_u8, 65536);
+
+ ncr->configured = -1;
+ ncr->board_mask = 0x1ffff;
+ ncr->board_mask2 = 0xffff;
+ ncr->baseaddress = 0xf00000;
+ ncr->baseaddress2 = 0xef0000;
+ ncr->rom_start = 0;
+ ncr->rom_offset = 0;
+ ncr->rom_end = 0x10000;
+ ncr->io_start = 0x1e000;
+ ncr->io_end = ncr->io_start + 0x2000;
+ ncr->irq6 = true;
+
+ load_rom_rc(rc, ROMTYPE_MEVOLUTION, 65536, 0, ncr->rom, 65536, 0);
+
+ map_banks(ncr->bank, ncr->baseaddress2 >> 16, (ncr->board_mask + 1) >> 16, 0);
+
+ return &expamem_null;
+}
+
addrbank *ncr_fastlane_autoconfig_init(struct romconfig *rc)
{
struct ncr9x_state *ncr = getscsi(rc);
esp_dma_enable(ncr_ematrix530_scsi->devobject.lsistate, 1);
}
+void multievolution_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
+{
+ ncr9x_add_scsi_unit(&ncr_multievolution_scsi, ch, ci, rc);
+ ncr9x_esp_scsi_init(ncr_multievolution_scsi, fake_dma_read, fake_dma_write, set_irq2);
+ esp_dma_enable(ncr_multievolution_scsi->devobject.lsistate, 1);
+}
+
#endif
return NULL;
}
-#define NEXT_ROM_ID 156
+#define NEXT_ROM_ID 157
#define ALTROM(id,grp,num,size,flags,crc32,a,b,c,d,e) \
{ _T("X"), 0, 0, 0, 0, 0, size, id, 0, 0, flags, (grp << 16) | num, 0, NULL, crc32, a, b, c, d, e },
ALTROMPN(146, 1, 2, 8192, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0xc88843cb, 0x3d7eb1b6, 0x8139b81b, 0x0665684c, 0x536ab3d0, 0x52a5dd9d)
{ _T("Apollo 500/2000"), 0, 0, 0, 0, _T("APOLLOHD\0"), 16384, 145, 0, 0, ROMTYPE_APOLLOHD, 0, 0, NULL,
0x931bad25, 0x24b4ee4c,0x129c7a93,0xf83ad570,0x66afd80c,0x4179f39c, NULL, NULL },
+ { _T("Multi Evolution 500/200"), 3, 0, 3, 0, _T("MULTIEVOLUTION\0"), 65536, 156, 0, 0, ROMTYPE_MEVOLUTION, 0, 0, NULL,
+ 0xd13a2c89, 0xf9e38c4b,0xf5c6499d,0x486946ba,0x7b7636b8,0x0845265b, NULL, NULL },
+ ALTROMPN(156, 1, 1, 32768, ROMTYPE_ODD | ROMTYPE_8BIT, NULL, 0x339b3549, 0x74de857b, 0x42f9a8e0, 0xc1f3c29e, 0x06982622, 0x853d08fe)
+ ALTROMPN(156, 1, 2, 32768, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x3aca5d1f, 0x786f2197, 0xc614be91, 0xae7e87da, 0xb42c3290, 0xd7997763)
{ _T("CyberStorm MK I 68040"), 0, 0, 0, 0, _T("CSMKI\0"), 32768, 95, 0, 0, ROMTYPE_CB_CSMK1, 0, 0, NULL,
0, 0, 0, 0, 0, 0, NULL, _T("cyberstormmk1_040.rom") },