pcsx2/fps2bios/loader/crt0.s

111 lines
1.5 KiB
ArmAsm

.set noat
.set noreorder
.global _start
.global FlushCache
.global Exit
.global SignalSema
.global _start
.global _exit
.text
nop
nop
FlushCache:
li $3,100
syscall
jr $31
nop
Exit:
li $3,4
syscall
jr $31
nop
SignalSema:
li $3,66
syscall
jr $31
nop
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)
addiu $4,$4,%lo(_gp)
lui $5,%hi(_stack)
addiu $5,$5,%lo(_stack)
lui $6,%hi(_stack_size)
addiu $6,$6,%lo(_stack_size)
lui $7,%hi(_args)
addiu $7,$7,%lo(_args)
lui $8,%hi(_root)
addiu $8,$8,%lo(_root)
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
jal FlushCache
move $4,$0
# Jump main
ei
lui $2,%hi(_args_ptr)
addiu $2,$2,%lo(_args_ptr)
lw $3,($2)
lui $2,%hi(_args)
addiu $2,$2,%lo(_args)
lw $4, ($2)
jal main
addiu $5, $2, 4
_root:
_exit:
# ???
lui $2,%hi(_args_ptr)
addiu $2,$2,%lo(_args_ptr)
lw $3,($2)
jal SignalSema
lw $4,($3)
# Exit
addiu $3,$0,35
syscall
nop
.bss
.align 6
_args: .space 256+16*4+4
.data
_args_ptr:
.space 4