pcsx2/pcsx2hostfs/ee/crt0.s

114 lines
2.3 KiB
ArmAsm

.set noat
.set noreorder
.global _start
.global _exit
.text
nop
nop
_start:
lui $2,%hi(_args_ptr)
addiu $2,$2, %lo(_args_ptr)
sw $4,($2)
# Clear bss
zerobss:
lui $2,%hi(_fbss)
lui $3,%hi(_end)
addiu $2,$2,%lo(_fbss)
addiu $3,$3,%lo(_end)
loop:
nop
nop
sq $0,($2)
sltu $1,$2,$3
bne $1,$0,loop
addiu $2,$2,16
# Thread
lui $4,%hi(_gp)
lui $5,%hi(_stack)
lui $6,%hi(_stack_size)
lui $7,%hi(_args)
lui $8,%hi(_exit)
addiu $4,$4,%lo(_gp)
addiu $5,$5,%lo(_stack)
addiu $6,$6,%lo(_stack_size)
addiu $7,$7,%lo(_args)
addiu $8,$8,%lo(_exit)
move $28,$4
addiu $3,$0,60
syscall
move $29, $2
# Heap
addiu $3,$0,61
lui $4,%hi(_end)
addiu $4,$4,%lo(_end)
lui $5,%hi(_heap_size)
addiu $5,$5,%lo(_heap_size)
syscall
nop
# Cache
li $3, 100
move $4,$0
syscall
nop
# Jump main
ei
# Check if we got args from system
lui $2, %hi(_args)
addiu $2, %lo(_args)
lw $3, 0($2)
bnez $3, _gotArgv # Started w (Load)ExecPS2
nop
# Check args via $a0
lui $2,%hi(_args_ptr)
addiu $2,$2,%lo(_args_ptr)
lw $3,0($2)
beqzl $3, _goMain
addu $4, $0, $0
addiu $2, $3, 4
b _gotArgv
nop
_gotArgv:
lw $4, ($2)
addiu $5, $2, 4
_goMain:
jal main
nop
# Check if we got our args in $a0 again
la $4, _args_ptr
lw $5, 0($4)
beqz $5, _exit
nop
_root:
lw $6, 0($5)
sw $0, 0($6)
# Call ExitDeleteThread()
addiu $3, $0, 36
syscall
nop
_exit:
# Exit
# Should call Exit(retval) if not called by pukklink
addiu $3,$0,35
syscall
move $4, $2
nop
.bss
.align 6
_args: .space 256+16*4+4
.data
_args_ptr:
.space 4