]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
4910b4
authorToni Wilen <twilen@winuae.net>
Sat, 8 Jan 2022 19:51:12 +0000 (21:51 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 8 Jan 2022 19:51:12 +0000 (21:51 +0200)
epsonprinter.cpp
filesys.cpp
newcpu.cpp
od-win32/picasso96_win.cpp
od-win32/picasso96_win.h
od-win32/win32.cpp
od-win32/win32.h
od-win32/win32gui.cpp
od-win32/winuaechangelog.txt
pcem/vid_voodoo_fb.cpp

index 7f7179cced465fb8b91d57e76f271f92aef3b5c0..09f5a9045b6bc740d52b5904eb6199e5afd4b27d 100644 (file)
@@ -727,6 +727,8 @@ struct printdata
 static volatile struct printdata *queue;
 static uae_sem_t queue_sem, queue_sem2;
 
+static DOCINFO docinfo;
+
 static void prt_thread(void *p) 
 {
        prt_thread_mode = 1;
@@ -769,7 +771,6 @@ static void prt_thread(void *p)
                        int TcolorPrinter = pd->colorprinted;
 
                        if (!multiPageCounter) {
-                               DOCINFO docinfo;
                                docinfo.cbSize = sizeof(docinfo);
                                docinfo.lpszDocName = _T("WinUAE Epson Printer");
                                docinfo.lpszOutput = NULL;
@@ -799,7 +800,7 @@ static void prt_thread(void *p)
                                if (TcolorPrinter)
                                        dc = GetDC (NULL);
                                HBITMAP bitmap = CreateCompatibleBitmap (dc ? dc : TmemHDC, Tpage_w, Tpage_h);
-                               SelectObject (TmemHDC, bitmap);
+                               HGDIOBJ hobj = SelectObject (TmemHDC, bitmap);
                                BitBlt (TmemHDC, 0, 0, Tpage_w, Tpage_h, NULL, 0, 0, WHITENESS);
 
                                StartPage (TprinterDC);
@@ -820,6 +821,8 @@ static void prt_thread(void *p)
 
                                EndPage (TprinterDC);
 
+                               SelectObject(TmemHDC, hobj);
+
                                DeleteObject (bitmap);
                                if (dc)
                                        ReleaseDC (NULL, dc);
index a471b7346d793728dcd0611f8d69e55e2dffa350..c094884f9a32bb6178f4783f718bd3ede73b8282 100644 (file)
@@ -7610,9 +7610,10 @@ static void kill_ide(TrapContext *ctx)
                                        if (i == strlen(sd)) {
                                                uaecptr desc = (res[18] << 24) | (res[19] << 16) | (res[20] << 8) | (res[21] << 0);
                                                trap_get_bytes(ctx, res, desc, 4);
-                                               if (res[0] != 'S' && res[1] != 'C' && res[2] != 'S' && res[3] != 'I') {
+                                               if (res[0] != 'S' || res[1] != 'C' || res[2] != 'S' || res[3] != 'I') {
                                                        write_log(_T("scsi.device resmodules entry disabled\n"));
                                                        trap_put_long(ctx, rm, 0x80000000 | (rm + 4));
+                                                       break;
                                                }
                                        }
                                }
index f7d50ed28d2344026389c04a2bd45ad7ec009018..642448026b9607f3d353a2d889d1cab269119b05 100644 (file)
@@ -4349,8 +4349,9 @@ void doint(void)
        if (m68k_interrupt_delay) {
                int il = intlev();
                regs.ipl_pin = il;
-               if (regs.ipl_pin > regs.intmask || regs.ipl_pin == 7)
+               if (regs.ipl_pin > regs.intmask || regs.ipl_pin == 7) {
                        set_special(SPCFLAG_INT);
+               }
                return;
        }
        if (currprefs.cpu_compatible && currprefs.cpu_model < 68020)
index 307c9ff933a70280c84e360abaeb3f627835c72d..373b683976b1cb182372a515eddb3de686f0fba8 100644 (file)
@@ -229,6 +229,7 @@ static uaecptr oldscr = 0;
 extern addrbank gfxmem_bank;
 extern addrbank *gfxmem_banks[MAX_RTG_BOARDS];
 extern int rtg_index;
+int picasso96_test;
 
 void lockrtg(void)
 {
@@ -1053,7 +1054,12 @@ static void setconvert(int monid)
        struct picasso_vidbuf_description *vidinfo = &picasso_vidinfo[monid];
        struct picasso96_state_struct *state = &picasso96_state[monid];
 
-       vidinfo->picasso_convert = getconvert(state->RGBFormat, picasso_vidinfo[monid].pixbytes);
+       if (state->advDragging) {
+               vidinfo->picasso_convert[0] = getconvert(vidinfo->dacrgbformat[0], picasso_vidinfo[monid].pixbytes);
+               vidinfo->picasso_convert[1] = getconvert(vidinfo->dacrgbformat[1], picasso_vidinfo[monid].pixbytes);
+       } else {
+               vidinfo->picasso_convert[0] = vidinfo->picasso_convert[1] = getconvert(state->RGBFormat, picasso_vidinfo[monid].pixbytes);
+       }
        if (currprefs.gfx_api) {
                vidinfo->host_mode = picasso_vidinfo[monid].pixbytes == 4 ? RGBFB_B8G8R8A8 : RGBFB_B5G6R5PC;
        } else {
@@ -1142,8 +1148,10 @@ void picasso_refresh(int monid)
 
 static void picasso_handle_vsync2(struct AmigaMonitor *mon)
 {
-       struct amigadisplay *ad = &adisplays[mon->monitor_id];
-       struct picasso_vidbuf_description *vidinfo = &picasso_vidinfo[mon->monitor_id];
+       int monid = mon->monitor_id;
+       struct amigadisplay *ad = &adisplays[monid];
+       struct picasso_vidbuf_description *vidinfo = &picasso_vidinfo[monid];
+       struct picasso96_state_struct *p96state = &picasso96_state[monid];
        static int vsynccnt;
        int thisisvsync = 1;
        int vsync = isvsync_rtg();
@@ -1157,14 +1165,18 @@ static void picasso_handle_vsync2(struct AmigaMonitor *mon)
                lockrtg();
        if (state & PICASSO_STATE_SETDAC) {
                atomic_and(&vidinfo->picasso_state_change, ~PICASSO_STATE_SETDAC);
+               if (p96state->advDragging) {
+                       vidinfo->picasso_convert[0] = getconvert(vidinfo->dacrgbformat[0], picasso_vidinfo[monid].pixbytes);
+                       vidinfo->picasso_convert[1] = getconvert(vidinfo->dacrgbformat[1], picasso_vidinfo[monid].pixbytes);
+               }
                rtg_clear(mon->monitor_id);
        }
        if (state & PICASSO_STATE_SETGC) {
                atomic_and(&vidinfo->picasso_state_change, ~PICASSO_STATE_SETGC);
                set_gc_called = 1;
                vidinfo->picasso_changed = true;
-               init_picasso_screen(mon->monitor_id);
-               init_hz_p96(mon->monitor_id);
+               init_picasso_screen(monid);
+               init_hz_p96(monid);
                if (delayed_set_switch) {
                        delayed_set_switch = false;
                        atomic_or(&vidinfo->picasso_state_change, PICASSO_STATE_SETSWITCH);
@@ -1187,7 +1199,7 @@ static void picasso_handle_vsync2(struct AmigaMonitor *mon)
                atomic_and(&vidinfo->picasso_state_change, ~PICASSO_STATE_SETPANNING);
                vidinfo->full_refresh = 1;
                vidinfo->set_panning_called = 1;
-               init_picasso_screen(mon->monitor_id);
+               init_picasso_screen(monid);
                vidinfo->set_panning_called = 0;
        }
        if (state & PICASSO_STATE_SETDISPLAY) {
@@ -1206,7 +1218,7 @@ static void picasso_handle_vsync2(struct AmigaMonitor *mon)
 #endif
        }
 
-       getvsyncrate(mon->monitor_id, currprefs.chipset_refreshrate, &mult);
+       getvsyncrate(monid, currprefs.chipset_refreshrate, &mult);
        if (vsync && mult < 0) {
                vsynccnt++;
                if (vsynccnt < 2)
@@ -1232,7 +1244,7 @@ static void picasso_handle_vsync2(struct AmigaMonitor *mon)
 
        if (thisisvsync) {
                rtg_render();
-               frame_drawn(mon->monitor_id);
+               frame_drawn(monid);
        }
 
        if (uaegfx) {
@@ -2645,6 +2657,7 @@ static void inituaegfx(TrapContext *ctx, uaecptr ABI)
 #endif
        flags |= BIF_VGASCREENSPLIT;
        flags |= BIF_PALETTESWITCH;
+       flags |= (1 << 28);
        trap_put_long(ctx, ABI + PSSO_BoardInfo_Flags, flags);
        if (debug_rtg_blitter != 3)
                write_log (_T("P96: Blitter mode = %x!\n"), debug_rtg_blitter);
@@ -2929,15 +2942,58 @@ static uae_u32 REGPARAM2 picasso_SetColorArray (TrapContext *ctx)
 */
 static uae_u32 REGPARAM2 picasso_SetDAC (TrapContext *ctx)
 {
-       struct picasso_vidbuf_description *vidinfo = &picasso_vidinfo[currprefs.rtgboards[0].monitor_id];
+       int monid = currprefs.rtgboards[0].monitor_id;
+       struct picasso_vidbuf_description *vidinfo = &picasso_vidinfo[monid];
+       struct picasso96_state_struct* state = &picasso96_state[monid];
+       uae_u16 idx = trap_get_dreg(ctx, 0);
+       uae_u32 mode = trap_get_dreg(ctx, 7);
        /* Fill in some static UAE related structure about this new DAC setting
        * Lets us keep track of what pixel format the Amiga is thinking about in our frame-buffer */
 
+       if (state->advDragging) {
+               vidinfo->dacrgbformat[idx ? 1 : 0] = mode;
+       } else {
+               vidinfo->dacrgbformat[0] = mode;
+               vidinfo->dacrgbformat[1] = mode;
+       }
        atomic_or(&vidinfo->picasso_state_change, PICASSO_STATE_SETDAC);
        P96TRACE_SETUP((_T("SetDAC()\n")));
        return 1;
 }
 
+static uae_u32 REGPARAM2 picasso_CoerceMode(struct TrapContext *ctx)
+{
+       uae_u16 bw = trap_get_dreg(ctx, 2);
+       uae_u16 fw = trap_get_dreg(ctx, 3);
+       return bw > fw ? bw : fw;
+}
+
+static uae_u32 REGPARAM2 picasso_GetCompatibleDACFormats(struct TrapContext *ctx)
+{
+       int monid = currprefs.rtgboards[0].monitor_id;
+       struct picasso96_state_struct *state = &picasso96_state[monid];
+       RGBFTYPE type = (RGBFTYPE)trap_get_dreg(ctx, 7);
+       switch (type)
+       {
+       case RGBFB_CLUT:
+       case RGBFB_R8G8B8:
+       case RGBFB_B8G8R8:
+       case RGBFB_R5G6B5PC:
+       case RGBFB_R5G5B5PC:
+       case RGBFB_A8R8G8B8:
+       case RGBFB_A8B8G8R8:
+       case RGBFB_R8G8B8A8:
+       case RGBFB_B8G8R8A8:
+       case RGBFB_R5G6B5:
+       case RGBFB_R5G5B5:
+       case RGBFB_B5G6R5PC:
+       case RGBFB_B5G5R5PC:
+               state->advDragging = true;
+               return RGBMASK_8BIT | RGBMASK_15BIT | RGBMASK_16BIT | RGBMASK_24BIT | RGBMASK_32BIT;
+       }
+       return 0;
+}
+
 static void init_picasso_screen(int monid)
 {
        struct picasso_vidbuf_description *vidinfo = &picasso_vidinfo[monid];
@@ -4296,7 +4352,7 @@ void picasso_statusline(int monid, uae_u8 *dst)
        }
 }
 
-static void copyrow (int monid, uae_u8 *src, uae_u8 *dst, int x, int y, int width, int srcbytesperrow, int srcpixbytes, int dx, int dy, int dstbytesperrow, int dstpixbytes, bool direct, int convert_mode, uae_u32 *p96_rgbx16p)
+static void copyrow(int monid, uae_u8 *src, uae_u8 *dst, int x, int y, int width, int srcbytesperrow, int srcpixbytes, int dx, int dy, int dstbytesperrow, int dstpixbytes, int *convert_modep, uae_u32 *p96_rgbx16p)
 {
        struct picasso_vidbuf_description *vidinfo = &picasso_vidinfo[monid];
        struct picasso96_state_struct *state = &picasso96_state[monid];
@@ -4304,6 +4360,7 @@ static void copyrow (int monid, uae_u8 *src, uae_u8 *dst, int x, int y, int widt
        int dstpix = dstpixbytes;
        int srcpix = srcpixbytes;
        uae_u32 *clut = vidinfo->clut;
+       int convert_mode = convert_modep[0];
 
        if (y >= vidinfo->splitypos && vidinfo->splitypos >= 0) {
                src = gfxmem_banks[monid]->start + natmem_offset;
@@ -4311,15 +4368,17 @@ static void copyrow (int monid, uae_u8 *src, uae_u8 *dst, int x, int y, int widt
                        clut += 256;
                }
                y -= vidinfo->splitypos;
+               if (convert_mode != convert_modep[1]) {
+                       int bpp1 = GetBytesPerPixel(vidinfo->dacrgbformat[0]);
+                       int bpp2 = GetBytesPerPixel(vidinfo->dacrgbformat[1]);
+                       srcbytesperrow = srcbytesperrow * bpp2 / bpp1;
+                       convert_mode = convert_modep[1];
+               }
        }
 
        uae_u8 *src2 = src + y * srcbytesperrow;
        uae_u8 *dst2 = dst + dy * dstbytesperrow;
 
-       if (direct) {
-               memcpy (dst2 + x * dstpix, src2 + x * srcpix, width * dstpix);
-               return;
-       }
        // native match?
        if (currprefs.gfx_api) {
                switch (convert_mode)
@@ -5115,18 +5174,21 @@ static void picasso_flushoverlay(int index, uae_u8 *src, int scr_offset, uae_u8
        int mx = overlay_src_width_in * 256 / overlay_w;
        int my = overlay_src_height_in * 256 / overlay_h;
        int y = 0;
-
+       int split = 0;
+       if (vidinfo->splitypos >= 0) {
+               split = vidinfo->splitypos;
+       }
        for (int dy = 0; dy < overlay_h; dy++) {
                if (s + (y >> 8) * overlay_src_width_in * overlay_pix > vram_end)
                        break;
-               if (ss + (overlay_y + dy) * state->BytesPerRow > vram_end)
+               if (ss + (overlay_y + dy + split) * state->BytesPerRow > vram_end)
                        break;
-               if (dst + (overlay_y + dy) * vidinfo->rowbytes > vram_end)
+               if (dst + (overlay_y + dy + split) * vidinfo->rowbytes > vram_end)
                        break;
                copyrow_scale(monid, s, ss, dst,
                        0, (y >> 8), mx, overlay_src_width_in, overlay_src_width * overlay_pix, overlay_pix,
                        state->BytesPerRow, state->BytesPerPixel,
-                       overlay_x, overlay_y + dy, vidinfo->width, vidinfo->height, vidinfo->rowbytes, vidinfo->pixbytes,
+                       overlay_x, overlay_y + dy + split, vidinfo->width, vidinfo->height, vidinfo->rowbytes, vidinfo->pixbytes,
                        overlay_occlusion != 0, overlay_color,
                        overlay_convert, p96_rgbx16_ovl, overlay_clut, true);
                y += my;
@@ -5139,58 +5201,31 @@ void fb_copyrow(int monid, uae_u8 *src, uae_u8 *dst, int x, int y, int width, in
        struct picasso96_state_struct *state = &picasso96_state[monid];
        copyrow(monid, src, dst, x, y, width, 0, srcpixbytes,
                x, dy, picasso_vidinfo[monid].rowbytes, picasso_vidinfo[monid].pixbytes,
-               state->RGBFormat == vidinfo->host_mode, vidinfo->picasso_convert, p96_rgbx16);
+               vidinfo->picasso_convert, p96_rgbx16);
 }
 
-static void copyallinvert(int monid, uae_u8 *src, uae_u8 *dst, int pwidth, int pheight, int srcbytesperrow, int srcpixbytes, int dstbytesperrow, int dstpixbytes, bool direct, int mode_convert)
+static void copyallinvert(int monid, uae_u8 *src, uae_u8 *dst, int pwidth, int pheight, int srcbytesperrow, int srcpixbytes, int dstbytesperrow, int dstpixbytes, int *mode_convert)
 {
        struct picasso_vidbuf_description *vidinfo = &picasso_vidinfo[monid];
-       int x, y, w;
-
-       w = pwidth * dstpixbytes;
-       if (direct) {
-               for (y = 0; y < pheight; y++) {
-                       if (y == vidinfo->splitypos) {
-                               src = gfxmem_banks[monid]->start + natmem_offset;
-                       }
-                       for (x = 0; x < w; x++) {
-                               dst[x] = src[x] ^ 0xff;
-                       }
-                       dst += dstbytesperrow;
-                       src += srcbytesperrow;
-               }
-       } else {
-               uae_u8 *src2 = src;
-               for (y = 0; y < pheight; y++) {
-                       for (x = 0; x < w; x++)
-                               src2[x] ^= 0xff;
-                       copyrow(monid, src, dst, 0, y, pwidth, srcbytesperrow, srcpixbytes, 0, y, dstbytesperrow, dstpixbytes, direct, mode_convert, p96_rgbx16);
-                       for (x = 0; x < w; x++)
-                               src2[x] ^= 0xff;
-                       src2 += srcbytesperrow;
-               }
+       
+       int w = pwidth * dstpixbytes;
+       uae_u8 *src2 = src;
+       for (int y = 0; y < pheight; y++) {
+               for (int x = 0; x < w; x++)
+                       src2[x] ^= 0xff;
+               copyrow(monid, src, dst, 0, y, pwidth, srcbytesperrow, srcpixbytes, 0, y, dstbytesperrow, dstpixbytes, mode_convert, p96_rgbx16);
+               for (int x = 0; x < w; x++)
+                       src2[x] ^= 0xff;
+               src2 += srcbytesperrow;
        }
 }
 
-static void copyall (int monid, uae_u8 *src, uae_u8 *dst, int pwidth, int pheight, int srcbytesperrow, int srcpixbytes, int dstbytesperrow, int dstpixbytes, bool direct, int mode_convert)
+static void copyall(int monid, uae_u8 *src, uae_u8 *dst, int pwidth, int pheight, int srcbytesperrow, int srcpixbytes, int dstbytesperrow, int dstpixbytes, int *mode_convert)
 {
        struct picasso_vidbuf_description *vidinfo = &picasso_vidinfo[monid];
-       int y;
 
-       if (direct) {
-               int w = pwidth * vidinfo->pixbytes;
-               for (y = 0; y < pheight; y++) {
-                       if (y == vidinfo->splitypos) {
-                               src = gfxmem_banks[monid]->start + natmem_offset;
-                       }
-                       memcpy (dst, src, w);
-                       dst += dstbytesperrow;
-                       src += srcbytesperrow;
-               }
-       } else {
-               for (y = 0; y < pheight; y++) {
-                       copyrow(monid, src, dst, 0, y, pwidth, srcbytesperrow, srcpixbytes, 0, y, dstbytesperrow, dstpixbytes, direct, mode_convert, p96_rgbx16);
-               }
+       for (int y = 0; y < pheight; y++) {
+               copyrow(monid, src, dst, 0, y, pwidth, srcbytesperrow, srcpixbytes, 0, y, dstbytesperrow, dstpixbytes, mode_convert, p96_rgbx16);
        }
 }
 
@@ -5202,8 +5237,7 @@ uae_u8 *uaegfx_getrtgbuffer(int monid, int *widthp, int *heightp, int *pitch, in
        int off = state->XYOffset - gfxmem_banks[monid]->start;
        int width, height, pixbytes;
        uae_u8 *dst;
-       int convert;
-       int hmode;
+       int convert[2];
 
        if (!vidinfo->extra_mem)
                return NULL;
@@ -5217,21 +5251,11 @@ uae_u8 *uaegfx_getrtgbuffer(int monid, int *widthp, int *heightp, int *pitch, in
        dst = xmalloc (uae_u8, width * height * pixbytes);
        if (!dst)
                return NULL;
-       hmode = pixbytes == 1 ? RGBFB_CLUT : RGBFB_B8G8R8A8;
-       convert = getconvert (state->RGBFormat, pixbytes);
+       convert[0] = getconvert (state->RGBFormat, pixbytes);
+       convert[1] = convert[0];
        alloc_colors_picasso(8, 8, 8, 16, 8, 0, state->RGBFormat, p96_rgbx16);
 
-       if (pixbytes > 1 && hmode != convert) {
-               copyall (monid, src + off, dst, width, height, state->BytesPerRow, state->BytesPerPixel, width * pixbytes, pixbytes, false, convert);
-       } else {
-               uae_u8 *dstp = dst;
-               uae_u8 *srcp = src;
-               for (int y = 0; y < height; y++) {
-                       memcpy (dstp, srcp, width * pixbytes);
-                       dstp += width * pixbytes;
-                       srcp += state->BytesPerRow;
-               }
-       }
+       copyall (monid, src + off, dst, width, height, state->BytesPerRow, state->BytesPerPixel, width * pixbytes, pixbytes, convert);
        if (pixbytes == 1) {
                for (int i = 0; i < 256; i++) {
                        palette[i * 3 + 0] = state->CLUT[i].Red;
@@ -5382,12 +5406,12 @@ static void picasso_flushpixels(int index, uae_u8 *src, int off, bool render)
                                        copyallinvert(monid, src + off, dst, pwidth, pheight,
                                                state->BytesPerRow, state->BytesPerPixel,
                                                vidinfo->rowbytes, vidinfo->pixbytes,
-                                               state->RGBFormat == vidinfo->host_mode, vidinfo->picasso_convert);
+                                               vidinfo->picasso_convert);
                                } else {
                                        copyall(monid, src + off, dst, pwidth, pheight,
                                                state->BytesPerRow, state->BytesPerPixel,
                                                vidinfo->rowbytes, vidinfo->pixbytes,
-                                               state->RGBFormat == vidinfo->host_mode, vidinfo->picasso_convert);
+                                               vidinfo->picasso_convert);
                                }
                                miny = 0;
                                maxy = pheight;
@@ -5422,7 +5446,7 @@ static void picasso_flushpixels(int index, uae_u8 *src, int off, bool render)
                                                        copyrow(monid, src + off, dst, x, y, pwidth - x,
                                                                state->BytesPerRow, state->BytesPerPixel,
                                                                x, y, vidinfo->rowbytes, vidinfo->pixbytes,
-                                                               state->RGBFormat == vidinfo->host_mode, vidinfo->picasso_convert, p96_rgbx16);
+                                                               vidinfo->picasso_convert, p96_rgbx16);
                                                        flushlines++;
                                                }
                                                w = (gwwpagesize[index] - (state->BytesPerRow - x * state->BytesPerPixel) + state->BytesPerPixel - 1) / state->BytesPerPixel;
@@ -5435,7 +5459,7 @@ static void picasso_flushpixels(int index, uae_u8 *src, int off, bool render)
                                                        copyrow(monid, src + off, dst, 0, y, maxw,
                                                                state->BytesPerRow, state->BytesPerPixel,
                                                                0, y, vidinfo->rowbytes, vidinfo->pixbytes,
-                                                               state->RGBFormat == vidinfo->host_mode, vidinfo->picasso_convert, p96_rgbx16);
+                                                               vidinfo->picasso_convert, p96_rgbx16);
                                                        w -= maxw;
                                                        y++;
                                                        flushlines++;
@@ -5456,8 +5480,9 @@ static void picasso_flushpixels(int index, uae_u8 *src, int off, bool render)
                if (dstp == NULL) {
                        dstp = gfx_lock_picasso(monid, false);
                }
-               if (dstp)
+               if (dstp) {
                        picasso_flushoverlay(index, src, off, dstp);
+               }
        }
 
        if (0 && flushlines) {
@@ -6310,6 +6335,10 @@ static void inituaegfxfuncs(TrapContext *ctx, uaecptr start, uaecptr ABI)
 #endif
 
        RTGCALL2(PSSO_SetSplitPosition, picasso_SetSplitPosition);
+       if (picasso96_test) {
+               RTGCALL2(PSSO_BoardInfo_GetCompatibleDACFormats, picasso_GetCompatibleDACFormats);
+               RTGCALL2(PSSO_BoardInfo_CoerceMode, picasso_CoerceMode);
+       }
 
 #endif
 
@@ -6351,6 +6380,7 @@ static void picasso_reset2(int monid)
                reserved_gfxmem = 0;
                resetpalette(state);
                state->dualclut = false;
+               state->advDragging = false;
                InitPicasso96(monid);
        }
 
index 4221af5c67d8f0b8cbb6c23a6bb5fbe5bd26c568..6b81a57a215e813a81818f76dc66d99610736306 100644 (file)
@@ -469,10 +469,10 @@ enum {
 #define PSSO_BoardInfo_Reserved0Default                    PSSO_BoardInfo_Reserved0 + 4
 #define PSSO_BoardInfo_Reserved1                   PSSO_BoardInfo_Reserved0Default + 4
 #define PSSO_SetSplitPosition              PSSO_BoardInfo_Reserved1 + 4
-#define PSSO_BoardInfo_Reserved2                   PSSO_SetSplitPosition + 4
-#define PSSO_BoardInfo_Reserved2Default                    PSSO_BoardInfo_Reserved2 + 4
-#define PSSO_BoardInfo_Reserved3                   PSSO_BoardInfo_Reserved2Default + 4
-#define PSSO_BoardInfo_Reserved3Default                    PSSO_BoardInfo_Reserved3 + 4
+#define PSSO_ReInitMemory                  PSSO_SetSplitPosition + 4
+#define PSSO_BoardInfo_GetCompatibleDACFormats             PSSO_ReInitMemory + 4
+#define PSSO_BoardInfo_CoerceMode                  PSSO_BoardInfo_GetCompatibleDACFormats + 4
+#define PSSO_BoardInfo_Reserved3Default                    PSSO_BoardInfo_CoerceMode + 4
 #define PSSO_BoardInfo_Reserved4                   PSSO_BoardInfo_Reserved3Default + 4
 #define PSSO_BoardInfo_Reserved4Default                    PSSO_BoardInfo_Reserved4 + 4
 #define PSSO_BoardInfo_Reserved5                   PSSO_BoardInfo_Reserved4Default + 4
@@ -636,7 +636,7 @@ struct picasso96_state_struct
     // every time windows can remove your surface from card so the mainrender place
     // must be in memory
     long               XYOffset;
-    bool        dualclut;
+    bool        dualclut, advDragging;
     int         HLineDBL, VLineDBL;
 };
 
@@ -669,7 +669,7 @@ struct picasso_vidbuf_description {
        uae_u32 rgbformat;
        uae_u32 selected_rgbformat;
        uae_u32 clut[256 * 2];
-       int picasso_convert, host_mode;
+       int picasso_convert[2], host_mode;
        int ohost_mode, orgbformat;
        int full_refresh;
        int set_panning_called;
@@ -678,6 +678,7 @@ struct picasso_vidbuf_description {
        bool picasso_changed;
     uae_s16 splitypos;
        uae_atomic picasso_state_change;
+    uae_u32 dacrgbformat[2];
 };
 
 extern struct picasso_vidbuf_description picasso_vidinfo[MAX_AMIGAMONITORS];
index e7de031150b7a021bfabd6e40a863d050b0fb7a8..12b7ff7aea3ce9bf112817667f1508dbde166065 100644 (file)
@@ -6780,6 +6780,11 @@ static int parseargs(const TCHAR *argx, const TCHAR *np, const TCHAR *np2)
                p96skipmode = getval (np);
                return 2;
        }
+       if (!_tcscmp (arg, _T("p96test"))) {
+               extern int picasso96_test;
+               picasso96_test = getval (np);
+               return 2;
+       }
        if (!_tcscmp (arg, _T("minidumpmode"))) {
                minidumpmode = (MINIDUMP_TYPE)getval (np);
                return 2;
@@ -7414,7 +7419,7 @@ static void efix (DWORD *regp, void *p, void *ps, int *got)
 LONG WINAPI WIN32_ExceptionFilter (struct _EXCEPTION_POINTERS *pExceptionPointers, DWORD ec)
 {
        if (nocrashdump)
-               EXCEPTION_CONTINUE_SEARCH;
+               return EXCEPTION_CONTINUE_SEARCH;
 
        static uae_u8 *prevpc;
        LONG lRet = EXCEPTION_CONTINUE_SEARCH;
index 3bb6442c1b0c0e2712ee2d33c31368d570dc68cf..21effbb1a2a5690644dcad78af3f8161fe02b374 100644 (file)
 #define LANG_DLL_FULL_VERSION_MATCH 0
 
 #if WINUAEPUBLICBETA
-#define WINUAEBETA _T("Beta 3")
+#define WINUAEBETA _T("Beta 4")
 #else
 #define WINUAEBETA _T("")
 #endif
 
-#define WINUAEDATE MAKEBD(2022, 1, 1)
+#define WINUAEDATE MAKEBD(2022, 1, 8)
 
 //#define WINUAEEXTRA _T("AmiKit Preview")
 //#define WINUAEEXTRA _T("Amiga Forever Edition")
index 2850162ed1ba74810964f823781d299e50b977df..507a48a095264b451fe1a34183c6b642ed5d3f64 100644 (file)
@@ -4688,6 +4688,7 @@ static const struct miscentry misclist[] = {
        { 0, 1, _T("Automatically capture mouse when window is activated"), &workprefs.win32_capture_always },
        { 0, 0, _T("Debug memory space"), &workprefs.debug_mem },
        { 0, 1, _T("Force hard reset if CPU halted"), &workprefs.crash_auto_reset },
+       { 0, 0, _T("A600/A1200/A4000 IDE scsi.device disable"), &workprefs.scsidevicedisable },
        { 0, 0, NULL }
 };
 
@@ -20356,6 +20357,14 @@ static INT_PTR CALLBACK hw3dDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM
                        fd->gfx_filter_top_border = fdw->gfx_filter_top_border = -1;
                        fd->gfx_filter_right_border = fdw->gfx_filter_right_border = 0;
                        fd->gfx_filter_bottom_border = fdw->gfx_filter_bottom_border = 0;
+                       currprefs.gfx_xcenter_pos = -1;
+                       workprefs.gfx_xcenter_pos = -1;
+                       currprefs.gfx_ycenter_pos = -1;
+                       workprefs.gfx_ycenter_pos = -1;
+                       currprefs.gfx_xcenter_size = -1;
+                       workprefs.gfx_xcenter_size = -1;
+                       currprefs.gfx_ycenter_size = -1;
+                       workprefs.gfx_ycenter_size = -1;
                        values_to_hw3ddlg(hDlg, false);
                        updatedisplayarea(-1);
                        break;
index 81e5f00e6c55d05fd4a6913ae7cc6720533eac22..27443b36a70acd10a7428190d67eccc0e6d11f23 100644 (file)
@@ -1,4 +1,21 @@
 
+Beta 4:
+
+- uaegfx overlay wasn't synced with screen dragging. It still works strangely if screen with overlay is not in front screen because Picasso96 does not yet support overlay fully during screen dragging.
+- Reset filter button didn't reset manual filter settings.
+- Added IDE scsi.device disable option to misc panel list.
+- if number of planes changed mid scanline, whole line was drawn using planecount that was active when line started. If plane count was increased mid scanline, line was still drawn using lower plane count. If plane count was lowered, output was correct. (vAmiga test)
+- Fixed x86 bridgeboard (AT variants only) boot crash if optimized build. Not sure if it was compiler bug or something else but I found a way to work around it. I think this exact same bug has happened previously.
+- A1000 left hblank ends 3 lores pixels later than other models.
+
+Later 4.9.0 beta series introduced bugs:
+
+- If VSYNC starts after vertical wraparound (can happen in programmed modes), lines after wraparound before VSYNC was not drawn.
+- HCENTER (ECS Denise only) "blanking" didn't work.
+- Left side didn't open far enough in extreme overscan mode.
+- OCS Agnus + OCS Denise: last blanked line bug on top of screen was not visible if line also had bitplane enabled.
+- Direct 3D 11 mode shader buffer leak fixed. Caused crash after few dozens or so display mode switches. (4.9.0)
+
 Beta 3
 
 - "Manual" BPL1DAT write disabling border timing updated. Also OCS Denise limit was not checked, OCS Denise ignores BPL1DAT writes until hblank end. (OCS Denise: border is forced to enabled state during hblank start to hblank end, ECS Denise/AGA: border is enabled when hblank starts).
index cbf8c1728aeec5a7f624a90fc2b58f64d5eb13c6..be07311a3df54ade318dc6b2569afd338727b350 100644 (file)
@@ -262,7 +262,7 @@ void voodoo_fb_writew(uint32_t addr, uint16_t val, void *p)
                                 *(uint16_t *)(&voodoo->fb_mem[write_addr_aux & voodoo->fb_mask]) = new_depth;
 
 skip_pixel:
-                        x = x;
+                        return;
                 }
         }
         else