aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends/platform/wince/ARMscaler.s184
-rw-r--r--backends/platform/wince/CEScaler.cpp12
-rw-r--r--backends/platform/wince/Makefile42
3 files changed, 219 insertions, 19 deletions
diff --git a/backends/platform/wince/ARMscaler.s b/backends/platform/wince/ARMscaler.s
new file mode 100644
index 0000000000..3397674d2b
--- /dev/null
+++ b/backends/platform/wince/ARMscaler.s
@@ -0,0 +1,184 @@
+@ ScummVM Scumm Interpreter
+@ Copyright (C) 2007 The ScummVM project
+@
+@ This program is free software; you can redistribute it and/or
+@ modify it under the terms of the GNU General Public License
+@ as published by the Free Software Foundation; either version 2
+@ of the License, or (at your option) any later version.
+@
+@ This program is distributed in the hope that it will be useful,
+@ but WITHOUT ANY WARRANTY; without even the implied warranty of
+@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+@ GNU General Public License for more details.
+@
+@ You should have received a copy of the GNU General Public License
+@ along with this program; if not, write to the Free Software
+@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+@
+@ $URL$
+@ $Id$
+@
+@ @author Robin Watts (robin@wss.co.uk)
+
+ .text
+
+ .global PocketPCHalfARM
+
+ @ ARM implementation of PocketPCHalf scaler.
+ @ Scales a width x height block of 16bpp pixels from srcPtr to
+ @ dstPtr. srcPitch and dstPitch identify how to reach subsequent
+ @ lines. redblueMask and round allow for one routine to do both
+ @ 565 and 555 formats.
+PocketPCHalfARM:
+ @ r0 = srcPtr
+ @ r1 = srcPitch
+ @ r2 = dstPtr
+ @ r3 = dstPitch
+ MOV r12,r13
+ STMFD r13!,{r4-r11,r14}
+ LDMIA r12,{r4-r7}
+ @ r4 = width
+ @ r5 = height
+ @ r6 = redblueMask
+ @ r7 = round
+
+ SUB r3,r3,r4 @ dstPitch -= width
+ SUBS r5,r5,#2 @ while ((height-=2) >= 0)
+ BLT end
+height_loop:
+
+ SUBS r11,r4,#8 @ r11= width_minus_8
+ BLT thin
+
+width_loop:
+ @ unroll loop 4 times here
+ LDRH r8,[r0],r1 @ r8 = A = srcPtr[0]
+ LDRH r9,[r0],#2 @ r9 = C = srcPtr[dstPitch]
+ LDRH r12,[r0],-r1 @ r12= D = srcPtr[dstPitch+2]
+ LDRH r14,[r0],#2 @ r14= B = srcPtr[2]
+
+ ORR r8, r8, r8, LSL #16 @ r8 = b | g | r | b | g | r
+ ORR r9, r9, r9, LSL #16 @ r9 = b | g | r | b | g | r
+ ORR r12,r12,r12,LSL #16 @ r12= b | g | r | b | g | r
+ ORR r14,r14,r14,LSL #16 @ r14= b | g | r | b | g | r
+ AND r8, r8, r6 @ r8 = 0 | g | 0 | b | 0 | r
+ AND r9, r9, r6 @ r9 = 0 | g | 0 | b | 0 | r
+ AND r12,r12,r6 @ r12= 0 | g | 0 | b | 0 | r
+ AND r14,r14,r6 @ r14= 0 | g | 0 | b | 0 | r
+ ADD r8, r8, r9
+ ADD r8, r8, r12
+ ADD r8, r8, r14
+ ADD r8, r8, r7 @ r8 = summed pixels + rounding
+ AND r8, r6, r8, LSR #2 @ r8 = 0 | g | 0 | b | 0 | r
+ ORR r10,r8, r8, LSR #16 @ r10= 0 | g | 0 | b | g | r
+
+ LDRH r8,[r0],r1 @ r8 = A = srcPtr[0]
+ LDRH r9,[r0],#2 @ r9 = C = srcPtr[dstPitch]
+ LDRH r12,[r0],-r1 @ r12= D = srcPtr[dstPitch+2]
+ LDRH r14,[r0],#2 @ r14= B = srcPtr[2]
+
+ STRH r10,[r2],#2 @ *dstPtr++
+
+ ORR r8, r8, r8, LSL #16 @ r8 = b | g | r | b | g | r
+ ORR r9, r9, r9, LSL #16 @ r9 = b | g | r | b | g | r
+ ORR r12,r12,r12,LSL #16 @ r12= b | g | r | b | g | r
+ ORR r14,r14,r14,LSL #16 @ r14= b | g | r | b | g | r
+ AND r8, r8, r6 @ r8 = 0 | g | 0 | b | 0 | r
+ AND r9, r9, r6 @ r9 = 0 | g | 0 | b | 0 | r
+ AND r12,r12,r6 @ r12= 0 | g | 0 | b | 0 | r
+ AND r14,r14,r6 @ r14= 0 | g | 0 | b | 0 | r
+ ADD r8, r8, r9
+ ADD r8, r8, r12
+ ADD r8, r8, r14
+ ADD r8, r8, r7 @ r8 = summed pixels + rounding
+ AND r8, r6, r8, LSR #2 @ r8 = 0 | g | 0 | b | 0 | r
+ ORR r10,r8, r8, LSR #16 @ r10= 0 | g | 0 | b | g | r
+
+ LDRH r8,[r0],r1 @ r8 = A = srcPtr[0]
+ LDRH r9,[r0],#2 @ r9 = C = srcPtr[dstPitch]
+ LDRH r12,[r0],-r1 @ r12= D = srcPtr[dstPitch+2]
+ LDRH r14,[r0],#2 @ r14= B = srcPtr[2]
+
+ STRH r10,[r2],#2 @ *dstPtr++
+
+ ORR r8, r8, r8, LSL #16 @ r8 = b | g | r | b | g | r
+ ORR r9, r9, r9, LSL #16 @ r9 = b | g | r | b | g | r
+ ORR r12,r12,r12,LSL #16 @ r12= b | g | r | b | g | r
+ ORR r14,r14,r14,LSL #16 @ r14= b | g | r | b | g | r
+ AND r8, r8, r6 @ r8 = 0 | g | 0 | b | 0 | r
+ AND r9, r9, r6 @ r9 = 0 | g | 0 | b | 0 | r
+ AND r12,r12,r6 @ r12= 0 | g | 0 | b | 0 | r
+ AND r14,r14,r6 @ r14= 0 | g | 0 | b | 0 | r
+ ADD r8, r8, r9
+ ADD r8, r8, r12
+ ADD r8, r8, r14
+ ADD r8, r8, r7 @ r8 = summed pixels + rounding
+ AND r8, r6, r8, LSR #2 @ r8 = 0 | g | 0 | b | 0 | r
+ ORR r10,r8, r8, LSR #16 @ r10= 0 | g | 0 | b | g | r
+
+ LDRH r8,[r0],r1 @ r8 = A = srcPtr[0]
+ LDRH r9,[r0],#2 @ r9 = C = srcPtr[dstPitch]
+ LDRH r12,[r0],-r1 @ r12= D = srcPtr[dstPitch+2]
+ LDRH r14,[r0],#2 @ r14= B = srcPtr[2]
+
+ STRH r10,[r2],#2 @ *dstPtr++
+
+ ORR r8, r8, r8, LSL #16 @ r8 = b | g | r | b | g | r
+ ORR r9, r9, r9, LSL #16 @ r9 = b | g | r | b | g | r
+ ORR r12,r12,r12,LSL #16 @ r12= b | g | r | b | g | r
+ ORR r14,r14,r14,LSL #16 @ r14= b | g | r | b | g | r
+ AND r8, r8, r6 @ r8 = 0 | g | 0 | b | 0 | r
+ AND r9, r9, r6 @ r9 = 0 | g | 0 | b | 0 | r
+ AND r12,r12,r6 @ r12= 0 | g | 0 | b | 0 | r
+ AND r14,r14,r6 @ r14= 0 | g | 0 | b | 0 | r
+ ADD r8, r8, r9
+ ADD r8, r8, r12
+ ADD r8, r8, r14
+ ADD r8, r8, r7 @ r8 = summed pixels + rounding
+ AND r8, r6, r8, LSR #2 @ r8 = 0 | g | 0 | b | 0 | r
+ ORR r10, r8, r8, LSR #16 @ r8 = 0 | g | 0 | b | g | r
+
+ STRH r10,[r2],#2 @ *dstPtr++
+
+ SUBS r11,r11,#8 @ width_minus_8 -= 8
+ BGE width_loop @ (width_minus_8 >= 0) => do 8+ more
+
+thin:
+ ADDS r11,r11,#8 @ r11= width
+ BEQ width_end @ if no more left to do, then bale
+thin_lp:
+ @ single output pixels done in this bit
+ LDRH r8,[r0],r1 @ r8 = A = srcPtr[0]
+ LDRH r9,[r0],#2 @ r9 = C = srcPtr[dstPitch]
+ LDRH r12,[r0],-r1 @ r12= D = srcPtr[dstPitch+2]
+ LDRH r14,[r0],#2 @ r14= B = srcPtr[2]
+
+ ORR r8, r8, r8, LSL #16 @ r8 = b | g | r | b | g | r
+ ORR r9, r9, r9, LSL #16 @ r9 = b | g | r | b | g | r
+ ORR r12,r12,r12,LSL #16 @ r12= b | g | r | b | g | r
+ ORR r14,r14,r14,LSL #16 @ r14= b | g | r | b | g | r
+ AND r8, r8, r6 @ r8 = 0 | g | 0 | b | 0 | r
+ AND r9, r9, r6 @ r9 = 0 | g | 0 | b | 0 | r
+ AND r12,r12,r6 @ r12= 0 | g | 0 | b | 0 | r
+ AND r14,r14,r6 @ r14= 0 | g | 0 | b | 0 | r
+ ADD r8, r8, r9
+ ADD r8, r8, r12
+ ADD r8, r8, r14
+ ADD r8, r8, r7 @ r8 = summed pixels + rounding
+ AND r8, r6, r8, LSR #2 @ r8 = 0 | g | 0 | b | 0 | r
+ ORR r8, r8, r8, LSR #16 @ r8 = 0 | g | 0 | b | g | r
+
+ STRH r8,[r2],#2 @ *dstPtr++
+
+ SUBS r11,r11,#2
+ BGT thin_lp
+width_end:
+ ADD r2,r2,r3 @ dstPtr += dstPitch
+ ADD r0,r0,r1,LSL #1 @ srcPtr += 2*srcPitch
+ SUB r0,r0,r4,LSL #1 @ srcPtr -= 2*width
+
+ SUBS r5,r5,#2
+ BGE height_loop
+
+end:
+ LDMFD r13!,{r4-r11,PC}
diff --git a/backends/platform/wince/CEScaler.cpp b/backends/platform/wince/CEScaler.cpp
index 86fe2a7104..dac46b801a 100644
--- a/backends/platform/wince/CEScaler.cpp
+++ b/backends/platform/wince/CEScaler.cpp
@@ -128,8 +128,19 @@ void PocketPCLandscapeAspect(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr
}
}
+#ifdef ARM
+extern "C" {
+ void PocketPCHalfARM(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height, int mask, int round);
+ // Rounding constants and masks used for different pixel formats
+ int roundingconstants[] = { 0x00200802, 0x00201002 };
+ int redbluegreenMasks[] = { 0x03E07C1F, 0x07E0F81F };
+}
+#endif
void PocketPCHalf(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) {
+#ifdef ARM
+ PocketPCHalfARM(srcPtr, srcPitch, dstPtr, dstPitch, width, height, redbluegreenMasks[maskUsed],roundingconstants[maskUsed]);
+#else
uint8 *work;
int i;
uint16 srcPitch16 = (uint16)(srcPitch / sizeof(uint16));
@@ -151,6 +162,7 @@ void PocketPCHalf(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 ds
srcPtr += 2 * srcPitch;
dstPtr += dstPitch;
}
+#endif
}
diff --git a/backends/platform/wince/Makefile b/backends/platform/wince/Makefile
index 1ec8990ee5..1d08073b1d 100644
--- a/backends/platform/wince/Makefile
+++ b/backends/platform/wince/Makefile
@@ -7,20 +7,21 @@ srcdir = ../../..
VPATH = $(srcdir)
#DISABLE_SCUMM = 1
-DISABLE_SKY = 1
-DISABLE_QUEEN = 1
-DISABLE_GOB = 1
-DISABLE_LURE = 1
-DISABLE_CINE = 1
-DISABLE_SAGA = 1
-DISABLE_KYRA = 1
-DISABLE_AGI = 1
-DISABLE_AGOS = 1
-DISABLE_SWORD1 = 1
-DISABLE_SWORD2 = 1
-DISABLE_TOUCHE = 1
+#DISABLE_SKY = 1
+#DISABLE_QUEEN = 1
+#DISABLE_GOB = 1
+#DISABLE_LURE = 1
+#DISABLE_CINE = 1
+#DISABLE_SAGA = 1
+#DISABLE_KYRA = 1
+#DISABLE_AGI = 1
+#DISABLE_AGOS = 1
+#DISABLE_SWORD1 = 1
+#DISABLE_SWORD2 = 1
+#DISABLE_TOUCHE = 1
DISABLE_PARALLACTION = 1
+DISABLE_HQ_SCALERS = 1
CXX = arm-wince-pe-g++
LD = arm-wince-pe-g++
@@ -33,20 +34,20 @@ RM = rm -f
RM_REC = rm -rf
ECHO = echo -n
CAT = cat
-
+AS = arm-wince-pe-as
DEFINES := -D_WIN32_WCE=300 -DARM -D__ARM__ -D_ARM_ -DUNICODE -DSCUMM_NEED_ALIGNMENT -DFPM_DEFAULT -DUSE_MAD -DNONSTANDARD_PORT -DUSE_TREMOR -DUSE_VORBIS -DUSE_MPEG2 -DWIN32 -DUSE_ZLIB
DEFINES += -D__stdcall= -Dcdecl= -D__cdecl__= -D__cdecl= -Wno-multichar
-#DEFINES += -O2
-DEFINES += -DDEBUG -DUSE_WINDBG -g
+#DEFINES += -DDEBUG -DUSE_WINDBG -g
+DEFINES += -O2
-INCLUDES := -I$(srcdir) -I. -I$(srcdir)/engines -Ilibs/include -Ilibs/include/sdl -ICEgui -ICEkeys
+INCLUDES := -I$(srcdir) -I. -I$(srcdir)/engines -Imissing/gcc -Ilibs/include -Ilibs/include/sdl -ICEgui -ICEkeys -I/cygdrive/e/wince-gcc-root/include
CFLAGS :=
CXXFLAGS := $(CFLAGS)
-LDFLAGS := -Llibs/lib -L/usr/local/wince/cross-tools/lib
+LDFLAGS := -Llibs/lib -L/cygdrive/e/wince-gcc-root/lib
LIBS := -lSDL -lzlib -lmad -lmpeg2 -ltremorce --entry WinMainCRTStartup
TARGET = scummvm.exe
@@ -62,18 +63,21 @@ OBJS += CEkeys/EventsBuffer.o
OBJS += $(srcdir)/gui/Actions.o $(srcdir)/gui/Key.o $(srcdir)/gui/KeysDialog.o
OBJS += ../sdl/sdl.o ../sdl/graphics.o ../sdl/events.o
OBJS += missing/missing.o
-OBJS += PocketSCUMM.o
+OBJS += PocketSCUMM.o ARMscaler.o
include $(srcdir)/Makefile.common
all: dist
dist: $(TARGET)
- bzip2 -fvk $(TARGET)
+# bzip2 -fvk $(TARGET)
$(STRIP) $(TARGET)
PocketSCUMM.o:
$(WINDRES) $*.rc $@
+ARMscaler.o:
+ $(AS) $*.s -o $@
+
$(TARGET): $(OBJS)
$(LD) $^ $(LDFLAGS) $(LIBS) -o $@ -Wl,-Map,scummvm.exe.map -Wl,--stack,65536