mirror of
https://github.com/LNH-team/pico-loader.git
synced 2026-06-02 17:26:48 +02:00
106 lines
2.6 KiB
ArmAsm
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
|