giz menu works
[libpicofe.git] / common / arm_utils.s
diff --git a/common/arm_utils.s b/common/arm_utils.s
new file mode 100644 (file)
index 0000000..787ecb9
--- /dev/null
@@ -0,0 +1,219 @@
+@ vim:filetype=armasm\r
+@ some color conversion and blitting routines\r
+\r
+@ (c) Copyright 2006, notaz\r
+@ All Rights Reserved\r
+\r
+@ vim:filetype=armasm\r
+\r
+@ Convert 0000bbb0 ggg0rrr0 0000bbb0 ggg0rrr0\r
+@ to      00000000 rrr00000 ggg00000 bbb00000 ...\r
+\r
+@ lr =  0x00e000e0, out: r3=lower_pix, r2=higher_pix; trashes rin\r
+@ if sh==2, r8=0x00404040 (sh!=0 destroys flags!)\r
+.macro convRGB32_2 rin sh=0\r
+    and     r2,  lr, \rin, lsr #4 @ blue\r
+    and     r3,  \rin, lr\r
+    orr     r2,  r2,   r3, lsl #8         @ g0b0g0b0\r
+\r
+    mov     r3,  r2,  lsl #16             @ g0b00000\r
+    and     \rin,lr,  \rin, ror #12       @ 00r000r0 (reversed)\r
+    orr     r3,  r3,  \rin, lsr #16       @ g0b000r0\r
+.if \sh == 1\r
+    mov     r3,  r3,  ror #17             @ shadow mode\r
+.elseif \sh == 2\r
+    adds    r3,  r3,  #0x40000000         @ green\r
+    orrcs   r3,  r3,  #0xe0000000\r
+    mov     r3,  r3,  ror #8\r
+    adds    r3,  r3,  #0x40000000\r
+    orrcs   r3,  r3,  #0xe0000000\r
+    mov     r3,  r3,  ror #16\r
+    adds    r3,  r3,  #0x40000000\r
+    orrcs   r3,  r3,  #0xe0000000\r
+    mov     r3,  r3,  ror #24\r
+.else\r
+    mov     r3,  r3,  ror #16             @ r3=low\r
+.endif\r
+\r
+    orr     r3,  r3,   r3, lsr #3\r
+    str     r3, [r0], #4\r
+\r
+    mov     r2,  r2,  lsr #16\r
+    orr     r2,  r2,  \rin, lsl #16\r
+.if \sh == 1\r
+    mov     r2,  r2,  lsr #1\r
+.elseif \sh == 2\r
+    mov     r2,  r2,  ror #8\r
+    adds    r2,  r2,  #0x40000000         @ blue\r
+    orrcs   r2,  r2,  #0xe0000000\r
+    mov     r2,  r2,  ror #8\r
+    adds    r2,  r2,  #0x40000000\r
+    orrcs   r2,  r2,  #0xe0000000\r
+    mov     r2,  r2,  ror #8\r
+    adds    r2,  r2,  #0x40000000\r
+    orrcs   r2,  r2,  #0xe0000000\r
+    mov     r2,  r2,  ror #8\r
+.endif\r
+\r
+    orr     r2,  r2,   r2,  lsr #3\r
+    str     r2, [r0], #4\r
+.endm\r
+\r
+\r
+.global vidConvCpyRGB32 @ void *to, void *from, int pixels\r
+\r
+vidConvCpyRGB32:\r
+    stmfd   sp!, {r4-r7,lr}\r
+\r
+    mov     r12, r2, lsr #3 @ repeats\r
+    mov     lr, #0x00e00000\r
+    orr     lr, lr, #0x00e0\r
+\r
+.loopRGB32:\r
+    subs    r12, r12, #1\r
+\r
+    ldmia    r1!, {r4-r7}\r
+    convRGB32_2 r4\r
+    convRGB32_2 r5\r
+    convRGB32_2 r6\r
+    convRGB32_2 r7\r
+\r
+    bgt     .loopRGB32\r
+\r
+    ldmfd   sp!, {r4-r7,lr}\r
+    bx      lr\r
+\r
+\r
+.global vidConvCpyRGB32sh @ void *to, void *from, int pixels\r
+\r
+vidConvCpyRGB32sh:\r
+    stmfd   sp!, {r4-r7,lr}\r
+\r
+    mov     r12, r2, lsr #3 @ repeats\r
+    mov     lr, #0x00e00000\r
+    orr     lr, lr, #0x00e0\r
+\r
+.loopRGB32sh:\r
+    subs    r12, r12, #1\r
+\r
+    ldmia    r1!, {r4-r7}\r
+    convRGB32_2 r4, 1\r
+    convRGB32_2 r5, 1\r
+    convRGB32_2 r6, 1\r
+    convRGB32_2 r7, 1\r
+\r
+    bgt     .loopRGB32sh\r
+\r
+    ldmfd   sp!, {r4-r7,lr}\r
+    bx      lr\r
+\r
+\r
+.global vidConvCpyRGB32hi @ void *to, void *from, int pixels\r
+\r
+vidConvCpyRGB32hi:\r
+    stmfd   sp!, {r4-r7,lr}\r
+\r
+    mov     r12, r2, lsr #3 @ repeats\r
+    mov     lr, #0x00e00000\r
+    orr     lr, lr, #0x00e0\r
+\r
+.loopRGB32hi:\r
+     ldmia    r1!, {r4-r7}\r
+    convRGB32_2 r4, 2\r
+    convRGB32_2 r5, 2\r
+    convRGB32_2 r6, 2\r
+    convRGB32_2 r7, 2\r
+\r
+    subs    r12, r12, #1\r
+    bgt     .loopRGB32hi\r
+\r
+    ldmfd   sp!, {r4-r7,lr}\r
+    bx      lr\r
+\r
+\r
+@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
+\r
+\r
+@ mode2 blitter for 40 cols\r
+.global vidCpyM2_40col @ void *dest, void *src\r
+\r
+vidCpyM2_40col:\r
+    stmfd   sp!, {r4-r6,lr}\r
+\r
+    mov     r12, #224       @ lines\r
+    add     r1, r1, #8\r
+\r
+vidCpyM2_40_loop_out:\r
+    mov     r6, #10\r
+vidCpyM2_40_loop:\r
+    subs    r6, r6, #1\r
+     ldmia    r1!, {r2-r5}\r
+     stmia    r0!, {r2-r5}\r
+     ldmia    r1!, {r2-r5}\r
+     stmia    r0!, {r2-r5}\r
+    bne     vidCpyM2_40_loop\r
+    subs    r12,r12,#1\r
+    add     r1, r1, #8\r
+    bne     vidCpyM2_40_loop_out\r
+\r
+    ldmfd   sp!, {r4-r6,lr}\r
+    bx      lr\r
+\r
+\r
+@ mode2 blitter for 32 cols\r
+.global vidCpyM2_32col @ void *dest, void *src\r
+\r
+vidCpyM2_32col:\r
+    stmfd   sp!, {r4-r6,lr}\r
+\r
+    mov     r12, #224       @ lines\r
+    add     r1, r1, #8\r
+    add     r0, r0, #32\r
+\r
+vidCpyM2_32_loop_out:\r
+    mov     r6, #8\r
+vidCpyM2_32_loop:\r
+    subs    r6, r6, #1\r
+     ldmia    r1!, {r2-r5}\r
+     stmia    r0!, {r2-r5}\r
+     ldmia    r1!, {r2-r5}\r
+     stmia    r0!, {r2-r5}\r
+    bne     vidCpyM2_32_loop\r
+    subs    r12,r12,#1\r
+    add     r0, r0, #64\r
+    add     r1, r1, #8+64\r
+    bne     vidCpyM2_32_loop_out\r
+\r
+    ldmfd   sp!, {r4-r6,lr}\r
+    bx      lr\r
+\r
+\r
+@ mode2 blitter for 32 cols with no borders\r
+.global vidCpyM2_32col_nobord @ void *dest, void *src\r
+\r
+vidCpyM2_32col_nobord:\r
+    stmfd   sp!, {r4-r6,lr}\r
+\r
+    mov     r12, #224       @ lines\r
+    add     r1, r1, #8\r
+    b       vidCpyM2_32_loop_out\r
+\r
+\r
+.global spend_cycles @ c\r
+\r
+spend_cycles:\r
+    mov     r0, r0, lsr #2  @ 4 cycles/iteration\r
+    sub     r0, r0, #2      @ entry/exit/init\r
+.sc_loop:\r
+    subs    r0, r0, #1\r
+    bpl     .sc_loop\r
+\r
+    bx      lr\r
+\r
+\r
+.global flushcache\r
+\r
+flushcache:\r
+    swi #0x9f0002\r
+    mov pc, lr\r
+\r