#include "gfxboard.h"
#define ENABLE_MULTITHREADED_DENISE 1
+#define FMODE64_HACK 0
+
extern int multithread_enabled;
#define MULTITHREADED_DENISE (ENABLE_MULTITHREADED_DENISE && multithread_enabled != 0)
static int denise_visible_lines, denise_visible_lines_counted;
static uae_u16 hbstrt_denise_reg, hbstop_denise_reg;
static uae_u16 fmode_denise, denise_bplfmode, denise_sprfmode;
+#if FMODE64_HACK
+static int denise_bplfmode_max;
+#endif
static bool denise_sprfmode64, denise_bplfmode64;
static int bpldat_fmode;
static int fetchmode_size_denise, fetchmode_mask_denise;
static int aga_delayed_color_idx;
static uae_u16 aga_delayed_color_val, aga_delayed_color_con2, aga_delayed_color_con3;
static int aga_unalign0, aga_unalign1, bpl1dat_unalign, reswitch_unalign;
+#if 0
+static int bplcon0_res_unalign, bplcon0_res_unalign_res;
+#endif
static uae_u8 loaded_pix, loaded_pixs[4];
static int hresolution, hresolution_inv, hresolution_add;
static bool denise_sprite_blank_active;
check_lts_request();
}
-static void expand_bplcon0_early(uae_u16 v)
-{
- if (!aga_mode) {
- int ores = denise_res;
- int nres = GET_RES_DENISE(v);
- if (ores == RES_LORES && nres == RES_HIRES) {
- if (ecs_denise) {
- reswitch_unalign = 3;
- } else {
- reswitch_unalign = 3;
- }
- }
- }
-}
-
int gethresolution(void)
{
return hresolution;
}
}
+static void expand_bplcon0_early(uae_u16 v)
+{
+ if (!aga_mode) {
+
+ int ores = denise_res;
+ int nres = GET_RES_DENISE(v);
+ if (ores == RES_LORES && nres == RES_HIRES) {
+ if (ecs_denise) {
+ reswitch_unalign = 3;
+ } else {
+ reswitch_unalign = 3;
+ }
+ }
+
+ } else {
+
+#if 0
+ // shres resolution change in AGA is 1 lores pixel earlier
+ if (denise_res != GET_RES_DENISE(v)) {
+ bplcon0_res_unalign = true;
+ bplcon0_res_unalign_res = GET_RES_DENISE(v);
+ aga_unalign0 += 2;
+ aga_unalign1 += 2;
+ }
+#endif
+
+ }
+}
+
+#if 0
+static void expand_bplcon0_unaligned(void)
+{
+ bplcon0_res_unalign = false;
+ denise_res = bplcon0_res_unalign_res;
+ denise_res_size = 1 << denise_res;
+ sethresolution();
+ setbplmode();
+ update_fmode();
+ update_specials();
+ update_sprres();
+ check_lts_request();
+}
+#endif
+
static void expand_bplcon0(uae_u16 v)
{
uae_u16 old = bplcon0_denise;
bplcon0_denise = v;
- if (denise_res != GET_RES_DENISE(bplcon0_denise) || denise_planes != GET_PLANES(bplcon0_denise)) {
+ if (denise_res != GET_RES_DENISE(bplcon0_denise)) {
+ lts_request = true;
+ }
+
+ if (denise_planes != GET_PLANES(bplcon0_denise)) {
lts_request = true;
}
- int ores = denise_res;
denise_res = GET_RES_DENISE(bplcon0_denise);
denise_res_size = 1 << denise_res;
sethresolution();
check_lts_request();
}
+#if FMODE64_HACK
+static uae_u64 make6416(uae_u32 v)
+{
+ return ((uae_u64)v << 48) | ((uae_u64)v << 32) | ((uae_u64)v << 16) | ((uae_u64)v);
+}
+static uae_u64 make6432(uae_u32 v)
+{
+ return ((uae_u64)v << 32) | ((uae_u64)v);
+}
+#endif
+
static void expand_fmode(uae_u16 v)
{
if (!aga_mode) {
denise_xposmask <<= 2;
denise_xposmask |= hresolution == RES_SUPERHIRES ? 3 : (hresolution == RES_HIRES ? 2 : 0);
+ int fm = denise_bplfmode;
denise_bplfmode = (v & 3) == 3 ? 2 : (v & 3) == 0 ? 0 : 1;
+#if FMODE64_HACK
+ if (fm != denise_bplfmode) {
+ if (!denise_bplfmode_max) {
+ if (fm < 2) {
+ for (int i = 0; i < MAX_PLANES; i++) {
+ if (fm == 1) {
+ bplxdat_64[i] = make6432(bplxdat[i]);
+ bplxdat2_64[i] = make6432(bplxdat2[i]);
+ bplxdat3_64[i] = make6432(bplxdat3[i]);
+ } else {
+ bplxdat_64[i] = make6416(bplxdat[i]);
+ bplxdat2_64[i] = make6416(bplxdat2[i]);
+ bplxdat3_64[i] = make6416(bplxdat3[i]);
+ }
+ }
+ }
+ lts_request = true;
+ }
+ denise_bplfmode_max = 2;
+ }
+#endif
v >>= 2;
denise_sprfmode = (v & 3) == 3 ? 2 : (v & 3) == 0 ? 0 : 1;
denise_sprfmode64 = denise_sprfmode == 2;
denise_bplfmode64 = denise_bplfmode == 2;
+#if FMODE64_HACK
+ if (denise_bplfmode_max) {
+ denise_bplfmode64 = true;
+ }
+#endif
update_fmode();
check_lts_request();
}
}
#endif
}
+#if FMODE64_HACK
+ if (denise_bplfmode_max > 0) {
+ denise_bplfmode_max--;
+ if (!denise_bplfmode_max) {
+ select_lts();
+ }
+ }
+#endif
}
static void do_exthblankon_ecs(void)
case 0x110:
if (denise_bplfmode64) {
+#if FMODE64_HACK
+ if (denise_bplfmode < 2) {
+ bplxdat_64[0] = denise_bplfmode == 0 ? make6416(rd->v) : make6432(rd->v);
+ } else {
+ bplxdat_64[0] = rd->v64;
+ }
+#else
bplxdat_64[0] = rd->v64;
+#endif
} else {
bplxdat[0] = rd->v;
}
case 0x11a:
case 0x11c:
case 0x11e:
- if (denise_bplfmode64) {
- bplxdat_64[(rd->rga - 0x110) / 2] = rd->v64;
- } else {
- bplxdat[(rd->rga - 0x110) / 2] = rd->v;
+ {
+ int num = (rd->rga - 0x110) / 2;
+ if (denise_bplfmode64) {
+#if FMODE64_HACK
+ if (denise_bplfmode < 2) {
+ bplxdat_64[num] = denise_bplfmode == 0 ? make6416(rd->v) : make6432(rd->v);;
+ } else {
+ bplxdat_64[num] = rd->v64;
+ }
+#else
+ bplxdat_64[num] = rd->v64;
+#endif
+ } else {
+ bplxdat[num] = rd->v;
+ }
}
break;
#include "linetoscr_aga_fm0.cpp"
#include "linetoscr_aga_fm1.cpp"
#include "linetoscr_aga_fm2.cpp"
+#if FMODE64_HACK
+#include "linetoscr_aga_fm0_64.cpp"
+#include "linetoscr_aga_fm1_64.cpp"
+#endif
#include "linetoscr_aga_fm0_genlock.cpp"
#include "linetoscr_aga_fm1_genlock.cpp"
#include "linetoscr_aga_fm2_genlock.cpp"
lts = linetoscr_aga_funcs[idx];
}
} else {
+#if FMODE64_HACK
+ if (denise_bplfmode_max && bpldat_fmode < 2) {
+ idx += 3 * 2 * 5 * 4 * 2 * 3 * 3;
+ }
+#endif
lts = linetoscr_aga_funcs[idx];
}
}
aga_delayed_color_idx = -1;
}
bplmode = bplmode_new;
+#if 0
+ if (bplcon0_res_unalign) {
+ expand_bplcon0_unaligned();
+ }
+#endif
}
if (h) {
gpix = spix;
}
}
+
dtbuf[h][ipix] = dpix_val;
dtgbuf[h][ipix] = gpix;
gpix = spix;
}
}
+
dtbuf[h][ipix] = dpix_val;
dtgbuf[h][ipix] = gpix;
#include <stdarg.h>
#include <stdio.h>
+static bool FMODE64_HACK = false;
+
static FILE *outfile;
static int outfile_indent = 0;
static int aga, outres, res, planes, modes, bplfmode, sprres, oddeven, ecsshres, genlock, ntsc, filtered, modetype;
+static int bplfmode64;
static int isbuf2 = 0;
static int maxplanes = 8;
static char funcnames[500000], funcnamesf[500000];
}
int p = planes < maxplanes ? planes : maxplanes;
- if (bplfmode == 2) {
+ if (bplfmode == 2 || bplfmode64) {
outf("loaded_pix = getbpl%d_64();", p);
} else if (bplfmode == 1) {
outf("loaded_pix = getbpl%d_32(); ", p);
}
int p = planes < maxplanes ? planes : maxplanes;
- if (bplfmode == 2) {
+ if (bplfmode == 2 || bplfmode64) {
outf("shiftbpl%d_64();", p);
} else {
outf("shiftbpl%d();", p);
add = 4;
}
if (add == 4) {
- if (bplfmode == 2) {
+ if (bplfmode == 2 || bplfmode64) {
outf("shiftbpl%d_64();", p);
} else {
outf("shiftbpl%d();", p);
outf("bplshiftcnt[0] += %d;", add);
outf("if (bplshiftcnt[0] >= 4) {");
outf("bplshiftcnt[0] = 0;");
- if (bplfmode == 2) {
+ if (bplfmode == 2 || bplfmode64) {
outf("shiftbpl%de_64();", p);
} else {
outf("shiftbpl%de();", p);
outf("bplshiftcnt[1] += %d;", add);
outf("if (bplshiftcnt[1] >= 4) {");
outf("bplshiftcnt[1] = 0;");
- if (bplfmode == 2) {
+ if (bplfmode == 2 || bplfmode64) {
outf("shiftbpl%do_64();", p);
} else {
outf("shiftbpl%do();", p);
outf("bplshiftcnt[0] += %d;", add);
outf("if (bplshiftcnt[0] >= 4) {");
outf("bplshiftcnt[0] = 0;");
- if (bplfmode == 2) {
+ if (bplfmode == 2 || bplfmode64) {
outf("shiftbpl%d_64();", p);
} else {
outf("shiftbpl%d();", p);
for (int i = 1; i <= 8; i++) {
if (planes >= i) {
if (oddeven == 0 || (oddeven == 1 && (i & 1)) || (oddeven == 2 && !(i & 1))) {
- if (bplfmode == 2) {
+ if (bplfmode == 2 || bplfmode64) {
outf("bplxdat3_64[%d] = bplxdat2_64[%d];", i - 1, i - 1);
} else {
outf("bplxdat3[%d] = bplxdat2[%d];", i - 1, i - 1);
if (oddeven) {
// bitplane shifter shifting
outf("if (bpldat_copy[0] && (denise_hcounter_cmp & %d) == bplcon1_shift[0]) { ", ((16 << bplfmode) >> res) - 1);
- if (bplfmode == 2) {
+ if (bplfmode == 2 || bplfmode64) {
outf("copybpl%de_64();", planes);
} else {
outf("copybpl%de();", planes);
}
outf("}");
outf("if (bpldat_copy[1] && (denise_hcounter_cmp & %d) == bplcon1_shift[1]) {", ((16 << bplfmode) >> res) - 1);
- if (bplfmode == 2) {
+ if (bplfmode == 2 || bplfmode64) {
outf("copybpl%do_64();", planes);
} else {
outf("copybpl%do();", planes);
} else {
// bitplane shifter shifting
outf("if (bpldat_copy[0] && (denise_hcounter_cmp & %d) == bplcon1_shift[0]) { ", ((16 << bplfmode) >> res) - 1);
- if (bplfmode == 2) {
+ if (bplfmode == 2 || bplfmode64) {
outf("copybpl%d_64();", planes);
} else {
outf("copybpl%d();", planes);
if (oddeven) {
// bitplane shifter shifting
outf("if (bpldat_copy[0] && ((cmp | %d) & %d) == bplcon1_shift_full_masked[0]) { ", add, (((16 << bplfmode) >> res) << 2) - 1);
- if (bplfmode == 2) {
+ if (bplfmode == 2 || bplfmode64) {
outf("copybpl%de_64();", planes);
} else {
outf("copybpl%de();", planes);
}
outf("}");
outf("if (bpldat_copy[1] && ((cmp | %d) & %d) == bplcon1_shift_full_masked[1]) {", add, (((16 << bplfmode) >> res) << 2) - 1);
- if (bplfmode == 2) {
+ if (bplfmode == 2 || bplfmode64) {
outf("copybpl%do_64();", planes);
} else {
outf("copybpl%do();", planes);
} else {
// bitplane shifter shifting
outf("if (bpldat_copy[0] && ((cmp | %d) & %d) == bplcon1_shift_full_masked[0]) { ", add, (((16 << bplfmode) >> res) << 2) - 1);
- if (bplfmode == 2) {
+ if (bplfmode == 2 || bplfmode64) {
outf("copybpl%d_64();", planes);
} else {
outf("copybpl%d();", planes);
{
char funcname[200];
- sprintf(funcname, "lts_%s_%s_%s%d_p%d_i%s_d%s%s%s%s%s",
+ sprintf(funcname, "lts_%s_%s%s_%s%d_p%d_i%s_d%s%s%s%s%s",
aga ? "aga" : "ecs",
bplfmode == 0 ? "fm0" : (bplfmode == 1 ? "fm1" : "fm2"),
+ bplfmode64 ? "_64" : "",
modes == 0 ? "n" : (modes == 1 ? "dpf" : (modes == 2 ? "ehb" : (modes == 4 ? "kehb" : "ham"))),
oddeven ? 1 : 0,
planes,
ntsc = -1;
modetype = 0;
- for (bplfmode = 0; bplfmode < 3; bplfmode++) {
+ for (bplfmode64 = 0; bplfmode64 < 2; bplfmode64++) {
- char tmp[100];
- sprintf(tmp, "../../linetoscr_aga_fm%d.cpp", bplfmode);
- set_outfile(tmp);
+ for (bplfmode = 0; bplfmode < 3; bplfmode++) {
- for (outres = 0; outres < 3; outres++) {
- for (res = 0; res < 3; res++) {
- for (int spr = 0; spr < 2; spr++) {
- sprres = spr == 0 ? -1 : 0;
- for (planes = 2; planes <= 8; planes += 2) {
- for (modes = 0; modes < 5; modes++) {
- for (oddeven = 0; oddeven < 2; oddeven++) {
- modetype = gen_head();
- if (modetype) {
- gen_start();
- gen_init();
- gen_pix_aga();
- gen_end();
- } else {
- gen_null();
- }
- gen_tail();
- filtered = 1;
- modetype = gen_head();
- if (modetype) {
- gen_start();
- gen_init();
- gen_pix_aga();
- gen_end();
- } else {
- gen_null();
+ if (bplfmode64 && bplfmode >= 2) {
+ continue;
+ }
+ if (bplfmode64 && !FMODE64_HACK) {
+ continue;
+ }
+
+ char tmp[100];
+ sprintf(tmp, "../../linetoscr_aga_fm%d%s.cpp", bplfmode, bplfmode64 ? "_64" : "");
+ set_outfile(tmp);
+
+ for (outres = 0; outres < 3; outres++) {
+ for (res = 0; res < 3; res++) {
+ for (int spr = 0; spr < 2; spr++) {
+ sprres = spr == 0 ? -1 : 0;
+ for (planes = 2; planes <= 8; planes += 2) {
+ for (modes = 0; modes < 5; modes++) {
+ for (oddeven = 0; oddeven < 2; oddeven++) {
+ modetype = gen_head();
+ if (modetype) {
+ gen_start();
+ gen_init();
+ gen_pix_aga();
+ gen_end();
+ } else {
+ gen_null();
+ }
+ gen_tail();
+ filtered = 1;
+ modetype = gen_head();
+ if (modetype) {
+ gen_start();
+ gen_init();
+ gen_pix_aga();
+ gen_end();
+ } else {
+ gen_null();
+ }
+ gen_tail();
+ filtered = 0;
}
- gen_tail();
- filtered = 0;
}
}
}
}
}
+
}
}
write_funcs("linetoscr_aga_funcs");
+ bplfmode64 = 0;
genlock = 1;
for (bplfmode = 0; bplfmode < 3; bplfmode++) {