static int overlay_active;
static int overlay_convert;
static int overlay_occlusion;
-static struct MyCLUTEntry overlay_clutc[256];
-static uae_u32 overlay_clut[256];
+static struct MyCLUTEntry overlay_clutc[256 * 2];
+static uae_u32 overlay_clut[256 * 2];
static uae_u32 *p96_rgbx16_ovl;
static int uaegfx_old, uaegfx_active;
*/
static uae_u32 REGPARAM2 picasso_SetSpritePosition (TrapContext *ctx)
{
- struct picasso96_state_struct *state = &picasso96_state[currprefs.rtgboards[0].monitor_id];
+ int monid = currprefs.rtgboards[0].monitor_id;
+ struct picasso96_state_struct *state = &picasso96_state[monid];
+ struct picasso_vidbuf_description *vidinfo = &picasso_vidinfo[monid];
uaecptr bi = trap_get_areg(ctx, 0);
boardinfo = bi;
int x = (uae_s16)trap_get_word(ctx, bi + PSSO_BoardInfo_MouseX) - state->XOffset;
int y = (uae_s16)trap_get_word(ctx, bi + PSSO_BoardInfo_MouseY) - state->YOffset;
+ if (vidinfo->splitypos >= 0) {
+ y += vidinfo->splitypos;
+ }
newcursor_x = x;
newcursor_y = y;
if (!hwsprite)
#if OVERLAY
flags |= BIF_VIDEOWINDOW;
#endif
+ flags |= BIF_VGASCREENSPLIT;
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);
static void resetpalette(struct picasso96_state_struct *state)
{
- for (int i = 0; i < 256; i++)
+ for (int i = 0; i < 256 * 2; i++)
state->CLUT[i].Pad = 0xff;
}
state->CLUT[i].Red = r;
state->CLUT[i].Green = g;
state->CLUT[i].Blue = b;
- if (uaegfx) {
- state->CLUT[i].Red = r;
- state->CLUT[i].Green = g;
- state->CLUT[i].Blue = b;
- }
+ state->CLUT[i + 256].Red = r;
+ state->CLUT[i + 256].Green = g;
+ state->CLUT[i + 256].Blue = b;
}
changed |= picasso_palette(state->CLUT, vidinfo->clut);
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 = trap_get_dreg(ctx, 0) - 1;
+ if (pos != vidinfo->splitypos) {
+ vidinfo->splitypos = pos;
+ vidinfo->full_refresh = 1;
+ }
+ unlockrtg();
+ return 1;
+}
+
#ifdef CPU_64_BIT
static void do_xor8 (uae_u8 *p, int w, uae_u32 v)
{
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)
{
struct picasso_vidbuf_description *vidinfo = &picasso_vidinfo[monid];
- uae_u8 *src2 = src + y * srcbytesperrow;
- uae_u8 *dst2 = dst + dy * dstbytesperrow;
int endx = x + width, endx4;
int dstpix = dstpixbytes;
int srcpix = srcpixbytes;
+ uae_u32 *clut = vidinfo->clut;
+
+ if (y >= vidinfo->splitypos && vidinfo->splitypos >= 0) {
+ src = gfxmem_banks[monid]->start + natmem_offset;
+ clut += 256;
+ y -= 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);
case RGBFB_CLUT_RGBFB_32:
{
while ((x & 3) && x < endx) {
- ((uae_u32*)dst2)[dx] = vidinfo->clut[src2[x]];
+ ((uae_u32*)dst2)[dx] = clut[src2[x]];
x++;
dx++;
}
while (x < endx4) {
- ((uae_u32*)dst2)[dx] = vidinfo->clut[src2[x]];
+ ((uae_u32*)dst2)[dx] = clut[src2[x]];
x++;
dx++;
- ((uae_u32*)dst2)[dx] = vidinfo->clut[src2[x]];
+ ((uae_u32*)dst2)[dx] = clut[src2[x]];
x++;
dx++;
- ((uae_u32*)dst2)[dx] = vidinfo->clut[src2[x]];
+ ((uae_u32*)dst2)[dx] = clut[src2[x]];
x++;
dx++;
- ((uae_u32*)dst2)[dx] = vidinfo->clut[src2[x]];
+ ((uae_u32*)dst2)[dx] = clut[src2[x]];
x++;
dx++;
}
while (x < endx) {
- ((uae_u32*)dst2)[dx] = vidinfo->clut[src2[x]];
+ ((uae_u32*)dst2)[dx] = clut[src2[x]];
x++;
dx++;
}
case RGBFB_CLUT_RGBFB_16:
{
while ((x & 3) && x < endx) {
- ((uae_u16*)dst2)[dx] = vidinfo->clut[src2[x]];
+ ((uae_u16*)dst2)[dx] = clut[src2[x]];
x++;
dx++;
}
while (x < endx4) {
- ((uae_u16*)dst2)[dx] = vidinfo->clut[src2[x]];
+ ((uae_u16*)dst2)[dx] = clut[src2[x]];
x++;
dx++;
- ((uae_u16*)dst2)[dx] = vidinfo->clut[src2[x]];
+ ((uae_u16*)dst2)[dx] = clut[src2[x]];
x++;
dx++;
- ((uae_u16*)dst2)[dx] = vidinfo->clut[src2[x]];
+ ((uae_u16*)dst2)[dx] = clut[src2[x]];
x++;
dx++;
- ((uae_u16*)dst2)[dx] = vidinfo->clut[src2[x]];
+ ((uae_u16*)dst2)[dx] = clut[src2[x]];
x++;
dx++;
}
while (x < endx) {
- ((uae_u16*)dst2)[dx] = vidinfo->clut[src2[x]];
+ ((uae_u16*)dst2)[dx] = clut[src2[x]];
x++;
dx++;
}
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)
{
+ struct picasso_vidbuf_description *vidinfo = &picasso_vidinfo[monid];
int x, y, w;
w = pwidth * dstpixbytes;
if (direct) {
for (y = 0; y < pheight; y++) {
- for (x = 0; x < w; x++)
+ 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;
}
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 (y = 0; y < pheight; y++) {
+ copyrow(monid, src, dst, 0, y, pwidth, srcbytesperrow, srcpixbytes, 0, y, dstbytesperrow, dstpixbytes, direct, mode_convert, p96_rgbx16);
+ }
}
}
RTGCALL2X(PSSO_BoardInfo_DeleteFeature, picasso_DeleteFeature);
#endif
+ RTGCALL2(PSSO_SetSplitPosition, picasso_SetSplitPosition);
+
#endif
if (currprefs.rtg_hardwareinterrupt)
#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
#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 */
#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)
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)*/
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];
int picasso_convert, host_mode;
int ohost_mode, orgbformat;
int full_refresh;
int rtg_clear_flag;
bool picasso_active;
bool picasso_changed;
+ uae_s16 splitypos;
uae_atomic picasso_state_change;
};