aboutsummaryrefslogtreecommitdiff
path: root/backends/platform/ds/arm9/source/fat/io_scsd_asm.s
diff options
context:
space:
mode:
Diffstat (limited to 'backends/platform/ds/arm9/source/fat/io_scsd_asm.s')
-rw-r--r--backends/platform/ds/arm9/source/fat/io_scsd_asm.s1042
1 files changed, 1042 insertions, 0 deletions
diff --git a/backends/platform/ds/arm9/source/fat/io_scsd_asm.s b/backends/platform/ds/arm9/source/fat/io_scsd_asm.s
new file mode 100644
index 0000000000..f138c07205
--- /dev/null
+++ b/backends/platform/ds/arm9/source/fat/io_scsd_asm.s
@@ -0,0 +1,1042 @@
+ .TEXT
+@--------------------------------sd data--------------------------------
+.equ sd_comadd,0x9800000
+.equ sd_dataadd,0x9000000
+.equ sd_dataradd,0x9100000
+@-----------------viod sd_data_write_s(u16 *buff,u16* crc16buff)-------------------
+ .ALIGN
+ .GLOBAL sd_data_write_s
+ .CODE 32
+sd_data_write_s:
+ stmfd r13!,{r4-r5}
+ mov r5,#512
+ mov r2,#sd_dataadd
+sd_data_write_busy:
+ ldrh r3,[r2]
+ tst r3,#0x100
+ beq sd_data_write_busy
+
+ ldrh r3,[r2]
+
+ mov r3,#0 @star bit
+ strh r3,[r2]
+sd_data_write_loop:
+ ldrh r3,[r0],#2
+ add r3,r3,r3,lsl #20
+ mov r4,r3,lsl #8
+ stmia r2,{r3-r4}
+
+ 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 r3,#0xff @end bit
+ strh r3,[r2]
+sd_data_write_loop2:
+ ldrh r3,[r2]
+ tst r3,#0x100
+ bne sd_data_write_loop2
+
+ ldmia r2,{r3-r4}
+
+ ldmfd r13!,{r4-r5}
+ bx r14
+@-----------------end sd_data_write_s-------------------
+
+@----------void sd_data_read_s(u16 *buff)-------------
+ .ALIGN
+ .GLOBAL sd_data_read_s
+ .CODE 32
+sd_data_read_s:
+ stmfd r13!,{r4}
+ mov r1,#sd_dataradd
+sd_data_read_loop1:
+ ldrh r3,[r1] @star bit
+ tst r3,#0x100
+ bne sd_data_read_loop1
+ mov r2,#512
+sd_data_read_loop:
+ ldmia r1,{r3-r4}
+ mov r3,r4,lsr #16
+ strh r3 ,[r0],#2
+
+ ldmia r1,{r3-r4}
+ mov r3,r4,lsr #16
+ strh r3 ,[r0],#2
+
+ ldmia r1,{r3-r4}
+ mov r3,r4,lsr #16
+ strh r3 ,[r0],#2
+
+ ldmia r1,{r3-r4}
+ mov r3,r4,lsr #16
+ strh r3 ,[r0],#2
+
+ ldmia r1,{r3-r4}
+ mov r3,r4,lsr #16
+ strh r3 ,[r0],#2
+
+ ldmia r1,{r3-r4}
+ mov r3,r4,lsr #16
+ strh r3 ,[r0],#2
+
+ ldmia r1,{r3-r4}
+ mov r3,r4,lsr #16
+ strh r3 ,[r0],#2
+
+ ldmia r1,{r3-r4}
+ mov r3,r4,lsr #16
+ strh r3 ,[r0],#2
+
+ subs r2, r2, #16
+ bne sd_data_read_loop
+
+ ldmia r1,{r3-r4} @crc 16
+ ldmia r1,{r3-r4}
+ ldmia r1,{r3-r4}
+ ldmia r1,{r3-r4}
+ ldrh r3,[r1] @end bit
+ ldmfd r13!,{r4}
+ bx r14
+@----------end sd_data_read_s-------------
+
+@------void sd_com_crc16_s(u16* buff,u16 num,u16* crc16buff)
+ .ALIGN
+ .GLOBAL sd_crc16_s
+ .CODE 32
+sd_crc16_s:
+ 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 sd_com_crc16_s-----------------------------------
+
+@--------------u8 sd_crc7_s(u16* buff,u16 num)----------------------------
+ .ALIGN
+ .GLOBAL sd_crc7_s
+ .CODE 32
+sd_crc7_s:
+ stmfd r13!,{r4}
+
+ mov r3,#0
+ ldr r4,=0x80808080
+ mov r1,r1,lsl #3 @ *8
+sd_crc7_loop:
+ tst r4,#0x80
+ ldrneb r2,[r0],#1
+
+ mov r3,r3,lsl #1
+
+ tst r3,#0x80
+ eorne r3,r3,#0x9
+
+ tst r2,r4,lsr #24
+ eorne r3,r3,#0x9
+
+ mov r4,r4,ror #1
+ subs r1,r1,#1
+ bne sd_crc7_loop
+
+ mov r3,r3,lsl #1
+ add r0,r3,#1
+ ldmfd r13!,{r4}
+ bx r14
+@--------------end sd_crc7_s----------------------------
+
+@--------------sd_com_read_s(u16* buff,u32 num)------------------
+ .ALIGN
+ .GLOBAL sd_com_read_s
+ .CODE 32
+
+sd_com_read_s:
+ stmfd r13!,{r4-r6}
+ mov r2,#sd_comadd
+sd_com_read_loop1:
+ ldrh r3,[r2] @star bit
+ tst r3,#1
+ bne sd_com_read_loop1
+
+sd_com_read_loop:
+ ldmia r2,{r3-r6}
+ subs r1, r1, #1
+ bne sd_com_read_loop
+ ldmfd r13!,{r4-r6}
+ bx r14
+@--------------end sd_com_read_s------------------
+
+@-------------------void sd_com_write_s(u16* buff,u32 num)-----------------
+
+ .ALIGN
+ .GLOBAL sd_com_write_s
+ .CODE 32
+sd_com_write_s:
+ stmfd r13!,{r4-r6}
+
+ mov r2,#sd_comadd
+sd_com_write_busy:
+ ldrh r3,[r2]
+ tst r3,#0x1
+ beq sd_com_write_busy
+
+ ldrh r3,[r2]
+
+sd_com_write_loop:
+ ldrb r3,[r0],#1
+ add r3,r3,r3,lsl #17
+ mov r4,r3,lsl #2
+ mov r5,r4,lsl #2
+ mov r6,r5,lsl #2
+ stmia r2,{r3-r6}
+ subs r1, r1, #1
+ bne sd_com_write_loop
+ ldmfd r13!,{r4-r6}
+
+ bx r14
+@-------------------end sd_com_write_s-----------------
+
+@-----------------void send_clk(u32 num)---------
+ .ALIGN
+ .GLOBAL send_clk
+ .CODE 32
+
+send_clk:
+ mov r1,#sd_comadd
+send_clk_loop1:
+ ldrh r3,[r1]
+ subs r0,r0,#1
+ bne send_clk_loop1
+ bx r14
+@-----------------end send_clk---------
+
+@---------------------------void SDCommand(u8 command,u8 num,u32 sector)--------------------
+ .ALIGN
+ .GLOBAL SDCommand
+ .CODE 32
+@void SDCommand(u8 command,u8 num,u32 sector )
+@{
+@ u8 databuff[6];
+@ register u8 *char1;
+@ register u8 *char2;
+@
+@ char1=(u8*)(((u32)&sector)+3);
+@ char2=(u8*)databuff;
+@ *char2++=coma+0x40;
+@ *char2++=*char1--;
+@ *char2++=*char1--;
+@ *char2++=*char1--;
+@ *char2++=*char1;
+@ *char2=sd_crc7_s((u32)databuff,5);
+@
+@ sd_com_write_s((u32)databuff,6);
+@
+@}
+SDCommand:
+ stmfd r13!,{r14}
+
+ sub r13,r13,#16
+ add r0,r0,#0x40
+ strb r0,[r13,#4]
+
+ mov r1,r2,lsr #24
+ strb r1,[r13,#5]
+ mov r1,r2,lsr #16
+ strb r1,[r13,#6]
+ mov r1,r2,lsr #8
+ strb r1,[r13,#7]
+ strb r2,[r13,#8]
+ add r0,r13,#4
+ mov r1,#5
+ bl sd_crc7_s
+ strb r0,[r13,#9]
+ add r0,r13,#4
+ mov r1,#6
+ bl sd_com_write_s
+
+ add r13,r13,#16
+ ldmfd r13!,{r15}
+@ bx r14
+@---------------------------end SDCommand--------------------
+
+@----------void ReadSector(u16 *buff,u32 sector,u8 readnum)-------------
+ .ALIGN
+ .GLOBAL ReadSector @ r0:Srcp r1:num ok
+ .CODE 32
+
+@void ReadSector(u16 *buff,u32 sector,u8 readnum)
+@{
+@ register u16 i,j;
+@ i=readnum;
+@ sectno<<=9;
+@ SDCommand(18,0,sector);
+@ for (j=0;j<i ; j++)
+@ {
+@ sd_data_read_s((u32)buff+j*512);
+@ }
+@ SDCommand(12,0,0);
+@ get_resp();
+@ send_clk(0x10);
+@
+@}
+ReadSector:
+ stmfd r13!,{r4-r6,r14}
+
+ mov r4,r0
+ mov r5,r2
+
+ mov r2,r1,lsl #9
+ mov r0,#18
+ mov r1,#0
+ bl SDCommand
+ mov r6,#0
+beginforj_ReadSector:
+ cmp r6,r5
+ bge endforj_ReadSector
+ mov r0,r4
+ add r0,r0,r6,lsl #9
+ bl sd_data_read_s
+ add r6,r6,#1
+ b beginforj_ReadSector
+endforj_ReadSector:
+ mov r0,#12
+ mov r1,#0
+ mov r2,#0
+ bl SDCommand
+ bl get_resp
+ mov r0,#0x10
+ bl send_clk
+ mov r0,#1
+ ldmfd r13!,{r4-r6,r15}
+@ bx r14
+@----------end ReadSector------------
+
+@-----------void get_resp(void)-------------------
+
+
+ .ALIGN
+ .GLOBAL get_resp @ r0:Srcp r1:num ok
+ .CODE 32
+get_resp:
+
+ stmfd r13!,{r14}
+ mov r1,#6
+ bl sd_com_read_s
+ ldmfd r13!,{r15}
+@-----------end get_resp-------------------
+
+
+@---------------void WriteSector(u16 *buff,u32 sector,u8 writenum)---------------------
+ .ALIGN
+ .GLOBAL WriteSector @ r0:Srcp r1:num ok
+ .CODE 32
+
+@void WriteSector(u16 *buff,u32 sector,u8 writenum)
+@{
+@ register u16 i,j;
+@ u16 crc16[5];
+@ i=writenum;
+@
+@ sectno<<=9;
+@
+@ SDCommand(25,0,sector);
+@ get_resp();
+@ send_clk(0x10);
+@
+@ for (j=0;j<i ; j++)
+@ {
+@ sd_crc16_s((u32)(u32)buff+j*512,512,(u32)crc16);
+@ sd_data_write_s((u32)buff+j*512,(u32)crc16);
+@ send_clk(0x10);
+@ }
+@ SDCommand(12,0,0);
+@ get_resp();
+@ send_clk(0x10);
+@ while((*(u16*)sd_dataadd &0x0100)==0);
+@
+@}
+@
+WriteSector:
+ stmfd r13!,{r4-r6,r14}
+
+ sub r13,r13,#20
+
+ mov r4,r0
+ mov r5,r2
+
+ mov r2,r1,lsl #9
+ mov r0,#25
+ mov r1,#0
+ bl SDCommand
+ bl get_resp
+ mov r0,#0x10
+ bl send_clk
+ mov r6,#0
+
+beginforj_WriteSector:
+ cmp r6,r5
+ bge endforj_WriteSector
+ mov r0,r4
+ add r0,r0,r6,lsl #9
+ mov r1,#512
+ add r2,r13,#4
+ bl sd_crc16_s
+ mov r0,r4
+ add r0,r0,r6,lsl #9
+ add r1,r13,#4
+ bl sd_data_write_s
+ mov r0,#0x10
+ bl send_clk
+ add r6,r6,#1
+ b beginforj_WriteSector
+endforj_WriteSector:
+ mov r0,#12
+ mov r1,#0
+ mov r2,#0
+ bl SDCommand
+ bl get_resp
+ mov r0,#0x10
+ bl send_clk
+ ldr r0,=sd_dataadd
+beginwhile_WriteSector:
+ ldrh r1,[r0]
+ tst r1,#0x0100
+ beq beginwhile_WriteSector
+ mov r0,#1
+ add r13,r13,#20
+ ldmfd r13!,{r4-r6,r15}
+@---------------end WriteSector--------------------
+
+@----------------void InitSCMode(void)---------------
+ .ALIGN
+ .GLOBAL InitSCMode
+ .CODE 32
+InitSCMode:
+ mvn r0,#0x0F6000000
+ sub r0,r0,#0x01
+ mov r1,#0x0A500
+ add r1,r1,#0x5A
+ strh r1,[r0]
+ strh r1,[r0]
+ mov r2,#3
+ strh r2,[r0]
+ strh r2,[r0]
+ bx r14
+@----------------end InitSCMode ---------------
+
+@----------------bool MemoryCard_IsInserted(void)---------------
+ .ALIGN
+ .GLOBAL MemoryCard_IsInserted
+ .CODE 32
+
+MemoryCard_IsInserted:
+ ldr r0,=sd_comadd
+ ldrh r1,[r0]
+ tst r1,#0x300
+ moveq r0,#1
+ movne r0,#0
+ bx r14
+@----------------end MemoryCard_IsInserted---------------
+
+ .END
+
+
+
+
+
+
+
+
+
+
+
+ .TEXT
+@--------------------------------sd data--------------------------------
+.equ sd_comadd,0x9800000
+.equ sd_dataadd,0x9000000
+.equ sd_dataradd,0x9100000
+@-----------------viod sd_data_write_s(u16 *buff,u16* crc16buff)-------------------
+ .ALIGN
+ .GLOBAL sd_data_write_s
+ .CODE 32
+sd_data_write_s:
+ stmfd r13!,{r4-r5}
+ mov r5,#512
+ mov r2,#sd_dataadd
+sd_data_write_busy:
+ ldrh r3,[r2]
+ tst r3,#0x100
+ beq sd_data_write_busy
+
+ ldrh r3,[r2]
+
+ mov r3,#0 @star bit
+ strh r3,[r2]
+sd_data_write_loop:
+ ldrh r3,[r0],#2
+ add r3,r3,r3,lsl #20
+ mov r4,r3,lsl #8
+ stmia r2,{r3-r4}
+
+ 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 r3,#0xff @end bit
+ strh r3,[r2]
+sd_data_write_loop2:
+ ldrh r3,[r2]
+ tst r3,#0x100
+ bne sd_data_write_loop2
+
+ ldmia r2,{r3-r4}
+
+ ldmfd r13!,{r4-r5}
+ bx r14
+@-----------------end sd_data_write_s-------------------
+
+@----------void sd_data_read_s(u16 *buff)-------------
+ .ALIGN
+ .GLOBAL sd_data_read_s
+ .CODE 32
+sd_data_read_s:
+ stmfd r13!,{r4}
+ mov r1,#sd_dataradd
+sd_data_read_loop1:
+ ldrh r3,[r1] @star bit
+ tst r3,#0x100
+ bne sd_data_read_loop1
+ mov r2,#512
+sd_data_read_loop:
+ ldmia r1,{r3-r4}
+ mov r3,r4,lsr #16
+ strh r3 ,[r0],#2
+
+ ldmia r1,{r3-r4}
+ mov r3,r4,lsr #16
+ strh r3 ,[r0],#2
+
+ ldmia r1,{r3-r4}
+ mov r3,r4,lsr #16
+ strh r3 ,[r0],#2
+
+ ldmia r1,{r3-r4}
+ mov r3,r4,lsr #16
+ strh r3 ,[r0],#2
+
+ ldmia r1,{r3-r4}
+ mov r3,r4,lsr #16
+ strh r3 ,[r0],#2
+
+ ldmia r1,{r3-r4}
+ mov r3,r4,lsr #16
+ strh r3 ,[r0],#2
+
+ ldmia r1,{r3-r4}
+ mov r3,r4,lsr #16
+ strh r3 ,[r0],#2
+
+ ldmia r1,{r3-r4}
+ mov r3,r4,lsr #16
+ strh r3 ,[r0],#2
+
+ subs r2, r2, #16
+ bne sd_data_read_loop
+
+ ldmia r1,{r3-r4} @crc 16
+ ldmia r1,{r3-r4}
+ ldmia r1,{r3-r4}
+ ldmia r1,{r3-r4}
+ ldrh r3,[r1] @end bit
+ ldmfd r13!,{r4}
+ bx r14
+@----------end sd_data_read_s-------------
+
+@------void sd_com_crc16_s(u16* buff,u16 num,u16* crc16buff)
+ .ALIGN
+ .GLOBAL sd_crc16_s
+ .CODE 32
+sd_crc16_s:
+ 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 sd_com_crc16_s-----------------------------------
+
+@--------------u8 sd_crc7_s(u16* buff,u16 num)----------------------------
+ .ALIGN
+ .GLOBAL sd_crc7_s
+ .CODE 32
+sd_crc7_s:
+ stmfd r13!,{r4}
+
+ mov r3,#0
+ ldr r4,=0x80808080
+ mov r1,r1,lsl #3 @ *8
+sd_crc7_loop:
+ tst r4,#0x80
+ ldrneb r2,[r0],#1
+
+ mov r3,r3,lsl #1
+
+ tst r3,#0x80
+ eorne r3,r3,#0x9
+
+ tst r2,r4,lsr #24
+ eorne r3,r3,#0x9
+
+ mov r4,r4,ror #1
+ subs r1,r1,#1
+ bne sd_crc7_loop
+
+ mov r3,r3,lsl #1
+ add r0,r3,#1
+ ldmfd r13!,{r4}
+ bx r14
+@--------------end sd_crc7_s----------------------------
+
+@--------------sd_com_read_s(u16* buff,u32 num)------------------
+ .ALIGN
+ .GLOBAL sd_com_read_s
+ .CODE 32
+
+sd_com_read_s:
+ stmfd r13!,{r4-r6}
+ mov r2,#sd_comadd
+sd_com_read_loop1:
+ ldrh r3,[r2] @star bit
+ tst r3,#1
+ bne sd_com_read_loop1
+
+sd_com_read_loop:
+ ldmia r2,{r3-r6}
+ subs r1, r1, #1
+ bne sd_com_read_loop
+ ldmfd r13!,{r4-r6}
+ bx r14
+@--------------end sd_com_read_s------------------
+
+@-------------------void sd_com_write_s(u16* buff,u32 num)-----------------
+
+ .ALIGN
+ .GLOBAL sd_com_write_s
+ .CODE 32
+sd_com_write_s:
+ stmfd r13!,{r4-r6}
+
+ mov r2,#sd_comadd
+sd_com_write_busy:
+ ldrh r3,[r2]
+ tst r3,#0x1
+ beq sd_com_write_busy
+
+ ldrh r3,[r2]
+
+sd_com_write_loop:
+ ldrb r3,[r0],#1
+ add r3,r3,r3,lsl #17
+ mov r4,r3,lsl #2
+ mov r5,r4,lsl #2
+ mov r6,r5,lsl #2
+ stmia r2,{r3-r6}
+ subs r1, r1, #1
+ bne sd_com_write_loop
+ ldmfd r13!,{r4-r6}
+
+ bx r14
+@-------------------end sd_com_write_s-----------------
+
+@-----------------void send_clk(u32 num)---------
+ .ALIGN
+ .GLOBAL send_clk
+ .CODE 32
+
+send_clk:
+ mov r1,#sd_comadd
+send_clk_loop1:
+ ldrh r3,[r1]
+ subs r0,r0,#1
+ bne send_clk_loop1
+ bx r14
+@-----------------end send_clk---------
+
+@---------------------------void SDCommand(u8 command,u8 num,u32 sector)--------------------
+ .ALIGN
+ .GLOBAL SDCommand
+ .CODE 32
+@void SDCommand(u8 command,u8 num,u32 sector )
+@{
+@ u8 databuff[6];
+@ register u8 *char1;
+@ register u8 *char2;
+@
+@ char1=(u8*)(((u32)&sector)+3);
+@ char2=(u8*)databuff;
+@ *char2++=coma+0x40;
+@ *char2++=*char1--;
+@ *char2++=*char1--;
+@ *char2++=*char1--;
+@ *char2++=*char1;
+@ *char2=sd_crc7_s((u32)databuff,5);
+@
+@ sd_com_write_s((u32)databuff,6);
+@
+@}
+SDCommand:
+ stmfd r13!,{r14}
+
+ sub r13,r13,#16
+ add r0,r0,#0x40
+ strb r0,[r13,#4]
+
+ mov r1,r2,lsr #24
+ strb r1,[r13,#5]
+ mov r1,r2,lsr #16
+ strb r1,[r13,#6]
+ mov r1,r2,lsr #8
+ strb r1,[r13,#7]
+ strb r2,[r13,#8]
+ add r0,r13,#4
+ mov r1,#5
+ bl sd_crc7_s
+ strb r0,[r13,#9]
+ add r0,r13,#4
+ mov r1,#6
+ bl sd_com_write_s
+
+ add r13,r13,#16
+ ldmfd r13!,{r15}
+@ bx r14
+@---------------------------end SDCommand--------------------
+
+@----------void ReadSector(u16 *buff,u32 sector,u8 readnum)-------------
+ .ALIGN
+ .GLOBAL ReadSector @ r0:Srcp r1:num ok
+ .CODE 32
+
+@void ReadSector(u16 *buff,u32 sector,u8 readnum)
+@{
+@ register u16 i,j;
+@ i=readnum;
+@ sectno<<=9;
+@ SDCommand(18,0,sector);
+@ for (j=0;j<i ; j++)
+@ {
+@ sd_data_read_s((u32)buff+j*512);
+@ }
+@ SDCommand(12,0,0);
+@ get_resp();
+@ send_clk(0x10);
+@
+@}
+ReadSector:
+ stmfd r13!,{r4-r6,r14}
+
+ mov r4,r0
+ mov r5,r2
+
+ mov r2,r1,lsl #9
+ mov r0,#18
+ mov r1,#0
+ bl SDCommand
+ mov r6,#0
+beginforj_ReadSector:
+ cmp r6,r5
+ bge endforj_ReadSector
+ mov r0,r4
+ add r0,r0,r6,lsl #9
+ bl sd_data_read_s
+ add r6,r6,#1
+ b beginforj_ReadSector
+endforj_ReadSector:
+ mov r0,#12
+ mov r1,#0
+ mov r2,#0
+ bl SDCommand
+ bl get_resp
+ mov r0,#0x10
+ bl send_clk
+ mov r0,#1
+ ldmfd r13!,{r4-r6,r15}
+@ bx r14
+@----------end ReadSector------------
+
+@-----------void get_resp(void)-------------------
+
+
+ .ALIGN
+ .GLOBAL get_resp @ r0:Srcp r1:num ok
+ .CODE 32
+get_resp:
+
+ stmfd r13!,{r14}
+ mov r1,#6
+ bl sd_com_read_s
+ ldmfd r13!,{r15}
+@-----------end get_resp-------------------
+
+
+@---------------void WriteSector(u16 *buff,u32 sector,u8 writenum)---------------------
+ .ALIGN
+ .GLOBAL WriteSector @ r0:Srcp r1:num ok
+ .CODE 32
+
+@void WriteSector(u16 *buff,u32 sector,u8 writenum)
+@{
+@ register u16 i,j;
+@ u16 crc16[5];
+@ i=writenum;
+@
+@ sectno<<=9;
+@
+@ SDCommand(25,0,sector);
+@ get_resp();
+@ send_clk(0x10);
+@
+@ for (j=0;j<i ; j++)
+@ {
+@ sd_crc16_s((u32)(u32)buff+j*512,512,(u32)crc16);
+@ sd_data_write_s((u32)buff+j*512,(u32)crc16);
+@ send_clk(0x10);
+@ }
+@ SDCommand(12,0,0);
+@ get_resp();
+@ send_clk(0x10);
+@ while((*(u16*)sd_dataadd &0x0100)==0);
+@
+@}
+@
+WriteSector:
+ stmfd r13!,{r4-r6,r14}
+
+ sub r13,r13,#20
+
+ mov r4,r0
+ mov r5,r2
+
+ mov r2,r1,lsl #9
+ mov r0,#25
+ mov r1,#0
+ bl SDCommand
+ bl get_resp
+ mov r0,#0x10
+ bl send_clk
+ mov r6,#0
+
+beginforj_WriteSector:
+ cmp r6,r5
+ bge endforj_WriteSector
+ mov r0,r4
+ add r0,r0,r6,lsl #9
+ mov r1,#512
+ add r2,r13,#4
+ bl sd_crc16_s
+ mov r0,r4
+ add r0,r0,r6,lsl #9
+ add r1,r13,#4
+ bl sd_data_write_s
+ mov r0,#0x10
+ bl send_clk
+ add r6,r6,#1
+ b beginforj_WriteSector
+endforj_WriteSector:
+ mov r0,#12
+ mov r1,#0
+ mov r2,#0
+ bl SDCommand
+ bl get_resp
+ mov r0,#0x10
+ bl send_clk
+ ldr r0,=sd_dataadd
+beginwhile_WriteSector:
+ ldrh r1,[r0]
+ tst r1,#0x0100
+ beq beginwhile_WriteSector
+ mov r0,#1
+ add r13,r13,#20
+ ldmfd r13!,{r4-r6,r15}
+@---------------end WriteSector--------------------
+
+@----------------void InitSCMode(void)---------------
+ .ALIGN
+ .GLOBAL InitSCMode
+ .CODE 32
+InitSCMode:
+ mvn r0,#0x0F6000000
+ sub r0,r0,#0x01
+ mov r1,#0x0A500
+ add r1,r1,#0x5A
+ strh r1,[r0]
+ strh r1,[r0]
+ mov r2,#3
+ strh r2,[r0]
+ strh r2,[r0]
+ bx r14
+@----------------end InitSCMode ---------------
+
+@----------------bool MemoryCard_IsInserted(void)---------------
+ .ALIGN
+ .GLOBAL MemoryCard_IsInserted
+ .CODE 32
+
+MemoryCard_IsInserted:
+ ldr r0,=sd_comadd
+ ldrh r1,[r0]
+ tst r1,#0x300
+ moveq r0,#1
+ movne r0,#0
+ bx r14
+@----------------end MemoryCard_IsInserted---------------
+
+ .END
+
+
+
+
+
+
+
+
+
+
+