2018-08-16 10:53:31 -07:00
|
|
|
// built on the N64 ROM template by krom
|
|
|
|
arch n64.cpu
|
|
|
|
endian msb
|
2018-08-20 19:40:25 -07:00
|
|
|
|
2018-08-20 20:10:06 -07:00
|
|
|
include "inc/util.inc"
|
2018-08-18 08:31:58 -07:00
|
|
|
include "inc/n64.inc"
|
|
|
|
include "inc/64drive.inc"
|
2018-08-20 19:40:25 -07:00
|
|
|
include "inc/main.inc"
|
|
|
|
include "inc/kernel.inc"
|
2018-08-16 10:53:31 -07:00
|
|
|
|
|
|
|
output "test.z64", create
|
|
|
|
fill 1052672 // Set ROM Size
|
|
|
|
|
|
|
|
origin 0x00000000
|
|
|
|
base 0x80000000
|
|
|
|
|
|
|
|
include "header.asm"
|
2018-08-18 08:31:58 -07:00
|
|
|
insert "bin/6102.bin"
|
2018-08-20 22:02:37 -07:00
|
|
|
if origin() != 0x1000 {
|
|
|
|
error "bad header or bootcode; combined sized should be exactly 0x1000"
|
|
|
|
}
|
2018-08-16 10:53:31 -07:00
|
|
|
|
2018-08-16 23:02:25 -07:00
|
|
|
include "kernel.asm"
|
2018-08-16 10:53:31 -07:00
|
|
|
|
2018-08-16 23:02:25 -07:00
|
|
|
Main:
|
|
|
|
lui t0, K_BASE
|
2018-08-16 10:53:31 -07:00
|
|
|
|
2018-08-16 23:02:25 -07:00
|
|
|
lui s0, BLAH_BASE
|
2018-08-20 19:40:25 -07:00
|
|
|
mfc0 t1, CP0_Status
|
2018-08-18 15:22:24 -07:00
|
|
|
sw t1, 8(s0)
|
2018-08-16 10:53:31 -07:00
|
|
|
|
2018-08-18 15:22:24 -07:00
|
|
|
nop; nop; nop; nop
|
2018-08-16 23:02:25 -07:00
|
|
|
mfc0 t0, CP0_Count
|
2018-08-16 10:53:31 -07:00
|
|
|
sw t0, BLAH_COUNTS+0(s0)
|
|
|
|
|
2018-08-18 15:22:24 -07:00
|
|
|
// decompress our picture
|
|
|
|
la a0, LZ_BAKU + 4
|
|
|
|
lw a3, -4(a0) // load uncompressed size from the file itself
|
|
|
|
li a1, LZ_BAKU.size - 4
|
2018-08-19 17:13:11 -07:00
|
|
|
li a2, VIDEO_C_BUFFER
|
2018-08-20 20:23:07 -07:00
|
|
|
// jal LzDecomp
|
2018-08-18 15:22:24 -07:00
|
|
|
nop
|
2018-08-16 10:53:31 -07:00
|
|
|
|
2018-08-16 23:02:25 -07:00
|
|
|
mfc0 t0, CP0_Count
|
2018-08-18 15:22:24 -07:00
|
|
|
nop; nop; nop; nop
|
|
|
|
|
2018-08-20 19:40:25 -07:00
|
|
|
lw t1, BLAH_COUNTS+0x0(s0)
|
|
|
|
sw t0, BLAH_COUNTS+0x4(s0)
|
2018-08-18 15:22:24 -07:00
|
|
|
subu t1, t0, t1
|
|
|
|
sw t1, BLAH_COUNTS+0xC(s0)
|
2018-08-16 10:53:31 -07:00
|
|
|
|
2018-08-20 19:40:25 -07:00
|
|
|
jal PokeDataCache
|
|
|
|
nop
|
|
|
|
|
2018-08-16 10:53:31 -07:00
|
|
|
lui a0, BLAH_BASE
|
|
|
|
lli a1, 0x20
|
|
|
|
ori a2, a0, BLAH_XXD
|
2018-08-18 07:39:57 -07:00
|
|
|
jal DumpAndWrite
|
2018-08-16 10:53:31 -07:00
|
|
|
lli a3, 0x20 * 4
|
2018-08-20 20:23:07 -07:00
|
|
|
KMaybeDumpString(KS_Newline)
|
2018-08-16 10:53:31 -07:00
|
|
|
|
2018-08-18 07:39:57 -07:00
|
|
|
InitVideo:
|
2018-08-16 10:53:31 -07:00
|
|
|
jal SetupScreen
|
|
|
|
nop
|
|
|
|
|
2018-08-20 19:40:25 -07:00
|
|
|
Test3D:
|
2018-08-19 17:13:11 -07:00
|
|
|
// write the jump to our actual instructions
|
|
|
|
lui a0, BLAH_BASE
|
|
|
|
lui t0, 0xDE01 // jump (no push)
|
|
|
|
ori t1, a0, BLAH_DLIST
|
2018-08-20 19:40:25 -07:00
|
|
|
sw t0, BLAH_DLIST_JUMPER+0(a0)
|
2018-08-19 17:13:11 -07:00
|
|
|
sw t1, BLAH_DLIST_JUMPER+4(a0)
|
|
|
|
|
2018-08-20 19:40:25 -07:00
|
|
|
lui a0, BLAH_BASE
|
|
|
|
ori a0, BLAH_DLIST
|
2018-08-19 17:13:11 -07:00
|
|
|
|
2018-08-20 19:40:25 -07:00
|
|
|
include "dlist.asm" // takes a0
|
2018-08-19 17:13:11 -07:00
|
|
|
|
2018-08-20 19:40:25 -07:00
|
|
|
jal PokeCaches
|
|
|
|
nop
|
2018-08-19 17:13:11 -07:00
|
|
|
|
|
|
|
// 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
|
|
|
|
|
2018-08-20 19:40:25 -07:00
|
|
|
Start3D:
|
|
|
|
DisableInt()
|
|
|
|
|
2018-08-19 17:13:11 -07:00
|
|
|
// stuff i'm borrowing from zelda:
|
|
|
|
lui a0, SP_BASE
|
2018-08-20 20:31:31 -07:00
|
|
|
lli t0, SP_SG2_CLR | SP_SG1_CLR | SP_SG0_CLR | SP_IOB_SET
|
2018-08-19 17:13:11 -07:00
|
|
|
sw t0, SP_STATUS(a0)
|
|
|
|
|
2018-08-20 19:40:25 -07:00
|
|
|
// wait
|
|
|
|
lui a0, SP_BASE
|
|
|
|
-
|
|
|
|
lw t0, SP_STATUS(a0)
|
|
|
|
andi t0, 1
|
|
|
|
beqz t0,-
|
|
|
|
nop
|
|
|
|
|
2018-08-19 17:13:11 -07:00
|
|
|
// set RSP PC to IMEM+$0
|
|
|
|
lui a0, SP_PC_BASE
|
2018-08-20 19:40:25 -07:00
|
|
|
//sw r0, SP_PC(a0)
|
2018-08-19 17:13:11 -07:00
|
|
|
li t0, 0x04001000
|
|
|
|
sw t0, SP_PC(a0)
|
|
|
|
|
2018-08-20 19:40:25 -07:00
|
|
|
lui a0, BLAH_BASE
|
|
|
|
jal PushVideoTask
|
|
|
|
ori a0, a0, BLAH_SP_TASK
|
|
|
|
|
|
|
|
// take a peek at the Task data we wrote
|
|
|
|
lui a0, BLAH_BASE
|
|
|
|
ori a0, a0, BLAH_SP_TASK
|
|
|
|
lli a1, 0x40
|
|
|
|
ori a2, a0, BLAH_XXD
|
|
|
|
jal DumpAndWrite
|
|
|
|
lli a3, 0x40 * 4
|
2018-08-20 20:23:07 -07:00
|
|
|
KMaybeDumpString(KS_Newline)
|
2018-08-20 19:40:25 -07:00
|
|
|
|
|
|
|
SP_BUSY_WAIT()
|
|
|
|
|
|
|
|
jal LoadRSPBoot
|
|
|
|
nop
|
|
|
|
|
|
|
|
SP_BUSY_WAIT()
|
|
|
|
|
|
|
|
// clear all flags that would halt RSP (i.e. tell it to run!)
|
2018-08-19 17:13:11 -07:00
|
|
|
lui a0, SP_BASE
|
2018-08-20 20:31:31 -07:00
|
|
|
lli t0, SP_IOB_SET | SP_STP_CLR | SP_BRK_CLR | SP_HLT_CLR
|
2018-08-19 17:13:11 -07:00
|
|
|
sw t0, SP_STATUS(a0)
|
|
|
|
nop
|
|
|
|
|
2018-08-20 19:40:25 -07:00
|
|
|
EnableInt()
|
2018-08-19 17:13:11 -07:00
|
|
|
|
2018-08-16 10:53:31 -07:00
|
|
|
MainLoop:
|
|
|
|
// borrowing code from krom for now:
|
|
|
|
WaitScanline(0x1E0) // Wait For Scanline To Reach Vertical Blank
|
|
|
|
WaitScanline(0x1E2)
|
|
|
|
// WaitScanline sets a0
|
|
|
|
|
2018-08-19 17:13:11 -07:00
|
|
|
li t0, 0x00000800 // Even Field
|
2018-08-16 10:53:31 -07:00
|
|
|
sw t0, VI_Y_SCALE(a0)
|
|
|
|
|
|
|
|
WaitScanline(0x1E0) // Wait For Scanline To Reach Vertical Blank
|
|
|
|
WaitScanline(0x1E2)
|
|
|
|
// WaitScanline sets a0
|
|
|
|
|
|
|
|
li t0, 0x02000800 // Odd Field
|
|
|
|
sw t0, VI_Y_SCALE(a0)
|
|
|
|
|
|
|
|
j MainLoop
|
|
|
|
nop // delay slot
|
|
|
|
|
|
|
|
SetupScreen:
|
2018-08-19 17:13:11 -07:00
|
|
|
ScreenNTSC(640, 480, BPP32|INTERLACE|AA_MODE_2, VIDEO_C_BUFFER | UNCACHED)
|
2018-08-16 10:53:31 -07:00
|
|
|
jr ra
|
|
|
|
nop
|
|
|
|
|
|
|
|
PushVideoTask:
|
2018-08-19 17:13:11 -07:00
|
|
|
// a0: Task RDRAM Pointer (size: 0x40) (should probably be row-aligned)
|
2018-08-16 23:53:37 -07:00
|
|
|
subiu sp, sp, 0x18
|
|
|
|
sw ra, 0x10(sp)
|
2018-08-16 10:53:31 -07:00
|
|
|
|
|
|
|
lli t0, 1 // mode: video
|
|
|
|
lli t1, 4 // flags: ???
|
2018-08-19 17:13:11 -07:00
|
|
|
li t2, F3DZEX_BOOT // does not need masking for some reason
|
2018-08-16 10:53:31 -07:00
|
|
|
li t3, F3DZEX_BOOT.size
|
|
|
|
li t4, F3DZEX_IMEM & ADDR_MASK
|
2018-08-20 19:40:25 -07:00
|
|
|
li t5, F3DZEX_IMEM.size
|
2018-08-16 10:53:31 -07:00
|
|
|
li t6, F3DZEX_DMEM & ADDR_MASK
|
2018-08-20 19:40:25 -07:00
|
|
|
li t7, F3DZEX_DMEM.size
|
2018-08-16 10:53:31 -07:00
|
|
|
sw t0, 0x00(a0)
|
|
|
|
sw t1, 0x04(a0)
|
|
|
|
sw t2, 0x08(a0)
|
|
|
|
sw t3, 0x0C(a0)
|
|
|
|
sw t4, 0x10(a0)
|
|
|
|
sw t5, 0x14(a0)
|
|
|
|
sw t6, 0x18(a0)
|
|
|
|
sw t7, 0x1C(a0)
|
2018-08-16 23:02:25 -07:00
|
|
|
li t0, VIDEO_STACK & ADDR_MASK // used for DList calls and returns?
|
2018-08-16 10:53:31 -07:00
|
|
|
li t1, VIDEO_STACK_SIZE
|
2018-08-19 17:13:11 -07:00
|
|
|
li t2, VIDEO_SOMETHING & ADDR_MASK
|
|
|
|
li t3, (VIDEO_SOMETHING & ADDR_MASK) + VIDEO_SOMETHING_SIZE // end pointer (not size!)
|
2018-08-16 14:02:08 -07:00
|
|
|
li t4, ((BLAH_BASE << 16) | BLAH_DLIST_JUMPER) & ADDR_MASK // initial DList
|
2018-08-20 19:40:25 -07:00
|
|
|
lli t5, 8 // size of one jump command. this is ignored and 0xA8 is used instead
|
2018-08-16 10:53:31 -07:00
|
|
|
li t6, VIDEO_YIELD & ADDR_MASK
|
|
|
|
li t7, VIDEO_YIELD_SIZE
|
|
|
|
sw t0, 0x20(a0)
|
|
|
|
sw t1, 0x24(a0)
|
|
|
|
sw t2, 0x28(a0)
|
|
|
|
sw t3, 0x2C(a0)
|
|
|
|
sw t4, 0x30(a0)
|
|
|
|
sw t5, 0x34(a0)
|
|
|
|
sw t6, 0x38(a0)
|
|
|
|
sw t7, 0x3C(a0)
|
2018-08-19 17:13:11 -07:00
|
|
|
|
|
|
|
// tell data cache to write itself out
|
|
|
|
cache 0x19, 0x00(a0)
|
|
|
|
cache 0x19, 0x10(a0)
|
|
|
|
cache 0x19, 0x20(a0)
|
|
|
|
cache 0x19, 0x30(a0)
|
|
|
|
|
|
|
|
li t9, ADDR_MASK
|
|
|
|
jal PushRSPTask
|
|
|
|
and a0, a0, t9
|
2018-08-16 10:53:31 -07:00
|
|
|
|
2018-08-16 23:53:37 -07:00
|
|
|
lw ra, 0x10(sp)
|
2018-08-16 10:53:31 -07:00
|
|
|
jr ra
|
2018-08-16 23:53:37 -07:00
|
|
|
addiu sp, sp, 0x18
|
2018-08-16 10:53:31 -07:00
|
|
|
|
|
|
|
PushRSPTask:
|
|
|
|
lli t3, 0x40 - 1 // DMA quirk
|
|
|
|
SP_DMA_WAIT() // clobbers t0, t5
|
2018-08-19 17:13:11 -07:00
|
|
|
la t1, 0xA4000FC0
|
2018-08-16 10:53:31 -07:00
|
|
|
sw t1, SP_MEM_ADDR(t5)
|
|
|
|
sw a0, SP_DRAM_ADDR(t5)
|
|
|
|
sw t3, SP_RD_LEN(t5) // pull data from RDRAM into DMEM/IMEM
|
|
|
|
jr ra
|
|
|
|
nop
|
|
|
|
|
2018-08-20 19:40:25 -07:00
|
|
|
LoadRSPBoot:
|
|
|
|
la t2, F3DZEX_BOOT & ADDR_MASK
|
|
|
|
li t3, F3DZEX_BOOT.size
|
|
|
|
subiu t3, t3, 1 // DMA quirk
|
|
|
|
SP_DMA_WAIT() // clobbers t0, t5
|
|
|
|
la t1, 0xA4001000
|
|
|
|
sw t1, SP_MEM_ADDR(t5)
|
|
|
|
sw t2, SP_DRAM_ADDR(t5)
|
|
|
|
sw t3, SP_RD_LEN(t5) // pull data from RDRAM into DMEM/IMEM
|
|
|
|
jr ra
|
|
|
|
nop
|
|
|
|
|
2018-08-18 15:22:24 -07:00
|
|
|
include "lzss.baku.unsafe.asm"
|
|
|
|
|
2018-08-18 08:31:58 -07:00
|
|
|
align(16); insert F3DZEX_BOOT, "bin/F3DZEX2.boot.bin"
|
|
|
|
align(16); insert F3DZEX_DMEM, "bin/F3DZEX2.data.bin"
|
|
|
|
align(16); insert F3DZEX_IMEM, "bin/F3DZEX2.bin"
|
|
|
|
align(16); insert FONT, "res/dwarf.1bpp"
|
2018-08-18 15:22:24 -07:00
|
|
|
align(16); insert LZ_BAKU, "res/Image.baku.lzss"
|