a7f123f745c90a0ac2829bf71ef690e8a5adcba9
[fceu.git] / drivers / gp2x / asmutils.s
1 @ vim:filetype=armasm
2
3 @ test
4 .global flushcache @ beginning_addr, end_addr, flags
5
6 flushcache:
7     swi #0x9f0002
8     mov pc, lr
9
10
11 .global block_or @ void *src, size_t n, int pat
12
13 block_or:
14     stmfd   sp!, {r4-r5}
15     orr     r2, r2, r2, lsl #8
16     orr     r2, r2, r2, lsl #16
17     mov     r1, r1, lsr #4
18 block_loop_or:
19     ldmia   r0, {r3-r5,r12}
20     subs    r1, r1, #1
21     orr     r3, r3, r2
22     orr     r4, r4, r2
23     orr     r5, r5, r2
24     orr     r12,r12,r2
25     stmia   r0!, {r3-r5,r12}
26     bne     block_loop_or
27     ldmfd   sp!, {r4-r5}
28     bx      lr
29
30
31 .global block_andor @ void *src, size_t n, int andpat, int orpat
32
33 block_andor:
34     stmfd   sp!, {r4-r6}
35     orr     r2, r2, r2, lsl #8
36     orr     r2, r2, r2, lsl #16
37     orr     r3, r3, r3, lsl #8
38     orr     r3, r3, r3, lsl #16
39     mov     r1, r1, lsr #4
40 block_loop_andor:
41     ldmia   r0, {r4-r6,r12}
42     subs    r1, r1, #1
43     and     r4, r4, r2
44     orr     r4, r4, r3
45     and     r5, r5, r2
46     orr     r5, r5, r3
47     and     r6, r6, r2
48     orr     r6, r6, r3
49     and     r12,r12,r2
50     orr     r12,r12,r3
51     stmia   r0!, {r4-r6,r12}
52     bne     block_loop_andor
53     ldmfd   sp!, {r4-r6}
54     bx      lr
55
56
57
58 /* buggy and slow, probably because function call overhead
59 @ renderer helper, based on bitbank's method
60 .global draw8pix @ uint8 *P, uint8 *C, uint8 *PALRAM @ dest, src, pal
61
62 draw8pix:
63     stmfd sp!, {r4,r5}
64
65     ldrb  r3, [r1]            @ get bit 0 pixels
66     mov   r12,#1
67     orr   r12,r12,r12,lsl #8
68     orr   r12,r12,r12,lsl #16
69     ldrb  r1, [r1, #8]        @ get bit 1 pixels
70     orr   r3, r3, r3, lsl #9  @ shift them over 1 byte + 1 bit
71     orr   r3, r3, r3, lsl #18 @ now 4 pixels take up 4 bytes
72     and   r4, r12,r3, lsr #7  @ mask off the upper nibble pixels we want
73     and   r5, r12,r3, lsr #3  @ mask off the lower nibble pixels we want
74     ldr   r2, [r2]
75
76     orr   r1, r1, r1, lsl #9  @ process the bit 1 pixels
77     orr   r1, r1, r1, lsl #18
78     and   r3, r12,r1, lsr #7  @ mask off the upper nibble pixels we want
79     and   r1, r12,r1, lsr #3  @ mask off the lower nibble
80     orr   r4, r4, r3, lsl #1
81     orr   r5, r5, r1, lsl #5
82
83     @ can this be avoided?
84     mov   r4, r4, lsl #3      @ *8
85     mov   r3, r2, ror r4
86     strb  r3, [r0], #1
87     mov   r4, r4, lsr #8
88     mov   r3, r2, ror r4
89     strb  r3, [r0], #1
90     mov   r4, r4, lsr #8
91     mov   r3, r2, ror r4
92     strb  r3, [r0], #1
93     mov   r4, r4, lsr #8
94     mov   r3, r2, ror r4
95     strb  r3, [r0], #1
96
97     mov   r5, r5, lsl #3      @ *8
98     mov   r3, r2, ror r5
99     strb  r3, [r0], #1
100     mov   r5, r5, lsr #8
101     mov   r3, r2, ror r5
102     strb  r3, [r0], #1
103     mov   r5, r5, lsr #8
104     mov   r3, r2, ror r5
105     strb  r3, [r0], #1
106     mov   r5, r5, lsr #8
107     mov   r3, r2, ror r5
108     strb  r3, [r0], #1
109
110     ldmfd sp!, {r4,r5}
111     bx    lr
112 */
113