#define BG_COLOR_DEBUG 0
//#define XLINECHECK
+typedef enum
+{
+ CMODE_NORMAL,
+ CMODE_DUALPF,
+ CMODE_EXTRAHB,
+ CMODE_EXTRAHB_ECS_KILLEHB,
+ CMODE_HAM
+} CMODE_T;
+
extern int sprite_buffer_res;
static int lores_factor;
int lores_shift;
/* These are generated by the drawing code from the line_decisions array for
each line that needs to be drawn. These are basically extracted out of
bit fields in the hardware registers. */
-static int bplehb, bplham, bpldualpf, bpldualpfpri, bpldualpf2of, bplplanecnt, ecsshres;
+static int bplmode, bplehb, bplham, bpldualpf, bpldualpfpri;
+static int bpldualpf2of, bplplanecnt, ecsshres;
static int bplbypass, bplcolorburst, bplcolorburst_field;
static bool issprites;
static int bplres;
flush_screen (vb, 0, 0); /* vsync mode */
}
+static void setbplmode(void)
+{
+ if (bplham)
+ bplmode = CMODE_HAM;
+ else if (bpldualpf)
+ bplmode = CMODE_DUALPF;
+ else if (bplehb > 0)
+ bplmode = CMODE_EXTRAHB;
+ else if (bplehb < 0)
+ bplmode = CMODE_EXTRAHB_ECS_KILLEHB;
+ else
+ bplmode = CMODE_NORMAL;
+}
+
/* We only save hardware registers during the hardware frame. Now, when
* drawing the frame, we expand the data into a slightly more useful
* form. */
bplplanecnt = dp_for_drawing->nr_planes;
bplham = dp_for_drawing->ham_seen;
bplehb = dp_for_drawing->ehb_seen;
- if ((currprefs.chipset_mask & CSMASK_ECS_DENISE) && (dp_for_drawing->bplcon2 & 0x0200))
+ if ((currprefs.chipset_mask & CSMASK_ECS_DENISE) && (dp_for_drawing->bplcon2 & 0x0200)) {
bplehb = 0;
+ if (!(currprefs.chipset_mask & CSMASK_AGA))
+ bplehb = -1;
+ }
issprites = dip_for_drawing->nr_sprites > 0;
bplcolorburst = (dp_for_drawing->bplcon0 & 0x200) != 0;
if (!bplcolorburst)
}
if (pfield_mode_changed)
pfield_set_linetoscr();
+
+ setbplmode();
}
static bool isham (uae_u16 bplcon0)
hposblank = ohposblank;
ham_decode_pixel = src_pixel;
bplham = dp_for_drawing->ham_at_start;
+ setbplmode();
}
if (dip_for_drawing->nr_sprites) {
CMODE_NORMAL,
CMODE_DUALPF,
CMODE_EXTRAHB,
+ CMODE_EXTRAHB_ECS_KILLEHB,
CMODE_HAM
} CMODE_T;
#define CMODE_MAX CMODE_HAM
outln ( " } else");
outln ( " dpix_val = p_acolors[spix_val];");
} else if (cmode == CMODE_EXTRAHB) {
- outln ( " if (spix_val <= 31)");
- outln ( " dpix_val = p_acolors[spix_val];");
- outln ( " else");
- outln ( " dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777];");
+ outln(" if (spix_val <= 31)");
+ outln(" dpix_val = p_acolors[spix_val];");
+ outln(" else");
+ outln(" dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777];");
+ } else if (cmode == CMODE_EXTRAHB_ECS_KILLEHB) {
+ outln(" dpix_val = p_acolors[spix_val & 31];");
} else
outln ( " dpix_val = p_acolors[spix_val];");
}
outln ( "");
if (spr >= 0) {
- outln ( " if (bplham) {");
+ outln(" switch(bplmode)");
+ outln(" {");
+ outln(" case CMODE_NORMAL:");
+ outln(" {");
+ out_linetoscr_mode(bpp, hmode, aga, spr, CMODE_NORMAL, genlock);
+ outln(" }");
+ outln(" break;");
+ outln(" case CMODE_HAM:");
+ outln(" {");
out_linetoscr_mode(bpp, hmode, aga, spr, CMODE_HAM, genlock);
- outln ( " } else if (bpldualpf) {");
+ outln(" }");
+ outln(" break;");
+ outln(" case CMODE_DUALPF:");
+ outln(" {");
out_linetoscr_mode(bpp, hmode, aga, spr, CMODE_DUALPF, genlock);
- outln ( " } else if (bplehb) {");
+ outln(" }");
+ outln(" break;");
+ outln(" case CMODE_EXTRAHB:");
+ outln(" {");
out_linetoscr_mode(bpp, hmode, aga, spr, CMODE_EXTRAHB, genlock);
- outln ( " } else {");
- out_linetoscr_mode(bpp, hmode, aga, spr, CMODE_NORMAL, genlock);
+ outln(" }");
+ outln(" break;");
+ if (!aga) {
+ // ECS Denise with KILLEHB set
+ outln(" case CMODE_EXTRAHB_ECS_KILLEHB:");
+ outln(" {");
+ out_linetoscr_mode(bpp, hmode, aga, spr, CMODE_EXTRAHB_ECS_KILLEHB, genlock);
+ outln(" }");
+ outln(" break;");
+ }
} else {
outln ( " if (1) {");
out_linetoscr_mode(bpp, hmode, aga, spr, CMODE_NORMAL, genlock);