]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Multi Evolution 500/2000 SCSI controller.
authorToni Wilen <twilen@winuae.net>
Thu, 10 Sep 2015 15:42:19 +0000 (18:42 +0300)
committerToni Wilen <twilen@winuae.net>
Thu, 10 Sep 2015 15:42:19 +0000 (18:42 +0300)
expansion.cpp
include/ncr9x_scsi.h
include/rommgr.h
ncr9x_scsi.cpp
qemuvga/esp.cpp
rommgr.cpp

index cc9cbc0dd7eabd100e769b1823607ad01e4f643d..b26ed1b1e38e8092f030ab12d595675773eee206 100644 (file)
 
 #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
index c38ea88dd62bb50d98498c40b123ba97459f6660..3b1679ac0701c7686506a3968662f18bdfb8088d 100644 (file)
@@ -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);
index 622f6b04c633fb1255a4e6404b3d425a347a84f2..fa7933fb23101725dfa8cfe1ba6a66c47a045910 100644 (file)
@@ -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
index cfbf63e79362e483de8708a3c9aeb3a7e79f403b..a0904ce0c048f4211328666503d2eb52c3c8b581 100644 (file)
@@ -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
index 8f32ffb219484a4a0391e036c63a6673888753e9..0a539ec78a122806741d46c4920736020d28d062 100644 (file)
@@ -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:
index 01008387f5ff3eadf248a2212e7ab3bb3daccdb0..1bf58e64580543e59f202ac50856c7fac6dd5d47 100644 (file)
@@ -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") },