⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 r2d_geometry.s

📁 是一个手机功能的模拟程序
💻 S
📖 第 1 页 / 共 2 页
字号:

_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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -