@@ -14,6 +14,7 @@ filter_out1 = $(filter-out $(firstword $1),$1)
|
|||||||
filter_out2 = $(call filter_out1,$(call filter_out1,$1))
|
filter_out2 = $(call filter_out1,$(call filter_out1,$1))
|
||||||
unixpath = $(subst \,/,$1)
|
unixpath = $(subst \,/,$1)
|
||||||
unixcygpath = /$(subst :,,$(call unixpath,$1))
|
unixcygpath = /$(subst :,,$(call unixpath,$1))
|
||||||
|
RETROARCH_OBJECTS :=
|
||||||
|
|
||||||
ifeq ($(platform),)
|
ifeq ($(platform),)
|
||||||
platform = unix
|
platform = unix
|
||||||
@@ -163,10 +164,13 @@ else ifeq ($(platform), ps2)
|
|||||||
FCEU_DEFINES := -DPATH_MAX=1024 -DINLINE=inline -DPSS_STYLE=1 -DFCEU_VERSION_NUMERIC=9813 -DHAVE_ASPRINTF
|
FCEU_DEFINES := -DPATH_MAX=1024 -DINLINE=inline -DPSS_STYLE=1 -DFCEU_VERSION_NUMERIC=9813 -DHAVE_ASPRINTF
|
||||||
ENDIANNESS_DEFINES := -DLSB_FIRST -DLOCAL_LE=1
|
ENDIANNESS_DEFINES := -DLSB_FIRST -DLOCAL_LE=1
|
||||||
PLATFORM_DEFINES := -DPS2 -G0 -DFRONTEND_SUPPORTS_ABGR1555 -DRENDER_GSKIT_PS2
|
PLATFORM_DEFINES := -DPS2 -G0 -DFRONTEND_SUPPORTS_ABGR1555 -DRENDER_GSKIT_PS2
|
||||||
|
PLATFORM_DEFINES += -Dmemcpy=mips_memcpy -Dmemset=mips_memset
|
||||||
PLATFORM_DEFINES += -I$(PS2SDK)/ee/include -I$(PS2SDK)/common/include -Ips2/ -I$(PS2DEV)/gsKit/include
|
PLATFORM_DEFINES += -I$(PS2SDK)/ee/include -I$(PS2SDK)/common/include -Ips2/ -I$(PS2DEV)/gsKit/include
|
||||||
STATIC_LINKING=1
|
STATIC_LINKING=1
|
||||||
EXTERNAL_ZLIB=1
|
EXTERNAL_ZLIB=1
|
||||||
|
|
||||||
|
RETROARCH_OBJECTS += ps2/SMS_Utils.o
|
||||||
|
|
||||||
# PSP
|
# PSP
|
||||||
else ifeq ($(platform), psp1)
|
else ifeq ($(platform), psp1)
|
||||||
TARGET := $(TARGET_NAME)_libretro_$(platform).a
|
TARGET := $(TARGET_NAME)_libretro_$(platform).a
|
||||||
@@ -672,6 +676,7 @@ include Makefile.common
|
|||||||
CFLAGS += -DWANT_GRIFFIN
|
CFLAGS += -DWANT_GRIFFIN
|
||||||
|
|
||||||
OBJECTS := $(SOURCES_C:.c=.o)
|
OBJECTS := $(SOURCES_C:.c=.o)
|
||||||
|
OBJECTS += $(RETROARCH_OBJECTS)
|
||||||
|
|
||||||
DEFINES := $(COREDEFINES) $(PLATFORM_DEFINES)
|
DEFINES := $(COREDEFINES) $(PLATFORM_DEFINES)
|
||||||
|
|
||||||
@@ -739,6 +744,11 @@ endif
|
|||||||
%.o: %.c
|
%.o: %.c
|
||||||
$(CC) -c $(OBJOUT)$@ $< $(CFLAGS) $(INCFLAGS)
|
$(CC) -c $(OBJOUT)$@ $< $(CFLAGS) $(INCFLAGS)
|
||||||
|
|
||||||
|
ifeq ($(platform), ps2)
|
||||||
|
%.o: %.s
|
||||||
|
ee-as -G0 $< -o $@
|
||||||
|
endif
|
||||||
|
|
||||||
clean-objs:
|
clean-objs:
|
||||||
rm -f $(OBJECTS)
|
rm -f $(OBJECTS)
|
||||||
|
|
||||||
|
|||||||
202
ps2/SMS_Utils.s
Normal file
202
ps2/SMS_Utils.s
Normal file
@@ -0,0 +1,202 @@
|
|||||||
|
/*
|
||||||
|
# ___ _ _ ___
|
||||||
|
# | | | | |
|
||||||
|
# ___| | | ___| PS2DEV Open Source Project.
|
||||||
|
#----------------------------------------------------------
|
||||||
|
# MUL64 is pulled from some binary library (I don't remember which one).
|
||||||
|
# mips_memcpy routine is pulled from 'sde' library from MIPS.
|
||||||
|
#
|
||||||
|
*/
|
||||||
|
.set noat
|
||||||
|
.set noreorder
|
||||||
|
.set nomacro
|
||||||
|
|
||||||
|
.globl MUL64
|
||||||
|
.globl mips_memcpy
|
||||||
|
.globl mips_memset
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
MUL64:
|
||||||
|
pmultuw $v0, $a0, $a1
|
||||||
|
dsra32 $a2, $a0, 0
|
||||||
|
dsra32 $v1, $a1, 0
|
||||||
|
mult $v1, $a0, $v1
|
||||||
|
mult1 $a2, $a2, $a1
|
||||||
|
addu $v1, $v1, $a2
|
||||||
|
dsll32 $v1, $v1, 0
|
||||||
|
jr $ra
|
||||||
|
daddu $v0, $v0, $v1
|
||||||
|
|
||||||
|
mips_memcpy:
|
||||||
|
addu $v0, $a0, $zero
|
||||||
|
beqz $a2, 1f
|
||||||
|
sltiu $t2, $a2, 12
|
||||||
|
bnez $t2, 2f
|
||||||
|
xor $v1, $a1, $a0
|
||||||
|
andi $v1, $v1, 7
|
||||||
|
negu $a3, $a0
|
||||||
|
beqz $v1, 3f
|
||||||
|
andi $a3, $a3, 7
|
||||||
|
beqz $a3, 4f
|
||||||
|
subu $a2, $a2, $a3
|
||||||
|
ldr $v1, 0($a1)
|
||||||
|
ldl $v1, 7($a1)
|
||||||
|
addu $a1, $a1, $a3
|
||||||
|
sdr $v1, 0($a0)
|
||||||
|
addu $a0, $a0, $a3
|
||||||
|
4:
|
||||||
|
andi $v1, $a2, 31
|
||||||
|
subu $a3, $a2, $v1
|
||||||
|
beqz $a3, 5f
|
||||||
|
addu $a2, $v1, $zero
|
||||||
|
addu $a3, $a3, $a1
|
||||||
|
6:
|
||||||
|
ldr $v1, 0($a1)
|
||||||
|
ldl $v1, 7($a1)
|
||||||
|
ldr $t0, 8($a1)
|
||||||
|
ldl $t0, 15($a1)
|
||||||
|
ldr $t1, 16($a1)
|
||||||
|
ldl $t1, 23($a1)
|
||||||
|
ldr $t2, 24($a1)
|
||||||
|
ldl $t2, 31($a1)
|
||||||
|
sd $v1, 0($a0)
|
||||||
|
sd $t0, 8($a0)
|
||||||
|
sd $t1, 16($a0)
|
||||||
|
addiu $a1, $a1, 32
|
||||||
|
addiu $a0, $a0, 32
|
||||||
|
bne $a1, $a3, 6b
|
||||||
|
sd $t2, -8($a0)
|
||||||
|
5:
|
||||||
|
andi $v1, $a2, 7
|
||||||
|
subu $a3, $a2, $v1
|
||||||
|
beqz $a3, 2f
|
||||||
|
addu $a2, $v1, $zero
|
||||||
|
addu $a3, $a3, $a1
|
||||||
|
7:
|
||||||
|
ldr $v1, 0($a1)
|
||||||
|
ldl $v1, 7($a1)
|
||||||
|
addiu $a1, $a1, 8
|
||||||
|
addiu $a0, $a0, 8
|
||||||
|
nop
|
||||||
|
bne $a1, $a3, 7b
|
||||||
|
sd $v1, -8($a0)
|
||||||
|
beq $zero, $zero, 2f
|
||||||
|
nop
|
||||||
|
3:
|
||||||
|
beqz $a3, 8f
|
||||||
|
subu $a2, $a2, $a3
|
||||||
|
ldr $v1, 0($a1)
|
||||||
|
addu $a1, $a1, $a3
|
||||||
|
sdr $v1, 0($a0)
|
||||||
|
addu $a0, $a0, $a3
|
||||||
|
8:
|
||||||
|
andi $v1, $a2, 31
|
||||||
|
subu $a3, $a2, $v1
|
||||||
|
beqz $a3, 9f
|
||||||
|
addu $a2, $v1, $zero
|
||||||
|
addu $a3, $a3, $a1
|
||||||
|
10:
|
||||||
|
ld $v1, 0($a1)
|
||||||
|
ld $t0, 8($a1)
|
||||||
|
ld $t1, 16($a1)
|
||||||
|
ld $t2, 24($a1)
|
||||||
|
sd $v1, 0($a0)
|
||||||
|
sd $t0, 8($a0)
|
||||||
|
sd $t1, 16($a0)
|
||||||
|
addiu $a1, $a1, 32
|
||||||
|
addiu $a0, $a0, 32
|
||||||
|
bne $a1, $a3, 10b
|
||||||
|
sd $t2, -8($a0)
|
||||||
|
9:
|
||||||
|
andi $v1, $a2, 7
|
||||||
|
subu $a3, $a2, $v1
|
||||||
|
beqz $a3, 2f
|
||||||
|
addu $a2, $v1, $zero
|
||||||
|
addu $a3, $a3, $a1
|
||||||
|
11:
|
||||||
|
ld $v1, 0($a1)
|
||||||
|
addiu $a1, $a1, 8
|
||||||
|
addiu $a0, $a0, 8
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
bne $a1, $a3, 11b
|
||||||
|
sd $v1, -8($a0)
|
||||||
|
2:
|
||||||
|
beqz $a2, 1f
|
||||||
|
addu $a3, $a2, $a1
|
||||||
|
12:
|
||||||
|
lbu $v1, 0($a1)
|
||||||
|
addiu $a1, $a1, 1
|
||||||
|
addiu $a0, $a0, 1
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
bne $a1, $a3, 12b
|
||||||
|
sb $v1, -1($a0)
|
||||||
|
1:
|
||||||
|
jr $ra
|
||||||
|
nop
|
||||||
|
|
||||||
|
mips_memset:
|
||||||
|
beqz $a2, 1f
|
||||||
|
sltiu $at, $a2, 16
|
||||||
|
bnez $at, 2f
|
||||||
|
andi $a1, $a1, 0xFF
|
||||||
|
dsll $at, $a1, 0x8
|
||||||
|
or $a1, $a1, $at
|
||||||
|
dsll $at, $a1, 0x10
|
||||||
|
or $a1, $a1, $at
|
||||||
|
dsll32 $at, $a1, 0x0
|
||||||
|
or $a1, $a1, $at
|
||||||
|
andi $v1, $a0, 0x7
|
||||||
|
beqz $v1, 3f
|
||||||
|
li $a3, 8
|
||||||
|
subu $a3, $a3, $v1
|
||||||
|
subu $a2, $a2, $a3
|
||||||
|
sdr $a1, 0($a0)
|
||||||
|
addu $a0, $a0, $a3
|
||||||
|
3:
|
||||||
|
andi $v1, $a2, 0x1f
|
||||||
|
subu $a3, $a2, $v1
|
||||||
|
beqz $a3, 4f
|
||||||
|
move $a2, $v1
|
||||||
|
addu $a3, $a3, $a0
|
||||||
|
5:
|
||||||
|
sd $a1, 0($a0)
|
||||||
|
sd $a1, 8($a0)
|
||||||
|
sd $a1, 16($a0)
|
||||||
|
addiu $a0, $a0, 32
|
||||||
|
sd $a1, -8($a0)
|
||||||
|
bne $a0, $a3, 5b
|
||||||
|
4:
|
||||||
|
andi $v1, $a2, 0x7
|
||||||
|
subu $a3, $a2, $v1
|
||||||
|
beqz $a3, 2f
|
||||||
|
move $a2, $v1
|
||||||
|
addu $a3, $a3, $a0
|
||||||
|
6:
|
||||||
|
addiu $a0, $a0, 8
|
||||||
|
beq $a0, $a3, 2f
|
||||||
|
sd $a1, -8($a0)
|
||||||
|
addiu $a0, $a0, 8
|
||||||
|
beq $a0, $a3, 2f
|
||||||
|
sd $a1, -8($a0)
|
||||||
|
addiu $a0, $a0, 8
|
||||||
|
bne $a0, $a3, 6b
|
||||||
|
sd $a1, -8($a0)
|
||||||
|
2:
|
||||||
|
beqz $a2, 1f
|
||||||
|
addu $a3, $a2, $a0
|
||||||
|
7:
|
||||||
|
addiu $a0, $a0, 1
|
||||||
|
beq $a0, $a3, 1f
|
||||||
|
sb $a1, -1($a0)
|
||||||
|
addiu $a0, $a0, 1
|
||||||
|
beq $a0, $a3, 1f
|
||||||
|
sb $a1, -1($a0)
|
||||||
|
addiu $a0, $a0, 1
|
||||||
|
bne $a0, $a3, 7b
|
||||||
|
sb $a1, -1($a0)
|
||||||
|
1:
|
||||||
|
jr $ra
|
||||||
|
nop
|
||||||
@@ -35,6 +35,16 @@
|
|||||||
|
|
||||||
#define RETRO_HW_RENDER_INTERFACE_GSKIT_PS2_VERSION 1
|
#define RETRO_HW_RENDER_INTERFACE_GSKIT_PS2_VERSION 1
|
||||||
|
|
||||||
|
struct retro_hw_ps2_insets
|
||||||
|
{
|
||||||
|
float top;
|
||||||
|
float left;
|
||||||
|
float bottom;
|
||||||
|
float right;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define empty_ps2_insets (struct retro_hw_ps2_insets){0.f, 0.f, 0.f, 0.f}
|
||||||
|
|
||||||
struct retro_hw_render_interface_gskit_ps2
|
struct retro_hw_render_interface_gskit_ps2
|
||||||
{
|
{
|
||||||
/* Must be set to RETRO_HW_RENDER_INTERFACE_GSKIT_PS2. */
|
/* Must be set to RETRO_HW_RENDER_INTERFACE_GSKIT_PS2. */
|
||||||
@@ -48,6 +58,8 @@ struct retro_hw_render_interface_gskit_ps2
|
|||||||
*/
|
*/
|
||||||
GSTEXTURE *coreTexture;
|
GSTEXTURE *coreTexture;
|
||||||
bool clearTexture;
|
bool clearTexture;
|
||||||
|
bool updatedPalette;
|
||||||
|
struct retro_hw_ps2_insets padding;
|
||||||
};
|
};
|
||||||
typedef struct retro_hw_render_interface_gskit_ps2 RETRO_HW_RENDER_INTEFACE_GSKIT_PS2;
|
typedef struct retro_hw_render_interface_gskit_ps2 RETRO_HW_RENDER_INTEFACE_GSKIT_PS2;
|
||||||
|
|
||||||
|
|||||||
@@ -55,6 +55,10 @@ void* linearMemAlign(size_t size, size_t alignment);
|
|||||||
void linearFree(void* mem);
|
void linearFree(void* mem);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(RENDER_GSKIT_PS2)
|
||||||
|
RETRO_HW_RENDER_INTEFACE_GSKIT_PS2 *ps2 = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
static retro_video_refresh_t video_cb = NULL;
|
static retro_video_refresh_t video_cb = NULL;
|
||||||
static retro_input_poll_t poll_cb = NULL;
|
static retro_input_poll_t poll_cb = NULL;
|
||||||
static retro_input_state_t input_cb = NULL;
|
static retro_input_state_t input_cb = NULL;
|
||||||
@@ -1564,16 +1568,9 @@ static void retro_run_blit(uint8_t *gfx)
|
|||||||
|
|
||||||
video_cb(texture_vram_p, width, height, 256);
|
video_cb(texture_vram_p, width, height, 256);
|
||||||
#elif defined(RENDER_GSKIT_PS2)
|
#elif defined(RENDER_GSKIT_PS2)
|
||||||
|
|
||||||
RETRO_HW_RENDER_INTEFACE_GSKIT_PS2 *ps2 = NULL;
|
|
||||||
uint32_t *buf = (uint32_t *)RETRO_HW_FRAME_BUFFER_VALID;
|
uint32_t *buf = (uint32_t *)RETRO_HW_FRAME_BUFFER_VALID;
|
||||||
|
|
||||||
incr += (overscan_h ? 16 : 0);
|
if (!ps2) {
|
||||||
width -= (overscan_h ? 16 : 0);
|
|
||||||
height -= (overscan_v ? 16 : 0);
|
|
||||||
pitch -= (overscan_h ? 32 : 0);
|
|
||||||
gfx += (overscan_v ? ((overscan_h ? 8 : 0) + 256 * 8) : (overscan_h ? 8 : 0));
|
|
||||||
|
|
||||||
if (!environ_cb(RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE, (void **)&ps2) || !ps2) {
|
if (!environ_cb(RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE, (void **)&ps2) || !ps2) {
|
||||||
printf("Failed to get HW rendering interface!\n");
|
printf("Failed to get HW rendering interface!\n");
|
||||||
return;
|
return;
|
||||||
@@ -1585,21 +1582,17 @@ static void retro_run_blit(uint8_t *gfx)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ps2->clearTexture || !ps2->coreTexture->Clut || !ps2->coreTexture->Mem ) {
|
|
||||||
/* If it is empty we need to create it */
|
|
||||||
ps2->coreTexture->Width = width;
|
ps2->coreTexture->Width = width;
|
||||||
ps2->coreTexture->Height = height;
|
ps2->coreTexture->Height = height;
|
||||||
ps2->coreTexture->PSM = GS_PSM_T8;
|
ps2->coreTexture->PSM = GS_PSM_T8;
|
||||||
ps2->coreTexture->ClutPSM = GS_PSM_CT16;
|
ps2->coreTexture->ClutPSM = GS_PSM_CT16;
|
||||||
ps2->coreTexture->Filter = GS_FILTER_LINEAR;
|
ps2->coreTexture->Filter = GS_FILTER_LINEAR;
|
||||||
|
ps2->coreTexture->Clut = (u32*)retro_palette;
|
||||||
|
ps2->updatedPalette = true;
|
||||||
|
ps2->padding = (struct retro_hw_ps2_insets){8.0f, 8.0f, 8.0f, 8.0f};
|
||||||
}
|
}
|
||||||
|
|
||||||
for (y = 0; y < height; y++, gfx += incr)
|
ps2->coreTexture->Mem = (u32*)gfx;
|
||||||
for ( x = 0; x < width; x++, gfx++)
|
|
||||||
fceu_video_out[y * width + x] = *gfx;
|
|
||||||
|
|
||||||
ps2->coreTexture->Clut = (u32*)retro_palette;
|
|
||||||
ps2->coreTexture->Mem = (u32*)fceu_video_out;
|
|
||||||
|
|
||||||
video_cb(buf, width, height, pitch);
|
video_cb(buf, width, height, pitch);
|
||||||
#else
|
#else
|
||||||
|
|||||||
Reference in New Issue
Block a user