comparison src/cs/drivers/drv_app/r2d/r2d_geometry.s @ 0:4e78acac3d88

src/{condat,cs,gpf,nucleus}: import from Selenite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:23:26 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4e78acac3d88
1
2
3 .state32
4
5 .if (R2D_ASM = 1)
6
7 .include "r2d_asm_utils.inc"
8 .include "r2d_asm_configs.inc"
9
10
11 ; Main asm code (it is reflecting the C code of
12 ; r2d_blit_lcd_to_lcd)
13
14 .text
15
16
17
18 .global _r2d_blit_lb,_r2d_blit_la
19 .global _r2d_sb_down1,_r2d_sb_down2,_r2d_sa_up1,_r2d_sa_up2
20 .global _r2d_scb_down1,_r2d_scb_down2,_r2d_sca_up1,_r2d_sca_up2
21 .global _r2d_sdb_down1,_r2d_sdb_down2,_r2d_sda_up1,_r2d_sda_up2
22 .global _r2d_skip_color_proc_a
23 .global _r2d_end_ynb_color_dst_a
24 .global _r2d_skip_color_proc_b
25 .global _r2d_end_ynb_color_dst_b
26 .global _r2d_skip_color_dst_a
27 .global _r2d_skip_color_dst_b
28
29
30 .global _r2d_sconvcolb_down1,_r2d_econvcolb_down1
31 .global _r2d_sconvcolb_down2,_r2d_econvcolb_down2
32 .global _r2d_sconvcola_up1,_r2d_econvcola_up1
33 .global _r2d_sconvcola_up2,_r2d_econvcola_up2
34
35 .global _r2d_swb_down1,_r2d_swb_down2,_r2d_swa_up1,_r2d_swa_up2
36
37
38 ; Patch list for write_shift_pixel_down
39 .global _r2d_sft_dst_n_b_down1,_r2d_sft_dst_n_b_down2
40 .global _r2d_sft_srcb__b_down1,_r2d_sft_srcb__b_down2
41 .global _r2d_sft_dstc__b_down1,_r2d_sft_dstc__b_down2
42
43 .global _r2d_sft_src_c_b_down1,_r2d_sft_src_c_b_down2
44 .global _r2d_sft_b_c_b_down1,_r2d_sft_b_c_b_down2
45 .global _r2d_sft_dstb_c_b_down1,_r2d_sft_dstb_c_b_down2
46 .global _r2d_sft_d_c_b_down1,_r2d_sft_d_c_b_down2
47 .global _r2d_sft_dstc_c_b_down1,_r2d_sft_dstc_c_b_down2
48
49 ; Patch list for write_shift_pixel_up
50 .global _r2d_sft_dst_n_a_up1,_r2d_sft_dst_n_a_up2
51 .global _r2d_sft_srcb__a_up1,_r2d_sft_srcb__a_up2
52 .global _r2d_sft_dstc__a_up1,_r2d_sft_dstc__a_up2
53
54 .global _r2d_sft_src_c_a_up1,_r2d_sft_src_c_a_up2
55 .global _r2d_sft_b_c_a_up1,_r2d_sft_b_c_a_up2
56
57 ; Patch list fro shift_pixel_down
58 .global _r2d_sft_dst_n_downa,_r2d_sft_dst_n_downb,_r2d_sft_dst_n_downc
59 .global _r2d_sft_srcb_n_downa,_r2d_sft_srcb_n_downb,_r2d_sft_srcb_n_downc
60
61 .global _r2d_sft_src_c_downa,_r2d_sft_src_c_downb,_r2d_sft_src_c_downc
62
63 ; Patch list fro shift_pixel_up
64 .global _r2d_sft_dst_n_upa,_r2d_sft_dst_n_upb,_r2d_sft_dst_n_upc
65 .global _r2d_sft_srcb_n_upa,_r2d_sft_srcb_n_upb,_r2d_sft_srcb_n_upc
66
67 .global _r2d_sft_src_c_upa,_r2d_sft_src_c_upb,_r2d_sft_src_c_upc
68 .global _r2d_enda,_r2d_endb
69
70 .global _r2d_skip_load_src_a_up1,_r2d_skip_load_src_a_up2;
71 .global _r2d_skip_load_src_b_down1,_r2d_skip_load_src_b_down2;
72 .global _r2d_skip_shift_down_downa,_r2d_skip_shift_down_downb,_r2d_skip_shift_down_downc;
73 .global _r2d_skip_shift_up_upa,_r2d_skip_shift_up_upb,_r2d_skip_shift_up_upc;
74
75 .global _r2d_no_null_src_counter_a,_r2d_no_null_src_counter_b
76 .global _r2d_end_a_up2,_r2d_end_b_down2,_r2d_end_downa,_r2d_end_downb,_r2d_end_downc;
77 .global _r2d_end_upa,_r2d_end_upb,_r2d_end_upc;
78
79 .global _r2d_always_read_a_up1,_r2d_always_read_a_up2
80 .global _r2d_always_read_b_down1,_r2d_always_read_b_down2
81
82 .ref $r2d_blit_lcd_to_lcd
83
84 .endif
85
86 write_shift_pixel_down .macro label
87 ; Create free space for result
88 .if (R2D_PIXEL_DEPTH != 32)
89 _r2d_sft_dst_n_:label: MOV dstvalue,dstvalue, LSR #R2D_PIXEL_DEPTH
90 .else
91 _r2d_sft_dst_n_:label: MOV dstvalue,#0
92 .endif
93
94 ; Mask to extract pixel from src_current
95 _r2d_sft_src_c_:label: MOV calca,src_current,LSL #((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH)
96 _r2d_always_read_:label: MOV src_current,src_current
97 _r2d_sft_b_c_:label: MOV calca,calca,LSR #((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH)
98
99 ; Mask to extract pixel from dst_current
100 _r2d_sft_dstb_c_:label: MOV calcb,dst_current,LSL #((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH)
101 _r2d_sft_d_c_:label: MOV calcb,calcb,LSR #((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH)
102
103 ; Do foreground detection
104 _r2d_sd:label:
105 MOV calca,calca
106 MOV calca,calca
107 MOV calca,calca
108 _r2d_ed:label:
109
110 ; Get foreground/background colors if needed
111 _r2d_sc:label:
112 MOV calca,calca
113 MOV calca,calca
114 MOV calca,calca
115 _r2d_ec:label:
116
117 _r2d_sconvcol:label:
118 MOV calca,calca
119 MOV calca,calca
120 MOV calca,calca
121 _r2d_econvcol:label:
122
123 ; Compute drawing mode
124 _r2d_s:label:
125 MOV calca,calca
126 MOV calcb,calca
127 MOV calcb,calcb
128 _r2d_e:label:
129 _r2d_sft_dstc_c_:label: ORR dstvalue,dstvalue,calcb, LSL #((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH)
130
131 _r2d_sw:label:
132 MOV dstvalue,dstvalue
133 _r2d_ew:label:
134
135 ; Read new data if needed
136 .if (R2D_PIXEL_DEPTH != 32)
137 _r2d_sft_srcb__:label: MOV src_current,src_current, LSR #R2D_PIXEL_DEPTH
138 _r2d_sft_dstc__:label: MOV dst_current,dst_current, LSR #R2D_PIXEL_DEPTH
139 .else
140 _r2d_sft_srcb__:label: MOV src_current,src_current,LSR #0
141 _r2d_sft_dstc__:label: MOV dst_current,dst_current,LSR #0
142 .endif
143
144 SUBS dstcounter,dstcounter,#1
145 MOVEQ dstcounter,#(1<<R2D_PIXELS_PER_MEMORY_WORD)
146 _r2d_skip_load_src_:label: MOV src_current,src_current
147 SUBS srccounter,srccounter,#1
148 BNE M1END?
149 MOV srccounter,#(1<<R2D_PIXELS_PER_MEMORY_WORD)
150 LDR src_current,[p_src_current,#4]!
151 M1END?
152 .endm
153
154 write_shift_pixel_up .macro label
155 .if (R2D_PIXEL_DEPTH != 32)
156 _r2d_sft_dst_n_:label: MOV dstvalue,dstvalue, LSL #R2D_PIXEL_DEPTH
157 .else
158 _r2d_sft_dst_n_:label: MOV dstvalue,#0
159 .endif
160
161 _r2d_sft_src_c_:label: MOV calca,src_current,LSR #((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH)
162 _r2d_always_read_:label: MOV src_current,src_current
163 _r2d_sft_b_c_:label: MOV calcb,dst_current,LSR #((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH)
164
165 ; Do foreground detection
166 _r2d_sd:label:
167 MOV calca,calca
168 MOV calca,calca
169 MOV calca,calca
170 _r2d_ed:label:
171
172 ; Get foreground/background colors if needed
173 _r2d_sc:label:
174 MOV calca,calca
175 MOV calca,calca
176 MOV calca,calca
177 _r2d_ec:label:
178
179 _r2d_sconvcol:label:
180 MOV calca,calca
181 MOV calca,calca
182 MOV calca,calca
183 _r2d_econvcol:label:
184
185 ; Compute drawing mode
186 _r2d_s:label:
187 MOV calca,calca
188 MOV calcb,calca
189 MOV calcb,calcb
190 _r2d_e:label:
191 ORR dstvalue,dstvalue,calcb
192
193 _r2d_sw:label:
194 MOV dstvalue,dstvalue
195 _r2d_ew:label:
196
197 .if (R2D_PIXEL_DEPTH != 32)
198 _r2d_sft_srcb__:label: MOV src_current,src_current, LSL #R2D_PIXEL_DEPTH
199 _r2d_sft_dstc__:label: MOV dst_current,dst_current, LSL #R2D_PIXEL_DEPTH
200 .else
201 _r2d_sft_srcb__:label: MOV src_current,src_current,LSL #0
202 _r2d_sft_dstc__:label: MOV dst_current,dst_current,LSL #0
203 .endif
204
205 SUBS dstcounter,dstcounter,#1
206 MOVEQ dstcounter,#(1<<R2D_PIXELS_PER_MEMORY_WORD)
207 _r2d_skip_load_src_:label: MOV src_current,src_current
208 SUBS srccounter,srccounter,#1
209 BNE M1END?
210 MOV srccounter,#(1<<R2D_PIXELS_PER_MEMORY_WORD)
211 LDR src_current,[p_src_current,#-4]!
212 M1END?
213 .endm
214
215 shift_pixel_down .macro arg,reg,label
216 _r2d_skip_shift_down_:label: MOV arg,arg
217
218 .if (R2D_PIXEL_DEPTH != 32)
219 _r2d_sft_dst_n_:label: MOV arg,arg, LSR #R2D_PIXEL_DEPTH
220 .else
221 _r2d_sft_dst_n_:label: MOV arg,#0
222 .endif
223
224 _r2d_sft_src_c_:label: ORR arg,arg,:reg:_current, LSL #((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH)
225
226 .if (R2D_PIXEL_DEPTH != 32)
227 _r2d_sft_srcb_n_:label: MOV :reg:_current,:reg:_current, LSR #R2D_PIXEL_DEPTH
228 .else
229 _r2d_sft_srcb_n_:label: MOV :reg:_current,#0
230 .endif
231
232 SUBS :reg:counter,:reg:counter,#1
233 BNE M1END?
234 MOV :reg:counter,#(1<<R2D_PIXELS_PER_MEMORY_WORD)
235 LDR :reg:_current,[p_:reg:_current,#4]!
236 M1END?
237 .endm
238
239 shift_pixel_up .macro arg,reg,label
240 _r2d_skip_shift_up_:label: MOV arg,arg
241 .if (R2D_PIXEL_DEPTH != 32)
242 _r2d_sft_dst_n_:label: MOV arg,arg, LSL #R2D_PIXEL_DEPTH
243 .else
244 _r2d_sft_dst_n_:label: MOV arg,#0
245 .endif
246
247 _r2d_sft_src_c_:label: ORR arg,arg,:reg:_current, LSR #((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH)
248
249 .if (R2D_PIXEL_DEPTH != 32)
250 _r2d_sft_srcb_n_:label: MOV :reg:_current,:reg:_current, LSL #R2D_PIXEL_DEPTH
251 .else
252 _r2d_sft_srcb_n_:label: MOV :reg:_current,#0
253 .endif
254
255
256 SUBS :reg:counter,:reg:counter,#1
257 BNE M1END?
258 MOV :reg:counter,#(1<<R2D_PIXELS_PER_MEMORY_WORD)
259 LDR :reg:_current,[p_:reg:_current,#-4]!
260 M1END?
261 .endm
262
263 .if (R2D_ASM = 1)
264
265 ;--------------------------------------
266 ;
267 ; v_direction == -1
268 ;
269
270 _r2d_blit_la
271 STMFD SP!, {R4,R5,R6,R7,R8,R9,R10,R11,R12,LR}
272 LDR dstvalue, [R0,#S_FRAME.dstvalue_ind]
273 LDR dst_current, [R0,#S_FRAME.dst_current_ind]
274 LDRH dstcounter, [R0,#S_FRAME.dstcounter_ind]
275 LDR src_current, [R0,#S_FRAME.src_current_ind]
276 LDRH ynb, [R0,#S_FRAME.ynb_ind]
277 LDR p_src_current, [R0,#S_FRAME.p_src_current_ind]
278 LDR p_dst_current, [R0,#S_FRAME.p_dst_current_ind]
279 LDR x, [R0,#S_FRAME.x_ind]
280 LDR y, [R0,#S_FRAME.y_ind]
281 LDRH current_dst_dy, [R0,#S_FRAME.current_dst_dy_ind]
282 LDRH current_src_dy, [R0,#S_FRAME.current_src_dy_ind]
283 LDRH dst_dy, [R0,#S_FRAME.dst_dy_ind]
284
285
286 ;-------------------------------------
287 ;
288 ; First while
289 ;
290 ; current_dst_dy != dst_dy
291 current_dst_a: CMP current_dst_dy,dst_dy
292 BEQ end_current_dst_a
293
294 shift_pixel_up dstvalue,dst,upa
295
296 _r2d_end_upa: SUB current_dst_dy,current_dst_dy,#1
297 SUB y,y,#1
298 B current_dst_a
299
300 end_current_dst_a:
301
302 ; Load srcounter(and overwrite dst_dy)
303 LDRH srccounter, [R0,#S_FRAME.srccounter_ind]
304
305 LDRH temp,[R0,#S_FRAME.src_dy_ind]
306 SUB current_src_dy,current_src_dy,temp
307
308 ;-------------------------------------
309 ;
310 ; Second while
311 ;
312 ; current_src_dy - src_dy != 0
313 current_src_a: CMP current_src_dy,#0
314 BEQ end_current_src_a
315
316 shift_pixel_up temp,src,upb
317
318 _r2d_end_upb: SUB current_src_dy,current_src_dy,#1
319 B current_src_a
320
321 end_current_src_a:
322
323 ;-------------------------------------
324 ;
325 ; Third while
326 ;
327 ; (ynb!=0)
328 _r2d_ynb_loop_a: TEQ ynb,#0
329 BEQ end_ynb_loop_a
330
331 write_shift_pixel_up a_up1 ; was a_up1
332
333 _r2d_no_null_src_counter_a:
334 SUB y,y,#1
335
336 ; When dst is color framebuffer, following instruction is replaced by
337 ; BL no_end_dst_counter_a so, to ynb_loop_a
338 _r2d_skip_color_proc_a: MOV y,y
339
340 CMP dstcounter,#(1<<R2D_PIXELS_PER_MEMORY_WORD)
341 BNE no_end_dst_counter_a
342
343 SUB ynb,ynb,#1
344 STR dstvalue,[p_dst_current],#-4
345
346 LDR dst_current,[p_dst_current]
347 MOV dstvalue,#0
348 MOV current_dst_dy,#((1<<R2D_PIXELS_PER_MEMORY_WORD)-1)
349
350 no_end_dst_counter_a: B _r2d_ynb_loop_a
351 _r2d_end_ynb_color_dst_a:SUB ynb,ynb,#1
352 B _r2d_ynb_loop_a
353
354 end_ynb_loop_a:
355 _r2d_skip_color_dst_a: MOV y,y
356
357 ADD current_dst_dy,current_dst_dy,#1
358 LDRH temp,[R0,#S_FRAME.end_dst_dy_ind]
359 SUB current_dst_dy,current_dst_dy,temp
360
361 ;-------------------------------------
362 ;
363 ; Fourth while
364 ;
365 ; current_dst_dy - end_dst_dy != 0
366 end_dst_loop_a: TEQ current_dst_dy,#0
367 BEQ end_end_dst_loop_a
368
369 write_shift_pixel_up a_up2
370
371 _r2d_end_a_up2: SUB current_dst_dy,current_dst_dy,#1
372 SUB y,y,#1
373 B end_dst_loop_a
374 end_end_dst_loop_a:
375 MOV temp,#0
376 CMP dstcounter,#(1<<R2D_PIXELS_PER_MEMORY_WORD)
377 MOVEQ temp,#1
378
379 ;-------------------------------------
380 ;
381 ; Last while
382 ;
383 ; dstcounter != (1<<R2D_PIXELS_PER_MEMORY_WORD)
384 dst_counter_loop_a: CMP dstcounter,#(1<<R2D_PIXELS_PER_MEMORY_WORD)
385 BEQ end_dst_counter_loop_a
386 shift_pixel_up dstvalue,dst,upc
387 _r2d_end_upc: SUB y,y,#1
388 B dst_counter_loop_a
389 end_dst_counter_loop_a:
390 CMP temp,#0
391 STREQ dstvalue,[p_dst_current,#4]!
392
393 CMP temp,#0
394 STRNE dstvalue,[p_dst_current]
395 _r2d_enda:
396 LDMFD SP!, {R4,R5,R6,R7,R8,R9,R10,R11,R12,LR}
397 MOV PC,LR
398
399
400 ;--------------------------------------
401 ;
402 ; v_direction != -1
403 ;
404 _r2d_blit_lb
405 STMFD SP!, {R4,R5,R6,R7,R8,R9,R10,R11,R12,LR}
406 LDR dstvalue, [R0,#S_FRAME.dstvalue_ind]
407 LDR dst_current, [R0,#S_FRAME.dst_current_ind]
408 LDRH dstcounter, [R0,#S_FRAME.dstcounter_ind]
409 LDR src_current, [R0,#S_FRAME.src_current_ind]
410 LDRH ynb, [R0,#S_FRAME.ynb_ind]
411 LDR p_src_current, [R0,#S_FRAME.p_src_current_ind]
412 LDR p_dst_current, [R0,#S_FRAME.p_dst_current_ind]
413 LDR x, [R0,#S_FRAME.x_ind]
414 LDR y, [R0,#S_FRAME.y_ind]
415 LDRH current_dst_dy, [R0,#S_FRAME.current_dst_dy_ind]
416 LDRH current_src_dy, [R0,#S_FRAME.current_src_dy_ind]
417 LDRH dst_dy, [R0,#S_FRAME.dst_dy_ind]
418
419
420 ;-------------------------------------
421 ;
422 ; First while
423 ;
424 ; current_dst_dy != dst_dy
425 current_dst_b: CMP current_dst_dy,dst_dy
426 BEQ end_current_dst_b
427
428 shift_pixel_down dstvalue,dst,downa
429
430 _r2d_end_downa: ADD current_dst_dy,current_dst_dy,#1
431 ADD y,y,#1
432 B current_dst_b
433
434 end_current_dst_b:
435
436 ; Load srcounter(and overwrite dst_dy)
437 LDRH srccounter, [R0,#S_FRAME.srccounter_ind]
438
439 LDRH temp,[R0,#S_FRAME.src_dy_ind]
440 SUB current_src_dy,current_src_dy,temp
441
442 ;-------------------------------------
443 ;
444 ; Second while
445 ;
446 ; current_src_dy - src_dy != 0
447 current_src_b: CMP current_src_dy,#0
448 BEQ end_current_src_b
449
450 shift_pixel_down temp,src,downb
451
452 _r2d_end_downb: ADD current_src_dy,current_src_dy,#1
453 B current_src_b
454
455 end_current_src_b:
456
457 ;-------------------------------------
458 ;
459 ; Third while
460 ;
461 ; (ynb!=0)
462 _r2d_ynb_loop_b: TEQ ynb,#0
463 BEQ end_ynb_loop_b
464
465 write_shift_pixel_down b_down1
466
467 _r2d_no_null_src_counter_b:
468 ADD y,y,#1
469
470 ; When dst is color framebuffer, following instruction is replaced by
471 ; BL no_end_dst_counter_a so, to ynb_loop_a
472 _r2d_skip_color_proc_b: MOV y,y
473
474 CMP dstcounter,#(1<<R2D_PIXELS_PER_MEMORY_WORD)
475 BNE no_end_dst_counter_b
476
477 SUB ynb,ynb,#1
478 STR dstvalue,[p_dst_current],#4
479
480 LDR dst_current,[p_dst_current]
481 MOV dstvalue,#0
482 MOV current_dst_dy,#0
483
484 no_end_dst_counter_b: B _r2d_ynb_loop_b
485 _r2d_end_ynb_color_dst_b: SUB ynb,ynb,#1
486 B _r2d_ynb_loop_b
487 end_ynb_loop_b:
488 _r2d_skip_color_dst_b: MOV y,y
489
490 SUB current_dst_dy,current_dst_dy,#1
491 LDRH temp,[R0,#S_FRAME.end_dst_dy_ind]
492 SUB current_dst_dy,current_dst_dy,temp
493
494 ;-------------------------------------
495 ;
496 ; Fourth while
497 ;
498 ; current_dst_dy - end_dst_dy != 0
499 end_dst_loop_b: TEQ current_dst_dy,#0
500 BEQ end_end_dst_loop_b
501
502 write_shift_pixel_down b_down2
503
504 _r2d_end_b_down2: ADD current_dst_dy,current_dst_dy,#1
505 ADD y,y,#1
506 B end_dst_loop_b
507 end_end_dst_loop_b:
508 MOV temp,#0
509 CMP dstcounter,#(1<<R2D_PIXELS_PER_MEMORY_WORD)
510 MOVEQ temp,#1
511
512 ;-------------------------------------
513 ;
514 ; Last while
515 ;
516 ; dstcounter != (1<<R2D_PIXELS_PER_MEMORY_WORD)
517 dst_counter_loop_b: CMP dstcounter,#(1<<R2D_PIXELS_PER_MEMORY_WORD)
518 BEQ end_dst_counter_loop_b
519 shift_pixel_down dstvalue,dst,downc
520 _r2d_end_downc: ADD y,y,#1
521 B dst_counter_loop_b
522 end_dst_counter_loop_b:
523 CMP temp,#0
524 STREQ dstvalue,[p_dst_current,#-4]!
525
526 CMP temp,#0
527 STRNE dstvalue,[p_dst_current]
528 _r2d_endb:
529 LDMFD SP!, {R4,R5,R6,R7,R8,R9,R10,R11,R12,LR}
530 MOV PC,LR
531
532 .endif
533
534 .end