FreeCalypso > hg > fc-magnetite
view src/cs/drivers/drv_app/r2d/r2d_geometry.s @ 478:5e39123540e6
hybrid fw: Openmoko-mimicking AT@BAND command implemented
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 14 Jun 2018 06:04:54 +0000 |
parents | 945cf7f506b2 |
children |
line wrap: on
line source
.state32 .if (R2D_ASM = 1) .include "r2d_asm_utils.inc" .include "r2d_asm_configs.inc" ; Main asm code (it is reflecting the C code of ; r2d_blit_lcd_to_lcd) .text .global _r2d_blit_lb,_r2d_blit_la .global _r2d_sb_down1,_r2d_sb_down2,_r2d_sa_up1,_r2d_sa_up2 .global _r2d_scb_down1,_r2d_scb_down2,_r2d_sca_up1,_r2d_sca_up2 .global _r2d_sdb_down1,_r2d_sdb_down2,_r2d_sda_up1,_r2d_sda_up2 .global _r2d_skip_color_proc_a .global _r2d_end_ynb_color_dst_a .global _r2d_skip_color_proc_b .global _r2d_end_ynb_color_dst_b .global _r2d_skip_color_dst_a .global _r2d_skip_color_dst_b .global _r2d_sconvcolb_down1,_r2d_econvcolb_down1 .global _r2d_sconvcolb_down2,_r2d_econvcolb_down2 .global _r2d_sconvcola_up1,_r2d_econvcola_up1 .global _r2d_sconvcola_up2,_r2d_econvcola_up2 .global _r2d_swb_down1,_r2d_swb_down2,_r2d_swa_up1,_r2d_swa_up2 ; Patch list for write_shift_pixel_down .global _r2d_sft_dst_n_b_down1,_r2d_sft_dst_n_b_down2 .global _r2d_sft_srcb__b_down1,_r2d_sft_srcb__b_down2 .global _r2d_sft_dstc__b_down1,_r2d_sft_dstc__b_down2 .global _r2d_sft_src_c_b_down1,_r2d_sft_src_c_b_down2 .global _r2d_sft_b_c_b_down1,_r2d_sft_b_c_b_down2 .global _r2d_sft_dstb_c_b_down1,_r2d_sft_dstb_c_b_down2 .global _r2d_sft_d_c_b_down1,_r2d_sft_d_c_b_down2 .global _r2d_sft_dstc_c_b_down1,_r2d_sft_dstc_c_b_down2 ; Patch list for write_shift_pixel_up .global _r2d_sft_dst_n_a_up1,_r2d_sft_dst_n_a_up2 .global _r2d_sft_srcb__a_up1,_r2d_sft_srcb__a_up2 .global _r2d_sft_dstc__a_up1,_r2d_sft_dstc__a_up2 .global _r2d_sft_src_c_a_up1,_r2d_sft_src_c_a_up2 .global _r2d_sft_b_c_a_up1,_r2d_sft_b_c_a_up2 ; Patch list fro shift_pixel_down .global _r2d_sft_dst_n_downa,_r2d_sft_dst_n_downb,_r2d_sft_dst_n_downc .global _r2d_sft_srcb_n_downa,_r2d_sft_srcb_n_downb,_r2d_sft_srcb_n_downc .global _r2d_sft_src_c_downa,_r2d_sft_src_c_downb,_r2d_sft_src_c_downc ; Patch list fro shift_pixel_up .global _r2d_sft_dst_n_upa,_r2d_sft_dst_n_upb,_r2d_sft_dst_n_upc .global _r2d_sft_srcb_n_upa,_r2d_sft_srcb_n_upb,_r2d_sft_srcb_n_upc .global _r2d_sft_src_c_upa,_r2d_sft_src_c_upb,_r2d_sft_src_c_upc .global _r2d_enda,_r2d_endb .global _r2d_skip_load_src_a_up1,_r2d_skip_load_src_a_up2; .global _r2d_skip_load_src_b_down1,_r2d_skip_load_src_b_down2; .global _r2d_skip_shift_down_downa,_r2d_skip_shift_down_downb,_r2d_skip_shift_down_downc; .global _r2d_skip_shift_up_upa,_r2d_skip_shift_up_upb,_r2d_skip_shift_up_upc; .global _r2d_no_null_src_counter_a,_r2d_no_null_src_counter_b .global _r2d_end_a_up2,_r2d_end_b_down2,_r2d_end_downa,_r2d_end_downb,_r2d_end_downc; .global _r2d_end_upa,_r2d_end_upb,_r2d_end_upc; .global _r2d_always_read_a_up1,_r2d_always_read_a_up2 .global _r2d_always_read_b_down1,_r2d_always_read_b_down2 .ref $r2d_blit_lcd_to_lcd .endif write_shift_pixel_down .macro label ; Create free space for result .if (R2D_PIXEL_DEPTH != 32) _r2d_sft_dst_n_:label: MOV dstvalue,dstvalue, LSR #R2D_PIXEL_DEPTH .else _r2d_sft_dst_n_:label: MOV dstvalue,#0 .endif ; Mask to extract pixel from src_current _r2d_sft_src_c_:label: MOV calca,src_current,LSL #((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH) _r2d_always_read_:label: MOV src_current,src_current _r2d_sft_b_c_:label: MOV calca,calca,LSR #((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH) ; Mask to extract pixel from dst_current _r2d_sft_dstb_c_:label: MOV calcb,dst_current,LSL #((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH) _r2d_sft_d_c_:label: MOV calcb,calcb,LSR #((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH) ; Do foreground detection _r2d_sd:label: MOV calca,calca MOV calca,calca MOV calca,calca _r2d_ed:label: ; Get foreground/background colors if needed _r2d_sc:label: MOV calca,calca MOV calca,calca MOV calca,calca _r2d_ec:label: _r2d_sconvcol:label: MOV calca,calca MOV calca,calca MOV calca,calca _r2d_econvcol:label: ; Compute drawing mode _r2d_s:label: MOV calca,calca MOV calcb,calca MOV calcb,calcb _r2d_e:label: _r2d_sft_dstc_c_:label: ORR dstvalue,dstvalue,calcb, LSL #((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH) _r2d_sw:label: MOV dstvalue,dstvalue _r2d_ew:label: ; Read new data if needed .if (R2D_PIXEL_DEPTH != 32) _r2d_sft_srcb__:label: MOV src_current,src_current, LSR #R2D_PIXEL_DEPTH _r2d_sft_dstc__:label: MOV dst_current,dst_current, LSR #R2D_PIXEL_DEPTH .else _r2d_sft_srcb__:label: MOV src_current,src_current,LSR #0 _r2d_sft_dstc__:label: MOV dst_current,dst_current,LSR #0 .endif SUBS dstcounter,dstcounter,#1 MOVEQ dstcounter,#(1<<R2D_PIXELS_PER_MEMORY_WORD) _r2d_skip_load_src_:label: MOV src_current,src_current SUBS srccounter,srccounter,#1 BNE M1END? MOV srccounter,#(1<<R2D_PIXELS_PER_MEMORY_WORD) LDR src_current,[p_src_current,#4]! M1END? .endm write_shift_pixel_up .macro label .if (R2D_PIXEL_DEPTH != 32) _r2d_sft_dst_n_:label: MOV dstvalue,dstvalue, LSL #R2D_PIXEL_DEPTH .else _r2d_sft_dst_n_:label: MOV dstvalue,#0 .endif _r2d_sft_src_c_:label: MOV calca,src_current,LSR #((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH) _r2d_always_read_:label: MOV src_current,src_current _r2d_sft_b_c_:label: MOV calcb,dst_current,LSR #((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH) ; Do foreground detection _r2d_sd:label: MOV calca,calca MOV calca,calca MOV calca,calca _r2d_ed:label: ; Get foreground/background colors if needed _r2d_sc:label: MOV calca,calca MOV calca,calca MOV calca,calca _r2d_ec:label: _r2d_sconvcol:label: MOV calca,calca MOV calca,calca MOV calca,calca _r2d_econvcol:label: ; Compute drawing mode _r2d_s:label: MOV calca,calca MOV calcb,calca MOV calcb,calcb _r2d_e:label: ORR dstvalue,dstvalue,calcb _r2d_sw:label: MOV dstvalue,dstvalue _r2d_ew:label: .if (R2D_PIXEL_DEPTH != 32) _r2d_sft_srcb__:label: MOV src_current,src_current, LSL #R2D_PIXEL_DEPTH _r2d_sft_dstc__:label: MOV dst_current,dst_current, LSL #R2D_PIXEL_DEPTH .else _r2d_sft_srcb__:label: MOV src_current,src_current,LSL #0 _r2d_sft_dstc__:label: MOV dst_current,dst_current,LSL #0 .endif SUBS dstcounter,dstcounter,#1 MOVEQ dstcounter,#(1<<R2D_PIXELS_PER_MEMORY_WORD) _r2d_skip_load_src_:label: MOV src_current,src_current SUBS srccounter,srccounter,#1 BNE M1END? MOV srccounter,#(1<<R2D_PIXELS_PER_MEMORY_WORD) LDR src_current,[p_src_current,#-4]! M1END? .endm shift_pixel_down .macro arg,reg,label _r2d_skip_shift_down_:label: MOV arg,arg .if (R2D_PIXEL_DEPTH != 32) _r2d_sft_dst_n_:label: MOV arg,arg, LSR #R2D_PIXEL_DEPTH .else _r2d_sft_dst_n_:label: MOV arg,#0 .endif _r2d_sft_src_c_:label: ORR arg,arg,:reg:_current, LSL #((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH) .if (R2D_PIXEL_DEPTH != 32) _r2d_sft_srcb_n_:label: MOV :reg:_current,:reg:_current, LSR #R2D_PIXEL_DEPTH .else _r2d_sft_srcb_n_:label: MOV :reg:_current,#0 .endif SUBS :reg:counter,:reg:counter,#1 BNE M1END? MOV :reg:counter,#(1<<R2D_PIXELS_PER_MEMORY_WORD) LDR :reg:_current,[p_:reg:_current,#4]! M1END? .endm shift_pixel_up .macro arg,reg,label _r2d_skip_shift_up_:label: MOV arg,arg .if (R2D_PIXEL_DEPTH != 32) _r2d_sft_dst_n_:label: MOV arg,arg, LSL #R2D_PIXEL_DEPTH .else _r2d_sft_dst_n_:label: MOV arg,#0 .endif _r2d_sft_src_c_:label: ORR arg,arg,:reg:_current, LSR #((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH) .if (R2D_PIXEL_DEPTH != 32) _r2d_sft_srcb_n_:label: MOV :reg:_current,:reg:_current, LSL #R2D_PIXEL_DEPTH .else _r2d_sft_srcb_n_:label: MOV :reg:_current,#0 .endif SUBS :reg:counter,:reg:counter,#1 BNE M1END? MOV :reg:counter,#(1<<R2D_PIXELS_PER_MEMORY_WORD) LDR :reg:_current,[p_:reg:_current,#-4]! M1END? .endm .if (R2D_ASM = 1) ;-------------------------------------- ; ; v_direction == -1 ; _r2d_blit_la STMFD SP!, {R4,R5,R6,R7,R8,R9,R10,R11,R12,LR} LDR dstvalue, [R0,#S_FRAME.dstvalue_ind] LDR dst_current, [R0,#S_FRAME.dst_current_ind] LDRH dstcounter, [R0,#S_FRAME.dstcounter_ind] LDR src_current, [R0,#S_FRAME.src_current_ind] LDRH ynb, [R0,#S_FRAME.ynb_ind] LDR p_src_current, [R0,#S_FRAME.p_src_current_ind] LDR p_dst_current, [R0,#S_FRAME.p_dst_current_ind] LDR x, [R0,#S_FRAME.x_ind] LDR y, [R0,#S_FRAME.y_ind] LDRH current_dst_dy, [R0,#S_FRAME.current_dst_dy_ind] LDRH current_src_dy, [R0,#S_FRAME.current_src_dy_ind] LDRH dst_dy, [R0,#S_FRAME.dst_dy_ind] ;------------------------------------- ; ; First while ; ; current_dst_dy != dst_dy current_dst_a: CMP current_dst_dy,dst_dy BEQ end_current_dst_a shift_pixel_up dstvalue,dst,upa _r2d_end_upa: SUB current_dst_dy,current_dst_dy,#1 SUB y,y,#1 B current_dst_a end_current_dst_a: ; Load srcounter(and overwrite dst_dy) LDRH srccounter, [R0,#S_FRAME.srccounter_ind] LDRH temp,[R0,#S_FRAME.src_dy_ind] SUB current_src_dy,current_src_dy,temp ;------------------------------------- ; ; Second while ; ; current_src_dy - src_dy != 0 current_src_a: CMP current_src_dy,#0 BEQ end_current_src_a shift_pixel_up temp,src,upb _r2d_end_upb: SUB current_src_dy,current_src_dy,#1 B current_src_a end_current_src_a: ;------------------------------------- ; ; Third while ; ; (ynb!=0) _r2d_ynb_loop_a: TEQ ynb,#0 BEQ end_ynb_loop_a write_shift_pixel_up a_up1 ; was a_up1 _r2d_no_null_src_counter_a: SUB y,y,#1 ; When dst is color framebuffer, following instruction is replaced by ; BL no_end_dst_counter_a so, to ynb_loop_a _r2d_skip_color_proc_a: MOV y,y CMP dstcounter,#(1<<R2D_PIXELS_PER_MEMORY_WORD) BNE no_end_dst_counter_a SUB ynb,ynb,#1 STR dstvalue,[p_dst_current],#-4 LDR dst_current,[p_dst_current] MOV dstvalue,#0 MOV current_dst_dy,#((1<<R2D_PIXELS_PER_MEMORY_WORD)-1) no_end_dst_counter_a: B _r2d_ynb_loop_a _r2d_end_ynb_color_dst_a:SUB ynb,ynb,#1 B _r2d_ynb_loop_a end_ynb_loop_a: _r2d_skip_color_dst_a: MOV y,y ADD current_dst_dy,current_dst_dy,#1 LDRH temp,[R0,#S_FRAME.end_dst_dy_ind] SUB current_dst_dy,current_dst_dy,temp ;------------------------------------- ; ; Fourth while ; ; current_dst_dy - end_dst_dy != 0 end_dst_loop_a: TEQ current_dst_dy,#0 BEQ end_end_dst_loop_a write_shift_pixel_up a_up2 _r2d_end_a_up2: SUB current_dst_dy,current_dst_dy,#1 SUB y,y,#1 B end_dst_loop_a end_end_dst_loop_a: MOV temp,#0 CMP dstcounter,#(1<<R2D_PIXELS_PER_MEMORY_WORD) MOVEQ temp,#1 ;------------------------------------- ; ; Last while ; ; dstcounter != (1<<R2D_PIXELS_PER_MEMORY_WORD) dst_counter_loop_a: CMP dstcounter,#(1<<R2D_PIXELS_PER_MEMORY_WORD) BEQ end_dst_counter_loop_a shift_pixel_up dstvalue,dst,upc _r2d_end_upc: SUB y,y,#1 B dst_counter_loop_a end_dst_counter_loop_a: CMP temp,#0 STREQ dstvalue,[p_dst_current,#4]! CMP temp,#0 STRNE dstvalue,[p_dst_current] _r2d_enda: LDMFD SP!, {R4,R5,R6,R7,R8,R9,R10,R11,R12,LR} MOV PC,LR ;-------------------------------------- ; ; v_direction != -1 ; _r2d_blit_lb STMFD SP!, {R4,R5,R6,R7,R8,R9,R10,R11,R12,LR} LDR dstvalue, [R0,#S_FRAME.dstvalue_ind] LDR dst_current, [R0,#S_FRAME.dst_current_ind] LDRH dstcounter, [R0,#S_FRAME.dstcounter_ind] LDR src_current, [R0,#S_FRAME.src_current_ind] LDRH ynb, [R0,#S_FRAME.ynb_ind] LDR p_src_current, [R0,#S_FRAME.p_src_current_ind] LDR p_dst_current, [R0,#S_FRAME.p_dst_current_ind] LDR x, [R0,#S_FRAME.x_ind] LDR y, [R0,#S_FRAME.y_ind] LDRH current_dst_dy, [R0,#S_FRAME.current_dst_dy_ind] LDRH current_src_dy, [R0,#S_FRAME.current_src_dy_ind] LDRH dst_dy, [R0,#S_FRAME.dst_dy_ind] ;------------------------------------- ; ; First while ; ; current_dst_dy != dst_dy current_dst_b: CMP current_dst_dy,dst_dy BEQ end_current_dst_b shift_pixel_down dstvalue,dst,downa _r2d_end_downa: ADD current_dst_dy,current_dst_dy,#1 ADD y,y,#1 B current_dst_b end_current_dst_b: ; Load srcounter(and overwrite dst_dy) LDRH srccounter, [R0,#S_FRAME.srccounter_ind] LDRH temp,[R0,#S_FRAME.src_dy_ind] SUB current_src_dy,current_src_dy,temp ;------------------------------------- ; ; Second while ; ; current_src_dy - src_dy != 0 current_src_b: CMP current_src_dy,#0 BEQ end_current_src_b shift_pixel_down temp,src,downb _r2d_end_downb: ADD current_src_dy,current_src_dy,#1 B current_src_b end_current_src_b: ;------------------------------------- ; ; Third while ; ; (ynb!=0) _r2d_ynb_loop_b: TEQ ynb,#0 BEQ end_ynb_loop_b write_shift_pixel_down b_down1 _r2d_no_null_src_counter_b: ADD y,y,#1 ; When dst is color framebuffer, following instruction is replaced by ; BL no_end_dst_counter_a so, to ynb_loop_a _r2d_skip_color_proc_b: MOV y,y CMP dstcounter,#(1<<R2D_PIXELS_PER_MEMORY_WORD) BNE no_end_dst_counter_b SUB ynb,ynb,#1 STR dstvalue,[p_dst_current],#4 LDR dst_current,[p_dst_current] MOV dstvalue,#0 MOV current_dst_dy,#0 no_end_dst_counter_b: B _r2d_ynb_loop_b _r2d_end_ynb_color_dst_b: SUB ynb,ynb,#1 B _r2d_ynb_loop_b end_ynb_loop_b: _r2d_skip_color_dst_b: MOV y,y SUB current_dst_dy,current_dst_dy,#1 LDRH temp,[R0,#S_FRAME.end_dst_dy_ind] SUB current_dst_dy,current_dst_dy,temp ;------------------------------------- ; ; Fourth while ; ; current_dst_dy - end_dst_dy != 0 end_dst_loop_b: TEQ current_dst_dy,#0 BEQ end_end_dst_loop_b write_shift_pixel_down b_down2 _r2d_end_b_down2: ADD current_dst_dy,current_dst_dy,#1 ADD y,y,#1 B end_dst_loop_b end_end_dst_loop_b: MOV temp,#0 CMP dstcounter,#(1<<R2D_PIXELS_PER_MEMORY_WORD) MOVEQ temp,#1 ;------------------------------------- ; ; Last while ; ; dstcounter != (1<<R2D_PIXELS_PER_MEMORY_WORD) dst_counter_loop_b: CMP dstcounter,#(1<<R2D_PIXELS_PER_MEMORY_WORD) BEQ end_dst_counter_loop_b shift_pixel_down dstvalue,dst,downc _r2d_end_downc: ADD y,y,#1 B dst_counter_loop_b end_dst_counter_loop_b: CMP temp,#0 STREQ dstvalue,[p_dst_current,#-4]! CMP temp,#0 STRNE dstvalue,[p_dst_current] _r2d_endb: LDMFD SP!, {R4,R5,R6,R7,R8,R9,R10,R11,R12,LR} MOV PC,LR .endif .end