Files
pico-loader/arm9/source/patches/platform/ezp/ezpWriteSectorsAsm.s
2025-12-02 08:40:36 -08:00

86 lines
1.6 KiB
ArmAsm

.cpu arm7tdmi
.section "ezp_writesectors", "ax"
.syntax unified
.thumb
// r0 = dst sector
// r1 = src
// r2 = sector count
.global ezp_writeSectors
.type ezp_writeSectors, %function
ezp_writeSectors:
push {r4-r7,lr}
ldr r4, =0x040001A0
movs r3, #0x80
strb r3, [r4,#1]
sector_loop:
// write to sd buffer index 0xaa
// BB 00 00 01 00 00 00 aa
movs r3, #0xBB
str r3, [r4,#0x8]
movs r3, #0x1
strb r3, [r4,#0xB]
movs r3, #0
str r3, [r4,#0xC] // storing as little-endian puts the bottom 8 bits as first byte
ldr r3, =0xE15A7FFF
ldr r6, =0x04100010
str r3, [r4,#4]
BB_data_loop:
ldrb r3, [r4,#6]
lsrs r3, r3, #8 // check if ready to write
bcc BB_data_loop_check_transfer_end // if not skip reading
ldmia r1!, {r3}
str r3, [r6]
BB_data_loop_check_transfer_end:
ldrb r3, [r4,#7]
lsrs r3, r3, #8 // check if transfer is done
bcs BB_data_loop
// write 0xXX number of sectors at sd sector 0xaabbccdd
// note XX is already filled from previous command
// BB 00 00 XX aa bb cc dd
movs r3, #0xBC
strb r3, [r4,#0x8]
lsrs r3, r0, #24
strb r3, [r4,#0xC]
lsrs r3, r0, #16
strb r3, [r4,#0xD]
lsrs r3, r0, #8
strb r3, [r4,#0xE]
strb r0, [r4,#0xF]
BC_poll_loop:
ldr r3, =0xA7586190
str r3, [r4,#4]
BC_poll_transfer_loop:
ldrb r3, [r4,#6]
lsrs r3, r3, #8
bcc BC_poll_check_transfer_end
ldr r5, [r6]
BC_poll_check_transfer_end:
ldrb r3, [r4,#7]
lsrs r3, r3, #8
bcs BC_poll_transfer_loop
cmp r5, #0
bne BC_poll_loop
adds r0, #1
subs r2, #1
bne sector_loop
pop {r4-r7,pc}
.balign 4
.pool
.end