mediachanged = 1;
cdaudiostop_do ();
} else if (media != lastmediastate) {
- write_log (_T("CD32: media changed = %d\n"), media);
- lastmediastate = cdrom_disk = media;
- mediachanged = 1;
- cdaudiostop_do ();
+ if (!media && lastmediastate > 1) {
+ // ignore missing media if statefile restored with cd present
+ if (lastmediastate == 2)
+ write_log (_T("CD32: CD missing but statefile was stored with CD inserted: faking media present\n"));
+ lastmediastate = 3;
+ } else {
+ write_log (_T("CD32: media changed = %d\n"), media);
+ lastmediastate = cdrom_disk = media;
+ mediachanged = 1;
+ cdaudiostop_do ();
+ }
}
}
cdrom_paused = 1;
if (v & 4)
cdrom_disk = 1;
- lastmediastate = cdrom_disk;
+ lastmediastate = cdrom_disk ? 2 : 0;
last_play_pos = msf2lsn (restore_u32 ());
last_play_end = msf2lsn (restore_u32 ());
#include "crc32.h"
#include "threaddep/thread.h"
#include "execio.h"
+#include "zfile.h"
#ifdef RETROPLATFORM
#include "rp.h"
#endif
int type = restore_u32 ();
restore_u32 ();
if (flags & 4) {
- _tcscpy (changed_prefs.cdslots[num].name, s);
- _tcscpy (currprefs.cdslots[num].name, s);
+ if (currprefs.cdslots[num].name[0] == 0 || zfile_exists (s)) {
+ _tcscpy (changed_prefs.cdslots[num].name, s);
+ _tcscpy (currprefs.cdslots[num].name, s);
+ }
changed_prefs.cdslots[num].type = currprefs.cdslots[num].type = type;
}
if (flags & 8) {
/* Syslog(level, format, ap)(d0/a0/a1) */
static uae_u32 REGPARAM2 bsdsocklib_vsyslog (TrapContext *context)
{
- write_log (_T("bsdsocket: UNSUPPORTED: vsyslog()\n"));
+ uae_char format_dst[256];
+ TCHAR *s;
+
+ uae_u32 level = m68k_dreg (regs, 0);
+ uaecptr format = m68k_areg (regs, 0);
+ uaecptr params = m68k_areg (regs, 1);
+
+ strcpyah_safe (format_dst, format, sizeof format_dst);
+
+ s = au (format_dst);
+ write_log (_T("SYSLOG: %s\n"), s);
+ xfree (s);
return 0;
}
}
frame_shown = true;
- return status != 0;
+ return 1;
} else if (vs < 0) {
status = vsync_busywait_do (&freetime, (bplcon0 & 4) != 0 && !lof_changed && !lof_changing, lof_store != 0);
vsync_busywait_start ();
+ now = read_processor_time ();
+
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)
return status != 0;
}
+ status = 1;
+
int clockadjust = 0;
#if 0
static uae_u32 prevtick;
clockadjust *= 100;
write_log (_T("%d:%d:%d\n"), framems - tickdiff, diff, clockadjust);
#endif
+
if (currprefs.m68k_speed < 0) {
if (!frame_rendered && !picasso_on)
vsynctimeperline = 0;
else if (vsynctimeperline > vsynctimebase / 3)
vsynctimeperline = vsynctimebase / 3;
+
frame_shown = true;
}
if (isvsync_rtg () >= 0)
rtg_vsync ();
#endif
+
audio_vsync ();
blkdev_vsync ();
CIA_vsync_prehandler ();
inputdevice_unacquire ();
pause_sound ();
+ setmouseactive (0);
do_skip = 0;
skipaddr_start = 0xffffffff;
skipaddr_end = 0xffffffff;
interlace mode. */
static int last_redraw_point;
+#define MAX_STOP 30000
static int first_drawn_line, last_drawn_line;
static int first_block_line, last_block_line;
if (w <= 0 || dx < 0) {
visible_left_start = 0;
- visible_right_stop = 1 << 30;
+ visible_right_stop = MAX_STOP;
} else {
visible_left_start = visible_left_border + dx;
visible_right_stop = visible_left_start + w;
}
if (h <= 0 || dy < 0) {
visible_top_start = 0;
- visible_bottom_stop = 1 << 30;
+ visible_bottom_stop = MAX_STOP;
} else {
visible_top_start = min_ypos_for_screen + dy;
visible_bottom_stop = visible_top_start + h;
gfxvidinfo.xchange = 1 << (RES_MAX - currprefs.gfx_resolution);
gfxvidinfo.ychange = linedbl ? 1 : 2;
+
+ visible_left_start = 0;
+ visible_right_stop = MAX_STOP;
+ visible_top_start = 0;
+ visible_bottom_stop = MAX_STOP;
}
/*
if (custom == NULL)
return 0;
- //write_log (_T("%s\n"), custom);
+ write_log (_T("%s\n"), custom);
p = buf = my_strdup (custom);
while (p && *p) {
TCHAR *p2;
return mask;
}
-static void process_custom_event (struct uae_input_device *id, int offset, int state, int qualmask, int autofire)
+
+static void process_custom_event (struct uae_input_device *id, int offset, int state, int qualmask, int autofire, int sub)
{
- int idx, slotoffset, flags, custompos;
+ int idx, slotoffset, flags, custompos, qual;
TCHAR *custom;
- queue_input_event (-1, NULL, -1, 0, 0, 1);
if (!id)
return;
+
+ slotoffset = sub / 4;
+ flags = id->flags[offset][slotoffset];
+ qual = flags & ID_FLAG_QUALIFIER_MASK;
+ custompos = (flags & ID_FLAG_CUSTOMEVENT_TOGGLED) ? 1 : 0;
+
+ // check that slots 0 and 2 have same qualifiers, only allow toggle if both are same
+ if ((id->flags[offset][slotoffset + 2] & ID_FLAG_QUALIFIER_MASK) != qual) {
+ id->flags[offset][slotoffset] &= ~ID_FLAG_CUSTOMEVENT_TOGGLED;
+ if (checkqualifiers (id->eventid[offset][slotoffset + sub], id->flags[offset][slotoffset + sub], qualmask)) {
+ custom = id->custom[offset][slotoffset + sub];
+ if (custom) {
+ if (autofire)
+ queue_input_event (-1, custom, 1, 1, currprefs.input_autofire_linecnt, 1);
+ if (state && custom)
+ handle_custom_event (custom);
+ }
+ return;
+ }
+ }
+
+ if (sub != 0)
+ return;
+
+ queue_input_event (-1, NULL, -1, 0, 0, 1);
slotoffset = 0;
if (!checkqualifiers (id->eventid[offset][slotoffset], id->flags[offset][slotoffset], qualmask)) {
if (autofire)
queue_input_event (-1, custom, 1, 1, currprefs.input_autofire_linecnt, 1);
- if (state) {
+ if (state && custom)
handle_custom_event (custom);
- id->flags[offset][slotoffset] &= ~ID_FLAG_CUSTOMEVENT_TOGGLED;
- id->flags[offset][slotoffset] |= custompos ? ID_FLAG_CUSTOMEVENT_TOGGLED : 0;
- }
+
+ id->flags[offset][slotoffset] &= ~ID_FLAG_CUSTOMEVENT_TOGGLED;
+ id->flags[offset][slotoffset] |= custompos ? ID_FLAG_CUSTOMEVENT_TOGGLED : 0;
}
static void setbuttonstateall (struct uae_input_device *id, struct uae_input_device2 *id2, int button, int state)
int inverttoggle = (flags & ID_FLAG_INVERTTOGGLE) ? 1 : 0;
if (!state) {
- if (i == 0)
- process_custom_event (id, ID_BUTTON_OFFSET + button, state, qualmask, autofire);
+ process_custom_event (id, ID_BUTTON_OFFSET + button, state, qualmask, autofire, i);
}
setqualifiers (flags, state > 0);
continue;
handle_input_event (evt, 1, 1, 0, true, false);
queue_input_event (evt, NULL, 0, 1, 1, 0); /* send release event next frame */
- process_custom_event (id, ID_BUTTON_OFFSET + button, state, qualmask, 0);
+ process_custom_event (id, ID_BUTTON_OFFSET + button, state, qualmask, 0, i);
} else if (inverttoggle) {
/* pressed = firebutton, not pressed = autofire */
if (state) {
} else {
handle_input_event (evt, 1, 1, autofire, true, false);
}
- if (i == 0)
- process_custom_event (id, ID_BUTTON_OFFSET + button, 1, qualmask, autofire);
+ process_custom_event (id, ID_BUTTON_OFFSET + button, state, qualmask, autofire, i);
} else if (toggle) {
if (!state)
continue;
*flagsp ^= ID_FLAG_TOGGLED;
int toggled = (*flagsp & ID_FLAG_TOGGLED) ? 1 : 0;
handle_input_event (evt, toggled, 1, autofire, true, false);
- if (i == 0)
- process_custom_event (id, ID_BUTTON_OFFSET + button, toggled, qualmask, autofire);
+ process_custom_event (id, ID_BUTTON_OFFSET + button, toggled, qualmask, autofire, i);
} else {
if (!checkqualifiers (evt, flags, qualmask)) {
if (!state && !(flags & ID_FLAG_CANRELEASE)) {
*flagsp |= ID_FLAG_CANRELEASE;
if ((omask ^ nmask) & mask) {
handle_input_event (evt, state, 1, autofire, true, false);
- if (i == 0)
- process_custom_event (id, ID_BUTTON_OFFSET + button, state, qualmask, autofire);
+ if (state)
+ process_custom_event (id, ID_BUTTON_OFFSET + button, state, qualmask, autofire, i);
}
}
}
return handled;
if (!state)
- process_custom_event (NULL, 0, 0, 0, 0);
+ process_custom_event (NULL, 0, 0, 0, 0, 0);
j = 0;
while (j < MAX_INPUT_DEVICE_EVENTS && na->extra[j] >= 0) {
} else {
handled |= handle_input_event (evt, 1, 1, autofire, true, false);
}
- if (k == 0)
- process_custom_event (na, j, state, qualmask, autofire);
+ process_custom_event (na, j, state, qualmask, autofire, k);
} else if (toggle) {
if (!state)
continue;
toggled = (*flagsp & ID_FLAG_TOGGLED) ? 1 : 0;
handled |= handle_input_event (evt, toggled, 1, autofire, true, false);
if (k == 0)
- process_custom_event (na, j, state, qualmask, autofire);
+ process_custom_event (na, j, state, qualmask, autofire, k);
} else {
if (!checkqualifiers (evt, flags, qualmask)) {
if (!state && !(flags & ID_FLAG_CANRELEASE))
else
*flagsp &= ~ID_FLAG_CANRELEASE;
handled |= handle_input_event (evt, state, 1, autofire, true, false);
- if (k == 0)
- process_custom_event (na, j, state, qualmask, autofire);
+ process_custom_event (na, j, state, qualmask, autofire, k);
}
}
return handled;
{
uae_char *res = dst;
uae_u8 b;
+ dst[0] = 0;
do {
if (!addr_valid (_T("_tcscpyah"), src, 1))
return res;
b = get_byte (src++);
*dst++ = b;
+ *dst = 0;
maxsize--;
- if (maxsize <= 1) {
- *dst++= 0;
+ if (maxsize <= 1)
break;
- }
} while (b);
return res;
}
{
struct regstruct *r = ®s;
uae_u16 opcode;
+ bool exit = false;
if (cpu_tracer < 0) {
memcpy (&r->regs, &cputrace.regs, 16 * sizeof (uae_u32));
cont:
if (r->spcflags || time_for_interrupt ()) {
if (do_specialties (0))
- return;
+ exit = true;
}
regs.ce020tmpcycles -= cpucycleunit;
regs.ce020tmpcycles = CYCLE_UNIT * MAX68020CYCLES;;
}
regs.ipl = regs.ipl_pin;
+
+ if (exit)
+ return;
}
}
static bool wasstilldrawing_broken;
static HANDLE filenotificationhandle;
+static bool fakemode;
+static uae_u8 *fakebitmap;
+
static D3DXMATRIXA16 m_matProj, m_matProj2;
static D3DXMATRIXA16 m_matWorld, m_matWorld2;
static D3DXMATRIXA16 m_matView, m_matView2;
static int isd3d (void)
{
- if (devicelost || !d3ddev || !d3d_enabled)
+ if (fakemode || devicelost || !d3ddev || !d3d_enabled)
return 0;
return 1;
}
D3DCAPS9 d3dCaps;
if (d3d_good > 0)
- return 1;
+ return d3d_good;
if (d3d_good < 0)
return 0;
d3d_good = -1;
d3dx = Direct3DCreate9 (D3D_SDK_VERSION);
if (d3dx != NULL) {
if (SUCCEEDED (d3dx->GetDeviceCaps (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &d3dCaps))) {
- if (d3dCaps.PixelShaderVersion >= D3DPS_VERSION(1, 0)) {
- if (((d3dCaps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL) == D3DPTEXTURECAPS_NONPOW2CONDITIONAL) || !(d3dCaps.TextureCaps & D3DPTEXTURECAPS_POW2)) {
- if (!(d3dCaps.TextureCaps & D3DPTEXTURECAPS_SQUAREONLY) && (d3dCaps.Caps2 & D3DCAPS2_DYNAMICTEXTURES)) {
- d3d_good = 1;
+ if (((d3dCaps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL) == D3DPTEXTURECAPS_NONPOW2CONDITIONAL) || !(d3dCaps.TextureCaps & D3DPTEXTURECAPS_POW2)) {
+ if (!(d3dCaps.TextureCaps & D3DPTEXTURECAPS_SQUAREONLY) && (d3dCaps.Caps2 & D3DCAPS2_DYNAMICTEXTURES)) {
+ d3d_good = 1;
+ if (d3dCaps.PixelShaderVersion >= D3DPS_VERSION(1, 0)) {
+ d3d_good = 2;
shaderon = 1;
}
}
}
d3dx->Release ();
}
- return d3d_good > 0 ? 1 : 0;
+ return d3d_good > 0 ? d3d_good : 0;
}
int D3D_canshaders (void)
return errmsg;
}
+ xfree (fakebitmap);
+ fakebitmap = xmalloc (uae_u8, w_w * depth);
+
d3dx = LoadLibrary (D3DX9DLL);
if (d3dx == NULL) {
_tcscpy (errmsg, _T("Direct3D: Newer DirectX Runtime required.\n\nhttp://go.microsoft.com/fwlink/?linkid=56513"));
max_texture_w = d3dCaps.MaxTextureWidth;
max_texture_h = d3dCaps.MaxTextureHeight;
- write_log (_T("%s: %08X "), D3DHEAD, flags);
+ write_log (_T("%s: %08X "), D3DHEAD, flags, d3dCaps.Caps, d3dCaps.Caps2, d3dCaps.Caps3);
if (d3dCaps.TextureCaps & D3DPTEXTURECAPS_SQUAREONLY)
write_log (_T("SQUAREONLY "));
if (d3dCaps.TextureCaps & D3DPTEXTURECAPS_POW2)
write_log (_T("ALPHA "));
if (d3dCaps.Caps2 & D3DCAPS2_DYNAMICTEXTURES)
write_log (_T("DYNAMIC "));
+ if (d3dCaps.Caps & D3DCAPS_READ_SCANLINE)
+ write_log (_T("SCANLINE "));
+
write_log (_T("\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"),
write_log (_T("%s: CreateQuery(D3DQUERYTYPE_EVENT) failed: %s\n"), D3DHEAD, D3D_ErrorString (hr));
}
if (d3ddevex) {
- //hr = d3ddevex->SetMaximumFrameLatency (vsync < 0 && ap->gfx_vflip <= 0 ? 1 : (vsync ? 2 : 0));
hr = d3ddevex->SetMaximumFrameLatency (vsync ? 1 : 0);
if (FAILED (hr))
write_log (_T("%s: SetMaximumFrameLatency() failed: %s\n"), D3DHEAD, D3D_ErrorString (hr));
void D3D_flushtexture (int miny, int maxy)
{
- if (fulllocked || !texture)
+ if (fakemode || fulllocked || !texture)
return;
if (miny >= 0 && maxy >= 0) {
RECT r;
D3DLOCKED_RECT lock;
HRESULT hr;
+ if (fakemode) {
+ *pitch = 0;
+ return fakebitmap;
+ }
+
if (D3D_needreset () > 0)
return NULL;
if (!isd3d () || !texture)
{
static int vsync2_cnt;
+ if (fakemode)
+ return true;
+
if (!isd3d () || !texture)
return false;
void D3D_showframe (void)
{
+ if (!isd3d ())
+ return;
if (currprefs.turbo_emulation) {
if (!(dpp.PresentationInterval & D3DPRESENT_INTERVAL_IMMEDIATE) && wasstilldrawing_broken) {
static int frameskip;
static int recycle (const TCHAR *name)
{
- if (currprefs.win32_norecyclebin) {
- DWORD dirattr = GetFileAttributes (name);
- if (dirattr != INVALID_FILE_ATTRIBUTES && (dirattr & FILE_ATTRIBUTE_DIRECTORY))
+ DWORD dirattr = GetFileAttributes (name);
+ bool isdir = dirattr != INVALID_FILE_ATTRIBUTES && (dirattr & FILE_ATTRIBUTE_DIRECTORY);
+
+ if (currprefs.win32_norecyclebin || isdir) {
+ if (isdir)
return RemoveDirectory (name) ? 0 : -1;
- return DeleteFile(name) ? 0 : -1;
+ else
+ return DeleteFile (name) ? 0 : -1;
} else {
SHFILEOPSTRUCT fos;
+ HANDLE h;
+
+ h = CreateFile (name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (h != INVALID_HANDLE_VALUE) {
+ LARGE_INTEGER size;
+ if (GetFileSizeEx (h, &size)) {
+ if (size.QuadPart == 0) {
+ CloseHandle (h);
+ return DeleteFile (name) ? 0 : -1;
+ }
+ }
+ CloseHandle (h);
+ }
+
/* name must be terminated by \0\0 */
TCHAR *p = xcalloc (TCHAR, _tcslen (name) + 2);
int v;
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) {
+ if (currprefs.gfx_api && D3D_goodenough () > 0 && USE_HARDWARESPRITE) {
hwsprite = 1;
flags |= BIF_HARDWARESPRITE;
write_log (_T("P96: Hardware sprite support enabled\n"));
} else if (currprefs.win32_active_nocapture_nosound && sound_closed < 0) {
resumesoundpaused ();
}
+ setmaintitle (hMainWnd);
} else {
inputdevice_acquire (FALSE);
}
#define LANG_DLL 1
//#define WINUAEBETA _T("")
-#define WINUAEBETA _T("2")
-#define WINUAEDATE MAKEBD(2012, 5, 18)
+#define WINUAEBETA _T("3")
+#define WINUAEDATE MAKEBD(2012, 5, 25)
#define WINUAEEXTRA _T("")
//#define WINUAEEXTRA _T("AmiKit Preview")
#define WINUAEREV _T("")
// 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);
+ write_log (_T("Interlaced frame type mismatch %d<>%d\n"), vblankbaselace_chipset, vblankthread_oddeven);
return true;
}
} else if (mode == VBLANKTH_ACTIVE_WAIT) {
sleep_millis (1);
} else if (mode == VBLANKTH_ACTIVE_START) {
- // do not start until vblank has been passed
+ // do not start until vblank has passed
int vp;
if (!getvblankpos (&vp)) {
// bad things happening
vblank_prev_time = t;
thread_vblank_time = t;
frame_missed++;
- return true;
+ return 0;
}
if (0 || (log_vsync & 1)) {
vblank_prev_time = read_processor_time () + vblankbasewait1;
dooddevenskip = true;
- framelost = true;
+ framelost = false;
v = -1;
} else if (currprefs.turbo_emulation) {
vsync_sleep (false);
}
- prevvblankpos = 0;
vp = vblank_wait ();
if (vp >= -1) {
vblank_prev_time = read_processor_time ();
framelost = false;
}
+ getvblankpos (&vp);
}
if (v) {
if (cnt >= total)
break;
}
- vblankbaseadjust = 0;
- if (minscanline == 1)
- vblankbaseadjust = timezeroonevblank (-1, 1);
+ vblankbaseadjust = timezeroonevblank (-1, 1);
changevblankthreadmode (VBLANKTH_IDLE);
vblankbasewait2 = (syncbase / tsum2) * 55 / 100;
vblankbasewait3 = (syncbase / tsum2) * 99 / 100 - syncbase / (250 * (vblank_skipeveryother ? 1 : 2)); // at least 2ms before vblank
vblankbaselace = lace;
- 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(""), vblankbaseadjust, vblankbasefull,
vblankbasewait3 * 100 / (syncbase / tsum2));
+
+ if (minscanline == 1) {
+ if (vblankbaseadjust < 0)
+ vblankbaseadjust = 0;
+ else if (vblankbaseadjust > vblankbasefull / 10)
+ vblankbaseadjust = vblankbasefull / 10;
+ } else {
+ vblankbaseadjust = 0;
+ }
+
remembered_vblank = tsum;
vblank_prev_time = read_processor_time ();
}
}
int overlaytype = SendDlgItemMessage (hDlg, IDC_FILTEROVERLAYTYPE, CB_GETCURSEL, 0, 0L);
- if (workprefs.gfx_api && D3D_goodenough ()) {
+ if (workprefs.gfx_api && D3D_goodenough () > 1) {
WIN32GUI_LoadUIString (IDS_NONE, tmp, MAX_DPATH);
SendDlgItemMessage (hDlg, IDC_FILTEROVERLAY, CB_ADDSTRING, 0, (LPARAM)tmp);
SendDlgItemMessage (hDlg, IDC_FILTEROVERLAY, CB_SETCURSEL, 0, 0);
- hdd from command line
- no-buffer tearing updates
+Beta 3:
+
+- FPS led was always yellow in most non low latency vsync modes.
+- Custom input event toggle didn't work (3rd and 4th slots), (2.4.1)
+- Custom input event non-toggle mode with qualifiers didn't work correctly.
+- Allow D3D RTG hardware sprite if non-power of 2 textures are supported, do not require shader support.
+- Do not override currently selected CD image when loading statefile if new CD path does not exist.
+- Do not report CD not present state if restoring CD32 statefile that was created with inserted CD.
+ It would usually cause immediate reboot to CD32 title screen and most CD32 shovelware ports won't care about
+ the CD after game has been loaded. This has been broken previously many times..
+- Any active breakpoint stopped all interrupts in some situations if 68020 cycle-exact mode.
+- "ALT-TAB or middle mouse button untraps mouse - F12 opens settings" window title was missing.
+- Uncapture mouse when entering debugger.
+- Fixed blank screen in directdraw + no filter mode. (b1)
+- Do not move directories or empty files to Windows recycle bin (if recycle bin option enabled).
+
Beta 2:
- Missing harddrive in harddrive dialog if any device returned "too short STORAGE_DEVICE_DESCRIPTOR only x bytes". (2.4.0)