summaryrefslogtreecommitdiff
path: root/apps/plugins/pacbox/pacbox_cf.S
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/pacbox/pacbox_cf.S')
-rw-r--r--apps/plugins/pacbox/pacbox_cf.S215
1 files changed, 155 insertions, 60 deletions
diff --git a/apps/plugins/pacbox/pacbox_cf.S b/apps/plugins/pacbox/pacbox_cf.S
index 7dc6140b44..5d3185eca2 100644
--- a/apps/plugins/pacbox/pacbox_cf.S
+++ b/apps/plugins/pacbox/pacbox_cf.S
@@ -21,6 +21,10 @@
21 21
22 .section .text 22 .section .text
23 .align 2 23 .align 2
24
25
26#if defined(IRIVER_H300_SERIES) && !defined(SIMULATOR)
27
24 .global blit_display 28 .global blit_display
25 29
26/* 30/*
@@ -57,99 +61,190 @@ void blit_display(fb_data* lcd_framebuffer, unsigned char* vbuf)
57#define SHRUNK_WIDTH ((ScreenWidth/4)*3) 61#define SHRUNK_WIDTH ((ScreenWidth/4)*3)
58#define SHRUNK_HEIGHT ((ScreenHeight/4)*3) 62#define SHRUNK_HEIGHT ((ScreenHeight/4)*3)
59 63
64#define BD_SAVE (9 * 4)
65
66process_4_pixels:
67 move.b %d4, %d2
68 move.w (%a1, %d2.l * 2), %d3
69 move.w %d3, (2 * LCD_WIDTH * 2)(%a0)
70
71 lsr.l #8, %d4
72 move.b %d4, %d2
73 move.w (%a1, %d2.l * 2), %d3
74 move.w %d3, (1 * LCD_WIDTH * 2)(%a0)
75
76 swap.w %d4
77 move.b %d4, %d2
78 move.w (%a1, %d2.l * 2), (%a0)
79
80 lea.l 3 * LCD_WIDTH * 2(%a0), %a0
81 rts
82
83process_line:
84 move.l %a3, %d1
85bd_x_loop:
86 movem.l (%a2), %d4-%d7 // Read 16 pixels
87
88 bsr.s process_4_pixels
89 move.l %d5, %d4
90 bsr.s process_4_pixels
91 move.l %d6, %d4
92 bsr.s process_4_pixels
93 move.l %d7, %d4
94 bsr.s process_4_pixels
95
96 lea 16(%a2), %a2
97 subq.l #1, %d1;
98 bne.s bd_x_loop
99
100 rts
101
60blit_display: 102blit_display:
61 lea -28(%sp), %sp 103 lea -BD_SAVE(%sp), %sp
62 movem.l %d2-%d6/%a2, (%sp) 104 movem.l %d2-%d7/%a2-%a4, (%sp)
63 105
64 move.l 32(%sp), %a0 // lcd_framebuffer 106 move.l BD_SAVE + 4(%sp), %a0 // lcd_framebuffer
65 move.l 36(%sp), %a2 // vbuf 107 move.l BD_SAVE + 8(%sp), %a2 // vbuf
66 108
67 lea palette, %a1 109 lea palette, %a1
68 110
69 lea.l ((YOFS * LCD_WIDTH + XOFS + SHRUNK_HEIGHT) * 2)(%a0), %a0 111 lea.l ((YOFS * LCD_WIDTH + XOFS + SHRUNK_HEIGHT) * 2)(%a0), %a0
70 112
71 move.l #(ScreenHeight / 4), %d0 113 move.l #(ScreenHeight / 4), %d0
72 move.l #(ScreenWidth / 4), %d1 114 move.l #(ScreenWidth / 16), %a3
115 move.l #(LCD_WIDTH * SHRUNK_WIDTH + 1) * 2, %a4
73 moveq.l #0, %d2 116 moveq.l #0, %d2
74 117
75y_loop: 118bd_y_loop:
76 move.l %d1, %d5 119 bsr.s process_line
77x_loop1:
78 move.l (%a2)+, %d3
79 120
80 move.b %d3, %d2 121 suba.l %a4, %a0
81 move.w (%a1, %d2.l * 2), %d6 122 lea.l ScreenWidth(%a2), %a2 // Skip 1 line
82 move.w %d6, (2 * LCD_WIDTH * 2)(%a0)
83 123
84 lsr.l #8, %d3 124 bsr.s process_line
85 move.b %d3, %d2
86 move.w (%a1, %d2.l * 2), %d6
87 move.w %d6, (1 * LCD_WIDTH * 2)(%a0)
88 125
89 swap.w %d3 126 suba.l %a4, %a0
90 move.b %d3, %d2
91 move.w (%a1, %d2.l * 2), (%a0)
92 127
93 lea.l 3 * LCD_WIDTH * 2(%a0), %a0 128 bsr.s process_line
94 129
95 subq.l #1, %d5 130 suba.l %a4, %a0
96 bne.s x_loop1
97 131
98 suba.l #(LCD_WIDTH * SHRUNK_WIDTH + 1) * 2, %a0 132 subq.l #1, %d0
99 lea.l ScreenWidth(%a2), %a2 // Skip 1 line 133 bne bd_y_loop
100 134
101 move.l %d1, %d5 135 movem.l (%sp), %d2-%d7/%a2-%a4
102x_loop2: 136 lea.l BD_SAVE(%sp), %sp
103 move.l (%a2)+, %d3 137 rts
104 138
105 move.b %d3, %d2 139#endif /* defined(IRIVER_H300_SERIES) && !defined(SIMULATOR) */
106 move.w (%a1, %d2.l * 2), %d6
107 move.w %d6, 2 * LCD_WIDTH * 2(%a0)
108 140
109 lsr.l #8, %d3
110 move.b %d3, %d2
111 move.w (%a1, %d2.l * 2), %d6
112 move.w %d6, 1 * LCD_WIDTH * 2(%a0)
113 141
114 swap.w %d3 142/* See arcade.c for the C implementation of drawChar */
115 move.b %d3, %d2 143/* Note! This version does not handle flipped screen mode. */
116 move.w (%a1, %d2.l * 2), (%a0) 144
145 .global drawChar
117 146
118 lea.l 3 * LCD_WIDTH * 2(%a0), %a0 147#define DC_SAVE (4 * 4)
119 148
120 subq.l #1, %d5 149drawChar:
121 bne.s x_loop2 150 lea -DC_SAVE(%sp), %sp
151 movem.l %d2-%d5, (%sp)
122 152
123 suba.l #(LCD_WIDTH * SHRUNK_WIDTH + 1) * 2, %a0 153 movea.l DC_SAVE + 4(%sp), %a0 // buffer
124 154
125 move.l %d1, %d5 155 move.l DC_SAVE + 16(%sp), %d0 // oy
126x_loop3: 156 move.l %d0, %d1
127 move.l (%a2)+, %d3 157 lsl.l #8, %d0
158 lsl.l #5, %d1
159 sub.l %d1, %d0
160 adda.l %d0, %a0
161 adda.l DC_SAVE + 12(%sp), %a0 // ox
128 162
129 move.b %d3, %d2 163 move.l DC_SAVE + 20(%sp), %d0 // color
130 move.w (%a1, %d2.l * 2), %d6 164 and.l #0x3F, %d0
131 move.w %d6, 2 * LCD_WIDTH * 2(%a0) 165 bne.s have_color
166
167 moveq.l #8, %d1
168 moveq.l #0, %d2
169 moveq.l #0, %d3
170
171clear_loop:
172 movem.l %d2-%d3, (%a0)
173 lea 224(%a0), %a0
174
175 subq.l #1, %d1
176 bne.s clear_loop
177
178 bra.s dc_exit
179
180have_color:
181 lsl.l #2, %d0
182
183 lea.l charmap_, %a1
184 move.l DC_SAVE + 8(%sp), %d2 // index
185 lsl.l #6, %d2
186 adda.l %d2, %a1
132 187
133 lsr.l #8, %d3 188 moveq.l #8, %d1
189 moveq.l #0, %d3
190 moveq.l #24, %d5
191
192dc_y_loop:
193 move.l (%a1)+, %d3
194 move.l %d3, %d4
195
196 move.l %d3, %d2 // Pixel 1
197 lsr.l %d5, %d2
198 add.l %d0, %d2
199 lsl.l #8, %d2
200
201 swap.w %d4 // Pixel 2
202 move.b %d4, %d2
203 add.l %d0, %d2
204 lsl.l #8, %d2
205
206 lsr.l #8, %d3 // Pixel 3
134 move.b %d3, %d2 207 move.b %d3, %d2
135 move.w (%a1, %d2.l * 2), %d6 208 add.l %d0, %d2
136 move.w %d6, 1 * LCD_WIDTH * 2(%a0) 209 lsl.l #8, %d2
210
211 swap.w %d4 // Pixel 4
212 move.b %d4, %d2
213 add.l %d0, %d2
214
215 move.l %d2, (%a0)+
137 216
138 swap.w %d3 217 move.l (%a1)+, %d3
218 move.l %d3, %d4
219
220 move.l %d3, %d2 // Pixel 1
221 lsr.l %d5, %d2
222 add.l %d0, %d2
223 lsl.l #8, %d2
224
225 swap.w %d4 // Pixel 2
226 move.b %d4, %d2
227 add.l %d0, %d2
228 lsl.l #8, %d2
229
230 lsr.l #8, %d3 // Pixel 3
139 move.b %d3, %d2 231 move.b %d3, %d2
140 move.w (%a1, %d2.l * 2), (%a0) 232 add.l %d0, %d2
233 lsl.l #8, %d2
141 234
142 lea.l 3 * LCD_WIDTH * 2(%a0), %a0 235 swap.w %d4 // Pixel 4
236 move.b %d4, %d2
237 add.l %d0, %d2
143 238
144 subq.l #1, %d5 239 move.l %d2, (%a0)+
145 bne.s x_loop3
146 240
147 suba.l #(LCD_WIDTH * SHRUNK_WIDTH + 1) * 2, %a0 241 lea 216(%a0), %a0
148 242
149 subq.l #1, %d0 243 subq.l #1, %d1
150 bne y_loop 244 bne.s dc_y_loop
151 245
152 movem.l (%sp), %d2-%d6/%a2 246dc_exit:
153 lea.l 28(%sp), %sp 247 movem.l (%sp), %d2-%d5
248 lea.l DC_SAVE(%sp), %sp
154 rts 249 rts
155 250