b8268d6447a2f85e4d9ad1ac6d8c0208a9774de3
[picodrive.git] / misc_arm.s
1 @ vim:filetype=armasm
2
3 @ Memory converters for different modes
4 @ (c) Copyright 2007, Grazvydas "notaz" Ignotas
5
6
7 @ r10 is tmp, io1 is lsb halfword, io2 is msb
8 @ | 0 1 | 2 3 |  ->  | 0 2 | 1 3 |  (little endian)
9 .macro _conv_reg io1 io2
10     mov     r10,  \io2, lsl #16
11     and     \io2, \io2, r11,  lsl #16
12     orr     \io2, \io2, \io1, lsr #16
13     and     \io1, \io1, r11
14     orr     \io1, \io1, r10
15 /*
16     mov     \io2, \io2, ror #16
17     mov     r10,  \io1, lsl #16
18     orr     r10,  r10,  \io2, lsr #16
19     mov     \io1, \io1, lsr #16
20     orr     \io1, \io1, \io2, lsl #16
21     mov     \io2, r10,  ror #16
22 */
23 .endm
24
25
26 .global wram_2M_to_1M
27 wram_2M_to_1M:
28     stmfd   sp!,{r4-r11,lr}
29     add     r1, r0, #0x60000    @ m1M_b1
30     add     r0, r0, #0x40000    @ m1M_b0
31     mov     r2, r0              @ m2M
32
33     mov     r11, #0xff
34     orr     r11, r11, r11, lsl #8
35     mov     r12, #(0x40000/8/4)
36
37 _2Mto1M_loop:
38     ldmdb   r2!,{r3-r9,lr}
39     _conv_reg r3,r4
40     _conv_reg r5,r6
41     _conv_reg r7,r8
42     _conv_reg r9,lr
43     subs    r12, r12, #1
44     stmdb   r0!,{r3,r5,r7,r9}
45     stmdb   r1!,{r4,r6,r8,lr}
46     bne     _2Mto1M_loop
47
48     ldmfd   sp!,{r4-r11,pc}
49
50
51
52 .global wram_1M_to_2M
53 wram_1M_to_2M:
54     stmfd   sp!,{r4-r11,lr}
55     mov     r2, r0              @ m2M
56     add     r1, r0, #0x40000    @ m1M_b1
57     add     r0, r0, #0x20000    @ m1M_b0
58
59     mov     r11, #0xff
60     orr     r11, r11, r11, lsl #8
61     mov     r12, #(0x40000/8/4)
62
63 _1Mto2M_loop:
64     ldmia   r0!,{r3,r5,r7,r9}
65     ldmia   r1!,{r4,r6,r8,lr}
66     _conv_reg r3,r4
67     _conv_reg r5,r6
68     _conv_reg r7,r8
69     _conv_reg r9,lr
70     subs    r12, r12, #1
71     stmia   r2!,{r3-r9,lr}
72     bne     _1Mto2M_loop
73
74     ldmfd   sp!,{r4-r11,pc}
75
76