51 lines
1.2 KiB
ArmAsm
51 lines
1.2 KiB
ArmAsm
.nds
|
|
|
|
sdmmc equ 0x080D86F0
|
|
|
|
.create "emunand.bin", 0x0801A4C0
|
|
.org 0x0801A4C0
|
|
.arm
|
|
nand_sd:
|
|
; Original code that still needs to be executed.
|
|
mov r4, r0
|
|
mov r5, r1
|
|
mov r7, r2
|
|
mov r6, r3
|
|
; End.
|
|
|
|
; If we're already trying to access the SD, return.
|
|
ldr r2, [r0, #4]
|
|
ldr r1, =sdmmc
|
|
cmp r2, r1
|
|
beq nand_sd_ret
|
|
|
|
str r1, [r0, #4] ; Set object to be SD
|
|
ldr r2, [r0, #8] ; Get sector to read
|
|
cmp r2, #0 ; For GW compatibility, see if we're trying to read the ncsd header (sector 0)
|
|
|
|
ldr r3, =nand_offset
|
|
ldr r3, [r3]
|
|
add r2, r3 ; Add the offset to the NAND in the SD.
|
|
|
|
ldreq r3, =ncsd_header_offset
|
|
ldreq r3, [r3]
|
|
addeq r2, r3 ; If we're reading the ncsd header, add the offset of that sector.
|
|
|
|
str r2, [r0, #8] ; Store sector to read
|
|
|
|
nand_sd_ret:
|
|
; Restore registers.
|
|
mov r1, r5
|
|
mov r2, r7
|
|
mov r3, r6
|
|
|
|
; Return 4 bytes behind where we got called,
|
|
; due to the offset of this function being stored there.
|
|
mov r0, lr
|
|
add r0, #4
|
|
bx r0
|
|
.pool
|
|
nand_offset: .ascii "NAND" ; for rednand this should be 1
|
|
ncsd_header_offset: .ascii "NCSD" ; depends on nand manufacturer + emunand type (GW/RED)
|
|
.close
|