]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
2420b2
authorToni Wilen <twilen@winuae.net>
Fri, 18 May 2012 17:43:39 +0000 (20:43 +0300)
committerToni Wilen <twilen@winuae.net>
Fri, 18 May 2012 17:43:39 +0000 (20:43 +0300)
29 files changed:
blkdev_cdimage.cpp
bsdsocket.cpp
custom.cpp
disk.cpp
events.cpp
gfxutil.cpp
include/bsdsocket.h
include/custom.h
include/events.h
include/native2amiga.h
include/xwin.h
native2amiga.cpp
newcpu.cpp
od-win32/blkdev_win32_ioctl.cpp
od-win32/bsdsock.cpp
od-win32/direct3d.cpp
od-win32/dxwrap.cpp
od-win32/dxwrap.h
od-win32/hardfile_win32.cpp
od-win32/machdep/rpt.h
od-win32/midi.cpp
od-win32/picasso96_win.cpp
od-win32/sounddep/sound.cpp
od-win32/win32.cpp
od-win32/win32.h
od-win32/win32gfx.cpp
od-win32/win32gui.cpp
od-win32/winuaechangelog.txt
od-win32/writelog.cpp

index 2ee531eb73c6078aba8744d903a61cac67d854d9..5de3bc51c7aa9011e747d818e8e4b365f49907e7 100644 (file)
@@ -41,13 +41,13 @@ enum audenc { AUDENC_NONE, AUDENC_PCM, AUDENC_MP3, AUDENC_FLAC };
 struct cdtoc
 {
        struct zfile *handle;
-       int offset;
+       uae_s64 offset;
        uae_u8 *data;
        struct zfile *subhandle;
        int suboffset;
        uae_u8 *subdata;
 
-       int filesize;
+       uae_s64 filesize;
        TCHAR *fname;
        int address;
        uae_u8 adr, ctrl;
@@ -250,7 +250,7 @@ static int getsub_deinterleaved (uae_u8 *dst, struct cdunit *cdu, struct cdtoc *
                                totalsize += t->size;
                                offset = t->size;
                        }
-                       zfile_fseek (t->subhandle, sector * totalsize + t->suboffset + offset, SEEK_SET);
+                       zfile_fseek (t->subhandle, (uae_u64)sector * totalsize + t->suboffset + offset, SEEK_SET);
                        if (zfile_fread (dst, SUB_CHANNEL_SIZE, 1, t->subhandle) > 0)
                                ret = t->subcode;
                } else {
@@ -388,7 +388,7 @@ static void *cdda_play_func (void *v)
                                write_log (_T("IMAGE CDDA: illegal sector number %d\n"), cdu->cdda_start);
                                setstate (cdu, AUDIO_STATUS_PLAY_ERROR);
                        } else {
-                               write_log (_T("IMAGE CDDA: playing from %d to %d, track %d ('%s', offset %d, secoffset %d)\n"),
+                               write_log (_T("IMAGE CDDA: playing from %d to %d, track %d ('%s', offset %lld, secoffset %d)\n"),
                                        cdu->cdda_start, cdu->cdda_end, t->track, t->fname, t->offset, sector);
                                // do this even if audio is not compressed, t->handle also could be
                                // compressed and we want to unpack it in background too
@@ -478,7 +478,7 @@ static void *cdda_play_func (void *v)
                                                                memcpy (dst, t->data + sector * totalsize + t->offset, t->size);
                                                } else if (t->enctype == AUDENC_PCM) {
                                                        if (sector * totalsize + t->offset + totalsize < t->filesize) {
-                                                               zfile_fseek (t->handle, sector * totalsize + t->offset, SEEK_SET);
+                                                               zfile_fseek (t->handle, (uae_u64)sector * totalsize + t->offset, SEEK_SET);
                                                                zfile_fread (dst, t->size, 1, t->handle);
                                                        }
                                                }
@@ -686,7 +686,7 @@ static int command_rawread (int unitnum, uae_u8 *data, int sector, int size, int
                        // 2048 -> 2352
                        while (size-- > 0) {
                                memset (data, 0, 16);
-                               zfile_fseek (t->handle, t->offset + sector * t->size, SEEK_SET);
+                               zfile_fseek (t->handle, t->offset + (uae_u64)sector * t->size, SEEK_SET);
                                zfile_fread (data + 16, t->size, 1, t->handle);
                                encode_l2 (data, sector + 150);
                                sector++;
@@ -696,10 +696,10 @@ static int command_rawread (int unitnum, uae_u8 *data, int sector, int size, int
                        // 2352 -> 2048
                        while (size-- > 0) {
                                uae_u8 b = 0;
-                               zfile_fseek (t->handle, t->offset + sector * t->size + 15, SEEK_SET);
+                               zfile_fseek (t->handle, t->offset + (uae_u64)sector * t->size + 15, SEEK_SET);
                                zfile_fread (&b, 1, 1, t->handle);
                                if (b == 2) // MODE2?
-                                       zfile_fseek (t->handle, t->offset + sector * t->size + 24, SEEK_SET);
+                                       zfile_fseek (t->handle, t->offset + (uae_u64)sector * t->size + 24, SEEK_SET);
                                zfile_fread (data, sectorsize, 1, t->handle);
                                sector++;
                                data += sectorsize;
@@ -708,7 +708,7 @@ static int command_rawread (int unitnum, uae_u8 *data, int sector, int size, int
                        // 2352 -> 2336
                        while (size-- > 0) {
                                uae_u8 b = 0;
-                               zfile_fseek (t->handle, t->offset + sector * t->size + 15, SEEK_SET);
+                               zfile_fseek (t->handle, t->offset + (uae_u64)sector * t->size + 15, SEEK_SET);
                                zfile_fread (&b, 1, 1, t->handle);
                                if (b != 2 && b != 0) // MODE0 or MODE2 only allowed
                                        return 0; 
@@ -718,7 +718,7 @@ static int command_rawread (int unitnum, uae_u8 *data, int sector, int size, int
                        }
                } else if (sectorsize == t->size) {
                        // no change
-                       zfile_fseek (t->handle, t->offset + sector * t->size, SEEK_SET);
+                       zfile_fseek (t->handle, t->offset + (uae_u64)sector * t->size, SEEK_SET);
                        zfile_fread (data, sectorsize, size, t->handle);
                        sector += size;
                }
@@ -750,7 +750,7 @@ static int command_rawread (int unitnum, uae_u8 *data, int sector, int size, int
                                goto end;
                        }
                        for (int i = 0; i < size; i++) {
-                               zfile_fseek (t->handle, t->offset + sector * t->size, SEEK_SET);
+                               zfile_fseek (t->handle, t->offset + (uae_u64)sector * t->size, SEEK_SET);
                                zfile_fread (data, t->size, 1, t->handle);
                                uae_u8 *p = data + t->size;
                                if (subs) {
@@ -790,19 +790,19 @@ static int command_read (int unitnum, uae_u8 *data, int sector, int size)
                return 0;
        cdda_stop (cdu);
        if (t->size == 2048) {
-               zfile_fseek (t->handle, t->offset + sector * t->size, SEEK_SET);
+               zfile_fseek (t->handle, t->offset + (uae_u64)sector * t->size, SEEK_SET);
                zfile_fread (data, size, 2048, t->handle);
                sector += size;
        } else {
                while (size-- > 0) {
                        if (t->size == 2352) {
                                uae_u8 b = 0;
-                               zfile_fseek (t->handle, t->offset + sector * t->size + 15, SEEK_SET);
+                               zfile_fseek (t->handle, t->offset + (uae_u64)sector * t->size + 15, SEEK_SET);
                                zfile_fread (&b, 1, 1, t->handle);
                                if (b == 2) // MODE2?
-                                       zfile_fseek (t->handle, t->offset + sector * t->size + 24, SEEK_SET);
+                                       zfile_fseek (t->handle, t->offset + (uae_u64)sector * t->size + 24, SEEK_SET);
                        } else {
-                               zfile_fseek (t->handle, t->offset + sector * t->size + 16, SEEK_SET);
+                               zfile_fseek (t->handle, t->offset + (uae_u64)sector * t->size + 16, SEEK_SET);
                        }
                        zfile_fread (data, 1, 2048, t->handle);
                        data += 2048;
@@ -1001,9 +1001,10 @@ static int parsemds (struct cdunit *cdu, struct zfile *zmds, const TCHAR *img)
        MDS_Header *head;
        struct cdtoc *t;
        uae_u8 *mds = NULL;
+       uae_u64 size;
 
        write_log (_T("MDS TOC: '%s'\n"), img);
-       int size = zfile_size (zmds);
+       size = zfile_size (zmds);
        mds = xmalloc (uae_u8, size);
        if (!mds)
                goto end;
@@ -1217,8 +1218,9 @@ static int parseccd (struct cdunit *cdu, struct zfile *zcue, const TCHAR *img)
 
 static int parsecue (struct cdunit *cdu, struct zfile *zcue, const TCHAR *img)
 {
-       int tracknum, index0, pregap;
-       int offset, secoffset, newfile;
+       int tracknum, pregap;
+       int newfile, secoffset;
+       uae_s64 offset, index0;
        TCHAR *fname, *fnametype;
        audenc fnametypeid;
        int ctrl;
@@ -1310,7 +1312,7 @@ static int parsecue (struct cdunit *cdu, struct zfile *zcue, const TCHAR *img)
 
                                if (tracknum > 1 && newfile) {
                                        t--;
-                                       secoffset += t->filesize / t->size;
+                                       secoffset += (int)(t->filesize / t->size);
                                        t++;
                                }
 
@@ -1434,12 +1436,12 @@ static int parsecue (struct cdunit *cdu, struct zfile *zcue, const TCHAR *img)
        }
 
        struct cdtoc *t = &cdu->toc[cdu->tracks - 1];
-       int size = t->filesize;
+       uae_s64 size = t->filesize;
        if (!secoffset)
                size -= offset * t->size;
        if (size < 0)
                size = 0;
-       cdu->toc[cdu->tracks].address = t->address + size / t->size;
+       cdu->toc[cdu->tracks].address = t->address + (int)(size / t->size);
 
        xfree (fname);
 
@@ -1503,7 +1505,7 @@ static int parse_image (struct cdunit *cdu, const TCHAR *img)
                        t->size = (siz % 2048) == 0 ? 2048 : 2352;
                        t->filesize = siz;
                        write_log (_T("CD: plain CD image mounted!\n"));
-                       cdu->toc[1].address = t->address + t->filesize / t->size;
+                       cdu->toc[1].address = t->address + (int)(t->filesize / t->size);
                        zcue = NULL;
                }
        }
@@ -1521,7 +1523,7 @@ static int parse_image (struct cdunit *cdu, const TCHAR *img)
                write_log (_T("%7d %02d:%02d:%02d"),
                        t->address, (msf >> 16) & 0xff, (msf >> 8) & 0xff, (msf >> 0) & 0xff);
                if (i < cdu->tracks)
-                       write_log (_T(" %s %x %10d %10d %s"), (t->ctrl & 4) ? _T("DATA    ") : (t->subcode ? _T("CDA+SUB") : _T("CDA     ")),
+                       write_log (_T(" %s %x %10lld %10lld %s"), (t->ctrl & 4) ? _T("DATA    ") : (t->subcode ? _T("CDA+SUB") : _T("CDA     ")),
                                t->ctrl, t->offset, t->filesize, t->handle == NULL ? _T("[FILE ERROR]") : _T(""));
                write_log (_T("\n"));
                if (i < cdu->tracks)
@@ -1562,7 +1564,7 @@ static struct device_info *info_device (int unitnum, struct device_info *di, int
        di->mediapath[0] = 0;
        di->cylinders = 1;
        di->trackspercylinder = 1;
-       di->sectorspertrack = cdu->cdsize / di->bytespersector;
+       di->sectorspertrack = (int)(cdu->cdsize / di->bytespersector);
        if (ismedia (unitnum, 1)) {
                di->media_inserted = 1;
                _tcscpy (di->mediapath, currprefs.cdslots[unitnum].name);
index ca3a760489aa4e28fb22a0208069b435e31765c5..291d244e3c5d8df1865e824c020e508ccc3d7ff7 100644 (file)
@@ -26,6 +26,7 @@
 
 #ifdef BSDSOCKET
 
+int log_bsd;
 struct socketbase *socketbases;
 static uae_u32 SockLibBase;
 
index f918c937b7106428d20a35a6b9923a3a632e9c44..7a26695a0450e30db7439af50953dc14ec4fa2eb 100644 (file)
@@ -194,7 +194,7 @@ static int vblank_hz_mult, vblank_hz_state;
 static struct chipset_refresh *stored_chipset_refresh;
 int doublescan;
 bool programmedmode;
-frame_time_t syncbase;
+int syncbase;
 static int fmode;
 uae_u16 beamcon0, new_beamcon0;
 uae_u16 vtotal = MAXVPOS_PAL, htotal = MAXHPOS_PAL;
@@ -2959,9 +2959,10 @@ void compute_framesync (void)
 
        write_log (_T("%s mode%s%s V=%.4fHz H=%0.4fHz (%dx%d+%d) IDX=%d (%s)\n"),
                isntsc ? _T("NTSC") : _T("PAL"),
-               islace ? _T(" laced") : _T(""),
+               islace ? _T(" lace") : _T(""),
                doublescan > 0 ? _T(" dblscan") : _T(""),
-               vblank_hz, vblank_hz * maxvpos_nom,
+               vblank_hz,
+               (double)(currprefs.ntscmode ? CHIPSET_CLOCK_NTSC : CHIPSET_CLOCK_PAL) / (maxhpos + (islinetoggle () ? 0.5 : 0)),
                maxhpos, maxvpos, lof_store ? 1 : 0,
                cr ? cr->index : -1,
                cr != NULL && cr->label != NULL ? cr->label : _T("<?>")
@@ -3013,6 +3014,9 @@ void init_hz (bool fullinit)
                equ_vblank_endline = EQU_ENDLINE_NTSC;
                equ_vblank_toggle = false;
        }
+       // long/short field refresh rate adjustment
+       vblank_hz = vblank_hz * (maxvpos * 2 + 1) / ((maxvpos + lof_current) * 2);
+
        maxvpos_nom = maxvpos;
        if (vpos_count > 0) {
                // we come here if vpos_count != maxvpos and beamcon0 didn't change
@@ -3097,6 +3101,9 @@ void init_hz (bool fullinit)
        if (vblank_hz != ovblank)
                updatedisplayarea ();
        inputdevice_tablet_strobe ();
+
+       if (fullinit)
+               vpos_count_diff = maxvpos_nom;
 }
 
 void init_hz (void)
@@ -5183,11 +5190,11 @@ void init_hardware_for_drawing_frame (void)
 
 static void do_savestate(void);
 
-static int rpt_vsync (void)
+static int rpt_vsync (int adjust)
 {
        frame_time_t curr_time = read_processor_time ();
-       int v = curr_time - vsyncwaittime;
-       if (v > (int)syncbase || v < -((int)syncbase)) {
+       int v = curr_time - vsyncwaittime + adjust;
+       if (v > syncbase || v < -syncbase) {
                vsyncmintime = vsyncmaxtime = vsyncwaittime = curr_time;
                v = 0;
        }
@@ -5215,38 +5222,52 @@ static void rtg_vsynccheck (void)
        }
 }
 
-extern int log_vsync;
+
+// moving average algorithm
+#define MAVG_SIZE 128
+struct mavg_data
+{
+       int values[MAVG_SIZE];
+       int size;
+       int offset;
+       int mavg;
+};
+
+static int mavg (struct mavg_data *md, int newval)
+{
+       if (md->size < MAVG_SIZE) {
+               md->values[md->size++] = newval;
+               md->mavg += newval;
+       } else {
+               md->mavg -= md->values[md->offset];
+               md->values[md->offset] = newval;
+               md->mavg += newval;
+               md->offset++;
+               if (md->offset >= MAVG_SIZE)
+                       md->offset -= MAVG_SIZE;
+       }
+       return md->mavg / md->size;
+}
+
+extern int log_vsync, debug_vsync_min_delay, debug_vsync_forced_delay;
 static bool framewait (void)
 {
        frame_time_t curr_time;
        frame_time_t start;
        int vs = isvsync_chipset ();
-       int frameskipt;
-       bool ok = true;
-
-       frameskipt = frameskiptime;
-       frameskiptime = 0;
-
-       /* note to anyone reading this: below ugly uae_s64 averaging stuff will be replaced with
-        * something more optimal after vsync timing works correctly enough
-        */
+       int status = 0;
 
        is_syncline = 0;
 
-       static uae_s64 frameskipt64;
-       static int frameskipt64cnt;
+       static struct mavg_data ma_frameskipt;
+       int frameskipt_avg = mavg (&ma_frameskipt, frameskiptime);
 
-       frameskipt64cnt++;
-       if (frameskipt > frameskipt64 / frameskipt64cnt)
-               frameskipt64 = (uae_s64)frameskipt * frameskipt64cnt;
-       else
-               frameskipt64 += frameskipt;
+       frameskiptime = 0;
 
        if (vs > 0) {
 
+               static struct mavg_data ma_legacy;
                static frame_time_t vsync_time;
-               static uae_s64 legacy64;
-               static int legacy64cnt;
                int t;
 
                curr_time = read_processor_time ();
@@ -5262,20 +5283,22 @@ static bool framewait (void)
                if (!frame_shown)
                        show_screen ();
 
-               legacy64cnt++;
-               if (t > legacy64 / legacy64cnt)
-                       legacy64 = (uae_s64)t * legacy64cnt;
-               else
-                       legacy64 += t;
+               int legacy_avg = mavg (&ma_legacy, t);
+               if (t > legacy_avg)
+                       legacy_avg = t;
+               t = legacy_avg;
 
-               t = legacy64 / legacy64cnt;
+               if (debug_vsync_min_delay && t < debug_vsync_min_delay * vsynctimebase / 100)
+                       t = debug_vsync_min_delay * vsynctimebase / 100;
+               if (debug_vsync_forced_delay > 0)
+                       t = debug_vsync_forced_delay * vsynctimebase / 100;
 
                vsync_time = read_processor_time ();
                if (t > vsynctimebase * 2 / 3)
                        t = vsynctimebase * 2 / 3;
 
                if (currprefs.m68k_speed < 0) {
-                       vsynctimeperline = (vsynctimebase - t * 2) / (maxvpos_nom + 1);
+                       vsynctimeperline = (vsynctimebase - t) / (maxvpos_nom + 1);
                } else {
                        vsynctimeperline = (vsynctimebase - t) / 3;
                }
@@ -5284,11 +5307,11 @@ static bool framewait (void)
                        vsynctimeperline = 1;
 
                if (0 || (log_vsync & 2)) {
-                       write_log (L"%06d %06d/%06d\n", t, vsynctimeperline, vsynctimebase);
+                       write_log (L"%06d %06d/%06d %03d%%\n", t, vsynctimeperline, vsynctimebase, t * 100 / vsynctimebase);
                }
 
                frame_shown = true;
-               return ok;
+               return status != 0;
 
        } else if (vs < 0) {
 
@@ -5296,54 +5319,57 @@ static bool framewait (void)
                extern int extraframewait;
                
                if (!vblank_hz_state)
-                       return ok;
+                       return status != 0;
 
                if (vs == -2 || vs == -3) {
 
                        // fastest possible
-                       static int skipcnt;
                        int max, adjust, flipdelay, val;
                        frame_time_t now;
-                       static uae_s64 skipcnt64, adjust64;
-                       static int llvsynccnt;
+                       static struct mavg_data ma_skip, ma_adjust;
+                       
+                       val = 0;
 
                        if (!frame_rendered && !picasso_on) {
                                frame_time_t start, end;
                                start = read_processor_time ();
                                frame_rendered = render_screen (currprefs.gfx_apmode[0].gfx_vflip == 0);
                                end = read_processor_time ();
-                               frameskipt += end - start;
+                               val += end - start;
                        }
 
                        curr_time = vsync_busywait_end (&flipdelay); // vsync time
-                       ok = vsync_busywait_do (NULL, (bplcon0 & 4) != 0 && !lof_changed && !lof_changing, lof_store != 0);
+                       status = vsync_busywait_do (NULL, (bplcon0 & 4) != 0 && !lof_changed && !lof_changing, lof_store != 0);
                        vsync_busywait_start ();
 
-                       llvsynccnt++;
-
-                       if (flipdelay > skipcnt64 / llvsynccnt)
-                               skipcnt64 = (uae_s64)flipdelay * llvsynccnt;
-                       else
-                               skipcnt64 += flipdelay;
-
                        now = read_processor_time (); // current time
                        adjust = (int)now - (int)curr_time;
                        //write_log (_T("%d "), adjust);
-                       if (adjust < 0)
+                       if (adjust < 0 || adjust >= vsynctimebase)
                                adjust = 0;
                        if (adjust > vsynctimebase * 2 / 3)
                                adjust = vsynctimebase * 2 / 3;
-                       adjust64 += adjust;
                        
-                       //write_log (_T("%d "), adjust);
+                       int adjust_avg = mavg (&ma_adjust, adjust);
                        
-                       val = adjust64 / llvsynccnt;
+                       val += adjust_avg;
 
+                       int flipdelay_avg = mavg (&ma_skip, flipdelay);
+                       if (flipdelay > flipdelay_avg)
+                               flipdelay_avg = flipdelay;
                        if (currprefs.gfx_apmode[0].gfx_vflip == 0) {
-                               val += skipcnt64 / llvsynccnt;
+                               val += flipdelay_avg;
                                //write_log (_T("%d "), skipcnt);
                        }
-                       val += frameskipt64 / frameskipt64cnt;
+                       val += frameskipt_avg;
+
+                       if (currprefs.gfx_apmode[0].gfx_vflip == 0) {
+                               if (debug_vsync_min_delay && val < debug_vsync_min_delay * vsynctimebase / 100)
+                                       val = debug_vsync_min_delay * vsynctimebase / 100;
+                               if (debug_vsync_forced_delay > 0)
+                                       val = debug_vsync_forced_delay * vsynctimebase / 100;
+                       }
+
                        //write_log (_T("%d "), adjust);
 
                        if (val > vsynctimebase * 2 / 3)
@@ -5357,68 +5383,107 @@ static bool framewait (void)
                        vsyncwaittime = curr_time + (vsynctimebase - 0);
 
                        vsynctimeperline = max / (maxvpos_nom + 1);
-                       if (vsynctimeperline < 1)
+                       if (status <= 0 || vsynctimeperline < 1)
                                vsynctimeperline = 1;
                        vsyncmaxtime = now + max;
 
                        if (0 || (log_vsync & 2)) {
-                               write_log (L"%05d:%05d:%05d=%05d:%05d/%05d\n", (int)(adjust64 / llvsynccnt), (int)(frameskipt64 / frameskipt64cnt), (int)(skipcnt64 / llvsynccnt), val, vsynctimeperline, vsynctimebase);
+                               write_log (L"%05d:%05d:%05d=%05d:%05d/%05d %03d%%\n", adjust_avg, frameskipt_avg, flipdelay_avg,
+                                       val, vsynctimeperline, vsynctimebase, val * 100 / vsynctimebase);
                        }
 
+                       frame_shown = true;
+
                } else {
 
-                       static int skipcnt;
-                       int max, adjust, flipdelay;
-                       static uae_s64 skipcnt64;
-                       static int llvsynccnt;
+                       int max, adjust, flipdelay, flipdelay_avg;
+                       static struct mavg_data ma_skip;
                        frame_time_t now;
 
                        flipdelay = 0;
                        if (!frame_rendered && !picasso_on)
                                frame_rendered = render_screen (false);
-                       ok = vsync_busywait_do (&freetime, (bplcon0 & 4) != 0 && !lof_changed && !lof_changing, lof_store != 0);
                        curr_time = vsync_busywait_end (&flipdelay);
+                       status = vsync_busywait_do (&freetime, (bplcon0 & 4) != 0 && !lof_changed && !lof_changing, lof_store != 0);
+                       vsync_busywait_start ();
+
                        if (extraframewait && !currprefs.turbo_emulation)
                                sleep_millis_main (extraframewait);
+
                        now = read_processor_time ();
                        adjust = (int)now - (int)curr_time;
+                       int adjustx = adjust;
                        if (adjust < 0)
                                adjust = 0;
                        if (adjust > vsynctimebase)
                                adjust = 0;
                        if (adjust > vsynctimebase / 2)
                                adjust = vsynctimebase / 2;
-                       max = vsynctimebase - (adjust * 3 / 2);
 
                        vsyncmintime = now;
                        vsyncwaittime = curr_time + vsynctimebase;
 
                        if (currprefs.gfx_apmode[0].gfx_vflip == 0) {
-                               llvsynccnt++;
-                               if (flipdelay > skipcnt64 / llvsynccnt)
-                                       skipcnt64 = (uae_s64)flipdelay * llvsynccnt;
-                               else
-                                       skipcnt64 += flipdelay;
+                               flipdelay_avg = mavg (&ma_skip, flipdelay);
+                               if (flipdelay > flipdelay_avg)
+                                       flipdelay_avg = flipdelay;
                        } else {
-                               skipcnt64 = 0;
-                               llvsynccnt = 1;
+                               flipdelay_avg = 0;
+                       }
+
+                       max = vsynctimebase - adjust - flipdelay_avg;
+
+                       if (currprefs.gfx_apmode[0].gfx_vflip == 0) {
+                               int val = vsynctimebase - max;
+                               if (debug_vsync_min_delay && val < debug_vsync_min_delay * vsynctimebase / 100)
+                                       val = debug_vsync_min_delay * vsynctimebase / 100;
+                               if (debug_vsync_forced_delay > 0)
+                                       val = debug_vsync_forced_delay * vsynctimebase / 100;
+                               max = vsynctimebase - val;
                        }
 
-                       vsynctimeperline = (max - (skipcnt64 / llvsynccnt) * 2) / 3;
-                       if (vsynctimeperline < 1)
+                       vsynctimeperline = max / 3;
+                       if (status <= 0 || vsynctimeperline < 1)
                                vsynctimeperline = 1;
                        vsyncmaxtime = now + max;
 
                        if (0 || (log_vsync & 2)) {
-                               write_log (L"%06d:%06d:%06d:%06d/%06d\n", (int)(frameskipt64 / frameskipt64cnt), (int)(skipcnt64 / llvsynccnt), adjust, vsynctimeperline, vsynctimebase);
+                               write_log (L"%06d:%06d:%06d:%06d %06d/%06d %03d%%\n", frameskipt_avg, flipdelay_avg, adjust, adjustx,
+                                       vsynctimeperline, vsynctimebase, (vsynctimebase - max) * 100 / vsynctimebase);
                        }
 
                        frame_shown = true;
 
                }
-               return ok;
+               return status != 0;
        }
 
+       int clockadjust = 0;
+#if 0
+       static uae_u32 prevtick;
+       static int frametickcnt;
+
+       uae_u32 tick = read_system_time (); // milliseconds
+       uae_s32 tickdiff = tick - prevtick;
+       uae_s32 framems = (frametickcnt * 1000) / (int)(vblank_hz + 0.5);
+       if (abs (framems - tickdiff) >= 2000) {
+               framems = 0;
+               tickdiff = 0;
+               prevtick = tick;
+               frametickcnt = 0;
+               write_log (L"!\n");
+       } else {
+               frametickcnt++;
+       }
+       int diff = (framems - tickdiff) / 1;
+       if (diff < -5000)
+               diff = -5000;
+       else if (diff > 5000)
+               diff = 5000;
+       clockadjust = -vsynctimebase * diff / 1000;
+       clockadjust *= 100;
+       write_log (L"%d:%d:%d\n", framems - tickdiff, diff, clockadjust);
+#endif
        if (currprefs.m68k_speed < 0) {
 
                if (!frame_rendered && !picasso_on)
@@ -5440,14 +5505,12 @@ static bool framewait (void)
                int max;
                int adjust = 0;
                if ((int)curr_time - (int)vsyncwaittime > 0 && (int)curr_time - (int)vsyncwaittime < vsynctimebase / 2)
-                       adjust = curr_time - vsyncwaittime;
+                       adjust += curr_time - vsyncwaittime;
+               adjust += clockadjust;
                max = vsynctimebase * (1000 + currprefs.m68k_speed_throttle) / 1000 - adjust;
                vsyncwaittime = curr_time + vsynctimebase - adjust;
                vsyncmintime = curr_time;
-               
-#if 0
-               max -= frameskipt;
-#endif
+
                if (max < 0) {
                        max = 0;
                        vsynctimeperline = 1;
@@ -5455,6 +5518,9 @@ static bool framewait (void)
                        vsynctimeperline = max / (maxvpos_nom + 1);
                }
                vsyncmaxtime = curr_time + max;
+
+               if (0)
+                       write_log (_T("%06d:%06d/%06d\n"), adjust, vsynctimeperline, vsynctimebase);
        
        } else {
 
@@ -5466,14 +5532,14 @@ static bool framewait (void)
                        t = read_processor_time () - start;
                }
                while (!currprefs.turbo_emulation) {
-                       double v = rpt_vsync () / (syncbase / 1000.0);
+                       double v = rpt_vsync (clockadjust) / (syncbase / 1000.0);
                        if (v >= -4)
                                break;
                        rtg_vsynccheck ();
                        sleep_millis_main (2);
                }
                curr_time = start = read_processor_time ();
-               while (rpt_vsync () < 0)
+               while (rpt_vsync (clockadjust) < 0)
                        rtg_vsynccheck ();
                idletime += read_processor_time() - start;
                curr_time = read_processor_time ();
@@ -5483,8 +5549,8 @@ static bool framewait (void)
                        show_screen ();
                        t += read_processor_time () - curr_time;
                }
-               t += frameskipt;
-               vsynctimeperline = (vsynctimebase - (t + frameskipt)) / 3;
+               t += frameskipt_avg;
+               vsynctimeperline = (vsynctimebase - t) / 3;
                if (vsynctimeperline < 0)
                        vsynctimeperline = 0;
                else if (vsynctimeperline > vsynctimebase / 3)
@@ -5492,7 +5558,7 @@ static bool framewait (void)
                frame_shown = true;
 
        }
-       return ok;
+       return status != 0;
 }
 
 
@@ -5661,7 +5727,7 @@ static void vsync_handler_post (void)
        }
 #endif
 
-       if ((beamcon0 & (0x20 | 0x80)) != (new_beamcon0 & (0x20 | 0x80)) || abs (vpos_count - vpos_count_diff) > 1 || lof_changed) {
+       if ((beamcon0 & (0x20 | 0x80)) != (new_beamcon0 & (0x20 | 0x80)) || (vpos_count > 0 && abs (vpos_count - vpos_count_diff) > 1) || lof_changed) {
                init_hz ();
        } else if (interlace_changed || changed_chipset_refresh ()) {
                compute_framesync ();
@@ -6106,7 +6172,7 @@ static void hsync_handler_post (bool onvsync)
                                is_syncline = 0;
                        } else {
                                vsyncmintime = vsyncmaxtime; /* emulate if still time left */
-                               is_syncline_end = read_processor_time () + vsynctimebase;
+                               is_syncline_end = read_processor_time () + vsynctimebase; /* far enough in future, we never wait that long */
                                is_syncline = 1;
                        }
                } else {
@@ -6115,7 +6181,7 @@ static void hsync_handler_post (bool onvsync)
                        vsyncmintime += vsynctimeperline;
                        linecounter++;
                        is_syncline = 0;
-                       if (!vblank_found_chipset && !currprefs.turbo_emulation) {
+                       if (!vsync_isdone () && !currprefs.turbo_emulation) {
                                if ((int)vsyncmaxtime - (int)vsyncmintime > 0) {
                                        if ((int)vsyncwaittime - (int)vsyncmintime > 0) {
                                                frame_time_t rpt = read_processor_time ();
@@ -6141,11 +6207,11 @@ static void hsync_handler_post (bool onvsync)
                        }
                }
        } else {
-               if (!currprefs.turbo_emulation && (vpos + 1 < maxvpos + lof_store && (vpos == maxvpos_nom * 1 / 3 || vpos == maxvpos_nom * 2 / 3))) {
+               if (!vsync_isdone () && !currprefs.turbo_emulation && (vpos + 1 < maxvpos + lof_store && (vpos == maxvpos_nom * 1 / 3 || vpos == maxvpos_nom * 2 / 3))) {
                        frame_time_t rpt = read_processor_time ();
                        vsyncmintime += vsynctimeperline;
                        // sleep if more than 2ms "free" time
-                       while (!vblank_found_chipset && (int)vsyncmintime - (int)(rpt + vsynctimebase / 10) > 0 && (int)vsyncmintime - (int)rpt < vsynctimebase) {
+                       while (!vsync_isdone () && (int)vsyncmintime - (int)(rpt + vsynctimebase / 10) > 0 && (int)vsyncmintime - (int)rpt < vsynctimebase) {
                                sleep_millis_main (1);
                                rpt = read_processor_time ();
                                //write_log (L"*");
@@ -6257,16 +6323,15 @@ static void hsync_handler_post (bool onvsync)
        if (diw_change > 0)
                diw_change--;
 
-       if (is_last_line () && isvsync_chipset () == -2 && !vsync_rendered && currprefs.gfx_apmode[0].gfx_vflip == 0) {
+       /* fastest possible + last line and no vflip wait: render the frame as early as possible */
+       if (is_last_line () && isvsync_chipset () <= -2 && !vsync_rendered && currprefs.gfx_apmode[0].gfx_vflip == 0) {
                frame_time_t start, end;
                start = read_processor_time ();
-               /* fastest possible + last line and no vflip wait: render the frame as early as possible */
                vsync_rendered = true;
                vsync_handle_redraw (lof_store, lof_changed, bplcon0, bplcon3);
                if (vblank_hz_state) {
                        frame_rendered = render_screen (true);
                }
-               frame_shown = true;
                end = read_processor_time ();
                frameskiptime += end - start;
        }
index f2960fceb26e7a8032498f15f651af599926242c..b90072a6aa37828b0f1c7052667c3721923c4535 100644 (file)
--- a/disk.cpp
+++ b/disk.cpp
@@ -3691,6 +3691,8 @@ uae_u8 *restore_disk (int num,uae_u8 *src)
        drv->dskchange_time = 0;
        restore_u32 ();
        s = restore_path (SAVESTATE_PATH_FLOPPY);
+       if (s && s[0])
+               write_log (L"-> '%s'\n", s);
        _tcscpy (old, currprefs.floppyslots[num].df);
        _tcsncpy (changed_prefs.floppyslots[num].df, s, 255);
        xfree (s);
index a587f7ab249c13b49f337b3beca2b556d626c665..b8cb6b514125a124f2a418d98791f2a427d752d7 100644 (file)
@@ -21,7 +21,8 @@ long max_cycles_to_next_event;
 long cycles_to_hsync_event;
 unsigned long start_cycles;
 
-frame_time_t vsynctimebase, vsyncmintime, vsyncmaxtime, vsyncwaittime;
+frame_time_t vsyncmintime, vsyncmaxtime, vsyncwaittime;
+int vsynctimebase;
 
 void events_schedule (void)
 {
@@ -56,7 +57,7 @@ void do_cycles_slow (unsigned long cycles_to_add)
                                        int rpt = read_processor_time ();
                                        int v = rpt - vsyncmintime;
                                        int v2 = rpt - is_syncline_end;
-                                       if (v > (int)vsynctimebase || v < -((int)vsynctimebase)) {
+                                       if (v > vsynctimebase || v < -vsynctimebase) {
                                                v = 0;
                                        }
                                        if (v < 0 && v2 < 0) {
index 8a736170b87e94dbbc43fd8c07d98605159297bf..9c3e7ccd663427794e6ae5d4b0394a335c6dc1d9 100644 (file)
@@ -18,6 +18,8 @@
 
 double getvsyncrate (double hz, int *mult)
 {
+       struct apmode *ap = picasso_on ? &currprefs.gfx_apmode[1] : &currprefs.gfx_apmode[0];
+
        if (hz < 0)
                return 0;
        if (hz > 85) {
@@ -25,7 +27,10 @@ double getvsyncrate (double hz, int *mult)
                return hz / 2;
        }
        if (hz < 35 && hz > 0) {
-               *mult = 1;
+               if (ap->gfx_interlaced)
+                       *mult = 0;
+               else
+                       *mult = 1;
                return hz * 2;
        }
        *mult = 0;
index 8510a38c03a936f5e4d170d683e8dda778a3a54d..27d4c21c928ff6a04cb6b4ab66e96a49a34151e7 100644 (file)
@@ -7,13 +7,12 @@
   *
   */
 
-//#define TRACING_ENABLED
+#define BSD_TRACING_ENABLED 0
 
-#ifdef TRACING_ENABLED
-#define BSDTRACE(x) do { write_log x; } while(0)
-#else
-#define BSDTRACE(x)
-#endif
+extern int log_bsd;
+
+#define ISBSDTRACE (log_bsd || BSD_TRACING_ENABLED) 
+#define BSDTRACE(x) do { if (ISBSDTRACE) { write_log x; } } while(0)
 
 extern int init_socket_layer (void);
 extern void deinit_socket_layer (void);
index 4454cd3e3f8f14873df8f0edc1a681f79fc18e5f..0acaac282841ade60a0477cd28fba0d0dbef7d8f 100644 (file)
@@ -15,6 +15,9 @@
 #define CSMASK_AGA 4
 #define CSMASK_MASK (CSMASK_ECS_AGNUS | CSMASK_ECS_DENISE | CSMASK_AGA)
 
+#define CHIPSET_CLOCK_PAL  3546895
+#define CHIPSET_CLOCK_NTSC 3579545
+
 uae_u32 get_copper_address (int copno);
 
 extern int custom_init (void);
@@ -115,7 +118,6 @@ extern int minfirstline, vblank_endline, numscrlines;
 extern double vblank_hz, fake_vblank_hz;
 extern int vblank_skip, doublescan;
 extern bool programmedmode;
-extern frame_time_t syncbase;
 
 #define DMA_AUD0      0x0001
 #define DMA_AUD1      0x0002
index 333fe1336716f947c85355d5e5fb594828e6b8c3..66b2308e36645229fea2dec0655815aede001d4c 100644 (file)
@@ -16,9 +16,9 @@
 
 #include "machdep/rpt.h"
 
-extern frame_time_t vsynctimebase, vsyncmintime, vsyncmaxtime, vsyncwaittime;
+extern frame_time_t vsyncmintime, vsyncmaxtime, vsyncwaittime;
+extern int vsynctimebase, syncbase;
 extern void reset_frame_rate_hack (void);
-extern frame_time_t syncbase;
 extern unsigned long int vsync_cycles;
 extern unsigned long start_cycles;
 
index 524e2e8a0f807c6d04d9c146f549811a31ee269e..a4b7eb63e8c020f4e5d93ea31fa768abb68a9e60 100644 (file)
@@ -21,8 +21,8 @@
  * function has to be setup with deftrap2() and
  * TRAPFLAG_EXTRA_STACK and stack magic is required.
  */
-uaecptr uae_AllocMem (TrapContext *context, uae_u32 size, uae_u32 flags);
-void uae_FreeMem (TrapContext *context, uaecptr memory, uae_u32 size);
+uaecptr uae_AllocMem (TrapContext *context, uae_u32 size, uae_u32 flags, uaecptr sysbase);
+void uae_FreeMem (TrapContext *context, uaecptr memory, uae_u32 size, uaecptr sysbase);
 
 
 /*
index de4c61b45c77f2d218f21061b2633563a5e4fbc3..eeb4ab4d86cdc3f1559f4507ffb5437c4921e555 100644 (file)
@@ -29,9 +29,10 @@ extern void toggle_mousegrab (void);
 extern void desktop_coords (int *dw, int *dh, int *x, int *y, int *w, int *h);
 extern bool vsync_switchmode (int);
 extern frame_time_t vsync_busywait_end (int*);
-extern bool vsync_busywait_do (int*, bool, bool);
+extern int vsync_busywait_do (int*, bool, bool);
 extern void vsync_busywait_start (void);
 extern double vblank_calibrate (double, bool);
+extern bool vsync_isdone (void);
 extern void doflashscreen (void);
 extern int flashscreen;
 extern void updatedisplayarea (void);
index 37e9cc40ac05e4818721ddc2eb10d2b55b49908a..a8c60c41bce479ca0aeefa7ce73a6a3f32a9e8e0 100644 (file)
@@ -113,16 +113,16 @@ void uae_NewList (uaecptr list)
        x_put_long (list + 8, list);
 }
 
-uaecptr uae_AllocMem (TrapContext *context, uae_u32 size, uae_u32 flags)
+uaecptr uae_AllocMem (TrapContext *context, uae_u32 size, uae_u32 flags, uaecptr sysbase)
 {
        m68k_dreg (regs, 0) = size;
        m68k_dreg (regs, 1) = flags;
-       return CallLib (context, x_get_long (4), -198); /* AllocMem */
+       return CallLib (context, sysbase, -198); /* AllocMem */
 }
 
-void uae_FreeMem (TrapContext *context, uaecptr memory, uae_u32 size)
+void uae_FreeMem (TrapContext *context, uaecptr memory, uae_u32 size, uaecptr sysbase)
 {
        m68k_dreg (regs, 0) = size;
        m68k_areg (regs, 1) = memory;
-       CallLib (context, x_get_long (4), -0xD2); /* FreeMem */
+       CallLib (context, sysbase, -0xD2); /* FreeMem */
 }
index 5d0e7320284403156bb746eb79cbb684ef3c54df..06f190f1a723f6c57163f771ecd79c380120a178 100644 (file)
@@ -1114,7 +1114,7 @@ static void update_68k_cycles (void)
        currprefs.cpu_clock_multiplier = changed_prefs.cpu_clock_multiplier;
        currprefs.cpu_frequency = changed_prefs.cpu_frequency;
 
-       baseclock = currprefs.ntscmode ? 28636360 : 28375160;
+       baseclock = (currprefs.ntscmode ? CHIPSET_CLOCK_NTSC : CHIPSET_CLOCK_PAL) * 8;
        cpucycleunit = CYCLE_UNIT / 2;
        if (currprefs.cpu_clock_multiplier) {
                if (currprefs.cpu_clock_multiplier >= 256) {
index 8aaafa0b0fa9bd000d3a659d0e0928cf9d7a45fb..246824c586c9da47d8cf715c5db71a773c85036a 100644 (file)
@@ -247,7 +247,7 @@ static int do_raw_scsi (struct dev_info_ioctl *ciw, int unitnum, uae_u8 *cmd, in
        reseterrormode (ciw);
        if (!status) {
                DWORD err = GetLastError ();
-               write_log (_T("IOCTL_RAW_SCSI unit %d, CMD=%d, ERR=%d "), unitnum, cmd[0], err);
+               write_log (_T("IOCTL_RAW_SCSI unit %d, CMD=%d, ERR=%d\n"), unitnum, cmd[0], err);
                return 0;
        }
        int tlen = swb.spt.DataTransferLength > datalen ? datalen : swb.spt.DataTransferLength;
@@ -255,12 +255,11 @@ static int do_raw_scsi (struct dev_info_ioctl *ciw, int unitnum, uae_u8 *cmd, in
        return tlen;
 }
 
-static int spti_inquiry (struct dev_info_ioctl *ciw, int unitnum, uae_u8 *data)
+static int spti_inquiry (struct dev_info_ioctl *ciw, int unitnum, uae_u8 *data, int *datalen)
 {
        uae_u8 cmd[6] = { 0x12,0,0,0,36,0 }; /* INQUIRY */
        int len = sizeof cmd;
-
-       do_raw_scsi (ciw, unitnum, cmd, len, data, 256);
+       *datalen = do_raw_scsi (ciw, unitnum, cmd, len, data, 254);
        return 1;
 }
 
@@ -324,8 +323,11 @@ extern void encode_l2 (uae_u8 *p, int address);
 
 static int read2048 (struct dev_info_ioctl *ciw, int sector)
 {
+       LARGE_INTEGER offset;
+
        seterrormode (ciw);
-       if (SetFilePointer (ciw->h, sector * 2048, 0, FILE_BEGIN) == INVALID_SET_FILE_POINTER) {
+       offset.QuadPart = (uae_u64)sector * 2048;
+       if (SetFilePointer (ciw->h, offset.LowPart, &offset.HighPart, FILE_BEGIN) == INVALID_SET_FILE_POINTER && GetLastError () != NO_ERROR) {
                reseterrormode (ciw);
                return 0;
        }
@@ -960,9 +962,11 @@ static int ioctl_command_readwrite (int unitnum, int sector, int size, int write
                return 0;
        ciw->cd_last_pos = sector;
        while (cnt-- > 0) {
+               LARGE_INTEGER offset;
                gui_flicker_led (LED_CD, unitnum, LED_CD_ACTIVE);
                seterrormode (ciw);
-               if (SetFilePointer (ciw->h, sector * ciw->di.bytespersector, 0, FILE_BEGIN) == INVALID_SET_FILE_POINTER) {
+               offset.QuadPart = (uae_u64)sector * ciw->di.bytespersector;
+               if (SetFilePointer (ciw->h, offset.LowPart, &offset.HighPart, FILE_BEGIN) == INVALID_SET_FILE_POINTER && GetLastError () != NO_ERROR) {
                        reseterrormode (ciw);
                        if (win32_error (ciw, unitnum, _T("SetFilePointer")) < 0)
                                continue;
@@ -1196,6 +1200,8 @@ static void trim (TCHAR *s)
 static int sys_cddev_open (struct dev_info_ioctl *ciw, int unitnum)
 {
        uae_u8 inquiry[256];
+       int datalen;
+
        ciw->cdda_volume[0] = 0x7fff;
        ciw->cdda_volume[1] = 0x7fff;
        ciw->cdda_volume_main = currprefs.sound_volume_cd >= 0 ? currprefs.sound_volume_cd : currprefs.sound_volume;
@@ -1208,11 +1214,11 @@ static int sys_cddev_open (struct dev_info_ioctl *ciw, int unitnum)
 
        _tcscpy (ciw->di.vendorid, _T("UAE"));
        _stprintf (ciw->di.productid, _T("SCSI CD%d IMG"), unitnum);
-       _tcscpy (ciw->di.revision, _T("0.1"));
+       _tcscpy (ciw->di.revision, _T("0.2"));
        memset (inquiry, 0, sizeof inquiry);
-       if (spti_inquiry (ciw, unitnum, inquiry)) {
+       if (spti_inquiry (ciw, unitnum, inquiry, &datalen)) {
                // check also that device type is non-zero and it is removable
-               if ((inquiry[0] & 31) && (inquiry[1] & 0x80) && inquiry[8]) {
+               if (datalen >= 36 && (inquiry[0] & 31) && (inquiry[1] & 0x80) && inquiry[8]) {
                        char tmp[20];
                        TCHAR *s;
                        memcpy (tmp, inquiry + 8, 8);
index 66ef10bcd2633fd425e1ad8a25a4c6d03ef0c04f..1e4ac3c62479675b58a8178a8bb0de4d36587235 100644 (file)
@@ -905,17 +905,13 @@ static BOOL HandleStuff(void)
 static LRESULT CALLBACK SocketWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 {
        if(message >= 0xB000 && message < 0xB000 + MAXPENDINGASYNC * 2) {
-#ifdef TRACING_ENABLED
-               write_log (_T("sockmsg(0x%x[%d], 0x%x, 0x%x)\n"), message, (message - 0xb000) / 2, wParam, lParam );
-#endif
+               BSDTRACE((_T("sockmsg(0x%x[%d], 0x%x, 0x%x)\n"), message, (message - 0xb000) / 2, wParam, lParam));
                sockmsg(message, wParam, lParam);
                return 0;
        }
        return DefWindowProc(hwnd, message, wParam, lParam);
 }
 
-
-
 static unsigned int sock_thread2(void *blah)
 {
        unsigned int result = 0;
@@ -1076,12 +1072,12 @@ void host_sendto (TrapContext *context, SB, uae_u32 sd, uae_u32 msg, uae_u32 len
 
        wscnt = ++wscounter;
 
-#ifdef TRACING_ENABLED
+
        if (to)
                BSDTRACE((_T("sendto(%d,0x%x,%d,0x%x,0x%x,%d):%d-> "),sd,msg,len,flags,to,tolen,wscnt));
        else
                BSDTRACE((_T("send(%d,0x%x,%d,%d):%d -> "),sd,msg,len,flags,wscnt));
-#endif
+
        sd++;
        s = getsock(sb,sd);
 
@@ -1217,13 +1213,10 @@ void host_sendto (TrapContext *context, SB, uae_u32 sd, uae_u32 msg, uae_u32 len
        } else
                sb->resultval = -1;
 
-#ifdef TRACING_ENABLED
        if (sb->resultval == -1)
                BSDTRACE((_T("sendto failed (%d):%d\n"),sb->sb_errno,wscnt));
        else
                BSDTRACE((_T("sendto %d:%d\n"),sb->resultval,wscnt));
-#endif
-
 }
 
 void host_recvfrom(TrapContext *context, SB, uae_u32 sd, uae_u32 msg, uae_u32 len, uae_u32 flags, uae_u32 addr, uae_u32 addrlen)
@@ -1239,12 +1232,11 @@ void host_recvfrom(TrapContext *context, SB, uae_u32 sd, uae_u32 msg, uae_u32 le
 
        wscnt = ++wscounter;
 
-#ifdef TRACING_ENABLED
        if (addr)
                BSDTRACE((_T("recvfrom(%d,0x%x,%d,0x%x,0x%x,%d):%d -> "),sd,msg,len,flags,addr,get_long (addrlen),wscnt));
        else
                BSDTRACE((_T("recv(%d,0x%x,%d,0x%x):%d -> "),sd,msg,len,flags,wscnt));
-#endif
+
        sd++;
        s = getsock(sb,sd);
 
@@ -1343,13 +1335,10 @@ void host_recvfrom(TrapContext *context, SB, uae_u32 sd, uae_u32 msg, uae_u32 le
        } else
                sb->resultval = -1;
 
-#ifdef TRACING_ENABLED
        if (sb->resultval == -1)
                BSDTRACE((_T("recv failed (%d):%d\n"),sb->sb_errno,wscnt));
        else
                BSDTRACE((_T("recv %d:%d\n"),sb->resultval,wscnt));
-#endif
-
 }
 
 uae_u32 host_shutdown(SB, uae_u32 sd, uae_u32 how)
@@ -1916,7 +1905,8 @@ static unsigned int __stdcall thread_WaitSelect(void *p)
 
 static void fddebug(const TCHAR *name, uae_u32 nfds, uae_u32 fd)
 {
-#ifdef TRACING_ENABLED
+       if (!ISBSDTRACE)
+               return;
        if (!nfds)
                return;
        if (!fd)
@@ -1927,8 +1917,7 @@ static void fddebug(const TCHAR *name, uae_u32 nfds, uae_u32 fd)
                out[i] = (v & (1 << i)) ? 'x' : '-';
                out[i + 1] = 0;
        }
-       write_log (_T("%s: %08x %s\n"), name, v, out);
-#endif
+       BSDTRACE((_T("%s: %08x %s\n"), name, v, out));
 }
 
 void host_WaitSelect(TrapContext *context, SB, uae_u32 nfds, uae_u32 readfds, uae_u32 writefds, uae_u32 exceptfds, uae_u32 timeout, uae_u32 sigmp)
@@ -2111,11 +2100,11 @@ uae_u32 host_Inet_NtoA(TrapContext *context, SB, uae_u32 in)
        if ((addr = inet_ntoa(ina)) != NULL) {
                scratchbuf = m68k_areg (regs,6) + offsetof(struct UAEBSDBase,scratchbuf);
                strncpyha(scratchbuf,addr,SCRATCHBUFSIZE);
-#ifdef TRACING_ENABLED
-               TCHAR *s = au (addr);
-               BSDTRACE((_T("%s\n"),s));
-               xfree (s);
-#endif
+               if (ISBSDTRACE) {
+                       TCHAR *s = au (addr);
+                       BSDTRACE((_T("%s\n"),s));
+                       xfree (s);
+               }
                return scratchbuf;
        } else
                SETERRNO;
@@ -2136,11 +2125,11 @@ uae_u32 host_inet_addr(uae_u32 cp)
 
        addr = htonl(inet_addr(cp_rp));
 
-#ifdef TRACING_ENABLED
-       TCHAR *s = au (cp_rp);
-       BSDTRACE((_T("inet_addr(%s) -> 0x%08lx\n"),s,addr));
-       xfree (s);
-#endif
+       if (ISBSDTRACE) {
+               TCHAR *s = au (cp_rp);
+               BSDTRACE((_T("inet_addr(%s) -> 0x%08lx\n"),s,addr));
+               xfree (s);
+       }
        return addr;
 }
 
@@ -2438,11 +2427,11 @@ void host_gethostbynameaddr (TrapContext *context, SB, uae_u32 name, uae_u32 nam
                name_rp = (char*)get_real_address (name);
 
        if (addrtype == -1) {
-#ifdef TRACING_ENABLED
-               TCHAR *s = au (name_rp);
-               BSDTRACE((_T("gethostbyname(%s) -> "),s));
-               xfree (s);
-#endif
+               if (ISBSDTRACE) {
+                       TCHAR *s = au (name_rp);
+                       BSDTRACE((_T("gethostbyname(%s) -> "),s));
+                       xfree (s);
+               }
                // workaround for numeric host "names"
                if ((addr = inet_addr(name_rp)) != INADDR_NONE) {
                        bsdsocklib_seterrno(sb,0);
@@ -2490,10 +2479,10 @@ kludge:
                }
 
                if (sb->hostent) {
-                       uae_FreeMem(context, sb->hostent, sb->hostentsize);
+                       uae_FreeMem(context, sb->hostent, sb->hostentsize, sb->sysbase);
                }
 
-               sb->hostent = uae_AllocMem(context, size, 0);
+               sb->hostent = uae_AllocMem(context, size, 0, sb->sysbase);
 
                if (!sb->hostent) {
                        write_log (_T("BSDSOCK: WARNING - gethostby%s() ran out of Amiga memory ")
@@ -2523,11 +2512,12 @@ kludge:
                put_long (sb->hostent, aptr);
                addstr_ansi (&aptr, h->h_name);
 
-#ifdef TRACING_ENABLED
-               TCHAR *s = au (h->h_name);
-               BSDTRACE((_T("OK (%s):%d\n"), s, argsp->wscnt));
-               xfree (s);
-#endif
+               if (ISBSDTRACE) {
+                       TCHAR *s = au (h->h_name);
+                       BSDTRACE((_T("OK (%s):%d\n"), s, argsp->wscnt));
+                       xfree (s);
+               }
+
                bsdsocklib_seterrno(sb, 0);
                bsdsocklib_setherrno(sb, 0);
 
@@ -2559,11 +2549,11 @@ void host_getprotobyname(TrapContext *context, SB, uae_u32 name)
        if (addr_valid (_T("host_gethostbynameaddr"), name, 1))
                name_rp = (char*)get_real_address (name);
 
-#ifdef TRACING_ENABLED
-       TCHAR *s = au (name_rp);
-       BSDTRACE((_T("getprotobyname(%s):%d -> "),s, argsp->wscnt));
-       xfree (s);
-#endif
+       if (ISBSDTRACE) {
+               TCHAR *s = au (name_rp);
+               BSDTRACE((_T("getprotobyname(%s):%d -> "),s, argsp->wscnt));
+               xfree (s);
+       }
 
        argsp->args1 = 1;
        argsp->args2 = name;
@@ -2584,19 +2574,19 @@ void host_getprotobyname(TrapContext *context, SB, uae_u32 name)
                        while (p->p_aliases[numaliases]) size += strlen(p->p_aliases[numaliases++])+5;
 
                if (sb->protoent) {
-                       uae_FreeMem(context, sb->protoent, sb->protoentsize);
+                       uae_FreeMem(context, sb->protoent, sb->protoentsize, sb->sysbase);
                }
 
-               sb->protoent = uae_AllocMem(context, size, 0);
+               sb->protoent = uae_AllocMem(context, size, 0, sb->sysbase);
 
                if (!sb->protoent) {
-#ifdef TRACING_ENABLED
-                       TCHAR *s = au (name_rp);
-                       write_log (_T("BSDSOCK: WARNING - getprotobyname() ran out of Amiga memory ")
-                               _T("(couldn't allocate %ld bytes) while returning result of lookup for '%s':%d\n"),
-                               size, s, argsp->wscnt);
-                       xfree (s);
-#endif
+                       if (ISBSDTRACE) {
+                               TCHAR *s = au (name_rp);
+                               write_log (_T("BSDSOCK: WARNING - getprotobyname() ran out of Amiga memory ")
+                                       _T("(couldn't allocate %ld bytes) while returning result of lookup for '%s':%d\n"),
+                                       size, s, argsp->wscnt);
+                               xfree (s);
+                       }
                        bsdsocklib_seterrno(sb,12); // ENOMEM
                        release_get_thread (tindex);
                        return;
@@ -2615,11 +2605,11 @@ void host_getprotobyname(TrapContext *context, SB, uae_u32 name)
                put_long (sb->protoent + 12 + numaliases * 4,0);
                put_long (sb->protoent, aptr);
                addstr_ansi (&aptr, p->p_name);
-#ifdef TRACING_ENABLED
-               TCHAR *s = au (p->p_name);
-               BSDTRACE((_T("OK (%s, %d):%d\n"), s, p->p_proto, argsp->wscnt));
-               xfree (s);
-#endif
+               if (ISBSDTRACE) {
+                       TCHAR *s = au (p->p_name);
+                       BSDTRACE((_T("OK (%s, %d):%d\n"), s, p->p_proto, argsp->wscnt));
+                       xfree (s);
+               }
                bsdsocklib_seterrno (sb,0);
 
        } else {
@@ -2687,10 +2677,10 @@ void host_getservbynameport(TrapContext *context, SB, uae_u32 nameport, uae_u32
                                size += strlen(s->s_aliases[numaliases++])+5;
 
                if (sb->servent) {
-                       uae_FreeMem(context, sb->servent, sb->serventsize);
+                       uae_FreeMem(context, sb->servent, sb->serventsize, sb->sysbase);
                }
 
-               sb->servent = uae_AllocMem(context, size, 0);
+               sb->servent = uae_AllocMem(context, size, 0, sb->sysbase);
 
                if (!sb->servent) {
                        write_log (_T("BSDSOCK: WARNING - getservby%s() ran out of Amiga memory (couldn't allocate %ld bytes):%d\n"), type ? _T("port") : _T("name"), size, argsp->wscnt);
@@ -2715,11 +2705,12 @@ void host_getservbynameport(TrapContext *context, SB, uae_u32 nameport, uae_u32
                put_long (sb->servent + 12, aptr);
                addstr_ansi (&aptr, s->s_proto);
 
-#ifdef TRACING_ENABLED
-               TCHAR *ss = au (s->s_name);
-               BSDTRACE((_T("OK (%s, %d):%d\n"), ss, (unsigned short)htons(s->s_port), argsp->wscnt));
-               xfree (ss);
-#endif
+               if (ISBSDTRACE) {
+                       TCHAR *ss = au (s->s_name);
+                       BSDTRACE((_T("OK (%s, %d):%d\n"), ss, (unsigned short)htons(s->s_port), argsp->wscnt));
+                       xfree (ss);
+               }
+
                bsdsocklib_seterrno(sb, 0);
 
        } else {
index 7f1bef3bd465f01fe31fbdf01bafb5d620538dc2..4bef51afdb9c9189f4fbf3f3a5f3ae1a87a6150c 100644 (file)
@@ -2216,12 +2216,13 @@ const TCHAR *D3D_init (HWND ahwnd, int w_w, int w_h, int depth, int mmult)
                write_log (_T("DYNAMIC "));
        write_log (_T("\n"));
 
-       write_log (_T("%s: PS=%d.%d VS=%d.%d %d*%d*%d%s VS=%d B=%d%s %d-bit %d\n"),
+       write_log (_T("%s: PS=%d.%d VS=%d.%d %d*%d*%d%s%s VS=%d B=%d%s %d-bit %d\n"),
                D3DHEAD,
                (d3dCaps.PixelShaderVersion >> 8) & 0xff, d3dCaps.PixelShaderVersion & 0xff,
                (d3dCaps.VertexShaderVersion >> 8) & 0xff, d3dCaps.VertexShaderVersion & 0xff,
                modeex.Width, modeex.Height,
                dpp.FullScreen_RefreshRateInHz,
+               ap->gfx_interlaced ? _T("i") : _T("p"),
                dpp.Windowed ? _T("") : _T(" FS"),
                vsync, ap->gfx_backbuffers,
                ap->gfx_vflip < 0 ? _T("WE") : (ap->gfx_vflip > 0 ? _T("WS") :  _T("I")), 
@@ -2231,6 +2232,15 @@ const TCHAR *D3D_init (HWND ahwnd, int w_w, int w_h, int depth, int mmult)
        if ((d3dCaps.PixelShaderVersion < D3DPS_VERSION(2,0) || !psEnabled || max_texture_w < 2048 || max_texture_h < 2048 || !shaderon) && d3d_ex) {
                D3DEX = 0;
                write_log (_T("Disabling D3D9Ex\n"));
+               if (d3ddev) {
+                       d3ddev->Release ();
+                       d3ddev = NULL;
+               }
+               if (d3d) {
+                       d3d->Release ();
+                       d3d = NULL;
+               }
+               d3ddevex = NULL;
                return D3D_init (ahwnd, w_w, w_h, depth, mmult);
        }
        if (!shaderon)
index aaaccc69b49fe411d4a1787b9ba43b799198954f..16ec503fb4644bbaf5022659ea2e0ef3f7b2d7ab 100644 (file)
@@ -429,7 +429,7 @@ HRESULT DirectDraw_SetDisplayMode (int width, int height, int bits, int freq)
        dxdata.vblank_skip_cnt = 0;
        ddrval = IDirectDraw7_SetDisplayMode (dxdata.maindd, width, height, bits, freq, 0);
        if (FAILED (ddrval)) {
-               write_log (_T("IDirectDraw7_SetDisplayMode: %s\n"), DXError (ddrval));
+               write_log (_T("IDirectDraw7_SetDisplayMode(%d,%d,%d,%d): %s\n"), width, height, bits, freq, DXError (ddrval));
                IDirectDraw7_RestoreDisplayMode (dxdata.maindd);
                dxdata.fsmodeset = 0;
        } else {
index df6b37fd8ea0280baa636020299e32b4db40e05b..a8e4b754f5fc420e4ba4481330d2d106493bf0a6 100644 (file)
@@ -51,18 +51,22 @@ struct ScreenResolution
 
 #define MAX_PICASSO_MODES 300
 #define MAX_REFRESH_RATES 100
+
+#define REFRESH_RATE_RAW 1
+#define REFRESH_RATE_LACE 2
+
 struct PicassoResolution
 {
        struct ScreenResolution res;
        int depth;   /* depth in bytes-per-pixel */
        int residx;
        int refresh[MAX_REFRESH_RATES]; /* refresh-rates in Hz */
-       int refreshtype[MAX_REFRESH_RATES]; /* 0=normal,1=raw */
+       int refreshtype[MAX_REFRESH_RATES]; /* 0=normal,1=raw,2=lace */
        TCHAR name[25];
        /* Bit mask of RGBFF_xxx values.  */
        uae_u32 colormodes;
        int rawmode;
-       bool lace;
+       bool lace; // all modes lace
 };
 
 struct MultiDisplay {
index 174b71c5b769d41c7a6de968c4cfb1e2b12d8fe4..bea980810672008ee9133367c2f8512742e4a2e0 100644 (file)
@@ -980,11 +980,11 @@ static int getstorageproperty (PUCHAR outBuf, int returnedLength, struct uae_dri
        p = (PUCHAR) outBuf;
        if (offsetof(STORAGE_DEVICE_DESCRIPTOR, CommandQueueing) > size) {
                write_log (_T("too short STORAGE_DEVICE_DESCRIPTOR only %d bytes\n"), size);
-               return 1;
+               return -2;
        }
        if (devDesc->DeviceType != INQ_DASD && devDesc->DeviceType != INQ_ROMD && devDesc->DeviceType != INQ_OPTD) {
                write_log (_T("not a direct access device, ignored (type=%d)\n"), devDesc->DeviceType);
-               return 1;
+               return -2;
        }
        if (size > offsetof(STORAGE_DEVICE_DESCRIPTOR, VendorIdOffset) && devDesc->VendorIdOffset && p[devDesc->VendorIdOffset]) {
                j = 0;
index 2db2742c94f68fa114624d33eaf1ea84c0e8cf53..e4aea4a99dae2a0d38ced23154cb5249e5194532 100644 (file)
@@ -11,5 +11,6 @@
 
 typedef unsigned long frame_time_t;
 extern frame_time_t read_processor_time (void);
+extern uae_u32 read_system_time (void);
 
 #endif
index 1b00bd9e9871f178a43cc03a7ca792a6b72dbdf6..b690fdc77a75017f830b5df7964c77781876ad36 100644 (file)
@@ -37,9 +37,9 @@
 #include "registry.h"
 #include "win32gui.h"
 
-//#define TRACING_ENABLED
+//#define MIDI_TRACING_ENABLED
 
-#ifdef TRACING_ENABLED
+#ifdef MIDI_TRACING_ENABLED
 #define TRACE(x) do { write_log x; } while(0)
 #else
 #define TRACE(x)
index 40d894702a29463cea888f10c3fbd1f039cf5700..fd3f386a98cb7baab92981d4f9f907d0d80005ef 100644 (file)
 #include "direct3d.h"
 #include "clipboard.h"
 
-#define NOBLITTER 0
-#define NOBLITTER_BLIT 0
+int debug_rtg_blitter = 3;
+
+#define NOBLITTER (0 || !(debug_rtg_blitter & 1))
+#define NOBLITTER_BLIT (0 || !(debug_rtg_blitter & 2))
+
 #define USE_HARDWARESPRITE 1
 #define P96TRACING_ENABLED 0
 #define P96SPRTRACING_ENABLED 0
@@ -2191,6 +2194,8 @@ static void inituaegfx (uaecptr ABI)
 
        flags = get_long (ABI + PSSO_BoardInfo_Flags);
        flags &= 0xffff0000;
+       if (flags & BIF_NOBLITTER)
+               write_log (_T("P96: Blitter disabled in devs:monitors/uaegfx!\n"));
        flags |= BIF_BLITTER | BIF_NOMEMORYMODEMIX;
        flags &= ~BIF_HARDWARESPRITE;
        if (currprefs.gfx_api && D3D_goodenough () && USE_HARDWARESPRITE) {
@@ -2201,8 +2206,6 @@ static void inituaegfx (uaecptr ABI)
                hwsprite = 0;
                write_log (_T("P96: Hardware sprite support disabled\n"));
        }
-       if (flags & BIF_NOBLITTER)
-               write_log (_T("P96: Blitter disabled in devs:monitors/uaegfx!\n"));
        if (currprefs.win32_rtgvblankrate >= -1 && !uaegfx_old)
                flags |= BIF_VBLANKINTERRUPT;
        if (!(flags & BIF_INDISPLAYCHAIN)) {
@@ -2210,6 +2213,8 @@ static void inituaegfx (uaecptr ABI)
                flags |= BIF_INDISPLAYCHAIN;
        }
        put_long (ABI + PSSO_BoardInfo_Flags, flags);
+       if (debug_rtg_blitter != 3)
+               write_log (_T("P96: Blitter mode = %x!\n"), debug_rtg_blitter);
 
        put_word (ABI + PSSO_BoardInfo_MaxHorResolution + 0, planar.width);
        put_word (ABI + PSSO_BoardInfo_MaxHorResolution + 2, chunky.width);
index dfcc933f4badd3fa3e0c87398f70ec2b75a63c7d..ea2157abf2a5fefde7966d56b24d52b4936d0c6a 100644 (file)
@@ -227,10 +227,10 @@ void sound_setadjust (double v)
                vsynctimebase = vsynctimebase_orig;
                scaled_sample_evtime = scaled_sample_evtime_orig * mult / 1000.0;
        } else if (currprefs.cachesize || currprefs.m68k_speed != 0) {
-               vsynctimebase = (long)(((double)vsynctimebase_orig) * mult / 1000.0);
+               vsynctimebase = (int)(((double)vsynctimebase_orig) * mult / 1000.0);
                scaled_sample_evtime = scaled_sample_evtime_orig;
        } else {
-               vsynctimebase = (long)(((double)vsynctimebase_orig) * mult / 1000.0);
+               vsynctimebase = (int)(((double)vsynctimebase_orig) * mult / 1000.0);
                scaled_sample_evtime = scaled_sample_evtime_orig;
        }
 }
index 9e67ddc487c080dba50cd8269c3a9fb9a02b354a..0b9b740f7fdcf0f6dd2b79dbdee056b7e0bba95c 100644 (file)
@@ -97,7 +97,7 @@ extern int log_a2065, a2065_promiscuous;
 extern int rawinput_enabled_hid, rawinput_log;
 int log_scsi;
 int log_net;
-int log_vsync;
+int log_vsync, debug_vsync_min_delay, debug_vsync_forced_delay;
 int uaelib_debug;
 int pissoff_value = 15000 * CYCLE_UNIT;
 unsigned int fpucontrol;
@@ -313,6 +313,11 @@ frame_time_t read_processor_time (void)
                return read_processor_time_qpf ();
 }
 
+uae_u32 read_system_time (void)
+{
+       return GetTickCount ();
+}
+
 #include <process.h>
 static volatile int dummythread_die;
 static void _cdecl dummythread (void *dummy)
@@ -381,7 +386,7 @@ static void figure_processor_speed_qpf (void)
        }
        write_log (_T("CLOCKFREQ: QPF %.2fMHz (%.2fMHz, DIV=%d)\n"), freq.QuadPart / 1000000.0,
                qpfrate / 1000000.0, 1 << qpcdivisor);
-       syncbase = (unsigned long)qpfrate;
+       syncbase = (int)qpfrate;
 }
 
 static void figure_processor_speed (void)
@@ -4559,6 +4564,9 @@ extern int screenshotmode, postscript_print_debugging, sound_debug, log_uaeseria
 extern int force_direct_catweasel, sound_mode_skip, maxmem;
 extern int pngprint, log_sercon, midi_inbuflen;
 extern int vsync_busy_wait_mode;
+extern int debug_rtg_blitter;
+extern int log_bsd;
+extern int inputdevice_logging;
 
 extern DWORD_PTR cpu_affinity, cpu_paffinity;
 static DWORD_PTR original_affinity = -1;
@@ -4742,6 +4750,10 @@ static int parseargs (const TCHAR *argx, const TCHAR *np, const TCHAR *np2)
                log_vsync |= 2;
                return 1;
        }
+       if (!_tcscmp (arg, _T("bsdlog"))) {
+               log_bsd = 1;
+               return 1;
+       }
        if (!_tcscmp (arg, _T("clipboarddebug"))) {
                clipboard_debug = 1;
                return 1;
@@ -4833,10 +4845,26 @@ static int parseargs (const TCHAR *argx, const TCHAR *np, const TCHAR *np2)
        if (!np)
                return 0;
 
+       if (!_tcscmp (arg, _T("rtg_blitter"))) {
+               debug_rtg_blitter = getval (np);
+               return 2;
+       }
+       if (!_tcscmp (arg, _T("vsync_min_delay"))) {
+               debug_vsync_min_delay = getval (np);
+               return 2;
+       }
+       if (!_tcscmp (arg, _T("vsync_forced_delay"))) {
+               debug_vsync_forced_delay = getval (np);
+               return 2;
+       }
        if (!_tcscmp (arg, _T("inputlog"))) {
                rawinput_log = getval (np);
                return 2;
        }
+       if (!_tcscmp (arg, _T("inputdevicelog"))) {
+               inputdevice_logging = getval (np);
+               return 2;
+       }
        if (!_tcscmp (arg, _T("vsyncbusywait"))) {
                vsync_busy_wait_mode = getval (np);
                return 2;
index f9a063be02eb672a7774de497779e28024fa316b..3ff4a251de78ccaaa58c155f169f592f795556f8 100644 (file)
@@ -19,8 +19,8 @@
 #define LANG_DLL 1
 
 //#define WINUAEBETA _T("")
-#define WINUAEBETA _T("1")
-#define WINUAEDATE MAKEBD(2012, 5, 13)
+#define WINUAEBETA _T("2")
+#define WINUAEDATE MAKEBD(2012, 5, 18)
 #define WINUAEEXTRA _T("")
 //#define WINUAEEXTRA _T("AmiKit Preview")
 #define WINUAEREV _T("")
index 57651dd842f427beabb04f0abc5d964d323b8829..d5191738c44b5aa5fffd045c04e802c07f8919fd 100644 (file)
@@ -103,7 +103,8 @@ int window_extra_width, window_extra_height;
 
 static struct winuae_currentmode *currentmode = &currentmodestruct;
 static int wasfullwindow_a, wasfullwindow_p;
-static int vblankbasewait1, vblankbasewait2, vblankbasewait3, vblankbasefull;
+
+static int vblankbasewait1, vblankbasewait2, vblankbasewait3, vblankbasefull, vblankbaseadjust;
 static bool vblankbaselace;
 static int vblankbaselace_chipset;
 static bool vblankthread_oddeven;
@@ -532,8 +533,10 @@ static void addmode (struct MultiDisplay *md, DEVMODE *dm, int rawmode)
                        }
                        if (j < MAX_REFRESH_RATES) {
                                md->DisplayModes[i].refresh[j] = freq;
-                               md->DisplayModes[i].refreshtype[j] = rawmode;
+                               md->DisplayModes[i].refreshtype[j] = (lace ? REFRESH_RATE_LACE : 0) | (rawmode ? REFRESH_RATE_RAW : 0);
                                md->DisplayModes[i].refresh[j + 1] = 0;
+                               if (!lace)
+                                       md->DisplayModes[i].lace = false;
                                return;
                        }
                }
@@ -637,10 +640,11 @@ static void modesList (struct MultiDisplay *md)
                while (md->DisplayModes[i].refresh[j] > 0) {
                        if (j > 0)
                                write_log (_T(","));
-                       if (md->DisplayModes[i].refreshtype[j])
-                               write_log (_T("!%d"), md->DisplayModes[i].refresh[j]);
-                       else
-                               write_log (_T("%d"), md->DisplayModes[i].refresh[j]);
+                       if (md->DisplayModes[i].refreshtype[j] & REFRESH_RATE_RAW)
+                               write_log (_T("!"));
+                       write_log (_T("%d"),  md->DisplayModes[i].refresh[j]);
+                       if (md->DisplayModes[i].refreshtype[j] & REFRESH_RATE_LACE)
+                               write_log (_T("i"));
                        j++;
                }
                write_log (_T(")\n"));
@@ -1954,10 +1958,13 @@ bool vsync_switchmode (int hz)
        struct MultiDisplay *md = getdisplay (&currprefs);
        struct PicassoResolution *found;
        int newh, i, cnt;
-       bool preferdouble = 0;
+       bool preferdouble = 0, preferlace = 0;
+       bool lace = false;
 
        if (currprefs.gfx_apmode[0].gfx_refreshrate > 85) {
                preferdouble = 1;
+       } else if (currprefs.gfx_apmode[0].gfx_interlaced) {
+               preferlace = 1;
        }
 
        if (hz >= 55)
@@ -1970,17 +1977,42 @@ bool vsync_switchmode (int hz)
        found = NULL;
        for (cnt = 0; cnt <= abs (newh - h) + 1 && !found; cnt++) {
                for (int dbl = 0; dbl < 2 && !found; dbl++) {
-                       bool doublecheck = (dbl == 0 && preferdouble) || (dbl == 1 && !preferdouble);
+                       bool doublecheck = false;
+                       bool lacecheck = false;
+                       if (preferdouble && dbl == 0)
+                               doublecheck = true;
+                       else if (preferlace && dbl == 0)
+                               lacecheck = true;
+
                        for (int extra = 1; extra >= -1 && !found; extra--) {
                                for (i = 0; md->DisplayModes[i].depth >= 0 && !found; i++) {
                                        struct PicassoResolution *r = &md->DisplayModes[i];
                                        if (r->res.width == w && (r->res.height == newh + cnt || r->res.height == newh - cnt) && r->depth == d) {
                                                int j;
                                                for (j = 0; r->refresh[j] > 0; j++) {
-                                                       if ((!doublecheck && r->refresh[j] == hz + extra) || (doublecheck && r->refresh[j] == hz * 2 + extra)) {
-                                                               found = r;
-                                                               hz = r->refresh[j];
-                                                               break;
+                                                       if (doublecheck) {
+                                                               if (r->refreshtype[j] & REFRESH_RATE_LACE)
+                                                                       continue;
+                                                               if (r->refresh[j] == hz * 2 + extra) {
+                                                                       found = r;
+                                                                       hz = r->refresh[j];
+                                                                       break;
+                                                               }
+                                                       } else if (lacecheck) {
+                                                               if (!(r->refreshtype[j] & REFRESH_RATE_LACE))
+                                                                       continue;
+                                                               if (r->refresh[j] * 2 == hz + extra) {
+                                                                       found = r;
+                                                                       lace = true;
+                                                                       hz = r->refresh[j];
+                                                                       break;
+                                                               }
+                                                       } else {
+                                                               if (r->refresh[j] == hz + extra) {
+                                                                       found = r;
+                                                                       hz = r->refresh[j];
+                                                                       break;
+                                                               }
                                                        }
                                                }
                                        }
@@ -1997,15 +2029,16 @@ bool vsync_switchmode (int hz)
                if (currprefs.gfx_apmode[0].gfx_vsync != changed_prefs.gfx_apmode[0].gfx_vsync) {
                        config_changed = 1;
                }
-               write_log (_T("refresh rate changed to %d but no matching screenmode found, vsync disabled\n"), hz);
+               write_log (_T("refresh rate changed to %d%s but no matching screenmode found, vsync disabled\n"), hz, lace ? _T("i") : _T("p"));
                return false;
        } else {
                newh = found->res.height;
                changed_prefs.gfx_size_fs.height = newh;
                changed_prefs.gfx_apmode[0].gfx_refreshrate = hz;
+               changed_prefs.gfx_apmode[0].gfx_interlaced = lace;
                if (changed_prefs.gfx_size_fs.height != currprefs.gfx_size_fs.height ||
                        changed_prefs.gfx_apmode[0].gfx_refreshrate != currprefs.gfx_apmode[0].gfx_refreshrate) {
-                       write_log (_T("refresh rate changed to %d, new screenmode %dx%d\n"), hz, w, newh);
+                       write_log (_T("refresh rate changed to %d%s, new screenmode %dx%d\n"), hz, lace ? _T("i") : _T("p"), w, newh);
                        config_changed = 1;
                }
                return true;
@@ -2485,6 +2518,32 @@ static bool waitvblankstate (bool state, int *maxvpos, int *flags)
        }
 }
 
+static int timezeroonevblank (int startline, int endline)
+{
+       int vp;
+       for (;;) {
+               if (!getvblankpos (&vp))
+                       return -1;
+               if (vp > endline)
+                       break;
+       }
+       for (;;) {
+               if (!getvblankpos (&vp))
+                       return -1;
+               if (vp == startline)
+                       break;
+       }
+       frame_time_t start = read_processor_time ();
+       for (;;) {
+               if (!getvblankpos (&vp))
+                       return -1;
+               if (vp >= endline)
+                       break;
+       }
+       frame_time_t end = read_processor_time ();
+       return end - start;
+}
+
 static int vblank_wait (void)
 {
        int vp;
@@ -2568,14 +2627,25 @@ static int vblank_flip_delay;
 static bool vblanklaceskip (void)
 {
        if (vblankbaselace_chipset >= 0 && vblankbaselace) {
-               if ((vblankbaselace_chipset && !vblankthread_oddeven) || (!vblankbaselace_chipset && vblankthread_oddeven)) {
-                       write_log (_T("Interlaced frame type mismatch %d<>%d\n"), vblankbaselace_chipset, vblankthread_oddeven);
+               if ((vblankbaselace_chipset && !vblankthread_oddeven) || (!vblankbaselace_chipset && vblankthread_oddeven))
                        return true;
-               }
        }
        return false;
 }
 
+static bool vblanklaceskip_check (void)
+{
+       int vp = -2;
+       if (!vblanklaceskip ()) {
+//             if (vblankbaselace_chipset >= 0)
+//                     write_log (_T("%d == %d\n"), vblankbaselace_chipset, vblankthread_oddeven);
+               return false;
+       }
+       getvblankpos (&vp);
+       write_log (_T("Interlaced frame type mismatch %d<>%d (%d)\n"), vblankbaselace_chipset, vblankthread_oddeven, vp);
+       return true;
+}
+
 static unsigned int __stdcall vblankthread (void *dummy)
 {
        bool firstvblankbasewait2;
@@ -2609,11 +2679,12 @@ static unsigned int __stdcall vblankthread (void *dummy)
                                sleep_millis (1);
                                continue;
                        }
+
                        ResetEvent (vblankwaitevent);
                        if (vp > maxscanline / 2)
                                vp = maxscanline / 2;
                        frame_time_t rpt = read_processor_time ();
-                       vblank_prev_time2 = rpt - (vblankbasefull * vp / maxscanline) / (vblank_skipeveryother ? 2 : 1);
+                       vblank_prev_time2 = rpt - (vblankbaseadjust + (vblankbasefull * vp / maxscanline) / (vblank_skipeveryother ? 2 : 1));
                        vblank_prev_time = vblank_prev_time2;
                        firstvblankbasewait2 = false;
                        prevvblankpos = 0;
@@ -2650,12 +2721,13 @@ static unsigned int __stdcall vblankthread (void *dummy)
                        bool vblank_found_rtg2 = false;
                        bool vblank_found2 = false;
                        frame_time_t thread_vblank_time2 = 0;
-                       int vs = isvsync_chipset ();
                        // immediate vblank if mismatched frame type 
-                       if (vs < 0 && vblanklaceskip ()) {
+                       if (vblanklaceskip_check ()) {
                                vblank_found2 = true;
                                vblank_found_chipset = true;
                                end = true;
+                               doflipped = true;
+                               thread_vblank_time2 = vblank_prev_time;
                        } else if (t - vblank_prev_time2 > vblankbasewait2) {
                                int vp = 0;
                                bool vb = false;
@@ -2664,31 +2736,29 @@ static unsigned int __stdcall vblankthread (void *dummy)
                                        firstvblankbasewait2 = true;
                                        vblank_getstate (&vb, &vp);
                                }
-                               if (!doflipped && !dooddevenskip && ap->gfx_vflip > 0) {
+                               if (!doflipped && ap->gfx_vflip > 0) {
                                        doflipevent ();
                                        doflipped = true;
                                }
                                ok = vblank_getstate (&vb, &vp);
                                if (!ok || vb) {
                                        thread_vblank_time2 = t;
-                                       if (vs < 0) {
-                                               vblank_found_chipset = true;
-                                               if (!ap->gfx_vflip) {
-                                                       while (!render_ok) {
-                                                               if (read_processor_time () - t > vblankbasefull)
-                                                                       break;
-                                                       }
-                                                       show_screen ();
-                                                       render_ok = false;
-                                                       int delay = read_processor_time () - t;
-                                                       if (delay < 0)
-                                                               delay = 0;
-                                                       else if (delay > vblankbasefull)
-                                                               delay = 0;
-                                                       else if (delay > vblankbasefull * 2 / 3)
-                                                               delay = vblankbasefull * 2 / 3;
-                                                       vblank_found_flipdelay = delay;
+                                       vblank_found_chipset = true;
+                                       if (!ap->gfx_vflip) {
+                                               while (!render_ok) {
+                                                       if (read_processor_time () - t > vblankbasefull)
+                                                               break;
                                                }
+                                               show_screen ();
+                                               render_ok = false;
+                                               int delay = read_processor_time () - t;
+                                               if (delay < 0)
+                                                       delay = 0;
+                                               else if (delay >= vblankbasefull)
+                                                       delay = 0;
+                                               else if (delay > vblankbasefull * 2 / 3)
+                                                       delay = vblankbasefull * 2 / 3;
+                                               vblank_found_flipdelay = delay;
                                        }
                                        vblank_found_rtg2 = true;
                                        vblank_found2 = true;
@@ -2705,7 +2775,7 @@ static unsigned int __stdcall vblankthread (void *dummy)
                                end = true;
                        }
                        if (end) {
-                               if (!dooddevenskip && ap->gfx_vflip > 0 && !doflipped) {
+                               if (ap->gfx_vflip > 0 && !doflipped) {
                                        doflipevent ();
                                        doflipped = true;
                                }
@@ -2744,7 +2814,7 @@ frame_time_t vsync_busywait_end (int *flipdelay)
                                sleep_millis_main (1);
                        }
                        prev = vblank_prev_time;
-                       if (!dooddevenskip) {
+                       if (!vblanklaceskip ()) {
                                int delay = 10;
                                frame_time_t t = read_processor_time ();
                                while (delay-- > 0) {
@@ -2768,19 +2838,26 @@ frame_time_t vsync_busywait_end (int *flipdelay)
        }
 }
 
+bool vsync_isdone (void)
+{
+       return vblank_found_chipset || dooddevenskip;
+}
+
 void vsync_busywait_start (void)
 {
-       if (vblankthread_mode < 0)
-               write_log (L"low latency threaded mode but thread is not running!?\n");
-       else if (vblankthread_mode != VBLANKTH_ACTIVE_WAIT)
-               write_log (L"low latency vsync state mismatch %d\n", vblankthread_mode);
-       changevblankthreadmode_fast (VBLANKTH_ACTIVE_START);
+       if (isthreadedvsync ()) {
+               if (vblankthread_mode < 0)
+                       write_log (L"low latency threaded mode but thread is not running!?\n");
+               else if (vblankthread_mode != VBLANKTH_ACTIVE_WAIT)
+                       write_log (L"low latency vsync state mismatch %d\n", vblankthread_mode);
+               changevblankthreadmode_fast (VBLANKTH_ACTIVE_START);
+       }
 }
 
 
-bool vsync_busywait_do (int *freetime, bool lace, bool oddeven)
+int vsync_busywait_do (int *freetime, bool lace, bool oddeven)
 {
-       bool v;
+       int v;
        static bool framelost;
        int ti;
        frame_time_t t;
@@ -2788,9 +2865,8 @@ bool vsync_busywait_do (int *freetime, bool lace, bool oddeven)
        struct apmode *ap = picasso_on ? &currprefs.gfx_apmode[1] : &currprefs.gfx_apmode[0];
 
        dooddevenskip = false;
-
        if (lace)
-               vblankbaselace_chipset = oddeven;
+               vblankbaselace_chipset = oddeven == true ? 1 : 0;
        else
                vblankbaselace_chipset = -1;
 
@@ -2805,8 +2881,9 @@ bool vsync_busywait_do (int *freetime, bool lace, bool oddeven)
                return true;
        }
 
-       if (log_vsync & 1) {
+       if (0 || (log_vsync & 1)) {
                console_out_f(_T("F:%8d M:%8d E:%8d %3d%% (%3d%%) %10d\r"), frame_counted, frame_missed, frame_errors, frame_usage, frame_usage_avg, (t - vblank_prev_time) - vblankbasefull);
+               //write_log(_T("F:%8d M:%8d E:%8d %3d%% (%3d%%) %10d\n"), frame_counted, frame_missed, frame_errors, frame_usage, frame_usage_avg, (t - vblank_prev_time) - vblankbasefull);
        }
 
        if (freetime)
@@ -2823,39 +2900,39 @@ bool vsync_busywait_do (int *freetime, bool lace, bool oddeven)
        if (frame_counted)
                frame_usage_avg = frame_usage_total / frame_counted;
 
-       v = false;
+       v = 0;
 
        if (isthreadedvsync ()) {
 
                framelost = false;
-               v = true;
+               v = 1;
 
        } else {
-               bool doskip = false;
+               int vp;
 
                vblank_flip_delay = 0;
-               if (!framelost && t - prevtime > vblankbasefull) {
-                       framelost = true;
-                       frame_missed++;
-                       return true;
-               }
-               
-               if (vblanklaceskip ()) {
-                       doskip = true;
+               dooddevenskip = false;
+
+               if (vblanklaceskip_check ()) {
+
+                       vblank_prev_time = read_processor_time () + vblankbasewait1;
                        dooddevenskip = true;
-               }
+                       framelost = true;
+                       v = -1;
+
+               } else if (currprefs.turbo_emulation) {
 
-               if (currprefs.turbo_emulation) {
                        show_screen ();
                        vblank_prev_time = read_processor_time ();
-                       return true;
-               }
+                       framelost = true;
+                       v = -1;
+
+               } else {
 
-               if (!doskip) {
-                       int vp;
                        while (!framelost && read_processor_time () - prevtime < vblankbasewait1) {
                                vsync_sleep (false);
                        }
+
                        prevvblankpos = 0;
                        vp = vblank_wait ();
                        if (vp >= -1) {
@@ -2878,22 +2955,22 @@ bool vsync_busywait_do (int *freetime, bool lace, bool oddeven)
                                if (ap->gfx_vflip != 0) {
                                        show_screen ();
                                }
+                               vblank_prev_time -= vblankbaseadjust;
                                vblank_prev_time -= (vblankbasefull * vp / maxscanline) / (vblank_skipeveryother ? 2 : 1 );
-                               v = true;
+
+                               v = framelost ? -1 : 1;
                        }
-               } else {
-                       v = true;
-                       vblank_prev_time = read_processor_time ();
+
+                       framelost = false;
                }
-               framelost = false;
        }
 
        if (v) {
                frame_counted++;
-               return true;
+               return v;
        }
        frame_errors++;
-       return false;
+       return 0;
 }
 
 static struct remembered_vsync *vsyncmemory;
@@ -2904,6 +2981,7 @@ struct remembered_vsync
        int width, height, depth, rate, mode;
        bool rtg, lace;
        double remembered_rate, remembered_rate2;
+       int remembered_adjust;
        int maxscanline, minscanline, maxvpos;
 };
 
@@ -2952,6 +3030,7 @@ double vblank_calibrate (double approx_vblank, bool waitonly)
                        tsum = rval = rv->remembered_rate;
                        maxscanline = rv->maxscanline;
                        minscanline = rv->minscanline;
+                       vblankbaseadjust = rv->remembered_adjust;
                        maxvpos = rv->maxvpos;
                        lace = rv->lace;
                        waitonly = true;
@@ -2974,7 +3053,6 @@ double vblank_calibrate (double approx_vblank, bool waitonly)
                flipevent2 = CreateEvent (NULL, FALSE, FALSE, NULL);
                vblankwaitevent = CreateEvent (NULL, FALSE, FALSE, NULL);
                _beginthreadex (NULL, 0, flipthread, 0, 0, &th);
-               write_log (_T("Low latency vsync thread started\n"));
        } else {
                changevblankthreadmode (VBLANKTH_CALIBRATE);
        }
@@ -3034,6 +3112,9 @@ double vblank_calibrate (double approx_vblank, bool waitonly)
                if (cnt >= total)
                        break;
        }
+       vblankbaseadjust = 0;
+       if (minscanline == 1)
+               vblankbaseadjust = timezeroonevblank (-1, 1);
 
        changevblankthreadmode (VBLANKTH_IDLE);
 
@@ -3089,9 +3170,14 @@ skip:
        vblankbasewait2 = (syncbase / tsum2) * 55 / 100;
        vblankbasewait3 = (syncbase / tsum2) * 99 / 100 - syncbase / (250 * (vblank_skipeveryother ? 1 : 2)); // at least 2ms before vblank
        vblankbaselace = lace;
-       write_log (_T("VSync %s: %.6fHz/%.1f=%.6fHz. MinV=%d MaxV=%d%s Units=%d %.1f%%\n"),
+       if (vblankbaseadjust < 0)
+               vblankbaseadjust = 0;
+       else if (vblankbaseadjust > vblankbasefull / 10)
+               vblankbaseadjust = vblankbasefull / 10;
+
+       write_log (_T("VSync %s: %.6fHz/%.1f=%.6fHz. MinV=%d MaxV=%d%s Adj=%d Units=%d %.1f%%\n"),
                waitonly ? _T("remembered") : _T("calibrated"), tsum, div, tsum2,
-               minscanline, maxvpos, lace ? _T("i") : _T(""), vblankbasefull,
+               minscanline, maxvpos, lace ? _T("i") : _T(""), vblankbaseadjust, vblankbasefull,
                vblankbasewait3 * 100 / (syncbase / tsum2));
        remembered_vblank = tsum;
        vblank_prev_time = read_processor_time ();
@@ -3106,6 +3192,7 @@ skip:
                rv->rtg = picasso_on;
                rv->remembered_rate = tsum;
                rv->remembered_rate2 = tsum2;
+               rv->remembered_adjust = vblankbaseadjust;
                rv->maxscanline = maxscanline;
                rv->minscanline = minscanline;
                rv->maxvpos = maxvpos;
index 6ec61cf573eeff84f1b06912b40244b792ea3661..ae769bde867d2179625fd6cdee49cba87083acbb 100644 (file)
@@ -5441,6 +5441,7 @@ static void init_frequency_combo (HWND hDlg, int dmode)
        WIN32GUI_LoadUIString (IDS_VSYNC_DEFAULT, txt, sizeof (txt) / sizeof (TCHAR));
        SendDlgItemMessage(hDlg, IDC_REFRESHRATE, CB_ADDSTRING, 0, (LPARAM)txt);
        for (i = 0; i < index; i++) {
+               bool lace = (storedrefreshrates[i].type & REFRESH_RATE_LACE) != 0;
                freq = storedrefreshrates[i].rate;
                if (freq < 0) {
                        freq = -freq;
@@ -5448,11 +5449,16 @@ static void init_frequency_combo (HWND hDlg, int dmode)
                } else {
                        _stprintf (hz, L"%dHz", freq);
                }
-               if (freq == 50 || freq == 100)
+               if (freq == 50 || freq == 100 || (freq * 2 == 50 && lace))
                        _tcscat (hz, L" PAL");
-               if (freq == 60 || freq == 120)
+               if (freq == 60 || freq == 120 || (freq * 2 == 60 && lace))
                        _tcscat (hz, L" NTSC");
-               if (storedrefreshrates[i].type)
+               if (lace) {
+                       TCHAR tmp[10];
+                       _stprintf (tmp, L" (%di)", freq * 2);
+                       _tcscat (hz, tmp);
+               }
+               if (storedrefreshrates[i].type & REFRESH_RATE_RAW)
                        _tcscat (hz, L" (*)");
                if (abs (workprefs.gfx_apmode[0].gfx_refreshrate) == freq)
                        _tcscpy (hz2, hz);
@@ -6084,6 +6090,7 @@ static void values_from_displaydlg (HWND hDlg, UINT msg, WPARAM wParam, LPARAM l
                        } else {
                                posn1--;
                                workprefs.gfx_apmode[0].gfx_refreshrate = storedrefreshrates[posn1].rate;
+                               workprefs.gfx_apmode[0].gfx_interlaced = (storedrefreshrates[posn1].type & REFRESH_RATE_LACE) != false;
                        }
                        values_to_displaydlg (hDlg);
                } else if (LOWORD (wParam) == IDC_DA_MODE) {
index 789cf981e380c412cdc7bfb578e7af87a2e2d641..4caa36feeae7e3fdcb27fb4220560ed9ab61d71d 100644 (file)
@@ -3,6 +3,36 @@
 - hdd from command line
 - no-buffer tearing updates
 
+Beta 2:
+
+- Missing harddrive in harddrive dialog if any device returned "too short STORAGE_DEVICE_DESCRIPTOR only x bytes". (2.4.0)
+- D3D crashed if Vista or newer and D3D9Ex couldn't be used (shaders didn't load for reason for example) (2.3.something)
+- Vsync dynamic adjustment algoritm updated.
+- Added vsync debugging command line options:
+  -vsync_min_delay <val>: val is value from 1 to 90, minimum guaranteed extra time left for
+  display rendering. Automatic dynamic adjustment system can still use higher values if needed.
+  -vsync_forced_delay <val>: val is forced extra time, dynamic adjustment is disabled.
+  <val> is percentage of total frame time, the bigger the value, the less chance for tearing and slower
+  CPU emulation performance (if fastest possible mode).
+  Above Parameters work in low latency no buffer mode and in all legacy vsync modes.
+  -vsynclog shows frame counts (total, missed, errors, time waited for frame relative to total frame,
+  average of previous value, current frame time difference) Low latency only parameter.
+  -vsynclog2 starts logging current adjustment parameters. Mostly undocumented values except last 4:
+  current adjustment value, time/scanline, total frame time, adjustment percentage value.
+  Note that time unit is internal PC time counter (Rate can be seen in winuaebootlog.txt)
+- Added -rtg_blitter <val> command line option (0 = disable native RTG blitter acceleration code)
+- Show more correct vertical and horizontal frequency in display mode change log line.
+- Added -bsdlog command line parameter, enables full bsdsocket emulation logging. (This was previously
+  compile-time option)
+- Support PC screen resolutions that have both progressive and interlaced modes.
+- PC interlaced modes work in D3D mode, fixes blank screen.
+- Added 50i/60i switching support to autovsync.
+- Added timing compensation to low latency vsync for some drivers (nvidia only?) that don't count any
+  lines inside vblank period. (MinV=1 in the log)
+- IOCTL 32-bit overflow fix, CDFS DVD read error when accessing data outside of first 2G.
+- Built-in CD image mounter 32-bit image size restrictions removed.
+
+Beta 1:
 
 - Autovsync 50/60Hz also accepts 100/120Hz modes if available, supports also refresh rates +-1 from nominal.
 - CD32: CD command receive DMA emulation correctly emulated, TOC read hack removed.
index 3f28c55f11c2d34956b58fa5f359cc7b7bed828f..5e014b019d31a79b466ab52ec8b5e3690a610f41 100644 (file)
@@ -67,6 +67,7 @@ FILE *debugfile = NULL;
 int console_logging = 0;
 static int debugger_type = -1;
 extern BOOL debuggerinitializing;
+extern int lof_store;
 int always_flush_log = 1;
 
 #define WRITE_LOG_BUF_SIZE 4096
@@ -393,7 +394,7 @@ static TCHAR *writets (void)
        _stprintf (p, _T("%03d"), tb.millitm);
        p += _tcslen (p);
        if (vsync_counter != 0xffffffff)
-               _stprintf (p, _T(" [%d %03dx%03d]"), vsync_counter, current_hpos (), vpos);
+               _stprintf (p, _T(" [%d %03d%s%03d]"), vsync_counter, current_hpos (), lof_store ? _T("-") : _T("="), vpos);
        _tcscat (p, _T(": "));
        return out;
 }