]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Custom emulation update WIP.
authorToni Wilen <twilen@winuae.net>
Sun, 18 Jul 2021 18:29:39 +0000 (21:29 +0300)
committerToni Wilen <twilen@winuae.net>
Sun, 18 Jul 2021 18:29:39 +0000 (21:29 +0300)
cfgfile.cpp
drawing.cpp
include/custom.h
include/drawing.h
include/options.h
od-win32/rp.cpp

index 53b51531124f815da6a87260b5d7c9575f15b5d2..a3a7b0e2a657545f1715aed57da94381e98c2783 100644 (file)
@@ -7934,7 +7934,7 @@ void default_prefs (struct uae_prefs *p, bool reset, int type)
        p->gfx_monitor[0].gfx_size_fs.height = 600;
        p->gfx_monitor[0].gfx_size_win.width = 720;
        p->gfx_monitor[0].gfx_size_win.height = 568;
-       for (i = 0; i < 4; i++) {
+       for (i = 0; i < GFX_SIZE_EXTRA_NUM; i++) {
                p->gfx_monitor[0].gfx_size_fs_xtra[i].width = 0;
                p->gfx_monitor[0].gfx_size_fs_xtra[i].height = 0;
                p->gfx_monitor[0].gfx_size_win_xtra[i].width = 0;
index 08cefa831dc316b8ea63adaf6022dea1d06ce662..4fca20f0564b3731a70ceb75deab7b5a333c527a 100644 (file)
@@ -254,6 +254,7 @@ static int visible_top_start, visible_bottom_stop;
 static int vblank_top_start, vblank_bottom_stop;
 static int hblank_left_start, hblank_right_stop;
 static bool exthblank;
+static bool extborder;
 
 static int linetoscr_x_adjust_pixbytes, linetoscr_x_adjust_pixels;
 static int thisframe_y_adjust;
@@ -492,28 +493,36 @@ static void set_blanking_limits(void)
                vblank_bottom_stop = visible_bottom_stop;
        }
 
-       if (!dp_for_drawing || !ce_is_extblankset(colors_for_drawing.extra) || !ce_is_extblankmode(colors_for_drawing.extra) || (currprefs.gfx_overscanmode <= OVERSCANMODE_OVERSCAN && !(new_beamcon0 & 0x80))) {
-               // hardwired blanking
-               int hbstrt = (235 << CCK_SHRES_SHIFT) - 3;
-               int hbstop = (47 << CCK_SHRES_SHIFT) - 7;
+       // horizontal blanking
+       bool hardwired = !dp_for_drawing || !ce_is_extblankset(colors_for_drawing.extra) || !ce_is_extblankmode(colors_for_drawing.extra);
+       bool doblank = false;
+       int hbstrt = (235 << CCK_SHRES_SHIFT) - 3;
+       int hbstop = (47 << CCK_SHRES_SHIFT) - 7;
 
-               if (currprefs.gfx_overscanmode < OVERSCANMODE_OVERSCAN) {
-                       int mult = (OVERSCANMODE_OVERSCAN - currprefs.gfx_overscanmode) * 4;
-                       hbstrt -= mult << CCK_SHRES_SHIFT;
-                       hbstop += mult << CCK_SHRES_SHIFT;
-                       if (currprefs.gfx_overscanmode == 0) {
-                               hbstrt += 2 << CCK_SHRES_SHIFT;
-                               hbstop -= 2 << CCK_SHRES_SHIFT;
-                       }
+       if (currprefs.gfx_overscanmode < OVERSCANMODE_OVERSCAN) {
+               int mult = (OVERSCANMODE_OVERSCAN - currprefs.gfx_overscanmode) * 4;
+               hbstrt -= mult << CCK_SHRES_SHIFT;
+               hbstop += mult << CCK_SHRES_SHIFT;
+               if (currprefs.gfx_overscanmode == 0) {
+                       hbstrt += 2 << CCK_SHRES_SHIFT;
+                       hbstop -= 2 << CCK_SHRES_SHIFT;
                }
-               if (!dp_for_drawing || !ce_is_extblankset(colors_for_drawing.extra) || !ce_is_extblankmode(colors_for_drawing.extra)) {
-                       exthblank = false;
-               } else if (currprefs.gfx_overscanmode <= OVERSCANMODE_OVERSCAN) {
-                       if ((new_beamcon0 & 0x0110) && !(new_beamcon0 & 0x80)) {
-                               extern uae_u16 hsstrt;
-                               hbstrt += (hsstrt - 13) << CCK_SHRES_SHIFT;
-                               hbstop += (hsstrt - 13) << CCK_SHRES_SHIFT;
-                       }
+       }
+       if (hardwired) {
+               exthblank = false;
+               doblank = true;
+       } else if (currprefs.gfx_overscanmode <= OVERSCANMODE_OVERSCAN) {
+               doblank = true;
+       } else if (currprefs.gfx_overscanmode == OVERSCANMODE_BROADCAST) {
+               hbstrt = (239 << CCK_SHRES_SHIFT) - 3;
+               hbstop = (47 << CCK_SHRES_SHIFT) - 3;
+               doblank = true;
+       }
+       if (doblank && !(new_beamcon0 & 0x80)) {
+               if (new_beamcon0 & 0x0110) {
+                       extern uae_u16 hsstrt;
+                       hbstrt += (hsstrt - 17) << CCK_SHRES_SHIFT;
+                       hbstop += (hsstrt - 17) << CCK_SHRES_SHIFT;
                }
                if (currprefs.chipset_hr) {
                        hbstrt &= ~(3 >> currprefs.gfx_resolution);
@@ -529,7 +538,9 @@ static void set_blanking_limits(void)
                        hblank_right_stop = coord_hw_to_window_x_shres(hbstrt);
                }
        }
-       if (!(new_beamcon0 & 0x1000) || (currprefs.gfx_overscanmode <= OVERSCANMODE_OVERSCAN && !(new_beamcon0 & 0x80))) {
+
+       hardwired = (new_beamcon0 & 0x1000) == 0;
+       if (hardwired) {
                int vbstrt = vblank_firstline_hw;
                int vbstop = vblank_lastline_hw;
 
@@ -548,6 +559,7 @@ static void set_blanking_limits(void)
                        vblank_bottom_stop = vbstop;
                }
        }
+
 }
 
 void get_custom_raw_limits(int *pw, int *ph, int *pdx, int *pdy)
@@ -769,7 +781,7 @@ int get_custom_limits (int *pw, int *ph, int *pdx, int *pdy, int *prealh)
                dx = 0;
 
        *prealh = -1;
-       if (!programmedmode && first_planes_vpos) {
+       if (programmedmode <= 1 && first_planes_vpos) {
                int th = (maxvpos - minfirstline) * 95 / 100;
                if (th > h) {
                        th = xshift (th, dbl1);
@@ -783,7 +795,7 @@ int get_custom_limits (int *pw, int *ph, int *pdx, int *pdy, int *prealh)
        if (w == 0 || h == 0)
                return 0;
 
-       if (doublescan <= 0 && !programmedmode) {
+       if (doublescan <= 0 && programmedmode <= 1) {
                if ((w >> currprefs.gfx_resolution) < MIN_DISPLAY_W) {
                        dx += (w - (MIN_DISPLAY_W << currprefs.gfx_resolution)) / 2;
                        w = MIN_DISPLAY_W << currprefs.gfx_resolution;
@@ -807,7 +819,7 @@ int get_custom_limits (int *pw, int *ph, int *pdx, int *pdy, int *prealh)
 
        if (w <= 0 || h <= 0 || dx < 0 || dy < 0)
                return ret;
-       if (doublescan <= 0 && !programmedmode) {
+       if (doublescan <= 0 && programmedmode <= 1) {
                if (dx > vidinfo->outbuffer->inwidth / 3)
                        return ret;
                if (dy > vidinfo->outbuffer->inheight / 3)
@@ -1002,8 +1014,8 @@ static void set_res_shift(void)
 static void pfield_init_linetoscr (bool border)
 {
        /* First, get data fetch start/stop in DIW coordinates.  */
-       int ddf_left = dp_for_drawing->plfleft * 2 + DIW_DDF_OFFSET - DDF_OFFSET;
-       int ddf_right = dp_for_drawing->plfright * 2 + DIW_DDF_OFFSET - DDF_OFFSET;
+       int ddf_left = dp_for_drawing->plfleft + DIW_DDF_OFFSET - DDF_OFFSET;
+       int ddf_right = dp_for_drawing->plfright + DIW_DDF_OFFSET - DDF_OFFSET;
        int leftborderhidden;
        int native_ddf_left2;
        bool expanded = false;
@@ -1077,7 +1089,7 @@ static void pfield_init_linetoscr (bool border)
                        if (playfield_end < linetoscr_diw_end && hblank_right_stop > playfield_end) {
                                playfield_end = linetoscr_diw_end;
                        }
-                       int left = coord_hw_to_window_x_lores(dp_for_drawing->plfleft * 2 - DDF_OFFSET);
+                       int left = coord_hw_to_window_x_lores(dp_for_drawing->plfleft - DDF_OFFSET);
                        if (left < visible_left_border)
                                left = visible_left_border;
                        if (left < playfield_start && left >= linetoscr_diw_start) {
@@ -1869,19 +1881,6 @@ static int linetoscr_16_shrink2f_sh(int spix, int dpix, int stoppos)
 }
 #endif
 
-static int pfield_do_linetoscr_blank(int spix, int dpix, int dpix_end)
-{
-       uae_u32 *buf = (uae_u32 *)xlinebuffer;
-       if (res_shift == 1) {
-               while (dpix < dpix_end) {
-                       spix++;
-                       buf[dpix++] = 0;
-                       buf[dpix++] = 0;
-               }
-       }
-       return spix;
-}
-
 typedef int(*call_linetoscr)(int spix, int dpix, int dpix_end);
 
 static call_linetoscr pfield_do_linetoscr_normal, pfield_do_linetoscr_normal2;
@@ -1893,14 +1892,22 @@ static void pfield_do_linetoscr(int start, int stop, int blank)
        int pixel = pfield_do_linetoscr_normal(src_pixel, start, stop);
        if (exthblank) {
                pfield_do_fill_line(start, stop, 1);
+       } else if (extborder) {
+               pfield_do_fill_line(start, stop, ce_is_borderblank(colors_for_drawing.extra) ? 1 : 0);
        }
        src_pixel = pixel;
 }
 static void pfield_do_linetoscr_spr(int start, int stop, int blank)
 {
-       int pixel = pfield_do_linetoscr_sprite(src_pixel, start, stop);
-       if (exthblank) {
-               pfield_do_fill_line(start, stop, 1);
+       int pixel;
+       if (extborder) {
+               pfield_do_fill_line(start, stop, ce_is_borderblank(colors_for_drawing.extra) ? 1 : 0);
+               pixel = pfield_do_linetoscr_spriteonly(src_pixel, start, stop);
+       } else {
+               pixel = pfield_do_linetoscr_sprite(src_pixel, start, stop);
+               if (exthblank) {
+                       pfield_do_fill_line(start, stop, 1);
+               }
        }
        src_pixel = pixel;
 }
@@ -3081,7 +3088,6 @@ static void pfield_expand_dp_bplconx (int regno, int v, int vp, int hp)
                break;
        case 0x200: // hblank
                exthblank = v != 0;
-               //write_log("%d,%d=%d ", hp, vp, v);
                return;
 #endif
        }
@@ -3268,7 +3274,13 @@ static void do_color_changes(line_draw_func worker_border, line_draw_func worker
                                color_reg_set(&colors_for_drawing, regno, value);
                                colors_for_drawing.acolors[regno] = getxcolor(value);
                        } else if (regno == 0 && (value & COLOR_CHANGE_MASK)) {
-                               if (value & COLOR_CHANGE_BLANK) {
+                               if ((value & COLOR_CHANGE_MASK) == COLOR_CHANGE_ACTBORDER) {
+                                       if (value & 1) {
+                                               extborder = true;
+                                       } else {
+                                               extborder = false;
+                                       }
+                               } else if (value & COLOR_CHANGE_BLANK) {
                                        if (value & 1) {
                                                hposblank = 1;
                                        } else {
@@ -3594,6 +3606,9 @@ static void center_image (void)
        } else if (vidinfo->drawbuffer.extrawidth > 0 || ew == -1 || currprefs.gfx_overscanmode == OVERSCANMODE_EXTREME) {
                // wide mode
                visible_left_border = (hsync_end_left_border * 2) << currprefs.gfx_resolution;
+       } else if (vidinfo->drawbuffer.extrawidth > 0 || ew == -1) {
+               // wide mode
+               visible_left_border = (hsync_end_left_border * 2) << currprefs.gfx_resolution;
                if (visible_left_border + w < max_diwlastword) {
                        visible_left_border += (max_diwlastword - (visible_left_border + w)) / 2;
                }
@@ -3704,7 +3719,7 @@ static void init_drawing_frame (void)
 
        if (currprefs.gfx_resolution == changed_prefs.gfx_resolution && lines_count > 0) {
 
-               if (currprefs.gfx_autoresolution_vga && programmedmode && vidinfo->gfx_resolution_reserved >= RES_HIRES && vidinfo->gfx_vresolution_reserved >= VRES_DOUBLE) {
+               if (currprefs.gfx_autoresolution_vga && programmedmode > 1 && vidinfo->gfx_resolution_reserved >= RES_HIRES && vidinfo->gfx_vresolution_reserved >= VRES_DOUBLE) {
                        if (largest_res == RES_SUPERHIRES && (vidinfo->gfx_resolution_reserved < RES_SUPERHIRES || vidinfo->gfx_vresolution_reserved < 1)) {
                                // enable full doubling/superhires support if programmed mode. It may be "half-width" only and may fit in normal display window.
                                vidinfo->gfx_resolution_reserved = RES_SUPERHIRES;
@@ -4443,6 +4458,7 @@ void check_prefs_picasso(void)
 
                if (!ad->picasso_requested_on && monid > 0) {
                        ad->picasso_requested_on = ad->picasso_on;
+                       ad->picasso_requested_forced_on = false;
                        continue;
                }
 
index 6f76e3a520d732c623cb42fcbacdd5eef007edb4..777a8582ef9a98d9b74e3824a891cfb8e32fd10e 100644 (file)
@@ -134,7 +134,7 @@ extern int minfirstline, vblank_endline, numscrlines;
 extern float vblank_hz, fake_vblank_hz;
 extern float hblank_hz;
 extern int vblank_skip, doublescan;
-extern bool programmedmode;
+extern int programmedmode;
 extern int vblank_firstline_hw, vblank_lastline_hw;
 
 #define DMA_AUD0      0x0001
index 836bf5ecc5cc32f05292d07a814d542dd45a6a58..53d92fe40fd808b2ca4ced7c92562326d126077d 100644 (file)
@@ -241,6 +241,7 @@ STATIC_INLINE void color_reg_cpy (struct color_entry *dst, struct color_entry *s
 #define COLOR_CHANGE_SHRES_DELAY 0x40000000
 #define COLOR_CHANGE_HSYNC_HACK 0x20000000
 #define COLOR_CHANGE_BLANK 0x10000000
+#define COLOR_CHANGE_ACTBORDER (COLOR_CHANGE_BLANK | COLOR_CHANGE_BRDBLANK)
 #define COLOR_CHANGE_MASK 0xf0000000
 struct color_change {
        int linepos;
index bd8377e043c942c7524dce02e013715b8975d2b8..fc3667024f1907cc0d4b622d61b03b19715ea89e 100644 (file)
@@ -457,13 +457,14 @@ struct expansion_params
 #define Z3MAPPING_UAE 1
 #define Z3MAPPING_REAL 2
 
+#define GFX_SIZE_EXTRA_NUM 6
 struct monconfig
 {
        struct wh gfx_size_win;
        struct wh gfx_size_fs;
        struct wh gfx_size;
-       struct wh gfx_size_win_xtra[6];
-       struct wh gfx_size_fs_xtra[6];
+       struct wh gfx_size_win_xtra[GFX_SIZE_EXTRA_NUM];
+       struct wh gfx_size_fs_xtra[GFX_SIZE_EXTRA_NUM];
 };
 
 struct uae_prefs {
index f35eed9c6ca933d4226dda02c3d13e405354204e..de4045d3e7f923c017a5f4a75909e6b21480412a 100644 (file)
@@ -1379,7 +1379,7 @@ static LRESULT CALLBACK RPHostMsgFunction2 (UINT uMessage, WPARAM wParam, LPARAM
                                        struct vidbuffer vb;
                                        int w = avidinfo->drawbuffer.inwidth;
                                        int h = avidinfo->drawbuffer.inheight;
-                                       if (!programmedmode) {
+                                       if (programmedmode <= 1) {
                                                h = (maxvpos + lof_store - minfirstline) << currprefs.gfx_vresolution;
                                        }
                                        if (interlace_seen && currprefs.gfx_vresolution > 0) {