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

125 lines
2.9 KiB
ArmAsm

.cpu arm7tdmi
.syntax unified
#include "SuperCardLiteAddresses.h"
.section "sclite_read_sector", "ax"
@ bool sclite_readSector(uint32_t sector, uint8_t *buff, uint32_t readnum)
BEGIN_THUMB_FUNCTION sclite_readSector
push {r1,r2-r7,lr}
@ load EXMEMCNT register into r7
LOAD_EXMEMCNT
@ r1 for now holds the sector
.global sclite_readSectorSdhcLabel
sclite_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 anything
movs r0, #3
CALL sccmn_changeMode readInterwork
@ READ_MULTIPLE_BLOCK
@ puts the value in r2
SD_COMMAND_ARGUMENT #18
@ 2nd parameter is in r1 from above
CALL sclite_sdCommandAndDropResponse6 readInterwork
@ 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 any register
@ except sclite_readData, which will increase r0 by 512 automatically
CALL sclite_readData readInterwork
subs r1, #1
bne read_sector_loop
@ STOP_TRANSMISSION
@ puts the value in r2
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 sclite_sdCommandAndDropResponse6 readInterwork
@ this function won't touch anything
@ CALL sccmn_sdSendClock10 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 sclite_sdCommandAndDropResponse6 readInterwork
INTERWORK_FUNCTION sclite_readData readInterwork
INTERWORK_FUNCTION sccmn_sdSendClock10 readInterwork
.balign 4
.pool
.section "sclite_read_data", "ax"
@ void sclite_readData(void* buffer)
BEGIN_THUMB_FUNCTION sclite_readData
push {r1,r4-r7,lr}
@ loads sd_dataread
movs r1, #0x91
lsls r1, r1, #20
@ loops as long as sd_dataread is 0x100
sclite_readData_buff_bit_loop:
ldrh r3, [r1]
lsrs r3, #9
bcs sclite_readData_buff_bit_loop
@ loads sd_dataread_4
movs r1, #0x92
lsls r1, r1, #20
@ performs a dummy read of a short to initiate the transfer
ldrh r2, [r1]
@ lr holds buffer + 512
movs r2, #0x80
lsls r2, r2, #2
adds r2, r0, r2
mov lr, r2
ldmia r1!, {r2-r3}
stmia r0!, {r2-r3}
sclite_readData_loop:
@ load 6 ints at the time, for a total of 24 bytes
ldmia r1!, {r2-r7}
stmia r0!, {r2-r7}
cmp r0,lr
bne sclite_readData_loop
@ drop crc16
ldr r2, [r1]
ldrh r2, [r1]
@ loads sd_dataread_1
movs r1, #0x90
lsls r1, r1, #20
ldrh r2, [r1]
pop {r1,r4-r7,pc}
.balign 4
.pool