]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
3410b1
authorToni Wilen <twilen@winuae.net>
Sat, 11 Feb 2017 18:18:31 +0000 (20:18 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 11 Feb 2017 18:18:31 +0000 (20:18 +0200)
46 files changed:
arcadia.cpp
audio.cpp
cfgfile.cpp
cia.cpp
cpuboard.cpp
cpummu30.cpp
custom.cpp
disk.cpp
drawing.cpp
expansion.cpp
fpp.cpp
gencpu.cpp
idecontrollers.cpp
include/arcadia.h
include/cpu_prefetch.h
include/disk.h
include/inputdevice.h
include/newcpu.h
include/options.h
include/rommgr.h
include/scsi.h
include/sndboard.h
include/uae/mman.h
inputdevice.cpp
main.cpp
memory.cpp
newcpu.cpp
od-win32/direct3d.cpp
od-win32/hardfile_win32.cpp
od-win32/mman.cpp
od-win32/resources/resource.h
od-win32/resources/winuae.rc
od-win32/resources/winuae_minimal.rc
od-win32/serial_win32.cpp
od-win32/sysconfig.h
od-win32/win32.cpp
od-win32/win32.h
od-win32/win32_filesys.cpp
od-win32/win32gui.cpp
od-win32/winuae_msvc15/winuae_msvc.vcxproj
od-win32/winuae_msvc15/winuae_msvc.vcxproj.filters
od-win32/winuaechangelog.txt
scsi.cpp
sndboard.cpp
specialmonitors.cpp
table68k

index 8e5baa9157e9914de2655ef8da28c0a9fb2bac1f..93e1bcfdb4351c9d4d6dfce81d72a5c8821528e8 100644 (file)
@@ -572,6 +572,7 @@ Port 2:
 
 
 int alg_flag;
+int log_ld;
 
 #define ALG_NVRAM_SIZE 4096
 #define ALG_NVRAM_MASK (ALG_NVRAM_SIZE - 1)
@@ -676,7 +677,7 @@ static void ack(void)
        sb(0x0a); // ACK
 }
 
-void alg_serial_read(uae_u16 w)
+static void sony_serial_read(uae_u16 w)
 {
        w &= 0xff;
        switch (w)
@@ -703,6 +704,8 @@ void alg_serial_read(uae_u16 w)
        ld_direction = 0;
        pausevideograb(0);
        ack();
+       if (log_ld)
+               write_log(_T("LD: PLAY\n"));
        break;
        case 0x3b: // Fast foward play ';'
        ld_mode = LD_MODE_PLAY;
@@ -714,6 +717,8 @@ void alg_serial_read(uae_u16 w)
        ld_direction = 0;
        ld_mode = LD_MODE_STOP;
        ack();
+       if (log_ld)
+               write_log(_T("LD: STOP\n"));
        break;
        case 0x40: // '@'
        if (ld_mode == LD_MODE_SEARCH) {
@@ -723,6 +728,8 @@ void alg_serial_read(uae_u16 w)
                ld_direction = 0;
                ack();
                sb(0x01); // COMPLETION
+               if (log_ld)
+                       write_log(_T("LD: SEARCH %d\n"), ld_value);
        }
        break;
        case 0x4a: // R-PLAY 'J'
@@ -730,18 +737,24 @@ void alg_serial_read(uae_u16 w)
        pausevideograb(1);
        ld_direction = -1;
        ack();
+       if (log_ld)
+               write_log(_T("LD: R-PLAY\n"));
        break;
        case 0x4b: // Fast reverse play 'K'
        ld_mode = LD_MODE_PLAY;
        pausevideograb(1);
        ld_direction = -2;
        ack();
+       if (log_ld)
+               write_log(_T("LD: FAST R-PLAY\n"));
        break;
        case 0x4f: // STILL 'O'
        ld_mode = LD_MODE_STILL;
        ld_direction = 0;
        pausevideograb(1);
        ack();
+       if (log_ld)
+               write_log(_T("LD: PAUSE\n"));
        break;
        case 0x43: // SEARCH 'C'
        ack();
@@ -749,34 +762,48 @@ void alg_serial_read(uae_u16 w)
        ld_direction = 0;
        pausevideograb(1);
        ld_value = 0;
+       if (log_ld)
+               write_log(_T("LD: SEARCH\n"));
        break;
        case 0x46: // CH-1 ON 'F'
        ack();
        ld_audio |= 1;
        setvolumevideograb(100 - currprefs.sound_volume_genlock);
+       if (log_ld)
+               write_log(_T("LD: CH-1 ON\n"));
        break;
        case 0x48: // CH-2 ON 'H'
        ack();
        ld_audio |= 2;
        setvolumevideograb(100 - currprefs.sound_volume_genlock);
+       if (log_ld)
+               write_log(_T("LD: CH-2 ON\n"));
        break;
        case 0x47: // CH-1 OFF 'G'
        ack();
        ld_audio &= ~1;
        if (!ld_audio)
                setvolumevideograb(0);
+       if (log_ld)
+               write_log(_T("LD: CH-1 OFF\n"));
        break;
        case 0x49: // CH-2 OFF 'I'
        ack();
        ld_audio &= ~2;
        if (!ld_audio)
                setvolumevideograb(0);
+       if (log_ld)
+               write_log(_T("LD: CH-2 OFF\n"));
        break;
        case 0x50: // INDEX ON 'P'
        ack();
+       if (log_ld)
+               write_log(_T("LD: INDEX ON\n"));
        break;
        case 0x51: // INDEX OFF 'O'
        ack();
+       if (log_ld)
+               write_log(_T("LD: INDEX OFF\n"));
        break;
        case 0x60: // ADDR INQ '`'
        {
@@ -790,6 +817,8 @@ void alg_serial_read(uae_u16 w)
                        sb(vv);
                        m /= 10;
                }
+               if (log_ld > 1)
+                       write_log(_T("LD: ADDR INQ %d\n"), ld_address);
        }
        break;
        case 0x67: // STATUS INQ 'g'
@@ -798,6 +827,8 @@ void alg_serial_read(uae_u16 w)
        sb(0x40);
        sb((ld_mode == LD_MODE_SEARCH ? 0x02 : 0x00));
        sb((ld_mode == LD_MODE_PLAY ? 0x01 : 0x00) | (ld_mode == LD_MODE_STILL ? 0x20 : 0x00) | (ld_mode == LD_MODE_STOP ? 0x40 : 0x00) | (ld_direction < 0 ? 0x80 : 0x00));
+       if (log_ld > 1)
+               write_log(_T("LD: STATUS INQ\n"));
        break;
        }
 }
@@ -840,7 +871,7 @@ static void alg_vsync(void)
        }
 }
 
-int alg_serial_write(void)
+static int sony_serial_write(void)
 {
        if (ser_buf_offset > 0) {
                uae_u16 v = alg_ser_buf[0];
@@ -853,6 +884,34 @@ int alg_serial_write(void)
        return -1;
 }
 
+static void pioneer_serial_read(uae_u16 w)
+{
+       w &= 0xff;
+}
+static int pioneer_serial_write(void)
+{
+       return -1;
+}
+
+void ld_serial_read(uae_u16 w)
+{
+       if (alg_flag || currprefs.genlock_image == 7) {
+               sony_serial_read(w);
+       } else if (currprefs.genlock_image == 8) {
+               pioneer_serial_read(w);
+       }
+}
+
+int ld_serial_write(void)
+{
+       if (alg_flag || currprefs.genlock_image == 7) {
+               return sony_serial_write();
+       } else if (currprefs.genlock_image == 8) {
+               return pioneer_serial_write();
+       }
+       return -1;
+}
+
 /*
 
 Port 1:
@@ -933,7 +992,6 @@ uae_u8 alg_joystick_buttons(uae_u8 pra, uae_u8 dra, uae_u8 v)
        return v;
 }
 
-
 void alg_map_banks(void)
 {
        alg_flag = 1;
index 757d5d698994d01a884910404a49c41345a6bfaa..bcbbc01511f9617ce0379dbe985cd682ab4ff32b 100644 (file)
--- a/audio.cpp
+++ b/audio.cpp
@@ -607,7 +607,7 @@ static void do_filter(int *data, int num)
 static void get_extra_channels(int *data1, int *data2, int sample1, int sample2)
 {
        int d1 = *data1 + sample1;
-       int d2 = *data2 + sample2;
+       int d2 = (data2 ? *data2 : 0) + sample2;
        if (d1 < -32768)
                d1 = -32768;
        if (d1 > 32767)
@@ -619,10 +619,12 @@ static void get_extra_channels(int *data1, int *data2, int sample1, int sample2)
        int needswap = currprefs.sound_stereo_swap_paula ^ currprefs.sound_stereo_swap_ahi;
        if (needswap) {
                *data1 = d2;
-               *data2 = d1;
+               if (data2)
+                       *data2 = d1;
        } else {
                *data1 = d1;
-               *data2 = d2;
+               if (data2)
+                       *data2 = d2;
        }
 }
 
@@ -1352,6 +1354,11 @@ static int isirq (int nr)
        return INTREQR () & (0x80 << nr);
 }
 
+static void audio_setirq_event(uae_u32 nr)
+{
+       INTREQ_0 (0x8000 | (0x80 << nr));
+}
+
 static void setirq (int nr, int which)
 {
 #if DEBUG_AUDIO > 0
@@ -1359,7 +1366,12 @@ static void setirq (int nr, int which)
        if (debugchannel (nr) && cdp->wlen > 1)
                write_log (_T("SETIRQ%d (%d,%d) PC=%08X\n"), nr, which, isirq (nr) ? 1 : 0, M68K_GETPC);
 #endif
-       INTREQ_0 (0x8000 | (0x80 << nr));
+       // audio interrupts are delayed by 2 cycles
+       if (currprefs.cpu_memory_cycle_exact) {
+               event2_newevent_xx (-1, 2 * CYCLE_UNIT + CYCLE_UNIT / 2, nr, audio_setirq_event);
+       } else {
+               audio_setirq_event(nr);
+       }
 }
 
 static void newsample (int nr, sample8_t sample)
@@ -2183,7 +2195,7 @@ void AUDxPER (int nr, uae_u16 v)
                /* smaller values would cause extremely high cpu usage */
                per = PERIOD_MIN * CYCLE_UNIT;
        }
-       if (per < PERIOD_MIN_NONCE * CYCLE_UNIT && !currprefs.cpu_cycle_exact && cdp->dmaenstore) {
+       if (per < PERIOD_MIN_NONCE * CYCLE_UNIT && !currprefs.cpu_memory_cycle_exact && cdp->dmaenstore) {
                /* DMAL emulation and low period can cause very very high cpu usage on slow performance PCs
                 * Only do this hack if audio DMA is active.
                 */
index 56e2286c5b3af690ecf851799845261a65eb9ba0..e4d9aa7e694e03c3f6cabd290bd8bb0a35e82c87 100644 (file)
@@ -211,7 +211,7 @@ static const TCHAR *cdmodes[] = { _T("disabled"), _T(""), _T("image"), _T("ioctl
 static const TCHAR *cdconmodes[] = { _T(""), _T("uae"), _T("ide"), _T("scsi"), _T("cdtv"), _T("cd32"), 0 };
 static const TCHAR *specialmonitors[] = { _T("none"), _T("autodetect"), _T("a2024"), _T("graffiti"),
 _T("ham_e"), _T("ham_e_plus"), _T("videodac18"), _T("avideo12"), _T("avideo24"), _T("firecracker24"), _T("dctv"), _T("opalvision"), _T("colorburst"), 0 };
-static const TCHAR *genlockmodes[] = { _T("none"), _T("noise"), _T("testcard"), _T("image"), _T("video"), _T("stream"), _T("ld"), NULL };
+static const TCHAR *genlockmodes[] = { _T("none"), _T("noise"), _T("testcard"), _T("image"), _T("video"), _T("stream"), _T("ld"), _T("sony_ld"), _T("pioneer_ld"), NULL };
 static const TCHAR *ppc_implementations[] = {
        _T("auto"),
        _T("dummy"),
@@ -1007,6 +1007,11 @@ static void write_filesys_config (struct uae_prefs *p, struct zfile *f)
                                _tcscat(tmp, tmpx);
                                _tcscat(tmp3, tmpx);
                        }
+                       if (ci->lock) {
+                               _tcscat(tmp, _T(",lock"));
+                               _tcscat(tmp3, _T(",lock"));
+                       }
+
                        if (ci->type == UAEDEV_HDF)
                                cfgfile_write_str (f, _T("hardfile2"), tmp);
 #if 0
@@ -4296,6 +4301,9 @@ static int cfgfile_parse_newfilesys (struct uae_prefs *p, int nr, int type, TCHA
                                        getintval(&pflags, &uci.unit_special_flags, 0);
                                }
 
+                               if (cfgfile_option_find(tmpp2, _T("lock")))
+                                       uci.lock = true;
+                                       
                                if (cfgfile_option_find(tmpp2, _T("SCSI2")))
                                        uci.unit_feature_level = HD_LEVEL_SCSI_2;
                                else if (cfgfile_option_find(tmpp2, _T("SCSI1")))
@@ -6979,7 +6987,7 @@ void default_prefs (struct uae_prefs *p, bool reset, int type)
 
        p->input_tablet = TABLET_OFF;
        p->tablet_library = false;
-       p->input_mouse_untrap = MOUSEUNTRAP_MIDDLEBUTTON;
+       p->input_mouse_untrap = MOUSEUNTRAP_NONE;
        p->input_magic_mouse_cursor = 0;
 
        inputdevice_default_prefs (p);
@@ -7162,27 +7170,43 @@ static void set_68020_compa (struct uae_prefs *p, int compa, int cd32)
        case 0:
                p->blitter_cycle_exact = 1;
                p->m68k_speed = 0;
-               if (p->cpu_model == 68020 && p->cachesize == 0) {
+               if ((p->cpu_model == 68020 || p->cpu_model == 68030) && p->cachesize == 0) {
                        p->cpu_cycle_exact = 1;
                        p->cpu_memory_cycle_exact = 1;
-                       p->cpu_clock_multiplier = 4 << 8;
+                       if (p->cpu_model == 68020)
+                               p->cpu_clock_multiplier = 4 << 8;
+                       else
+                               p->cpu_clock_multiplier = 5 << 8;
                }
        break;
        case 1:
+               p->blitter_cycle_exact = 1;
+               p->m68k_speed = 0;
+               if ((p->cpu_model == 68020 || p->cpu_model == 68030) && p->cachesize == 0) {
+                       p->cpu_memory_cycle_exact = 1;
+                       if (p->cpu_model == 68020)
+                               p->cpu_clock_multiplier = 4 << 8;
+                       else
+                               p->cpu_clock_multiplier = 5 << 8;
+               }
+       break;
+       case 2:
                p->cpu_compatible = true;
                p->m68k_speed = 0;
                break;
-       case 2:
+       case 3:
                p->cpu_compatible = 0;
                p->m68k_speed = -1;
                p->address_space_24 = 0;
                break;
-       case 3:
+       case 4:
                p->cpu_compatible = 0;
                p->address_space_24 = 0;
                p->cachesize = MAX_JIT_CACHE;
                break;
        }
+       if (p->cpu_model >= 68030)
+               p->address_space_24 = 0;
 }
 
 /* 0: cycle-exact
diff --git a/cia.cpp b/cia.cpp
index 451ae1e63c72dc0754dc3860524b5cab1f78de8b..c3428f37f673882e2e9cc5371be39b5690fe9a14 100644 (file)
--- a/cia.cpp
+++ b/cia.cpp
@@ -129,7 +129,7 @@ static void ICRA (uae_u32 data)
 {
        ciaaicr |= 0x40;
 #if 1
-       if (currprefs.cpu_cycle_exact && !(ciaaicr & 0x20) && (cia_interrupt_disabled & 1)) {
+       if (currprefs.cpu_memory_cycle_exact && !(ciaaicr & 0x20) && (cia_interrupt_disabled & 1)) {
                cia_interrupt_delay |= 1;
 #if CIAB_DEBUG_IRQ
                write_log(_T("ciab interrupt disabled ICR=%02X PC=%x\n"), ciabicr, M68K_GETPC);
@@ -145,7 +145,7 @@ static void ICRB (uae_u32 data)
 {
        ciabicr |= 0x40;
 #if 1
-       if (currprefs.cpu_cycle_exact && !(ciabicr & 0x20) && (cia_interrupt_disabled & 2)) {
+       if (currprefs.cpu_memory_cycle_exact && !(ciabicr & 0x20) && (cia_interrupt_disabled & 2)) {
                cia_interrupt_delay |= 2;
 #if CIAB_DEBUG_IRQ
                write_log(_T("ciab interrupt disabled ICR=%02X PC=%x\n"), ciabicr, M68K_GETPC);
@@ -170,7 +170,7 @@ static void RethinkICRA (void)
 #endif
                if (!(ciaaicr & 0x80)) {
                        ciaaicr |= 0x80;
-                       if (currprefs.cpu_cycle_exact) {
+                       if (currprefs.cpu_memory_cycle_exact) {
                                event2_newevent_xx (-1, DIV10 + 2 * CYCLE_UNIT + CYCLE_UNIT / 2, 0, ICRA);
                        } else {
                                ICRA (0x0008);
@@ -187,7 +187,7 @@ static void RethinkICRB (void)
 #endif
                if (!(ciabicr & 0x80)) {
                        ciabicr |= 0x80;
-                       if (currprefs.cpu_cycle_exact) {
+                       if (currprefs.cpu_memory_cycle_exact) {
                                event2_newevent_xx (-1, DIV10 + 2 * CYCLE_UNIT + CYCLE_UNIT / 2, 0, ICRB);
                        } else {
                                ICRB (0);
@@ -1782,7 +1782,7 @@ static void cia_wait_pre (int cianummask)
                return;
 #endif
 
-       if (currprefs.cpu_cycle_exact) {
+       if (currprefs.cpu_memory_cycle_exact) {
                cia_interrupt_disabled |= cianummask;
        }
 
@@ -1800,7 +1800,7 @@ static void cia_wait_pre (int cianummask)
        }
 
        if (cycles) {
-               if (currprefs.cpu_cycle_exact)
+               if (currprefs.cpu_memory_cycle_exact)
                        x_do_cycles_pre (cycles);
                else
                        do_cycles (cycles);
@@ -1824,7 +1824,7 @@ static void cia_wait_post (int cianummask, uae_u32 value)
                        x_do_cycles_post (c, value);
                else
                        do_cycles (c);
-               if (currprefs.cpu_cycle_exact) {
+               if (currprefs.cpu_memory_cycle_exact) {
                        cia_interrupt_disabled &= ~cianummask;
                        if ((cia_interrupt_delay & cianummask) & 1) {
                                cia_interrupt_delay &= ~1;
@@ -1836,7 +1836,7 @@ static void cia_wait_post (int cianummask, uae_u32 value)
                        }
                }
        }
-       if (!currprefs.cpu_cycle_exact && cia_interrupt_delay) {
+       if (!currprefs.cpu_memory_cycle_exact && cia_interrupt_delay) {
                int v = cia_interrupt_delay;
                cia_interrupt_delay = 0;
                if (v & 1)
index 9f5d03c5b5ca8416cf1bc647aa140b649c45a443..19a6a745981a167dd3bdfc11f012a33bad2b5639 100644 (file)
@@ -2599,12 +2599,14 @@ bool cpuboard_autoconfig_init(struct autoconfig_info *aci)
                // 1230 MK IV / 1240/60
                f0rom_size = 65536;
                earom_size = 131072;
-               // 12xx = 1x32k
-               for (int i = 0; i < 16384; i++) {
+               // 12xx = 1x32k but read full 64k.
+               for (int i = 0; i < 65536 / 2; i++) {
                        uae_u8 b = 0xff;
-                       zfile_fread(&b, 1, 1, autoconfig_rom);
+                       if (!zfile_fread(&b, 1, 1, autoconfig_rom))
+                               break;
                        blizzardf0_bank.baseaddr[i] = b;
-                       zfile_fread(&b, 1, 1, autoconfig_rom);
+                       if (!zfile_fread(&b, 1, 1, autoconfig_rom))
+                               break;
                        blizzardea_bank.baseaddr[i] = b;
                }
                zfile_fclose(autoconfig_rom);
index ac2a9519f5418884ec4ca727d9f1cf592186e8a3..f0a0eb76e72815ca168fbe428d4bd62be16fe3a3 100644 (file)
@@ -2325,7 +2325,7 @@ void mmu030_set_funcs(void)
 {
        if (currprefs.mmu_model != 68030)
                return;
-       if (currprefs.cpu_cycle_exact || currprefs.cpu_compatible) {
+       if (currprefs.cpu_memory_cycle_exact || currprefs.cpu_compatible) {
                x_phys_get_iword = get_word_icache030;
                x_phys_get_ilong = get_long_icache030;
        } else {
index 351864d55109590dd963949d57c009daf0690e56..8066d232180e8571a1f54a59e1ad627c3f2c1077 100644 (file)
@@ -3512,7 +3512,7 @@ static void calcsprite (void)
        }
 }
 
-static void decide_sprites (int hpos, bool usepointx)
+static void decide_sprites(int spnr, int hpos, bool usepointx, bool quick)
 {
        int nrs[MAX_SPRITES * 2], posns[MAX_SPRITES * 2];
        int count, i;
@@ -3520,6 +3520,7 @@ static void decide_sprites (int hpos, bool usepointx)
        int width = sprite_width;
        int sscanmask = 0x100 << sprite_buffer_res;
        int gotdata = 0;
+       int startnr = 0, endnr = MAX_SPRITES - 1;
 
        if (thisline_decision.plfleft < 0 && !(bplcon3 & 2))
                return;
@@ -3533,12 +3534,18 @@ static void decide_sprites (int hpos, bool usepointx)
        if (nodraw () || hpos < 0x14 || nr_armed == 0 || point == last_sprite_point)
                return;
 
-       decide_diw (hpos);
-       decide_line (hpos);
-       calcsprite ();
+       if (spnr >= 0) {
+               startnr = spnr;
+               endnr = spnr;
+       }
+       if (!quick) {
+               decide_diw (hpos);
+               decide_line (hpos);
+               calcsprite ();
+       }
 
        count = 0;
-       for (i = 0; i < MAX_SPRITES; i++) {
+       for (i = startnr; i <= endnr; i++) {
                int xpos = spr[i].xpos;
                int sprxp = (fmode & 0x8000) ? (xpos & ~sscanmask) : xpos;
                int hw_xp = sprxp >> sprite_buffer_res;
@@ -3611,9 +3618,17 @@ static void decide_sprites (int hpos, bool usepointx)
        }
 #endif
 }
-static void decide_sprites(int hpos)
+static void decide_sprites(int spnr, int hpos)
 {
-       decide_sprites(hpos, false);
+       decide_sprites(spnr, hpos, false, false);
+}
+static void maybe_decide_sprites(int spnr, int hpos)
+{
+       if (!spr[spnr].armed)
+               return;
+       if (!sprdata[spnr] && !sprdatb[spnr])
+               return;
+       decide_sprites(spnr, hpos, true, true);
 }
 
 static int sprites_differ (struct draw_info *dip, struct draw_info *dip_old)
@@ -3712,7 +3727,7 @@ static void finish_decisions (void)
        if (thisline_decision.plfleft >= 0 && thisline_decision.nr_planes > 0)
                record_diw_line (thisline_decision.plfleft, diwfirstword, diwlastword);
 
-       decide_sprites (hpos + 1);
+       decide_sprites(-1, hpos + 1);
 
        dip->last_sprite_entry = next_sprite_entry;
        dip->last_color_change = next_color_change;
@@ -4554,7 +4569,7 @@ static uae_u16 DENISEID (int *missing)
 #endif
        if (currprefs.chipset_mask & CSMASK_ECS_DENISE)
                return 0xFFFC;
-       if (currprefs.cpu_model == 68000 && (currprefs.cpu_compatible || currprefs.cpu_cycle_exact))
+       if (currprefs.cpu_model == 68000 && (currprefs.cpu_compatible || currprefs.cpu_memory_cycle_exact))
                *missing = 1;
        return 0xFFFF;
 }
@@ -4605,7 +4620,7 @@ static bool hsyncdelay (void)
 {
        if (!currprefs.genlock)
                return false;
-       if (currprefs.cpu_cycle_exact || currprefs.m68k_speed >= 0)
+       if (currprefs.cpu_memory_cycle_exact || currprefs.m68k_speed >= 0)
                return false;
        if (bplcon0 == (0x0100 | 0x0002)) {
                return true;
@@ -4613,7 +4628,7 @@ static bool hsyncdelay (void)
        return false;
 }
 
-#define CPU_ACCURATE (currprefs.cpu_model < 68020 || (currprefs.cpu_model == 68020 && currprefs.cpu_cycle_exact))
+#define CPU_ACCURATE (currprefs.cpu_model < 68020 || (currprefs.cpu_model == 68020 && currprefs.cpu_memory_cycle_exact))
 
 // DFF006 = 0.W must be valid result but better do this only in 68000 modes (whdload black screen!)
 // HPOS is shifted by 3 cycles and VPOS increases when shifted HPOS==1
@@ -4714,7 +4729,7 @@ static void VHPOSW (uae_u16 v)
                write_log (_T("VHPOSW %04X PC=%08x\n"), v, M68K_GETPC);
 #endif
 
-       if (currprefs.cpu_cycle_exact && currprefs.cpu_model == 68000) {
+       if (currprefs.cpu_memory_cycle_exact && currprefs.cpu_model == 68000) {
                /* Special hack for Smooth Copper in CoolFridge / Upfront demo */
                int chp = current_hpos_safe();
                int hp = v & 0xff;
@@ -5077,7 +5092,7 @@ int intlev (void)
 #define INT_PROCESSING_DELAY (3 * CYCLE_UNIT)
 STATIC_INLINE int use_eventmode (uae_u16 v)
 {
-       if (currprefs.cpu_cycle_exact && currprefs.cpu_model <= 68020)
+       if (currprefs.cpu_memory_cycle_exact && currprefs.cpu_model <= 68020)
                return 1;
        return 0;
 }
@@ -5392,7 +5407,7 @@ static void BPLCON0_Denise (int hpos, uae_u16 v, bool immediate)
 
 #ifdef ECS_DENISE
        if (currprefs.chipset_mask & CSMASK_ECS_DENISE) {
-               decide_sprites (hpos);
+               decide_sprites(-1, hpos);
                sprres = expand_sprres (v, bplcon3);
        }
 #endif
@@ -5477,7 +5492,7 @@ static void BPLCON3(int hpos, uae_u16 v)
        if (bplcon3 == v)
                return;
        decide_line (hpos);
-       decide_sprites (hpos);
+       decide_sprites(-1, hpos);
        bplcon3 = v;
        sprres = expand_sprres (bplcon0, bplcon3);
        record_register_change (hpos, 0x106, v);
@@ -5718,7 +5733,7 @@ static void BLTALWM (int hpos, uae_u16 v) { maybe_blit (hpos, 2); blt_info.bltal
 static void BLTAPTH (int hpos, uae_u16 v)
 {
        maybe_blit (hpos, 0);
-       if (bltstate != BLT_done && currprefs.blitter_cycle_exact && currprefs.cpu_cycle_exact) {
+       if (bltstate != BLT_done && currprefs.blitter_cycle_exact && currprefs.cpu_memory_cycle_exact) {
                bltptx = (bltapt & 0xffff) | ((uae_u32)v << 16);
                bltptxpos = hpos;
                bltptxc = 1;
@@ -5729,7 +5744,7 @@ static void BLTAPTH (int hpos, uae_u16 v)
 static void BLTAPTL (int hpos, uae_u16 v)
 {
        maybe_blit (hpos, 0);
-       if (bltstate != BLT_done && currprefs.blitter_cycle_exact && currprefs.cpu_cycle_exact) {
+       if (bltstate != BLT_done && currprefs.blitter_cycle_exact && currprefs.cpu_memory_cycle_exact) {
                bltptx = (bltapt & ~0xffff) | (v & 0xFFFE);
                bltptxpos = hpos;
                bltptxc = 1;
@@ -5740,7 +5755,7 @@ static void BLTAPTL (int hpos, uae_u16 v)
 static void BLTBPTH (int hpos, uae_u16 v)
 {
        maybe_blit (hpos, 0);
-       if (bltstate != BLT_done && currprefs.blitter_cycle_exact && currprefs.cpu_cycle_exact) {
+       if (bltstate != BLT_done && currprefs.blitter_cycle_exact && currprefs.cpu_memory_cycle_exact) {
                bltptx = (bltbpt & 0xffff) | ((uae_u32)v << 16);
                bltptxpos = hpos;
                bltptxc = 2;
@@ -5751,7 +5766,7 @@ static void BLTBPTH (int hpos, uae_u16 v)
 static void BLTBPTL (int hpos, uae_u16 v)
 {
        maybe_blit (hpos, 0);
-       if (bltstate != BLT_done && currprefs.blitter_cycle_exact && currprefs.cpu_cycle_exact) {
+       if (bltstate != BLT_done && currprefs.blitter_cycle_exact && currprefs.cpu_memory_cycle_exact) {
                bltptx = (bltbpt & ~0xffff) | (v & 0xFFFE);
                bltptxpos = hpos;
                bltptxc = 2;
@@ -5762,7 +5777,7 @@ static void BLTBPTL (int hpos, uae_u16 v)
 static void BLTCPTH (int hpos, uae_u16 v)
 {
        maybe_blit (hpos, 0);
-       if (bltstate != BLT_done && currprefs.blitter_cycle_exact && currprefs.cpu_cycle_exact) {
+       if (bltstate != BLT_done && currprefs.blitter_cycle_exact && currprefs.cpu_memory_cycle_exact) {
                bltptx = (bltcpt & 0xffff) | ((uae_u32)v << 16);
                bltptxpos = hpos;
                bltptxc = 3;
@@ -5773,7 +5788,7 @@ static void BLTCPTH (int hpos, uae_u16 v)
 static void BLTCPTL (int hpos, uae_u16 v)
 {
        maybe_blit (hpos, 0);
-       if (bltstate != BLT_done && currprefs.blitter_cycle_exact && currprefs.cpu_cycle_exact) {
+       if (bltstate != BLT_done && currprefs.blitter_cycle_exact && currprefs.cpu_memory_cycle_exact) {
                bltptx = (bltcpt & ~0xffff) | (v & 0xFFFE);
                bltptxpos = hpos;
                bltptxc = 3;
@@ -5784,7 +5799,7 @@ static void BLTCPTL (int hpos, uae_u16 v)
 static void BLTDPTH (int hpos, uae_u16 v)
 {
        maybe_blit (hpos, 0);
-       if (bltstate != BLT_done && currprefs.blitter_cycle_exact && currprefs.cpu_cycle_exact) {
+       if (bltstate != BLT_done && currprefs.blitter_cycle_exact && currprefs.cpu_memory_cycle_exact) {
                bltptx = (bltdpt & 0xffff) | ((uae_u32)v << 16);
                bltptxpos = hpos;
                bltptxc = 4;
@@ -5795,7 +5810,7 @@ static void BLTDPTH (int hpos, uae_u16 v)
 static void BLTDPTL (int hpos, uae_u16 v)
 {
        maybe_blit (hpos, 0);
-       if (bltstate != BLT_done && currprefs.blitter_cycle_exact && currprefs.cpu_cycle_exact) {
+       if (bltstate != BLT_done && currprefs.blitter_cycle_exact && currprefs.cpu_memory_cycle_exact) {
                bltptx = (bltdpt & ~0xffff) | (v & 0xFFFE);
                bltptxpos = hpos;
                bltptxc = 4;
@@ -5993,12 +6008,12 @@ static void SPRxDATB_1(uae_u16 v, int num, int hpos)
 
 static void SPRxDATA (int hpos, uae_u16 v, int num)
 {
-       decide_sprites(hpos, true);
+       decide_sprites(-1, hpos, true, false);
        SPRxDATA_1(v, num, hpos);
 }
 static void SPRxDATB (int hpos, uae_u16 v, int num)
 {
-       decide_sprites(hpos, true);
+       decide_sprites(-1, hpos, true, false);
        SPRxDATB_1(v, num, hpos);
 }
 
@@ -6010,7 +6025,7 @@ static void SPRxCTL (int hpos, uae_u16 v, int num)
        }
 #endif
 
-       decide_sprites(hpos);
+       decide_sprites(-1, hpos);
        SPRxCTL_1(v, num, hpos);
 }
 static void SPRxPOS (int hpos, uae_u16 v, int num)
@@ -6022,7 +6037,7 @@ static void SPRxPOS (int hpos, uae_u16 v, int num)
                write_log(_T("%d:%d:SPR%dPOSC %06X\n"), vpos, hpos, num, s->pt);
        }
 #endif
-       decide_sprites(hpos);
+       decide_sprites(-1, hpos);
        oldvpos = s->vstart;
        SPRxPOS_1(v, num, hpos);
        // Superfrog flashing intro bees fix.
@@ -6036,7 +6051,7 @@ static void SPRxPOS (int hpos, uae_u16 v, int num)
 
 static void SPRxPTH (int hpos, uae_u16 v, int num)
 {
-       decide_sprites (hpos);
+       decide_sprites(-1, hpos);
        if (hpos - 1 != spr[num].ptxhpos) {
                spr[num].pt &= 0xffff;
                spr[num].pt |= (uae_u32)v << 16;
@@ -6049,7 +6064,7 @@ static void SPRxPTH (int hpos, uae_u16 v, int num)
 }
 static void SPRxPTL (int hpos, uae_u16 v, int num)
 {
-       decide_sprites (hpos);
+       decide_sprites(-1, hpos);
        if (hpos - 1 != spr[num].ptxhpos) {
                spr[num].pt &= ~0xffff;
                spr[num].pt |= v & ~1;
@@ -6826,7 +6841,7 @@ static uae_u16 sprite_fetch(struct sprite *s, int dma, int hpos, int cycle, int
 {
        uae_u16 data = last_custom_value1;
        if (dma) {
-               if (cycle && currprefs.cpu_cycle_exact)
+               if (cycle && currprefs.cpu_memory_cycle_exact)
                        s->ptxhpos = hpos;
                data = last_custom_value1 = chipmem_wget_indirect (s->pt);
                alloc_cycle (hpos, CYCLE_SPRITE);
@@ -6850,7 +6865,7 @@ static uae_u16 sprite_fetch2(struct sprite *s, int hpos, int cycle, int mode)
 static void do_sprites_1(int num, int cycle, int hpos)
 {
        struct sprite *s = &spr[num];
-       int dma, posctl = 0;
+       int posctl = 0;
        uae_u16 data;
        // fetch both sprite pairs even if DMA was switched off between sprites
        int isdma = dmaen (DMA_SPRITE) || ((num & 1) && spr[num & ~1].dmacycle);
@@ -6894,7 +6909,9 @@ static void do_sprites_1(int num, int cycle, int hpos)
        if (!isdma)
                return;
 
-       dma = hpos < plfstrt_sprite || diwstate != DIW_waiting_stop;
+       int dma = hpos < plfstrt_sprite || diwstate != DIW_waiting_stop;
+       int sprxp = s->xpos >> (sprite_buffer_res + 1);
+       bool start_before_dma = hpos >= sprxp && sprxp >= 16;
        if (vpos == s->vstop || vpos == sprite_vblank_endline) {
                s->dmastate = 0;
                posctl = 1;
@@ -6911,6 +6928,9 @@ static void do_sprites_1(int num, int cycle, int hpos)
                        }
                        //write_log (_T("%d:%d: %04X=%04X\n"), vpos, hpos, 0x140 + cycle * 2 + num * 8, data);
                        if (cycle == 0) {
+                               if (start_before_dma && s->armed) {
+                                       maybe_decide_sprites(num, hpos);
+                               }
                                SPRxPOS_1 (data, num, hpos);
                                s->dmacycle = 1;
                        } else {
@@ -6934,20 +6954,27 @@ static void do_sprites_1(int num, int cycle, int hpos)
 #endif
        }
        if (s->dmastate && !posctl && dma) {
-               uae_u16 data;
-
-               data = sprite_fetch (s, dma, hpos, cycle, 1);
+               uae_u16 data = sprite_fetch (s, dma, hpos, cycle, 1);
 #if SPRITE_DEBUG >= 256
                if (vpos >= SPRITE_DEBUG_MINY && vpos <= SPRITE_DEBUG_MAXY && (SPRITE_DEBUG & (1 << num))) {
                        write_log (_T("%d:%d:dma:P=%06X "), vpos, hpos, s->pt);
                }
 #endif
                if (cycle == 0) {
+                       // if xpos is earlier than this cycle, decide it first.
+                       if (start_before_dma) {
+                               maybe_decide_sprites(num, hpos);
+                       }
                        SPRxDATA_1 (data, num, hpos);
                        s->dmacycle = 1;
                } else {
+                       // This is needed if xpos is between DATA and DATB fetches
+                       // Test does not need to be accurate, only purpose is to
+                       // not lose performance when sprites have "normal" positioning.
+                       if (start_before_dma) {
+                               maybe_decide_sprites(num, hpos);
+                       }
                        SPRxDATB_1 (data, num, hpos);
-                       spr_arm (num, 1);
                }
 #ifdef AGA
                switch (sprite_width)
@@ -7993,7 +8020,7 @@ static void events_dmal (int hp)
 {
        if (!dmal)
                return;
-       if (currprefs.cpu_cycle_exact) {
+       if (currprefs.cpu_memory_cycle_exact) {
                while (dmal) {
                        if (dmal & 3)
                                break;
@@ -8020,7 +8047,7 @@ static void events_dmal_hsync (void)
        if (!dmal)
                return;
        dmal_hpos = 0;
-       if (currprefs.cpu_cycle_exact) {
+       if (currprefs.cpu_memory_cycle_exact) {
                for (int i = 0; i < 6 + 8; i += 2) {
                        if (dmal & (3 << i)) {
                                alloc_cycle_ext (i + 7, CYCLE_MISC);
@@ -10180,8 +10207,8 @@ uae_u32 wait_cpu_cycle_read_ce020 (uaecptr addr, int mode)
        if (debug_dma)
                dr->dat = v;
 #endif
-       if (currprefs.cpu_model == 68020)
-               x_do_cycles_post (CYCLE_UNIT / 2, v);
+       
+       x_do_cycles_post (CYCLE_UNIT, v);
 
        regs.chipset_latch_rw = regs.chipset_latch_read = v;
        SETIFCHIP
@@ -10251,8 +10278,7 @@ void wait_cpu_cycle_write_ce020 (uaecptr addr, int mode, uae_u32 v)
        else if (mode == 0)
                put_byte (addr, v);
 
-       if (currprefs.cpu_model == 68020)
-               x_do_cycles_post (CYCLE_UNIT / 2, v);
+       x_do_cycles_post (CYCLE_UNIT, v);
 
        regs.chipset_latch_rw = regs.chipset_latch_write = v;
        SETIFCHIP
index 1a54c7827ca25d54de0022499e3f4911a24ca48b..48d994aebe48d3809a88165dcebc541ccf7483b5 100644 (file)
--- a/disk.cpp
+++ b/disk.cpp
@@ -3664,6 +3664,18 @@ static void DISK_start (void)
                        int tr = drv->cyl * 2 + side;
                        trackid *ti = drv->trackdata + tr;
 
+                       if (drv->dskchange_time == -1) {
+                               drv->dskchange_time = -2;
+                               write_log(_T("Accessing state restored non-existing disk '%s'!\n"), drv->newname);
+                               if (gui_ask_disk(dr, drv->newname)) {
+                                       if (drive_insert(drv, &currprefs, dr, drv->newname, false, false)) {
+                                               write_log(_T("Replacement disk '%s' inserted.\n"), drv->newname);
+                                               drv->dskready_up_time = 0;
+                                               drv->dskchange_time = 0;
+                                       }
+                               }
+                       }
+
                        if (dskdmaen == DSKDMA_WRITE) {
                                word = 0;
                                drv->tracklen = longwritemode ? FLOPPY_WRITE_MAXLEN : FLOPPY_WRITE_LEN * drv->ddhd * 8 * 2;
@@ -4443,6 +4455,8 @@ uae_u8 *restore_disk (int num,uae_u8 *src)
                                                drv->dskchange = true;
                                } else {
                                        drv->dskchange_time = -1;
+                                       _tcscpy(drv->newname, changed_prefs.floppyslots[num].df);
+                                       write_log(_T("Disk image not found, faking inserted disk.\n"));
                                }
                        }
                }
index 2499c0970fcc20daed0f184965437da70c38e19f..9d24806711379c070fc8816b6554b480cce0ab10 100644 (file)
@@ -3961,7 +3961,7 @@ void vsync_handle_redraw (int long_field, int lof_changed, uae_u16 bplcon0p, uae
 
                if (framecnt == 0)
                        init_drawing_frame ();
-               else if (currprefs.cpu_cycle_exact)
+               else if (currprefs.cpu_memory_cycle_exact)
                        init_hardware_for_drawing_frame ();
        } else {
                if (isvsync_chipset ())
index 1c3b0c6d7fb63f9164d4de8857bae67857f9ecd9..8fb95547c6d232afd0b699b933a6c0457bb72483 100644 (file)
@@ -4884,6 +4884,17 @@ const struct expansionromtype expansionroms[] = {
                false, 0, NULL,
                { 0x80, 2, 0x10, 0x00, 6502 >> 8, 6502 & 255, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
        },
+#if 0
+       {
+               _T("pmx"), _T("pmx"), NULL,
+               pmx_init, NULL, NULL, ROMTYPE_PMX | ROMTYPE_NOT, 0, 0, BOARD_AUTOCONFIG_Z2, true,
+               NULL, 0,
+               false, EXPANSIONTYPE_SOUND,
+               0, 0, 0, false, NULL,
+               false, 0, NULL,
+               { 0xc1, 0x30, 0x00, 0x00, 0x0e, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
+       },
+#endif
 
                /* Network */
        {
@@ -5272,6 +5283,7 @@ static const struct cpuboardsubtype mtec_sub[] = {
                NULL
        }
 };
+
 static const struct expansionboardsettings ivsvector_settings[] = {
        {
                // 0/1
@@ -5391,6 +5403,16 @@ static const struct cpuboardsubtype ivs_sub[] = {
        }
 };
 
+static const struct expansionboardsettings apollo_settings[] = {
+       {
+               _T("SCSI module installed"),
+               _T("scsi")
+       },
+       {
+               NULL
+       }
+};
+
 static const struct cpuboardsubtype apollo_sub[] = {
        {
                _T("Apollo 1240/1260"),
@@ -5400,7 +5422,8 @@ static const struct cpuboardsubtype apollo_sub[] = {
                BOARD_MEMORY_HIGHMEM,
                128 * 1024 * 1024,
                0,
-               apollo_init_cpu, NULL, 2, 0
+               apollo_init_cpu, NULL, 2, 0,
+               apollo_settings
        },
        {
                NULL
diff --git a/fpp.cpp b/fpp.cpp
index 39f11077cd7cf14642332e2620e1572d423e4c89..1328f0f0de56117bcde45ca964523fa5b0c9465a 100644 (file)
--- a/fpp.cpp
+++ b/fpp.cpp
@@ -485,7 +485,7 @@ bool fpu_get_constant(fpdata *fpd, int cr)
             entry = FPP_CR_1E4096;
             break;
         default: // undefined, return 0.0
-            write_log (_T("Undocumented FPU constant access (index %02x\n"), entry);
+            write_log (_T("Undocumented FPU constant access (index %02x)\n"), cr);
             valid = false;
             entry = FPP_CR_ZERO;
             break;
index ee2a757a9bc857e86bce704634a7ff417cb5f9f9..68475877337ac5b61bf2fae0dde930504ff8b027 100644 (file)
@@ -95,7 +95,7 @@ static const char *srcblrmw, *srcwlrmw, *srcllrmw;
 static const char *dstblrmw, *dstwlrmw, *dstllrmw;
 static const char *srcbrmw, *srcwrmw, *srclrmw;
 static const char *dstbrmw, *dstwrmw, *dstlrmw;
-static const char *prefetch_long, *prefetch_word;
+static const char *prefetch_long, *prefetch_word, *prefetch_opcode;
 static const char *srcli, *srcwi, *srcbi, *nextl, *nextw;
 static const char *srcld, *dstld;
 static const char *srcwd, *dstwd;
@@ -245,16 +245,23 @@ static void get_prefetch_020 (void)
 {
        if (!isprefetch020() || no_prefetch_ce020)
                return;
-       printf ("\tregs.irc = %s (%d);\n", prefetch_word, m68k_pc_offset);
+       printf ("\tregs.irc = %s (%d);\n", prefetch_opcode, m68k_pc_offset);
 }
 static void get_prefetch_020_continue(void)
 {
        if (!isprefetch020())
                return;
-       if (using_ce020)
-               printf("\tcontinue_ce020_prefetch();\n");
-       else
-               printf ("\tcontinue_020_prefetch();\n");
+       if (using_ce020) {
+               if (using_ce020 > 1)
+                       printf("\tcontinue_ce030_prefetch();\n");
+               else
+                       printf("\tcontinue_ce020_prefetch();\n");
+       } else {
+               if (using_prefetch_020 > 1)
+                       printf ("\tcontinue_030_prefetch();\n");
+               else
+                       printf ("\tcontinue_020_prefetch();\n");
+       }
 }
 
 static void returntail (bool iswrite)
@@ -289,7 +296,7 @@ static void returntail (bool iswrite)
                if (total_ce020 > 0)
                        addcycles_ce020 (total_ce020);
 
-               //printf ("\tregs.irc = %s;\n", prefetch_word);
+               //printf ("\tregs.irc = %s;\n", prefetch_opcode);
                if (0 && total_ce020 >= 2) {
                        printf ("\top_cycles = get_cycles () - op_cycles;\n");
                        printf ("\top_cycles /= cpucycleunit;\n");
@@ -926,10 +933,9 @@ static void addopcycles_ce20 (int h, int t, int c, int subhead)
                }
                if (1) {
                        if (h > 0) {
-                               printf ("\tif (regs.ce020memcycles > %d * cpucycleunit)\n", h);
-                               printf ("\t\tregs.ce020memcycles = %d * cpucycleunit;\n", h);
+                               printf ("\tlimit_cycles_ce020(%d);\n", h);
                        } else {
-                               printf ("\tregs.ce020memcycles = 0;\n");
+                               printf ("\tlimit_all_cycles_ce020();\n");
                        }
                }
        }
@@ -974,7 +980,7 @@ static void addopcycles_ce20 (int h, int t, int c, int subhead)
        if (h < 0)
                h = 0;
        
-       //c = 0;
+       c = 0; // HACK
        
        // c = internal cycles needed after head cycles and before tail cycles. Not total cycles.
        addcycles_ce020 ("op", h, t, c - h - t, -subhead);
@@ -1018,7 +1024,7 @@ static void addcycles_ea_ce020 (const char *ea, int h, int t, int c, int oph)
 
        c = c - h - t;
 
-       //c = 0;
+       c = 0; // HACK
 
        if (!oph) {
                printf ("\t/* ea H:%d,T:%d,C:%d %s */\n", h, t, c, ea);
@@ -1035,10 +1041,9 @@ static void addcycles_ea_ce020 (const char *ea, int h, int t, int c, int oph)
        }
 
        if (h) {
-               printf ("\tif (regs.ce020memcycles > %d * cpucycleunit)\n", h);
-               printf ("\t\tregs.ce020memcycles = %d * cpucycleunit;\n", h);
+               printf ("\tlimit_cycles_ce020(%d);\n", h);
        } else {
-               printf ("\tregs.ce020memcycles = 0;\n");
+               printf ("\tlimit_all_cycles_ce020();\n");
        }
 
        if (1 && c > 0) {
@@ -2757,6 +2762,7 @@ static void resetvars (void)
        got_ea_ce020 = false;
        
        prefetch_long = NULL;
+       prefetch_opcode = NULL;
        srcli = NULL;
        srcbi = NULL;
        disp000 = "get_disp_ea_000";
@@ -2813,6 +2819,7 @@ static void resetvars (void)
                        disp020 = "x_get_disp_ea_ce020";
                        prefetch_word = "get_word_ce020_prefetch";
                        prefetch_long = "get_long_ce020_prefetch";
+                       prefetch_opcode = "get_word_ce020_prefetch_opcode";
                        srcli = "x_get_ilong";
                        srcwi = "x_get_iword";
                        srcbi = "x_get_ibyte";
@@ -2830,6 +2837,7 @@ static void resetvars (void)
                        disp020 = "x_get_disp_ea_ce030";
                        prefetch_long = "get_long_ce030_prefetch";
                        prefetch_word = "get_word_ce030_prefetch";
+                       prefetch_opcode = "get_word_ce030_prefetch_opcode";
                        srcli = "x_get_ilong";
                        srcwi = "x_get_iword";
                        srcbi = "x_get_ibyte";
@@ -3069,6 +3077,8 @@ static void resetvars (void)
                dstwlrmw = dstw;
                dstllrmw = dstl;
        }
+       if (!prefetch_opcode)
+               prefetch_opcode = prefetch_word;
 
 }
 
@@ -3612,8 +3622,10 @@ static void gen_opcode (unsigned int opcode)
                                sync_m68k_pc ();
 
                        } else {
+
                                int prefetch_done = 0, flags;
                                int dualprefetch = curi->dmode == absl && (curi->smode != Dreg && curi->smode != Areg && curi->smode != imm);
+
                                genamode (curi, curi->smode, "srcreg", curi->size, "src", 1, 0, 0);
                                flags = GF_MOVE | GF_APDI;
                                //if (curi->size == sz_long && (curi->smode == Dreg || curi->smode == Areg))
index 93c37f73a4afb2435921812984de2059b6f52564..a3c934efcb091644af9c4c8ef5bb5bc4da9821d7 100644 (file)
@@ -636,7 +636,7 @@ static uae_u32 ide_read_byte(struct ide_board *board, uaecptr addr)
                                v = board->rom[(addr - APOLLO_ROM_OFFSET) & board->rom_mask];
                } else if (board->configured) {
                        if ((addr & 0xc000) == 0x4000) {
-                               v = apollo_scsi_bget(oaddr);
+                               v = apollo_scsi_bget(oaddr, board->userdata);
                        } else if (addr < 0x4000) {
                                int regnum = get_apollo_reg(addr, board);
                                if (regnum >= 0) {
@@ -881,9 +881,9 @@ static uae_u32 ide_read_word(struct ide_board *board, uaecptr addr)
                } else if (board->type == APOLLO_IDE) {
 
                        if ((addr & 0xc000) == 0x4000) {
-                               v = apollo_scsi_bget(addr);
+                               v = apollo_scsi_bget(addr, board->userdata);
                                v <<= 8;
-                               v |= apollo_scsi_bget(addr + 1);
+                               v |= apollo_scsi_bget(addr + 1, board->userdata);
                        } else if (addr < 0x4000) {
                                int regnum = get_apollo_reg(addr, board);
                                if (regnum == IDE_DATA) {
@@ -1074,7 +1074,7 @@ static void ide_write_byte(struct ide_board *board, uaecptr addr, uae_u8 v)
                } else if (board->type == APOLLO_IDE) {
 
                        if ((addr & 0xc000) == 0x4000) {
-                               apollo_scsi_bput(oaddr, v);
+                               apollo_scsi_bput(oaddr, v, board->userdata);
                        } else if (addr < 0x4000) {
                                int regnum = get_apollo_reg(addr, board);
                                if (regnum >= 0) {
@@ -1225,8 +1225,8 @@ static void ide_write_word(struct ide_board *board, uaecptr addr, uae_u16 v)
                } else if (board->type == APOLLO_IDE) {
 
                        if ((addr & 0xc000) == 0x4000) {
-                               apollo_scsi_bput(addr, v >> 8);
-                               apollo_scsi_bput(addr + 1, v);
+                               apollo_scsi_bput(addr, v >> 8, board->userdata);
+                               apollo_scsi_bput(addr + 1, v, board->userdata);
                        } else if (addr < 0x4000) {
                                int regnum = get_apollo_reg(addr, board);
                                if (regnum == IDE_DATA) {
@@ -1619,6 +1619,12 @@ static bool apollo_init(struct autoconfig_info *aci, bool cpuboard)
        if (!ide)
                return false;
 
+       if (cpuboard) {
+               ide->userdata = currprefs.cpuboard_settings & 3;
+       } else {
+               ide->userdata = aci->rc->autoboot_disabled ? 2 : 0;
+       }
+
        ide->configured = 0;
        ide->bank = &ide_bank_generic;
        ide->rom_size = 32768;
index 57f051fba4a0e41384e0d2d412ec522d6cb0e02e..0b7fa4b6b2cf8cd5fead920fe32bb7beb0a7c1d2 100644 (file)
@@ -28,14 +28,15 @@ extern int arcadia_flag, arcadia_coin[2];
 
 extern int alg_flag;
 extern void alg_map_banks(void);
-extern void alg_serial_read(uae_u16 v);
-extern int alg_serial_write(void);
 extern bool alg_ld_active(void);
 
 extern uae_u16 alg_potgor(uae_u16);
 extern uae_u16 alg_joydat(int, uae_u16);
 extern uae_u8 alg_joystick_buttons(uae_u8, uae_u8, uae_u8);
 
+extern void ld_serial_read(uae_u16 v);
+extern int ld_serial_write(void);
+
 #endif /* ARCADIA */
 
 #endif /* UAE_ARCADIA_H */
index 1e199af9ed18e3c26f2065ab83d46a02ee2d281f..7699bc21d7d9e3fcad1e5eb303bac6985baff21e 100644 (file)
@@ -32,12 +32,19 @@ STATIC_INLINE uae_u32 get_long_020_prefetch (int o)
 
 #ifdef CPUEMU_21
 
-#define CE020_INITCYCLES() \
-       int head = 0, tail = 0, cycles = 0; \
-       unsigned int cu = get_cycles ();
-#define CE020_SAVECYCLES(h,t,c) \
-       head = h; tail = t; cycles = c;
-#define CE020_COUNTCYCLES()
+STATIC_INLINE void limit_cycles_ce020(int clocks)
+{
+       int cycs = clocks * cpucycleunit;
+       int diff = regs.ce020endcycle - regs.ce020startcycle;
+       if (diff <= cycs)
+               return;
+       regs.ce020startcycle = regs.ce020endcycle - cycs;
+}
+
+STATIC_INLINE void limit_all_cycles_ce020(void)
+{
+       regs.ce020startcycle = regs.ce020endcycle;
+}
 
 // only for CPU internal cycles
 STATIC_INLINE void do_cycles_ce020_internal(int clocks)
@@ -47,6 +54,16 @@ STATIC_INLINE void do_cycles_ce020_internal(int clocks)
                return;
        }
        int cycs = clocks * cpucycleunit;
+       int diff = regs.ce020endcycle - regs.ce020startcycle;
+       if (diff > 0) {
+               if (diff >= cycs) {
+                       regs.ce020startcycle += cycs;
+                       return;
+               }
+               regs.ce020startcycle = regs.ce020endcycle;
+               cycs -= diff;
+       }
+#if 0
        if (regs.ce020memcycles > 0) {
                if (regs.ce020memcycles >= cycs) {
                        regs.ce020memcycles -= cycs;
@@ -55,6 +72,7 @@ STATIC_INLINE void do_cycles_ce020_internal(int clocks)
                cycs = cycs - regs.ce020memcycles;
        }
        regs.ce020memcycles = 0;
+#endif
        x_do_cycles (cycs);
 }
 
@@ -115,6 +133,7 @@ STATIC_INLINE void put_byte_ce020 (uaecptr addr, uae_u32 v)
 
 extern void continue_ce020_prefetch(void);
 extern uae_u32 get_word_ce020_prefetch(int);
+extern uae_u32 get_word_ce020_prefetch_opcode(int);
 
 STATIC_INLINE uae_u32 get_long_ce020_prefetch (int o)
 {
@@ -157,6 +176,7 @@ STATIC_INLINE void m68k_do_rts_ce020 (void)
 
 #ifdef CPUEMU_22
 
+extern void continue_030_prefetch(void);
 extern uae_u32 get_word_030_prefetch(int);
 
 STATIC_INLINE void put_long_030(uaecptr addr, uae_u32 v)
@@ -221,7 +241,9 @@ STATIC_INLINE void m68k_do_rts_030(void)
 
 #ifdef CPUEMU_23
 
+extern void continue_ce030_prefetch(void);
 extern uae_u32 get_word_ce030_prefetch(int);
+extern uae_u32 get_word_ce030_prefetch_opcode(int);
 
 STATIC_INLINE void put_long_ce030 (uaecptr addr, uae_u32 v)
 {
index ae993a3b538f2862db76fd42ae8589a1c0af9e2d..348b81c50918e7a5aa2c7665308cb40e7853a11f 100644 (file)
@@ -86,6 +86,8 @@ extern void DISK_reinsert (int num);
 extern int disk_prevnext (int drive, int dir);
 extern int disk_prevnext_name (TCHAR *img, int dir);
 
+extern bool gui_ask_disk(int drv, TCHAR*);
+
 extern void DSKLEN (uae_u16 v, int hpos);
 extern uae_u16 DSKBYTR (int hpos);
 extern void DSKSYNC (int, uae_u16);
index 8fe5702a1e535738f114fc7a652c940506dbc6c4..52efc323c7e172d15abe90898382d6b96cc1f144 100644 (file)
@@ -197,7 +197,7 @@ extern int inputdevice_get_device_status (int devnum);
 extern void inputdevice_set_device_status (int devnum, int enabled);
 extern int inputdevice_get_device_total (int type);
 extern int inputdevice_get_widget_num (int devnum);
-extern int inputdevice_get_widget_type (int devnum, int num, TCHAR *name);
+extern int inputdevice_get_widget_type (int devnum, int num, TCHAR *name, bool inccode);
 extern int send_input_event (int nr, int state, int max, int autofire);
 
 extern int input_get_default_mouse (struct uae_input_device *uid, int num, int port, int af, bool gp, bool wheel, bool joymouseswap);
index 5d6020fd883c79d073c2a8c861688e398afff501..8aa7a38f61fb66e35e2e5860cc11b4ef14573879 100644 (file)
@@ -218,7 +218,11 @@ struct regstruct
        int pipeline_pos;
        int pipeline_r8[2];
        int pipeline_stop;
-       int ce020memcycles;
+
+       int ce020endcycle;
+       int ce020startcycle;
+       int ce020prefetchendcycle;
+
        int ce020extracycles;
        bool ce020memcycle_data;
        int ce020_tail;
index 33ab811bab71049b239d2519e9c845bafd8e3791..29863b7897a8e7112a214d4b926339306348e592 100644 (file)
@@ -16,7 +16,7 @@
 
 #define UAEMAJOR 3
 #define UAEMINOR 4
-#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;
 
@@ -189,6 +189,7 @@ struct uaedev_config_info {
        TCHAR volname[MAX_DPATH];
        TCHAR rootdir[MAX_DPATH];
        bool readonly;
+       bool lock;
        int bootpri;
        TCHAR filesys[MAX_DPATH];
        int lowcyl;
index 6771402447d34b8b04b7a0111d1d085f3cfa040e..0a81e22fade6d72574c320a3008197d64e4aebc5 100644 (file)
@@ -147,6 +147,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size);
 #define ROMTYPE_ARIADNE                0x0010005d
 #define ROMTYPE_HARDFRAME      0x0010005e
 #define ROMTYPE_ATEAM          0x0010005f
+#define ROMTYPE_PMX                    0x00100060
 
 #define ROMTYPE_NOT                    0x00800000
 #define ROMTYPE_QUAD           0x01000000
index 0636614bfaef9d469533293c674c8cbd29ea8681..4baf06a8c430515900b6c395b8b8548b9f8bf4e9 100644 (file)
@@ -161,8 +161,8 @@ uae_u32 soft_scsi_get(uaecptr addr, int size);
 
 void ncr80_rethink(void);
 
-void apollo_scsi_bput(uaecptr addr, uae_u8 v);
-uae_u8 apollo_scsi_bget(uaecptr addr);
+void apollo_scsi_bput(uaecptr addr, uae_u8 v, uae_u32 config);
+uae_u8 apollo_scsi_bget(uaecptr addr, uae_u32 config);
 void apollo_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 
 void ivsvector_scsi_bput(uaecptr addr, uae_u8 v);
index 11e3bbdb0ad253c7342e6cd02317481c542b5fba..93f4650145d6ae1da7259f3835e7c348ec6c8235 100644 (file)
@@ -17,5 +17,8 @@ bool uaesndboard_init_z3(struct autoconfig_info *aci);
 void uaesndboard_free(void);
 void uaesndboard_reset(void);
 
+bool pmx_init(struct autoconfig_info *aci);
+void pmx_free(void);
+void pmx_reset(void);
 
 #endif /* UAE_SNDBOARD_H */
index 53fc8cc0f96cf580fcff5914a4d0ae080302974d..91a2c6e8b2a62b88fc4fa962af181544a66bd931 100644 (file)
@@ -39,6 +39,7 @@ struct uae_mman_data
        uae_u32 readonlysize;
        bool maprom;
        bool directsupport;
+       bool hasbarrier;
 };
 bool uae_mman_info(addrbank *ab, struct uae_mman_data *md);
 
index 3975948dc1c1ad86f59de18d4d2b73451628ce24..4cf32289fe71b091ca593602546fe5c6c1873d18 100644 (file)
@@ -116,6 +116,7 @@ struct uae_input_device2 {
 #define INPUT_MATCH_CONFIG_NAME_ONLY 1
 #define INPUT_MATCH_FRIENDLY_NAME_ONLY 2
 #define INPUT_MATCH_BOTH 4
+#define INPUT_MATCH_ALL 7
 
 static struct uae_input_device2 joysticks2[MAX_INPUT_DEVICES];
 static struct uae_input_device2 mice2[MAX_INPUT_DEVICES];
@@ -1933,7 +1934,7 @@ void inputdevice_parse_jport_custom(struct uae_prefs *pr, int index, int port, T
                                if (outname[0] != 0)
                                        _tcscat(outname, _T(", "));
                                const TCHAR *ps = ie->shortname ? ie->shortname : ie->name;
-                               if (inputdevice_get_widget_type(devnum, num, tmp)) {
+                               if (inputdevice_get_widget_type(devnum, num, tmp, false)) {
                                        if (tmp[0]) {
                                                _tcscat(outname, tmp);
                                                _tcscat(outname, _T("="));
@@ -6635,7 +6636,7 @@ static void disableifempty (struct uae_prefs *prefs)
        prefs->internalevent_settings[0]->enabled = true;
 }
 
-static void matchdevices(struct uae_prefs *p, struct inputdevice_functions *inf, struct uae_input_device *uid)
+static void matchdevices(struct uae_prefs *p, struct inputdevice_functions *inf, struct uae_input_device *uid, int match_mask)
 {
        int i, j;
 
@@ -6656,10 +6657,10 @@ static void matchdevices(struct uae_prefs *p, struct inputdevice_functions *inf,
                                        if (fullmatch) {
                                                if (!bname1 || aname1)
                                                        continue;
-                                               if (!(p->input_device_match_mask & INPUT_MATCH_BOTH))
+                                               if (!(match_mask & INPUT_MATCH_BOTH))
                                                        continue;
                                        } else {
-                                               if (!(p->input_device_match_mask & INPUT_MATCH_CONFIG_NAME_ONLY))
+                                               if (!(match_mask & INPUT_MATCH_CONFIG_NAME_ONLY))
                                                        continue;
                                        }
 
@@ -6698,7 +6699,7 @@ static void matchdevices(struct uae_prefs *p, struct inputdevice_functions *inf,
                                if (match == -2) {
                                        for (j = 0; j < MAX_INPUT_DEVICES; j++) {
                                                TCHAR *bname2 = uid[j].configname;
-                                               if (aname2 && bname2 && (p->input_device_match_mask & INPUT_MATCH_CONFIG_NAME_ONLY) && !_tcscmp (aname2, bname2)) {
+                                               if (aname2 && bname2 && (match_mask & INPUT_MATCH_CONFIG_NAME_ONLY) && !_tcscmp (aname2, bname2)) {
                                                        match = j;
                                                        break;
                                                }
@@ -6708,7 +6709,7 @@ static void matchdevices(struct uae_prefs *p, struct inputdevice_functions *inf,
                                        // no match, try friendly names only
                                        for (j = 0; j < MAX_INPUT_DEVICES; j++) {
                                                TCHAR *bname1 = uid[j].name;
-                                               if (aname1 && bname1 && (p->input_device_match_mask & INPUT_MATCH_FRIENDLY_NAME_ONLY) && !_tcscmp (aname1, bname1)) {
+                                               if (aname1 && bname1 && (match_mask & INPUT_MATCH_FRIENDLY_NAME_ONLY) && !_tcscmp (aname1, bname1)) {
                                                        match = j;
                                                        break;
                                                }
@@ -6741,9 +6742,9 @@ static void matchdevices_all (struct uae_prefs *prefs)
 {
        int i;
        for (i = 0; i < MAX_INPUT_SETTINGS; i++) {
-               matchdevices(prefs, &idev[IDTYPE_MOUSE], prefs->mouse_settings[i]);
-               matchdevices(prefs, &idev[IDTYPE_JOYSTICK], prefs->joystick_settings[i]);
-               matchdevices(prefs, &idev[IDTYPE_KEYBOARD], prefs->keyboard_settings[i]);
+               matchdevices(prefs, &idev[IDTYPE_MOUSE], prefs->mouse_settings[i], prefs->input_device_match_mask);
+               matchdevices(prefs, &idev[IDTYPE_JOYSTICK], prefs->joystick_settings[i], prefs->input_device_match_mask);
+               matchdevices(prefs, &idev[IDTYPE_KEYBOARD], prefs->keyboard_settings[i], INPUT_MATCH_ALL);
        }
 }
 
@@ -6774,7 +6775,7 @@ bool inputdevice_set_gameports_mapping (struct uae_prefs *prefs, int devnum, int
        keyboards = prefs->keyboard_settings[input_selected_setting];
 
        sub = 0;
-       if (inputdevice_get_widget_type (devnum, num, NULL) != IDEV_WIDGET_KEY) {
+       if (inputdevice_get_widget_type (devnum, num, NULL, false) != IDEV_WIDGET_KEY) {
                for (sub = 0; sub < MAX_INPUT_SUB_EVENT; sub++) {
                        int port2 = 0;
                        int evt = inputdevice_get_mapping (devnum, num, NULL, &port2, NULL, NULL, sub);
@@ -6994,9 +6995,9 @@ void inputdevice_devicechange (struct uae_prefs *prefs)
        idev[IDTYPE_JOYSTICK].init ();
        idev[IDTYPE_MOUSE].init ();
        idev[IDTYPE_KEYBOARD].init ();
-       matchdevices (prefs, &idev[IDTYPE_MOUSE], mice);
-       matchdevices (prefs, &idev[IDTYPE_JOYSTICK], joysticks);
-       matchdevices (prefs, &idev[IDTYPE_KEYBOARD], keyboards);
+       matchdevices (prefs, &idev[IDTYPE_MOUSE], mice, prefs->input_device_match_mask);
+       matchdevices (prefs, &idev[IDTYPE_JOYSTICK], joysticks, prefs->input_device_match_mask);
+       matchdevices (prefs, &idev[IDTYPE_KEYBOARD], keyboards, INPUT_MATCH_ALL);
 
        // find out which one was removed or inserted
        for (int j = 0; j <= IDTYPE_KEYBOARD; j++) {
@@ -7833,10 +7834,17 @@ int inputdevice_set_mapping (int devnum, int num, const TCHAR *name, TCHAR *cust
        return 0;
 }
 
-int inputdevice_get_widget_type (int devnum, int num, TCHAR *name)
+int inputdevice_get_widget_type (int devnum, int num, TCHAR *name, bool inccode)
 {
+       uae_u32 code = 0;
        const struct inputdevice_functions *idf = getidf (devnum);
-       return idf->get_widget_type (inputdevice_get_device_index (devnum), num, name, 0);
+       int r = idf->get_widget_type (inputdevice_get_device_index (devnum), num, name, &code);
+       if (r && inccode && &idev[IDTYPE_KEYBOARD] == idf) {
+               TCHAR *p = name + _tcslen(name);
+               if (_tcsncmp(name, _T("KEY_"), 4))
+                       _stprintf(p, _T(" [0x%02X]"), code);
+       }
+       return r;
 }
 
 static int config_change;
@@ -8493,7 +8501,7 @@ void warpmode (int mode)
                currprefs.turbo_emulation = fr;
        }
        if (currprefs.turbo_emulation) {
-               if (!currprefs.cpu_cycle_exact && !currprefs.blitter_cycle_exact)
+               if (!currprefs.cpu_memory_cycle_exact && !currprefs.blitter_cycle_exact)
                        changed_prefs.gfx_framerate = currprefs.gfx_framerate = 10;
                pause_sound ();
        } else {
index e9ad1341c7ac43767be149f4ec00f592d7b33287..9cebae5ed5194d6ec075b18ef34091bb80de8939 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -296,6 +296,10 @@ void fixup_cpu (struct uae_prefs *p)
                error_log (_T("JIT is not compatible with unimplemented CPU/FPU instruction emulation."));
                p->fpu_no_unimplemented = p->int_no_unimplemented = false;
        }
+       if (p->cachesize && p->compfpu && p->fpu_softfloat) {
+               error_log (_T("JIT FPU emulation is not compatible with softfloat FPU emulation."));
+               p->fpu_softfloat = false;
+       }
 
 #if 0
        if (p->cpu_cycle_exact && p->m68k_speed < 0 && currprefs.cpu_model <= 68020)
@@ -652,7 +656,7 @@ void fixup_prefs (struct uae_prefs *p, bool userconfig)
        p->uaeserial = 0;
 #endif
 #if defined (CPUEMU_13)
-       if (p->cpu_cycle_exact) {
+       if (p->cpu_memory_cycle_exact) {
                if (p->gfx_framerate > 1) {
                        error_log (_T("Cycle-exact requires disabled frameskip."));
                        p->gfx_framerate = 1;
index c024d4a9aa19579569e015a357f52f71cf425a3e..fd2d2d27d175d68887cccbd32016059e8791a617 100644 (file)
@@ -1809,8 +1809,11 @@ bool mapped_malloc (addrbank *ab)
                        return true;
                }
                ab->baseaddr = xcalloc (uae_u8, ab->reserved_size + 4);
-               if (ab->baseaddr)
+               if (ab->baseaddr) {
+                       // fill end of ram with ILLEGAL to catch direct PC falling out of RAM.
+                       put_long_host(ab->baseaddr + ab->reserved_size, 0x4afc4afc);
                        ab->allocated_size = ab->reserved_size;
+               }
 #if MAPPED_MALLOC_DEBUG
                write_log(_T("mapped_malloc nodirect %s %p\n"), ab->name, ab->baseaddr);
 #endif
@@ -1846,8 +1849,13 @@ bool mapped_malloc (addrbank *ab)
                        x->next->prev = x;
                shm_start = x;
                ab->baseaddr = x->native_address;
-               if (ab->baseaddr)
+               if (ab->baseaddr) {
+                       if (md.hasbarrier) {
+                               // fill end of ram with ILLEGAL to catch direct PC falling out of RAM.
+                               put_long_host(ab->baseaddr + ab->reserved_size, 0x4afc4afc);
+                       }
                        ab->allocated_size = ab->reserved_size;
+               }
                ab->flags |= ABFLAG_DIRECTMAP;
 #if MAPPED_MALLOC_DEBUG
                write_log(_T("mapped_malloc direct %s %p\n"), ab->name, ab->baseaddr);
@@ -2222,7 +2230,10 @@ void map_overlay (int chip)
                                        map_banks (&chipmem_dummy_bank, start, dummy, 0);
                                }
                        } else {
-                               map_banks(cb, 0, 32, chipmem_bank.allocated_size);
+                               int mapsize = 32;
+                               if ((chipmem_bank.allocated_size >> 16) > mapsize)
+                                       mapsize = chipmem_bank.allocated_size >> 16;
+                               map_banks(cb, 0, mapsize, chipmem_bank.allocated_size);
                        }
                } else {
                        map_banks (cb, 0, chipmem_bank.allocated_size >> 16, 0);
index aaecfc1ba3b5f43266befe5d20d5f85e806ac944..b60427c22bda3a0a787b96ed89516af401432cd5 100644 (file)
@@ -37,7 +37,7 @@
 #include "inputrecord.h"
 #include "inputdevice.h"
 #include "audio.h"
-#include "md-fpp.h"
+#include "fpp.h"
 #include "statusline.h"
 #include "uae/ppc.h"
 #include "cpuboard.h"
@@ -1511,7 +1511,7 @@ static void update_68k_cycles (void)
                        cpucycleunit /= 2;
        } else if (currprefs.cpu_frequency) {
                cpucycleunit = CYCLE_UNIT * baseclock / currprefs.cpu_frequency;
-       } else if (currprefs.cpu_cycle_exact && currprefs.cpu_clock_multiplier == 0) {
+       } else if (currprefs.cpu_memory_cycle_exact && currprefs.cpu_clock_multiplier == 0) {
                if (currprefs.cpu_model >= 68040) {
                        cpucycleunit = CYCLE_UNIT / 16;
                } if (currprefs.cpu_model == 68030) {
@@ -1560,7 +1560,8 @@ 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
-               || currprefs.cpu_memory_cycle_exact != changed_prefs.cpu_memory_cycle_exact) {
+               || currprefs.cpu_memory_cycle_exact != changed_prefs.cpu_memory_cycle_exact
+               || currprefs.fpu_softfloat != changed_prefs.fpu_softfloat) {
                        cpu_prefs_changed_flag |= 1;
        }
        if (changed
@@ -1787,24 +1788,24 @@ static uaecptr ShowEA (void *f, uaecptr pc, uae_u16 opcode, int reg, amodes mode
                case sz_single:
                        {
                                fpdata fp;
-                               to_single(&fp, get_ilong_debug(pc));
-                               _stprintf(buffer, _T("#%s"), fp_print(&fp));
+                               fpp_to_single(&fp, get_ilong_debug(pc));
+                               _stprintf(buffer, _T("#%s"), fpp_print(&fp));
                                pc += 4;
                        }
                        break;
                case sz_double:
                        {
                                fpdata fp;
-                               to_double(&fp, get_ilong_debug(pc), get_ilong_debug(pc + 4));
-                               _stprintf(buffer, _T("#%s"), fp_print(&fp));
+                               fpp_to_double(&fp, get_ilong_debug(pc), get_ilong_debug(pc + 4));
+                               _stprintf(buffer, _T("#%s"), fpp_print(&fp));
                                pc += 8;
                        }
                        break;
                case sz_extended:
                {
                        fpdata fp;
-                       to_exten(&fp, get_ilong_debug(pc), get_ilong_debug(pc + 4), get_ilong_debug(pc + 8));
-                       _stprintf(buffer, _T("#%s"), fp_print(&fp));
+                       fpp_to_exten(&fp, get_ilong_debug(pc), get_ilong_debug(pc + 4), get_ilong_debug(pc + 8));
+                       _stprintf(buffer, _T("#%s"), fpp_print(&fp));
                        pc += 12;
                        break;
                }
@@ -3010,6 +3011,15 @@ void REGPARAM2 ExceptionL (int nr, uaecptr address)
        ExceptionX (nr, address);
 }
 
+static void bus_error(void)
+{
+       TRY (prb2) {
+               Exception (2);
+       } CATCH (prb2) {
+               cpu_halt (CPU_HALT_BUS_ERROR_DOUBLE_FAULT);
+       } ENDTRY
+}
+
 static void do_interrupt (int nr)
 {
        if (debug_dma)
@@ -3153,7 +3163,8 @@ static void m68k_reset2(bool hardreset)
                if (kickstart_rom)
                        regs.pcr |= 2; /* disable FPU */
        }
-       regs.ce020memcycles = 0;
+//     regs.ce020memcycles = 0;
+       regs.ce020startcycle = regs.ce020endcycle = 0;
        fill_prefetch ();
 }
 
@@ -3264,6 +3275,12 @@ uae_u32 REGPARAM2 op_illg (uae_u32 opcode)
        int inrom = in_rom (pc);
        int inrt = in_rtarea (pc);
 
+       if ((opcode == 0x4afc || opcode == 0xfc4a) && !valid_address(pc, 4) && valid_address(pc - 4, 4)) {
+               // PC fell off the end of RAM
+               bus_error();
+               return 4;
+       }
+
        if (cloanto_rom && (opcode & 0xF100) == 0x7100) {
                m68k_dreg (regs, (opcode >> 9) & 7) = (uae_s8)(opcode & 0xFF);
                m68k_incpc_normal (2);
@@ -4109,15 +4126,6 @@ static void out_cd32io (uae_u32 pc)
 
 #endif
 
-static void bus_error(void)
-{
-       TRY (prb2) {
-               Exception (2);
-       } CATCH (prb2) {
-               cpu_halt (CPU_HALT_BUS_ERROR_DOUBLE_FAULT);
-       } ENDTRY
-}
-
 #ifndef CPUEMU_11
 
 static void m68k_run_1 (void)
@@ -5234,10 +5242,19 @@ static void m68k_run_2p (void)
                                                inprec_playdebug_cpu (1);
                                }
 
-                               x_do_cycles (cpu_cycles);
+                               if (currprefs.cpu_memory_cycle_exact) {
 
-                               cpu_cycles = (*cpufunctbl[r->opcode])(r->opcode);
-                               cpu_cycles = adjust_cycles (cpu_cycles);
+                                       (*cpufunctbl[r->opcode])(r->opcode);
+                                       cpu_cycles = 0;
+
+                               } else {
+
+                                       x_do_cycles (cpu_cycles);
+
+                                       cpu_cycles = (*cpufunctbl[r->opcode])(r->opcode);
+                                       cpu_cycles = adjust_cycles (cpu_cycles);
+
+                               }
 cont:
                                if (r->spcflags) {
                                        if (do_specialties (cpu_cycles))
@@ -5505,6 +5522,7 @@ void m68k_go (int may_quit)
                        if (cpu_prefs_changed_flag & 1) {
                                uaecptr pc = m68k_getpc();
                                prefs_changed_cpu();
+                               fpu_modechange();
                                build_cpufunctbl();
                                m68k_setpc_normal(pc);
                                fill_prefetch();
@@ -6495,7 +6513,8 @@ uae_u8 *restore_cpu (uae_u8 *src)
                        }
                }
                if (model >= 68020) {
-                       regs.ce020memcycles = restore_u32 ();
+                       restore_u32 (); // regs.ce020memcycles
+                       regs.ce020startcycle = regs.ce020endcycle = 0;
                        restore_u32 ();
                }
        }
@@ -6842,7 +6861,7 @@ uae_u8 *save_cpu (int *len, uae_u8 *dstptr)
                        save_u32(regs.prefetch020[i]);
        }
        if (currprefs.cpu_model >= 68020) {
-               save_u32 (regs.ce020memcycles);
+               save_u32 (0); //save_u32 (regs.ce020memcycles);
                save_u32 (0);
        }
        save_u32 (regs.chipset_latch_rw);
@@ -7115,9 +7134,36 @@ void mem_access_delay_word_write (uaecptr addr, uae_u32 v)
        put_word (addr, v);
 }
 
+static void start_020_cycle(void)
+{
+       regs.ce020startcycle = get_cycles();
+}
+
+static void start_020_cycle_prefetch(bool opcode)
+{
+       regs.ce020startcycle = get_cycles();
+       // back to back prefetch cycles require 2 extra cycles (maybe)
+       if (opcode && regs.ce020startcycle == regs.ce020prefetchendcycle && currprefs.cpu_cycle_exact) {
+               x_do_cycles(2 * cpucycleunit);
+               regs.ce020startcycle = get_cycles();
+       }
+}
+static void end_020_cycle(void)
+{
+       regs.ce020endcycle = get_cycles();
+}
+static void end_020_cycle_prefetch(bool opcode)
+{
+       regs.ce020endcycle = get_cycles();
+       if (opcode) {
+               regs.ce020prefetchendcycle = regs.ce020endcycle;
+       } else {
+               regs.ce020prefetchendcycle = regs.ce020startcycle;
+       }
+}
 
 // this one is really simple and easy
-static void fill_icache020 (uae_u32 addr, uae_u32 (*fetch)(uaecptr))
+static void fill_icache020 (uae_u32 addr, uae_u32 (*fetch)(uaecptr), bool opcode)
 {
        int index;
        uae_u32 tag;
@@ -7137,18 +7183,22 @@ static void fill_icache020 (uae_u32 addr, uae_u32 (*fetch)(uaecptr))
                return;
        }
        // cache miss
+#if 0
        // Prefetch apparently can be queued by bus controller
        // even if bus controller is currently processing
        // previous data access.
        // Other combinations are not possible.
-       if (!regs.ce020memcycle_data)
+       if (!regs.ce020memcycle_data) {
+               if (regs.ce020memcycles > 0)
+                       x_do_cycles (regs.ce020memcycles);
                regs.ce020memcycles = 0;
-       regs.ce020memcycle_data = false;
-       unsigned long cycs = get_cycles ();
+       }
+#endif
+
+       start_020_cycle_prefetch(opcode);
        data = fetch (addr);
-       // add as available "free" internal CPU time.
-       cycs = get_cycles () - cycs;
-       regs.ce020memcycles += cycs;
+       end_020_cycle_prefetch(opcode);
+
        if (!(regs.cacr & 2)) {
                c->tag = tag;
                c->valid = !!(regs.cacr & 1);
@@ -7245,7 +7295,7 @@ static void pipeline_020(uae_u16 w, uaecptr pc)
 
 #endif
 
-uae_u32 get_word_ce020_prefetch (int o)
+static uae_u32 get_word_ce020_prefetch_2 (int o, bool opcode)
 {
        uae_u32 pc = m68k_getpc () + o;
        uae_u32 v;
@@ -7258,7 +7308,7 @@ uae_u32 get_word_ce020_prefetch (int o)
                regs.prefetch020[0] = regs.prefetch020[1];
                // branch instruction detected in pipeline: stop fetches until branch executed.
                if (!MORE_ACCURATE_68020_PIPELINE || regs.pipeline_stop >= 0) {
-                       fill_icache020 (pc + 2 + 4, mem_access_delay_longi_read_ce020);
+                       fill_icache020 (pc + 2 + 4, mem_access_delay_longi_read_ce020, opcode);
                        regs.prefetch020[1] = regs.cacheholdingdata020;
                }
                regs.db = regs.prefetch020[0] >> 16;
@@ -7273,6 +7323,16 @@ uae_u32 get_word_ce020_prefetch (int o)
        return v;
 }
 
+uae_u32 get_word_ce020_prefetch (int o)
+{
+       return get_word_ce020_prefetch_2(o, false);
+}
+
+uae_u32 get_word_ce020_prefetch_opcode (int o)
+{
+       return get_word_ce020_prefetch_2(o, true);
+}
+
 uae_u32 get_word_020_prefetch (int o)
 {
        uae_u32 pc = m68k_getpc () + o;
@@ -7285,7 +7345,7 @@ uae_u32 get_word_020_prefetch (int o)
 #endif
                regs.prefetch020[0] = regs.prefetch020[1];
                if (!MORE_ACCURATE_68020_PIPELINE || regs.pipeline_stop >= 0) {
-                       fill_icache020 (pc + 2 + 4, currprefs.cpu_memory_cycle_exact ? mem_access_delay_longi_read_ce020 : get_longi);
+                       fill_icache020 (pc + 2 + 4, currprefs.cpu_memory_cycle_exact ? mem_access_delay_longi_read_ce020 : get_longi, false);
                        regs.prefetch020[1] = regs.cacheholdingdata020;
                }
                regs.db = regs.prefetch020[0] >> 16;
@@ -7301,6 +7361,7 @@ uae_u32 get_word_020_prefetch (int o)
 
 // these are also used by 68030.
 
+#if 0
 #define RESET_CE020_CYCLES \
        regs.ce020memcycles = 0; \
        regs.ce020memcycle_data = true;
@@ -7308,12 +7369,12 @@ uae_u32 get_word_020_prefetch (int o)
        unsigned long cycs = get_cycles ()
 #define ADD_CE020_CYCLES \
        regs.ce020memcycles += get_cycles () - cycs
+#endif
 
 uae_u32 mem_access_delay_long_read_ce020 (uaecptr addr)
 {
        uae_u32 v;
-       RESET_CE020_CYCLES;
-       STORE_CE020_CYCLES;
+       start_020_cycle();
        switch (ce_banktype[addr >> 16])
        {
        case CE_MEMBANK_CHIP16:
@@ -7343,7 +7404,7 @@ uae_u32 mem_access_delay_long_read_ce020 (uaecptr addr)
                v = get_long (addr);
                break;
        }
-       ADD_CE020_CYCLES;
+       end_020_cycle();
        return v;
 }
 
@@ -7385,8 +7446,7 @@ uae_u32 mem_access_delay_longi_read_ce020 (uaecptr addr)
 uae_u32 mem_access_delay_word_read_ce020 (uaecptr addr)
 {
        uae_u32 v;
-       RESET_CE020_CYCLES;
-       STORE_CE020_CYCLES;
+       start_020_cycle();
        switch (ce_banktype[addr >> 16])
        {
        case CE_MEMBANK_CHIP16:
@@ -7410,15 +7470,14 @@ uae_u32 mem_access_delay_word_read_ce020 (uaecptr addr)
                 v = get_word (addr);
                break;
        }
-       ADD_CE020_CYCLES;
+       end_020_cycle();
        return v;
 }
 
 uae_u32 mem_access_delay_byte_read_ce020 (uaecptr addr)
 {
        uae_u32 v;
-       RESET_CE020_CYCLES;
-       STORE_CE020_CYCLES;
+       start_020_cycle();
        switch (ce_banktype[addr >> 16])
        {
        case CE_MEMBANK_CHIP16:
@@ -7434,14 +7493,13 @@ uae_u32 mem_access_delay_byte_read_ce020 (uaecptr addr)
                v = get_byte (addr);
                break;
        }
-       ADD_CE020_CYCLES;
+       end_020_cycle();
        return v;
 }
 
 void mem_access_delay_byte_write_ce020 (uaecptr addr, uae_u32 v)
 {
-       RESET_CE020_CYCLES;
-       STORE_CE020_CYCLES;
+       start_020_cycle();
        switch (ce_banktype[addr >> 16])
        {
        case CE_MEMBANK_CHIP16:
@@ -7457,13 +7515,12 @@ void mem_access_delay_byte_write_ce020 (uaecptr addr, uae_u32 v)
                put_byte (addr, v);
        break;
        }
-       ADD_CE020_CYCLES;
+       end_020_cycle();
 }
 
 void mem_access_delay_word_write_ce020 (uaecptr addr, uae_u32 v)
 {
-       RESET_CE020_CYCLES;
-       STORE_CE020_CYCLES;
+       start_020_cycle();
        switch (ce_banktype[addr >> 16])
        {
        case CE_MEMBANK_CHIP16:
@@ -7487,13 +7544,12 @@ void mem_access_delay_word_write_ce020 (uaecptr addr, uae_u32 v)
                put_word (addr, v);
        break;
        }
-       ADD_CE020_CYCLES;
+       end_020_cycle();
 }
 
 void mem_access_delay_long_write_ce020 (uaecptr addr, uae_u32 v)
 {
-       RESET_CE020_CYCLES;
-       STORE_CE020_CYCLES;
+       start_020_cycle();
        switch (ce_banktype[addr >> 16])
        {
        case CE_MEMBANK_CHIP16:
@@ -7523,7 +7579,7 @@ void mem_access_delay_long_write_ce020 (uaecptr addr, uae_u32 v)
                put_long (addr, v);
                break;
        }
-       ADD_CE020_CYCLES;
+       end_020_cycle();
 }
 
 
@@ -7573,14 +7629,10 @@ static void fill_icache030 (uae_u32 addr)
 
        // cache miss
        if (currprefs.cpu_cycle_exact) {
-               if (!regs.ce020memcycle_data)
-                       regs.ce020memcycles = 0;
                regs.ce020memcycle_data = false;
-               unsigned long cycs = get_cycles ();
+               start_020_cycle_prefetch(false);
                data = mem_access_delay_longi_read_ce020 (addr);
-               // add as available "free" internal CPU time.
-               cycs = get_cycles () - cycs;
-               regs.ce020memcycles += cycs;
+               end_020_cycle_prefetch(false);
        } else if (currprefs.cpu_memory_cycle_exact) {
                data = mem_access_delay_longi_read_ce020 (addr);
        } else {
@@ -7788,7 +7840,7 @@ uae_u32 read_dcache030 (uaecptr addr, int size)
        return 0;
 }
 
-uae_u32 get_word_ce030_prefetch (int o)
+static uae_u32 get_word_ce030_prefetch_2 (int o)
 {
        uae_u32 pc = m68k_getpc () + o;
        uae_u32 v;
@@ -7814,6 +7866,15 @@ uae_u32 get_word_ce030_prefetch (int o)
        return v;
 }
 
+uae_u32 get_word_ce030_prefetch (int o)
+{
+       return get_word_ce030_prefetch_2(o);
+}
+uae_u32 get_word_ce030_prefetch_opcode (int o)
+{
+       return get_word_ce030_prefetch_2(o);
+}
+
 uae_u32 get_word_030_prefetch(int o)
 {
        uae_u32 pc = m68k_getpc() + o;
@@ -8269,7 +8330,7 @@ void fill_prefetch_030_ntx (void)
 #endif
 
        if (currprefs.cpu_cycle_exact)
-               regs.irc = get_word_ce030_prefetch (0);
+               regs.irc = get_word_ce030_prefetch_opcode (0);
        else
                regs.irc = get_word_030_prefetch(0);
 }
@@ -8284,12 +8345,12 @@ void fill_prefetch_020_ntx(void)
        regs.pipeline_stop = 0;
        regs.pipeline_r8[0] = regs.pipeline_r8[1] = -1;
 
-       fill_icache020 (pc, fetch);
+       fill_icache020 (pc, fetch, true);
        if (currprefs.cpu_cycle_exact)
                do_cycles_ce020_internal(2);
        regs.prefetch020[0] = regs.cacheholdingdata020;
 
-       fill_icache020 (pc + 4, fetch);
+       fill_icache020 (pc + 4, fetch, true);
        if (currprefs.cpu_cycle_exact)
                do_cycles_ce020_internal(2);
        regs.prefetch020[1] = regs.cacheholdingdata020;
@@ -8305,7 +8366,7 @@ void fill_prefetch_020_ntx(void)
 #endif
 
        if (currprefs.cpu_cycle_exact)
-               regs.irc = get_word_ce020_prefetch (0);
+               regs.irc = get_word_ce020_prefetch_opcode (0);
        else
                regs.irc = get_word_020_prefetch (0);
 }
@@ -8320,6 +8381,15 @@ void continue_020_prefetch(void)
        fill_prefetch_020_ntx();
 }
 
+void continue_ce030_prefetch(void)
+{
+       fill_prefetch_030_ntx();
+}
+void continue_030_prefetch(void)
+{
+       fill_prefetch_030_ntx();
+}
+
 void fill_prefetch_020(void)
 {
        fill_prefetch_020_ntx();
index ac9c1f215cb072c6c7c6294db48df9f791da3e2c..2ad8953dd9be4e97678604a4928c342d55a45f63 100644 (file)
@@ -1071,12 +1071,12 @@ static int psEffect_SetTextures (LPDIRECT3DTEXTURE9 lpSource, struct shaderdata
                }
        }
        if (s->m_TargetDimsEffectHandle) {
-               D3DXVECTOR4 fDims2;
-               fDims2.x = s->targettex_width;
-               fDims2.y = s->targettex_height;
-               fDims2.z = 1;
-               fDims2.w = 1;
-               hr = s->pEffect->SetVector(s->m_TargetDimsEffectHandle, &fDims2);
+               D3DXVECTOR4 fDimsTarget;
+               fDimsTarget.x = s->targettex_width;
+               fDimsTarget.y = s->targettex_height;
+               fDimsTarget.z = 1;
+               fDimsTarget.w = 1;
+               hr = s->pEffect->SetVector(s->m_TargetDimsEffectHandle, &fDimsTarget);
                if (FAILED(hr)) {
                        write_log(_T("%s: SetTextures:SetVector:Target %s\n"), D3DHEAD, D3D_ErrorString(hr));
                        return 0;
@@ -3053,6 +3053,27 @@ static void D3D_render2 (void)
                if (FAILED (hr = postEffect->SetTexture (postSourceTextureHandle, srctex)))
                        write_log (_T("%s: SetTexture(srctex) failed: %s\n"), D3DHEAD, D3D_ErrorString (hr));
 
+               if (s->m_SourceDimsEffectHandle) {
+                       D3DXVECTOR4 fDimsSource;
+                       fDimsSource.x = (FLOAT)Desc.Width;
+                       fDimsSource.y = (FLOAT)Desc.Height;
+                       fDimsSource.z  = 1; fDimsSource.w = 1;
+                       hr = postEffect->SetVector(s->m_SourceDimsEffectHandle, &fDimsSource);
+                       if (FAILED(hr)) {
+                               write_log(_T("%s: SetTextures:SetVector:Source %s\n"), D3DHEAD, D3D_ErrorString(hr));
+                       }
+               }
+               if (s->m_TargetDimsEffectHandle) {
+                       D3DXVECTOR4 fDimsTarget;
+                       fDimsTarget.x = s->targettex_width;
+                       fDimsTarget.y = s->targettex_height;
+                       fDimsTarget.z = 1; fDimsTarget.w = 1;
+                       hr = postEffect->SetVector(s->m_TargetDimsEffectHandle, &fDimsTarget);
+                       if (FAILED(hr)) {
+                               write_log(_T("%s: SetTextures:SetVector:Target %s\n"), D3DHEAD, D3D_ErrorString(hr));
+                       }
+               }
+
                if (after >= 0) {
                        if (FAILED (hr = d3ddev->GetRenderTarget (0, &lpRenderTarget)))
                                write_log (_T("%s: GetRenderTarget: %s\n"), D3DHEAD, D3D_ErrorString (hr));
index a43ba450ac5e1d24e567aa5d3d45d570c446724a..d33f7802dd2ff3f22b514f8bf89bb62b1b1a33e1 100644 (file)
@@ -36,12 +36,16 @@ static int usefloppydrives = 0;
 static int num_drives;
 static bool drives_enumerated;
 
+#define MAX_LOCKED_VOLUMES 8
+
 struct hardfilehandle
 {
        int zfile;
        struct zfile *zf;
        HANDLE h;
        BOOL firstwrite;
+       HANDLE locked_volumes[MAX_LOCKED_VOLUMES];
+       bool dismounted;
 };
 
 struct uae_driveinfo {
@@ -79,7 +83,7 @@ int harddrive_dangerous; // = 0x1234dead; // test only!
 int do_rdbdump;
 static struct uae_driveinfo uae_drives[MAX_FILESYSTEM_UNITS];
 
-#if 1
+#if 0
 static void fixdrive (struct hardfiledata *hfd)
 {
        uae_u8 data[512];
@@ -195,7 +199,7 @@ static int ismounted (const TCHAR *name, HANDLE hd)
                return 0;
        mounted = 0;
        h = FindFirstVolume (volname, sizeof volname / sizeof (TCHAR));
-       while (h && !mounted) {
+       while (h != INVALID_HANDLE_VALUE && !mounted) {
                HANDLE d;
                if (volname[_tcslen (volname) - 1] == '\\')
                        volname[_tcslen (volname) - 1] = 0;
@@ -243,7 +247,7 @@ static int ismounted (const TCHAR *name, HANDLE hd)
                        }
                        CloseHandle (d);
                } else {
-                       write_log (_T("'%s': %d\n"), volname, GetLastError ());
+                       hdf_log2 (_T("'%s': %d\n"), volname, GetLastError ());
                }
                if (!FindNextVolume (h, volname, sizeof volname / sizeof (TCHAR)))
                        break;
@@ -548,6 +552,109 @@ static bool getdeviceinfo (HANDLE hDevice, struct uae_driveinfo *udi)
        return true;
 }
 
+static void lock_drive(struct hardfiledata *hfd, const TCHAR *name, HANDLE drvhandle)
+{
+       DWORD written;
+       TCHAR volname[MAX_DPATH];
+       DWORD sign, pstyle;
+       bool ntfs_found = false;
+
+       if (!hfd->ci.lock)
+               return;
+
+       // single partition FAT drives seem to lock this way, without need for administrator privileges
+       if (DeviceIoControl(drvhandle, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &written, NULL)) {
+               if (DeviceIoControl(drvhandle, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, &written, NULL)) {
+                       write_log(_T("'%s' locked and dismounted successfully.\n"), name);
+                       hfd->handle->dismounted = true;
+                       return;
+               }
+       }
+
+       if (!getsignfromhandle (drvhandle, &sign, &pstyle))
+               return;
+       HANDLE h = FindFirstVolume (volname, sizeof volname / sizeof (TCHAR));
+       while (h != INVALID_HANDLE_VALUE) {
+               bool isntfs = false;
+               if (volname[_tcslen (volname) - 1] == '\\')
+                       volname[_tcslen (volname) - 1] = 0;
+               HANDLE d = CreateFile (volname, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
+                       NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+               if (d != INVALID_HANDLE_VALUE) {
+                       if (DeviceIoControl (d, FSCTL_IS_VOLUME_MOUNTED, NULL, 0, NULL, 0, &written, NULL)) {
+                               VOLUME_DISK_EXTENTS *vde;
+                               NTFS_VOLUME_DATA_BUFFER ntfs;
+                               if (DeviceIoControl (d, FSCTL_GET_NTFS_VOLUME_DATA, NULL, 0, &ntfs, sizeof ntfs, &written, NULL)) {
+                                       isntfs = true;
+                               }
+                               DWORD outsize = sizeof (VOLUME_DISK_EXTENTS) + sizeof (DISK_EXTENT) * 32;
+                               vde = (VOLUME_DISK_EXTENTS*)xmalloc (uae_u8, outsize);
+                               if (DeviceIoControl (d, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0, vde, outsize, &written, NULL)) {
+                                       for (int i = 0; i < vde->NumberOfDiskExtents; i++) {
+                                               int mounted = 0;
+                                               TCHAR pdrv[MAX_DPATH];
+                                               _stprintf (pdrv, _T("\\\\.\\PhysicalDrive%d"), vde->Extents[i].DiskNumber);
+                                               HANDLE ph = CreateFile (pdrv, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+                                               if (ph != INVALID_HANDLE_VALUE) {
+                                                       DWORD sign2, pstyle2;
+                                                       if (getsignfromhandle (ph, &sign2, &pstyle2)) {
+                                                               if (sign == sign2 && pstyle == PARTITION_STYLE_MBR) {
+                                                                       if (isntfs)
+                                                                               ntfs_found = true;
+                                                                       mounted = isntfs ? -1 : 1;
+                                                               }
+                                                       }
+                                                       CloseHandle(ph);
+                                                       if (mounted > 0) {
+                                                               for (int j = 0; j < MAX_LOCKED_VOLUMES; j++) {
+                                                                       if (hfd->handle->locked_volumes[j] == INVALID_HANDLE_VALUE) {
+                                                                               write_log(_T("%d: Partition found: PhysicalDrive%d: Extent %d Start=%I64X Len=%I64X\n"), i,
+                                                                                       j, vde->Extents[i].DiskNumber, vde->Extents[i].StartingOffset.QuadPart, vde->Extents[i].ExtentLength.QuadPart);
+                                                                               hfd->handle->locked_volumes[j] = d;
+                                                                               d = INVALID_HANDLE_VALUE;
+                                                                               break;
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               } else {
+                                       write_log (_T("IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS returned %08x\n"), GetLastError ());
+                               }
+                       }
+                       if (d != INVALID_HANDLE_VALUE)
+                               CloseHandle (d);
+               }
+               if (!FindNextVolume (h, volname, sizeof volname / sizeof (TCHAR)))
+                       break;
+       }
+       FindVolumeClose(h);
+
+       if (ntfs_found) {
+               write_log(_T("Not locked: At least one NTFS partition detected.\n"));
+       }
+
+       for (int i = 0; i < MAX_LOCKED_VOLUMES; i++) {
+               HANDLE d = hfd->handle->locked_volumes[i];
+               if (d != INVALID_HANDLE_VALUE) {
+                       if (ntfs_found) {
+                               CloseHandle(d);
+                               hfd->handle->locked_volumes[i] = INVALID_HANDLE_VALUE;
+                       } else {
+                               if (DeviceIoControl(d, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &written, NULL)) {
+                                       if (DeviceIoControl(d, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, &written, NULL)) {
+                                               write_log(_T("ID=%d locked and dismounted successfully.\n"), i, name);
+                                       } else {
+                                               write_log (_T("WARNING: ID=%d FSCTL_DISMOUNT_VOLUME returned %d\n"), i, GetLastError());
+                                       }
+                               } else {
+                                       write_log (_T("WARNING: ID=%d FSCTL_LOCK_VOLUME returned %d\n"), i, GetLastError());
+                               }
+                       }
+               }
+       }
+}
+
 int hdf_open_target (struct hardfiledata *hfd, const TCHAR *pname)
 {
        HANDLE h = INVALID_HANDLE_VALUE;
@@ -569,6 +676,9 @@ int hdf_open_target (struct hardfiledata *hfd, const TCHAR *pname)
                goto end;
        }
        hfd->handle = xcalloc (struct hardfilehandle, 1);
+       for(int i = 0; i < MAX_LOCKED_VOLUMES; i++) {
+               hfd->handle->locked_volumes[i] = INVALID_HANDLE_VALUE;
+       }
        hfd->handle->h = INVALID_HANDLE_VALUE;
        hfd_log (_T("hfd attempting to open: '%s'\n"), name);
        if (name[0] == ':') {
@@ -576,15 +686,15 @@ int hdf_open_target (struct hardfiledata *hfd, const TCHAR *pname)
                TCHAR *p = _tcschr (name + 1, ':');
                if (p) {
                        *p++ = 0;
-                       if (!drives_enumerated) {
-                               // do not scan for drives if open succeeds and it is a harddrive
-                               // to prevent spinup of sleeping drives
-                               h = CreateFile (p,
-                                       GENERIC_READ,
-                                       FILE_SHARE_READ,
-                                       NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL);
-                               DWORD err = GetLastError ();
-                               if (h == INVALID_HANDLE_VALUE && err == ERROR_FILE_NOT_FOUND)
+                       // do not scan for drives if open succeeds and it is a harddrive
+                       // to prevent spinup of sleeping drives
+                       h = CreateFile (p,
+                               GENERIC_READ,
+                               FILE_SHARE_READ,
+                               NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL);
+                       DWORD err = GetLastError ();
+                       if (h == INVALID_HANDLE_VALUE && err == ERROR_FILE_NOT_FOUND) {
+                               if (!drives_enumerated)
                                        goto emptyreal;
                        }
                }
@@ -612,7 +722,6 @@ int hdf_open_target (struct hardfiledata *hfd, const TCHAR *pname)
                                udi = &uae_drives[drvnum];
                }
                if (udi != NULL) {
-                       DWORD r;
                        hfd->flags = HFD_FLAGS_REALDRIVE;
                        if (udi) {
                                if (udi->nomedia)
@@ -646,8 +755,6 @@ int hdf_open_target (struct hardfiledata *hfd, const TCHAR *pname)
                                        ret = -1;
                                goto end;
                        }
-                       if (!DeviceIoControl (h, FSCTL_ALLOW_EXTENDED_DASD_IO, NULL, 0, NULL, 0, &r, NULL))
-                               write_log (_T("WARNING: '%s' FSCTL_ALLOW_EXTENDED_DASD_IO returned %d\n"), name, GetLastError ());
 
                        //queryidentifydevice (hfd);
                        _tcsncpy (hfd->vendor_id, udi->vendor_id, 8);
@@ -674,8 +781,6 @@ int hdf_open_target (struct hardfiledata *hfd, const TCHAR *pname)
                                        hfd->handle->h = h;
                                        if (h == INVALID_HANDLE_VALUE)
                                                goto end;
-                                       if (!DeviceIoControl(h, FSCTL_ALLOW_EXTENDED_DASD_IO, NULL, 0, NULL, 0, &r, NULL))
-                                               write_log (_T("WARNING: '%s' FSCTL_ALLOW_EXTENDED_DASD_IO returned %d\n"), name, GetLastError ());
                                }
 
 #if 0
@@ -695,6 +800,8 @@ int hdf_open_target (struct hardfiledata *hfd, const TCHAR *pname)
                                hfd->warned = -1;
 #endif
                        }
+                       lock_drive(hfd, name, h);
+
                        hfd->handle_valid = HDF_HANDLE_WIN32;
                        hfd->emptyname = my_strdup (name);
 
@@ -793,8 +900,13 @@ static void freehandle (struct hardfilehandle *h)
 {
        if (!h)
                return;
+       for (int i = 0; i < MAX_LOCKED_VOLUMES; i++) {
+               if (h->locked_volumes[i] != INVALID_HANDLE_VALUE) {
+                       CloseHandle(h->locked_volumes[i]);
+               }
+       }
        if (!h->zfile && h->h != INVALID_HANDLE_VALUE)
-               CloseHandle (h->h);
+               CloseHandle(h->h);
        if (h->zfile && h->zf)
                zfile_fclose (h->zf);
        h->zf = NULL;
@@ -802,6 +914,11 @@ static void freehandle (struct hardfilehandle *h)
        h->zfile = 0;
 }
 
+HANDLE hdf_get_real_handle(struct hardfilehandle *h)
+{
+       return h->h;
+}
+
 void hdf_close_target (struct hardfiledata *hfd)
 {
        freehandle (hfd->handle);
@@ -1239,7 +1356,7 @@ static int getstorageproperty (PUCHAR outBuf, int returnedLength, struct uae_dri
                write_log (_T("too short STORAGE_DEVICE_DESCRIPTOR only %d bytes\n"), size);
                return -2;
        }
-       if (devDesc->DeviceType != INQ_DASD && devDesc->DeviceType != INQ_ROMD && devDesc->DeviceType != INQ_OPTD) {
+       if (devDesc->DeviceType != INQ_DASD && devDesc->DeviceType != INQ_ROMD && devDesc->DeviceType != INQ_OPTD && devDesc->DeviceType != INQ_OMEM) {
                write_log (_T("not a direct access device, ignored (type=%d)\n"), devDesc->DeviceType);
                return -2;
        }
@@ -2038,6 +2155,7 @@ int harddrive_to_hdf (HWND hDlg, struct uae_prefs *p, int idx)
        HWND hwnd, hwndprogress, hwndprogresstxt;
        MSG msg;
        int pct, cnt;
+       DWORD r;
 
        cache = VirtualAlloc (NULL, COPY_CACHE_SIZE, MEM_COMMIT, PAGE_READWRITE);
        if (!cache)
@@ -2056,6 +2174,12 @@ int harddrive_to_hdf (HWND hDlg, struct uae_prefs *p, int idx)
                CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN | FILE_FLAG_NO_BUFFERING, NULL);
        if (hdst == INVALID_HANDLE_VALUE)
                goto err;
+       if (!DeviceIoControl(h, FSCTL_ALLOW_EXTENDED_DASD_IO, NULL, 0, NULL, 0, &r, NULL)) {
+               write_log (_T("WARNING: '%s' FSCTL_ALLOW_EXTENDED_DASD_IO returned %d\n"), path, GetLastError ());
+       }
+       if (!DeviceIoControl(h, FSCTL_LOCK_VOLUME , NULL, 0, NULL, 0, &r, NULL)) {
+               write_log (_T("WARNING: '%s' FSCTL_LOCK_VOLUME returned %d\n"), path, GetLastError ());
+       }
        li.QuadPart = size;
        ret = SetFilePointer (hdst, li.LowPart, &li.HighPart, FILE_BEGIN);
        if (ret == INVALID_SET_FILE_POINTER && GetLastError () != NO_ERROR)
@@ -2068,7 +2192,7 @@ int harddrive_to_hdf (HWND hDlg, struct uae_prefs *p, int idx)
        SetFilePointer (h, 0, &li.HighPart, FILE_BEGIN);
        progressdialogreturn = -1;
        progressdialogactive = 1;
-       hwnd = CreateDialog (hUIDLL ? hUIDLL : hInst, MAKEINTRESOURCE (IDD_PROGRESSBAR), hDlg, ProgressDialogProc);
+       hwnd = CustomCreateDialog(IDD_PROGRESSBAR, hDlg, ProgressDialogProc);
        if (hwnd == NULL)
                goto err;
        hwndprogress = GetDlgItem (hwnd, IDC_PROGRESSBAR);
index 9140cdad7fe1fb42aff38e23b3f6eb194c820e08..c15ff786e3178ea8ac029ec86d73fa36f2c9642a 100644 (file)
@@ -734,7 +734,9 @@ bool uae_mman_info(addrbank *ab, struct uae_mman_data *md)
        } else if (!_tcscmp(ab->label, _T("chip"))) {
                start = 0;
                got = true;
-               if (!expansion_get_autoconfig_by_address(&currprefs, 0x00200000) || currprefs.chipmem_size < 2 * 1024 * 1024)
+               if (!expansion_get_autoconfig_by_address(&currprefs, 0x00200000) && currprefs.chipmem_size == 2 * 1024 * 1024)
+                       barrier = true;
+               if (currprefs.chipmem_size > 2 * 1024 * 1024)
                        barrier = true;
        } else if (!_tcscmp(ab->label, _T("kick"))) {
                start = 0xf80000;
@@ -867,6 +869,7 @@ bool uae_mman_info(addrbank *ab, struct uae_mman_data *md)
                md->readonly = readonly;
                md->readonlysize = readonlysize;
                md->maprom = maprom;
+               md->hasbarrier = barrier;
 
                if (start_rtg && end_rtg) {
                        if (start < start_rtg || start + size > end_rtg)
@@ -876,7 +879,7 @@ bool uae_mman_info(addrbank *ab, struct uae_mman_data *md)
                        directsupport = false;
                }
                md->directsupport = directsupport;
-               if (barrier) {
+               if (md->hasbarrier) {
                        md->size += BARRIER;
                }
        }
index 07a0b64833b99ace24f7583dfb276ad7f1bbaaa9..5c0e594ffe626d6ade433342bd218dae31efb40c 100644 (file)
 #define IDC_16BIT                       1231
 #define IDC_PPC_CPUIDLE                 1231
 #define IDC_11KHZ                       1232
+#define IDC_FPU_SOFTFLOAT               1232
 #define IDC_22KHZ                       1233
 #define IDC_SPEED_x86                   1233
 #define IDC_44KHZ                       1234
 #define IDC_HDFINFO                     1779
 #define IDC_DBG_AUTOSET                 1780
 #define IDC_HF_SPARSE                   1780
+#define IDC_HDF_LOCK                    1780
 #define IDC_DBG_DASM2                   1781
 #define IDC_HF_DYNAMIC                  1781
 #define IDC_DBG_MEM2                    1782
index 6c893aab4128e4e2f23dccd2f26ce2c862fb11e9..37435b694164a4f791c0df0eb5539a351dae1c99 100644 (file)
@@ -309,6 +309,7 @@ BEGIN
     CONTROL         "Direct",IDC_TRUST0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,143,299,72,10
     CONTROL         "Indirect",IDC_TRUST1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,221,299,72,10
     CONTROL         "No flags",IDC_NOFLAGS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,299,299,68,11
+    CONTROL         "Softfloat FPU emulation",IDC_FPU_SOFTFLOAT,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,8,285,115,10
 END
 
 IDD_FLOPPY DIALOGEX 0, 0, 396, 261
@@ -929,7 +930,7 @@ BEGIN
     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,5,67,158,14
-    EDITTEXT        IDC_PATH_NAME,178,67,97,15,ES_AUTOHSCROLL | NOT WS_VISIBLE
+    EDITTEXT        IDC_PATH_NAME,178,67,41,15,ES_AUTOHSCROLL | NOT WS_VISIBLE
     CONTROL         "Read/write",IDC_HDF_RW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,315,71,60,10
     COMBOBOX        IDC_HDF_CONTROLLER_UNIT,65,90,97,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     COMBOBOX        IDC_HDF_CONTROLLER_TYPE,178,90,97,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
@@ -937,6 +938,7 @@ BEGIN
     COMBOBOX        IDC_HDF_CONTROLLER,8,113,218,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     DEFPUSHBUTTON   "Add hard drive",IDOK,236,113,73,14
     PUSHBUTTON      "Cancel",IDCANCEL,316,113,73,14
+    CONTROL         "Lock",IDC_HDF_LOCK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,243,71,61,10
 END
 
 IDD_MISC2 DIALOGEX 0, 0, 396, 278
@@ -1090,7 +1092,7 @@ BEGIN
 END
 
 IDD_PROGRESSBAR DIALOGEX 0, 0, 396, 58
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 CAPTION "Processing..."
 FONT 8, "MS Sans Serif", 0, 0, 0x0
 BEGIN
@@ -1231,16 +1233,16 @@ BEGIN
     CONTROL         "",IDC_LISTDIALOG_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,7,7,302,171
 END
 
-IDD_CDDRIVE DIALOGEX 0, 0, 395, 109
+IDD_CDDRIVE DIALOGEX 0, 0, 395, 125
 STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 CAPTION "CD Settings"
 FONT 8, "MS Sans Serif", 0, 0, 0x0
 BEGIN
     RTEXT           "HD Controller:",IDC_STATIC,7,90,65,10,SS_CENTERIMAGE
-    COMBOBOX        IDC_HDF_CONTROLLER,80,89,122,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_HDF_CONTROLLER_UNIT,208,89,25,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    DEFPUSHBUTTON   "Add CD Drive",IDOK,238,89,73,14
-    PUSHBUTTON      "Cancel",IDCANCEL,318,89,73,14
+    COMBOBOX        IDC_HDF_CONTROLLER,80,89,154,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_HDF_CONTROLLER_UNIT,239,89,71,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    DEFPUSHBUTTON   "Add CD Drive",IDOK,121,108,73,14
+    PUSHBUTTON      "Cancel",IDCANCEL,201,108,73,14
     CONTROL         "",IDC_CDLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,4,4,387,77
 END
 
@@ -1256,8 +1258,8 @@ BEGIN
     PUSHBUTTON      "Eject",IDC_TAPE_EJECT,278,36,105,15
     RTEXT           "HD Controller:",IDC_STATIC,7,60,65,10,SS_CENTERIMAGE
     COMBOBOX        IDC_HDF_CONTROLLER,79,58,148,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_HDF_CONTROLLER_UNIT,235,58,31,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Read/write",IDC_TAPE_RW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,277,58,67,10
+    COMBOBOX        IDC_HDF_CONTROLLER_UNIT,235,58,52,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Read/write",IDC_TAPE_RW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,299,58,84,10
     DEFPUSHBUTTON   "Add Tape Drive",IDOK,106,75,88,14
     PUSHBUTTON      "Cancel",IDCANCEL,200,76,88,14
 END
@@ -1318,8 +1320,8 @@ END
 //
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 3,4,0,0
- PRODUCTVERSION 3,4,0,0
+ FILEVERSION 3,4,1,0
+ PRODUCTVERSION 3,4,1,0
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -1335,12 +1337,12 @@ BEGIN
         BLOCK "040904b0"
         BEGIN
             VALUE "FileDescription", "WinUAE"
-            VALUE "FileVersion", "3.4.0.0"
+            VALUE "FileVersion", "3.4.1.0"
             VALUE "InternalName", "WinUAE"
-            VALUE "LegalCopyright", "© 1996-2016 under the GNU Public License (GPL)"
+            VALUE "LegalCopyright", "© 1996-2017 under the GNU Public License (GPL)"
             VALUE "OriginalFilename", "WinUAE.exe"
             VALUE "ProductName", "WinUAE"
-            VALUE "ProductVersion", "3.4.0.0"
+            VALUE "ProductVersion", "3.4.1.0"
         END
     END
     BLOCK "VarFileInfo"
index e153eb8d5e6f5382f45bb657715689f1d4a88aa1..537e8ef1ad158622a432b12083ecdcd216d6e050 100644 (file)
@@ -102,6 +102,17 @@ END
 // Dialog
 //
 
+IDD_BOARDS DIALOGEX 0, 0, 396, 259
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+EXSTYLE WS_EX_CONTEXTHELP
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+    CONTROL         "",IDC_BOARDLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,2,18,390,220
+    CONTROL         "Custom board order",IDC_AUTOCONFIGCUSTOMSORT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,2,242,99,12
+    PUSHBUTTON      "Move up",IDC_BOARDS_UP,114,241,78,14
+    PUSHBUTTON      "Move down",IDC_BOARDS_DOWN,203,241,78,14
+END
+
 IDD_KICKSTART DIALOGEX 0, 0, 396, 259
 STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
 EXSTYLE WS_EX_CONTEXTHELP
@@ -162,6 +173,7 @@ BEGIN
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,154,139,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
+    CONTROL         "Monochrome video out",IDC_GRAYSCALE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,167,139,10
     RTEXT           "Resolution:",IDC_STATIC,24,192,110,8,SS_CENTERIMAGE
     COMBOBOX        IDC_LORES,142,191,127,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     RTEXT           "Resolution autoswitch:",IDC_STATIC,92,212,110,8,SS_CENTERIMAGE
@@ -191,10 +203,9 @@ BEGIN
     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         "Monochrome video out",IDC_GRAYSCALE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,167,139,10
 END
 
-IDD_MEMORY DIALOGEX 0, 0, 396, 246
+IDD_MEMORY DIALOGEX 0, 0, 396, 266
 STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
 EXSTYLE WS_EX_CONTEXTHELP
 FONT 8, "MS Sans Serif", 0, 0, 0x1
@@ -216,19 +227,25 @@ BEGIN
     CONTROL         "",IDC_Z3CHIPMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,248,71,60,20
     EDITTEXT        IDC_Z3CHIPRAM,311,76,40,12,ES_CENTER | ES_READONLY
     EDITTEXT        IDC_MAX32RAM,14,99,366,12,ES_CENTER | ES_READONLY
-    GROUPBOX        "Advanced Memory Settings",IDC_STATIC,1,134,393,107
-    RTEXT           "Motherboard Fast:",IDC_STATIC,116,149,129,10,SS_CENTERIMAGE
-    CONTROL         "",IDC_MBMEM1,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,251,145,68,20
-    EDITTEXT        IDC_MBRAM1,326,148,40,12,ES_CENTER | ES_READONLY
-    RTEXT           "Processor Slot Fast:",IDC_STATIC,116,172,129,10,SS_CENTERIMAGE
-    CONTROL         "",IDC_MBMEM2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,251,168,68,20
-    EDITTEXT        IDC_MBRAM2,326,171,40,12,ES_CENTER | ES_READONLY
-    RTEXT           "Second Z2 Fast RAM board:",IDC_STATIC,129,194,116,15,SS_CENTERIMAGE
-    CONTROL         "",IDC_FASTMEM2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,251,193,68,20
-    EDITTEXT        IDC_FASTRAM2,326,196,40,12,ES_CENTER | ES_READONLY
-    RTEXT           "Z3 mapping mode:",IDC_STATIC,149,219,93,15,SS_CENTERIMAGE
-    COMBOBOX        IDC_Z3MAPPING,249,220,117,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Autoconfig Z2 Fast RAM",IDC_FASTMEMAUTOCONFIG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,194,120,10
+    GROUPBOX        "Advanced Memory Settings",IDC_STATIC,1,128,393,137
+    COMBOBOX        IDC_MEMORYSELECT,14,151,228,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "",IDC_MEMORYMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,253,145,68,20
+    EDITTEXT        IDC_MEMORYRAM,328,148,40,12,ES_CENTER | ES_READONLY
+    RTEXT           "Manufacturer",IDC_STATIC,12,175,57,15,SS_CENTERIMAGE
+    EDITTEXT        IDC_AUTOCONFIG_MANUFACTURER,78,175,45,13,ES_AUTOHSCROLL
+    RTEXT           "Product",IDC_STATIC,133,175,55,15,SS_CENTERIMAGE
+    EDITTEXT        IDC_AUTOCONFIG_PRODUCT,196,175,45,13,ES_AUTOHSCROLL
+    RTEXT           "Autoconfig data",IDC_STATIC,11,195,57,15,SS_CENTERIMAGE
+    EDITTEXT        IDC_AUTOCONFIG_DATA,78,194,164,13,ES_AUTOHSCROLL
+    CONTROL         "Edit Autoconfig data",IDC_FASTMEMAUTOCONFIGUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,261,177,103,8
+    CONTROL         "Manual configuration",IDC_FASTMEMNOAUTOCONFIG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,261,195,103,8
+    RTEXT           "Memory board",IDC_STATIC,15,216,53,15,SS_CENTERIMAGE
+    COMBOBOX        IDC_MEMORYBOARDSELECT,77,216,165,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    LTEXT           "Z3 mapping mode:",IDC_STATIC,263,215,115,15,SS_CENTERIMAGE
+    RTEXT           "Address range",IDC_STATIC,10,237,57,15,SS_CENTERIMAGE
+    EDITTEXT        IDC_RAM_ADDRESS,77,237,79,13,ES_AUTOHSCROLL
+    EDITTEXT        IDC_RAM_ADDRESS2,164,237,79,13,ES_AUTOHSCROLL
+    COMBOBOX        IDC_Z3MAPPING,262,237,117,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
 END
 
 IDD_CPU DIALOGEX 0, 0, 396, 317
@@ -237,20 +254,29 @@ FONT 8, "MS Sans Serif", 0, 0, 0x0
 BEGIN
     GROUPBOX        "CPU",IDC_STATIC,1,1,129,184,BS_LEFT
     CONTROL         "68000",IDC_CPU0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,8,19,63,10
-    CONTROL         "68010",IDC_CPU1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,8,33,63,10
-    CONTROL         "68020",IDC_CPU2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,8,46,63,10
-    CONTROL         "68030",IDC_CPU3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,8,60,63,10
-    CONTROL         "68040",IDC_CPU4,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,8,74,63,10
-    CONTROL         "68060",IDC_CPU5,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,8,88,63,10
-    CONTROL         "24-bit addressing",IDC_COMPATIBLE24,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,8,108,119,12
+    CONTROL         "68010",IDC_CPU1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,8,32,63,10
+    CONTROL         "68020",IDC_CPU2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,8,45,63,10
+    CONTROL         "68030",IDC_CPU3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,8,58,63,10
+    CONTROL         "68040",IDC_CPU4,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,8,71,63,10
+    CONTROL         "68060",IDC_CPU5,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,8,84,63,10
+    CONTROL         "24-bit addressing",IDC_COMPATIBLE24,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,8,107,119,12
     CONTROL         "More compatible [] 68000: emulate prefetch. 68020+: emulate prefetch partially. More compatible but slower.",IDC_COMPATIBLE,
                     "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,8,121,118,11
     CONTROL         "JIT [] Enable just-in-time CPU emulator. Significantly increases the speed of the CPU emulation. Requires 68020 or higher CPU.",IDC_JITENABLE,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,135,120,11
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,134,120,11
     CONTROL         "MMU [] 68030, 68040 and 68060 MMU emulation. Not compatible with JIT.",IDC_MMUENABLE,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,148,120,11
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,147,120,11
     CONTROL         "Unimplemented CPU emu [] Emulate 68060 unimplemented integer instructions",IDC_CPU_UNIMPLEMENTED,
-                    "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,8,161,118,10
+                    "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,8,160,118,10
+    GROUPBOX        "FPU",IDC_STATIC,1,188,129,128,BS_LEFT
+    CONTROL         "None",IDC_FPU0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,8,204,87,10
+    CONTROL         "68881",IDC_FPU1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,8,217,87,10
+    CONTROL         "68882",IDC_FPU2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,8,230,87,10
+    CONTROL         "CPU internal",IDC_FPU3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,8,243,93,10
+    CONTROL         "More compatible [] More compatible but slower FPU emulation.",IDC_COMPATIBLE_FPU,
+                    "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,8,259,117,10
+    CONTROL         "Unimplemented FPU emu [] Emulate FPU unimplemented instructions",IDC_FPU_UNIMPLEMENTED,
+                    "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,8,272,116,10
     GROUPBOX        "CPU Emulation Speed",IDC_STATIC,136,1,258,97
     CONTROL         "Fastest possible",IDC_CS_HOST,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_GROUP | WS_TABSTOP,143,19,195,10
     CONTROL         "Approximate A500/A1200 or cycle-exact",IDC_CS_68000,
@@ -264,34 +290,25 @@ BEGIN
     RTEXT           "CPU Frequency",IDC_STATIC,139,121,67,10,SS_CENTERIMAGE
     COMBOBOX        IDC_CPU_FREQUENCY,215,120,89,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     EDITTEXT        IDC_CPU_FREQUENCY2,312,119,70,15
-    GROUPBOX        "FPU",IDC_STATIC,1,188,129,128,BS_LEFT
-    CONTROL         "None",IDC_FPU0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,8,202,87,10
-    CONTROL         "68881",IDC_FPU1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,8,216,87,10
-    CONTROL         "68882",IDC_FPU2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,8,229,87,10
-    CONTROL         "CPU internal",IDC_FPU3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,8,243,93,10
-    CONTROL         "More compatible [] More compatible but slower FPU emulation.",IDC_COMPATIBLE_FPU,
-                    "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,8,259,117,10
-    CONTROL         "Unimplemented FPU emu [] Emulate FPU unimplemented instructions",IDC_FPU_UNIMPLEMENTED,
-                    "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,8,272,116,10
+    GROUPBOX        "PPC CPU options",IDC_STATIC,136,144,258,57
+    CONTROL         "PPC CPU emulation (Blizzard PPC / CyberStorm PPC) [] Automatically configure CyberStorm PPC or Blizzard PPC setup.",IDC_CPU_PPC,
+                    "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,145,161,236,10
+    RTEXT           "Stopped M68K CPU idle mode",IDC_STATIC,180,183,121,9
+    CONTROL         "",IDC_PPC_CPUIDLE,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,308,177,69,21
+    GROUPBOX        "x86 Bridgeboard CPU options",IDC_STATIC,136,202,258,42
+    RTEXT           "CPU Speed",IDC_STATIC,147,221,55,9,SS_CENTERIMAGE
+    EDITTEXT        IDC_CPUTEXT_x86,224,220,39,12,ES_CENTER | ES_READONLY
+    CONTROL         "",IDC_SPEED_x86,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,278,215,108,20
     GROUPBOX        "Advanced JIT Settings",IDC_STATIC,136,245,258,70
     RTEXT           "Cache size:",IDC_STATIC,143,261,66,10,SS_CENTERIMAGE
     CONTROL         "Slider1",IDC_CACHE,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,212,255,115,20
     EDITTEXT        IDC_CACHETEXT,331,260,30,12,ES_CENTER | ES_READONLY
-    CONTROL         "Hard flush",IDC_HARDFLUSH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,299,281,84,11
-    CONTROL         "Constant jump",IDC_CONSTJUMP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,221,281,71,11
     CONTROL         "FPU support",IDC_JITFPU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,143,281,71,11
-    CONTROL         "No flags",IDC_NOFLAGS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,299,299,68,11
+    CONTROL         "Constant jump",IDC_CONSTJUMP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,221,281,71,11
+    CONTROL         "Hard flush",IDC_HARDFLUSH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,299,281,84,11
     CONTROL         "Direct",IDC_TRUST0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,143,299,72,10
     CONTROL         "Indirect",IDC_TRUST1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,221,299,72,10
-    CONTROL         "PPC CPU emulation (Blizzard PPC / CyberStorm PPC) [] Automatically configure CyberStorm PPC or Blizzard PPC setup.",IDC_CPU_PPC,
-                    "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,145,161,236,10
-    GROUPBOX        "PPC CPU options",IDC_STATIC,136,144,258,57
-    RTEXT           "Stopped M68K CPU idle mode",IDC_STATIC,180,183,121,9
-    CONTROL         "",IDC_PPC_CPUIDLE,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,308,177,69,21
-    CONTROL         "",IDC_SPEED_x86,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,278,215,108,20
-    RTEXT           "CPU Speed",IDC_STATIC,147,221,55,9,SS_CENTERIMAGE
-    GROUPBOX        "x86 Bridgeboard CPU options",IDC_STATIC,136,202,258,42
-    EDITTEXT        IDC_CPUTEXT_x86,224,220,39,12,ES_CENTER | ES_READONLY
+    CONTROL         "No flags",IDC_NOFLAGS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,299,299,68,11
 END
 
 IDD_FLOPPY DIALOGEX 0, 0, 396, 261
@@ -362,17 +379,17 @@ BEGIN
     PUSHBUTTON      "&Properties",IDC_EDIT,267,172,60,15
     PUSHBUTTON      "Remove",IDC_REMOVE,334,172,60,15
     GROUPBOX        "Options",IDC_STATIC,1,189,393,66
-    CONTROL         "Add PC drives at startup",IDC_MAPDRIVES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,200,201,11
+    CONTROL         "Add PC drives at startup",IDC_MAPDRIVES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,9,200,201,11
     CONTROL         "Include removable drives..",IDC_MAPDRIVES_REMOVABLE,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,213,201,11
-    CONTROL         "Include network drives..",IDC_MAPDRIVES_NET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,227,201,11
-    CONTROL         "CDFS automount CD/DVD drives",IDC_MAPDRIVES_CD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,241,201,11
-    CONTROL         "Disable UAEFSDB-support",IDC_NOUAEFSDB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,222,200,167,11
-    CONTROL         "Don't use Windows Recycle Bin",IDC_NORECYCLEBIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,222,213,167,11
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,9,213,201,11
+    CONTROL         "Include network drives..",IDC_MAPDRIVES_NET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,9,226,201,11
+    CONTROL         "CDFS automount CD/DVD drives",IDC_MAPDRIVES_CD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,9,239,201,11
+    CONTROL         "Disable UAEFSDB-support",IDC_NOUAEFSDB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,220,200,167,11
+    CONTROL         "Don't use Windows Recycle Bin",IDC_NORECYCLEBIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,220,213,167,11
     CONTROL         "Automount removable drives [] Windows side insert or removal will immediately mount/remove it on Amiga side.",IDC_MAPDRIVES_AUTO,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,222,227,167,11
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,220,226,167,11
     CONTROL         "Limit size of directory drives to 1G [] Workaround for example old installers that calculate free space incorrectly if drive is large.",IDC_MAPDRIVES_LIMIT,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,222,241,167,11
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,220,239,167,11
     GROUPBOX        "Optical media options",IDC_STATIC,1,256,393,59
     LTEXT           "CD drive/image",IDC_STATIC,5,268,70,10,SS_CENTERIMAGE
     PUSHBUTTON      "Select image file",IDC_CD_SELECT,177,266,98,15
@@ -421,11 +438,13 @@ BEGIN
     COMBOBOX        IDC_SOUNDFILTER,279,186,96,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     GROUPBOX        "Floppy Drive Sound Emulation",IDC_STATIC,1,209,278,91
     CONTROL         "",IDC_SOUNDDRIVEVOLUME,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,20,227,107,19
-    EDITTEXT        IDC_SOUNDDRIVEVOLUME2,144,231,48,12,ES_CENTER | ES_READONLY
+    EDITTEXT        IDC_SOUNDDRIVEVOLUME2,145,231,48,12,ES_CENTER | ES_READONLY
+    LTEXT           "Empty drive",IDC_STATIC,205,231,60,15,SS_CENTERIMAGE
     CONTROL         "",IDC_SOUNDDRIVEVOLUMEX,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,20,254,107,19
-    EDITTEXT        IDC_SOUNDDRIVEVOLUMEX2,144,258,48,12,ES_CENTER | ES_READONLY
-    COMBOBOX        IDC_SOUNDDRIVE,205,231,66,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_SOUNDDRIVESELECT,18,281,253,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    EDITTEXT        IDC_SOUNDDRIVEVOLUMEX2,145,258,48,12,ES_CENTER | ES_READONLY
+    LTEXT           "Disk in drive",IDC_STATIC,205,258,60,15,SS_CENTERIMAGE
+    COMBOBOX        IDC_SOUNDDRIVESELECT,18,281,175,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_SOUNDDRIVE,205,281,66,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     GROUPBOX        "Drivers",IDC_STATIC,285,213,109,87
     CONTROL         "DirectSound",IDC_SOUND_DS,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,292,234,98,10
     CONTROL         "WASAPI",IDC_SOUND_WASAPI,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,292,248,98,10
@@ -477,10 +496,10 @@ BEGIN
     GROUPBOX        "Serial Port",IDC_STATIC,1,137,393,51
     COMBOBOX        IDC_SERIAL,67,150,317,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     CONTROL         "Shared",IDC_SER_SHARED,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,32,171,66,12
-    CONTROL         "RTS/CTS",IDC_SER_CTSRTS,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,106,171,66,12
+    CONTROL         "RTS/CTS",IDC_SER_CTSRTS,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,107,171,66,12
     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
+                    "Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,182,171,83,12
+    CONTROL         "uaeserial.device",IDC_UAESERIAL,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,274,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
@@ -507,24 +526,25 @@ BEGIN
     COMBOBOX        IDC_PORT1_JOYSMODE,136,74,106,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     PUSHBUTTON      "Remap / Test [] Remap or test Port 2 configuration.",IDC_PORT1_REMAP,310,74,78,14
     PUSHBUTTON      "Swap ports [] Swap ports 1 and 2.",IDC_SWAP,45,100,78,14
+    CONTROL         "Mouse/Joystick autoswitching [] Press button to automatically insert inactive input device in to joystick/mouse port",IDC_PORT_AUTOSWITCH,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,136,102,172,11
     LTEXT           "Emulated parallel port joystick adapter",IDC_STATIC,10,124,179,15,SS_CENTERIMAGE
     COMBOBOX        IDC_PORT2_JOYS,45,142,342,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     PUSHBUTTON      "Remap / Test [] Remap or test Parallel port joystick port 1 configurarion.",IDC_PORT2_REMAP,310,159,78,14
     COMBOBOX        IDC_PORT3_JOYS,45,178,342,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     PUSHBUTTON      "Remap / Test [] Remap or test Parallel port joystick port 2 configurarion.",IDC_PORT3_REMAP,310,194,78,14
     GROUPBOX        "Mouse extra settings",IDC_STATIC,1,219,393,68
-    RTEXT           "Mouse speed:",IDC_STATIC,19,237,82,10,SS_CENTERIMAGE
-    EDITTEXT        IDC_INPUTSPEEDM,115,237,25,13,ES_NUMBER
-    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
+    RTEXT           "Mouse speed:",IDC_STATIC,13,237,70,10,SS_CENTERIMAGE
+    EDITTEXT        IDC_INPUTSPEEDM,97,237,25,13,ES_NUMBER
     CONTROL         "Install virtual mouse driver",IDC_PORT_TABLET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,9,270,116,11
+    RTEXT           "Mouse untrap mode:",IDC_STATIC,143,237,110,10,SS_CENTERIMAGE
+    COMBOBOX        IDC_MOUSE_UNTRAPMODE,268,234,119,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    RTEXT           "Magic Mouse cursor mode:",IDC_STATIC,143,253,110,10,SS_CENTERIMAGE
+    COMBOBOX        IDC_PORT_TABLET_CURSOR,268,251,119,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     CONTROL         "Full tablet input emulation",IDC_PORT_TABLET_FULL,
                     "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
-    CONTROL         "Mouse/Joystick autoswitching [] Press button to automatically insert inactive input device in to joystick/mouse port",IDC_PORT_AUTOSWITCH,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,136,102,172,11
 END
 
 IDD_CONTRIBUTORS DIALOGEX 0, 0, 530, 345
@@ -555,7 +575,6 @@ BEGIN
     PUSHBUTTON      "Contributors",IDC_CONTRIBUTORS,132,100,80,15
     CONTROL         "",IDC_AMIGAHOME,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,116,168,112,24
     CONTROL         "",IDC_WINUAEHOME,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,231,168,112,24
-    CONTROL         "",IDC_THEROOTS,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,117,225,112,24
     CONTROL         "",IDC_CAPS,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,174,196,112,24
     CONTROL         "",IDC_ABIME,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,60,196,112,24
     CONTROL         "",IDC_CLOANTOHOME,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,2,168,112,24
@@ -627,18 +646,18 @@ BEGIN
     EDITTEXT        IDC_RESERVED,347,111,40,15,ES_NUMBER
     RTEXT           "Block size:",IDC_BLOCKSIZE_TEXT,299,132,45,10
     EDITTEXT        IDC_BLOCKSIZE,347,130,40,15,ES_NUMBER
-    PUSHBUTTON      "RDB mode",IDC_HDF_RDB,135,109,75,14
     LTEXT           "HD Controller:",IDC_STATIC,10,113,54,10,SS_CENTERIMAGE
+    PUSHBUTTON      "RDB mode",IDC_HDF_RDB,135,109,75,14
+    COMBOBOX        IDC_HDF_FEATURE_LEVEL,214,109,75,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     COMBOBOX        IDC_HDF_CONTROLLER,6,131,152,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     COMBOBOX        IDC_HDF_CONTROLLER_UNIT,163,131,63,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     COMBOBOX        IDC_HDF_CONTROLLER_TYPE,231,131,58,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_HDF_FEATURE_LEVEL,214,109,75,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     EDITTEXT        IDC_HDFINFO,5,150,385,12,ES_CENTER | ES_READONLY
     EDITTEXT        IDC_HDFINFO2,5,166,385,12,ES_CENTER | ES_READONLY
     GROUPBOX        "New hard disk image file",IDC_STATIC,2,190,392,62
     PUSHBUTTON      "Create",IDC_HF_CREATE,58,206,80,14
     COMBOBOX        IDC_HF_TYPE,58,230,80,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    EDITTEXT        IDC_HF_SIZE,154,206,61,15,ES_NUMBER
+    EDITTEXT        IDC_HF_SIZE,154,206,61,15
     LTEXT           "MB",IDC_STATIC,220,209,53,10,SS_CENTERIMAGE
     EDITTEXT        IDC_HF_DOSTYPE,154,229,61,15
     LTEXT           "DOS type",IDC_STATIC,222,231,51,10,SS_CENTERIMAGE
@@ -683,7 +702,7 @@ BEGIN
     PUSHBUTTON      "Cancel",IDCANCEL,201,57,48,15
 END
 
-IDD_CHIPSET DIALOGEX 0, 0, 396, 192
+IDD_CHIPSET DIALOGEX 0, 0, 396, 287
 STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
 FONT 8, "MS Sans Serif", 0, 0, 0x0
 BEGIN
@@ -700,19 +719,20 @@ BEGIN
                     "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,114,31,86,10
     CONTROL         "NTSC [] North American and Japanese display standard, 60Hz refresh rate. Other countries use PAL (50Hz. display refresh rate)",IDC_NTSC,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,114,47,86,10
+    CONTROL         "Cycle-exact (Full) [] The most compatible A500/A1200 emulation mode.",IDC_CYCLEEXACT,
+                    "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,12,68,194,10
     CONTROL         "Cycle-exact (DMA/Memory accesses)",IDC_CYCLEEXACTMEMORY,
                     "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,12,81,194,10
     RTEXT           "Chipset Extra:",IDC_STATIC,72,108,71,15,SS_CENTERIMAGE
     COMBOBOX        IDC_CS_EXT,148,109,49,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     GROUPBOX        "Options",IDC_STATIC,221,0,173,137
+    CONTROL         "Keyboard connected",IDC_KEYBOARD_CONNECTED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,234,15,150,10
     CONTROL         "Immediate Blitter [] Faster but less compatible blitter emulation.",IDC_BLITIMM,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,234,16,150,10
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,234,47,150,10
     CONTROL         "Wait for Blitter [] Compatibility hack for programs that don't wait for the blitter correctly, causing graphics corruption if CPU is too fast.",IDC_BLITWAIT,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,234,29,150,10
-    CONTROL         "Genlock connected [] Allow boot sequence to detect genlock. Genlock is not emulated.",IDC_GENLOCK,
-                    "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,234,42,150,10
-    LTEXT           "Video port display hardware:",IDC_STATIC,237,97,117,15,SS_CENTERIMAGE
-    COMBOBOX        IDC_MONITOREMU,237,115,147,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,234,60,150,10
+    LTEXT           "Video port display hardware:",IDC_STATIC,237,91,117,15,SS_CENTERIMAGE
+    COMBOBOX        IDC_MONITOREMU,237,109,147,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     GROUPBOX        "Collision Level",IDC_STATIC,1,141,393,48
     CONTROL         "None [] Collision hardware emulation disabled.",IDC_COLLISION0,
                     "Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,47,157,101,10
@@ -722,11 +742,16 @@ BEGIN
                     "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,182,157,181,10
     CONTROL         "Full [] 100% collision hardware emulation. Only very few games need this option. Slowest.",IDC_COLLISION3,
                     "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,182,172,181,10
-    LTEXT           "Genlock emulation mode",IDC_STATIC,237,59,117,15,SS_CENTERIMAGE
-    COMBOBOX        IDC_GENLOCKMODE,237,77,103,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_GENLOCKMIX,346,77,38,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Cycle-exact (Full) [] The most compatible A500/A1200 emulation mode.",IDC_CYCLEEXACT,
-                    "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,12,68,194,10
+    GROUPBOX        "Genlock",IDC_STATIC,0,195,393,85
+    CONTROL         "Genlock connected [] Allow boot sequence to detect genlock.",IDC_GENLOCK,
+                    "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,13,211,109,10
+    COMBOBOX        IDC_GENLOCKMODE,129,209,192,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_GENLOCKMIX,330,209,54,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Include alpha channel in screenshots and video captures.",IDC_GENLOCK_ALPHA,
+                    "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,13,227,214,10
+    COMBOBOX        IDC_GENLOCKFILE,12,258,356,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "...",IDC_GENLOCKFILESELECT,375,257,10,15
+    CONTROL         "Keep aspect ratio",IDC_GENLOCK_KEEP_ASPECT,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,13,242,214,10
 END
 
 IDD_CHIPSET2 DIALOGEX 0, 0, 396, 305
@@ -736,41 +761,44 @@ BEGIN
     CONTROL         "Compatible Settings",IDC_CS_COMPATIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,6,234,10
     GROUPBOX        "Battery Backed Up Real Time Clock",IDC_STATIC,1,22,394,31
     CONTROL         "None",IDC_CS_RTC1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,15,36,57,10
-    CONTROL         "MSM6242B",IDC_CS_RTC2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,90,36,77,10
-    CONTROL         "RF5C01A",IDC_CS_RTC3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,171,36,67,10
-    CONTROL         "A2000 MSM6242B",IDC_CS_RTC4,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,242,36,78,10
+    CONTROL         "MSM6242B",IDC_CS_RTC2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,80,36,77,10
+    CONTROL         "RF5C01A",IDC_CS_RTC3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,165,36,67,10
+    CONTROL         "A2000 MSM6242B",IDC_CS_RTC4,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,240,36,78,10
     EDITTEXT        IDC_CS_RTCADJUST,325,34,64,13,ES_AUTOHSCROLL
     GROUPBOX        "CIA-A TOD Clock Source",IDC_STATIC,1,56,394,29
     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
+    CONTROL         "Power Supply 60Hz",IDC_CS_CIAA_TOD3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,248,68,116,10
     GROUPBOX        "Chipset Features",IDC_STATIC,0,88,395,128
-    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         "CIA ROM Overlay",IDC_CS_CIAOVERLAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,104,104,11
+    CONTROL         "CD32 CD",IDC_CS_CD32CD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,117,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
-    CONTROL         "CIA TOD bug",IDC_CS_CIATODBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,184,104,11
-    CONTROL         "1M Chip / 0.5M+0.5M",IDC_CS_1MCHIPJUMPER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,197,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         "ROM Mirror (E0)",IDC_CS_KSMIRROR_E0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,156,104,11
+    CONTROL         "KB Reset Warning",IDC_CS_RESETWARNING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,169,104,11
+    CONTROL         "CIA TOD bug",IDC_CS_CIATODBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,182,104,11
+    CONTROL         "1M Chip / 0.5M+0.5M",IDC_CS_1MCHIPJUMPER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,195,104,11
+    CONTROL         "A1000 Boot RAM/ROM",IDC_CS_A1000RAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,104,121,11
+    CONTROL         "CD32 C2P",IDC_CS_CD32C2P,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,117,121,11
+    CONTROL         "CDTV SRAM",IDC_CS_CDTVRAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,130,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         "Z3 Autoconfig",IDC_CS_Z3AUTOCONFIG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,184,104,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         "ROM Mirror (A8)",IDC_CS_KSMIRROR_A8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,156,121,11
+    CONTROL         "No-EHB Denise",IDC_CS_NOEHB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,169,121,11
+    CONTROL         "Z3 Autoconfig",IDC_CS_Z3AUTOCONFIG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,182,104,11
+    CONTROL         "Custom register byte write bug",IDC_CS_BYTECUSTOMWRITEBUG,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,195,130,11
+    CONTROL         "DF0: ID Hardware",IDC_CS_DF0IDHW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,104,125,11
+    CONTROL         "CD32 NVRAM",IDC_CS_CD32NVRAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,117,125,11
+    CONTROL         "CDTV SRAM Expansion",IDC_CS_CDTVRAMEXP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,130,125,11
     CONTROL         "CDTV-CR",IDC_CS_CDTVCR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,143,123,11
     CONTROL         "PCMCIA",IDC_CS_PCMCIA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,156,125,11
-    CONTROL         "C00000 is Fast RAM",IDC_CS_SLOWISFAST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,170,125,11
-    CONTROL         "A1000 Agnus (8361/8367)",IDC_CS_DIPAGNUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,184,125,11
+    CONTROL         "C00000 is Fast RAM",IDC_CS_SLOWISFAST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,169,125,11
+    CONTROL         "A1000 Agnus (8361/8367)",IDC_CS_DIPAGNUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,182,125,11
+    CONTROL         "Composite color burst",IDC_CS_COMPOSITECOLOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,195,125,12
     GROUPBOX        "Internal SCSI Hardware",IDC_STATIC,0,218,395,39
     CONTROL         "A3000 WD33C93 SCSI",IDC_CS_DMAC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,236,108,11
-    CONTROL         "CDTV WD33C93 SCSI",IDC_CS_CDTVSCSI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,236,121,11
-    CONTROL         "A4000T NCR53C710 SCSI",IDC_CS_DMAC2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,236,125,11
+    CONTROL         "A4000T NCR53C710 SCSI",IDC_CS_DMAC2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,130,236,125,11
+    CONTROL         "CDTV WD33C93 SCSI",IDC_CS_CDTVSCSI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,263,236,121,11
     GROUPBOX        "Chipset Revision",IDC_STATIC,1,259,393,46
     CONTROL         "Ramsey revision:",IDC_CS_RAMSEY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,34,275,97,11
     CONTROL         "Fat Gary revision:",IDC_CS_FATGARY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,34,289,97,11
@@ -780,9 +808,6 @@ BEGIN
     CONTROL         "Denise/Lisa revision:",IDC_CS_DENISE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,200,289,107,11
     EDITTEXT        IDC_CS_AGNUSREV,311,274,45,13,ES_AUTOHSCROLL
     EDITTEXT        IDC_CS_DENISEREV,311,289,45,13,ES_AUTOHSCROLL
-    CONTROL         "Custom register byte write bug",IDC_CS_BYTECUSTOMWRITEBUG,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,197,130,11
-    CONTROL         "Composite color burst",IDC_CS_COMPOSITECOLOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,196,125,12
 END
 
 IDD_AVIOUTPUT DIALOGEX 0, 0, 396, 260
@@ -894,7 +919,7 @@ BEGIN
     PUSHBUTTON      "Delete",IDC_FILTERPRESETDELETE,325,272,55,14
 END
 
-IDD_HARDDRIVE DIALOGEX 0, 0, 396, 109
+IDD_HARDDRIVE DIALOGEX 0, 0, 397, 136
 STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 CAPTION "Harddrive Settings"
 FONT 8, "MS Sans Serif", 0, 0, 0x0
@@ -903,13 +928,15 @@ BEGIN
     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,40,67,115,14
-    EDITTEXT        IDC_PATH_NAME,188,67,97,15,ES_AUTOHSCROLL | NOT WS_VISIBLE
+    DEFPUSHBUTTON   "Create hard disk image file",IDC_HARDDRIVE_IMAGE,5,67,158,14
+    EDITTEXT        IDC_PATH_NAME,178,67,97,15,ES_AUTOHSCROLL | NOT WS_VISIBLE
     CONTROL         "Read/write",IDC_HDF_RW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,315,71,60,10
-    COMBOBOX        IDC_HDF_CONTROLLER,8,89,164,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_HDF_CONTROLLER_UNIT,179,89,25,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    DEFPUSHBUTTON   "Add hard drive",IDOK,236,87,73,14
-    PUSHBUTTON      "Cancel",IDCANCEL,316,87,73,14
+    COMBOBOX        IDC_HDF_CONTROLLER_UNIT,65,90,97,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_HDF_CONTROLLER_TYPE,178,90,97,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_HDF_FEATURE_LEVEL,291,90,97,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_HDF_CONTROLLER,8,113,218,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    DEFPUSHBUTTON   "Add hard drive",IDOK,236,113,73,14
+    PUSHBUTTON      "Cancel",IDCANCEL,316,113,73,14
 END
 
 IDD_MISC2 DIALOGEX 0, 0, 396, 278
@@ -957,9 +984,6 @@ EXSTYLE WS_EX_ACCEPTFILES | WS_EX_CONTROLPARENT
 CAPTION "WinUAE Properties"
 FONT 8, "MS Sans Serif", 0, 0, 0x0
 BEGIN
-    CONTROL         "",IDC_PANELTREE,"SysTreeView32",TVS_HASLINES | TVS_SHOWSELALWAYS | TVS_TRACKSELECT | TVS_NOHSCROLL | WS_BORDER | WS_TABSTOP,3,5,110,321,WS_EX_CLIENTEDGE
-    GROUPBOX        "",IDC_PANEL_FRAME_OUTER,116,2,409,324
-    GROUPBOX        "",IDC_PANEL_FRAME,119,5,402,318,NOT WS_VISIBLE
     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
@@ -967,6 +991,9 @@ BEGIN
     DEFPUSHBUTTON   "OK",IDOK,375,328,47,14
     PUSHBUTTON      "Cancel",IDCANCEL,427,328,47,14
     PUSHBUTTON      "Help",IDHELP,479,328,47,14,WS_DISABLED
+    GROUPBOX        "",IDC_PANEL_FRAME_OUTER,116,2,409,324
+    GROUPBOX        "",IDC_PANEL_FRAME,119,5,402,318,NOT WS_VISIBLE
+    CONTROL         "",IDC_PANELTREE,"SysTreeView32",TVS_HASLINES | TVS_SHOWSELALWAYS | TVS_TRACKSELECT | TVS_NOHSCROLL | WS_BORDER | WS_TABSTOP,3,5,110,321,WS_EX_CLIENTEDGE
 END
 
 IDD_PATHS DIALOGEX 0, 0, 396, 303
@@ -1134,6 +1161,7 @@ FONT 8, "MS Sans Serif", 0, 0, 0x1
 BEGIN
     GROUPBOX        "RTG Graphics Card",IDC_STATIC,1,0,393,189
     COMBOBOX        IDC_RTG_Z2Z3,26,14,215,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_RTG_NUM,248,14,37,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     RTEXT           "VRAM size: [] Graphics card memory. Required for RTG (Picasso96) emulation.",IDC_GFXCARDTEXT,2,35,76,10,SS_NOTIFY | SS_CENTERIMAGE
     CONTROL         "",IDC_P96MEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,88,31,103,20
     EDITTEXT        IDC_P96RAM,201,34,40,12,ES_CENTER | ES_READONLY
@@ -1147,11 +1175,11 @@ BEGIN
     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
-    CTEXT           "Color modes:",IDC_STATIC,295,9,83,10,SS_CENTERIMAGE
-    COMBOBOX        IDC_RTG_8BIT,296,23,82,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_RTG_16BIT,296,40,82,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_RTG_24BIT,296,58,82,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_RTG_32BIT,296,75,82,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    CTEXT           "Color modes:",IDC_STATIC,295,18,83,10,SS_CENTERIMAGE
+    COMBOBOX        IDC_RTG_8BIT,296,33,82,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_RTG_16BIT,296,50,82,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_RTG_24BIT,296,68,82,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_RTG_32BIT,296,85,82,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     COMBOBOX        IDC_RTG_DISPLAYSELECT,11,125,371,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     CTEXT           "Refresh rate:",IDC_STATIC,30,149,83,10,SS_CENTERIMAGE
     COMBOBOX        IDC_RTG_VBLANKRATE,29,162,84,150,CBS_DROPDOWN | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
@@ -1170,13 +1198,14 @@ 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
-    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      "Exit",IDC_INPUTMAP_EXIT,338,324,80,14
+    COMBOBOX        IDC_INPUTMAPADD,2,309,247,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "Add Event",IDC_INPUTMAP_CUSTOM,253,308,79,14
+    PUSHBUTTON      "Autofire",IDC_INPUTMAP_SPECIALS,338,308,79,14
+    PUSHBUTTON      "Test",IDC_INPUTMAP_TEST,1,325,80,14
+    PUSHBUTTON      "Remap",IDC_INPUTMAP_CAPTURE,85,325,80,14
+    PUSHBUTTON      "Delete",IDC_INPUTMAP_DELETE,169,325,80,14
+    PUSHBUTTON      "Delete all",IDC_INPUTMAP_DELETEALL,253,325,80,14
+    PUSHBUTTON      "Exit",IDC_INPUTMAP_EXIT,338,325,79,14
 END
 
 IDD_INFOBOX DIALOGEX 0, 0, 420, 68
@@ -1193,7 +1222,7 @@ END
 
 IDD_LIST DIALOGEX 0, 0, 316, 206
 STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Select Qualifiers"
+CAPTION "Options"
 FONT 8, "MS Shell Dlg", 400, 0, 0x1
 BEGIN
     DEFPUSHBUTTON   "OK",IDOK,205,185,50,14
@@ -1243,55 +1272,42 @@ BEGIN
     EDITTEXT        IDC_DISKINFOBOX,5,4,481,292,ES_MULTILINE | ES_READONLY | WS_VSCROLL
 END
 
-IDD_EXPANSION2 DIALOGEX 0, 0, 396, 315
+IDD_EXPANSION2 DIALOGEX 0, 0, 396, 248
 STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
 FONT 8, "MS Sans Serif", 0, 0, 0x1
 BEGIN
-    RTEXT           "Accelerator board memory:",IDC_STATIC,155,144,104,15,SS_CENTERIMAGE
-    CONTROL         "",IDC_CPUBOARDMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,269,141,68,20
-    EDITTEXT        IDC_CPUBOARDRAM,343,146,40,12,ES_CENTER | ES_READONLY
-    COMBOBOX        IDC_CPUBOARD_TYPE,13,117,117,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_CPUBOARD_SUBTYPE,13,136,117,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     GROUPBOX        "Expansion Board Settings",IDC_STATIC,1,6,394,88
-    COMBOBOX        IDC_SCSIROMSELECTNUM,175,42,22,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_SCSIROMSELECTCAT,12,23,157,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
     COMBOBOX        IDC_SCSIROMSELECT,12,42,157,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Autoboot disabled",IDC_SCSIROMFILEAUTOBOOT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,62,99,12
-    RTEXT           "SCSI controller ID:",IDC_STATIC,241,23,110,15,SS_CENTERIMAGE
+    COMBOBOX        IDC_SCSIROMSUBSELECT,12,59,157,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_EXPANSIONBOARDITEMSELECTOR,12,76,157,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_SCSIROMSELECTNUM,175,42,22,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+    RTEXT           "Controller ID:",IDC_STATIC,241,23,110,15,SS_CENTERIMAGE
     COMBOBOX        IDC_SCSIROMID,356,24,29,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_SCSIROMFILE,202,42,171,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
     PUSHBUTTON      "...",IDC_SCSIROMCHOOSER,376,42,10,15
-    COMBOBOX        IDC_SCSIROMSUBSELECT,12,59,157,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "Accelerator board ROM file:",IDC_STATIC,203,104,170,15,SS_CENTERIMAGE
-    COMBOBOX        IDC_CPUBOARDROMFILE,202,119,169,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Autoboot disabled",IDC_SCSIROMFILEAUTOBOOT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,62,99,12
+    CONTROL         "",IDC_EXPANSIONBOARDCHECKBOX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,76,99,12
+    COMBOBOX        IDC_SCSIROMFILE,202,42,171,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX        "Accelerator Board Settings",IDC_STATIC,1,97,394,91
+    COMBOBOX        IDC_CPUBOARD_TYPE,13,118,117,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_CPUBOARD_SUBTYPE,13,137,117,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_ACCELERATORBOARDITEMSELECTOR,12,169,157,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+    RTEXT           "Accelerator board memory:",IDC_STATIC,155,145,104,15,SS_CENTERIMAGE
+    LTEXT           "Accelerator board ROM file:",IDC_STATIC,203,105,170,15,SS_CENTERIMAGE
+    COMBOBOX        IDC_CPUBOARDROMFILE,202,120,169,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
     PUSHBUTTON      "...",IDC_CPUBOARDROMCHOOSER,376,119,10,15
-    GROUPBOX        "Accelerator Board Settings",IDC_STATIC,1,96,394,97
-    GROUPBOX        "Miscellaneous Expansions",IDC_STATIC,1,199,172,113
-    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,218,147,11
-    CONTROL         "uaescsi.device",IDC_SCSIDEVICE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,231,147,11
-    CONTROL         "CD32 Full Motion Video cartridge",IDC_CS_CD32FMV,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,244,151,11
-    CONTROL         "Toccata Z2 sound card emulation",IDC_CS_TOCCATA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,257,151,11
-    CONTROL         "Toccata Paula/CD audio mix",IDC_CS_TOCCATAMIXER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,270,151,11
-    GROUPBOX        "Network",IDC_STATIC,181,199,213,113
+    CONTROL         "",IDC_CPUBOARDMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,269,143,68,20
+    EDITTEXT        IDC_CPUBOARDRAM,343,147,40,12,ES_CENTER | ES_READONLY
+    CONTROL         "",IDC_ACCELERATORBOARDCHECKBOX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,170,99,12
+    GROUPBOX        "Miscellaneous Expansions",IDC_STATIC,1,192,394,51
     CONTROL         "bsdsocket.library [] bsdsocket network library emulation.",IDC_SOCKETS,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,217,187,11
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,207,187,11
+    CONTROL         "uaescsi.device",IDC_SCSIDEVICE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,223,147,11
     CONTROL         "uaenet.device [] Sana 2 compatible network device emulation.",IDC_SANA2,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,231,187,11
-    CONTROL         "A2065 Z2 [] A2065 Ethernet Zorro II card emulation.",IDC_A2065,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,244,187,11
-    COMBOBOX        IDC_NETDEVICE,202,274,178,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Include host SCSI devices",IDC_CS_SCSIMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,296,147,11
-    CONTROL         "Realtek 8029 PCI [] Realtek 8029 PCI NIC emulation",IDC_NE2000,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,257,187,11
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,193,207,187,11
+    CONTROL         "CD32 Full Motion Video cartridge",IDC_CS_CD32FMV,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,193,223,151,11
     CONTROL         "Enabled",IDC_SCSIROMSELECTED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,43,99,12
-    COMBOBOX        IDC_SCSIROMSELECTCAT,12,23,157,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "ES1370 PCI sound card",IDC_CS_ES1370,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,283,151,11
-    CONTROL         "FM801 PCI sound card",IDC_CS_FM801,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,296,151,11
-    COMBOBOX        IDC_EXPANSIONBOARDITEMSELECTOR,12,76,157,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "",IDC_EXPANSIONBOARDCHECKBOX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,76,99,12
     COMBOBOX        IDC_EXPANSIONBOARDSELECTOR,202,76,171,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
-    COMBOBOX        IDC_ACCELERATORBOARDITEMSELECTOR,12,168,157,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "",IDC_ACCELERATORBOARDCHECKBOX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,169,99,12
     COMBOBOX        IDC_ACCELERATORBOARDSELECTOR,202,169,171,75,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
 END
 
@@ -1302,8 +1318,8 @@ END
 //
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 3,3,0,0
- PRODUCTVERSION 3,3,0,0
+ FILEVERSION 3,4,0,0
+ PRODUCTVERSION 3,4,0,0
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -1319,12 +1335,12 @@ BEGIN
         BLOCK "040904b0"
         BEGIN
             VALUE "FileDescription", "WinUAE"
-            VALUE "FileVersion", "3.3.0.0"
+            VALUE "FileVersion", "3.4.0.0"
             VALUE "InternalName", "WinUAE"
             VALUE "LegalCopyright", "© 1996-2016 under the GNU Public License (GPL)"
             VALUE "OriginalFilename", "WinUAE.exe"
             VALUE "ProductName", "WinUAE"
-            VALUE "ProductVersion", "3.3.0.0"
+            VALUE "ProductVersion", "3.4.0.0"
         END
     END
     BLOCK "VarFileInfo"
@@ -1430,6 +1446,10 @@ END
 #ifdef APSTUDIO_INVOKED
 GUIDELINES DESIGNINFO
 BEGIN
+    IDD_BOARDS, DIALOG
+    BEGIN
+    END
+
     IDD_KICKSTART, DIALOG
     BEGIN
         BOTTOMMARGIN, 258
@@ -1441,6 +1461,7 @@ BEGIN
 
     IDD_MEMORY, DIALOG
     BEGIN
+        BOTTOMMARGIN, 265
     END
 
     IDD_CPU, DIALOG
@@ -1504,6 +1525,7 @@ BEGIN
 
     IDD_CHIPSET, DIALOG
     BEGIN
+        BOTTOMMARGIN, 280
     END
 
     IDD_CHIPSET2, DIALOG
@@ -1524,6 +1546,7 @@ BEGIN
 
     IDD_HARDDRIVE, DIALOG
     BEGIN
+        RIGHTMARGIN, 396
     END
 
     IDD_MISC2, DIALOG
@@ -1602,6 +1625,31 @@ END
 #endif    // APSTUDIO_INVOKED
 
 
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE 
+BEGIN
+    "\0"
+END
+
+3 TEXTINCLUDE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
 /////////////////////////////////////////////////////////////////////////////
 //
 // String Table
@@ -1636,6 +1684,7 @@ BEGIN
     IDS_GAMEPORTS           "Game ports"
     IDS_EXPANSION           "RTG board"
     IDS_EXPANSION2          "Expansions"
+    IDS_BOARD               "Hardware info"
 END
 
 STRINGTABLE
@@ -1987,7 +2036,7 @@ BEGIN
     IDS_WSTYLE_STANDARD     "Standard"
     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\nOne second reboot pause\nFaster RTG\nClipboard sharing\nAllow native code\n"
+    IDS_MISCLISTITEMS2      "Main window always on top\nGUI window always on top\nDisable screensaver\nSynchronize clock\nOne second reboot pause\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\nBlack frame insertion\nMaster floppy write protection\nMaster harddrive 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."
@@ -2013,47 +2062,14 @@ BEGIN
                             "PPC native OS booted with incompatible UAE boot ROM enabled.\nSelect ROM panel ""New UAE (128k, ROM, Indirect)"" option\nor disable all UAE expansions.\n"
     IDS_AUTOSCALE_OVERSCAN_BLANK "Overscan blanking"
     IDS_SCREEN_ADAPTIVE_SYNC "Variable Sync"
+    IDS_NUMSG_NOMEMORY      "Out of memory or too much Z3 autoconfig space configured.\nIf 64-bit, make sure RTG board is first in board list."
+    IDS_EXPANSION_CATEGORY  "Built-in expansions\nSCSI controllers\nIDE controllers\nSASI controllers\nCustom controllers\nPCI bridgeboards\nx86 bridgeboards\nGraphics boards\nSound cards\nNetwork adapters\nDisk controllers"
 END
 
 #endif    // English resources
 /////////////////////////////////////////////////////////////////////////////
 
 
-/////////////////////////////////////////////////////////////////////////////
-// Finnish (Finland) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FIN)
-LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT
-#pragma code_page(1252)
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE 
-BEGIN
-    "resource.h\0"
-END
-
-2 TEXTINCLUDE 
-BEGIN
-    "\0"
-END
-
-3 TEXTINCLUDE 
-BEGIN
-    "\r\n"
-    "\0"
-END
-
-#endif    // APSTUDIO_INVOKED
-
-#endif    // Finnish (Finland) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
 
 #ifndef APSTUDIO_INVOKED
 /////////////////////////////////////////////////////////////////////////////
index aa20471efc390232fea09a1771e39df4c67a86de..9a77eae575b800121bd7e436bfea089f507b4a15 100644 (file)
@@ -387,8 +387,8 @@ static void checksend(void)
                return;
 
 #ifdef ARCADIA
-       if (alg_flag) {
-               alg_serial_read(serdatshift);
+       if (alg_flag || currprefs.genlock_image >= 7) {
+               ld_serial_read(serdatshift);
        }
 #endif
 #ifdef SERIAL_MAP
@@ -486,7 +486,7 @@ static void serdatcopy(void)
        }
 
        // if someone uses serial port as some kind of timer..
-       if (currprefs.cpu_cycle_exact) {
+       if (currprefs.cpu_memory_cycle_exact) {
                int per;
 
                bits = 16 + 1;
@@ -521,8 +521,8 @@ void serial_hsynchandler (void)
        hsyncstuff();
 #endif
 #ifdef ARCADIA
-       if (alg_flag && !data_in_serdatr) {
-               int ch = alg_serial_write();
+       if ((alg_flag || currprefs.genlock_image >= 7) && !data_in_serdatr) {
+               int ch = ld_serial_write();
                if (ch >= 0) {
                        serdatr = ch | 0x100;
                        data_in_serdatr = 1;
index baba2e5762169562f59ee2f81a391e46315109d8..9af217ed5a1b259cb36353ca034e50268b8d89c7 100644 (file)
@@ -20,7 +20,6 @@
 #endif
 #define WINDOWS
 #define ZLIB_WINAPI
-//#define USE_SOFT_LONG_DOUBLE
 #define PACKAGE_STRING "WinUAE"
 
 #ifndef UAE_MINI
index b8c61391e7d05e3f1b648aafa34a71dfe6289e67..bca67af25a7a84e159983e7b7b0d22760b1a9d44 100644 (file)
@@ -2974,7 +2974,7 @@ void logging_init (void)
                SystemInfo.wProcessorArchitecture, SystemInfo.wProcessorLevel, SystemInfo.wProcessorRevision,
                SystemInfo.dwNumberOfProcessors, filedate, os_touch);
        write_log (_T("\n(c) 1995-2001 Bernd Schmidt   - Core UAE concept and implementation.")
-               _T("\n(c) 1998-2016 Toni Wilen      - Win32 port, core code updates.")
+               _T("\n(c) 1998-2017 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.")
@@ -5433,6 +5433,7 @@ extern int fakemodewaitms;
 extern float sound_sync_multiplier;
 extern int log_cd32;
 extern int scanline_adjust;
+extern int log_ld;
 
 extern DWORD_PTR cpu_affinity, cpu_paffinity;
 static DWORD_PTR original_affinity = -1;
@@ -5810,6 +5811,10 @@ static int parseargs (const TCHAR *argx, const TCHAR *np, const TCHAR *np2)
                slirp_debug = getval (np);
                return 2;
        }
+       if (!_tcscmp (arg, _T("ldlog"))) {
+               log_ld = getval (np);
+               return 2;
+       }
        if (!_tcscmp (arg, _T("vsyncbusywait"))) {
                vsync_busy_wait_mode = getval (np);
                return 2;
index b3b7f215be72b6e92fc93882634b8f714bae2772..c3a8e5a1185ab330e6f075c00982a89ad9a53e71 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
 #define LANG_DLL_FULL_VERSION_MATCH 1
 
 #if WINUAEPUBLICBETA
-#define WINUAEBETA _T("0")
+#define WINUAEBETA _T("1")
 #else
 #define WINUAEBETA _T("")
 #endif
 
-#define WINUAEDATE MAKEBD(2016, 12, 21)
+#define WINUAEDATE MAKEBD(2017, 2, 11)
 
 //#define WINUAEEXTRA _T("AmiKit Preview")
 //#define WINUAEEXTRA _T("Amiga Forever Edition")
index 0268857b7404db63afa734cc1ec630595293a256..45d9c7fbafecb09b61cf83242b9b924798278595 100644 (file)
@@ -120,11 +120,13 @@ static int getidfromhandle (HANDLE h)
        return drvnum;
 }
 
+HANDLE hdf_get_real_handle(struct hardfilehandle *h);
+
 static int hfdcheck (TCHAR drive)
 {
        HANDLE h;
        TCHAR tmp[16];
-       int disknum, i;
+       int disknum;
 
        _stprintf (tmp, _T("\\\\.\\%c:"), drive);
        h = CreateFile (tmp, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
@@ -132,14 +134,19 @@ static int hfdcheck (TCHAR drive)
                return 0;
        disknum = getidfromhandle (h);
        CloseHandle (h);
-       for (i = 0; i < MAX_FILESYSTEM_UNITS; i++) {
+#if 0
+       for (int i = 0; i < MAX_FILESYSTEM_UNITS; i++) {
                struct hardfiledata *hfd = get_hardfile_data (i);
                int reopen = 0;
                if (!hfd || !(hfd->flags & HFD_FLAGS_REALDRIVE) || !hfd->handle_valid)
                        continue;
-               if (getidfromhandle (hfd->handle) == disknum)
-                       return 1;
+               HANDLE h2 = hdf_get_real_handle(hfd->handle);
+               if (h2) {
+                       if (getidfromhandle (h2) == disknum)
+                               return 1;
+               }
        }
+#endif
        return 0;
 }
 
index 7d79b1b1f69e4be674623585c8cf12a83612a34c..0f05e7f1ca477f586c2a8dd42acb7166a6aa4a83 100644 (file)
@@ -1899,7 +1899,7 @@ static int scan_roms_2 (UAEREG *fkey, const TCHAR *path, bool deepscan, int leve
                                ret = 1;
                } else if (deepscan && (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
                        if (recursiveromscan < 0 || recursiveromscan > level) {
-                               if (_tcsicmp(find_data.cFileName, _T(".")) && _tcsicmp(find_data.cFileName, _T(".."))) {
+                               if (find_data.cFileName[0] != '.') {
                                        _tcscat(tmppath, _T("\\"));
                                        scan_roms_2(fkey, tmppath, deepscan, level + 1);
                                }
@@ -2470,7 +2470,7 @@ static void selectgenlock(struct uae_prefs *prefs, HWND hDlg, int id, const TCHA
                _tcscpy(prefs->genlock_image_file, full_path);
                fullpath(prefs->genlock_image_file, sizeof prefs->genlock_image_file / sizeof(TCHAR));
                DISK_history_add(prefs->genlock_image_file, -1, HISTORY_GENLOCK_IMAGE, 0);
-       } else if (workprefs.genlock_image == 4 || workprefs.genlock_image == 6) {
+       } else if (workprefs.genlock_image == 4 || workprefs.genlock_image >= 6) {
                _tcscpy(prefs->genlock_video_file, full_path);
                fullpath(prefs->genlock_video_file, sizeof prefs->genlock_video_file / sizeof(TCHAR));
                DISK_history_add(prefs->genlock_video_file, -1, HISTORY_GENLOCK_VIDEO, 0);
@@ -2528,6 +2528,8 @@ static void setdpath (const TCHAR *name, const TCHAR *path)
 // flag = 18 for Tape image
 // flag = 20 for genlock image
 // flag = 21 for genlock video
+// flag = 22 for floppy replacement (missing statefile)
+
 int DiskSelection_2 (HWND hDlg, WPARAM wParam, int flag, struct uae_prefs *prefs, TCHAR *path_out, int *multi)
 {
        static int previousfilter[20];
@@ -2560,6 +2562,7 @@ int DiskSelection_2 (HWND hDlg, WPARAM wParam, int flag, struct uae_prefs *prefs
                {
                case 0:
                case 1:
+               case 22:
                        getfilter (flag, _T("FloppyPath"), previousfilter, filtername);
                        fetch_path (_T("FloppyPath"), init_path, sizeof (init_path) / sizeof (TCHAR));
                        guid = &diskselectionguids[0];
@@ -2648,6 +2651,13 @@ int DiskSelection_2 (HWND hDlg, WPARAM wParam, int flag, struct uae_prefs *prefs
                memcpy (szFilter + _tcslen (szFilter), DISK_FORMAT_STRING, sizeof (DISK_FORMAT_STRING) + sizeof (TCHAR));
                defext = _T("adf");
                break;
+       case 22:
+               _tcscpy(szTitle, prefs->floppyslots[wParam - IDC_DF0].df);
+               WIN32GUI_LoadUIString (IDS_ADF, szFormat, MAX_DPATH);
+               _stprintf (szFilter, _T("%s "), szFormat);
+               memcpy (szFilter + _tcslen (szFilter), DISK_FORMAT_STRING, sizeof (DISK_FORMAT_STRING) + sizeof (TCHAR));
+               defext = _T("adf");
+               break;
        case 1:
                WIN32GUI_LoadUIString (IDS_CHOOSEBLANK, szTitle, MAX_DPATH);
                WIN32GUI_LoadUIString (IDS_ADF, szFormat, MAX_DPATH);
@@ -2977,7 +2987,7 @@ int DiskSelection_2 (HWND hDlg, WPARAM wParam, int flag, struct uae_prefs *prefs
                        break;
                }
                if (!nosavepath || 1) {
-                       if (flag == 0 || flag == 1) {
+                       if (flag == 0 || flag == 1 || flag == 22) {
                                amiga_path = _tcsstr (openFileName.lpstrFile, openFileName.lpstrFileTitle);
                                if (amiga_path && amiga_path != openFileName.lpstrFile) {
                                        *amiga_path = 0;
@@ -4108,7 +4118,7 @@ static int inputmap_handle (HWND list, int currentdevnum, int currentwidgetnum,
                                                                                        }
                                                                                }
                                                                                if (list) {
-                                                                                       inputdevice_get_widget_type (devnum, j, name);
+                                                                                       inputdevice_get_widget_type (devnum, j, name, false);
                                                                                        TCHAR target[MAX_DPATH];
                                                                                        _tcscpy (target, name);
                                                                                        _tcscat (target, _T(", "));
@@ -4510,7 +4520,7 @@ void InitializeListView (HWND hDlg)
 
                for (i = 0; input_total_devices && i < inputdevice_get_widget_num (input_selected_device); i++) {
                        TCHAR name[100];
-                       inputdevice_get_widget_type (input_selected_device, i, name);
+                       inputdevice_get_widget_type (input_selected_device, i, name, true);
                        lvstruct.mask     = LVIF_TEXT | LVIF_PARAM;
                        lvstruct.pszText  = name;
                        lvstruct.lParam   = 0;
@@ -6122,11 +6132,11 @@ static struct amigamodels amodels[] = {
        { 4, IDS_QS_MODEL_A500P }, // "Amiga 500+"
        { 4, IDS_QS_MODEL_A600 }, // "Amiga 600"
        { 4, IDS_QS_MODEL_A1000 }, // "Amiga 1000"
-       { 4, IDS_QS_MODEL_A1200 }, // "Amiga 1200"
+       { 5, IDS_QS_MODEL_A1200 }, // "Amiga 1200"
        { 2, IDS_QS_MODEL_A3000 }, // "Amiga 3000"
        { 1, IDS_QS_MODEL_A4000 }, // "Amiga 4000"
        { 0, }, //{ 1, IDS_QS_MODEL_A4000T }, // "Amiga 4000T"
-       { 3, IDS_QS_MODEL_CD32 }, // "CD32"
+       { 4, IDS_QS_MODEL_CD32 }, // "CD32"
        { 4, IDS_QS_MODEL_CDTV }, // "CDTV"
        { 4, IDS_QS_MODEL_ARCADIA }, // "Arcadia"
        { 1, IDS_QS_MODEL_UAE }, // "Expanded UAE example configuration"
@@ -6703,8 +6713,8 @@ static void enable_for_chipsetdlg (HWND hDlg)
        ew(hDlg, IDC_GENLOCKMIX, workprefs.genlock ? TRUE : FALSE);
        ew(hDlg, IDC_GENLOCK_ALPHA, workprefs.genlock ? TRUE : FALSE);
        ew(hDlg, IDC_GENLOCK_KEEP_ASPECT, workprefs.genlock ? TRUE : FALSE);
-       ew(hDlg, IDC_GENLOCKFILE, workprefs.genlock && (workprefs.genlock_image ==6 || (workprefs.genlock_image >= 3 && workprefs.genlock_image < 5)) ? TRUE : FALSE);
-       ew(hDlg, IDC_GENLOCKFILESELECT, workprefs.genlock && (workprefs.genlock_image ==6 || (workprefs.genlock_image >= 3 && workprefs.genlock_image < 5)) ? TRUE : FALSE);
+       ew(hDlg, IDC_GENLOCKFILE, workprefs.genlock && (workprefs.genlock_image >= 6 || (workprefs.genlock_image >= 3 && workprefs.genlock_image < 5)) ? TRUE : FALSE);
+       ew(hDlg, IDC_GENLOCKFILESELECT, workprefs.genlock && (workprefs.genlock_image >= 6 || (workprefs.genlock_image >= 3 && workprefs.genlock_image < 5)) ? TRUE : FALSE);
 }
 
 static const int fakerefreshrates[] = { 50, 60, 100, 120, 0 };
@@ -7800,7 +7810,7 @@ static void setgenlock(HWND hDlg)
        setautocomplete(hDlg, IDC_GENLOCKFILE);
        if (workprefs.genlock_image == 3) {
                addhistorymenu(hDlg, workprefs.genlock_image_file, IDC_GENLOCKFILE, HISTORY_GENLOCK_IMAGE, true);
-       } else if (workprefs.genlock_image == 4 || workprefs.genlock_image == 6) {
+       } else if (workprefs.genlock_image == 4 || workprefs.genlock_image >= 6) {
                addhistorymenu(hDlg, workprefs.genlock_video_file, IDC_GENLOCKFILE, HISTORY_GENLOCK_VIDEO, true);
        }
 }
@@ -7842,6 +7852,8 @@ static INT_PTR CALLBACK ChipsetDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPAR
                SendDlgItemMessage(hDlg, IDC_GENLOCKMODE, CB_ADDSTRING, 0, (LPARAM)_T("Video file"));
                SendDlgItemMessage(hDlg, IDC_GENLOCKMODE, CB_ADDSTRING, 0, (LPARAM)_T("Capture device"));
                SendDlgItemMessage(hDlg, IDC_GENLOCKMODE, CB_ADDSTRING, 0, (LPARAM)_T("American Laser Games LaserDisc Player"));
+               SendDlgItemMessage(hDlg, IDC_GENLOCKMODE, CB_ADDSTRING, 0, (LPARAM)_T("Sony LaserDisc Player"));
+               SendDlgItemMessage(hDlg, IDC_GENLOCKMODE, CB_ADDSTRING, 0, (LPARAM)_T("Pioneer LaserDisc Player"));
 
                SendDlgItemMessage(hDlg, IDC_GENLOCKMIX, CB_RESETCONTENT, 0, 0);
                for (int i = 0; i <= 10; i++) {
@@ -11300,6 +11312,7 @@ static void enable_for_cpudlg (HWND hDlg)
        ew (hDlg, IDC_COMPATIBLE, !workprefs.cpu_memory_cycle_exact && !(workprefs.cachesize && workprefs.cpu_model >= 68040));
        ew (hDlg, IDC_COMPATIBLE_FPU, workprefs.fpu_model > 0);
        ew (hDlg, IDC_FPU_UNIMPLEMENTED, workprefs.fpu_model && !workprefs.cachesize);
+       ew (hDlg, IDC_FPU_SOFTFLOAT, workprefs.fpu_model && (!workprefs.compfpu || !workprefs.cachesize));
        ew (hDlg, IDC_CPU_UNIMPLEMENTED, workprefs.cpu_model == 68060 && !workprefs.cachesize);
 #if 0
        ew (hDlg, IDC_CPU_MULTIPLIER, workprefs.cpu_cycle_exact);
@@ -11346,6 +11359,7 @@ static void values_to_cpudlg (HWND hDlg)
        CheckDlgButton (hDlg, IDC_COMPATIBLE24, workprefs.address_space_24);
        CheckDlgButton (hDlg, IDC_COMPATIBLE_FPU, workprefs.fpu_strict);
        CheckDlgButton (hDlg, IDC_FPU_UNIMPLEMENTED, !workprefs.fpu_no_unimplemented || workprefs.cachesize);
+       CheckDlgButton (hDlg, IDC_FPU_SOFTFLOAT, workprefs.fpu_softfloat);
        CheckDlgButton (hDlg, IDC_CPU_UNIMPLEMENTED, !workprefs.int_no_unimplemented || workprefs.cachesize);
        SendDlgItemMessage (hDlg, IDC_CPUIDLE, TBM_SETPOS, TRUE, workprefs.cpu_idle == 0 ? 0 : 12 - workprefs.cpu_idle / 15);
        SendDlgItemMessage (hDlg, IDC_PPC_CPUIDLE, TBM_SETPOS, TRUE, workprefs.ppc_cpu_idle);
@@ -11405,6 +11419,7 @@ static void values_from_cpudlg (HWND hDlg)
        workprefs.cpu_compatible = workprefs.cpu_memory_cycle_exact | (ischecked (hDlg, IDC_COMPATIBLE) ? 1 : 0);
        workprefs.fpu_strict = ischecked (hDlg, IDC_COMPATIBLE_FPU) ? 1 : 0;
        workprefs.fpu_no_unimplemented = ischecked (hDlg, IDC_FPU_UNIMPLEMENTED) ? 0 : 1;
+       workprefs.fpu_softfloat = ischecked (hDlg, IDC_FPU_SOFTFLOAT) ? 1 : 0;
        workprefs.int_no_unimplemented = ischecked (hDlg, IDC_CPU_UNIMPLEMENTED) ? 0 : 1;
        workprefs.address_space_24 = ischecked (hDlg, IDC_COMPATIBLE24) ? 1 : 0;
        workprefs.m68k_speed = ischecked (hDlg, IDC_CS_HOST) ? -1 : 0;
@@ -11500,8 +11515,13 @@ static void values_from_cpudlg (HWND hDlg)
                workprefs.comptrustlong = trust_prev;
                workprefs.comptrustnaddr = trust_prev;
        }
-       if (!workprefs.cachesize)
+       if (!workprefs.cachesize) {
                setchecked (hDlg, IDC_JITENABLE, false);
+       }
+       if (workprefs.cachesize && workprefs.compfpu && workprefs.fpu_softfloat) {
+               workprefs.fpu_softfloat = false;
+               setchecked(hDlg, IDC_FPU_SOFTFLOAT, false);
+       }
        if (oldcache == 0 && workprefs.cachesize > 0) {
                canbang = 1;
        }
@@ -12838,6 +12858,8 @@ static INT_PTR CALLBACK TapeDriveSettingsProc (HWND hDlg, UINT msg, WPARAM wPara
                                if (posn != CB_ERR) {
                                        current_tapedlg.ci.controller_type = posn % HD_CONTROLLER_NEXT_UNIT;
                                        current_tapedlg.ci.controller_type_unit = posn / HD_CONTROLLER_NEXT_UNIT;
+                                       if (current_tapedlg.ci.controller_type == HD_CONTROLLER_TYPE_PCMCIA)
+                                               current_tapedlg.ci.controller_type_unit = 1;
                                        inithdcontroller(hDlg, current_tapedlg.ci.controller_type, current_tapedlg.ci.controller_type_unit, UAEDEV_TAPE);
                                        SendDlgItemMessage(hDlg, IDC_HDF_CONTROLLER_UNIT, CB_SETCURSEL, current_tapedlg.ci.controller_type != HD_CONTROLLER_TYPE_PCMCIA ? current_tapedlg.ci.controller_unit : current_tapedlg.ci.controller_type_unit, 0);
                                }
@@ -12952,6 +12974,8 @@ static INT_PTR CALLBACK CDDriveSettingsProc (HWND hDlg, UINT msg, WPARAM wParam,
                        if (posn != CB_ERR) {
                                current_cddlg.ci.controller_type = posn % HD_CONTROLLER_NEXT_UNIT;
                                current_cddlg.ci.controller_type_unit = posn / HD_CONTROLLER_NEXT_UNIT;
+                               if (current_cddlg.ci.controller_type == HD_CONTROLLER_TYPE_PCMCIA)
+                                       current_cddlg.ci.controller_type_unit = 1;
                                inithdcontroller(hDlg, current_cddlg.ci.controller_type, current_cddlg.ci.controller_type_unit, UAEDEV_CD);
                                SendDlgItemMessage(hDlg, IDC_HDF_CONTROLLER_UNIT, CB_SETCURSEL, current_cddlg.ci.controller_type != HD_CONTROLLER_TYPE_PCMCIA ? current_cddlg.ci.controller_unit : current_cddlg.ci.controller_type_unit, 0);
                        }
@@ -13090,6 +13114,8 @@ static INT_PTR CALLBACK HardfileSettingsProc (HWND hDlg, UINT msg, WPARAM wParam
                                if (posn != CB_ERR) {
                                        current_hfdlg.ci.controller_type = posn % HD_CONTROLLER_NEXT_UNIT;
                                        current_hfdlg.ci.controller_type_unit = posn / HD_CONTROLLER_NEXT_UNIT;
+                                       if (current_hfdlg.ci.controller_type == HD_CONTROLLER_TYPE_PCMCIA)
+                                               current_hfdlg.ci.controller_type_unit = 1;
                                        inithdcontroller(hDlg, current_hfdlg.ci.controller_type, current_hfdlg.ci.controller_type_unit, UAEDEV_HDF);
                                        sethardfile(hDlg);
                                }
@@ -13273,6 +13299,7 @@ static INT_PTR CALLBACK HarddriveSettingsProc (HWND hDlg, UINT msg, WPARAM wPara
                        sethardfiletypes(hDlg);
                        inithdcontroller(hDlg, current_hfdlg.ci.controller_type, current_hfdlg.ci.controller_type_unit, UAEDEV_HDF);
                        CheckDlgButton (hDlg, IDC_HDF_RW, !current_hfdlg.ci.readonly);
+                       CheckDlgButton (hDlg, IDC_HDF_LOCK, current_hfdlg.ci.lock);
                        SendDlgItemMessage (hDlg, IDC_HARDDRIVE, CB_RESETCONTENT, 0, 0);
                        ew (hDlg, IDC_HARDDRIVE_IMAGE, FALSE);
                        ew (hDlg, IDOK, FALSE);
@@ -13321,6 +13348,14 @@ static INT_PTR CALLBACK HarddriveSettingsProc (HWND hDlg, UINT msg, WPARAM wPara
                                        current_hfdlg.ci.readonly = (ischecked (hDlg, IDC_HDF_RW) && !dang) ? false : true;
                                }
                                break;
+                       case IDC_HDF_LOCK:
+                               posn = SendDlgItemMessage (hDlg, IDC_HARDDRIVE, CB_GETCURSEL, 0, 0);
+                               if (posn != CB_ERR) {
+                                       int dang = 1;
+                                       hdf_getnameharddrive (posn, 1, NULL, &dang);
+                                       current_hfdlg.ci.lock = ischecked (hDlg, IDC_HDF_LOCK);
+                               }
+                               break;
                        }
                }
                if (LOWORD (wParam) == IDC_HARDDRIVE) {
@@ -14165,6 +14200,14 @@ static int getfloppybox (HWND hDlg, int f_text, TCHAR *out, int maxlen, int type
        return out[0] ? 1 : 0;
 }
 
+bool gui_ask_disk(int drv, TCHAR *name)
+{
+       _tcscpy(changed_prefs.floppyslots[drv].df, name);
+       DiskSelection (hAmigaWnd, IDC_DF0 + drv, 22, &changed_prefs, 0);
+       _tcscpy(name, changed_prefs.floppyslots[drv].df);
+       return true;
+}
+
 static void getfloppyname (HWND hDlg, int n, int cd, int f_text)
 {
        TCHAR tmp[MAX_DPATH];
@@ -16110,7 +16153,7 @@ static void CALLBACK timerfunc (HWND hDlg, UINT uMsg, UINT_PTR idEvent, DWORD dw
                        int od = input_selected_device;
                        input_selected_device = devnum;
                        input_selected_widget = wtype;
-                       int type = inputdevice_get_widget_type (input_selected_device, input_selected_widget, NULL);
+                       int type = inputdevice_get_widget_type (input_selected_device, input_selected_widget, NULL, false);
 
                        if (inputmap == 3) { // ports panel / add custom
                                int mode;
@@ -16170,7 +16213,7 @@ static void CALLBACK timerfunc (HWND hDlg, UINT uMsg, UINT_PTR idEvent, DWORD dw
                                found = 0;
                                for (int i = 0; i < wcnt; i++) {
                                        input_selected_widget = widgets[i];
-                                       type = inputdevice_get_widget_type (input_selected_device, input_selected_widget, NULL);
+                                       type = inputdevice_get_widget_type (input_selected_device, input_selected_widget, NULL, false);
                                        if (type == IDEV_WIDGET_BUTTONAXIS) {
                                                found = 1;
                                                break;
@@ -16179,7 +16222,7 @@ static void CALLBACK timerfunc (HWND hDlg, UINT uMsg, UINT_PTR idEvent, DWORD dw
                                if (!found) {
                                        for (int i = 0; i < wcnt; i++) {
                                                input_selected_widget = widgets[i];
-                                               type = inputdevice_get_widget_type (input_selected_device, input_selected_widget, NULL);
+                                               type = inputdevice_get_widget_type (input_selected_device, input_selected_widget, NULL, false);
                                                if (type == IDEV_WIDGET_AXIS) {
                                                        found = 2;
                                                        break;
@@ -16188,7 +16231,7 @@ static void CALLBACK timerfunc (HWND hDlg, UINT uMsg, UINT_PTR idEvent, DWORD dw
                                }
 
                                for (int i = 0; i < wcnt; i++) {
-                                       int typex = inputdevice_get_widget_type (input_selected_device, widgets[i], NULL);
+                                       int typex = inputdevice_get_widget_type (input_selected_device, widgets[i], NULL, false);
                                        if (typex == IDEV_WIDGET_AXIS) {
                                                if (!found) {
                                                        found = 1;
@@ -16206,7 +16249,7 @@ static void CALLBACK timerfunc (HWND hDlg, UINT uMsg, UINT_PTR idEvent, DWORD dw
                                if (!found) {
                                        for (int i = 0; i < wcnt; i++) {
                                                input_selected_widget = widgets[i];
-                                               type = inputdevice_get_widget_type (input_selected_device, input_selected_widget, NULL);
+                                               type = inputdevice_get_widget_type (input_selected_device, input_selected_widget, NULL, false);
                                                if (type == IDEV_WIDGET_BUTTON || type == IDEV_WIDGET_KEY) {
                                                        found = 1;
                                                        break;
@@ -16230,7 +16273,7 @@ static void CALLBACK timerfunc (HWND hDlg, UINT uMsg, UINT_PTR idEvent, DWORD dw
                                                                (type == IDEV_WIDGET_AXIS && prevtype == IDEV_WIDGET_AXIS)) {
                                                                for (int i = 0; i < wcnt; i++) {
                                                                        wtype = widgets[i];
-                                                                       if (inputdevice_get_widget_type (input_selected_device, wtype, NULL) == IDEV_WIDGET_AXIS) {
+                                                                       if (inputdevice_get_widget_type (input_selected_device, wtype, NULL, false) == IDEV_WIDGET_AXIS) {
                                                                                inputdevice_set_gameports_mapping (&workprefs, input_selected_device, prevwidget, -1, 0, inputmap_port, workprefs.input_selected_setting);
                                                                                inputdevice_set_gameports_mapping (&workprefs, input_selected_device, wtype, axistable2[0], 0, inputmap_port, workprefs.input_selected_setting);
                                                                                evtnum = -1;
@@ -16261,7 +16304,7 @@ static void CALLBACK timerfunc (HWND hDlg, UINT uMsg, UINT_PTR idEvent, DWORD dw
                                ListView_SetItemState (h, inputmap_index, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
                                TCHAR tmp[256];
                                tmp[0] = 0;
-                               inputdevice_get_widget_type (input_selected_device, input_selected_widget, tmp);
+                               inputdevice_get_widget_type (input_selected_device, input_selected_widget, tmp, false);
                                _tcscat (tmp, _T(", "));
                                _tcscat (tmp, inputdevice_get_device_name2 (input_selected_device));
                                SetWindowText (GetDlgItem (hDlg, IDC_INPUTMAPOUT), tmp);
@@ -16307,7 +16350,7 @@ static void CALLBACK timerfunc (HWND hDlg, UINT uMsg, UINT_PTR idEvent, DWORD dw
                                }
                                TCHAR tmp[256];
                                tmp[0] = 0;
-                               inputdevice_get_widget_type (input_selected_device, input_selected_widget, tmp);
+                               inputdevice_get_widget_type (input_selected_device, input_selected_widget, tmp, false);
                                _tcscat (tmp, _T(", "));
                                _tcscat (tmp, inputdevice_get_device_name2 (input_selected_device));
                                SetWindowText (GetDlgItem (hDlg, IDC_INPUTMAPOUT), tmp);
index 080fb8f394718a581197035faf8a2c2dbcb94681..56b62ecc81a233fad7ba5987eef1307fcfe2aede 100644 (file)
     <ClCompile Include="..\..\events.cpp" />
     <ClCompile Include="..\..\fake86_cpu.cpp" />
     <ClCompile Include="..\..\flashrom.cpp" />
+    <ClCompile Include="..\..\fpp_native.cpp" />
+    <ClCompile Include="..\..\fpp_softfloat.cpp" />
     <ClCompile Include="..\..\framebufferboards.cpp" />
     <ClCompile Include="..\..\gfxboard.cpp" />
     <ClCompile Include="..\..\hrtmon.rom.cpp" />
     <ClCompile Include="..\..\slirp\udp.cpp" />
     <ClCompile Include="..\..\slirp_uae.cpp" />
     <ClCompile Include="..\..\sndboard.cpp" />
+    <ClCompile Include="..\..\softfloat\softfloat.cpp" />
+    <ClCompile Include="..\..\softfloat\softfloat_extension.cpp" />
     <ClCompile Include="..\..\specialmonitors.cpp" />
     <ClCompile Include="..\..\statusline.cpp" />
     <ClCompile Include="..\..\support\time.cpp" />
index b0f75ca7c44449dfe8f7f73adfdb8fb111e46843..7f7bcc186297dd566636a4a8965bf08f1d364776 100644 (file)
     <ClCompile Include="..\win32_videograb.cpp">
       <Filter>win32</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\fpp_native.cpp">
+      <Filter>common</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\fpp_softfloat.cpp">
+      <Filter>common</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\softfloat\softfloat.cpp">
+      <Filter>qemu</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\softfloat\softfloat_extension.cpp">
+      <Filter>qemu</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\resources\35floppy.ico">
index 79ab3e1363558956d82f3972eb7207e8a9066bb0..88f6e438038479e632b194742851eb222ff9e38a 100644 (file)
@@ -4,6 +4,63 @@ JIT Direct current rules are less complex now. It automatically switches off onl
   - RTG VRAM is outside of reserved natmem space. Workaround: Move RTG in earlier position using Hardware info GUI panel.\r
   Note that in 64-bit version RTG VRAM must be inside of reserved natmem space. (Outside = error message and return back to GUI)\r
 \r
+Beta 1:\r
+\r
+- Quickstart Blizzard modes (except if JIT enabled) enabled 24-bit addressing which caused new autoconfig/fallback mode\r
+  support to think Blizzard is in 68020 fallback mode, disabling autoconfig.\r
+- Added Apollo 1240/1260 SCSI module installed on/off option.\r
+- IDE Identify drive command didn't reset multiple sector offset value. If previous read was partial multiple transfer,\r
+  identity drive returned previously read data block.\r
+- Added Lock drive option to real harddrive mount dialog. If checked, all partitions in selected drive will be locked\r
+  and unmounted when emulation is running, enabling full read/write access even if drive has Windows mounted FAT partition(s).\r
+  Lock will be ignored if drive has one or more NTFS partitions.\r
+- Lots of softfloat FPU mode and normal FPU mode fixes and updates. (Andreas Grabher and me)\r
+- Softfloat FPU mode added to GUI, supports on the fly switching.\r
+- Implemented accurate 68020+ T0 trace mode emulation. (Original one has not been changed for ages..)\r
+- Fixed crash when sound card audio play started and mono sound channel mode and "Include CD and FMV audio" was ticked.\r
+- 271b3 "Blitter final D write don't increase "nasty" count" That is not true, I think this was only added to fix demo\r
+  that randomly glitches on real hardware too.. Fixes intro Himalaya by Avalanche.\r
+- Added illegal instruction at the end of each memory bank allocation, just outside of last available byte to force\r
+  exception if execution falls of the edge of memory. This can happen if "more compatible" is not checked.\r
+  Currently this causes bus error exception. May become halt in the future.\r
+- Audio interrupts are delayed by 2 cycles, logic analyzer confirmed. Emulated only in cycle-exact mode. (Mission Elevator)\r
+- Emulated sprite special case when DMA mode sprite's start X-coordinate is less than sprite's DMA slot position.\r
+- Fixed AGA HAM6/8 behavior when BPLCON4 XOR value is non-zero. Planes 6 and 7 never affect palette selection if HAM8,\r
+  Planes 4 to 7 if HAM6. If HAM control bits select hold mode, selected direct R/G/B value bypasses XOR operation.\r
+  (Thanks to Dissident for test cases)\r
+- AGA EHB plane 6 half-brite selection bit is taken before BPLCON4 XOR adjustment. (Same)\r
+- HAM mode and BPLCON4 BPLAM bit changes or HAM mode and BPLCON4 sprite bank bit changes and sprites in same scanline\r
+  may have caused wrong sprite or HAM colors.\r
+- >2M chip RAM didn't work in non-JIT compatible modes.\r
+- Added -ldlog 1/2 command line parameter, logs all laserdisc commands.\r
+- Recursive mode ROM scanner now skips directories starting with dot.\r
+- HDF creator used old style dialog type.\r
+- 68030 CE/prefetch mode cache access fix.\r
+- JIT direct broke 512k and 1M chip RAM size detection.\r
+- If statefile is loaded with one or more floppy images that can't be opened: keep fake disk in drive (like previously)\r
+  and ask for new disk path when missing disk is accessed for the first time. (access = read or write attempt)\r
+  Old disk path is shown in disk dialog title bar.\r
+- SCSI emulation SCSI buffer re-sizing didn't handle READ(6) zero size length correctly.\r
+- Added memory cycle-exact Quickstart step for A1200 and CD32 configurations. Less CPU heavy than full cycle-exact and\r
+  usually not much more worse (or better). At least not until 68020 CE gets better.\r
+- Memory cycle exact mode incorrectly counted internal CPU cycles partially.\r
+- Memory cycle exact mode also enables more accurate custom chipset mode.\r
+- 68020 CE mode adjustments, fixed Chip RAM access speed (was too fast previously), removed all extra cycle\r
+  counting temporarily. Work in progress.\r
+- Include key scancode in Input panel key events.\r
+\r
+Softfloat FPU mode is now officially supported, Andreas Grabher (Previous) implemented required 6888x-specific\r
+features to softfloat support library. Only needed if "weird" features are required (denormals and unnormals, invalid\r
+operands) or extended precision (that WinUAE does not support due to MSVC not supporting it) or accurate status register\r
+flags or 100% accurate rounding/NaN handling, FMOD/FREM quotient etc.\r
+\r
+Arithmetic exceptions are not yet supported. Trigonometric and logarithmic functions are currently implemented\r
+using normal native C-library functions and won't return 100% same results as real 6888x.\r
+\r
+Not compatible with JIT FPU emulation.\r
+\r
+3.4.0\r
+\r
 Beta 20:\r
 \r
 - Selecting item from HDF "history" drop down worked strangely depending on Windows version.\r
index b6f917f2038aae988bd28f4ef77e51cd0701575a..0176dad42974193619df862c2048a64f6fbb8481 100644 (file)
--- a/scsi.cpp
+++ b/scsi.cpp
@@ -151,7 +151,7 @@ bool scsi_emulate_analyze (struct scsi_data *sd)
                data_len = 8;
        break;
        case 0x08: // READ(6)
-               data_len2 = sd->cmd[4] * sd->blocksize;
+               data_len2 = (sd->cmd[4] == 0 ? 256 : sd->cmd[4]) * sd->blocksize;
                scsi_grow_buffer(sd, data_len2);
        break;
        case 0x28: // READ(10)
@@ -169,7 +169,7 @@ bool scsi_emulate_analyze (struct scsi_data *sd)
        case 0x0a: // WRITE(6)
                if (sd->device_type == UAEDEV_CD)
                        goto nocmd;
-               data_len = sd->cmd[4] * sd->blocksize;
+               data_len = (sd->cmd[4] == 0 ? 256 : sd->cmd[4]) * sd->blocksize;
                scsi_grow_buffer(sd, data_len);
        break;
        case 0x2a: // WRITE(10)
@@ -1271,7 +1271,7 @@ static void raw_scsi_set_ack(struct raw_scsi *rs, bool ack)
 
 // APOLLO SOFTSCSI
 
-void apollo_scsi_bput(uaecptr addr, uae_u8 v)
+void apollo_scsi_bput(uaecptr addr, uae_u8 v, uae_u32 config)
 {
        struct soft_scsi *as = getscsiboard(addr);
        if (!as)
@@ -1294,7 +1294,7 @@ void apollo_scsi_bput(uaecptr addr, uae_u8 v)
        //write_log(_T("apollo scsi put %04x = %02x\n"), addr, v);
 }
 
-uae_u8 apollo_scsi_bget(uaecptr addr)
+uae_u8 apollo_scsi_bget(uaecptr addr, uae_u32 config)
 {
        struct soft_scsi *as = getscsiboard(addr);
        if (!as)
@@ -1307,7 +1307,9 @@ uae_u8 apollo_scsi_bget(uaecptr addr)
                v = raw_scsi_get_data(rs, true);
        } else if (bank == 0x800 && (addr & 1)) {
                uae_u8 t = raw_scsi_get_signal_phase(rs);
-               v = 1; // disable switch off
+               v = 0;
+               if (config & 1) // scsi module installed
+                       v |= 1;
                if (t & SCSI_IO_BUSY)
                        v |= 128;
                if (t & SCSI_IO_SEL)
index 0a532ee38d2d7df2612a12ff59437cc9d6d83c1b..a60a139faa2c405fff467395f16c90e3e5f29534 100644 (file)
@@ -1021,6 +1021,150 @@ void uaesndboard_reset(void)
 }
 
 
+// PMX
+
+struct pmx_data
+{
+       bool enabled;
+       int configured;
+       uae_u8 acmemory[128];
+       int streamid;
+       struct romconfig *rc;
+       int reset_delay;
+       uae_u16 status;
+       bool dreq;
+       uae_u16 regs[16];
+};
+static struct pmx_data pmx[MAX_DUPLICATE_SOUND_BOARDS];
+
+static void pmx_reset_chip(struct pmx_data *data)
+{
+       for (int i = 0; i < 16; i++) {
+               data->regs[i] = 0;
+       }
+       data->regs[0] = 0x4000;
+       data->regs[1] = 0x000c;
+}
+
+static void REGPARAM2 pmx_bput(uaecptr addr, uae_u32 v)
+{
+       struct pmx_data *data = &pmx[0];
+       v &= 0xff;
+       write_log(_T("PMXBPUT %08x %02x %08x\n"), addr, v, M68K_GETPC);
+}
+
+static void REGPARAM2 pmx_wput(uaecptr addr, uae_u32 v)
+{
+       struct pmx_data *data = &pmx[0];
+       int reg = -1;
+       v &= 0xffff;
+       if (addr & 0x8000) {
+               reg = (addr >> 2) & 15;
+               data->regs[reg] = v;
+       } else {
+               data->status = v;
+               if (v & 0x8000) {
+                       data->dreq = true;
+                       data->reset_delay = 10;
+               }
+       }
+       write_log(_T("PMXWPUT %d %08x %04x %08x\n"), reg, addr, v, M68K_GETPC);
+}
+
+static void REGPARAM2 pmx_lput(uaecptr addr, uae_u32 v)
+{
+       write_log(_T("PMXLPUT %08x %08x %08x\n"), addr, v, M68K_GETPC);
+}
+
+static uae_u32 REGPARAM2 pmx_bget(uaecptr addr)
+{
+       struct pmx_data *data = &pmx[0];
+       uae_u8 v = 0;
+       data->dreq = !data->dreq;
+       if (!data->dreq)
+               v |= 1 << 3;
+       write_log(_T("PMXBGET %08x %02x %08x\n"), addr, v, M68K_GETPC);
+       return v;
+}
+static uae_u32 REGPARAM2 pmx_wget(uaecptr addr)
+{
+       struct pmx_data *data = &pmx[0];
+       uae_u16 v = 0;
+       int reg = -1;
+       if (addr & 0x8000) {
+               reg = (addr >> 2) & 15;
+               v = data->regs[reg];
+               if (reg == 1) {
+                       v &= ~0x03f0;
+                       v |= 0x0060; ;//revision
+               }
+       } else {
+               v = data->status;
+       }
+       write_log(_T("PMXWGET %d %08x %04x %08x\n"), reg, addr, v, M68K_GETPC);
+       return v;
+}
+static uae_u32 REGPARAM2 pmx_lget(uaecptr addr)
+{
+       write_log(_T("PMXLGET %08x %08x\n"), addr, M68K_GETPC);
+       return 0;
+}
+
+static addrbank pmx_bank = {
+       pmx_lget, pmx_wget, pmx_bget,
+       pmx_lput, pmx_wput, pmx_bput,
+       default_xlate, default_check, NULL, _T("*"), _T("PMX"),
+       dummy_lgeti, dummy_wgeti,
+       ABFLAG_IO | ABFLAG_SAFE, S_READ, S_WRITE
+};
+
+bool pmx_init (struct autoconfig_info *aci)
+{
+       struct pmx_data *data = &pmx[0];
+       const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_PMX);
+       if (!ert)
+               return false;
+
+       aci->addrbank = &pmx_bank;
+       aci->autoconfig_automatic = true;
+
+       if (!aci->doinit) {
+               aci->autoconfigp = ert->autoconfig;
+               return true;
+       }
+
+       data->configured = 0;
+       data->streamid = 0;
+       memset(data->acmemory, 0xff, sizeof data->acmemory);
+       data->rc = aci->rc;
+       data->enabled = true;
+       for (int i = 0; i < 16; i++) {
+               uae_u8 b = ert->autoconfig[i];
+               ew(data->acmemory, i * 4, b);
+       }
+       memcpy(aci->autoconfig_raw, data->acmemory, sizeof data->acmemory);
+       return true;
+}
+
+void pmx_free(void)
+{
+       for (int j = 0; j < MAX_DUPLICATE_SOUND_BOARDS; j++) {
+               struct pmx_data *data = &pmx[j];
+               data->enabled = false;
+       }
+       sndboard_rethink();
+}
+
+void pmx_reset(void)
+{
+       for (int j = 0; j < MAX_DUPLICATE_SOUND_BOARDS; j++) {
+               struct pmx_data *data = &pmx[j];
+               if (data->enabled) {
+               }
+       }
+       sndboard_rethink();
+}
+
 // TOCCATA
 
 #define DEBUG_TOCCATA 0
index cea37649ece7bf776540146c65f850e3efa58396..7034c7d60b531d0c7e5a78b841b84bbf50aaf0b1 100755 (executable)
@@ -2358,7 +2358,7 @@ static bool do_genlock(struct vidbuffer *src, struct vidbuffer *dst, bool double
                else {
                        genlock_error = true;
                }
-       } else if (currprefs.genlock_image == 4 || currprefs.genlock_image == 6) {
+       } else if (currprefs.genlock_image == 4 || currprefs.genlock_image >= 6) {
                if (currprefs.genlock_video_file[0]) {
                        genlock_blank = false;
                        if ((!genlock_video && !genlock_error) || _tcsicmp(currprefs.genlock_video_file, genlock_video_file)) {
@@ -2377,6 +2377,9 @@ static bool do_genlock(struct vidbuffer *src, struct vidbuffer *dst, bool double
                                }
                                genlock_blank = false;
                        }
+                       if (currprefs.genlock_image >= 7) {
+                               genlock_blank = false;
+                       }
                } else {
                        genlock_error = true;
                }
@@ -2427,13 +2430,13 @@ skip:
                genlock_image_data = NULL;
        }
 #if VIDEOGRAB
-       if (genlock_video && currprefs.genlock_image != 4 && currprefs.genlock_image != 5 && currprefs.genlock_image != 6) {
+       if (genlock_video && currprefs.genlock_image != 4 && currprefs.genlock_image != 5 && currprefs.genlock_image < 6) {
                uninitvideograb();
                genlock_video = false;
        }
        isvideograb_status();
 #endif
-       if (currprefs.genlock_image != 4 && currprefs.genlock_image != 5 && currprefs.genlock_image != 6) {
+       if (currprefs.genlock_image != 4 && currprefs.genlock_image != 5 && currprefs.genlock_image < 6) {
                genlock_video_file[0] = 0;
        }
        if (currprefs.genlock_image != 3) {
index c8aa085029c91e1915232e706af8b736138eacb1..24405726fe5baa660290f77ec42a7afc3ed6e236 100644 (file)
--- a/table68k
+++ b/table68k
 - 0 0 2 fea
 
 1000 rrr0 11ss sSSS:000:?????:?????:13: DIVU.W  s[Dreg],Dr
-- 2 0 54
+- 2 0 20
 1000 rrr0 11ss sSSS:000:?????:?????:13: DIVU.W  s[!Areg,Dreg],Dr
-- 0 0 54 fea
+- 0 0 20 fea
 
 1000 rrr1 00dd dDDD:000:XxZxC:X-Z--:13: SBCD.B  d[Dreg],Dr
 - 0 0 4
 - 2 1 11
 
 1000 rrr1 11ss sSSS:000:?????:?????:13: DIVS.W  s[Dreg],Dr
-- 2 0 54
+- 2 0 20
 1000 rrr1 11ss sSSS:000:?????:?????:13: DIVS.W  s[!Areg,Dreg],Dr
-- 0 0 54 fea
+- 0 0 20 fea
 
 1001 rrr0 zzss sSSS:000:XNZVC:-----:13: SUB.z   s[Areg,Dreg],Dr
 - 2 0 2
 1100 rrr0 zzss sSSS:000:-NZ00:-----:13: AND.z   s[!Areg,Dreg],Dr
 - 0 1 3 fea
 1100 rrr0 11ss sSSS:000:-NZ00:-----:13: MULU.W  s[!Areg],Dr
-- 2 0 25 fea
+- 2 0 12 fea
 
 1100 rrr1 00dd dDDD:000:XxZxC:X-Z--:13: ABCD.B  d[Dreg],Dr
 - 0 0 4
 1100 rrr1 10dd dDDD:000:-----:-----:33: EXG.L   Dr,d[Areg]      
 - 4 0 4
 1100 rrr1 11ss sSSS:000:-NZ00:-----:13: MULS.W  s[!Areg],Dr
-- 2 0 25 fea
+- 2 0 12 fea
 
 1101 rrr0 zzss sSSS:000:XNZVC:-----:13: ADD.z   s[Areg,Dreg],Dr
 - 2 0 2