A9VG电玩部落论坛

 找回密码
 注册
搜索
查看: 2259|回复: 1

NDS Loader Source, A Good Thing(TM)

[复制链接]

精华
0
帖子
850
威望
0 点
积分
1118 点
种子
236 点
注册时间
2005-3-20
最后登录
2025-5-23
 楼主| 发表于 2005-6-25 08:11  ·  吉林 | 显示全部楼层 |阅读模式
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.

骑士

猛汉拖拉机我来了...

精华
2
帖子
2602
威望
2 点
积分
2838 点
种子
5 点
注册时间
2004-4-15
最后登录
2019-9-17
发表于 2005-6-25 11:18  ·  上海 | 显示全部楼层
Not bad~,huh? But I wonder whether it can work~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|A9VG电玩部落 川公网安备 51019002005286号

GMT+8, 2025-7-30 06:02 , Processed in 0.152265 second(s), 12 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部