improve video-related interrupts and waits
This commit is contained in:
parent
7ccccbc06d
commit
b4f8be199f
35
main.asm
35
main.asm
|
@ -69,6 +69,9 @@ Test3D:
|
||||||
lli s1, 1 // s1: which color buffer we're writing to (1: alt)
|
lli s1, 1 // s1: which color buffer we're writing to (1: alt)
|
||||||
|
|
||||||
Start3D:
|
Start3D:
|
||||||
|
mfc0 t0, CP0_Status
|
||||||
|
mtc0 t0, CP0_Status
|
||||||
|
|
||||||
lui a0, MAIN_BASE
|
lui a0, MAIN_BASE
|
||||||
ori a0, MAIN_DLIST
|
ori a0, MAIN_DLIST
|
||||||
jal WriteDList
|
jal WriteDList
|
||||||
|
@ -76,15 +79,13 @@ Start3D:
|
||||||
jal PokeDataCache
|
jal PokeDataCache
|
||||||
nop
|
nop
|
||||||
|
|
||||||
ClearIntMask()
|
DisableInt()
|
||||||
|
|
||||||
// prepare RSP
|
// prepare RSP
|
||||||
lui a0, SP_BASE
|
lui a0, SP_BASE
|
||||||
lli t0, SP_INT_ON_BREAK_SET | SP_TASKDONE_CLR | SP_YIELDED_CLR | SP_YIELD_CLR
|
lli t0, SP_TASKDONE_CLR | SP_YIELDED_CLR | SP_YIELD_CLR | SP_HALT_SET
|
||||||
sw t0, SP_STATUS(a0)
|
sw t0, SP_STATUS(a0)
|
||||||
|
|
||||||
SP_HALT_WAIT()
|
|
||||||
|
|
||||||
// set RSP PC to IMEM+$0
|
// set RSP PC to IMEM+$0
|
||||||
lui a0, SP_PC_BASE
|
lui a0, SP_PC_BASE
|
||||||
// only the lowest 12 bits are used, so 00000000 is equivalent to 04001000.
|
// only the lowest 12 bits are used, so 00000000 is equivalent to 04001000.
|
||||||
|
@ -94,32 +95,36 @@ Start3D:
|
||||||
jal PushVideoTask
|
jal PushVideoTask
|
||||||
ori a0, MAIN_SP_TASK
|
ori a0, MAIN_SP_TASK
|
||||||
|
|
||||||
SP_DMA_WAIT()
|
|
||||||
|
|
||||||
jal LoadRSPBoot
|
jal LoadRSPBoot
|
||||||
nop
|
nop
|
||||||
|
|
||||||
SP_DMA_WAIT()
|
|
||||||
|
|
||||||
// clear all flags that would halt RSP (i.e. tell it to run!)
|
// clear all flags that would halt RSP (i.e. tell it to run!)
|
||||||
lui a0, SP_BASE
|
lui a0, SP_BASE
|
||||||
lli t0, SP_INT_ON_BREAK_SET | SP_SINGLE_STEP_CLR | SP_BREAK_CLR | SP_HALT_CLR
|
lli t0, SP_INT_ON_BREAK_SET | SP_SINGLE_STEP_CLR | SP_BREAK_CLR | SP_HALT_CLR
|
||||||
sw t0, SP_STATUS(a0)
|
sw t0, SP_STATUS(a0)
|
||||||
|
|
||||||
SetIntMask()
|
EnableInt()
|
||||||
|
|
||||||
MainLoop:
|
MainLoop:
|
||||||
WriteString(S_SP_Wait)
|
WriteString(S_SP_Wait)
|
||||||
SP_HALT_WAIT()
|
-
|
||||||
|
mfc0 t0, CP0_Status
|
||||||
|
mtc0 t0, CP0_Status
|
||||||
|
//
|
||||||
|
lui a0, SP_BASE
|
||||||
|
lw t0, SP_STATUS(a0)
|
||||||
|
andi t0, SP_HALT
|
||||||
|
beqz t0,-
|
||||||
|
nop
|
||||||
|
|
||||||
WriteString(S_VI_Wait)
|
WriteString(S_VI_Wait)
|
||||||
// wait on VI too
|
// wait on VI too
|
||||||
|
lui a0, VI_BASE
|
||||||
-
|
-
|
||||||
lui t0, VI_BASE
|
lw t0, VI_V_CURRENT_LINE(a0)
|
||||||
lw t0, VI_V_CURRENT_LINE(t0)
|
// until half-line <= 2
|
||||||
// until line <= 10
|
sltiu at, t0, 2 + 1
|
||||||
sltiu t0, 10 + 1
|
beqz at,-
|
||||||
beqz t0,-
|
|
||||||
nop
|
nop
|
||||||
|
|
||||||
WriteString(SNewFrame)
|
WriteString(SNewFrame)
|
||||||
|
|
10
task.asm
10
task.asm
|
@ -54,23 +54,25 @@ PushVideoTask:
|
||||||
|
|
||||||
PushRSPTask:
|
PushRSPTask:
|
||||||
lli t3, 0x40 - 1 // DMA quirk
|
lli t3, 0x40 - 1 // DMA quirk
|
||||||
or t4, a0, r0
|
or t2, a0, r0
|
||||||
SP_DMA_WAIT() // clobbers t0, a0
|
SP_DMA_WAIT() // clobbers t0,a0
|
||||||
la t1, 0xA4000FC0
|
la t1, 0xA4000FC0
|
||||||
sw t1, SP_MEM_ADDR(a0)
|
sw t1, SP_MEM_ADDR(a0)
|
||||||
sw t4, SP_DRAM_ADDR(a0)
|
sw t2, SP_DRAM_ADDR(a0)
|
||||||
sw t3, SP_RD_LEN(a0) // pull data from RDRAM into DMEM/IMEM
|
sw t3, SP_RD_LEN(a0) // pull data from RDRAM into DMEM/IMEM
|
||||||
|
SP_DMA_WAIT() // clobbers t0,a0
|
||||||
jr ra
|
jr ra
|
||||||
nop
|
nop
|
||||||
|
|
||||||
LoadRSPBoot:
|
LoadRSPBoot:
|
||||||
la t2, UCODE_BOOT & ADDR_MASK
|
la t2, UCODE_BOOT & ADDR_MASK
|
||||||
li t3, UCODE_BOOT.size - 1 // DMA quirk
|
li t3, UCODE_BOOT.size - 1 // DMA quirk
|
||||||
SP_DMA_WAIT() // clobbers t0, a0
|
SP_DMA_WAIT() // clobbers t0,a0
|
||||||
la t1, 0xA4001000
|
la t1, 0xA4001000
|
||||||
sw t1, SP_MEM_ADDR(a0)
|
sw t1, SP_MEM_ADDR(a0)
|
||||||
sw t2, SP_DRAM_ADDR(a0)
|
sw t2, SP_DRAM_ADDR(a0)
|
||||||
sw t3, SP_RD_LEN(a0) // pull data from RDRAM into DMEM/IMEM
|
sw t3, SP_RD_LEN(a0) // pull data from RDRAM into DMEM/IMEM
|
||||||
|
SP_DMA_WAIT() // clobbers t0,a0
|
||||||
jr ra
|
jr ra
|
||||||
nop
|
nop
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user