人造人 发表于 2005-6-25 08:08:13

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

ssdy 发表于 2005-6-25 09:01:48

汇编惨念

人造人 发表于 2005-6-25 09:23:51

Loader的出现标志着NDS的合卡制作已经变成了可能!

yn0706 发表于 2005-6-25 23:44:32

残念,我可真是落爪就忘啊,原来汇编过的可牛了,这大学真是他妈的白念
页: [1]
查看完整版本: NDS Loader Source, A Good Thing(TM)