floppy[dr].mfmpos %= drv->tracklen;
}
}
- if ((dmacon & 0x210) == 0x210 && dskdmaen == 3 && dsklength > 0 && !(adkcon &0x400)) {
+ if ((dmacon & 0x210) == 0x210 && dskdmaen == 3 && dsklength > 0 && (!(adkcon &0x400) || dma_enable)) {
bitoffset++;
bitoffset &= 15;
if (!bitoffset) {
#define MAXVPOS_PAL 312
#define MAXVPOS_NTSC 262
#define VBLANK_ENDLINE_PAL 27
-#define VBLANK_ENDLINE_NTSC 28
+#define VBLANK_ENDLINE_NTSC 21
#define VBLANK_SPRITE_PAL 25
#define VBLANK_SPRITE_NTSC 20
#define VBLANK_HZ_PAL 50
HANDLE rawinput;
int wininput;
int catweasel;
+ int coop;
int axles;
int buttons;
return SUCCEEDED (hr) ? 1 : 0;
}
-static int setcoop (LPDIRECTINPUTDEVICE8 lpdi, DWORD mode, char *txt)
+static int setcoop (struct didata *did, DWORD mode, char *txt)
{
HRESULT hr = DI_OK;
- if (lpdi && hMainWnd) {
- hr = IDirectInputDevice8_SetCooperativeLevel (lpdi, hMainWnd, mode);
- if (FAILED (hr) && hr != E_NOTIMPL)
- write_log ("setcooperativelevel %s failed, %s\n", txt, DXError (hr));
+ if (did->lpdi) {
+ did->coop = 0;
+ if (!did->coop && hMainWnd) {
+ hr = IDirectInputDevice8_SetCooperativeLevel (did->lpdi, hMainWnd, mode);
+ if (FAILED (hr) && hr != E_NOTIMPL) {
+ write_log ("setcooperativelevel %s failed, %s\n", txt, DXError (hr));
+ } else {
+ did->coop = 1;
+ //write_log ("cooperativelevel %s set\n", txt);
+ }
+ }
}
return SUCCEEDED (hr) ? 1 : 0;
}
for (j = i + 1; j < num; j++) {
dd[j].type = type;
if (dd[i].priority < dd[j].priority || (dd[i].priority == dd[j].priority && strcmp (dd[i].sortname, dd[j].sortname) > 0)) {
- memcpy (&ddtmp, &dd[i], sizeof(ddtmp));
- memcpy (&dd[i], &dd[j], sizeof(ddtmp));
- memcpy (&dd[j], &ddtmp, sizeof(ddtmp));
+ memcpy (&ddtmp, &dd[i], sizeof (ddtmp));
+ memcpy (&dd[i], &dd[j], sizeof (ddtmp));
+ memcpy (&dd[j], &ddtmp, sizeof (ddtmp));
}
}
}
unacquire (lpdi, "mouse");
if (did->connection == DIDC_DX && lpdi) {
- setcoop (lpdi, flags ? (DISCL_FOREGROUND | DISCL_EXCLUSIVE) : (DISCL_BACKGROUND | DISCL_NONEXCLUSIVE), "mouse");
+ setcoop (&di_mouse[num], flags ? (DISCL_FOREGROUND | DISCL_EXCLUSIVE) : (DISCL_BACKGROUND | DISCL_NONEXCLUSIVE), "mouse");
dipdw.diph.dwSize = sizeof(DIPROPDWORD);
dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
dipdw.diph.dwObj = 0;
static int acquire_kb (int num, int flags)
{
- DWORD mode = DISCL_NOWINKEY | DISCL_FOREGROUND | DISCL_EXCLUSIVE;
LPDIRECTINPUTDEVICE8 lpdi = di_keyboard[num].lpdi;
unacquire (lpdi, "keyboard");
set_leds (oldusedleds);
}
- setcoop (lpdi, mode, "keyboard");
+ setcoop (&di_keyboard[num], DISCL_NOWINKEY | DISCL_FOREGROUND | DISCL_EXCLUSIVE, "keyboard");
kb_do_refresh = ~0;
di_keyboard[num].acquired = -1;
if (acquire (lpdi, "keyboard")) {
di_free ();
}
+void dinput_window (void)
+{
+ int i;
+ for (i = 0; i < num_joystick; i++)
+ di_joystick[i].coop = 0;
+ for (i = 0; i < num_mouse; i++)
+ di_mouse[i].coop = 0;
+ for (i = 0; i < num_keyboard; i++)
+ di_keyboard[i].coop = 0;
+}
+
static int acquire_joystick (int num, int flags)
{
LPDIRECTINPUTDEVICE8 lpdi = di_joystick[num].lpdi;
unacquire (lpdi, "joystick");
if (di_joystick[num].connection == DIDC_DX && lpdi) {
- setcoop (lpdi, flags ? (DISCL_FOREGROUND | DISCL_EXCLUSIVE) : (DISCL_BACKGROUND | DISCL_NONEXCLUSIVE), "joystick");
+ setcoop (&di_joystick[num], flags ? (DISCL_FOREGROUND | DISCL_EXCLUSIVE) : (DISCL_BACKGROUND | DISCL_NONEXCLUSIVE), "joystick");
memset (&dipdw, 0, sizeof (dipdw));
dipdw.diph.dwSize = sizeof (DIPROPDWORD);
dipdw.diph.dwHeaderSize = sizeof (DIPROPHEADER);
dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
vsync2 = 0;
if (isfullscreen() > 0) {
- dpp.FullScreen_RefreshRateInHz = currprefs.gfx_refreshrate;
+ dpp.FullScreen_RefreshRateInHz = abs (currprefs.gfx_refreshrate);
if (currprefs.gfx_avsync > 0) {
dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
if (currprefs.gfx_avsync > 85) {
}
}
- ret = IDirect3D9_CreateDevice (d3d, adapter, D3DDEVTYPE_HAL, ahwnd,
- USAGE, &dpp, &d3ddev);
+ ret = IDirect3D9_CreateDevice (d3d, adapter, D3DDEVTYPE_HAL, ahwnd, USAGE, &dpp, &d3ddev);
if(FAILED (ret)) {
sprintf (errmsg, "CreateDevice failed, %s\n", D3D_ErrorString (ret));
D3D_free ();
{
HRESULT ddrval;
+ if (surf == NULL)
+ return E_FAIL;
if (surf == dxdata.flipping[0] || surf == dxdata.flipping[1])
surf = dxdata.primary;
ddrval = IDirectDrawSurface7_IsLost (surf);
const char *DXError (HRESULT ddrval)
{
static char dderr[1000];
- sprintf (dderr, "%08.8X S=%d F=%04.4X C=%04.4X (%d) (%s)",
+ sprintf (dderr, "%08X S=%d F=%04X C=%04.4X (%d) (%s)",
ddrval, (ddrval & 0x80000000) ? 1 : 0,
HRESULT_FACILITY(ddrval),
HRESULT_CODE(ddrval),
void hdf_close (struct hardfiledata *hfd)
{
- if (!hfd->handle_valid)
- return;
- if (hfd->handle && hfd->handle != INVALID_HANDLE_VALUE) {
- if (hfd->handle_valid == HDF_HANDLE_WIN32)
- CloseHandle (hfd->handle);
- else if(hfd->handle_valid == HDF_HANDLE_ZFILE)
- zfile_fclose (hfd->handle);
+ if (hfd->handle_valid) {
+ if (hfd->handle && hfd->handle != INVALID_HANDLE_VALUE) {
+ if (hfd->handle_valid == HDF_HANDLE_WIN32)
+ CloseHandle (hfd->handle);
+ else if(hfd->handle_valid == HDF_HANDLE_ZFILE)
+ zfile_fclose (hfd->handle);
+ }
}
xfree (hfd->emptyname);
hfd->emptyname = NULL;
int hardfile_remount (int nr);
-static void hmc_check (struct hardfiledata *hfd, struct uaedev_config_info *uci, int *rescanned, int *reopen, int *gotinsert)
+static void hmc_check (struct hardfiledata *hfd, struct uaedev_config_info *uci, int *rescanned, int *reopen,
+ int *gotinsert, const char *drvname, int inserted)
{
int ret;
hdf_init2 (1);
*rescanned = 1;
}
+ if (hfd->emptyname && strlen (hfd->emptyname) >= 6 && drvname && strlen (drvname) == 3 && drvname[1] == ':' && drvname[2] == '\\' && !inserted) { /* drive letter check */
+ char tmp[10], *p;
+ sprintf (tmp, "\\\\.\\%c:", drvname[0]);
+ p = hfd->emptyname + strlen (hfd->emptyname) - 6;
+ write_log("workaround-remove test: '%s' and '%s'\n", p, drvname);
+ if (!strcmp (tmp, p)) {
+ write_log ("workaround-remove done\n");
+ hdf_close (hfd);
+ hfd->drive_empty = 0;
+ hardfile_do_disk_change (uci, 0);
+ return;
+ }
+ }
+
if (hfd->drive_empty < 0 || !hfd->handle_valid) {
int empty = hfd->drive_empty;
int r;
hardfile_do_disk_change (uci, ret < 0 ? 0 : 1);
}
-int win32_hardfile_media_change (void)
+int win32_hardfile_media_change (const char *drvname, int inserted)
{
int gotinsert = 0, rescanned = 0;
- int i;
+ int i, j;
for (i = 0; i < MAX_FILESYSTEM_UNITS; i++) {
struct hardfiledata *hfd = get_hardfile_data (i);
int reopen = 0;
if (!hfd || !(hfd->flags & HFD_FLAGS_REALDRIVE))
continue;
- hmc_check (hfd, &currprefs.mountconfig[i], &rescanned, &reopen, &gotinsert);
+ for (j = 0; j < currprefs.mountitems; j++) {
+ if (currprefs.mountconfig[j].configoffset == i) {
+ hmc_check (hfd, &currprefs.mountconfig[j], &rescanned, &reopen, &gotinsert, drvname, inserted);
+ break;
+ }
+ }
}
for (i = 0; i < currprefs.mountitems; i++) {
extern struct hd_hardfiledata *pcmcia_sram;
int reopen = 0;
struct uaedev_config_info *uci = &currprefs.mountconfig[i];
if (uci->controller == HD_CONTROLLER_PCMCIA_SRAM) {
- hmc_check (&pcmcia_sram->hfd, uci, &rescanned, &reopen, &gotinsert);
+ hmc_check (&pcmcia_sram->hfd, uci, &rescanned, &reopen, &gotinsert, drvname, inserted);
}
}
static int required_sl_texture_size;
static GLint ti2d_internalformat, ti2d_format, ti2d_type;
static GLint sl_ti2d_internalformat, sl_ti2d_format, sl_ti2d_type;
-static int w_width, w_height, t_width, t_height;
+static int w_width, w_height, t_width, t_height, t_depth;
static int packed_pixels;
static int doublevsync;
static int ogl_enabled;
w_height = w_h;
t_width = t_w;
t_height = t_h;
+ t_depth = depth;
hwnd = ahwnd;
total_textures = 2;
doublevsync = 0;
if (wglSwapIntervalEXT) {
int i1, i2;
- i1 = (currprefs.gfx_avsync > 0 && isfullscreen() > 0) ? (currprefs.gfx_refreshrate > 85 ? 2 : 1) : 0;
+ i1 = (currprefs.gfx_avsync > 0 && isfullscreen() > 0) ? (abs (currprefs.gfx_refreshrate) > 85 ? 2 : 1) : 0;
if (turbo_emulation)
i1 = 0;
wglSwapIntervalEXT (i1);
glLoadIdentity ();
glBindTexture (GL_TEXTURE_2D, tex[0]);
- if (newtex)
+ if (newtex && gfxvidinfo.bufmem + t_width * t_height * t_depth / 8 <= gfxvidinfo.bufmemend)
glTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0, t_width, t_height, ti2d_format, ti2d_type, data);
glBegin (GL_QUADS);
DragAcceptFiles (hWnd, TRUE);
return 0;
+ case WM_DESTROY:
+ inputdevice_unacquire ();
+ dinput_window ();
+ return 0;
+
case WM_CLOSE:
uae_quit ();
return 0;
if(SHGetPathFromIDList((struct _ITEMIDLIST *)(shns->dwItem1), path)) {
int inserted = lParam == SHCNE_MEDIAINSERTED ? 1 : 0;
write_log("Shell Notification %d '%s'\n", inserted, path);
- if (!win32_hardfile_media_change ()) {
+ if (!win32_hardfile_media_change (path, inserted)) {
if ((inserted && CheckRM (path)) || !inserted) {
if (inserted) {
DWORD type = GetDriveType(path);
}
if (type == DRIVE_REMOVABLE || type == DRIVE_CDROM || !inserted) {
write_log("WM_DEVICECHANGE '%s' type=%d inserted=%d\n", drvname, type, inserted);
- if (!win32_hardfile_media_change ()) {
+ if (!win32_hardfile_media_change (drvname, inserted)) {
if ((inserted && CheckRM (drvname)) || !inserted) {
if (type == DRIVE_CDROM && inserted)
inserted = -1;
case WM_SIZING:
case WM_SIZE:
case WM_GETMINMAXINFO:
- case WM_CREATE:
case WM_DESTROY:
case WM_CLOSE:
case WM_HELP:
case WM_ENABLE:
return AmigaWindowProc (hWnd, message, wParam, lParam);
- case WM_DISPLAYCHANGE:
+ case WM_DISPLAYCHANGE:
if (isfullscreen() <= 0 && !currprefs.gfx_filter && (wParam + 7) / 8 != DirectDraw_GetBytesPerPixel())
WIN32GFX_DisplayChangeRequested();
break;
#define GETBDM(x) (((x) - ((x / 10000) * 10000)) / 100)
#define GETBDD(x) ((x) % 100)
-#define WINUAEBETA 23
+#define WINUAEBETA 24
#define WINUAEPUBLICBETA 1
-#define WINUAEDATE MAKEBD(2008, 6, 13)
+#define WINUAEDATE MAKEBD(2008, 6, 15)
#define WINUAEEXTRA ""
#define WINUAEREV ""
extern int dinput_winmouse (void);
extern int dinput_wheelbuttonstart (void);
extern int dinput_winmousemode (void);
+extern void dinput_window (void);
void addnotifications (HWND hwnd, int remove);
-int win32_hardfile_media_change (void);
+int win32_hardfile_media_change (const char *drvname, int inserted);
extern int CheckRM(char *DriveName);
void systray (HWND hwnd, int remove);
void systraymenu (HWND hwnd);
extern void logging_cleanup(void);
extern LONG WINAPI WIN32_ExceptionFilter(struct _EXCEPTION_POINTERS *pExceptionPointers, DWORD ec);
-#endif
\ No newline at end of file
+
+#endif
#define DM_DX_FULLSCREEN 1
#define DM_W_FULLSCREEN 2
#define DM_OPENGL 8
-#define DM_DX_DIRECT 16
#define DM_PICASSO96 32
#define DM_DDRAW 64
#define DM_DC 128
#define DM_D3D 256
-#define DM_D3D_FULLSCREEN 512
#define DM_SWSCALE 1024
#define SM_WINDOW 0
DirectDraw_FreeMainSurface ();
ddrval = DirectDraw_SetCooperativeLevel (hAmigaWnd, dxfullscreen, TRUE);
- if (FAILED(ddrval))
+ if (FAILED (ddrval))
goto oops;
if (dxfullscreen) {
if (dd) {
ddrval = DirectDraw_CreateClipper ();
- if (FAILED(ddrval))
+ if (FAILED (ddrval))
goto oops;
ddrval = DirectDraw_CreateMainSurface (width, height);
if (FAILED(ddrval)) {
goto oops;
}
ddrval = DirectDraw_SetClipper (hAmigaWnd);
- if (FAILED(ddrval))
+ if (FAILED (ddrval))
goto oops;
if (DirectDraw_SurfaceLock ()) {
currentmode->pitch = DirectDraw_GetSurfacePitch ();
{
int ret, i;
+ inputdevice_unacquire ();
reset_sound();
in_sizemove = 0;
static int red_bits, green_bits, blue_bits, alpha_bits;
static int red_shift, green_shift, blue_shift, alpha_shift;
+static int x_red_bits, x_green_bits, x_blue_bits, x_alpha_bits;
+static int x_red_shift, x_green_shift, x_blue_shift, x_alpha_shift;
static int alpha;
static int get_color (int r, int g, int b, xcolnr * cnp)
}
/* init colors */
+ switch(currentmode->current_depth >> 3)
+ {
+ case 1:
+ memcpy (xcolors, xcol8, sizeof xcolors);
+ DirectDraw_SetPaletteEntries (0, 256, colors256);
+ break;
+ case 2:
+ case 3:
+ case 4:
+ x_red_bits = bits_in_mask (DirectDraw_GetPixelFormatBitMask (red_mask));
+ x_green_bits = bits_in_mask (DirectDraw_GetPixelFormatBitMask (green_mask));
+ x_blue_bits = bits_in_mask (DirectDraw_GetPixelFormatBitMask (blue_mask));
+ x_red_shift = mask_shift (DirectDraw_GetPixelFormatBitMask (red_mask));
+ x_green_shift = mask_shift (DirectDraw_GetPixelFormatBitMask (green_mask));
+ x_blue_shift = mask_shift (DirectDraw_GetPixelFormatBitMask (blue_mask));
+ x_alpha_bits = 0;
+ x_alpha_shift = 0;
+ break;
+ }
+
if (currentmode->flags & DM_OPENGL) {
#ifdef OPENGL
OGL_getpixelformat (currentmode->current_depth,&red_bits,&green_bits,&blue_bits,&red_shift,&green_shift,&blue_shift,&alpha_bits,&alpha_shift,&alpha);
D3D_getpixelformat (currentmode->current_depth,&red_bits,&green_bits,&blue_bits,&red_shift,&green_shift,&blue_shift,&alpha_bits,&alpha_shift,&alpha);
#endif
} else {
- switch(currentmode->current_depth >> 3)
- {
- case 1:
- memcpy (xcolors, xcol8, sizeof xcolors);
- DirectDraw_SetPaletteEntries(0, 256, colors256);
- break;
-
- case 2:
- case 3:
- case 4:
- red_bits = bits_in_mask (DirectDraw_GetPixelFormatBitMask (red_mask));
- green_bits = bits_in_mask (DirectDraw_GetPixelFormatBitMask (green_mask));
- blue_bits = bits_in_mask (DirectDraw_GetPixelFormatBitMask (blue_mask));
- red_shift = mask_shift (DirectDraw_GetPixelFormatBitMask (red_mask));
- green_shift = mask_shift (DirectDraw_GetPixelFormatBitMask (green_mask));
- blue_shift = mask_shift (DirectDraw_GetPixelFormatBitMask (blue_mask));
- alpha_bits = 0;
- alpha_shift = 0;
- break;
- }
+ red_bits = x_red_bits;
+ green_bits = x_green_bits;
+ blue_bits = x_blue_bits;
+ red_shift = x_red_shift;
+ green_shift = x_green_shift;
+ blue_shift = x_blue_shift;
+ alpha_bits = x_alpha_bits;
+ alpha_shift = x_alpha_shift;
}
+
if (currentmode->current_depth > 8) {
if (!(currentmode->flags & (DM_OPENGL|DM_D3D))) {
if (currentmode->current_depth != currentmode->native_depth) {
}
}
alloc_colors64k (red_bits, green_bits, blue_bits, red_shift,green_shift, blue_shift, alpha_bits, alpha_shift, alpha, 0);
- notice_new_xcolors();
+ notice_new_xcolors ();
#ifdef GFXFILTER
S2X_configure (red_bits, green_bits, blue_bits, red_shift,green_shift, blue_shift);
#endif
scalepicasso = 0;
update_gfxparams ();
- if (currprefs.gfx_afullscreen != currprefs.gfx_pfullscreen) {
+ if (currprefs.gfx_afullscreen != currprefs.gfx_pfullscreen || currprefs.gfx_filter == UAE_FILTER_DIRECT3D || currprefs.gfx_filter == UAE_FILTER_OPENGL) {
mode = 1;
} else {
mode = modeswitchneeded (&wc);
void gfx_set_picasso_modeinfo (uae_u32 w, uae_u32 h, uae_u32 depth, RGBFTYPE rgbfmt)
{
- alloc_colors_picasso (red_bits, green_bits, blue_bits, red_shift, green_shift, blue_shift, rgbfmt);
+ alloc_colors_picasso (x_red_bits, x_green_bits, x_blue_bits, x_red_shift, x_green_shift, x_blue_shift, rgbfmt);
if (screen_is_picasso && modeswitchneeded(currentmode))
open_screen ();
}
#if defined (GFXFILTER)
S2X_free ();
#endif
- free (gfxvidinfo.realbufmem);
+ xfree (gfxvidinfo.realbufmem);
gfxvidinfo.realbufmem = 0;
DirectDraw_Release ();
close_hwnds ();
static int create_windows_2 (void)
{
- int dxfs = currentmode->flags & (DM_DX_FULLSCREEN | DM_D3D_FULLSCREEN);
+ int dxfs = currentmode->flags & (DM_DX_FULLSCREEN);
int fsw = currentmode->flags & (DM_W_FULLSCREEN);
DWORD exstyle = currprefs.win32_notaskbarbutton ? 0 : WS_EX_APPWINDOW;
DWORD flags = 0;
if (currentmode->current_depth < 15)
currentmode->current_depth = 16;
}
- if (usedfilter->type == UAE_FILTER_DIRECT3D)
- flags |= DM_D3D;
- if (usedfilter->type == UAE_FILTER_OPENGL)
- flags |= DM_OPENGL;
+ if (!screen_is_picasso) {
+ if (usedfilter->type == UAE_FILTER_DIRECT3D) {
+ flags |= DM_D3D;
+ flags &= ~DM_DDRAW;
+ }
+ if (usedfilter->type == UAE_FILTER_OPENGL) {
+ flags |= DM_OPENGL;
+ flags &= ~DM_DDRAW;
+ }
+ }
}
#endif
currentmode->flags = flags;
WIN32GUI_LoadUIString(IDS_UNSUPPORTEDSCREENMODE, szMessage, MAX_DPATH);
WIN32GUI_LoadUIString(fs_warning, szMessage2, MAX_DPATH);
// Temporarily drop the DirectDraw stuff
- DirectDraw_Release();
+ DirectDraw_Release ();
sprintf (tmpstr, szMessage, szMessage2);
gui_message (tmpstr);
- DirectDraw_Start(displayGUID);
+ DirectDraw_Start (displayGUID);
if (screen_is_picasso)
changed_prefs.gfx_pfullscreen = currprefs.gfx_pfullscreen = 1;
else
gfxvidinfo.realbufmem = xmalloc (size);
gfxvidinfo.bufmem = gfxvidinfo.realbufmem;
gfxvidinfo.rowbytes = currentmode->amiga_width * gfxvidinfo.pixbytes;
+ gfxvidinfo.bufmemend = gfxvidinfo.bufmem + size;
} else if (!(currentmode->flags & DM_D3D)) {
{
HDC hdc = 0;
#ifdef OPENGL
- if (OGL_isenabled())
+ if (OGL_isenabled ())
return OGL_getDC (0);
#endif
#ifdef D3D
- if (D3D_isenabled())
+ if (D3D_isenabled ())
return D3D_getDC (0);
#endif
if(FAILED (DirectDraw_GetDC (&hdc)))
void releasehdc (HDC hdc)
{
#ifdef OPENGL
- if (OGL_isenabled()) {
+ if (OGL_isenabled ()) {
OGL_getDC (hdc);
return;
}
#endif
#ifdef D3D
- if (D3D_isenabled()) {
+ if (D3D_isenabled ()) {
D3D_getDC (hdc);
return;
}
+Beta 24:
+
+- real PCMCIA SRAM card removal should really really work now
+- real harddisk (or memory card or usb stick) disk change message
+ could have been sent to wrong device unit if multiple harddisk
+ devices were configured (including hardfiles)
+- direct3d and opengl fullscreen fixed
+- direct3d<>Picasso96 switching fixed (always need full display reset)
+- NTSC vblank end fixed (top of display was cut in overscan modes)
+
Beta 23:
- OGL/D3D fixed but uses old scaling method (update after 1.5)