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