aboutsummaryrefslogtreecommitdiff
path: root/backends/platform/iphone/blit_arm.s
blob: 04f9a87614910cad07615ffc23be60e51b31e30f (plain)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
@ ScummVM - Graphic Adventure Engine
@
@ ScummVM is the legal property of its developers, whose names
@ are too numerous to list here. Please refer to the COPYRIGHT
@ file distributed with this source distribution.
@
@ 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.
@
@ @author Robin Watts (robin@wss.co.uk)

	.text

	.global	_blitLandscapeScreenRect16bpp
	.global	_blitLandscapeScreenRect8bpp


_blitLandscapeScreenRect16bpp:
	@ r0 = dst
	@ r1 = src
	@ r2 = w
	@ r3 = h
	@ <> = _screenWidth
	@ <> = _screenHeight
	mov		r12,r13
	stmfd	r13!,{r4-r11,r14}
	ldmfd	r12,{r12,r14}		@ r12 = _screenWidth
					@ r14 = _screenHeight
	add	r14,r14,r3		@ r14 = _screenHeight + h
	mvn	r11,#0
	mla	r11,r3,r12,r11		@ r11= _screenWidth*h-1
	add	r12,r12,r12
xloop:
	subs	r4,r3,#5		@ r4 = y = h
	ble		thin
yloop:
	ldrh	r5, [r1],r12		@ r5 = *src    src += _screenWidth
	ldrh	r6, [r1],r12		@ r6 = *src    src += _screenWidth
	ldrh	r7, [r1],r12		@ r7 = *src    src += _screenWidth
	ldrh	r8, [r1],r12		@ r8 = *src    src += _screenWidth
	ldrh	r9, [r1],r12		@ r9 = *src    src += _screenWidth
	ldrh	r10,[r1],r12		@ r10= *src    src += _screenWidth
	subs	r4,r4,#6
	strh	r5, [r0],#2		@ *dst++ = r5
	strh	r6, [r0],#2		@ *dst++ = r6
	strh	r7, [r0],#2		@ *dst++ = r7
	strh	r8, [r0],#2		@ *dst++ = r8
	strh	r9, [r0],#2		@ *dst++ = r9
	strh	r10,[r0],#2		@ *dst++ = r10
	bgt		yloop
thin:
	adds	r4,r4,#5
	beq		lineend
thin_loop:
	ldrh	r5,[r1],r12		@ r5 = *src    src += _screenWidth
	subs	r4,r4,#1
	strh	r5,[r0],#2		@ *dst++ = r5
	bgt	thin_loop
lineend:
	sub	r0,r0,r14,LSL #1	@ dst -= _screenHeight + h
	sub	r1,r1,r11,LSL #1	@ src += 1-_screenWidth*h
	subs	r2,r2,#1
	bgt	xloop

	ldmfd	r13!,{r4-r11,PC}

_blitLandscapeScreenRect8bpp:
	@ r0 = dst
	@ r1 = src
	@ r2 = w
	@ r3 = h
	@ <> = _palette
	@ <> = _screenWidth
	@ <> = _screenHeight
	mov		r12,r13
	stmfd	r13!,{r4-r11,r14}
	ldmfd	r12,{r11,r12,r14}	@ r11 = _palette
					@ r12 = _screenWidth
					@ r14 = _screenHeight
	add		r14,r14,r3		@ r14 = _screenHeight + h
	mvn		r6,#0
	mla		r6,r3,r12,r6		@ r6 = _screenWidth*h-1
xloop8:
	mov		r4,r3			@ r4 = y = h
	subs	r4,r3,#4		@ r4 = y = h
	ble		thin8
yloop8:
	ldrb	r5, [r1],r12		@ r5 = *src    src += _screenWidth
	ldrb	r7, [r1],r12		@ r7 = *src    src += _screenWidth
	ldrb	r8, [r1],r12		@ r8 = *src    src += _screenWidth
	ldrb	r9, [r1],r12		@ r9 = *src    src += _screenWidth
	ldrb	r10,[r1],r12		@ r10= *src    src += _screenWidth
	add	r5, r5, r5
	add	r7, r7, r7
	add	r8, r8, r8
	add	r9, r9, r9
	add	r10,r10,r10
	ldrh	r5, [r11,r5]
	ldrh	r7, [r11,r7]
	ldrh	r8, [r11,r8]
	ldrh	r9, [r11,r9]
	ldrh	r10,[r11,r10]
	subs	r4,r4,#5
	strh	r5, [r0],#2		@ *dst++ = r5
	strh	r7, [r0],#2		@ *dst++ = r7
	strh	r8, [r0],#2		@ *dst++ = r8
	strh	r9, [r0],#2		@ *dst++ = r9
	strh	r10,[r0],#2		@ *dst++ = r10
	bgt	yloop8
thin8:
	adds	r4,r4,#4
	beq		lineend8
thin_loop8:
	ldrb	r5,[r1],r12		@ r5 = *src    src += _screenWidth
	add	r5,r5,r5
	ldrh	r5,[r11,r5]
	subs	r4,r4,#1
	strh	r5,[r0],#2		@ *dst++ = r5
	bgt	thin_loop8
lineend8:
	sub	r0,r0,r14,LSL #1	@ dst -= _screenHeight + h
	sub	r1,r1,r6		@ src += 1-_screenWidth*h
	subs	r2,r2,#1
	bgt	xloop8

	ldmfd	r13!,{r4-r11,PC}