implement color buffer swapping, sanity checks, etc.
i think rendering is now working properly and consistently
This commit is contained in:
parent
11439b133f
commit
93fd7c14cc
4 changed files with 90 additions and 49 deletions
28
dlist.asm
28
dlist.asm
|
@ -1,9 +1,6 @@
|
||||||
// write some F3DZEX instructions to a0
|
WriteDList:
|
||||||
// clobbers t0,t1,a0
|
// a0: pointer to receive F3DZEX instructions
|
||||||
|
// a1: use alt color buffer (boolean)
|
||||||
constant WIDTH(320)
|
|
||||||
constant HEIGHT(240)
|
|
||||||
constant HICOLOR(0)
|
|
||||||
|
|
||||||
define dpos(0)
|
define dpos(0)
|
||||||
|
|
||||||
|
@ -35,7 +32,6 @@ if {dpos} >= 0x8000 {
|
||||||
// G_AD_DISABLE | G_CD_MAGICSQ | G_TC_FILT | G_TF_BILERP |
|
// G_AD_DISABLE | G_CD_MAGICSQ | G_TC_FILT | G_TF_BILERP |
|
||||||
// G_TT_NONE | G_TL_TILE | G_TD_CLAMP | G_MDSFT_TEXTPERSP |
|
// G_TT_NONE | G_TL_TILE | G_TD_CLAMP | G_MDSFT_TEXTPERSP |
|
||||||
// G_CYC_FILL | G_PM_NPRIMITIVE
|
// G_CYC_FILL | G_PM_NPRIMITIVE
|
||||||
// TODO: try running without this
|
|
||||||
WriteDL(0xEF382C30, 0x00000000)
|
WriteDL(0xEF382C30, 0x00000000)
|
||||||
|
|
||||||
// G_GEOMETRYMODE
|
// G_GEOMETRYMODE
|
||||||
|
@ -74,10 +70,19 @@ if {dpos} >= 0x8000 {
|
||||||
|
|
||||||
// G_SETCIMG, set our color buffer
|
// G_SETCIMG, set our color buffer
|
||||||
if HICOLOR {
|
if HICOLOR {
|
||||||
WriteDL(0xFF180000 | (WIDTH - 1), VIDEO_C_BUFFER)
|
constant G_SETCIMB_UPPER_WORD(0xFF180000)
|
||||||
} else {
|
} else {
|
||||||
WriteDL(0xFF100000 | (WIDTH - 1), VIDEO_C_BUFFER)
|
constant G_SETCIMB_UPPER_WORD(0xFF100000)
|
||||||
}
|
}
|
||||||
|
bnez a1,+
|
||||||
|
nop
|
||||||
|
WriteDL(G_SETCIMB_UPPER_WORD | (WIDTH - 1), VIDEO_C_BUFFER)
|
||||||
|
b DListDoneColorImage
|
||||||
|
nop
|
||||||
|
+
|
||||||
|
global evaluate dpos({dpos}-8) // move pos back so we can overwrite with alt
|
||||||
|
WriteDL(G_SETCIMB_UPPER_WORD | (WIDTH - 1), VIDEO_C_BUFFER_ALT)
|
||||||
|
DListDoneColorImage:
|
||||||
|
|
||||||
WriteDL(0xF8000000, 0x0A0A0A00) // G_SETFOGCOLOR
|
WriteDL(0xF8000000, 0x0A0A0A00) // G_SETFOGCOLOR
|
||||||
WriteDL(0xDB080000, 0x3E80C280) // set fog distance (float?)
|
WriteDL(0xDB080000, 0x3E80C280) // set fog distance (float?)
|
||||||
|
@ -104,3 +109,8 @@ if HICOLOR {
|
||||||
WriteDL(0xE9000000, 0)
|
WriteDL(0xE9000000, 0)
|
||||||
// G_ENDDL
|
// G_ENDDL
|
||||||
WriteDL(0xDF000000, 0)
|
WriteDL(0xDF000000, 0)
|
||||||
|
|
||||||
|
jr ra
|
||||||
|
nop
|
||||||
|
|
||||||
|
print {dpos} / 8, "\n"
|
||||||
|
|
21
inc/main.inc
21
inc/main.inc
|
@ -8,13 +8,28 @@ constant BLAH_XXD(0x0080)
|
||||||
constant BLAH_DLIST(0x1000)
|
constant BLAH_DLIST(0x1000)
|
||||||
constant BLAH_DLIST_JUMPER(BLAH_DLIST - 0xA8)
|
constant BLAH_DLIST_JUMPER(BLAH_DLIST - 0xA8)
|
||||||
|
|
||||||
|
// video settings
|
||||||
|
constant WIDTH(320)
|
||||||
|
constant HEIGHT(240)
|
||||||
|
constant HICOLOR(0)
|
||||||
|
|
||||||
constant VIDEO_C_BUFFER(0x80100000)
|
constant VIDEO_C_BUFFER(0x80100000)
|
||||||
constant VIDEO_C_BUFFER_SIZE(640 * 480 * 4)
|
if HICOLOR {
|
||||||
constant VIDEO_Z_BUFFER(VIDEO_C_BUFFER + VIDEO_C_BUFFER_SIZE)
|
constant VIDEO_C_BUFFER_SIZE(WIDTH * HEIGHT * 4)
|
||||||
constant VIDEO_Z_BUFFER_SIZE(640 * 480 * 2)
|
} else {
|
||||||
|
constant VIDEO_C_BUFFER_SIZE(WIDTH * HEIGHT * 2)
|
||||||
|
}
|
||||||
|
constant VIDEO_C_BUFFER_ALT(VIDEO_C_BUFFER + VIDEO_C_BUFFER_SIZE)
|
||||||
|
constant VIDEO_Z_BUFFER(VIDEO_C_BUFFER_ALT + VIDEO_C_BUFFER_SIZE)
|
||||||
|
constant VIDEO_Z_BUFFER_SIZE(WIDTH * HEIGHT * 2)
|
||||||
constant VIDEO_SOMETHING(VIDEO_Z_BUFFER + VIDEO_Z_BUFFER_SIZE)
|
constant VIDEO_SOMETHING(VIDEO_Z_BUFFER + VIDEO_Z_BUFFER_SIZE)
|
||||||
constant VIDEO_SOMETHING_SIZE(0x18000)
|
constant VIDEO_SOMETHING_SIZE(0x18000)
|
||||||
constant VIDEO_STACK(VIDEO_SOMETHING + VIDEO_SOMETHING_SIZE)
|
constant VIDEO_STACK(VIDEO_SOMETHING + VIDEO_SOMETHING_SIZE)
|
||||||
constant VIDEO_STACK_SIZE(0x400)
|
constant VIDEO_STACK_SIZE(0x400)
|
||||||
constant VIDEO_YIELD(VIDEO_STACK + VIDEO_STACK_SIZE)
|
constant VIDEO_YIELD(VIDEO_STACK + VIDEO_STACK_SIZE)
|
||||||
constant VIDEO_YIELD_SIZE(0xC00)
|
constant VIDEO_YIELD_SIZE(0xC00)
|
||||||
|
constant VIDEO_END(VIDEO_YIELD + VIDEO_YIELD_SIZE)
|
||||||
|
|
||||||
|
if VIDEO_END > 0x803F0000 {
|
||||||
|
error "ran out of memory for video"
|
||||||
|
}
|
||||||
|
|
15
kernel.asm
15
kernel.asm
|
@ -89,6 +89,7 @@ Start:
|
||||||
sw r0, K_REASON(gp)
|
sw r0, K_REASON(gp)
|
||||||
sw r0, K_IN_ISR(gp)
|
sw r0, K_IN_ISR(gp)
|
||||||
sw r0, K_CONSOLE_AVAILABLE(gp)
|
sw r0, K_CONSOLE_AVAILABLE(gp)
|
||||||
|
sw r0, K_HISTORY(gp)
|
||||||
|
|
||||||
Drive64Init:
|
Drive64Init:
|
||||||
lui t9, CI_BASE
|
lui t9, CI_BASE
|
||||||
|
@ -283,8 +284,6 @@ InterruptHandler:
|
||||||
mfc0 k1, CP0_BadVAddr
|
mfc0 k1, CP0_BadVAddr
|
||||||
sw k1, K_BADVADDR(k0)
|
sw k1, K_BADVADDR(k0)
|
||||||
|
|
||||||
sw r0, K_HISTORY(k0)
|
|
||||||
|
|
||||||
// prevent recursive interrupts if ISR_Main somehow causes an interrupt
|
// prevent recursive interrupts if ISR_Main somehow causes an interrupt
|
||||||
// lw t1, K_IN_ISR(k0)
|
// lw t1, K_IN_ISR(k0)
|
||||||
// bnez t1, ISR_Exit // TODO: reimplement properly
|
// bnez t1, ISR_Exit // TODO: reimplement properly
|
||||||
|
@ -443,7 +442,7 @@ K_MI_SP:
|
||||||
// then check andi t1, SP_SG1 | SP_SG2 ?
|
// then check andi t1, SP_SG1 | SP_SG2 ?
|
||||||
|
|
||||||
lw t0, K_HISTORY(k0)
|
lw t0, K_HISTORY(k0)
|
||||||
ori t0, 0x01
|
ori t0, MI_INTR_SP
|
||||||
sw t0, K_HISTORY(k0)
|
sw t0, K_HISTORY(k0)
|
||||||
j K_MI_Loop
|
j K_MI_Loop
|
||||||
andi s0, ~MI_INTR_SP
|
andi s0, ~MI_INTR_SP
|
||||||
|
@ -455,7 +454,7 @@ K_MI_SI:
|
||||||
sw r0, SI_STATUS(a1)
|
sw r0, SI_STATUS(a1)
|
||||||
|
|
||||||
lw t0, K_HISTORY(k0)
|
lw t0, K_HISTORY(k0)
|
||||||
ori t0, 0x02
|
ori t0, MI_INTR_SI
|
||||||
sw t0, K_HISTORY(k0)
|
sw t0, K_HISTORY(k0)
|
||||||
j K_MI_Loop
|
j K_MI_Loop
|
||||||
andi s0, ~MI_INTR_SI
|
andi s0, ~MI_INTR_SI
|
||||||
|
@ -468,7 +467,7 @@ K_MI_AI:
|
||||||
sw t0, AI_STATUS(a1)
|
sw t0, AI_STATUS(a1)
|
||||||
|
|
||||||
lw t0, K_HISTORY(k0)
|
lw t0, K_HISTORY(k0)
|
||||||
ori t0, 0x04
|
ori t0, MI_INTR_AI
|
||||||
sw t0, K_HISTORY(k0)
|
sw t0, K_HISTORY(k0)
|
||||||
j K_MI_Loop
|
j K_MI_Loop
|
||||||
andi s0, ~MI_INTR_AI
|
andi s0, ~MI_INTR_AI
|
||||||
|
@ -480,7 +479,7 @@ K_MI_VI:
|
||||||
sw r0, VI_V_CURRENT_LINE(a1)
|
sw r0, VI_V_CURRENT_LINE(a1)
|
||||||
|
|
||||||
lw t0, K_HISTORY(k0)
|
lw t0, K_HISTORY(k0)
|
||||||
ori t0, 0x08
|
ori t0, MI_INTR_VI
|
||||||
sw t0, K_HISTORY(k0)
|
sw t0, K_HISTORY(k0)
|
||||||
j K_MI_Loop
|
j K_MI_Loop
|
||||||
andi s0, ~MI_INTR_VI
|
andi s0, ~MI_INTR_VI
|
||||||
|
@ -493,7 +492,7 @@ K_MI_PI:
|
||||||
sw t0, PI_STATUS(a1)
|
sw t0, PI_STATUS(a1)
|
||||||
|
|
||||||
lw t0, K_HISTORY(k0)
|
lw t0, K_HISTORY(k0)
|
||||||
ori t0, 0x10
|
ori t0, MI_INTR_PI
|
||||||
sw t0, K_HISTORY(k0)
|
sw t0, K_HISTORY(k0)
|
||||||
j K_MI_Loop
|
j K_MI_Loop
|
||||||
andi s0, ~MI_INTR_PI
|
andi s0, ~MI_INTR_PI
|
||||||
|
@ -506,7 +505,7 @@ K_MI_DP:
|
||||||
sw t0, MI_INIT_MODE(a1)
|
sw t0, MI_INIT_MODE(a1)
|
||||||
|
|
||||||
lw t0, K_HISTORY(k0)
|
lw t0, K_HISTORY(k0)
|
||||||
ori t0, 0x20
|
ori t0, MI_INTR_DP
|
||||||
sw t0, K_HISTORY(k0)
|
sw t0, K_HISTORY(k0)
|
||||||
j K_MI_Loop
|
j K_MI_Loop
|
||||||
andi s0, ~MI_INTR_DP
|
andi s0, ~MI_INTR_DP
|
||||||
|
|
75
main.asm
75
main.asm
|
@ -62,35 +62,27 @@ Test3D:
|
||||||
sw t0, BLAH_DLIST_JUMPER+0(a0)
|
sw t0, BLAH_DLIST_JUMPER+0(a0)
|
||||||
sw t1, BLAH_DLIST_JUMPER+4(a0)
|
sw t1, BLAH_DLIST_JUMPER+4(a0)
|
||||||
|
|
||||||
lui a0, BLAH_BASE
|
|
||||||
ori a0, BLAH_DLIST
|
|
||||||
|
|
||||||
include "dlist.asm" // takes a0
|
|
||||||
|
|
||||||
jal PokeCaches
|
|
||||||
nop
|
|
||||||
|
|
||||||
// take a peek at the display list we wrote
|
|
||||||
lui a0, BLAH_BASE
|
|
||||||
ori a0, BLAH_DLIST
|
|
||||||
lli a1, 0x80
|
|
||||||
ori a2, a0, BLAH_XXD
|
|
||||||
jal DumpAndWrite
|
|
||||||
lli a3, 0x80 * 4
|
|
||||||
|
|
||||||
jal SetupScreen
|
jal SetupScreen
|
||||||
nop
|
nop
|
||||||
|
|
||||||
|
lli s1, 1 // s1: which color buffer we're writing to (1: alt)
|
||||||
|
|
||||||
Start3D:
|
Start3D:
|
||||||
|
lui a0, BLAH_BASE
|
||||||
|
ori a0, BLAH_DLIST
|
||||||
|
jal WriteDList
|
||||||
|
or a1, s1, r0
|
||||||
|
jal PokeDataCache
|
||||||
|
nop
|
||||||
|
|
||||||
ClearIntMask()
|
ClearIntMask()
|
||||||
|
|
||||||
// stuff i'm borrowing from zelda:
|
// prepare RSP
|
||||||
lui a0, SP_BASE
|
lui a0, SP_BASE
|
||||||
lli t0, SP_SG2_CLR | SP_SG1_CLR | SP_SG0_CLR | SP_IOB_SET
|
lli t0, SP_SG2_CLR | SP_SG1_CLR | SP_SG0_CLR | SP_IOB_SET
|
||||||
sw t0, SP_STATUS(a0)
|
sw t0, SP_STATUS(a0)
|
||||||
|
|
||||||
// wait
|
// wait
|
||||||
WriteString(SWaiting)
|
|
||||||
lui a0, SP_BASE
|
lui a0, SP_BASE
|
||||||
-
|
-
|
||||||
lw t0, SP_STATUS(a0)
|
lw t0, SP_STATUS(a0)
|
||||||
|
@ -100,21 +92,18 @@ Start3D:
|
||||||
|
|
||||||
// set RSP PC to IMEM+$0
|
// set RSP PC to IMEM+$0
|
||||||
lui a0, SP_PC_BASE
|
lui a0, SP_PC_BASE
|
||||||
//sw r0, SP_PC(a0)
|
// only the lowest 12 bits are used, so 00000000 is equivalent to 04001000.
|
||||||
li t0, 0x04001000
|
sw r0, SP_PC(a0)
|
||||||
sw t0, SP_PC(a0)
|
|
||||||
|
|
||||||
lui a0, BLAH_BASE
|
lui a0, BLAH_BASE
|
||||||
jal PushVideoTask
|
jal PushVideoTask
|
||||||
ori a0, a0, BLAH_SP_TASK
|
ori a0, a0, BLAH_SP_TASK
|
||||||
|
|
||||||
WriteString(SWaiting)
|
|
||||||
SP_BUSY_WAIT()
|
SP_BUSY_WAIT()
|
||||||
|
|
||||||
jal LoadRSPBoot
|
jal LoadRSPBoot
|
||||||
nop
|
nop
|
||||||
|
|
||||||
WriteString(SWaiting)
|
|
||||||
SP_BUSY_WAIT()
|
SP_BUSY_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!)
|
||||||
|
@ -126,16 +115,39 @@ Start3D:
|
||||||
SetIntMask()
|
SetIntMask()
|
||||||
|
|
||||||
MainLoop:
|
MainLoop:
|
||||||
lui a0, K_BASE
|
// wait on SP
|
||||||
lw t0, K_HISTORY(a0)
|
lui a0, SP_BASE
|
||||||
andi t0, 0x08
|
-
|
||||||
beqz t0, MainLoop
|
lw t0, SP_STATUS(a0)
|
||||||
|
andi t0, 1
|
||||||
|
beqz t0,-
|
||||||
|
nop
|
||||||
|
|
||||||
|
// wait on VI too
|
||||||
|
-
|
||||||
|
lui t0, VI_BASE
|
||||||
|
lw t0, VI_V_CURRENT_LINE(t0)
|
||||||
|
// until line <= 10
|
||||||
|
sltiu t0, 11
|
||||||
|
beqz t0,-
|
||||||
nop
|
nop
|
||||||
|
|
||||||
WriteString(SNewFrame)
|
WriteString(SNewFrame)
|
||||||
|
|
||||||
j Start3D
|
// swap buffers
|
||||||
|
lui a0, VI_BASE
|
||||||
|
beqz s1, SwitchToAlt
|
||||||
nop
|
nop
|
||||||
|
SwitchToMain:
|
||||||
|
la t0, VIDEO_C_BUFFER_ALT
|
||||||
|
sw t0, VI_ORIGIN(a0)
|
||||||
|
j Start3D
|
||||||
|
lli s1, 0
|
||||||
|
SwitchToAlt:
|
||||||
|
la t0, VIDEO_C_BUFFER
|
||||||
|
sw t0, VI_ORIGIN(a0)
|
||||||
|
j Start3D
|
||||||
|
lli s1, 1
|
||||||
|
|
||||||
KSL(SWaiting, "Waiting on RSP...")
|
KSL(SWaiting, "Waiting on RSP...")
|
||||||
KSL(SNewFrame, "next frame")
|
KSL(SNewFrame, "next frame")
|
||||||
|
@ -155,7 +167,7 @@ PushVideoTask:
|
||||||
sw ra, 0x10(sp)
|
sw ra, 0x10(sp)
|
||||||
|
|
||||||
lli t0, 1 // mode: video
|
lli t0, 1 // mode: video
|
||||||
lli t1, 4 // flags: ???
|
lli t1, 2 // flags: ???
|
||||||
li t2, F3DZEX_BOOT // does not need masking for some reason
|
li t2, F3DZEX_BOOT // does not need masking for some reason
|
||||||
li t3, F3DZEX_BOOT.size
|
li t3, F3DZEX_BOOT.size
|
||||||
li t4, F3DZEX_IMEM & ADDR_MASK
|
li t4, F3DZEX_IMEM & ADDR_MASK
|
||||||
|
@ -224,9 +236,14 @@ LoadRSPBoot:
|
||||||
nop
|
nop
|
||||||
|
|
||||||
include "lzss.baku.unsafe.asm"
|
include "lzss.baku.unsafe.asm"
|
||||||
|
include "dlist.asm"
|
||||||
|
|
||||||
align(16); insert F3DZEX_BOOT, "bin/F3DZEX2.boot.bin"
|
align(16); insert F3DZEX_BOOT, "bin/F3DZEX2.boot.bin"
|
||||||
align(16); insert F3DZEX_DMEM, "bin/F3DZEX2.data.bin"
|
align(16); insert F3DZEX_DMEM, "bin/F3DZEX2.data.bin"
|
||||||
align(16); insert F3DZEX_IMEM, "bin/F3DZEX2.bin"
|
align(16); insert F3DZEX_IMEM, "bin/F3DZEX2.bin"
|
||||||
align(16); insert FONT, "res/dwarf.1bpp"
|
align(16); insert FONT, "res/dwarf.1bpp"
|
||||||
align(16); insert LZ_BAKU, "res/Image.baku.lzss"
|
align(16); insert LZ_BAKU, "res/Image.baku.lzss"
|
||||||
|
|
||||||
|
if pc() > 0x80100000 {
|
||||||
|
error "ran out of space writing main code and data"
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue