Files
pico-loader/arm9/source/patches/platform/supercard/scsd/SuperCardSDReadSectorPatchCode.s
2026-02-15 20:26:24 +01:00

106 lines
2.6 KiB
ArmAsm

.cpu arm7tdmi
.syntax unified
#include "SuperCardSDAddresses.h"
.section "scsd_read_sector", "ax"
@ bool scsd_readSector(uint32_t sector, uint8_t *buff, uint32_t readnum)
BEGIN_THUMB_FUNCTION scsd_readSector
push {r1,r2-r7,lr}
LOAD_SLOW_EXMEMCNT
@ r1 for now holds the sector
.global scsd_readSectorSdhcLabel
scsd_readSectorSdhcLabel:
@ if not sdhc this needs to be shifted to the left by 9
lsls r1, r0, #9
@ movs r1, r0
@ enable sd access
@ this function won't touch r1
movs r0, #3
CALL sccmn_changeMode readInterwork
@ READ_MULTIPLE_BLOCK
SD_COMMAND_ARGUMENT #18
@ 2nd parameter is in r1 from above
CALL scsd_sdCommandAndDropResponse6 readInterwork
LOAD_FAST_EXMEMCNT
@ loads the saved r1 (buff) and r2 (readnum)
@ into r0 and r1
pop {r0,r1}
read_sector_loop:
@ all the functions called in this loop don't change the value of r0 or r1
@ except scsd_readData, which will increase r0 by 512 automatically
CALL scsd_readData readInterwork
subs r1, #1
bne read_sector_loop
RELOAD_SLOW_EXMEMCNT
@ STOP_TRANSMISSION
SD_COMMAND_ARGUMENT #12
@ 2nd parameter is passed in r1
@ and from the loop above r1 is already 0
LOAD_INTERWORK_FUNCTION sccmn_sdSendClock10 readInterwork r6
CALL scsd_sdCommandAndDropResponse6 readInterwork
movs r0, #1
CALL sccmn_changeMode readInterwork
RESTORE_EXMEMCNT
@ returns true
@ the change mode function above doesn't touch r0, so it's still 1
@ movs r0, #1
pop {r3-r7,pc}
INTERWORK readInterwork
INTERWORK_FUNCTION sccmn_changeMode readInterwork
INTERWORK_FUNCTION scsd_sdCommandAndDropResponse6 readInterwork
INTERWORK_FUNCTION scsd_readData readInterwork
INTERWORK_FUNCTION sccmn_sdSendClock10 readInterwork
.balign 4
.pool
.section "scsd_read_data", "ax"
.macro LOAD_U32_ALIGNED_2WORDS srcreg,dstreg,maskreg
ldmia \srcreg, {r1-r8}
and r4, r4, \maskreg
and r8, r8, \maskreg
orr r4, r4, r2, lsr #16
orr r8, r8, r6, lsr #16
stmia \dstreg!, {r4, r8}
.endm
@ this function will update r0 by incrementing it by 512
@ and will leave r1 unchanged
@ void scsd_readData(void* buffer);
BEGIN_ARM_FUNCTION scsd_readData
push {r1,r4-r11}
add r9, r0, #512
ldr r10,= sd_dataread
waitOnReadTrue_loop:
ldrh r3, [r10]
tst r3, #0x100
bne waitOnReadTrue_loop
ldr r11,= 0xFFFF0000
read32_loop:
LOAD_U32_ALIGNED_2WORDS r10, r0, r11
LOAD_U32_ALIGNED_2WORDS r10, r0, r11
cmp r0, r9
blt read32_loop
@drop crc16
ldmia r10, {r1-r8}
@read end transmission bit
ldrh r1, [r10]
pop {r1,r4-r11}
bx lr
.balign 4
.pool