]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
2810b1
authorToni Wilen <twilen@winuae.net>
Wed, 14 May 2014 17:27:21 +0000 (20:27 +0300)
committerToni Wilen <twilen@winuae.net>
Wed, 14 May 2014 17:27:21 +0000 (20:27 +0300)
36 files changed:
audio.cpp
blitter.cpp
blkdev_cdimage.cpp
cfgfile.cpp
cia.cpp
custom.cpp
debug.cpp
disk.cpp
events.cpp
filesys.cpp
gencpu.cpp
include/debug.h
include/events.h
include/fsdb.h
include/inputdevice.h
include/memory.h
include/options.h
inputdevice.cpp
newcpu.cpp
od-win32/caps/CapsAPI.h
od-win32/dinput.cpp
od-win32/direct3d.cpp
od-win32/direct3d.h
od-win32/makeexe.cmd
od-win32/resources/resource.h
od-win32/resources/winuae.rc
od-win32/resources/winuae_minimal.rc
od-win32/rp.cpp
od-win32/srcrelease.cmd
od-win32/win32.cpp
od-win32/win32.h
od-win32/win32_scaler.cpp
od-win32/win32gfx.cpp
od-win32/win32gui.cpp
od-win32/winuaechangelog.txt
od-win32/wix/Product.wxs

index 1ab0a21aa9770eee18dcf60d1ea25c8875a7dacd..6c0b13ff1d23bc61c060efb0e447c62ddba4329f 100644 (file)
--- a/audio.cpp
+++ b/audio.cpp
@@ -66,20 +66,11 @@ static bool debugchannel (int ch)
 }
 #endif
 
-STATIC_INLINE bool usehacks(void)
+STATIC_INLINE bool usehacks(void)
 {
        return currprefs.cpu_model >= 68020 || currprefs.m68k_speed != 0;
 }
 
-#if 0
-STATIC_INLINE bool usehacks2 (void)
-{
-       if (currprefs.cpu_cycle_exact && currprefs.cpu_model <= 68020)
-               return false;
-       return currprefs.cpu_model >= 68020 || currprefs.m68k_speed != 0;
-}
-#endif
-
 #define SINC_QUEUE_MAX_AGE 2048
 /* Queue length 256 implies minimum emulated period of 8. This should be
  * sufficient for all imaginable purposes. This must be power of two. */
@@ -122,6 +113,7 @@ struct audio_channel_data {
        uaecptr ptx;
        bool ptx_written;
        bool ptx_tofetch;
+       int dmaofftime_active;
 };
 
 static int samplecnt;
@@ -1058,6 +1050,7 @@ static void zerostate (int nr)
        cdp->evtime = MAX_EV;
        cdp->intreq2 = 0;
        cdp->dmaenstore = false;
+       cdp->dmaofftime_active = 0;
 #if TEST_AUDIO > 0
        cdp->have_dat = false;
 #endif
@@ -1265,18 +1258,24 @@ static void audio_state_channel2 (int nr, bool perfin)
        }
        audio_activate ();
 
-       if ((cdp->state == 2 || cdp->state == 3) && usehacks1 () && !chan_ena && old_dma) {
-               // DMA switched off, state=2/3 and "too fast CPU": kill DMA instantly
-               // or CPU timed DMA wait routines in common tracker players will lose notes
+       if ((cdp->state == 2 || cdp->state == 3) && usehacks()) {
+               if (!chan_ena && old_dma) {
+                       // DMA switched off, state=2/3 and "too fast CPU": set flag
+                       cdp->dmaofftime_active = true;
+               }
+               if (cdp->dmaofftime_active && !old_dma && chan_ena) {
+                       // We are still in state=2/3 and program is going to re-enable
+                       // DMA. Force state to zero to prevent CPU timed DMA wait
+                       // routines in common tracker players to lose notes.
 #if DEBUG_AUDIO_HACK > 0
-               if (debugchannel (nr))
-                       write_log (_T("%d: INSTADMAOFF\n"), nr, M68K_GETPC);
+                       if (debugchannel (nr))
+                               write_log (_T("%d: INSTADMAOFF\n"), nr, M68K_GETPC);
 #endif
-               newsample (nr, (cdp->dat2 >> 0) & 0xff);
-               if (napnav)
-                       setirq (nr, 91);
-               zerostate (nr);
-               return;
+                       newsample (nr, (cdp->dat2 >> 0) & 0xff);
+//                     if (napnav)
+//                             setirq (nr, 91);
+                       zerostate (nr);
+               }
        }
 
 #if DEBUG_AUDIO > 0
@@ -1312,7 +1311,7 @@ static void audio_state_channel2 (int nr, bool perfin)
                        cdp->state = 2;
                        setirq (nr, 0);
                        loaddat (nr);
-                       if (usehacks() && cdp->per < 10 * CYCLE_UNIT) {
+                       if (usehacks() && cdp->per < 10 * CYCLE_UNIT) {
                                // make sure audio.device AUDxDAT startup returns to idle state before DMA is enabled
                                newsample (nr, (cdp->dat2 >> 0) & 0xff);
                                zerostate (nr);
@@ -1864,7 +1863,7 @@ void AUDxLCH (int nr, uae_u16 v)
 
        // someone wants to update PT but DSR has not yet been processed.
        // too fast CPU and some tracker players: enable DMA, CPU delay, update AUDxPT with loop position
-       if (usehacks() && ((cdp->ptx_tofetch && cdp->state == 1) || cdp->ptx_written)) {
+       if (usehacks() && ((cdp->ptx_tofetch && cdp->state == 1) || cdp->ptx_written)) {
                cdp->ptx = cdp->lc;
                cdp->ptx_written = true;
 #if DEBUG_AUDIO_HACK > 0
@@ -1885,7 +1884,7 @@ void AUDxLCL (int nr, uae_u16 v)
        struct audio_channel_data *cdp = audio_channel + nr;
        audio_activate ();
        update_audio ();
-       if (usehacks() && ((cdp->ptx_tofetch && cdp->state == 1) || cdp->ptx_written)) {
+       if (usehacks() && ((cdp->ptx_tofetch && cdp->state == 1) || cdp->ptx_written)) {
                cdp->ptx = cdp->lc;
                cdp->ptx_written = true;
 #if DEBUG_AUDIO_HACK > 0
index c99cf03245380f5462ec1a1c24f8df07da91af56..3a99358606bfb12d44e377306acd44f4ce4fc60a 100644 (file)
@@ -273,6 +273,16 @@ STATIC_INLINE void record_dma_blit (uae_u16 reg, uae_u16 dat, uae_u32 addr, int
                type = DMARECORD_BLITTER;
        if (debug_dma)
                record_dma (reg, dat, addr, hpos, vpos, type);
+       if (memwatch_enabled) {
+               if (reg == 0)
+                       debug_wputpeekdma_chipram(addr, dat, MW_MASK_BLITTER_D, reg);
+               else if (reg == 0x70)
+                       debug_wgetpeekdma_chipram(addr, dat, MW_MASK_BLITTER_C, reg);
+               else if (reg == 0x72)
+                       debug_wgetpeekdma_chipram(addr, dat, MW_MASK_BLITTER_B, reg);
+               else if (reg == 0x74)
+                       debug_wgetpeekdma_chipram(addr, dat, MW_MASK_BLITTER_A, reg);
+       }
 #endif
 }
 
@@ -427,7 +437,7 @@ STATIC_INLINE void chipmem_agnus_wput2 (uaecptr addr, uae_u32 w)
        //last_custom_value1 = w; blitter writes are not stored
        if (!(log_blitter & 4)) {
                chipmem_wput_indirect (addr, w);
-               debug_wputpeekdma_chipram (addr, w, 0x000);
+               debug_wputpeekdma_chipram (addr, w, MW_MASK_BLITTER_D, 0x000);
        }
 }
 
@@ -636,6 +646,7 @@ STATIC_INLINE void blitter_read (void)
                if (!dmaen (DMA_BLITTER))
                        return;
                blt_info.bltcdat = chipmem_wget_indirect (bltcpt);
+               debug_wgetpeekdma_chipram (bltcpt, blt_info.bltcdat, MW_MASK_BLITTER_C, 0x070);
                last_custom_value1 = blt_info.bltcdat;
        }
        bltstate = BLT_work;
@@ -651,7 +662,7 @@ STATIC_INLINE void blitter_write (void)
                        return;
                //last_custom_value1 = blt_info.bltddat; blitter writes are not stored
                chipmem_wput_indirect (bltdpt, blt_info.bltddat);
-               debug_wputpeekdma_chipram (bltdpt, blt_info.bltddat, 0x000);
+               debug_wputpeekdma_chipram (bltdpt, blt_info.bltddat, MW_MASK_BLITTER_D, 0x000);
        }
        bltstate = BLT_next;
 }
index 9a75331b3fa22dd33e4fe5c451fad9a645e35b80..4480dadbbdfefb3e34268a39c3b216bc3c975ffa 100644 (file)
@@ -1301,7 +1301,7 @@ static int parseccd (struct cdunit *cdu, struct zfile *zcue, const TCHAR *img)
        TCHAR fname[MAX_DPATH];
        
        write_log (_T("CCD TOC: '%s'\n"), img);
-       _tcscpy (fname, img);
+       _tcscpy (fname, zfile_getname(zcue));
        TCHAR *ext = _tcsrchr (fname, '.');
        if (ext)
                *ext = 0;
index d09c3c9c0d83555eb569a574de211e702db49459..425c887c8197e2e5dbbd39a891de4e2c35564112 100644 (file)
@@ -2453,27 +2453,27 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value)
        }
 
        if (_tcscmp (option, _T("joyportfriendlyname0")) == 0 || _tcscmp (option, _T("joyportfriendlyname1")) == 0) {
-               inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyportfriendlyname0")) == 0 ? 0 : 1, -1, 2);
+               inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyportfriendlyname0")) == 0 ? 0 : 1, -1, 2, true);
                return 1;
        }
        if (_tcscmp (option, _T("joyportfriendlyname2")) == 0 || _tcscmp (option, _T("joyportfriendlyname3")) == 0) {
-               inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyportfriendlyname2")) == 0 ? 2 : 3, -1, 2);
+               inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyportfriendlyname2")) == 0 ? 2 : 3, -1, 2, true);
                return 1;
        }
        if (_tcscmp (option, _T("joyportname0")) == 0 || _tcscmp (option, _T("joyportname1")) == 0) {
-               inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyportname0")) == 0 ? 0 : 1, -1, 1);
+               inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyportname0")) == 0 ? 0 : 1, -1, 1, true);
                return 1;
        }
        if (_tcscmp (option, _T("joyportname2")) == 0 || _tcscmp (option, _T("joyportname3")) == 0) {
-               inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyportname2")) == 0 ? 2 : 3, -1, 1);
+               inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyportname2")) == 0 ? 2 : 3, -1, 1, true);
                return 1;
        }
        if (_tcscmp (option, _T("joyport0")) == 0 || _tcscmp (option, _T("joyport1")) == 0) {
-               inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyport0")) == 0 ? 0 : 1, -1, 0);
+               inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyport0")) == 0 ? 0 : 1, -1, 0, true);
                return 1;
        }
        if (_tcscmp (option, _T("joyport2")) == 0 || _tcscmp (option, _T("joyport3")) == 0) {
-               inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyport2")) == 0 ? 2 : 3, -1, 0);
+               inputdevice_joyport_config (p, value, _tcscmp (option, _T("joyport2")) == 0 ? 2 : 3, -1, 0, true);
                return 1;
        }
        if (cfgfile_strval (option, value, _T("joyport0mode"), &p->jports[0].mode, joyportmodes, 0))
@@ -6006,6 +6006,10 @@ int built_in_prefs (struct uae_prefs *p, int model, int config, int compa, int r
        }
        if ((p->cpu_model >= 68020 || !p->cpu_cycle_exact) && !p->immediate_blits)
                p->waiting_blits = 1;
+       if (p->sound_filter_type == FILTER_SOUND_TYPE_A500 && (p->chipset_mask & CSMASK_AGA))
+               p->sound_filter_type = FILTER_SOUND_TYPE_A1200;
+       else if (p->sound_filter_type == FILTER_SOUND_TYPE_A1200 && !(p->chipset_mask & CSMASK_AGA))
+               p->sound_filter_type = FILTER_SOUND_TYPE_A500;
        return v;
 }
 
diff --git a/cia.cpp b/cia.cpp
index 6e88bed12e9821ff119ecee3a71c639055accb31..6c55a595bb61bf5d3a6c99eeb058e6f45cb9b81d 100644 (file)
--- a/cia.cpp
+++ b/cia.cpp
@@ -105,17 +105,37 @@ static void setclr (unsigned int *p, unsigned int val)
        }
 }
 
+static int cia_interrupt_disabled;
+
+static bool access_last_eclock(void)
+{
+       if (!currprefs.cpu_cycle_exact)
+               return false;
+       return true;
+}
+
 static void ICR (uae_u32 data)
 {
        INTREQ_0 (0x8000 | data);
 }
 static void ICRA (uae_u32 data)
 {
+       if (cia_interrupt_disabled & 1) {
+               event2_newevent_xx (-1, 4 * CYCLE_UNIT, data, ICRA);
+               return;
+       }
        ICR (data);
        ciaaicr |= 0x40;
 }
 static void ICRB (uae_u32 data)
 {
+       if (cia_interrupt_disabled & 2) {
+#if CIAB_DEBUG_IRQ
+               write_log(_T("ciab interrupt disabled ICR=%02X PC=%x\n"), ciabicr, M68K_GETPC);
+#endif
+               event2_newevent_xx (-1, 4 * CYCLE_UNIT, data, ICRB);
+               return;
+       }
        ICR (data);
        ciabicr |= 0x40;
 }
@@ -128,10 +148,11 @@ static void RethinkICRA (void)
 #endif
                if (!(ciaaicr & 0x80)) {
                        ciaaicr |= 0x80;
-                       if (currprefs.cpu_cycle_exact)
+                       if (currprefs.cpu_cycle_exact) {
                                event2_newevent_xx (-1, DIV10 + 2 * CYCLE_UNIT + CYCLE_UNIT / 2, 0x0008, ICRA);
-                       else
+                       } else {
                                ICRA (0x0008);
+                       }
                }
        }
 }
@@ -144,10 +165,11 @@ static void RethinkICRB (void)
 #endif
                if (!(ciabicr & 0x80)) {
                        ciabicr |= 0x80;
-                       if (currprefs.cpu_cycle_exact)
+                       if (currprefs.cpu_cycle_exact) {
                                event2_newevent_xx (-1, DIV10 + 2 * CYCLE_UNIT + CYCLE_UNIT / 2, 0x2000, ICRB);
-                       else
+                       } else {
                                ICRB (0x2000);
+                       }
                }
        }
 }
@@ -1127,7 +1149,7 @@ static uae_u8 ReadCIAB (unsigned int addr)
        case 13:
 #if CIAB_DEBUG_IRQ
                if (ciabicr & (0x80 | 0x40))
-                       write_log (_T("CIAB IRQ cleared\n"));
+                       write_log (_T("CIAB IRQ cleared PC=%x\n"), M68K_GETPC);
 #endif
                tmp = ciabicr & ~0x40;
                ciabicr = 0;
@@ -1580,11 +1602,15 @@ STATIC_INLINE bool isgayle (void)
        return currprefs.cs_ide || currprefs.cs_pcmcia;
 }
 
-static void cia_wait_pre (void)
+static void cia_wait_pre (int cianummask)
 {
        if (currprefs.cachesize)
                return;
 
+       if (currprefs.cpu_cycle_exact) {
+               cia_interrupt_disabled |= cianummask;
+       }
+
 #ifndef CUSTOM_SIMPLE
        int div = (get_cycles () - eventtab[ev_cia].oldcycles) % DIV10;
        int cycles;
@@ -1607,7 +1633,7 @@ static void cia_wait_pre (void)
 #endif
 }
 
-static void cia_wait_post (uae_u32 value)
+static void cia_wait_post (int cianummask, uae_u32 value)
 {
        if (currprefs.cachesize) {
                do_cycles (8 * CYCLE_UNIT /2);
@@ -1617,6 +1643,9 @@ static void cia_wait_post (uae_u32 value)
                        x_do_cycles_post (c, value);
                else
                        do_cycles (c);
+               if (currprefs.cpu_cycle_exact) {
+                       cia_interrupt_disabled &= ~cianummask;
+               }
        }
 }
 
@@ -1654,34 +1683,43 @@ static uae_u32 REGPARAM2 cia_bget (uaecptr addr)
        if (!isgaylenocia (addr))
                return v;
 
-       cia_wait_pre ();
        switch ((addr >> 12) & 3) {
        case 0:
-               if (!issinglecia ())
+               if (!issinglecia ()) {
+                       cia_wait_pre (1 | 2);
                        v = (addr & 1) ? ReadCIAA (r) : ReadCIAB (r);
+                       cia_wait_post (1 | 2, v);
+               }
                break;
        case 1:
-               if (currprefs.cpu_model == 68000 && currprefs.cpu_compatible)
+               cia_wait_pre (2);
+               if (currprefs.cpu_model == 68000 && currprefs.cpu_compatible) {
                        v = (addr & 1) ? regs.irc : ReadCIAB (r);
-               else
+               } else {
                        v = (addr & 1) ? 0xff : ReadCIAB (r);
+               }
+               cia_wait_post (2, v);
                break;
        case 2:
+               cia_wait_pre (1);
                if (currprefs.cpu_model == 68000 && currprefs.cpu_compatible)
                        v = (addr & 1) ? ReadCIAA (r) : regs.irc >> 8;
                else
                        v = (addr & 1) ? ReadCIAA (r) : 0xff;
+               cia_wait_post (1, v);
                break;
        case 3:
-               if (currprefs.cpu_model == 68000 && currprefs.cpu_compatible)
+               if (currprefs.cpu_model == 68000 && currprefs.cpu_compatible) {
+                       cia_wait_pre (0);
                        v = (addr & 1) ? regs.irc : regs.irc >> 8;
+                       cia_wait_post (0, v);
+               }
                if (warned > 0 || currprefs.illegal_mem) {
                        write_log (_T("cia_bget: unknown CIA address %08X=%02X PC=%08X\n"), addr, v & 0xff, M68K_GETPC);
                        warned--;
                }
                break;
        }
-       cia_wait_post (v);
 
        return v;
 }
@@ -1701,29 +1739,37 @@ static uae_u32 REGPARAM2 cia_wget (uaecptr addr)
        if (!isgaylenocia (addr))
                return v;
 
-       cia_wait_pre ();
        switch ((addr >> 12) & 3)
        {
        case 0:
-               if (!issinglecia ())
+               if (!issinglecia ()) {
+                       cia_wait_pre (1 | 2);
                        v = (ReadCIAB (r) << 8) | ReadCIAA (r);
+                       cia_wait_post (1 | 2, v);
+               }
                break;
        case 1:
+               cia_wait_pre (2);
                v = (ReadCIAB (r) << 8) | 0xff;
+               cia_wait_post (2, v);
                break;
        case 2:
+               cia_wait_pre (1);
                v = (0xff << 8) | ReadCIAA (r);
+               cia_wait_post (1, v);
                break;
        case 3:
-               if (currprefs.cpu_model == 68000 && currprefs.cpu_compatible)
+               if (currprefs.cpu_model == 68000 && currprefs.cpu_compatible) {
+                       cia_wait_pre (0);
                        v = regs.irc;
+                       cia_wait_post (0, v);
+               }
                if (warned > 0 || currprefs.illegal_mem) {
                        write_log (_T("cia_wget: unknown CIA address %08X=%04X PC=%08X\n"), addr, v & 0xffff, M68K_GETPC);
                        warned--;
                }
                break;
        }
-       cia_wait_post (v);
        return v;
 }
 
@@ -1764,18 +1810,18 @@ static void REGPARAM2 cia_bput (uaecptr addr, uae_u32 value)
        if (!isgaylenocia (addr))
                return;
 
-       cia_wait_pre ();
        if (!issinglecia () || (addr & 0x3000) != 0) {
+               cia_wait_pre (((addr & 0x2000) == 0 ? 1 : 0) | ((addr & 0x1000) == 0 ? 2 : 0));
                if ((addr & 0x2000) == 0)
                        WriteCIAB (r, value);
                if ((addr & 0x1000) == 0)
                        WriteCIAA (r, value);
+               cia_wait_post (((addr & 0x2000) == 0 ? 1 : 0) | ((addr & 0x1000) == 0 ? 2 : 0), value);
                if (((addr & 0x3000) == 0x3000) && (warned > 0 || currprefs.illegal_mem)) {
                        write_log (_T("cia_bput: unknown CIA address %08X=%082X PC=%08X\n"), addr, value & 0xff, M68K_GETPC);
                        warned--;
                }
        }
-       cia_wait_post (value);
 }
 
 static void REGPARAM2 cia_wput (uaecptr addr, uae_u32 value)
@@ -1794,18 +1840,18 @@ static void REGPARAM2 cia_wput (uaecptr addr, uae_u32 value)
        if (!isgaylenocia (addr))
                return;
 
-       cia_wait_pre ();
        if (!issinglecia () || (addr & 0x3000) != 0) {
+               cia_wait_pre (((addr & 0x2000) == 0 ? 1 : 0) | ((addr & 0x1000) == 0 ? 2 : 0));
                if ((addr & 0x2000) == 0)
                        WriteCIAB (r, value >> 8);
                if ((addr & 0x1000) == 0)
                        WriteCIAA (r, value & 0xff);
+               cia_wait_post (((addr & 0x2000) == 0 ? 1 : 0) | ((addr & 0x1000) == 0 ? 2 : 0), value);
                if (((addr & 0x3000) == 0x3000) && (warned > 0 || currprefs.illegal_mem)) {
                        write_log (_T("cia_wput: unknown CIA address %08X=%04X %08X\n"), addr, value & 0xffff, M68K_GETPC);
                        warned--;
                }
        }
-       cia_wait_post (value);
 }
 
 static void REGPARAM2 cia_lput (uaecptr addr, uae_u32 value)
index e4618ac47c435932bf306c505932d2f53202bc7b..318e37baf9a8c628957421b9c9781ba382755124 100644 (file)
@@ -131,6 +131,7 @@ static int rpt_did_reset;
 struct ev eventtab[ev_max];
 struct ev2 eventtab2[ev2_max];
 
+int hpos_offset;
 int vpos;
 static int vpos_count, vpos_count_diff;
 int lof_store; // real bit in custom registers
@@ -141,6 +142,7 @@ static int next_lineno, prev_lineno;
 static enum nln_how nextline_how;
 static int lof_changed = 0, lof_changing = 0, interlace_changed = 0;
 static int lof_changed_previous_field;
+static int vposw_change;
 static bool lof_lace;
 static bool bplcon0_interlace_seen;
 static int scandoubled_line;
@@ -184,7 +186,7 @@ static uae_u16 cregs[256];
 uae_u16 intena, intreq;
 uae_u16 dmacon;
 uae_u16 adkcon; /* used by audio code */
-uae_u16 last_custom_value1;
+uae_u32 last_custom_value1;
 
 static uae_u32 cop1lc, cop2lc, copcon;
 
@@ -215,7 +217,7 @@ static int ciavsyncmode;
 static int diw_hstrt, diw_hstop;
 static int diw_hcounter;
 
-#define HSYNCTIME (maxhpos * CYCLE_UNIT);
+#define HSYNCTIME (maxhpos * CYCLE_UNIT)
 
 struct sprite {
        uaecptr pt;
@@ -528,7 +530,7 @@ STATIC_INLINE uae_u8 *pfield_xlateptr (uaecptr plpt, int bytecount)
        if (!chipmem_check_indirect (plpt, bytecount)) {
                static int count = 0;
                if (!count)
-                       count++, write_log (_T("Warning: Bad playfield pointer\n"));
+                       count++, write_log (_T("Warning: Bad playfield pointer %08x\n"), plpt);
                return NULL;
        }
        return chipmem_xlate_indirect (plpt);
@@ -1274,6 +1276,8 @@ static void fetch (int nr, int fm, int hpos)
 #ifdef DEBUGGER
                if (debug_dma)
                        record_dma (0x110 + nr * 2, chipmem_wget_indirect (p), p, hpos, vpos, DMARECORD_BITPLANE);
+               if (memwatch_enabled)
+                       debug_wgetpeekdma_chipram(p, chipmem_wget_indirect (p), MW_MASK_BPL_0 << nr, 0x110 + nr * 2);
 #endif
                switch (fm)
                {
@@ -1284,12 +1288,14 @@ static void fetch (int nr, int fm, int hpos)
 #ifdef AGA
                case 1:
                        fetched_aga[nr] = chipmem_lget_indirect (p);
-                       last_custom_value1 = fetched[nr] = (uae_u16)fetched_aga[nr];
+                       last_custom_value1 = fetched_aga[nr];
+                       fetched[nr] = (uae_u16)fetched_aga[nr];
                        break;
                case 2:
                        fetched_aga[nr] = ((uae_u64)chipmem_lget_indirect (p)) << 32;
                        fetched_aga[nr] |= chipmem_lget_indirect (p + 4);
-                       last_custom_value1 = fetched[nr] = (uae_u16)fetched_aga[nr];
+                       last_custom_value1 = (uae_u32)fetched_aga[nr];
+                       fetched[nr] = (uae_u16)fetched_aga[nr];
                        break;
 #endif
                }
@@ -3935,6 +3941,7 @@ void init_hz (bool fullinit)
                hsyncstartpos = maxhpos_short + 13;
                hsyncendpos = 24;
        }
+       hpos_offset = 0;
        eventtab[ev_hsync].oldcycles = get_cycles ();
        eventtab[ev_hsync].evtime = get_cycles () + HSYNCTIME;
        events_schedule ();
@@ -4214,6 +4221,8 @@ static void VPOSW (uae_u16 v)
        if (!(currprefs.chipset_mask & CSMASK_ECS_AGNUS))
                v &= 1;
        vpos |= v << 8;
+       if (vpos != oldvpos)
+               vposw_change++;
        if (vpos < oldvpos)
                vpos = oldvpos;
 }
@@ -4222,24 +4231,49 @@ static void VPOSW (uae_u16 v)
 static void VHPOSW (uae_u16 v)
 {
        int oldvpos = vpos;
+       bool changed = false;
 #if 0
        if (M68K_GETPC < 0xf00000 || 1)
                write_log (_T("VHPOSW %04X PC=%08x\n"), v, M68K_GETPC);
 #endif
+
 #if 0
-       int hp = v & 0xff;
-       int oldhp = current_hpos ();
-       if (hp != oldhp) {
-               if (hp >= maxhpos)
-                       hp = maxhpos - 1;
-               eventtab[ev_hsync].oldcycles = get_cycles () - hp * CYCLE_UNIT;
-               eventtab[ev_hsync].evtime = eventtab[ev_hsync].oldcycles + HSYNCTIME;
-               events_schedule ();
+       /* This is not that easy, need to decouple denise and paula hpos counters
+        * from master counter.
+        * All this just to fix Upfront-CoolFridge Smooth Copper part..
+        */
+       if (oldhpos != newhpos) {
+               oldhpos = current_hpos();
+               int newhpos = v & 0xff;
+               if (newhpos >= maxhpos)
+                       newhpos = maxhpos - 1;
+               hpos_offset = newhpos - oldhpos;
+               eventtab[ev_hsync].evtime = get_cycles() + HSYNCTIME - (newhpos * CYCLE_UNIT);
+               eventtab[ev_hsync].oldcycles = get_cycles() - newhpos * CYCLE_UNIT;
+               events_schedule();
+               newhpos2 = current_hpos();
+#ifdef CPUEMU_13
+               if (currprefs.cpu_cycle_exact || currprefs.blitter_cycle_exact) {
+                       memset(cycle_line + newhpos, 0, maxhpos - newhpos);
+                       int hp = maxhpos - 1, i;
+                       for (i = 0; i < 4; i++) {
+                               alloc_cycle (hp, i == 0 ? CYCLE_STROBE : CYCLE_REFRESH);
+                       hp += 2;
+                       if (hp >= maxhpos)
+                               hp -= maxhpos;
+               }
        }
 #endif
-       v >>= 8; // lets ignore hpos for now
+               vposw_change++;
+               changed = true;
+       }
+#endif
+
+       v >>= 8;
        vpos &= 0xff00;
        vpos |= v;
+       if (vpos != oldvpos && !changed)
+               vposw_change++;
        if (vpos < oldvpos) {
                vpos = oldvpos;
        } else if (vpos < minfirstline && oldvpos < minfirstline) {
@@ -5675,7 +5709,7 @@ static int custom_wput_copper (int hpos, uaecptr addr, uae_u32 value, int noget)
 {
        int v;
 
-       value = debug_wputpeekdma_chipset (0xdff000 + addr, value, 0x08c);
+       value = debug_wputpeekdma_chipset (0xdff000 + addr, value, MW_MASK_COPPER, 0x08c);
        copper_access = 1;
        v = custom_wput_1 (hpos, addr, value, noget);
        copper_access = 0;
@@ -5798,6 +5832,8 @@ static void update_copper (int until_hpos)
 #ifdef DEBUGGER
                        if (debug_dma)
                                record_dma (0x8c, chipmem_wget_indirect (cop_state.ip), cop_state.ip, old_hpos, vpos, DMARECORD_COPPER);
+                       if (memwatch_enabled)
+                               debug_wgetpeekdma_chipram(cop_state.ip, chipmem_wget_indirect (cop_state.ip), MW_MASK_COPPER, 0x8c);
 #endif
                        if (old_hpos == maxhpos - 2) {
                                // if COP_strobe_delay2 would cross scanlines (positioned immediately
@@ -5822,6 +5858,8 @@ static void update_copper (int until_hpos)
 #ifdef DEBUGGER
                                if (debug_dma)
                                        record_dma (0x1fe, chipmem_wget_indirect (cop_state.ip), cop_state.ip, old_hpos, vpos, DMARECORD_COPPER);
+                               if (memwatch_enabled)
+                                       debug_wgetpeekdma_chipram(cop_state.ip, chipmem_wget_indirect (cop_state.ip), MW_MASK_COPPER, 0x1fe);
 #endif
                        }
                        cop_state.state = COP_read1;
@@ -5848,6 +5886,8 @@ static void update_copper (int until_hpos)
 #ifdef DEBUGGER
                        if (debug_dma)
                                record_dma (0x1fe, chipmem_wget_indirect (cop_state.ip), cop_state.ip, old_hpos, vpos, DMARECORD_COPPER);
+                       if (memwatch_enabled)
+                               debug_wgetpeekdma_chipram(cop_state.ip, chipmem_wget_indirect (cop_state.ip), MW_MASK_COPPER, 0x1fe);
 #endif
                        cop_state.state = COP_read1;
                        // Next cycle finally reads from new pointer
@@ -5869,6 +5909,8 @@ static void update_copper (int until_hpos)
 #ifdef DEBUGGER
                        if (debug_dma)
                                record_dma (0x1fe, cop_state.i1, cop_state.ip, old_hpos, vpos, DMARECORD_COPPER);
+                       if (memwatch_enabled)
+                               debug_wgetpeekdma_chipram(cop_state.ip, cop_state.i1, MW_MASK_COPPER, 0x1fe);
 #endif
                        cop_state.ip = cop1lc;
                        break;
@@ -5881,6 +5923,8 @@ static void update_copper (int until_hpos)
 #ifdef DEBUGGER
                        if (debug_dma)
                                record_dma (0x8c, cop_state.i1, cop_state.ip, old_hpos, vpos, DMARECORD_COPPER);
+                       if (memwatch_enabled)
+                               debug_wgetpeekdma_chipram(cop_state.ip, cop_state.i1, MW_MASK_COPPER, 0x8c);
 #endif
                        cop_state.ip += 2;
                        cop_state.state = COP_read2;
@@ -5905,6 +5949,8 @@ static void update_copper (int until_hpos)
 #ifdef DEBUGGER
                                if (debug_dma)
                                        record_dma (0x8c, cop_state.i2, cop_state.ip - 2, old_hpos, vpos, DMARECORD_COPPER);
+                               if (memwatch_enabled)
+                                       debug_wgetpeekdma_chipram(cop_state.ip - 2, cop_state.i2, MW_MASK_COPPER, 0x8c);
 #endif
                        } else { // MOVE
 #ifdef DEBUGGER
@@ -5916,6 +5962,8 @@ static void update_copper (int until_hpos)
 #ifdef DEBUGGER
                                if (debug_dma)
                                        record_dma (reg, data, cop_state.ip - 2, old_hpos, vpos, DMARECORD_COPPER);
+                               if (memwatch_enabled)
+                                       debug_wgetpeekdma_chipram(cop_state.ip - 2, data, MW_MASK_COPPER, reg);
 #endif
                                test_copper_dangerous (reg);
                                if (! copper_enabled_thisline)
@@ -6197,6 +6245,8 @@ static uae_u16 sprite_fetch(struct sprite *s, int dma, int hpos, int cycle, int
 #ifdef DEBUGGER
                if (debug_dma)
                        record_dma ((s - &spr[0]) * 8 + 0x140 + mode * 4 + cycle * 2, data, s->pt, hpos, vpos, DMARECORD_SPRITE);
+               if (memwatch_enabled)
+                       debug_wgetpeekdma_chipram(s->pt, data, MW_MASK_SPR_0 << (s - &spr[0]), (s - &spr[0]) * 8 + 0x140 + mode * 4 + cycle * 2);
 #endif
        }
        s->pt += 2;
@@ -7130,13 +7180,14 @@ static void vsync_handler_post (void)
 
        if (varsync_changed || (beamcon0 & (0x20 | 0x80)) != (new_beamcon0 & (0x20 | 0x80))) {
                init_hz ();
-       } else if (vpos_count > 0 && abs (vpos_count - vpos_count_diff) > 1) {
+       } else if (vpos_count > 0 && abs (vpos_count - vpos_count_diff) > 1 && vposw_change < 4) {
                init_hz ();
        } else if (interlace_changed || changed_chipset_refresh () || lof_changed) {
                compute_framesync ();
        }
 
        lof_changed = 0;
+       vposw_change = 0;
        bplcon0_interlace_seen = false;
 
        COPJMP (1, 1);
@@ -7264,6 +7315,8 @@ static void dmal_emu (uae_u32 v)
 #ifdef DEBUGGER
                if (debug_dma)
                        record_dma (0xaa + nr * 16, dat, pt, hpos, vpos, DMARECORD_AUDIO);
+               if (memwatch_enabled)
+                       debug_wgetpeekdma_chipram(pt, dat, MW_MASK_AUDIO_0 << nr, 0xaa + nr * 16);
 #endif
                last_custom_value1 = dat;
                AUDxDAT (nr, dat, pt);
@@ -7289,6 +7342,8 @@ static void dmal_emu (uae_u32 v)
 #ifdef DEBUGGER
                if (debug_dma)
                        record_dma (w ? 0x26 : 0x08, dat, pt, hpos, vpos, DMARECORD_DISK);
+               if (memwatch_enabled)
+                       debug_wgetpeekdma_chipram(pt, dat, MW_MASK_DISK, w ? 0x26 : 0x08);
 #endif
        }
 }
@@ -7367,6 +7422,7 @@ static bool is_custom_vsync (void)
 static void set_hpos (void)
 {
        maxhpos = maxhpos_short + lol;
+       hpos_offset = 0;
        eventtab[ev_hsync].evtime = get_cycles () + HSYNCTIME;
        eventtab[ev_hsync].oldcycles = get_cycles ();
 }
@@ -8231,9 +8287,8 @@ writeonly:
                * OCS-only special case: DFF000 (BLTDDAT) will always return whatever was left in bus
                *
                * AGA:
-               * only writes to custom registers change last value, read returns
-               * last value which then changes to all ones (following read will return
-               * all ones)
+               * Can also return last CPU accessed value
+               * Remembers old last_custom_value1
                */
                v = last_custom_value1;
                line_cyclebased = vpos;
@@ -8241,32 +8296,46 @@ writeonly:
                        int r, c, bmdma;
                        uae_u16 l;
 
-                       // last chip bus value (read or write) is written to register
-                       if (currprefs.cpu_compatible && currprefs.cpu_model == 68000) {
-                               if (isbyte)
-                                       l = (regs.chipset_latch_rw << 8) | (regs.chipset_latch_rw & 0xff);
-                               else
-                                       l = regs.chipset_latch_rw;
+                       if (currprefs.chipset_mask & CSMASK_AGA) {
+                               l = 0;
                        } else {
-                               l = regs.chipset_latch_rw;
+                               // last chip bus value (read or write) is written to register
+                               if (currprefs.cpu_compatible && currprefs.cpu_model == 68000) {
+                                       if (isbyte)
+                                               l = (regs.chipset_latch_rw << 8) | (regs.chipset_latch_rw & 0xff);
+                                       else
+                                               l = regs.chipset_latch_rw;
+                               } else {
+                                       l = regs.chipset_latch_rw;
+                               }
                        }
                        decide_line (hpos);
                        decide_fetch_safe (hpos);
                        debug_wputpeek (0xdff000 + addr, l);
                        r = custom_wput_1 (hpos, addr, l, 1);
                        
-                       // cpu gets back
+                       // CPU gets back (OCS/ECS only):
                        // - if last cycle was DMA cycle: DMA cycle data
                        // - if last cycle was not DMA cycle: FFFF or some ANDed old data.
                        //
                        c = cycle_line[hpos] & CYCLE_MASK;
                        bmdma = is_bitplane_dma(hpos);
-                       if (bmdma || (c > CYCLE_REFRESH && c < CYCLE_CPU)) {
-                               v = last_custom_value1;
+                       if (currprefs.chipset_mask & CSMASK_AGA) {
+                               if (bmdma || (c > CYCLE_REFRESH && c < CYCLE_CPU)) {
+                                       v = last_custom_value1;
+                               } else if (c == CYCLE_CPU) {
+                                       v = regs.db;
+                               } else {
+                                       v = last_custom_value1 >> ((addr & 2) ? 0 : 16);
+                               }
                        } else {
-                               // refresh checked because refresh cycles do not always
-                               // set last_custom_value1 for performance reasons.
-                               v = 0xffff;
+                               if (bmdma || (c > CYCLE_REFRESH && c < CYCLE_CPU)) {
+                                       v = last_custom_value1;
+                               } else {
+                                       // refresh checked because refresh cycles do not always
+                                       // set last_custom_value1 for performance reasons.
+                                       v = 0xffff;
+                               }
                        }
 #if CUSTOM_DEBUG > 0
                        write_log (_T("%08X read = %04X. Value written=%04X PC=%08x\n"), 0xdff000 | addr, v, l, M68K_GETPC);
index 7dda4138349466b1ae7d3edb817c93fc82bc5d0d..dd3d89a3331bf2b61d3c0b9d299b02e4fd8a59f1 100644 (file)
--- a/debug.cpp
+++ b/debug.cpp
@@ -46,7 +46,8 @@ static int skipaddr_doskip;
 static uae_u32 skipins;
 static int do_skip;
 static int debug_rewind;
-static int memwatch_enabled, memwatch_triggered;
+static int memwatch_triggered;
+int memwatch_enabled;
 static uae_u16 sr_bpmask, sr_bpvalue;
 int debugging;
 int exception_debugging;
@@ -1190,6 +1191,7 @@ static void decode_dma_record (int hpos, int vpos, int toggle, bool logfile)
                for (i = 0; i < cols && h < maxh; i++, h++, dr++) {
                        int cl = i * col, cl2;
                        int r = dr->reg;
+                       bool longsize = false;
                        TCHAR *sr;
 
                        sr = _T("    ");
@@ -1215,8 +1217,10 @@ static void decode_dma_record (int hpos, int vpos, int toggle, bool logfile)
                                                _tcscpy (l2 + cl, _T("  CPU-R  "));
                                        else if ((r & 0x0100) == 0x0100)
                                                _tcscpy (l2 + cl, _T("  CPU-W  "));
-                                       if ((r & 0xff) == 4)
+                                       if ((r & 0xff) == 4) {
                                                l2[cl + 7] = 'L';
+                                               longsize = true;
+                                       }
                                        if ((r & 0xff) == 2)
                                                l2[cl + 7] = 'W';
                                        if ((r & 0xff) == 1)
@@ -1224,7 +1228,7 @@ static void decode_dma_record (int hpos, int vpos, int toggle, bool logfile)
                                } else {
                                        _stprintf (l2 + cl, _T("%4s %03X"), sr, r);
                                }
-                               _stprintf (l3 + cl, _T("    %04X"), dr->dat);
+                               _stprintf (l3 + cl, longsize ? _T("%08X") : _T("    %04X"), dr->dat);
                                if (dr->addr != 0xffffffff)
                                        _stprintf (l4 + cl, _T("%08X"), dr->addr & 0x00ffffff);
                        } else {
@@ -2004,6 +2008,8 @@ uae_u8 *save_debug_memwatch (int *len, uae_u8 *dstptr)
                save_u32 (m->val_size);
                save_u32 (m->val);
                save_u32 (m->pc);
+               save_u32 (m->access_mask);
+               save_u32 (m->reg);
                save_store_size ();
        }
        *len = dst - dstbak;
@@ -2031,6 +2037,8 @@ uae_u8 *restore_debug_memwatch (uae_u8 *src)
                m->val_size = restore_u32 ();
                m->val = restore_u32 ();
                m->pc = restore_u32 ();
+               m->access_mask = restore_u32();
+               m->reg = restore_u32();
                restore_store_size ();
        }
        return src;
@@ -2048,7 +2056,7 @@ void restore_debug_memwatch_finish (void)
        }
 }
 
-static int memwatch_func (uaecptr addr, int rwi, int size, uae_u32 *valp)
+static int memwatch_func (uaecptr addr, int rwi, int size, uae_u32 *valp, uae_u32 accessmask, uae_u32 reg)
 {
        int i, brk;
        uae_u32 val = *valp;
@@ -2075,6 +2083,9 @@ static int memwatch_func (uaecptr addr, int rwi, int size, uae_u32 *valp)
                        continue;
                if (!(rwi & rwi2))
                        continue;
+               if (!(m->access_mask & accessmask))
+                       continue;
+
                if (addr >= addr2 && addr < addr3)
                        brk = 1;
                if (!brk && size == 2 && (addr + 1 >= addr2 && addr + 1 < addr3))
@@ -2173,6 +2184,8 @@ static int memwatch_func (uaecptr addr, int rwi, int size, uae_u32 *valp)
                mwhit.rwi = rwi;
                mwhit.size = size;
                mwhit.val = 0;
+               mwhit.access_mask = accessmask;
+               mwhit.reg = reg;
                if (mwhit.rwi & 2)
                        mwhit.val = val;
                memwatch_triggered = i + 1;
@@ -2233,7 +2246,7 @@ static uae_u32 REGPARAM2 debug_lget (uaecptr addr)
        uae_u32 off = debug_mem_off (&addr);
        uae_u32 v;
        v = debug_mem_banks[off]->lget (addr);
-       memwatch_func (addr, 1, 4, &v);
+       memwatch_func (addr, 1, 4, &v, MW_MASK_CPU, 0);
        return v;
 }
 static uae_u32 REGPARAM2 mmu_lgeti (uaecptr addr)
@@ -2258,7 +2271,7 @@ static uae_u32 REGPARAM2 debug_wget (uaecptr addr)
        int off = debug_mem_off (&addr);
        uae_u32 v;
        v = debug_mem_banks[off]->wget (addr);
-       memwatch_func (addr, 1, 2, &v);
+       memwatch_func (addr, 1, 2, &v, MW_MASK_CPU, 0);
        return v;
 }
 static uae_u32 REGPARAM2 debug_bget (uaecptr addr)
@@ -2266,7 +2279,7 @@ static uae_u32 REGPARAM2 debug_bget (uaecptr addr)
        int off = debug_mem_off (&addr);
        uae_u32 v;
        v = debug_mem_banks[off]->bget (addr);
-       memwatch_func (addr, 1, 1, &v);
+       memwatch_func (addr, 1, 1, &v, MW_MASK_CPU, 0);
        return v;
 }
 static uae_u32 REGPARAM2 debug_lgeti (uaecptr addr)
@@ -2274,7 +2287,7 @@ static uae_u32 REGPARAM2 debug_lgeti (uaecptr addr)
        int off = debug_mem_off (&addr);
        uae_u32 v;
        v = debug_mem_banks[off]->lgeti (addr);
-       memwatch_func (addr, 4, 4, &v);
+       memwatch_func (addr, 4, 4, &v, MW_MASK_CPU, 0);
        return v;
 }
 static uae_u32 REGPARAM2 debug_wgeti (uaecptr addr)
@@ -2282,25 +2295,25 @@ static uae_u32 REGPARAM2 debug_wgeti (uaecptr addr)
        int off = debug_mem_off (&addr);
        uae_u32 v;
        v = debug_mem_banks[off]->wgeti (addr);
-       memwatch_func (addr, 4, 2, &v);
+       memwatch_func (addr, 4, 2, &v, MW_MASK_CPU, 0);
        return v;
 }
 static void REGPARAM2 debug_lput (uaecptr addr, uae_u32 v)
 {
        int off = debug_mem_off (&addr);
-       if (memwatch_func (addr, 2, 4, &v))
+       if (memwatch_func (addr, 2, 4, &v, MW_MASK_CPU, 0))
                debug_mem_banks[off]->lput (addr, v);
 }
 static void REGPARAM2 debug_wput (uaecptr addr, uae_u32 v)
 {
        int off = debug_mem_off (&addr);
-       if (memwatch_func (addr, 2, 2, &v))
+       if (memwatch_func (addr, 2, 2, &v, MW_MASK_CPU, 0))
                debug_mem_banks[off]->wput (addr, v);
 }
 static void REGPARAM2 debug_bput (uaecptr addr, uae_u32 v)
 {
        int off = debug_mem_off (&addr);
-       if (memwatch_func (addr, 2, 1, &v))
+       if (memwatch_func (addr, 2, 1, &v, MW_MASK_CPU, 0))
                debug_mem_banks[off]->bput (addr, v);
 }
 static int REGPARAM2 debug_check (uaecptr addr, uae_u32 size)
@@ -2312,16 +2325,16 @@ static uae_u8 *REGPARAM2 debug_xlate (uaecptr addr)
        return debug_mem_banks[munge24 (addr) >> 16]->xlateaddr (addr);
 }
 
-uae_u16 debug_wputpeekdma_chipset (uaecptr addr, uae_u32 v, int reg)
+uae_u16 debug_wputpeekdma_chipset (uaecptr addr, uae_u32 v, uae_u32 mask, int reg)
 {
        if (!memwatch_enabled)
                return v;
        addr &= 0x1fe;
        addr += 0xdff000;
-       memwatch_func (addr, 2, 2, &v);
+       memwatch_func (addr, 2, 2, &v, mask, reg);
        return v;
 }
-uae_u16 debug_wputpeekdma_chipram (uaecptr addr, uae_u32 v, int reg)
+uae_u16 debug_wputpeekdma_chipram (uaecptr addr, uae_u32 v, uae_u32 mask, int reg)
 {
        if (!memwatch_enabled)
                return v;
@@ -2329,10 +2342,10 @@ uae_u16 debug_wputpeekdma_chipram (uaecptr addr, uae_u32 v, int reg)
                return v;
        if (!currprefs.z3chipmem_size)
                addr &= chipmem_bank.mask;
-       memwatch_func (addr & chipmem_bank.mask, 2, 2, &v);
+       memwatch_func (addr & chipmem_bank.mask, 2, 2, &v, mask, reg);
        return v;
 }
-uae_u16 debug_wgetpeekdma_chipram (uaecptr addr, uae_u32 v, int reg)
+uae_u16 debug_wgetpeekdma_chipram (uaecptr addr, uae_u32 v, uae_u32 mask, int reg)
 {
        uae_u32 vv = v;
        if (!memwatch_enabled)
@@ -2341,7 +2354,7 @@ uae_u16 debug_wgetpeekdma_chipram (uaecptr addr, uae_u32 v, int reg)
                return v;
        if (!currprefs.z3chipmem_size)
                addr &= chipmem_bank.mask;
-       memwatch_func (addr, 1, 2, &vv);
+       memwatch_func (addr, 1, 2, &vv, mask, reg);
        return vv;
 }
 
@@ -2349,40 +2362,40 @@ void debug_putlpeek (uaecptr addr, uae_u32 v)
 {
        if (!memwatch_enabled)
                return;
-       memwatch_func (addr, 2, 4, &v);
+       memwatch_func (addr, 2, 4, &v, MW_MASK_CPU, 0);
 }
 void debug_wputpeek (uaecptr addr, uae_u32 v)
 {
        if (!memwatch_enabled)
                return;
-       memwatch_func (addr, 2, 2, &v);
+       memwatch_func (addr, 2, 2, &v, MW_MASK_CPU, 0);
 }
 void debug_bputpeek (uaecptr addr, uae_u32 v)
 {
        if (!memwatch_enabled)
                return;
-       memwatch_func (addr, 2, 1, &v);
+       memwatch_func (addr, 2, 1, &v, MW_MASK_CPU, 0);
 }
 void debug_bgetpeek (uaecptr addr, uae_u32 v)
 {
        uae_u32 vv = v;
        if (!memwatch_enabled)
                return;
-       memwatch_func (addr, 1, 1, &vv);
+       memwatch_func (addr, 1, 1, &vv, MW_MASK_CPU, 0);
 }
 void debug_wgetpeek (uaecptr addr, uae_u32 v)
 {
        uae_u32 vv = v;
        if (!memwatch_enabled)
                return;
-       memwatch_func (addr, 1, 2, &vv);
+       memwatch_func (addr, 1, 2, &vv, MW_MASK_CPU, 0);
 }
 void debug_lgetpeek (uaecptr addr, uae_u32 v)
 {
        uae_u32 vv = v;
        if (!memwatch_enabled)
                return;
-       memwatch_func (addr, 1, 4, &vv);
+       memwatch_func (addr, 1, 4, &vv, MW_MASK_CPU, 0);
 }
 
 struct membank_store
@@ -2570,6 +2583,53 @@ int debug_bankchange (int mode)
        return -1;
 }
 
+struct mw_acc
+{
+       uae_u32 mask;
+       const TCHAR *name;
+};
+
+static const struct mw_acc memwatch_access_masks[] =
+{
+       { MW_MASK_ALL, _T("ALL") },
+       { MW_MASK_ALL & ~MW_MASK_CPU, _T("DMA") },
+       { MW_MASK_BLITTER_A | MW_MASK_BLITTER_B | MW_MASK_BLITTER_C | MW_MASK_BLITTER_D, _T("BLT") },
+       { MW_MASK_AUDIO_0 | MW_MASK_AUDIO_1 | MW_MASK_AUDIO_2 | MW_MASK_AUDIO_3, _T("AUD") },
+       { MW_MASK_BPL_0 | MW_MASK_BPL_1 | MW_MASK_BPL_2 | MW_MASK_BPL_3 | 
+         MW_MASK_BPL_4 | MW_MASK_BPL_5 | MW_MASK_BPL_6 | MW_MASK_BPL_7 , _T("BPL") },
+       { MW_MASK_SPR_0 | MW_MASK_SPR_1 | MW_MASK_SPR_2 | MW_MASK_SPR_3 |
+         MW_MASK_SPR_4 | MW_MASK_SPR_5 | MW_MASK_SPR_6 | MW_MASK_SPR_7, _T("SPR") },
+       
+       { MW_MASK_CPU, _T("CPU") },
+       { MW_MASK_COPPER, _T("COP") },
+       { MW_MASK_BLITTER_A, _T("BLTA") },
+       { MW_MASK_BLITTER_B, _T("BLTB") },
+       { MW_MASK_BLITTER_C, _T("BLTC") },
+       { MW_MASK_BLITTER_D, _T("BLTD") },
+       { MW_MASK_DISK, _T("DSK") },
+       { MW_MASK_AUDIO_0, _T("AUD0") },
+       { MW_MASK_AUDIO_1, _T("AUD1") },
+       { MW_MASK_AUDIO_2, _T("AUD2") },
+       { MW_MASK_AUDIO_3, _T("AUD3") },
+       { MW_MASK_BPL_0, _T("BPL0") },
+       { MW_MASK_BPL_1, _T("BPL1") },
+       { MW_MASK_BPL_2, _T("BPL2") },
+       { MW_MASK_BPL_3, _T("BPL3") },
+       { MW_MASK_BPL_4, _T("BPL4") },
+       { MW_MASK_BPL_5, _T("BPL5") },
+       { MW_MASK_BPL_6, _T("BPL6") },
+       { MW_MASK_BPL_7, _T("BPL7") },
+       { MW_MASK_SPR_0, _T("SPR0") },
+       { MW_MASK_SPR_1, _T("SPR1") },
+       { MW_MASK_SPR_2, _T("SPR2") },
+       { MW_MASK_SPR_3, _T("SPR3") },
+       { MW_MASK_SPR_4, _T("SPR4") },
+       { MW_MASK_SPR_5, _T("SPR5") },
+       { MW_MASK_SPR_6, _T("SPR6") },
+       { MW_MASK_SPR_7, _T("SPR7") },
+       NULL
+};
+
 static TCHAR *getsizechar (int size)
 {
        if (size == 4)
@@ -2592,6 +2652,7 @@ void memwatch_dump2 (TCHAR *buf, int bufsize, int num)
                memset (buf, 0, bufsize * sizeof (TCHAR));
        for (i = 0; i < MEMWATCH_TOTAL; i++) {
                if ((num >= 0 && num == i) || (num < 0)) {
+                       uae_u32 usedmask = 0;
                        mwn = &mwnodes[i];
                        if (mwn->size == 0)
                                continue;
@@ -2599,13 +2660,21 @@ void memwatch_dump2 (TCHAR *buf, int bufsize, int num)
                                i, mwn->addr, mwn->addr + (mwn->size - 1), mwn->size,
                                (mwn->rwi & 1) ? 'R' : ' ', (mwn->rwi & 2) ? 'W' : ' ', (mwn->rwi & 4) ? 'I' : ' ');
                        if (mwn->frozen)
-                               buf = buf_out (buf, &bufsize, _T("F"));
+                               buf = buf_out (buf, &bufsize, _T(" F"));
                        if (mwn->val_enabled)
                                buf = buf_out (buf, &bufsize, _T(" =%X%s"), mwn->val, getsizechar (mwn->val_size));
                        if (mwn->modval_written)
                                buf = buf_out (buf, &bufsize, _T(" =M"));
                        if (mwn->mustchange)
                                buf = buf_out (buf, &bufsize, _T(" C"));
+                       for (int j = 0; memwatch_access_masks[j].mask; j++) {
+                               uae_u32 mask = memwatch_access_masks[j].mask;
+                               if ((mwn->access_mask & mask) == mask && (usedmask & mask) == 0) {
+                                       buf = buf_out(buf, &bufsize, _T(" "));
+                                       buf = buf_out(buf, &bufsize, memwatch_access_masks[j].name);
+                                       usedmask |= mask;
+                               }
+                       }
                        buf = buf_out (buf, &bufsize, _T("\n"));
                }
        }
@@ -2693,6 +2762,9 @@ static void memwatch (TCHAR **c)
        mwn->rwi = 7;
        mwn->val_enabled = 0;
        mwn->val_mask = 0xffffffff;
+       mwn->val = 0;
+       mwn->access_mask = 0;
+       mwn->reg = 0xffffffff;
        mwn->frozen = 0;
        mwn->modval_written = 0;
        ignore_ws (c);
@@ -2700,25 +2772,45 @@ static void memwatch (TCHAR **c)
                mwn->size = readhex (c);
                ignore_ws (c);
                if (more_params (c)) {
-                       for (;;) {
-                               TCHAR ncc = peek_next_char(c);
-                               TCHAR nc = _totupper (next_char (c));
-                               if (mwn->rwi == 7)
-                                       mwn->rwi = 0;
-                               if (nc == 'F')
-                                       mwn->frozen = 1;
-                               if (nc == 'W')
-                                       mwn->rwi |= 2;
-                               if (nc == 'I')
-                                       mwn->rwi |= 4;
-                               if (nc == 'R')
-                                       mwn->rwi |= 1;
-                               if (ncc == ' ')
-                                       break;
-                               if (!more_params(c))
-                                       break;
+                       TCHAR *cs = *c;
+                       while (*cs) {
+                               for (int i = 0; memwatch_access_masks[i].mask; i++) {
+                                       const TCHAR *n = memwatch_access_masks[i].name;
+                                       int len = _tcslen(n);
+                                       if (!_tcsnicmp(cs, n, len)) {
+                                               if (cs[len] == 0 || cs[len] == 10 || cs[len] == 13) {
+                                                       mwn->access_mask |= memwatch_access_masks[i].mask;
+                                                       while (len > 0) {
+                                                               len--;
+                                                               cs[len] = ' ';
+                                                       }
+                                               }
+                                       }
+                               }
+                               cs++;
                        }
                        ignore_ws (c);
+                       if (more_params(c)) {
+                               for (;;) {
+                                       TCHAR ncc = peek_next_char(c);
+                                       TCHAR nc = _totupper (next_char (c));
+                                       if (mwn->rwi == 7)
+                                               mwn->rwi = 0;
+                                       if (nc == 'F')
+                                               mwn->frozen = 1;
+                                       if (nc == 'W')
+                                               mwn->rwi |= 2;
+                                       if (nc == 'I')
+                                               mwn->rwi |= 4;
+                                       if (nc == 'R')
+                                               mwn->rwi |= 1;
+                                       if (ncc == ' ')
+                                               break;
+                                       if (!more_params(c))
+                                               break;
+                               }
+                               ignore_ws (c);
+                       }
                        if (more_params (c)) {
                                if (_totupper (**c) == 'M') {
                                        mwn->modval_written = 1;
@@ -2731,6 +2823,8 @@ static void memwatch (TCHAR **c)
                        }
                }
        }
+       if (!mwn->access_mask)
+               mwn->access_mask = MW_MASK_CPU;
        if (mwn->frozen && mwn->rwi == 0)
                mwn->rwi = 3;
        memwatch_setup ();
@@ -4346,10 +4440,14 @@ void debug (void)
                        }
                }
        } else {
-               console_out_f (_T("Memwatch %d: break at %08X.%c %c%c%c %08X PC=%08X\n"), memwatch_triggered - 1, mwhit.addr,
+               console_out_f (_T("Memwatch %d: break at %08X.%c %c%c%c %08X PC=%08X "), memwatch_triggered - 1, mwhit.addr,
                        mwhit.size == 1 ? 'B' : (mwhit.size == 2 ? 'W' : 'L'),
                        (mwhit.rwi & 1) ? 'R' : ' ', (mwhit.rwi & 2) ? 'W' : ' ', (mwhit.rwi & 4) ? 'I' : ' ',
                        mwhit.val, mwhit.pc);
+               for (i = 0; memwatch_access_masks[i].mask; i++) {
+                       if (mwhit.access_mask == memwatch_access_masks[i].mask)
+                               console_out_f (_T("%s (%03x)\n"), memwatch_access_masks[i].name, mwhit.reg);
+               }
                memwatch_triggered = 0;
        }
        if (skipaddr_doskip > 0) {
index 4111c9ffc2544a80432f14a5923fafb4c40a4530..ac01d7c3fdd9919bdd9653fe8a1cf307dd6d020f 100644 (file)
--- a/disk.cpp
+++ b/disk.cpp
@@ -994,18 +994,18 @@ static int drive_insert (drive * drv, struct uae_prefs *p, int dnum, const TCHAR
                return 0;
        }
 
-       if (!fake)
+       if (!fake) {
                inprec_recorddiskchange (dnum, fname, drv->wrprot);
-
-       _tcsncpy (currprefs.floppyslots[dnum].df, fname, 255);
-       currprefs.floppyslots[dnum].df[255] = 0;
-       currprefs.floppyslots[dnum].forcedwriteprotect = forcedwriteprotect;
-       _tcsncpy (changed_prefs.floppyslots[dnum].df, fname, 255);
-       changed_prefs.floppyslots[dnum].df[255] = 0;
-       changed_prefs.floppyslots[dnum].forcedwriteprotect = forcedwriteprotect;
-       _tcscpy (drv->newname, fname);
-       drv->newnamewriteprotected = forcedwriteprotect;
-       gui_filename (dnum, fname);
+               _tcsncpy (currprefs.floppyslots[dnum].df, fname, 255);
+               currprefs.floppyslots[dnum].df[255] = 0;
+               currprefs.floppyslots[dnum].forcedwriteprotect = forcedwriteprotect;
+               _tcsncpy (changed_prefs.floppyslots[dnum].df, fname, 255);
+               changed_prefs.floppyslots[dnum].df[255] = 0;
+               changed_prefs.floppyslots[dnum].forcedwriteprotect = forcedwriteprotect;
+               _tcscpy (drv->newname, fname);
+               drv->newnamewriteprotected = forcedwriteprotect;
+               gui_filename (dnum, fname);
+       }
 
        memset (buffer, 0, sizeof buffer);
        size = 0;
@@ -1240,11 +1240,13 @@ static int drive_insert (drive * drv, struct uae_prefs *p, int dnum, const TCHAR
        drv->mfmpos |= (uaerand () << 16);
        drv->mfmpos %= drv->tracklen;
        drv->prevtracklen = 0;
+       if (!fake) {
 #ifdef DRIVESOUND
-       if (isfloppysound (drv))
-               driveclick_insert (drv - floppy, 0);
+               if (isfloppysound (drv))
+                       driveclick_insert (drv - floppy, 0);
 #endif
-       update_drive_gui (drv - floppy, false);
+               update_drive_gui (drv - floppy, false);
+       }
        return 1;
 }
 
@@ -1351,6 +1353,7 @@ static int drive_writeprotected (drive * drv)
        if (drv->catweasel)
                return 1;
 #endif
+       //write_log(_T("df%d: %d %d %d %x %s\n"), drv-&floppy[0],currprefs.floppy_read_only, drv->wrprot, drv->forcedwrprot, drv->diskfile, drv->diskfile ? zfile_getname(drv->diskfile) : _T("none"));
        return currprefs.floppy_read_only || drv->wrprot || drv->forcedwrprot || drv->diskfile == NULL;
 }
 
@@ -2463,14 +2466,20 @@ static void diskfile_readonly (const TCHAR *name, bool readonly)
        struct mystat st;
        int mode, oldmode;
 
-       if (!my_stat (name, &st))
+       if (!my_stat (name, &st)) {
+               write_log (_T("failed to access '%s'\n"), name);
                return;
+       }
+       write_log(_T("'%s': old mode = %x\n"), name, st.mode);
        oldmode = mode = st.mode;
        mode &= ~FILEFLAG_WRITE;
        if (!readonly)
                mode |= FILEFLAG_WRITE;
-       if (mode != oldmode)
-               my_chmod (name, mode);
+       if (mode != oldmode) {
+               if (!my_chmod (name, mode))
+                       write_log(_T("chmod failed!\n"));
+       }
+       write_log(_T("'%s': new mode = %x\n"), name, mode);
 }
 
 static void setdskchangetime (drive *drv, int dsktime)
@@ -2504,10 +2513,15 @@ int disk_setwriteprotect (struct uae_prefs *p, int num, const TCHAR *name, bool
        TCHAR *name2;
        drive_type drvtype;
 
+       write_log(_T("disk_setwriteprotect %d '%s' %d\n"), num, name, writeprotected);
+
        oldprotect = diskfile_iswriteprotect (p, name, &needwritefile, &drvtype);
        DISK_validate_filename (p, name, 1, &wrprot1, NULL, &zf1);
        if (!zf1)
                return 0;
+
+       write_log(_T("old = %d writeprot = %d master = %d\n"), oldprotect, wrprot1, p->floppy_read_only);
+
        if (wrprot1 && p->floppy_read_only)
                return 0;
        if (zfile_iscompressed (zf1))
index 4563424c096f3a968edc60ace6d7d0de32a1079d..4a227a1da15315e7a31b0f4b0aa62db8d7211cf4 100644 (file)
@@ -176,3 +176,13 @@ void event2_newevent_xx (int no, evt t, uae_u32 data, evfunc2 func)
        MISC_handler ();
 }
 
+int current_hpos (void)
+{
+       int hp = current_hpos_safe ();
+       if (hp < 0 || hp >= 256) {
+               gui_message(_T("hpos = %d!?\n"), hp);
+               hp = 0;
+       }
+       return hp;
+}
+
index a49a0c01f708413917339dd882c6305cf04fb567..536481ed12ad94eb7af0103428f83da43aee22a0 100644 (file)
@@ -994,11 +994,23 @@ struct hardfiledata *get_hardfile_data (int nr)
 
 #define ACTION_READ_LINK               1024
 
+/* OS4 64-bit filesize packets */
 #define ACTION_CHANGE_FILE_POSITION64  8001
 #define ACTION_GET_FILE_POSITION64     8002
 #define ACTION_CHANGE_FILE_SIZE64      8003
 #define ACTION_GET_FILE_SIZE64         8004
 
+/* MOS 64-bit filesize packets */
+#define ACTION_SEEK64                  26400
+#define ACTION_SET_FILE_SIZE64 26401
+#define ACTION_LOCK_RECORD64   26402
+#define ACTION_FREE_RECORD64   26403
+#define ACTION_QUERY_ATTR              26407
+#define ACTION_EXAMINE_OBJECT64        26408
+#define ACTION_EXAMINE_NEXT64  26409
+#define ACTION_EXAMINE_FH64            26410
+
+
 /* not supported */
 #define ACTION_MAKE_LINK               1021
 
@@ -1018,8 +1030,8 @@ struct lockrecord
 {
        struct lockrecord *next;
        uae_u32 packet;
-       uae_u32 pos;
-       uae_u32 len;
+       uae_u64 pos;
+       uae_u64 len;
        uae_u32 mode;
        uae_u32 timeout;
        uae_u32 msg;
@@ -1131,6 +1143,20 @@ typedef struct _unit {
 
 static uae_u32 a_uniq, key_uniq;
 
+static void set_quadp(uaecptr p, uae_s64 v)
+{
+       if (!valid_address(p, 8))
+               return;
+       put_long(p, v >> 32);
+       put_long(p + 4, (uae_u64)v);
+}
+static uae_u64 get_quadp(uaecptr p)
+{
+       if (!valid_address(p, 8))
+               return 0;
+       return ((uae_u64)get_long(p) << 32) | get_long(p + 4);
+}
+
 typedef uaecptr dpacket;
 #define PUT_PCK_RES1(p,v) do { put_long ((p) + dp_Res1, (v)); } while (0)
 #define PUT_PCK_RES2(p,v) do { put_long ((p) + dp_Res2, (v)); } while (0)
@@ -3643,27 +3669,32 @@ static void move_exkeys (Unit *unit, a_inode *from, a_inode *to)
        from->locked_children = 0;
 }
 
+static bool get_statinfo(Unit *unit, a_inode *aino, struct mystat *statbuf)
+{
+       bool ok = true;
+       memset (statbuf, 0, sizeof statbuf);
+       /* No error checks - this had better work. */
+       if (unit->volflags & MYVOLUMEINFO_ARCHIVE)
+               ok = zfile_stat_archive (aino->nname, statbuf) != 0;
+       else if (unit->volflags & MYVOLUMEINFO_CDFS)
+               ok = isofs_stat (unit->ui.cdfs_superblock, aino->uniq_external, statbuf);
+       else
+               my_stat (aino->nname, statbuf);
+       return ok;
+}
+
 static void
-       get_fileinfo (Unit *unit, dpacket packet, uaecptr info, a_inode *aino)
+       get_fileinfo (Unit *unit, dpacket packet, uaecptr info, a_inode *aino, bool longfilesize)
 {
        struct mystat statbuf;
        int days, mins, ticks;
        int i, n, entrytype, blocksize;
+       uae_s64 numblocks;
        int fsdb_can = fsdb_cando (unit);
        TCHAR *xs;
        char *x, *x2;
-       bool ok = true;
-
-       memset (&statbuf, 0, sizeof statbuf);
-       /* No error checks - this had better work. */
-       if (unit->volflags & MYVOLUMEINFO_ARCHIVE)
-               ok = zfile_stat_archive (aino->nname, &statbuf) != 0;
-       else if (unit->volflags & MYVOLUMEINFO_CDFS)
-               ok = isofs_stat (unit->ui.cdfs_superblock, aino->uniq_external, &statbuf);
-       else
-               my_stat (aino->nname, &statbuf);
 
-       if (!ok) {
+       if (!get_statinfo(unit, aino, &statbuf)) {
                PUT_PCK_RES1 (packet, DOS_FALSE);
                PUT_PCK_RES2 (packet, ERROR_NOT_A_DOS_DISK);
                return;
@@ -3699,13 +3730,27 @@ static void
        xfree (x2);
 
        put_long (info + 116, fsdb_can ? aino->amigaos_mode : fsdb_mode_supported (aino));
-       put_long (info + 124, statbuf.size > MAXFILESIZE32 ? MAXFILESIZE32 : (uae_u32)statbuf.size);
-#ifdef HAVE_ST_BLOCKS
-       put_long (info + 128, statbuf.st_blocks);
-#else
+
+       if (kickstart_version >= 36) {
+               put_word (info + 224, 0); // OwnerUID
+               put_word (info + 226, 0); // OwnerGID
+       }
+
        blocksize = (unit->volflags & MYVOLUMEINFO_CDFS) ? 2048 : 512;
-       put_long (info + 128, (statbuf.size + blocksize - 1) / blocksize);
-#endif
+       numblocks = (statbuf.size + blocksize - 1) / blocksize;
+       put_long (info + 128, numblocks > MAXFILESIZE32 ? MAXFILESIZE32 : numblocks);
+
+       if (longfilesize) {
+               /* MorphOS 64-bit file length support */
+               put_long (info + 124, statbuf.size > MAXFILESIZE32 ? 0 : (uae_u32)statbuf.size);
+               put_long (info + 228, statbuf.size >> 32);
+               put_long (info + 232, (uae_u32)statbuf.size);
+               put_long (info + 236, numblocks >> 32);
+               put_long (info + 240, (uae_u32)numblocks);
+       } else {
+               put_long (info + 124, statbuf.size > MAXFILESIZE32 ? MAXFILESIZE32 : (uae_u32)statbuf.size);
+       }
+
        timeval_to_amiga (&statbuf.mtime, &days, &mins, &ticks);
        put_long (info + 132, days);
        put_long (info + 136, mins);
@@ -3747,13 +3792,12 @@ int get_native_path (uae_u32 lock, TCHAR *out)
        return -1;
 }
 
-
 #define REC_EXCLUSIVE 0
 #define REC_EXCLUSIVE_IMMED 1
 #define REC_SHARED 2
 #define REC_SHARED_IMMED 3
 
-static struct lockrecord *new_record (uae_u32 packet, uae_u32 pos, uae_u32 len, uae_u32 mode, uae_u32 timeout, uae_u32 msg)
+static struct lockrecord *new_record (uae_u32 packet, uae_u64 pos, uae_u64 len, uae_u32 mode, uae_u32 timeout, uae_u32 msg)
 {
        struct lockrecord *lr = xcalloc (struct lockrecord, 1);
        lr->packet = packet;
@@ -3765,7 +3809,7 @@ static struct lockrecord *new_record (uae_u32 packet, uae_u32 pos, uae_u32 len,
        return lr;
 }
 
-static bool record_hit (Unit *unit, Key *k, uae_u32 pos, uae_u32 len, uae_u32 mode)
+static bool record_hit (Unit *unit, Key *k, uae_u64 pos, uae_u64 len, uae_u32 mode)
 {
        bool exclusive = mode == REC_EXCLUSIVE || mode == REC_EXCLUSIVE_IMMED;
        for (Key *k2 = unit->keys; k2; k2 = k2->next) {
@@ -3775,10 +3819,10 @@ static bool record_hit (Unit *unit, Key *k, uae_u32 pos, uae_u32 len, uae_u32 mo
                        for (struct lockrecord *lr = k2->record; lr; lr = lr->next) {
                                bool exclusive2 = lr->mode == REC_EXCLUSIVE || lr->mode == REC_EXCLUSIVE_IMMED;
                                if (exclusive || exclusive2) {
-                                       uae_u32 a1 = pos;
-                                       uae_u32 a2 = pos + len;
-                                       uae_u32 b1 = lr->pos;
-                                       uae_u32 b2 = lr->pos + lr->len;
+                                       uae_u64 a1 = pos;
+                                       uae_u64 a2 = pos + len;
+                                       uae_u64 b1 = lr->pos;
+                                       uae_u64 b2 = lr->pos + lr->len;
                                        if (len && lr->len) {
                                                bool hit = (a1 >= b1 && a1 < b2) || (a2 > b1 && a2 < b2) || (b1 >= a1 && b1 < a2) || (b2 > a1 && b2 < a2);
                                                if (hit)
@@ -3810,7 +3854,7 @@ static void record_timeout (Unit *unit)
                                        prev->next = lr->next;
                                else
                                        unit->waitingrecords = lr->next;
-                               write_log (_T("queued record timed out '%s',%d,%d,%d,%d\n"), k ? k->aino->nname : _T("NULL"), lr->pos, lr->len, lr->mode, lr->timeout);
+                               write_log (_T("queued record timed out '%s',%lld,%lld,%d,%d\n"), k ? k->aino->nname : _T("NULL"), lr->pos, lr->len, lr->mode, lr->timeout);
                                xfree (lr);
                                retry = true;
                                break;
@@ -4022,6 +4066,9 @@ static int exalldo (uaecptr exalldata, uae_u32 exalldatasize, uae_u32 type, uaec
                uid = 0;
                gid = 0;
        }
+       if (type >= 8) {
+               size2 += 8;
+       }
 
        i = get_long (control + 0);
        while (i > 0) {
@@ -4068,6 +4115,11 @@ static int exalldo (uaecptr exalldata, uae_u32 exalldatasize, uae_u32 type, uaec
                put_word (exp + 36, uid);
                put_word (exp + 38, gid);
        }
+       if (type >= 8) {
+               put_long (exp + 40, statbuf.size >> 32);
+               put_long (exp + 44, (uae_u32)statbuf.size);
+       }
+
        put_long (control + 0, get_long (control + 0) + 1);
        ret = 1;
 end:
@@ -4190,7 +4242,7 @@ static int action_examine_all (Unit *unit, dpacket packet)
        if (kickstart_version < 36)
                return 0;
 
-       if (type == 0 || type > 7) {
+       if (type == 0 || type > 8) {
                doserr = ERROR_BAD_NUMBER;
                goto fail;
        }
@@ -4334,7 +4386,7 @@ static void action_examine_object (Unit *unit, dpacket packet)
        if (aino == 0)
                aino = &unit->rootnode;
 
-       get_fileinfo (unit, packet, info, aino);
+       get_fileinfo (unit, packet, info, aino, false);
        if (aino->dir) {
                put_long (info, 0xFFFFFFFF);
        } else
@@ -4389,14 +4441,14 @@ static void populate_directory (Unit *unit, a_inode *base)
        fs_closedir (d);
 }
 
-static void do_examine (Unit *unit, dpacket packet, ExamineKey *ek, uaecptr info)
+static void do_examine (Unit *unit, dpacket packet, ExamineKey *ek, uaecptr info, bool longfilesize)
 {
        for (;;) {
                TCHAR *name;
                if (ek->curr_file == 0)
                        break;
                name = ek->curr_file->nname;
-               get_fileinfo (unit, packet, info, ek->curr_file);
+               get_fileinfo (unit, packet, info, ek->curr_file, longfilesize);
                ek->curr_file = ek->curr_file->sibling;
                if (!(unit->volflags & (MYVOLUMEINFO_ARCHIVE | MYVOLUMEINFO_CDFS)) && !fsdb_exists(name)) {
                        TRACE ((_T("%s orphaned"), name));
@@ -4412,7 +4464,7 @@ static void do_examine (Unit *unit, dpacket packet, ExamineKey *ek, uaecptr info
        PUT_PCK_RES2 (packet, ERROR_NO_MORE_ENTRIES);
 }
 
-static void action_examine_next (Unit *unit, dpacket packet)
+static void action_examine_next (Unit *unit, dpacket packet, bool largefilesize)
 {
        uaecptr lock = GET_PCK_ARG1 (packet) << 2;
        uaecptr info = GET_PCK_ARG2 (packet) << 2;
@@ -4420,7 +4472,7 @@ static void action_examine_next (Unit *unit, dpacket packet)
        ExamineKey *ek;
        uae_u32 uniq;
 
-       TRACE((_T("ACTION_EXAMINE_NEXT(0x%lx,0x%lx)\n"), lock, info));
+       TRACE((_T("ACTION_EXAMINE_NEXT(0x%lx,0x%lx,%d)\n"), lock, info, largefilesize));
        gui_flicker_led (UNIT_LED(unit), unit->unit, 1);
        DUMPLOCK(unit, lock);
 
@@ -4460,7 +4512,7 @@ static void action_examine_next (Unit *unit, dpacket packet)
                if (!ek->curr_file)
                        goto no_more_entries;
        }
-       do_examine (unit, packet, ek, info);
+       do_examine (unit, packet, ek, info, largefilesize);
        return;
 
 no_more_entries:
@@ -4931,7 +4983,7 @@ static void
                temppos = pos;
        if (whence == SEEK_END)
                temppos = filesize + pos;
-       if (filesize < temppos) {
+       if (filesize < temppos || temppos < 0) {
                PUT_PCK_RES1 (packet, -1);
                PUT_PCK_RES2 (packet, ERROR_SEEK_ERROR);
                return;
@@ -5235,14 +5287,14 @@ static void
 }
 
 static void
-       action_examine_fh (Unit *unit, dpacket packet)
+       action_examine_fh (Unit *unit, dpacket packet, bool largefilesize)
 {
        Key *k;
        a_inode *aino = 0;
        uaecptr info = GET_PCK_ARG2 (packet) << 2;
 
-       TRACE((_T("ACTION_EXAMINE_FH(0x%lx,0x%lx)\n"),
-               GET_PCK_ARG1 (packet), GET_PCK_ARG2 (packet) ));
+       TRACE((_T("ACTION_EXAMINE_FH(0x%lx,0x%lx,%d)\n"),
+               GET_PCK_ARG1 (packet), GET_PCK_ARG2 (packet), largefilesize ));
 
        k = lookup_key (unit, GET_PCK_ARG1 (packet));
        if (k != 0)
@@ -5250,7 +5302,7 @@ static void
        if (aino == 0)
                aino = &unit->rootnode;
 
-       get_fileinfo (unit, packet, info, aino);
+       get_fileinfo (unit, packet, info, aino, largefilesize);
        if (aino->dir)
                put_long (info, 0xFFFFFFFF);
        else
@@ -5283,6 +5335,13 @@ static void
                return;
        }
 
+       /* Fail if file is >=2G, it is not safe operation. */
+       if (fs_fsize64 (k->fd) > MAXFILESIZE32) {
+               PUT_PCK_RES1 (packet, DOS_TRUE);
+               PUT_PCK_RES2 (packet, ERROR_BAD_NUMBER); /* ? */
+               return;
+       }
+
        gui_flicker_led (UNIT_LED(unit), unit->unit, 1);
        k->notifyactive = 1;
        /* If any open files have file pointers beyond this size, truncate only
@@ -5307,7 +5366,7 @@ static void
         * the requested size, the truncate guarantees that it can't be larger.
         * If we were to write one byte earlier we'd clobber file data.  */
        if (my_truncate (k->aino->nname, offset) == -1) {
-               PUT_PCK_RES1 (packet, DOS_FALSE);
+               PUT_PCK_RES1 (packet, DOS_TRUE);
                PUT_PCK_RES2 (packet, dos_errno ());
                return;
        }
@@ -5659,6 +5718,8 @@ static void
        }
 }
 
+/* OS4 */
+
 static void action_change_file_position64 (Unit *unit, dpacket packet)
 {
        Key *k = lookup_key (unit, GET_PCK64_ARG1 (packet));
@@ -5712,7 +5773,6 @@ static void action_change_file_position64 (Unit *unit, dpacket packet)
                k->file_pos = fs_lseek64 (k->fd, 0, SEEK_CUR);
        }
        TRACE((_T("= oldpos %lld newpos %lld\n"), cur, k->file_pos));
-
 }
 
 static void action_get_file_position64 (Unit *unit, dpacket packet)
@@ -5783,7 +5843,6 @@ static void action_change_file_size64 (Unit *unit, dpacket packet)
        PUT_PCK64_RES2 (packet, 0);
 }
 
-
 static void action_get_file_size64 (Unit *unit, dpacket packet)
 {
        Key *k = lookup_key (unit, GET_PCK64_ARG1 (packet));
@@ -5807,6 +5866,217 @@ static void action_get_file_size64 (Unit *unit, dpacket packet)
        PUT_PCK64_RES2 (packet, ERROR_SEEK_ERROR);
 }
 
+/* MOS */
+
+static void action_examine_object64(Unit *unit, dpacket packet)
+{
+       uaecptr lock = GET_PCK_ARG1 (packet) << 2;
+       uaecptr info = GET_PCK_ARG2 (packet) << 2;
+       a_inode *aino = 0;
+
+       TRACE((_T("ACTION_EXAMINE_OBJECT(0x%lx,0x%lx)\n"), lock, info));
+       DUMPLOCK(unit, lock);
+
+       if (lock != 0)
+               aino = aino_from_lock (unit, lock);
+       if (aino == 0)
+               aino = &unit->rootnode;
+
+       get_fileinfo (unit, packet, info, aino, true);
+       if (aino->dir) {
+               put_long (info, 0xFFFFFFFF);
+       } else
+               put_long (info, 0);
+}
+
+static void action_set_file_size64(Unit *unit, dpacket packet)
+{
+       Key *k, *k1;
+       uae_s64 offset = get_quadp(GET_PCK_ARG2 (packet));
+       long mode = (uae_s32)GET_PCK_ARG3 (packet);
+       int whence = SEEK_CUR;
+
+       if (mode > 0)
+               whence = SEEK_END;
+       if (mode < 0)
+               whence = SEEK_SET;
+
+       TRACE((_T("ACTION_SET_FILE_SIZE64(0x%lx, %lld, 0x%x)\n"), GET_PCK_ARG1 (packet), offset, mode));
+
+       k = lookup_key (unit, GET_PCK_ARG1 (packet));
+       if (k == 0) {
+               PUT_PCK_RES1 (packet, DOS_FALSE);
+               PUT_PCK_RES2 (packet, ERROR_OBJECT_NOT_AROUND);
+               return;
+       }
+
+       gui_flicker_led (UNIT_LED(unit), unit->unit, 1);
+       k->notifyactive = 1;
+       /* If any open files have file pointers beyond this size, truncate only
+       * so far that these pointers do not become invalid.  */
+       for (k1 = unit->keys; k1; k1 = k1->next) {
+               if (k != k1 && k->aino == k1->aino) {
+                       if (k1->file_pos > offset)
+                               offset = k1->file_pos;
+               }
+       }
+
+       /* Write one then truncate: that should give the right size in all cases.  */
+       fs_lseek (k->fd, offset, whence);
+       offset = fs_lseek64 (k->fd, offset, whence);
+       fs_write (k->fd, /* whatever */(uae_u8*)&k1, 1);
+       if (k->file_pos > offset)
+               k->file_pos = offset;
+       fs_lseek64 (k->fd, k->file_pos, SEEK_SET);
+
+       if (my_truncate (k->aino->nname, offset) == -1) {
+               PUT_PCK_RES1 (packet, DOS_FALSE);
+               PUT_PCK_RES2 (packet, dos_errno ());
+               return;
+       }
+
+       PUT_PCK_RES1 (packet, DOS_TRUE);
+       set_quadp(GET_PCK_ARG4(packet), offset);
+}
+
+static void action_seek64(Unit *unit, dpacket packet)
+{
+       Key *k = lookup_key(unit, GET_PCK_ARG1(packet));
+       uae_s64 pos = get_quadp(GET_PCK64_ARG2(packet));
+       long mode = GET_PCK_ARG3(packet);
+       long whence = SEEK_CUR;
+       uae_s64 res, cur;
+
+       if (k == 0) {
+               PUT_PCK_RES1 (packet, DOS_FALSE);
+               PUT_PCK_RES2 (packet, ERROR_INVALID_LOCK);
+               return;
+       }
+
+       if (mode > 0)
+               whence = SEEK_END;
+       if (mode < 0)
+               whence = SEEK_SET;
+
+       TRACE((_T("ACTION_SEEK64(%s,%lld,%d)\n"), k->aino->nname, pos, mode));
+       gui_flicker_led (UNIT_LED(unit), unit->unit, 1);
+
+       cur = k->file_pos;
+       {
+               uae_s64 temppos;
+               uae_s64 filesize = fs_fsize64 (k->fd);
+
+               if (whence == SEEK_CUR)
+                       temppos = cur + pos;
+               if (whence == SEEK_SET)
+                       temppos = pos;
+               if (whence == SEEK_END)
+                       temppos = filesize + pos;
+               if (filesize < temppos) {
+                       res = -1;
+                       PUT_PCK_RES1 (packet, res);
+                       PUT_PCK_RES2 (packet, ERROR_SEEK_ERROR);
+                       return;
+               }
+       }
+       res = fs_lseek64 (k->fd, pos, whence);
+
+       if (-1 == res) {
+               PUT_PCK_RES1 (packet, DOS_FALSE);
+               PUT_PCK_RES2 (packet, ERROR_SEEK_ERROR);
+       } else {
+               PUT_PCK_RES1 (packet, TRUE);
+               set_quadp(GET_PCK_ARG3(packet), cur);
+               k->file_pos = fs_lseek64 (k->fd, 0, SEEK_CUR);
+       }
+       TRACE((_T("= oldpos %lld newpos %lld\n"), cur, k->file_pos));
+}
+
+static int action_lock_record64(Unit *unit, dpacket packet, uae_u32 msg)
+{
+       Key *k = lookup_key(unit, GET_PCK_ARG1(packet));
+       uae_u64 pos = get_quadp(GET_PCK_ARG2(packet));
+       uae_u64 len = get_quadp(GET_PCK_ARG3(packet));
+       uae_u32 mode = GET_PCK_ARG4(packet);
+       uae_u32 timeout = GET_PCK_ARG5(packet);
+
+       bool exclusive = mode == REC_EXCLUSIVE || mode == REC_EXCLUSIVE_IMMED;
+
+       write_log (_T("action_lock_record64('%s',%lld,%lld,%d,%d)\n"), k ? k->aino->nname : _T("null"), pos, len, mode, timeout);
+
+       if (!k || mode > REC_SHARED_IMMED) {
+               PUT_PCK_RES1 (packet, DOS_FALSE);
+               PUT_PCK_RES2 (packet, ERROR_OBJECT_WRONG_TYPE);
+               return 1;
+       }
+
+       if (mode == REC_EXCLUSIVE_IMMED || mode == REC_SHARED_IMMED)
+               timeout = 0;
+
+       if (record_hit (unit, k, pos, len, mode)) {
+               if (timeout && msg) {
+                       // queue it and do not reply
+                       struct lockrecord *lr = new_record (packet, pos, len, mode, timeout, msg);
+                       if (unit->waitingrecords) {
+                               lr->next = unit->waitingrecords;
+                               unit->waitingrecords = lr;
+                       } else {
+                               unit->waitingrecords = lr;
+                       }
+                       write_log (_T("-> collision, timeout queued\n"));
+                       return -1;
+               }
+               PUT_PCK_RES1 (packet, DOS_FALSE);
+               PUT_PCK_RES2 (packet, ERROR_LOCK_COLLISION);
+               write_log (_T("-> ERROR_LOCK_COLLISION\n"));
+               return 1;
+       }
+
+       struct lockrecord *lr = new_record (GET_PCK_ARG1(packet), pos, len, mode, timeout, 0);
+       if (k->record) {
+               lr->next = k->record;
+               k->record = lr;
+       } else {
+               k->record = lr;
+       }
+       PUT_PCK_RES1 (packet, DOS_TRUE);
+       write_log (_T("-> OK\n"));
+       return 1;
+}
+
+static void action_free_record64(Unit *unit, dpacket packet)
+{
+       Key *k = lookup_key(unit, GET_PCK_ARG1(packet));
+       uae_u64 pos = get_quadp(GET_PCK_ARG2(packet));
+       uae_u64 len = get_quadp(GET_PCK_ARG3 (packet));
+
+       write_log (_T("action_free_record('%s',%lld,%lld)\n"), k ? k->aino->nname : _T("null"), pos, len);
+
+       if (!k) {
+               PUT_PCK_RES1 (packet, DOS_FALSE);
+               PUT_PCK_RES2 (packet, ERROR_OBJECT_WRONG_TYPE);
+               return;
+       }
+
+       struct lockrecord *prev = NULL;
+       for (struct lockrecord *lr = k->record; lr; lr = lr->next) {
+               if (lr->pos == pos && lr->len == len) {
+                       if (prev)
+                               prev->next = lr->next;
+                       else
+                               k->record = lr->next;
+                       xfree (lr);
+                       write_log (_T("->OK\n"));
+                       record_check_waiting (unit);
+                       PUT_PCK_RES1 (packet, DOS_TRUE);
+                       return;
+               }
+       }
+       write_log (_T("-> ERROR_RECORD_NOT_LOCKED\n"));
+       PUT_PCK_RES1 (packet, DOS_FALSE);
+       PUT_PCK_RES2 (packet, ERROR_RECORD_NOT_LOCKED);
+}
+
 /* We don't want multiple interrupts to be active at the same time. I don't
 * know whether AmigaOS takes care of that, but this does. */
 static uae_sem_t singlethread_int_sem;
@@ -5982,7 +6252,7 @@ static int handle_packet (Unit *unit, dpacket pck, uae_u32 msg)
        case ACTION_DISK_INFO: action_disk_info (unit, pck); break;
        case ACTION_INFO: action_info (unit, pck); break;
        case ACTION_EXAMINE_OBJECT: action_examine_object (unit, pck); break;
-       case ACTION_EXAMINE_NEXT: action_examine_next (unit, pck); break;
+       case ACTION_EXAMINE_NEXT: action_examine_next (unit, pck, false); break;
        case ACTION_FIND_INPUT: action_find_input (unit, pck); break;
        case ACTION_FIND_WRITE: action_find_write (unit, pck); break;
        case ACTION_FIND_OUTPUT: action_find_output (unit, pck); break;
@@ -6008,7 +6278,7 @@ static int handle_packet (Unit *unit, dpacket pck, uae_u32 msg)
 
                /* 2.0+ packet types */
        case ACTION_SET_FILE_SIZE: action_set_file_size (unit, pck); break;
-       case ACTION_EXAMINE_FH: action_examine_fh (unit, pck); break;
+       case ACTION_EXAMINE_FH: action_examine_fh (unit, pck, false); break;
        case ACTION_FH_FROM_LOCK: action_fh_from_lock (unit, pck); break;
        case ACTION_COPY_DIR_FH: action_lock_from_fh (unit, pck); break;
        case ACTION_CHANGE_MODE: action_change_mode (unit, pck); break;
@@ -6022,12 +6292,21 @@ static int handle_packet (Unit *unit, dpacket pck, uae_u32 msg)
        case ACTION_READ_LINK: action_read_link (unit, pck); break;
        case ACTION_MAKE_LINK: action_make_link (unit, pck); break;
 
-               /* OS4+ packet types */
+               /* OS4 packet types */
        case ACTION_CHANGE_FILE_POSITION64: action_change_file_position64 (unit, pck); break;
        case ACTION_GET_FILE_POSITION64: action_get_file_position64 (unit, pck); break;
        case ACTION_CHANGE_FILE_SIZE64: action_change_file_size64 (unit, pck); break;
        case ACTION_GET_FILE_SIZE64: action_get_file_size64 (unit, pck); break;
 
+               /* MOS packet types */
+       case ACTION_SEEK64: action_seek64(unit, pck); break;
+       case ACTION_SET_FILE_SIZE64: action_set_file_size64(unit, pck); break;
+       case ACTION_EXAMINE_OBJECT64: action_examine_object64(unit, pck); break;
+       case ACTION_EXAMINE_NEXT64: action_examine_next(unit, pck, true); break;
+       case ACTION_EXAMINE_FH64: action_examine_fh(unit, pck, true); break;
+       case ACTION_LOCK_RECORD64: return action_lock_record64(unit, pck, msg); break;
+       case ACTION_FREE_RECORD64: action_free_record64(unit, pck); break;
+
                /* unsupported packets */
        case ACTION_FORMAT:
                write_log (_T("FILESYS: UNSUPPORTED PACKET %x\n"), type);
index 2496efb8d543f805c72c70fe8fe3af5b81f868ad..3c694661584c80b6b2aa9abda0a8e396bf0b6fb6 100644 (file)
@@ -44,6 +44,7 @@ static int count_read_ea, count_write_ea, count_cycles_ea;
 static const char *mmu_postfix;
 static int memory_cycle_cnt;
 static int did_prefetch;
+static int ipl_fetched;
 
 static int optimized_flags;
 
@@ -517,8 +518,11 @@ static void makefromsr (void)
 
 static void check_ipl (void)
 {
+       if (ipl_fetched)
+               return;
        if (using_ce || using_ce020)
                printf ("\tipl_fetch ();\n");
+       ipl_fetched = true;
 }
 
 static void irc2ir (bool dozero)
@@ -5042,6 +5046,7 @@ static void gen_opcode (unsigned long int opcode)
                fill_prefetch_finish ();
        sync_m68k_pc ();
        did_prefetch = 0;
+       ipl_fetched = 0;
 }
 
 static void generate_includes (FILE * f, int id)
index 268cbdb8bf4ed66cbc17d84737c347f1e8c58e6e..99b55e335ad619fbea61f79d646c3dc5f554b2d2 100644 (file)
@@ -13,6 +13,7 @@
 #define MAX_LINEWIDTH 100
 
 extern int debugging;
+extern int memwatch_enabled;
 extern int exception_debugging;
 extern int debug_copper;
 extern int debug_dma;
@@ -57,26 +58,56 @@ struct breakpoint_node {
 };
 extern struct breakpoint_node bpnodes[BREAKPOINT_TOTAL];
 
+#define MW_MASK_CPU                            0x00000001
+#define MW_MASK_BLITTER_A              0x00000002
+#define MW_MASK_BLITTER_B              0x00000004
+#define MW_MASK_BLITTER_C              0x00000008
+#define MW_MASK_BLITTER_D              0x00000010
+#define MW_MASK_COPPER                 0x00000020
+#define MW_MASK_DISK                   0x00000040
+#define MW_MASK_AUDIO_0                        0x00000080
+#define MW_MASK_AUDIO_1                        0x00000100
+#define MW_MASK_AUDIO_2                        0x00000200
+#define MW_MASK_AUDIO_3                        0x00000400
+#define MW_MASK_BPL_0                  0x00000800
+#define MW_MASK_BPL_1                  0x00001000
+#define MW_MASK_BPL_2                  0x00002000
+#define MW_MASK_BPL_3                  0x00004000
+#define MW_MASK_BPL_4                  0x00008000
+#define MW_MASK_BPL_5                  0x00010000
+#define MW_MASK_BPL_6                  0x00020000
+#define MW_MASK_BPL_7                  0x00040000
+#define MW_MASK_SPR_0                  0x00080000
+#define MW_MASK_SPR_1                  0x00100000
+#define MW_MASK_SPR_2                  0x00200000
+#define MW_MASK_SPR_3                  0x00400000
+#define MW_MASK_SPR_4                  0x00800000
+#define MW_MASK_SPR_5                  0x01000000
+#define MW_MASK_SPR_6                  0x02000000
+#define MW_MASK_SPR_7                  0x04000000
+#define MW_MASK_ALL                            (0x08000000 - 1)
+
 #define MEMWATCH_TOTAL 20
 struct memwatch_node {
        uaecptr addr;
        int size;
        int rwi;
-       uae_u32 val, val_mask;
+       uae_u32 val, val_mask, access_mask;
        int val_size, val_enabled;
        int mustchange;
        uae_u32 modval;
        int modval_written;
        int frozen;
+       uae_u32 reg;
        uaecptr pc;
 };
 extern struct memwatch_node mwnodes[MEMWATCH_TOTAL];
 
 extern void memwatch_dump2 (TCHAR *buf, int bufsize, int num);
 
-uae_u16 debug_wgetpeekdma_chipram (uaecptr addr, uae_u32 v, int reg);
-uae_u16 debug_wputpeekdma_chipram (uaecptr addr, uae_u32 v, int reg);
-uae_u16 debug_wputpeekdma_chipset (uaecptr addr, uae_u32 v, int reg);
+uae_u16 debug_wgetpeekdma_chipram (uaecptr addr, uae_u32 v, uae_u32 mask, int reg);
+uae_u16 debug_wputpeekdma_chipram (uaecptr addr, uae_u32 v, uae_u32 mask, int reg);
+uae_u16 debug_wputpeekdma_chipset (uaecptr addr, uae_u32 v, uae_u32 mask, int reg);
 void debug_lgetpeek (uaecptr addr, uae_u32 v);
 void debug_wgetpeek (uaecptr addr, uae_u32 v);
 void debug_bgetpeek (uaecptr addr, uae_u32 v);
@@ -97,7 +128,7 @@ void debugtest (enum debugtest_item, const TCHAR *, ...);
 struct dma_rec
 {
     uae_u16 reg;
-    uae_u16 dat;
+    uae_u32 dat;
     uae_u32 addr;
     uae_u16 evt;
     int type;
index 78d483933d0593054630f4d513acae850166e99e..413150d27a5606a3b74ffaa1472284829de6dfb0 100644 (file)
@@ -76,6 +76,8 @@ extern struct ev2 eventtab2[ev2_max];
 
 extern volatile bool vblank_found_chipset;
 extern volatile bool vblank_found_rtg;
+extern int hpos_offset;
+extern int maxhpos;
 
 STATIC_INLINE void cycles_do_special (void)
 {
@@ -116,15 +118,7 @@ STATIC_INLINE int current_hpos_safe (void)
        return hp;
 }
 
-STATIC_INLINE int current_hpos (void)
-{
-    int hp = current_hpos_safe ();
-       if (hp < 0 || hp >= 256) {
-               gui_message(_T("hpos = %d!?\n"), hp);
-               hp = 0;
-       }
-       return hp;
-}
+extern int current_hpos(void);
 
 STATIC_INLINE bool cycles_in_range (unsigned long endcycles)
 {
index 4ada269c935e921b460e0d36c70c0067d4ce538a..4abc48b5340b5abc49ab229440f4ce19c16aea99 100644 (file)
@@ -18,6 +18,7 @@
 /* AmigaOS errors */
 #define ERROR_NO_FREE_STORE                    103
 #define ERROR_BAD_NUMBER                       115
+#define ERROR_LINE_TOO_LONG                    120
 #define ERROR_OBJECT_IN_USE                    202
 #define ERROR_OBJECT_EXISTS                    203
 #define ERROR_DIR_NOT_FOUND                    204
index 2f27a9f61c0a0c405eb178ff3b0b9a8e3ab51f67..25d80dc22ab0f7af03768b0b9d746a401c5ff5a5 100644 (file)
@@ -269,7 +269,7 @@ extern void read_inputdevice_config (struct uae_prefs *p, const TCHAR *option, T
 extern void reset_inputdevice_config (struct uae_prefs *pr);
 extern void store_inputdevice_config (struct uae_prefs *pr);
 extern void restore_inputdevice_config (struct uae_prefs *p, int portnum);
-extern int inputdevice_joyport_config (struct uae_prefs *p, const TCHAR *value, int portnum, int mode, int type);
+extern int inputdevice_joyport_config (struct uae_prefs *p, const TCHAR *value, int portnum, int mode, int type, bool validate);
 extern int inputdevice_getjoyportdevice (int port, int val);
 extern void inputdevice_validate_jports (struct uae_prefs *p, int changedport);
 
index 6f809ee613ba89759be3949d28d422f02af3c6a1..6694746671d73c4a6a99c394524f2fb3f7db940a 100644 (file)
@@ -226,7 +226,7 @@ extern void expamem_init (void);
 extern void expamem_reset (void);
 extern void expamem_next (void);
 
-extern uae_u16 last_custom_value1;
+extern uae_u32 last_custom_value1;
 
 /* Default memory access functions */
 
index b555e95d2d847430befcd5e180317e3ec162f3f7..fc04c8d5fb66705063cc0e6721055b0f37326c7f 100644 (file)
@@ -12,7 +12,7 @@
 
 #define UAEMAJOR 2
 #define UAEMINOR 8
-#define UAESUBREV 0
+#define UAESUBREV 1
 
 typedef enum { KBD_LANG_US, KBD_LANG_DK, KBD_LANG_DE, KBD_LANG_SE, KBD_LANG_FR, KBD_LANG_IT, KBD_LANG_ES } KbdLang;
 
index 3dc2cac024f55f3ea4bd0c133ed3bb4e850093b7..c1677f1487120940d80c16ca831fb607fe28af28 100644 (file)
@@ -3562,6 +3562,8 @@ static int getoldport (struct uae_input_device *id)
        return -1;
 }
 
+#define SWITCHDEBUG_DEBUG 0
+
 static int switchdevice (struct uae_input_device *id, int num, bool buttonmode)
 {
        int i, j;
@@ -3572,7 +3574,9 @@ static int switchdevice (struct uae_input_device *id, int num, bool buttonmode)
        int otherbuttonpressed = 0;
        int acc = input_acquired;
 
-       //write_log (_T("switchdevice '%s' %d %d\n"), id->name, num, buttonmode);
+#if SWITCHDEBUG_DEBUG
+       write_log (_T("switchdevice '%s' %d %d\n"), id->name, num, buttonmode);
+#endif
 
        if (num >= 4)
                return 0;
@@ -3600,82 +3604,172 @@ static int switchdevice (struct uae_input_device *id, int num, bool buttonmode)
                        flags = idev[IDTYPE_MOUSE].get_flags (i);
                }
        }
-       if (!name)
+       if (!name) {
+#if SWITCHDEBUG_DEBUG
+               write_log(_T("device not found!?\n"));
+#endif
                return 0;
+       }
        if (buttonmode) {
                if (num == 0 && otherbuttonpressed)
                        newport = newport ? 0 : 1;
        } else {
                newport = num ? 1 : 0;
        }
-       //write_log (_T("newport = %d\n"), newport);
+#if SWITCHDEBUG_DEBUG
+       write_log (_T("newport = %d ismouse=%d flags=%d name=%s\n"), newport, ismouse, flags, name);
+#endif
        /* "GamePorts" switch if in GamePorts mode or Input mode and GamePorts port was not NONE */
        if (currprefs.input_selected_setting == GAMEPORT_INPUT_SETTINGS || currprefs.jports[newport].id != JPORT_NONE) {
-               //write_log (_T("GAMEPORTS MODE\n"));
+#if SWITCHDEBUG_DEBUG
+               write_log (_T("GAMEPORTS MODE %d %d\n"), currprefs.input_selected_setting, currprefs.jports[newport].id);
+#endif
                if ((num == 0 || num == 1) && currprefs.jports[newport].id != JPORT_CUSTOM) {
-                       //write_log (_T("Port supported\n"));
+#if SWITCHDEBUG_DEBUG
+                       write_log (_T("Port supported\n"));
+#endif
+                       bool issupermouse = false;
                        int om = jsem_ismouse (num, &currprefs);
                        int om1 = jsem_ismouse (0, &currprefs);
                        int om2 = jsem_ismouse (1, &currprefs);
                        if ((om1 >= 0 || om2 >= 0) && ismouse) {
-                               //write_log (_T("END3\n"));
+#if SWITCHDEBUG_DEBUG
+                               write_log (_T("END3\n"));
+#endif
                                return 0;
                        }
                        if (flags) {
-                               //write_log (_T("END2\n"));
+#if SWITCHDEBUG_DEBUG
+                               write_log (_T("END2\n"));
+#endif
                                return 0;
                        }
-                       if (name) {
 #if 1
-                               if (ismouse) {
-                                       int nummouse = 0; // count number of non-supermouse mice
-                                       int supermouse = -1;
-                                       for (i = 0; i < idev[IDTYPE_MOUSE].get_num (); i++) {
-                                               if (!idev[IDTYPE_MOUSE].get_flags (i))
-                                                       nummouse++;
-                                               else
-                                                       supermouse = i;
+                       if (ismouse) {
+                               int nummouse = 0; // count number of non-supermouse mice
+                               int supermouse = -1;
+                               for (i = 0; i < idev[IDTYPE_MOUSE].get_num (); i++) {
+                                       if (!idev[IDTYPE_MOUSE].get_flags (i))
+                                               nummouse++;
+                                       else
+                                               supermouse = i;
+                               }
+#if SWITCHDEBUG_DEBUG
+                               write_log (_T("inputdevice gameports change supermouse=%d num=%d\n"), supermouse, nummouse);
+#endif
+                               if (supermouse >= 0 && nummouse == 1) {
+                                       TCHAR *oldname = name;
+                                       name = idev[IDTYPE_MOUSE].get_uniquename (supermouse);
+                                       issupermouse = true;
+#if SWITCHDEBUG_DEBUG
+                                       write_log (_T("inputdevice gameports change '%s' -> '%s'\n"), oldname, name);
+#endif
+                               }
+                       }
+#endif
+#if SWITCHDEBUG_DEBUG
+                       write_log (_T("inputdevice gameports change '%s':%d->%d %d,%d\n"), name, num, newport, currprefs.input_selected_setting, currprefs.jports[newport].id);
+#endif
+                       inputdevice_unacquire ();
+
+                       if (currprefs.input_selected_setting != GAMEPORT_INPUT_SETTINGS && currprefs.jports[newport].id > JPORT_NONE) {
+                               // disable old device
+                               int devnum;
+                               devnum = jsem_ismouse(newport, &currprefs);
+#if SWITCHDEBUG_DEBUG
+                               write_log(_T("ismouse num = %d supermouse=%d\n"), devnum, issupermouse);
+#endif
+                               if (devnum >= 0) {
+                                       if (changed_prefs.mouse_settings[currprefs.input_selected_setting][devnum].enabled) {
+                                               changed_prefs.mouse_settings[currprefs.input_selected_setting][devnum].enabled = false;
+#if SWITCHDEBUG_DEBUG
+                                               write_log(_T("input panel mouse device '%s' disabled\n"), changed_prefs.mouse_settings[currprefs.input_selected_setting][devnum].name);
+#endif
+                                       }
+                               }
+                               for (int l = 0; l < idev[IDTYPE_MOUSE].get_num(); l++) {
+                                       if (changed_prefs.mouse_settings[currprefs.input_selected_setting][l].enabled) {
+                                               if (idev[IDTYPE_MOUSE].get_flags(l)) {
+#if SWITCHDEBUG_DEBUG
+                                                       write_log (_T("enabled supermouse %d detected\n"), l);
+#endif
+                                                       issupermouse = true;
+                                               }
                                        }
-                                       if (supermouse >= 0 && nummouse == 1) {
-                                               name = idev[IDTYPE_MOUSE].get_uniquename (supermouse);
+                               }
+                               if (issupermouse) {
+                                       // new mouse is supermouse, disable all other mouse devices
+                                       for (int l = 0; l < MAX_INPUT_DEVICES; l++) {
+                                               changed_prefs.mouse_settings[currprefs.input_selected_setting][l].enabled = false;
                                        }
                                }
+
+                               devnum = jsem_isjoy(newport, &currprefs);
+#if SWITCHDEBUG_DEBUG
+                               write_log(_T("isjoy num = %d\n"), devnum);
 #endif
-                               write_log (_T("inputdevice change '%s':%d->%d\n"), name, num, newport);
-                               inputdevice_unacquire ();
-                               inputdevice_joyport_config (&changed_prefs, name, newport, -1, 2);
-                               inputdevice_validate_jports (&changed_prefs, -1);
-                               inputdevice_copyconfig (&changed_prefs, &currprefs);
-                               if (acc)
-                                       inputdevice_acquire (TRUE);
-                               return 1;
+                               if (devnum >= 0) {
+                                       if (changed_prefs.joystick_settings[currprefs.input_selected_setting][devnum].enabled) {
+                                               changed_prefs.joystick_settings[currprefs.input_selected_setting][devnum].enabled = false;
+#if SWITCHDEBUG_DEBUG
+                                               write_log(_T("input panel joystick device '%s' disabled\n"), changed_prefs.joystick_settings[currprefs.input_selected_setting][devnum].name);
+#endif
+                                       }
+                               }
                        }
+
+                       inputdevice_joyport_config (&changed_prefs, name, newport, -1, 2, false);
+                       inputdevice_validate_jports (&changed_prefs, -1);
+                       inputdevice_copyconfig (&changed_prefs, &currprefs);
+                       if (acc)
+                               inputdevice_acquire (TRUE);
+                       return 1;
                }
-               //write_log (_T("END1\n"));
+#if SWITCHDEBUG_DEBUG
+               write_log (_T("END1\n"));
+#endif
                return 0;
        } else {
-               //write_log (_T("INPUTPANEL MODE\n"));
+#if SWITCHDEBUG_DEBUG
+               write_log (_T("INPUTPANEL MODE %d\n"), flags);
+#endif
                int oldport = getoldport (id);
                int k, evt;
-               struct inputevent *ie, *ie2;
 
+               struct inputevent *ie, *ie2;
                if (flags)
                        return 0;
-               if (oldport <= 0)
+               if (oldport <= 0) {
+#if SWITCHDEBUG_DEBUG
+                       write_log(_T("OLDPORT %d\n"), oldport);
+#endif
                        return 0;
+               }
                newport++;
                /* do not switch if switching mouse and any "supermouse" mouse enabled */
                if (ismouse) {
                        for (i = 0; i < MAX_INPUT_SETTINGS; i++) {
-                               if (mice[i].enabled && idev[IDTYPE_MOUSE].get_flags (i))
+                               if (mice[i].enabled && idev[IDTYPE_MOUSE].get_flags (i)) {
+#if SWITCHDEBUG_DEBUG
+                                       write_log(_T("SUPERMOUSE %d enabled\n"), i);
+#endif
                                        return 0;
+                               }
                        }
                }
                for (i = 0; i < MAX_INPUT_SETTINGS; i++) {
-                       if (getoldport (&joysticks[i]) == newport)
+                       if (getoldport (&joysticks[i]) == newport) {
                                joysticks[i].enabled = 0;
-                       if (getoldport (&mice[i]) == newport)
+#if SWITCHDEBUG_DEBUG
+                               write_log(_T("Joystick %d disabled\n"), i);
+#endif
+                       }
+                       if (getoldport (&mice[i]) == newport) {
                                mice[i].enabled = 0;
+#if SWITCHDEBUG_DEBUG
+                               write_log(_T("Mouse %d disabled\n"), i);
+#endif
+                       }
                }   
                id->enabled = 1;
                for (i = 0; i < MAX_INPUT_DEVICE_EVENTS; i++) {
@@ -3707,7 +3801,7 @@ static int switchdevice (struct uae_input_device *id, int num, bool buttonmode)
                                }
                        }
                }
-               write_log (_T("inputdevice change '%s':%d->%d\n"), name, num, newport);
+               write_log (_T("inputdevice input change '%s':%d->%d\n"), name, num, newport);
                inputdevice_unacquire ();
                inputdevice_copyconfig (&currprefs, &changed_prefs);
                inputdevice_validate_jports (&changed_prefs, -1);
@@ -5567,13 +5661,13 @@ void inputdevice_devicechange (struct uae_prefs *prefs)
        for (i = 0; i < MAX_JPORTS; i++) {
                freejport (prefs, i);
                if (jportid[i] == JPORT_CUSTOM) {
-                       inputdevice_joyport_config (prefs, _T("custom"), i, jportsmode[i], 0);
+                       inputdevice_joyport_config (prefs, _T("custom"), i, jportsmode[i], 0, true);
                } else if (jports[i]) {
-                       inputdevice_joyport_config (prefs, jports[i], i, jportsmode[i], 2);
+                       inputdevice_joyport_config (prefs, jports[i], i, jportsmode[i], 2, true);
                } else if (jportskb[i] >= 0) {
                        TCHAR tmp[10];
                        _stprintf (tmp, _T("kbd%d"), jportskb[i]);
-                       inputdevice_joyport_config (prefs, tmp, i, jportsmode[i], 0);
+                       inputdevice_joyport_config (prefs, tmp, i, jportsmode[i], 0, true);
                }
                prefs->jports[i].autofire = jportaf[i];
                xfree (jports[i]);
@@ -7098,6 +7192,10 @@ static void fixjport (struct jport *port, int add)
                        vv = 0;
                vv += JSEM_KBDLAYOUT;
        }
+#if 0
+       if (port->id != vv)
+               write_log(_T("fixjport %d %d %d\n"), port->id, vv, add);
+#endif
        port->id = vv;
 }
 
@@ -7116,8 +7214,10 @@ void inputdevice_validate_jports (struct uae_prefs *p, int changedport)
                                continue;
                        if (p->jports[i].id == p->jports[j].id) {
                                if (i == changedport) {
+                                       //write_log(_T("inputdevice_validate_jports restore i %d %d\n"), i, j);
                                        restore_inputdevice_config (p, j);
                                } else if (j == changedport) {
+                                       //write_log(_T("inputdevice_validate_jports restore j %d %d\n"), i, j);
                                        restore_inputdevice_config (p, i);
                                }
                                int cnt = 0;
@@ -7140,7 +7240,7 @@ void inputdevice_validate_jports (struct uae_prefs *p, int changedport)
        }
 }
 
-static void inputdevice_inserted (struct uae_prefs *p, int portnum, int id, int mode, int type)
+static void inputdevice_inserted (struct uae_prefs *p, int portnum, int id, int type)
 {
        for (int k = 0; k < MAX_JPORTS; k++) {
                if (p->jports[k].id == id && k != portnum) {
@@ -7169,7 +7269,7 @@ void restore_inputdevice_config (struct uae_prefs *p, int portnum)
        memcpy (&p->jports[portnum], &stored_ports[portnum], sizeof (struct jport));
 }
 
-int inputdevice_joyport_config (struct uae_prefs *p, const TCHAR *value, int portnum, int mode, int type)
+int inputdevice_joyport_config (struct uae_prefs *p, const TCHAR *value, int portnum, int mode, int type, bool validate)
 {
        switch (type)
        {
@@ -7189,7 +7289,8 @@ int inputdevice_joyport_config (struct uae_prefs *p, const TCHAR *value, int por
                                for (i = 0; i < idf->get_num (); i++) {
                                        TCHAR *name2 = idf->get_uniquename (i);
                                        if (name2 && !_tcscmp (name2, value)) {
-                                               inputdevice_inserted (p, portnum, idnum + i, mode, type);
+                                               if (validate)
+                                                       inputdevice_inserted (p, portnum, idnum + i, type);
                                                p->jports[portnum].id = idnum + i;
                                                if (mode >= 0)
                                                        p->jports[portnum].mode = mode;
@@ -7200,7 +7301,8 @@ int inputdevice_joyport_config (struct uae_prefs *p, const TCHAR *value, int por
                                for (i = 0; i < idf->get_num (); i++) {
                                        TCHAR *name1 = idf->get_friendlyname (i);
                                        if (name1 && !_tcscmp (name1, value)) {
-                                               inputdevice_inserted (p, portnum, idnum + i, mode, type);
+                                               if (validate)
+                                                       inputdevice_inserted (p, portnum, idnum + i, type);
                                                p->jports[portnum].id = idnum + i;
                                                if (mode >= 0)
                                                        p->jports[portnum].mode = mode;
@@ -7254,7 +7356,8 @@ int inputdevice_joyport_config (struct uae_prefs *p, const TCHAR *value, int por
                                        }
                                }
                                if (got == 2) {
-                                       inputdevice_inserted (p, portnum, start, mode, type);
+                                       if (validate)
+                                               inputdevice_inserted (p, portnum, start, type);
                                        p->jports[portnum].id = start;
                                        if (mode >= 0)
                                                p->jports[portnum].mode = mode;
index 4cd7485a7a580df40eec5d9f6d22eedc0f163a2c..3d88104b214cda9ebea43c0461a03b68394ff5e1 100644 (file)
@@ -61,6 +61,7 @@ int mmu_enabled, mmu_triggered;
 int cpu_cycles;
 static int baseclock;
 bool m68k_pc_indirect;
+static int cpu_prefs_changed_flag;
 
 int cpucycleunit;
 int cpu_tracer;
@@ -1315,16 +1316,16 @@ static int check_prefs_changed_cpu2(void)
                || currprefs.fpu_no_unimplemented != changed_prefs.fpu_no_unimplemented
                || currprefs.cpu_compatible != changed_prefs.cpu_compatible
                || currprefs.cpu_cycle_exact != changed_prefs.cpu_cycle_exact) {
-                       changed |= 1;
+                       cpu_prefs_changed_flag |= 1;
        }
        if (changed
                || currprefs.m68k_speed != changed_prefs.m68k_speed
                || currprefs.m68k_speed_throttle != changed_prefs.m68k_speed_throttle
                || currprefs.cpu_clock_multiplier != changed_prefs.cpu_clock_multiplier
                || currprefs.cpu_frequency != changed_prefs.cpu_frequency) {
-                       changed |= 2;
+                       cpu_prefs_changed_flag |= 2;
        }
-       return changed;
+       return cpu_prefs_changed_flag;
 }
 
 
@@ -4193,6 +4194,7 @@ void m68k_go (int may_quit)
 
        set_cpu_tracer (false);
 
+       cpu_prefs_changed_flag = 0;
        in_m68k_go++;
        for (;;) {
                void (*run_func)(void);
@@ -4297,20 +4299,20 @@ void m68k_go (int may_quit)
                }
 
                if (regs.spcflags & SPCFLAG_MODE_CHANGE) {
-                       int v = check_prefs_changed_cpu2();
-                       if (v & 1) {
+                       if (cpu_prefs_changed_flag & 1) {
                                uaecptr pc = m68k_getpc();
                                prefs_changed_cpu();
                                build_cpufunctbl();
                                m68k_setpc_normal(pc);
                                fill_prefetch();
                        }
-                       if (v & 2) {
+                       if (cpu_prefs_changed_flag & 2) {
                                fixup_cpu(&changed_prefs);
                                currprefs.m68k_speed = changed_prefs.m68k_speed;
                                currprefs.m68k_speed_throttle = changed_prefs.m68k_speed_throttle;
                                update_68k_cycles();
                        }
+                       cpu_prefs_changed_flag = 0;
                }
 
                set_x_funcs();
@@ -5844,7 +5846,7 @@ uae_u32 get_word_ce020_prefetch (int o)
                regs.db = regs.prefetch020[0] >> 16;
        } else {
                v = regs.prefetch020[0] >> 16;
-               regs.db = regs.prefetch020[0];
+               regs.db = regs.prefetch020[1] >> 16;
        }
        do_cycles_ce020 (2);
        return v;
index 796819faccb7b435b553923359c091aae5658f70..0d5bc9d66ff1d27301e4771d197384a175d229aa 100644 (file)
@@ -238,12 +238,13 @@ enum {
 
 // recognized image types
 enum {
-       citError=0,  // error preventing the type identification
-       citUnknown,  // unknown image type
-       citIPF,      // IPF image
-       citCTRaw,    // CT Raw image
-       citKFStream, // KryoFlux stream files
-       citDraft     // Draft image
+       citError=0,     // error preventing the type identification
+       citUnknown,     // unknown image type
+       citIPF,         // IPF image
+       citCTRaw,       // CT Raw image
+       citKFStream,    // KryoFlux stream files
+       citKFStreamCue, // KryoFlux stream cue file
+       citDraft        // Draft image
 };
 
 // image error status
index 3cf881e749ef13d7176f15fbf8f7ad66cd2f4f9c..9ce63a48fba9814ba434cbd7f77e40126e63c127 100644 (file)
@@ -3074,6 +3074,8 @@ static void read_mouse (void)
 
 static int get_mouse_flags (int num)
 {
+       if (!rawinput_enabled_mouse && !num)
+               return 1;
        if (di_mouse[num].rawinput || !rawinput_enabled_mouse)
                return 0;
        if (di_mouse[num].catweasel)
index 31d97685a703d24ad4f5e08deeb005a2f4c2e6e7..58c14f62a01e95131a098fb1c62d163bbc9fdb4c 100644 (file)
@@ -3183,7 +3183,7 @@ void D3D_flushtexture (int miny, int maxy)
        }
 }
 
-uae_u8 *D3D_locktexture (int *pitch, bool fullupdate)
+uae_u8 *D3D_locktexture (int *pitch, int *height, bool fullupdate)
 {
        D3DLOCKED_RECT lock;
        HRESULT hr;
@@ -3219,6 +3219,8 @@ uae_u8 *D3D_locktexture (int *pitch, bool fullupdate)
        locked = 1;
        fulllocked = fullupdate;
        *pitch = lock.Pitch;
+       if (height)
+               *height = tin_h;
        return (uae_u8*)lock.pBits;
 }
 
index 4646082c8bb69c108d3b893971a79d61f25d7e8d..77a5555cc1ec7a18ffef71bf750c3579785a2383 100644 (file)
@@ -7,7 +7,7 @@ extern void D3D_refresh (void);
 extern bool D3D_renderframe (bool);
 extern void D3D_showframe (void);
 extern void D3D_showframe_special (int);
-extern uae_u8 *D3D_locktexture(int*, bool);
+extern uae_u8 *D3D_locktexture(int*, int*, bool);
 extern void D3D_unlocktexture(void);
 extern void D3D_flushtexture (int miny, int maxy);
 extern void D3D_guimode (bool);
index 18c5df345b2ddecf883931f365c0a044f8454674..0446ccd476238eda75e6c8040d91bfab1c5f96d5 100644 (file)
@@ -1,6 +1,6 @@
 del *.zip
 copy d:\amiga\winuae.exe c:\projects\winuae\distribution
-# "c:\program files (x86)\NSIS\makensis.exe" winuae_install
+;# "c:\program files (x86)\NSIS\makensis.exe" winuae_install
 cd c:\projects\winuae\distribution
 copy docs\windows\translation.txt d:\amiga
 zip -9 -r c:\projects\winuae\src\od-win32\winuae.zip *
@@ -12,6 +12,6 @@ cdd d:\amiga
 zip -9 WinUAE%1_translation WinUAE_default.dll translation.txt
 del translation.txt
 cdd c:\projects\winuae\src\od-win32
-zip -9 winuaedebug%1 winuae_msvc10\release\winuae.pdb winuae_msvc10\fullrelease\winuae.pdb
+;zip -9 winuaedebug%1 winuae_msvc11\fullrelease\winuae.pdb winuae_msvc11\x64\fullrelease\winuae.pdb
 copy winuaedebug%1.zip d:\amiga\winuaepackets
 del *.zip
index cdb18826516aafbf1ea03279a2114303cf8e3f78..fa5c7d77c68279345b8a18fb53ae31d15504871e 100644 (file)
 #define IDD_DISKINFO                    390
 #define IDS_SELECTTAPE                  391
 #define IDS_TAPE                        392
+#define IDS_SCREEN_NATIVE               392
+#define IDS_STRING393                   393
+#define IDS_SCREEN_RTG                  393
+#define IDS_DISPLAYMODE_NATIVE          394
+#define IDS_CURRENT_CONFIGURATION       395
+#define IDS_SELECT_MENU                 396
+#define IDS_SCSI_EMULATION              397
+#define IDS_SLIRP                       398
+#define IDS_SLIRP_INBOUND               399
+#define IDS_FILTER_PAL_EXTRA            400
+#define IDS_FILTER_3D_EXTRA             401
 #define IDS_QS_MODELS                   1000
 #define IDS_QS_MODEL_A500               1001
 #define IDS_QS_MODEL_A500P              1002
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_NO_MFC                     1
 #define _APS_3D_CONTROLS                     1
-#define _APS_NEXT_RESOURCE_VALUE        391
+#define _APS_NEXT_RESOURCE_VALUE        398
 #define _APS_NEXT_COMMAND_VALUE         40050
 #define _APS_NEXT_CONTROL_VALUE         1840
 #define _APS_NEXT_SYMED_VALUE           101
index ae9cf77a2f32a1fa52ddaad380273619b047a5b6..12ece70f8855a379cbea76c8933c00906da26983 100644 (file)
@@ -131,9 +131,12 @@ BEGIN
     RTEXT           "RTG:",IDC_STATIC,8,115,49,15,SS_CENTERIMAGE
     COMBOBOX        IDC_SCREENMODE_RTG,61,118,71,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     COMBOBOX        IDC_SCREENMODE_RTG2,142,118,127,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Blacker than black [] Borderblanked black is blacker than display area black.",IDC_BLACKER_THAN_BLACK,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,11,140,139,10
-    CONTROL         "Filtered low resolution [] When scaling hires to lores or superhires to hires, show average color of pixel instead of dropping every other pixel.",IDC_LORES_SMOOTHED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,140,123,10
-    CONTROL         "Remove interlace artifacts [] Emulates interlace mode internally as progressive, removing all interlace artifacts. Not compatible with all software.",IDC_FLICKERFIXER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,154,139,10
+    CONTROL         "Blacker than black [] Borderblanked black is blacker than display area black.",IDC_BLACKER_THAN_BLACK,
+                    "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,11,140,139,10
+    CONTROL         "Filtered low resolution [] When scaling hires to lores or superhires to hires, show average color of pixel instead of dropping every other pixel.",IDC_LORES_SMOOTHED,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,140,123,10
+    CONTROL         "Remove interlace artifacts [] Emulates interlace mode internally as progressive, removing all interlace artifacts. Not compatible with all software.",IDC_FLICKERFIXER,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,154,139,10
     RTEXT           "Resolution:",IDC_STATIC,24,170,110,8,SS_CENTERIMAGE
     COMBOBOX        IDC_LORES,142,169,127,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     RTEXT           "Resolution autoswitch:",IDC_STATIC,92,190,110,8,SS_CENTERIMAGE
@@ -1193,8 +1196,8 @@ END
 //
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,8,0,0
- PRODUCTVERSION 2,8,0,0
+ FILEVERSION 2,8,1,0
+ PRODUCTVERSION 2,8,1,0
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -1210,12 +1213,12 @@ BEGIN
         BLOCK "040904b0"
         BEGIN
             VALUE "FileDescription", "WinUAE"
-            VALUE "FileVersion", "2.8.0.0"
+            VALUE "FileVersion", "2.8.1.0"
             VALUE "InternalName", "WinUAE"
-            VALUE "LegalCopyright", "© 1996-2013 under the GNU Public License (GPL)"
+            VALUE "LegalCopyright", "© 1996-2014 under the GNU Public License (GPL)"
             VALUE "OriginalFilename", "WinUAE.exe"
             VALUE "ProductName", "WinUAE"
-            VALUE "ProductVersion", "2.8.0.0"
+            VALUE "ProductVersion", "2.8.1.0"
         END
     END
     BLOCK "VarFileInfo"
@@ -1891,10 +1894,24 @@ BEGIN
     IDS_WSTYLE_EXTENDED     "Extended"
     IDS_MISCLISTITEMS1      "Untrap = middle button\nShow GUI on startup\nUse CTRL-F11 to quit\nDon't show taskbar button\nDon't show notification icon\n"
     IDS_MISCLISTITEMS2      "Always on top\nDisable screensaver\nSynchronize clock\nFaster RTG\nClipboard sharing\nAllow native code\n"
-    IDS_MISCLISTITEMS3      "Native on-screen display\nRTG on-screen display\nCreate winuaelog.txt log\nLog illegal memory accesses\nBlank unused displays\nStart mouse uncaptured\nStart minimized\nMinimize when focus is lost\n"
+    IDS_MISCLISTITEMS3      "Native on-screen display\nRTG on-screen display\nCreate winuaelog.txt log\nLog illegal memory accesses\nBlank unused displays\nStart mouse uncaptured\nStart minimized\nMinimize when focus is lost\n100/120Hz VSync black frame insertion\nMaster floppy write protection\nHide all UAE autoconfig boards\n"
     IDS_JOYMODE_WHEELMOUSE  "Wheel Mouse"
     IDS_NUMSG_KS68030PLUS   "The selected system ROM requires a 68030 or higher CPU."
     IDS_SELECTTAPE          "Select a Tape directory or archive file..."
+    IDS_SCREEN_NATIVE       "Native"
+    IDS_SCREEN_RTG          "RTG"
+    IDS_DISPLAYMODE_NATIVE  "Native"
+    IDS_CURRENT_CONFIGURATION "Current Configuration"
+    IDS_SELECT_MENU         "Select"
+    IDS_SCSI_EMULATION      "SCSI Emulation *"
+    IDS_SLIRP               "SLIRP User Mode NAT"
+    IDS_SLIRP_INBOUND       "SLIRP + Open ports (21-23,80)"
+END
+
+STRINGTABLE
+BEGIN
+    IDS_FILTER_PAL_EXTRA    "Brightness\nContrast\nSaturation\nGamma\nScanlines\nBlurriness\nNoise\n"
+    IDS_FILTER_3D_EXTRA     "Point/Bilinear\nScanline opacity\nScanline level\n"
 END
 
 #endif    // English resources
index 03c15ac96c29ffcf8d4ec0aab38465c09851ec30..d8d3a5f228cc56775b61e6d0b7e4d21077f01232 100644 (file)
@@ -76,7 +76,7 @@ END
 // Dialog
 //
 
-IDD_KICKSTART DIALOGEX 0, 0, 396, 217
+IDD_KICKSTART DIALOGEX 0, 0, 396, 243
 STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
 EXSTYLE WS_EX_CONTEXTHELP
 FONT 8, "MS Sans Serif", 0, 0, 0x1
@@ -92,7 +92,7 @@ BEGIN
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,87,77,104,12
     CONTROL         "ShapeShifter support [] Patches the system ROM for ShapeShifter compatibility.",IDC_KICKSHIFTER,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,195,77,106,13
-    GROUPBOX        "Miscellaneous",IDC_STATIC,1,98,394,116
+    GROUPBOX        "Miscellaneous",IDC_STATIC,1,98,394,143
     LTEXT           "Cartridge ROM file:",IDC_FLASHTEXT2,12,112,265,10
     COMBOBOX        IDC_CARTFILE,12,125,361,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP
     PUSHBUTTON      "...",IDC_CARTCHOOSER,376,124,10,15
@@ -102,9 +102,15 @@ BEGIN
     LTEXT           "Real Time Clock file",IDC_STATIC,12,174,313,15,SS_CENTERIMAGE
     EDITTEXT        IDC_RTCFILE,12,191,361,12,ES_AUTOHSCROLL
     PUSHBUTTON      "...",IDC_RTCCHOOSER,376,189,10,15
+    COMBOBOX        IDC_A2091ROMFILE,12,222,171,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "...",IDC_A2091ROMCHOOSER,187,221,10,15
+    LTEXT           "A590/A2091 SCSI ROM file:",IDC_STATIC,12,207,170,15,SS_CENTERIMAGE
+    LTEXT           "A4091 SCSI ROM file:",IDC_STATIC,203,207,170,15,SS_CENTERIMAGE
+    COMBOBOX        IDC_A4091ROMFILE,202,222,171,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "...",IDC_A4091ROMCHOOSER,376,221,10,15
 END
 
-IDD_DISPLAY DIALOGEX 0, 0, 396, 279
+IDD_DISPLAY DIALOGEX 0, 0, 396, 298
 STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
 FONT 8, "MS Sans Serif", 0, 0, 0x1
 BEGIN
@@ -118,42 +124,47 @@ BEGIN
     EDITTEXT        IDC_XSIZE,59,56,56,12,ES_NUMBER
     EDITTEXT        IDC_YSIZE,122,56,56,12,ES_NUMBER
     COMBOBOX        IDC_DISPLAY_BUFFERCNT,266,56,119,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    GROUPBOX        "Settings",IDC_SETTINGSTEXT,1,86,283,144
+    GROUPBOX        "Settings",IDC_SETTINGSTEXT,1,86,283,163
     RTEXT           "Native:",IDC_STATIC,9,98,48,15,SS_CENTERIMAGE
     COMBOBOX        IDC_SCREENMODE_NATIVE,61,98,71,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     COMBOBOX        IDC_SCREENMODE_NATIVE2,142,98,127,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     RTEXT           "RTG:",IDC_STATIC,8,115,49,15,SS_CENTERIMAGE
     COMBOBOX        IDC_SCREENMODE_RTG,61,118,71,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     COMBOBOX        IDC_SCREENMODE_RTG2,142,118,127,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Blacker than black",IDC_BLACKER_THAN_BLACK,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,11,140,142,10
-    CONTROL         "Filtered low resolution",IDC_LORES_SMOOTHED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,159,140,116,10
-    CONTROL         "Remove interlace artifacts",IDC_FLICKERFIXER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,154,142,10
-    CONTROL         "Resolution autoswitch",IDC_AUTORESOLUTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,159,154,116,10
-    RTEXT           "Resolution:",IDC_STATIC,27,170,110,8,SS_CENTERIMAGE
+    CONTROL         "Blacker than black [] Borderblanked black is blacker than display area black.",IDC_BLACKER_THAN_BLACK,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,11,140,139,10
+    CONTROL         "Filtered low resolution [] When scaling hires to lores or superhires to hires, show average color of pixel instead of dropping every other pixel.",IDC_LORES_SMOOTHED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,140,123,10
+    CONTROL         "Remove interlace artifacts [] Emulates interlace mode internally as progressive, removing all interlace artifacts. Not compatible with all software.",IDC_FLICKERFIXER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,154,139,10
+    RTEXT           "Resolution:",IDC_STATIC,24,170,110,8,SS_CENTERIMAGE
     COMBOBOX        IDC_LORES,142,169,127,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    RTEXT           "Refresh:",IDC_REFRESHTEXT,11,190,57,8
-    CONTROL         "Slider1",IDC_FRAMERATE,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,71,185,99,20
-    COMBOBOX        IDC_RATE2BOX,181,190,60,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    RTEXT           "FPS adj.:",IDC_REFRESH2TEXT,9,211,61,8
-    CONTROL         "",IDC_FRAMERATE2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,71,206,99,20
-    EDITTEXT        IDC_RATE2TEXT,181,210,46,12,ES_AUTOHSCROLL
-    CONTROL         "",IDC_RATE2ENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,232,211,8,10
+    RTEXT           "Resolution autoswitch:",IDC_STATIC,92,190,110,8,SS_CENTERIMAGE
+    COMBOBOX        IDC_AUTORESOLUTIONSELECT,210,189,59,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    RTEXT           "Refresh:",IDC_REFRESHTEXT,11,209,57,8
+    CONTROL         "Slider1",IDC_FRAMERATE,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,71,204,99,20
+    COMBOBOX        IDC_RATE2BOX,210,209,60,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    RTEXT           "FPS adj.:",IDC_REFRESH2TEXT,9,230,61,8
+    CONTROL         "",IDC_FRAMERATE2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,71,225,99,20
+    EDITTEXT        IDC_RATE2TEXT,210,229,46,12,ES_AUTOHSCROLL
+    CONTROL         "",IDC_RATE2ENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,261,230,8,10
+    COMBOBOX        IDC_DA_MODE,15,260,71,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "",IDC_DA_SLIDER,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,96,256,96,20
+    EDITTEXT        IDC_DA_TEXT,205,260,56,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "Reset to defaults",IDC_DA_RESET,156,278,106,14
     GROUPBOX        "Centering",IDC_STATIC,289,86,105,46
     CONTROL         "Horizontal",IDC_XCENTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,300,100,90,10
     CONTROL         "Vertical",IDC_YCENTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,300,116,90,10
-    GROUPBOX        "Line mode",IDC_STATIC,290,134,104,63
-    CONTROL         "Single",IDC_LM_NORMAL,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_GROUP | WS_TABSTOP,299,150,90,10
-    CONTROL         "Double",IDC_LM_DOUBLED,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,166,90,10
-    CONTROL         "Scanlines",IDC_LM_SCANLINES,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,182,90,10
-    GROUPBOX        "Interlaced line mode",IDC_STATIC,290,199,104,70
-    CONTROL         "Single",IDC_LM_INORMAL,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_GROUP | WS_TABSTOP,299,214,90,10
-    CONTROL         "Double, frames",IDC_LM_IDOUBLED,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,228,90,10
-    CONTROL         "Double, fields",IDC_LM_IDOUBLED2,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,241,90,10
-    CONTROL         "Double, fields+",IDC_LM_IDOUBLED3,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,254,90,10
-    COMBOBOX        IDC_DA_MODE,15,245,71,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "",IDC_DA_SLIDER,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,96,241,96,20
-    EDITTEXT        IDC_DA_TEXT,205,245,56,12,ES_AUTOHSCROLL | ES_READONLY
-    PUSHBUTTON      "Reset to defaults",IDC_DA_RESET,156,263,106,14
+    GROUPBOX        "Line mode",IDC_STATIC,290,134,104,81
+    CONTROL         "Single",IDC_LM_NORMAL,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_GROUP | WS_TABSTOP,299,148,90,10
+    CONTROL         "Double",IDC_LM_DOUBLED,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,161,90,10
+    CONTROL         "Scanlines",IDC_LM_SCANLINES,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,174,90,10
+    CONTROL         "Double, fields",IDC_LM_PDOUBLED2,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,187,90,10
+    CONTROL         "Double, fields+",IDC_LM_PDOUBLED3,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,200,90,10
+    GROUPBOX        "Interlaced line mode",IDC_STATIC,290,222,104,70
+    CONTROL         "Single",IDC_LM_INORMAL,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_GROUP | WS_TABSTOP,299,238,90,10
+    CONTROL         "Double, frames",IDC_LM_IDOUBLED,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,251,90,10
+    CONTROL         "Double, fields",IDC_LM_IDOUBLED2,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,264,90,10
+    CONTROL         "Double, fields+",IDC_LM_IDOUBLED3,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,299,277,90,10
+    CONTROL         "VGA mode resolution autoswitch [] Automatically selects between hires and superhires in programmed display modes, keeping correct aspect ratio.",IDC_AUTORESOLUTIONVGA,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,154,124,10
 END
 
 IDD_MEMORY DIALOGEX 0, 0, 396, 206
@@ -206,6 +217,8 @@ BEGIN
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,128,120,11
     CONTROL         "MMU [] 68030, 68040 and 68060 MMU emulation. Not compatible with JIT.",IDC_MMUENABLE,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,142,120,11
+    CONTROL         "Unimplemented CPU emu [] Emulate 68060 unimplemented integer instructions",IDC_CPU_UNIMPLEMENTED,
+                    "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,8,156,118,10
     GROUPBOX        "CPU Emulation Speed",IDC_STATIC,136,3,258,111
     CONTROL         "Fastest possible",IDC_CS_HOST,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_GROUP | WS_TABSTOP,143,24,195,10
     CONTROL         "Approximate A500/A1200 or cycle-exact",IDC_CS_68000,
@@ -226,6 +239,8 @@ BEGIN
     CONTROL         "CPU internal",IDC_FPU3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,8,236,93,10
     CONTROL         "More compatible [] More compatible but slower FPU emulation.",IDC_COMPATIBLE_FPU,
                     "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,8,252,117,10
+    CONTROL         "Unimplemented FPU emu [] Emulate FPU unimplemented instructions",IDC_FPU_UNIMPLEMENTED,
+                    "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,8,265,116,10
     GROUPBOX        "Advanced JIT Settings",IDC_STATIC,136,181,258,99
     RTEXT           "Cache size:",IDC_STATIC,143,200,66,10,SS_CENTERIMAGE
     CONTROL         "Slider1",IDC_CACHE,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,212,194,115,20
@@ -236,10 +251,6 @@ BEGIN
     CONTROL         "No flags",IDC_NOFLAGS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,243,227,68,11
     CONTROL         "Direct",IDC_TRUST0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,315,227,72,10
     CONTROL         "Indirect",IDC_TRUST1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,315,241,72,10
-    CONTROL         "Unimplemented FPU emu [] Emulate FPU unimplemented instructions",IDC_FPU_UNIMPLEMENTED,
-                    "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,8,265,116,10
-    CONTROL         "Unimplemented CPU emu [] Emulate 68060 unimplemented integer instructions",IDC_CPU_UNIMPLEMENTED,
-                    "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,8,156,118,10
 END
 
 IDD_FLOPPY DIALOGEX 0, 0, 396, 261
@@ -252,6 +263,7 @@ BEGIN
     COMBOBOX        IDC_DF0TYPE,152,14,65,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     RTEXT           "Write-protected",IDC_STATIC,221,17,74,10,SS_CENTERIMAGE
     CONTROL         "",IDC_DF0WP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,300,13,10,15
+    PUSHBUTTON      "?",IDC_INFO0,323,12,17,15
     PUSHBUTTON      "Eject",IDC_EJECT0,345,12,30,15
     PUSHBUTTON      "...",IDC_DF0,379,12,10,15
     COMBOBOX        IDC_DF0TEXT,6,31,384,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
@@ -260,6 +272,7 @@ BEGIN
     COMBOBOX        IDC_DF1TYPE,152,51,65,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     RTEXT           "Write-protected",IDC_STATIC,221,53,74,10,SS_CENTERIMAGE
     CONTROL         "",IDC_DF1WP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,300,50,10,15
+    PUSHBUTTON      "?",IDC_INFO1,323,49,17,15
     PUSHBUTTON      "Eject",IDC_EJECT1,345,49,30,15
     PUSHBUTTON      "...",IDC_DF1,379,49,10,15
     COMBOBOX        IDC_DF1TEXT,6,68,383,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
@@ -268,6 +281,7 @@ BEGIN
     COMBOBOX        IDC_DF2TYPE,152,87,65,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     RTEXT           "Write-protected",IDC_STATIC,222,88,73,10,SS_CENTERIMAGE
     CONTROL         "",IDC_DF2WP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,300,86,9,15
+    PUSHBUTTON      "?",IDC_INFO2,323,85,17,15
     PUSHBUTTON      "Eject",IDC_EJECT2,345,85,30,15
     PUSHBUTTON      "...",IDC_DF2,379,85,10,15
     COMBOBOX        IDC_DF2TEXT,6,104,384,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
@@ -276,6 +290,7 @@ BEGIN
     COMBOBOX        IDC_DF3TYPE,152,123,65,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     RTEXT           "Write-protected",IDC_STATIC,222,125,73,10,SS_CENTERIMAGE
     CONTROL         "",IDC_DF3WP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,300,123,9,15
+    PUSHBUTTON      "?",IDC_INFO3,323,122,17,15
     PUSHBUTTON      "Eject",IDC_EJECT3,345,121,30,15
     PUSHBUTTON      "...",IDC_DF3,379,121,10,15
     COMBOBOX        IDC_DF3TEXT,6,140,383,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
@@ -290,10 +305,6 @@ BEGIN
     EDITTEXT        IDC_CREATE_NAME,130,243,97,13,ES_AUTOHSCROLL
     CONTROL         "Bootblock",IDC_FLOPPY_BOOTABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,235,242,59,15
     CONTROL         "FFS",IDC_FLOPPY_FFS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,300,242,34,15
-    PUSHBUTTON      "?",IDC_INFO0,323,12,17,15
-    PUSHBUTTON      "?",IDC_INFO1,323,49,17,15
-    PUSHBUTTON      "?",IDC_INFO2,323,85,17,15
-    PUSHBUTTON      "?",IDC_INFO3,323,122,17,15
 END
 
 IDD_HARDDISK DIALOGEX 0, 0, 396, 315
@@ -305,6 +316,8 @@ BEGIN
     PUSHBUTTON      "Add &Directory or Archive...",IDC_NEW_FS,1,157,128,15
     PUSHBUTTON      "Add &Hardfile...",IDC_NEW_HF,135,157,126,15
     PUSHBUTTON      "Add Ha&rd Drive...",IDC_NEW_HD,267,157,127,15
+    PUSHBUTTON      "Add SCSI/IDE CD Drive",IDC_NEW_CD,1,176,128,15
+    PUSHBUTTON      "Add SCSI Tape Drive",IDC_NEW_TAPE,135,176,126,15
     PUSHBUTTON      "&Properties",IDC_EDIT,267,176,60,15
     PUSHBUTTON      "Remove",IDC_REMOVE,334,176,60,15
     GROUPBOX        "Options",IDC_STATIC,1,191,393,72
@@ -325,8 +338,6 @@ BEGIN
     COMBOBOX        IDC_CD_TYPE,282,279,71,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     PUSHBUTTON      "Eject",IDC_CD_EJECT,360,278,30,15
     COMBOBOX        IDC_CD_TEXT,5,297,386,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
-    PUSHBUTTON      "Add SCSI/IDE CD Drive",IDC_NEW_CD,1,176,128,15
-    PUSHBUTTON      "Add SCSI Tape Drive",IDC_NEW_TAPE,135,176,126,15
 END
 
 IDD_SOUND DIALOGEX 0, 0, 396, 288
@@ -340,8 +351,12 @@ BEGIN
     CONTROL         "Enabled",IDC_SOUND2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,71,108,10
     CONTROL         "Automatic switching",IDC_SOUND_AUTO,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,13,89,108,10
     GROUPBOX        "Volume",IDC_STATIC,139,19,255,69
+    RTEXT           "Paula Audio",IDC_STATIC,152,38,51,10,SS_CENTERIMAGE
     CONTROL         "",IDC_SOUNDVOLUME,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,207,32,105,20
     EDITTEXT        IDC_SOUNDVOLUME2,329,35,48,12,ES_CENTER | ES_READONLY
+    RTEXT           "CD Audio",IDC_STATIC,152,67,51,10,SS_CENTERIMAGE
+    CONTROL         "",IDC_SOUNDVOLUMECD,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,207,61,105,20
+    EDITTEXT        IDC_SOUNDVOLUMECD2,329,64,48,12,ES_CENTER | ES_READONLY
     GROUPBOX        "Sound Buffer Size",IDC_STATIC,140,90,254,42
     CONTROL         "Slider1",IDC_SOUNDBUFFERRAM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,207,106,105,20
     EDITTEXT        IDC_SOUNDBUFFERMEM,329,109,48,12,ES_CENTER | ES_READONLY
@@ -370,10 +385,6 @@ BEGIN
     CONTROL         "WASAPI",IDC_SOUND_WASAPI,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,292,240,98,10
     CONTROL         "OpenAL",IDC_SOUND_OPENAL,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,292,253,98,10
     CONTROL         "PortAudio",IDC_SOUND_PORTAUDIO,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,292,266,98,10
-    CONTROL         "",IDC_SOUNDVOLUMECD,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,207,61,105,20
-    EDITTEXT        IDC_SOUNDVOLUMECD2,329,64,48,12,ES_CENTER | ES_READONLY
-    RTEXT           "CD Audio",IDC_STATIC,152,67,51,10,SS_CENTERIMAGE
-    RTEXT           "Paula Audio",IDC_STATIC,152,38,51,10,SS_CENTERIMAGE
 END
 
 IDD_LOADSAVE DIALOGEX 0, 0, 396, 318
@@ -424,14 +435,14 @@ BEGIN
     CONTROL         "Direct []Use when emulating serial-link games on two PCs running WinUAE",IDC_SER_DIRECT,
                     "Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,181,171,83,12
     CONTROL         "uaeserial.device",IDC_UAESERIAL,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,275,171,108,12
+    GROUPBOX        "MIDI",IDC_STATIC,1,191,393,54,BS_LEFT
     RTEXT           "Out:",IDC_MIDI,22,202,32,15,SS_CENTERIMAGE
     COMBOBOX        IDC_MIDIOUTLIST,58,204,145,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     RTEXT           "In:",IDC_MIDI2,204,201,31,15,SS_CENTERIMAGE
     COMBOBOX        IDC_MIDIINLIST,239,203,145,134,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Route MIDI In to MIDI Out",IDC_MIDIROUTER,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,41,227,170,12
     GROUPBOX        "Protection Dongle",IDC_STATIC,1,252,393,41,BS_LEFT
-    GROUPBOX        "MIDI",IDC_STATIC,1,191,393,54,BS_LEFT
     COMBOBOX        IDC_DONGLELIST,58,270,232,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Route MIDI In to MIDI Out",IDC_MIDIROUTER,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,41,227,170,12
 END
 
 IDD_GAMEPORTS DIALOGEX 0, 0, 396, 288
@@ -462,9 +473,11 @@ BEGIN
     CONTROL         "Magic Mouse",IDC_PORT_MOUSETRICK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,195,235,160,11
     RTEXT           "Magic Mouse cursor mode:",IDC_STATIC,45,254,138,10,SS_CENTERIMAGE
     COMBOBOX        IDC_PORT_TABLET_CURSOR,195,251,119,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Install virtual mouse driver",IDC_PORT_TABLET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,48,270,136,11
+    CONTROL         "Install virtual mouse driver",IDC_PORT_TABLET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,9,270,116,11
     CONTROL         "Full tablet input emulation",IDC_PORT_TABLET_FULL,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,195,270,160,11
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,270,106,11
+    CONTROL         "Tablet.library emulation",IDC_PORT_TABLET_LIBRARY,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,267,271,117,11
 END
 
 IDD_CONTRIBUTORS DIALOGEX 0, 0, 530, 345
@@ -482,8 +495,8 @@ CAPTION "Configuration error log"
 FONT 8, "MS Sans Serif", 0, 0, 0x0
 BEGIN
     DEFPUSHBUTTON   "OK",IDOK,176,322,65,15
-    CONTROL         "",IDC_ERRORLOGMESSAGE,"RICHEDIT",TCS_HOTTRACK | TCS_VERTICAL | TCS_RAGGEDRIGHT | TCS_OWNERDRAWFIXED | TCS_MULTISELECT | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP,4,5,521,309
     PUSHBUTTON      "Clear log",IDC_ERRORLOGCLEAR,288,322,65,15
+    CONTROL         "",IDC_ERRORLOGMESSAGE,"RICHEDIT",TCS_HOTTRACK | TCS_VERTICAL | TCS_RAGGEDRIGHT | TCS_OWNERDRAWFIXED | TCS_MULTISELECT | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP,4,5,521,309
 END
 
 IDD_ABOUT DIALOGEX 0, 0, 345, 258
@@ -559,6 +572,7 @@ BEGIN
     CONTROL         "Read/write",IDC_HDF_RW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,53,74,67,10
     CONTROL         "Bootable",IDC_HDF_AUTOBOOT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,136,74,67,10
     CONTROL         "Do not mount",IDC_HDF_DONOTMOUNT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,217,74,67,10
+    CONTROL         "Global filesystem",IDC_HDF_ADDFSRES,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,298,74,82,10
     RTEXT           "Boot priority:",IDC_HARDFILE_BOOTPRI_TEXT,26,94,78,10
     EDITTEXT        IDC_HARDFILE_BOOTPRI,109,90,44,15
     RTEXT           "Surfaces:",IDC_SURFACES_TEXT,160,94,48,10
@@ -572,6 +586,7 @@ BEGIN
     RTEXT           "Block size:",IDC_BLOCKSIZE_TEXT,261,113,50,10
     EDITTEXT        IDC_BLOCKSIZE,317,111,40,15,ES_NUMBER
     EDITTEXT        IDC_HDFINFO,5,131,385,12,ES_CENTER | ES_READONLY
+    EDITTEXT        IDC_HDFINFO2,5,147,385,12,ES_CENTER | ES_READONLY
     GROUPBOX        "New hard disk image file",IDC_STATIC,2,171,392,62
     PUSHBUTTON      "Create",IDC_HF_CREATE,58,187,80,14
     COMBOBOX        IDC_HF_TYPE,58,211,80,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
@@ -583,8 +598,6 @@ BEGIN
     CONTROL         "Dynamic HDF",IDC_HF_DYNAMIC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,280,208,87,10
     PUSHBUTTON      "OK",IDOK,147,242,50,14
     PUSHBUTTON      "Cancel",IDCANCEL,203,242,50,14
-    EDITTEXT        IDC_HDFINFO2,5,147,385,12,ES_CENTER | ES_READONLY
-    CONTROL         "Global filesystem",IDC_HDF_ADDFSRES,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,298,74,82,10
 END
 
 IDD_FILESYS DIALOGEX 15, 25, 396, 111
@@ -677,32 +690,30 @@ BEGIN
     CONTROL         "Vertical Sync",IDC_CS_CIAA_TOD1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,41,68,86,10
     CONTROL         "Power Supply 50Hz",IDC_CS_CIAA_TOD2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,133,68,109,10
     CONTROL         "Power Supply 60Hz",IDC_CS_CIAA_TOD3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,249,68,116,10
-    GROUPBOX        "Chipset Features",IDC_STATIC,1,88,393,158
+    GROUPBOX        "Chipset Features",IDC_STATIC,0,88,393,110
     CONTROL         "CIA ROM Overlay",IDC_CS_CIAOVERLAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,102,104,11
     CONTROL         "CD32 CD",IDC_CS_CD32CD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,116,104,11
     CONTROL         "CDTV CD",IDC_CS_CDTVCD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,105,11
     CONTROL         "A600/A1200 IDE",IDC_CS_IDE1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,143,104,11
     CONTROL         "ROM Mirror (E0)",IDC_CS_KSMIRROR_E0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,157,104,11
     CONTROL         "KB Reset Warning",IDC_CS_RESETWARNING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,171,104,11
-    LTEXT           "A4091/A4000T SCSI not yet implemented.",IDC_STATIC,17,202,247,8,SS_CENTERIMAGE
-    CONTROL         "A590/A2091 SCSI",IDC_CS_A2091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,216,104,11
-    CONTROL         "A4091 SCSI",IDC_CS_A4091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,229,104,11
+    CONTROL         "CIA TOD bug",IDC_CS_CIATODBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,184,104,11
     CONTROL         "A1000 Boot RAM/ROM",IDC_CS_A1000RAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,102,121,11
     CONTROL         "CD32 C2P",IDC_CS_CD32C2P,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,116,121,11
     CONTROL         "CDTV SRAM",IDC_CS_CDTVRAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,129,121,11
     CONTROL         "A4000/A4000T IDE",IDC_CS_IDE2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,143,121,11
     CONTROL         "ROM Mirror (A8)",IDC_CS_KSMIRROR_A8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,157,121,11
     CONTROL         "No-EHB Denise",IDC_CS_NOEHB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,171,121,11
-    CONTROL         "A3000 SCSI",IDC_CS_DMAC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,216,121,11
-    CONTROL         "CDTV SCSI",IDC_CS_CDTVSCSI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,229,121,11
     CONTROL         "DF0: ID Hardware",IDC_CS_DF0IDHW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,102,125,11
     CONTROL         "CD32 NVRAM",IDC_CS_CD32NVRAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,116,125,11
     CONTROL         "CDTV SRAM Expansion",IDC_CS_CDTVRAMEXP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,129,125,11
     CONTROL         "PCMCIA",IDC_CS_PCMCIA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,143,125,11
     CONTROL         "C00000 is Fast RAM",IDC_CS_SLOWISFAST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,157,125,11
     CONTROL         "A1000 Agnus (8361/8367)",IDC_CS_DIPAGNUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,171,125,11
-    CONTROL         "A4000T SCSI",IDC_CS_DMAC2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,216,125,11
-    CONTROL         "Include host SCSI devices",IDC_CS_SCSIMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,229,125,11
+    GROUPBOX        "Internal SCSI Hardware",IDC_STATIC,0,201,393,45
+    CONTROL         "A3000 WD33C93 SCSI",IDC_CS_DMAC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,34,216,121,11
+    CONTROL         "CDTV WD33C93 SCSI",IDC_CS_CDTVSCSI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,34,229,121,11
+    CONTROL         "A4000T NCR53C710 SCSI",IDC_CS_DMAC2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,171,216,125,11
     GROUPBOX        "Chipset Revision",IDC_STATIC,1,249,393,46
     CONTROL         "Ramsey revision:",IDC_CS_RAMSEY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,34,261,97,11
     CONTROL         "Fat Gary revision:",IDC_CS_FATGARY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,34,275,97,11
@@ -712,7 +723,6 @@ BEGIN
     CONTROL         "Denise/Lisa revision:",IDC_CS_DENISE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,200,275,107,11
     EDITTEXT        IDC_CS_AGNUSREV,311,260,45,13,ES_AUTOHSCROLL
     EDITTEXT        IDC_CS_DENISEREV,311,275,45,13,ES_AUTOHSCROLL
-    CONTROL         "CIA TOD bug",IDC_CS_CIATODBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,184,104,11
 END
 
 IDD_AVIOUTPUT DIALOGEX 0, 0, 396, 260
@@ -777,48 +787,49 @@ BEGIN
     PUSHBUTTON      "Swap 1<>2",IDC_INPUTSWAP,324,303,70,14
 END
 
-IDD_FILTER DIALOGEX 0, 0, 396, 288
+IDD_FILTER DIALOGEX 0, 0, 396, 295
 STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
 FONT 8, "MS Sans Serif", 0, 0, 0x1
 BEGIN
-    GROUPBOX        "Filter Settings",-1,1,1,393,146
-    COMBOBOX        IDC_FILTERMODE,9,15,167,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_FILTERFILTER,215,15,63,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    PUSHBUTTON      "Reset to defaults",IDC_FILTERDEFAULT,283,15,106,14
-    COMBOBOX        IDC_FILTEROVERLAYTYPE,9,36,118,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_FILTEROVERLAY,134,36,145,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_FILTERAUTOSCALE,284,36,104,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    RTEXT           "Horiz. size:",-1,7,63,81,10,SS_CENTERIMAGE
-    COMBOBOX        IDC_FILTERHZMULT,92,62,35,150,CBS_DROPDOWN | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Slider1",IDC_FILTERHZ,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,147,56,152,19
-    EDITTEXT        IDC_FILTERHZV,316,58,42,12,ES_CENTER | ES_READONLY
-    RTEXT           "Vert. size:",-1,7,84,81,10,SS_CENTERIMAGE
-    COMBOBOX        IDC_FILTERVZMULT,92,83,35,150,CBS_DROPDOWN | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Slider1",IDC_FILTERVZ,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,147,77,152,19
-    EDITTEXT        IDC_FILTERVZV,316,79,42,12,ES_CENTER | ES_READONLY
-    RTEXT           "Horiz. position:",-1,5,105,81,10,SS_CENTERIMAGE
-    CONTROL         "Slider1",IDC_FILTERHO,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,147,98,151,19
-    EDITTEXT        IDC_FILTERHOV,316,100,42,12,ES_CENTER | ES_READONLY
-    RTEXT           "Vert. position:",-1,5,125,81,10,SS_CENTERIMAGE
-    CONTROL         "Slider1",IDC_FILTERVO,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,147,119,151,19
-    EDITTEXT        IDC_FILTERVOV,316,121,42,12,ES_CENTER | ES_READONLY
-    GROUPBOX        "Aspect Ratio Correction",-1,1,152,144,89
-    COMBOBOX        IDC_FILTERASPECT,14,169,99,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX        "Filter Settings",-1,1,1,393,160
+    COMBOBOX        IDC_FILTERMODE,9,31,167,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_FILTERSTACK,182,31,27,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_FILTERFILTER,215,31,63,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "Reset to defaults",IDC_FILTERDEFAULT,283,31,106,14
+    COMBOBOX        IDC_FILTEROVERLAYTYPE,9,52,118,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_FILTEROVERLAY,134,52,145,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_FILTERAUTOSCALE,284,52,104,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    RTEXT           "Horiz. size:",-1,7,79,81,10,SS_CENTERIMAGE
+    COMBOBOX        IDC_FILTERHZMULT,92,78,35,150,CBS_DROPDOWN | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    RTEXT           "Vert. size:",-1,7,100,81,10,SS_CENTERIMAGE
+    COMBOBOX        IDC_FILTERVZMULT,92,99,35,150,CBS_DROPDOWN | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    RTEXT           "Horiz. position:",-1,5,121,81,10,SS_CENTERIMAGE
+    RTEXT           "Vert. position:",-1,5,141,81,10,SS_CENTERIMAGE
+    CONTROL         "Slider1",IDC_FILTERHZ,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,147,72,152,19
+    EDITTEXT        IDC_FILTERHZV,316,74,42,12,ES_CENTER | ES_READONLY
+    CONTROL         "Slider1",IDC_FILTERVZ,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,147,93,152,19
+    EDITTEXT        IDC_FILTERVZV,316,95,42,12,ES_CENTER | ES_READONLY
+    CONTROL         "Slider1",IDC_FILTERHO,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,147,114,151,19
+    EDITTEXT        IDC_FILTERHOV,316,116,42,12,ES_CENTER | ES_READONLY
+    CONTROL         "Slider1",IDC_FILTERVO,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,147,135,151,19
+    EDITTEXT        IDC_FILTERVOV,316,137,42,12,ES_CENTER | ES_READONLY
+    GROUPBOX        "Aspect Ratio Correction",-1,1,165,144,89
+    COMBOBOX        IDC_FILTERASPECT,14,182,99,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     CONTROL         "Keep autoscale aspect",IDC_FILTERKEEPAUTOSCALEASPECT,
-                    "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,14,189,126,11
-    CONTROL         "Keep aspect ratio",IDC_FILTERKEEPASPECT,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,14,204,126,11
-    COMBOBOX        IDC_FILTERASPECT2,14,220,99,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    GROUPBOX        "Extra Settings",-1,154,152,240,89
-    COMBOBOX        IDC_FILTERXTRA,177,172,138,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_FILTERSLR,327,172,41,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Slider1",IDC_FILTERXL,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,179,195,141,19
-    EDITTEXT        IDC_FILTERXLV,327,197,41,12,ES_CENTER | ES_READONLY
-    GROUPBOX        "Presets",-1,1,245,393,36
-    COMBOBOX        IDC_FILTERPRESETS,13,260,183,150,CBS_DROPDOWN | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    PUSHBUTTON      "Load",IDC_FILTERPRESETLOAD,205,259,55,14
-    PUSHBUTTON      "Save",IDC_FILTERPRESETSAVE,265,259,55,14
-    PUSHBUTTON      "Delete",IDC_FILTERPRESETDELETE,325,259,55,14
-    COMBOBOX        IDC_FILTERSTACK,182,15,27,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+                    "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,14,202,126,11
+    CONTROL         "Keep aspect ratio",IDC_FILTERKEEPASPECT,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,14,217,126,11
+    COMBOBOX        IDC_FILTERASPECT2,14,233,99,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX        "Extra Settings",-1,154,165,240,89
+    COMBOBOX        IDC_FILTERXTRA,177,185,138,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_FILTERSLR,327,185,41,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Slider1",IDC_FILTERXL,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,179,208,141,19
+    EDITTEXT        IDC_FILTERXLV,327,210,41,12,ES_CENTER | ES_READONLY
+    GROUPBOX        "Presets",-1,1,258,393,36
+    COMBOBOX        IDC_FILTERPRESETS,13,273,183,150,CBS_DROPDOWN | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "Load",IDC_FILTERPRESETLOAD,205,272,55,14
+    PUSHBUTTON      "Save",IDC_FILTERPRESETSAVE,265,272,55,14
+    PUSHBUTTON      "Delete",IDC_FILTERPRESETDELETE,325,272,55,14
+    COMBOBOX        IDC_FILTER_NATIVERTG,284,12,104,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
 END
 
 IDD_HARDDRIVE DIALOGEX 0, 0, 396, 109
@@ -828,6 +839,8 @@ FONT 8, "MS Sans Serif", 0, 0, 0x0
 BEGIN
     LTEXT           "Hard drive:",IDC_STATIC,7,11,80,10
     COMBOBOX        IDC_HARDDRIVE,49,9,339,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    EDITTEXT        IDC_HDFINFO,5,29,385,12,ES_CENTER | ES_READONLY
+    EDITTEXT        IDC_HDFINFO2,5,46,385,12,ES_CENTER | ES_READONLY
     DEFPUSHBUTTON   "Create hard disk image file",IDC_HARDDRIVE_IMAGE,49,67,115,14
     EDITTEXT        IDC_PATH_NAME,183,67,97,15,ES_AUTOHSCROLL | NOT WS_VISIBLE
     RTEXT           "HD Controller:",IDC_STATIC,12,90,65,10,SS_CENTERIMAGE
@@ -835,8 +848,6 @@ BEGIN
     CONTROL         "Read/write",IDC_HDF_RW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,172,90,60,10
     DEFPUSHBUTTON   "Add hard drive",IDOK,236,87,73,14
     PUSHBUTTON      "Cancel",IDCANCEL,316,87,73,14
-    EDITTEXT        IDC_HDFINFO,5,29,385,12,ES_CENTER | ES_READONLY
-    EDITTEXT        IDC_HDFINFO2,5,46,385,12,ES_CENTER | ES_READONLY
 END
 
 IDD_MISC2 DIALOGEX 0, 0, 396, 263
@@ -887,10 +898,10 @@ BEGIN
     PUSHBUTTON      "Reset",IDC_RESETAMIGA,3,328,47,14
     PUSHBUTTON      "Quit",IDC_QUITEMU,55,328,47,14
     PUSHBUTTON      "Restart",IDC_RESTARTEMU,107,328,47,14,NOT WS_VISIBLE
+    PUSHBUTTON      "Error log",IDC_ERRORLOG,322,328,47,14,NOT WS_VISIBLE
     DEFPUSHBUTTON   "OK",IDOK,375,328,47,14
     PUSHBUTTON      "Cancel",IDCANCEL,427,328,47,14
     PUSHBUTTON      "Help",IDHELP,479,328,47,14,WS_DISABLED
-    PUSHBUTTON      "Error log",IDC_ERRORLOG,322,328,47,14,NOT WS_VISIBLE
 END
 
 IDD_PATHS DIALOGEX 0, 0, 396, 303
@@ -957,20 +968,20 @@ BEGIN
     PUSHBUTTON      "Select image file",IDC_DF0QQ,93,148,98,15
     RTEXT           "Write-protected",IDC_DF0WPTEXTQ,196,151,69,10,SS_CENTERIMAGE
     CONTROL         "",IDC_DF0WPQ,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,270,149,10,15
+    PUSHBUTTON      "?",IDC_INFO0Q,334,148,19,15
     PUSHBUTTON      "Eject",IDC_EJECT0Q,358,148,30,15
     COMBOBOX        IDC_DF0TEXTQ,9,167,379,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
     CONTROL         "Floppy drive DF1:",IDC_DF1QENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,186,77,15
     PUSHBUTTON      "Select image file",IDC_DF1QQ,93,186,98,15
     RTEXT           "Write-protected",IDC_DF1WPTEXTQ,195,189,69,10,SS_CENTERIMAGE
+    COMBOBOX        IDC_CD0Q_TYPE,199,187,74,50,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP
     CONTROL         "",IDC_DF1WPQ,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,270,185,10,15
+    PUSHBUTTON      "?",IDC_INFO1Q,334,186,19,15
     PUSHBUTTON      "Eject",IDC_EJECT1Q,358,186,30,15
     COMBOBOX        IDC_DF1TEXTQ,9,204,379,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
     PUSHBUTTON      "Set configuration",IDC_QUICKSTART_SETCONFIG,9,239,88,15,NOT WS_VISIBLE
     GROUPBOX        "Mode",IDC_STATIC,250,231,144,28,BS_LEFT
     CONTROL         "Start in Quickstart mode",IDC_QUICKSTARTMODE,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,259,242,131,12
-    COMBOBOX        IDC_CD0Q_TYPE,199,187,74,50,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP
-    PUSHBUTTON      "?",IDC_INFO0Q,334,148,19,15
-    PUSHBUTTON      "?",IDC_INFO1Q,334,186,19,15
 END
 
 IDD_FRONTEND DIALOGEX 0, 0, 420, 242
@@ -1048,7 +1059,7 @@ BEGIN
     CTEXT           "Enter address",IDC_DBG_ADDRINPUTTXT,20,1,100,10,SS_CENTERIMAGE | WS_TABSTOP
 END
 
-IDD_EXPANSION DIALOGEX 0, 0, 396, 278
+IDD_EXPANSION DIALOGEX 0, 0, 396, 289
 STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
 FONT 8, "MS Sans Serif", 0, 0, 0x1
 BEGIN
@@ -1063,6 +1074,7 @@ BEGIN
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,67,212,10
     CONTROL         "Always scale in windowed mode",IDC_RTG_SCALE_ALLOW,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,80,212,10
+    CONTROL         "Always center",IDC_RTG_CENTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,93,212,10
     CONTROL         "Hardware vertical blank interrupt",IDC_RTG_VBINTERRUPT,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,106,157,10
     CONTROL         "Hardware sprite emulation",IDC_RTG_HWSPRITE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,207,106,148,10
@@ -1078,11 +1090,14 @@ BEGIN
     COMBOBOX        IDC_RTG_BUFFERCNT,153,162,84,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     CTEXT           "Aspect ratio:",IDC_STATIC,282,149,83,10,SS_CENTERIMAGE
     COMBOBOX        IDC_RTG_SCALE_ASPECTRATIO,282,162,84,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    GROUPBOX        "Miscellaneous Expansions",IDC_STATIC,1,197,172,80
+    GROUPBOX        "Miscellaneous Expansions",IDC_STATIC,1,197,172,87
     CONTROL         "Catweasel Z2 emulation [] Catweasel MK2 Zorro II card emulation. Physical Windows compatible Catweasel card and drivers required.",IDC_CATWEASEL,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,216,147,11
     CONTROL         "uaescsi.device",IDC_SCSIDEVICE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,229,147,11
-    GROUPBOX        "Network",IDC_STATIC,181,197,213,80
+    CONTROL         "A590/A2091 WD33C93 SCSI",IDC_CS_A2091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,242,147,11
+    CONTROL         "A4091 NCR53C710 SCSI",IDC_CS_A4091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,255,151,11
+    CONTROL         "Include host SCSI devices",IDC_CS_SCSIMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,268,147,11
+    GROUPBOX        "Network",IDC_STATIC,181,197,213,86
     CONTROL         "bsdsocket.library [] bsdsocket network library emulation.",IDC_SOCKETS,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,216,187,11
     CONTROL         "uaenet.device [] Sana 2 compatible network device emulation.",IDC_SANA2,
@@ -1090,7 +1105,6 @@ BEGIN
     CONTROL         "A2065 Z2 [] A2065 Ethernet Zorro II card emulation.",IDC_A2065,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,242,187,11
     COMBOBOX        IDC_NETDEVICE,202,257,178,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Always center",IDC_RTG_CENTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,93,212,10
 END
 
 IDD_INPUTMAP DIALOGEX 0, 0, 421, 341
@@ -1102,13 +1116,13 @@ BEGIN
     CONTROL         "",IDC_INPUTMAPLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,1,1,418,257
     EDITTEXT        IDC_INPUTMAPOUT,1,261,418,14,ES_AUTOHSCROLL | ES_READONLY | WS_DISABLED
     EDITTEXT        IDC_INPUTMAPOUTM,1,277,418,29,ES_MULTILINE | ES_READONLY | WS_DISABLED
-    PUSHBUTTON      "Remap",IDC_INPUTMAP_CAPTURE,86,324,80,14
+    COMBOBOX        IDC_INPUTMAPADD,2,309,345,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     PUSHBUTTON      "Add",IDC_INPUTMAP_CUSTOM,351,308,66,14
+    PUSHBUTTON      "Test",IDC_INPUTMAP_TEST,2,324,80,14
+    PUSHBUTTON      "Remap",IDC_INPUTMAP_CAPTURE,86,324,80,14
     PUSHBUTTON      "Delete",IDC_INPUTMAP_DELETE,170,324,80,14
     PUSHBUTTON      "Delete all",IDC_INPUTMAP_DELETEALL,254,324,80,14
-    PUSHBUTTON      "Test",IDC_INPUTMAP_TEST,2,324,80,14
     PUSHBUTTON      "Exit",IDC_INPUTMAP_EXIT,338,324,80,14
-    COMBOBOX        IDC_INPUTMAPADD,2,309,345,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
 END
 
 IDD_INFOBOX DIALOGEX 0, 0, 420, 68
@@ -1151,15 +1165,15 @@ STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK |
 CAPTION "Tape Drive Settings"
 FONT 8, "MS Sans Serif", 0, 0, 0x0
 BEGIN
-    DEFPUSHBUTTON   "Add Tape Drive",IDOK,201,58,88,14
-    PUSHBUTTON      "Cancel",IDCANCEL,300,58,87,14
-    RTEXT           "HD Controller:",IDC_STATIC,35,61,65,10,SS_CENTERIMAGE
-    COMBOBOX        IDC_HDF_CONTROLLER,115,59,61,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    EDITTEXT        IDC_PATH_NAME,52,15,334,15,ES_AUTOHSCROLL
     RTEXT           "Path:",IDC_STATIC,4,18,43,10,SS_CENTERIMAGE
+    EDITTEXT        IDC_PATH_NAME,52,15,334,15,ES_AUTOHSCROLL
     PUSHBUTTON      "Select Directory",IDC_TAPE_SELECT_DIR,19,36,123,15
     PUSHBUTTON      "Select Archive or Plain File",IDC_TAPE_SELECT_FILE,160,36,123,15
     CONTROL         "Read/write",IDC_TAPE_RW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,313,39,67,10
+    RTEXT           "HD Controller:",IDC_STATIC,35,61,65,10,SS_CENTERIMAGE
+    COMBOBOX        IDC_HDF_CONTROLLER,115,59,61,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    DEFPUSHBUTTON   "Add Tape Drive",IDOK,201,58,88,14
+    PUSHBUTTON      "Cancel",IDCANCEL,300,58,87,14
 END
 
 IDD_DISKINFO DIALOGEX 0, 0, 491, 323
@@ -1168,8 +1182,8 @@ CAPTION "Disk image information"
 FONT 8, "MS Sans Serif", 0, 0, 0x0
 BEGIN
     DEFPUSHBUTTON   "OK",IDOK,220,303,50,14
-    EDITTEXT        IDC_DISKINFOBOX,5,4,481,292,ES_MULTILINE | ES_READONLY | WS_VSCROLL
     PUSHBUTTON      "Save bootblock",IDC_SAVEBOOTBLOCK,397,303,89,14,NOT WS_VISIBLE
+    EDITTEXT        IDC_DISKINFOBOX,5,4,481,292,ES_MULTILINE | ES_READONLY | WS_VSCROLL
 END
 
 
@@ -1179,8 +1193,8 @@ END
 //
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,7,0,0
- PRODUCTVERSION 2,7,0,0
+ FILEVERSION 2,8,0,0
+ PRODUCTVERSION 2,8,0,0
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -1196,12 +1210,12 @@ BEGIN
         BLOCK "040904b0"
         BEGIN
             VALUE "FileDescription", "WinUAE"
-            VALUE "FileVersion", "2.7.0.0"
+            VALUE "FileVersion", "2.8.0.0"
             VALUE "InternalName", "WinUAE"
             VALUE "LegalCopyright", "© 1996-2013 under the GNU Public License (GPL)"
             VALUE "OriginalFilename", "WinUAE.exe"
             VALUE "ProductName", "WinUAE"
-            VALUE "ProductVersion", "2.7.0.0"
+            VALUE "ProductVersion", "2.8.0.0"
         END
     END
     BLOCK "VarFileInfo"
@@ -1297,7 +1311,6 @@ BEGIN
     END
 END
 
-
 /////////////////////////////////////////////////////////////////////////////
 //
 // DESIGNINFO
@@ -1308,6 +1321,7 @@ GUIDELINES DESIGNINFO
 BEGIN
     IDD_KICKSTART, DIALOG
     BEGIN
+        BOTTOMMARGIN, 217
     END
 
     IDD_DISPLAY, DIALOG
@@ -1393,6 +1407,7 @@ BEGIN
 
     IDD_FILTER, DIALOG
     BEGIN
+        BOTTOMMARGIN, 288
     END
 
     IDD_HARDDRIVE, DIALOG
@@ -1847,6 +1862,7 @@ BEGIN
     IDS_INPUTQUALIFIER      "Qualifiers"
     IDS_GENERIC             "Generic"
     IDS_AUTODETECT          "Autodetect"
+    IDS_OFF                 "off"
 END
 
 STRINGTABLE
index 45adeab681f5b53ba4cac1225599ec41bcd16dc3..9ce8fc2197f643835139a4a10bc60e89f3033b25 100644 (file)
@@ -377,7 +377,7 @@ static int port_insert (int inputmap_port, int devicetype, DWORD flags, const TC
        inputdevice_compa_clear (&changed_prefs, inputmap_port);
        
        if (_tcslen (name) == 0) {
-               inputdevice_joyport_config (&changed_prefs, _T("none"), inputmap_port, 0, 0);
+               inputdevice_joyport_config (&changed_prefs, _T("none"), inputmap_port, 0, 0, true);
                return TRUE;
        }
        devicetype2 = -1;
@@ -399,10 +399,10 @@ static int port_insert (int inputmap_port, int devicetype, DWORD flags, const TC
                _stprintf (tmp2, _T("KeyboardLayout%d"), i);
                if (!_tcscmp (tmp2, name)) {
                        _stprintf (tmp2, _T("kbd%d"), i + 1);
-                       return inputdevice_joyport_config (&changed_prefs, tmp2, inputmap_port, devicetype2, 0);
+                       return inputdevice_joyport_config (&changed_prefs, tmp2, inputmap_port, devicetype2, 0, true);
                }
        }
-       return inputdevice_joyport_config (&changed_prefs, name, inputmap_port, devicetype2, 1);
+       return inputdevice_joyport_config (&changed_prefs, name, inputmap_port, devicetype2, 1, true);
 }
 
 static int cd_insert (int num, const TCHAR *name)
index 240ac41fb921b77b94c2505e20392e8c4a560a76..37722c295cf880026f1b04beb491e3646b4b56bb 100644 (file)
@@ -197,7 +197,7 @@ zip -9 -r winuaesrc *
 copy winuaesrc.zip d:\amiga\winuaepackets\winuaesrc%1.zip
 move winuaesrc.zip d:\amiga
 cd c:\projects\winuae\src\od-win32
-zip -9 winuaedebug%1 winuae_msvc10\fullrelease\winuae.pdb winuae_msvc10\x64\fullrelease\winuae.pdb
+zip -9 winuaedebug%1 winuae_msvc11\fullrelease\winuae.pdb winuae_msvc11\x64\fullrelease\winuae.pdb
 move winuaedebug%1.zip d:\amiga\winuaepackets\debug\
-copy winuae_msvc10\fullrelease\winuae.pdb d:\amiga\dump
+copy winuae_msvc11\fullrelease\winuae.pdb winuae_msvc11\x64\fullrelease\winuae.pdb d:\amiga\dump
 copy d:\amiga\winuae.exe d:\amiga\dump
index dd80f9b0be47faaabd39b0c4d985339d44509e12..9c73485623d2ba8413ee625eab5ea8701bb6d465 100644 (file)
@@ -2522,7 +2522,7 @@ void logging_init (void)
                SystemInfo.wProcessorArchitecture, SystemInfo.wProcessorLevel, SystemInfo.wProcessorRevision,
                SystemInfo.dwNumberOfProcessors, filedate);
        write_log (_T("\n(c) 1995-2001 Bernd Schmidt   - Core UAE concept and implementation.")
-               _T("\n(c) 1998-2013 Toni Wilen      - Win32 port, core code updates.")
+               _T("\n(c) 1998-2014 Toni Wilen      - Win32 port, core code updates.")
                _T("\n(c) 1996-2001 Brian King      - Win32 port, Picasso96 RTG, and GUI.")
                _T("\n(c) 1996-1999 Mathias Ortmann - Win32 port and bsdsocket support.")
                _T("\n(c) 2000-2001 Bernd Meyer     - JIT engine.")
index 86c2b13221abfd16836bb5fe5cd5397509a1558a..a0db59d6eb0b9bc604248e3f3289425cb6f8b7ee 100644 (file)
 #define GETBDM(x) (((x) - ((x / 10000) * 10000)) / 100)
 #define GETBDD(x) ((x) % 100)
 
-#define WINUAEPUBLICBETA 0
+#define WINUAEPUBLICBETA 1
 #define LANG_DLL 1
 
 #if WINUAEPUBLICBETA
-#define WINUAEBETA _T("0")
+#define WINUAEBETA _T("1")
 #else
 #define WINUAEBETA _T("")
 #endif
-#define WINUAEDATE MAKEBD(2014, 5, 5)
+#define WINUAEDATE MAKEBD(2014, 5, 14)
 #define WINUAEEXTRA _T("")
 //#define WINUAEEXTRA _T("AmiKit Preview")
 //#define WINUAEEXTRA _T("Amiga Forever Edition")
index ea92e195bbf7053ce527a82b8a8a26de1b53367b..fa1f89e8831147cd5c207a8a6a6083f9a2ffa2d7 100644 (file)
@@ -844,7 +844,7 @@ void S2X_render (void)
        int ok = 0;
        RECT sr, dr, zr;
        DDSURFACEDESC2 desc;
-       int pitch;
+       int pitch, surf_height;
        uae_u8 *surfstart;
 
        aw = amiga_width;
@@ -862,7 +862,7 @@ void S2X_render (void)
        bufmem_ptr = sptr;
 
        if (d3d) {
-               surfstart = D3D_locktexture (&pitch, true);
+               surfstart = D3D_locktexture (&pitch, &surf_height, true);
                if (surfstart == NULL)
                        return;
        } else {
@@ -876,9 +876,10 @@ void S2X_render (void)
                        return;
                pitch = desc.lPitch;
                surfstart = (uae_u8*)desc.lpSurface;
+               surf_height = desc.dwHeight;
        }
        dptr = surfstart;
-       enddptr = dptr + pitch * temp_height;
+       enddptr = dptr + pitch * surf_height;
        if (!d3d) {
                dptr = getfilterrect1 (&sr, &dr, dst_width, dst_height, dst_depth, aw, ah, scale, temp_width, temp_height, dptr, pitch);
        }
@@ -1003,8 +1004,9 @@ void S2X_render (void)
 
                if (amiga_depth == dst_depth) {
                        int y;
-                       for (y = 0; y < ah; y++) {
-                               memcpy (dptr, sptr, aw * dst_depth / 8);
+                       int w = aw * dst_depth / 8;
+                       for (y = 0; y < ah && dptr + w <= enddptr; y++) {
+                               memcpy (dptr, sptr, w);
                                sptr += vb->rowbytes;
                                dptr += pitch;
                        }
index 1e0320072716fe93f44b72ce8b83771a41c624f5..09f3150995936e0211d3855b7556f7260e5242f0 100644 (file)
@@ -1120,7 +1120,7 @@ int lockscr (struct vidbuffer *vb, bool fullupdate)
                        ret = 1;
                } else {
                        ret = 0;
-                       vb->bufmem = D3D_locktexture (&vb->rowbytes, fullupdate);
+                       vb->bufmem = D3D_locktexture (&vb->rowbytes, NULL, fullupdate);
                        if (vb->bufmem) {
                                init_row_map ();
                                ret = 1;
@@ -1301,7 +1301,7 @@ static uae_u8 *gfx_lock_picasso2 (bool fullupdate)
 {
        if (currprefs.gfx_api) {
                int pitch;
-               uae_u8 *p = D3D_locktexture (&pitch, fullupdate);
+               uae_u8 *p = D3D_locktexture (&pitch, NULL, fullupdate);
                picasso_vidinfo.rowbytes = pitch;
                return p;
        } else {
index 0709571ec1774c51452f8d7fc42d8875a4a4efa2..fffaf7e203c62b95cd68bc9faa6b9d11e00101bd 100644 (file)
@@ -5210,7 +5210,8 @@ static INT_PTR CALLBACK PathsDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM
                SendDlgItemMessage (hDlg, IDC_LOGSELECT, CB_RESETCONTENT, 0, 0);
                SendDlgItemMessage (hDlg, IDC_LOGSELECT, CB_ADDSTRING, 0, (LPARAM)_T("winuaebootlog.txt"));
                SendDlgItemMessage (hDlg, IDC_LOGSELECT, CB_ADDSTRING, 0, (LPARAM)_T("winuaelog.txt"));
-               SendDlgItemMessage (hDlg, IDC_LOGSELECT, CB_ADDSTRING, 0, (LPARAM)_T("Current configuration"));
+               WIN32GUI_LoadUIString (IDS_CURRENT_CONFIGURATION, tmp, sizeof tmp / sizeof (TCHAR));
+               SendDlgItemMessage (hDlg, IDC_LOGSELECT, CB_ADDSTRING, 0, (LPARAM)tmp);
                SendDlgItemMessage (hDlg, IDC_LOGSELECT, CB_SETCURSEL, 0, 0);
                CheckDlgButton (hDlg, IDC_LOGENABLE, winuaelog_temporary_enable || (full_property_sheet == 0 && currprefs.win32_logfile));
                ew (hDlg, IDC_LOGENABLE, winuaelog_temporary_enable == false && full_property_sheet);
@@ -6472,7 +6473,7 @@ static void values_to_displaydlg (HWND hDlg)
 static void init_resolution_combo (HWND hDlg)
 {
        int i, idx;
-       TCHAR tmp[64];
+       TCHAR tmp[MAX_DPATH];
        struct MultiDisplay *md = getdisplay (&workprefs);
 
        idx = -1;
@@ -6486,7 +6487,8 @@ static void init_resolution_combo (HWND hDlg)
                        idx = md->DisplayModes[i].residx;
                }
        }
-       SendDlgItemMessage(hDlg, IDC_RESOLUTION, CB_ADDSTRING, 0, (LPARAM)_T("Native"));
+       WIN32GUI_LoadUIString (IDS_DISPLAYMODE_NATIVE, tmp, sizeof tmp / sizeof (TCHAR));
+       SendDlgItemMessage(hDlg, IDC_RESOLUTION, CB_ADDSTRING, 0, (LPARAM)tmp);
 }
 
 static void init_displays_combo (HWND hDlg, bool rtg)
@@ -7709,6 +7711,18 @@ static INT_PTR CALLBACK ExpansionDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP
 
                if (!enumerated) {
                        ethernet_enumerate (ndd, NULL);
+                       for (int i = 0; ndd[i]; i++) {
+                               struct netdriverdata *n = ndd[i];
+                               if (!n->active)
+                                       continue;
+                               if (n->type == UAENET_SLIRP) {
+                                       WIN32GUI_LoadUIString (IDS_SLIRP, tmp, sizeof tmp / sizeof (TCHAR));
+                                       n->desc = my_strdup(tmp);
+                               } else if (n->type == UAENET_SLIRP_INBOUND) {
+                                       WIN32GUI_LoadUIString (IDS_SLIRP_INBOUND, tmp, sizeof tmp / sizeof (TCHAR));
+                                       n->desc = my_strdup(tmp);
+                               }
+                       }
                        enumerated = 1;
                }
                expansion_net (hDlg);
@@ -8391,8 +8405,11 @@ static void misc_addpri (HWND hDlg, int v, int pri)
 
 static void misc_scsi (HWND hDlg)
 {
+       TCHAR tmp[MAX_DPATH];
+
        SendDlgItemMessage (hDlg, IDC_SCSIMODE, CB_RESETCONTENT, 0, 0);
-       SendDlgItemMessage (hDlg, IDC_SCSIMODE, CB_ADDSTRING, 0, (LPARAM)_T("SCSI Emulation *"));
+       WIN32GUI_LoadUIString (IDS_SCSI_EMULATION, tmp, sizeof tmp / sizeof (TCHAR));
+       SendDlgItemMessage (hDlg, IDC_SCSIMODE, CB_ADDSTRING, 0, (LPARAM)tmp);
        SendDlgItemMessage (hDlg, IDC_SCSIMODE, CB_ADDSTRING, 0, (LPARAM)_T("SPTI"));
        SendDlgItemMessage (hDlg, IDC_SCSIMODE, CB_ADDSTRING, 0, (LPARAM)_T("SPTI + SCSI SCAN"));
        SendDlgItemMessage (hDlg, IDC_SCSIMODE, CB_SETCURSEL, workprefs.win32_uaescsimode, 0);
@@ -8426,7 +8443,8 @@ static void misc_lang (HWND hDlg)
        SendDlgItemMessage (hDlg, IDC_LANGUAGE, CB_SETCURSEL, idx, 0);
 
        SendDlgItemMessage (hDlg, IDC_GUI_SIZE, CB_RESETCONTENT, 0, 0);
-       SendDlgItemMessage (hDlg, IDC_GUI_SIZE, CB_ADDSTRING, 0, (LPARAM)_T("Select"));
+       WIN32GUI_LoadUIString (IDS_SELECT_MENU, tmp, sizeof tmp / sizeof (TCHAR));
+       SendDlgItemMessage (hDlg, IDC_GUI_SIZE, CB_ADDSTRING, 0, (LPARAM)tmp);
        SendDlgItemMessage (hDlg, IDC_GUI_SIZE, CB_ADDSTRING, 0, (LPARAM)_T("140%"));
        SendDlgItemMessage (hDlg, IDC_GUI_SIZE, CB_ADDSTRING, 0, (LPARAM)_T("130%"));
        SendDlgItemMessage (hDlg, IDC_GUI_SIZE, CB_ADDSTRING, 0, (LPARAM)_T("120%"));
@@ -14810,13 +14828,38 @@ static INT_PTR CALLBACK hw3dDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM
 {
        static int recursive;
        LRESULT item;
-       TCHAR tmp[100];
+       TCHAR tmp[MAX_DPATH];
        int i;
        static int filteroverlaypos = -1;
+       static bool firstinit;
 
        switch (msg)
        {
        case WM_INITDIALOG:
+               if (!firstinit) {
+                       WIN32GUI_LoadUIString (IDS_FILTER_PAL_EXTRA, tmp, sizeof tmp / sizeof (TCHAR));
+                       TCHAR *p1 = tmp;
+                       for (i = 0; filter_pal_extra[i].label; i++) {
+                               TCHAR *p2 = _tcschr (p1, '\n');
+                               if (!p2 || *p2 == 0)
+                                       break;
+                               *p2++ = 0;
+                               filter_pal_extra[i].label = my_strdup(p1);
+                               p1 = p2;
+                       }
+                       WIN32GUI_LoadUIString (IDS_FILTER_3D_EXTRA, tmp, sizeof tmp / sizeof (TCHAR));
+                       p1 = tmp;
+                       for (i = 0; filter_3d_extra[i].label; i++) {
+                               TCHAR *p2 = _tcschr (p1, '\n');
+                               if (!p2 || *p2 == 0)
+                                       break;
+                               *p2++ = 0;
+                               filter_3d_extra[i].label = my_strdup(p1);
+                               p1 = p2;
+                       }
+                       firstinit = true;
+               }
+
                pages[HW3D_ID] = hDlg;
                currentpage = HW3D_ID;
                SendDlgItemMessage (hDlg, IDC_FILTERASPECT, CB_RESETCONTENT, 0, 0);
@@ -14833,8 +14876,10 @@ static INT_PTR CALLBACK hw3dDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM
                SendDlgItemMessage (hDlg, IDC_FILTERASPECT2, CB_ADDSTRING, 0, (LPARAM)_T("TV"));
 
                SendDlgItemMessage (hDlg, IDC_FILTER_NATIVERTG, CB_RESETCONTENT, 0, 0L);
-               SendDlgItemMessage (hDlg, IDC_FILTER_NATIVERTG, CB_ADDSTRING, 0, (LPARAM)_T("Native"));
-               SendDlgItemMessage (hDlg, IDC_FILTER_NATIVERTG, CB_ADDSTRING, 0, (LPARAM)_T("RTG"));
+               WIN32GUI_LoadUIString (IDS_SCREEN_NATIVE, tmp, sizeof tmp / sizeof (TCHAR));
+               SendDlgItemMessage (hDlg, IDC_FILTER_NATIVERTG, CB_ADDSTRING, 0, (LPARAM)tmp);
+               WIN32GUI_LoadUIString (IDS_SCREEN_RTG, tmp, sizeof tmp / sizeof (TCHAR));
+               SendDlgItemMessage (hDlg, IDC_FILTER_NATIVERTG, CB_ADDSTRING, 0, (LPARAM)tmp);
 
                SendDlgItemMessage (hDlg, IDC_FILTERHZMULT, CB_RESETCONTENT, 0, 0L);
                SendDlgItemMessage (hDlg, IDC_FILTERVZMULT, CB_RESETCONTENT, 0, 0L);
index 19164b2f32fbeac2d9a5405c061d60fb8cd8ac36..f3bbaa15a878ec459a19de62a30f59673853aa55 100644 (file)
 
 - restore only single input target to default.
 
+Beta 1:
+
+- Audio DMA CPU wait hack (that tries to prevent missing samples if program has CPU timed audio DMA wait)
+  improved, now compatible with programs that really need delay after DMA switch off (for example switches
+  DMA off, then clears interrupt request, and then finally waits for audio interrupt).
+- CPU on the fly mode changes were unreliable (2.8.0b15)
+- Fixed some GUI strings that didn't support translation.
+- .ccd CD images didn't automatically load from archive if file was not in archive root.
+- Disk insert after emulation has been started may have internally set disk as write protected even
+  if disk image is write enabled. (broken since GUI "?" button was added)
+- Added DMA channel support to memwatch points. Add DMA channel name (or more than one) at the end of
+  debugger w command line, for example COP, BLT (or BLTA if you only want A channel reads) and so on..
+  No parameter = CPU accesses only.
+- Null filter didn't check display bounds, fixes possible DirectDraw mode crash when display size changes.
+- Directory filesystem ACTION SET FILE SIZE will now fail if target file size is >= 2G. (Prevents accidental
+  truncation if program does not support large files)
+- Added directory filesystem MorphOS compatible 64-bit file size packets: ACTION_SEEK64, ACTION_SET_FILE_SIZE64,
+  ACTION_LOCK_RECORD64, ACTION_FREE_RECORD64, ACTION_EXAMINE_OBJECT64, ACTION_EXAMINE_NEXT64, ACTION_EXAMINE_FH64 and
+  ACTION_EXAMINE_ALL ED_SIZE64. (OS4 packets were implemented long time ago)
+- AGA and reading non-existing or write-only custom registers work differently than on A500, don't use new more
+  A500 compatible method added in 2.8.0 with AGA configurations. (This is far from accurate)
+- Mouse device autoswitching was unreliable if rawinput was not supported or was disabled.
+- If Quickstart mode and sound filter is set to A500 or A1200 emulated or always on: automatically match it with
+  selected config.
+- DMA debugger now shows CPU and DMA 32-bit chip ram accesses, previously data was truncated to 16-bits. 64-bit
+  DMA is stil truncated to 32-bit.
+
 2.8.0
 
 - Lowered floppy drive step limit again a bit more, fixes Elektrica / Cascade.
index 9144fe222f3ef169aedc1fd6a5ded9672e9d4e0e..4ec290af69a551588b8b9edfefcfa0cea55bd775 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
-  <Product Id="*" Name="WinUAE" Language="1033" Version="2.8.0.0" Manufacturer="Arabuusimiehet" UpgradeCode="88C6D045-E416-4AEA-9EE9-0B7A53EE0F16">
+  <Product Id="*" Name="WinUAE" Language="1033" Version="2.8.1.0" Manufacturer="Arabuusimiehet" UpgradeCode="88C6D045-E416-4AEA-9EE9-0B7A53EE0F16">
     <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
 
     <?define SRCDIST="$(var.winuae.ProjectDir)/../../../distribution/"?>