mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2024-12-26 11:11:48 +01:00
Add 15bpp ABGR format
This commit is contained in:
parent
0db5c0da94
commit
9231103344
@ -143,7 +143,7 @@ INLINE void WRITE_LONG(void *address, uint32 data)
|
|||||||
atex = atex_table[(ATTR >> 29) & 7]; \
|
atex = atex_table[(ATTR >> 29) & 7]; \
|
||||||
src = (uint32 *)&bg_pattern_cache[((ATTR & 0x03FF0000) >> 9 | (ATTR & 0x18000000) >> 10 | (LINE)) ^ ((ATTR & 0x10000000) >> 22)];
|
src = (uint32 *)&bg_pattern_cache[((ATTR & 0x03FF0000) >> 9 | (ATTR & 0x18000000) >> 10 | (LINE)) ^ ((ATTR & 0x10000000) >> 22)];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
One column = 2 tiles
|
One column = 2 tiles
|
||||||
Two pattern attributes are written in VRAM as two consecutives 16-bit words:
|
Two pattern attributes are written in VRAM as two consecutives 16-bit words:
|
||||||
|
|
||||||
@ -264,7 +264,7 @@ INLINE void WRITE_LONG(void *address, uint32 data)
|
|||||||
/* This might be faster or slower than original method, depending on */
|
/* This might be faster or slower than original method, depending on */
|
||||||
/* architecture (x86, PowerPC), cache size, memory access speed, etc... */
|
/* architecture (x86, PowerPC), cache size, memory access speed, etc... */
|
||||||
|
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
#define DRAW_BG_TILE(SRC_A, SRC_B) \
|
#define DRAW_BG_TILE(SRC_A, SRC_B) \
|
||||||
*lb++ = table[((SRC_B << 8) & 0xff00) | (SRC_A & 0xff)]; \
|
*lb++ = table[((SRC_B << 8) & 0xff00) | (SRC_A & 0xff)]; \
|
||||||
*lb++ = table[(SRC_B & 0xff00) | ((SRC_A >> 8) & 0xff)]; \
|
*lb++ = table[(SRC_B & 0xff00) | ((SRC_A >> 8) & 0xff)]; \
|
||||||
@ -279,7 +279,7 @@ INLINE void WRITE_LONG(void *address, uint32 data)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef ALIGN_LONG
|
#ifdef ALIGN_LONG
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
#define DRAW_BG_COLUMN(ATTR, LINE, SRC_A, SRC_B) \
|
#define DRAW_BG_COLUMN(ATTR, LINE, SRC_A, SRC_B) \
|
||||||
GET_LSB_TILE(ATTR, LINE) \
|
GET_LSB_TILE(ATTR, LINE) \
|
||||||
SRC_A = READ_LONG((uint32 *)lb); \
|
SRC_A = READ_LONG((uint32 *)lb); \
|
||||||
@ -325,7 +325,7 @@ INLINE void WRITE_LONG(void *address, uint32 data)
|
|||||||
DRAW_BG_TILE(SRC_A, SRC_B) \
|
DRAW_BG_TILE(SRC_A, SRC_B) \
|
||||||
SRC_A = READ_LONG((uint32 *)lb); \
|
SRC_A = READ_LONG((uint32 *)lb); \
|
||||||
SRC_B = (src[1] | atex); \
|
SRC_B = (src[1] | atex); \
|
||||||
DRAW_BG_TILE(SRC_A, SRC_B)
|
DRAW_BG_TILE(SRC_A, SRC_B)
|
||||||
#define DRAW_BG_COLUMN_IM2(ATTR, LINE, SRC_A, SRC_B) \
|
#define DRAW_BG_COLUMN_IM2(ATTR, LINE, SRC_A, SRC_B) \
|
||||||
GET_MSB_TILE_IM2(ATTR, LINE) \
|
GET_MSB_TILE_IM2(ATTR, LINE) \
|
||||||
SRC_A = READ_LONG((uint32 *)lb); \
|
SRC_A = READ_LONG((uint32 *)lb); \
|
||||||
@ -343,7 +343,7 @@ INLINE void WRITE_LONG(void *address, uint32 data)
|
|||||||
DRAW_BG_TILE(SRC_A, SRC_B)
|
DRAW_BG_TILE(SRC_A, SRC_B)
|
||||||
#endif
|
#endif
|
||||||
#else /* NOT ALIGNED */
|
#else /* NOT ALIGNED */
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
#define DRAW_BG_COLUMN(ATTR, LINE, SRC_A, SRC_B) \
|
#define DRAW_BG_COLUMN(ATTR, LINE, SRC_A, SRC_B) \
|
||||||
GET_LSB_TILE(ATTR, LINE) \
|
GET_LSB_TILE(ATTR, LINE) \
|
||||||
SRC_A = *(uint32 *)(lb); \
|
SRC_A = *(uint32 *)(lb); \
|
||||||
@ -470,8 +470,11 @@ INLINE void WRITE_LONG(void *address, uint32 data)
|
|||||||
|
|
||||||
/* 5:5:5 RGB */
|
/* 5:5:5 RGB */
|
||||||
#elif defined(USE_15BPP_RENDERING)
|
#elif defined(USE_15BPP_RENDERING)
|
||||||
|
#if defined(USE_ABGR)
|
||||||
|
#define MAKE_PIXEL(r,g,b) ((1 << 15) | (b) << 11 | ((b) >> 3) << 10 | (g) << 6 | ((g) >> 3) << 5 | (r) << 1 | (r) >> 3)
|
||||||
|
#else
|
||||||
#define MAKE_PIXEL(r,g,b) ((1 << 15) | (r) << 11 | ((r) >> 3) << 10 | (g) << 6 | ((g) >> 3) << 5 | (b) << 1 | (b) >> 3)
|
#define MAKE_PIXEL(r,g,b) ((1 << 15) | (r) << 11 | ((r) >> 3) << 10 | (g) << 6 | ((g) >> 3) << 5 | (b) << 1 | (b) >> 3)
|
||||||
|
#endif
|
||||||
/* 5:6:5 RGB */
|
/* 5:6:5 RGB */
|
||||||
#elif defined(USE_16BPP_RENDERING)
|
#elif defined(USE_16BPP_RENDERING)
|
||||||
#define MAKE_PIXEL(r,g,b) ((r) << 12 | ((r) >> 3) << 11 | (g) << 7 | ((g) >> 2) << 5 | (b) << 1 | (b) >> 3)
|
#define MAKE_PIXEL(r,g,b) ((r) << 12 | ((r) >> 3) << 11 | (g) << 7 | ((g) >> 2) << 5 | (b) << 1 | (b) >> 3)
|
||||||
@ -573,7 +576,7 @@ static uint8 linebuf[2][0x200];
|
|||||||
static uint8 spr_ovr;
|
static uint8 spr_ovr;
|
||||||
|
|
||||||
/* Sprite parsing lists */
|
/* Sprite parsing lists */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint16 ypos;
|
uint16 ypos;
|
||||||
uint16 xpos;
|
uint16 xpos;
|
||||||
@ -620,7 +623,7 @@ static void make_name_lut(void)
|
|||||||
if ((vrow > height) || vcol > width)
|
if ((vrow > height) || vcol > width)
|
||||||
{
|
{
|
||||||
/* Invalid settings (unused) */
|
/* Invalid settings (unused) */
|
||||||
name_lut[i] = -1;
|
name_lut[i] = -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -691,8 +694,8 @@ static uint32 make_lut_bg(uint32 bx, uint32 ax)
|
|||||||
int bf = (bx & 0x7F);
|
int bf = (bx & 0x7F);
|
||||||
int bp = (bx & 0x40);
|
int bp = (bx & 0x40);
|
||||||
int b = (bx & 0x0F);
|
int b = (bx & 0x0F);
|
||||||
|
|
||||||
int af = (ax & 0x7F);
|
int af = (ax & 0x7F);
|
||||||
int ap = (ax & 0x40);
|
int ap = (ax & 0x40);
|
||||||
int a = (ax & 0x0F);
|
int a = (ax & 0x0F);
|
||||||
|
|
||||||
@ -712,8 +715,8 @@ static uint32 make_lut_bg_ste(uint32 bx, uint32 ax)
|
|||||||
int bf = (bx & 0x7F);
|
int bf = (bx & 0x7F);
|
||||||
int bp = (bx & 0x40);
|
int bp = (bx & 0x40);
|
||||||
int b = (bx & 0x0F);
|
int b = (bx & 0x0F);
|
||||||
|
|
||||||
int af = (ax & 0x7F);
|
int af = (ax & 0x7F);
|
||||||
int ap = (ax & 0x40);
|
int ap = (ax & 0x40);
|
||||||
int a = (ax & 0x0F);
|
int a = (ax & 0x0F);
|
||||||
|
|
||||||
@ -761,7 +764,7 @@ static uint32 make_lut_bgobj(uint32 bx, uint32 sx)
|
|||||||
int bs = (bx & 0x80);
|
int bs = (bx & 0x80);
|
||||||
int bp = (bx & 0x40);
|
int bp = (bx & 0x40);
|
||||||
int b = (bx & 0x0F);
|
int b = (bx & 0x0F);
|
||||||
|
|
||||||
int sf = (sx & 0x3F);
|
int sf = (sx & 0x3F);
|
||||||
int sp = (sx & 0x40);
|
int sp = (sx & 0x40);
|
||||||
int s = (sx & 0x0F);
|
int s = (sx & 0x0F);
|
||||||
@ -897,7 +900,7 @@ static uint32 make_lut_bgobj_ste(uint32 bx, uint32 sx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
c = (bf | bi);
|
c = (bf | bi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -914,7 +917,7 @@ static uint32 make_lut_bgobj_ste(uint32 bx, uint32 sx)
|
|||||||
static uint32 make_lut_bgobj_m4(uint32 bx, uint32 sx)
|
static uint32 make_lut_bgobj_m4(uint32 bx, uint32 sx)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
int bf = (bx & 0x3F);
|
int bf = (bx & 0x3F);
|
||||||
int bs = (bx & 0x80);
|
int bs = (bx & 0x80);
|
||||||
int bp = (bx & 0x20);
|
int bp = (bx & 0x20);
|
||||||
@ -971,7 +974,7 @@ static void palette_init(void)
|
|||||||
/* GG mode : xxxx (0-15) */
|
/* GG mode : xxxx (0-15) */
|
||||||
/* */
|
/* */
|
||||||
/* with x = original CRAM value (2, 3 or 4-bit) */
|
/* with x = original CRAM value (2, 3 or 4-bit) */
|
||||||
/* (*) 2-bit CRAM value is expanded to 4-bit */
|
/* (*) 2-bit CRAM value is expanded to 4-bit */
|
||||||
/************************************************/
|
/************************************************/
|
||||||
|
|
||||||
/* Initialize Mode 5 pixel color look-up tables */
|
/* Initialize Mode 5 pixel color look-up tables */
|
||||||
@ -1308,7 +1311,7 @@ void render_bg_m3(int line)
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
color = pg[*nt++ << 3];
|
color = pg[*nt++ << 3];
|
||||||
|
|
||||||
*lb++ = 0x10 | ((color >> 4) & 0x0F);
|
*lb++ = 0x10 | ((color >> 4) & 0x0F);
|
||||||
*lb++ = 0x10 | ((color >> 4) & 0x0F);
|
*lb++ = 0x10 | ((color >> 4) & 0x0F);
|
||||||
*lb++ = 0x10 | ((color >> 4) & 0x0F);
|
*lb++ = 0x10 | ((color >> 4) & 0x0F);
|
||||||
@ -1346,7 +1349,7 @@ void render_bg_m3x(int line)
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
color = pg[*nt++ << 3];
|
color = pg[*nt++ << 3];
|
||||||
|
|
||||||
*lb++ = 0x10 | ((color >> 4) & 0x0F);
|
*lb++ = 0x10 | ((color >> 4) & 0x0F);
|
||||||
*lb++ = 0x10 | ((color >> 4) & 0x0F);
|
*lb++ = 0x10 | ((color >> 4) & 0x0F);
|
||||||
*lb++ = 0x10 | ((color >> 4) & 0x0F);
|
*lb++ = 0x10 | ((color >> 4) & 0x0F);
|
||||||
@ -1394,10 +1397,10 @@ void render_bg_m4(int line)
|
|||||||
int column;
|
int column;
|
||||||
uint16 *nt;
|
uint16 *nt;
|
||||||
uint32 attr, atex, *src;
|
uint32 attr, atex, *src;
|
||||||
|
|
||||||
/* 32 x 8 pixels */
|
/* 32 x 8 pixels */
|
||||||
int width = 32;
|
int width = 32;
|
||||||
|
|
||||||
/* Horizontal scrolling */
|
/* Horizontal scrolling */
|
||||||
int index = ((reg[0] & 0x40) && (line < 0x10)) ? 0x100 : reg[0x08];
|
int index = ((reg[0] & 0x40) && (line < 0x10)) ? 0x100 : reg[0x08];
|
||||||
int shift = index & 7;
|
int shift = index & 7;
|
||||||
@ -1422,7 +1425,7 @@ void render_bg_m4(int line)
|
|||||||
{
|
{
|
||||||
/* Vertical scroll mask */
|
/* Vertical scroll mask */
|
||||||
v_line = v_line % 256;
|
v_line = v_line % 256;
|
||||||
|
|
||||||
/* Pattern name Table */
|
/* Pattern name Table */
|
||||||
nt = (uint16 *)&vram[(0x3700 & nt_mask) + ((v_line >> 3) << 6)];
|
nt = (uint16 *)&vram[(0x3700 & nt_mask) + ((v_line >> 3) << 6)];
|
||||||
}
|
}
|
||||||
@ -1727,7 +1730,7 @@ void render_bg_m5_vs(int line)
|
|||||||
atbuf = nt[index & pf_col_mask];
|
atbuf = nt[index & pf_col_mask];
|
||||||
DRAW_COLUMN(atbuf, v_line)
|
DRAW_COLUMN(atbuf, v_line)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (w == (line >= a))
|
if (w == (line >= a))
|
||||||
{
|
{
|
||||||
/* Window takes up entire line */
|
/* Window takes up entire line */
|
||||||
@ -1755,7 +1758,7 @@ void render_bg_m5_vs(int line)
|
|||||||
#else
|
#else
|
||||||
shift = (xscroll >> 16) & 0x0F;
|
shift = (xscroll >> 16) & 0x0F;
|
||||||
index = pf_col_mask + start + 1 - ((xscroll >> 20) & pf_col_mask);
|
index = pf_col_mask + start + 1 - ((xscroll >> 20) & pf_col_mask);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(shift)
|
if(shift)
|
||||||
{
|
{
|
||||||
@ -2315,7 +2318,7 @@ void render_bg_m5(int line)
|
|||||||
|
|
||||||
/* Plane B name table */
|
/* Plane B name table */
|
||||||
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
||||||
|
|
||||||
/* Pattern row index */
|
/* Pattern row index */
|
||||||
v_line = (v_line & 7) << 3;
|
v_line = (v_line & 7) << 3;
|
||||||
|
|
||||||
@ -2330,7 +2333,7 @@ void render_bg_m5(int line)
|
|||||||
atbuf = nt[(index-1) & pf_col_mask];
|
atbuf = nt[(index-1) & pf_col_mask];
|
||||||
DRAW_BG_COLUMN(atbuf, v_line, xscroll, yscroll)
|
DRAW_BG_COLUMN(atbuf, v_line, xscroll, yscroll)
|
||||||
}
|
}
|
||||||
|
|
||||||
for(column = 0; column < width; column++, index++)
|
for(column = 0; column < width; column++, index++)
|
||||||
{
|
{
|
||||||
atbuf = nt[index & pf_col_mask];
|
atbuf = nt[index & pf_col_mask];
|
||||||
@ -2555,7 +2558,7 @@ void render_bg_m5_im2(int line)
|
|||||||
|
|
||||||
/* Window vertical range (cell 0-31) */
|
/* Window vertical range (cell 0-31) */
|
||||||
int a = (reg[18] & 0x1F) << 3;
|
int a = (reg[18] & 0x1F) << 3;
|
||||||
|
|
||||||
/* Window position (0=top, 1=bottom) */
|
/* Window position (0=top, 1=bottom) */
|
||||||
int w = (reg[18] >> 7) & 1;
|
int w = (reg[18] >> 7) & 1;
|
||||||
|
|
||||||
@ -2714,7 +2717,7 @@ void render_bg_m5_im2_vs(int line)
|
|||||||
|
|
||||||
/* Window vertical range (cell 0-31) */
|
/* Window vertical range (cell 0-31) */
|
||||||
uint32 a = (reg[18] & 0x1F) << 3;
|
uint32 a = (reg[18] & 0x1F) << 3;
|
||||||
|
|
||||||
/* Window position (0=top, 1=bottom) */
|
/* Window position (0=top, 1=bottom) */
|
||||||
uint32 w = (reg[18] >> 7) & 1;
|
uint32 w = (reg[18] >> 7) & 1;
|
||||||
|
|
||||||
@ -3037,7 +3040,7 @@ void render_obj_m4(int line)
|
|||||||
|
|
||||||
/* Default sprite width */
|
/* Default sprite width */
|
||||||
int width = 8;
|
int width = 8;
|
||||||
|
|
||||||
/* Sprite Generator address mask (LSB is masked for 8x16 sprites) */
|
/* Sprite Generator address mask (LSB is masked for 8x16 sprites) */
|
||||||
uint16 sg_mask = (~0x1C0 ^ (reg[6] << 6)) & (~((reg[1] & 0x02) >> 1));
|
uint16 sg_mask = (~0x1C0 ^ (reg[6] << 6)) & (~((reg[1] & 0x02) >> 1));
|
||||||
|
|
||||||
@ -3099,7 +3102,7 @@ void render_obj_m4(int line)
|
|||||||
{
|
{
|
||||||
/* Draw sprite pattern (zoomed sprites are rendered at half speed) */
|
/* Draw sprite pattern (zoomed sprites are rendered at half speed) */
|
||||||
DRAW_SPRITE_TILE_ACCURATE_2X(end,0,lut[5])
|
DRAW_SPRITE_TILE_ACCURATE_2X(end,0,lut[5])
|
||||||
|
|
||||||
/* 315-5124 VDP specific */
|
/* 315-5124 VDP specific */
|
||||||
if (system_hw < SYSTEM_SMS2)
|
if (system_hw < SYSTEM_SMS2)
|
||||||
{
|
{
|
||||||
@ -3697,7 +3700,7 @@ void parse_satb_m4(int line)
|
|||||||
|
|
||||||
/* Y position */
|
/* Y position */
|
||||||
int ypos;
|
int ypos;
|
||||||
|
|
||||||
/* Sprite list for next line */
|
/* Sprite list for next line */
|
||||||
object_info_t *object_info = obj_info[(line + 1) & 1];
|
object_info_t *object_info = obj_info[(line + 1) & 1];
|
||||||
|
|
||||||
@ -3837,11 +3840,11 @@ void parse_satb_m5(int line)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update sprite list (only name, attribute & xpos are parsed from VRAM) */
|
/* Update sprite list (only name, attribute & xpos are parsed from VRAM) */
|
||||||
object_info->attr = p[link + 2];
|
object_info->attr = p[link + 2];
|
||||||
object_info->xpos = p[link + 3] & 0x1ff;
|
object_info->xpos = p[link + 3] & 0x1ff;
|
||||||
object_info->ypos = ypos;
|
object_info->ypos = ypos;
|
||||||
object_info->size = size & 0x0f;
|
object_info->size = size & 0x0f;
|
||||||
|
|
||||||
/* Increment Sprite count */
|
/* Increment Sprite count */
|
||||||
++count;
|
++count;
|
||||||
@ -3851,7 +3854,7 @@ void parse_satb_m5(int line)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read link data from internal SAT cache */
|
/* Read link data from internal SAT cache */
|
||||||
link = (q[link + 1] & 0x7F) << 2;
|
link = (q[link + 1] & 0x7F) << 2;
|
||||||
|
|
||||||
/* Stop parsing if link data points to first entry (#0) or after the last entry (#64 in H32 mode, #80 in H40 mode) */
|
/* Stop parsing if link data points to first entry (#0) or after the last entry (#64 in H32 mode, #80 in H40 mode) */
|
||||||
|
@ -51,11 +51,17 @@
|
|||||||
|
|
||||||
/* 5:5:5 RGB */
|
/* 5:5:5 RGB */
|
||||||
#elif defined(USE_15BPP_RENDERING)
|
#elif defined(USE_15BPP_RENDERING)
|
||||||
|
#if defined(USE_ABGR)
|
||||||
|
#define PIXEL(r,g,b) ((1 << 15) | ((b) << 10) | ((g) << 5) | (r))
|
||||||
|
#define GET_B(pixel) (((pixel) & 0x7c00) >> 10)
|
||||||
|
#define GET_G(pixel) (((pixel) & 0x03e0) >> 5)
|
||||||
|
#define GET_R(pixel) (((pixel) & 0x001f) >> 0)
|
||||||
|
#else
|
||||||
#define PIXEL(r,g,b) ((1 << 15) | ((r) << 10) | ((g) << 5) | (b))
|
#define PIXEL(r,g,b) ((1 << 15) | ((r) << 10) | ((g) << 5) | (b))
|
||||||
#define GET_R(pixel) (((pixel) & 0x7c00) >> 10)
|
#define GET_R(pixel) (((pixel) & 0x7c00) >> 10)
|
||||||
#define GET_G(pixel) (((pixel) & 0x03e0) >> 5)
|
#define GET_G(pixel) (((pixel) & 0x03e0) >> 5)
|
||||||
#define GET_B(pixel) (((pixel) & 0x001f) >> 0)
|
#define GET_B(pixel) (((pixel) & 0x001f) >> 0)
|
||||||
|
#endif
|
||||||
/* 5:6:5 RGB */
|
/* 5:6:5 RGB */
|
||||||
#elif defined(USE_16BPP_RENDERING)
|
#elif defined(USE_16BPP_RENDERING)
|
||||||
#define PIXEL(r,g,b) (((r) << 11) | ((g) << 5) | (b))
|
#define PIXEL(r,g,b) (((r) << 11) | ((g) << 5) | (b))
|
||||||
@ -134,4 +140,3 @@ extern void (*parse_satb)(int line);
|
|||||||
extern void (*update_bg_pattern_cache)(int index);
|
extern void (*update_bg_pattern_cache)(int index);
|
||||||
|
|
||||||
#endif /* _RENDER_H_ */
|
#endif /* _RENDER_H_ */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user