summaryrefslogtreecommitdiff
path: root/libpsx/src/runexe/stage2.s
blob: e60e109107cfd343f399b6c2d68745bd6e43eef6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
.global PSX_RunExeStage2
.global PSX_RunExeStage2_END

PSX_RunExeStage2:
# a0 = address of PSX-EXE buffer

# Load initial program counter in t0
	lw $t0, 0x10($a0)
# Load text section address in t1
	lw $t1, 0x18($a0)
# Load text section size in t2
	lw $t2, 0x1c($a0)

# Load initial sp register value in sp
	lw $sp, 0x30($a0)

# t3 = current source address
	addiu $t3, $a0, 0x800

# t4 = current destination address
	addu $t4, $t1, $zero

copyExeLoop:
	beq $t2, $zero, copyExeLoop_End
	nop
copyExeLoop_2:
	lb $t5, 0($t3)
	nop
	sb $t5, 0($t4)
	addiu $t3, $t3, 1
	addiu $t4, $t4, 1
	addiu $t2, $t2, -1
	beq $zero, $zero, copyExeLoop
	
copyExeLoop_End:
# Jump to the program we loaded
	jr $t0
	nop

PSX_RunExeStage2_END: