]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Expansion device handling updates.
authorToni Wilen <twilen@winuae.net>
Thu, 18 Jun 2015 17:34:51 +0000 (20:34 +0300)
committerToni Wilen <twilen@winuae.net>
Thu, 18 Jun 2015 17:34:51 +0000 (20:34 +0300)
16 files changed:
a2065.cpp
a2091.cpp
cfgfile.cpp
expansion.cpp
filesys.cpp
include/a2091.h
include/autoconf.h
include/memory.h
include/ncr_scsi.h
include/rommgr.h
memory.cpp
ncr9x_scsi.cpp
ncr_scsi.cpp
rommgr.cpp
scsi.cpp
sndboard.cpp

index 227775cd92419d2a0daa36b412a089038a27070f..127bfa59c5b290ef37c683ba2d89419af5383c91 100644 (file)
--- a/a2065.cpp
+++ b/a2065.cpp
@@ -557,14 +557,21 @@ void a2065_hsync_handler (void)
 
 void rethink_a2065 (void)
 {
+       bool was = (uae_int_requested & 4) != 0;
        uae_int_requested &= ~4;
        if (!configured)
                return;
        csr[0] &= ~CSR0_INTR;
        if (csr[0] & (CSR0_BABL | CSR0_MISS | CSR0_MERR | CSR0_RINT | CSR0_TINT | CSR0_IDON))
                csr[0] |= CSR0_INTR;
-       if ((csr[0] & (CSR0_INTR | CSR0_INEA)) == (CSR0_INTR | CSR0_INEA))
+       if ((csr[0] & (CSR0_INTR | CSR0_INEA)) == (CSR0_INTR | CSR0_INEA)) {
                uae_int_requested |= 4;
+               if (!was && log_a2065 > 2)
+                       write_log(_T("A2065 +IRQ\n"));
+       }
+       if (log_a2065 && was && !(uae_int_requested & 4)) {
+               write_log(_T("A2065 -IRQ\n"));
+       }
 }
 
 static void chip_init (void)
@@ -913,6 +920,11 @@ static addrbank *a2065_config (void)
        td = NULL;
        if (ethernet_enumerate (&td, currprefs.a2065name)) {
                memcpy (realmac, td->mac, sizeof realmac);
+               if (!td->mac[0] && !td->mac[1] && !td->mac[2]) {
+                       realmac[0] = 0x00;
+                       realmac[1] = 0x80;
+                       realmac[2] = 0x10;
+               }
                write_log (_T("A2065: '%s' %02X:%02X:%02X:%02X:%02X:%02X\n"),
                        td->name, td->mac[0], td->mac[1], td->mac[2], td->mac[3], td->mac[4], td->mac[5]);
        } else {
index b37af47bf88a7c05d8332bff79e57ef4bea71398..3dd0b8f96ffe00ea3b21425fc2877f5ea88119ec 100644 (file)
--- a/a2091.cpp
+++ b/a2091.cpp
@@ -266,6 +266,7 @@ static struct wd_state *wd_a2090[MAX_DUPLICATE_EXPANSION_BOARDS];
 static struct wd_state *wd_a3000;
 static struct wd_state *wd_gvps1[MAX_DUPLICATE_EXPANSION_BOARDS];
 static struct wd_state *wd_gvps2[MAX_DUPLICATE_EXPANSION_BOARDS];
+static struct wd_state *wd_gvps2accel;
 struct wd_state *wd_cdtv;
 
 static struct wd_state *scsi_units[MAX_SCSI_UNITS + 1];
@@ -1410,6 +1411,7 @@ void scsi_hsync (void)
                scsi_hsync2_gvp(wd_gvps1[i]);
                scsi_hsync2_gvp(wd_gvps2[i]);
        }
+       scsi_hsync2_gvp(wd_gvps2accel);
        scsi_hsync2_a2091(wd_a3000);
        scsi_hsync2_a2091(wd_cdtv);
 }
@@ -2940,7 +2942,8 @@ static uae_u32 REGPARAM2 dmac_gvp_lgeti (uaecptr addr)
 }
 static int REGPARAM2 dmac_gvp_check(uaecptr addr, uae_u32 size)
 {
-       return 1;
+       struct wd_state *wd = getscsiboard(addr);
+       return wd ? 1 : 0;
 }
 static uae_u8 *REGPARAM2 dmac_gvp_xlate(uaecptr addr)
 {
@@ -3324,7 +3327,7 @@ void a3000scsi_reset (void)
        wd->enabled = true;
        wd->configured = -1;
        wd->dmac_type = COMMODORE_SDMAC;
-       map_banks (&mbdmac_a3000_bank, 0xDD, 1, 0);
+       map_banks(&mbdmac_a3000_bank, 0xDD, 1, 0);
        wd_cmd_reset (&wd->wc, false);
        reset_dmac(wd);
 }
@@ -3376,6 +3379,14 @@ void gvp_s2_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi
        add_scsi_device(&wd->scsis[ch], ch, ci, rc);
 }
 
+void gvp_s2_add_accelerator_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
+{
+       struct wd_state *wd = allocscsi(&wd_gvps2accel, rc, ch);
+       if (!wd || ch < 0)
+               return;
+       add_scsi_device(&wd->scsis[ch], ch, ci, rc);
+}
+
 void a2091_free_device (struct wd_state *wd)
 {
        freencrunit(wd);
@@ -3563,6 +3574,7 @@ void gvp_free (void)
                gvp_free_device(wd_gvps1[i]);
                gvp_free_device(wd_gvps2[i]);
        }
+       gvp_free_device(wd_gvps2accel);
 }
 
 static void gvp_reset_device(struct wd_state *wd)
@@ -3585,6 +3597,7 @@ void gvp_reset (void)
                gvp_reset_device(wd_gvps1[i]);
                gvp_reset_device(wd_gvps2[i]);
        }
+       gvp_reset_device(wd_gvps2accel);
 }
 
 static const uae_u8 gvp_scsi_i_autoconfig_1[16] = { 0xd1, 0x01, 0x00, 0x00, 0x07, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 };
index 3480cb89d40b71f3046bd0f6fe6931632e1534f6..1d1fe8fd653b9ffdec15941b259e7b01f401f71d 100644 (file)
@@ -202,6 +202,7 @@ static const TCHAR *cdmodes[] = { _T("disabled"), _T(""), _T("image"), _T("ioctl
 static const TCHAR *cdconmodes[] = { _T(""), _T("uae"), _T("ide"), _T("scsi"), _T("cdtv"), _T("cd32"), 0 };
 static const TCHAR *specialmonitors[] = { _T("none"), _T("autodetect"), _T("a2024"), _T("graffiti"),
 _T("ham_e"), _T("ham_e_plus"), _T("videodac18"), _T("avideo12"), _T("avideo24"), _T("firecracker24"), _T("dctv"), 0 };
+static const TCHAR *genlockmodes[] = { _T("none"), _T("noise"), _T("testcard"), NULL };
 static const TCHAR *rtgtype[] = {
        _T("ZorroII"), _T("ZorroIII"),
        _T("PicassoII"),
@@ -1313,6 +1314,9 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type)
        cfgfile_write_bool (f, _T("bsdsocket_emu"), p->socket_emu);
        if (p->a2065name[0])
                cfgfile_write_str (f, _T("a2065"), p->a2065name);
+       if (p->ne2000pciname[0])
+               cfgfile_write_str(f, _T("ne2000_pci"), p->ne2000pciname);
+
 #ifdef WITH_SLIRP
        tmp[0] = 0;
        for (i = 0; i < MAX_SLIRP_REDIRS; i++) {
@@ -1507,7 +1511,9 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type)
        cfgfile_dwrite_str (f, _T("waiting_blits"), waitblits[p->waiting_blits]);
        cfgfile_write_bool (f, _T("ntsc"), p->ntscmode);
        cfgfile_write_bool (f, _T("genlock"), p->genlock);
-       cfgfile_dwrite_str (f, _T("monitoremu"), specialmonitors[p->monitoremu]);
+       cfgfile_dwrite_str(f, _T("genlockmode"), genlockmodes[p->genlock_image]);
+       cfgfile_dwrite_str(f, _T("genlock_image"), p->genlock_image_file);
+       cfgfile_dwrite_str(f, _T("monitoremu"), specialmonitors[p->monitoremu]);
 
        cfgfile_dwrite_bool (f, _T("show_leds"), !!(p->leds_on_screen & STATUSLINE_CHIPSET));
        cfgfile_dwrite_bool (f, _T("show_leds_rtg"), !!(p->leds_on_screen & STATUSLINE_RTG));
@@ -4104,7 +4110,9 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, const TCHAR *option, TCH
                return 1;
        }
 
-       if (cfgfile_string (option, value, _T("a2065"), p->a2065name, sizeof p->a2065name / sizeof (TCHAR)))
+       if (cfgfile_string(option, value, _T("a2065"), p->a2065name, sizeof p->a2065name / sizeof(TCHAR)))
+               return 1;
+       if (cfgfile_string(option, value, _T("ne2000_pci"), p->ne2000pciname, sizeof p->ne2000pciname / sizeof(TCHAR)))
                return 1;
 
        if (cfgfile_yesno (option, value, _T("immediate_blits"), &p->immediate_blits)
@@ -4222,7 +4230,8 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, const TCHAR *option, TCH
                || cfgfile_strval (option, value, _T("comp_trustnaddr"), &p->comptrustnaddr, compmode, 0)
                || cfgfile_strval (option, value, _T("collision_level"), &p->collision_level, collmode, 0)
                || cfgfile_strval (option, value, _T("parallel_matrix_emulation"), &p->parallel_matrix_emulation, epsonprinter, 0)
-               || cfgfile_strval (option, value, _T("monitoremu"), &p->monitoremu, specialmonitors, 0)
+               || cfgfile_strval(option, value, _T("monitoremu"), &p->monitoremu, specialmonitors, 0)
+               || cfgfile_strval(option, value, _T("genlockmode"), &p->genlock_image, genlockmodes, 0)
                || cfgfile_strval (option, value, _T("waiting_blits"), &p->waiting_blits, waitblits, 0)
                || cfgfile_strval (option, value, _T("floppy_auto_extended_adf"), &p->floppy_auto_ext2, autoext2, 0)
                || cfgfile_strval (option, value,  _T("z3mapping"), &p->z3_mapping_mode, z3mapping, 0)
@@ -4240,8 +4249,9 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, const TCHAR *option, TCH
                || cfgfile_path (option, value, _T("flash_file"), p->flashfile, sizeof p->flashfile / sizeof (TCHAR), &p->path_rom)
                || cfgfile_path (option, value, _T("cart_file"), p->cartfile, sizeof p->cartfile / sizeof (TCHAR), &p->path_rom)
                || cfgfile_path (option, value, _T("rtc_file"), p->rtcfile, sizeof p->rtcfile / sizeof (TCHAR), &p->path_rom)
-               || cfgfile_path (option, value, _T("picassoiv_rom_file"), p->picassoivromfile, sizeof p->picassoivromfile / sizeof (TCHAR), &p->path_rom)
-               || cfgfile_string (option, value, _T("pci_devices"), p->pci_devices, sizeof p->pci_devices / sizeof (TCHAR))
+               || cfgfile_path(option, value, _T("picassoiv_rom_file"), p->picassoivromfile, sizeof p->picassoivromfile / sizeof(TCHAR), &p->path_rom)
+               || cfgfile_string(option, value, _T("genlock_image"), p->genlock_image_file, sizeof p->genlock_image_file / sizeof(TCHAR))
+               || cfgfile_string(option, value, _T ("pci_devices"), p->pci_devices, sizeof p->pci_devices / sizeof(TCHAR))
                || cfgfile_string (option, value, _T("ghostscript_parameters"), p->ghostscript_parameters, sizeof p->ghostscript_parameters / sizeof (TCHAR)))
                return 1;
 
@@ -6036,6 +6046,7 @@ void default_prefs (struct uae_prefs *p, int type)
        p->blitter_cycle_exact = 0;
        p->chipset_mask = CSMASK_ECS_AGNUS;
        p->genlock = 0;
+       p->genlock_image = 0;
        p->ntscmode = 0;
        p->filesys_limit = 0;
        p->filesys_max_name = 107;
index 110ff0bcb0115c1f63b4e8bd46d48eca0e441d38..0404c764d5fe6c6b4b2c55cc784656e207ba42c6 100644 (file)
@@ -38,6 +38,7 @@
 #include "uae/ppc.h"
 #include "autoconf.h"
 #include "specialmonitors.h"
+#include "pci.h"
 
 #define EXP_DEBUG 0
 
@@ -1080,83 +1081,71 @@ static addrbank *expamem_map_fastcard_2 (int boardnum)
        return ab;
 }
 
-static const uae_u8 a2630_autoconfig[] = { 0xe7, 0x51, 0x40, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
-
-static addrbank *expamem_init_fastcard(int boardnum)
+static void fastmem_autoconfig(int boardnum, int zorro, uae_u8 type, uae_u32 serial, int allocated)
 {
        uae_u16 mid = 0;
        uae_u8 pid;
-       uae_u8 type = add_memory | zorroII;
-       int allocated = boardnum ? fastmem2_bank.allocated : fastmem_bank.allocated;
-       uae_u32 serial = 1;
+       uae_u8 flags = care_addr;
        DEVICE_MEMORY_CALLBACK dmc = NULL;
        struct romconfig *dmc_rc = NULL;
        uae_u8 ac[16] = { 0 };
 
-       if (allocated == 0)
-               return &expamem_null;
-
-       expamem_init_clear ();
-       if (allocated == 65536)
-               type |= Z2_MEM_64KB;
-       else if (allocated == 131072)
-               type |= Z2_MEM_128KB;
-       else if (allocated == 262144)
-               type |= Z2_MEM_256KB;
-       else if (allocated == 524288)
-               type |= Z2_MEM_512KB;
-       else if (allocated == 0x100000)
-               type |= Z2_MEM_1MB;
-       else if (allocated == 0x200000)
-               type |= Z2_MEM_2MB;
-       else if (allocated == 0x400000)
-               type |= Z2_MEM_4MB;
-       else if (allocated == 0x800000)
-               type |= Z2_MEM_8MB;
-
-       if (ISCPUBOARD(BOARD_COMMODORE, BOARD_COMMODORE_SUB_A26x0) && boardnum != 0) {
-               for (int i = 1; i < 16; i++)
-                       expamem_write(i * 4, a2630_autoconfig[i]);
-               type &= 7;
-               type |= a2630_autoconfig[0] & ~7;
-               expamem_write(0, type);
-               return NULL;
-       }
-       for (int i = 0; expansionroms[i].name; i++) {
-               const struct expansionromtype *erc = &expansionroms[i];
-               if (erc->zorro == 2 && 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];
-                               if (srt->memory_mid) {
-                                       mid = srt->memory_mid;
-                                       pid = srt->memory_pid;
-                                       serial = srt->memory_serial;
-                                       if (!srt->memory_after)
-                                               type |= chainedconfig;
+       if (boardnum == 1) {
+               const struct cpuboardsubtype *cst = &cpuboards[currprefs.cpuboard_type].subtypes[currprefs.cpuboard_subtype];
+               if (cst->memory_mid) {
+                       mid = cst->memory_mid;
+                       pid = cst->memory_pid;
+                       serial = cst->memory_serial;
+               }
+       } 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)) {
+                               struct romconfig *rc = get_device_romconfig(&currprefs, erc->romtype, 0);
+                               if (erc->subtypes) {
+                                       const struct expansionsubromtype *srt = &erc->subtypes[rc->subtype];
+                                       if (srt->memory_mid) {
+                                               mid = srt->memory_mid;
+                                               pid = srt->memory_pid;
+                                               serial = srt->memory_serial;
+                                               if (!srt->memory_after)
+                                                       type |= chainedconfig;
+                                       }
                                }
-                       } else {
-                               if (erc->memory_mid) {
-                                       mid = erc->memory_mid;
-                                       pid = erc->memory_pid;
-                                       serial = erc->memory_serial;
-                                       if (!erc->memory_after)
-                                               type |= chainedconfig;
+                               else {
+                                       if (erc->memory_mid) {
+                                               mid = erc->memory_mid;
+                                               pid = erc->memory_pid;
+                                               serial = erc->memory_serial;
+                                               if (!erc->memory_after)
+                                                       type |= chainedconfig;
+                                       }
                                }
+                               dmc = erc->memory_callback;
+                               dmc_rc = rc;
+                               break;
                        }
-                       dmc = erc->memory_callback;
-                       dmc_rc = rc;
-                       break;
                }
        }
+
        if (!mid) {
-               pid = currprefs.maprom && !currprefs.cpuboard_type ? 1 : 81;
+               if (zorro <= 2) {
+                       pid = currprefs.maprom && !currprefs.cpuboard_type ? 1 : 81;
+               } else {
+                       int subsize = (allocated == 0x100000 ? Z3_SS_MEM_1MB
+                                                  : allocated == 0x200000 ? Z3_SS_MEM_2MB
+                                                  : allocated == 0x400000 ? Z3_SS_MEM_4MB
+                                                  : allocated == 0x800000 ? Z3_SS_MEM_8MB
+                                                  : Z3_SS_MEM_SAME);
+                       pid = currprefs.maprom && !currprefs.cpuboard_type ? 3 : 83;
+                       flags |= force_z3 | (allocated > 0x800000 ? ext_size : subsize);
+               }
                mid = uae_id;
        }
 
        ac[0x00 / 4] = type;
        ac[0x04 / 4] = pid;
-       ac[0x08 / 4] = care_addr;
+       ac[0x08 / 4] = flags;
        ac[0x10 / 4] = mid >> 8;
        ac[0x14 / 4] = mid;
        ac[0x18 / 4] = serial >> 24;
@@ -1182,10 +1171,61 @@ static addrbank *expamem_init_fastcard(int boardnum)
        expamem_write(0x2c, 0x00); /* ROM-Offset lo */
 
        expamem_write(0x40, 0x00); /* Ctrl/Statusreg.*/
+}
+
+static const uae_u8 a2630_autoconfig[] = { 0xe7, 0x51, 0x40, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+
+static addrbank *expamem_init_fastcard_2(int boardnum)
+{
+       uae_u8 type = add_memory | zorroII;
+       int allocated = boardnum ? fastmem2_bank.allocated : fastmem_bank.allocated;
+       uae_u32 serial = 1;
+
+       if (allocated == 0)
+               return &expamem_null;
+
+       expamem_init_clear ();
+       if (allocated == 65536)
+               type |= Z2_MEM_64KB;
+       else if (allocated == 131072)
+               type |= Z2_MEM_128KB;
+       else if (allocated == 262144)
+               type |= Z2_MEM_256KB;
+       else if (allocated == 524288)
+               type |= Z2_MEM_512KB;
+       else if (allocated == 0x100000)
+               type |= Z2_MEM_1MB;
+       else if (allocated == 0x200000)
+               type |= Z2_MEM_2MB;
+       else if (allocated == 0x400000)
+               type |= Z2_MEM_4MB;
+       else if (allocated == 0x800000)
+               type |= Z2_MEM_8MB;
+
+       if (boardnum == 1) {
+               if (ISCPUBOARD(BOARD_COMMODORE, BOARD_COMMODORE_SUB_A26x0)) {
+                       for (int i = 1; i < 16; i++)
+                               expamem_write(i * 4, a2630_autoconfig[i]);
+                       type &= 7;
+                       type |= a2630_autoconfig[0] & ~7;
+                       expamem_write(0, type);
+                       return NULL;
+               }
+       }
+
+       fastmem_autoconfig(boardnum, 2, type, serial, allocated);
 
        return NULL;
 }
 
+static addrbank *expamem_init_fastcard(int boardnum)
+{
+       return expamem_init_fastcard_2(0);
+}
+static addrbank *expamem_init_fastcard2(int boardnum)
+{
+       return expamem_init_fastcard_2(1);
+}
 static addrbank *expamem_map_fastcard (void)
 {
        return expamem_map_fastcard_2 (0);
@@ -1317,7 +1357,7 @@ static addrbank *expamem_map_z3fastmem2 (void)
        return expamem_map_z3fastmem_2 (&z3fastmem2_bank, &z3fastmem2_bank.start, currprefs.z3fastmem2_size, z3fastmem2_bank.allocated, 0);
 }
 
-static addrbank *expamem_init_z3fastmem_2(addrbank *bank, uae_u32 start, uae_u32 size, uae_u32 allocated)
+static addrbank *expamem_init_z3fastmem_2(int boardnum, addrbank *bank, uae_u32 start, uae_u32 size, uae_u32 allocated)
 {
        int code = (allocated == 0x100000 ? Z2_MEM_1MB
                : allocated == 0x200000 ? Z2_MEM_2MB
@@ -1330,45 +1370,22 @@ static addrbank *expamem_init_z3fastmem_2(addrbank *bank, uae_u32 start, uae_u32
                : allocated == 0x10000000 ? Z3_MEM_256MB
                : allocated == 0x20000000 ? Z3_MEM_512MB
                : Z3_MEM_1GB);
-       int subsize = (allocated == 0x100000 ? Z3_SS_MEM_1MB
-               : allocated == 0x200000 ? Z3_SS_MEM_2MB
-               : allocated == 0x400000 ? Z3_SS_MEM_4MB
-               : allocated == 0x800000 ? Z3_SS_MEM_8MB
-               : Z3_SS_MEM_SAME);
 
        if (allocated < 0x1000000)
                code = Z3_MEM_16MB; /* Z3 physical board size is always at least 16M */
 
        expamem_init_clear ();
-       expamem_write (0x00, add_memory | zorroIII | code);
-
-       expamem_write (0x08, care_addr | force_z3 | (allocated > 0x800000 ? ext_size : subsize));
-
-       expamem_write (0x04, currprefs.maprom && !currprefs.cpuboard_type ? 3 : 83);
-
-       expamem_write (0x10, uae_id >> 8);
-       expamem_write (0x14, uae_id & 0xff);
-
-       expamem_write (0x18, 0x00); /* ser.no. Byte 0 */
-       expamem_write (0x1c, 0x00); /* ser.no. Byte 1 */
-       expamem_write (0x20, 0x00); /* ser.no. Byte 2 */
-       expamem_write (0x24, 0x01); /* ser.no. Byte 3 */
-
-       expamem_write (0x28, 0x00); /* ROM-Offset hi */
-       expamem_write (0x2c, 0x00); /* ROM-Offset lo */
-
-       expamem_write (0x40, 0x00); /* Ctrl/Statusreg.*/
-
+       fastmem_autoconfig(boardnum, 3, add_memory | zorroIII | code, 1, allocated);
        map_banks (bank, start >> 16, size >> 16, allocated);
        return NULL;
 }
 static addrbank *expamem_init_z3fastmem (int devnum)
 {
-       return expamem_init_z3fastmem_2 (&z3fastmem_bank, z3fastmem_bank.start, currprefs.z3fastmem_size, z3fastmem_bank.allocated);
+       return expamem_init_z3fastmem_2 (0, &z3fastmem_bank, z3fastmem_bank.start, currprefs.z3fastmem_size, z3fastmem_bank.allocated);
 }
 static addrbank *expamem_init_z3fastmem2(int devnum)
 {
-       return expamem_init_z3fastmem_2 (&z3fastmem2_bank, z3fastmem2_bank.start, currprefs.z3fastmem2_size, z3fastmem2_bank.allocated);
+       return expamem_init_z3fastmem_2 (1, &z3fastmem2_bank, z3fastmem2_bank.start, currprefs.z3fastmem2_size, z3fastmem2_bank.allocated);
 }
 
 #ifdef PICASSO96
@@ -1763,12 +1780,21 @@ static void add_expansions(int zorro)
                                if (rc) {
                                        if (zorro == 1) {
                                                ert->init(rc);
+                                               if (ert->init2)
+                                                       ert->init2(rc);
                                        } else {
                                                cards[cardno].flags = 0;
                                                cards[cardno].name = ert->name;
                                                cards[cardno].initrc = ert->init;
                                                cards[cardno].rc = rc;
                                                cards[cardno++].map = NULL;
+                                               if (ert->init2) {
+                                                       cards[cardno].flags = 0;
+                                                       cards[cardno].name = ert->name;
+                                                       cards[cardno].initrc = ert->init2;
+                                                       cards[cardno].rc = rc;
+                                                       cards[cardno++].map = NULL;
+                                               }
                                        }
                                }
                        }
@@ -1828,7 +1854,7 @@ void expamem_reset (void)
                if (fastmem2_bank.baseaddr != NULL && (fastmem2_bank.allocated <= 262144  || currprefs.chipmem_size <= 2 * 1024 * 1024)) {
                        cards[cardno].flags = 0;
                        cards[cardno].name = _T("Z2Fast2");
-                       cards[cardno].initnum = expamem_init_fastcard;
+                       cards[cardno].initnum = expamem_init_fastcard2;
                        cards[cardno++].map = expamem_map_fastcard2;
                }
        } else {
@@ -2207,12 +2233,12 @@ static const struct expansionsubromtype a2090_sub[] = {
 #endif
 static const struct expansionsubromtype a2091_sub[] = {
        {
-               _T("DMAC-01"), _T("dmac01"),
+               _T("DMAC-01"), _T("dmac01"), 0,
                commodore, commodore_a2091_ram, 0, true,
                { 0 },
        },
        {
-               _T("DMAC-02"), _T("dmac02"),
+               _T("DMAC-02"), _T("dmac02"), 0,
                commodore, commodore_a2091_ram, 0, true,
                { 0 },
        },
@@ -2222,17 +2248,17 @@ static const struct expansionsubromtype a2091_sub[] = {
 };
 static const struct expansionsubromtype gvp1_sub[] = {
        {
-               _T("Impact A2000-1/X"), _T("a2000-1"),
+               _T("Impact A2000-1/X"), _T("a2000-1"), 0,
                1761, 8, 0, false,
                { 0 },
        },
        {
-               _T("Impact A2000-HC"), _T("a2000-hc"),
+               _T("Impact A2000-HC"), _T("a2000-hc"), 0,
                1761, 8, 0, false,
                { 0 },
        },
        {
-               _T("Impact A2000-HC+2"), _T("a2000-hc+"),
+               _T("Impact A2000-HC+2"), _T("a2000-hc+"), 0,
                1761, 8, 0, false,
                { 0 },
        },
@@ -2242,12 +2268,12 @@ static const struct expansionsubromtype gvp1_sub[] = {
 };
 static const struct expansionsubromtype masoboshi_sub[] = {
        {
-               _T("MC-302"), _T("mc-302"),
+               _T("MC-302"), _T("mc-302"), 0,
                2157, 3, 0, false,
                { 0 },
        },
        {
-               _T("MC-702"), _T("mc-702"),
+               _T("MC-702"), _T("mc-702"), 0,
                2157, 3, 0, false,
                { 0 },
        },
@@ -2257,12 +2283,12 @@ static const struct expansionsubromtype masoboshi_sub[] = {
 };
 static const struct expansionsubromtype rochard_sub[] = {
        {
-               _T("IDE"), _T("ide"),
+               _T("IDE"), _T("ide"), 0,
                2144, 2, 0, false,
                { 0 },
        },
        {
-               _T("IDE+SCSI"), _T("scsi"),
+               _T("IDE+SCSI"), _T("scsi"), 0,
                2144, 2, 0, false,
                { 0 },
        },
@@ -2272,27 +2298,27 @@ static const struct expansionsubromtype rochard_sub[] = {
 };
 static const struct expansionsubromtype supra_sub[] = {
        {
-               _T("A500 ByteSync/XP"), _T("bytesync"),
+               _T("A500 ByteSync/XP"), _T("bytesync"), ROMTYPE_NONE | ROMTYPE_SUPRA,
                1056, 9, 0, false,
                { 0xd1, 13, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 },
        },
        {
-               _T("A2000 Word Sync"), _T("wordsync"),
+               _T("A2000 Word Sync"), _T("wordsync"), ROMTYPE_NONE | ROMTYPE_SUPRA,
                1056, 9, 0, false,
                { 0xd1, 12, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 },
        },
        {
-               _T("A500 Autoboot"), _T("500"),
+               _T("A500 Autoboot"), _T("500"), ROMTYPE_NONE | ROMTYPE_SUPRA,
                1056, 5, 0, false,
                { 0xd1, 8, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 },
        },
        {
-               _T("Non Autoboot (4x4)"), _T("4x4"),
+               _T("Non Autoboot (4x4)"), _T("4x4"), ROMTYPE_NOT | ROMTYPE_SUPRA,
                1056, 2, 0, false,
                { 0xc1, 1, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
        },
        {
-               _T("A2000 DMA"), _T("dma"),
+               _T("A2000 DMA"), _T("dma"), ROMTYPE_NONE | ROMTYPE_SUPRADMA,
                1056, 2, 0, false,
                { 0xd1, 3, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00 },
        },
@@ -2300,6 +2326,54 @@ static const struct expansionsubromtype supra_sub[] = {
                NULL
        }
 };
+
+static const struct expansionsubromtype pcibridge_sub[] = {
+       {
+               _T("Prometheus"), _T("prometheus"), ROMTYPE_NOT | ROMTYPE_PCIBRIDGE
+       },
+       {
+               _T("G-REX"), _T("grex"), ROMTYPE_NOT | ROMTYPE_PCIBRIDGE
+       },
+       {
+               _T("Mediator 1200TX 4M"), _T("mediator1200tx4m"), ROMTYPE_NOT | ROMTYPE_PCIBRIDGE
+       },
+       {
+               _T("Mediator 1200TX 8M"), _T("mediator1200tx8m"), ROMTYPE_NOT | ROMTYPE_PCIBRIDGE
+       },
+       {
+               _T("Mediator 4000MK2 256M"), _T("mediator4000mkii256m"), ROMTYPE_NOT | ROMTYPE_PCIBRIDGE
+       },
+       {
+               _T("Mediator 4000MK2 512M"), _T("mediator4000mkii512m"), ROMTYPE_NOT | ROMTYPE_PCIBRIDGE
+       },
+       {
+               _T("CVision/BVision"), _T("cbvision"), ROMTYPE_NOT | ROMTYPE_PCIBRIDGE
+       },
+       {
+               NULL
+       }
+};
+
+
+static void fastlane_memory_callback(struct romconfig *rc, uae_u8 *ac, int size)
+{
+       struct zfile *z = read_device_from_romconfig(rc, NULL);
+       if (z) {
+               // load autoconfig data from rom file
+               uae_u8 act[16] = { 0 };
+               zfile_fseek(z, 0x80, SEEK_SET);
+               zfile_fread(act, 1, 16, z);
+               zfile_fclose(z);
+               for(int i = 1; i < 16; i++) {
+                       ac[i] = ~act[i];
+                       act[i] = ~act[i];
+               }
+               // don't overwrite uae configured memory size
+               ac[0] = (ac[0] & 7) | (act[0] & 0xf8);
+               ac[2] = (ac[2] & 0x0f) | (act[2] & 0xf0);
+       }
+}
+
 static void nexus_memory_callback(struct romconfig *rc, uae_u8 *ac, int size)
 {
        if (rc->device_settings & 1)
@@ -2333,32 +2407,38 @@ static const struct expansionboardsettings adscsi2000_settings[] = {
 const struct expansionromtype expansionroms[] = {
        {
                _T("cpuboard"), _T("Accelerator"), _T("Accelerator"),
-               NULL, add_cpuboard_unit, ROMTYPE_CPUBOARD, 0, 0, 0, true,
+               NULL, NULL, add_cpuboard_unit, ROMTYPE_CPUBOARD, 0, 0, 0, true,
                NULL, 0,
                false, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_IDE
        },
        {
                _T("cpuboard_ext"), _T("SCSI Kit IV"), _T("Blizzard"),
-               NULL, NULL, ROMTYPE_CPUBOARDEXT, ROMTYPE_CPUBOARD, 0, 0, true,
+               NULL, NULL, NULL, ROMTYPE_CPUBOARDEXT, ROMTYPE_CPUBOARD, 0, 0, true,
                NULL, 0,
                false, EXPANSIONTYPE_SCSI
        },
+       {
+               _T("pcibridge"), _T("PCI Bridges"), _T(""),
+               pcibridge_init, pcibridge_init2, NULL, ROMTYPE_PCIBRIDGE | ROMTYPE_NONE, 0, 0, 3, false,
+               pcibridge_sub, 0,
+               false, 0,
+       },
        {
                _T("a2090a"), _T("A2090a"), _T("Commodore"),
-               a2090_init, a2090_add_scsi_unit, ROMTYPE_A2090 | ROMTYPE_NONE, 0, 0, 2, false,
+               a2090_init, NULL, a2090_add_scsi_unit, ROMTYPE_A2090 | ROMTYPE_NONE, 0, 0, 2, false,
                NULL, 0,
                true, EXPANSIONTYPE_SCSI
        },
        {
                _T("a2091"), _T("A590/A2091"), _T("Commodore"),
-               a2091_init, a2091_add_scsi_unit, ROMTYPE_A2091 | ROMTYPE_NONE, 0, 0, 2, false,
+               a2091_init, NULL, a2091_add_scsi_unit, ROMTYPE_A2091 | ROMTYPE_NONE, 0, 0, 2, false,
                a2091_sub, 1,
                true, EXPANSIONTYPE_SCSI,
                0, 0, 0, true, NULL
        },
        {
                _T("a4091"), _T("A4091"), _T("Commodore"),
-               ncr710_a4091_autoconfig_init, a4091_add_scsi_unit, ROMTYPE_A4091, 0, 0, 3, false,
+               ncr710_a4091_autoconfig_init, NULL, a4091_add_scsi_unit, ROMTYPE_A4091, 0, 0, 3, false,
                NULL, 0,
                false, EXPANSIONTYPE_SCSI,
                0, 0, 0, false, NULL,
@@ -2366,78 +2446,79 @@ const struct expansionromtype expansionroms[] = {
        },
        {
                _T("fastlane"), _T("Fastlane"), _T("Phase 5"),
-               ncr_fastlane_autoconfig_init, fastlane_add_scsi_unit, ROMTYPE_FASTLANE, 0, 0, 3, false,
+               ncr_fastlane_autoconfig_init, NULL, fastlane_add_scsi_unit, ROMTYPE_FASTLANE, 0, 0, 3, false,
                NULL, 0,
-               false, EXPANSIONTYPE_SCSI
+               false, EXPANSIONTYPE_SCSI,
+               8512, 10, 0, false, fastlane_memory_callback
        },
        {
                _T("gvp1"), _T("Series I"), _T("GVP"),
-               gvp_init_s1, gvp_s1_add_scsi_unit, ROMTYPE_GVPS1 | ROMTYPE_NONE, ROMTYPE_GVPS12, 0, 2, false,
+               gvp_init_s1, NULL, gvp_s1_add_scsi_unit, ROMTYPE_GVPS1 | ROMTYPE_NONE, ROMTYPE_GVPS12, 0, 2, false,
                gvp1_sub, 1,
                true, EXPANSIONTYPE_SCSI
        },
        {
                _T("gvp"), _T("Series II"), _T("GVP"),
-               gvp_init_s2, gvp_s2_add_scsi_unit, ROMTYPE_GVPS2 | ROMTYPE_NONE, ROMTYPE_GVPS12, 0, 2, false,
+               gvp_init_s2, NULL, gvp_s2_add_scsi_unit, ROMTYPE_GVPS2 | ROMTYPE_NONE, ROMTYPE_GVPS12, 0, 2, false,
                NULL, 0,
                true, EXPANSIONTYPE_SCSI,
                2017, 10, 0
        },
        {
                _T("oktagon2008"), _T("Oktagon 2008"), _T("BSC/Alfa Data"),
-               ncr_oktagon_autoconfig_init, oktagon_add_scsi_unit, ROMTYPE_OKTAGON, 0, 0, 2, false,
+               ncr_oktagon_autoconfig_init, NULL, oktagon_add_scsi_unit, ROMTYPE_OKTAGON, 0, 0, 2, false,
                NULL, 0,
                true, EXPANSIONTYPE_SCSI
        },
        {
                _T("alfapower"), _T("AlfaPower/AT-Bus 2008"), _T("BSC/Alfa Data"),
-               alf_init, alf_add_ide_unit, ROMTYPE_ALFA, 0, 0, 2, false,
+               alf_init, NULL, alf_add_ide_unit, ROMTYPE_ALFA, 0, 0, 2, false,
                NULL, 0,
                false, EXPANSIONTYPE_IDE,
                2092, 8, 0
        },
        {
                _T("alfapowerplus"), _T("AlfaPower Plus"), _T("BSC/Alfa Data"),
-               alf_init, alf_add_ide_unit, ROMTYPE_ALFAPLUS, 0, 0, 2, false,
+               alf_init, NULL, alf_add_ide_unit, ROMTYPE_ALFAPLUS, 0, 0, 2, false,
                NULL, 0,
                false, EXPANSIONTYPE_IDE,
                2092, 8, 0
        },
        {
                _T("apollo"), _T("Apollo"), _T("ACT"),
-               apollo_init_hd, apollo_add_scsi_unit, ROMTYPE_APOLLO, 0, 0, 2, false,
+               apollo_init_hd, NULL, apollo_add_scsi_unit, ROMTYPE_APOLLO, 0, 0, 2, false,
                NULL, 0,
                false, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_IDE,
                8738, 0, 0
        },
        {
                _T("masoboshi"), _T("MasterCard"), _T("Masoboshi"),
-               masoboshi_init, masoboshi_add_idescsi_unit, ROMTYPE_MASOBOSHI | ROMTYPE_NONE, 0, 0, 2, false,
+               masoboshi_init, NULL, masoboshi_add_idescsi_unit, ROMTYPE_MASOBOSHI | ROMTYPE_NONE, 0, 0, 2, false,
                masoboshi_sub, 0,
                true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_IDE
        },
        {
                _T("supradrive"), _T("SupraDrive"), _T("Supra"),
-               supra_init, supra_add_scsi_unit, ROMTYPE_SUPRA | ROMTYPE_NONE, 0, 0, 2, false,
+               supra_init, NULL, supra_add_scsi_unit, ROMTYPE_SUPRA | ROMTYPE_NONE, 0, 0, 2, false,
                supra_sub, 0,
                true, EXPANSIONTYPE_SCSI
        },
        {
                _T("golem"), _T("Golem"), _T("Kupke"),
-               golem_init, golem_add_scsi_unit, ROMTYPE_GOLEM, 0, 0, 2, false,
+               golem_init, NULL, golem_add_scsi_unit, ROMTYPE_GOLEM, 0, 0, 2, false,
                NULL, 0,
                true, EXPANSIONTYPE_SCSI,
                2079, 3, 0
        },
        {
                _T("adide"), _T("AdIDE"), _T("ICD"),
-               adide_init, adide_add_ide_unit, ROMTYPE_ADIDE | ROMTYPE_NONE, 0, 0, 2, false,
+               adide_init, NULL, adide_add_ide_unit, ROMTYPE_ADIDE | ROMTYPE_NONE, 0, 0, 2, false,
                NULL, 0,
                true, EXPANSIONTYPE_IDE
        },
        {
                _T("adscsi2000"), _T("AdSCSI Advantage 2000"), _T("ICD"),
-               adscsi_init, adscsi_add_scsi_unit, ROMTYPE_ADSCSI, 0, 0, 2, false,
+               adscsi_init, NULL, adscsi_add_scsi_unit, ROMTYPE_ADSCSI, 0, 0, 2, false,
                NULL, 0,
                false, EXPANSIONTYPE_SCSI,
                0, 0, 0, false, NULL,
@@ -2446,20 +2527,20 @@ const struct expansionromtype expansionroms[] = {
        },
        {
                _T("mtecat"), _T("AT 500"), _T("M-Tec"),
-               mtec_init, mtec_add_ide_unit, ROMTYPE_MTEC, 0, 0, 2, false,
+               mtec_init, NULL, mtec_add_ide_unit, ROMTYPE_MTEC, 0, 0, 2, false,
                NULL, 0,
                true, EXPANSIONTYPE_IDE
        },
        {
                _T("protar"), _T("A500 HD"), _T("Protar"),
-               protar_init, protar_add_ide_unit, ROMTYPE_PROTAR, 0, 0, 2, false,
+               protar_init, NULL, protar_add_ide_unit, ROMTYPE_PROTAR, 0, 0, 2, false,
                NULL, 0,
                true, EXPANSIONTYPE_SCSI,
                4149, 51, 0
        },
        {
                _T("stardrive"), _T("StarDrive"), _T("Microbotics"),
-               stardrive_init, stardrive_add_scsi_unit, ROMTYPE_STARDRIVE | ROMTYPE_NONE, 0, 0, 2, true,
+               stardrive_init, NULL, stardrive_add_scsi_unit, ROMTYPE_STARDRIVE | ROMTYPE_NOT, 0, 0, 2, true,
                NULL, 0,
                false, EXPANSIONTYPE_SCSI,
                1010, 0, 0, false, NULL,
@@ -2469,33 +2550,33 @@ const struct expansionromtype expansionroms[] = {
        },
        {
                _T("kommos"), _T("A500/A2000 SCSI"), _T("Jürgen Kommos"),
-               kommos_init, kommos_add_scsi_unit, ROMTYPE_KOMMOS, 0, 0, 1, true,
+               kommos_init, NULL, kommos_add_scsi_unit, ROMTYPE_KOMMOS, 0, 0, 1, true,
                NULL, 0,
                false, EXPANSIONTYPE_SCSI
        },
        {
                _T("vector"), _T("Vector Falcon 8000"), _T("HK-Computer"),
-               vector_init, vector_add_scsi_unit, ROMTYPE_VECTOR, 0, 0, 2, false,
+               vector_init, NULL, vector_add_scsi_unit, ROMTYPE_VECTOR, 0, 0, 2, false,
                NULL, 0,
                false, EXPANSIONTYPE_SCSI
        },
        {
                _T("add500"), _T("ADD-500"), _T("Archos"),
-               add500_init, add500_add_scsi_unit, ROMTYPE_ADD500, 0, 0, 2, false,
+               add500_init, NULL, add500_add_scsi_unit, ROMTYPE_ADD500, 0, 0, 2, false,
                NULL, 0,
                false, EXPANSIONTYPE_SCSI,
                8498, 27, 0, true, NULL
        },
        {
                _T("rochard"), _T("RocHard RH800C"), _T("Roctec"),
-               rochard_init, rochard_add_idescsi_unit, ROMTYPE_ROCHARD | ROMTYPE_NONE, 0, 0, 2, false,
+               rochard_init, NULL, rochard_add_idescsi_unit, ROMTYPE_ROCHARD | ROMTYPE_NONE, 0, 0, 2, false,
                rochard_sub, 0,
                true, EXPANSIONTYPE_IDE | EXPANSIONTYPE_SCSI | EXPANSIONTYPE_IDE_PORT_DOUBLED,
                2144, 2, 0
        },
        {
                _T("cltda1000scsi"), _T("A1000/A2000 SCSI"), _T("C-Ltd"),
-               cltda1000scsi_init, cltda1000scsi_add_scsi_unit, ROMTYPE_CLTDSCSI | ROMTYPE_NONE, 0, 0, 2, false,
+               cltda1000scsi_init, NULL, cltda1000scsi_add_scsi_unit, ROMTYPE_CLTDSCSI | ROMTYPE_NOT, 0, 0, 2, false,
                NULL, 0,
                false, EXPANSIONTYPE_SCSI,
                0, 0, 0, false, NULL,
@@ -2504,7 +2585,7 @@ const struct expansionromtype expansionroms[] = {
        },
        {
                _T("ptnexus"), _T("Nexus"), _T("Preferred Technologies"),
-               ptnexus_init, ptnexus_add_scsi_unit, ROMTYPE_PTNEXUS | ROMTYPE_NONE, 0, 0, 2, false,
+               ptnexus_init, NULL, ptnexus_add_scsi_unit, ROMTYPE_PTNEXUS | ROMTYPE_NONE, 0, 0, 2, false,
                NULL, 0,
                false, EXPANSIONTYPE_SCSI,
                2102, 4, 0, false, nexus_memory_callback,
@@ -2513,7 +2594,7 @@ const struct expansionromtype expansionroms[] = {
        },
        {
                _T("dataflyerscsiplus"), _T("DataFlyer SCSI+"), _T("Expansion Systems"),
-               dataflyer_init, dataflyer_add_scsi_unit, ROMTYPE_DATAFLYER | ROMTYPE_NONE, 0, 0, 1, true,
+               dataflyer_init, NULL, dataflyer_add_scsi_unit, ROMTYPE_DATAFLYER | ROMTYPE_NOT, 0, 0, 1, true,
                NULL, 0,
                false, EXPANSIONTYPE_SCSI,
        },
@@ -2529,7 +2610,7 @@ const struct expansionromtype expansionroms[] = {
 #endif
        {
                _T("amax"), _T("AMAX ROM dongle"), _T("ReadySoft"),
-               NULL, 0, NULL, NULL, ROMTYPE_AMAX | ROMTYPE_NONE, 0, 0, 0, false
+               NULL, 0, NULL, NULL, NULL, ROMTYPE_AMAX | ROMTYPE_NONE, 0, 0, 0, false
        },
        {
                NULL
@@ -2571,17 +2652,19 @@ static const struct cpuboardsubtype gvpboard_sub[] = {
                _T("A530"),
                _T("GVPA530"),
                ROMTYPE_GVPS2, 0,
-               gvp_s2_add_scsi_unit, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_24BIT,
+               gvp_s2_add_accelerator_scsi_unit, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_24BIT,
                BOARD_MEMORY_Z2,
                8 * 1024 * 1024,
                0,
-               gvp_init_accelerator, NULL, 2, 1
+               gvp_init_accelerator, NULL, 2, 1,
+               NULL, NULL,
+               2017, 9, 0, false
        },
        {
                _T("G-Force 030"),
                _T("GVPGFORCE030"),
                ROMTYPE_GVPS2, ROMTYPE_GVPS12,
-               gvp_s2_add_scsi_unit, EXPANSIONTYPE_SCSI,
+               gvp_s2_add_accelerator_scsi_unit, EXPANSIONTYPE_SCSI,
                BOARD_MEMORY_25BITMEM,
                128 * 1024 * 1024,
                0,
@@ -2734,6 +2817,16 @@ static const struct cpuboardsubtype dbk_sub[] = {
                0,
                ncr_dkb_autoconfig_init, NULL, 2, 0
        },
+       {
+               _T("Wildfire"),
+               _T("wildfire"),
+               ROMTYPE_CB_DBK_WF, 0,
+               wildfire_add_scsi_unit, EXPANSIONTYPE_SCSI,
+               BOARD_MEMORY_HIGHMEM,
+               128 * 1024 * 1024,
+               0,
+               dkb_wildfire_pci_init, NULL, 2, 0 // fake board
+       },
        {
                NULL
        }
index 30b201ab5dc1bb582a68869fb51e42905a746735..facc69a546202ea333711fa82e914ffe8c01b882 100644 (file)
@@ -793,6 +793,11 @@ static void allocuci (struct uae_prefs *p, int nr, int idx)
        allocuci (p, nr, idx, -1);
 }
 
+static const TCHAR *getunittype(struct uaedev_config_info *uci)
+{
+       return uci->type == UAEDEV_CD ? _T("CD") : (uci->type == UAEDEV_TAPE ? _T("TAPE") : _T("HD"));
+}
+
 static int cpuboard_hd;
 static romconfig cpuboard_dummy;
 
@@ -804,9 +809,9 @@ void add_cpuboard_unit(int unit, struct uaedev_config_info *uci, struct romconfi
        if (cbt->subtypes) {
                if (cbt->subtypes[currprefs.cpuboard_subtype].add && (cbt->subtypes[currprefs.cpuboard_subtype].deviceflags & flags)) {
                        if (unit >= 0) {
-                               write_log(_T("Adding CPUBoard '%s' HD unit %d ('%s')\n"),
+                               write_log(_T("Adding CPUBoard '%s' %s unit %d ('%s')\n"),
                                        cbt->subtypes[currprefs.cpuboard_subtype].name,
-                                       unit, uci->rootdir);
+                                       getunittype(uci), unit, uci->rootdir);
                        }
                        cbt->subtypes[currprefs.cpuboard_subtype].add(unit, uci, rc);
                        cpuboard_hd = 1;
@@ -825,9 +830,11 @@ static void add_cpuboard_unit_init(void)
                const struct cpuboardtype *cbt = &cpuboards[currprefs.cpuboard_type];
                if (cbt->subtypes) {
                        if (cbt->subtypes[currprefs.cpuboard_subtype].add) {
+                               const struct cpuboardsubtype *cst = &cbt->subtypes[currprefs.cpuboard_subtype];
                                struct uaedev_config_info ci = { 0 };
-                               write_log(_T("Initializing CPUBoard '%s' HD controller\n"), cbt->subtypes[currprefs.cpuboard_subtype].name);
-                               cbt->subtypes[currprefs.cpuboard_subtype].add(-1, &ci, rc);
+                               write_log(_T("Initializing CPUBoard '%s' %s controller\n"),
+                                       cst->name, (cst->deviceflags & EXPANSIONTYPE_SCSI) ? _T("SCSI") : _T("IDE"));
+                               cst->add(-1, &ci, rc);
                        }
                }
        }
@@ -876,8 +883,8 @@ static bool add_ide_unit(int type, int unit, struct uaedev_config_info *uci)
        bool added = false;
        if (type == HD_CONTROLLER_TYPE_IDE_MB) {
                if (ismainboardide()) {
-                       write_log(_T("Adding mainboard IDE HD unit %d ('%s')\n"),
-                               unit, uci->rootdir);
+                       write_log(_T("Adding mainboard IDE %s unit %d ('%s')\n"),
+                               getunittype(uci), unit, uci->rootdir);
                        gayle_add_ide_unit(unit, uci);
                        added = true;
                }
@@ -889,7 +896,7 @@ static bool add_ide_unit(int type, int unit, struct uaedev_config_info *uci)
                                        cpuboard_hd = 1;
                                        if (ert->add) {
                                                struct romconfig *rc = get_device_romconfig(&currprefs, ert->romtype, uci->controller_type_unit);
-                                               write_log(_T("Adding IDE HD '%s' unit %d ('%s')\n"),
+                                               write_log(_T("Adding IDE %s '%s' unit %d ('%s')\n"), getunittype(uci),
                                                        ert->name, unit, uci->rootdir);
                                                ert->add(unit, uci, rc);
                                        }
@@ -908,7 +915,7 @@ static bool add_scsi_unit(int type, int unit, struct uaedev_config_info *uci)
        if (type == HD_CONTROLLER_TYPE_SCSI_A3000) {
 #ifdef A2091
                if (isa3000scsi()) {
-                       write_log(_T("Adding A3000 mainboard SCSI HD unit %d ('%s')\n"),
+                       write_log(_T("Adding A3000 mainboard SCSI %s unit %d ('%s')\n"), getunittype(uci),
                                unit, uci->rootdir);
                        a3000_add_scsi_unit (unit, uci, NULL);
                        added = true;
@@ -917,7 +924,7 @@ static bool add_scsi_unit(int type, int unit, struct uaedev_config_info *uci)
        } else if (type == HD_CONTROLLER_TYPE_SCSI_A4000T) {
 #ifdef NCR
                if (isa4000tscsi()) {
-                       write_log(_T("Adding A4000T mainboard SCSI HD unit %d ('%s')\n"),
+                       write_log(_T("Adding A4000T mainboard SCSI %s unit %d ('%s')\n"), getunittype(uci),
                                unit, uci->rootdir);
                        a4000t_add_scsi_unit (unit, uci, NULL);
                        added = true;
@@ -926,7 +933,7 @@ static bool add_scsi_unit(int type, int unit, struct uaedev_config_info *uci)
        } else if (type == HD_CONTROLLER_TYPE_SCSI_CDTV) {
 #ifdef CDTV
                if (iscdtvscsi()) {
-                       write_log(_T("Adding CDTV SCSI expansion HD unit %d ('%s')\n"),
+                       write_log(_T("Adding CDTV SCSI expansion %s unit %d ('%s')\n"), getunittype(uci),
                                unit, uci->rootdir);
                        cdtv_add_scsi_unit (unit, uci, NULL);
                        added = true;
@@ -940,7 +947,7 @@ static bool add_scsi_unit(int type, int unit, struct uaedev_config_info *uci)
                                        cpuboard_hd = 1;
                                        if (ert->add) {
                                                struct romconfig *rc = get_device_romconfig(&currprefs, ert->romtype, uci->controller_type_unit);
-                                               write_log(_T("Adding SCSI HD '%s' unit %d ('%s')\n"),
+                                               write_log(_T("Adding SCSI %s '%s' unit %d ('%s')\n"), getunittype(uci),
                                                        ert->name, unit, uci->rootdir);
                                                ert->add(unit, uci, rc);
                                        }
index 1017daea7375bf2c42472f8c488af0f51d6e081f..17866854bb70d3c31eeda719a3b1fa32e26c60d8 100644 (file)
@@ -137,6 +137,7 @@ extern void a2090_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct ro
 extern void a2091_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 extern void gvp_s1_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 extern void gvp_s2_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
+extern void gvp_s2_add_accelerator_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 extern void a3000_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 
 extern int add_wd_scsi_hd (struct wd_state *wd, int ch, struct hd_hardfiledata *hfd, struct uaedev_config_info *ci, int scsi_level);
index af9e42a6f1782071ca1c2c34570a69000043b63b..65e1ab4f611f600a6087c11448594c4ab26d2b65 100644 (file)
@@ -120,6 +120,7 @@ struct expansionsubromtype
 {
        const TCHAR *name;
        const TCHAR *configname;
+       int romtype;
        int memory_mid, memory_pid;
        uae_u32 memory_serial;
        bool memory_after;
@@ -130,7 +131,7 @@ struct expansionromtype
        const TCHAR *name;
        const TCHAR *friendlyname;
        const TCHAR *friendlymanufacturer;
-       DEVICE_INIT init;
+       DEVICE_INIT init, init2;
        DEVICE_ADD add;
        int romtype;
        int romtype_extra;
@@ -165,6 +166,11 @@ struct cpuboardsubtype
        int initflag;
        const struct expansionboardsettings *settings;
        E8ACCESS e8;
+       // if includes Z2 or Z3 RAM
+       int memory_mid, memory_pid;
+       uae_u32 memory_serial;
+       bool memory_after;
+       uae_u8 autoconfig[16];
 };
 struct cpuboardtype
 {
index a3c3a1c5a5d9c798edd7f6b44c797bcd042ceb1d..66996bf10205caa7f091c3a66a1b9e906928dbd5 100644 (file)
@@ -412,7 +412,8 @@ extern addrbank *get_mem_bank_real(uaecptr);
 extern void memory_init (void);
 extern void memory_cleanup (void);
 extern void map_banks (addrbank *bank, int first, int count, int realsize);
-extern void map_banks_z2 (addrbank *bank, int first, int count);
+extern void map_banks_z2(addrbank *bank, int first, int count);
+extern void map_banks_z3(addrbank *bank, int first, int count);
 extern void map_banks_quick (addrbank *bank, int first, int count, int realsize);
 extern void map_banks_nojitdirect (addrbank *bank, int first, int count, int realsize);
 extern void map_banks_cond (addrbank *bank, int first, int count, int realsize);
index c90fe19d37e7ebb3a78ba1f57cc2ac8fbe543205..02ff459f72a744bf24527b6f33ae705fd7301453 100644 (file)
@@ -2,6 +2,10 @@
 void ncr710_io_bput_a4000t(uaecptr, uae_u32);
 uae_u32 ncr710_io_bget_a4000t(uaecptr);
 
+void ncr815_io_bput_wildfire(uaecptr addr, uae_u32 v);
+uae_u32 ncr815_io_bget_wildfire(uaecptr addr);
+void wildfire_ncr815_irq(int v);
+
 extern addrbank ncr_bank_cyberstorm;
 extern addrbank ncr_bank_generic;
 
@@ -22,4 +26,5 @@ extern void tekmagic_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct
 extern void cyberstorm_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 extern void blizzardppc_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 extern void a4091_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
+extern void wildfire_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 
index e1d21313c20916b88be942b60d2c2cd8eaa3ccce..af69fe7298b8477af4c3b246e2a37c701dd6d2b1 100644 (file)
@@ -1,8 +1,8 @@
 extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size);
 
 #define ROMTYPE_SUB_MASK    0x000000ff
-#define ROMTYPE_GROUP_MASK  0x00ffff00
-#define ROMTYPE_MASK           0x00ffffff
+#define ROMTYPE_GROUP_MASK  0x003fff00
+#define ROMTYPE_MASK           0x003fffff
 
 #define ROMTYPE_KICK           0x00000100
 #define ROMTYPE_KICKCD32       0x00000200
@@ -33,6 +33,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size);
 #define ROMTYPE_CB_BLIZPPC     0x0004000f
 #define ROMTYPE_CB_GOLEM030    0x00040010
 #define ROMTYPE_CB_ACA500      0x00040011
+#define ROMTYPE_CB_DBK_WF      0x00040012
 
 #define ROMTYPE_FREEZER                0x00080000
 #define ROMTYPE_AR                     0x00080001
@@ -72,7 +73,10 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size);
 #define ROMTYPE_CLTDSCSI       0x0010001b
 #define ROMTYPE_PTNEXUS                0x0010001c
 #define ROMTYPE_DATAFLYER      0x0010001d
+#define ROMTYPE_SUPRADMA       0x0010001e
+#define ROMTYPE_PCIBRIDGE      0x0010001f
 
+#define ROMTYPE_NOT                    0x00800000
 #define ROMTYPE_QUAD           0x01000000
 #define ROMTYPE_EVEN           0x02000000
 #define ROMTYPE_ODD                    0x04000000
index 172a9b218d35e960b7234b8645769bcbdf062c61..72faf29ccffc0b9f68444a456da13dc1379effd4 100644 (file)
@@ -149,7 +149,7 @@ static void REGPARAM3 dummy_wput (uaecptr, uae_u32) REGPARAM;
 static void REGPARAM3 dummy_bput (uaecptr, uae_u32) REGPARAM;
 static int REGPARAM3 dummy_check (uaecptr addr, uae_u32 size) REGPARAM;
 
-#define        MAX_ILG 200
+#define        MAX_ILG 1000
 #define NONEXISTINGDATA 0
 //#define NONEXISTINGDATA 0xffffffff
 
@@ -1054,6 +1054,13 @@ static int be_cnt;
 
 uae_u8 *REGPARAM2 default_xlate (uaecptr addr)
 {
+       static int recursive;
+
+       if (recursive) {
+               cpu_halt(CPU_HALT_OPCODE_FETCH_FROM_NON_EXISTING_ADDRESS);
+               return kickmem_xlate(2);
+       }
+       recursive++;
        int size = currprefs.cpu_model >= 68020 ? 4 : 2;
        if (quit_program == 0) {
                /* do this only in 68010+ mode, there are some tricky A500 programs.. */
@@ -1083,10 +1090,11 @@ uae_u8 *REGPARAM2 default_xlate (uaecptr addr)
                        if (0 || (gary_toenb && (gary_nonrange(addr) || (size > 1 && gary_nonrange(addr + size - 1))))) {
                                exception2 (addr, false, size, regs.s ? 4 : 0);
                        } else {
-                               cpu_halt(3);
+                               cpu_halt(CPU_HALT_OPCODE_FETCH_FROM_NON_EXISTING_ADDRESS);
                        }
                }
        }
+       recursive--;
        return kickmem_xlate (2); /* So we don't crash. */
 }
 
@@ -2765,25 +2773,41 @@ void map_banks (addrbank *bank, int start, int size, int realsize)
 #endif
 }
 
+void map_banks_z3(addrbank *bank, int start, int size)
+{
+       if (start < 0x1000 || size <= 0 || size > 0x4000 || start + size > 0xf000) {
+               write_log(_T("Z3 invalid map_banks start=%08x size=%08x\n"), start, size);
+               cpu_halt(CPU_HALT_AUTOCONFIG_CONFLICT);
+               return;
+       }
+       map_banks(bank, start, size, 0);
+}
+
 void map_banks_z2 (addrbank *bank, int start, int size)
 {
        if (start < 0x20 || (start >= 0xa0 && start < 0xe9) || start >= 0xf0) {
                write_log(_T("Z2 map_banks with invalid start address %08X\n"), start << 16);
+               cpu_halt(CPU_HALT_AUTOCONFIG_CONFLICT);
                return;
        }
        if (start >= 0xe9) {
                if (start + size > 0xf0) {
                        write_log(_T("Z2 map_banks with invalid region %08x - %08X\n"), start << 16, (start + size) << 16);
-                       size = 0xf0 - start;
+                       cpu_halt(CPU_HALT_AUTOCONFIG_CONFLICT);
+                       return;
                }
        } else {
                if (start + size > 0xa0) {
                        write_log(_T("Z2 map_banks with invalid region %08x - %08X\n"), start << 16, (start + size) << 16);
-                       size = 0xa0 - start;
+                       cpu_halt(CPU_HALT_AUTOCONFIG_CONFLICT);
+                       return;
                }
        }
-       if (size <= 0)
+       if (size <= 0 || size > 0x80) {
+               write_log(_T("Z2 map_banks with invalid size %08x\n"), size);
+               cpu_halt(CPU_HALT_AUTOCONFIG_CONFLICT);
                return;
+       }
        map_banks (bank, start, size, 0);
 }
 
index d156004494a41a726ab91ad3b45d2ebc99d726cc..5d132c9013479543c2ac52ced95efd1a5b2d0b2e 100644 (file)
@@ -1133,7 +1133,7 @@ static void REGPARAM2 ncr9x_wput(struct ncr9x_state *ncr, uaecptr addr, uae_u32
                switch (addr)
                {
                        case 0x44:
-                       map_banks (ncr->bank, expamem_z3_pointer >> 16, FASTLANE_BOARD_SIZE >> 16, 0);
+                       map_banks_z3(ncr->bank, expamem_z3_pointer >> 16, FASTLANE_BOARD_SIZE >> 16);
                        ncr->baseaddress = expamem_z3_pointer;
                        ncr->configured = 1;
                        expamem_next (ncr->bank, NULL);
@@ -1163,11 +1163,11 @@ static void REGPARAM2 ncr9x_bput(struct ncr9x_state *ncr, uaecptr addr, uae_u32
                {
                        case 0x48:
                        if (isncr(ncr, ncr_oktagon2008_scsi)) {
-                               map_banks (ncr->bank, expamem_z2_pointer >> 16, OKTAGON_BOARD_SIZE >> 16, 0);
+                               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 (ncr->bank, expamem_z2_pointer >> 16, DKB_BOARD_SIZE >> 16, 0);
+                               map_banks_z2(ncr->bank, expamem_z2_pointer >> 16, DKB_BOARD_SIZE >> 16);
                                ncr->configured = 1;
                                expamem_next (ncr->bank, NULL);
                        }
index febe2581bfd811794116b9a8789c2d734ea21cad..c583a9cce59d57d0f9da278327f85ba87beafe6c 100644 (file)
@@ -160,6 +160,7 @@ static struct ncr_state *ncr_cpuboard;
 static struct ncr_state *ncr_we;
 static struct ncr_state *ncr_a4000t;
 static struct ncr_state *ncra4091[MAX_DUPLICATE_EXPANSION_BOARDS];
+static struct ncr_state *ncr_wildfire;
 
 extern void cyberstorm_mk3_ppc_irq(int);
 extern void blizzardppc_irq(int);
@@ -548,7 +549,7 @@ static void REGPARAM2 ncr_wput (struct ncr_state *ncr, uaecptr addr, uae_u32 w)
                switch (addr)
                {
                        case 0x44:
-                       map_banks (ncr->bank, expamem_z3_pointer >> 16, BOARD_SIZE >> 16, 0);
+                       map_banks_z3(ncr->bank, expamem_z3_pointer >> 16, BOARD_SIZE >> 16);
                        ncr->board_mask = 0x00ffffff;
                        ncr->baseaddress = expamem_z3_pointer;
                        ncr->configured = 1;
@@ -596,6 +597,15 @@ uae_u32 ncr710_io_bget_a4000t(uaecptr addr)
        return ncr710_io_bget(ncr_a4000t, addr);
 }
 
+void ncr815_io_bput_wildfire(uaecptr addr, uae_u32 v)
+{
+       ncr_io_bput(ncr_wildfire, addr, v);
+}
+uae_u32 ncr815_io_bget_wildfire(uaecptr addr)
+{
+       return ncr_io_bget(ncr_wildfire, addr);
+}
+
 static void REGPARAM2 ncr_generic_bput (uaecptr addr, uae_u32 b)
 {
        struct ncr_state *ncr = getscsiboard(addr);
@@ -957,4 +967,13 @@ void blizzardppc_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct rom
        ncr_bppc->baseaddress = 0xf40000;
 }
 
+void wildfire_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
+{
+       ncr_add_scsi_unit(&ncr_wildfire, ch, ci, rc, true);
+       ncr_wildfire->configured = -1;
+       ncr_wildfire->enabled = true;
+       ncr_wildfire->irq_func = wildfire_ncr815_irq;
+       ncr_wildfire->bank = &ncr_bank_generic;
+}
+
 #endif
index 239f4267cdd7250098cc58c4ab68c10ab6c1a455..75dd8dc1d84fc40d3b2cad391dc29a698d29fc35 100644 (file)
@@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path)
        return NULL;
 }
 
-#define NEXT_ROM_ID 142
+#define NEXT_ROM_ID 143
 
 static struct romheader romheaders[] = {
        { _T("Freezer Cartridges"), 1 },
@@ -113,6 +113,8 @@ static struct romdata roms[] = {
        0xffffffff, 0, 0, 0, 0, 0, _T("AROS") },
        { _T(" ROM Disabled"), 0, 0, 0, 0, _T("NOROM\0"), 0, 87, 0, 0, ROMTYPE_NONE, 0, 0, NULL,
        0xffffffff, 0, 0, 0, 0, 0, _T("NOROM") },
+       { _T(" Enabled"), 0, 0, 0, 0, _T("ENABLED\0"), 0, 142, 0, 0, ROMTYPE_NOT, 0, 0, NULL,
+       0xffffffff, 0, 0, 0, 0, 0, _T("ENABLED") },
 
        { _T("Cloanto Amiga Forever ROM key"), 0, 0, 0, 0, 0, 2069, 0, 0, 1, ROMTYPE_KEY, 0, 0, NULL,
        0x869ae1b1, 0x801bbab3,0x2e3d3738,0x6dd1636d,0x4f1d6fa7,0xe21d5874 },
@@ -1735,7 +1737,7 @@ struct zfile *read_device_from_romconfig(struct romconfig *rc, const int *roms)
        if (!_tcsicmp(rc->romfile, _T(":NOROM")))
                return NULL;
        struct zfile *z = read_rom_name (rc->romfile);
-       if (!z) {
+       if (!z && roms) {
                struct romlist *rl = getromlistbyids(roms, rc->romfile);
                if (rl) {
                        struct romdata *rd = rl->rd;
@@ -1757,7 +1759,7 @@ struct zfile *read_device_rom(struct uae_prefs *p, int romtype, int devnum, int
                if (!_tcsicmp(romname, _T(":NOROM")))
                        return NULL;
                struct zfile *z = read_rom_name (romname);
-               if (!z) {
+               if (!z && roms) {
                        struct romlist *rl = getromlistbyids(roms, romname);
                        if (rl) {
                                struct romdata *rd = rl->rd;
index 5b7d6dce67f8c0d482270643a35ea4eabbeebf1e..9e19df30411e1b0ee87976aebff85b908549de06 100644 (file)
--- a/scsi.cpp
+++ b/scsi.cpp
@@ -1530,7 +1530,7 @@ static int suprareg(struct soft_scsi *ncr, uaecptr addr, bool write)
                // "dma" data in/out space
                reg = 8;
                if (!(ncr->regs[2] & 2))
-                       cpu_halt(6);
+                       cpu_halt(CPU_HALT_FAKE_DMA);
        }
        return reg;
 }
@@ -2215,7 +2215,7 @@ static void REGPARAM2 ncr80_bput(struct soft_scsi *ncr, uaecptr addr, uae_u32 b)
                switch (addr)
                {
                        case 0x48:
-                       map_banks (ncr->bank, expamem_z2_pointer >> 16, ncr->board_size >> 16, 0);
+                       map_banks_z2(ncr->bank, expamem_z2_pointer >> 16, ncr->board_size >> 16);
                        ncr->baseaddress = expamem_z2_pointer;
                        ncr->configured = 1;
                        expamem_next (ncr->bank, NULL);
index 9bf7633c14488c37f6548ff56cf02778f386bfcc..5e21bf11b48732d060658f76495994a044f91cab 100644 (file)
@@ -512,7 +512,7 @@ static void REGPARAM2 toccata_bput(uaecptr addr, uae_u32 b)
                switch (addr)
                {
                        case 0x48:
-                       map_banks(&toccata_bank, expamem_z2_pointer >> 16, BOARD_SIZE >> 16, 0);
+                       map_banks_z2(&toccata_bank, expamem_z2_pointer >> 16, BOARD_SIZE >> 16);
                        configured = 1;
                        expamem_next(&toccata_bank, NULL);
                        break;