diff options
Diffstat (limited to 'apps/plugins/pacbox/pacbox_cf.S')
-rw-r--r-- | apps/plugins/pacbox/pacbox_cf.S | 215 |
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 | |||
66 | process_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 | |||
83 | process_line: | ||
84 | move.l %a3, %d1 | ||
85 | bd_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 | |||
60 | blit_display: | 102 | blit_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 | ||
75 | y_loop: | 118 | bd_y_loop: |
76 | move.l %d1, %d5 | 119 | bsr.s process_line |
77 | x_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 |
102 | x_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 | 149 | drawChar: |
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 |
126 | x_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 | |||
171 | clear_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 | |||
180 | have_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 | |||
192 | dc_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 | 246 | dc_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 | ||