NDS Loader Source, A Good Thing(TM)
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@ GBA movie player NDS loader
@ by Rafael Vuijk (aka DarkFader)
@
@ Boot method: PassMe/WifiMe/FlashMe
@ Tested filesystems:
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.equ save_REGS, 0x027FF000
.equ NewARM9Loop_dest, 0x027FF100
.equ RAM_HEADER, 0x027FFE00
.equ BOOTSECTOR_DATA, 0x02000000
.equ DIRECTORY_DATA, 0x02000200
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.global _start
_start:
adr r0, _start_thumb + 1
bx r0
.thumb
_start_thumb:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ load boot sector
mov r0, #0
ldr r1, =BOOTSECTOR_DATA
ldr r2, =0x200
bl CF_Read_LBA
ldr r7, =BOOTSECTOR_DATA @ ***
@ calculate root directory sector
ldrb r1, [r7, #0x10] @ number of FATs (2)
ldrh r2, [r7, #0x16] @ sectors per FAT (250)
mul r1, r1, r2 @ FAT sectors
ldrh r3, [r7, #0x0E] @ reserved sectors (4)
add r6, r1, r3 @ root directory sector ***
push {r6}
b _matching_filename @ !!!
_directory_sector:
mov r0, r6
ldr r1, =DIRECTORY_DATA
ldr r2, =0x200
bl CF_Read_LBA
ldr r4, =DIRECTORY_DATA
_find_entry:
ldr r1, =filename
mov r2, #0 @ filename character 0..12
_compare_filename:
cmp r2, #13
beq _matching_filename
ldrb r0, [r4, r2] @ compare directory entry
ldrb r3, [r1, r2] @ with filename we look for
add r2, r2, #1
cmp r0, r3
beq _compare_filename
@ not found
add r4, r4, #32 @ next entry
lsr r0, r4, #9 @ sector done?
bcc _find_entry @ same sector
add r6, r6, #1 @ next sector
b _directory_sector
_matching_filename:
add r4, r4, r2 @ found entry
@ calculate file sector
ldrh r0, [r4, #0x1A] @ cluster lo
@ldrh r1, [r4, #0x14] @ cluster hi
@lsl r1, r1, #16
@orr r0, r0, r1 @ cluster
sub r0, r0, #2 @ cluster - 2
ldrb r1, [r7, #0x0D] @ sectors per cluster (32)
mul r1, r1, r0 @ file sector
ldr r1, =0
@
pop {r6} @ root directory sector
add r6, r6, r1 @ root directory sector + file sector ***
@ calculate root directory sectors
ldrb r0, [r7, #0x11] @ root directory entries lo
ldrb r1, [r7, #0x12] @ root directory entries hi
lsl r1, r1, #8
orr r0, r0, r1 @ root directory entries
lsl r0, r0, #5 @ root directory size
ldr r1, =0x1FF
add r0, r0, r1 @ sector align
bic r0, r0, r1 @ sector align
lsr r0, r0, #9 @ number of root directory sectors
@
add r6, r6, r0 @ root directory sector + file sector + root directory sectors
@
ldr r7, =RAM_HEADER
@ copy new ARM9 loop
ldr r0, NewARM9Loop
ldr r4, =NewARM9Loop_dest
str r0, [r4, #0] @ place ldr instruction
str r4, [r4, #4] @ address of ldr instruction
str r4, [r7, #0x24] @ go to new loop
@ load NDS header
mov r0, r6 @ file sector
mov r1, r7 @ RAM header
ldr r2, =0x200
bl CF_Read_LBA
adr r0, AfterPass
mov pc, r0
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.pool
.ds.b 0xAC - .
.arm
.ascii "PASS" @ gamecode for FlashMe autoboot
filename:
.ascii "START NDS"
.align
NewARM9Loop:
ldr pc, . + 4
.ds.b 0xC0 - .
b _start
.thumb
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
AfterPass:
@ clear RAM
mov r0, #0
mov r1, #0
mov r2, #0
mov r3, #0
ldr r4, =0x02000000
ldr r5, =0x023FF000
_clear_loop:
stmia r4!, {r0-r3}
cmp r4, r5
bne _clear_loop
@ copy ARM9 binary
ldr r0, [r7, #0x20] @ ROM offset
lsr r0, r0, #9 @ offset to sectors
add r0, r6, r0 @ add file sector
ldr r1, [r7, #0x28] @ RAM address
ldr r2, [r7, #0x2C] @ code size
bl CF_Read_LBA
@ copy ARM7 binary
ldr r0, [r7, #0x30] @ ROM offset
lsr r0, r0, #9 @ offset to sectors
add r0, r0, r6 @ add file sector
ldr r1, [r7, #0x38] @ RAM address
ldr r2, [r7, #0x3C] @ code size
bl CF_Read_LBA
@ start ARM9
ldr r0, [r7, #0x24]
ldr r1, =NewARM9Loop_dest
str r0, [r1, #0x4]
@ start ARM7
ldr r0, [r7, #0x34]
bx r0
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ r0 = sector
@ r1 = dest address
@ r2 = length, aligned to 0x200 bytes
@ destroys r0-r5
CF_Read_LBA:
ldr r4, =0x09000000 @ reg 0
_sector_loop: @ r4 = reg 0
ldr r5, =7<<17
add r4, r4, r5 @ reg 7
_wait_ready:
ldrh r3, [r4]
lsr r5, r3, #7+1 @ 0x80
bcs _wait_ready @ busy
lsr r5, r3, #6+1 @ 0x40
bcc _wait_ready @ ready
ldr r5, =5<<17
sub r4, r4, r5 @ reg 2
mov r3, #1
strh r3, [r4]
ldr r5, =1<<17
add r4, r4, r5 @ reg 3
lsr r3, r0, #0
strh r3, [r4]
add r4, r4, r5 @ reg 4
lsr r3, r0, #8
strh r3, [r4]
add r4, r4, r5 @ reg 5
lsr r3, r0, #16
strh r3, [r4]
add r4, r4, r5 @ reg 6
lsr r3, r0, #24
add r3, r3, #0xE0
strh r3, [r4]
add r4, r4, r5 @ reg 7
mov r3, #0x20
strh r3, [r4]
_wait_data:
ldrh r3, [r4]
lsr r5, r3, #7+1 @ 0x80
bcs _wait_data @ busy
lsr r5, r3, #3+1 @ 0x08
bcc _wait_data @ data request
ldr r5, =7<<17
sub r4, r4, r5 @ reg 0
ldr r5, =0x200 @ sector size
_copy_sector:
ldrh r3, [r4]
strh r3, [r1]
add r1, r1, #2 @ dest += 2
sub r2, r2, #2 @ length -= 2
sub r5, r5, #2
bne _copy_sector
cmp r2, #0 @ finished?
ble _bx_lr
add r0, r0, #1 @ sector += 1
b _sector_loop
_bx_lr:
bx lr
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.end
消息来源:http://ds.darkain.com/hack/
下载NDS Loader
下载HACK ver |