]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
3400b5
authorToni Wilen <twilen@winuae.net>
Sat, 10 Sep 2016 14:52:16 +0000 (17:52 +0300)
committerToni Wilen <twilen@winuae.net>
Sat, 10 Sep 2016 14:52:16 +0000 (17:52 +0300)
49 files changed:
a2091.cpp
akiko.cpp
ar.cpp
autoconf.cpp
cd32_fmv.cpp
cdtvcr.cpp
cfgfile.cpp
cpuboard.cpp
custom.cpp
devices.cpp
disk.cpp
driveclick.cpp
enforcer.cpp
expansion.cpp
gayle.cpp
gfxboard.cpp
hardfile.cpp
ide.cpp
idecontrollers.cpp
include/autoconf.h
include/disk.h
include/ide.h
include/idecontrollers.h
include/memory.h
include/ncr9x_scsi.h
include/rommgr.h
include/x86.h
jit/exception_handler.cpp
mame/a2410.cpp
memory.cpp
ncr9x_scsi.cpp
ncr_scsi.cpp
newcpu.cpp
od-win32/dinput.cpp
od-win32/mman.cpp
od-win32/picasso96_win.cpp
od-win32/sounddep/sound.cpp
od-win32/sounddep/sound.h
od-win32/win32.h
od-win32/win32gfx.cpp
od-win32/win32gui.cpp
od-win32/winuaechangelog.txt
pci.cpp
qemuvga/esp.cpp
qemuvga/scsi/esp.h
rommgr.cpp
scsi.cpp
uaelib.cpp
x86.cpp

index ac5131a7a35d1b6e91cf9b403b448d8f52492b5f..223eeb799ae87a2a636acf5ead4e09da84258b74 100644 (file)
--- a/a2091.cpp
+++ b/a2091.cpp
@@ -3295,7 +3295,7 @@ void a3000_add_scsi_unit (int ch, struct uaedev_config_info *ci, struct romconfi
 
 bool a3000scsi_init(struct autoconfig_info *aci)
 {
-       aci->addrbank = &expamem_nonautoconfig;
+       aci->zorro = 0;
        aci->start = 0xdd0000;
        aci->size = 0x10000;
        aci->hardwired = true;
index 1d72503062dc559eeb82537c34635dfa27a12a0e..d62e0deeeefafb8080e9b66b474e909f48728bc7 100644 (file)
--- a/akiko.cpp
+++ b/akiko.cpp
@@ -31,8 +31,8 @@
 #include "debug.h"
 
 #define AKIKO_DEBUG_NVRAM 0
-#define AKIKO_DEBUG_IO 1
-#define AKIKO_DEBUG_IO_CMD 1
+#define AKIKO_DEBUG_IO 0
+#define AKIKO_DEBUG_IO_CMD 0
 
 int log_cd32 = 0;
 
diff --git a/ar.cpp b/ar.cpp
index dbef712d78a838bbe12e0fb69417fd0319ecd0f2..3a88227c5e8c0e17d702b9c2184e3eaa82a7225d 100644 (file)
--- a/ar.cpp
+++ b/ar.cpp
@@ -1583,7 +1583,7 @@ static int superiv_init (struct romdata *rd, struct zfile *f)
        if (hrtmem2_size && !hrtmem2_size2)
                hrtmem2_size2 = hrtmem2_size;
 
-       hrtmem_bank.allocated = hrtmem_size;
+       hrtmem_bank.reserved_size = hrtmem_size;
        hrtmem_bank.label = memname1;
        hrtmem_mask = hrtmem_size - 1;
        mapped_malloc (&hrtmem_bank);
@@ -1596,7 +1596,7 @@ static int superiv_init (struct romdata *rd, struct zfile *f)
        }
 
        hrtmem2_mask = hrtmem2_size - 1;
-       hrtmem2_bank.allocated = hrtmem2_size;
+       hrtmem2_bank.reserved_size = hrtmem2_size;
        hrtmem2_bank.label = memname2;
        if (hrtmem2_size) {
                mapped_malloc (&hrtmem2_bank);
@@ -1604,7 +1604,7 @@ static int superiv_init (struct romdata *rd, struct zfile *f)
                memset(hrtmemory2, 0, hrtmem2_size);
        }
 
-       hrtmem3_bank.allocated = hrtmem3_size;
+       hrtmem3_bank.reserved_size = hrtmem3_size;
        hrtmem3_bank.label = memname3;
        hrtmem3_mask = hrtmem3_size - 1;
        if (hrtmem3_size) {
@@ -1857,7 +1857,7 @@ int hrtmon_load (void)
 #endif
                cart_type = CART_HRTMON;
        }
-       hrtmem_bank.allocated = hrtmem_size;
+       hrtmem_bank.reserved_size = hrtmem_size;
        hrtmem_bank.label = _T("hrtmem");
        mapped_malloc (&hrtmem_bank);
        hrtmemory = hrtmem_bank.baseaddr;
index eeb6ce90d254630061dd21dd0a6d84d019156c01..00ba6a8e239579c63eb0b00b5c6bb60dcac8c108 100644 (file)
@@ -523,9 +523,9 @@ static uae_u32 REGPARAM2 nullfunc (TrapContext *ctx)
 
 static uae_u32 REGPARAM2 getchipmemsize (TrapContext *ctx)
 {
-       trap_set_dreg(ctx, 1, z3chipmem_bank.allocated);
+       trap_set_dreg(ctx, 1, z3chipmem_bank.allocated_size);
        trap_set_areg(ctx, 1, z3chipmem_bank.start);
-       return chipmem_bank.allocated;
+       return chipmem_bank.allocated_size;
 }
 
 static uae_u32 REGPARAM2 uae_puts (TrapContext *ctx)
@@ -540,12 +540,8 @@ static uae_u32 REGPARAM2 uae_puts (TrapContext *ctx)
 
 void rtarea_init_mem (void)
 {
-       if (need_uae_boot_rom(&currprefs)) {
-               rtarea_bank.flags &= ~ABFLAG_ALLOCINDIRECT;
-       } else {
-               rtarea_bank.flags |= ABFLAG_ALLOCINDIRECT;
-       }
-       rtarea_bank.allocated = RTAREA_SIZE;
+       rtarea_bank.reserved_size = RTAREA_SIZE;
+       rtarea_bank.start = rtarea_base;
        if (!mapped_malloc (&rtarea_bank)) {
                write_log (_T("virtual memory exhausted (rtarea)!\n"));
                abort ();
index 5724c21a99abc8b9aec1759b56ede94e447f1a31..56d4b6087aa7220f69b3b8b6ada4b4cfac06d41c 100644 (file)
@@ -1514,7 +1514,7 @@ void cd32_fmv_hsync_handler(void)
 void cd32_fmv_reset(void)
 {
        if (fmv_ram_bank.baseaddr)
-               memset(fmv_ram_bank.baseaddr, 0, fmv_ram_bank.allocated);
+               memset(fmv_ram_bank.baseaddr, 0, fmv_ram_bank.allocated_size);
        cd32_fmv_state(0);
 }
 
@@ -1560,9 +1560,9 @@ addrbank *cd32_fmv_init (struct autoconfig_info *aci)
        fmv_ram_bank.start = fmv_rom_bank.start + 0x80000;
 
        fmv_rom_bank.mask = fmv_rom_size - 1;
-       fmv_rom_bank.allocated = fmv_rom_size;
+       fmv_rom_bank.reserved_size = fmv_rom_size;
        fmv_ram_bank.mask = fmv_ram_size - 1;
-       fmv_ram_bank.allocated = fmv_ram_size;
+       fmv_ram_bank.reserved_size = fmv_ram_size;
 
        if (mapped_malloc(&fmv_rom_bank)) {
                load_rom_rc(aci->rc, ROMTYPE_CD32CART, 262144, 0, fmv_rom_bank.baseaddr, 262144, 0);
index 972c045a6e2522361b3c7bb90b52a26bb1bd2a2c..e28ddfe1f6d05bea316ed0448b8ce435382ced73 100644 (file)
@@ -992,7 +992,7 @@ bool cdtvcr_init(struct autoconfig_info *aci)
 {
        aci->start = 0xb80000;
        aci->size = 0x10000;
-       aci->addrbank = &expamem_nonautoconfig;
+       aci->zorro = 0;
        if (!aci->doinit)
                return true;
        map_banks(&cdtvcr_bank, 0xB8, 1, 0);
index 68140f1097a3c94017b378829f57be7b30e05530..6a32f87ee6d4686d17f3cb73ea4000819e96c5fd 100644 (file)
@@ -3833,7 +3833,7 @@ static void get_filesys_controller (const TCHAR *hdc, int *type, int *typenum, i
        if(_tcslen (hdc) >= 4 && !_tcsncmp (hdc, _T("ide"), 3)) {
                hdcv = HD_CONTROLLER_TYPE_IDE_AUTO;
                hdunit = hdc[3] - '0';
-               if (hdunit < 0 || hdunit >= 4)
+               if (hdunit < 0 || hdunit >= 6)
                        hdunit = 0;
        } else if(_tcslen (hdc) >= 5 && !_tcsncmp (hdc, _T("scsi"), 4)) {
                hdcv = HD_CONTROLLER_TYPE_SCSI_AUTO;
@@ -5205,7 +5205,7 @@ void cfgfile_compatibility_romtype(struct uae_prefs *p)
        addbcromtype(p, ROMTYPE_NE2KPCMCIA, p->ne2000pcmcianame[0] != 0);
        addbcromtype(p, ROMTYPE_NE2KPCI, p->ne2000pciname[0] != 0);
 
-       static int restricted_net[] = { ROMTYPE_A2065, ROMTYPE_NE2KPCMCIA, ROMTYPE_NE2KPCI, 0 };
+       static int restricted_net[] = { ROMTYPE_A2065, ROMTYPE_NE2KPCMCIA, ROMTYPE_NE2KPCI, ROMTYPE_NE2KISA, 0 };
        static int restricted_x86[] = { ROMTYPE_A1060, ROMTYPE_A2088, ROMTYPE_A2088T, ROMTYPE_A2286, ROMTYPE_A2386, 0 };
        static int restricted_pci[] = { ROMTYPE_GREX, ROMTYPE_MEDIATOR, ROMTYPE_PROMETHEUS, 0 };
        romtype_restricted(p, restricted_net);
index 8bf6757d8b2e004d49b093edc80bdac6e39cc692..4c86b9ea542716750904ea1c2b186cdc96299a8c 100644 (file)
@@ -748,7 +748,12 @@ static uae_u32 REGPARAM2 blizzardea_bget(uaecptr addr)
        } else if (is_blizzard1230mk2(&currprefs) && addr >= 0x10000 && (currprefs.cpuboard_settings & 2)) {
                v = cpuboard_ncr9x_scsi_get(addr);
        } else if (is_blizzard(&currprefs)) {
-               if (addr & BLIZZARD_SCSI_KIT_SCSI_OFFSET)
+               if (addr & BLIZZARD_SCSI_KIT4_SCSI_OFFSET)
+                       v = cpuboard_ncr9x_scsi_get(addr);
+               else
+                       v = blizzardea_bank.baseaddr[addr];
+       } else if (is_blizzard1230mk3(&currprefs)) {
+               if (addr & BLIZZARD_SCSI_KIT3_SCSI_OFFSET)
                        v = cpuboard_ncr9x_scsi_get(addr);
                else
                        v = blizzardea_bank.baseaddr[addr];
@@ -773,19 +778,19 @@ static uae_u32 REGPARAM2 blizzardea_bget(uaecptr addr)
                if ((addr & 0xf800) == 0xe800) {
                        if ((addr & 3) < 2) {
                                map_banks(&dummy_bank, 0x10000000 >> 16, 0x8000000 >> 16, 0);
-                               if (custmem1_bank.allocated) {
-                                       map_banks(&custmem1_bank, (0x18000000 - custmem1_bank.allocated) >> 16, custmem1_bank.allocated >> 16, 0);
-                                       if (custmem1_bank.allocated < 128 * 1024 * 1024) {
-                                               map_banks(&custmem1_bank, (0x18000000 - 2 * custmem1_bank.allocated) >> 16, custmem1_bank.allocated >> 16, 0);
+                               if (custmem1_bank.allocated_size) {
+                                       map_banks(&custmem1_bank, (0x18000000 - custmem1_bank.allocated_size) >> 16, custmem1_bank.allocated_size >> 16, 0);
+                                       if (custmem1_bank.allocated_size < 128 * 1024 * 1024) {
+                                               map_banks(&custmem1_bank, (0x18000000 - 2 * custmem1_bank.allocated_size) >> 16, custmem1_bank.allocated_size >> 16, 0);
                                        }
                                }
                        }
                        if ((addr & 3) >= 2) {
                                map_banks(&dummy_bank, 0x18000000 >> 16, 0x8000000 >> 16, 0);
-                               if (custmem2_bank.allocated) {
-                                       map_banks(&custmem2_bank, 0x18000000 >> 16, custmem2_bank.allocated >> 16, 0);
-                                       if (custmem2_bank.allocated < 128 * 1024 * 1024) {
-                                               map_banks(&custmem2_bank, (0x18000000 + custmem2_bank.allocated) >> 16, custmem2_bank.allocated >> 16, 0);
+                               if (custmem2_bank.allocated_size) {
+                                       map_banks(&custmem2_bank, 0x18000000 >> 16, custmem2_bank.allocated_size >> 16, 0);
+                                       if (custmem2_bank.allocated_size < 128 * 1024 * 1024) {
+                                               map_banks(&custmem2_bank, (0x18000000 + custmem2_bank.allocated_size) >> 16, custmem2_bank.allocated_size >> 16, 0);
                                        }
                                }
                        }
@@ -822,7 +827,9 @@ static void REGPARAM2 blizzardea_bput(uaecptr addr, uae_u32 b)
                cpuboard_ncr9x_scsi_put(addr, b);
        } else if (is_blizzard2060(&currprefs) && addr >= BLIZZARD_2060_SCSI_OFFSET) {
                cpuboard_ncr9x_scsi_put(addr, b);
-       } else if ((is_blizzard(&currprefs)) && addr >= BLIZZARD_SCSI_KIT_SCSI_OFFSET) {
+       } else if ((is_blizzard(&currprefs)) && addr >= BLIZZARD_SCSI_KIT4_SCSI_OFFSET) {
+               cpuboard_ncr9x_scsi_put(addr, b);
+       } else if ((is_blizzard1230mk3(&currprefs)) && addr >= BLIZZARD_SCSI_KIT3_SCSI_OFFSET) {
                cpuboard_ncr9x_scsi_put(addr, b);
        } else if (is_csmk1(&currprefs)) {
                if (addr >= CYBERSTORM_MK1_SCSI_OFFSET) {
@@ -842,13 +849,13 @@ static void REGPARAM2 blizzardea_bput(uaecptr addr, uae_u32 b)
                if ((addr & 0xf800) == 0xe800) {
                        if ((addr & 3) < 2) {
                                map_banks(&dummy_bank, 0x10000000 >> 16, 0x8000000 >> 16, 0);
-                               if (custmem1_bank.allocated)
-                                       map_banks(&custmem1_bank, (0x18000000 - custmem1_bank.allocated) >> 16, custmem1_bank.allocated >> 16, 0);
+                               if (custmem1_bank.allocated_size)
+                                       map_banks(&custmem1_bank, (0x18000000 - custmem1_bank.allocated_size) >> 16, custmem1_bank.allocated_size >> 16, 0);
                        }
                        if ((addr & 3) >= 2) {
                                map_banks(&dummy_bank, 0x18000000 >> 16, 0x8000000 >> 16, 0);
-                               if (custmem2_bank.allocated)
-                                       map_banks(&custmem2_bank, 0x18000000 >> 16, custmem2_bank.allocated >> 16, 0);
+                               if (custmem2_bank.allocated_size)
+                                       map_banks(&custmem2_bank, 0x18000000 >> 16, custmem2_bank.allocated_size >> 16, 0);
                        }
                }
        }
@@ -865,7 +872,7 @@ static void REGPARAM2 blizzarde8_bput(uaecptr addr, uae_u32 b)
        b &= 0xff;
        addr &= 65535;
        if (addr == 0x48 && !configured) {
-               map_banks(&blizzardea_bank, b, blizzardea_bank.allocated >> 16, 0);
+               map_banks(&blizzardea_bank, b, blizzardea_bank.allocated_size >> 16, 0);
                write_log(_T("Accelerator Z2 board autoconfigured at %02X0000\n"), b);
                configured = 1;
                expamem_next (&blizzardea_bank, NULL);
@@ -939,7 +946,7 @@ static void cyberstorm_copymaprom(void)
 static void cyberstormmk2_copymaprom(void)
 {
        if (blizzardmaprom_bank.baseaddr) {
-               uae_u8 *src = a3000hmem_bank.baseaddr + a3000hmem_bank.allocated - 524288;
+               uae_u8 *src = a3000hmem_bank.baseaddr + a3000hmem_bank.allocated_size - 524288;
                uae_u8 *dst = kickmem_bank.baseaddr;
                protect_roms(false);
                memcpy(dst, src, 524288);
@@ -1011,7 +1018,7 @@ static void blizzardppc_maprom(void)
 
                blizzardmaprom2_bank.baseaddr = blizzardram_bank.baseaddr + cpuboard_size - 524288;
                blizzardmaprom2_bank.start = blizzardram_bank.start + cpuboard_size - 524288;
-               blizzardmaprom2_bank.allocated = 524288;
+               blizzardmaprom2_bank.reserved_size = 524288;
                blizzardmaprom2_bank.mask = 524288 - 1;
                blizzardmaprom2_bank.flags |= ABFLAG_INDIRECT | ABFLAG_NOALLOC;
                mapped_malloc(&blizzardmaprom2_bank);
@@ -1029,7 +1036,7 @@ static void blizzardppc_maprom(void)
        }
 
        blizzardmaprom_bank.start = CYBERSTORM_MAPROM_BASE;
-       blizzardmaprom_bank.allocated = 524288;
+       blizzardmaprom_bank.reserved_size = 524288;
        blizzardmaprom_bank.mask = 524288 - 1;
        blizzardmaprom_bank.flags |= ABFLAG_INDIRECT | ABFLAG_NOALLOC;
        mapped_malloc(&blizzardmaprom_bank);
@@ -1039,19 +1046,19 @@ static void blizzardppc_maprom(void)
 
 static void cyberstorm_maprom(void)
 {
-       if (a3000hmem_bank.allocated <= 2 * 524288)
+       if (a3000hmem_bank.reserved_size <= 2 * 524288)
                return;
 
        map_banks(&dummy_bank, CYBERSTORM_MAPROM_BASE >> 16, 524288 >> 16, 0);
        if (blizzardmaprom_bank_mapped)
                mapped_free(&blizzardmaprom_bank);
        if (maprom_state) {
-               blizzardmaprom_bank.baseaddr = a3000hmem_bank.baseaddr + a3000hmem_bank.allocated - 2 * 524288;
+               blizzardmaprom_bank.baseaddr = a3000hmem_bank.baseaddr + a3000hmem_bank.reserved_size - 2 * 524288;
        } else {
-               blizzardmaprom_bank.baseaddr = a3000hmem_bank.baseaddr + a3000hmem_bank.allocated - 524288;
+               blizzardmaprom_bank.baseaddr = a3000hmem_bank.baseaddr + a3000hmem_bank.reserved_size - 524288;
        }
        blizzardmaprom_bank.start = CYBERSTORM_MAPROM_BASE;
-       blizzardmaprom_bank.allocated = 524288;
+       blizzardmaprom_bank.reserved_size = 524288;
        blizzardmaprom_bank.mask = 524288 - 1;
        blizzardmaprom_bank.flags |= ABFLAG_INDIRECT | ABFLAG_NOALLOC;
        mapped_malloc(&blizzardmaprom_bank);
@@ -1507,7 +1514,7 @@ void cpuboard_map(void)
                        map_banks(&blizzardf0_bank, 0xf00000 >> 16, 65536 >> 16, 0);
                        map_banks(&blizzardio_bank, 0x80000000 >> 16, 0x10000000 >> 16, 0);
                        if (mapromconfigured())
-                               map_banks_nojitdirect(&blizzardmaprom_bank, (a3000hmem_bank.start + a3000hmem_bank.allocated - 524288) >> 16, 524288 >> 16, 0);
+                               map_banks_nojitdirect(&blizzardmaprom_bank, (a3000hmem_bank.start + a3000hmem_bank.allocated_size - 524288) >> 16, 524288 >> 16, 0);
                } else {
                        map_banks(&dummy_bank, 0xf00000 >> 16, 0x80000 >> 16, 0);
                }
@@ -1544,14 +1551,14 @@ void cpuboard_map(void)
        }
        if (is_ivsvector(&currprefs)) {
                if (!currprefs.address_space_24) {
-                       map_banks(&cpuboardmem1_bank, cpuboardmem1_bank.start >> 16, (0x04000000 - cpuboardmem1_bank.start) >> 16, cpuboardmem1_bank.allocated);
-                       if (cpuboardmem2_bank.allocated)
-                               map_banks(&cpuboardmem2_bank, cpuboardmem2_bank.start >> 16, (0x10000000 - cpuboardmem2_bank.start) >> 16, cpuboardmem2_bank.allocated);
+                       map_banks(&cpuboardmem1_bank, cpuboardmem1_bank.start >> 16, (0x04000000 - cpuboardmem1_bank.start) >> 16, cpuboardmem1_bank.allocated_size);
+                       if (cpuboardmem2_bank.allocated_size)
+                               map_banks(&cpuboardmem2_bank, cpuboardmem2_bank.start >> 16, (0x10000000 - cpuboardmem2_bank.start) >> 16, cpuboardmem2_bank.allocated_size);
                }
        }
        if (is_mtec_ematrix530(&currprefs) || is_sx32pro(&currprefs)) {
-               if (cpuboardmem1_bank.allocated) {
-                       map_banks(&cpuboardmem1_bank, cpuboardmem1_bank.start >> 16, cpuboardmem1_bank.allocated >> 16, 0);
+               if (cpuboardmem1_bank.allocated_size) {
+                       map_banks(&cpuboardmem1_bank, cpuboardmem1_bank.start >> 16, cpuboardmem1_bank.allocated_size >> 16, 0);
                }
        }
 }
@@ -1649,46 +1656,46 @@ static void cpuboard_init_2(void)
                return;
 
        cpuboard_size = currprefs.cpuboardmem1_size;
-       cpuboardmem1_bank.allocated = 0;
-       cpuboardmem2_bank.allocated = 0;
+       cpuboardmem1_bank.reserved_size = 0;
+       cpuboardmem2_bank.reserved_size = 0;
 
        if (is_kupke(&currprefs) || is_mtec_ematrix530(&currprefs) || is_sx32pro(&currprefs)) {
                // plain 64k autoconfig, nothing else.
-               blizzardea_bank.allocated = 65536;
-               blizzardea_bank.mask = blizzardea_bank.allocated - 1;
+               blizzardea_bank.reserved_size = 65536;
+               blizzardea_bank.mask = blizzardea_bank.reserved_size - 1;
                mapped_malloc(&blizzardea_bank);
 
                if (is_mtec_ematrix530(&currprefs) || is_sx32pro(&currprefs)) {
                        cpuboardmem1_bank.start = 0x18000000 - cpuboard_size;
-                       cpuboardmem1_bank.allocated = cpuboard_size;
-                       cpuboardmem1_bank.mask = cpuboardmem1_bank.allocated - 1;
+                       cpuboardmem1_bank.reserved_size = cpuboard_size;
+                       cpuboardmem1_bank.mask = cpuboardmem1_bank.reserved_size - 1;
                        mapped_malloc(&cpuboardmem1_bank);
                }
 
        } else if (is_aca500(&currprefs)) {
 
                blizzardf0_bank.start = 0x00f00000;
-               blizzardf0_bank.allocated = 524288;
-               blizzardf0_bank.mask = blizzardf0_bank.allocated - 1;
+               blizzardf0_bank.reserved_size = 524288;
+               blizzardf0_bank.mask = blizzardf0_bank.reserved_size - 1;
                mapped_malloc(&blizzardf0_bank);
 
        } else if (is_a2630(&currprefs)) {
 
                blizzardf0_bank.start = 0x00f00000;
-               blizzardf0_bank.allocated = 131072;
-               blizzardf0_bank.mask = blizzardf0_bank.allocated - 1;
+               blizzardf0_bank.reserved_size = 131072;
+               blizzardf0_bank.mask = blizzardf0_bank.reserved_size - 1;
                mapped_malloc(&blizzardf0_bank);
 
-               blizzardea_bank.allocated = 65536;
-               blizzardea_bank.mask = blizzardea_bank.allocated - 1;
+               blizzardea_bank.reserved_size = 65536;
+               blizzardea_bank.mask = blizzardea_bank.reserved_size - 1;
                mapped_malloc(&blizzardea_bank);
 
        }
        else if (is_dkb_12x0(&currprefs)) {
 
                blizzardram_bank.start = 0x10000000;
-               blizzardram_bank.allocated = cpuboard_size;
-               blizzardram_bank.mask = blizzardram_bank.allocated - 1;
+               blizzardram_bank.reserved_size = cpuboard_size;
+               blizzardram_bank.mask = blizzardram_bank.reserved_size - 1;
                blizzardram_bank.startmask = 0x10000000;
                blizzardram_bank.label = _T("dkb");
                mapped_malloc(&blizzardram_bank);
@@ -1696,27 +1703,27 @@ static void cpuboard_init_2(void)
        } else if (is_dkb_wildfire(&currprefs)) {
 
                blizzardf0_bank.start = 0x00f00000;
-               blizzardf0_bank.allocated = 65536;
-               blizzardf0_bank.mask = blizzardf0_bank.allocated - 1;
+               blizzardf0_bank.reserved_size = 65536;
+               blizzardf0_bank.mask = blizzardf0_bank.reserved_size - 1;
                mapped_malloc(&blizzardf0_bank);
 
        } else if (is_apollo(&currprefs)) {
 
                blizzardf0_bank.start = 0x00f00000;
-               blizzardf0_bank.allocated = 131072;
-               blizzardf0_bank.mask = blizzardf0_bank.allocated - 1;
+               blizzardf0_bank.reserved_size = 131072;
+               blizzardf0_bank.mask = blizzardf0_bank.reserved_size - 1;
                mapped_malloc(&blizzardf0_bank);
 
        } else if (is_fusionforty(&currprefs)) {
 
                blizzardf0_bank.start = 0x00f40000;
-               blizzardf0_bank.allocated = 262144;
-               blizzardf0_bank.mask = blizzardf0_bank.allocated - 1;
+               blizzardf0_bank.reserved_size = 262144;
+               blizzardf0_bank.mask = blizzardf0_bank.reserved_size - 1;
                mapped_malloc(&blizzardf0_bank);
 
                blizzardram_bank.start = 0x11000000;
-               blizzardram_bank.allocated = cpuboard_size;
-               blizzardram_bank.mask = blizzardram_bank.allocated - 1;
+               blizzardram_bank.reserved_size = cpuboard_size;
+               blizzardram_bank.mask = blizzardram_bank.reserved_size - 1;
                blizzardram_bank.startmask = 0x11000000;
                blizzardram_bank.label = _T("fusionforty");
                mapped_malloc(&blizzardram_bank);
@@ -1724,23 +1731,23 @@ static void cpuboard_init_2(void)
        } else if (is_tekmagic(&currprefs)) {
 
                blizzardf0_bank.start = 0x00f00000;
-               blizzardf0_bank.allocated = 131072;
-               blizzardf0_bank.mask = blizzardf0_bank.allocated - 1;
+               blizzardf0_bank.reserved_size = 131072;
+               blizzardf0_bank.mask = blizzardf0_bank.reserved_size - 1;
                mapped_malloc(&blizzardf0_bank);
 
-               blizzardea_bank.allocated = 65536;
-               blizzardea_bank.mask = blizzardea_bank.allocated - 1;
+               blizzardea_bank.reserved_size = 65536;
+               blizzardea_bank.mask = blizzardea_bank.reserved_size - 1;
                mapped_malloc(&blizzardea_bank);
 
        } else if (is_blizzard1230mk2(&currprefs)) {
 
-               blizzardea_bank.allocated = 2 * 65536;
-               blizzardea_bank.mask = blizzardea_bank.allocated - 1;
+               blizzardea_bank.reserved_size = 2 * 65536;
+               blizzardea_bank.mask = blizzardea_bank.reserved_size - 1;
                mapped_malloc(&blizzardea_bank);
 
                blizzardram_bank.start = 0x0e000000 - cpuboard_size / 2;
-               blizzardram_bank.allocated = cpuboard_size;
-               blizzardram_bank.mask = blizzardram_bank.allocated - 1;
+               blizzardram_bank.reserved_size = cpuboard_size;
+               blizzardram_bank.mask = blizzardram_bank.reserved_size - 1;
                if (cpuboard_size) {
                        blizzardram_bank.label = _T("*");
                        mapped_malloc(&blizzardram_bank);
@@ -1748,23 +1755,23 @@ static void cpuboard_init_2(void)
 
                blizzardmaprom_bank.baseaddr = blizzardram_bank.baseaddr + cpuboard_size - 524288;
                blizzardmaprom_bank.start = BLIZZARDMK2_MAPROM_BASE;
-               blizzardmaprom_bank.allocated = 524288;
+               blizzardmaprom_bank.reserved_size = 524288;
                blizzardmaprom_bank.mask = 524288 - 1;
                blizzardmaprom_bank.flags |= ABFLAG_INDIRECT | ABFLAG_NOALLOC;
                mapped_malloc(&blizzardmaprom_bank);
                blizzardmaprom_bank_mapped = true;
 
-               maprom_base = blizzardram_bank.allocated - 524288;
+               maprom_base = blizzardram_bank.reserved_size - 524288;
 
        } else if (is_blizzard1230mk3(&currprefs)) {
 
-               blizzardea_bank.allocated = 2 * 65536;
-               blizzardea_bank.mask = blizzardea_bank.allocated - 1;
+               blizzardea_bank.reserved_size = 2 * 65536;
+               blizzardea_bank.mask = blizzardea_bank.reserved_size - 1;
                mapped_malloc(&blizzardea_bank);
 
                blizzardram_bank.start = 0x1e000000 - cpuboard_size / 2;
-               blizzardram_bank.allocated = cpuboard_size;
-               blizzardram_bank.mask = blizzardram_bank.allocated - 1;
+               blizzardram_bank.reserved_size = cpuboard_size;
+               blizzardram_bank.mask = blizzardram_bank.reserved_size - 1;
                if (cpuboard_size) {
                        blizzardram_bank.label = _T("*");
                        mapped_malloc(&blizzardram_bank);
@@ -1772,34 +1779,34 @@ static void cpuboard_init_2(void)
 
                blizzardmaprom_bank.baseaddr = blizzardram_bank.baseaddr + cpuboard_size - 524288;
                blizzardmaprom_bank.start = BLIZZARDMK3_MAPROM_BASE;
-               blizzardmaprom_bank.allocated = 524288;
+               blizzardmaprom_bank.reserved_size = 524288;
                blizzardmaprom_bank.mask = 524288 - 1;
                blizzardmaprom_bank.flags |= ABFLAG_INDIRECT | ABFLAG_NOALLOC;
                mapped_malloc(&blizzardmaprom_bank);
                blizzardmaprom_bank_mapped = true;
 
-               maprom_base = blizzardram_bank.allocated - 524288;
+               maprom_base = blizzardram_bank.reserved_size - 524288;
 
 
        } else if (is_blizzard(&currprefs) || is_blizzardppc(&currprefs)) {
 
                blizzard_jit = 1;
                blizzardram_bank.start = BLIZZARDMK4_RAM_BASE_48 - cpuboard_size / 2;
-               blizzardram_bank.allocated = cpuboard_size;
-               blizzardram_bank.mask = blizzardram_bank.allocated - 1;
+               blizzardram_bank.reserved_size = cpuboard_size;
+               blizzardram_bank.mask = blizzardram_bank.reserved_size - 1;
                if (cpuboard_size) {
                        blizzardram_bank.label = _T("*");
                        mapped_malloc(&blizzardram_bank);
                }
 
                blizzardf0_bank.start = 0x00f00000;
-               blizzardf0_bank.allocated = 524288;
-               blizzardf0_bank.mask = blizzardf0_bank.allocated - 1;
+               blizzardf0_bank.reserved_size = 524288;
+               blizzardf0_bank.mask = blizzardf0_bank.reserved_size - 1;
                mapped_malloc(&blizzardf0_bank);
 
                if (!is_blizzardppc(&currprefs)) {
-                       blizzardea_bank.allocated = 2 * 65536;
-                       blizzardea_bank.mask = blizzardea_bank.allocated - 1;
+                       blizzardea_bank.reserved_size = 2 * 65536;
+                       blizzardea_bank.mask = blizzardea_bank.reserved_size - 1;
                        // Blizzard 12xx autoconfig ROM must be mapped at $ea0000-$ebffff, board requires it.
                        mapped_malloc(&blizzardea_bank);
                }
@@ -1808,7 +1815,7 @@ static void cpuboard_init_2(void)
                        if (!is_blizzardppc(&currprefs)) {
                                blizzardmaprom_bank.baseaddr = blizzardram_bank.baseaddr + cpuboard_size - 524288;
                                blizzardmaprom_bank.start = BLIZZARDMK4_MAPROM_BASE;
-                               blizzardmaprom_bank.allocated = 524288;
+                               blizzardmaprom_bank.reserved_size = 524288;
                                blizzardmaprom_bank.mask = 524288 - 1;
                                blizzardmaprom_bank.flags |= ABFLAG_INDIRECT | ABFLAG_NOALLOC;
                                mapped_malloc(&blizzardmaprom_bank);
@@ -1816,20 +1823,20 @@ static void cpuboard_init_2(void)
                        }
                }
 
-               maprom_base = blizzardram_bank.allocated - 524288;
+               maprom_base = blizzardram_bank.reserved_size - 524288;
 
        } else if (is_csmk1(&currprefs)) {
 
                blizzardf0_bank.start = 0x00f00000;
-               blizzardf0_bank.allocated = 65536;
-               blizzardf0_bank.mask = blizzardf0_bank.allocated - 1;
+               blizzardf0_bank.reserved_size = 65536;
+               blizzardf0_bank.mask = blizzardf0_bank.reserved_size - 1;
                mapped_malloc(&blizzardf0_bank);
 
-               blizzardea_bank.allocated = 2 * 65536;
+               blizzardea_bank.reserved_size = 2 * 65536;
                blizzardea_bank.mask = 65535 - 1;
                mapped_malloc(&blizzardea_bank);
 
-               blizzardmaprom_bank.allocated = 524288;
+               blizzardmaprom_bank.reserved_size = 524288;
                blizzardmaprom_bank.start = 0x07f80000;
                blizzardmaprom_bank.mask = 524288 - 1;
                blizzardmaprom_bank_mapped = true;
@@ -1837,18 +1844,18 @@ static void cpuboard_init_2(void)
 
        } else if (is_csmk2(&currprefs) || is_blizzard2060(&currprefs)) {
 
-               blizzardea_bank.allocated = 2 * 65536;
-               blizzardea_bank.mask = blizzardea_bank.allocated - 1;
+               blizzardea_bank.reserved_size = 2 * 65536;
+               blizzardea_bank.mask = blizzardea_bank.reserved_size - 1;
                mapped_malloc(&blizzardea_bank);
 
                blizzardf0_bank.start = 0x00f00000;
-               blizzardf0_bank.allocated = 65536;
-               blizzardf0_bank.mask = blizzardf0_bank.allocated - 1;
+               blizzardf0_bank.reserved_size = 65536;
+               blizzardf0_bank.mask = blizzardf0_bank.reserved_size - 1;
                mapped_malloc(&blizzardf0_bank);
 
-               blizzardmaprom_bank.baseaddr = a3000hmem_bank.baseaddr + a3000hmem_bank.allocated - 524288;
-               blizzardmaprom_bank.start = a3000hmem_bank.start + a3000hmem_bank.allocated - 524288;
-               blizzardmaprom_bank.allocated = 524288;
+               blizzardmaprom_bank.baseaddr = a3000hmem_bank.baseaddr + a3000hmem_bank.reserved_size - 524288;
+               blizzardmaprom_bank.start = a3000hmem_bank.start + a3000hmem_bank.reserved_size - 524288;
+               blizzardmaprom_bank.reserved_size = 524288;
                blizzardmaprom_bank.mask = 524288 - 1;
                blizzardmaprom_bank.flags |= ABFLAG_INDIRECT | ABFLAG_NOALLOC;
                mapped_malloc(&blizzardmaprom_bank);
@@ -1856,28 +1863,28 @@ static void cpuboard_init_2(void)
        } else if (is_csmk3(&currprefs)) {
 
                blizzardf0_bank.start = 0x00f00000;
-               blizzardf0_bank.allocated = 524288;
-               blizzardf0_bank.mask = blizzardf0_bank.allocated - 1;
+               blizzardf0_bank.reserved_size = 524288;
+               blizzardf0_bank.mask = blizzardf0_bank.reserved_size - 1;
                mapped_malloc(&blizzardf0_bank);
 
        } else if (is_ivsvector(&currprefs)) {
        
                cpuboardmem1_bank.start = 0x02000000;
-               cpuboardmem1_bank.allocated = 32 * 1024 * 1024;
-               cpuboardmem1_bank.mask = cpuboardmem1_bank.allocated - 1;
+               cpuboardmem1_bank.reserved_size = 32 * 1024 * 1024;
+               cpuboardmem1_bank.mask = cpuboardmem1_bank.reserved_size - 1;
                mapped_malloc(&cpuboardmem1_bank);
 
                cpuboardmem2_bank.start = 0x0c000000;
-               cpuboardmem2_bank.allocated = cpuboard_size;
+               cpuboardmem2_bank.reserved_size = cpuboard_size;
                cpuboardmem2_bank.mask = cpuboard_size - 1;
                mapped_malloc(&cpuboardmem2_bank);
 
        }
 
        if (!cpuboardmem1_bank.baseaddr)
-               cpuboardmem1_bank.allocated = 0;
+               cpuboardmem1_bank.reserved_size = 0;
        if (!cpuboardmem2_bank.baseaddr)
-               cpuboardmem2_bank.allocated = 0;
+               cpuboardmem2_bank.reserved_size = 0;
 }
 
 void cpuboard_init(void)
@@ -1898,8 +1905,8 @@ void cpuboard_overlay_override(void)
        if (is_a2630(&currprefs)) {
                if (!(a2630_io & 2))
                        map_banks(&blizzardf0_bank, 0xf80000 >> 16, f0rom_size >> 16, 0);
-               if (mem25bit_bank.allocated)
-                       map_banks(&chipmem_bank, (mem25bit_bank.start + mem25bit_bank.allocated) >> 16, (1024 * 1024) >> 16, 0);
+               if (mem25bit_bank.allocated_size)
+                       map_banks(&chipmem_bank, (mem25bit_bank.start + mem25bit_bank.allocated_size) >> 16, (1024 * 1024) >> 16, 0);
                else
                        map_banks(&chipmem_bank, 0x01000000 >> 16, (1024 * 1024) >> 16, 0);
        }
@@ -2347,6 +2354,7 @@ bool cpuboard_autoconfig_init(struct autoconfig_info *aci)
                                break;
                        case BOARD_BLIZZARD_SUB_1230III:
                                roms[0] = 162;
+                               roms2[0] = 167;
                                break;
                        case BOARD_BLIZZARD_SUB_1230IV:
                                roms[0] = 89;
@@ -2358,6 +2366,7 @@ bool cpuboard_autoconfig_init(struct autoconfig_info *aci)
                                break;
                        case BOARD_BLIZZARD_SUB_2060:
                                roms[0] = 92;
+                               roms[1] = 168;
                                break;
                        case BOARD_BLIZZARD_SUB_PPC:
                                roms[0] = p->cpu_model == 68040 ? 99 : 100;
@@ -2469,6 +2478,8 @@ bool cpuboard_autoconfig_init(struct autoconfig_info *aci)
                flashrom = flash_new(blizzardf0_bank.baseaddr + 0, 32768, 65536, 0x20, flashrom_file, FLASHROM_EVERY_OTHER_BYTE | FLASHROM_PARALLEL_EEPROM);
                flashrom2 = flash_new(blizzardf0_bank.baseaddr + 1, 32768, 65536, 0x20, flashrom_file, FLASHROM_EVERY_OTHER_BYTE | FLASHROM_EVERY_OTHER_BYTE_ODD | FLASHROM_PARALLEL_EEPROM);
                autoconf = false;
+               aci->start = 0xf00000;
+               aci->size = 65536;
        } else if (is_aca500(p)) {
                f0rom_size = 524288;
                zfile_fread(blizzardf0_bank.baseaddr, f0rom_size, 1, autoconfig_rom);
@@ -2483,6 +2494,8 @@ bool cpuboard_autoconfig_init(struct autoconfig_info *aci)
                zfile_fread(blizzardf0_bank.baseaddr, 1, f0rom_size, autoconfig_rom);
                autoconf = false;
                autoconf_stop = true;
+               aci->start = 0xf00000;
+               aci->size = f0rom_size;
        } else if (is_kupke(p)) {
                earom_size = 65536;
                for (int i = 0; i < 8192; i++) {
@@ -2495,16 +2508,22 @@ bool cpuboard_autoconfig_init(struct autoconfig_info *aci)
                f0rom_size = 131072;
                zfile_fread(blizzardf0_bank.baseaddr, 1, 131072, autoconfig_rom);
                autoconf = false;
+               aci->start = 0xf00000;
+               aci->size = f0rom_size;
        } else if (is_fusionforty(p)) {
                f0rom_size = 262144;
                zfile_fread(blizzardf0_bank.baseaddr, 1, 131072, autoconfig_rom);
                autoconf = false;
+               aci->start = 0xf00000;
+               aci->size = f0rom_size;
        } else if (is_tekmagic(p)) {
                earom_size = 65536;
                f0rom_size = 131072;
                zfile_fread(blizzardf0_bank.baseaddr, 1, f0rom_size, autoconfig_rom);
                autoconf = false;
                cpuboard_non_byte_ea = false;
+               aci->start = 0xf00000;
+               aci->size = f0rom_size;
        } else if (is_blizzard2060(p)) {
                f0rom_size = 65536;
                earom_size = 131072;
@@ -2600,7 +2619,7 @@ bool cpuboard_autoconfig_init(struct autoconfig_info *aci)
                        }
                }
                aci->last_high_ram = BLIZZARDMK4_RAM_BASE_48 + p->cpuboardmem1_size / 2;
-       } else if (is_blizzard1230mk3(p) || is_blizzard1230mk2(p)) {
+       } else if (is_blizzard1230mk2(p)) {
                earom_size = 131072;
                for (int i = 0; i < 32768; i++) {
                        uae_u8 b = 0xff;
@@ -2610,15 +2629,32 @@ bool cpuboard_autoconfig_init(struct autoconfig_info *aci)
                }
                zfile_fclose(autoconfig_rom);
                autoconfig_rom = NULL;
+       } else if (is_blizzard1230mk3(p)) {
+               earom_size = 131072;
+               zfile_fread(blizzardea_bank.baseaddr, 65536, 1, autoconfig_rom);
+               zfile_fclose(autoconfig_rom);
+               autoconfig_rom = NULL;
+               if (roms2[0] != -1) {
+                       int idx2;
+                       struct boardromconfig *brc2 = get_device_rom(p, ROMTYPE_BLIZKIT3, 0, &idx2);
+                       if (brc2 && brc2->roms[idx2].romfile[0])
+                               autoconfig_rom = board_rom_open(roms2, brc2->roms[idx2].romfile);
+                       if (autoconfig_rom) {
+                               zfile_fread(blizzardea_bank.baseaddr, 65536, 1, autoconfig_rom);
+                               zfile_fclose(autoconfig_rom);
+                               autoconfig_rom = NULL;
+                       }
+               }
        }
 
        if (autoconf_stop) {
                aci->addrbank = &expamem_none;
        } else if (!autoconf) {
-               aci->addrbank = &expamem_nonautoconfig;
+               aci->zorro = 0;
        } else {
                aci->addrbank = &blizzarde8_bank;
                memcpy(aci->autoconfig_raw, blizzardea_bank.baseaddr, sizeof aci->autoconfig_raw);
+               aci->zorro = 2;
        }
 
        zfile_fclose(autoconfig_rom);
index 5122c3b9f6823e622a4421b9a1387bd4028d152b..308bf77bd2c9fd7f0b093231c88430541d08affc 100644 (file)
@@ -8337,10 +8337,12 @@ static void hsync_handler_post (bool onvsync)
                static int nextwaitvpos;
                if (vpos == 0)
                        nextwaitvpos = maxvpos_display * 1 / 4;
-               if (audio_is_pull() > 0) {
-                       while (audio_pull_buffer() > 1) {
+               if (audio_is_pull() > 0 && !currprefs.turbo_emulation) {
+                       frame_time_t rpt = read_processor_time();
+                       while (audio_pull_buffer() > 1 && (!isvsync() || (!vsync_isdone() && (int)vsyncmintime - (int)(rpt + vsynctimebase / 10) > 0 && (int)vsyncmintime - (int)rpt < vsynctimebase))) {
                                cpu_sleep_millis(1);
                                maybe_process_pull_audio();
+                               rpt = read_processor_time();
                        }
                }
                if (vpos + 1 < maxvpos + lof_store && vpos >= nextwaitvpos && vpos < maxvpos - (maxvpos / 3) && (audio_is_pull() <= 0 || (audio_is_pull() > 0 && audio_pull_buffer()))) {
index 99556b11c1da3264298c9c9cea416253ff256798..0b0828459db875a3eedd9071aa58e2ec360eea2b 100644 (file)
@@ -111,6 +111,9 @@ void devices_reset(int hardreset)
 #ifdef AUTOCONFIG
        expamem_reset ();
        rtarea_reset();
+#endif
+#ifdef DRIVESOUND
+       driveclick_reset();
 #endif
        uae_int_requested = 0;
 }
index 5989c907352cf8e0d51ad394bd002079e2f1b1fa..10e7efc94c93580b35cc38be226322938616292c 100644 (file)
--- a/disk.cpp
+++ b/disk.cpp
@@ -64,7 +64,9 @@ static int longwritemode = 0;
 /* support HD floppies */
 #define FLOPPY_DRIVE_HD
 /* writable track length with normal 2us bitcell/300RPM motor, 12667 PAL, 12797 NTSC */
-#define FLOPPY_WRITE_LEN (currprefs.floppy_write_length > 256 ? currprefs.floppy_write_length / 2 : (currprefs.ntscmode ? (12798 / 2) : (12668 / 2)))
+#define FLOPPY_WRITE_LEN_PAL 12668
+#define FLOPPY_WRITE_LEN_NTSC 12798
+#define FLOPPY_WRITE_LEN (currprefs.floppy_write_length > 256 ? currprefs.floppy_write_length / 2 : (currprefs.ntscmode ? (FLOPPY_WRITE_LEN_NTSC / 2) : (FLOPPY_WRITE_LEN_PAL / 2)))
 #define FLOPPY_WRITE_MAXLEN 0x3800
 /* This works out to 350 */
 #define FLOPPY_GAP_LEN (FLOPPY_WRITE_LEN - 11 * 544)
@@ -2373,7 +2375,7 @@ static bool convert_adf_to_ext2 (drive *drv, int mode)
                if (!p)
                        p = name + _tcslen (name);
                _tcscpy (p, _T(".extended.adf"));
-               if (!disk_creatediskfile (name, 1, hd ? DRV_35_HD : DRV_35_DD, NULL, false, false, drv->diskfile))
+               if (!disk_creatediskfile (&currprefs, name, 1, hd ? DRV_35_HD : DRV_35_DD, NULL, false, false, drv->diskfile))
                        return false;
        } else if (mode == 2) {
                struct zfile *tmp = zfile_fopen_load_zfile (drv->diskfile);
@@ -2381,7 +2383,7 @@ static bool convert_adf_to_ext2 (drive *drv, int mode)
                        return false;
                zfile_fclose (drv->diskfile);
                drv->diskfile = NULL;
-               if (!disk_creatediskfile (name, 1, hd ? DRV_35_HD : DRV_35_DD, NULL, false, false, tmp)) {
+               if (!disk_creatediskfile (&currprefs, name, 1, hd ? DRV_35_HD : DRV_35_DD, NULL, false, false, tmp)) {
                        zfile_fclose (tmp);
                        return false;
                }
@@ -2525,7 +2527,7 @@ static void floppy_get_rootblock (uae_u8 *dst, int block, const TCHAR *disk_name
 
 /* type: 0=regular, 1=ext2adf */
 /* adftype: 0=DD,1=HD,2=DD PC,3=HD PC,4=525SD */
-bool disk_creatediskfile (const TCHAR *name, int type, drive_type adftype, const TCHAR *disk_name, bool ffs, bool bootable, struct zfile *copyfrom)
+bool disk_creatediskfile (struct uae_prefs *p, const TCHAR *name, int type, drive_type adftype, const TCHAR *disk_name, bool ffs, bool bootable, struct zfile *copyfrom)
 {
        int size = 32768;
        struct zfile *f;
@@ -2545,7 +2547,10 @@ bool disk_creatediskfile (const TCHAR *name, int type, drive_type adftype, const
                file_size = 720 * 1024;
                sectors = 9;
        }
-       track_len = FLOPPY_WRITE_LEN * 2;
+       // largest needed
+       track_len = FLOPPY_WRITE_LEN_NTSC;
+       if (p->floppy_write_length > track_len && p->floppy_write_length < 2 * FLOPPY_WRITE_LEN_NTSC)
+               track_len = p->floppy_write_length;
        if (adftype == 1 || adftype == 3) {
                file_size *= 2;
                track_len *= 2;
@@ -2704,7 +2709,7 @@ int disk_setwriteprotect (struct uae_prefs *p, int num, const TCHAR *name, bool
        name2 = DISK_get_saveimagepath(name, -2);
 
        if (needwritefile && zf2 == 0)
-               disk_creatediskfile (name2, 1, drvtype, NULL, false, false, NULL);
+               disk_creatediskfile (p, name2, 1, drvtype, NULL, false, false, NULL);
        zfile_fclose (zf2);
        if (writeprotected && iswritefileempty (p, name)) {
                for (i = 0; i < MAX_FLOPPY_DRIVES; i++) {
@@ -4505,7 +4510,7 @@ uae_u8 *save_disk2 (int num, int *len, uae_u8 *dstptr)
        if (dstptr)
                dstbak = dst = dstptr;
        else
-               dstbak = dst = xmalloc (uae_u8, 2 + 4 + 2 + 4 + 4 + size);
+               dstbak = dst = xmalloc (uae_u8, 2 + 4 + 2 + 4 + 4 + size + 2);
 
        save_u32 (m);
        save_u16 (drv->floppybitcounter);
index bb397b34075024e40e0413ee68a80b4d0b079e4f..b3b118c9b419029227561828f061d1c45a052813 100644 (file)
@@ -28,8 +28,8 @@ static int drv_starting[4], drv_spinning[4], drv_has_spun[4], drv_has_disk[4];
 static int click_initialized, wave_initialized;
 #define DS_SHIFT 10
 static int sample_step;
-
 static uae_s16 *clickbuffer;
+static int clickcnt;
 
 uae_s16 *decodewav (uae_u8 *s, int *lenp)
 {
@@ -157,12 +157,6 @@ static void driveclick_close(void)
 void driveclick_free(void)
 {
        driveclick_close();
-       for (int i = 0; i < 4; i++) {
-               drv_starting[i] = 0;
-               drv_spinning[i] = 0;
-               drv_has_spun[i] = 0;
-               drv_has_disk[i] = 0;
-       }
 }
 
 void driveclick_init (void)
@@ -243,9 +237,16 @@ void driveclick_reset (void)
 {
        xfree (clickbuffer);
        clickbuffer = NULL;
+       clickcnt = 0;
+       for (int i = 0; i < 4; i++) {
+               drv_starting[i] = 0;
+               drv_spinning[i] = 0;
+               drv_has_spun[i] = 0;
+               drv_has_disk[i] = 0;
+       }
        if (!wave_initialized)
                return;
-       clickbuffer = xmalloc (uae_s16, paula_sndbufsize / 2);
+       clickbuffer = xcalloc (uae_s16, paula_sndbufsize / 2);
        sample_step = (freq << DS_SHIFT) / currprefs.sound_freq;
 }
 
@@ -321,8 +322,6 @@ static uae_s16 getsample (void)
        return total_sample / total_div;
 }
 
-static int clickcnt;
-
 static void mix (void)
 {
        int total = ((uae_u8*)paula_sndbufpt - (uae_u8*)paula_sndbuffer) / (get_audio_nativechannels (currprefs.sound_stereo) * 2);
index 4924bb49c81216b36cc157679859771bb6863ba0..eea844239a59e1a74e53b46c6c14070a44ac7180 100644 (file)
@@ -529,7 +529,7 @@ static int REGPARAM2 chipmem_check2 (uaecptr addr, uae_u32 size)
 {
        addr -= chipmem_start_addr & chipmem_bank.mask;
        addr &= chipmem_bank.mask;
-       return (addr + size) <= chipmem_bank.allocated;
+       return (addr + size) <= chipmem_bank.allocated_size;
 }
 
 static uae_u8 * REGPARAM2 chipmem_xlate2 (uaecptr addr)
index 8927872474ad54b3ebc95ad8f377bfa7ef64ba56..ecc0ed2351adb43ca3db3cab3b35d095d56e6a8f 100644 (file)
@@ -325,7 +325,7 @@ static void addextrachip (uae_u32 sysbase)
        }
 }
 
-addrbank expamem_null, expamem_none, expamem_nonautoconfig;
+addrbank expamem_null, expamem_none;
 
 DECLARE_MEMORY_FUNCTIONS(expamem);
 addrbank expamem_bank = {
@@ -464,7 +464,7 @@ static void call_card_init(int index)
                expamem_bank_current = NULL;
                return;
        }
-       if (ab == &expamem_null || ab == &expamem_nonautoconfig || cd->zorro < 1 || cd->zorro > 3) {
+       if (ab == &expamem_null || cd->zorro < 1 || cd->zorro > 3) {
                expamem_next(NULL, NULL);
                return;
        }
@@ -1003,13 +1003,11 @@ DECLARE_MEMORY_FUNCTIONS(filesys);
 addrbank filesys_bank = {
        filesys_lget, filesys_wget, filesys_bget,
        filesys_lput, filesys_wput, filesys_bput,
-       filesys_xlate, filesys_check, NULL, _T("filesys"), _T("Filesystem autoconfig"),
+       filesys_xlate, filesys_check, NULL, _T("*"), _T("Filesystem autoconfig"),
        filesys_lget, filesys_wget,
        ABFLAG_IO | ABFLAG_SAFE | ABFLAG_PPCIOSPACE, S_READ, S_WRITE
 };
 
-static uae_u32 filesys_start; /* Determined by the OS */
-
 static bool filesys_write(uaecptr addr)
 {
        return addr >= 0x4000;
@@ -1018,7 +1016,7 @@ static bool filesys_write(uaecptr addr)
 static uae_u32 REGPARAM2 filesys_lget (uaecptr addr)
 {
        uae_u8 *m;
-       addr -= filesys_start & 65535;
+       addr -= filesys_bank.start & 65535;
        addr &= 65535;
        m = filesys_bank.baseaddr + addr;
 #if EXP_DEBUG
@@ -1030,7 +1028,7 @@ static uae_u32 REGPARAM2 filesys_lget (uaecptr addr)
 static uae_u32 REGPARAM2 filesys_wget (uaecptr addr)
 {
        uae_u8 *m;
-       addr -= filesys_start & 65535;
+       addr -= filesys_bank.start & 65535;
        addr &= 65535;
        m = filesys_bank.baseaddr + addr;
 #if EXP_DEBUG
@@ -1041,7 +1039,7 @@ static uae_u32 REGPARAM2 filesys_wget (uaecptr addr)
 
 static uae_u32 REGPARAM2 filesys_bget (uaecptr addr)
 {
-       addr -= filesys_start & 65535;
+       addr -= filesys_bank.start & 65535;
        addr &= 65535;
 #if EXP_DEBUG
        write_log (_T("filesys_bget %x %x\n"), addr, filesys_bank.baseaddr[addr]);
@@ -1052,7 +1050,7 @@ static uae_u32 REGPARAM2 filesys_bget (uaecptr addr)
 
 static void REGPARAM2 filesys_bput(uaecptr addr, uae_u32 b)
 {
-       addr -= filesys_start & 65535;
+       addr -= filesys_bank.start & 65535;
        addr &= 65535;
        if (!filesys_write(addr))
                return;
@@ -1061,7 +1059,7 @@ static void REGPARAM2 filesys_bput(uaecptr addr, uae_u32 b)
 
 static void REGPARAM2 filesys_lput (uaecptr addr, uae_u32 l)
 {
-       addr -= filesys_start & 65535;
+       addr -= filesys_bank.start & 65535;
        addr &= 65535;
        if (!filesys_write(addr))
                return;
@@ -1073,7 +1071,7 @@ static void REGPARAM2 filesys_lput (uaecptr addr, uae_u32 l)
 
 static void REGPARAM2 filesys_wput (uaecptr addr, uae_u32 w)
 {
-       addr -= filesys_start & 65535;
+       addr -= filesys_bank.start & 65535;
        addr &= 65535;
        if (!filesys_write(addr))
                return;
@@ -1085,7 +1083,7 @@ static int REGPARAM2 filesys_check(uaecptr addr, uae_u32 size)
 {
        addr -= filesys_bank.start & 65535;
        addr &= 65535;
-       return (addr + size) <= filesys_bank.allocated;
+       return (addr + size) <= filesys_bank.allocated_size;
 }
 static uae_u8 *REGPARAM2 filesys_xlate(uaecptr addr)
 {
@@ -1115,7 +1113,7 @@ uae_u8 *uaeboard_map_ram(uaecptr p)
                p -= uaeboard_base;
                return uaeboard_bank.baseaddr + p;
        } else {
-               p -= filesys_start;
+               p -= filesys_bank.start;
                return filesys_bank.baseaddr + p;
        }
 }
@@ -1129,7 +1127,7 @@ uaecptr uaeboard_alloc_ram(uae_u32 size)
                p = uaeboard_ram_start + uaeboard_base;
                memset(uaeboard_bank.baseaddr + uaeboard_ram_start, 0, size);
        } else {
-               p = uaeboard_ram_start + filesys_start;
+               p = uaeboard_ram_start + filesys_bank.start;
                memset(filesys_bank.baseaddr + uaeboard_ram_start, 0, size);
        }
        uaeboard_ram_start += size;
@@ -1202,7 +1200,7 @@ static int REGPARAM2 uaeboard_check(uaecptr addr, uae_u32 size)
 {
        addr -= uaeboard_base & 65535;
        addr &= 65535;
-       return (addr + size) <= uaeboard_bank.allocated;
+       return (addr + size) <= uaeboard_bank.allocated_size;
 }
 static uae_u8 *REGPARAM2 uaeboard_xlate(uaecptr addr)
 {
@@ -1383,7 +1381,7 @@ static addrbank *expamem_map_fastcard(struct autoconfig_info *aci)
        addrbank *ab = &fastmem_bank[aci->devnum];
        if (start == 0x00ff0000)
                return ab;
-       uae_u32 size = ab->allocated;
+       uae_u32 size = ab->allocated_size;
        ab->start = start;
        if (ab->start && size) {
                map_banks_z2(ab, ab->start >> 16, size >> 16);
@@ -1512,7 +1510,7 @@ static const uae_u8 a2630_autoconfig[] = { 0xe7, 0x51, 0x40, 0x00, 0x02, 0x02, 0
 
 static bool megachipram_init(struct autoconfig_info *aci)
 {
-       aci->addrbank = &expamem_nonautoconfig;
+       aci->zorro = 0;
        aci->start = 0x10000000;
        aci->size = aci->prefs->z3chipmem_size;
        aci->label = _T("32-bit Chip RAM");
@@ -1576,6 +1574,15 @@ bool expansion_is_next_board_fastram(void)
 
 #ifdef FILESYS
 
+static bool expamem_rtarea_init(struct autoconfig_info *aci)
+{
+       aci->start = rtarea_base;
+       aci->size = 65536;
+       aci->addrbank = &rtarea_bank;
+       aci->label = _T("UAE Boot ROM");
+       return true;
+}
+
 /*
 * Filesystem device
 */
@@ -1585,7 +1592,7 @@ static void expamem_map_filesys_update(void)
        /* 68k code needs to know this. */
        uaecptr a = here();
        org(rtarea_base + RTAREA_FSBOARD);
-       dl(filesys_start + 0x2000);
+       dl(filesys_bank.start + 0x2000);
        org(a);
 }
 
@@ -1598,10 +1605,12 @@ static addrbank *expamem_map_filesys (struct autoconfig_info *aci)
                // can't show dialogs from PPC thread, deadlock danger.
                regs.halted = -2;
        }
-
+       filesys_bank.start = expamem_board_pointer;
+       filesys_bank.mask = filesys_bank.reserved_size - 1;
+       mapped_malloc(&filesys_bank);
+       memcpy (filesys_bank.baseaddr, expamem, 0x3000);
        uaeboard_ram_start = UAEBOARD_WRITEOFFSET;
-       filesys_start = expamem_board_pointer;
-       map_banks_z2(&filesys_bank, filesys_start >> 16, 1);
+       map_banks_z2(&filesys_bank, filesys_bank.start >> 16, 1);
        expamem_map_filesys_update();
        return &filesys_bank;
 }
@@ -1645,9 +1654,10 @@ static bool expamem_init_filesys(struct autoconfig_info *aci)
        bool ks12 = ks12orolder();
        bool hide = currprefs.uae_hide_autoconfig;
 
-       aci->label = _T("UAE Boot ROM");
+       aci->label = _T("UAE FS ROM");
        aci->get_params = get_params_filesys;
        aci->set_params = set_params_filesys;
+       aci->addrbank = &filesys_bank;
 
 #if 0
        FILE *f = fopen("d:\\amiga\\amiga\\source\\acap\\autoconf", "rb");
@@ -1707,7 +1717,7 @@ static bool expamem_init_filesys(struct autoconfig_info *aci)
        if (ks12)
                add_ks12_boot_hack();
 
-       memcpy (filesys_bank.baseaddr, expamem, 0x3000);
+       //memcpy (filesys_bank.baseaddr, expamem, 0x3000);
        return true;
 }
 
@@ -1724,7 +1734,7 @@ static addrbank *expamem_map_z3fastmem (struct autoconfig_info *aci)
        uaecptr z3fs = expamem_board_pointer;
        uae_u32 size = currprefs.z3fastmem[devnum].size;
 
-       if (ab->allocated)
+       if (ab->allocated_size)
                map_banks_z3(ab, z3fs >> 16, size >> 16);
        return ab;
 }
@@ -1763,7 +1773,7 @@ static bool expamem_init_z3fastmem(struct autoconfig_info *aci)
 
        uae_u32 start = bank->start;
        bool alwaysmapz3 = aci->prefs->z3_mapping_mode != Z3MAPPING_REAL;
-       if ((alwaysmapz3 || expamem_z3hack(aci->prefs)) && bank->allocated) {
+       if ((alwaysmapz3 || expamem_z3hack(aci->prefs)) && bank->allocated_size) {
                map_banks_z3(bank, start >> 16, size >> 16);
        }
        return true;
@@ -1778,7 +1788,7 @@ static addrbank *expamem_map_gfxcard_z3 (struct autoconfig_info *aci)
 {
        int devnum = aci->devnum;
        gfxmem_banks[devnum]->start = expamem_board_pointer;
-       map_banks_z3(gfxmem_banks[devnum], gfxmem_banks[devnum]->start >> 16, gfxmem_banks[devnum]->allocated >> 16);
+       map_banks_z3(gfxmem_banks[devnum], gfxmem_banks[devnum]->start >> 16, gfxmem_banks[devnum]->allocated_size >> 16);
        return gfxmem_banks[devnum];
 }
 
@@ -1786,7 +1796,7 @@ static addrbank *expamem_map_gfxcard_z2 (struct autoconfig_info *aci)
 {
        int devnum = aci->devnum;
        gfxmem_banks[devnum]->start = expamem_board_pointer;
-       map_banks_z2(gfxmem_banks[devnum], gfxmem_banks[devnum]->start >> 16, gfxmem_banks[devnum]->allocated >> 16);
+       map_banks_z2(gfxmem_banks[devnum], gfxmem_banks[devnum]->start >> 16, gfxmem_banks[devnum]->allocated_size >> 16);
        return gfxmem_banks[devnum];
 }
 
@@ -1866,7 +1876,8 @@ static bool mapped_malloc_dynamic (uae_u32 *currpsize, uae_u32 *changedpsize, ad
 {
        int alloc = *currpsize;
 
-       bank->allocated = 0;
+       bank->allocated_size = 0;
+       bank->reserved_size = alloc;
        bank->baseaddr = NULL;
        bank->mask = 0;
 
@@ -1874,7 +1885,6 @@ static bool mapped_malloc_dynamic (uae_u32 *currpsize, uae_u32 *changedpsize, ad
                return false;
 
        bank->mask = alloc - 1;
-       bank->allocated = alloc;
        bank->label = label ? label : _T("*");
        if (mapped_malloc (bank)) {
                *currpsize = alloc;
@@ -1922,20 +1932,19 @@ static void allocate_expamem (void)
                currprefs.z3chipmem_size = changed_prefs.z3chipmem_size = 0;    
 
        for (int i = 0; i < MAX_RAM_BOARDS; i++) {
-               if (fastmem_bank[i].allocated != currprefs.fastmem[i].size) {
+               if (fastmem_bank[i].reserved_size != currprefs.fastmem[i].size) {
                        free_fastmemory(i);
 
                        if (fastmem_bank[i].start == 0xffffffff) {
-                               fastmem_bank[i].allocated = 0;
+                               fastmem_bank[i].reserved_size = 0;
                        } else {
-                               fastmem_bank[i].allocated = currprefs.fastmem[i].size;
-                               fastmem_bank[i].mask = fastmem_bank[i].allocated - 1;
+                               fastmem_bank[i].reserved_size = currprefs.fastmem[i].size;
+                               fastmem_bank[i].mask = fastmem_bank[i].reserved_size - 1;
 
-                               if (fastmem_bank[i].allocated && fastmem_bank[i].start != 0xffffffff) {
+                               if (fastmem_bank[i].reserved_size && fastmem_bank[i].start != 0xffffffff) {
                                        mapped_malloc (&fastmem_bank[i]);
                                        if (fastmem_bank[i].baseaddr == 0) {
                                                write_log (_T("Out of memory for fastmem card.\n"));
-                                               fastmem_bank[i].allocated = 0;
                                        }
                                }
                        }
@@ -1943,7 +1952,7 @@ static void allocate_expamem (void)
                }
        }
 
-       if (z3fastmem_bank[0].allocated != currprefs.z3fastmem[0].size) {
+       if (z3fastmem_bank[0].reserved_size != currprefs.z3fastmem[0].size) {
                mapped_free(&z3fastmem_bank[0]);
                mapped_malloc_dynamic(&currprefs.z3fastmem[0].size, &changed_prefs.z3fastmem[0].size, &z3fastmem_bank[0], 1, _T("*"));
                memory_hardreset(1);
@@ -1952,23 +1961,22 @@ static void allocate_expamem (void)
                if (currprefs.z3fastmem[i].size && z3fastmem_bank[i].start == 0xffffffff) {
                        z3fastmem_bank[i].start = expansion_startaddress(&currprefs, z3fastmem_bank[i - 1].start, currprefs.z3fastmem[i - 1].size);
                }
-               if (z3fastmem_bank[i].allocated != currprefs.z3fastmem[i].size) {
+               if (z3fastmem_bank[i].reserved_size != currprefs.z3fastmem[i].size) {
                        mapped_free (&z3fastmem_bank[i]);
 
-                       z3fastmem_bank[i].allocated = currprefs.z3fastmem[i].size;
-                       z3fastmem_bank[i].mask = z3fastmem_bank[i].allocated - 1;
+                       z3fastmem_bank[i].reserved_size = currprefs.z3fastmem[i].size;
+                       z3fastmem_bank[i].mask = z3fastmem_bank[i].reserved_size - 1;
 
-                       if (z3fastmem_bank[i].allocated) {
+                       if (z3fastmem_bank[i].reserved_size) {
                                mapped_malloc(&z3fastmem_bank[i]);
                                if (z3fastmem_bank[i].baseaddr == 0) {
                                        write_log (_T("Out of memory for 32 bit fast memory #%d.\n"), i);
-                                       z3fastmem_bank[i].allocated = 0;
                                }
                        }
                        memory_hardreset (1);
                }
        }
-       if (z3chipmem_bank.allocated != currprefs.z3chipmem_size) {
+       if (z3chipmem_bank.reserved_size != currprefs.z3chipmem_size) {
                mapped_free (&z3chipmem_bank);
                mapped_malloc_dynamic (&currprefs.z3chipmem_size, &changed_prefs.z3chipmem_size, &z3chipmem_bank, 16, _T("*"));
                memory_hardreset (1);
@@ -1976,7 +1984,7 @@ static void allocate_expamem (void)
 
 #ifdef PICASSO96
        struct rtgboardconfig *rbc = &currprefs.rtgboards[0];
-       if (gfxmem_banks[0]->allocated != rbc->rtgmem_size) {
+       if (gfxmem_banks[0]->reserved_size != rbc->rtgmem_size) {
                mapped_free (gfxmem_banks[0]);
                if (rbc->rtgmem_type < GFXBOARD_HARDWARE)
                        mapped_malloc_dynamic (&rbc->rtgmem_size, &changed_prefs.rtgboards[0].rtgmem_size, gfxmem_banks[0], 1, NULL);
@@ -1987,31 +1995,31 @@ static void allocate_expamem (void)
 #ifdef SAVESTATE
        if (savestate_state == STATE_RESTORE) {
                for (int i = 0; i < MAX_RAM_BOARDS; i++) {
-                       if (fastmem_bank[i].allocated > 0) {
+                       if (fastmem_bank[i].allocated_size > 0) {
                                restore_ram (fast_filepos[i], fastmem_bank[i].baseaddr);
                                if (!fastmem_bank[i].start) {
                                        // old statefile compatibility support
                                        fastmem_bank[i].start = 0x00200000;
                                }
                                map_banks(&fastmem_bank[i], fastmem_bank[i].start >> 16, currprefs.fastmem[i].size >> 16,
-                                               fastmem_bank[i].allocated);
+                                               fastmem_bank[i].allocated_size);
                        }
-                       if (z3fastmem_bank[i].allocated > 0) {
+                       if (z3fastmem_bank[i].allocated_size > 0) {
                                restore_ram (z3_filepos[i], z3fastmem_bank[i].baseaddr);
                                map_banks(&z3fastmem_bank[i], z3fastmem_bank[i].start >> 16, currprefs.z3fastmem[i].size >> 16,
-                                       z3fastmem_bank[i].allocated);
+                                       z3fastmem_bank[i].allocated_size);
                        }
                }
-               if (z3chipmem_bank.allocated > 0) {
+               if (z3chipmem_bank.allocated_size > 0) {
                        restore_ram (z3_fileposchip, z3chipmem_bank.baseaddr);
                        map_banks(&z3chipmem_bank, z3chipmem_bank.start >> 16, currprefs.z3chipmem_size >> 16,
-                               z3chipmem_bank.allocated);
+                               z3chipmem_bank.allocated_size);
                }
 #ifdef PICASSO96
-               if (gfxmem_banks[0]->allocated > 0 && gfxmem_banks[0]->start > 0) {
+               if (gfxmem_banks[0]->allocated_size > 0 && gfxmem_banks[0]->start > 0) {
                        restore_ram (p96_filepos, gfxmem_banks[0]->baseaddr);
                        map_banks(gfxmem_banks[0], gfxmem_banks[0]->start >> 16, currprefs.rtgboards[0].rtgmem_size >> 16,
-                               gfxmem_banks[0]->allocated);
+                               gfxmem_banks[0]->allocated_size);
                }
 #endif
        }
@@ -2379,7 +2387,7 @@ void expansion_generate_autoconfig_info(struct uae_prefs *p)
 bool alloc_expansion_bank(addrbank *bank, struct autoconfig_info *aci)
 {
        bank->start = aci->start;
-       bank->allocated = aci->size;
+       bank->reserved_size = aci->size;
        aci->addrbank = bank;
        return mapped_malloc(bank);
 }
@@ -2388,7 +2396,7 @@ void free_expansion_bank(addrbank *bank)
 {
        mapped_free(bank);
        bank->start = NULL;
-       bank->allocated = 0;
+       bank->reserved_size = 0;
 }
 
 struct autoconfig_info *expansion_get_autoconfig_data(struct uae_prefs *p, int index)
@@ -2450,6 +2458,7 @@ static void expansion_init_cards(struct uae_prefs *p)
                aci->ert = cd->ert;
                aci->cst = cd->cst;
                aci->start = 0xffffffff;
+               aci->zorro = cd->zorro;
                if (cd->initnum) {
                        ok = cd->initnum(aci);
                } else {
@@ -2459,7 +2468,7 @@ static void expansion_init_cards(struct uae_prefs *p)
                if (cd->flags & CARD_FLAG_CHILD)
                        aci->parent_of_previous = true;
                
-               if (aci->addrbank != &expamem_nonautoconfig && aci->addrbank != &expamem_null && aci->addrbank != &expamem_none && (aci->autoconfig_raw[0] != 0xff || aci->autoconfigp)) {
+               if ((aci->zorro == 1 || aci->zorro == 2 || aci->zorro == 3) && aci->addrbank != &expamem_null && aci->addrbank != &expamem_none && (aci->autoconfig_raw[0] != 0xff || aci->autoconfigp)) {
                        uae_u8 ac2[16];
                        const uae_u8 *a = aci->autoconfigp;
                        if (!a) {
@@ -2567,6 +2576,7 @@ static void expansion_parse_cards(struct uae_prefs *p, bool log)
                aci->prefs = p;
                aci->ert = cd->ert;
                aci->cst = cd->cst;
+               aci->zorro = cd->zorro;
                aci->start = 0xffffffff;
                if (cd->initnum) {
                        ok = cd->initnum(aci);
@@ -2620,7 +2630,7 @@ static void expansion_parse_cards(struct uae_prefs *p, bool log)
                                _stprintf(s, _T(" [%d]"), aci->devnum + 1);
                        }
 
-                       if (aci->addrbank != &expamem_nonautoconfig && aci->addrbank != &expamem_null && aci->addrbank != &expamem_none && (aci->autoconfig_raw[0] != 0xff || aci->autoconfigp)) {
+                       if ((aci->zorro == 1 || aci->zorro == 2 || aci->zorro == 3) && aci->addrbank != &expamem_none && (aci->autoconfig_raw[0] != 0xff || aci->autoconfigp)) {
                                uae_u8 ac2[16];
                                const uae_u8 *a = aci->autoconfigp;
                                if (!a) {
@@ -2668,19 +2678,21 @@ static void expansion_parse_cards(struct uae_prefs *p, bool log)
                                memcpy(aci->autoconfig_bytes, a, sizeof aci->autoconfig_bytes);
                                if (aci->addrbank) {
                                        aci->addrbank->start = expamem_board_pointer;
-                                       if (aci->addrbank->allocated == 0 && !(type & add_memory) && expamem_board_size < 524288) {
-                                               aci->addrbank->allocated = expamem_board_size;
+                                       if (aci->addrbank->reserved_size == 0 && !(type & add_memory) && expamem_board_size < 524288) {
+                                               aci->addrbank->reserved_size = expamem_board_size;
                                        }
                                }
                                aci->zorro = cd->zorro;
                                if (cd->zorro == 3) {
                                        if (expamem_z3_pointer_real + expamem_board_size < expamem_z3_pointer_real) {
                                                expamem_z3_pointer_real = 0xffffffff;
+                                               expamem_z3_highram_real = 0xffffffff;
                                        } else {
                                                expamem_z3_pointer_real += expamem_board_size;
                                        }
                                        if (expamem_z3_pointer_uae + expamem_board_size < expamem_z3_pointer_uae) {
                                                expamem_z3_pointer_uae = 0xffffffff;
+                                               expamem_z3_highram_uae = 0xffffffff;
                                        } else {
                                                expamem_z3_pointer_uae += expamem_board_size;
                                        }
@@ -2698,8 +2710,10 @@ static void expansion_parse_cards(struct uae_prefs *p, bool log)
 
                                }
                        } else {
+                               cd->base = aci->start;
+                               cd->size = aci->size;
                                if (log)
-                                       write_log(_T("'%s' no autoconfig.\n"), aci->label ? aci->label : _T("<no name>"));
+                                       write_log(_T("'%s' no autoconfig %08x - %08x.\n"), aci->label ? aci->label : _T("<no name>"), cd->base, cd->base + cd->size - 1);
                        }
                        _tcscpy(aci->name, label);
                        if (cd->flags & CARD_FLAG_CHILD)
@@ -2981,7 +2995,7 @@ static void expansion_autoconfig_sort(struct uae_prefs *p)
                        struct card_data *cd = tcards[idx];
                        if (!cd)
                                continue;
-                       if (cd->cst || cd->aci.hardwired || cd->size == 0) {
+                       if (cd->cst || cd->aci.hardwired) {
                                cards[new_cardno++] = cd;
                                tcards[idx] = NULL;
                                for (int j = idx + 1; j < cardno; j++) {
@@ -3104,12 +3118,13 @@ static void expansion_add_autoconfig(struct uae_prefs *p)
        reset_ac(p);
 
        if (p == &currprefs && do_mount < 0 && ks11orolder()) {
-               filesys_start = 0xe90000;
-               map_banks_z2(&filesys_bank, filesys_start >> 16, 1);
+               filesys_bank.start = 0xe90000;
+               mapped_malloc(&filesys_bank);
+               map_banks_z2(&filesys_bank, filesys_bank.start >> 16, 1);
                expamem_init_filesys(0);
                expamem_map_filesys_update();
        }
-
+       
        if (p->cpuboard_type) {
                // This may require first 128k slot.
                cards_set[cardno].flags = 1;
@@ -3166,6 +3181,14 @@ static void expansion_add_autoconfig(struct uae_prefs *p)
                cards_set[cardno].initnum = expamem_init_uaeboard;
                cards_set[cardno++].map = expamem_map_uaeboard;
        }
+       if (do_mount && p->uaeboard < 2) {
+               cards_set[cardno].flags = 0;
+               cards_set[cardno].name = _T("UAEBOOTROM");
+               cards_set[cardno].zorro = BOARD_NONAUTOCONFIG_BEFORE;
+               cards_set[cardno].initnum = expamem_rtarea_init;
+               cards_set[cardno++].map = NULL;
+
+       }
 #endif
 #ifdef PICASSO96
        for (int i = 0; i < MAX_RTG_BOARDS; i++) {
@@ -3308,14 +3331,14 @@ void expansion_init (void)
        if (savestate_state != STATE_RESTORE) {
 
                for (int i = 0; i < MAX_RAM_BOARDS; i++) {
-                       fastmem_bank[i].allocated = 0;
+                       fastmem_bank[i].reserved_size = 0;
                        fastmem_bank[i].mask = 0;
                        fastmem_bank[i].baseaddr = NULL;
                }
 
 #ifdef PICASSO96
                for (int i = 0; i < MAX_RTG_BOARDS; i++) {
-                       gfxmem_banks[i]->allocated = 0;
+                       gfxmem_banks[i]->reserved_size = 0;
                        gfxmem_banks[i]->mask = 0;
                        gfxmem_banks[i]->baseaddr = NULL;
                }
@@ -3326,31 +3349,20 @@ void expansion_init (void)
 #endif
 
                for (int i = 0; i < MAX_RAM_BOARDS; i++) {
-                       z3fastmem_bank[i].allocated = 0;
+                       z3fastmem_bank[i].reserved_size = 0;
                        z3fastmem_bank[i].mask = 0;
                        z3fastmem_bank[i].baseaddr = NULL;
                }
 
-               z3chipmem_bank.allocated = 0;
+               z3chipmem_bank.reserved_size = 0;
                z3chipmem_bank.mask = z3chipmem_bank.start = 0;
                z3chipmem_bank.baseaddr = NULL;
        }
 
-#ifdef FILESYS
-       filesys_start = 0;
-#endif
-
        allocate_expamem ();
 
-#ifdef FILESYS
-       filesys_bank.allocated = 0x10000;
-       if (!mapped_malloc (&filesys_bank)) {
-               write_log (_T("virtual memory exhausted (filesysory)!\n"));
-               exit (0);
-       }
-#endif
        if (currprefs.uaeboard) {
-               uaeboard_bank.allocated = 0x10000;
+               uaeboard_bank.reserved_size = 0x10000;
                mapped_malloc(&uaeboard_bank);
        }
 }
@@ -3385,9 +3397,9 @@ void expansion_cleanup (void)
 
 static void clear_bank (addrbank *ab)
 {
-       if (!ab->baseaddr || !ab->allocated)
+       if (!ab->baseaddr || !ab->allocated_size)
                return;
-       memset (ab->baseaddr, 0, ab->allocated > 0x800000 ? 0x800000 : ab->allocated);
+       memset (ab->baseaddr, 0, ab->allocated_size > 0x800000 ? 0x800000 : ab->allocated_size);
 }
 
 void expansion_clear (void)
@@ -3408,23 +3420,23 @@ void expansion_clear (void)
 
 uae_u8 *save_fram (int *len, int num)
 {
-       *len = fastmem_bank[num].allocated;
+       *len = fastmem_bank[num].allocated_size;
        return fastmem_bank[num].baseaddr;
 }
 
 uae_u8 *save_zram (int *len, int num)
 {
        if (num < 0) {
-               *len = z3chipmem_bank.allocated;
+               *len = z3chipmem_bank.allocated_size;
                return z3chipmem_bank.baseaddr;
        }
-       *len = z3fastmem_bank[num].allocated;
+       *len = z3fastmem_bank[num].allocated_size;
        return z3fastmem_bank[num].baseaddr;
 }
 
 uae_u8 *save_pram (int *len)
 {
-       *len = gfxmem_banks[0]->allocated;
+       *len = gfxmem_banks[0]->allocated_size;
        return gfxmem_banks[0]->baseaddr;
 }
 
@@ -3861,6 +3873,23 @@ static const struct expansionboardsettings x86_bridge_sidecar_settings[] = {
        }
 };
 
+static const struct expansionboardsettings ne2k_isa_settings[] = {
+       {
+               _T("IO\0") _T("240\0") _T("260\0") _T("280\0") _T("2A0\0") _T("300\0") _T("320\0") _T("340\0") _T("360\0"),
+               _T("io\0") _T("240\0") _T("260\0") _T("280\0") _T("2A0\0") _T("300\0") _T("320\0") _T("340\0") _T("360\0"),
+               true, false, 0
+       },
+       {
+               _T("IRQ\0") _T("3\0") _T("4\0") _T("5\0") _T("7\0") _T("9\0") _T("10\0") _T("11\0") _T("12\0") _T("15\0"),
+               _T("irq\0") _T("3\0") _T("4\0") _T("5\0") _T("7\0") _T("9\0") _T("10\0") _T("11\0") _T("12\0") _T("15\0"),
+               true, false, 0
+       },
+       {
+               NULL
+       }
+};
+
+
 static const struct expansionboardsettings toccata_soundcard_settings[] = {
        {
                _T("Paula/CD audio mixer"),
@@ -3936,6 +3965,17 @@ static const struct expansionboardsettings nexus_settings[] = {
                NULL
        }
 };
+static const struct expansionboardsettings buddha_settings[] = {
+       {
+               _T("Model\0") _T("Buddha\0") _T("Catweasel Z2\0"),
+               _T("model\0") _T("buddha\0") _T("cwz2\0"),
+               true, false, 0
+       },
+       {
+               NULL
+       }
+};
+
 static const struct expansionboardsettings adscsi2000_settings[] = {
        {
                _T("Cache (B)"),
@@ -4011,8 +4051,7 @@ const struct expansionromtype expansionroms[] = {
                mediator_sub, 0,
                false, EXPANSIONTYPE_PCI_BRIDGE,
                0, 0, 0, false, NULL,
-               false,
-               mediator_settings
+               false, 0, mediator_settings
        },
        {
                _T("prometheus"), _T("Prometheus"), _T("Matay"),
@@ -4020,8 +4059,7 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                false, EXPANSIONTYPE_PCI_BRIDGE,
                0, 0, 0, false, NULL,
-               false,
-               bridge_settings
+               false, 0, bridge_settings
        },
 
        /* SCSI/IDE expansion */
@@ -4040,6 +4078,12 @@ const struct expansionromtype expansionroms[] = {
                false, EXPANSIONTYPE_SCSI,
                8498, 27, 0, true, NULL
        },
+       {
+               _T("blizzardscsikitiii"), _T("SCSI Kit III"), _T("Phase 5"),
+               NULL, NULL, cpuboard_ncr9x_add_scsi_unit, ROMTYPE_BLIZKIT3, 0, 0, 0, true,
+               NULL, 0,
+               false, EXPANSIONTYPE_SCSI
+       },
        {
                _T("blizzardscsikitiv"), _T("SCSI Kit IV"), _T("Phase 5"),
                NULL, NULL, cpuboard_ncr9x_add_scsi_unit, ROMTYPE_BLIZKIT4, 0, 0, 0, true,
@@ -4072,7 +4116,7 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                false, EXPANSIONTYPE_SCSI,
                0, 0, 0, false, NULL,
-               false, NULL,
+               false, 0, NULL,
                { 0xc1, 0x0c, 0x00, 0x00, 0x03, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
        },
        {
@@ -4094,7 +4138,7 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                false, EXPANSIONTYPE_SCSI,
                0, 0, 0, false, NULL,
-               true, a4091_settings
+               true, 0, a4091_settings
        },
        {
                _T("dataflyerscsiplus"), _T("DataFlyer SCSI+"), _T("Expansion Systems"),
@@ -4133,8 +4177,16 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                false, EXPANSIONTYPE_SCSI,
                0, 0, 0, false, NULL,
-               true,
-               adscsi2000_settings
+               true, 0, adscsi2000_settings
+       },
+       {
+               _T("buddha"), _T("Buddha"), _T("Individual Computers"),
+               buddha_init, NULL, buddha_add_ide_unit, ROMTYPE_BUDDHA, 0, 0, BOARD_AUTOCONFIG_Z2, false,
+               NULL, 0,
+               false, EXPANSIONTYPE_IDE,
+               0, 0, 0, false, NULL,
+               false, 4, buddha_settings,
+               { 0xd1, 0x00, 0x00, 0x00, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00 },
        },
        {
                _T("trumpcardpro"), _T("Grand Slam"), _T("IVS"),
@@ -4142,11 +4194,11 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                true, EXPANSIONTYPE_SCSI,
                2112, 4, 0, false, NULL,
-               true, NULL,
+               true, 0, NULL,
                {  0xd1, 0x34, 0x00, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 },
        },
        {
-               _T("kommos"), _T("A500/A2000 SCSI"), _T("Jürgen Kommos"),
+               _T("kommos"), _T("Kommos A500/A2000 SCSI"), _T("Jürgen Kommos"),
                kommos_init, NULL, kommos_add_scsi_unit, ROMTYPE_KOMMOS, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
                NULL, 0,
                false, EXPANSIONTYPE_SCSI
@@ -4164,8 +4216,7 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_IDE,
                0, 0, 0, false, NULL,
-               true,
-               golemfast_settings
+               true, 0, golemfast_settings
        },
        {
                _T("multievolution"), _T("Multi Evolution 500/2000"), _T("MacroSystem"),
@@ -4198,7 +4249,7 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                false, EXPANSIONTYPE_SCSI,
                1010, 0, 0, false, NULL,
-               false, NULL,
+               false, 0, NULL,
                { 0xc1, 2, 0x00, 0x00, 0x03, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
        },
@@ -4221,7 +4272,7 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                false, EXPANSIONTYPE_SCSI,
                2102, 4, 0, false, nexus_memory_callback,
-               false, nexus_settings,
+               false, 0, nexus_settings,
                { 0xd1, 0x01, 0x00, 0x00, 0x08, 0x36, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 },
        },
        {
@@ -4235,8 +4286,9 @@ const struct expansionromtype expansionroms[] = {
                _T("rochard"), _T("RocHard RH800C"), _T("Roctec"),
                rochard_init, NULL, rochard_add_idescsi_unit, ROMTYPE_ROCHARD | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, false,
                rochard_sub, 0,
-               true, EXPANSIONTYPE_IDE | EXPANSIONTYPE_SCSI | EXPANSIONTYPE_IDE_PORT_DOUBLED,
-               2144, 2, 0
+               true, EXPANSIONTYPE_IDE | EXPANSIONTYPE_SCSI,
+               2144, 2, 0, false, NULL,
+               false, 2, NULL
        },
        {
                _T("supradrive"), _T("SupraDrive"), _T("Supra Corporation"),
@@ -4305,7 +4357,7 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                false, EXPANSIONTYPE_CUSTOM | EXPANSIONTYPE_SCSI,
                0, 0, 0, false, NULL,
-               false, NULL,
+               false, 0, NULL,
                { 0xc1, 0x04, 0x00, 0x00, 0x07, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
        },
        {
@@ -4339,8 +4391,7 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                false, EXPANSIONTYPE_IDE,
                0, 0, 0, false, NULL,
-               false,
-               x86_athdxt_settings
+               false, 0, x86_athdxt_settings
        },
 
        /* PC Bridgeboards */
@@ -4351,8 +4402,7 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                false, EXPANSIONTYPE_X86_BRIDGE,
                0, 0, 0, false, NULL,
-               false,
-               x86_bridge_sidecar_settings
+               false, 0, x86_bridge_sidecar_settings
        },
        {
                _T("a2088"), _T("A2088"), _T("Commodore"),
@@ -4360,8 +4410,7 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                false, EXPANSIONTYPE_X86_BRIDGE,
                0, 0, 0, false, NULL,
-               false,
-               x86_bridge_settings
+               false, 0, x86_bridge_settings
        },
        {
                _T("a2088t"), _T("A2088T"), _T("Commodore"),
@@ -4369,8 +4418,7 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                false, EXPANSIONTYPE_X86_BRIDGE,
                0, 0, 0, false, NULL,
-               false,
-               x86_bridge_settings
+               false, 0, x86_bridge_settings
        },
        {
                _T("a2286"), _T("A2286"), _T("Commodore"),
@@ -4378,8 +4426,7 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                false, EXPANSIONTYPE_X86_BRIDGE,
                0, 0, 0, false, NULL,
-               false,
-               x86at286_bridge_settings
+               false, 0, x86at286_bridge_settings
        },
        {
                _T("a2386"), _T("A2386SX"), _T("Commodore"),
@@ -4387,8 +4434,7 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                false, EXPANSIONTYPE_X86_BRIDGE,
                0, 0, 0, false, NULL,
-               false,
-               x86at386_bridge_settings
+               false, 0, x86at386_bridge_settings
        },
 
        // only here for rom selection
@@ -4413,7 +4459,7 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                false, EXPANSIONTYPE_SOUND,
                0, 0, 0, false, NULL,
-               false, toccata_soundcard_settings,
+               false, 0, toccata_soundcard_settings,
                { 0xc1, 12, 0, 0, 18260 >> 8, 18260 & 255 }
        },
        {
@@ -4434,7 +4480,7 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                false, EXPANSIONTYPE_SOUND,
                0, 0, 0, false, NULL,
-               false, NULL,
+               false, 0, NULL,
                { 0xc1, 2, 0x00, 0x00, 6502 >> 8, 6502 & 255, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
        },
        {
@@ -4443,7 +4489,7 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                false, EXPANSIONTYPE_SOUND,
                0, 0, 0, false, NULL,
-               false, NULL,
+               false, 0, NULL,
                { 0x80, 2, 0x10, 0x00, 6502 >> 8, 6502 & 255, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
        },
 
@@ -4466,6 +4512,14 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                false, EXPANSIONTYPE_NET
        },
+       {
+               _T("ne2000_isa"), _T("NE2000 ISA"), NULL,
+               isa_expansion_init, NULL, NULL, ROMTYPE_NE2KISA | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
+               NULL, 0,
+               false, EXPANSIONTYPE_NET,
+               0, 0, 0, false, NULL,
+               false, 0, ne2k_isa_settings
+       },
 
                /* Catweasel */
        {
index 4791bcd8a90a25af4628c7b7cd2d672e6fd550b2..87bf687511cfc76e14e734194846ca0812be3499 100644 (file)
--- a/gayle.cpp
+++ b/gayle.cpp
@@ -1766,7 +1766,7 @@ void gayle_add_ide_unit (int ch, struct uaedev_config_info *ci, struct romconfig
 
 bool gayle_ide_init(struct autoconfig_info *aci)
 {
-       aci->addrbank = &expamem_nonautoconfig;
+       aci->zorro = 0;
        if (aci->prefs->cs_ide == 1) {
                aci->start = GAYLE_BASE_1200;
                aci->size = 0x10000;
@@ -1789,7 +1789,7 @@ bool gayle_init_ne2000_pcmcia(struct autoconfig_info *aci)
 {
        aci->start = 0xa00000;
        aci->size = 0x1000;
-       aci->addrbank = &expamem_nonautoconfig;
+       aci->zorro = 0;
        aci->parent_address_space = true;
        return true;
 }
@@ -1827,7 +1827,7 @@ bool gayle_pcmcia_init(struct autoconfig_info *aci)
 {
        aci->start = 0x600000;
        aci->size = 0xa80000 - aci->start;
-       aci->addrbank = &expamem_nonautoconfig;
+       aci->zorro = 0;
        return true;
 }
 
index 8042268eb1731d8eac1468bfcf5ce2c58ddd66df..5198e589ec4d98b6b34a340e3aba9676cc947bec 100644 (file)
@@ -354,7 +354,7 @@ static void init_board (struct rtggfxboard *gb)
        gb->vram_offset[0] = gb->vram_offset[1] = 0;
        gb->vram_enabled = true;
        gb->vram_offset_enabled = false;
-       gb->gfxmem_bank->allocated = vramsize;
+       gb->gfxmem_bank->reserved_size = vramsize;
        gb->gfxmem_bank->start = gb->gfxboardmem_start;
        if (gb->board->manufacturer) {
                gb->gfxmem_bank->label = _T("*");
@@ -370,7 +370,8 @@ static void init_board (struct rtggfxboard *gb)
        gb->vram += gb->vram_start_offset;
        gb->vramend += gb->vram_start_offset;
        gb->gfxmem_bank->baseaddr = gb->vram;
-       gb->gfxmem_bank->allocated = rbc->rtgmem_size;
+       if (rbc->rtgmem_size < gb->gfxmem_bank->allocated_size)
+               gb->gfxmem_bank->allocated_size = rbc->rtgmem_size;
        gb->vga.vga.vram_size_mb = rbc->rtgmem_size >> 20;
        gb->vgaioregion.opaque = &gb->vgaioregionptr;
        gb->vgaioregion.data = gb;
@@ -1676,7 +1677,8 @@ static void copyvrambank(addrbank *dst, const addrbank *src)
        dst->start = src->start;
        dst->startmask = src->startmask;
        dst->mask = src->mask;
-       dst->allocated = src->allocated;
+       dst->allocated_size = src->allocated_size;
+       dst->reserved_size = src->reserved_size;
        dst->baseaddr = src->baseaddr;
        dst->flags = src->flags;
        dst->jit_read_flag = src->jit_read_flag;
@@ -1956,14 +1958,14 @@ static void REGPARAM2 gfxboard_bput_regs_autoconfig (uaecptr addr, uae_u32 b)
                gb->gfxboard_bank_registers.bput = gfxboard_bput_regs;
                if (gb->p4z2) {
                        ab = &gb->gfxboard_bank_special;
-                       map_banks_z2(ab, b, gb->gfxboard_bank_special.allocated >> 16);
+                       map_banks_z2(ab, b, gb->gfxboard_bank_special.reserved_size >> 16);
                        gb->io_start = b << 16;
-                       gb->io_end = gb->io_start + gb->gfxboard_bank_special.allocated;
+                       gb->io_end = gb->io_start + gb->gfxboard_bank_special.reserved_size;
                } else {
                        ab = &gb->gfxboard_bank_registers;
-                       map_banks_z2(ab, b, gb->gfxboard_bank_registers.allocated >> 16);
+                       map_banks_z2(ab, b, gb->gfxboard_bank_registers.reserved_size >> 16);
                        gb->io_start = b << 16;
-                       gb->io_end = gb->io_start + gb->gfxboard_bank_registers.allocated;
+                       gb->io_end = gb->io_start + gb->gfxboard_bank_registers.reserved_size;
                }
                gb->configured_regs = b;
                expamem_next (ab, NULL);
@@ -2662,10 +2664,9 @@ bool gfxboard_init_memory (struct autoconfig_info *aci)
 
        aci->label = gb->board->name;
        aci->direct_vram = true;
+       aci->addrbank = &gb->gfxboard_bank_memory;
        if (gb->rbc->rtgmem_type == GFXBOARD_VGA) {
-               aci->addrbank = &expamem_nonautoconfig;
-       } else {
-               aci->addrbank = &gb->gfxboard_bank_memory;
+               aci->zorro = 0;
        }
        aci->parent = aci;
        gb->configured_mem = -1;
@@ -2730,7 +2731,7 @@ bool gfxboard_init_registers (struct autoconfig_info *aci)
        ew (gb, 0x20, ser >>  8); /* ser.no. Byte 2 */
        ew (gb, 0x24, ser >>  0); /* ser.no. Byte 3 */
 
-       gb->gfxboard_bank_registers.allocated = BOARD_REGISTERS_SIZE;
+       gb->gfxboard_bank_registers.reserved_size = BOARD_REGISTERS_SIZE;
        gb->configured_regs = -1;
 
        if (ISP4()) {
@@ -2738,7 +2739,7 @@ bool gfxboard_init_registers (struct autoconfig_info *aci)
                copyp4autoconfig (gb, 128);
                loadp4rom (gb);
                v = (((gb->automemory[0] & 0xf0) | (gb->automemory[2] >> 4)) & 3) - 1;
-               gb->gfxboard_bank_special.allocated = 0x10000 << v;
+               gb->gfxboard_bank_special.reserved_size = 0x10000 << v;
        }
 
        gb->gfxboard_bank_registers.bget = gfxboard_bget_regs_autoconfig;
index fc943814063082d75a8612efe6d356b501395f57..32c7f49f3c5779cd69e71f0ed45e84d13e9a1fe8 100644 (file)
@@ -1759,9 +1759,9 @@ int scsi_hd_emulate (struct hardfiledata *hfd, struct hd_hardfiledata *hdhfd, ua
                ls = 0x12;
 #endif
                break;
-               case 0xe0: /* RAM DIAGNOSTICS */
-               case 0xe3: /* DRIVE DIAGNOSTIC */
-               case 0xe4: /* CONTROLLER INTERNAL DIAGNOSTICS */
+       case 0xe0: /* RAM DIAGNOSTICS */
+       case 0xe3: /* DRIVE DIAGNOSTIC */
+       case 0xe4: /* CONTROLLER INTERNAL DIAGNOSTICS */
                scsi_len = 0;
                break;
 readprot:
diff --git a/ide.cpp b/ide.cpp
index b91143fa9125f7ac6793bddeda3aeeb01eca977d..f4e11411cc57a6aaf4f148ac5c5c58f72279e050 100644 (file)
--- a/ide.cpp
+++ b/ide.cpp
@@ -693,7 +693,7 @@ static void do_packet_command (struct ide_hdf *ide)
                ide->regs.ide_status = 0;
                if (ide->scsi->status) {
                        // error
-                       ide->regs.ide_error = (ide->scsi->sense[2] << 4) | 4;
+                       ide->regs.ide_error = (ide->scsi->sense[2] << 4) | 4; // ABRT
                        atapi_data_done (ide);
                        ide->regs.ide_status |= ATAPI_STATUS_CHK;
                        atapi_set_size (ide);
@@ -1005,7 +1005,7 @@ static uae_u16 ide_get_data_2(struct ide_hdf *ide, int bussize)
                if (ide->data_offset == ide->packet_transfer_size) {
                        if (IDE_LOG > 1)
                                write_log (_T("IDE%d ATAPI partial read finished, %d bytes remaining\n"), ide->num, ide->data_size);
-                       if (ide->data_size == 0) {
+                       if (ide->data_size == 0 || ide->data_size == 1) { // 1 byte remaining: ignore, ATAPI has word transfer size.
                                ide->packet_state = 0;
                                atapi_data_done (ide);
                                if (IDE_LOG > 1)
index dc6c2545e01329671e4ff95ba534201c9b83cf45..24f76aef3fc7db3ac7ebb27be51e3c50d710421d 100644 (file)
@@ -44,7 +44,8 @@
 #define ROCHARD_IDE (PROTAR_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
 #define x86_AT_IDE (ROCHARD_IDE + 2 * MAX_DUPLICATE_EXPANSION_BOARDS)
 #define GOLEMFAST_IDE (x86_AT_IDE + 2 * MAX_DUPLICATE_EXPANSION_BOARDS)
-#define TOTAL_IDE (GOLEMFAST_IDE + MAX_DUPLICATE_EXPANSION_BOARDS)
+#define BUDDHA_IDE (GOLEMFAST_IDE + 2 * MAX_DUPLICATE_EXPANSION_BOARDS)
+#define TOTAL_IDE (BUDDHA_IDE + 3 * MAX_DUPLICATE_EXPANSION_BOARDS)
 
 #define ALF_ROM_OFFSET 0x0100
 #define GVP_IDE_ROM_OFFSET 0x8000
@@ -95,6 +96,7 @@ static struct ide_board *protar_board[MAX_DUPLICATE_EXPANSION_BOARDS];
 static struct ide_board *rochard_board[MAX_DUPLICATE_EXPANSION_BOARDS];
 static struct ide_board *x86_at_ide_board[MAX_DUPLICATE_EXPANSION_BOARDS];
 static struct ide_board *golemfast_board[MAX_DUPLICATE_EXPANSION_BOARDS];
+static struct ide_board *buddha_board[MAX_DUPLICATE_EXPANSION_BOARDS];
 
 static struct ide_hdf *idecontroller_drive[TOTAL_IDE * 2];
 static struct ide_thread_state idecontroller_its;
@@ -441,6 +443,18 @@ static int get_adide_reg(uaecptr addr, struct ide_board *board)
        return reg;
 }
 
+static int get_buddha_reg(uaecptr addr, struct ide_board *board, int *portnum)
+{
+       int reg = -1;
+       if (addr < 0x800 || addr >= 0xe00)
+               return reg;
+       *portnum = (addr - 0x800) / 0x200;
+       reg = (addr >> 2) & 15;
+       if (addr & 0x100)
+               reg |= IDE_SECONDARY;
+       return reg;
+}
+
 static int get_rochard_reg(uaecptr addr, struct ide_board *board, int *portnum)
 {
        int reg = -1;
@@ -487,7 +501,29 @@ static uae_u32 ide_read_byte(struct ide_board *board, uaecptr addr)
        if (addr < 0x40 && (!board->configured || board->keepautoconfig))
                return board->acmemory[addr];
 
-       if (board->type == ALF_IDE) {
+       if (board->type == BUDDHA_IDE) {
+
+               int portnum;
+               int regnum = get_buddha_reg(addr, board, &portnum);
+               if (regnum >= 0) {
+                       if (board->ide[portnum])
+                               v = get_ide_reg_multi(board, regnum, portnum, 1);
+               } else if (addr >= 0xf00 && addr < 0x1000) {
+                       if ((addr & ~3) == 0xf00)
+                               v = ide_irq_check(board->ide[0], false) ? 0x80 : 0x00;
+                       else if ((addr & ~3) == 0xf40)
+                               v = ide_irq_check(board->ide[1], false) ? 0x80 : 0x00;
+                       else if ((addr & ~3) == 0xf80)
+                               v = ide_irq_check(board->ide[2], false) ? 0x80 : 0x00;
+                       else
+                               v = 0;
+               } else if (addr >= 0x7fc && addr <= 0x7ff) {
+                       v = board->userdata;
+               } else {
+                       v = board->rom[addr & board->rom_mask];
+               }
+
+       } else if (board->type == ALF_IDE) {
 
                if (addr < 0x1100 || (addr & 1)) {
                        if (board->rom)
@@ -711,7 +747,19 @@ static uae_u32 ide_read_word(struct ide_board *board, uaecptr addr)
 
        if (board->configured) {
 
-               if (board->type == ALF_IDE) {
+               if (board->type == BUDDHA_IDE) {
+
+                       int portnum;
+                       int regnum = get_buddha_reg(addr, board, &portnum);
+                       if (regnum == IDE_DATA) {
+                               if (board->ide[portnum])
+                                       v = get_ide_reg_multi(board, IDE_DATA, portnum, 1);
+                       } else {
+                               v = ide_read_byte(board, addr) << 8;
+                               v |= ide_read_byte(board, addr + 1);
+                       }
+                       
+               } else if (board->type == ALF_IDE) {
 
                        int regnum = get_alf_reg(addr, board);
                        if (regnum == IDE_DATA) {
@@ -868,7 +916,23 @@ static void ide_write_byte(struct ide_board *board, uaecptr addr, uae_u8 v)
                }
        }
        if (board->configured) {
-               if (board->type == ALF_IDE) {
+
+               if (board->type == BUDDHA_IDE) {
+
+                       int portnum;
+                       int regnum = get_buddha_reg(addr, board, &portnum);
+                       if (regnum >= 0) {
+                               if (board->ide[portnum]) {
+                                       put_ide_reg_multi(board, regnum, v, portnum, 1);
+                               }
+                       } else if (addr >= 0xfc0 && addr < 0xfc4) {
+                               board->intena = true;
+                       } else if (addr >= 0x7fc && addr <= 0x7ff) {
+                               board->userdata = v;
+                       }
+
+               } else  if (board->type == ALF_IDE) {
+
                        int regnum = get_alf_reg(addr, board);
                        if (regnum >= 0)
                                put_ide_reg(board, regnum, v);
@@ -980,7 +1044,20 @@ static void ide_write_word(struct ide_board *board, uaecptr addr, uae_u16 v)
        write_log(_T("IDE IO WORD WRITE %08x=%04x %08x\n"), addr, v, M68K_GETPC);
 #endif
        if (board->configured) {
-               if (board->type == ALF_IDE) {
+
+               if (board->type == BUDDHA_IDE) {
+
+                       int portnum;
+                       int regnum = get_buddha_reg(addr, board, &portnum);
+                       if (regnum == IDE_DATA) {
+                               if (board->ide[portnum])
+                                       put_ide_reg_multi(board, IDE_DATA, v, portnum, 1);
+                       } else {
+                               ide_write_byte(board, addr, v >> 8);
+                               ide_write_byte(board, addr + 1, v);
+                       }
+
+               } else if (board->type == ALF_IDE) {
 
                        int regnum = get_alf_reg(addr, board);
                        if (regnum == IDE_DATA) {
@@ -1573,6 +1650,7 @@ bool mtec_init(struct autoconfig_info *aci)
 
        ide->rom = rom;
        ide->rom_size = rom_size;
+       ide->rom_mask = rom_size - 1;
        memcpy(ide->acmemory, ide->rom, sizeof ide->acmemory);
 
        aci->addrbank = ide->bank;
@@ -1612,6 +1690,40 @@ static void rochard_add_ide_unit(int ch, struct uaedev_config_info *ci, struct r
        add_ide_standard_unit(ch, ci, rc, rochard_board, ROCHARD_IDE, false, false, 4);
 }
 
+bool buddha_init(struct autoconfig_info *aci)
+{
+       const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_BUDDHA);
+
+       if (!aci->doinit) {
+               aci->autoconfigp = ert->autoconfig;
+               return true;
+       }
+       struct ide_board *ide = getide(aci->rc);
+
+       ide->configured = 0;
+       ide->bank = &ide_bank_generic;
+       ide->rom_size = 65536;
+       ide->mask = 65536 - 1;
+
+       ide->rom = xcalloc(uae_u8, ide->rom_size);
+       memset(ide->rom, 0xff, ide->rom_size);
+       ide->rom_mask = ide->rom_size - 1;
+       load_rom_rc(aci->rc, ROMTYPE_BUDDHA, 32768, 0, ide->rom, 65536, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
+       for (int i = 0; i < 16; i++) {
+               uae_u8 b = ert->autoconfig[i];
+               if (i == 1 && (aci->rc->device_settings & 1))
+                       b = 42;
+               ew(ide, i * 4, b);
+       }
+       aci->addrbank = ide->bank;
+       return true;
+}
+
+void buddha_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
+{
+       add_ide_standard_unit(ch, ci, rc, buddha_board, BUDDHA_IDE, false, false, 6);
+}
+
 void rochard_add_idescsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
 {
        if (ch < 0) {
index 945babfbabb0eefbd0d11e56f137e697763e893d..89685479cfe4381643ee9265e3e235cbbc726340 100644 (file)
@@ -168,20 +168,19 @@ typedef void(*DEVICE_MEMORY_CALLBACK)(struct romconfig*, uae_u8*, int);
 #define EXPANSIONTYPE_SCSI 1
 #define EXPANSIONTYPE_IDE 2
 #define EXPANSIONTYPE_24BIT 4
-#define EXPANSIONTYPE_IDE_PORT_DOUBLED 8
 #define EXPANSIONTYPE_SASI 16
 #define EXPANSIONTYPE_CUSTOM 32
 #define EXPANSIONTYPE_PCI_BRIDGE 64
 #define EXPANSIONTYPE_PARALLEL_ADAPTER 128
-#define EXPANSIONTYPE_X86_BRIDGE 256
-#define EXPANSIONTYPE_CUSTOM_SECONDARY 512
-#define EXPANSIONTYPE_RTG 1024
-#define EXPANSIONTYPE_SOUND 2048
-#define EXPANSIONTYPE_FLOPPY 4096
-#define EXPANSIONTYPE_NET 8192
-#define EXPANSIONTYPE_INTERNAL 16384
-#define EXPANSIONTYPE_FALLBACK_DISABLE 32768
-#define EXPANSIONTYPE_HAS_FALLBACK 65536
+#define EXPANSIONTYPE_X86_BRIDGE 0x100
+#define EXPANSIONTYPE_CUSTOM_SECONDARY 0x200
+#define EXPANSIONTYPE_RTG 0x400
+#define EXPANSIONTYPE_SOUND 0x800
+#define EXPANSIONTYPE_FLOPPY 0x1000
+#define EXPANSIONTYPE_NET 0x2000
+#define EXPANSIONTYPE_INTERNAL 0x4000
+#define EXPANSIONTYPE_FALLBACK_DISABLE 0x8000
+#define EXPANSIONTYPE_HAS_FALLBACK 0x10000
 
 struct expansionboardsettings
 {
@@ -222,6 +221,7 @@ struct expansionromtype
        bool memory_after;
        DEVICE_MEMORY_CALLBACK memory_callback;
        bool id_jumper;
+       int extrahdports;
        const struct expansionboardsettings *settings;
        uae_u8 autoconfig[16];
 };
index db5a37197ad27c80dd9c7bbfe61471e423077160..f28e02fe9d1b3c56056ec926d5c33b165e46bf53 100644 (file)
@@ -74,7 +74,7 @@ extern void DISK_hsync (void);
 extern void DISK_reset (void);
 extern int disk_getwriteprotect (struct uae_prefs *p, const TCHAR *name);
 extern int disk_setwriteprotect (struct uae_prefs *p, int num, const TCHAR *name, bool writeprotected);
-extern bool disk_creatediskfile (const TCHAR *name, int type, drive_type adftype, const TCHAR *disk_name, bool ffs, bool bootable, struct zfile *copyfrom);
+extern bool disk_creatediskfile (struct uae_prefs *p, const TCHAR *name, int type, drive_type adftype, const TCHAR *disk_name, bool ffs, bool bootable, struct zfile *copyfrom);
 extern void dumpdisk (const TCHAR*);
 extern int DISK_history_add (const TCHAR *name, int idx, int type, int donotcheck);
 extern TCHAR *DISK_history_get (int idx, int type);
index d58b65c3eb17d8da185e20e35075ca5d05fe95d8..06ae06b310f1da7731a938e19276cab9a56416f2 100644 (file)
@@ -27,7 +27,7 @@ struct ide_registers
 struct ide_thread_state;
 struct ide_hdf;
 
-#define MAX_IDE_PORTS_BOARD 2
+#define MAX_IDE_PORTS_BOARD 3
 struct ide_board
 {
        uae_u8 *rom;
index c83784558746e26ee568c2717c7200b8df5189b8..a4e5396b3383cd691bb7b0a504c037105b77cf0b 100644 (file)
@@ -36,6 +36,9 @@ void rochard_add_idescsi_unit(int ch, struct uaedev_config_info *ci, struct romc
 bool golemfast_init(struct autoconfig_info *aci);
 void golemfast_add_idescsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 
+bool buddha_init(struct autoconfig_info *aci);
+void buddha_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
+
 uae_u32 REGPARAM3 apollo_ide_lget (uaecptr addr) REGPARAM;
 uae_u32 REGPARAM3 apollo_ide_wget (uaecptr addr) REGPARAM;
 uae_u32 REGPARAM3 apollo_ide_bget (uaecptr addr) REGPARAM;
index de15ede3552a844beb2bbd95a2c50790cb5d3fc8..50f1501686d308bda1e84cd873242e624de46a9f 100644 (file)
@@ -111,7 +111,10 @@ typedef struct {
        uae_u32 mask;
        uae_u32 startmask;
        uae_u32 start;
-       uae_u32 allocated;
+       // if RAM: size of allocated RAM. Zero if failed.
+       uae_u32 allocated_size;
+       // size of bank (if IO or before RAM allocation)
+       uae_u32 reserved_size;
 } addrbank;
 
 #define MEMORY_MIN_SUBBANK 1024
@@ -223,7 +226,7 @@ static int REGPARAM2 name ## _check (uaecptr addr, uae_u32 size) \
 { \
        addr -= name ## _bank.start & name ## _bank.mask; \
        addr &= name ## _bank.mask; \
-       return (addr + size) <= name ## _bank.allocated; \
+       return (addr + size) <= name ## _bank.allocated_size; \
 }
 #define MEMORY_XLATE(name) \
 static uae_u8 *REGPARAM3 name ## _xlate (uaecptr addr) REGPARAM; \
@@ -331,7 +334,7 @@ static int REGPARAM2 name ## index ## _check (uaecptr addr, uae_u32 size) \
 { \
        addr -= name ## _bank[index].start & name ## _bank[index].mask; \
        addr &= name ## _bank[index].mask; \
-       return (addr + size) <= name ## _bank[index].allocated; \
+       return (addr + size) <= name ## _bank[index].allocated_size; \
 }
 #define MEMORY_ARRAY_XLATE(name, index) \
 static uae_u8 *REGPARAM3 name ## index ## _xlate (uaecptr addr) REGPARAM; \
@@ -363,7 +366,7 @@ extern addrbank rtarea_bank;
 extern addrbank filesys_bank;
 extern addrbank uaeboard_bank;
 extern addrbank expamem_bank;
-extern addrbank expamem_null, expamem_none, expamem_nonautoconfig;
+extern addrbank expamem_null, expamem_none;
 extern addrbank fastmem_bank[MAX_RAM_BOARDS];
 extern addrbank fastmem_nojit_bank[MAX_RAM_BOARDS];
 extern addrbank *gfxmem_banks[MAX_RTG_BOARDS];
index dce014823cbae001c5bd272c24784a631c981976..f1742ddd61371ab0a732c0ea855c4379b94a472c 100644 (file)
@@ -38,8 +38,10 @@ void ncr_golemfast_autoconfig_init(struct romconfig*, uaecptr);
 #define BLIZZARD_2060_DMA_OFFSET 0x1fff0
 #define BLIZZARD_2060_LED_OFFSET 0x1ffe0
 
-#define BLIZZARD_SCSI_KIT_SCSI_OFFSET 0x8000
-#define BLIZZARD_SCSI_KIT_DMA_OFFSET 0x10000
+#define BLIZZARD_SCSI_KIT4_SCSI_OFFSET 0x8000
+#define BLIZZARD_SCSI_KIT4_DMA_OFFSET 0x10000
+
+#define BLIZZARD_SCSI_KIT3_SCSI_OFFSET 0x10000
 
 #define CYBERSTORM_MK2_SCSI_OFFSET 0x1ff03
 #define CYBERSTORM_MK2_LED_OFFSET 0x1ff43
index ffb4d8241702f70d6784df4a075441fe1fed4757..2bedf24793d515db00f9f05aef7b5b21f51c41a7 100644 (file)
@@ -129,6 +129,9 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size);
 #define ROMTYPE_CDTVDMAC       0x0010004c
 #define ROMTYPE_CDTVCR         0x0010004d
 #define ROMTYPE_IVSVECTOR      0x0010004e
+#define ROMTYPE_BUDDHA         0x0010004f
+#define ROMTYPE_NE2KISA                0x00100050
+#define ROMTYPE_BLIZKIT3       0x00100051
 
 #define ROMTYPE_NOT                    0x00800000
 #define ROMTYPE_QUAD           0x01000000
index 0fce62cf228a0cabf0cb1ac60368170fd0fc9cec..7c1d9ddbfa4485627afa68510ed679cc62bcb3f3 100644 (file)
@@ -1,11 +1,12 @@
 #ifndef UAE_X86_H
 #define UAE_X86_H
 
-extern bool a1060_init(struct autoconfig_info *aci);
-extern bool a2088xt_init(struct autoconfig_info *aci);
-extern bool a2088t_init(struct autoconfig_info *aci);
-extern bool a2286_init(struct autoconfig_info *aci);
-extern bool a2386_init(struct autoconfig_info *aci);
+bool a1060_init(struct autoconfig_info *aci);
+bool a2088xt_init(struct autoconfig_info *aci);
+bool a2088t_init(struct autoconfig_info *aci);
+bool a2286_init(struct autoconfig_info *aci);
+bool a2386_init(struct autoconfig_info *aci);
+bool isa_expansion_init(struct autoconfig_info *aci);
 void x86_bridge_hsync(void);
 void x86_bridge_vsync(void);
 void x86_bridge_reset(void);
index c36cdf78bdbb7c24f4630f14f3230d45fed75731..c9edf60c47a7e1215d398d54cb01fd8032c2c75e 100644 (file)
@@ -21,8 +21,6 @@ static uae_u8 *veccode;
 
 #if defined(JIT_DEBUG)
 #define DEBUG_ACCESS
-#elif defined(CPU_x86_64)
-#define DEBUG_ACCESS
 #endif
 
 #if defined(_WIN32) && defined(CPU_x86_64)
@@ -420,8 +418,7 @@ static int handle_access(uintptr_t fault_addr, CONTEXT_T context)
 
        uae_u32 addr = uae_p32(fault_addr) - uae_p32(NATMEM_OFFSET);
 #ifdef DEBUG_ACCESS
-       if ((addr >= 0x10000000 && addr < 0x40000000) ||
-               (addr >= 0x50000000)) {
+       if (addr >= 0x80000000) {
                        write_log (_T("JIT: Suspicious address 0x%x in SEGV handler.\n"), addr);
        }
        addrbank *ab = &get_mem_bank(addr);
index e0d32f6b09f25d27ebf5f40ca10662518eeb57f3..d69c4cc5039690a6feaafc1891e37cb11ed360d7 100644 (file)
@@ -653,10 +653,10 @@ bool tms_init(struct autoconfig_info *aci)
        xfree(program_ram);
 
        gfxmem_banks[a2410_gfxboard]->label = _T("ram_a8");
-       gfxmem_banks[a2410_gfxboard]->allocated = 1 * 1024 * 1024;
+       gfxmem_banks[a2410_gfxboard]->reserved_size = 1 * 1024 * 1024;
        gfxboard_get_a8_vram(a2410_gfxboard);
 
-       picasso_allocatewritewatch(a2410_gfxboard, gfxmem_banks[a2410_gfxboard]->allocated);
+       picasso_allocatewritewatch(a2410_gfxboard, gfxmem_banks[a2410_gfxboard]->allocated_size);
        gfxmem_banks[a2410_gfxboard]->start = 0xa80000;
 
        program_ram = xcalloc(uae_u8, 1 * 1024 * 1024);
index 1b17c8cb3641cb45964aed89e0b418e2cbc2a63f..20abc3df5afaf71b5b58241a4f2851cffe859c64 100644 (file)
@@ -73,6 +73,9 @@ static bool needmman (void)
 
 static void nocanbang (void)
 {
+       if (canbang) {
+               write_log(_T("Switching JIT direct off!\n"));
+       }
        canbang = 0;
 }
 
@@ -1132,7 +1135,7 @@ void a3000_fakekick (int map)
 
        protect_roms (false);
        if (map) {
-               uae_u8 *fkickmemory = a3000lmem_bank.baseaddr + a3000lmem_bank.allocated - fkickmem_size;
+               uae_u8 *fkickmemory = a3000lmem_bank.baseaddr + a3000lmem_bank.reserved_size - fkickmem_size;
                if (fkickmemory[2] == 0x4e && fkickmemory[3] == 0xf9 && fkickmemory[4] == 0x00) {
                        if (!kickstore)
                                kickstore = xmalloc (uae_u8, fkickmem_size);
@@ -1140,9 +1143,9 @@ void a3000_fakekick (int map)
                        if (fkickmemory[5] == 0xfc) {
                                memcpy (kickmem_bank.baseaddr, fkickmemory, fkickmem_size / 2);
                                memcpy (kickmem_bank.baseaddr + fkickmem_size / 2, fkickmemory, fkickmem_size / 2);
-                               extendedkickmem_bank.allocated = 65536;
+                               extendedkickmem_bank.reserved_size = 65536;
                                extendedkickmem_bank.label = _T("rom_f0");
-                               extendedkickmem_bank.mask = extendedkickmem_bank.allocated - 1;
+                               extendedkickmem_bank.mask = extendedkickmem_bank.reserved_size - 1;
                                mapped_malloc (&extendedkickmem_bank);
                                memcpy (extendedkickmem_bank.baseaddr, fkickmemory + fkickmem_size / 2, 65536);
                                map_banks (&extendedkickmem_bank, 0xf0, 1, 1);
@@ -1236,7 +1239,7 @@ static int read_kickstart (struct zfile *f, uae_u8 *mem, int size, int dochecksu
                        memcpy (a1000_bootrom + off, kickmem_bank.baseaddr, i);
                        off += i;
                }
-               memset (kickmem_bank.baseaddr, 0, kickmem_bank.allocated);
+               memset (kickmem_bank.baseaddr, 0, kickmem_bank.allocated_size);
                a1000_handle_kickstart (1);
                dochecksum = 0;
                i = ROM_SIZE_512;
@@ -1273,7 +1276,7 @@ static bool load_extendedkickstart (const TCHAR *romextfile, int type)
        }
        zfile_fseek (f, 0, SEEK_END);
        size = zfile_ftell (f);
-       extendedkickmem_bank.allocated = ROM_SIZE_512;
+       extendedkickmem_bank.reserved_size = ROM_SIZE_512;
        off = 0;
        if (type == 0) {
                if (currprefs.cs_cd32cd) {
@@ -1303,8 +1306,8 @@ static bool load_extendedkickstart (const TCHAR *romextfile, int type)
                        break;
                }
                if (extendedkickmem_bank.baseaddr) {
-                       read_kickstart (f, extendedkickmem_bank.baseaddr, extendedkickmem_bank.allocated, 0, 1);
-                       extendedkickmem_bank.mask = extendedkickmem_bank.allocated - 1;
+                       read_kickstart (f, extendedkickmem_bank.baseaddr, extendedkickmem_bank.allocated_size, 0, 1);
+                       extendedkickmem_bank.mask = extendedkickmem_bank.allocated_size - 1;
                        ret = true;
                }
        }
@@ -1374,16 +1377,16 @@ static int patch_residents (uae_u8 *kickmemory, int size)
 static void patch_kick (void)
 {
        int patched = 0;
-       if (kickmem_bank.allocated >= ROM_SIZE_512 && currprefs.kickshifter)
+       if (kickmem_bank.allocated_size >= ROM_SIZE_512 && currprefs.kickshifter)
                patched += patch_shapeshifter (kickmem_bank.baseaddr);
-       patched += patch_residents (kickmem_bank.baseaddr, kickmem_bank.allocated);
+       patched += patch_residents (kickmem_bank.baseaddr, kickmem_bank.allocated_size);
        if (extendedkickmem_bank.baseaddr) {
-               patched += patch_residents (extendedkickmem_bank.baseaddr, extendedkickmem_bank.allocated);
+               patched += patch_residents (extendedkickmem_bank.baseaddr, extendedkickmem_bank.allocated_size);
                if (patched)
-                       kickstart_fix_checksum (extendedkickmem_bank.baseaddr, extendedkickmem_bank.allocated);
+                       kickstart_fix_checksum (extendedkickmem_bank.baseaddr, extendedkickmem_bank.allocated_size);
        }
        if (patched)
-               kickstart_fix_checksum (kickmem_bank.baseaddr, kickmem_bank.allocated);
+               kickstart_fix_checksum (kickmem_bank.baseaddr, kickmem_bank.allocated_size);
 }
 
 extern unsigned char arosrom[];
@@ -1399,7 +1402,7 @@ static bool load_kickstart_replacement (void)
        if (!f)
                return false;
 
-       extendedkickmem_bank.allocated = ROM_SIZE_512;
+       extendedkickmem_bank.reserved_size = ROM_SIZE_512;
        extendedkickmem_bank.mask = ROM_SIZE_512 - 1;
        extendedkickmem_bank.label = _T("rom_e0");
        extendedkickmem_type = EXTENDED_ROM_KS;
@@ -1407,7 +1410,7 @@ static bool load_kickstart_replacement (void)
        read_kickstart (f, extendedkickmem_bank.baseaddr, ROM_SIZE_512, 0, 1);
 
 
-       kickmem_bank.allocated = ROM_SIZE_512;
+       kickmem_bank.reserved_size = ROM_SIZE_512;
        kickmem_bank.mask = ROM_SIZE_512 - 1;
        read_kickstart (f, kickmem_bank.baseaddr, ROM_SIZE_512, 1, 0);
 
@@ -1504,12 +1507,12 @@ static int load_kickstart (void)
                if (size == 0)
                        goto err;
                kickmem_bank.mask = size - 1;
-               kickmem_bank.allocated = size;
+               kickmem_bank.reserved_size = size;
                if (filesize >= ROM_SIZE_512 * 2 && !extendedkickmem_type) {
-                       extendedkickmem_bank.allocated = ROM_SIZE_512;
+                       extendedkickmem_bank.reserved_size = ROM_SIZE_512;
                        if (currprefs.cs_cdtvcd || currprefs.cs_cdtvram) {
                                extendedkickmem_type = EXTENDED_ROM_CDTV;
-                               extendedkickmem_bank.allocated *= 2;
+                               extendedkickmem_bank.reserved_size *= 2;
                                extendedkickmem_bank.label = _T("rom_f0");
                                extendedkickmem_bank.start = 0xf00000;
                        } else {
@@ -1519,17 +1522,17 @@ static int load_kickstart (void)
                        }
                        mapped_malloc (&extendedkickmem_bank);
                        zfile_fseek (f, extpos, SEEK_SET);
-                       read_kickstart (f, extendedkickmem_bank.baseaddr, extendedkickmem_bank.allocated, 0, 1);
-                       extendedkickmem_bank.mask = extendedkickmem_bank.allocated - 1;
+                       read_kickstart (f, extendedkickmem_bank.baseaddr, extendedkickmem_bank.allocated_size, 0, 1);
+                       extendedkickmem_bank.mask = extendedkickmem_bank.allocated_size - 1;
                }
                if (filesize > ROM_SIZE_512 * 2) {
-                       extendedkickmem2_bank.allocated = ROM_SIZE_512 * 2;
+                       extendedkickmem2_bank.reserved_size = ROM_SIZE_512 * 2;
                        mapped_malloc (&extendedkickmem2_bank);
                        zfile_fseek (f, extpos + ROM_SIZE_512, SEEK_SET);
                        read_kickstart (f, extendedkickmem2_bank.baseaddr, ROM_SIZE_512, 0, 1);
                        zfile_fseek (f, extpos + ROM_SIZE_512 * 2, SEEK_SET);
                        read_kickstart (f, extendedkickmem2_bank.baseaddr + ROM_SIZE_512, ROM_SIZE_512, 0, 1);
-                       extendedkickmem2_bank.mask = extendedkickmem2_bank.allocated - 1;
+                       extendedkickmem2_bank.mask = extendedkickmem2_bank.allocated_size - 1;
                        extendedkickmem2_bank.start = 0xa80000;
                }
        }
@@ -1558,13 +1561,15 @@ err:
 bool mapped_malloc (addrbank *ab)
 {
        ab->startmask = ab->start;
-       ab->baseaddr = xcalloc (uae_u8, ab->allocated + 4);
+       ab->baseaddr = xcalloc (uae_u8, ab->reserved_size + 4);
+       ab->allocated_size =  ab->baseaddr != NULL ? ab->reserved_size : 0;
        return ab->baseaddr != NULL;
 }
 
 void mapped_free (addrbank *ab)
 {
        xfree(ab->baseaddr);
+       ab->allocated_size = 0;
        ab->baseaddr = NULL;
 }
 
@@ -1652,6 +1657,9 @@ static void add_shmmaps (uae_u32 start, addrbank *what)
        if (!base)
                return;
 
+       if (what->jit_read_flag && what->jit_write_flag)
+               return;
+
        x = find_shmpiece (base, false);
        if (!x)
                return;
@@ -1683,6 +1691,11 @@ bool mapped_malloc (addrbank *ab)
        bool rtgmem = (ab->flags & ABFLAG_RTG) != 0;
        static int recurse;
 
+       if (ab->allocated_size) {
+               write_log(_T("mapped_malloc with memory bank '%s' already allocated!?"), ab->name);
+       }
+       ab->allocated_size = 0;
+
        if (ab->label && ab->label[0] == '*') {
                if (ab->start == 0 || ab->start == 0xffffffff) {
                        write_log(_T("mapped_malloc(*) without start address!\n"));
@@ -1690,23 +1703,30 @@ bool mapped_malloc (addrbank *ab)
                }
        }
 
-       struct uae_mman_data md;
+       struct uae_mman_data md = { 0 };
        uaecptr start = ab->start;
        if (uae_mman_info(ab, &md)) {
                start = md.start;
        }
        ab->startmask = start;
        if (!md.directsupport || (ab->flags & ABFLAG_ALLOCINDIRECT)) {
-               if (!(ab->flags & ABFLAG_ALLOCINDIRECT))
-                       nocanbang ();
+               if (!(ab->flags & ABFLAG_ALLOCINDIRECT)) {
+                       if (canbang) {
+                               write_log(_T("JIT direct switched off: %s\n"), ab->name);
+                       }
+                       nocanbang();
+               }
                ab->flags &= ~ABFLAG_DIRECTMAP;
                if (ab->flags & ABFLAG_NOALLOC) {
+                       ab->allocated_size = ab->reserved_size;
 #if MAPPED_MALLOC_DEBUG
                        write_log(_T("mapped_malloc noalloc %s\n"), ab->name);
 #endif
                        return true;
                }
-               ab->baseaddr = xcalloc (uae_u8, ab->allocated + 4);
+               ab->baseaddr = xcalloc (uae_u8, ab->reserved_size + 4);
+               if (ab->baseaddr)
+                       ab->allocated_size = ab->reserved_size;
 #if MAPPED_MALLOC_DEBUG
                write_log(_T("mapped_malloc nodirect %s %p\n"), ab->name, ab->baseaddr);
 #endif
@@ -1734,7 +1754,7 @@ bool mapped_malloc (addrbank *ab)
                x = xmalloc (shmpiece, 1);
                x->native_address = (uae_u8*)answer;
                x->id = id;
-               x->size = ab->allocated;
+               x->size = ab->reserved_size;
                x->name = ab->label;
                x->next = shm_start;
                x->prev = NULL;
@@ -1742,6 +1762,8 @@ bool mapped_malloc (addrbank *ab)
                        x->next->prev = x;
                shm_start = x;
                ab->baseaddr = x->native_address;
+               if (ab->baseaddr)
+                       ab->allocated_size = ab->reserved_size;
                ab->flags |= ABFLAG_DIRECTMAP;
 #if MAPPED_MALLOC_DEBUG
                write_log(_T("mapped_malloc direct %s %p\n"), ab->name, ab->baseaddr);
@@ -1784,7 +1806,7 @@ static void allocate_memory (void)
        bogomem_aliasing = 0;
 
        bool bogoreset = (bogomem_bank.flags & ABFLAG_NOALLOC) != 0 &&
-               (chipmem_bank.allocated != currprefs.chipmem_size || bogomem_bank.allocated != currprefs.bogomem_size);
+               (chipmem_bank.reserved_size != currprefs.chipmem_size || bogomem_bank.reserved_size != currprefs.bogomem_size);
 
        if (bogoreset) {
                mapped_free(&chipmem_bank);
@@ -1794,27 +1816,27 @@ static void allocate_memory (void)
        /* emulate 0.5M+0.5M with 1M Agnus chip ram aliasing */
        if (currprefs.chipmem_size == 0x80000 && currprefs.bogomem_size >= 0x80000 &&
                (currprefs.chipset_mask & CSMASK_ECS_AGNUS) && !(currprefs.chipset_mask & CSMASK_AGA) && currprefs.cpu_model < 68020) {
-                       if ((chipmem_bank.allocated != currprefs.chipmem_size || bogomem_bank.allocated != currprefs.bogomem_size)) {
+                       if ((chipmem_bank.reserved_size != currprefs.chipmem_size || bogomem_bank.reserved_size != currprefs.bogomem_size)) {
                                int memsize1, memsize2;
                                mapped_free (&chipmem_bank);
                                mapped_free (&bogomem_bank);
-                               bogomem_bank.allocated = 0;
-                               memsize1 = chipmem_bank.allocated = currprefs.chipmem_size;
-                               memsize2 = bogomem_bank.allocated = currprefs.bogomem_size;
-                               chipmem_bank.mask = chipmem_bank.allocated - 1;
+                               bogomem_bank.reserved_size = 0;
+                               memsize1 = chipmem_bank.reserved_size = currprefs.chipmem_size;
+                               memsize2 = bogomem_bank.reserved_size = currprefs.bogomem_size;
+                               chipmem_bank.mask = chipmem_bank.reserved_size - 1;
                                chipmem_bank.start = chipmem_start_addr;
-                               chipmem_full_mask = bogomem_bank.allocated * 2 - 1;
+                               chipmem_full_mask = bogomem_bank.reserved_size * 2 - 1;
                                chipmem_full_size = 0x80000 * 2;
-                               chipmem_bank.allocated = memsize1 + memsize2;
+                               chipmem_bank.reserved_size = memsize1 + memsize2;
                                mapped_malloc (&chipmem_bank);
-                               chipmem_bank.allocated = currprefs.chipmem_size;
+                               chipmem_bank.reserved_size = currprefs.chipmem_size;
                                bogomem_bank.baseaddr = chipmem_bank.baseaddr + memsize1;
-                               bogomem_bank.mask = bogomem_bank.allocated - 1;
+                               bogomem_bank.mask = bogomem_bank.reserved_size - 1;
                                bogomem_bank.start = bogomem_start_addr;
                                bogomem_bank.flags |= ABFLAG_NOALLOC;
                                if (chipmem_bank.baseaddr == 0) {
                                        write_log (_T("Fatal error: out of memory for chipmem.\n"));
-                                       chipmem_bank.allocated = 0;
+                                       chipmem_bank.reserved_size = 0;
                                } else {
                                        need_hardreset = true;
                                }
@@ -1822,27 +1844,27 @@ static void allocate_memory (void)
                        bogomem_aliasing = 1;
        } else if (currprefs.chipmem_size == 0x80000 && currprefs.bogomem_size >= 0x80000 &&
                !(currprefs.chipset_mask & CSMASK_ECS_AGNUS) && currprefs.cs_1mchipjumper && currprefs.cpu_model < 68020) {
-                       if ((chipmem_bank.allocated != currprefs.chipmem_size || bogomem_bank.allocated != currprefs.bogomem_size)) {
+                       if ((chipmem_bank.reserved_size != currprefs.chipmem_size || bogomem_bank.reserved_size != currprefs.bogomem_size)) {
                                int memsize1, memsize2;
                                mapped_free (&chipmem_bank);
                                mapped_free (&bogomem_bank);
-                               bogomem_bank.allocated = 0;
-                               memsize1 = chipmem_bank.allocated = currprefs.chipmem_size;
-                               memsize2 = bogomem_bank.allocated = currprefs.bogomem_size;
-                               chipmem_bank.mask = chipmem_bank.allocated - 1;
+                               bogomem_bank.reserved_size = 0;
+                               memsize1 = chipmem_bank.reserved_size = currprefs.chipmem_size;
+                               memsize2 = bogomem_bank.reserved_size = currprefs.bogomem_size;
+                               chipmem_bank.mask = chipmem_bank.reserved_size - 1;
                                chipmem_bank.start = chipmem_start_addr;
-                               chipmem_full_mask = chipmem_bank.allocated - 1;
-                               chipmem_full_size = chipmem_bank.allocated;
-                               chipmem_bank.allocated = memsize1 + memsize2;
+                               chipmem_full_mask = chipmem_bank.reserved_size - 1;
+                               chipmem_full_size = chipmem_bank.reserved_size;
+                               chipmem_bank.reserved_size = memsize1 + memsize2;
                                mapped_malloc (&chipmem_bank);
-                               chipmem_bank.allocated = currprefs.chipmem_size;
+                               chipmem_bank.reserved_size = currprefs.chipmem_size;
                                bogomem_bank.baseaddr = chipmem_bank.baseaddr + memsize1;
-                               bogomem_bank.mask = bogomem_bank.allocated - 1;
+                               bogomem_bank.mask = bogomem_bank.reserved_size - 1;
                                bogomem_bank.start = chipmem_bank.start + currprefs.chipmem_size;
                                bogomem_bank.flags |= ABFLAG_NOALLOC;
                                if (chipmem_bank.baseaddr == 0) {
                                        write_log (_T("Fatal error: out of memory for chipmem.\n"));
-                                       chipmem_bank.allocated = 0;
+                                       chipmem_bank.reserved_size = 0;
                                } else {
                                        need_hardreset = true;
                                }
@@ -1850,36 +1872,36 @@ static void allocate_memory (void)
                        bogomem_aliasing = 2;
        }
 
-       if (chipmem_bank.allocated != currprefs.chipmem_size || bogoreset) {
+       if (chipmem_bank.reserved_size != currprefs.chipmem_size || bogoreset) {
                int memsize;
                mapped_free (&chipmem_bank);
                chipmem_bank.flags &= ~ABFLAG_NOALLOC;
 
-               memsize = chipmem_bank.allocated = chipmem_full_size = currprefs.chipmem_size;
-               chipmem_full_mask = chipmem_bank.mask = chipmem_bank.allocated - 1;
+               memsize = chipmem_bank.reserved_size = chipmem_full_size = currprefs.chipmem_size;
+               chipmem_full_mask = chipmem_bank.mask = chipmem_bank.reserved_size - 1;
                chipmem_bank.start = chipmem_start_addr;
                if (!currprefs.cachesize && memsize < 0x100000)
                        memsize = 0x100000;
                if (memsize > 0x100000 && memsize < 0x200000)
                        memsize = 0x200000;
-               chipmem_bank.allocated = memsize;
+               chipmem_bank.reserved_size = memsize;
                mapped_malloc (&chipmem_bank);
-               chipmem_bank.allocated = currprefs.chipmem_size;
+               chipmem_bank.reserved_size = currprefs.chipmem_size;
                if (chipmem_bank.baseaddr == 0) {
                        write_log (_T("Fatal error: out of memory for chipmem.\n"));
-                       chipmem_bank.allocated = 0;
+                       chipmem_bank.reserved_size = 0;
                } else {
                        need_hardreset = true;
-                       if (memsize > chipmem_bank.allocated)
-                               memset (chipmem_bank.baseaddr + chipmem_bank.allocated, 0xff, memsize - chipmem_bank.allocated);
+                       if (memsize > chipmem_bank.allocated_size)
+                               memset (chipmem_bank.baseaddr + chipmem_bank.allocated_size, 0xff, memsize - chipmem_bank.allocated_size);
                }
                currprefs.chipset_mask = changed_prefs.chipset_mask;
-               chipmem_full_mask = chipmem_bank.allocated - 1;
+               chipmem_full_mask = chipmem_bank.allocated_size - 1;
                if (!currprefs.cachesize) {
                        if (currprefs.chipset_mask & CSMASK_ECS_AGNUS) {
-                               if (chipmem_bank.allocated < 0x100000)
+                               if (chipmem_bank.allocated_size < 0x100000)
                                        chipmem_full_mask = 0x100000 - 1;
-                               if (chipmem_bank.allocated > 0x100000 && chipmem_bank.allocated < 0x200000)
+                               if (chipmem_bank.allocated_size > 0x100000 && chipmem_bank.allocated_size < 0x200000)
                                        chipmem_full_mask = chipmem_bank.mask = 0x200000 - 1;
                        } else if (currprefs.cs_1mchipjumper) {
                                chipmem_full_mask = 0x80000 - 1;
@@ -1887,105 +1909,105 @@ static void allocate_memory (void)
                }
        }
 
-       if (bogomem_bank.allocated != currprefs.bogomem_size || bogoreset) {
-               if (!(bogomem_bank.allocated == 0x200000 && currprefs.bogomem_size == 0x180000)) {
+       if (bogomem_bank.reserved_size != currprefs.bogomem_size || bogoreset) {
+               if (!(bogomem_bank.reserved_size == 0x200000 && currprefs.bogomem_size == 0x180000)) {
                        mapped_free (&bogomem_bank);
                        bogomem_bank.flags &= ~ABFLAG_NOALLOC;
-                       bogomem_bank.allocated = 0;
+                       bogomem_bank.reserved_size = 0;
 
-                       bogomem_bank.allocated = currprefs.bogomem_size;
-                       if (bogomem_bank.allocated >= 0x180000)
-                               bogomem_bank.allocated = 0x200000;
-                       bogomem_bank.mask = bogomem_bank.allocated - 1;
+                       bogomem_bank.reserved_size = currprefs.bogomem_size;
+                       if (bogomem_bank.reserved_size >= 0x180000)
+                               bogomem_bank.reserved_size = 0x200000;
+                       bogomem_bank.mask = bogomem_bank.reserved_size - 1;
                        bogomem_bank.start = bogomem_start_addr;
 
-                       if (bogomem_bank.allocated) {
+                       if (bogomem_bank.reserved_size) {
                                if (!mapped_malloc (&bogomem_bank)) {
                                        write_log (_T("Out of memory for bogomem.\n"));
-                                       bogomem_bank.allocated = 0;
+                                       bogomem_bank.reserved_size = 0;
                                }
                        }
                        need_hardreset = true;
                }
        }
-       if (mem25bit_bank.allocated != currprefs.mem25bit_size) {
+       if (mem25bit_bank.reserved_size != currprefs.mem25bit_size) {
                mapped_free(&mem25bit_bank);
 
-               mem25bit_bank.allocated = currprefs.mem25bit_size;
-               mem25bit_bank.mask = mem25bit_bank.allocated - 1;
+               mem25bit_bank.reserved_size = currprefs.mem25bit_size;
+               mem25bit_bank.mask = mem25bit_bank.reserved_size - 1;
                mem25bit_bank.start = 0x01000000;
-               if (mem25bit_bank.allocated) {
+               if (mem25bit_bank.reserved_size) {
                        if (!mapped_malloc(&mem25bit_bank)) {
                                write_log(_T("Out of memory for 25 bit memory.\n"));
-                               mem25bit_bank.allocated = 0;
+                               mem25bit_bank.reserved_size = 0;
                        }
                }
                need_hardreset = true;
        }
-       if (a3000lmem_bank.allocated != currprefs.mbresmem_low_size) {
+       if (a3000lmem_bank.reserved_size != currprefs.mbresmem_low_size) {
                mapped_free (&a3000lmem_bank);
 
-               a3000lmem_bank.allocated = currprefs.mbresmem_low_size;
-               a3000lmem_bank.mask = a3000lmem_bank.allocated - 1;
-               a3000lmem_bank.start = 0x08000000 - a3000lmem_bank.allocated;
-               if (a3000lmem_bank.allocated) {
+               a3000lmem_bank.reserved_size = currprefs.mbresmem_low_size;
+               a3000lmem_bank.mask = a3000lmem_bank.reserved_size - 1;
+               a3000lmem_bank.start = 0x08000000 - a3000lmem_bank.reserved_size;
+               if (a3000lmem_bank.reserved_size) {
                        if (!mapped_malloc (&a3000lmem_bank)) {
                                write_log (_T("Out of memory for a3000lowmem.\n"));
-                               a3000lmem_bank.allocated = 0;
+                               a3000lmem_bank.reserved_size = 0;
                        }
                }
                need_hardreset = true;
        }
-       if (a3000hmem_bank.allocated != currprefs.mbresmem_high_size) {
+       if (a3000hmem_bank.reserved_size != currprefs.mbresmem_high_size) {
                mapped_free (&a3000hmem_bank);
 
-               a3000hmem_bank.allocated = currprefs.mbresmem_high_size;
-               a3000hmem_bank.mask = a3000hmem_bank.allocated - 1;
+               a3000hmem_bank.reserved_size = currprefs.mbresmem_high_size;
+               a3000hmem_bank.mask = a3000hmem_bank.reserved_size - 1;
                a3000hmem_bank.start = 0x08000000;
-               if (a3000hmem_bank.allocated) {
+               if (a3000hmem_bank.reserved_size) {
                        if (!mapped_malloc (&a3000hmem_bank)) {
                                write_log (_T("Out of memory for a3000highmem.\n"));
-                               a3000hmem_bank.allocated = 0;
+                               a3000hmem_bank.reserved_size = 0;
                        }
                }
                need_hardreset = true;
        }
 #ifdef CDTV
-       if (cardmem_bank.allocated != currprefs.cs_cdtvcard * 1024) {
+       if (cardmem_bank.reserved_size != currprefs.cs_cdtvcard * 1024) {
                mapped_free (&cardmem_bank);
                cardmem_bank.baseaddr = NULL;
 
-               cardmem_bank.allocated = currprefs.cs_cdtvcard * 1024;
-               cardmem_bank.mask = cardmem_bank.allocated - 1;
+               cardmem_bank.reserved_size = currprefs.cs_cdtvcard * 1024;
+               cardmem_bank.mask = cardmem_bank.reserved_size - 1;
                cardmem_bank.start = 0xe00000;
-               if (cardmem_bank.allocated) {
+               if (cardmem_bank.reserved_size) {
                        if (!mapped_malloc (&cardmem_bank)) {
                                write_log (_T("Out of memory for cardmem.\n"));
-                               cardmem_bank.allocated = 0;
+                               cardmem_bank.reserved_size = 0;
                        }
                }
-               cdtv_loadcardmem(cardmem_bank.baseaddr, cardmem_bank.allocated);
+               cdtv_loadcardmem(cardmem_bank.baseaddr, cardmem_bank.reserved_size);
        }
 #endif
-       if (custmem1_bank.allocated != currprefs.custom_memory_sizes[0]) {
+       if (custmem1_bank.reserved_size != currprefs.custom_memory_sizes[0]) {
                mapped_free (&custmem1_bank);
-               custmem1_bank.allocated = currprefs.custom_memory_sizes[0];
+               custmem1_bank.reserved_size = currprefs.custom_memory_sizes[0];
                // custmem1 and 2 can have non-power of 2 size so only set correct mask if size is power of 2.
-               custmem1_bank.mask = singlebit (custmem1_bank.allocated) ? custmem1_bank.allocated - 1 : -1;
+               custmem1_bank.mask = singlebit (custmem1_bank.reserved_size) ? custmem1_bank.reserved_size - 1 : -1;
                custmem1_bank.start = currprefs.custom_memory_addrs[0];
-               if (custmem1_bank.allocated) {
+               if (custmem1_bank.reserved_size) {
                        if (!mapped_malloc (&custmem1_bank))
-                               custmem1_bank.allocated = 0;
+                               custmem1_bank.reserved_size = 0;
                }
        }
-       if (custmem2_bank.allocated != currprefs.custom_memory_sizes[1]) {
+       if (custmem2_bank.reserved_size != currprefs.custom_memory_sizes[1]) {
                mapped_free (&custmem2_bank);
-               custmem2_bank.allocated = currprefs.custom_memory_sizes[1];
-               custmem2_bank.mask = singlebit (custmem2_bank.allocated) ? custmem2_bank.allocated - 1 : -1;
+               custmem2_bank.reserved_size = currprefs.custom_memory_sizes[1];
+               custmem2_bank.mask = singlebit (custmem2_bank.reserved_size) ? custmem2_bank.reserved_size - 1 : -1;
                custmem2_bank.start = currprefs.custom_memory_addrs[1];
-               if (custmem2_bank.allocated) {
+               if (custmem2_bank.reserved_size) {
                        if (!mapped_malloc (&custmem2_bank))
-                               custmem2_bank.allocated = 0;
+                               custmem2_bank.reserved_size = 0;
                }
        }
 
@@ -1996,13 +2018,13 @@ static void allocate_memory (void)
                        protect_roms (true);
                }
                restore_ram (chip_filepos, chipmem_bank.baseaddr);
-               if (bogomem_bank.allocated > 0)
+               if (bogomem_bank.allocated_size > 0)
                        restore_ram (bogo_filepos, bogomem_bank.baseaddr);
-               if (mem25bit_bank.allocated > 0)
+               if (mem25bit_bank.allocated_size > 0)
                        restore_ram(mem25bit_filepos, mem25bit_bank.baseaddr);
-               if (a3000lmem_bank.allocated > 0)
+               if (a3000lmem_bank.allocated_size > 0)
                        restore_ram (a3000lmem_filepos, a3000lmem_bank.baseaddr);
-               if (a3000hmem_bank.allocated > 0)
+               if (a3000hmem_bank.allocated_size > 0)
                        restore_ram (a3000hmem_filepos, a3000hmem_bank.baseaddr);
        }
 #ifdef AGA
@@ -2046,7 +2068,7 @@ static void fill_ce_banks (void)
        if (!currprefs.cs_slowmemisfast) {
                for (i = (0xc00000 >> 16); i < (0xe00000 >> 16); i++)
                        ce_banktype[i] = ce_banktype[0];
-               for (i = (bogomem_bank.start >> 16); i < ((bogomem_bank.start + bogomem_bank.allocated) >> 16); i++)
+               for (i = (bogomem_bank.start >> 16); i < ((bogomem_bank.start + bogomem_bank.allocated_size) >> 16); i++)
                        ce_banktype[i] = ce_banktype[0];
        }
        for (i = (0xd00000 >> 16); i < (0xe00000 >> 16); i++)
@@ -2084,7 +2106,7 @@ void map_overlay (int chip)
        int size;
        addrbank *cb;
 
-       size = chipmem_bank.allocated >= 0x180000 ? (chipmem_bank.allocated >> 16) : 32;
+       size = chipmem_bank.allocated_size >= 0x180000 ? (chipmem_bank.allocated_size >> 16) : 32;
        if (bogomem_aliasing)
                size = 8;
        cb = &chipmem_bank;
@@ -2097,24 +2119,24 @@ void map_overlay (int chip)
        if (chip) {
                map_banks (&dummy_bank, 0, size, 0);
                if (!isdirectjit ()) {
-                       if ((currprefs.chipset_mask & CSMASK_ECS_AGNUS) && bogomem_bank.allocated == 0) {
-                               map_banks(cb, 0, size, chipmem_bank.allocated);
-                               int start = chipmem_bank.allocated >> 16;
-                               if (chipmem_bank.allocated < 0x100000) {
+                       if ((currprefs.chipset_mask & CSMASK_ECS_AGNUS) && bogomem_bank.allocated_size == 0) {
+                               map_banks(cb, 0, size, chipmem_bank.allocated_size);
+                               int start = chipmem_bank.allocated_size >> 16;
+                               if (chipmem_bank.allocated_size < 0x100000) {
                                        if (currprefs.cs_1mchipjumper) {
-                                               int dummy = (0x100000 - chipmem_bank.allocated) >> 16;
+                                               int dummy = (0x100000 - chipmem_bank.allocated_size) >> 16;
                                                map_banks (&chipmem_dummy_bank, start, dummy, 0);
                                                map_banks (&chipmem_dummy_bank, start + 16, dummy, 0);
                                        }
-                               } else if (chipmem_bank.allocated < 0x200000 && chipmem_bank.allocated > 0x100000) {
-                                       int dummy = (0x200000 - chipmem_bank.allocated) >> 16;
+                               } else if (chipmem_bank.allocated_size < 0x200000 && chipmem_bank.allocated_size > 0x100000) {
+                                       int dummy = (0x200000 - chipmem_bank.allocated_size) >> 16;
                                        map_banks (&chipmem_dummy_bank, start, dummy, 0);
                                }
                        } else {
-                               map_banks(cb, 0, 32, chipmem_bank.allocated);
+                               map_banks(cb, 0, 32, chipmem_bank.allocated_size);
                        }
                } else {
-                       map_banks (cb, 0, chipmem_bank.allocated >> 16, 0);
+                       map_banks (cb, 0, chipmem_bank.allocated_size >> 16, 0);
                }
        } else {
                addrbank *rb = NULL;
@@ -2148,15 +2170,15 @@ void memory_clear (void)
        if (savestate_state == STATE_RESTORE)
                return;
        if (chipmem_bank.baseaddr)
-               memset(chipmem_bank.baseaddr, 0, chipmem_bank.allocated);
+               memset(chipmem_bank.baseaddr, 0, chipmem_bank.allocated_size);
        if (bogomem_bank.baseaddr)
-               memset(bogomem_bank.baseaddr, 0, bogomem_bank.allocated);
+               memset(bogomem_bank.baseaddr, 0, bogomem_bank.allocated_size);
        if (mem25bit_bank.baseaddr)
-               memset(mem25bit_bank.baseaddr, 0, mem25bit_bank.allocated);
+               memset(mem25bit_bank.baseaddr, 0, mem25bit_bank.allocated_size);
        if (a3000lmem_bank.baseaddr)
-               memset(a3000lmem_bank.baseaddr, 0, a3000lmem_bank.allocated);
+               memset(a3000lmem_bank.baseaddr, 0, a3000lmem_bank.allocated_size);
        if (a3000hmem_bank.baseaddr)
-               memset(a3000hmem_bank.baseaddr, 0, a3000hmem_bank.allocated);
+               memset(a3000hmem_bank.baseaddr, 0, a3000hmem_bank.allocated_size);
        expansion_clear ();
        cpuboard_clear();
 }
@@ -2177,8 +2199,8 @@ static void restore_roms(void)
        need_hardreset = true;
        mapped_free (&extendedkickmem_bank);
        mapped_free (&extendedkickmem2_bank);
-       extendedkickmem_bank.allocated = 0;
-       extendedkickmem2_bank.allocated = 0;
+       extendedkickmem_bank.reserved_size = 0;
+       extendedkickmem2_bank.reserved_size = 0;
        extendedkickmem_type = 0;
        load_extendedkickstart (currprefs.romextfile, 0);
        load_extendedkickstart (currprefs.romextfile2, EXTENDED_ROM_CDTV);
@@ -2190,9 +2212,10 @@ static void restore_roms(void)
                }
                load_kickstart_replacement ();
        } else {
-               struct romdata *rd = getromdatabydata (kickmem_bank.baseaddr, kickmem_bank.allocated);
+               struct romdata *rd = getromdatabydata (kickmem_bank.baseaddr, kickmem_bank.reserved_size);
                if (rd) {
                        write_log (_T("Known ROM '%s' loaded\n"), rd->name);
+#if 1
                        if ((rd->cpu & 8) && changed_prefs.cpu_model < 68030) {
                                notify_user (NUMSG_KS68030PLUS);
                                uae_restart (-1, NULL);
@@ -2206,6 +2229,7 @@ static void restore_roms(void)
                                notify_user (NUMSG_KS68020);
                                uae_restart (-1, NULL);
                        }
+#endif
                        if (rd->cloanto)
                                cloanto_rom = 1;
                        kickstart_rom = 0;
@@ -2285,9 +2309,9 @@ void memory_reset (void)
                restore_roms();
        }
 
-       if ((cloanto_rom || extendedkickmem_bank.allocated) && currprefs.maprom && currprefs.maprom < 0x01000000) {
+       if ((cloanto_rom || extendedkickmem_bank.allocated_size) && currprefs.maprom && currprefs.maprom < 0x01000000) {
                currprefs.maprom = changed_prefs.maprom = 0x00a80000;
-               if (extendedkickmem2_bank.allocated) // can't do if 2M ROM
+               if (extendedkickmem2_bank.allocated_size) // can't do if 2M ROM
                        currprefs.maprom = changed_prefs.maprom = 0;
        }
 
@@ -2298,7 +2322,7 @@ void memory_reset (void)
                map_banks (&dummy_bank, 0xD8, 6, 0);
 
        /* map "nothing" to 0x200000 - 0x9FFFFF (0xBEFFFF if Gayle or Fat Gary) */
-       bnk = chipmem_bank.allocated >> 16;
+       bnk = chipmem_bank.allocated_size >> 16;
        if (bnk < 0x20 + (currprefs.fastmem[0].size >> 16))
                bnk = 0x20 + (currprefs.fastmem[0].size >> 16);
        bnk_end = currprefs.cs_cd32cd ? 0xBE : (gayleorfatgary ? 0xBF : 0xA0);
@@ -2355,20 +2379,20 @@ void memory_reset (void)
        }
 #endif
        if (mem25bit_bank.baseaddr)
-               map_banks(&mem25bit_bank, mem25bit_bank.start >> 16, mem25bit_bank.allocated >> 16, 0);
+               map_banks(&mem25bit_bank, mem25bit_bank.start >> 16, mem25bit_bank.allocated_size >> 16, 0);
        if (a3000lmem_bank.baseaddr)
-               map_banks(&a3000lmem_bank, a3000lmem_bank.start >> 16, a3000lmem_bank.allocated >> 16, 0);
+               map_banks(&a3000lmem_bank, a3000lmem_bank.start >> 16, a3000lmem_bank.allocated_size >> 16, 0);
        if (a3000hmem_bank.baseaddr)
-               map_banks(&a3000hmem_bank, a3000hmem_bank.start >> 16, a3000hmem_bank.allocated >> 16, 0);
+               map_banks(&a3000hmem_bank, a3000hmem_bank.start >> 16, a3000hmem_bank.allocated_size >> 16, 0);
 #ifdef CDTV
        if (cardmem_bank.baseaddr)
-               map_banks (&cardmem_bank, cardmem_bank.start >> 16, cardmem_bank.allocated >> 16, 0);
+               map_banks (&cardmem_bank, cardmem_bank.start >> 16, cardmem_bank.allocated_size >> 16, 0);
 #endif
        cpuboard_map();
        map_banks_set(&kickmem_bank, 0xF8, 8, 0);
        if (currprefs.maprom) {
                if (!cpuboard_maprom())
-                       map_banks_set(&kickram_bank, currprefs.maprom >> 16, extendedkickmem2_bank.allocated ? 32 : (extendedkickmem_bank.allocated ? 16 : 8), 0);
+                       map_banks_set(&kickram_bank, currprefs.maprom >> 16, extendedkickmem2_bank.allocated_size ? 32 : (extendedkickmem_bank.allocated_size ? 16 : 8), 0);
        }
        /* map beta Kickstarts at 0x200000/0xC00000/0xF00000 */
        if (kickmem_bank.baseaddr[0] == 0x11 && kickmem_bank.baseaddr[2] == 0x4e && kickmem_bank.baseaddr[3] == 0xf9 && kickmem_bank.baseaddr[4] == 0x00) {
@@ -2400,7 +2424,7 @@ void memory_reset (void)
                break;
 #ifdef CDTV
        case EXTENDED_ROM_CDTV:
-               map_banks_set(&extendedkickmem_bank, 0xF0, extendedkickmem_bank.allocated == 2 * ROM_SIZE_512 ? 16 : 8, 0);
+               map_banks_set(&extendedkickmem_bank, 0xF0, extendedkickmem_bank.allocated_size == 2 * ROM_SIZE_512 ? 16 : 8, 0);
                break;
 #endif
 #ifdef CD32
@@ -2419,7 +2443,7 @@ void memory_reset (void)
                map_banks(&kickmem_bank, 0xE0, 8, 0);
        }
        if (currprefs.cs_ksmirror_a8) {
-               if (extendedkickmem2_bank.allocated) {
+               if (extendedkickmem2_bank.allocated_size) {
                        map_banks_set(&extendedkickmem2_bank, 0xa8, 16, 0);
                } else {
                        struct romdata *rd = getromdatabypath (currprefs.cartfile);
@@ -2481,25 +2505,25 @@ void memory_init (void)
        init_mem_banks ();
        virtualdevice_init ();
 
-       chipmem_bank.allocated = 0;
-       bogomem_bank.allocated = 0;
+       chipmem_bank.reserved_size = 0;
+       bogomem_bank.reserved_size = 0;
        kickmem_bank.baseaddr = NULL;
        extendedkickmem_bank.baseaddr = NULL;
-       extendedkickmem_bank.allocated = 0;
+       extendedkickmem_bank.reserved_size = 0;
        extendedkickmem2_bank.baseaddr = NULL;
-       extendedkickmem2_bank.allocated = 0;
+       extendedkickmem2_bank.reserved_size = 0;
        extendedkickmem_type = 0;
        chipmem_bank.baseaddr = 0;
-       mem25bit_bank.allocated = mem25bit_bank.allocated = 0;
-       a3000lmem_bank.allocated = a3000hmem_bank.allocated = 0;
+       mem25bit_bank.reserved_size = mem25bit_bank.reserved_size = 0;
+       a3000lmem_bank.reserved_size = a3000hmem_bank.reserved_size = 0;
        a3000lmem_bank.baseaddr = a3000hmem_bank.baseaddr = NULL;
        bogomem_bank.baseaddr = NULL;
        cardmem_bank.baseaddr = NULL;
-       custmem1_bank.allocated = custmem2_bank.allocated = 0;
+       custmem1_bank.reserved_size = custmem2_bank.reserved_size = 0;
        custmem1_bank.baseaddr = NULL;
        custmem2_bank.baseaddr = NULL;
 
-       kickmem_bank.allocated = ROM_SIZE_512;
+       kickmem_bank.reserved_size = ROM_SIZE_512;
        mapped_malloc (&kickmem_bank);
        memset (kickmem_bank.baseaddr, 0, ROM_SIZE_512);
        _tcscpy (currprefs.romfile, _T("<none>"));
@@ -2527,7 +2551,7 @@ void memory_cleanup (void)
        mapped_free(&chipmem_bank);
 #ifdef CDTV
        if (cardmem_bank.baseaddr) {
-               cdtv_savecardmem (cardmem_bank.baseaddr, cardmem_bank.allocated);
+               cdtv_savecardmem (cardmem_bank.baseaddr, cardmem_bank.allocated_size);
                mapped_free (&cardmem_bank);
        }
 #endif
@@ -2914,31 +2938,31 @@ uae_u8 *save_bootrom (int *len)
 
 uae_u8 *save_cram (int *len)
 {
-       *len = chipmem_bank.allocated;
+       *len = chipmem_bank.allocated_size;
        return chipmem_bank.baseaddr;
 }
 
 uae_u8 *save_bram (int *len)
 {
-       *len = bogomem_bank.allocated;
+       *len = bogomem_bank.allocated_size;
        return bogomem_bank.baseaddr;
 }
 
 static uae_u8 *save_mem25bitram (int *len)
 {
-       *len = mem25bit_bank.allocated;
+       *len = mem25bit_bank.allocated_size;
        return mem25bit_bank.baseaddr;
 }
 
 uae_u8 *save_a3000lram (int *len)
 {
-       *len = a3000lmem_bank.allocated;
+       *len = a3000lmem_bank.allocated_size;
        return a3000lmem_bank.baseaddr;
 }
 
 uae_u8 *save_a3000hram (int *len)
 {
-       *len = a3000hmem_bank.allocated;
+       *len = a3000hmem_bank.allocated_size;
        return a3000hmem_bank.baseaddr;
 }
 
@@ -3051,7 +3075,7 @@ uae_u8 *save_rom (int first, int *len, uae_u8 *dstptr)
                case 0: /* Kickstart ROM */
                        mem_start = 0xf80000;
                        mem_real_start = kickmem_bank.baseaddr;
-                       mem_size = kickmem_bank.allocated;
+                       mem_size = kickmem_bank.allocated_size;
                        path = currprefs.romfile;
                        /* 256KB or 512KB ROM? */
                        for (i = 0; i < mem_size / 2 - 4; i++) {
@@ -3070,7 +3094,7 @@ uae_u8 *save_rom (int first, int *len, uae_u8 *dstptr)
                                break;
                        mem_start = extendedkickmem_bank.start;
                        mem_real_start = extendedkickmem_bank.baseaddr;
-                       mem_size = extendedkickmem_bank.allocated;
+                       mem_size = extendedkickmem_bank.allocated_size;
                        path = currprefs.romextfile;
                        version = longget (mem_start + 12); /* version+revision */
                        if (version == 0xffffffff)
index 47b977efd7b289cc71ec0ee1aa2f68a267d81d40..f56f2b4681c5fee76b414dab3876586c56817128 100644 (file)
@@ -352,6 +352,11 @@ static void fakedma_buffer_size(struct ncr9x_state *ncr, int size)
 
 /* Fake DMA */
 
+static int fake_dma_null(void *opaque, uint8_t *buf, int len)
+{
+       return 0;
+}
+
 static int fake_dma_read_ematrix(void *opaque, uint8_t *buf, int len)
 {
        struct ncr9x_state *ncr = (struct ncr9x_state*)opaque;
@@ -833,6 +838,18 @@ static void ncr9x_io_bput(struct ncr9x_state *ncr, uaecptr addr, uae_u32 val)
                        return;
                }
                reg_shift = 1;
+       } else if (ISCPUBOARD(BOARD_BLIZZARD, BOARD_BLIZZARD_SUB_1230III)) {
+               addr &= 0xffff;
+               if (addr >= 0x20) {
+                       write_log(_T("BOARD_BLIZZARD_SUB_1230III WRITE %08x %08x\n"), addr, M68K_GETPC);
+                       return;
+               }
+               if (addr >= 0x10 && addr < 0x20) {
+                       fas408_write_fifo(ncr->devobject.lsistate, val);
+                       return;
+               }
+               reg_shift = 0;
+
        } else if (ISCPUBOARD(BOARD_BLIZZARD, BOARD_BLIZZARD_SUB_2060)) {
                if (addr >= BLIZZARD_2060_DMA_OFFSET) {
                        //write_log (_T("Blizzard DMA PUT %08x %02X\n"), addr, (uae_u8)val);
@@ -852,7 +869,7 @@ static void ncr9x_io_bput(struct ncr9x_state *ncr, uaecptr addr, uae_u32 val)
        } else if (ISCPUBOARD(BOARD_BLIZZARD, BOARD_BLIZZARD_SUB_1230IV) || ISCPUBOARD(BOARD_BLIZZARD, BOARD_BLIZZARD_SUB_1260)) {
                if (!cfgfile_board_enabled(&currprefs, ROMTYPE_BLIZKIT4, 0))
                        return;
-               if (addr >= BLIZZARD_SCSI_KIT_DMA_OFFSET) {
+               if (addr >= BLIZZARD_SCSI_KIT4_DMA_OFFSET) {
                        addr &= 0x18000;
                        if (addr == 0x18000) {
                                ncr->dma_ptr = 0;
@@ -1097,6 +1114,18 @@ static uae_u32 ncr9x_io_bget(struct ncr9x_state *ncr, uaecptr addr)
                        return 0;
                }
                reg_shift = 1;
+       } else if (ISCPUBOARD(BOARD_BLIZZARD, BOARD_BLIZZARD_SUB_1230III)) {
+               addr &= 0xffff;
+               if (addr >= 0x10 && addr < 0x20) {
+                       v = fas408_read_fifo(ncr->devobject.lsistate);
+                       return v;
+               }
+               if (addr >= 0x20) {
+                       write_log(_T("BOARD_BLIZZARD_SUB_1230III %08x %08x\n"), addr, M68K_GETPC);
+                       return 0;
+               }
+               reg_shift = 0;
+
        } else if (ISCPUBOARD(BOARD_BLIZZARD, BOARD_BLIZZARD_SUB_2060)) {
                if (addr >= BLIZZARD_2060_DMA_OFFSET) {
                        write_log(_T("Blizzard DMA GET %08x\n"), addr);
@@ -1107,7 +1136,7 @@ static uae_u32 ncr9x_io_bget(struct ncr9x_state *ncr, uaecptr addr)
        } else if (ISCPUBOARD(BOARD_BLIZZARD, BOARD_BLIZZARD_SUB_1230IV) || ISCPUBOARD(BOARD_BLIZZARD, BOARD_BLIZZARD_SUB_1260)) {
                if (!cfgfile_board_enabled(&currprefs, ROMTYPE_BLIZKIT4, 0))
                        return 0;
-               if (addr >= BLIZZARD_SCSI_KIT_DMA_OFFSET)
+               if (addr >= BLIZZARD_SCSI_KIT4_DMA_OFFSET)
                        return 0;
        } else if (ISCPUBOARD(BOARD_CYBERSTORM, BOARD_CYBERSTORM_SUB_MK1)) {
                if (addr >= CYBERSTORM_MK1_JUMPER_OFFSET) {
@@ -1646,8 +1675,18 @@ bool ncr_oktagon_autoconfig_init(struct autoconfig_info *aci)
 
 bool ncr_dkb_autoconfig_init(struct autoconfig_info *aci)
 {
-       if (!aci->doinit)
+       if (!aci->doinit) {
+               struct zfile *z = read_device_from_romconfig(aci->rc, ROMTYPE_CB_DKB12x0);
+               if (z) {
+                       for (int i = 0; i < (sizeof aci->autoconfig_raw) / 2; i++) {
+                               uae_u8 b;
+                               zfile_fread(&b, 1, 1, z);
+                               aci->autoconfig_raw[i * 2] = b;
+                       }
+                       zfile_fclose(z);
+               }
                return true;
+       }
 
        struct ncr9x_state *ncr = getscsi(aci->rc);
        if (!ncr)
@@ -1760,12 +1799,12 @@ void ncr_masoboshi_autoconfig_init(struct romconfig *rc, uaecptr baseaddress)
        ncr9x_reset_board(ncr);
 }
 
-static void ncr9x_esp_scsi_init(struct ncr9x_state *ncr, ESPDMAMemoryReadWriteFunc read, ESPDMAMemoryReadWriteFunc write, void (*irq_func)(struct ncr9x_state*))
+static void ncr9x_esp_scsi_init(struct ncr9x_state *ncr, ESPDMAMemoryReadWriteFunc read, ESPDMAMemoryReadWriteFunc write, void (*irq_func)(struct ncr9x_state*), int mode)
 {
        ncr->board_mask = 0xffff;
        ncr->irq_func = irq_func ? irq_func : set_irq2;
        if (!ncr->devobject.lsistate)
-               esp_scsi_init(&ncr->devobject, read, write);
+               esp_scsi_init(&ncr->devobject, read, write, mode > 0);
        esp_scsi_reset(&ncr->devobject, ncr);
 }
 
@@ -1843,9 +1882,11 @@ void cpuboard_ncr9x_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct
        ncr_blizzard_scsi->configured = -1;
        ncr_blizzard_scsi->enabled = true;
        if (ISCPUBOARD(BOARD_CYBERSTORM, BOARD_CYBERSTORM_SUB_MK1) || ISCPUBOARD(BOARD_CYBERSTORM, BOARD_CYBERSTORM_SUB_MK2)) {
-               ncr9x_esp_scsi_init(ncr_blizzard_scsi, cyberstorm_mk1_mk2_dma_read, cyberstorm_mk1_mk2_dma_write, NULL);
+               ncr9x_esp_scsi_init(ncr_blizzard_scsi, cyberstorm_mk1_mk2_dma_read, cyberstorm_mk1_mk2_dma_write, NULL, 0);
+       } else if (ISCPUBOARD(BOARD_BLIZZARD, BOARD_BLIZZARD_SUB_1230III)) {
+               ncr9x_esp_scsi_init(ncr_blizzard_scsi, fake_dma_null, fake_dma_null, NULL, 1);
        } else {
-               ncr9x_esp_scsi_init(ncr_blizzard_scsi, blizzard_dma_read, blizzard_dma_write, NULL);
+               ncr9x_esp_scsi_init(ncr_blizzard_scsi, blizzard_dma_read, blizzard_dma_write, NULL, 0);
        }
        if (ISCPUBOARD(BOARD_CYBERSTORM, BOARD_CYBERSTORM_SUB_MK1))
                ncr_blizzard_scsi->board_mask = 0xffff;
@@ -1856,46 +1897,46 @@ void cpuboard_ncr9x_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct
 void cpuboard_dkb_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
 {
        ncr9x_add_scsi_unit(&ncr_dkb1200_scsi, ch, ci, rc);
-       ncr9x_esp_scsi_init(ncr_dkb1200_scsi, fake_dma_read, fake_dma_write, set_irq2_dkb1200);
+       ncr9x_esp_scsi_init(ncr_dkb1200_scsi, fake_dma_read, fake_dma_write, set_irq2_dkb1200, 0);
 }
 
 void fastlane_add_scsi_unit (int ch, struct uaedev_config_info *ci, struct romconfig *rc)
 {
        ncr9x_add_scsi_unit(&ncr_fastlane_scsi[ci->controller_type_unit], ch, ci, rc);
-       ncr9x_esp_scsi_init(ncr_fastlane_scsi[ci->controller_type_unit], fastlane_dma_read, fastlane_dma_write, set_irq2_fastlane);
+       ncr9x_esp_scsi_init(ncr_fastlane_scsi[ci->controller_type_unit], fastlane_dma_read, fastlane_dma_write, set_irq2_fastlane, 0);
        ncr_fastlane_scsi[ci->controller_type_unit]->board_mask = 32 * 1024 * 1024 - 1;
 }
 
 void oktagon_add_scsi_unit (int ch, struct uaedev_config_info *ci, struct romconfig *rc)
 {
        ncr9x_add_scsi_unit(&ncr_oktagon2008_scsi[ci->controller_type_unit], ch, ci, rc);
-       ncr9x_esp_scsi_init(ncr_oktagon2008_scsi[ci->controller_type_unit], fake2_dma_read, fake2_dma_write, set_irq2_oktagon);
+       ncr9x_esp_scsi_init(ncr_oktagon2008_scsi[ci->controller_type_unit], fake2_dma_read, fake2_dma_write, set_irq2_oktagon, 0);
 }
 
 void masoboshi_add_scsi_unit (int ch, struct uaedev_config_info *ci, struct romconfig *rc)
 {
        ncr9x_add_scsi_unit(&ncr_masoboshi_scsi[ci->controller_type_unit], ch, ci, rc);
-       ncr9x_esp_scsi_init(ncr_masoboshi_scsi[ci->controller_type_unit], fake2_dma_read, fake2_dma_write, set_irq2_masoboshi);
+       ncr9x_esp_scsi_init(ncr_masoboshi_scsi[ci->controller_type_unit], fake2_dma_read, fake2_dma_write, set_irq2_masoboshi, 0);
 }
 
 void ematrix_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
 {
        ncr9x_add_scsi_unit(&ncr_ematrix530_scsi, ch, ci, rc);
-       ncr9x_esp_scsi_init(ncr_ematrix530_scsi, fake_dma_read_ematrix, fake_dma_write_ematrix, set_irq2);
+       ncr9x_esp_scsi_init(ncr_ematrix530_scsi, fake_dma_read_ematrix, fake_dma_write_ematrix, set_irq2, 0);
        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);
+       ncr9x_esp_scsi_init(ncr_multievolution_scsi, fake_dma_read, fake_dma_write, set_irq2, 0);
        esp_dma_enable(ncr_multievolution_scsi->devobject.lsistate, 1);
 }
 
 void golemfast_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
 {
        ncr9x_add_scsi_unit(&ncr_golemfast_scsi[ci->controller_type_unit], ch, ci, rc);
-       ncr9x_esp_scsi_init(ncr_golemfast_scsi[ci->controller_type_unit], fake_dma_read, fake_dma_write, set_irq2_golemfast);
+       ncr9x_esp_scsi_init(ncr_golemfast_scsi[ci->controller_type_unit], fake_dma_read, fake_dma_write, set_irq2_golemfast, 0);
        esp_dma_enable(ncr_golemfast_scsi[ci->controller_type_unit]->devobject.lsistate, 1);
 }
 
index 6ca84800f2cac218afdaea351fd0aa65db0f9c38..d0a30bbd8f87060c0d498484040b9753c3fc081f 100644 (file)
@@ -929,7 +929,7 @@ bool a4000t_scsi_init(struct autoconfig_info *aci)
 {
        aci->start = 0xdd0000;
        aci->size = 0x10000;
-       aci->addrbank = &expamem_nonautoconfig;
+       aci->zorro = 0;
        return true;
 }
 
index fa2d6e17fe114355ab8c5886316972f2e19a4721..ff60eb6fb061986c0b7f06ccd5b9b38d73328f62 100644 (file)
@@ -116,7 +116,7 @@ static struct cache040 icaches040[CACHESETS040];
 static struct cache040 dcaches040[CACHESETS040];
 
 static int fallback_cpu_model, fallback_mmu_model, fallback_fpu_model;
-static int fallback_cpu_compatible, fallback_cpu_address_space_24;
+static bool fallback_cpu_compatible, fallback_cpu_address_space_24;
 static struct regstruct fallback_regs;
 static int fallback_new_cpu_model;
 
@@ -282,7 +282,13 @@ STATIC_INLINE void clear_trace (void)
 #if CPUTRACE_DEBUG
        validate_trace ();
 #endif
+       if (cputrace.memoryoffset == MAX_CPUTRACESIZE)
+               return;
        struct cputracememory *ctm = &cputrace.ctm[cputrace.memoryoffset++];
+       if (cputrace.memoryoffset == MAX_CPUTRACESIZE) {
+               write_log(_T("CPUTRACE overflow, stopping tracing.\n"));
+               return;
+       }
        ctm->mode = 0;
        cputrace.cyclecounter = 0;
        cputrace.cyclecounter_pre = cputrace.cyclecounter_post = 0;
@@ -292,7 +298,13 @@ static void set_trace (uaecptr addr, int accessmode, int size)
 #if CPUTRACE_DEBUG
        validate_trace ();
 #endif
+       if (cputrace.memoryoffset == MAX_CPUTRACESIZE)
+               return;
        struct cputracememory *ctm = &cputrace.ctm[cputrace.memoryoffset++];
+       if (cputrace.memoryoffset == MAX_CPUTRACESIZE) {
+               write_log(_T("CPUTRACE overflow, stopping tracing.\n"));
+               return;
+       }
        ctm->addr = addr;
        ctm->data = 0xdeadf00d;
        ctm->mode = accessmode | (size << 4);
@@ -3198,6 +3210,7 @@ static void cpu_do_fallback(void)
                memory_map_dump();
                m68k_setpc(fallback_regs.pc);
        } else {
+               // 68000/010/EC020
                memory_restore();
                expansion_cpu_fallback();
                memory_map_dump();
@@ -3656,8 +3669,10 @@ static bool haltloop_do(int vsynctimeline, int rpt_end, int lines)
                        x_do_cycles(8 * CYCLE_UNIT);
                        unset_special(SPCFLAG_UAEINT);
                        check_uae_int_request();
+#ifdef WITH_PPC
                        ppc_interrupt(intlev());
                        uae_ppc_execute_check();
+#endif
                        if (regs.spcflags & SPCFLAG_COPPER)
                                do_copper();
                        if (regs.spcflags & (SPCFLAG_BRK | SPCFLAG_MODE_CHANGE)) {
@@ -3675,8 +3690,10 @@ static bool haltloop_do(int vsynctimeline, int rpt_end, int lines)
                // sync chipset with real time
                for (;;) {
                        check_uae_int_request();
+#ifdef WITH_PPC
                        ppc_interrupt(intlev());
                        uae_ppc_execute_check();
+#endif
                        if (event_wait)
                                break;
                        int d = read_processor_time() - rpt_end;
index 90f2c88db9bf820c0f5dc818cb0998a2399341d3..3c667c62c086f701d306c3bf81d288efdee8c8cb 100644 (file)
@@ -7,6 +7,7 @@
 */
 
 int rawinput_enabled_hid = -1;
+int xinput_enabled = 0;
 // 1 = keyboard
 // 2 = mouse
 // 4 = joystick
@@ -57,6 +58,9 @@ int no_windowsmouse = 0;
 #include <setupapi.h>
 #include <devguid.h>
 #include <cfgmgr32.h>
+#include <wbemidl.h>
+#include <oleauto.h>
+
 
 extern "C" 
 {
@@ -80,6 +84,7 @@ extern "C"
 #define DIDC_WIN 3
 #define DIDC_CAT 4
 #define DIDC_PARJOY 5
+#define DIDC_XINPUT 6
 
 #define AXISTYPE_NORMAL 0
 #define AXISTYPE_POV_X 1
@@ -1494,6 +1499,30 @@ static const TCHAR *tohex(TCHAR *s)
        return out;
 }
 
+static void add_xinput_device(struct didata *did)
+{
+       TCHAR tmp[256];
+       
+       did->connection = DIDC_XINPUT;
+
+
+       int buttoncnt = 0;
+       for (int i = 1; i <= 16; i++) {
+               did->buttonsort[buttoncnt] = i * 2;
+               did->buttonmappings[buttoncnt] = i;
+               _stprintf(tmp, _T("Button %d"), i);
+               did->buttonname[buttoncnt] = my_strdup(tmp);
+               buttoncnt++;
+       }
+       did->buttons = buttoncnt;
+
+
+
+       fixbuttons(did);
+       fixthings(did);
+}
+
+
 #define MAX_RAW_KEYBOARD 0
 
 static bool initialize_rawinput (void)
@@ -1697,8 +1726,6 @@ static bool initialize_rawinput (void)
                                num_joystick++;
                                rhid++;
                                v = rhid;
-                               if (_tcsstr (buf1, _T("IG_")))
-                                       did->xinput = 1;
                        }
 
                        prodname[0] = 0;
@@ -1736,6 +1763,9 @@ static bool initialize_rawinput (void)
 
                        rnum_raw++;
                        cleardid (did);
+                       if (_tcsstr(buf1, _T("IG_"))) {
+                               did->xinput = 1;
+                       }
                        getvidpid (buf1, &did->vid, &did->pid, &did->mi);
                        if (prodname[0]) {
                                _tcscpy (tmp, prodname);
@@ -1748,6 +1778,7 @@ static bool initialize_rawinput (void)
                                        _stprintf (tmp, _T("%s"), st);
                        }
                        did->name = my_strdup (tmp);
+
                        did->rawinput = h;
                        did->rawhidhandle = hhid;
                        did->connection = DIDC_RAW;
@@ -1806,6 +1837,17 @@ static bool initialize_rawinput (void)
                                        did->priority = -2;
                        } else {
                                bool ok = false;
+
+#if 0
+                               if (did->xinput) {
+                                       CloseHandle(did->rawhidhandle);
+                                       did->rawhidhandle = NULL;
+                                       rhid--;
+                                       rnum_raw--;
+                                       add_xinput_device(did);
+                                       continue;
+                               }
+#endif
                                if (hhid != INVALID_HANDLE_VALUE && HidD_GetPreparsedData (hhid, &did->hidpreparseddata)) {
                                        if (HidP_GetCaps (did->hidpreparseddata, &did->hidcaps) == HIDP_STATUS_SUCCESS) {
                                                PHIDP_BUTTON_CAPS bcaps;
@@ -1953,6 +1995,7 @@ static bool initialize_rawinput (void)
                                        did->hidpreparseddata = NULL;
                                        num_joystick--;
                                        rhid--;
+                                       rnum_raw--;
                                }
                        }
                }
@@ -2961,6 +3004,118 @@ static void di_dev_free (struct didata *did)
        cleardid(did);
 }
 
+#if 0
+#define SAFE_RELEASE(x) if(x) x->Release();
+
+// believe it or not, this is MS example code!
+BOOL IsXInputDevice(const GUID* pGuidProductFromDirectInput)
+{
+       IWbemLocator*           pIWbemLocator = NULL;
+       IEnumWbemClassObject*   pEnumDevices = NULL;
+       IWbemClassObject*       pDevices[20] = { 0 };
+       IWbemServices*          pIWbemServices = NULL;
+       BSTR                    bstrNamespace = NULL;
+       BSTR                    bstrDeviceID = NULL;
+       BSTR                    bstrClassName = NULL;
+       DWORD                   uReturned = 0;
+       bool                    bIsXinputDevice = false;
+       UINT                    iDevice = 0;
+       VARIANT                 var;
+       HRESULT                 hr;
+
+       // CoInit if needed
+       hr = CoInitialize(NULL);
+       bool bCleanupCOM = SUCCEEDED(hr);
+
+       // Create WMI
+       hr = CoCreateInstance(__uuidof(WbemLocator),
+               NULL,
+               CLSCTX_INPROC_SERVER,
+               __uuidof(IWbemLocator),
+               (LPVOID*)&pIWbemLocator);
+       if (FAILED(hr) || pIWbemLocator == NULL)
+               goto LCleanup;
+
+       bstrNamespace = SysAllocString(L"\\\\.\\root\\cimv2"); if (bstrNamespace == NULL) goto LCleanup;
+       bstrClassName = SysAllocString(L"Win32_PNPEntity");   if (bstrClassName == NULL) goto LCleanup;
+       bstrDeviceID = SysAllocString(L"DeviceID");          if (bstrDeviceID == NULL)  goto LCleanup;
+
+       // Connect to WMI 
+       hr = pIWbemLocator->ConnectServer(bstrNamespace, NULL, NULL, 0L,
+               0L, NULL, NULL, &pIWbemServices);
+       if (FAILED(hr) || pIWbemServices == NULL)
+               goto LCleanup;
+
+       // Switch security level to IMPERSONATE. 
+       CoSetProxyBlanket(pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL,
+               RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
+
+       hr = pIWbemServices->CreateInstanceEnum(bstrClassName, 0, NULL, &pEnumDevices);
+       if (FAILED(hr) || pEnumDevices == NULL)
+               goto LCleanup;
+
+       // Loop over all devices
+       for (;; )
+       {
+               // Get 20 at a time
+               hr = pEnumDevices->Next(10000, 20, pDevices, &uReturned);
+               if (FAILED(hr))
+                       goto LCleanup;
+               if (uReturned == 0)
+                       break;
+
+               for (iDevice = 0; iDevice<uReturned; iDevice++)
+               {
+                       // For each device, get its device ID
+                       hr = pDevices[iDevice]->Get(bstrDeviceID, 0L, &var, NULL, NULL);
+                       if (SUCCEEDED(hr) && var.vt == VT_BSTR && var.bstrVal != NULL)
+                       {
+                               // Check if the device ID contains "IG_".  If it does, then it's an XInput device
+                               // This information can not be found from DirectInput 
+                               if (wcsstr(var.bstrVal, L"IG_"))
+                               {
+                                       // If it does, then get the VID/PID from var.bstrVal
+                                       DWORD dwPid = 0, dwVid = 0;
+                                       WCHAR* strVid = wcsstr(var.bstrVal, L"VID_");
+                                       if (strVid && swscanf(strVid, L"VID_%4X", &dwVid) != 1)
+                                               dwVid = 0;
+                                       WCHAR* strPid = wcsstr(var.bstrVal, L"PID_");
+                                       if (strPid && swscanf(strPid, L"PID_%4X", &dwPid) != 1)
+                                               dwPid = 0;
+
+                                       // Compare the VID/PID to the DInput device
+                                       DWORD dwVidPid = MAKELONG(dwVid, dwPid);
+                                       if (pGuidProductFromDirectInput && dwVidPid == pGuidProductFromDirectInput->Data1)
+                                       {
+                                               bIsXinputDevice = true;
+                                               goto LCleanup;
+                                       }
+                               }
+                       }
+                       SAFE_RELEASE(pDevices[iDevice]);
+               }
+       }
+
+LCleanup:
+       if (bstrNamespace)
+               SysFreeString(bstrNamespace);
+       if (bstrDeviceID)
+               SysFreeString(bstrDeviceID);
+       if (bstrClassName)
+               SysFreeString(bstrClassName);
+       for (iDevice = 0; iDevice<20; iDevice++)
+               SAFE_RELEASE(pDevices[iDevice]);
+       SAFE_RELEASE(pEnumDevices);
+       SAFE_RELEASE(pIWbemLocator);
+       SAFE_RELEASE(pIWbemServices);
+
+       if (bCleanupCOM)
+               CoUninitialize();
+
+       return bIsXinputDevice;
+}
+#endif
+
 static int di_do_init (void)
 {
        HRESULT hr;
@@ -2982,6 +3137,10 @@ static int di_do_init (void)
        if (!os_vista && rawinput_enabled_hid < 0)
                rawinput_enabled_hid = 0;
 
+#if 0
+       IsXInputDevice(NULL);
+#endif
+
        if (!no_rawinput) {
                write_log (_T("RawInput enumeration..\n"));
                if (!initialize_rawinput ())
index 35b62457a1ad14a2a8decad437a4eb08cbb75cb2..3323855c514ca20b8bd3e4c3c01d709f27e515df 100644 (file)
@@ -331,12 +331,13 @@ static uae_u8 *va (uae_u32 offset, uae_u32 len, DWORD alloc, DWORD protect)
 
 static int doinit_shm (void)
 {
-       uae_u32 totalsize;
+       uae_u32 totalsize, totalsize_z3;
        uae_u32 align;
        uae_u32 z3rtgmem_size;
        struct rtgboardconfig *rbc = &changed_prefs.rtgboards[0];
        struct rtgboardconfig *crbc = &currprefs.rtgboards[0];
        uae_u32 extra = 65536;
+       struct uae_prefs *p = &changed_prefs;
 
        changed_prefs.z3autoconfig_start = currprefs.z3autoconfig_start = 0;
        set_expamem_z3_hack_mode(0);
@@ -350,66 +351,70 @@ static int doinit_shm (void)
 
        z3rtgmem_size = gfxboard_get_configtype(rbc) == 3 ? rbc->rtgmem_size : 0;
 
-       if (changed_prefs.cpu_model >= 68020)
+       if (p->cpu_model >= 68020)
                totalsize = 0x10000000;
-       totalsize += (changed_prefs.z3chipmem_size + align) & ~align;
+       totalsize += (p->z3chipmem_size + align) & ~align;
+       totalsize_z3 = totalsize;
 
        start_rtg = 0;
        end_rtg = 0;
 
-       jit_direct_compatible_memory = currprefs.cachesize && (!currprefs.comptrustbyte || !currprefs.comptrustword || !currprefs.comptrustlong);
+       jit_direct_compatible_memory = p->cachesize && (!p->comptrustbyte || !p->comptrustword || !p->comptrustlong);
+#if 0
        if (jit_direct_compatible_memory && expamem_z3_highram_uae > 0x80000000) {
                write_log(_T("MMAN: RAM outside of 31-bit address space. Switching off JIT Direct.\n"));
                jit_direct_compatible_memory = false;
        }
-
-       // choose UAE if requested, blizzard or if jit direct and only UAE mode fits in natmem space.
-       if ((Z3BASE_UAE + changed_prefs.z3chipmem_size > Z3BASE_REAL && changed_prefs.z3_mapping_mode == Z3MAPPING_AUTO) ||
-               (jit_direct_compatible_memory && expamem_z3_highram_real > 0x80000000 && changed_prefs.z3_mapping_mode == Z3MAPPING_AUTO) ||
-               changed_prefs.z3_mapping_mode == Z3MAPPING_UAE || cpuboard_memorytype(&changed_prefs) == BOARD_MEMORY_BLIZZARD_12xx ||
-               (expamem_z3_highram_real + extra >= natmem_reserved_size && expamem_z3_highram_real < totalsize && changed_prefs.z3_mapping_mode == Z3MAPPING_AUTO && jit_direct_compatible_memory)) {
+#endif
+       // 1G Z3chip?
+       if ((Z3BASE_UAE + p->z3chipmem_size > Z3BASE_REAL) ||
+               // real wrapped around
+               (expamem_z3_highram_real == 0xffffffff) ||
+               // Real highram > 0x80000000 && UAE highram <= 0x80000000 && Automatic
+               (expamem_z3_highram_real > 0x80000000 && expamem_z3_highram_uae <= 0x80000000 && p->z3_mapping_mode == Z3MAPPING_AUTO) ||
+               // Wanted UAE || Blizzard RAM
+               p->z3_mapping_mode == Z3MAPPING_UAE || cpuboard_memorytype(&changed_prefs) == BOARD_MEMORY_BLIZZARD_12xx ||
+               // JIT && Automatic && Real does not fit in NATMEM && UAE fits in NATMEM
+               (expamem_z3_highram_real + extra >= natmem_reserved_size && expamem_z3_highram_uae + extra <= natmem_reserved_size && p->z3_mapping_mode == Z3MAPPING_AUTO && jit_direct_compatible_memory)) {
                changed_prefs.z3autoconfig_start = currprefs.z3autoconfig_start = Z3BASE_UAE;
-               if (changed_prefs.z3_mapping_mode == Z3MAPPING_AUTO)
+               if (p->z3_mapping_mode == Z3MAPPING_AUTO)
                        write_log(_T("MMAN: Selected UAE Z3 mapping mode\n"));
                set_expamem_z3_hack_mode(Z3MAPPING_UAE);
-               if (expamem_z3_highram_uae > totalsize) {
-                       totalsize = expamem_z3_highram_uae;
+               if (expamem_z3_highram_uae > totalsize_z3) {
+                       totalsize_z3 = expamem_z3_highram_uae;
                }
        } else {
-               if (changed_prefs.z3_mapping_mode == Z3MAPPING_AUTO)
+               if (p->z3_mapping_mode == Z3MAPPING_AUTO)
                        write_log(_T("MMAN: Selected REAL Z3 mapping mode\n"));
                changed_prefs.z3autoconfig_start = currprefs.z3autoconfig_start = Z3BASE_REAL;
                set_expamem_z3_hack_mode(Z3MAPPING_REAL);
-               if (expamem_z3_highram_real > totalsize && jit_direct_compatible_memory) {
-                       totalsize = expamem_z3_highram_real;
-                       if (totalsize + extra >= natmem_reserved_size) {
+               if (expamem_z3_highram_real > totalsize_z3 && jit_direct_compatible_memory) {
+                       totalsize_z3 = expamem_z3_highram_real;
+                       if (totalsize_z3 + extra >= natmem_reserved_size) {
                                jit_direct_compatible_memory = false;
                                write_log(_T("MMAN: Not enough direct memory for Z3REAL. Switching off JIT Direct.\n"));
                        }
                }
-               if (jit_direct_compatible_memory && expamem_z3_highram_real > 0x80000000) {
-                       write_log(_T("MMAN: RAM outside of 31-bit address space. Switching off JIT Direct.\n"));
-                       jit_direct_compatible_memory = false;
-               }
        }
-       write_log(_T("Total %uM, HM %uM\n"), totalsize >> 20, expamem_highmem_pointer >> 20);
+       write_log(_T("Total %uM Z3 Total %uM, HM %uM\n"), totalsize >> 20, totalsize_z3 >> 20, expamem_highmem_pointer >> 20);
 
-       if (totalsize < expamem_highmem_pointer)
-               totalsize = expamem_highmem_pointer;
+       if (totalsize_z3 < expamem_highmem_pointer)
+               totalsize_z3 = expamem_highmem_pointer;
+
+       expansion_scan_autoconfig(&currprefs, true);
 
        if (jit_direct_compatible_memory && (totalsize > size64 || totalsize + extra >= natmem_reserved_size)) {
                jit_direct_compatible_memory = false;
                write_log(_T("MMAN: Not enough direct memory. Switching off JIT Direct.\n"));
        }
 
-       expansion_scan_autoconfig(&currprefs, true);
-
        int idx = 0;
        for (;;) {
                struct autoconfig_info *aci = expansion_get_autoconfig_data(&currprefs, idx++);
                if (!aci)
                        break;
-               if (!aci->addrbank)
+               addrbank *ab = aci->addrbank;
+               if (!ab)
                        continue;
                if (aci->direct_vram) {
                        if (!start_rtg)
@@ -434,6 +439,7 @@ static int doinit_shm (void)
                notify_user(NUMSG_NOMEMORY);
                return -1;
 #else
+
                p96base_offset = start_rtg;
                p96mem_size = end_rtg - start_rtg;
                write_log("MMAN: rtgbase_offset = %08x, size %08x\n", p96base_offset, p96mem_size);
@@ -449,6 +455,28 @@ static int doinit_shm (void)
                end_rtg = 0;
        }
 
+       idx = 0;
+       for (;;) {
+               struct autoconfig_info *aci = expansion_get_autoconfig_data(&currprefs, idx++);
+               if (!aci)
+                       break;
+               addrbank *ab = aci->addrbank;
+               // disable JIT direct from Z3 boards that are outside of natmem
+               for (int i = 0; i < MAX_RAM_BOARDS; i++) {
+                       if (&z3fastmem_bank[i] == ab) {
+                               ab->flags &= ~ABFLAG_ALLOCINDIRECT;
+                               ab->jit_read_flag = 0;
+                               ab->jit_write_flag = 0;
+                               if (aci->start + aci->size > natmem_reserved_size) {
+                                       write_log(_T("%s %08x-%08x: not JIT direct capable (>%08x)!\n"), ab->name, aci->start, aci->start + aci->size - 1, natmem_reserved_size);
+                                       ab->flags |= ABFLAG_ALLOCINDIRECT;
+                                       ab->jit_read_flag = S_READ;
+                                       ab->jit_write_flag = S_WRITE;
+                               }
+                       }
+               }
+       }
+
 #if 0
        z3offset = 0;
        if (changed_prefs.z3_mapping_mode != Z3MAPPING_UAE && cpuboard_memorytype(&changed_prefs) != BOARD_MEMORY_BLIZZARD_12xx) {
@@ -623,6 +651,7 @@ void mapped_free (addrbank *ab)
                }
                ab->baseaddr = NULL;
                ab->flags &= ~ABFLAG_DIRECTMAP;
+               ab->allocated_size = 0;
                write_log(_T("mapped_free indirect %s\n"), ab->name);
                return;
        }
@@ -632,6 +661,7 @@ void mapped_free (addrbank *ab)
                        xfree(ab->baseaddr);
                }
                ab->baseaddr = NULL;
+               ab->allocated_size = 0;
                write_log(_T("mapped_free nondirect %s\n"), ab->name);
                return;
        }
@@ -651,6 +681,7 @@ void mapped_free (addrbank *ab)
                x = x->next;
        }
        ab->baseaddr = NULL;
+       ab->allocated_size = 0;
        write_log(_T("mapped_free direct %s\n"), ab->name);
 }
 
@@ -683,7 +714,7 @@ bool uae_mman_info(addrbank *ab, struct uae_mman_data *md)
        bool readonly = false, maprom = false;
        bool directsupport = true;
        uaecptr start;
-       uae_u32 size = ab->allocated;
+       uae_u32 size = ab->reserved_size;
        uae_u32 readonlysize = size;
        bool barrier = false;
 
@@ -823,6 +854,8 @@ bool uae_mman_info(addrbank *ab, struct uae_mman_data *md)
                start = 0x00a80000;
                barrier = true;
                got = true;
+       } else {
+               directsupport = false;
        }
        if (got) {
                md->start = start;
@@ -834,12 +867,14 @@ bool uae_mman_info(addrbank *ab, struct uae_mman_data *md)
                if (start_rtg && end_rtg) {
                        if (start < start_rtg || start + size > end_rtg)
                                directsupport = false;
-               } else if (start + size > natmem_reserved_size) {
+               } else if (start >= natmem_reserved_size || start + size > natmem_reserved_size) {
+                       // start + size may cause 32-bit overflow
                        directsupport = false;
                }
                md->directsupport = directsupport;
-               if (barrier)
+               if (barrier) {
                        md->size += BARRIER;
+               }
        }
        return got;
 }
@@ -877,7 +912,7 @@ void *uae_shmat (addrbank *ab, int shmid, void *shmaddr, int shmflg)
 #endif
 
        uintptr_t natmem_end = (uintptr_t) natmem_reserved + natmem_reserved_size;
-       if ((uintptr_t) shmaddr + size > natmem_end) {
+       if ((uintptr_t) shmaddr + size > natmem_end && (uintptr_t)shmaddr <= natmem_end) {
                /* We cannot add a barrier beyond the end of the reserved memory. */
                //assert((uintptr_t) shmaddr + size - natmem_end == BARRIER);
                write_log(_T("NATMEM: Removing barrier (%d bytes) beyond reserved memory\n"), BARRIER);
@@ -971,9 +1006,9 @@ int uae_shmget (uae_key_t key, addrbank *ab, int shmflg)
        int result = -1;
 
        if ((key == UAE_IPC_PRIVATE) || ((shmflg & UAE_IPC_CREAT) && (find_shmkey (key) == -1))) {
-               write_log (_T("shmget of size %zd (%zdk) for %s (%s)\n"), ab->allocated, ab->allocated >> 10, ab->label, ab->name);
+               write_log (_T("shmget of size %zd (%zdk) for %s (%s)\n"), ab->reserved_size, ab->reserved_size >> 10, ab->label, ab->name);
                if ((result = get_next_shmkey ()) != -1) {
-                       shmids[result].size = ab->allocated;
+                       shmids[result].size = ab->reserved_size;
                        _tcscpy (shmids[result].name, ab->label);
                } else {
                        result = -1;
index 45e5d401a2b759bd3952e346b34283b7ba8ad6ad..d8d046b7ed18465cb82f2ef04bf0679d14e7a21f 100644 (file)
@@ -1945,10 +1945,10 @@ static uae_u32 REGPARAM2 picasso_FindCard (TrapContext *ctx)
                picasso96_alloc2 (ctx);
        }
        boardinfo = AmigaBoardInfo;
-       if (gfxmem_bank.allocated && !picasso96_state_uaegfx.CardFound) {
+       if (gfxmem_bank.allocated_size && !picasso96_state_uaegfx.CardFound) {
                /* Fill in MemoryBase, MemorySize */
                trap_put_long(ctx, AmigaBoardInfo + PSSO_BoardInfo_MemoryBase, gfxmem_bank.start);
-               trap_put_long(ctx, AmigaBoardInfo + PSSO_BoardInfo_MemorySize, gfxmem_bank.allocated - reserved_gfxmem);
+               trap_put_long(ctx, AmigaBoardInfo + PSSO_BoardInfo_MemorySize, gfxmem_bank.allocated_size - reserved_gfxmem);
                picasso96_state_uaegfx.CardFound = 1; /* mark our "card" as being found */
                return -1;
        } else
@@ -2172,11 +2172,11 @@ static void init_alloc (TrapContext *ctx, int size)
                picasso96_amem = trap_get_long(ctx, uaegfx_base + CARD_RESLIST);
        } else if (uaegfx_active) {
                reserved_gfxmem = size;
-               picasso96_amem = gfxmem_bank.start + gfxmem_bank.allocated - size;
+               picasso96_amem = gfxmem_bank.start + gfxmem_bank.allocated_size - size;
        }
        picasso96_amemend = picasso96_amem + size;
        write_log (_T("P96 RESINFO: %08X-%08X (%d,%d)\n"), picasso96_amem, picasso96_amemend, size / PSSO_ModeInfo_sizeof, size);
-       picasso_allocatewritewatch (0, gfxmem_bank.allocated);
+       picasso_allocatewritewatch (0, gfxmem_bank.allocated_size);
 }
 
 static int p96depth (int depth)
@@ -2224,7 +2224,7 @@ static void picasso96_alloc2 (TrapContext *ctx)
        xfree (newmodes);
        newmodes = NULL;
        picasso96_amem = picasso96_amemend = 0;
-       if (gfxmem_bank.allocated == 0)
+       if (gfxmem_bank.allocated_size == 0)
                return;
        misscnt = 0;
        newmodes = xmalloc (struct PicassoResolution, MAX_PICASSO_MODES);
@@ -2463,7 +2463,7 @@ static void addmode(TrapContext *ctx, uaecptr AmigaBoardInfo, uaecptr *amem, str
        for (depth = 8; depth <= 32; depth++) {
                if (!p96depth (depth))
                        continue;
-               if(gfxmem_bank.allocated >= w * h * (depth + 7) / 8) {
+               if(gfxmem_bank.allocated_size >= w * h * (depth + 7) / 8) {
                        FillBoardInfo(ctx, *amem, res, w, h, depth);
                        *amem += PSSO_ModeInfo_sizeof;
                }
@@ -2687,7 +2687,7 @@ static void init_picasso_screen (void)
                picasso_refresh ();
        }
        init_picasso_screen_called = 1;
-       mman_ResetWatch (gfxmem_bank.start + natmem_offset, gfxmem_bank.allocated);
+       mman_ResetWatch (gfxmem_bank.start + natmem_offset, gfxmem_bank.allocated_size);
 
 }
 
@@ -5059,7 +5059,7 @@ uae_u32 picasso_demux (uae_u32 arg, TrapContext *ctx)
      case 31: return picasso_InvertRect (ctx);
      case 32: return picasso_BlitPlanar2Direct (ctx);
      //case 34: return picasso_WaitVerticalSync (ctx);
-     case 35: return gfxmem_bank.allocated ? 1 : 0;
+     case 35: return gfxmem_bank.allocated_size ? 1 : 0;
         case 36: return picasso_SetSprite (ctx);
         case 37: return picasso_SetSpritePosition (ctx);
         case 38: return picasso_SetSpriteImage (ctx);
index 9feba7ff338c44aa319d0b3da280046780169cb3..6a8a9fc3361ea50f2a769f861d9ad96e51c5b6aa 100644 (file)
@@ -82,15 +82,11 @@ struct sound_dp
 #define PA_BUFFERSIZE (262144 * 4)
 #define PA_CALLBACKBUFFERS 8
 
-       uae_u8 *pasoundbuffer;
        volatile int pareadoffset, pawriteoffset;
        int pasndbufsize;
        int paframesperbuffer;
        PaStream *pastream;
-       int pablocking;
        int pavolume;
-       int pacallbacksize;
-       bool pafinishsb;
 
        // wasapi
 
@@ -105,13 +101,14 @@ struct sound_dp
        UINT32 bufferFrameCount;
        UINT64 wasapiframes;
        int wasapiexclusive;
-       int wasapipull;
        int sndbuf;
        int wasapigoodsize;
-       HANDLE wasapievent;
-       uae_u8 *wasapibuffer;
-       int wasapibufferlen;
-       int wasapibuffermaxlen;
+       
+       int pullmode;
+       HANDLE pullevent;
+       uae_u8 *pullbuffer;
+       int pullbufferlen;
+       int pullbuffermaxlen;
 
 #if USE_XAUDIO
        // xaudio2
@@ -355,8 +352,6 @@ static void pause_audio_wasapi (struct sound_data *sd)
        if (FAILED (hr)) {
                write_log (_T("WASAPI: Stop() %08X\n"), hr);
        }
-       if (s->wasapievent)
-               ResetEvent(s->wasapievent);
 }
 static void resume_audio_wasapi (struct sound_data *sd)
 {
@@ -365,8 +360,6 @@ static void resume_audio_wasapi (struct sound_data *sd)
        BYTE *pData;
        int framecnt;
 
-       if (s->wasapievent)
-               ResetEvent(s->wasapievent);
        hr = s->pAudioClient->Reset ();
        if (FAILED (hr)) {
                write_log (_T("WASAPI: Reset() %08X\n"), hr);
@@ -424,8 +417,6 @@ static void resume_audio_pa (struct sound_data *sd)
        struct sound_dp *s = sd->data;
        s->pawriteoffset = 0;
        s->pareadoffset = 0;
-       s->pacallbacksize = 0;
-       s->pafinishsb = false;
        PaError err = Pa_StartStream (s->pastream);
        if (err != paNoError)
                write_log (_T("PASOUND: Pa_StartStream() error %d (%s)\n"), err, Pa_GetErrorText (err));
@@ -647,23 +638,22 @@ static DWORD fillsupportedmodes (struct sound_data *sd, int freq, struct dsaudio
        return speakerconfig;
 }
 
-static int padiff (int write, int read)
+static void finish_sound_buffer_pull(struct sound_data *sd, uae_u16 *sndbuffer)
 {
-       int diff;
-       diff = write - read;
-       if (diff > PA_BUFFERSIZE / 2)
-               diff = PA_BUFFERSIZE - write + read;
-       else if (diff < -PA_BUFFERSIZE / 2)
-               diff = PA_BUFFERSIZE - read + write;
-       return diff;
+       struct sound_dp *s = sd->data;
+
+       if (s->pullbufferlen + sd->sndbufsize > s->pullbuffermaxlen) {
+               write_log(_T("pull overflow! %d %d %d\n"), s->pullbufferlen, sd->sndbufsize, s->pullbuffermaxlen);
+               s->pullbufferlen = 0;
+       }
+       memcpy(s->pullbuffer + s->pullbufferlen, sndbuffer, sd->sndbufsize);
+       s->pullbufferlen += sd->sndbufsize;
 }
 
 static void finish_sound_buffer_pa (struct sound_data *sd, uae_u16 *sndbuffer)
 {
        struct sound_dp *s = sd->data;
 
-       s->pafinishsb = true;
-
        if (s->pavolume) {
                int vol = 65536 - s->pavolume * 655;
                for (int i = 0; i < sd->sndbufsize / sizeof (uae_u16); i++) {
@@ -671,54 +661,7 @@ static void finish_sound_buffer_pa (struct sound_data *sd, uae_u16 *sndbuffer)
                        sndbuffer[i] = v * vol / 65536;
                }
        }
-       if (s->pablocking) {
-
-               int avail;
-               time_t t = 0;
-               for (;;) {
-                       avail = Pa_GetStreamWriteAvailable (s->pastream);
-                       if (avail < 0 || avail >= s->pasndbufsize)
-                               break;
-                       if (!t) {
-                               t = time (NULL) + 2;
-                       } else if (time (NULL) >= t) {
-                               write_log (_T("PA: audio stuck!? %d\n"), avail);
-                               break;
-                       }
-                       sleep_millis (1);
-               }
-               int pos = avail - s->paframesperbuffer;
-               docorrection (s, -pos * 1000 / (s->paframesperbuffer), -pos, 100);
-               Pa_WriteStream (s->pastream, sndbuffer, s->pasndbufsize); 
-
-       } else {
-
-               if (!s->pacallbacksize)
-                       return;
-
-               int diff = padiff (s->pawriteoffset, s->pareadoffset);
-               int samplediff = diff / sd->samplesize;
-               samplediff -= s->pacallbacksize * PA_CALLBACKBUFFERS;
-               docorrection (s, samplediff * 1000 / (s->pacallbacksize * PA_CALLBACKBUFFERS / 2), samplediff, s->pacallbacksize);
-
-               while (diff > PA_BUFFERSIZE / 4 && s->pastream && !sd->paused) {
-                       gui_data.sndbuf_status = 1;
-                       statuscnt = SND_STATUSCNT;
-                       sleep_millis (1);
-                       diff = padiff (s->pawriteoffset, s->pareadoffset);
-               }
-
-               if (sd->sndbufsize + s->pawriteoffset > PA_BUFFERSIZE) {
-                       int partsize = PA_BUFFERSIZE - s->pawriteoffset;
-                       memcpy (s->pasoundbuffer + s->pawriteoffset, sndbuffer, partsize);
-                       memcpy (s->pasoundbuffer, (uae_u8*)sndbuffer + partsize, sd->sndbufsize - partsize);
-                       s->pawriteoffset = sd->sndbufsize - partsize;
-               } else {
-                       memcpy (s->pasoundbuffer + s->pawriteoffset, sndbuffer, sd->sndbufsize);
-                       s->pawriteoffset = s->pawriteoffset + sd->sndbufsize;
-               }
-
-       }
+       finish_sound_buffer_pull(sd, sndbuffer);
 }
 
 static int _cdecl portAudioCallback (const void *inputBuffer, void *outputBuffer,
@@ -730,36 +673,25 @@ static int _cdecl portAudioCallback (const void *inputBuffer, void *outputBuffer
        struct sound_data *sd = (struct sound_data*)userData;
        struct sound_dp *s = sd->data;
        int bytestocopy;
-       int diff;
 
-       if (!framesPerBuffer || !s->pafinishsb || sdp->deactive)
+       if (!framesPerBuffer || sdp->deactive)
                return paContinue;
 
-       if (!s->pacallbacksize)
-               s->pawriteoffset = (PA_CALLBACKBUFFERS + 1) * framesPerBuffer * sd->samplesize;
-       
-       s->pacallbacksize = framesPerBuffer;
+       if (s->pullbufferlen <= 0) {
+               SetEvent(s->pullevent);
+               return paContinue;
+       }
 
        bytestocopy = framesPerBuffer * sd->samplesize;
-       diff = padiff (s->pawriteoffset, s->pareadoffset + bytestocopy);
-       if (diff <= 0) {
-               memset (outputBuffer, 0, bytestocopy);
-               gui_data.sndbuf_status = 2;
-               bytestocopy -= -diff;
-               statuscnt = SND_STATUSCNT;
-       }
        if (bytestocopy > 0) {
-               if (bytestocopy + s->pareadoffset > PA_BUFFERSIZE) {
-                       int partsize = PA_BUFFERSIZE - s->pareadoffset;
-                       memcpy (outputBuffer, s->pasoundbuffer + s->pareadoffset, partsize);
-                       memcpy ((uae_u8*)outputBuffer + partsize, s->pasoundbuffer, bytestocopy - partsize);
-                       s->pareadoffset = bytestocopy - partsize;
-               } else {
-                       memcpy (outputBuffer, s->pasoundbuffer + s->pareadoffset, bytestocopy);
-                       s->pareadoffset = s->pareadoffset + bytestocopy;
-               }
+               memcpy(outputBuffer, s->pullbuffer, bytestocopy);
        }
 
+       if (bytestocopy < s->pullbufferlen) {
+               memmove(s->pullbuffer, s->pullbuffer + bytestocopy, s->pullbufferlen - bytestocopy);
+       }
+       s->pullbufferlen -= bytestocopy;
+
        return paContinue;
 }
 
@@ -770,8 +702,6 @@ static void close_audio_pa (struct sound_data *sd)
        if (s->pastream)
                Pa_CloseStream (s->pastream);
        s->pastream = NULL;
-       xfree (s->pasoundbuffer);
-       s->pasoundbuffer = NULL;
 }
 
 static int open_audio_pa (struct sound_data *sd, int index)
@@ -788,7 +718,7 @@ static int open_audio_pa (struct sound_data *sd, int index)
        int defaultrate = 0;
 
        s->paframesperbuffer = sd->sndbufsize; 
-       s->pasndbufsize = sd->sndbufsize / 32;
+       s->pasndbufsize = s->paframesperbuffer;
        sd->sndbufsize = s->pasndbufsize * ch * 2;
        if (sd->sndbufsize > SND_MAX_BUFFER)
                sd->sndbufsize = SND_MAX_BUFFER;
@@ -841,16 +771,9 @@ fixfreq:
                }
 
                sd->samplesize = ch * 16 / 8;
-#if 0
-               s->pablocking = 1;
-               err = Pa_OpenStream (&s->pastream, NULL, &p, freq, s->paframesperbuffer, paNoFlag, NULL, NULL);
-#else
-               err = paUnanticipatedHostError;
-#endif
-               if (err == paUnanticipatedHostError) { // could be "blocking not supported"
-                       s->pablocking = 0;
-                       err = Pa_OpenStream (&s->pastream, NULL, &p, freq, paFramesPerBufferUnspecified, paNoFlag, portAudioCallback, sd);
-               }
+               s->pullmode = 1;
+               err = Pa_OpenStream (&s->pastream, NULL, &p, freq, s->paframesperbuffer, paNoFlag, portAudioCallback, sd);
+
                if (err == paInvalidSampleRate || err == paInvalidChannelCount)
                        goto fixfreq;
                if (err != paNoError) {
@@ -862,14 +785,15 @@ fixfreq:
                break;
        }
 
-       if (!s->pablocking) {
-               s->pasoundbuffer = xcalloc (uae_u8, PA_BUFFERSIZE);
-       }
+       s->pullevent = CreateEvent(NULL, TRUE, FALSE, NULL);
+       s->pullbuffermaxlen = sd->sndbufsize;
+       s->pullbuffer = xcalloc(uae_u8, s->pullbuffermaxlen);
+       s->pullbufferlen = 0;
 
        name = au (di->name);
        write_log (_T("PASOUND: CH=%d,FREQ=%d (%s) '%s' buffer %d/%d (%s)\n"),
                ch, freq, sound_devices[index]->name, name,
-               s->pasndbufsize, s->paframesperbuffer, s->pablocking ? _T("push") : _T("pull"));
+               s->pasndbufsize, s->paframesperbuffer, !s->pullmode ? _T("push") : _T("pull"));
        xfree (name);
        return 1;
 end:
@@ -1092,12 +1016,6 @@ static void close_audio_wasapi (struct sound_data *sd)
                s->pDevice->Release ();
        if (s->pEnumerator)
                s->pEnumerator->Release ();
-       if (s->wasapievent) {
-               CloseHandle(s->wasapievent);
-               s->wasapievent = NULL;
-       }
-       xfree(s->wasapibuffer);
-       s->wasapibuffer = NULL;
 }
 
 static int open_audio_wasapi (struct sound_data *sd, int index, int exclusive)
@@ -1115,15 +1033,15 @@ static int open_audio_wasapi (struct sound_data *sd, int index, int exclusive)
 
        sd->devicetype = exclusive ? SOUND_DEVICE_WASAPI_EXCLUSIVE : SOUND_DEVICE_WASAPI;
        s->wasapiexclusive = exclusive;
-       s->wasapipull = sound_pull;
+       s->pullmode = sound_pull;
 
        if (s->wasapiexclusive)
                sharemode = AUDCLNT_SHAREMODE_EXCLUSIVE;
        else
                sharemode = AUDCLNT_SHAREMODE_SHARED;
 
-       if (s->wasapipull) {
-               s->wasapievent = CreateEvent(NULL, TRUE, FALSE, NULL);
+       if (s->pullmode) {
+               s->pullevent = CreateEvent(NULL, TRUE, FALSE, NULL);
        }
 
        hr = CoCreateInstance (__uuidof(MMDeviceEnumerator), NULL,
@@ -1267,7 +1185,7 @@ static int open_audio_wasapi (struct sound_data *sd, int index, int exclusive)
                        );
        }
 
-       hr = s->pAudioClient->Initialize (sharemode, AUDCLNT_STREAMFLAGS_NOPERSIST | (s->wasapipull ? AUDCLNT_STREAMFLAGS_EVENTCALLBACK : 0),
+       hr = s->pAudioClient->Initialize (sharemode, AUDCLNT_STREAMFLAGS_NOPERSIST | (s->pullmode ? AUDCLNT_STREAMFLAGS_EVENTCALLBACK : 0),
                s->hnsRequestedDuration, s->wasapiexclusive ? s->hnsRequestedDuration : 0, pwfx ? pwfx : &wavfmt.Format, NULL);
        if (hr == AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED) {
                hr = s->pAudioClient->GetBufferSize (&s->bufferFrameCount);
@@ -1290,7 +1208,7 @@ static int open_audio_wasapi (struct sound_data *sd, int index, int exclusive)
                        write_log (_T("WASAPI: Activate() %08X\n"), hr);
                        goto error;
                }
-               hr = s->pAudioClient->Initialize (sharemode, AUDCLNT_STREAMFLAGS_NOPERSIST | (s->wasapipull ? AUDCLNT_STREAMFLAGS_EVENTCALLBACK : 0),
+               hr = s->pAudioClient->Initialize (sharemode, AUDCLNT_STREAMFLAGS_NOPERSIST | (s->pullmode ? AUDCLNT_STREAMFLAGS_EVENTCALLBACK : 0),
                        s->hnsRequestedDuration, s->wasapiexclusive ? s->hnsRequestedDuration : 0, pwfx ? pwfx : &wavfmt.Format, NULL);
        } else if (hr == AUDCLNT_E_BUFFER_SIZE_ERROR) {
                write_log(_T("AUDCLNT_E_BUFFER_SIZE_ERROR %d\n"), s->bufferFrameCount);
@@ -1300,8 +1218,8 @@ static int open_audio_wasapi (struct sound_data *sd, int index, int exclusive)
                goto error;
        }
 
-       if (s->wasapipull) {
-               hr = s->pAudioClient->SetEventHandle(s->wasapievent);
+       if (s->pullmode) {
+               hr = s->pAudioClient->SetEventHandle(s->pullevent);
                if (FAILED(hr)) {
                        write_log(_T("WASAPI: SetEventHandle() %08X\n"), hr);
                        goto error;
@@ -1342,17 +1260,17 @@ static int open_audio_wasapi (struct sound_data *sd, int index, int exclusive)
                        write_log (_T("WASAPI: GetFrequency() %08X\n"), hr);
                }
        }
-       if (s->wasapipull) {
+       if (s->pullmode) {
                if (s->wasapiexclusive) {
                        sd->sndbufsize = s->bufferFrameCount * sd->samplesize;
-                       s->wasapibuffermaxlen = sd->sndbufsize;
+                       s->pullbuffermaxlen = sd->sndbufsize;
                } else {
                        sd->sndbufsize = s->bufferFrameCount * sd->samplesize / 2;
-                       s->wasapibuffermaxlen = sd->sndbufsize * 2;
+                       s->pullbuffermaxlen = sd->sndbufsize * 2;
                }
                s->wasapigoodsize = s->bufferFrameCount;
-               s->wasapibuffer = xcalloc(uae_u8, s->wasapibuffermaxlen);
-               s->wasapibufferlen = 0;
+               s->pullbuffer = xcalloc(uae_u8, s->pullbuffermaxlen);
+               s->pullbufferlen = 0;
        } else {
                sd->sndbufsize = (s->bufferFrameCount / 8) * sd->samplesize;
                v = s->bufferFrameCount * sd->samplesize;
@@ -1365,7 +1283,7 @@ static int open_audio_wasapi (struct sound_data *sd, int index, int exclusive)
        write_log(_T("WASAPI: '%s'\nWASAPI: %s %s CH=%d FREQ=%d BUF=%d (%d)\n"),
                name,
                s->wasapiexclusive ? _T("Exclusive") : _T("Shared"),
-               s->wasapipull ? _T("Pull") : _T("Push"),
+               s->pullmode ? _T("Pull") : _T("Push"),
                sd->channels, sd->freq, sd->sndbufsize / sd->samplesize, s->bufferFrameCount);
 
        CoTaskMemFree (pwfx);
@@ -1379,6 +1297,12 @@ error:
        CoTaskMemFree (pwfx_saved);
        CoTaskMemFree (name);
        close_audio_wasapi (sd);
+       if (s->pullevent) {
+               CloseHandle(s->pullevent);
+               s->pullevent = NULL;
+       }
+       xfree(s->pullbuffer);
+       s->pullbuffer = NULL;
        return 0;
 }
 
@@ -1578,6 +1502,7 @@ void close_sound_device (struct sound_data *sd)
 }
 void pause_sound_device (struct sound_data *sd)
 {
+       struct sound_dp *s = sd->data;
        sd->paused = 1;
        gui_data.sndbuf_status = 0;
        gui_data.sndbuf = 0;
@@ -1593,9 +1518,12 @@ void pause_sound_device (struct sound_data *sd)
        else if (sd->devicetype == SOUND_DEVICE_XAUDIO2)
                pause_audio_xaudio2 (sd);
 #endif
+       if (s->pullevent)
+               ResetEvent(s->pullevent);
 }
 void resume_sound_device (struct sound_data *sd)
 {
+       struct sound_dp *s = sd->data;
        if (sd->devicetype == SOUND_DEVICE_AL)
                resume_audio_al (sd);
        else if (sd->devicetype == SOUND_DEVICE_DS)
@@ -1608,6 +1536,8 @@ void resume_sound_device (struct sound_data *sd)
        else if (sd->devicetype == SOUND_DEVICE_XAUDIO2)
                resume_audio_xaudio2 (sd);
 #endif
+       if (s->pullevent)
+               ResetEvent(s->pullevent);
        sd->paused = 0;
 }
 
@@ -1909,78 +1839,6 @@ static void finish_sound_buffer_al (struct sound_data *sd, uae_u16 *sndbuffer)
        alcheck (sd, 0);
 }
 
-int blocking_sound_device (struct sound_data *sd)
-{
-       struct sound_dp *s = sd->data;
-
-       if (sd->devicetype == SOUND_DEVICE_DS) {
-
-               HRESULT hr;
-               DWORD playpos, safepos;
-               int diff;
-
-               hr = IDirectSoundBuffer_GetCurrentPosition (s->lpDSBsecondary, &playpos, &safepos);
-               if (FAILED (hr)) {
-                       restore_ds (sd, hr);
-                       write_log (_T("DS: GetCurrentPosition failed: %s\n"), DXError (hr));
-                       return -1;
-               }
-               if (s->writepos >= safepos)
-                       diff = s->writepos - safepos;
-               else
-                       diff = s->dsoundbuf - safepos + s->writepos;
-               if (diff > s->snd_maxoffset)
-                       return 1;
-               return 0;
-
-       } else if (sd->devicetype == SOUND_DEVICE_AL) {
-
-               int v = 0;
-               alGetError ();
-               alGetSourcei (s->al_Source, AL_BUFFERS_QUEUED, &v);
-               if (alGetError () != AL_NO_ERROR)
-                       return -1;
-               if (v < AL_BUFFERS)
-                       return 0;
-               return 1;
-
-       } else if (sd->devicetype == SOUND_DEVICE_WASAPI || sd->devicetype == SOUND_DEVICE_WASAPI_EXCLUSIVE) {
-
-               //      if (WaitForSingleObject (s->wasapihandle, 0) == WAIT_TIMEOUT)
-               //          return 0;
-               return 1;
-
-       }
-       return -1;
-}
-
-int get_offset_sound_device (struct sound_data *sd)
-{
-       struct sound_dp *s = sd->data;
-
-       if (sd->devicetype == SOUND_DEVICE_DS) {
-               HRESULT hr;
-               DWORD playpos, safedist, status;
-
-               hr = IDirectSoundBuffer_GetStatus (s->lpDSBsecondary, &status);
-               hr = IDirectSoundBuffer_GetCurrentPosition (s->lpDSBsecondary, &playpos, &safedist);
-               if (FAILED (hr))
-                       return -1;
-               playpos -= s->writepos;
-               if (playpos < 0)
-                       playpos += s->dsoundbuf;
-               return playpos;
-       } else if (sd->devicetype == SOUND_DEVICE_AL) {
-               int v;
-               alGetError ();
-               alGetSourcei (s->al_Source, AL_BYTE_OFFSET, &v);
-               if (alGetError () == AL_NO_ERROR)
-                       return v;
-       }
-       return -1;
-}
-
-
 #if USE_XAUDIO
 static void finish_sound_buffer_xaudio2 (struct sound_data *sd, uae_u16 *sndbuffer)
 {
@@ -2090,10 +1948,10 @@ static bool finish_sound_buffer_wasapi_pull_do(struct sound_data *sd)
        HRESULT hr;
        BYTE *pData;
 
-       if (s->wasapibufferlen <= 0)
+       if (s->pullbufferlen <= 0)
                return false;
 
-       int frames = s->wasapibufferlen / sd->samplesize;
+       int frames = s->pullbufferlen / sd->samplesize;
        int avail = frames;
 
        if (!s->wasapiexclusive) {
@@ -2110,11 +1968,11 @@ static bool finish_sound_buffer_wasapi_pull_do(struct sound_data *sd)
                        avail = frames;
        }
 
-       ResetEvent(s->wasapievent);
+       ResetEvent(s->pullevent);
 
        hr = s->pRenderClient->GetBuffer(avail, &pData);
        if (SUCCEEDED(hr)) {
-               memcpy(pData, s->wasapibuffer, avail * sd->samplesize);
+               memcpy(pData, s->pullbuffer, avail * sd->samplesize);
                hr = s->pRenderClient->ReleaseBuffer(avail, 0);
                if (FAILED(hr)) {
                        write_log(_T("WASAPI: ReleaseBuffer() %08X\n"), hr);
@@ -2124,35 +1982,22 @@ static bool finish_sound_buffer_wasapi_pull_do(struct sound_data *sd)
        }
        
        if (avail < frames) {
-               memmove(s->wasapibuffer, s->wasapibuffer + avail * sd->samplesize, s->wasapibufferlen - (avail  * sd->samplesize));
+               memmove(s->pullbuffer, s->pullbuffer + avail * sd->samplesize, s->pullbufferlen - (avail  * sd->samplesize));
        }
-       s->wasapibufferlen -= avail * sd->samplesize;
+       s->pullbufferlen -= avail * sd->samplesize;
 
        return true;
 }
 
-static void finish_sound_buffer_wasapi_pull(struct sound_data *sd, uae_u16 *sndbuffer)
-{
-       struct sound_dp *s = sd->data;
-
-       if (s->wasapibufferlen + sd->sndbufsize > s->wasapibuffermaxlen) {
-               write_log(_T("wasapi pull overflow! %d %d %d\n"), s->wasapibufferlen, sd->sndbufsize, s->wasapibuffermaxlen);
-               s->wasapibufferlen = 0;
-       }
-       memcpy(s->wasapibuffer + s->wasapibufferlen, sndbuffer, sd->sndbufsize);
-       s->wasapibufferlen += sd->sndbufsize;
-}
-
 static void finish_sound_buffer_wasapi(struct sound_data *sd, uae_u16 *sndbuffer)
 {
        struct sound_dp *s = sd->data;
-       if (s->wasapipull)
-               finish_sound_buffer_wasapi_pull(sd, sndbuffer);
+       if (s->pullmode)
+               finish_sound_buffer_pull(sd, sndbuffer);
        else
                finish_sound_buffer_wasapi_push(sd, sndbuffer);
 }
 
-
 static void finish_sound_buffer_ds (struct sound_data *sd, uae_u16 *sndbuffer)
 {
        struct sound_dp *s = sd->data;
@@ -2366,6 +2211,9 @@ static bool send_sound_do(struct sound_data *sd)
        int type = sd->devicetype;
        if (type == SOUND_DEVICE_WASAPI || type == SOUND_DEVICE_WASAPI_EXCLUSIVE) {
                return finish_sound_buffer_wasapi_pull_do(sd);
+       } else if (type == SOUND_DEVICE_PA) {
+               struct sound_dp *s = sd->data;
+               ResetEvent(s->pullevent);
        }
        return false;
 }
@@ -2400,12 +2248,12 @@ static void send_sound (struct sound_data *sd, uae_u16 *sndbuffer)
 HANDLE get_sound_event(void)
 {
        int type = sdp->devicetype;
-       if (sdp->paused)
+       if (sdp->paused || sdp->deactive)
                return 0;
-       if (type == SOUND_DEVICE_WASAPI || type == SOUND_DEVICE_WASAPI_EXCLUSIVE) {
+       if (type == SOUND_DEVICE_WASAPI || type == SOUND_DEVICE_WASAPI_EXCLUSIVE  || type == SOUND_DEVICE_PA) {
                struct sound_dp *s = sdp->data;
-               if (s && s->wasapipull) {
-                       return s->wasapievent;
+               if (s && s->pullmode) {
+                       return s->pullevent;
                }
        }
        return 0;
@@ -2414,9 +2262,9 @@ HANDLE get_sound_event(void)
 bool audio_is_event_frame_possible(int ms)
 {
        int type = sdp->devicetype;
-       if (sdp->paused)
+       if (sdp->paused || sdp->deactive)
                return false;
-       if (type == SOUND_DEVICE_WASAPI || type == SOUND_DEVICE_WASAPI_EXCLUSIVE) {
+       if (type == SOUND_DEVICE_WASAPI || type == SOUND_DEVICE_WASAPI_EXCLUSIVE || type == SOUND_DEVICE_PA) {
                struct sound_dp *s = sdp->data;
                int bufsize = (uae_u8*)paula_sndbufpt - (uae_u8*)paula_sndbuffer;
                bufsize /= sdp->samplesize;
@@ -2430,10 +2278,10 @@ bool audio_is_event_frame_possible(int ms)
 int audio_is_pull(void)
 {
        int type = sdp->devicetype;
-       if (type == SOUND_DEVICE_WASAPI || type == SOUND_DEVICE_WASAPI_EXCLUSIVE) {
+       if (type == SOUND_DEVICE_WASAPI || type == SOUND_DEVICE_WASAPI_EXCLUSIVE || type == SOUND_DEVICE_PA) {
                struct sound_dp *s = sdp->data;
-               if (s && s->wasapipull) {
-                       return sdp->paused ? -1 : 1;
+               if (s && s->pullmode) {
+                       return sdp->paused || sdp->deactive ? -1 : 1;
                }
        }
        return 0;
@@ -2444,11 +2292,11 @@ int audio_pull_buffer(void)
        int cnt = 0;
        int type = sdp->devicetype;
        
-       if (sdp->paused)
+       if (sdp->paused || sdp->deactive)
                return 0;
-       if (type == SOUND_DEVICE_WASAPI || type == SOUND_DEVICE_WASAPI_EXCLUSIVE) {
+       if (type == SOUND_DEVICE_WASAPI || type == SOUND_DEVICE_WASAPI_EXCLUSIVE || type == SOUND_DEVICE_PA) {
                struct sound_dp *s = sdp->data;
-               if (s->wasapibufferlen > 0) {
+               if (s->pullbufferlen > 0) {
                        cnt++;
                        int size = (uae_u8*)paula_sndbufpt - (uae_u8*)paula_sndbuffer;
                        if (size > sdp->sndbufsize * 2 / 3)
@@ -2461,12 +2309,12 @@ int audio_pull_buffer(void)
 bool audio_is_pull_event(void)
 {
        int type = sdp->devicetype;
-       if (sdp->paused)
+       if (sdp->paused || sdp->deactive)
                return false;
-       if (type == SOUND_DEVICE_WASAPI || type == SOUND_DEVICE_WASAPI_EXCLUSIVE) {
+       if (type == SOUND_DEVICE_WASAPI || type == SOUND_DEVICE_WASAPI_EXCLUSIVE || type == SOUND_DEVICE_PA) {
                struct sound_dp *s = sdp->data;
-               if (s->wasapipull) {
-                       return WaitForSingleObject(s->wasapievent, 0) == WAIT_OBJECT_0;
+               if (s->pullmode) {
+                       return WaitForSingleObject(s->pullevent, 0) == WAIT_OBJECT_0;
                }
        }
        return false;
@@ -2475,9 +2323,9 @@ bool audio_is_pull_event(void)
 bool audio_finish_pull(void)
 {
        int type = sdp->devicetype;
-       if (sdp->paused)
+       if (sdp->paused || sdp->deactive)
                return false;
-       if (type != SOUND_DEVICE_WASAPI && type != SOUND_DEVICE_WASAPI_EXCLUSIVE)
+       if (type != SOUND_DEVICE_WASAPI && type != SOUND_DEVICE_WASAPI_EXCLUSIVE && type != SOUND_DEVICE_PA)
                return false;
        if (audio_pull_buffer() && audio_is_pull_event()) {
                return send_sound_do(sdp);
index c2051baf5dc3cdf6f1c2b07ffa697909d78ffd1c..c1cb1bb55471186198708d21bf0283c9f3eed292 100644 (file)
@@ -55,9 +55,6 @@ void close_sound_device (struct sound_data *sd);
 void pause_sound_device (struct sound_data *sd);
 void resume_sound_device (struct sound_data *sd);
 void set_volume_sound_device (struct sound_data *sd, int volume, int mute);
-int get_offset_sound_device (struct sound_data *sd);
-int blocking_sound_device (struct sound_data *sd);
-bool is_sound_buffer(void);
 
 #if SOUNDSTUFF > 0
 extern int outputsample, doublesample;
index ddeda5536eefec74a74ace1af5265d492f45c795..410fcf49002c15f01c39d9a64c6e90382864966c 100644 (file)
 #define LANG_DLL_FULL_VERSION_MATCH 1
 
 #if WINUAEPUBLICBETA
-#define WINUAEBETA _T("4")
+#define WINUAEBETA _T("5")
 #else
 #define WINUAEBETA _T("")
 #endif
 
-#define WINUAEDATE MAKEBD(2016, 8, 31)
+#define WINUAEDATE MAKEBD(2016, 9, 10)
 
 //#define WINUAEEXTRA _T("AmiKit Preview")
 //#define WINUAEEXTRA _T("Amiga Forever Edition")
index 7095d4ac91008f0c593849e139a2ab2ae80eb647..74368efb00da648ad8492b155714e956c8106ed1 100644 (file)
@@ -166,6 +166,7 @@ static void vsync_sleep (bool preferbusy)
        }
        if (dowait && (currprefs.m68k_speed >= 0 || currprefs.m68k_speed_throttle < 0))
                sleep_millis_main (1);
+       audio_finish_pull();
 }
 
 static void changevblankthreadmode_do (int newmode, bool fast)
index bd2811840341d56340fc61a8b9429e2b1623fb90..f00c0aea4a25607d22ce27999e04d6ad14b91966 100644 (file)
@@ -2788,7 +2788,7 @@ int DiskSelection_2 (HWND hDlg, WPARAM wParam, int flag, struct uae_prefs *prefs
                                TCHAR disk_name[32];
                                disk_name[0] = 0; disk_name[31] = 0;
                                GetDlgItemText (hDlg, IDC_CREATE_NAME, disk_name, 30);
-                               if (disk_creatediskfile (full_path, 0, (drive_type)SendDlgItemMessage (hDlg, IDC_FLOPPYTYPE, CB_GETCURSEL, 0, 0L), disk_name, ischecked (hDlg, IDC_FLOPPY_FFS), ischecked (hDlg, IDC_FLOPPY_BOOTABLE), NULL)) {
+                               if (disk_creatediskfile (&workprefs, full_path, 0, (drive_type)SendDlgItemMessage (hDlg, IDC_FLOPPYTYPE, CB_GETCURSEL, 0, 0L), disk_name, ischecked (hDlg, IDC_FLOPPY_FFS), ischecked (hDlg, IDC_FLOPPY_BOOTABLE), NULL)) {
                                        fullpath (full_path, sizeof full_path / sizeof (TCHAR));
                                        DISK_history_add (full_path, -1, HISTORY_FLOPPY, 0);
                                }
@@ -2798,7 +2798,7 @@ int DiskSelection_2 (HWND hDlg, WPARAM wParam, int flag, struct uae_prefs *prefs
                        TCHAR disk_name[32];
                        disk_name[0] = 0; disk_name[31] = 0;
                        GetDlgItemText (hDlg, IDC_CREATE_NAME, disk_name, 30);
-                       if (disk_creatediskfile (full_path, 1, (drive_type)SendDlgItemMessage (hDlg, IDC_FLOPPYTYPE, CB_GETCURSEL, 0, 0L), disk_name, ischecked (hDlg, IDC_FLOPPY_FFS), ischecked (hDlg, IDC_FLOPPY_BOOTABLE), NULL)) {
+                       if (disk_creatediskfile (&workprefs, full_path, 1, (drive_type)SendDlgItemMessage (hDlg, IDC_FLOPPYTYPE, CB_GETCURSEL, 0, 0L), disk_name, ischecked (hDlg, IDC_FLOPPY_FFS), ischecked (hDlg, IDC_FLOPPY_BOOTABLE), NULL)) {
                                fullpath (full_path, sizeof full_path / sizeof (TCHAR));
                                DISK_history_add (full_path, -1, HISTORY_FLOPPY, 0);
                        }
@@ -4240,54 +4240,82 @@ void InitializeListView (HWND hDlg)
                i = 0;
                if (full_property_sheet)
                        expansion_generate_autoconfig_info(&workprefs);
-               struct autoconfig_info *acip = NULL;
+               uaecptr highest_expamem = 0;
                for (;;) {
                        TCHAR tmp[200];
                        struct autoconfig_info *aci = expansion_get_autoconfig_data(full_property_sheet ? &workprefs : &currprefs, i);
-                       if (!aci)
+                       if (aci) {
+                               if (aci->zorro == 3 && aci->size != 0 && aci->start + aci->size > highest_expamem)
+                                       highest_expamem = aci->start + aci->size;
+                       }
+                       if (!aci && highest_expamem <= Z3BASE_UAE)
                                break;
-                       lvstruct.mask = LVIF_TEXT | LVIF_PARAM;
-                       if (aci->zorro >= 1 && aci->zorro <= 3)
+                       if (aci && aci->zorro >= 1 && aci->zorro <= 3)
                                _stprintf(tmp, _T("Z%d"), aci->zorro);
                        else
                                _tcscpy(tmp, _T("-"));
+                       lvstruct.mask = LVIF_TEXT | LVIF_PARAM;
                        lvstruct.pszText = tmp;
-                       lvstruct.lParam = expansion_can_move(&workprefs, i) ? 1 : 0;
+                       lvstruct.lParam = 0;
+                       if (aci) {
+                               // movable
+                               if (expansion_can_move(&workprefs, i))
+                                       lvstruct.lParam |= 1;
+                               // outside or crosses of 2G "border"
+                               if (aci->zorro == 3 && aci->start + aci->size > 0x80000000 || aci->start + aci->size < aci->start)
+                                       lvstruct.lParam |= 2;
+                               // outside of crosses 4G "border"
+                               if (aci->zorro == 3 && aci->start == 0xffffffff)
+                                       lvstruct.lParam |= 4;
+                               if (!full_property_sheet && (aci->zorro == 2 || aci->zorro == 3) && aci->addrbank && (aci->addrbank->flags & ABFLAG_RAM) && aci->addrbank->reserved_size) {
+                                       // failed to allocate
+                                       if (aci->addrbank->allocated_size == 0)
+                                               lvstruct.lParam |= 8;
+                                       // outside of JIT direct range
+                                       else if (canbang && (aci->addrbank->flags & ABFLAG_ALLOCINDIRECT))
+                                               lvstruct.lParam |= 16;
+                               }
+                       }
                        lvstruct.iItem = i;
                        lvstruct.iSubItem = 0;
                        result = ListView_InsertItem(list, &lvstruct);
                        tmp[0] = 0;
-                       TCHAR *s = tmp + _tcslen(tmp);
-                       if (aci->parent_of_previous) {
-                               if (acip && (acip->parent_name || acip->parent_address_space || acip->parent_romtype))
-                                       _tcscat(s, _T(" -- "));
-                               else
-                                       _tcscat(s, _T(" - "));
+                       TCHAR *s = tmp;
+                       if (aci && aci->parent_of_previous) {
+                               _tcscat(s, _T(" - "));
                        }
-                       if ((aci->parent_address_space || aci->parent_romtype) && !aci->parent_of_previous)
+                       if (aci && (aci->parent_address_space || aci->parent_romtype) && !aci->parent_of_previous)
                                _tcscat(s, _T("? "));
-                       _tcscat(s, aci->name);
+                       if (aci)
+                               _tcscat(s, aci->name);
                        ListView_SetItemText(list, result, 1, tmp);
-                       if (aci->start != 0xffffffff)
-                               _stprintf(tmp, _T("0x%08x"), aci->start);
-                       else
-                               _tcscpy(tmp, _T("-"));
-                       ListView_SetItemText(list, result, 2, tmp);
-                       if (aci->size != 0)
-                               _stprintf(tmp, _T("0x%08x"), aci->size);
-                       else
-                               _tcscpy(tmp, _T("-"));
-                       ListView_SetItemText(list, result, 3, tmp);
-                       if (aci->autoconfig_bytes[0] != 0xff)
-                               _stprintf(tmp, _T("0x%04x/0x%02x"),
+                       if (aci) {
+                               if (aci->start != 0xffffffff)
+                                       _stprintf(tmp, _T("0x%08x"), aci->start);
+                               else
+                                       _tcscpy(tmp, _T("-"));
+                               ListView_SetItemText(list, result, 2, tmp);
+                               if (aci->size != 0)
+                                       _stprintf(tmp, _T("0x%08x"), aci->size);
+                               else
+                                       _tcscpy(tmp, _T("-"));
+                               ListView_SetItemText(list, result, 3, tmp);
+                               if (aci->autoconfig_bytes[0] != 0xff)
+                                       _stprintf(tmp, _T("0x%04x/0x%02x"),
                                        (aci->autoconfig_bytes[4] << 8) | aci->autoconfig_bytes[5], aci->autoconfig_bytes[1]);
-                       else
-                               _tcscpy(tmp, _T("-"));
-                       ListView_SetItemText(list, result, 4, tmp);
+                               else
+                                       _tcscpy(tmp, _T("-"));
+                               ListView_SetItemText(list, result, 4, tmp);
+                       } else {
+                               _stprintf(tmp, _T("0x%08x"), highest_expamem);
+                               ListView_SetItemText(list, result, 2, tmp);
+                       }
                        i++;
-                       acip = aci;
+                       if (!aci)
+                               break;
                }
 
+
        } else if (lv_type == LV_MISC2) {
 
                listview_column_width[0] = 180;
@@ -8159,11 +8187,11 @@ static void setfastram_selectmenu(HWND hDlg, int mode)
                        }
                        SendDlgItemMessage(hDlg, IDC_MEMORYSELECT, CB_ADDSTRING, 0, (LPARAM)tmp);
                }
-               _tcscpy(tmp, _T("Motherboard Fast RAM"));
+               _tcscpy(tmp, _T("Processor Slot Fast RAM"));
                if (workprefs.mbresmem_high_size)
                        _stprintf(tmp + _tcslen(tmp), _T(" [%dM]"), workprefs.mbresmem_high_size / (1024 * 1024));
                SendDlgItemMessage(hDlg, IDC_MEMORYSELECT, CB_ADDSTRING, 0, (LPARAM)tmp);
-               _tcscpy(tmp, _T("Processor Slot Fast RAM"));
+               _tcscpy(tmp, _T("Motherboard Fast RAM"));
                if (workprefs.mbresmem_low_size)
                        _stprintf(tmp + _tcslen(tmp), _T(" [%dM]"), workprefs.mbresmem_low_size / (1024 * 1024));
                SendDlgItemMessage(hDlg, IDC_MEMORYSELECT, CB_ADDSTRING, 0, (LPARAM)tmp);
@@ -9974,7 +10002,6 @@ static INT_PTR CALLBACK BoardsDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM
                if (((LPNMHDR)lParam)->idFrom == IDC_BOARDLIST) {
                        switch (((LPNMHDR)lParam)->code)
                        {
-#if 0
                                case NM_CUSTOMDRAW:
                                {
                                        LPNMLVCUSTOMDRAW lpNMLVCD = (LPNMLVCUSTOMDRAW)lParam;
@@ -9985,17 +10012,33 @@ static INT_PTR CALLBACK BoardsDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM
                                                SetWindowLongPtr(hDlg, DWLP_MSGRESULT, CDRF_NOTIFYITEMDRAW | CDRF_NOTIFYSUBITEMDRAW);
                                                return TRUE;
                                                case CDDS_ITEMPREPAINT| CDDS_SUBITEM:
-                                               if (!lpNMLVCD->nmcd.lItemlParam) {
-                                                       
-                                                       lpNMLVCD->clrTextBk = RGB(255,0,0);
-                                                       SetWindowLongPtr(hDlg, DWLP_MSGRESULT, CDRF_NEWFONT);
-                                                       return TRUE;
+                                               {
+                                                       BOOL ret = FALSE;
+                                                       if (lpNMLVCD->nmcd.lItemlParam & 16) {
+                                                               lpNMLVCD->clrText = GetSysColor(COLOR_GRAYTEXT);
+                                                               SetWindowLongPtr(hDlg, DWLP_MSGRESULT, CDRF_NEWFONT);
+                                                               ret = TRUE;
+                                                       }
+                                                       if (lpNMLVCD->nmcd.lItemlParam & 8) {
+                                                               lpNMLVCD->clrTextBk = RGB(0xaa, 0x00, 0x00);
+                                                               SetWindowLongPtr(hDlg, DWLP_MSGRESULT, CDRF_NEWFONT);
+                                                               return TRUE;
+                                                       }
+                                                       if (lpNMLVCD->nmcd.lItemlParam & 4) {
+                                                               lpNMLVCD->clrTextBk = RGB(0xaa, 0xaa, 0x00);
+                                                               SetWindowLongPtr(hDlg, DWLP_MSGRESULT, CDRF_NEWFONT);
+                                                               return TRUE;
+                                                       }
+                                                       if (lpNMLVCD->nmcd.lItemlParam & 2) {
+                                                               lpNMLVCD->clrTextBk = GetSysColor(COLOR_INACTIVECAPTION);
+                                                               SetWindowLongPtr(hDlg, DWLP_MSGRESULT, CDRF_NEWFONT);
+                                                               return TRUE;
+                                                       }
+                                                       return ret;
                                                }
-                                               return FALSE;
                                        }
                                }
                                return CDRF_DODEFAULT;
-#endif
                                case NM_CLICK:
                                {
                                        int column;
@@ -12254,11 +12297,13 @@ static void inithdcontroller (HWND hDlg, int ctype, int ctype_unit, int devtype)
        SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER_UNIT, CB_RESETCONTENT, 0, 0);
        if (ctype >= HD_CONTROLLER_TYPE_IDE_FIRST && ctype <= HD_CONTROLLER_TYPE_IDE_LAST) {
                const struct expansionromtype *ert = get_unit_expansion_rom(ctype);
-               SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER_UNIT, CB_ADDSTRING, 0, (LPARAM)_T("0"));
-               SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER_UNIT, CB_ADDSTRING, 0, (LPARAM)_T("1"));
-               if (!ert || (ert->deviceflags & EXPANSIONTYPE_IDE_PORT_DOUBLED)) {
-                       SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER_UNIT, CB_ADDSTRING, 0, (LPARAM)_T("2"));
-                       SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER_UNIT, CB_ADDSTRING, 0, (LPARAM)_T("3"));
+               int ports = 2 + (ert ? ert->extrahdports : 0);
+               for (int i = 0; i < ports; i += 2) {
+                       TCHAR tmp[100];
+                       _stprintf(tmp, _T("%d"), i + 0);
+                       SendDlgItemMessage(hDlg, IDC_HDF_CONTROLLER_UNIT, CB_ADDSTRING, 0, (LPARAM)tmp);
+                       _stprintf(tmp, _T("%d"), i + 1);
+                       SendDlgItemMessage(hDlg, IDC_HDF_CONTROLLER_UNIT, CB_ADDSTRING, 0, (LPARAM)tmp);
                }
                ew(hDlg, IDC_HDF_CONTROLLER_UNIT, TRUE);
        } else if (ctype >= HD_CONTROLLER_TYPE_SCSI_FIRST && ctype <= HD_CONTROLLER_TYPE_SCSI_LAST) {
index b16684677fcd6246842b13de42eb56671a4cde46..cf4f3b9869a5ead11c6b0f3799868500bd8a39c0 100644 (file)
@@ -1,4 +1,50 @@
 \r
+\r
+JIT Direct current rules are less complex now. It automatically switches off only in following situations:\r
+  - Accelerator mirrored maprom address space is not JIT Direct compatible. (CyberStorm, Blizzards etc)\r
+  - RTG VRAM is outside of reserved natmem space. Workaround: Move RTG in earlier position using Hardware info GUI panel.\r
+  Note that in 64-bit version RTG VRAM must be inside of reserved natmem space. (Outside = error message and return back to GUI)\r
+\r
+- Buddha Z2 IDE controller emulation added. Catweasel Z2 model optionally selectable (Has nearly identical Buddha hardware, CW\r
+  part is not emulated). No ROMs added, flash rom images are available from manufacturer's web site. IDE doubler is not emulated.\r
+- Reset drive sound state when emulated Amiga is reset.\r
+- Z3 mapping = Automatic didn't choose UAE mode if JIT direct was enabled and Real mapping would not fit in allocated natmem space\r
+  but UAE mapping would fit.\r
+- Select UAE mode if Z3 mapping is automatic and UAE fits inside 2G barrier but Real does not. (To better match pre-3.4 behavior,\r
+  selecting Real in this mode can cause non-booting config if config has enough Z3 RAM)\r
+- 3G of Z3 RAM is now possible (3x1G Z3 boards). 64-bit WinUAE only, can't be fully JIT direct compatible.\r
+- Hardware info GUI panel shows also last Z3 address.\r
+- Hardware info shows Z3 board status info: dark background = outside of 2G border (can cause problems because some exec memory\r
+  functions that use bit 31 for error status, reset proof programs mainly use them, usually causes reboot loop). Yellow background = board does not\r
+  fit in address space (32-bit overflow, start address is also 0xffffffff in this situation). Red background = memory allocation failed.\r
+  Lighter text = JIT direct enabled but memory is not JIT direct capable.\r
+- SCSI emulation request sense always returned allocation field number of bytes even if command returned less data.\r
+- If ATAPI CD data transfer size is odd (which is not valid), ignore last byte.\r
+- NE2000 ISA is now available in x86 bridgeboard emulation. 100% untested!\r
+- Portaudio driver converted to pull mode.\r
+- Added Blizzard SCSI Kit III emulation and boot ROM v1.139.\r
+- Blizzard 1230 MK III ROM layout changed to match SCSI Kit III ROM. (Still no proper dump but I am sure this is correct)\r
+- Fixed M-TEC IDE controller emulation rom handling.\r
+- Low latency vsync + no buffer + WASAPI pull mode should be stable again. (RTG mode: todo)\r
+- Sound audio switch off didn't select correct timing method in WASAPI pull mode.\r
+- Small Z2 RAM (256k or smaller that goes in IO Z2 space) shadowed f00000 UAE Boot ROM in some configurations.\r
+- If only one or more Z3 RAM boards are outside of natmem and JIT direct is enabled: don't disable JIT direct completely but only\r
+  force non-JIT direct capable Z3 memory banks to use indirect mode.\r
+- Show Tecmar T-Card as "Zorro I" (prototype/unreleased version of autoconfig) board in Hardware info GUI.\r
+- Certain accelerators with autoconfig board didn't appear correctly in Hardware info panel.\r
+- Z2/Z3 memory bank that failed to allocate (out of memory) caused a crash.\r
+- Save image extended adf image was created with smaller max PAL size if emulation was not already started and in NTSC mode.\r
+- Some fake-DMA harddrive controllers with internal buffers crashed the emulation if GUI was opened during internal DMA operation\r
+  and CPU mode was compatible/cycle exact.\r
+- Separated memory bank pre-allocation and after allocation memory size variables.\r
+- Return correct SASI request sense data.\r
+\r
+Blizzard SCSI Kit III:\r
+- PIO-only! I thought all Phase 5 SCSI controllers were true DMA...\r
+- FAS408 SCSI chip which is FAS216 + 128 byte PIO FIFO buffer. (was annoying to emulate without datasheet..)\r
+- v1.39 ROM ("$VER: A1233_VERSION 1.139 (9.5.95)") added to ROM scanner.\r
+- Blizzard 1230 "MK I" to go.. (Does anyone have it? With or without SCSI Kit)\r
+\r
 Beta 4:\r
 \r
 - Fixed uaegfx 8-bit mode palette updates.\r
diff --git a/pci.cpp b/pci.cpp
index e1904746a350dcee751d1d12a6020b781404f4ce..b24bbd83e0ce628d2907a3ba98692114901855eb 100644 (file)
--- a/pci.cpp
+++ b/pci.cpp
@@ -1625,7 +1625,7 @@ static bool grex_pci_init(struct autoconfig_info *aci)
        map_banks(&pci_bridge_bank, 0xfffe0000 >> 16, 0x10000 >> 16, 0);
        pcib->io_offset = 0xfffa0000;
 
-       aci->addrbank = &expamem_nonautoconfig;
+       aci->zorro = 0;
        aci->parent_of_previous = true;
        aci->start = 0x80000000;
        aci->size = 0x80000000;
@@ -1662,7 +1662,7 @@ static bool cbvision(struct autoconfig_info *aci)
        map_banks(&pci_io_bank, 0xfffa0000 >> 16, 0x20000 >> 16, 0);
        map_banks(&pci_bridge_bank, 0xfffe0000 >> 16, 0x10000 >> 16, 0);
        pcib->io_offset = 0xfffa0000;
-       aci->addrbank = &expamem_nonautoconfig;
+       aci->zorro = 0;
        aci->parent_of_previous = true;
        return true;
 }
@@ -1988,6 +1988,6 @@ bool pci_expansion_init(struct autoconfig_info *aci)
 {
        static const int parent[] = { ROMTYPE_GREX, ROMTYPE_MEDIATOR, ROMTYPE_PROMETHEUS, 0 };
        aci->parent_romtype = parent;
-       aci->addrbank = &expamem_nonautoconfig;
+       aci->zorro = 0;
        return true;
 }
index 9fdf3d23a25cc7a433d0b56b53c96b9d97dae0dc..537ced2c4e126ea3445fdb4c3a46764bae6e9b1d 100644 (file)
@@ -4,6 +4,8 @@
  * Copyright (c) 2005-2006 Fabrice Bellard
  * Copyright (c) 2012 Herve Poussineau
  *
+ * Copyright (c) 2014-2016 Toni Wilen (pseudo-dma, fas408 PIO buffer)
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
  * in the Software without restriction, including without limitation the rights
 //#define ESP(obj) OBJECT_CHECK(SysBusESPState, (obj), TYPE_ESP)
 #define ESP(obj) (ESPState*)obj->lsistate
 
+#define ESPLOG 0
+
+static void esp_raise_ext_irq(ESPState * s)
+{
+       if (s->irq_raised)
+               return;
+       s->irq_raised = 1;
+       esp_irq_raise(s->irq);
+}
+
+static void esp_lower_ext_irq(ESPState * s)
+{
+       if (!s->irq_raised)
+               return;
+       s->irq_raised = 0;
+       esp_irq_lower(s->irq);
+}
+
+
 static void esp_raise_irq(ESPState *s)
 {
     if (!(s->rregs[ESP_RSTAT] & STAT_INT)) {
         s->rregs[ESP_RSTAT] |= STAT_INT;
-        esp_irq_raise(s->irq);
+               esp_raise_ext_irq(s);
     }
 }
 
@@ -58,10 +79,56 @@ static void esp_lower_irq(ESPState *s)
 {
     if (s->rregs[ESP_RSTAT] & STAT_INT) {
         s->rregs[ESP_RSTAT] &= ~STAT_INT;
-        esp_irq_lower(s->irq);
+               esp_lower_ext_irq(s);
     }
 }
 
+static void fas408_raise_irq(ESPState *s)
+{
+       if (!(s->rregs[ESP_REGS + NCR_PSTAT] & NCRPSTAT_SIRQ)) {
+               s->rregs[ESP_REGS + NCR_PSTAT] |= NCRPSTAT_SIRQ;
+               esp_raise_ext_irq(s);
+       }
+}
+
+static void fas408_lower_irq(ESPState *s)
+{
+       if (s->rregs[ESP_REGS + NCR_PSTAT] & NCRPSTAT_SIRQ) {
+               s->rregs[ESP_REGS + NCR_PSTAT] &= ~NCRPSTAT_SIRQ;
+               esp_lower_ext_irq(s);
+       }
+}
+
+static void fas408_check(ESPState *s)
+{
+       if (!s->fas4xxextra)
+               return;
+       bool irq = false;
+       int v = 0;
+       int len = 0;
+       if (s->fas408_buffer_size > 0) {
+               len = s->fas408_buffer_size - s->fas408_buffer_offset;
+       } else if ((s->rregs[ESP_RSTAT] & STAT_PIO_MASK) == 0) {
+               len = s->ti_size;
+       }
+       if (s->wregs[ESP_REGS + NCR_PSTAT] & 1) {
+               v |= len == 0 ? NCRPSTAT_FEMPT : 0;
+               v |= len >= 42 ? NCRPSTAT_F13 : 0;
+               v |= len >= 84 ? NCRPSTAT_F23 : 0;
+               v |= len >= 128 ? NCRPSTAT_FFULL : 0;
+               if ((s->wregs[ESP_REGS + NCR_PIOI] & v) & (NCRPSTAT_FEMPT | NCRPSTAT_F13 | NCRPSTAT_F23 | NCRPSTAT_FFULL)) {
+                       irq = true;
+               }
+       }
+       if (irq) {
+               v |= NCRPSTAT_SIRQ;
+               fas408_raise_irq(s);
+       } else {
+               fas408_lower_irq(s);
+       }
+       s->rregs[ESP_REGS + NCR_PSTAT] = v;
+}
+
 void esp_dma_enable(void *opaque, int level)
 {
        ESPState *s = (ESPState*)opaque;
@@ -144,7 +211,7 @@ static void do_busid_cmd(ESPState *s, uint8_t *buf, uint8_t busid)
     s->current_req = scsiesp_req_new(current_lun, 0, lun, buf, s);
     datalen = scsiesp_req_enqueue(s->current_req);
     s->ti_size = datalen;
-    if (datalen != 0) {
+       if (datalen != 0) {
                s->rregs[ESP_RSTAT] = 0;
                if (s->dma) {
                s->rregs[ESP_RSTAT] = STAT_TC;
@@ -343,7 +410,8 @@ void esp_command_complete(SCSIRequest *req, uint32_t status,
        s->dma_pending = 0;
     s->async_len = 0;
     s->status = status;
-    s->rregs[ESP_RSTAT] = STAT_ST;
+       fas408_check(s);
+       s->rregs[ESP_RSTAT] = STAT_ST;
     esp_dma_done(s);
     if (s->current_req) {
                scsiesp_req_unref(s->current_req);
@@ -379,6 +447,8 @@ static int handle_ti(ESPState *s)
 
        s->fifo_on = 1;
 
+       fas408_check(s);
+
     if (s->dma && !s->dma_enabled) {
         s->dma_cb = handle_ti;
         return 1;
@@ -433,7 +503,8 @@ void esp_hard_reset(ESPState *s)
     s->dma = 0;
     s->do_cmd = 0;
     s->dma_cb = NULL;
-
+       s->fas408_buffer_offset = 0;
+       s->fas408_buffer_size = 0;
     s->rregs[ESP_CFG1] = 7;
 }
 
@@ -449,11 +520,51 @@ static void parent_esp_reset(ESPState *s, int irq, int level)
     }
 }
 
+uint64_t fas408_read_fifo(void *opaque)
+{
+       ESPState *s = (ESPState*)opaque;
+       s->rregs[ESP_FIFO] = 0;
+       if (s->fas4xxextra && (s->wregs[ESP_REGS + NCR_PSTAT] & NCRPSTAT_PIOM) && (s->fas408_buffer_size > 0 || s->fas408_buffer_offset > 0 || (s->rregs[ESP_RSTAT] & STAT_PIO_MASK) == STAT_DO)) {
+               bool refill = true;
+               if (s->ti_size > 128) {
+                       s->rregs[ESP_FIFO] = s->async_buf[s->ti_rptr++];
+                       s->ti_size--;
+               } else if (!s->fas408_buffer_size) {
+                       if (s->ti_size) {
+                               memcpy(s->fas408_buffer, &s->async_buf[s->ti_rptr], s->ti_size);
+                               s->fas408_buffer_offset = 0;
+                               s->fas408_buffer_size = s->ti_size;
+                               s->ti_size = 0;
+                               if (s->current_req) {
+                                       scsiesp_req_continue(s->current_req);
+                               }
+                               s->ti_rptr = 0;
+                               s->ti_wptr = 0;
+                               s->pio_on = 0;
+                               s->fifo_on = 0;
+                               s->rregs[ESP_FIFO] = s->fas408_buffer[s->fas408_buffer_offset++];
+                       }
+               } else {
+                       s->rregs[ESP_FIFO] = s->fas408_buffer[s->fas408_buffer_offset++];
+                       if (s->fas408_buffer_offset >= s->fas408_buffer_size) {
+                               s->fas408_buffer_offset = s->fas408_buffer_size = 0;
+                       }
+               }
+               fas408_check(s);
+               return s->rregs[ESP_FIFO];
+       }
+       return 0;
+}
+
 uint64_t esp_reg_read(void *opaque, uint32_t saddr)
 {
        ESPState *s = (ESPState*)opaque;
        uint32_t old_val;
 
+       if (s->fas4xxextra && (s->wregs[0x0d] & 0x80)) {
+               saddr += ESP_REGS;
+       }
+
     switch (saddr) {
     case ESP_FIFO:
                if (s->fifo_on) {
@@ -510,17 +621,59 @@ uint64_t esp_reg_read(void *opaque, uint32_t saddr)
        }
        case ESP_RES4:
                return 0x80 | 0x20 | 0x2;
-    default:
-               //write_log("read unknown 53c94 register %02x\n", saddr);
+
+       // FAS408
+       case ESP_REGS + NCR_PIOFIFO:
+               return fas408_read_fifo(opaque);
+       case ESP_REGS + NCR_PSTAT:
+               fas408_check(s);
+               return s->rregs[ESP_REGS + NCR_PSTAT];
+       case ESP_REGS + NCR_SIGNTR:
+               s->fas408sig ^= 7;
+               return 0x58 | s->fas408sig;
+
+       default:
+#if    ESPLOG
+               write_log("read unknown 53c94 register %02x\n", saddr);
+#endif
                break;
     }
     return s->rregs[saddr];
 }
 
+
+void fas408_write_fifo(void *opaque, uint64_t val)
+{
+       ESPState *s = (ESPState*)opaque;
+       if (!s->fas4xxextra)
+               return;
+       s->fas408_buffer_offset = 0;
+       if (s->fas408_buffer_size < 128) {
+               s->fas408_buffer[s->fas408_buffer_size++] = (uint8_t)val;
+       }
+       fas408_check(s);
+       while ((s->wregs[ESP_REGS + NCR_PSTAT] & NCRPSTAT_PIOM) && s->ti_size < 0 && s->fas408_buffer_size > 0) {
+               s->async_buf[s->dma_pending++] = s->fas408_buffer[0];
+               s->fas408_buffer_size--;
+               if (s->fas408_buffer_size > 0) {
+                       memmove(s->fas408_buffer, s->fas408_buffer + 1, s->fas408_buffer_size);
+               }
+               if (s->dma_pending == s->async_len) {
+                       esp_fake_dma_done(opaque);
+                       break;
+               }
+       }
+}
+
+
 void esp_reg_write(void *opaque, uint32_t saddr, uint64_t val)
 {
        ESPState *s = (ESPState*)opaque;
 
+       if (s->fas4xxextra && (s->wregs[ESP_RES3] & 0x80)) {
+               saddr += ESP_REGS;
+       }
+
        switch (saddr) {
     case ESP_TCLO:
     case ESP_TCMID:
@@ -623,16 +776,52 @@ void esp_reg_write(void *opaque, uint32_t saddr, uint64_t val)
        case ESP_WSYNO:
         break;
     case ESP_CFG1:
-    case ESP_CFG2: case ESP_CFG3:
-    case ESP_RES3: case ESP_RES4:
+    case ESP_CFG2:
+       case ESP_CFG3:
+    case ESP_RES4:
         s->rregs[saddr] = val;
         break;
+       case ESP_RES3:
+               s->rregs[saddr] = val;
+               s->rregs[ESP_REGS + NCR_CFG5] = val;
+#if    ESPLOG
+               write_log("ESP_RES3 = %02x\n", (uint8_t)val);
+#endif
+               break;
        case ESP_WCCF:
        case ESP_WTEST:
         break;
-    default:
+       // FAS408
+       case ESP_REGS + NCR_PIOFIFO:
+               fas408_write_fifo(opaque, val);
+               break;
+       case ESP_REGS + NCR_PSTAT: // RW - PIO Status Register
+               s->rregs[ESP_REGS + NCR_PSTAT] = val;
+               fas408_check(s);
+#if    ESPLOG
+               write_log("NCR_PSTAT = %02x\n", (uint8_t)val);
+#endif
+               break;
+       case ESP_REGS + NCR_PIOI: // RW - PIO Interrupt Enable
+               s->rregs[ESP_REGS + NCR_PIOI] = val;
+               fas408_check(s);
+#if    ESPLOG
+               write_log("NCR_PIOI = %02x\n", (uint8_t)val);
+#endif
+               break;
+       case ESP_REGS + NCR_CFG5: // RW - Configuration #5
+               s->wregs[ESP_RES3] = val;
+               s->rregs[ESP_REGS + NCR_CFG5] = val;
+#if    ESPLOG
+               write_log("NCR_CFG5 = %02x\n", (uint8_t)val);
+#endif
+               break;
+       
+       default:
+#if    ESPLOG
                write_log("write unknown 53c94 register %02x\n", saddr);
-               //activate_debugger();
+#endif
         return;
     }
     s->wregs[saddr] = val;
@@ -826,12 +1015,13 @@ static void esp_register_types(void)
 type_init(esp_register_types)
 #endif
 
-void esp_scsi_init(DeviceState *dev, ESPDMAMemoryReadWriteFunc read, ESPDMAMemoryReadWriteFunc write)
+void esp_scsi_init(DeviceState *dev, ESPDMAMemoryReadWriteFunc read, ESPDMAMemoryReadWriteFunc write, bool fas4xxextra)
 {
        dev->lsistate = calloc(sizeof(ESPState), 1);
        ESPState *s = ESP(dev);
        s->dma_memory_read = read;
        s->dma_memory_write = write;
+       s->fas4xxextra = fas4xxextra;
 }
 
 void esp_scsi_reset(DeviceState *dev, void *privdata)
index 54d9ce544b22ed5bf994bd8733529465801771d9..8431f759c62615d19851db267e96bb594ae88788 100644 (file)
@@ -16,9 +16,10 @@ void esp_init(hwaddr espaddr, int it_shift,
 typedef struct ESPState ESPState;
 
 struct ESPState {
-    uint8_t rregs[ESP_REGS];
-    uint8_t wregs[ESP_REGS];
+    uint8_t rregs[ESP_REGS * 2];
+    uint8_t wregs[ESP_REGS * 2];
     qemu_irq irq;
+       int irq_raised;
     uint8_t chip_id;
     int32_t ti_size;
     uint32_t ti_rptr, ti_wptr;
@@ -49,6 +50,11 @@ struct ESPState {
     ESPDMAMemoryReadWriteFunc dma_memory_write;
     void *dma_opaque;
     int (*dma_cb)(ESPState *s);
+       bool fas4xxextra;
+       int fas408sig;
+       uint8_t fas408_buffer[128+1];
+       int fas408_buffer_size;
+       int fas408_buffer_offset;
 };
 
 #define ESP_TCLO   0x0
@@ -121,6 +127,55 @@ struct ESPState {
 #define TCHI_FAS100A 0x4
 #define TCHI_AM53C974 0x12
 
+
+/*
+The following registers are only on the ESP406/FAS408.  The
+documentation refers to them as "Control Register Set #1".
+These are the registers that are visible when bit 7 of
+register 0x0d is set.  This bit is common to both register sets.
+*/
+
+#define        NCR_JMP         0x00            /* RO - Jumper Sense Register   */
+#define         NCRJMP_RSVD    0xc0            /*      reserved                */
+#define         NCRJMP_ROMSZ   0x20            /*      ROM Size 1=16K, 0=32K   */
+#define         NCRJMP_J4      0x10            /*      Jumper #4               */
+#define         NCRJMP_J3      0x08            /*      Jumper #3               */
+#define         NCRJMP_J2      0x04            /*      Jumper #2               */
+#define         NCRJMP_J1      0x02            /*      Jumper #1               */
+#define         NCRJMP_J0      0x01            /*      Jumper #0               */
+
+#define        NCR_PIOFIFO     0x04            /* WO - PIO FIFO, 4 bytes deep  */
+
+#define        NCR_PSTAT       0x08            /* RW - PIO Status Register     */
+#define         NCRPSTAT_PERR  0x80            /*      PIO Error               */
+#define         NCRPSTAT_SIRQ  0x40            /*      Active High of SCSI IRQ */
+#define         NCRPSTAT_ATAI  0x20            /*      ATA IRQ                 */
+#define         NCRPSTAT_FEMPT 0x10            /*      PIO FIFO Empty          */
+#define         NCRPSTAT_F13   0x08            /*      PIO FIFO 1/3            */
+#define         NCRPSTAT_F23   0x04            /*      PIO FIFO 2/3            */
+#define         NCRPSTAT_FFULL 0x02            /*      PIO FIFO Full           */
+#define         NCRPSTAT_PIOM  0x01            /*      PIO/DMA Mode            */
+
+#define        NCR_PIOI        0x0b            /* RW - PIO Interrupt Enable    */
+#define         NCRPIOI_RSVD   0xe0            /*      reserved                */
+#define         NCRPIOI_EMPTY  0x10            /*      IRQ When Empty          */
+#define         NCRPIOI_13     0x08            /*      IRQ When 1/3            */
+#define         NCRPIOI_23     0x04            /*      IRQ When 2/3            */
+#define         NCRPIOI_FULL   0x02            /*      IRQ When Full           */
+#define         NCRPIOI_FINV   0x01            /*      Flag Invert             */
+
+#define        NCR_CFG5        0x0d            /* RW - Configuration #5        */
+#define         NCRCFG5_CRS1   0x80            /*      Select Register Set #1  */
+#define         NCRCFG5_SRAM   0x40            /*      SRAM Memory Map         */
+#define         NCRCFG5_AADDR  0x20            /*      Auto Address            */
+#define         NCRCFG5_PTRINC 0x10            /*      Pointer Increment       */
+#define         NCRCFG5_LOWPWR 0x08            /*      Low Power Mode          */
+#define         NCRCFG5_SINT   0x04            /*      SCSI Interrupt Enable   */
+#define         NCRCFG5_INTP   0x02            /*      INT Polarity            */
+#define         NCRCFG5_AINT   0x01            /*      ATA Interrupt Enable    */
+
+#define        NCR_SIGNTR      0x0e            /* RO - Signature */
+
 void esp_dma_enable(ESPState *s, int irq, int level);
 void esp_request_cancelled(SCSIRequest *req);
 void esp_command_complete(SCSIRequest *req, uint32_t status, size_t resid);
@@ -128,6 +183,8 @@ void esp_transfer_data(SCSIRequest *req, uint32_t len);
 void esp_hard_reset(ESPState *s);
 uint64_t esp_reg_read(ESPState *s, uint32_t saddr);
 void esp_reg_write(ESPState *s, uint32_t saddr, uint64_t val);
+uint64_t fas408_read_fifo(void *opaque);
+void fas408_write_fifo(void *opaque, uint64_t val);
 extern const VMStateDescription vmstate_esp;
 
 extern void esp_irq_raise(qemu_irq);
@@ -150,7 +207,7 @@ void esp_fake_dma_done(void *opaque);
 void esp_request_cancelled(SCSIRequest *req);
 void esp_command_complete(SCSIRequest *req, uint32_t status, size_t resid);
 void esp_transfer_data(SCSIRequest *req, uint32_t len);
-void esp_scsi_init(DeviceState *dev, ESPDMAMemoryReadWriteFunc read, ESPDMAMemoryReadWriteFunc write);
+void esp_scsi_init(DeviceState *dev, ESPDMAMemoryReadWriteFunc read, ESPDMAMemoryReadWriteFunc write, bool fas4xxextra);
 void esp_scsi_reset(DeviceState *dev, void *privdata);
 bool esp_dreq(DeviceState *dev);
 
index 8c83c4dbbc0057c2c39546f6857cf270a5f9e3bd..0c6903cce9db554c8deb06b9504985123afa32a1 100644 (file)
@@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path)
        return NULL;
 }
 
-#define NEXT_ROM_ID 167
+#define NEXT_ROM_ID 169
 
 #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 },
@@ -324,16 +324,24 @@ static struct romdata roms[] = {
 
        { _T("Blizzard 1230-II"), 0, 0, 0, 0, _T("B1230MKII\0"), 32768, 163, 0, 0, ROMTYPE_CB_B1230MK2, 0, 0, NULL,
        0xf307cd34, 0xd2f0bfe5, 0x6e84e9f2, 0x2dc11583, 0x30702fd7, 0xd59584ee },
-       { _T("Blizzard 1230-III"), 0, 0, 0, 0, _T("B1230MKIII\0"), 16384, 162, 0, 0, ROMTYPE_CB_B1230MK3, 0, 0, NULL,
-       0x6850607d, 0xfc37c96c, 0xfd22f442, 0xd7d64d21, 0x06683603, 0x2111fbae },
+       { _T("Blizzard 1230-III"), 0, 0, 0, 0, _T("B1230MKIII\0"), 32768, 162, 0, 0, ROMTYPE_CB_B1230MK3, 0, 0, NULL,
+       0x8412a22c, 0x3a4c55f3, 0xdaf62084, 0xd947e418, 0x137db019, 0xf13efc7d },
        { _T("Blizzard 1230-IV"), 0, 0, 0, 0, _T("B1230MKIV\0"), 32768, 89, 0, 0, ROMTYPE_CB_BLIZ1230, 0, 0, NULL,
        0x3078dbdc, 0x4d3e7fd0, 0xa1a4c3ae, 0xe17c5de3, 0xcbe1af03, 0x447aff92 },
        { _T("Blizzard 1240/1260"), 0, 0, 0, 0, _T("B1240\0B1260\0"), 32768, 90, 0, 0, ROMTYPE_CB_BLIZ1260, 0, 0, NULL,
        0xf88ae0f1, 0xf69aca4b,0xb13e3389,0x04676f0c,0x8616f8db,0x074c313d },
-       { _T("Blizzard 2060"), 8, 5, 8, 5, _T("B2060\0"), 65536, 92, 0, 0, ROMTYPE_CB_BLIZ2060, 0, 0, NULL,
-       0xce270bc0, 0xe043c1aa,0x3bb06e06,0xd4dabff3,0x0a8c6317,0xabfef2bb },
+
+       { _T("Blizzard 2060 v8.2"), 8, 2, 8, 2, _T("B2060\0"), 65536, 168, 0, 0, ROMTYPE_CB_BLIZ2060, 0, 0, NULL,
+       0x2f42af81, 0x003577b8, 0x4e1f2e59, 0x3add6c9f, 0xfd65a7b4, 0x2abaa933 },
+       ALTROMPN(168, 1, 1, 32768, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0xb5892212, 0x7282a8ca, 0xf7ab194d, 0x16e1d05a, 0x582f0ebf, 0x1046b3d0)
+       ALTROMPN(168, 1, 2, 32768, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x821a01c0, 0x6fd29f69, 0x28c5980e, 0x313b3b15, 0xb5d683ac, 0x209dd1bf)
+       { _T("Blizzard 2060 v8.5"), 8, 5, 8, 5, _T("B2060\0"), 65536, 92, 0, 0, ROMTYPE_CB_BLIZ2060, 0, 0, NULL,
+       0xce270bc0, 0xe043c1aa, 0x3bb06e06, 0xd4dabff3, 0x0a8c6317, 0xabfef2bb },
        ALTROMPN(92, 1, 1, 32768, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0xa6023f20, 0xdfb048d6, 0xbdc03587, 0x241e8121, 0x26aba603, 0xd69b0238)
        ALTROMPN(92, 1, 2, 32768, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x9635a9cd, 0x47578b27, 0xc4ba6e54, 0x891930dd, 0xcb4b6a45, 0x5d6b31b2)
+
+       { _T("Blizzard SCSI Kit III"), 1, 139, 1, 139, _T("BSCSIIII\0"), 65536, 167, 0, 0, ROMTYPE_BLIZKIT3, 0, 0, NULL,
+       0xfd2c772f, 0x1411c248, 0x72f7cb8d, 0xecbe4744, 0xf0b8d12a, 0x1aaaad44, NULL, _T("blizzard_scsi_kit_iv.rom") },
        { _T("Blizzard SCSI Kit IV"), 8, 5, 8, 5, _T("BSCSIIV\0"), 32768, 94, 0, 0, ROMTYPE_BLIZKIT4, 0, 0, NULL,
        0xf53a0fca, 0xefe17ca5,0x88c44a7f,0x0f8c62be,0x20f23278,0xcfe06727, NULL, _T("blizzard_scsi_kit_iv.rom") },
        { _T("Fastlane"), 8, 5, 8, 5, _T("FASTLANE\0"), 20788, 102, 0, 0, ROMTYPE_FASTLANE, 0, 0, NULL,
@@ -386,8 +394,8 @@ static struct romdata roms[] = {
        0xbfd68a88, 0x84a50880, 0x76917549, 0xadf33b16, 0x8a869adb, 0x9e5a6fac, NULL, NULL },
        { _T("IVS Vector 4.14"), 4, 14, 4, 14, _T("VECTOR030\0"), 65536, 166, 0, 0, ROMTYPE_CB_VECTOR, 0, 0, NULL,
        0x3befa0c0, 0x4414673c, 0xa52f78a0, 0xae656824, 0xfd08b54f, 0xa1de237c, NULL, NULL },
-       ALTROMPN(166, 1, 1, 32768, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0x541b5988, 0x3546517b, 0x57cecd2f, 0x9fbfcd0c, 0xf26fdbbf, 0xfb009e3e)
-       ALTROMPN(166, 1, 2, 32768, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0xb64e3bbf, 0xd6f4fc81, 0x38325a78, 0x74ff1c15, 0x7c93f1a2, 0x444904ae)
+       ALTROMPN(166, 1, 1, 32768, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0xb64e3bbf, 0xd6f4fc81, 0x38325a78, 0x74ff1c15, 0x7c93f1a2, 0x444904ae)
+       ALTROMPN(166, 1, 2, 32768, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x541b5988, 0x3546517b, 0x57cecd2f, 0x9fbfcd0c, 0xf26fdbbf, 0xfb009e3e)
 
        { _T("Preferred Technologies Nexus"), 1, 0, 1, 0, _T("PTNEXUS\0"), 8192, 139, 0, 0, ROMTYPE_PTNEXUS, 0, 0, NULL,
        0xf495879a, 0xa3bd0202, 0xe14aa5b6, 0x49d3ce88, 0x22975950, 0x6500dbc2, NULL, NULL },
@@ -443,7 +451,7 @@ 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,
+       { _T("Multi Evolution 500/2000"), 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)
index 13905c3440970cdcdfe3f2ddc3cb10922ca42655..d486d4ec4dcf71353c7c1826719b926f6a4e3752 100644 (file)
--- a/scsi.cpp
+++ b/scsi.cpp
@@ -253,19 +253,24 @@ static void showsense(struct scsi_data *sd)
 }
 static void copysense(struct scsi_data *sd)
 {
+       bool sasi = sd->hfd && (sd->hfd->ci.unit_feature_level >= HD_LEVEL_SASI && sd->hfd->ci.unit_feature_level <= HD_LEVEL_SASI_ENHANCED);
        int len = sd->cmd[4];
        if (log_scsiemu)
                write_log (_T("REQUEST SENSE length %d (%d)\n"), len, sd->sense_len);
-       if (len == 0)
+       if (len == 0 || sasi)
                len = 4;
        memset(sd->buffer, 0, len);
-       memcpy(sd->buffer, sd->sense, sd->sense_len > len ? len : sd->sense_len);
+       int tlen = sd->sense_len > len ? len : sd->sense_len;
+       memcpy(sd->buffer, sd->sense, tlen);
        if (len > 7 && sd->sense_len > 7)
                sd->buffer[7] = sd->sense_len - 8;
-       if (sd->sense_len == 0)
+       if (sasi) {
+               sd->buffer[0] = sd->sense[12]; // 0 <- ASC
+       } else if (sd->sense_len == 0) {
                sd->buffer[0] = 0x70;
+       }
        showsense (sd);
-       sd->data_len = len;
+       sd->data_len = tlen;
        scsi_clear_sense(sd);
 }
 static void copyreply(struct scsi_data *sd)
@@ -539,6 +544,10 @@ void scsi_start_transfer(struct scsi_data *sd)
 
 int scsi_send_data(struct scsi_data *sd, uae_u8 b)
 {
+       if (sd->offset < 0) {
+               write_log(_T("SCSI data offset is negative!\n"));
+               return 0;
+       }
        if (sd->direction == 1) {
                if (sd->offset >= sd->buffer_size) {
                        write_log (_T("SCSI data buffer overflow!\n"));
@@ -756,7 +765,7 @@ struct soft_scsi
        uae_u16 databuffer[2];
        bool databuffer_empty;
 
-       // kronos
+       // kronos/xebec
        uae_u8 *databufferptr;
        int databuffer_size;
        int db_read_index;
@@ -2038,9 +2047,6 @@ static int xebec_reg(struct soft_scsi *ncr, uaecptr addr)
                        return 0x80000 + (addr & 32767);
                return -1;
        }
-
-//     if (addr >= 0x10000)
-//             write_log(_T("XEBEC %08x PC=%08x\n"), addr, M68K_GETPC);
        return -1;
 }
 
@@ -2216,8 +2222,7 @@ static void tecmar_clock_bput(int addr, uae_u8 v)
 {
        if (addr == 0) {
                tecmar_clock_reg_select = v & 63;
-       }
-       else if (addr == 1) {
+       } else if (addr == 1) {
                tecmar_clock_regs[tecmar_clock_reg_select] = v;
                tecmar_clock_regs[12] = 0x00;
                tecmar_clock_regs[13] = 0x80;
@@ -2228,8 +2233,7 @@ static uae_u8 tecmar_clock_bget(int addr)
        uae_u8 v = 0;
        if (addr == 0) {
                v = tecmar_clock_reg_select;
-       }
-       else if (addr == 1) {
+       } else if (addr == 1) {
                time_t t = time(0);
                t += currprefs.cs_rtc_adjust;
                struct tm *ct = localtime(&t);
@@ -2585,7 +2589,8 @@ static uae_u32 ncr80_bget2(struct soft_scsi *ncr, uaecptr addr, int size)
                if (reg >= 0 && reg < 8) {
                        v = ncr5380_bget(ncr, reg);
                } else if (reg >= 0x80000) {
-                       v = ncr->databufferptr[reg & (ncr->databuffer_size - 1)];
+                       int offset = reg & (ncr->databuffer_size - 1);
+                       v = ncr->databufferptr[offset];
                }
 
        } else if (ncr->type == NONCR_MICROFORGE) {
@@ -2882,7 +2887,8 @@ static void ncr80_bput2(struct soft_scsi *ncr, uaecptr addr, uae_u32 val, int si
                if (reg >= 0 && reg < 8) {
                        ncr5380_bput(ncr, reg, val);
                } else if (reg >= 0x80000) {
-                       ncr->databufferptr[reg & (ncr->databuffer_size - 1)] = val;
+                       int offset = reg & (ncr->databuffer_size - 1);
+                       ncr->databufferptr[offset] = val;
                }
 
        } else if (ncr->type == NONCR_MICROFORGE) {
@@ -3654,6 +3660,7 @@ bool tecmar_init(struct autoconfig_info *aci)
 
        aci->hardwired = true;
        if (!aci->doinit) {
+               aci->zorro = 1;
                aci->autoconfigp = ac;
                return true;
        }
@@ -3690,6 +3697,9 @@ void tecmar_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi
 
 bool microforge_init(struct autoconfig_info *aci)
 {
+       aci->start = 0xef0000;
+       aci->size = 0x10000;
+       aci->zorro = 0;
        if (!aci->doinit)
                return true;
 
@@ -3699,8 +3709,8 @@ bool microforge_init(struct autoconfig_info *aci)
 
        scsi->configured = 1;
 
-       map_banks(scsi->bank, 0xef0000 >> 16, 0x10000 >> 16, 0);
-       scsi->baseaddress = 0xef0000;
+       map_banks(scsi->bank, aci->start >> 16, aci->size >> 16, 0);
+       scsi->baseaddress = aci->start;
        return true;
 }
 
@@ -3711,6 +3721,8 @@ void microforge_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romc
 
 bool xebec_init(struct autoconfig_info *aci)
 {
+       aci->start = 0x600000;
+       aci->size = 0x800000 - aci->start;
        if (!aci->doinit)
                return true;
 
@@ -3720,9 +3732,9 @@ bool xebec_init(struct autoconfig_info *aci)
 
        scsi->configured = 1;
 
-       map_banks(scsi->bank, 0x600000 >> 16, (0x800000 - 0x600000) >> 16, 0);
+       map_banks(scsi->bank, aci->start >> 16, aci->size >> 16, 0);
        scsi->board_mask = 0x1fffff;
-       scsi->baseaddress = 0x600000;
+       scsi->baseaddress = aci->start;
        scsi->level6 = true;
        scsi->intena = true;
        scsi->dma_controller = true;
@@ -3787,15 +3799,17 @@ void hda506_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi
 
 bool alf1_init(struct autoconfig_info *aci)
 {
+       aci->start = 0xef0000;
+       aci->size = 0x10000;
        if (!aci->doinit)
                return true;
 
        struct soft_scsi *scsi = getscsi(aci->rc);
        if (!scsi)
                return false;
-       map_banks(scsi->bank, 0xef0000 >> 16, 0x10000 >> 16, 0);
-       scsi->board_mask = 0xffff;
-       scsi->baseaddress = 0xef0000;
+       map_banks(scsi->bank, aci->start >> 16, aci->size >> 16, 0);
+       scsi->board_mask = aci->size - 1;
+       scsi->baseaddress = aci->start;
        scsi->configured = 1;
        aci->addrbank = scsi->bank;
        return true;
@@ -3808,15 +3822,17 @@ void alf1_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig
 
 bool promigos_init(struct autoconfig_info *aci)
 {
+       aci->start = 0xf40000;
+       aci->size = 0x10000;
        if (!aci->doinit)
                return true;
 
        struct soft_scsi *scsi = getscsi(aci->rc);
        if (!scsi)
                return false;
-       map_banks(scsi->bank, 0xf40000 >> 16, 0x10000 >> 16, 0);
-       scsi->board_mask = 0xffff;
-       scsi->baseaddress = 0xf40000;
+       map_banks(scsi->bank, aci->start >> 16, aci->size >> 16, 0);
+       scsi->board_mask = aci->size - 1;
+       scsi->baseaddress = aci->start;
        scsi->configured = 1;
        scsi->intena = true;
 
@@ -3831,6 +3847,9 @@ void promigos_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romcon
 
 bool system2000_init(struct autoconfig_info *aci)
 {
+       aci->start = 0xf00000;
+       aci->size = 0x10000;
+
        if (!aci->doinit)
                return true;
 
@@ -3838,9 +3857,9 @@ bool system2000_init(struct autoconfig_info *aci)
 
        if (!scsi)
                return false;
-       map_banks(scsi->bank, 0xf00000 >> 16, 0x10000 >> 16, 0);
-       scsi->board_mask = 0xffff;
-       scsi->baseaddress = 0xf00000;
+       map_banks(scsi->bank, aci->start >> 16, aci->size >> 16, 0);
+       scsi->board_mask = aci->size - 1;
+       scsi->baseaddress = aci->start;
        scsi->configured = 1;
        if (!aci->rc->autoboot_disabled) {
                load_rom_rc(aci->rc, ROMTYPE_SYSTEM2000, 16384, 0, scsi->rom, 16384, 0);
@@ -3856,6 +3875,9 @@ void system2000_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romc
 
 bool omtiadapter_init(struct autoconfig_info *aci)
 {
+       aci->start = 0x8f0000;
+       aci->size = 0x10000;
+
        if (!aci->doinit)
                return true;
 
@@ -3863,9 +3885,9 @@ bool omtiadapter_init(struct autoconfig_info *aci)
 
        if (!scsi)
                return false;
-       map_banks(scsi->bank, 0x8f0000 >> 16, 0x10000 >> 16, 0);
-       scsi->board_mask = 0xffff;
-       scsi->baseaddress = 0x8f0000;
+       map_banks(scsi->bank, aci->start >> 16, aci->size >> 16, 0);
+       scsi->board_mask = aci->size - 1;
+       scsi->baseaddress = aci->start;
        scsi->configured = 1;
        aci->addrbank = scsi->bank;
        return true;
index 99c23e8b8ee2780391bb813015547cc3e8547d13..0907692d982058c9f14c0ed53cf537e156f98f3f 100644 (file)
@@ -215,9 +215,9 @@ static uae_u32 emulib_ExitEmu(void)
 static uae_u32 emulib_GetUaeConfig(TrapContext *ctx, uaecptr place)
 {
        trap_put_long(ctx, place, version);
-       trap_put_long(ctx, place + 4, chipmem_bank.allocated);
-       trap_put_long(ctx, place + 8, bogomem_bank.allocated);
-       trap_put_long(ctx, place + 12, fastmem_bank[0].allocated);
+       trap_put_long(ctx, place + 4, chipmem_bank.allocated_size);
+       trap_put_long(ctx, place + 8, bogomem_bank.allocated_size);
+       trap_put_long(ctx, place + 12, fastmem_bank[0].allocated_size);
        trap_put_long(ctx, place + 16, currprefs.gfx_framerate);
        trap_put_long(ctx, place + 20, currprefs.produce_sound);
        trap_put_long(ctx, place + 24, currprefs.jports[0].id | (currprefs.jports[1].id << 8));
diff --git a/x86.cpp b/x86.cpp
index 42ce3188a7aac7d7baad16a66ec11ee565064a3c..4e9cd9550b65acc551548a16cdba3fc9e2040dfe 100644 (file)
--- a/x86.cpp
+++ b/x86.cpp
@@ -38,6 +38,7 @@
 #include "scsi.h"
 #include "idecontrollers.h"
 #include "gfxboard.h"
+#include "pci_hw.h"
 
 #include "dosbox/dosbox.h"
 #include "dosbox/mem.h"
@@ -56,9 +57,6 @@ extern Bit32s CPU_Cycles;
 #define TYPE_2286 3
 #define TYPE_2386 4
 
-void x86_reset(void);
-int x86_execute(void);
-
 void exec86(uint32_t execloops);
 void reset86(int v20);
 void intcall86(uint8_t intnum);
@@ -151,6 +149,10 @@ struct x86_bridge
        float dosbox_tick_vpos_cnt;
        struct romconfig *rc;
        int vgaboard;
+       const struct pci_board *ne2000_isa;
+       struct pci_board_state *ne2000_isa_board_state;
+       int ne2000_io;
+       int ne2000_irq;
 };
 static int x86_found;
 
@@ -1749,6 +1751,11 @@ void portout(uint16_t portnum, uint8_t v)
 
        set_pc_io_access(xb, portnum, true);
 
+       if (xb->ne2000_isa && portnum >= xb->ne2000_io && portnum < xb->ne2000_io + 32) {
+               xb->ne2000_isa->bars[0].bput(xb->ne2000_isa_board_state, portnum - xb->ne2000_io, v);
+               goto end;
+       }
+
        switch(portnum)
        {
                case 0x20:
@@ -2173,6 +2180,7 @@ void portout(uint16_t portnum, uint8_t v)
                break;
        }
 
+end:
 #if X86_IO_PORT_DEBUG
        write_log(_T("X86_OUT %08x %02X\n"), portnum, v);
 #endif
@@ -2182,6 +2190,13 @@ void portout(uint16_t portnum, uint8_t v)
 }
 void portout16(uint16_t portnum, uint16_t value)
 {
+       struct x86_bridge *xb = bridges[0];
+
+       if (xb->ne2000_isa && portnum >= xb->ne2000_io && portnum < xb->ne2000_io + 32) {
+               xb->ne2000_isa->bars[0].wput(xb->ne2000_isa_board_state, portnum - xb->ne2000_io, value);
+               return;
+       }
+
        switch (portnum)
        {
                case 0x170:
@@ -2228,6 +2243,12 @@ uint8_t portin(uint16_t portnum)
        set_pc_io_access(xb, portnum, false);
 
        uae_u8 v = xb->io_ports[portnum];
+
+       if (xb->ne2000_isa && portnum >= xb->ne2000_io && portnum < xb->ne2000_io + 32) {
+               v = xb->ne2000_isa->bars[0].bget(xb->ne2000_isa_board_state, portnum - xb->ne2000_io);
+               goto end;
+       }
+
        switch (portnum)
        {
                case 0x20:
@@ -2646,7 +2667,8 @@ uint8_t portin(uint16_t portnum)
                write_log(_T("X86_IN unknown %02x\n"), portnum);
                return 0;
        }
-       
+
+end:
        if (aio >= 0)
                v = xb->amiga_io[aio];
 
@@ -2658,7 +2680,12 @@ uint8_t portin(uint16_t portnum)
 }
 uint16_t portin16(uint16_t portnum)
 {
+       struct x86_bridge *xb = bridges[0];
        uae_u16 v = 0;
+       if (xb->ne2000_isa && portnum >= xb->ne2000_io && portnum < xb->ne2000_io + 32) {
+               v = xb->ne2000_isa->bars[0].wget(xb->ne2000_isa_board_state, portnum - xb->ne2000_io);
+               return v;
+       }
        switch (portnum)
        {
                case 0x170:
@@ -2959,6 +2986,12 @@ void x86_bridge_reset(void)
                struct x86_bridge *xb = bridges[i];
                if (!xb)
                        continue;
+               if (xb->ne2000_isa) {
+                       xb->ne2000_isa->free(xb->ne2000_isa_board_state);
+                       xb->ne2000_isa = NULL;
+                       xfree(xb->ne2000_isa_board_state);
+                       xb->ne2000_isa_board_state = NULL;
+               }
                if (xb->dosbox_cpu) {
                        if (xb->cmosfile) {
                                uae_u8 *regs = x86_cmos_regs(NULL);
@@ -3079,6 +3112,9 @@ void x86_bridge_hsync(void)
 
        check_floppy_delay();
 
+       if (xb->ne2000_isa)
+               xb->ne2000_isa->hsync(xb->ne2000_isa_board_state);
+
        if (!xb->x86_reset) {
                if (xb->dosbox_cpu) {
                        xb->dosbox_tick_vpos_cnt++;
@@ -3157,6 +3193,9 @@ static void bridge_reset(struct x86_bridge *xb)
        memcpy(xb->pc_ram + 0x100000 - xb->bios_size, xb->pc_rom + 0x100000 - xb->bios_size, xb->bios_size);
        setrombank(xb, 0x100000 - xb->bios_size, xb->bios_size);
 
+       if (xb->ne2000_isa)
+               xb->ne2000_isa->reset(xb->ne2000_isa_board_state);
+
        xb->amiga_io[IO_CONTROL_REGISTER] =     0xfe;
        xb->amiga_io[IO_PC_INTERRUPT_CONTROL] = 0xff;
        xb->amiga_io[IO_INTERRUPT_MASK] = 0xff;
@@ -3210,6 +3249,12 @@ int is_x86_cpu(struct uae_prefs *p)
        return X86_STATE_ACTIVE;
 }
 
+static void ne2000_isa_irq_callback(struct pci_board_state *pcibs, bool irq)
+{
+       struct x86_bridge *xb = bridges[0];
+       x86_doirq(xb->ne2000_irq);
+}
+
 static void load_vga_bios(void)
 {
        struct x86_bridge *xb = bridges[0];
@@ -3351,6 +3396,82 @@ bool x86_bridge_init(struct autoconfig_info *aci, uae_u32 romtype, int type)
                        }
                }
        }
+
+       if (cfgfile_board_enabled(&currprefs, ROMTYPE_NE2KISA, 0)) {
+               struct romconfig *rc = get_device_romconfig(&currprefs, ROMTYPE_NE2KISA, 0);
+               if (rc) {
+                       xb->ne2000_isa = &ne2000_pci_board;
+                       xb->ne2000_isa_board_state = xcalloc(pci_board_state, 1);
+                       xb->ne2000_isa_board_state->irq_callback = ne2000_isa_irq_callback;
+                       switch (rc->device_settings & 7)
+                       {
+                               case 0:
+                               xb->ne2000_io = 0x240;
+                               break;
+                               case 1:
+                               xb->ne2000_io = 0x260;
+                               break;
+                               case 2:
+                               xb->ne2000_io = 0x280;
+                               break;
+                               case 3:
+                               xb->ne2000_io = 0x2a0;
+                               break;
+                               case 4:
+                               default:
+                               xb->ne2000_io = 0x300;
+                               break;
+                               case 5:
+                               xb->ne2000_io = 0x320;
+                               break;
+                               case 6:
+                               xb->ne2000_io = 0x340;
+                               break;
+                               case 7:
+                               xb->ne2000_io = 0x360;
+                               break;
+                       }
+                       switch ((rc->device_settings >> 3) & 15)
+                       {
+                               case 0:
+                               xb->ne2000_irq = 3;
+                               break;
+                               case 1:
+                               xb->ne2000_irq = 4;
+                               break;
+                               case 2:
+                               xb->ne2000_irq = 5;
+                               break;
+                               case 3:
+                               default:
+                               xb->ne2000_irq = 7;
+                               break;
+                               case 4:
+                               xb->ne2000_irq = 9;
+                               break;
+                               case 5:
+                               xb->ne2000_irq = 10;
+                               break;
+                               case 6:
+                               xb->ne2000_irq = 11;
+                               break;
+                               case 7:
+                               xb->ne2000_irq = 12;
+                               break;
+                               case 8:
+                               xb->ne2000_irq = 15;
+                               break;
+                       }
+                       if (xb->ne2000_isa->init(xb->ne2000_isa_board_state)) {
+                               write_log(_T("NE2000 ISA configured, IO=%3X, IRQ=%d\n"), xb->ne2000_io, xb->ne2000_irq);
+                       } else {
+                               xb->ne2000_isa = NULL;
+                               xfree(xb->ne2000_isa_board_state);
+                               xb->ne2000_isa_board_state = NULL;
+                       }
+               }
+       }
+
        xb->vgaboard = -1;
        for (int i = 0; i < MAX_RTG_BOARDS; i++) {
                if (currprefs.rtgboards[i].rtgmem_type == GFXBOARD_VGA) {
@@ -3388,7 +3509,8 @@ bool x86_bridge_init(struct autoconfig_info *aci, uae_u32 romtype, int type)
        if (!load_rom_rc(rc, romtype, xb->bios_size, 0, xb->pc_rom + 0x100000 - xb->bios_size, xb->bios_size, LOADROM_FILL)) {
                error_log(_T("Bridgeboard BIOS failed to load"));
                x86_bridge_free();
-               return &expamem_null;
+               aci->addrbank = &expamem_null;
+               return false;
        }
        memcpy(xb->pc_ram + 0x100000 - xb->bios_size, xb->pc_rom + 0x100000 - xb->bios_size, xb->bios_size);
        setrombank(xb, 0x100000 - xb->bios_size, xb->bios_size);
@@ -3420,6 +3542,14 @@ bool a2386_init(struct autoconfig_info *aci)
        return x86_bridge_init(aci, ROMTYPE_A2386, TYPE_2386);
 }
 
+bool isa_expansion_init(struct autoconfig_info *aci)
+{
+       static const int parent[] = { ROMTYPE_A1060, ROMTYPE_A2088, ROMTYPE_A2088T, ROMTYPE_A2286, ROMTYPE_A2386, 0 };
+       aci->parent_romtype = parent;
+       aci->zorro = 0;
+       return true;
+}
+
 /* dosbox cpu core support stuff */
 
 void IO_WriteB(Bitu port, Bitu val)