NDS Loader Source, A Good Thing(TM)
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:
adrr0, _start_thumb + 1
bxr0
.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
ldrbr1, @ number of FATs (2)
ldrhr2, @ sectors per FAT (250)
mul r1, r1, r2 @ FAT sectors
ldrhr3, @ 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
ldrbr0, @ compare directory entry
ldrbr3, @ 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
ldrhr0, @ cluster lo
@ldrhr1, @ cluster hi
@lsl r1, r1, #16
@orr r0, r0, r1 @ cluster
sub r0, r0, #2 @ cluster - 2
ldrbr1, @ sectors per cluster (32)
mul r1, r1, r0 @ file sector
ldrr1, =0
@
pop {r6} @ root directory sector
add r6, r6, r1 @ root directory sector + file sector ***
@ calculate root directory sectors
ldrbr0, @ root directory entries lo
ldrbr1, @ 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
@
ldrr7, =RAM_HEADER
@ copy new ARM9 loop
ldrr0, NewARM9Loop
ldrr4, =NewARM9Loop_dest
strr0, @ place ldr instruction
strr4, @ address of ldr instruction
strr4, @ go to new loop
@ load NDS header
movr0, r6 @ file sector
movr1, r7 @ RAM header
ldrr2, =0x200
blCF_Read_LBA
adrr0, AfterPass
movpc, r0
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.pool
.ds.b 0xAC - .
.arm
.ascii "PASS" @ gamecode for FlashMe autoboot
filename:
.ascii"START NDS"
.align
NewARM9Loop:
ldrpc, . + 4
.ds.b 0xC0 - .
b_start
.thumb
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
AfterPass:
@ clear RAM
movr0, #0
movr1, #0
movr2, #0
movr3, #0
ldrr4, =0x02000000
ldrr5, =0x023FF000
_clear_loop:
stmia r4!, {r0-r3}
cmpr4, r5
bne_clear_loop
@ copy ARM9 binary
ldrr0, @ ROM offset
lsrr0, r0, #9 @ offset to sectors
addr0, r6, r0 @ add file sector
ldrr1, @ RAM address
ldrr2, @ code size
blCF_Read_LBA
@ copy ARM7 binary
ldrr0, @ ROM offset
lsrr0, r0, #9 @ offset to sectors
addr0, r0, r6 @ add file sector
ldrr1, @ RAM address
ldrr2, @ code size
blCF_Read_LBA
@ start ARM9
ldrr0,
ldrr1, =NewARM9Loop_dest
strr0,
@ start ARM7
ldrr0,
bxr0
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ r0 = sector
@ r1 = dest address
@ r2 = length, aligned to 0x200 bytes
@ destroys r0-r5
CF_Read_LBA:
ldrr4, =0x09000000@ reg 0
_sector_loop: @ r4 = reg 0
ldrr5, =7<<17
addr4, r4, r5 @ reg 7
_wait_ready:
ldrh r3,
lsrr5, r3, #7+1@ 0x80
bcs_wait_ready @ busy
lsrr5, r3, #6+1@ 0x40
bcc_wait_ready @ ready
ldrr5, =5<<17
subr4, r4, r5 @ reg 2
movr3, #1
strh r3,
ldrr5, =1<<17
addr4, r4, r5 @ reg 3
lsrr3, r0, #0
strh r3,
addr4, r4, r5 @ reg 4
lsrr3, r0, #8
strh r3,
addr4, r4, r5 @ reg 5
lsrr3, r0, #16
strh r3,
addr4, r4, r5 @ reg 6
lsrr3, r0, #24
addr3, r3, #0xE0
strh r3,
addr4, r4, r5 @ reg 7
movr3, #0x20
strh r3,
_wait_data:
ldrh r3,
lsrr5, r3, #7+1@ 0x80
bcs_wait_data @ busy
lsrr5, r3, #3+1@ 0x08
bcc_wait_data @ data request
ldrr5, =7<<17
subr4, r4, r5 @ reg 0
ldrr5, =0x200 @ sector size
_copy_sector:
ldrh r3,
strh r3,
addr1, r1, #2 @ dest += 2
subr2, r2, #2 @ length -= 2
subr5, r5, #2
bne_copy_sector
cmpr2, #0 @ finished?
ble_bx_lr
addr0, r0, #1 @ sector += 1
b_sector_loop
_bx_lr:
bxlr
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.end
http://bbs.jj.jx.cn/attachments/forumid_18/multinds_PRsUUZaWTlap.jpg
消息来源:http://ds.darkain.com/hack/
下载NDS Loader
下载HACK ver 汇编惨念 Loader的出现标志着NDS的合卡制作已经变成了可能! 残念,我可真是落爪就忘啊,原来汇编过的可牛了,这大学真是他妈的白念
页:
[1]