From 86f21eb92b96ffa48bd11d9090b566fb65116027 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sat, 18 Dec 2021 19:48:16 +0200 Subject: [PATCH] Check PCem RTG board doubling mode when calculating magic mouse coordinates. --- framebufferboards.cpp | 2 ++ gfxboard.cpp | 18 ++++++++++++++---- include/gfxboard.h | 3 ++- mame/a2410.cpp | 2 ++ od-win32/picasso96_win.cpp | 7 +++++++ od-win32/picasso96_win.h | 1 + od-win32/win32gfx.cpp | 8 ++++++-- pcem/ibm.h | 2 +- pcem/pcemglue.cpp | 5 +++-- pcem/vid_svga.cpp | 2 +- 10 files changed, 39 insertions(+), 11 deletions(-) diff --git a/framebufferboards.cpp b/framebufferboards.cpp index acb29629..fae7417b 100644 --- a/framebufferboards.cpp +++ b/framebufferboards.cpp @@ -359,6 +359,8 @@ static bool harlequin_vsync(void *userdata, struct gfxboard_mode *mode) mode->width = data->width; mode->height = data->height; mode->mode = data->rgbtype; + mode->hlinedbl = 1; + mode->vlinedbl = 1; if (fb_get_surface(data)) { if (data->fb_modified || data->modechanged || mode->redraw_required) { diff --git a/gfxboard.cpp b/gfxboard.cpp index 65ee5caa..b917a38f 100644 --- a/gfxboard.cpp +++ b/gfxboard.cpp @@ -330,7 +330,7 @@ struct rtggfxboard uae_u8 cirrus_pci[0x44]; uae_u8 p4i2c; uae_u8 p4_pci[0x44]; - int vga_width, vga_height; + int vga_width, vga_height, vga_width_mult, vga_height_mult; bool vga_refresh_active; int device_settings; @@ -852,6 +852,7 @@ static void init_board (struct rtggfxboard *gb) gb->gfxmem_bank->reserved_size = vramsize; gb->gfxmem_bank->start = gb->gfxboardmem_start; if (gb->board->manufacturer) { + gb->gfxmem_bank->flags |= ABFLAG_ALLOCINDIRECT | ABFLAG_PPCIOSPACE; gb->gfxmem_bank->label = _T("*"); mapped_malloc(gb->gfxmem_bank); } else if (gb->board->pci) { @@ -859,6 +860,7 @@ static void init_board (struct rtggfxboard *gb) // PCI display card's BARs have been initialized ; } else { + gb->gfxmem_bank->flags |= ABFLAG_ALLOCINDIRECT | ABFLAG_PPCIOSPACE; gb->gfxmem_bank->label = _T("*"); gb->vram_back = xmalloc(uae_u8, vramsize); if (&get_mem_bank(0x800000) == &dummy_bank) @@ -962,6 +964,8 @@ static bool gfxboard_setmode(struct rtggfxboard *gb, struct gfxboard_mode *mode) state->Height = mode->height; state->VirtualWidth = state->Width; state->VirtualHeight = state->Height; + state->HLineDBL = mode->hlinedbl ? mode->hlinedbl : 1; + state->VLineDBL = mode->vlinedbl ? mode->vlinedbl : 1; int bpp = GetBytesPerPixel(mode->mode); state->BytesPerPixel = bpp; state->BytesPerRow = mode->width * bpp; @@ -1156,6 +1160,8 @@ static bool gfxboard_setmode_ext(struct rtggfxboard *gb) struct gfxboard_mode mode; mode.width = gb->vga_width; mode.height = gb->vga_height; + mode.hlinedbl = gb->vga_width_mult ? gb->vga_width_mult : 1; + mode.vlinedbl = gb->vga_height_mult ? gb->vga_height_mult : 1; mode.mode = RGBFB_NONE; for (int i = 0; i < RGBFB_MaxFormats; i++) { RGBFTYPE t = (RGBFTYPE)i; @@ -1293,7 +1299,7 @@ DisplaySurface *qemu_console_surface(QemuConsole *con) return &gb->gfxsurface; } -void gfxboard_resize(int width, int height, void *p) +void gfxboard_resize(int width, int height, int hmult, int vmult, void *p) { struct rtggfxboard *gb = (struct rtggfxboard *)p; if (width != gb->vga_width || gb->vga_height != height) { @@ -1301,6 +1307,8 @@ void gfxboard_resize(int width, int height, void *p) } gb->vga_width = width; gb->vga_height = height; + gb->vga_width_mult = hmult; + gb->vga_height_mult = vmult; } void qemu_console_resize(QemuConsole *con, int width, int height) @@ -1311,6 +1319,8 @@ void qemu_console_resize(QemuConsole *con, int width, int height) } gb->vga_width = width; gb->vga_height = height; + gb->vga_width_mult = 1; + gb->vga_height_mult = 1; } void linear_memory_region_set_dirty(MemoryRegion *mr, hwaddr addr, hwaddr size) @@ -2589,7 +2599,7 @@ static void copyvrambank(addrbank *dst, const addrbank *src, bool unsafe) if (unsafe) { dst->jit_read_flag |= S_READ | S_N_ADDR; dst->jit_write_flag |= S_WRITE | S_N_ADDR; - dst->flags |= ABFLAG_PPCIOSPACE; + dst->flags |= ABFLAG_ALLOCINDIRECT | ABFLAG_PPCIOSPACE; } } @@ -2616,7 +2626,7 @@ static void REGPARAM2 gfxboard_wput_mem_autoconfig (uaecptr addr, uae_u32 b) } } init_board(gb); - copyvrambank(&gb->gfxboard_bank_memory, gb->gfxmem_bank, false); + copyvrambank(&gb->gfxboard_bank_memory, gb->gfxmem_bank, true); copyvrambank(&gb->gfxboard_bank_vram_pcem, gb->gfxmem_bank, true); if (ISP4() && !gb->board->pcemdev) { if (validate_banks_z3(&gb->gfxboard_bank_memory, gb->gfxmem_bank->start >> 16, expamem_board_size >> 16)) { diff --git a/include/gfxboard.h b/include/gfxboard.h index 81990ed4..799ba0e8 100644 --- a/include/gfxboard.h +++ b/include/gfxboard.h @@ -34,7 +34,7 @@ extern bool gfxboard_rtg_enable_initial(int monid, int); extern void gfxboard_rtg_disable(int monid, int); extern bool gfxboard_init_board(struct autoconfig_info*); extern bool gfxboard_set(int monid, bool rtg); -extern void gfxboard_resize(int width, int height, void *p); +extern void gfxboard_resize(int width, int height, int hmult, int vmult, void *p); uae_u8 *gfxboard_getrtgbuffer(int monid, int *widthp, int *heightp, int *pitch, int *depth, uae_u8 *palette); void gfxboard_freertgbuffer(int monid, uae_u8 *dst); @@ -88,6 +88,7 @@ struct gfxboard_mode int height; RGBFTYPE mode; bool redraw_required; + int hlinedbl, vlinedbl; }; typedef bool(*GFXBOARD_INIT)(struct autoconfig_info*); diff --git a/mame/a2410.cpp b/mame/a2410.cpp index 0ecf4e9d..51964aa8 100644 --- a/mame/a2410.cpp +++ b/mame/a2410.cpp @@ -796,6 +796,8 @@ static bool tms_vsync(void *userdata, struct gfxboard_mode *mode) if (data->a2410_visible) { mode->width = data->a2410_width; mode->height = data->a2410_height; + mode->hlinedbl = 1; + mode->vlinedbl = 1; mode->mode = RGBFB_CLUT; } diff --git a/od-win32/picasso96_win.cpp b/od-win32/picasso96_win.cpp index 2ff52c1d..307c9ff9 100644 --- a/od-win32/picasso96_win.cpp +++ b/od-win32/picasso96_win.cpp @@ -2806,6 +2806,8 @@ static uae_u32 REGPARAM2 picasso_SetSwitch (TrapContext *ctx) state->GC_Depth = 8; state->GC_Flags = 0; state->BytesPerPixel = 1; + state->HLineDBL = 1; + state->VLineDBL = 1; state->HostAddress = NULL; delayed_set_switch = true; atomic_or(&vidinfo->picasso_state_change, PICASSO_STATE_SETGC); @@ -2993,6 +2995,9 @@ static uae_u32 REGPARAM2 picasso_SetGC (TrapContext *ctx) state->GC_Depth = trap_get_byte(ctx, modeinfo + PSSO_ModeInfo_Depth); state->GC_Flags = trap_get_byte(ctx, modeinfo + PSSO_ModeInfo_Flags); + state->HLineDBL = 1; + state->VLineDBL = 1; + P96TRACE_SETUP((_T("SetGC(%d,%d,%d,%d)\n"), state->Width, state->Height, state->GC_Depth, border)); state->HostAddress = NULL; @@ -6668,6 +6673,8 @@ uae_u8 *restore_p96 (uae_u8 *src) } } state->HostAddress = NULL; + state->HLineDBL = 1; + state->VLineDBL = 1; picasso_SetPanningInit(state); state->Extent = state->Address + state->BytesPerRow * state->VirtualHeight; return src; diff --git a/od-win32/picasso96_win.h b/od-win32/picasso96_win.h index b61d23b1..4221af5c 100644 --- a/od-win32/picasso96_win.h +++ b/od-win32/picasso96_win.h @@ -637,6 +637,7 @@ struct picasso96_state_struct // must be in memory long XYOffset; bool dualclut; + int HLineDBL, VLineDBL; }; extern void InitPicasso96(int monid); diff --git a/od-win32/win32gfx.cpp b/od-win32/win32gfx.cpp index 31b34d1a..871c6db0 100644 --- a/od-win32/win32gfx.cpp +++ b/od-win32/win32gfx.cpp @@ -1799,8 +1799,12 @@ void getrtgfilterrect2(int monid, RECT *sr, RECT *dr, RECT *zr, int dst_width, i } OffsetRect (zr, picasso_offset_x, picasso_offset_y); - picasso_offset_mx = (float)srcwidth * mx / (dr->right - dr->left); - picasso_offset_my = (float)srcheight * my / (dr->bottom - dr->top); + + picasso_offset_x /= state->HLineDBL; + picasso_offset_y /= state->VLineDBL; + + picasso_offset_mx = (float)(srcwidth * mx * state->HLineDBL) / (dr->right - dr->left); + picasso_offset_my = (float)(srcheight * my * state->VLineDBL) / (dr->bottom - dr->top); } static uae_u8 *gfx_lock_picasso2(int monid, bool fullupdate) diff --git a/pcem/ibm.h b/pcem/ibm.h index c4afe4dd..a4d405e7 100644 --- a/pcem/ibm.h +++ b/pcem/ibm.h @@ -489,7 +489,7 @@ void endblit(); void set_window_title(const char *s); -void updatewindowsize(int x, int y); +void updatewindowsize(int x, int mx, int y, int my); void initpc(int argc, char *argv[]); void runpc(); diff --git a/pcem/pcemglue.cpp b/pcem/pcemglue.cpp index b279f94c..6e7c7af6 100644 --- a/pcem/pcemglue.cpp +++ b/pcem/pcemglue.cpp @@ -662,9 +662,10 @@ void video_wait_for_buffer(void) { //write_log(_T("video_wait_for_buffer\n")); } -void updatewindowsize(int x, int y) +void updatewindowsize(int x, int mx, int y, int my) { - gfxboard_resize(x, y, gfxboard_priv); + x *= mx; + gfxboard_resize(x, y, mx, my, gfxboard_priv); } static void (*pci_card_write)(int func, int addr, uint8_t val, void *priv); diff --git a/pcem/vid_svga.cpp b/pcem/vid_svga.cpp index c925b325..1b322192 100644 --- a/pcem/vid_svga.cpp +++ b/pcem/vid_svga.cpp @@ -1457,7 +1457,7 @@ void svga_doblit(int y1, int y2, int wx, int wy, svga_t *svga) if (xsize<128) xsize=0; if (ysize<32) ysize=0; - updatewindowsize(xsize * (svga->horizontal_linedbl ? 2 : 1), ysize * (svga->vertical_linedbl ? 2 : 1)); + updatewindowsize(xsize, svga->horizontal_linedbl ? 2 : 1, ysize, svga->linedbl ? 2 : 1); } if (vid_resize) { -- 2.47.3