diff src/cs/drivers/drv_app/r2d/r2d_color_color_ia.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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cs/drivers/drv_app/r2d/r2d_color_color_ia.s	Fri Oct 16 06:23:26 2020 +0000
@@ -0,0 +1,208 @@
+
+  
+  .state32
+
+  .sect ".r2dlcd"
+
+ .if (R2D_ASM = 1)
+
+ .include "r2d_asm_configs.inc"
+ .include "r2d_asm_utils.inc"
+ .include "r2d_asm_patch_utils.inc"
+
+
+ 
+
+ .global _r2d_start_branch_inst
+ .global _r2d_stop_branch_inst
+ .global _r2d_load_foreground
+ .global _r2d_load_background
+
+ .global _r2d_blit_foreground
+ .global _r2d_blit_background
+
+ .global _r2d_always_write_down
+ .global _r2d_always_write_up
+ .global _r2d_always_read_down
+ .global _r2d_always_read_up
+
+ .global _r2d_never_write
+ .global _r2d_lcd_start_nothing
+
+ .global _r2d_start_get_color
+
+ .def _p_r2d_blit_foreground
+ .def _p_r2d_blit_background
+
+  .bss _r2d_blit_foreground,4,4,4
+  .bss _r2d_blit_background,4,4,4
+
+ 
+ .ref _r2d_color_alpha_operator
+ .ref _r2d_color_framebuffer_foreground_pixel
+
+ .def _r2d_icolor_alpha_op
+ .def _r2d_icolor_foreground_pixel_test
+ 
+ 
+
+ .global _r2d_color_start_copy
+ .global _r2d_color_start_or
+ .global _r2d_color_start_and
+ .global _r2d_color_start_xor
+ .global _r2d_color_start_notcopy
+ .global _r2d_color_start_notor
+ .global _r2d_color_start_notand
+ .global _r2d_color_start_notxor
+ .global _r2d_color_start_alpha
+ .global _r2d_color_start_erase
+ .global _r2d_color_start_foreground_pixel
+ 
+
+_r2d_color_start_copy:
+      MOV calca,calca
+      MOV calcb,calca
+      MOV calcb,calcb
+_r2d_color_end_copy
+
+_r2d_color_start_or:
+      MOVS calca,calca,LSL #8
+      MOVNEQ calcb,calca,LSR #8
+	  NOP
+_r2d_color_end_or
+
+_r2d_color_start_and:
+      MOV calca,calca
+      AND calcb,calcb,calca
+      MOV calcb,calcb
+_r2d_color_end_and
+
+_r2d_color_start_xor:
+      MOV calca,calca
+      EOR calcb,calcb,calca
+      MOV calcb,calcb
+_r2d_color_end_xor
+
+_r2d_color_start_notcopy:
+      MOV calca,calca
+      MVN calcb,calca
+      MOV calcb,calcb
+_r2d_color_end_notcopy
+
+_r2d_color_start_notor:
+      MOV calca,calca
+      ORR calcb,calcb,calca
+      MVN calcb,calcb
+_r2d_color_end_notor
+
+_r2d_color_start_notand:
+      MOV calca,calca
+      AND calcb,calcb,calca
+      MVN calcb,calcb
+_r2d_color_end_notand
+
+_r2d_color_start_notxor:
+      MOV calca,calca
+      EOR calcb,calcb,calca
+      MVN calcb,calcb
+_r2d_color_end_notxor
+
+_r2d_color_start_erase:
+      MOVS calca,calca,LSL #8
+      MOVNEQ calcb,calca,LSR #8
+	  NOP
+_r2d_color_end_erase
+
+_r2d_color_start_alpha
+  ; Identifying code telling the patcher that a special
+  ; construct required to branch to a C function is used
+    .long BRANCH_ID
+  ; The absolute address of the C function which is going to be
+  ; converted to a PC relative offset by the patcher
+    .long _r2d_icolor_alpha_op
+_r2d_color_stop_alpha
+
+_r2d_color_start_foreground_pixel
+  ; Identifying code telling the patcher that a special
+  ; construct required to branch to a C function is used
+    .long BRANCH_ID
+  ; The absolute address of the C function which is going to be
+  ; converted to a PC relative offset by the patcher
+    .long _r2d_icolor_foreground_pixel_test
+_r2d_color_stop_foreground_pixel
+
+
+
+
+
+  ; Stub function allowing to branch to a C one whose interface
+  ; is UINT32 r2d_lcd_some_operator(UINT32 old,UINT32 value)
+_r2d_icolor_alpha_op:
+    R2D_OP_SAVE_CONTEXT
+    BL _r2d_color_alpha_operator
+    R2D_OP_RESTORE_CONTEXT
+
+  ; Check kind of pixel
+_r2d_icolor_foreground_pixel_test:
+    R2D_COL_SAVE_CONTEXT
+    BL _r2d_color_framebuffer_foreground_pixel
+    R2D_COL_RESTORE_CONTEXT
+
+  ; First instruction replacing ".long BRANCH_ID" when code is patched
+_r2d_start_branch_inst
+    STMFD SP!, {calca}
+
+_r2d_stop_branch_inst
+    LDMFD SP!, {calca}
+
+  ; Code reading the foreground and background colors
+  ; from a const table
+_r2d_start_get_color
+     LDRNE calca,_p_r2d_blit_foreground
+     LDREQ calca,_p_r2d_blit_background
+     LDR calca,[calca]
+_r2d_stop_get_color
+
+  ; Code doing nothing to removed patch
+_r2d_lcd_start_nothing
+     MOV calca,calca
+     MOV calca,calca
+     MOV calca,calca
+_r2d_lcd_stop_nothing
+
+  ; Force writing of value when dst is R2D color framebuffer
+  ; (down mode)
+_r2d_always_write_down
+     STR dstvalue,[p_dst_current],#4
+
+  ; Force writing of value when dst is R2D color framebuffer
+  ; (up mode)
+_r2d_always_write_up
+     STR dstvalue,[p_dst_current],#-4
+
+  ; Force reading of src when src is R2D color framebuffer
+_r2d_always_read_down:
+    LDR src_current,[p_src_current,#4]!
+
+  ; Force reading of src when src is R2D color framebuffer
+_r2d_always_read_up:
+    LDR src_current,[p_src_current,#-4]!
+
+
+  ; Remove force writing
+_r2d_never_write
+     MOV dstvalue,dstvalue
+
+  
+ 
+  ; Array containing current foreground and background colors
+  .align 4
+_p_r2d_blit_foreground:  .field _r2d_blit_foreground,32
+
+  .align 4
+_p_r2d_blit_background:  .field _r2d_blit_background,32
+
+
+
+ .endif
+ .end