File Picasso96-2.5.0-screen-dragging-support.patch of Package fs-uae

From b702748f1fea550754f696b7f5c84e1bc9ab3953 Mon Sep 17 00:00:00 2001
From: Toni Wilen <twilen@winuae.net>
Date: Sat, 29 Aug 2020 20:03:51 +0300
Subject: [PATCH] Picasso96 2.5.0+ screen dragging support.

---
 od-win32/picasso96_win.cpp | 91 +++++++++++++++++++++++++++-----------
 od-win32/picasso96_win.h   | 13 ++++--
 od-win32/win32gfx.cpp      |  2 +-
 3 files changed, 75 insertions(+), 31 deletions(-)

diff --git a/od-win32/picasso96_win.cpp b/od-win32/picasso96_win.cpp
index cfedcb735..443282239 100644
--- a/src/od-win32/picasso96_win.cpp
+++ b/src/od-win32/picasso96_win.cpp
@@ -1495,6 +1495,9 @@ static uae_u32 REGPARAM2 picasso_SetSpritePosition (TrapContext *ctx)
 	boardinfo = bi;
 	newcursor_x = (uae_s16)get_word (bi + PSSO_BoardInfo_MouseX) - picasso96_state.XOffset;
 	newcursor_y = (uae_s16)get_word (bi + PSSO_BoardInfo_MouseY) - picasso96_state.YOffset;
+	if (picasso_vidinfo.splitypos >= 0) {
+		newcursor_y += picasso_vidinfo.splitypos;
+	}
 	if (!hwsprite)
 		return 0;
 	return 1;
@@ -2604,9 +2607,13 @@ static void inituaegfx (uaecptr ABI)
 		write_log (_T("P96: BIF_INDISPLAYCHAIN force-enabled!\n"));
 		flags |= BIF_INDISPLAYCHAIN;
 	}
+	flags |= BIF_VGASCREENSPLIT;
 	put_long (ABI + PSSO_BoardInfo_Flags, flags);
 	if (debug_rtg_blitter != 3)
 		write_log (_T("P96: Blitter mode = %x!\n"), debug_rtg_blitter);
+	// Wolfi: fix problems (broken display if a second screen is opened) with older Picasso96 versions that don't support screen dragging yet
+	// (WinUAE doesn't do that, but maybe other changes make it work there...)
+	picasso_vidinfo.splitypos=-1;
 
 	put_word (ABI + PSSO_BoardInfo_MaxHorResolution + 0, planar.width);
 	put_word (ABI + PSSO_BoardInfo_MaxHorResolution + 2, chunky.width);
@@ -2770,7 +2774,7 @@ void picasso_enablescreen (int on)
 
 static void resetpalette(void)
 {
-	for (int i = 0; i < 256; i++)
+	for (int i = 0; i < 256 * 2; i++)
 		picasso96_state.CLUT[i].Pad = 0xff;
 }
 
@@ -2806,6 +2810,9 @@ static int updateclut (uaecptr clut, int start, int count)
 		picasso96_state.CLUT[i].Red = r;
 		picasso96_state.CLUT[i].Green = g;
 		picasso96_state.CLUT[i].Blue = b;
+		picasso96_state.CLUT[i + 256].Red = r;
+		picasso96_state.CLUT[i + 256].Green = g;
+		picasso96_state.CLUT[i + 256].Blue = b;
 		clut += 3;
 	}
 	changed |= picasso_palette ();
@@ -2992,6 +2996,22 @@ static uae_u32 REGPARAM2 picasso_SetPanning (TrapContext *ctx)
 	return 1;
 }
 
+
+static uae_u32 picasso_SetSplitPosition(TrapContext *ctx)
+{
+	//lockrtg();
+	//int monid = currprefs.rtgboards[0].monitor_id;
+	//struct picasso_vidbuf_description *vidinfo = &picasso_vidinfo[monid];
+
+	uae_s16 pos = m68k_dreg (regs, 0) - 1;
+	if (pos != picasso_vidinfo.splitypos) {
+		picasso_vidinfo.splitypos = pos;
+		full_refresh = 1;
+	}
+	//unlockrtg();
+	return 1;
+}
+
 #ifdef CPU_64_BIT
 static void do_xor8 (uae_u8 *p, int w, uae_u32 v)
 {
@@ -4053,11 +4073,20 @@ void picasso_statusline (uae_u8 *dst)
 
 static void copyrow (uae_u8 *src, uae_u8 *dst, int x, int y, int width, int srcbytesperrow, int srcpixbytes, int dstbytesperrow, int dstpixbytes, bool direct, int convert_mode)
 {
-	uae_u8 *src2 = src + y * srcbytesperrow;
-	uae_u8 *dst2 = dst + y * dstbytesperrow;
 	int endx = x + width, endx4;
 	int dstpix = dstpixbytes;
 	int srcpix = srcpixbytes;
+	uae_u32 *clut = picasso_vidinfo.clut;
+	int dy = y;
+
+	if (y >= picasso_vidinfo.splitypos && picasso_vidinfo.splitypos >= 0) {
+		src = gfxmem_bank.start + natmem_offset;
+		clut += 256;
+		y -= picasso_vidinfo.splitypos;
+	}
+
+	uae_u8 *src2 = src + y * srcbytesperrow;
+	uae_u8 *dst2 = dst + dy * dstbytesperrow;
 
 	if (direct) {
 		memcpy (dst2 + x * dstpix, src2 + x * srcpix, width * dstpix);
@@ -4246,21 +4274,21 @@ static void copyrow (uae_u8 *src, uae_u8 *dst, int x, int y, int width, int srcbytesperrow, int srcpixbytes, int dstbytesperrow, int dstpixbytes, bool direct, int convert_mode)
 	case RGBFB_CLUT_RGBFB_32:
 		{
 			while ((x & 3) && x < endx) {
-				((uae_u32*)dst2)[x] = picasso_vidinfo.clut[src2[x]];
+				((uae_u32*)dst2)[x] = clut[src2[x]];
 				x++;
 			}
 			while (x < endx4) {
-				((uae_u32*)dst2)[x] = picasso_vidinfo.clut[src2[x]];
+				((uae_u32*)dst2)[x] = clut[src2[x]];
 				x++;
-				((uae_u32*)dst2)[x] = picasso_vidinfo.clut[src2[x]];
+				((uae_u32*)dst2)[x] = clut[src2[x]];
 				x++;
-				((uae_u32*)dst2)[x] = picasso_vidinfo.clut[src2[x]];
+				((uae_u32*)dst2)[x] = clut[src2[x]];
 				x++;
-				((uae_u32*)dst2)[x] = picasso_vidinfo.clut[src2[x]];
+				((uae_u32*)dst2)[x] = clut[src2[x]];
 				x++;
 			}
 			while (x < endx) {
-				((uae_u32*)dst2)[x] = picasso_vidinfo.clut[src2[x]];
+				((uae_u32*)dst2)[x] = clut[src2[x]];
 				x++;
 			}
 		}
@@ -4270,21 +4298,21 @@ static void copyrow (uae_u8 *src, uae_u8 *dst, int x, int y, int width, int srcbytesperrow, int srcpixbytes, int dstbytesperrow, int dstpixbytes, bool direct, int convert_mode)
 	case RGBFB_CLUT_RGBFB_16:
 		{
 			while ((x & 3) && x < endx) {
-				((uae_u16*)dst2)[x] = picasso_vidinfo.clut[src2[x]];
+				((uae_u16*)dst2)[x] = clut[src2[x]];
 				x++;
 			}
 			while (x < endx4) {
-				((uae_u16*)dst2)[x] = picasso_vidinfo.clut[src2[x]];
+				((uae_u16*)dst2)[x] = clut[src2[x]];
 				x++;
-				((uae_u16*)dst2)[x] = picasso_vidinfo.clut[src2[x]];
+				((uae_u16*)dst2)[x] = clut[src2[x]];
 				x++;
-				((uae_u16*)dst2)[x] = picasso_vidinfo.clut[src2[x]];
+				((uae_u16*)dst2)[x] = clut[src2[x]];
 				x++;
-				((uae_u16*)dst2)[x] = picasso_vidinfo.clut[src2[x]];
+				((uae_u16*)dst2)[x] = clut[src2[x]];
 				x++;
 			}
 			while (x < endx) {
-				((uae_u16*)dst2)[x] = picasso_vidinfo.clut[src2[x]];
+				((uae_u16*)dst2)[x] = clut[src2[x]];
 				x++;
 			}
 		}
@@ -4299,8 +4327,12 @@ void fb_copyrow(int monid, uae_u8 *src, uae_u8 *dst, int x, int y, int width, in
 	w = pwidth * dstpixbytes;
 	if (direct) {
 		for (y = 0; y < pheight; y++) {
-			for (x = 0; x < w; x++)
+			if (y == picasso_vidinfo.splitypos) {
+				src = gfxmem_bank.start + natmem_offset;
+			}
+			for (x = 0; x < w; x++) {
 				dst[x] = src[x] ^ 0xff;
+			}
 			dst += dstbytesperrow;
 			src += srcbytesperrow;
 		}
@@ -4324,13 +4356,17 @@ static void copyall (uae_u8 *src, uae_u8 *dst, int pwidth, int pheight, int srcbytesperrow, int srcpixbytes, int dstbytesperrow, int dstpixbytes, bool direct, int mode_convert)
 	if (direct) {
 		int w = pwidth * picasso_vidinfo.pixbytes;
 		for (y = 0; y < pheight; y++) {
+			if (y == picasso_vidinfo.splitypos) {
+				src = gfxmem_bank.start + natmem_offset;
+			}
 			memcpy (dst, src, w);
 			dst += dstbytesperrow;
 			src += srcbytesperrow;
 		}
 	} else {
-		for (y = 0; y < pheight; y++)
-			copyrow (src, dst, 0, y, pwidth, srcbytesperrow, srcpixbytes, dstbytesperrow, dstpixbytes, direct, mode_convert);
+		for (y = 0; y < pheight; y++) {
+			copyrow(src, dst, 0, y, pwidth, srcbytesperrow, srcpixbytes, dstbytesperrow, dstpixbytes, direct, mode_convert);
+		}
 	}
 }
 
@@ -4884,6 +4920,8 @@ static void inituaegfxfuncs(TrapContext *ctx, uaecptr start, uaecptr ABI)
 	RTGCALLDEFAULT(PSSO_BoardInfo_UpdatePlanar, PSSO_BoardInfo_UpdatePlanarDefault);
 	RTGCALLDEFAULT(PSSO_BoardInfo_DrawLine, PSSO_BoardInfo_DrawLineDefault);
 
+	RTGCALL2(PSSO_SetSplitPosition, picasso_SetSplitPosition);
+
 	if (currprefs.rtg_hardwareinterrupt)
 		RTGCALL2(PSSO_BoardInfo_SetInterrupt, picasso_SetInterrupt);
 
diff --git a/od-win32/picasso96_win.h b/od-win32/picasso96_win.h
index bc99664b7..5e10fc70e 100644
--- a/src/od-win32/picasso96_win.h
+++ b/src/od-win32/picasso96_win.h
@@ -395,8 +395,8 @@ enum {
 #define PSSO_BoardInfo_Reserved0		    PSSO_BoardInfo_BlitPlanar2DirectDefault + 4
 #define PSSO_BoardInfo_Reserved0Default		    PSSO_BoardInfo_Reserved0 + 4
 #define PSSO_BoardInfo_Reserved1		    PSSO_BoardInfo_Reserved0Default + 4
-#define PSSO_BoardInfo_Reserved1Default		    PSSO_BoardInfo_Reserved1 + 4
-#define PSSO_BoardInfo_Reserved2		    PSSO_BoardInfo_Reserved1Default + 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
@@ -469,6 +469,8 @@ enum {
 #define BIB_NEEDSALIGNMENT	 2	/* bitmaps have to be aligned (not yet supported!) */
 #define BIB_CACHEMODECHANGE	 3	/* board memory may be set to Imprecise (060) or Nonserialised (040) */
 #define BIB_VBLANKINTERRUPT	 4	/* board can cause a hardware interrupt on a vertical retrace */
+#define BIB_HASSPRITEBUFFER      5  /* board has allocated memory for software sprite image and save buffer */
+#define BIB_VGASCREENSPLIT       6  /* has a screen B with fixed screen position for split-screens */
 #define BIB_DBLSCANDBLSPRITEY	 8	/* hardware sprite y position is doubled on doublescan display modes */
 #define BIB_ILACEHALFSPRITEY	 9	/* hardware sprite y position is halved on interlace display modes */
 #define BIB_ILACEDBLROWOFFSET	10	/* doubled row offset in interlaced display modes needs additional horizontal bit */
@@ -494,6 +496,8 @@ enum {
 #define BIF_NEEDSALIGNMENT	(1 << BIB_NEEDSALIGNMENT)
 #define BIF_CACHEMODECHANGE	(1 << BIB_CACHEMODECHANGE)
 #define BIF_VBLANKINTERRUPT	(1 << BIB_VBLANKINTERRUPT)
+#define BIF_HASSPRITEBUFFER	(1 << BIB_HASSPRITEBUFFER)
+#define BIF_VGASCREENSPLIT	(1 << BIB_VGASCREENSPLIT)
 #define BIF_DBLSCANDBLSPRITEY	(1 << BIB_DBLSCANDBLSPRITEY)
 #define BIF_ILACEHALFSPRITEY	(1 << BIB_ILACEHALFSPRITEY)
 #define BIF_ILACEDBLROWOFFSET	(1 << BIB_ILACEDBLROWOFFSET)
@@ -518,7 +522,7 @@ enum {
 struct picasso96_state_struct
 {
     RGBFTYPE            RGBFormat;   /* true-colour, CLUT, hi-colour, etc.*/
-    struct MyCLUTEntry  CLUT[256];   /* Duh! */
+    struct MyCLUTEntry  CLUT[2 * 256];   /* Duh! */
     uaecptr             Address;     /* Active screen address (Amiga-side)*/
     uaecptr             Extent;      /* End address of screen (Amiga-side)*/
     uae_u16             Width;       /* Active display width  (From SetGC)*/
@@ -576,7 +580,8 @@ struct picasso_vidbuf_description {
     int extra_mem; /* nonzero if there's a second buffer that must be updated */
     uae_u32 rgbformat;
     uae_u32 selected_rgbformat;
-    uae_u32 clut[256];
+    uae_u32 clut[256 * 2];
+    uae_s16 splitypos;
 };
 
 extern struct picasso_vidbuf_description picasso_vidinfo;
diff --git a/od-win32/win32gfx.cpp b/od-win32/win32gfx.cpp
index f6edb2550..757588004 100644
--- a/src/od-fs/video.cpp
+++ b/src/od-fs/video.cpp
@@ -873,7 +873,7 @@ int picasso_palette(struct MyCLUTEntry *CLUT, uae_u32 *clut)
     int i, changed;
 
     changed = 0;
-    for (i = 0; i < 256; i++) {
+    for (i = 0; i < 256 * 2; i++) {
         int r = picasso96_state.CLUT[i].Red;
         int g = picasso96_state.CLUT[i].Green;
         int b = picasso96_state.CLUT[i].Blue;
openSUSE Build Service is sponsored by