diff options
author | Neil Millstone | 2006-12-01 22:36:16 +0000 |
---|---|---|
committer | Neil Millstone | 2006-12-01 22:36:16 +0000 |
commit | 9c13f12cddb13a92acc3c671ed3547e5f7a6c8f5 (patch) | |
tree | 4d4b03039f72853b5a6123b699411f6670a78498 /backends/platform/ds/arm9/source | |
parent | 3f627e73e4375af62db297f47befc6a38a868abc (diff) | |
download | scummvm-rg350-9c13f12cddb13a92acc3c671ed3547e5f7a6c8f5.tar.gz scummvm-rg350-9c13f12cddb13a92acc3c671ed3547e5f7a6c8f5.tar.bz2 scummvm-rg350-9c13f12cddb13a92acc3c671ed3547e5f7a6c8f5.zip |
Adding new M3SD driver
svn-id: r24798
Diffstat (limited to 'backends/platform/ds/arm9/source')
-rw-r--r-- | backends/platform/ds/arm9/source/fat/m3sd.s | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/backends/platform/ds/arm9/source/fat/m3sd.s b/backends/platform/ds/arm9/source/fat/m3sd.s new file mode 100644 index 0000000000..f6fab1a9e2 --- /dev/null +++ b/backends/platform/ds/arm9/source/fat/m3sd.s @@ -0,0 +1,200 @@ + + .equ CSYNC, 0x9800000 + .equ SDDIR, 0x8800000 + .equ SDCON, 0x9800000 + .equ SDODA, 0x9000000 + + .TEXT + .ALIGN + .CODE 32 + +clkout: + stmfd r13!,{r0-r1} + ldr r1,=SDDIR + mov r0,#0x4 + strh r0,[r1] + mov r0,r0 + mov r0,r0 + mov r0,#0xc + strh r0,[r1] + ldmfd r13!,{r0-r1} + bx r14 + +clkin: + stmfd r13!,{r0-r1} + ldr r1,=SDDIR + mov r0,#0x0 + strh r0,[r1] + mov r0,r0 + mov r0,r0 + mov r0,#0x8 + strh r0,[r1] + ldmfd r13!,{r0-r1} + bx r14 + +wait_ready: + stmfd r13!,{r0-r2} + mov r2,#32 + mov r1,#SDODA +sd_write_loop2: + mov r0,#0xff + strh r0,[r1] + bl clkout + subs r2, r2, #1 + bne sd_write_loop2 + +sd_write_busy: + bl clkin + ldrh r0,[r1] + tst r0,#0x100 + beq sd_write_busy + ldmfd r13!,{r0-r1} + bx r14 + +@------void SD_crc16(u16* buff,u16 num,u16* crc16buff) + .global SD_crc16 +SD_crc16: + stmfd r13!,{r4-r9} + mov r9,r2 + + mov r3,#0 + mov r4,#0 + mov r5,#0 + mov r6,#0 + + ldr r7,=0x80808080 + ldr r8,=0x1021 + mov r1,r1,lsl #3 +sd_crc16_loop: + + tst r7,#0x80 + ldrneb r2,[r0],#1 + + mov r3,r3,lsl #1 + tst r3,#0x10000 + eorne r3,r3,r8 + tst r2,r7,lsr #24 + eorne r3,r3,r8 + + mov r4,r4,lsl #1 + tst r4,#0x10000 + eorne r4,r4,r8 + tst r2,r7,lsr #25 + eorne r4,r4,r8 + + mov r5,r5,lsl #1 + tst r5,#0x10000 + eorne r5,r5,r8 + tst r2,r7,lsr #26 + eorne r5,r5,r8 + + mov r6,r6,lsl #1 + tst r6,#0x10000 + eorne r6,r6,r8 + tst r2,r7,lsr #27 + eorne r6,r6,r8 + + mov r7,r7,ror #4 + subs r1,r1,#4 + bne sd_crc16_loop + + mov r2,r9 + mov r8,#16 +sd_crc16_write_data: + mov r7,r7,lsl #4 + tst r3,#0x8000 + orrne r7,r7,#8 + tst r4,#0x8000 + orrne r7,r7,#4 + tst r5,#0x8000 + orrne r7,r7,#2 + tst r6,#0x8000 + orrne r7,r7,#1 + + mov r3,r3,lsl #1 + mov r4,r4,lsl #1 + mov r5,r5,lsl #1 + mov r6,r6,lsl #1 + + sub r8,r8,#1 + tst r8,#1 + streqb r7,[r2],#1 + cmp r8,#0 + bne sd_crc16_write_data + + ldmfd r13!,{r4-r9} + bx r14 +@------end----------------------------------- + +@-----------------viod SD_data_write(u16 *buff,u16* crc16buff)------------------- + .global SD_data_write +SD_data_write: + stmfd r13!,{r4-r5,r14} + mov r5,#512 + mov r2,#SDODA +sd_data_write_busy: + bl clkin + ldrh r3,[r2] + tst r3,#0x100 + beq sd_data_write_busy + + mov r3,#0 + strh r3,[r2] + bl clkout + +sd_data_write_loop: + ldrh r4,[r0],#2 + mov r3,r4,lsr#4 + strh r3,[r2] + bl clkout + mov r3,r4 + strh r3,[r2] + bl clkout + mov r3,r4,lsr#12 + strh r3,[r2] + bl clkout + mov r3,r4,lsr#8 + strh r3,[r2] + bl clkout + + subs r5, r5, #2 + bne sd_data_write_loop + + cmp r1,#0 + movne r0,r1 + movne r1,#0 + movne r5,#8 + bne sd_data_write_loop + + mov r5,#32 +sd_data_write_loop2: + mov r3,#0xff + strh r3,[r2] + bl clkout + subs r5, r5, #1 + bne sd_data_write_loop2 + +sd_data_write_busy2: + bl clkin + ldrh r3,[r2] + tst r3,#0x100 + beq sd_data_write_busy2 + + ldmfd r13!,{r4-r5,r15} + +DC_FlushRange: + add r1, r1, r0 + bic r0, r0, #0x1F +DC_FlushRangeLoop: + mcr p15, 0, r0, c7, c14, 1 + mcr p15, 0, r0, c7, c5, 1 + add r0, r0, #0x20 + cmp r0, r1 + blt DC_FlushRangeLoop + + mov r0,#0 + mcr p15,0x0,r0,c7,c10,4 + bx lr +@--------------------------------------- + .end + |