added upscaler
This commit is contained in:
parent
4cdfc0bc7b
commit
788343bb4c
|
@ -16,7 +16,7 @@ endif
|
||||||
|
|
||||||
OBJS = main.o cpu.o memory.u video.o input.o sound.o gp2x.o gui.o \
|
OBJS = main.o cpu.o memory.u video.o input.o sound.o gp2x.o gui.o \
|
||||||
cheats.o zip.o cpu_threaded.z arm_stub.o video_blend.o \
|
cheats.o zip.o cpu_threaded.z arm_stub.o video_blend.o \
|
||||||
flush_cache.o warm.o sys_cacheflush.o
|
warm.o sys_cacheflush.o upscale_aspect.o
|
||||||
BIN = gpsp.gpe
|
BIN = gpsp.gpe
|
||||||
|
|
||||||
# Platform specific definitions
|
# Platform specific definitions
|
||||||
|
@ -57,6 +57,9 @@ LIBS += -ggdb
|
||||||
%.o: %.S
|
%.o: %.S
|
||||||
$(CC) $(ASFLAGS) $(INCLUDES) -c -o $@ $<
|
$(CC) $(ASFLAGS) $(INCLUDES) -c -o $@ $<
|
||||||
|
|
||||||
|
%.o: %.s
|
||||||
|
$(CC) $(ASFLAGS) $(INCLUDES) -c -o $@ $<
|
||||||
|
|
||||||
all: $(OBJS)
|
all: $(OBJS)
|
||||||
$(CC) $(OBJS) $(LIBS) -o $(BIN)
|
$(CC) $(OBJS) $(LIBS) -o $(BIN)
|
||||||
# $(STRIP) $(BIN)
|
# $(STRIP) $(BIN)
|
||||||
|
|
|
@ -0,0 +1,320 @@
|
||||||
|
/*
|
||||||
|
* 240x160 -> 320x213 upscaler for ARM with interpolation
|
||||||
|
*
|
||||||
|
* Written by Gražvydas "notaz" Ignotas
|
||||||
|
* Prototyped by Rokas
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the organization nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* 0 1 2 : 3 4 5
|
||||||
|
* 6 7 8 : 9 10 11
|
||||||
|
* 12 13 14 : 15 16 17
|
||||||
|
* v
|
||||||
|
* 0 1 2 3 : 4 5 6 7
|
||||||
|
* 8 9 10 11 : 12 13 14 15
|
||||||
|
* 16 17 18 19 : 20 21 22 23
|
||||||
|
* 24 25 26 27 : 28 29 30 31
|
||||||
|
*/
|
||||||
|
|
||||||
|
.macro unpack_hi dst, src
|
||||||
|
mov \dst, \src, lsr #16
|
||||||
|
orr \dst, \dst, lsl #16
|
||||||
|
and \dst, \dst, lr
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro unpack_lo dst, src
|
||||||
|
mov \dst, \src, lsl #16
|
||||||
|
orr \dst, \dst, lsr #16
|
||||||
|
and \dst, \dst, lr
|
||||||
|
.endm
|
||||||
|
|
||||||
|
@ do 3:5 summing: r2 = (s1*3 + s2*5 + 4) / 8
|
||||||
|
@ s2 != r2
|
||||||
|
.macro do_3_5 s1, s2
|
||||||
|
add r2,\s1,\s1, lsl #1 @ r2 = s1 * 3
|
||||||
|
add r2, r2,\s2, lsl #2
|
||||||
|
add r2, r2,\s2 @ r2 += s2 * 5
|
||||||
|
add r2, r2, r12,lsl #2 @ sum += round * 4
|
||||||
|
and r2, lr, r2, lsr #3 @ mask_to_unpacked(sum / 8)
|
||||||
|
.endm
|
||||||
|
|
||||||
|
@ do 14:7:7:4: r2 = (s1*14 + s2*7 + s3*7 + s4*4 + 16) / 32
|
||||||
|
@ {s2,s3,s4} != r2
|
||||||
|
.macro do_14_7_7_4 s1, s2, s3, s4
|
||||||
|
mov r2,\s1, lsl #4
|
||||||
|
sub r2, r2,\s1, lsl #1 @ r2 = s1 * 14
|
||||||
|
add r2, r2,\s2, lsl #3
|
||||||
|
sub r2, r2,\s2 @ r2 += s2 * 7
|
||||||
|
add r2, r2,\s3, lsl #3
|
||||||
|
sub r2, r2,\s3 @ r2 += s3 * 7
|
||||||
|
add r2, r2,\s4, lsl #2 @ r2 += s4 * 4
|
||||||
|
add r2, r2, r12,lsl #3 @ sum += round * 16
|
||||||
|
and r2, lr, r2, lsr #5 @ mask_to_unpacked(sum / 32)
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.global upscale_aspect @ u16 *dst, u16 *src
|
||||||
|
upscale_aspect:
|
||||||
|
stmfd sp!,{r4-r11,lr}
|
||||||
|
mov lr, #0x0000001f
|
||||||
|
orr lr, lr, #0x0000f800 @ for "unpacked" form of
|
||||||
|
orr lr, lr, #0x07e00000 @ 00000ggg'ggg00000'rrrrr000'000bbbbb
|
||||||
|
mov r12, #0x00000001
|
||||||
|
orr r12,r12,#0x00000800
|
||||||
|
orr r12,r12,#0x00200000 @ rounding constant
|
||||||
|
|
||||||
|
mov r8, #((240/6)-1) << 24 @ cols
|
||||||
|
orr r8, r8, #160/3 @ rows
|
||||||
|
|
||||||
|
add r0, r0, #320*2*13
|
||||||
|
loop1:
|
||||||
|
ldr r10,[r1]
|
||||||
|
ldr r11,[r1, #320*2*1]
|
||||||
|
|
||||||
|
unpack_lo r4, r10
|
||||||
|
unpack_hi r5, r10
|
||||||
|
unpack_lo r6, r11
|
||||||
|
unpack_hi r7, r11
|
||||||
|
|
||||||
|
ldr r11,[r1, #4]
|
||||||
|
|
||||||
|
do_3_5 r4, r5
|
||||||
|
orr r2, r2, r2, lsr #16
|
||||||
|
mov r3, r10, lsl #16
|
||||||
|
mov r3, r3, lsr #16
|
||||||
|
orr r2, r3, r2, lsl #16
|
||||||
|
str r2, [r0] @ 0,1
|
||||||
|
|
||||||
|
ldr r10,[r1, #320*2*2]
|
||||||
|
|
||||||
|
do_3_5 r4, r6
|
||||||
|
orr r3, r2, r2, lsl #16
|
||||||
|
mov r3, r3, lsr #16 @ 8
|
||||||
|
|
||||||
|
do_14_7_7_4 r7, r5, r6, r4
|
||||||
|
orr r2, r2, r2, lsr #16
|
||||||
|
orr r2, r3, r2, lsl #16
|
||||||
|
str r2, [r0, #320*2*1] @ 8,9
|
||||||
|
|
||||||
|
unpack_lo r4, r10
|
||||||
|
unpack_hi r9, r10
|
||||||
|
|
||||||
|
do_3_5 r4, r6
|
||||||
|
orr r3, r2, r2, lsl #16
|
||||||
|
mov r3, r3, lsr #16
|
||||||
|
|
||||||
|
do_14_7_7_4 r7, r9, r6, r4
|
||||||
|
orr r2, r2, r2, lsr #16
|
||||||
|
orr r2, r3, r2, lsl #16
|
||||||
|
str r2, [r0, #320*2*2] @ 16,17
|
||||||
|
|
||||||
|
do_3_5 r4, r9
|
||||||
|
orr r2, r2, r2, lsr #16
|
||||||
|
mov r3, r10, lsl #16
|
||||||
|
mov r3, r3, lsr #16
|
||||||
|
orr r2, r3, r2, lsl #16
|
||||||
|
str r2, [r0, #320*2*3] @ 24,25
|
||||||
|
|
||||||
|
ldr r10,[r1, #320*2*1+4]
|
||||||
|
|
||||||
|
unpack_lo r6, r11
|
||||||
|
unpack_lo r4, r10
|
||||||
|
|
||||||
|
do_3_5 r6, r5
|
||||||
|
orr r2, r2, r2, lsl #16
|
||||||
|
mov r3, r11, lsl #16
|
||||||
|
orr r2, r3, r2, lsr #16
|
||||||
|
str r2, [r0, #4] @ 2,3
|
||||||
|
|
||||||
|
do_14_7_7_4 r7, r4, r5, r6
|
||||||
|
orr r2, r2, r2, lsl #16
|
||||||
|
mov r3, r2, lsr #16
|
||||||
|
|
||||||
|
ldr r5, [r1, #320*2*2+4]
|
||||||
|
|
||||||
|
do_3_5 r6, r4
|
||||||
|
orr r2, r2, r2, lsr #16
|
||||||
|
orr r2, r3, r2, lsl #16
|
||||||
|
str r2, [r0, #320*2*1+4] @ 10,11
|
||||||
|
|
||||||
|
unpack_lo r6, r5
|
||||||
|
|
||||||
|
do_14_7_7_4 r7, r4, r9, r6
|
||||||
|
orr r2, r2, r2, lsl #16
|
||||||
|
mov r3, r2, lsr #16
|
||||||
|
|
||||||
|
do_3_5 r6, r4
|
||||||
|
orr r2, r2, r2, lsr #16
|
||||||
|
orr r2, r3, r2, lsl #16
|
||||||
|
str r2, [r0, #320*2*2+4] @ 18,19
|
||||||
|
|
||||||
|
unpack_hi r4, r10
|
||||||
|
|
||||||
|
ldr r10,[r1, #8]
|
||||||
|
|
||||||
|
do_3_5 r6, r9
|
||||||
|
orr r2, r2, r2, lsl #16
|
||||||
|
mov r2, r2, lsr #16
|
||||||
|
orr r2, r2, r5, lsl #16
|
||||||
|
str r2, [r0, #320*2*3+4] @ 26,27
|
||||||
|
|
||||||
|
unpack_hi r6, r11
|
||||||
|
unpack_lo r7, r10
|
||||||
|
|
||||||
|
do_3_5 r6, r7
|
||||||
|
orr r2, r2, r2, lsr #16
|
||||||
|
mov r2, r2, lsl #16
|
||||||
|
orr r2, r2, r11,lsr #16
|
||||||
|
str r2, [r0, #8] @ 4,5
|
||||||
|
|
||||||
|
ldr r11,[r1, #320*2*1+8]
|
||||||
|
|
||||||
|
unpack_hi r9, r10
|
||||||
|
|
||||||
|
do_3_5 r9, r7
|
||||||
|
orr r2, r2, r2, lsr #16
|
||||||
|
mov r2, r2, lsl #16
|
||||||
|
orr r2, r2, r10,lsr #16
|
||||||
|
mov r2, r2, ror #16
|
||||||
|
str r2, [r0, #12] @ 6,7
|
||||||
|
|
||||||
|
unpack_lo r10,r11
|
||||||
|
|
||||||
|
do_3_5 r6, r4
|
||||||
|
orr r2, r2, r2, lsl #16
|
||||||
|
mov r3, r2, lsr #16
|
||||||
|
|
||||||
|
do_14_7_7_4 r10, r4, r7, r6
|
||||||
|
orr r2, r2, r2, lsr #16
|
||||||
|
orr r2, r3, r2, lsl #16
|
||||||
|
str r2, [r0, #320*2*1+8] @ 12,13
|
||||||
|
|
||||||
|
unpack_hi r6, r11
|
||||||
|
|
||||||
|
ldr r11,[r1, #320*2*2+8]
|
||||||
|
|
||||||
|
do_14_7_7_4 r10, r6, r7, r9
|
||||||
|
orr r2, r2, r2, lsl #16
|
||||||
|
mov r3, r2, lsr #16
|
||||||
|
|
||||||
|
do_3_5 r9, r6
|
||||||
|
orr r2, r2, r2, lsr #16
|
||||||
|
orr r2, r3, r2, lsl #16
|
||||||
|
str r2, [r0, #320*2*1+12] @ 14,15
|
||||||
|
|
||||||
|
unpack_hi r7, r5
|
||||||
|
unpack_lo r9, r11
|
||||||
|
|
||||||
|
do_3_5 r7, r4
|
||||||
|
orr r2, r2, r2, lsl #16
|
||||||
|
mov r3, r2, lsr #16
|
||||||
|
|
||||||
|
do_14_7_7_4 r10, r4, r9, r7
|
||||||
|
orr r2, r2, r2, lsr #16
|
||||||
|
orr r2, r3, r2, lsl #16
|
||||||
|
str r2, [r0, #320*2*2+8] @ 20,21
|
||||||
|
|
||||||
|
do_3_5 r7, r9
|
||||||
|
orr r2, r2, r2, lsr #16
|
||||||
|
mov r2, r2, lsl #16
|
||||||
|
orr r2, r2, r5, lsr #16
|
||||||
|
str r2, [r0, #320*2*3+8] @ 28,29
|
||||||
|
|
||||||
|
unpack_hi r5, r11
|
||||||
|
|
||||||
|
do_14_7_7_4 r10, r6, r9, r5
|
||||||
|
orr r2, r2, r2, lsl #16
|
||||||
|
mov r3, r2, lsr #16
|
||||||
|
|
||||||
|
do_3_5 r5, r6
|
||||||
|
orr r2, r2, r2, lsr #16
|
||||||
|
orr r2, r3, r2, lsl #16
|
||||||
|
str r2, [r0, #320*2*2+12] @ 22,23
|
||||||
|
|
||||||
|
do_3_5 r5, r9
|
||||||
|
orr r2, r2, r2, lsr #16
|
||||||
|
mov r3, r11, lsr #16
|
||||||
|
orr r2, r3, r2, lsl #16
|
||||||
|
mov r2, r2, ror #16
|
||||||
|
str r2, [r0, #320*2*3+12] @ 30,31
|
||||||
|
|
||||||
|
add r0, r0, #16
|
||||||
|
add r1, r1, #12
|
||||||
|
|
||||||
|
subs r8, r8, #1<<24
|
||||||
|
bpl loop1
|
||||||
|
|
||||||
|
add r0, r0, #320*3*2
|
||||||
|
add r1, r1, #(320*2+80)*2
|
||||||
|
sub r8, r8, #1
|
||||||
|
tst r8, #0xff
|
||||||
|
add r8, r8, #(240/6) << 24 @ cols
|
||||||
|
bne loop1
|
||||||
|
|
||||||
|
@@ last line
|
||||||
|
mov r8, #240/6
|
||||||
|
|
||||||
|
loop2:
|
||||||
|
ldmia r1!,{r9,r10,r11}
|
||||||
|
|
||||||
|
unpack_lo r4, r9
|
||||||
|
unpack_hi r5, r9
|
||||||
|
|
||||||
|
do_3_5 r4, r5
|
||||||
|
orr r2, r2, r2, lsr #16
|
||||||
|
mov r3, r9, lsl #16
|
||||||
|
mov r3, r3, lsr #16
|
||||||
|
orr r2, r3, r2, lsl #16
|
||||||
|
str r2, [r0], #4
|
||||||
|
|
||||||
|
unpack_lo r6, r10
|
||||||
|
unpack_hi r7, r10
|
||||||
|
|
||||||
|
do_3_5 r6, r5
|
||||||
|
orr r2, r2, r2, lsl #16
|
||||||
|
mov r2, r2, lsr #16
|
||||||
|
orr r2, r2, r10,lsl #16
|
||||||
|
str r2, [r0], #4
|
||||||
|
|
||||||
|
unpack_lo r4, r11
|
||||||
|
unpack_hi r5, r11
|
||||||
|
|
||||||
|
do_3_5 r7, r4
|
||||||
|
orr r2, r2, r2, lsr #16
|
||||||
|
mov r3, r10, lsr #16
|
||||||
|
orr r2, r3, r2, lsl #16
|
||||||
|
str r2, [r0], #4
|
||||||
|
|
||||||
|
do_3_5 r5, r4
|
||||||
|
orr r2, r2, r2, lsr #16
|
||||||
|
mov r3, r11, lsr #16
|
||||||
|
orr r2, r3, r2, lsl #16
|
||||||
|
mov r2, r2, ror #16
|
||||||
|
str r2, [r0], #4
|
||||||
|
|
||||||
|
subs r8, r8, #1
|
||||||
|
bne loop2
|
||||||
|
|
||||||
|
ldmfd sp!,{r4-r11,pc}
|
||||||
|
|
||||||
|
@ vim:filetype=armasm
|
||||||
|
|
16
video.c
16
video.c
|
@ -3339,6 +3339,12 @@ void flip_screen()
|
||||||
|
|
||||||
void flip_screen()
|
void flip_screen()
|
||||||
{
|
{
|
||||||
|
if((screen_scale == scaled_aspect) &&
|
||||||
|
(resolution_width == small_resolution_width) &&
|
||||||
|
(resolution_height == small_resolution_height))
|
||||||
|
{
|
||||||
|
upscale_aspect(gpsp_gp2x_screen, screen_pixels);
|
||||||
|
}
|
||||||
pollux_video_flip();
|
pollux_video_flip();
|
||||||
screen_pixels = (u16 *)gpsp_gp2x_screen + screen_offset;
|
screen_pixels = (u16 *)gpsp_gp2x_screen + screen_offset;
|
||||||
}
|
}
|
||||||
|
@ -3692,13 +3698,19 @@ void video_resolution_large()
|
||||||
|
|
||||||
void video_resolution_small()
|
void video_resolution_small()
|
||||||
{
|
{
|
||||||
screen_offset = 320*40 + 40;
|
if(screen_scale == scaled_aspect)
|
||||||
|
screen_offset = 320*(80 - 14) + 80;
|
||||||
|
else
|
||||||
|
screen_offset = 320*40 + 40;
|
||||||
resolution_width = 240;
|
resolution_width = 240;
|
||||||
resolution_height = 160;
|
resolution_height = 160;
|
||||||
|
|
||||||
fb_use_buffers(999);
|
fb_use_buffers(3);
|
||||||
clear_screen(0);
|
clear_screen(0);
|
||||||
flip_screen();
|
flip_screen();
|
||||||
|
clear_screen(0);
|
||||||
|
flip_screen();
|
||||||
|
clear_screen(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_gba_resolution(video_scale_type scale)
|
void set_gba_resolution(video_scale_type scale)
|
||||||
|
|
Loading…
Reference in New Issue