Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/rsp/rspboot.s
7854 views
1
.rsp
2
3
.include "rsp/rsp_defs.inc"
4
5
// This file assumes CODE_FILE is set on the command line
6
.create CODE_FILE, 0x04001000
7
8
.if defined(VERSION_JP) || defined(VERSION_US)
9
ori $1, $1, 0x0001
10
.endif
11
j boot_04001068
12
addi $1, $zero, OSTask_addr
13
boot_load_ucode:
14
lw $2, OSTask_ucode($1)
15
addi $3, $zero, 0x0f7f // hard-coded length = 0xF80
16
addi $7, $zero, 0x1080 // hard-coded address = 0x1080
17
mtc0 $7, SP_MEM_ADDR
18
mtc0 $2, SP_DRAM_ADDR
19
mtc0 $3, SP_RD_LEN
20
boot_ucode_dma_busy:
21
mfc0 $4, SP_DMA_BUSY
22
bne $4, $zero, boot_ucode_dma_busy
23
nop
24
jal check_yielded
25
nop
26
jr $7 // jump to the loaded ucode
27
mtc0 $zero, SP_SEMAPHORE // clear semaphore
28
29
check_yielded:
30
mfc0 $8, SP_STATUS
31
andi $8, $8, 0x0080 // yield signal is set
32
bne $8, $zero, boot_04001054
33
nop
34
jr ra
35
boot_04001054:
36
mtc0 $zero, SP_SEMAPHORE // clear semaphore
37
ori $8, $zero, 0x5200 // clear yield, set yielded, set taskdone?
38
mtc0 $8, SP_STATUS
39
break // halt RSP and set SP_STATUS_BROKE
40
nop
41
42
boot_04001068:
43
lw $2, OSTask_flags($1)
44
andi $2, $2, OS_TASK_DP_WAIT
45
beq $2, $zero, boot_load_data
46
nop
47
jal check_yielded
48
nop
49
mfc0 $2, DPC_STATUS
50
andi $2, $2, DPC_STATUS_DMA_BUSY
51
bgtz $2, check_yielded
52
nop
53
boot_load_data:
54
lw $2, OSTask_ucode_data($1)
55
lw $3, OSTask_ucode_data_size($1)
56
addi $3, $3, -1
57
boot_dma_not_full:
58
mfc0 $30, SP_DMA_FULL
59
bne $30, $zero, boot_dma_not_full
60
nop
61
mtc0 $zero, SP_MEM_ADDR // ucode_data store at base of DMEM
62
mtc0 $2, SP_DRAM_ADDR
63
mtc0 $3, SP_RD_LEN
64
boot_data_dma_busy:
65
mfc0 $4, SP_DMA_BUSY
66
bne $4, $zero, boot_data_dma_busy
67
nop
68
jal check_yielded
69
nop
70
j boot_load_ucode
71
nop
72
73
.close // CODE_FILE
74
75