From 4462c47233d03b244e4bcb1e49fa61a1eab4e18b Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Fri, 18 May 2012 20:43:39 +0300 Subject: [PATCH] 2420b2 --- blkdev_cdimage.cpp | 50 +++---- bsdsocket.cpp | 1 + custom.cpp | 245 ++++++++++++++++++++------------ disk.cpp | 2 + events.cpp | 5 +- gfxutil.cpp | 7 +- include/bsdsocket.h | 11 +- include/custom.h | 4 +- include/events.h | 4 +- include/native2amiga.h | 4 +- include/xwin.h | 3 +- native2amiga.cpp | 8 +- newcpu.cpp | 2 +- od-win32/blkdev_win32_ioctl.cpp | 24 ++-- od-win32/bsdsock.cpp | 123 ++++++++-------- od-win32/direct3d.cpp | 12 +- od-win32/dxwrap.cpp | 2 +- od-win32/dxwrap.h | 8 +- od-win32/hardfile_win32.cpp | 4 +- od-win32/machdep/rpt.h | 1 + od-win32/midi.cpp | 4 +- od-win32/picasso96_win.cpp | 13 +- od-win32/sounddep/sound.cpp | 4 +- od-win32/win32.cpp | 32 ++++- od-win32/win32.h | 4 +- od-win32/win32gfx.cpp | 241 +++++++++++++++++++++---------- od-win32/win32gui.cpp | 13 +- od-win32/winuaechangelog.txt | 30 ++++ od-win32/writelog.cpp | 3 +- 29 files changed, 556 insertions(+), 308 deletions(-) diff --git a/blkdev_cdimage.cpp b/blkdev_cdimage.cpp index 2ee531eb..5de3bc51 100644 --- a/blkdev_cdimage.cpp +++ b/blkdev_cdimage.cpp @@ -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); diff --git a/bsdsocket.cpp b/bsdsocket.cpp index ca3a7604..291d244e 100644 --- a/bsdsocket.cpp +++ b/bsdsocket.cpp @@ -26,6 +26,7 @@ #ifdef BSDSOCKET +int log_bsd; struct socketbase *socketbases; static uae_u32 SockLibBase; diff --git a/custom.cpp b/custom.cpp index f918c937..7a26695a 100644 --- a/custom.cpp +++ b/custom.cpp @@ -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; } diff --git a/disk.cpp b/disk.cpp index f2960fce..b90072a6 100644 --- 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); diff --git a/events.cpp b/events.cpp index a587f7ab..b8cb6b51 100644 --- a/events.cpp +++ b/events.cpp @@ -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) { diff --git a/gfxutil.cpp b/gfxutil.cpp index 8a736170..9c3e7ccd 100644 --- a/gfxutil.cpp +++ b/gfxutil.cpp @@ -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; diff --git a/include/bsdsocket.h b/include/bsdsocket.h index 8510a38c..27d4c21c 100644 --- a/include/bsdsocket.h +++ b/include/bsdsocket.h @@ -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); diff --git a/include/custom.h b/include/custom.h index 4454cd3e..0acaac28 100644 --- a/include/custom.h +++ b/include/custom.h @@ -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 diff --git a/include/events.h b/include/events.h index 333fe133..66b2308e 100644 --- a/include/events.h +++ b/include/events.h @@ -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; diff --git a/include/native2amiga.h b/include/native2amiga.h index 524e2e8a..a4b7eb63 100644 --- a/include/native2amiga.h +++ b/include/native2amiga.h @@ -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); /* diff --git a/include/xwin.h b/include/xwin.h index de4c61b4..eeb4ab4d 100644 --- a/include/xwin.h +++ b/include/xwin.h @@ -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); diff --git a/native2amiga.cpp b/native2amiga.cpp index 37e9cc40..a8c60c41 100644 --- a/native2amiga.cpp +++ b/native2amiga.cpp @@ -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 */ } diff --git a/newcpu.cpp b/newcpu.cpp index 5d0e7320..06f190f1 100644 --- a/newcpu.cpp +++ b/newcpu.cpp @@ -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) { diff --git a/od-win32/blkdev_win32_ioctl.cpp b/od-win32/blkdev_win32_ioctl.cpp index 8aaafa0b..246824c5 100644 --- a/od-win32/blkdev_win32_ioctl.cpp +++ b/od-win32/blkdev_win32_ioctl.cpp @@ -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); diff --git a/od-win32/bsdsock.cpp b/od-win32/bsdsock.cpp index 66ef10bc..1e4ac3c6 100644 --- a/od-win32/bsdsock.cpp +++ b/od-win32/bsdsock.cpp @@ -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 { diff --git a/od-win32/direct3d.cpp b/od-win32/direct3d.cpp index 7f1bef3b..4bef51af 100644 --- a/od-win32/direct3d.cpp +++ b/od-win32/direct3d.cpp @@ -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) diff --git a/od-win32/dxwrap.cpp b/od-win32/dxwrap.cpp index aaaccc69..16ec503f 100644 --- a/od-win32/dxwrap.cpp +++ b/od-win32/dxwrap.cpp @@ -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 { diff --git a/od-win32/dxwrap.h b/od-win32/dxwrap.h index df6b37fd..a8e4b754 100644 --- a/od-win32/dxwrap.h +++ b/od-win32/dxwrap.h @@ -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 { diff --git a/od-win32/hardfile_win32.cpp b/od-win32/hardfile_win32.cpp index 174b71c5..bea98081 100644 --- a/od-win32/hardfile_win32.cpp +++ b/od-win32/hardfile_win32.cpp @@ -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; diff --git a/od-win32/machdep/rpt.h b/od-win32/machdep/rpt.h index 2db2742c..e4aea4a9 100644 --- a/od-win32/machdep/rpt.h +++ b/od-win32/machdep/rpt.h @@ -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 diff --git a/od-win32/midi.cpp b/od-win32/midi.cpp index 1b00bd9e..b690fdc7 100644 --- a/od-win32/midi.cpp +++ b/od-win32/midi.cpp @@ -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) diff --git a/od-win32/picasso96_win.cpp b/od-win32/picasso96_win.cpp index 40d89470..fd3f386a 100644 --- a/od-win32/picasso96_win.cpp +++ b/od-win32/picasso96_win.cpp @@ -60,8 +60,11 @@ #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); diff --git a/od-win32/sounddep/sound.cpp b/od-win32/sounddep/sound.cpp index dfcc933f..ea2157ab 100644 --- a/od-win32/sounddep/sound.cpp +++ b/od-win32/sounddep/sound.cpp @@ -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; } } diff --git a/od-win32/win32.cpp b/od-win32/win32.cpp index 9e67ddc4..0b9b740f 100644 --- a/od-win32/win32.cpp +++ b/od-win32/win32.cpp @@ -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 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; diff --git a/od-win32/win32.h b/od-win32/win32.h index f9a063be..3ff4a251 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -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("") diff --git a/od-win32/win32gfx.cpp b/od-win32/win32gfx.cpp index 57651dd8..d5191738 100644 --- a/od-win32/win32gfx.cpp +++ b/od-win32/win32gfx.cpp @@ -103,7 +103,8 @@ int window_extra_width, window_extra_height; static struct winuae_currentmode *currentmode = ¤tmodestruct; 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; diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index 6ec61cf5..ae769bde 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -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) { diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index 789cf981..4caa36fe 100644 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -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 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 is forced extra time, dynamic adjustment is disabled. + 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 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. diff --git a/od-win32/writelog.cpp b/od-win32/writelog.cpp index 3f28c55f..5e014b01 100644 --- a/od-win32/writelog.cpp +++ b/od-win32/writelog.cpp @@ -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; } -- 2.47.3