From: Toni Wilen Date: Sat, 8 Jan 2022 19:51:12 +0000 (+0200) Subject: 4910b4 X-Git-Tag: 4910~23 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=44645b004dbc29681eb40afc2b2d777f865cb67f;p=francis%2Fwinuae.git 4910b4 --- diff --git a/epsonprinter.cpp b/epsonprinter.cpp index 7f7179cc..09f5a904 100644 --- a/epsonprinter.cpp +++ b/epsonprinter.cpp @@ -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); diff --git a/filesys.cpp b/filesys.cpp index a471b734..c094884f 100644 --- a/filesys.cpp +++ b/filesys.cpp @@ -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; } } } diff --git a/newcpu.cpp b/newcpu.cpp index f7d50ed2..64244802 100644 --- a/newcpu.cpp +++ b/newcpu.cpp @@ -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) diff --git a/od-win32/picasso96_win.cpp b/od-win32/picasso96_win.cpp index 307c9ff9..373b6839 100644 --- a/od-win32/picasso96_win.cpp +++ b/od-win32/picasso96_win.cpp @@ -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); } diff --git a/od-win32/picasso96_win.h b/od-win32/picasso96_win.h index 4221af5c..6b81a57a 100644 --- a/od-win32/picasso96_win.h +++ b/od-win32/picasso96_win.h @@ -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]; diff --git a/od-win32/win32.cpp b/od-win32/win32.cpp index e7de0311..12b7ff7a 100644 --- a/od-win32/win32.cpp +++ b/od-win32/win32.cpp @@ -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; diff --git a/od-win32/win32.h b/od-win32/win32.h index 3bb6442c..21effbb1 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -20,12 +20,12 @@ #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") diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index 2850162e..507a48a0 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -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; diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index 81e5f00e..27443b36 100644 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -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). diff --git a/pcem/vid_voodoo_fb.cpp b/pcem/vid_voodoo_fb.cpp index cbf8c172..be07311a 100644 --- a/pcem/vid_voodoo_fb.cpp +++ b/pcem/vid_voodoo_fb.cpp @@ -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