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:
|