.arm.little

.create "emunand.bin", 0
.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]
    add r2, r3  ; Add the offset to the NAND in the SD.

    ldreq r3, [ncsd_header_offset]
    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
sdmmc:	                .ascii "SDMC"
nand_offset:		.ascii "NAND"       ; for rednand this should be 1
ncsd_header_offset:	.ascii "NCSD"       ; depends on nand manufacturer + emunand type (GW/RED)
.close