mirror of
https://github.com/RaySollium99/libpicofe.git
synced 2025-09-05 14:57:46 -04:00
anti-tear modes for Wiz
git-svn-id: file:///home/notaz/opt/svn/PicoDrive/platform@717 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
parent
9ecdd73ae7
commit
b79118011b
15 changed files with 471 additions and 181 deletions
|
@ -1,4 +1,4 @@
|
|||
// (c) Copyright 2006 notaz, All rights reserved.
|
||||
// (c) Copyright 2006-2009 notaz, All rights reserved.
|
||||
// Free for non-commercial use.
|
||||
|
||||
// For commercial use, separate licencing terms must be obtained.
|
||||
|
@ -6,8 +6,9 @@
|
|||
void vidConvCpyRGB32 (void *to, void *from, int pixels);
|
||||
void vidConvCpyRGB32sh(void *to, void *from, int pixels);
|
||||
void vidConvCpyRGB32hi(void *to, void *from, int pixels);
|
||||
void vidCpyM2_40col(void *dest, void *src);
|
||||
void vidCpyM2_32col(void *dest, void *src);
|
||||
void vidCpyM2_32col_nobord(void *dest, void *src);
|
||||
void vidcpy_m2(void *dest, void *src, int m32col, int with_32c_border);
|
||||
void vidcpy_m2_rot(void *dest, void *src, int m32col, int with_32c_border);
|
||||
void spend_cycles(int c); // utility
|
||||
|
||||
void rotated_blit8 (void *dst, void *linesx4, int y, int is_32col);
|
||||
void rotated_blit16(void *dst, void *linesx4, int y, int is_32col);
|
||||
|
|
|
@ -137,69 +137,201 @@ vidConvCpyRGB32hi:
|
|||
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
|
||||
|
||||
@ mode2 blitter for 40 cols
|
||||
.global vidCpyM2_40col @ void *dest, void *src
|
||||
|
||||
vidCpyM2_40col:
|
||||
@ mode2 blitter
|
||||
.global vidcpy_m2 @ void *dest, void *src, int m32col, int with_32c_border
|
||||
vidcpy_m2:
|
||||
stmfd sp!, {r4-r6,lr}
|
||||
|
||||
mov r12, #224 @ lines
|
||||
add r0, r0, #320*8
|
||||
add r1, r1, #8
|
||||
mov lr, #0
|
||||
|
||||
vidCpyM2_40_loop_out:
|
||||
tst r2, r2
|
||||
movne lr, #64
|
||||
tstne r3, r3
|
||||
addne r0, r0, #32
|
||||
|
||||
vidCpyM2_loop_out:
|
||||
mov r6, #10
|
||||
vidCpyM2_40_loop:
|
||||
sub r6, r6, lr, lsr #5 @ -= 2 in 32col mode
|
||||
vidCpyM2_loop:
|
||||
subs r6, r6, #1
|
||||
ldmia r1!, {r2-r5}
|
||||
stmia r0!, {r2-r5}
|
||||
ldmia r1!, {r2-r5}
|
||||
stmia r0!, {r2-r5}
|
||||
bne vidCpyM2_40_loop
|
||||
ldmia r1!, {r2-r5}
|
||||
stmia r0!, {r2-r5}
|
||||
ldmia r1!, {r2-r5}
|
||||
stmia r0!, {r2-r5}
|
||||
bne vidCpyM2_loop
|
||||
|
||||
subs r12,r12,#1
|
||||
add r0, r0, lr
|
||||
add r1, r1, #8
|
||||
bne vidCpyM2_40_loop_out
|
||||
add r1, r1, lr
|
||||
bne vidCpyM2_loop_out
|
||||
|
||||
ldmfd sp!, {r4-r6,lr}
|
||||
bx lr
|
||||
ldmfd sp!, {r4-r6,pc}
|
||||
|
||||
|
||||
@ mode2 blitter for 32 cols
|
||||
.global vidCpyM2_32col @ void *dest, void *src
|
||||
|
||||
vidCpyM2_32col:
|
||||
stmfd sp!, {r4-r6,lr}
|
||||
|
||||
mov r12, #224 @ lines
|
||||
.global vidcpy_m2_rot @ void *dest, void *src, int m32col, int with_32c_border
|
||||
vidcpy_m2_rot:
|
||||
stmfd sp!,{r4-r8,lr}
|
||||
add r1, r1, #8
|
||||
add r0, r0, #32
|
||||
tst r2, r2
|
||||
subne r1, r1, #32 @ adjust
|
||||
|
||||
vidCpyM2_32_loop_out:
|
||||
mov r6, #8
|
||||
vidCpyM2_32_loop:
|
||||
subs r6, r6, #1
|
||||
ldmia r1!, {r2-r5}
|
||||
stmia r0!, {r2-r5}
|
||||
ldmia r1!, {r2-r5}
|
||||
stmia r0!, {r2-r5}
|
||||
bne vidCpyM2_32_loop
|
||||
subs r12,r12,#1
|
||||
add r0, r0, #64
|
||||
add r1, r1, #8+64
|
||||
bne vidCpyM2_32_loop_out
|
||||
mov r4, r0
|
||||
mov r5, r1
|
||||
mov r6, r2
|
||||
mov r7, #8+4
|
||||
|
||||
ldmfd sp!, {r4-r6,lr}
|
||||
bx lr
|
||||
vidcpy_m2_rot_loop:
|
||||
@ a bit lame but oh well..
|
||||
mov r0, r4
|
||||
mov r1, r5
|
||||
mov r2, r7
|
||||
mov r3, r6
|
||||
mov r8, #328
|
||||
adr lr, after_rot_blit8
|
||||
stmfd sp!,{r4-r8,lr}
|
||||
b rotated_blit8_2
|
||||
|
||||
after_rot_blit8:
|
||||
add r5, r5, #328*4
|
||||
add r7, r7, #4
|
||||
cmp r7, #224+8+4
|
||||
ldmgefd sp!,{r4-r8,pc}
|
||||
b vidcpy_m2_rot_loop
|
||||
|
||||
|
||||
@ mode2 blitter for 32 cols with no borders
|
||||
.global vidCpyM2_32col_nobord @ void *dest, void *src
|
||||
.global rotated_blit8 @ void *dst, void *linesx4, u32 y, int is_32col
|
||||
rotated_blit8:
|
||||
stmfd sp!,{r4-r8,lr}
|
||||
mov r8, #320
|
||||
|
||||
vidCpyM2_32col_nobord:
|
||||
stmfd sp!, {r4-r6,lr}
|
||||
rotated_blit8_2:
|
||||
add r0, r0, #(240*320)
|
||||
sub r0, r0, #(240+4) @ y starts from 4
|
||||
add r0, r0, r2
|
||||
|
||||
mov r12, #224 @ lines
|
||||
tst r3, r3
|
||||
subne r0, r0, #(240*32)
|
||||
addne r1, r1, #32
|
||||
movne lr, #256/4
|
||||
moveq lr, #320/4
|
||||
|
||||
rotated_blit_loop8:
|
||||
mov r6, r1
|
||||
ldr r2, [r6], r8
|
||||
ldr r3, [r6], r8
|
||||
ldr r4, [r6], r8
|
||||
ldr r5, [r6], r8
|
||||
|
||||
mov r6, r2, lsl #24
|
||||
mov r6, r6, lsr #8
|
||||
orr r6, r6, r3, lsl #24
|
||||
mov r6, r6, lsr #8
|
||||
orr r6, r6, r4, lsl #24
|
||||
mov r6, r6, lsr #8
|
||||
orr r6, r6, r5, lsl #24
|
||||
str r6, [r0], #-240
|
||||
|
||||
and r6, r3, #0xff00
|
||||
and r7, r2, #0xff00
|
||||
orr r6, r6, r7, lsr #8
|
||||
and r7, r4, #0xff00
|
||||
orr r6, r6, r7, lsl #8
|
||||
and r7, r5, #0xff00
|
||||
orr r6, r6, r7, lsl #16
|
||||
str r6, [r0], #-240
|
||||
|
||||
and r6, r4, #0xff0000
|
||||
and r7, r2, #0xff0000
|
||||
orr r6, r6, r7, lsr #16
|
||||
and r7, r3, #0xff0000
|
||||
orr r6, r6, r7, lsr #8
|
||||
and r7, r5, #0xff0000
|
||||
orr r6, r6, r7, lsl #8
|
||||
str r6, [r0], #-240
|
||||
|
||||
mov r6, r5, lsr #24
|
||||
mov r6, r6, lsl #8
|
||||
orr r6, r6, r4, lsr #24
|
||||
mov r6, r6, lsl #8
|
||||
orr r6, r6, r3, lsr #24
|
||||
mov r6, r6, lsl #8
|
||||
orr r6, r6, r2, lsr #24
|
||||
str r6, [r0], #-240
|
||||
|
||||
subs lr, lr, #1
|
||||
add r1, r1, #4
|
||||
bne rotated_blit_loop8
|
||||
|
||||
ldmfd sp!,{r4-r8,pc}
|
||||
|
||||
|
||||
@ input: r2-r5
|
||||
@ output: r7,r8
|
||||
@ trash: r6
|
||||
.macro rb_line_low
|
||||
mov r6, r2, lsl #16
|
||||
mov r7, r3, lsl #16
|
||||
orr r7, r7, r6, lsr #16
|
||||
mov r6, r4, lsl #16
|
||||
mov r8, r5, lsl #16
|
||||
orr r8, r8, r6, lsr #16
|
||||
.endm
|
||||
|
||||
.macro rb_line_hi
|
||||
mov r6, r2, lsr #16
|
||||
mov r7, r3, lsr #16
|
||||
orr r7, r6, r7, lsl #16
|
||||
mov r6, r4, lsr #16
|
||||
mov r8, r5, lsr #16
|
||||
orr r8, r6, r8, lsl #16
|
||||
.endm
|
||||
|
||||
.global rotated_blit16 @ void *dst, void *linesx4, u32 y, int is_32col
|
||||
rotated_blit16:
|
||||
stmfd sp!,{r4-r8,lr}
|
||||
|
||||
add r0, r0, #(240*320)*2
|
||||
sub r0, r0, #(240+4)*2 @ y starts from 4
|
||||
add r0, r0, r2, lsl #1
|
||||
|
||||
tst r3, r3
|
||||
subne r0, r0, #(240*32)*2
|
||||
addne r1, r1, #32*2
|
||||
movne lr, #256/4
|
||||
moveq lr, #320/4
|
||||
|
||||
rotated_blit_loop16:
|
||||
ldr r2, [r1, #320*0*2]
|
||||
ldr r3, [r1, #320*1*2]
|
||||
ldr r4, [r1, #320*2*2]
|
||||
ldr r5, [r1, #320*3*2]
|
||||
rb_line_low
|
||||
stmia r0, {r7,r8}
|
||||
sub r0, r0, #240*2
|
||||
rb_line_hi
|
||||
stmia r0, {r7,r8}
|
||||
sub r0, r0, #240*2
|
||||
|
||||
ldr r2, [r1, #320*0*2+4]
|
||||
ldr r3, [r1, #320*1*2+4]
|
||||
ldr r4, [r1, #320*2*2+4]
|
||||
ldr r5, [r1, #320*3*2+4]
|
||||
rb_line_low
|
||||
stmia r0, {r7,r8}
|
||||
sub r0, r0, #240*2
|
||||
rb_line_hi
|
||||
stmia r0, {r7,r8}
|
||||
sub r0, r0, #240*2
|
||||
|
||||
subs lr, lr, #1
|
||||
add r1, r1, #8
|
||||
b vidCpyM2_32_loop_out
|
||||
bne rotated_blit_loop16
|
||||
|
||||
ldmfd sp!,{r4-r8,pc}
|
||||
|
||||
|
||||
.global spend_cycles @ c
|
||||
|
@ -213,4 +345,3 @@ spend_cycles:
|
|||
|
||||
bx lr
|
||||
|
||||
|
||||
|
|
32
common/emu.c
32
common/emu.c
|
@ -662,32 +662,36 @@ int emu_write_config(int is_game)
|
|||
|
||||
/* always using built-in font */
|
||||
|
||||
#define mk_text_out(name, type, val) \
|
||||
#define mk_text_out(name, type, val, topleft, step_x, step_y) \
|
||||
void name(int x, int y, const char *text) \
|
||||
{ \
|
||||
int i, l, len = strlen(text); \
|
||||
type *screen = (type *)g_screen_ptr + x + y * g_screen_width; \
|
||||
type *screen = (type *)(topleft) + x * step_x + y * step_y; \
|
||||
\
|
||||
for (i = 0; i < len; i++, screen += 8) \
|
||||
for (i = 0; i < len; i++, screen += 8 * step_x) \
|
||||
{ \
|
||||
for (l = 0; l < 8; l++) \
|
||||
{ \
|
||||
unsigned char fd = fontdata8x8[text[i] * 8 + l];\
|
||||
type *s = screen + l * g_screen_width; \
|
||||
if (fd&0x80) s[0] = val; \
|
||||
if (fd&0x40) s[1] = val; \
|
||||
if (fd&0x20) s[2] = val; \
|
||||
if (fd&0x10) s[3] = val; \
|
||||
if (fd&0x08) s[4] = val; \
|
||||
if (fd&0x04) s[5] = val; \
|
||||
if (fd&0x02) s[6] = val; \
|
||||
if (fd&0x01) s[7] = val; \
|
||||
type *s = screen + l * step_y; \
|
||||
if (fd&0x80) s[step_x * 0] = val; \
|
||||
if (fd&0x40) s[step_x * 1] = val; \
|
||||
if (fd&0x20) s[step_x * 2] = val; \
|
||||
if (fd&0x10) s[step_x * 3] = val; \
|
||||
if (fd&0x08) s[step_x * 4] = val; \
|
||||
if (fd&0x04) s[step_x * 5] = val; \
|
||||
if (fd&0x02) s[step_x * 6] = val; \
|
||||
if (fd&0x01) s[step_x * 7] = val; \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
mk_text_out(emu_textOut8, unsigned char, 0xf0)
|
||||
mk_text_out(emu_textOut16, unsigned short, 0xffff)
|
||||
mk_text_out(emu_text_out8, unsigned char, 0xf0, g_screen_ptr, 1, g_screen_width)
|
||||
mk_text_out(emu_text_out16, unsigned short, 0xffff, g_screen_ptr, 1, g_screen_width)
|
||||
mk_text_out(emu_text_out8_rot, unsigned char, 0xf0,
|
||||
(char *)g_screen_ptr + (g_screen_width - 1) * g_screen_height, -g_screen_height, 1)
|
||||
mk_text_out(emu_text_out16_rot, unsigned short, 0xffff,
|
||||
(short *)g_screen_ptr + (g_screen_width - 1) * g_screen_height, -g_screen_height, 1)
|
||||
|
||||
#undef mk_text_out
|
||||
|
||||
|
|
22
common/emu.h
22
common/emu.h
|
@ -33,6 +33,12 @@ extern int g_screen_height;
|
|||
#define EOPT_CONFIRM_LOAD (1<<11)
|
||||
#define EOPT_A_SN_GAMMA (1<<12)
|
||||
#define EOPT_PSYNC (1<<13)
|
||||
#define EOPT_GIZ_SCANLN (1<<14)
|
||||
#define EOPT_GIZ_DBLBUF (1<<15)
|
||||
#define EOPT_VSYNC_MODE (1<<16)
|
||||
#define EOPT_SHOW_RTC (1<<17)
|
||||
#define EOPT_NO_FRMLIMIT (1<<18)
|
||||
#define EOPT_WIZ_TEAR_FIX (1<<19)
|
||||
|
||||
enum {
|
||||
EOPT_SCALE_NONE = 0,
|
||||
|
@ -42,13 +48,8 @@ enum {
|
|||
};
|
||||
|
||||
typedef struct _currentConfig_t {
|
||||
// char lastRomFile[512];
|
||||
int EmuOpt; // LSb->MSb: use_sram, show_fps, enable_sound, gzip_saves,
|
||||
// mmuhack, no_save_cfg_on_exit, <unused>, 16_bit_mode
|
||||
// craigix_ram, confirm_save, show_cd_leds, confirm_load
|
||||
// A_SNs_gamma, perfect_vsync, giz_scanlines, giz_dblbuff
|
||||
// vsync_mode, show_clock, no_frame_limitter
|
||||
int s_PicoOpt; // for old cfg files only
|
||||
int EmuOpt;
|
||||
int s_PicoOpt;
|
||||
int s_PsndRate;
|
||||
int s_PicoRegion;
|
||||
int s_PicoAutoRgnOrder;
|
||||
|
@ -111,10 +112,13 @@ char *emu_get_save_fname(int load, int is_sram, int slot);
|
|||
int emu_check_save_file(int slot);
|
||||
void emu_setSaveStateCbs(int gz);
|
||||
|
||||
void emu_text_out8 (int x, int y, const char *text);
|
||||
void emu_text_out16(int x, int y, const char *text);
|
||||
void emu_text_out8_rot (int x, int y, const char *text);
|
||||
void emu_text_out16_rot(int x, int y, const char *text);
|
||||
|
||||
void emu_make_path(char *buff, const char *end, int size);
|
||||
void emu_update_input(void);
|
||||
void emu_textOut8 (int x, int y, const char *text);
|
||||
void emu_textOut16(int x, int y, const char *text);
|
||||
void emu_get_game_name(char *str150);
|
||||
void emu_set_fastforward(int set_on);
|
||||
int emu_cd_check(int *pregion, char *fname_in);
|
||||
|
|
|
@ -1495,6 +1495,7 @@ static menu_entry e_menu_gfx_options[] =
|
|||
{
|
||||
mee_cust ("Renderer", MA_OPT_RENDERER, mh_opt_render, mgn_opt_renderer),
|
||||
mee_range_cust("Scaling", MA_OPT_SCALING, currentConfig.scaling, 0, 3, mgn_opt_scaling),
|
||||
mee_onoff ("Tearing Fix", MA_OPT_TEARING_FIX, currentConfig.EmuOpt, EOPT_WIZ_TEAR_FIX),
|
||||
mee_range_cust("Gamma correction", MA_OPT2_GAMMA, currentConfig.gamma, 1, 300, mgn_aopt_gamma),
|
||||
mee_onoff ("A_SN's gamma curve", MA_OPT2_A_SN_GAMMA, currentConfig.EmuOpt, EOPT_A_SN_GAMMA),
|
||||
mee_onoff ("Perfect vsync", MA_OPT2_VSYNC, currentConfig.EmuOpt, EOPT_PSYNC),
|
||||
|
|
|
@ -46,6 +46,7 @@ typedef enum
|
|||
MA_OPT_LOADCFG,
|
||||
MA_OPT_INTERLACED, /* giz */
|
||||
MA_OPT_ROTATION, /* uiq */
|
||||
MA_OPT_TEARING_FIX, /* wiz */
|
||||
MA_OPT2_GAMMA,
|
||||
MA_OPT2_A_SN_GAMMA,
|
||||
MA_OPT2_DBLBUFF, /* giz */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue