aboutsummaryrefslogtreecommitdiff
path: root/backends/platform/ds/arm9/source
diff options
context:
space:
mode:
authorNeil Millstone2006-12-01 22:36:16 +0000
committerNeil Millstone2006-12-01 22:36:16 +0000
commit9c13f12cddb13a92acc3c671ed3547e5f7a6c8f5 (patch)
tree4d4b03039f72853b5a6123b699411f6670a78498 /backends/platform/ds/arm9/source
parent3f627e73e4375af62db297f47befc6a38a868abc (diff)
downloadscummvm-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.s200
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
+