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;