1
0
mirror of synced 2026-02-27 08:49:18 +00:00

add support for alu/mode used by 501-2253/2325 PROMs

This commit is contained in:
Romain Dolbeau
2022-01-08 10:30:59 +01:00
parent 2aec1af733
commit 7fb915237d

View File

@@ -24,29 +24,7 @@
#define BASE_FBC 0x00700000 // mandated by CG6 compatibility
#if 0
static inline unsigned_param_type mul_768(const unsigned_param_type a) {
unsigned_param_type b = a + a;
b = b + a; // a * 3
b = b + b; // a * 6
b = b + b; // a * 12
b = b + b; // a * 24
b = b + b; // a * 48
b = b + b; // a * 96
b = b + b; // a * 192
b = b + b; // a * 384
b = b + b; // a * 768
return b;
}
#else
#define mul_768(a) (a * 768)
#endif
#if HRES == 768
#define mul_HRES(a) mul_768(a)
#else
#define mul_HRES(a) (a * HRES)
#endif
#define mul_HRES(a) ((a) * HRES)
//typedef void (*boot_t)(void);
//typedef void (*start_t)(unsigned short, unsigned short, unsigned short, unsigned short, unsigned short, unsigned short, unsigned short, unsigned short);
@@ -122,6 +100,15 @@ struct control_blitter {
| 0x00000600 /* GX_BREAD_ALL */ \
| 0x00000180 /* GX_BDISP_ALL */ \
)
#define CG6_ROMMODE ( \
0x00200000 /* GX_BLIT_SRC */ \
| 0x00020000 /* GX_MODE_COLOR8 */ \
| 0x00008000 /* GX_DRAW_RENDER */ \
| 0x00001000 /* GX_BWRITE1_DISABLE */ \
| 0x00000400 /* GX_BREAD_1 */ \
| 0x00000100 /* GX_BDISP_1 */ \
| 0x00000040 /* GX_INDEX_MOD */ \
)
/* Value for the alu register for screen-to-screen copies */
#define CG6_ALU_COPY ( \
@@ -159,6 +146,19 @@ struct control_blitter {
| 0x00005555 /* ALU = ~dst */ \
)
/* Value for the alu register used by 501-2325 ROM for BLIT */
#define CG6_ALU_ROMBLIT ( \
0x80000000 /* GX_PLANE_ONES (ignore planemask register) */ \
| 0x20000000 /* GX_PIXEL_ONES (ignore pixelmask register) */ \
| 0x00800000 /* GX_ATTR_SUPP (function unknown) */ \
| 0x00000000 /* GX_RAST_BOOL (function unknown) */ \
| 0x00000000 /* GX_PLOT_PLOT (function unknown) */ \
| 0x08000000 /* GX_PATTERN_ONES (ignore pattern) */ \
| 0x01000000 /* GX_POLYG_OVERLAP (unsure - handle overlap?) */ \
| 0x00006c60 /* ALU = ??? */ \
)
/* rasterops */
#define GX_ROP_CLEAR 0x0
#define GX_ROP_INVERT 0x1
@@ -446,8 +446,8 @@ asm(".global _start\n"
".type _start, @function\n"
);
#define imax(a,b) ((a>b)?(a):(b))
#define imin(a,b) ((a<b)?(a):(b))
#define imax(a,b) (((a)>(b))?(a):(b))
#define imin(a,b) (((a)<(b))?(a):(b))
//#define TRACE_ON_SCREEN
@@ -476,6 +476,21 @@ void from_reset(void) {
switch (cmd & 0xF) {
case FUN_DRAW: {
switch (alu) {
case CG6_ALU_ROMBLIT: // ____6c60 ROM -> ????
{
switch (mode) {
case (GX_BLIT_SRC | GX_MODE_COLOR8 | GX_DRAW_RENDER | GX_BWRITE1_DISABLE | GX_BREAD_1 | GX_BDISP_1 | GX_INDEX_MOD ):
rectfill(fbc->fbc_arectx_prev,
fbc->fbc_arecty_prev,
1 + fbc->fbc_arectx - fbc->fbc_arectx_prev,
1 + fbc->fbc_arecty - fbc->fbc_arecty_prev,
fbc->fbc_fg);
break;
default:
SHOW_PC_2VAL(alu, mode);
break;
}
} break;
case CG6_ALU_FILL: // ____ff00 console
case CG6_ALU_COPY: // ____cccc equivalent to fill if patterns == 1 (... which is the case with GX_PATTERN_ONES)
case ROP_FILL(GX_ROP_CLEAR, GX_ROP_SET): // ____ff00 Draw/GXcopy in X11
@@ -549,6 +564,27 @@ void from_reset(void) {
case FUN_BLIT: {
switch (alu)
{
case CG6_ALU_ROMBLIT: // ____6c60 ROM -> ????
{
switch (mode) {
case (GX_BLIT_SRC | GX_MODE_COLOR8 | GX_DRAW_RENDER | GX_BWRITE1_DISABLE | GX_BREAD_1 | GX_BDISP_1 | GX_INDEX_MOD ):
{
const unsigned_param_type xs = fbc->fbc_x0;
const unsigned_param_type ys = fbc->fbc_y0;
const unsigned_param_type wi = fbc->fbc_x1 - xs + 1;
const unsigned_param_type re = fbc->fbc_y1 - ys + 1;
const unsigned_param_type xd = fbc->fbc_x2;
const unsigned_param_type yd = fbc->fbc_y2;
const unsigned_param_type wi_dup = fbc->fbc_x3 - xd + 1;
const unsigned_param_type re_dup = fbc->fbc_y3 - yd + 1;
bitblit(xs, ys, wi, re, xd, yd, 0xFF, 0x3); // GXcopy
}
break;
default:
SHOW_PC_2VAL(alu, mode);
break;
}
} break;
case CG6_ALU_COPY: // ____cccc console -> put the src
case ROP_BLIT(GX_ROP_CLEAR, GX_ROP_SET): // ____ff00 Blit/GXcopy in X11 -> put 1 if src is 1, put 0 if src is 0 (!)
{
@@ -1181,8 +1217,8 @@ static void invert(const unsigned_param_type xd,
unsigned int i, j; \
unsigned char *sptr = (((unsigned char *)BASE_FB) + mul_HRES(ys) + xs); \
unsigned char *dptr = (((unsigned char *)BASE_FB) + mul_HRES(yd) + xd); \
unsigned char *sptr_line = sptr + mul_HRES((re-1)); \
unsigned char *dptr_line = dptr + mul_HRES((re-1)); \
unsigned char *sptr_line = sptr + mul_HRES(re-1); \
unsigned char *dptr_line = dptr + mul_HRES(re-1); \
const unsigned char npm = ~pm; \
\
for (j = 0 ; j < re ; j++) { \
@@ -1303,8 +1339,8 @@ static void bitblit_bwd_bwd_copy(const unsigned_param_type xs,
unsigned int i, j;
unsigned char *sptr = (((unsigned char *)BASE_FB) + mul_HRES(ys) + xs);
unsigned char *dptr = (((unsigned char *)BASE_FB) + mul_HRES(yd) + xd);
unsigned char *sptr_line = sptr + mul_HRES((re-1));
unsigned char *dptr_line = dptr + mul_HRES((re-1));
unsigned char *sptr_line = sptr + mul_HRES(re-1);
unsigned char *dptr_line = dptr + mul_HRES(re-1);
// flush_cache(); // handled in boot()
@@ -1372,7 +1408,7 @@ static void show_status_on_screen(void) {
unsigned int alu = fbc->fbc_alu;
unsigned int mode = fbc->fbc_mode;
unsigned int bx = 0;
unsigned int by = 768 + ((cmd & 0xF)*32);
unsigned int by = 640 + ((cmd & 0xF)*32);
unsigned char* base_fb = (((unsigned char *)BASE_FB) + mul_HRES(by) + bx);
print_hex(cmd & 0xF, base_fb);