]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
imported winuaesrc1500b24.zip
authorToni Wilen <twilen@winuae.net>
Sun, 15 Jun 2008 08:16:18 +0000 (11:16 +0300)
committerToni Wilen <twilen@winuae.net>
Mon, 22 Feb 2010 19:40:48 +0000 (21:40 +0200)
disk.c
include/custom.h
od-win32/dinput.c
od-win32/direct3d.c
od-win32/dxwrap.c
od-win32/hardfile_win32.c
od-win32/opengl.c
od-win32/win32.c
od-win32/win32.h
od-win32/win32gfx.c
od-win32/winuaechangelog.txt

diff --git a/disk.c b/disk.c
index 7b921e8a40ec5c0f2e32a8d58bb8cb6bec5d20d9..b4eb3e98cbe707bf4c7f6e3b966c6c5df098f347 100755 (executable)
--- a/disk.c
+++ b/disk.c
@@ -2424,7 +2424,7 @@ static void disk_doupdate_write (drive * drv, int floppybits)
                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) {
index d20813d0ee9080340ccb4f12d3018a1acd4cfcdb..20bc605cb0b837b5330ab535741a2b16e31815bb 100755 (executable)
@@ -96,7 +96,7 @@ extern uae_u16 INTREQR (void);
 #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
index 219fb8644862f86a91832d898058009a81da6ac9..93ed8beff9f744fe5444298d1a939211d90c30d4 100755 (executable)
@@ -68,6 +68,7 @@ struct didata {
     HANDLE rawinput;
     int wininput;
     int catweasel;
+    int coop;
 
     int axles;
     int buttons;
@@ -659,13 +660,20 @@ static int acquire (LPDIRECTINPUTDEVICE8 lpdi, char *txt)
     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;
 }
@@ -680,9 +688,9 @@ static void sortdd (struct didata *dd, int num, int type)
        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));
            }
        }
     }
@@ -1104,7 +1112,7 @@ static int acquire_mouse (int num, int flags)
 
     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;
@@ -1728,7 +1736,6 @@ void wait_keyrelease (void)
 
 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");
@@ -1755,7 +1762,7 @@ static int acquire_kb (int num, int flags)
        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")) {
@@ -2021,6 +2028,17 @@ static void close_joystick (void)
     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;
@@ -2029,7 +2047,7 @@ static int acquire_joystick (int num, int flags)
 
     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);
index 62a9f03b572169983e871031ca9400e20adf0920..76b85689cf94ee9857fb06debe73e2e7afaeb392 100755 (executable)
@@ -320,7 +320,7 @@ const char *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth)
     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) {
@@ -332,8 +332,7 @@ const char *D3D_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth)
        }
     }
 
-    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 ();
index 48f6c42e0716a2b02dff9f47df78dc94de06c067..5d6f768d0cc64f0ee6169dec16dde510f94110fd 100755 (executable)
@@ -72,6 +72,8 @@ HRESULT restoresurface (LPDIRECTDRAWSURFACE7 surf)
 {
     HRESULT ddrval;
     
+    if (surf == NULL)
+       return E_FAIL;
     if (surf == dxdata.flipping[0] || surf == dxdata.flipping[1])
        surf = dxdata.primary;
     ddrval = IDirectDrawSurface7_IsLost (surf);
@@ -435,7 +437,7 @@ char *outGUID (const GUID *guid)
 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),
index 33d14210cb0b3a57c861c4cd2a61e18005632592..994c006a8fff3fec552498ee93d4da2088ec8cb2 100755 (executable)
@@ -307,13 +307,13 @@ end:
 
 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;
@@ -1257,7 +1257,8 @@ end:
 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;
 
@@ -1267,6 +1268,20 @@ static void hmc_check (struct hardfiledata *hfd, struct uaedev_config_info *uci,
        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;
@@ -1295,24 +1310,29 @@ static void hmc_check (struct hardfiledata *hfd, struct uaedev_config_info *uci,
     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);
        }
     }
 
index c58506cb16794e2445028207dac63c32f65f03d6..549a4bdf8aac14323dd690655ff16fafed9b16f4 100755 (executable)
@@ -48,7 +48,7 @@ static int required_texture_size;
 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;
@@ -196,6 +196,7 @@ const char *OGL_init (HWND ahwnd, int w_w, int w_h, int t_w, int t_h, int depth)
     w_height = w_h;
     t_width = t_w;
     t_height = t_h;
+    t_depth = depth;
 
     hwnd = ahwnd;
     total_textures = 2;
@@ -435,7 +436,7 @@ static void OGL_swapinterval (void)
     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);
@@ -523,7 +524,7 @@ static void OGL_dorender (int newtex)
     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);
index 1772ae312ed5e5bd679137ad427654ae3aac12ba..094b0d51ccfe6cfafd86b15534d07fc6adc84d38 100755 (executable)
@@ -808,6 +808,11 @@ static LRESULT CALLBACK AmigaWindowProc (HWND hWnd, UINT message, WPARAM wParam,
        DragAcceptFiles (hWnd, TRUE);
     return 0;
 
+    case WM_DESTROY:
+       inputdevice_unacquire ();
+       dinput_window ();
+    return 0;
+
     case WM_CLOSE:
        uae_quit ();
     return 0;
@@ -912,7 +917,7 @@ static LRESULT CALLBACK AmigaWindowProc (HWND hWnd, UINT message, WPARAM wParam,
            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);
@@ -971,7 +976,7 @@ static LRESULT CALLBACK AmigaWindowProc (HWND hWnd, UINT message, WPARAM wParam,
                            }
                            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;
@@ -1113,7 +1118,6 @@ static LRESULT CALLBACK MainWindowProc (HWND hWnd, UINT message, WPARAM wParam,
      case WM_SIZING:
      case WM_SIZE:
      case WM_GETMINMAXINFO:
-     case WM_CREATE:
      case WM_DESTROY:
      case WM_CLOSE:
      case WM_HELP:
@@ -1126,7 +1130,7 @@ static LRESULT CALLBACK MainWindowProc (HWND hWnd, UINT message, WPARAM wParam,
      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;
index f16d33d1f2c591d9fe908ac86c514de0e1dea3b5..5d75156875f19852902c40dbb779080866083c62 100755 (executable)
@@ -15,9 +15,9 @@
 #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 ""
 
@@ -107,9 +107,10 @@ extern int dinput_wmkey (uae_u32 key);
 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);
@@ -136,4 +137,5 @@ extern void logging_open(int,int);
 extern void logging_cleanup(void);
 
 extern LONG WINAPI WIN32_ExceptionFilter(struct _EXCEPTION_POINTERS *pExceptionPointers, DWORD ec);
-#endif
\ No newline at end of file
+
+#endif
index 065e129a96a75287b6c6ee906fd8b9b46a1932f5..c7126815375c1837a2747dd75911fd12bc43f24b 100755 (executable)
 #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
@@ -243,7 +241,7 @@ static int set_ddraw_2 (void)
 
     DirectDraw_FreeMainSurface ();
     ddrval = DirectDraw_SetCooperativeLevel (hAmigaWnd, dxfullscreen, TRUE);
-    if (FAILED(ddrval))
+    if (FAILED (ddrval))
        goto oops;
 
     if (dxfullscreen)  {
@@ -267,7 +265,7 @@ static int set_ddraw_2 (void)
 
     if (dd) {
        ddrval = DirectDraw_CreateClipper ();
-       if (FAILED(ddrval))
+       if (FAILED (ddrval))
            goto oops;
        ddrval = DirectDraw_CreateMainSurface (width, height);
        if (FAILED(ddrval)) {
@@ -275,7 +273,7 @@ static int set_ddraw_2 (void)
            goto oops;
        }
        ddrval = DirectDraw_SetClipper (hAmigaWnd);
-       if (FAILED(ddrval))
+       if (FAILED (ddrval))
            goto oops;
        if (DirectDraw_SurfaceLock ()) {
            currentmode->pitch = DirectDraw_GetSurfacePitch ();
@@ -803,6 +801,7 @@ static int open_windows (void)
 {
     int ret, i;
 
+    inputdevice_unacquire ();
     reset_sound();
     in_sizemove = 0;
 
@@ -1071,6 +1070,8 @@ static int ncols256 = 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)
@@ -1094,6 +1095,26 @@ void init_colors (void)
     }
 
     /* 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);
@@ -1103,27 +1124,16 @@ void init_colors (void)
        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) {
@@ -1137,7 +1147,7 @@ void init_colors (void)
            }
        }
        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
@@ -1341,7 +1351,7 @@ void gfx_set_picasso_state (int on)
 
     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);
@@ -1361,7 +1371,7 @@ end:
 
 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 ();
 }
@@ -1443,7 +1453,7 @@ void close_windows (void)
 #if defined (GFXFILTER)
     S2X_free ();
 #endif
-    free (gfxvidinfo.realbufmem);
+    xfree (gfxvidinfo.realbufmem);
     gfxvidinfo.realbufmem = 0;
     DirectDraw_Release ();
     close_hwnds ();
@@ -1573,7 +1583,7 @@ static int getbestmode (int nextbest)
 
 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;
@@ -1756,10 +1766,16 @@ static void updatemodes (void)
            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;
@@ -1830,10 +1846,10 @@ static BOOL doInit (void)
            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
@@ -1934,6 +1950,7 @@ static BOOL doInit (void)
        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)) {
 
@@ -2104,11 +2121,11 @@ HDC gethdc (void)
 {
     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)))
@@ -2119,13 +2136,13 @@ HDC gethdc (void)
 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;
     }
index e537cb0078810d9c4574e926ce7ac962b385e191..17f95d39e4c6a73a4f35226392daa5d93057641c 100755 (executable)
@@ -1,4 +1,14 @@
 
+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)