mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2024-12-27 03:31:49 +01:00
added CUSTOM_BLITTER define, no need for NGC specific rendering code inside core anymore
This commit is contained in:
parent
a45cf8861f
commit
38dcd29a66
@ -27,7 +27,7 @@ INCLUDES := source source/m68k source/z80 source/sound source/ntsc source/input_
|
|||||||
# options for code generation
|
# options for code generation
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
|
|
||||||
CFLAGS = -O3 -fomit-frame-pointer --param large-function-growth=800 --param inline-unit-growth=200 -Wall -Winline -Wno-strict-aliasing $(MACHDEP) $(INCLUDE) -DUSE_16BPP_RENDERING -DALT_RENDERER -DNGC
|
CFLAGS = -O3 -fomit-frame-pointer --param large-function-growth=800 --param inline-unit-growth=200 -Wall -Winline -Wno-strict-aliasing $(MACHDEP) $(INCLUDE) -DUSE_16BPP_RENDERING -DALT_RENDERER
|
||||||
CXXFLAGS = $(CFLAGS)
|
CXXFLAGS = $(CFLAGS)
|
||||||
|
|
||||||
LDFLAGS = $(MACHDEP) -Wl,-Map,$(notdir $@).map
|
LDFLAGS = $(MACHDEP) -Wl,-Map,$(notdir $@).map
|
||||||
|
@ -27,7 +27,7 @@ INCLUDES := source source/m68k source/z80 source/sound source/ntsc source/input_
|
|||||||
# options for code generation
|
# options for code generation
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
|
|
||||||
CFLAGS = -O3 -fomit-frame-pointer --param large-function-growth=800 --param inline-unit-growth=200 -Wall -Winline -Wno-strict-aliasing $(MACHDEP) $(INCLUDE) -DUSE_16BPP_RENDERING -DALT_RENDERER -DNGC -DHW_RVL
|
CFLAGS = -O3 -fomit-frame-pointer --param large-function-growth=800 --param inline-unit-growth=200 -Wall -Winline -Wno-strict-aliasing $(MACHDEP) $(INCLUDE) -DUSE_16BPP_RENDERING -DALT_RENDERER -DHW_RVL
|
||||||
CXXFLAGS = $(CFLAGS)
|
CXXFLAGS = $(CFLAGS)
|
||||||
|
|
||||||
LDFLAGS = $(MACHDEP) -Wl,-Map,$(notdir $@).map
|
LDFLAGS = $(MACHDEP) -Wl,-Map,$(notdir $@).map
|
||||||
|
@ -1416,7 +1416,7 @@ void gx_video_Start(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* When VSYNC is forced ON or AUTO with TV mode matching emulated video mode, emulation is synchronized with video hardware */
|
/* When VSYNC is forced ON or AUTO with TV mode matching emulated video mode, emulation is synchronized with video hardware */
|
||||||
if ((config.vsync == 1) && (gc_pal == vdp_pal))
|
if (config.vsync && (gc_pal == vdp_pal))
|
||||||
{
|
{
|
||||||
/* VSYNC callback */
|
/* VSYNC callback */
|
||||||
VIDEO_SetPreRetraceCallback(vi_callback);
|
VIDEO_SetPreRetraceCallback(vi_callback);
|
||||||
@ -1741,3 +1741,147 @@ void gx_video_Shutdown(void)
|
|||||||
VIDEO_Flush();
|
VIDEO_Flush();
|
||||||
VIDEO_WaitVSync();
|
VIDEO_WaitVSync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Custom NTSC blitters */
|
||||||
|
typedef unsigned short sms_ntsc_out_t;
|
||||||
|
typedef unsigned short md_ntsc_out_t;
|
||||||
|
|
||||||
|
void sms_ntsc_blit( sms_ntsc_t const* ntsc, SMS_NTSC_IN_T const* table, unsigned char* input,
|
||||||
|
int in_width, int vline)
|
||||||
|
{
|
||||||
|
int const chunk_count = in_width / sms_ntsc_in_chunk;
|
||||||
|
|
||||||
|
/* handle extra 0, 1, or 2 pixels by placing them at beginning of row */
|
||||||
|
int const in_extra = in_width - chunk_count * sms_ntsc_in_chunk;
|
||||||
|
unsigned const extra2 = (unsigned) -(in_extra >> 1 & 1); /* (unsigned) -1 = ~0 */
|
||||||
|
unsigned const extra1 = (unsigned) -(in_extra & 1) | extra2;
|
||||||
|
|
||||||
|
/* use palette entry 0 for unused pixels */
|
||||||
|
SMS_NTSC_IN_T border = table[0];
|
||||||
|
|
||||||
|
SMS_NTSC_BEGIN_ROW( ntsc, border,
|
||||||
|
(SMS_NTSC_ADJ_IN( table[input[0]] )) & extra2,
|
||||||
|
(SMS_NTSC_ADJ_IN( table[input[extra2 & 1]] )) & extra1 );
|
||||||
|
|
||||||
|
/* directly fill the RGB565 texture */
|
||||||
|
/* one tile is 32 byte = 4x4 pixels */
|
||||||
|
/* tiles are stored continuously in texture memory */
|
||||||
|
in_width = SMS_NTSC_OUT_WIDTH(in_width) / 4;
|
||||||
|
int offset = ((in_width * 32) * (vline / 4)) + ((vline & 3) * 8);
|
||||||
|
sms_ntsc_out_t* __restrict__ line_out = (sms_ntsc_out_t*)(texturemem + offset);
|
||||||
|
offset = 0;
|
||||||
|
|
||||||
|
int n;
|
||||||
|
input += in_extra;
|
||||||
|
|
||||||
|
for ( n = chunk_count; n; --n )
|
||||||
|
{
|
||||||
|
/* order of input and output pixels must not be altered */
|
||||||
|
SMS_NTSC_COLOR_IN( 0, ntsc, SMS_NTSC_ADJ_IN( table[*input++] ) );
|
||||||
|
SMS_NTSC_RGB_OUT( 0, line_out[offset++] );
|
||||||
|
if ((offset % 4) == 0) offset += 12;
|
||||||
|
SMS_NTSC_RGB_OUT( 1, line_out[offset++] );
|
||||||
|
if ((offset % 4) == 0) offset += 12;
|
||||||
|
|
||||||
|
SMS_NTSC_COLOR_IN( 1, ntsc, SMS_NTSC_ADJ_IN( table[*input++] ) );
|
||||||
|
SMS_NTSC_RGB_OUT( 2, line_out[offset++] );
|
||||||
|
if ((offset % 4) == 0) offset += 12;
|
||||||
|
SMS_NTSC_RGB_OUT( 3, line_out[offset++] );
|
||||||
|
if ((offset % 4) == 0) offset += 12;
|
||||||
|
|
||||||
|
SMS_NTSC_COLOR_IN( 2, ntsc, SMS_NTSC_ADJ_IN( table[*input++] ) );
|
||||||
|
SMS_NTSC_RGB_OUT( 4, line_out[offset++] );
|
||||||
|
if ((offset % 4) == 0) offset += 12;
|
||||||
|
SMS_NTSC_RGB_OUT( 5, line_out[offset++] );
|
||||||
|
if ((offset % 4) == 0) offset += 12;
|
||||||
|
SMS_NTSC_RGB_OUT( 6, line_out[offset++] );
|
||||||
|
if ((offset % 4) == 0) offset += 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* finish final pixels */
|
||||||
|
SMS_NTSC_COLOR_IN( 0, ntsc, border );
|
||||||
|
SMS_NTSC_RGB_OUT( 0, line_out[offset++] );
|
||||||
|
if ((offset % 4) == 0) offset += 12;
|
||||||
|
SMS_NTSC_RGB_OUT( 1, line_out[offset++] );
|
||||||
|
if ((offset % 4) == 0) offset += 12;
|
||||||
|
|
||||||
|
SMS_NTSC_COLOR_IN( 1, ntsc, border );
|
||||||
|
SMS_NTSC_RGB_OUT( 2, line_out[offset++] );
|
||||||
|
if ((offset % 4) == 0) offset += 12;
|
||||||
|
SMS_NTSC_RGB_OUT( 3, line_out[offset++] );
|
||||||
|
if ((offset % 4) == 0) offset += 12;
|
||||||
|
|
||||||
|
SMS_NTSC_COLOR_IN( 2, ntsc, border );
|
||||||
|
SMS_NTSC_RGB_OUT( 4, line_out[offset++] );
|
||||||
|
if ((offset % 4) == 0) offset += 12;
|
||||||
|
SMS_NTSC_RGB_OUT( 5, line_out[offset++] );
|
||||||
|
if ((offset % 4) == 0) offset += 12;
|
||||||
|
SMS_NTSC_RGB_OUT( 6, line_out[offset++] );
|
||||||
|
if ((offset % 4) == 0) offset += 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
void md_ntsc_blit( md_ntsc_t const* ntsc, MD_NTSC_IN_T const* table, unsigned char* input,
|
||||||
|
int in_width, int vline)
|
||||||
|
{
|
||||||
|
int const chunk_count = in_width / md_ntsc_in_chunk - 1;
|
||||||
|
|
||||||
|
/* use palette entry 0 for unused pixels */
|
||||||
|
MD_NTSC_IN_T border = table[0];
|
||||||
|
|
||||||
|
MD_NTSC_BEGIN_ROW( ntsc, border,
|
||||||
|
MD_NTSC_ADJ_IN( table[*input++] ),
|
||||||
|
MD_NTSC_ADJ_IN( table[*input++] ),
|
||||||
|
MD_NTSC_ADJ_IN( table[*input++] ) );
|
||||||
|
|
||||||
|
/* directly fill the RGB565 texture */
|
||||||
|
/* one tile is 32 byte = 4x4 pixels */
|
||||||
|
/* tiles are stored continuously in texture memory */
|
||||||
|
in_width = MD_NTSC_OUT_WIDTH(in_width) >> 2;
|
||||||
|
int offset = ((in_width << 5) * (vline >> 2)) + ((vline & 3) * 8);
|
||||||
|
md_ntsc_out_t* __restrict__ line_out = (md_ntsc_out_t*)(texturemem + offset);
|
||||||
|
|
||||||
|
int n;
|
||||||
|
|
||||||
|
for ( n = chunk_count; n; --n )
|
||||||
|
{
|
||||||
|
/* order of input and output pixels must not be altered */
|
||||||
|
MD_NTSC_COLOR_IN( 0, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) );
|
||||||
|
MD_NTSC_RGB_OUT( 0, *line_out++ );
|
||||||
|
MD_NTSC_RGB_OUT( 1, *line_out++ );
|
||||||
|
|
||||||
|
MD_NTSC_COLOR_IN( 1, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) );
|
||||||
|
MD_NTSC_RGB_OUT( 2, *line_out++ );
|
||||||
|
MD_NTSC_RGB_OUT( 3, *line_out++ );
|
||||||
|
|
||||||
|
line_out += 12;
|
||||||
|
|
||||||
|
MD_NTSC_COLOR_IN( 2, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) );
|
||||||
|
MD_NTSC_RGB_OUT( 4, *line_out++ );
|
||||||
|
MD_NTSC_RGB_OUT( 5, *line_out++ );
|
||||||
|
|
||||||
|
MD_NTSC_COLOR_IN( 3, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) );
|
||||||
|
MD_NTSC_RGB_OUT( 6, *line_out++ );
|
||||||
|
MD_NTSC_RGB_OUT( 7, *line_out++ );
|
||||||
|
|
||||||
|
line_out += 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* finish final pixels */
|
||||||
|
MD_NTSC_COLOR_IN( 0, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) );
|
||||||
|
MD_NTSC_RGB_OUT( 0, *line_out++ );
|
||||||
|
MD_NTSC_RGB_OUT( 1, *line_out++ );
|
||||||
|
|
||||||
|
MD_NTSC_COLOR_IN( 1, ntsc, border );
|
||||||
|
MD_NTSC_RGB_OUT( 2, *line_out++ );
|
||||||
|
MD_NTSC_RGB_OUT( 3, *line_out++ );
|
||||||
|
|
||||||
|
line_out += 12;
|
||||||
|
|
||||||
|
MD_NTSC_COLOR_IN( 2, ntsc, border );
|
||||||
|
MD_NTSC_RGB_OUT( 4, *line_out++ );
|
||||||
|
MD_NTSC_RGB_OUT( 5, *line_out++ );
|
||||||
|
|
||||||
|
MD_NTSC_COLOR_IN( 3, ntsc, border );
|
||||||
|
MD_NTSC_RGB_OUT( 6, *line_out++ );
|
||||||
|
MD_NTSC_RGB_OUT( 7, *line_out++ );
|
||||||
|
}
|
||||||
|
@ -48,6 +48,22 @@
|
|||||||
#define LIGHT_GREEN {0xa9,0xc7,0xc6,0xff}
|
#define LIGHT_GREEN {0xa9,0xc7,0xc6,0xff}
|
||||||
#define WHITE {0xff,0xff,0xff,0xff}
|
#define WHITE {0xff,0xff,0xff,0xff}
|
||||||
|
|
||||||
|
/* Directly fill a RGB565 texture */
|
||||||
|
/* One tile is 32 byte = 4x4 pixels */
|
||||||
|
/* Tiles are stored continuously in texture memory */
|
||||||
|
#define CUSTOM_BLITTER(line, width, table, in) \
|
||||||
|
width >>= 2; \
|
||||||
|
u16 *out = (u16 *) (texturemem + (((width << 5) * (line >> 2)) + ((line & 3) << 3))); \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
*out++ = table[*in++]; \
|
||||||
|
*out++ = table[*in++]; \
|
||||||
|
*out++ = table[*in++]; \
|
||||||
|
*out++ = table[*in++]; \
|
||||||
|
out += 12; \
|
||||||
|
} \
|
||||||
|
while (--width);
|
||||||
|
|
||||||
/* image texture */
|
/* image texture */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* md_ntsc 0.1.2. http://www.slack.net/~ant/ */
|
/* md_ntsc 0.1.2. http://www.slack.net/~ant/ */
|
||||||
|
|
||||||
/* Modified to work with Genesis Plus GX -- EkeEke*/
|
/* Modified for use with Genesis Plus GX -- EkeEke */
|
||||||
|
|
||||||
#include "shared.h"
|
#include "shared.h"
|
||||||
#include "md_ntsc.h"
|
#include "md_ntsc.h"
|
||||||
@ -85,6 +85,7 @@ void md_ntsc_init( md_ntsc_t* ntsc, md_ntsc_setup_t const* setup )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef CUSTOM_BLITTER
|
||||||
void md_ntsc_blit( md_ntsc_t const* ntsc, MD_NTSC_IN_T const* table, unsigned char* input,
|
void md_ntsc_blit( md_ntsc_t const* ntsc, MD_NTSC_IN_T const* table, unsigned char* input,
|
||||||
int in_width, int vline)
|
int in_width, int vline)
|
||||||
{
|
{
|
||||||
@ -98,16 +99,7 @@ void md_ntsc_blit( md_ntsc_t const* ntsc, MD_NTSC_IN_T const* table, unsigned ch
|
|||||||
MD_NTSC_ADJ_IN( table[*input++] ),
|
MD_NTSC_ADJ_IN( table[*input++] ),
|
||||||
MD_NTSC_ADJ_IN( table[*input++] ) );
|
MD_NTSC_ADJ_IN( table[*input++] ) );
|
||||||
|
|
||||||
#ifdef NGC
|
|
||||||
/* directly fill the RGB565 texture */
|
|
||||||
/* one tile is 32 byte = 4x4 pixels */
|
|
||||||
/* tiles are stored continuously in texture memory */
|
|
||||||
in_width = MD_NTSC_OUT_WIDTH(in_width) >> 2;
|
|
||||||
int offset = ((in_width << 5) * (vline >> 2)) + ((vline & 3) * 8);
|
|
||||||
md_ntsc_out_t* restrict line_out = (md_ntsc_out_t*)(texturemem + offset);
|
|
||||||
#else
|
|
||||||
md_ntsc_out_t* restrict line_out = (md_ntsc_out_t*)(&bitmap.data[(vline * bitmap.pitch)]);
|
md_ntsc_out_t* restrict line_out = (md_ntsc_out_t*)(&bitmap.data[(vline * bitmap.pitch)]);
|
||||||
#endif
|
|
||||||
|
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
@ -122,10 +114,6 @@ void md_ntsc_blit( md_ntsc_t const* ntsc, MD_NTSC_IN_T const* table, unsigned ch
|
|||||||
MD_NTSC_RGB_OUT( 2, *line_out++ );
|
MD_NTSC_RGB_OUT( 2, *line_out++ );
|
||||||
MD_NTSC_RGB_OUT( 3, *line_out++ );
|
MD_NTSC_RGB_OUT( 3, *line_out++ );
|
||||||
|
|
||||||
#ifdef NGC
|
|
||||||
line_out += 12;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
MD_NTSC_COLOR_IN( 2, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) );
|
MD_NTSC_COLOR_IN( 2, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) );
|
||||||
MD_NTSC_RGB_OUT( 4, *line_out++ );
|
MD_NTSC_RGB_OUT( 4, *line_out++ );
|
||||||
MD_NTSC_RGB_OUT( 5, *line_out++ );
|
MD_NTSC_RGB_OUT( 5, *line_out++ );
|
||||||
@ -133,11 +121,7 @@ void md_ntsc_blit( md_ntsc_t const* ntsc, MD_NTSC_IN_T const* table, unsigned ch
|
|||||||
MD_NTSC_COLOR_IN( 3, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) );
|
MD_NTSC_COLOR_IN( 3, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) );
|
||||||
MD_NTSC_RGB_OUT( 6, *line_out++ );
|
MD_NTSC_RGB_OUT( 6, *line_out++ );
|
||||||
MD_NTSC_RGB_OUT( 7, *line_out++ );
|
MD_NTSC_RGB_OUT( 7, *line_out++ );
|
||||||
|
}
|
||||||
#ifdef NGC
|
|
||||||
line_out += 12;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* finish final pixels */
|
/* finish final pixels */
|
||||||
MD_NTSC_COLOR_IN( 0, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) );
|
MD_NTSC_COLOR_IN( 0, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) );
|
||||||
@ -148,10 +132,6 @@ void md_ntsc_blit( md_ntsc_t const* ntsc, MD_NTSC_IN_T const* table, unsigned ch
|
|||||||
MD_NTSC_RGB_OUT( 2, *line_out++ );
|
MD_NTSC_RGB_OUT( 2, *line_out++ );
|
||||||
MD_NTSC_RGB_OUT( 3, *line_out++ );
|
MD_NTSC_RGB_OUT( 3, *line_out++ );
|
||||||
|
|
||||||
#ifdef NGC
|
|
||||||
line_out += 12;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
MD_NTSC_COLOR_IN( 2, ntsc, border );
|
MD_NTSC_COLOR_IN( 2, ntsc, border );
|
||||||
MD_NTSC_RGB_OUT( 4, *line_out++ );
|
MD_NTSC_RGB_OUT( 4, *line_out++ );
|
||||||
MD_NTSC_RGB_OUT( 5, *line_out++ );
|
MD_NTSC_RGB_OUT( 5, *line_out++ );
|
||||||
@ -160,3 +140,4 @@ void md_ntsc_blit( md_ntsc_t const* ntsc, MD_NTSC_IN_T const* table, unsigned ch
|
|||||||
MD_NTSC_RGB_OUT( 6, *line_out++ );
|
MD_NTSC_RGB_OUT( 6, *line_out++ );
|
||||||
MD_NTSC_RGB_OUT( 7, *line_out++ );
|
MD_NTSC_RGB_OUT( 7, *line_out++ );
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
@ -46,7 +46,7 @@ typedef struct md_ntsc_t md_ntsc_t;
|
|||||||
void md_ntsc_init( md_ntsc_t* ntsc, md_ntsc_setup_t const* setup );
|
void md_ntsc_init( md_ntsc_t* ntsc, md_ntsc_setup_t const* setup );
|
||||||
|
|
||||||
/* Filters one row of pixels. Input pixel format is set by MD_NTSC_IN_FORMAT
|
/* Filters one row of pixels. Input pixel format is set by MD_NTSC_IN_FORMAT
|
||||||
and output RGB depth is defined by MD_NTSC_RGB_OUT_. Both default to 16-bit RGB.
|
and output RGB depth is set by MD_NTSC_OUT_DEPTH. Both default to 16-bit RGB.
|
||||||
In_row_width is the number of pixels to get to the next input row. */
|
In_row_width is the number of pixels to get to the next input row. */
|
||||||
void md_ntsc_blit( md_ntsc_t const* ntsc, MD_NTSC_IN_T const* table, unsigned char* input,
|
void md_ntsc_blit( md_ntsc_t const* ntsc, MD_NTSC_IN_T const* table, unsigned char* input,
|
||||||
int in_width, int vline);
|
int in_width, int vline);
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
/* sms_ntsc 0.2.3. http://www.slack.net/~ant/ */
|
/* sms_ntsc 0.2.3. http://www.slack.net/~ant/ */
|
||||||
|
|
||||||
|
/* Modified for use with Genesis Plus GX -- EkeEke */
|
||||||
|
|
||||||
#include "shared.h"
|
#include "shared.h"
|
||||||
#include "sms_ntsc.h"
|
#include "sms_ntsc.h"
|
||||||
|
|
||||||
@ -14,8 +16,6 @@ details. You should have received a copy of the GNU Lesser General Public
|
|||||||
License along with this module; if not, write to the Free Software Foundation,
|
License along with this module; if not, write to the Free Software Foundation,
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
|
||||||
|
|
||||||
/* Modified to work with Genesis Plus GX -- EkeEke */
|
|
||||||
|
|
||||||
sms_ntsc_setup_t const sms_ntsc_monochrome = { 0,-1, 0, 0,.2, 0, .2,-.2,-.2,-1, 0, 0 };
|
sms_ntsc_setup_t const sms_ntsc_monochrome = { 0,-1, 0, 0,.2, 0, .2,-.2,-.2,-1, 0, 0 };
|
||||||
sms_ntsc_setup_t const sms_ntsc_composite = { 0, 0, 0, 0, 0, 0,.25, 0, 0, 0, 0, 0 };
|
sms_ntsc_setup_t const sms_ntsc_composite = { 0, 0, 0, 0, 0, 0,.25, 0, 0, 0, 0, 0 };
|
||||||
sms_ntsc_setup_t const sms_ntsc_svideo = { 0, 0, 0, 0, 0, 0,.25, -1, -1, 0, 0, 0 };
|
sms_ntsc_setup_t const sms_ntsc_svideo = { 0, 0, 0, 0, 0, 0,.25, -1, -1, 0, 0, 0 };
|
||||||
@ -84,6 +84,7 @@ void sms_ntsc_init( sms_ntsc_t* ntsc, sms_ntsc_setup_t const* setup )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef CUSTOM_BLITTER
|
||||||
void sms_ntsc_blit( sms_ntsc_t const* ntsc, SMS_NTSC_IN_T const* table, unsigned char* input,
|
void sms_ntsc_blit( sms_ntsc_t const* ntsc, SMS_NTSC_IN_T const* table, unsigned char* input,
|
||||||
int in_width, int vline)
|
int in_width, int vline)
|
||||||
{
|
{
|
||||||
@ -101,17 +102,8 @@ void sms_ntsc_blit( sms_ntsc_t const* ntsc, SMS_NTSC_IN_T const* table, unsigned
|
|||||||
(SMS_NTSC_ADJ_IN( table[input[0]] )) & extra2,
|
(SMS_NTSC_ADJ_IN( table[input[0]] )) & extra2,
|
||||||
(SMS_NTSC_ADJ_IN( table[input[extra2 & 1]] )) & extra1 );
|
(SMS_NTSC_ADJ_IN( table[input[extra2 & 1]] )) & extra1 );
|
||||||
|
|
||||||
#ifdef NGC
|
|
||||||
/* directly fill the RGB565 texture */
|
|
||||||
/* one tile is 32 byte = 4x4 pixels */
|
|
||||||
/* tiles are stored continuously in texture memory */
|
|
||||||
in_width = SMS_NTSC_OUT_WIDTH(in_width) / 4;
|
|
||||||
int offset = ((in_width * 32) * (vline / 4)) + ((vline & 3) * 8);
|
|
||||||
sms_ntsc_out_t* restrict line_out = (sms_ntsc_out_t*)(texturemem + offset);
|
|
||||||
offset = 0;
|
|
||||||
#else
|
|
||||||
sms_ntsc_out_t* restrict line_out = (sms_ntsc_out_t*)(&bitmap.data[(vline * bitmap.pitch)]);
|
sms_ntsc_out_t* restrict line_out = (sms_ntsc_out_t*)(&bitmap.data[(vline * bitmap.pitch)]);
|
||||||
#endif
|
|
||||||
int n;
|
int n;
|
||||||
input += in_extra;
|
input += in_extra;
|
||||||
|
|
||||||
@ -119,76 +111,31 @@ void sms_ntsc_blit( sms_ntsc_t const* ntsc, SMS_NTSC_IN_T const* table, unsigned
|
|||||||
{
|
{
|
||||||
/* order of input and output pixels must not be altered */
|
/* order of input and output pixels must not be altered */
|
||||||
SMS_NTSC_COLOR_IN( 0, ntsc, SMS_NTSC_ADJ_IN( table[*input++] ) );
|
SMS_NTSC_COLOR_IN( 0, ntsc, SMS_NTSC_ADJ_IN( table[*input++] ) );
|
||||||
#ifdef NGC
|
|
||||||
SMS_NTSC_RGB_OUT( 0, line_out[offset++] );
|
|
||||||
if ((offset % 4) == 0) offset += 12;
|
|
||||||
SMS_NTSC_RGB_OUT( 1, line_out[offset++] );
|
|
||||||
if ((offset % 4) == 0) offset += 12;
|
|
||||||
#else
|
|
||||||
SMS_NTSC_RGB_OUT( 0, *line_out++ );
|
SMS_NTSC_RGB_OUT( 0, *line_out++ );
|
||||||
SMS_NTSC_RGB_OUT( 1, *line_out++ );
|
SMS_NTSC_RGB_OUT( 1, *line_out++ );
|
||||||
#endif
|
|
||||||
|
|
||||||
SMS_NTSC_COLOR_IN( 1, ntsc, SMS_NTSC_ADJ_IN( table[*input++] ) );
|
SMS_NTSC_COLOR_IN( 1, ntsc, SMS_NTSC_ADJ_IN( table[*input++] ) );
|
||||||
#ifdef NGC
|
|
||||||
SMS_NTSC_RGB_OUT( 2, line_out[offset++] );
|
|
||||||
if ((offset % 4) == 0) offset += 12;
|
|
||||||
SMS_NTSC_RGB_OUT( 3, line_out[offset++] );
|
|
||||||
if ((offset % 4) == 0) offset += 12;
|
|
||||||
#else
|
|
||||||
SMS_NTSC_RGB_OUT( 2, *line_out++ );
|
SMS_NTSC_RGB_OUT( 2, *line_out++ );
|
||||||
SMS_NTSC_RGB_OUT( 3, *line_out++ );
|
SMS_NTSC_RGB_OUT( 3, *line_out++ );
|
||||||
#endif
|
|
||||||
|
|
||||||
SMS_NTSC_COLOR_IN( 2, ntsc, SMS_NTSC_ADJ_IN( table[*input++] ) );
|
SMS_NTSC_COLOR_IN( 2, ntsc, SMS_NTSC_ADJ_IN( table[*input++] ) );
|
||||||
#ifdef NGC
|
|
||||||
SMS_NTSC_RGB_OUT( 4, line_out[offset++] );
|
|
||||||
if ((offset % 4) == 0) offset += 12;
|
|
||||||
SMS_NTSC_RGB_OUT( 5, line_out[offset++] );
|
|
||||||
if ((offset % 4) == 0) offset += 12;
|
|
||||||
SMS_NTSC_RGB_OUT( 6, line_out[offset++] );
|
|
||||||
if ((offset % 4) == 0) offset += 12;
|
|
||||||
#else
|
|
||||||
SMS_NTSC_RGB_OUT( 4, *line_out++ );
|
SMS_NTSC_RGB_OUT( 4, *line_out++ );
|
||||||
SMS_NTSC_RGB_OUT( 5, *line_out++ );
|
SMS_NTSC_RGB_OUT( 5, *line_out++ );
|
||||||
SMS_NTSC_RGB_OUT( 6, *line_out++ );
|
SMS_NTSC_RGB_OUT( 6, *line_out++ );
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* finish final pixels */
|
/* finish final pixels */
|
||||||
SMS_NTSC_COLOR_IN( 0, ntsc, border );
|
SMS_NTSC_COLOR_IN( 0, ntsc, border );
|
||||||
#ifdef NGC
|
|
||||||
SMS_NTSC_RGB_OUT( 0, line_out[offset++] );
|
|
||||||
if ((offset % 4) == 0) offset += 12;
|
|
||||||
SMS_NTSC_RGB_OUT( 1, line_out[offset++] );
|
|
||||||
if ((offset % 4) == 0) offset += 12;
|
|
||||||
#else
|
|
||||||
SMS_NTSC_RGB_OUT( 0, *line_out++ );
|
SMS_NTSC_RGB_OUT( 0, *line_out++ );
|
||||||
SMS_NTSC_RGB_OUT( 1, *line_out++ );
|
SMS_NTSC_RGB_OUT( 1, *line_out++ );
|
||||||
#endif
|
|
||||||
|
|
||||||
SMS_NTSC_COLOR_IN( 1, ntsc, border );
|
SMS_NTSC_COLOR_IN( 1, ntsc, border );
|
||||||
#ifdef NGC
|
|
||||||
SMS_NTSC_RGB_OUT( 2, line_out[offset++] );
|
|
||||||
if ((offset % 4) == 0) offset += 12;
|
|
||||||
SMS_NTSC_RGB_OUT( 3, line_out[offset++] );
|
|
||||||
if ((offset % 4) == 0) offset += 12;
|
|
||||||
#else
|
|
||||||
SMS_NTSC_RGB_OUT( 2, *line_out++ );
|
SMS_NTSC_RGB_OUT( 2, *line_out++ );
|
||||||
SMS_NTSC_RGB_OUT( 3, *line_out++ );
|
SMS_NTSC_RGB_OUT( 3, *line_out++ );
|
||||||
#endif
|
|
||||||
|
|
||||||
SMS_NTSC_COLOR_IN( 2, ntsc, border );
|
SMS_NTSC_COLOR_IN( 2, ntsc, border );
|
||||||
#ifdef NGC
|
|
||||||
SMS_NTSC_RGB_OUT( 4, line_out[offset++] );
|
|
||||||
if ((offset % 4) == 0) offset += 12;
|
|
||||||
SMS_NTSC_RGB_OUT( 5, line_out[offset++] );
|
|
||||||
if ((offset % 4) == 0) offset += 12;
|
|
||||||
SMS_NTSC_RGB_OUT( 6, line_out[offset++] );
|
|
||||||
if ((offset % 4) == 0) offset += 12;
|
|
||||||
#else
|
|
||||||
SMS_NTSC_RGB_OUT( 4, *line_out++ );
|
SMS_NTSC_RGB_OUT( 4, *line_out++ );
|
||||||
SMS_NTSC_RGB_OUT( 5, *line_out++ );
|
SMS_NTSC_RGB_OUT( 5, *line_out++ );
|
||||||
SMS_NTSC_RGB_OUT( 6, *line_out++ );
|
SMS_NTSC_RGB_OUT( 6, *line_out++ );
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
@ -46,7 +46,7 @@ typedef struct sms_ntsc_t sms_ntsc_t;
|
|||||||
void sms_ntsc_init( sms_ntsc_t* ntsc, sms_ntsc_setup_t const* setup );
|
void sms_ntsc_init( sms_ntsc_t* ntsc, sms_ntsc_setup_t const* setup );
|
||||||
|
|
||||||
/* Filters one row of pixels. Input pixel format is set by SMS_NTSC_IN_FORMAT
|
/* Filters one row of pixels. Input pixel format is set by SMS_NTSC_IN_FORMAT
|
||||||
and output RGB depth is defined by SMS_NTSC_RGB_OUT_. Both default to 16-bit RGB.
|
and output RGB depth is set by SMS_NTSC_OUT_DEPTH. Both default to 16-bit RGB.
|
||||||
In_row_width is the number of pixels to get to the next input row. */
|
In_row_width is the number of pixels to get to the next input row. */
|
||||||
void sms_ntsc_blit( sms_ntsc_t const* ntsc, SMS_NTSC_IN_T const* table, unsigned char* input,
|
void sms_ntsc_blit( sms_ntsc_t const* ntsc, SMS_NTSC_IN_T const* table, unsigned char* input,
|
||||||
int in_width, int vline);
|
int in_width, int vline);
|
||||||
|
@ -47,13 +47,23 @@
|
|||||||
extern md_ntsc_t *md_ntsc;
|
extern md_ntsc_t *md_ntsc;
|
||||||
extern sms_ntsc_t *sms_ntsc;
|
extern sms_ntsc_t *sms_ntsc;
|
||||||
|
|
||||||
|
|
||||||
|
/* Output pixels type*/
|
||||||
|
#if defined(USE_8BPP_RENDERING)
|
||||||
|
#define PIXEL_OUT_T uint8
|
||||||
|
#elif defined(USE_32BPP_RENDERING)
|
||||||
|
#define PIXEL_OUT_T uint32
|
||||||
|
#else
|
||||||
|
#define PIXEL_OUT_T uint16
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Pixel priority look-up tables information */
|
/* Pixel priority look-up tables information */
|
||||||
#define LUT_MAX (6)
|
#define LUT_MAX (6)
|
||||||
#define LUT_SIZE (0x10000)
|
#define LUT_SIZE (0x10000)
|
||||||
|
|
||||||
|
|
||||||
#ifdef ALIGN_LONG
|
#ifdef ALIGN_LONG
|
||||||
/* Or change the names if you depend on these from elsewhere.. */
|
|
||||||
#undef READ_LONG
|
#undef READ_LONG
|
||||||
#undef WRITE_LONG
|
#undef WRITE_LONG
|
||||||
|
|
||||||
@ -452,7 +462,7 @@ INLINE void WRITE_LONG(void *address, uint32 data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Pixel conversion macros */
|
/* Pixels conversion macro */
|
||||||
/* 4-bit color channels are either compressed to 2/3-bit or dithered to 5/6/8-bit equivalents */
|
/* 4-bit color channels are either compressed to 2/3-bit or dithered to 5/6/8-bit equivalents */
|
||||||
/* 3:3:2 RGB */
|
/* 3:3:2 RGB */
|
||||||
#if defined(USE_8BPP_RENDERING)
|
#if defined(USE_8BPP_RENDERING)
|
||||||
@ -551,30 +561,10 @@ static uint32 bp_lut[0x10000];
|
|||||||
/* Layer priority pixel look-up tables */
|
/* Layer priority pixel look-up tables */
|
||||||
static uint8 lut[LUT_MAX][LUT_SIZE];
|
static uint8 lut[LUT_MAX][LUT_SIZE];
|
||||||
|
|
||||||
/* 8-bit pixel color mapping */
|
/* Output pixel data look-up tables*/
|
||||||
#if defined(USE_8BPP_RENDERING)
|
static PIXEL_OUT_T pixel[0x100];
|
||||||
static uint8 pixel[0x100];
|
static PIXEL_OUT_T pixel_lut[3][0x200];
|
||||||
static uint8 pixel_lut[3][0x200];
|
static PIXEL_OUT_T pixel_lut_m4[0x40];
|
||||||
static uint8 pixel_lut_m4[0x40];
|
|
||||||
|
|
||||||
/* 15-bit pixel color mapping */
|
|
||||||
#elif defined(USE_15BPP_RENDERING)
|
|
||||||
static uint16 pixel[0x100];
|
|
||||||
static uint16 pixel_lut[3][0x200];
|
|
||||||
static uint16 pixel_lut_m4[0x40];
|
|
||||||
|
|
||||||
/* 16-bit pixel color mapping */
|
|
||||||
#elif defined(USE_16BPP_RENDERING)
|
|
||||||
static uint16 pixel[0x100];
|
|
||||||
static uint16 pixel_lut[3][0x200];
|
|
||||||
static uint16 pixel_lut_m4[0x40];
|
|
||||||
|
|
||||||
/* 32-bit pixel color mapping */
|
|
||||||
#elif defined(USE_32BPP_RENDERING)
|
|
||||||
static uint32 pixel[0x100];
|
|
||||||
static uint32 pixel_lut[3][0x200];
|
|
||||||
static uint32 pixel_lut_m4[0x40];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Background & Sprite line buffers */
|
/* Background & Sprite line buffers */
|
||||||
static uint8 linebuf[2][0x200];
|
static uint8 linebuf[2][0x200];
|
||||||
@ -4145,31 +4135,10 @@ void remap_line(int line)
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
/* Convert VDP pixel data to output pixel format */
|
/* Convert VDP pixel data to output pixel format */
|
||||||
#ifdef NGC
|
#ifdef CUSTOM_BLITTER
|
||||||
/* Directly fill a RGB565 texture */
|
CUSTOM_BLITTER(line, width, pixel, src)
|
||||||
/* One tile is 32 byte = 4x4 pixels */
|
|
||||||
/* Tiles are stored continuously in texture memory */
|
|
||||||
width >>= 2;
|
|
||||||
uint16 *dst = (uint16 *) (texturemem + (((width << 5) * (line >> 2)) + ((line & 3) << 3)));
|
|
||||||
do
|
|
||||||
{
|
|
||||||
*dst++ = pixel[*src++];
|
|
||||||
*dst++ = pixel[*src++];
|
|
||||||
*dst++ = pixel[*src++];
|
|
||||||
*dst++ = pixel[*src++];
|
|
||||||
|
|
||||||
/* next tile */
|
|
||||||
dst += 12;
|
|
||||||
}
|
|
||||||
while (--width);
|
|
||||||
#else
|
#else
|
||||||
#if defined(USE_8BPP_RENDERING)
|
PIXEL_OUT_T *dst =((PIXEL_OUT_T *)&bitmap.data[(line * bitmap.pitch)]);
|
||||||
uint8 *dst =((uint8 *)&bitmap.data[(line * bitmap.pitch)]);
|
|
||||||
#elif defined(USE_32BPP_RENDERING)
|
|
||||||
uint32 *dst =((uint32 *)&bitmap.data[(line * bitmap.pitch)]);
|
|
||||||
#else
|
|
||||||
uint16 *dst =((uint16 *)&bitmap.data[(line * bitmap.pitch)]);
|
|
||||||
#endif
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
*dst++ = pixel[*src++];
|
*dst++ = pixel[*src++];
|
||||||
|
Loading…
Reference in New Issue
Block a user