mirror of
https://github.com/LNH-team/pico-loader.git
synced 2026-06-02 09:16:49 +02:00
Add support for the SuperChis (#138)
This commit is contained in:
@@ -0,0 +1,124 @@
|
||||
.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
|
||||
Reference in New Issue
Block a user