sm64/rsp/rspboot.s
2020-06-02 12:44:34 -04:00

74 lines
1.8 KiB
ArmAsm

.rsp
.include "rsp/rsp_defs.inc"
// This file assumes CODE_FILE is set on the command line
.create CODE_FILE, 0x04001000
.ifndef VERSION_EU
ori $1, $1, 0x0001
.endif
j boot_04001068
addi $1, $zero, OSTask_addr
boot_load_ucode:
lw $2, OSTask_ucode($1)
addi $3, $zero, 0x0f7f // hard-coded length = 0xF80
addi $7, $zero, 0x1080 // hard-coded address = 0x1080
mtc0 $7, SP_MEM_ADDR
mtc0 $2, SP_DRAM_ADDR
mtc0 $3, SP_RD_LEN
boot_ucode_dma_busy:
mfc0 $4, SP_DMA_BUSY
bne $4, $zero, boot_ucode_dma_busy
nop
jal check_yielded
nop
jr $7 // jump to the loaded ucode
mtc0 $zero, SP_SEMAPHORE // clear semaphore
check_yielded:
mfc0 $8, SP_STATUS
andi $8, $8, 0x0080 // yield signal is set
bne $8, $zero, boot_04001054
nop
jr ra
boot_04001054:
mtc0 $zero, SP_SEMAPHORE // clear semaphore
ori $8, $zero, 0x5200 // clear yield, set yielded, set taskdone?
mtc0 $8, SP_STATUS
break // halt RSP and set SP_STATUS_BROKE
nop
boot_04001068:
lw $2, OSTask_flags($1)
andi $2, $2, OS_TASK_DP_WAIT
beq $2, $zero, boot_load_data
nop
jal check_yielded
nop
mfc0 $2, DPC_STATUS
andi $2, $2, DPC_STATUS_DMA_BUSY
bgtz $2, check_yielded
nop
boot_load_data:
lw $2, OSTask_ucode_data($1)
lw $3, OSTask_ucode_data_size($1)
addi $3, $3, -1
boot_dma_not_full:
mfc0 $30, SP_DMA_FULL
bne $30, $zero, boot_dma_not_full
nop
mtc0 $zero, SP_MEM_ADDR // ucode_data store at base of DMEM
mtc0 $2, SP_DRAM_ADDR
mtc0 $3, SP_RD_LEN
boot_data_dma_busy:
mfc0 $4, SP_DMA_BUSY
bne $4, $zero, boot_data_dma_busy
nop
jal check_yielded
nop
j boot_load_ucode
nop
.close // CODE_FILE