scummvm/backends/platform/ds/arm9/source/fat/m3sd.s
2011-08-07 13:53:33 +02:00

199 lines
3.3 KiB
ArmAsm

.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