From: Toni Wilen Date: Thu, 10 Sep 2015 15:42:19 +0000 (+0300) Subject: Multi Evolution 500/2000 SCSI controller. X-Git-Tag: 3200~77 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=fd901fc5f7e39b185c22312ba0020bb413294848;p=francis%2Fwinuae.git Multi Evolution 500/2000 SCSI controller. --- diff --git a/expansion.cpp b/expansion.cpp index cc9cbc0d..b26ed1b1 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -48,8 +48,10 @@ #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 @@ -180,6 +182,13 @@ static addrbank *expamem_bank_current; 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 @@ -516,7 +525,7 @@ void expamem_next (addrbank *mapped, addrbank *next) 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); @@ -1275,7 +1284,7 @@ static void fastmem_autoconfig(int boardnum, int zorro, uae_u8 type, uae_u32 ser } 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]; @@ -1387,7 +1396,8 @@ static addrbank *expamem_init_fastcard_2(int boardnum) } } - 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; } @@ -1549,7 +1559,7 @@ static addrbank *expamem_init_z3fastmem_2(int boardnum, addrbank *bank, uae_u32 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; } @@ -2021,7 +2031,8 @@ void expamem_reset (void) } // 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) { @@ -2053,6 +2064,9 @@ void expamem_reset (void) 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; @@ -2198,7 +2212,8 @@ void expamem_reset (void) } - 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; @@ -2657,6 +2672,11 @@ static const struct expansionboardsettings x86_bridge_settings[] = { _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 } @@ -2712,11 +2732,20 @@ static const struct expansionboardsettings x86_bridge_sidecar_settings[] = { _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 } @@ -2840,7 +2869,7 @@ const struct expansionromtype expansionroms[] = { }, { _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 }, @@ -2934,7 +2963,7 @@ const struct expansionromtype expansionroms[] = { }, { _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 }, @@ -2974,7 +3003,7 @@ const struct expansionromtype expansionroms[] = { }, { _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 }, @@ -2985,9 +3014,16 @@ const struct expansionromtype expansionroms[] = { 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 }, @@ -3052,7 +3088,7 @@ const struct expansionromtype expansionroms[] = { #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 }, @@ -3060,37 +3096,37 @@ const struct expansionromtype expansionroms[] = { { _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 }, @@ -3121,26 +3157,26 @@ const struct expansionromtype expansionroms[] = { #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, @@ -3448,7 +3484,7 @@ static const struct cpuboardsubtype dbk_sub[] = { 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 diff --git a/include/ncr9x_scsi.h b/include/ncr9x_scsi.h index c38ea88d..3b1679ac 100644 --- a/include/ncr9x_scsi.h +++ b/include/ncr9x_scsi.h @@ -14,11 +14,13 @@ extern void fastlane_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct 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 void multievolution_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 addrbank *ncr_multievolution_init(struct romconfig*); extern void cpuboard_ncr9x_scsi_put(uaecptr, uae_u32); extern uae_u32 cpuboard_ncr9x_scsi_get(uaecptr); diff --git a/include/rommgr.h b/include/rommgr.h index 622f6b04..fa7933fb 100644 --- a/include/rommgr.h +++ b/include/rommgr.h @@ -102,6 +102,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size); #define ROMTYPE_PICASSOIV 0x00100034 #define ROMTYPE_x86_VGA 0x00100035 #define ROMTYPE_APOLLOHD 0x00100036 +#define ROMTYPE_MEVOLUTION 0x00100037 #define ROMTYPE_NOT 0x00800000 #define ROMTYPE_QUAD 0x01000000 diff --git a/ncr9x_scsi.cpp b/ncr9x_scsi.cpp index cfbf63e7..a0904ce0 100644 --- a/ncr9x_scsi.cpp +++ b/ncr9x_scsi.cpp @@ -81,10 +81,12 @@ struct ncr9x_state 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; @@ -93,6 +95,7 @@ struct ncr9x_state addrbank *bank; bool chipirq, boardirq, boardirqlatch; bool intena; + bool irq6; void (*irq_func)(struct ncr9x_state*); int led; uaecptr dma_ptr; @@ -159,6 +162,7 @@ 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_multievolution_scsi; static struct ncr9x_state *ncr_units[MAX_NCR9X_UNITS + 1]; @@ -230,7 +234,10 @@ void ncr9x_rethink(void) { 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; } } @@ -636,7 +643,19 @@ static void ncr9x_io_bput(struct ncr9x_state *ncr, uaecptr addr, uae_u32 val) 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) @@ -897,7 +916,23 @@ static uae_u32 ncr9x_io_bget(struct ncr9x_state *ncr, uaecptr addr) 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; @@ -1264,6 +1299,8 @@ static struct ncr9x_state *getscsiboard(uaecptr addr) 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; } @@ -1307,11 +1344,31 @@ static uae_u32 REGPARAM2 ncr9x_generic_lget (uaecptr addr) 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) @@ -1360,6 +1417,39 @@ void ncr9x_reset(void) } } +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); @@ -1709,4 +1799,11 @@ void ematrix_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconf 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 diff --git a/qemuvga/esp.cpp b/qemuvga/esp.cpp index 8f32ffb2..0a539ec7 100644 --- a/qemuvga/esp.cpp +++ b/qemuvga/esp.cpp @@ -434,9 +434,12 @@ uint64_t esp_reg_read(void *opaque, uint32_t saddr) if ((s->rregs[ESP_RSTAT] & STAT_PIO_MASK) == 0 || s->pio_on) { /* Data out. */ //write_log("esp: PIO data read not implemented\n"); - s->rregs[ESP_FIFO] = s->async_buf[s->ti_rptr++]; + if (s->async_buf) + s->rregs[ESP_FIFO] = s->async_buf[s->ti_rptr++]; + else + s->rregs[ESP_FIFO] = 0; s->pio_on = 1; - if (s->ti_size == 1) { + if (s->ti_size == 1 && s->current_req) { scsiesp_req_continue(s->current_req); } } else { @@ -461,7 +464,14 @@ uint64_t esp_reg_read(void *opaque, uint32_t saddr) return old_val; case ESP_RFLAGS: - return s->rregs[saddr] | s->rregs[ESP_RSEQ] << 5; + { + int v; + if (s->ti_size >= 7) + v = 31; + else + v = (1 << s->ti_size) - 1; + return v | (s->rregs[ESP_RSEQ] << 5); + } case ESP_RES4: return 0x80 | 0x20 | 0x2; default: diff --git a/rommgr.cpp b/rommgr.cpp index 01008387..1bf58e64 100644 --- a/rommgr.cpp +++ b/rommgr.cpp @@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path) 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 }, @@ -423,6 +423,10 @@ static struct romdata roms[] = { 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") },