This commit is contained in:
Connor Olding 2018-08-16 19:53:31 +02:00
commit 5f143cae81
17 changed files with 2421 additions and 0 deletions

10
.gitignore vendored Normal file
View File

@ -0,0 +1,10 @@
old.asm
_old
microcodes
*.bin
!F3DZEX2.data.bin
!6102.bin
*.z64
*.c
*.tmp
*.txt

BIN
6102.bin Normal file

Binary file not shown.

34
64drive.inc Normal file
View File

@ -0,0 +1,34 @@
// set 64Drive interface constants.
// NOTE: although STATUSes are marked as halfwords,
// you should use lw/sw to interact with them.
constant CI_BASE($B800)
constant CI_BASE_EXTENDED($BF80)
constant CI_GENERAL_BUFFER($0000) // 512 bytes
constant CI_STATUS($0200) // halfword
constant CI_COMMAND($0208) // word
constant CI_LBA($0210) // word
constant CI_LENGTH($0218) // word
constant CI_RESULT($0220) // word
constant CI_SDRAM_SIZE($02E8) // word
constant CI_HW_MAGIC($02EC) // word ("UDEV")
constant CI_HW_VARIANT($02F0) // word
constant CI_PERSISTENT($02F4) // word (RESERVED)
constant CI_BUTTON_STATUS($02F8) // halfword (needs debouncing)
constant CI_UPGRADE_MOD_STATUS($02FA) // halfword
constant CI_REVISION_NUMBER($02FC) // halfword
constant CI_USB_COMMAND_STATUS($0400) // byte
constant CI_USB_PARAM_RESULT_0($0404) // word
constant CI_USB_PARAM_RESULT_1($0408) // word
constant CI_WIFI_COMMAND_STATUS($0420) // byte
constant CI_WIFI_PARAM_RESULT_0($0424) // word
constant CI_WIFI_PARAM_RESULT_1($0428) // word
constant CI_EEPROM($1000) // 2048 bytes
constant CI_WRITEBACK_LBA($1800) // 1024 bytes (256 words)

1049
F3DZEX.asm Normal file

File diff suppressed because it is too large Load Diff

BIN
F3DZEX2.data.bin Normal file

Binary file not shown.

BIN
Image.lz Normal file

Binary file not shown.

3
README.md Normal file
View File

@ -0,0 +1,3 @@
nothing to see here (yet).
currently borrowing some code from [krom's repo.](https://github.com/PeterLemon/N64/)

14
build Normal file
View File

@ -0,0 +1,14 @@
#!/usr/bin/env bash
# TODO: make this crap actually portable
set -e
ROM_NAME=test.z64
#while inotifywait -q -e create,modify *.asm *.inc; do
bass F3DZEX.asm
bass main.asm
/tmp/z64crc "$ROM_NAME"
#done
# don't use -z in msys2 because it hangs
64drive_usb -c 1 -l "$ROM_NAME" #-z

78
devcart.asm Normal file
View File

@ -0,0 +1,78 @@
// debug routines for the 64drive, not a real devcart!
Drive64Write:
// a0: RAM address to copy from
// a1: length of data to copy in bytes
// v0: error code (0 is OK)
// TODO: a0 should be double-word aligned if used directly with DMA
// assert a0 (RAM address) is word-aligned
andi t9, a0, 3
bnezl t9, Drive64WriteExit
lli v0, 1
// assert a1 (copy length) is word-aligned
andi t9, a1, 3
bnezl t9, Drive64WriteExit
lli v0, 2
blez a1, Drive64WriteExit // nothing to write? nothing to do!
lli v0, 0 // delay slot
lui a2, 0x103F // SDRAM destination
move a3, a1 // SDRAM length
// flush the cache at a0 to RAM before doing any DMA
andi t6, a0, 0xF
addu t7, a0, a1 // stop flushing around here
subu t6, a0, t6 // align a0 to data line
subiu t7, t7, 1 // turn inclusive end-point into exclusive instead
-
cache 1, 0(t6) // peter says: "Index Writeback Invalidate"
sltu at, t6, t7
bnez at,-
addiu t6, 0x10 // (delay slot) += data line size
// AND off the DRAM address
li t9, 0x007FFFFF // __osPiRawStartDma uses 0x1FFFFFFF?
and t1, a0, t9
// cart address
move t2, a2
// set length (needs to be decremented due to DMA quirk)
subiu t3, a3, 1
PI_WAIT()
sw t1, PI_DRAM_ADDR(t5)
sw t2, PI_CART_ADDR(t5)
sw t3, PI_RD_LEN(t5) // "read" from DRAM to cart
// PI_WAIT() // if we always wait before doing operations, this shouldn't be necessary
Drive64TestPoint:
lui at, 0x0100 // set printf channel
or a3, a3, at
lli t1, 0x08 // WRITE mode
// SDRAM parameter is given in multiples of halfwords
li t9, 0x0FFFFFFF
and a2, a2, t9
srl a2, a2, 1
CI_USB_WRITE_WAIT()
sw a2, CI_USB_PARAM_RESULT_0(gp)
PI_WAIT() // yes, these waits seem to be necessary
sw a3, CI_USB_PARAM_RESULT_1(gp)
PI_WAIT()
sw t1, CI_USB_COMMAND_STATUS(gp)
// CI_USB_WRITE_WAIT() // if we always wait before doing operations, this shouldn't be necessary
Drive64WriteExit:
jr ra
nop // delay slot
Drive64TestWrite:
li a2, 0xA0000020
lli a3, 0x20
j Drive64TestPoint
nop // delay slot

BIN
dwarf.1bpp Normal file

Binary file not shown.

38
header.asm Normal file
View File

@ -0,0 +1,38 @@
//============
// N64 Header
//============
// PI_BSB_DOM1
db $80 // Initial PI_BSB_DOM1_LAT_REG Value
db $37 // Initial PI_BSB_DOM1_PGS_REG Value
db $12 // Initial PI_BSB_DOM1_PWD_REG Value
db $40 // Initial PI_BSB_DOM1_PGS_REG Value
// CLOCK RATE
dw $000F // Initial Clock Rate
// VECTOR
dw Start // Boot Address Offset
dw $1444 // Release Offset
// COMPLEMENT CHECK & CHECKSUM
db "CRC1" // CRC1: COMPLEMENT CHECK
db "CRC2" // CRC2: CHECKSUM
dd 0 // UNUSED
// PROGRAM TITLE (27 Byte ASCII String, Use Spaces For Unused Bytes)
db "NOTWA'S TESTING THE 64DRIVE"
// "123456789012345678901234567"
// DEVELOPER ID CODE
db $00 // "N" = Nintendo
// CARTRIDGE ID CODE
db $00
db 0 // UNUSED
// COUNTRY CODE
db $00 // "D" = Germany, "E" = USA, "J" = Japan, "P" = Europe, "U" = Australia
db 0 // UNUSED

55
lz.asm Normal file
View File

@ -0,0 +1,55 @@
// by krom (Peter Lemon)
// https://github.com/PeterLemon/N64/tree/master/Compress/LZ77/LZ77GFX
LZInit:
la a0, LZ+4 // A0 = Source Address
lui a1, 0xA010 // A1 = Destination Address (DRAM Start Offset)
lbu t0, -1(a0) // T0 = HI Data Length Byte
sll t0, 8
lbu t1, -2(a0) // T1 = MID Data Length Byte
or t0, t1
sll t0, 8
lbu t1, -3(a0) // T1 = LO Data Length Byte
or t0, t1 // T0 = Data Length
addu t0, a1 // T0 = Destination End Offset (DRAM End Offset)
LZLoop:
lbu t1, 0(a0) // T1 = Flag Data For Next 8 Blocks (0 = Uncompressed Byte, 1 = Compressed Bytes)
addiu a0, 1 // Add 1 To LZ Offset
ori t2, r0, %10000000 // T2 = Flag Data Block Type Shifter
LZBlockLoop:
beq a1, t0, LZEnd // IF (Destination Address == Destination End Offset) LZEnd
and t4, t1, t2 // Test Block Type (Delay Slot)
beqz t2, LZLoop // IF (Flag Data Block Type Shifter == 0) LZLoop
srl t2, 1 // Shift T2 To Next Flag Data Block Type (Delay Slot)
lbu t3, 0(a0) // T3 = Copy Uncompressed Byte / Number Of Bytes To Copy & Disp MSB's
bnez t4, LZDecode // IF (BlockType != 0) LZDecode Bytes
addiu a0, 1 // Add 1 To LZ Offset (Delay Slot)
sb t3, 0(a1) // Store Uncompressed Byte To Destination
j LZBlockLoop
addiu a1, 1 // Add 1 To DRAM Offset (Delay Slot)
LZDecode:
lbu t4, 0(a0) // T4 = Disp LSB's
addiu a0, 1 // Add 1 To LZ Offset
sll t5, t3, 8 // T5 = Disp MSB's
or t4, t5 // T4 = Disp 16-Bit
andi t4, 0xFFF // T4 &= 0xFFF (Disp 12-Bit)
not t4 // T4 = -Disp - 1
addu t4, a1 // T4 = Destination - Disp - 1
srl t3, 4 // T3 = Number Of Bytes To Copy (Minus 3)
addiu t3, 3 // T3 = Number Of Bytes To Copy
LZCopy:
lbu t5, 0(t4) // T5 = Byte To Copy
addiu t4, 1 // Add 1 To T4 Offset
sb t5, 0(a1) // Store Byte To DRAM
subiu t3, 1 // Number Of Bytes To Copy -= 1
bnez t3, LZCopy // IF (Number Of Bytes To Copy != 0) LZCopy Bytes
addiu a1, 1 // Add 1 To DRAM Offset (Delay Slot)
j LZBlockLoop
nop // Delay Slot
LZEnd:

217
main.asm Normal file
View File

@ -0,0 +1,217 @@
// built on the N64 ROM template by krom
arch n64.cpu
endian msb
include "n64.inc"
include "n64_gfx.inc"
include "64drive.inc"
output "test.z64", create
fill 1052672 // Set ROM Size
origin 0x00000000
base 0x80000000
include "header.asm"
insert "6102.bin"
// after inserting the header and bootrom,
// origin should be at 0x1000.
include "main.inc"
Start:
N64_INIT() // enable interrupts
// SP defaults to RSP instruction memory: 0xA4001FF0
// we can do better than that.
lui sp, BLAH_BASE
// SP should always be 8-byte aligned
// so that SD and LD instructions don't fail on it.
subiu sp, sp, 8
lui s0, BLAH_BASE
Drive64Init:
lui gp, CI_BASE
lui t2, 0x5544 // "UD" of "UDEV"
lw t1, CI_HW_MAGIC(gp)
ori t2, t2, 0x4556 // "EV" of "UDEV"
beq t1, t2, Drive64Confirmed
nop // delay slot
Drive64TryExtended:
lui gp, CI_BASE_EXTENDED
lw t1, CI_HW_MAGIC(gp)
bne t1, t2, Main
nop // delay slot
Drive64Confirmed:
sw t2, BLAH_CONFIRMED(s0)
sw gp, BLAH_CI_BASE(s0)
// enable writing to cartROM (SDRAM) for USB writing later
lli t1, 0xF0
CI_WAIT()
sw t1, CI_COMMAND(gp) // send our command
CI_WAIT()
Main:
if 0 {
mfc0 t0, 0x9 // move cycle Count register from COP 0
sw t0, BLAH_COUNTS+0(s0)
mfc0 t0, 0x9 // move cycle Count register from COP 0
sw t0, BLAH_COUNTS+4(s0)
// seems like 41 half-cycles between the two mfc0's, rarely 42?
} else {
mfc0 t0, 0x9
mfc0 t1, 0x9
sw t0, BLAH_COUNTS+0(s0)
sw t1, BLAH_COUNTS+4(s0)
// seems like 22 half-cycles between the two mfc0's
}
// what is our stack pointer set to, anyway?
sw sp, 0xC(s0)
// decompress our picture
include "lz.asm"
mfc0 t0, 0x9
sw t0, BLAH_COUNTS+8(s0)
lw t1, BLAH_CONFIRMED(s0)
beqz t1, InitVideo
nop // delay slot
// jal Drive64TestWrite
// nop // delay slot
lui a0, BLAH_BASE
lli a1, 0x20
ori a2, a0, BLAH_XXD
lli a3, 0x20 * 4
jal xxd
nop // delay slot
lui a0, BLAH_BASE // write address
ori a0, a0, BLAH_XXD // (RAM gets copied to SDRAM by routine)
lli a1, 0x20 * 4
jal Drive64Write
nop // delay slot
InitVideo: // currently 80001190 (this comment is likely out of date)
// A4000FC0
jal LoadRSPBoot
nop
lui a0, BLAH_BASE
jal PushVideoTask
ori a0, a0, BLAH_SP_TASK
jal SetupScreen
nop
mfc0 t0, 0x9 // move cycle Count register from COP 0
sw t0, BLAH_COUNTS+0xC(s0)
MainLoop:
// borrowing code from krom for now:
WaitScanline(0x1E0) // Wait For Scanline To Reach Vertical Blank
WaitScanline(0x1E2)
// WaitScanline sets a0
ori t0, r0, 0x00000800 // Even Field
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
include "devcart.asm" // assumes gp is set to CI base
SetupScreen:
// NTSC: 640x480, 32BPP, Interlace, Resample Only, DRAM Origin VIDEO_BUFFER
ScreenNTSC(640, 480, BPP32|INTERLACE|AA_MODE_2, VIDEO_BUFFER | UNCACHED)
jr ra
nop
LoadRSPBoot:
li t2, F3DZEX_BOOT
li t3, F3DZEX_BOOT.size
subiu t3, t3, 1 // DMA quirk
SP_DMA_WAIT() // clobbers t0, t5
ori t1, t5, 0x1000
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
PushVideoTask:
// a0: Task RDRAM Pointer (size: 0x40)
subiu sp, sp, 0x8
sw ra, 0(sp)
lli t0, 1 // mode: video
lli t1, 4 // flags: ???
li t2, F3DZEX_BOOT
li t3, F3DZEX_BOOT.size
li t4, F3DZEX_IMEM & ADDR_MASK
li t5, F3DZEX_IMEM.size // note: Zelda uses 0x1000 for some reason (0x80 too big).
li t6, F3DZEX_DMEM & ADDR_MASK
li t7, F3DZEX_DMEM.size // note: Zelda uses 0x800 for some reason (way too big).
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)
li t0, VIDEO_STACK & ADDR_MASK // ?
li t1, VIDEO_STACK_SIZE
li t2, VIDEO_BUFFER & ADDR_MASK
li t3, (VIDEO_BUFFER & ADDR_MASK) + VIDEO_BUFFER_SIZE // end pointer (not size!)
li t4, BLAH_DLIST_JUMPER & ADDR_MASK // initial DList (best to just be one jump command)
lli t5, 8 // size of one jump command
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)
jal PushRSPTask // a0 passthru
nop
lw ra, 0(sp)
jr ra
addiu sp, sp, 0x8
PushRSPTask:
lli t3, 0x40 - 1 // DMA quirk
SP_DMA_WAIT() // clobbers t0, t5
ori t1, t5, 0xFC0
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
include "xxd.asm"
align(16); insert F3DZEX_BOOT, "F3DZEX2.boot.bin"
align(16); insert F3DZEX_DMEM, "F3DZEX2.data.bin"
align(16); insert F3DZEX_IMEM, "F3DZEX2.bin"
align(16); insert FONT, "dwarf.1bpp"
align(16); insert LZ, "Image.lz"

56
main.inc Normal file
View File

@ -0,0 +1,56 @@
constant UNCACHED(0xA0000000)
constant ADDR_MASK(0x1FFFFFFF)
constant BLAH_BASE(0x803F)
constant BLAH_CONFIRMED(0x0000)
constant BLAH_CI_BASE(0x0004)
constant BLAH_COUNTS(0x0010)
constant BLAH_SP_TASK(0x0040)
constant BLAH_DLIST_JUMPER(0x0080)
constant BLAH_XXD(0x0100)
constant VIDEO_BUFFER(0x80100000)
constant VIDEO_BUFFER_SIZE(640 * 480 * 4)
constant VIDEO_STACK(VIDEO_BUFFER + VIDEO_BUFFER_SIZE)
constant VIDEO_STACK_SIZE(0x400)
constant VIDEO_YIELD(VIDEO_STACK + VIDEO_STACK_SIZE)
constant VIDEO_YIELD_SIZE(0xC00)
macro PI_WAIT() {
lui t5, PI_BASE
-
lw t0, PI_STATUS(t5)
andi t0, t0, 3
bnez t0,-
nop // delay slot
}
macro SP_DMA_WAIT() { // external
lui t5, SP_BASE
-
lw t0, SP_DMA_FULL(t5)
bnez t0,-
nop
-
lw t0, SP_DMA_BUSY(t5)
bnez t0,-
nop
}
macro CI_WAIT() {
PI_WAIT()
-
lw t0, CI_STATUS(gp)
srl t0, t0, 12 // first 12 bits are reserved, so ignore them
bnez t0,-
nop // delay slot
}
macro CI_USB_WRITE_WAIT() {
PI_WAIT()
-
lw t0, CI_USB_COMMAND_STATUS(gp)
srl t0, t0, 4 // shift out ARM status, leaving WRITE status
bnez t0,-
nop // delay slot
}

267
n64.inc Normal file
View File

@ -0,0 +1,267 @@
// via krom
//=============
// N64 Include
//=============
// N64 MIPS 4300 CPU Registers
constant r0(0)
constant r1(1)
constant r2(2)
constant r3(3)
constant r4(4)
constant r5(5)
constant r6(6)
constant r7(7)
constant r8(8)
constant r9(9)
constant r10(10)
constant r11(11)
constant r12(12)
constant r13(13)
constant r14(14)
constant r15(15)
constant r16(16)
constant r17(17)
constant r18(18)
constant r19(19)
constant r20(20)
constant r21(21)
constant r22(22)
constant r23(23)
constant r24(24)
constant r25(25)
constant r26(26)
constant r27(27)
constant r28(28)
constant r29(29)
constant r30(30)
constant r31(31)
constant at(1)
constant v0(2)
constant v1(3)
constant a0(4)
constant a1(5)
constant a2(6)
constant a3(7)
constant t0(8)
constant t1(9)
constant t2(10)
constant t3(11)
constant t4(12)
constant t5(13)
constant t6(14)
constant t7(15)
constant s0(16)
constant s1(17)
constant s2(18)
constant s3(19)
constant s4(20)
constant s5(21)
constant s6(22)
constant s7(23)
constant t8(24)
constant t9(25)
constant k0(26)
constant k1(27)
constant gp(28)
constant sp(29)
constant s8(30)
constant ra(31)
// N64 MIPS 4300 CP1 Floating Point Unit (FPU) Registers (COP1)
constant f0(0)
constant f1(1)
constant f2(2)
constant f3(3)
constant f4(4)
constant f5(5)
constant f6(6)
constant f7(7)
constant f8(8)
constant f9(9)
constant f10(10)
constant f11(11)
constant f12(12)
constant f13(13)
constant f14(14)
constant f15(15)
constant f16(16)
constant f17(17)
constant f18(18)
constant f19(19)
constant f20(20)
constant f21(21)
constant f22(22)
constant f23(23)
constant f24(24)
constant f25(25)
constant f26(26)
constant f27(27)
constant f28(28)
constant f29(29)
constant f30(30)
constant f31(31)
// Memory Map
constant RDRAM($A000) // $00000000..$003FFFFF RDRAM Memory 4MB ($00000000..$007FFFFF 8MB With Expansion Pak)
constant RDRAM_BASE($A3F0) // $03F00000..$03F00027 RDRAM Base Register
constant RDRAM_DEVICE_TYPE($00) // $03F00000..$03F00003 RDRAM: Device Type Register
constant RDRAM_DEVICE_ID($04) // $03F00004..$03F00007 RDRAM: Device ID Register
constant RDRAM_DELAY($08) // $03F00008..$03F0000B RDRAM: Delay Register
constant RDRAM_MODE($0C) // $03F0000C..$03F0000F RDRAM: Mode Register
constant RDRAM_REF_INTERVAL($10) // $03F00010..$03F00013 RDRAM: Ref Interval Register
constant RDRAM_REF_ROW($14) // $03F00014..$03F00017 RDRAM: Ref Row Register
constant RDRAM_RAS_INTERVAL($18) // $03F00018..$03F0001B RDRAM: Ras Interval Register
constant RDRAM_MIN_INTERVAL($1C) // $03F0001C..$03F0001F RDRAM: Minimum Interval Register
constant RDRAM_ADDR_SELECT($20) // $03F00020..$03F00023 RDRAM: Address Select Register
constant RDRAM_DEVICE_MANUF($24) // $03F00024..$03F00027 RDRAM: Device Manufacturer Register
constant SP_MEM_BASE($A400) // $04000000..$04000FFF SP MEM Base Register
constant SP_DMEM($0000) // $04000000..$04000FFF SP: RSP DMEM (4096 Bytes)
constant SP_IMEM($1000) // $04001000..$04001FFF SP: RSP IMEM (4096 Bytes)
constant SP_BASE($A404) // $04040000..$0404001F SP Base Register
constant SP_MEM_ADDR($00) // $04040000..$04040003 SP: Master, SP Memory Address Register
constant SP_DRAM_ADDR($04) // $04040004..$04040007 SP: Slave, SP DRAM DMA Address Register
constant SP_RD_LEN($08) // $04040008..$0404000B SP: Read DMA Length Register
constant SP_WR_LEN($0C) // $0404000C..$0404000F SP: Write DMA Length Register
constant SP_STATUS($10) // $04040010..$04040013 SP: Status Register
constant SP_DMA_FULL($14) // $04040014..$04040017 SP: DMA Full Register
constant SP_DMA_BUSY($18) // $04040018..$0404001B SP: DMA Busy Register
constant SP_SEMAPHORE($1C) // $0404001C..$0404001F SP: Semaphore Register
constant SP_PC_BASE($A408) // $04080000..$04080007 SP PC Base Register
constant SP_PC($00) // $04080000..$04080003 SP: PC Register
constant SP_IBIST_REG($04) // $04080004..$04080007 SP: IMEM BIST Register
constant DPC_BASE($A410) // $04100000..$0410001F DP Command (DPC) Base Register
constant DPC_START($00) // $04100000..$04100003 DPC: CMD DMA Start Register
constant DPC_END($04) // $04100004..$04100007 DPC: CMD DMA End Register
constant DPC_CURRENT($08) // $04100008..$0410000B DPC: CMD DMA Current Register
constant DPC_STATUS($0C) // $0410000C..$0410000F DPC: CMD Status Register
constant DPC_CLOCK($10) // $04100010..$04100013 DPC: Clock Counter Register
constant DPC_BUFBUSY($14) // $04100014..$04100017 DPC: Buffer Busy Counter Register
constant DPC_PIPEBUSY($18) // $04100018..$0410001B DPC: Pipe Busy Counter Register
constant DPC_TMEM($1C) // $0410001C..$0410001F DPC: TMEM Load Counter Register
constant DPS_BASE($A420) // $04200000..$0420000F DP Span (DPS) Base Register
constant DPS_TBIST($00) // $04200000..$04200003 DPS: Tmem Bist Register
constant DPS_TEST_MODE($04) // $04200004..$04200007 DPS: Span Test Mode Register
constant DPS_BUFTEST_ADDR($08) // $04200008..$0420000B DPS: Span Buffer Test Address Register
constant DPS_BUFTEST_DATA($0C) // $0420000C..$0420000F DPS: Span Buffer Test Data Register
constant MI_BASE($A430) // $04300000..$0430000F MIPS Interface (MI) Base Register
constant MI_INIT_MODE($00) // $04300000..$04300003 MI: Init Mode Register
constant MI_VERSION($04) // $04300004..$04300007 MI: Version Register
constant MI_INTR($08) // $04300008..$0430000B MI: Interrupt Register
constant MI_INTR_MASK($0C) // $0430000C..$0430000F MI: Interrupt Mask Register
constant VI_BASE($A440) // $04400000..$04400037 Video Interface (VI) Base Register
constant VI_STATUS($00) // $04400000..$04400003 VI: Status/Control Register
constant VI_ORIGIN($04) // $04400004..$04400007 VI: Origin Register
constant VI_WIDTH($08) // $04400008..$0440000B VI: Width Register
constant VI_V_INTR($0C) // $0440000C..$0440000F VI: Vertical Interrupt Register
constant VI_V_CURRENT_LINE($10) // $04400010..$04400013 VI: Current Vertical Line Register
constant VI_TIMING($14) // $04400014..$04400017 VI: Video Timing Register
constant VI_V_SYNC($18) // $04400018..$0440001B VI: Vertical Sync Register
constant VI_H_SYNC($1C) // $0440001C..$0440001F VI: Horizontal Sync Register
constant VI_H_SYNC_LEAP($20) // $04400020..$04400023 VI: Horizontal Sync Leap Register
constant VI_H_VIDEO($24) // $04400024..$04400027 VI: Horizontal Video Register
constant VI_V_VIDEO($28) // $04400028..$0440002B VI: Vertical Video Register
constant VI_V_BURST($2C) // $0440002C..$0440002F VI: Vertical Burst Register
constant VI_X_SCALE($30) // $04400030..$04400033 VI: X-Scale Register
constant VI_Y_SCALE($34) // $04400034..$04400037 VI: Y-Scale Register
constant AI_BASE($A450) // $04500000..$04500017 Audio Interface (AI) Base Register
constant AI_DRAM_ADDR($00) // $04500000..$04500003 AI: DRAM Address Register
constant AI_LEN($04) // $04500004..$04500007 AI: Length Register
constant AI_CONTROL($08) // $04500008..$0450000B AI: Control Register
constant AI_STATUS($0C) // $0450000C..$0450000F AI: Status Register
constant AI_DACRATE($10) // $04500010..$04500013 AI: DAC Sample Period Register
constant AI_BITRATE($14) // $04500014..$04500017 AI: Bit Rate Register
constant PI_BASE($A460) // $04600000..$04600033 Peripheral Interface (PI) Base Register
constant PI_DRAM_ADDR($00) // $04600000..$04600003 PI: DRAM Address Register
constant PI_CART_ADDR($04) // $04600004..$04600007 PI: Pbus (Cartridge) Address Register
constant PI_RD_LEN($08) // $04600008..$0460000B PI: Read Length Register
constant PI_WR_LEN($0C) // $0460000C..$0460000F PI: Write length register
constant PI_STATUS($10) // $04600010..$04600013 PI: Status Register
constant PI_BSD_DOM1_LAT($14) // $04600014..$04600017 PI: Domain 1 Latency Register
constant PI_BSD_DOM1_PWD($18) // $04600018..$0460001B PI: Domain 1 Pulse Width Register
constant PI_BSD_DOM1_PGS($1C) // $0460001C..$0460001F PI: Domain 1 Page Size Register
constant PI_BSD_DOM1_RLS($20) // $04600020..$04600023 PI: Domain 1 Release Register
constant PI_BSD_DOM2_LAT($24) // $04600024..$04600027 PI: Domain 2 Latency Register
constant PI_BSD_DOM2_PWD($28) // $04600028..$0460002B PI: Domain 2 Pulse Width Register
constant PI_BSD_DOM2_PGS($2C) // $0460002C..$0460002F PI: Domain 2 Page Size Register
constant PI_BSD_DOM2_RLS($30) // $04600030..$04600033 PI: Domain 2 Release Register
constant RI_BASE($A470) // $04700000..$0470001F RDRAM Interface (RI) Base Register
constant RI_MODE($00) // $04700000..$04700003 RI: Mode Register
constant RI_CONFIG($04) // $04700004..$04700007 RI: Config Register
constant RI_CURRENT_LOAD($08) // $04700008..$0470000B RI: Current Load Register
constant RI_SELECT($0C) // $0470000C..$0470000F RI: Select Register
constant RI_REFRESH($10) // $04700010..$04700013 RI: Refresh Register
constant RI_LATENCY($14) // $04700014..$04700017 RI: Latency Register
constant RI_RERROR($18) // $04700018..$0470001B RI: Read Error Register
constant RI_WERROR($1C) // $0470001C..$0470001F RI: Write Error Register
constant SI_BASE($A480) // $04800000..$0480001B Serial Interface (SI) Base Register
constant SI_DRAM_ADDR($00) // $04800000..$04800003 SI: DRAM Address Register
constant SI_PIF_ADDR_RD64B($04) // $04800004..$04800007 SI: Address Read 64B Register
//*RESERVED*($08) // $04800008..$0480000B SI: Reserved Register
//*RESERVED*($0C) // $0480000C..$0480000F SI: Reserved Register
constant SI_PIF_ADDR_WR64B($10) // $04800010..$04800013 SI: Address Write 64B Register
//*RESERVED*($14) // $04800014..$04800017 SI: Reserved Register
constant SI_STATUS($18) // $04800018..$0480001B SI: Status Register
constant CART_DOM2_ADDR1($A500) // $05000000..$0507FFFF Cartridge Domain 2(Address 1) SRAM
constant CART_DOM1_ADDR1($A600) // $06000000..$07FFFFFF Cartridge Domain 1(Address 1) 64DD
constant CART_DOM2_ADDR2($A800) // $08000000..$0FFFFFFF Cartridge Domain 2(Address 2) SRAM
constant CART_DOM1_ADDR2($B000) // $10000000..$18000803 Cartridge Domain 1(Address 2) ROM
constant PIF_BASE($BFC0) // $1FC00000..$1FC007BF PIF Base Register
constant PIF_ROM($000) // $1FC00000..$1FC007BF PIF: Boot ROM
constant PIF_RAM($7C0) // $1FC007C0..$1FC007FF PIF: RAM (JoyChannel)
constant PIF_HWORD($7C4) // $1FC007C4..$1FC007C5 PIF: HWORD
constant PIF_XBYTE($7C6) // $1FC007C6 PIF: Analog X Byte
constant PIF_YBYTE($7C7) // $1FC007C7 PIF: Analog Y Byte
constant CART_DOM1_ADDR3($BFD0) // $1FD00000..$7FFFFFFF Cartridge Domain 1 (Address 3)
constant EXT_SYS_AD($8000) // $80000000..$FFFFFFFF External SysAD Device
constant VI_NTSC_CLOCK(48681812) // NTSC: Hz = 48.681812 MHz
constant VI_PAL_CLOCK(49656530) // PAL: Hz = 49.656530 MHz
constant VI_MPAL_CLOCK(48628316) // MPAL: Hz = 48.628316 MHz
macro align(size) { // Align Byte Amount
while (pc() % {size}) {
db 0
}
}
macro N64_INIT() {
// enables interrupts on SI and PI.
// must be done else N64 will stop responding.
lui a0,PIF_BASE // A0 = PIF Base Register ($BFC00000)
lli t0,8
sw t0,PIF_RAM+$3C(a0)
}
macro DMA(start, end, dest) { // DMA Data Copy Cart->DRAM: Start Cart Address, End Cart Address, Destination DRAM Address
lui a0,PI_BASE // A0 = PI Base Register ($A4600000)
-
lw t0,PI_STATUS(a0) // T0 = Word From PI Status Register ($A4600010)
andi t0,3 // AND PI Status With 3
bnez t0,- // IF TRUE DMA Is Busy
nop // Delay Slot
la t0,{dest}&$7FFFFF // T0 = Aligned DRAM Physical RAM Offset ($00000000..$007FFFFF 8MB)
sw t0,PI_DRAM_ADDR(a0) // Store RAM Offset To PI DRAM Address Register ($A4600000)
la t0,$10000000|({start}&$3FFFFFF) // T0 = Aligned Cart Physical ROM Offset ($10000000..$13FFFFFF 64MB)
sw t0,PI_CART_ADDR(a0) // Store ROM Offset To PI Cart Address Register ($A4600004)
la t0,({end}-{start})-1 // T0 = Length Of DMA Transfer In Bytes - 1
sw t0,PI_WR_LEN(a0) // Store DMA Length To PI Write Length Register ($A460000C)
}

523
n64_gfx.inc Normal file
View File

@ -0,0 +1,523 @@
// via krom
//==============
// N64 Graphics
//==============
constant BPP0($0000) // VI Status/Control: Color Depth Blank (No Data Or Sync) (Bit 0..1)
//*RESERVED*($0001) // VI Status/Control: Color Depth Reserved (Bit 0..1)
constant BPP16($0002) // VI Status/Control: Color Depth 16BPP R5/G5/B5/A1 (Bit 0..1)
constant BPP32($0003) // VI Status/Control: Color Depth 32BPP R8/G8/B8/A8 (Bit 0..1)
constant GAMMA_DITHER_EN($00004) // VI Status/Control: Gamma Dither Enable (Requires: Gamma Enable) (Bit 2)
constant GAMMA_EN($00008) // VI Status/Control: Gamma Enable (Gamma Boost For YUV Images) (Bit 3)
constant DIVOT_EN($00010) // VI Status/Control: Divot Enable (Used With Anti-alias) (Bit 4)
constant VBUS_CLK_EN($00020) // VI Status/Control: Video Bus Clock Enable (Bit 5)
constant INTERLACE($00040) // VI Status/Control: Interlace/Serrate (Used With Interlaced Display) (Bit 6)
constant TST_MODE($00080) // VI Status/Control: Test Mode (Bit 7)
constant AA_MODE_0($00000) // VI Status/Control: AA Mode 0 = Anti­-alias & Resample (Always Fetch Extra Lines) (Bit 8..9)
constant AA_MODE_1($00100) // VI Status/Control: AA Mode 1 = Anti­-alias & Resample (Fetch Extra Lines When Needed) (Bit 8..9)
constant AA_MODE_2($00200) // VI Status/Control: AA Mode 2 = Resample Only (Bit 8..9)
constant AA_MODE_3($00300) // VI Status/Control: AA Mode 3 = Replicate Pixels & No Interpolation (Bit 8..9)
constant DIAG_0($00400) // VI Status/Control: Diagnotic 0 (Bit 10..11)
constant DIAG_1($00800) // VI Status/Control: Diagnotic 1 (Bit 10..11)
constant PIXEL_ADV_0($00000) // VI Status/Control: Pixel Advance 0 (Bit 12..15)
constant PIXEL_ADV_1($01000) // VI Status/Control: Pixel Advance 1 (Bit 12..15)
constant PIXEL_ADV_2($02000) // VI Status/Control: Pixel Advance 2 (Bit 12..15)
constant PIXEL_ADV_3($03000) // VI Status/Control: Pixel Advance 3 (Bit 12..15)
constant PIXEL_ADV_4($04000) // VI Status/Control: Pixel Advance 4 (Bit 12..15)
constant PIXEL_ADV_5($05000) // VI Status/Control: Pixel Advance 5 (Bit 12..15)
constant PIXEL_ADV_6($06000) // VI Status/Control: Pixel Advance 6 (Bit 12..15)
constant PIXEL_ADV_7($07000) // VI Status/Control: Pixel Advance 7 (Bit 12..15)
constant PIXEL_ADV_8($08000) // VI Status/Control: Pixel Advance 8 (Bit 12..15)
constant PIXEL_ADV_9($09000) // VI Status/Control: Pixel Advance 9 (Bit 12..15)
constant PIXEL_ADV_A($0A000) // VI Status/Control: Pixel Advance A (Bit 12..15)
constant PIXEL_ADV_B($0B000) // VI Status/Control: Pixel Advance B (Bit 12..15)
constant PIXEL_ADV_C($0C000) // VI Status/Control: Pixel Advance C (Bit 12..15)
constant PIXEL_ADV_D($0D000) // VI Status/Control: Pixel Advance D (Bit 12..15)
constant PIXEL_ADV_E($0E000) // VI Status/Control: Pixel Advance E (Bit 12..15)
constant PIXEL_ADV_F($0F000) // VI Status/Control: Pixel Advance F (Bit 12..15)
constant DITHER_FILTER_EN($10000) // VI Status/Control: Dither Filter Enable (Used With 16BPP Display) (Bit 16)
macro ScreenNTSC(width,height, status, origin) {
lui a0,VI_BASE // A0 = VI Base Register ($A4400000)
li t0,{status} // T0 = Status/Control
sw t0,VI_STATUS(a0) // Store Status/Control To VI Status Register ($A4400000)
la t0,{origin} // T0 = Origin (Frame Buffer Origin In Bytes)
sw t0,VI_ORIGIN(a0) // Store Origin To VI Origin Register ($A4400004)
lli t0,{width} // T0 = Width (Frame Buffer Line Width In Pixels)
sw t0,VI_WIDTH(a0) // Store Width To VI Width Register ($A4400008)
lli t0,$200 // T0 = Vertical Interrupt (Interrupt When Current Half-Line $200)
sw t0,VI_V_INTR(a0) // Store Vertical Interrupt To VI Interrupt Register ($A440000C)
lli t0,0 // T0 = Current Vertical Line (Current Half-Line, Sampled Once Per Line = 0)
sw t0,VI_V_CURRENT_LINE(a0) // Store Current Vertical Line To VI Current Register ($A4400010)
li t0,$3E52239 // T0 = Video Timing (Start Of Color Burst In Pixels from H-Sync = 3, Vertical Sync Width In Half Lines = 229, Color Burst Width In Pixels = 34, Horizontal Sync Width In Pixels = 57)
sw t0,VI_TIMING(a0) // Store Video Timing To VI Burst Register ($A4400014)
lli t0,$20D // T0 = Vertical Sync (Number Of Half-Lines Per Field = 525)
sw t0,VI_V_SYNC(a0) // Store Vertical Sync To VI V Sync Register ($A4400018)
lli t0,$C15 // T0 = Horizontal Sync (5-bit Leap Pattern Used For PAL only = 0, Total Duration Of A Line In 1/4 Pixel = 3093)
sw t0,VI_H_SYNC(a0) // Store Horizontal Sync To VI H Sync Register ($A440001C)
li t0,$C150C15 // T0 = Horizontal Sync Leap (Identical To H Sync = 3093, Identical To H Sync = 3093)
sw t0,VI_H_SYNC_LEAP(a0) // Store Horizontal Sync Leap To VI Leap Register ($A4400020)
li t0,$6C02EC // T0 = Horizontal Video (Start Of Active Video In Screen Pixels = 108, End Of Active Video In Screen Pixels = 748)
sw t0,VI_H_VIDEO(a0) // Store Horizontal Video To VI H Start Register ($A4400024)
li t0,$2501FF // T0 = Vertical Video (Start Of Active Video In Screen Half-Lines = 37, End Of Active Video In Screen Half-Lines = 511)
sw t0,VI_V_VIDEO(a0) // Store Vertical Video To VI V Start Register ($A4400028)
li t0,$E0204 // T0 = Vertical Burst (Start Of Color Burst Enable In Half-Lines = 14, End Of Color Burst Enable In Half-Lines = 516)
sw t0,VI_V_BURST(a0) // Store Vertical Burst To VI V Burst Register ($A440002C)
lli t0,($100*({width}/160)) // T0 = X-Scale (Horizontal Subpixel Offset In 2.10 Format = 0, 1/Horizontal Scale Up Factor In 2.10 Format)
sw t0,VI_X_SCALE(a0) // Store X-Scale To VI X Scale Register ($A4400030)
lli t0,($100*({height}/60)) // T0 = Y-Scale (Vertical Subpixel Offset In 2.10 Format = 0, 1/Vertical Scale Up Factor In 2.10 Format)
sw t0,VI_Y_SCALE(a0) // Store Y-Scale To VI Y Scale Register ($A4400034)
}
macro ScreenPAL(width,height, status, origin) {
lui a0,VI_BASE // A0 = VI Base Register ($A4400000)
li t0,{status} // T0 = Status/Control
sw t0,VI_STATUS(a0) // Store Status/Control To VI Status Register ($A4400000)
la t0,{origin} // T0 = Origin (Frame Buffer Origin In Bytes)
sw t0,VI_ORIGIN(a0) // Store Origin To VI Origin Register ($A4400004)
lli t0,{width} // T0 = Width (Frame Buffer Line Width In Pixels)
sw t0,VI_WIDTH(a0) // Store Width To VI Width Register ($A4400008)
lli t0,$200 // T0 = Vertical Interrupt (Interrupt When Current Half-Line $200)
sw t0,VI_V_INTR(a0) // Store Vertical Interrupt To VI Interrupt Register ($A440000C)
lli t0,0 // T0 = Current Vertical Line (Current Half-Line, Sampled Once Per Line = 0)
sw t0,VI_V_CURRENT_LINE(a0) // Store Current Vertical Line To VI Current Register ($A4400010)
li t0,$404233A // T0 = Video Timing (Start Of Color Burst In Pixels from H-Sync = 4, Vertical Sync Width In Half Lines = 04, Color Burst Width In Pixels = 35, Horizontal Sync Width In Pixels = 58)
sw t0,VI_TIMING(a0) // Store Video Timing To VI Burst Register ($A4400014)
lli t0,$271 // T0 = Vertical Sync (Number Of Half-Lines Per Field = 625)
sw t0,VI_V_SYNC(a0) // Store Vertical Sync To VI V Sync Register ($A4400018)
li t0,$150C69 // T0 = Horizontal Sync (5-bit Leap Pattern Used For PAL only = 21: %10101, Total Duration Of A Line In 1/4 Pixel = 3177)
sw t0,VI_H_SYNC(a0) // Store Horizontal Sync To VI H Sync Register ($A440001C)
li t0,$C6F0C6E // T0 = Horizontal Sync Leap (Identical To H Sync = 3183, Identical To H Sync = 3182)
sw t0,VI_H_SYNC_LEAP(a0) // Store Horizontal Sync Leap To VI Leap Register ($A4400020)
li t0,$800300 // T0 = Horizontal Video (Start Of Active Video In Screen Pixels = 128, End Of Active Video In Screen Pixels = 768)
sw t0,VI_H_VIDEO(a0) // Store Horizontal Video To VI H Start Register ($A4400024)
li t0,$5F0239 // T0 = Vertical Video (Start Of Active Video In Screen Half-Lines = 95, End Of Active Video In Screen Half-Lines = 569)
sw t0,VI_V_VIDEO(a0) // Store Vertical Video To VI V Start Register ($A4400028)
li t0,$9026B // T0 = Vertical Burst (Start Of Color Burst Enable In Half-Lines = 9, End Of Color Burst Enable In Half-Lines = 619)
sw t0,VI_V_BURST(a0) // Store Vertical Burst To VI V Burst Register ($A440002C)
lli t0,($100*({width}/160)) // T0 = X-Scale (Horizontal Subpixel Offset In 2.10 Format = 0, 1/Horizontal Scale Up Factor In 2.10 Format)
sw t0,VI_X_SCALE(a0) // Store X-Scale To VI X Scale Register ($A4400030)
lli t0,($100*({height}/60)) // T0 = Y-Scale (Vertical Subpixel Offset In 2.10 Format = 0, 1/Vertical Scale Up Factor In 2.10 Format)
sw t0,VI_Y_SCALE(a0) // Store Y-Scale To VI Y Scale Register ($A4400034)
}
macro WaitScanline(scanline) { // Wait For RDP To Reach Scanline
lui a0,VI_BASE // A0 = VI Base Register ($A4400000)
lli t0,{scanline} // T0 = Scan Line
-
lw t1,VI_V_CURRENT_LINE(a0) // T1 = Current Scan Line
bne t1,t0,- // IF (Current Scan Line != Scan Line) Wait
nop // ELSE Continue (Delay Slot)
}
// RDP Commands
macro DPC(start,end) { // Run DPC Command Buffer: Start Address, End Address
lui a0,DPC_BASE // A0 = Reality Display Processer Control Interface Base Register ($A4100000)
la a1,{start} // A1 = DPC Command Start Address
sw a1,DPC_START(a0) // Store DPC Command Start Address To DP Start Register ($A4100000)
la a1,{end} // A1 = DPC Command End Address
sw a1,DPC_END(a0) // Store DPC Command End Address To DP End Register ($A4100004)
}
// No_Op: No Effect On RDP Command Execution, Useful For Padding Command Buffers
// Fill_Triangle: lft,level,tile,yl,ym,yh, xl,xlf,dxldy,dxldyf, xh,xhf,dxhdy,dxhdyf, xm,xmf,dxmdy,dxmdyf
// Word 0: Left Major Flag (0=Left Major, 1=Right Major), Number Of Mip-Maps Minus One, Tile ID, Y Coordinate Of Low, Mid Minor, Major Edge (Fixed Point S.11.2)
// Word 1: X Coordinate Of Low Edge Integer, Fraction, DxLDy Inverse Slope Of Low Edge Integer, Fraction
// Word 2: X Coordinate Of Major Edge Integer, Fraction, DxHDy Inverse Slope Of Major Edge Integer, Fraction
// Word 3: X Coordinate Of Middle Edge Integer, Fraction, DxMDy Inverse Slope Of Middle Edge Integer, Fraction
// Fill_ZBuffer_Triangle: lft,level,tile,yl,ym,yh, xl,xlf,dxldy,dxldyf, xh,xhf,dxhdy,dxhdyf, xm,xmf,dxmdy,dxmdyf
// Word 0: Left Major Flag (0=Left Major, 1=Right Major), Number Of Mip-Maps Minus One, Tile ID, Y Coordinate Of Low, Mid Minor, Major Edge (Fixed Point S.11.2)
// Word 1: X Coordinate Of Low Edge Integer, Fraction, DxLDy Inverse Slope Of Low Edge Integer, Fraction
// Word 2: X Coordinate Of Major Edge Integer, Fraction, DxHDy Inverse Slope Of Major Edge Integer, Fraction
// Word 3: X Coordinate Of Middle Edge Integer, Fraction, DxMDy Inverse Slope Of Middle Edge Integer, Fraction
// Word 4: Z Inverse Depth Integer, Fraction, DzDx Change In Z Per Change In X Coordinate Integer, Fraction (ZBuffer Coefficients)
// Word 5: DzDe Change In Z Along Major Edge Integer, Fraction, DzDy Change In Z Per Change In Y Coordinate Integer, Fraction
// Texture_Triangle: lft,level,tile,yl,ym,yh, xl,xlf,dxldy,dxldyf, xh,xhf,dxhdy,dxhdyf, xm,xmf,dxmdy,dxmdyf
// Word 0: Left Major Flag (0=Left Major, 1=Right Major), Number Of Mip-Maps Minus One, Tile ID, Y Coordinate Of Low, Mid Minor, Major Edge (Fixed Point S.11.2)
// Word 1: X Coordinate Of Low Edge Integer, Fraction, DxLDy Inverse Slope Of Low Edge Integer, Fraction
// Word 2: X Coordinate Of Major Edge Integer, Fraction, DxHDy Inverse Slope Of Major Edge Integer, Fraction
// Word 3: X Coordinate Of Middle Edge Integer, Fraction, DxMDy Inverse Slope Of Middle Edge Integer, Fraction
// Word 4: S Texture Coordinate Integer, T Texture Coordinate Integer, W Normalized Inverse Depth Integer (Texture Coefficients)
// Word 5: DsDx Change In S, DtDx Change In T, DwDx Change In W Per Change In X Coordinate Integer
// Word 6: S Texture Coordinate Fraction, T Texture Coordinate Fraction, W Normalized Inverse Depth Fraction
// Word 7: DsDx Change In S, DtDx Change In T, DwDx Change In W Per Change In X Coordinate Fraction
// Word 8: DsDe Change In S, DtDe Change In T, DwDe Change In W Along The Edge Integer
// Word 9: DsDy Change In S, DtDy Change In T, DwDy Change In W Per Change In Y Coordinate Integer
// Word 10: DsDe Change In S, DtDe Change In T, DwDe Change In W Along The Edge Fraction
// Word 11: DsDy Change In S, DtDy Change In T, DwDy Change In W Per Change In Y Coordinate Fraction
// Texture_ZBuffer_Triangle: lft,level,tile,yl,ym,yh, xl,xlf,dxldy,dxldyf, xh,xhf,dxhdy,dxhdyf, xm,xmf,dxmdy,dxmdyf
// Word 0: Left Major Flag (0=Left Major, 1=Right Major), Number Of Mip-Maps Minus One, Tile ID, Y Coordinate Of Low, Mid Minor, Major Edge (Fixed Point S.11.2)
// Word 1: X Coordinate Of Low Edge Integer, Fraction, DxLDy Inverse Slope Of Low Edge Integer, Fraction
// Word 2: X Coordinate Of Major Edge Integer, Fraction, DxHDy Inverse Slope Of Major Edge Integer, Fraction
// Word 3: X Coordinate Of Middle Edge Integer, Fraction, DxMDy Inverse Slope Of Middle Edge Integer, Fraction
// Word 4: S Texture Coordinate Integer, T Texture Coordinate Integer, W Normalized Inverse Depth Integer (Texture Coefficients)
// Word 5: DsDx Change In S, DtDx Change In T, DwDx Change In W Per Change In X Coordinate Integer
// Word 6: S Texture Coordinate Fraction, T Texture Coordinate Fraction, W Normalized Inverse Depth Fraction
// Word 7: DsDx Change In S, DtDx Change In T, DwDx Change In W Per Change In X Coordinate Fraction
// Word 8: DsDe Change In S, DtDe Change In T, DwDe Change In W Along The Edge Integer
// Word 9: DsDy Change In S, DtDy Change In T, DwDy Change In W Per Change In Y Coordinate Integer
// Word 10: DsDe Change In S, DtDe Change In T, DwDe Change In W Along The Edge Fraction
// Word 11: DsDy Change In S, DtDy Change In T, DwDy Change In W Per Change In Y Coordinate Fraction
// Word 12: Z Inverse Depth Integer, Fraction, DzDx Change In Z Per Change In X Coordinate Integer, Fraction (ZBuffer Coefficients)
// Word 13: DzDe Change In Z Along Major Edge Integer, Fraction, DzDy Change In Z Per Change In Y Coordinate Integer, Fraction
// Shade_Triangle: lft,level,tile,yl,ym,yh, xl,xlf,dxldy,dxldyf, xh,xhf,dxhdy,dxhdyf, xm,xmf,dxmdy,dxmdyf
// Word 0: Left Major Flag (0=Left Major, 1=Right Major), Number Of Mip-Maps Minus One, Tile ID, Y Coordinate Of Low, Mid Minor, Major Edge (Fixed Point S.11.2)
// Word 1: X Coordinate Of Low Edge Integer, Fraction, DxLDy Inverse Slope Of Low Edge Integer, Fraction
// Word 2: X Coordinate Of Major Edge Integer, Fraction, DxHDy Inverse Slope Of Major Edge Integer, Fraction
// Word 3: X Coordinate Of Middle Edge Integer, Fraction, DxMDy Inverse Slope Of Middle Edge Integer, Fraction
// Word 4: Red Color Component Integer, Green Color Component Integer, Blue Color Component Integer, Alpha Color Component Integer (Shade Coefficients)
// Word 5: DrDx Change In Red, DgDx Change In Green, DbDx Change In Blue, DaDx Change In Alpha Per Change In X Coordinate Integer
// Word 6: Red Color Component Fraction, Green Color Component Fraction, Blue Color Component Fraction, Alpha Color Component Fraction
// Word 7: DrDx Change In Red, DgDx Change In Green, DbDx Change In Blue, DaDx Change In Alpha Per Change In X Coordinate Fraction
// Word 8: DrDe Change In Red, DgDe Change In Green, DbDe Change In Blue, DaDe Change In Alpha Along The Edge Integer
// Word 9: DrDy Change In Red, DgDy Change In Green, DbDy Change In Blue, DaDy Change In Alpha Per Change In Y Coordinate Integer
// Word 10: DrDe Change In Red, DgDe Change In Green, DbDe Change In Blue, DaDe Change In Alpha Along The Edge Fraction
// Word 11: DrDy Change In Red, DgDy Change In Green, DbDy Change In Blue, DaDy Change In Alpha Per Change In Y Coordinate Fraction
// Shade_ZBuffer_Triangle: lft,level,tile,yl,ym,yh, xl,xlf,dxldy,dxldyf, xh,xhf,dxhdy,dxhdyf, xm,xmf,dxmdy,dxmdyf
// Word 0: Left Major Flag (0=Left Major, 1=Right Major), Number Of Mip-Maps Minus One, Tile ID, Y Coordinate Of Low, Mid Minor, Major Edge (Fixed Point S.11.2)
// Word 1: X Coordinate Of Low Edge Integer, Fraction, DxLDy Inverse Slope Of Low Edge Integer, Fraction
// Word 2: X Coordinate Of Major Edge Integer, Fraction, DxHDy Inverse Slope Of Major Edge Integer, Fraction
// Word 3: X Coordinate Of Middle Edge Integer, Fraction, DxMDy Inverse Slope Of Middle Edge Integer, Fraction
// Word 4: Red Color Component Integer, Green Color Component Integer, Blue Color Component Integer, Alpha Color Component Integer (Shade Coefficients)
// Word 5: DrDx Change In Red, DgDx Change In Green, DbDx Change In Blue, DaDx Change In Alpha Per Change In X Coordinate Integer
// Word 6: Red Color Component Fraction, Green Color Component Fraction, Blue Color Component Fraction, Alpha Color Component Fraction
// Word 7: DrDx Change In Red, DgDx Change In Green, DbDx Change In Blue, DaDx Change In Alpha Per Change In X Coordinate Fraction
// Word 8: DrDe Change In Red, DgDe Change In Green, DbDe Change In Blue, DaDe Change In Alpha Along The Edge Integer
// Word 9: DrDy Change In Red, DgDy Change In Green, DbDy Change In Blue, DaDy Change In Alpha Per Change In Y Coordinate Integer
// Word 10: DrDe Change In Red, DgDe Change In Green, DbDe Change In Blue, DaDe Change In Alpha Along The Edge Fraction
// Word 11: DrDy Change In Red, DgDy Change In Green, DbDy Change In Blue, DaDy Change In Alpha Per Change In Y Coordinate Fraction
// Word 12: Z Inverse Depth Integer, Fraction, DzDx Change In Z Per Change In X Coordinate Integer, Fraction (ZBuffer Coefficients)
// Word 13: DzDe Change In Z Along Major Edge Integer, Fraction, DzDy Change In Z Per Change In Y Coordinate Integer, Fraction
// Shade_Texture_Triangle: lft,level,tile,yl,ym,yh, xl,xlf,dxldy,dxldyf, xh,xhf,dxhdy,dxhdyf, xm,xmf,dxmdy,dxmdyf
// Word 0: Left Major Flag (0=Left Major, 1=Right Major), Number Of Mip-Maps Minus One, Tile ID, Y Coordinate Of Low, Mid Minor, Major Edge (Fixed Point S.11.2)
// Word 1: X Coordinate Of Low Edge Integer, Fraction, DxLDy Inverse Slope Of Low Edge Integer, Fraction
// Word 2: X Coordinate Of Major Edge Integer, Fraction, DxHDy Inverse Slope Of Major Edge Integer, Fraction
// Word 3: X Coordinate Of Middle Edge Integer, Fraction, DxMDy Inverse Slope Of Middle Edge Integer, Fraction
// Word 4: Red Color Component Integer, Green Color Component Integer, Blue Color Component Integer, Alpha Color Component Integer (Shade Coefficients)
// Word 5: DrDx Change In Red, DgDx Change In Green, DbDx Change In Blue, DaDx Change In Alpha Per Change In X Coordinate Integer
// Word 6: Red Color Component Fraction, Green Color Component Fraction, Blue Color Component Fraction, Alpha Color Component Fraction
// Word 7: DrDx Change In Red, DgDx Change In Green, DbDx Change In Blue, DaDx Change In Alpha Per Change In X Coordinate Fraction
// Word 8: DrDe Change In Red, DgDe Change In Green, DbDe Change In Blue, DaDe Change In Alpha Along The Edge Integer
// Word 9: DrDy Change In Red, DgDy Change In Green, DbDy Change In Blue, DaDy Change In Alpha Per Change In Y Coordinate Integer
// Word 10: DrDe Change In Red, DgDe Change In Green, DbDe Change In Blue, DaDe Change In Alpha Along The Edge Fraction
// Word 11: DrDy Change In Red, DgDy Change In Green, DbDy Change In Blue, DaDy Change In Alpha Per Change In Y Coordinate Fraction
// Word 12: S Texture Coordinate Integer, T Texture Coordinate Integer, W Normalized Inverse Depth Integer (Texture Coefficients)
// Word 13: DsDx Change In S, DtDx Change In T, DwDx Change In W Per Change In X Coordinate Integer
// Word 14: S Texture Coordinate Fraction, T Texture Coordinate Fraction, W Normalized Inverse Depth Fraction
// Word 15: DsDx Change In S, DtDx Change In T, DwDx Change In W Per Change In X Coordinate Fraction
// Word 16: DsDe Change In S, DtDe Change In T, DwDe Change In W Along The Edge Integer
// Word 17: DsDy Change In S, DtDy Change In T, DwDy Change In W Per Change In Y Coordinate Integer
// Word 18: DsDe Change In S, DtDe Change In T, DwDe Change In W Along The Edge Fraction
// Word 19: DsDy Change In S, DtDy Change In T, DwDy Change In W Per Change In Y Coordinate Fraction
// Shade_Texture_Z_Buffer_Triangle: lft,level,tile,yl,ym,yh, xl,xlf,dxldy,dxldyf, xh,xhf,dxhdy,dxhdyf, xm,xmf,dxmdy,dxmdyf
// Word 0: Left Major Flag (0=Left Major, 1=Right Major), Number Of Mip-Maps Minus One, Tile ID, Y Coordinate Of Low, Mid Minor, Major Edge (Fixed Point S.11.2)
// Word 1: X Coordinate Of Low Edge Integer, Fraction, DxLDy Inverse Slope Of Low Edge Integer, Fraction
// Word 2: X Coordinate Of Major Edge Integer, Fraction, DxHDy Inverse Slope Of Major Edge Integer, Fraction
// Word 3: X Coordinate Of Middle Edge Integer, Fraction, DxMDy Inverse Slope Of Middle Edge Integer, Fraction
// Word 4: Red Color Component Integer, Green Color Component Integer, Blue Color Component Integer, Alpha Color Component Integer (Shade Coefficients)
// Word 5: DrDx Change In Red, DgDx Change In Green, DbDx Change In Blue, DaDx Change In Alpha Per Change In X Coordinate Integer
// Word 6: Red Color Component Fraction, Green Color Component Fraction, Blue Color Component Fraction, Alpha Color Component Fraction
// Word 7: DrDx Change In Red, DgDx Change In Green, DbDx Change In Blue, DaDx Change In Alpha Per Change In X Coordinate Fraction
// Word 8: DrDe Change In Red, DgDe Change In Green, DbDe Change In Blue, DaDe Change In Alpha Along The Edge Integer
// Word 9: DrDy Change In Red, DgDy Change In Green, DbDy Change In Blue, DaDy Change In Alpha Per Change In Y Coordinate Integer
// Word 10: DrDe Change In Red, DgDe Change In Green, DbDe Change In Blue, DaDe Change In Alpha Along The Edge Fraction
// Word 11: DrDy Change In Red, DgDy Change In Green, DbDy Change In Blue, DaDy Change In Alpha Per Change In Y Coordinate Fraction
// Word 12: S Texture Coordinate Integer, T Texture Coordinate Integer, W Normalized Inverse Depth Integer (Texture Coefficients)
// Word 13: DsDx Change In S, DtDx Change In T, DwDx Change In W Per Change In X Coordinate Integer
// Word 14: S Texture Coordinate Fraction, T Texture Coordinate Fraction, W Normalized Inverse Depth Fraction
// Word 15: DsDx Change In S, DtDx Change In T, DwDx Change In W Per Change In X Coordinate Fraction
// Word 16: DsDe Change In S, DtDe Change In T, DwDe Change In W Along The Edge Integer
// Word 17: DsDy Change In S, DtDy Change In T, DwDy Change In W Per Change In Y Coordinate Integer
// Word 18: DsDe Change In S, DtDe Change In T, DwDe Change In W Along The Edge Fraction
// Word 19: DsDy Change In S, DtDy Change In T, DwDy Change In W Per Change In Y Coordinate Fraction
// Word 20: Z Inverse Depth Integer, Fraction, DzDx Change In Z Per Change In X Coordinate Integer, Fraction (ZBuffer Coefficients)
// Word 21: DzDe Change In Z Along Major Edge Integer, Fraction, DzDy Change In Z Per Change In Y Coordinate Integer, Fraction
// Shade_Coefficients: r,g,b,a, drdx,dgdx,dbdx,dadx, rf,gf,bf,af, drdxf,dgdxf,dbdxf,dadxf, drde,dgde,dbde,dade, drdy,dgdy,dbdy,dady, drdef,dgdef,dbdef,dadef, drdyf,dgdyf,dbdyf,dadyf
// Word 0: Red Color Component Integer, Green Color Component Integer, Blue Color Component Integer, Alpha Color Component Integer (Shade Coefficients)
// Word 1: DrDx Change In Red, DgDx Change In Green, DbDx Change In Blue, DaDx Change In Alpha Per Change In X Coordinate Integer
// Word 2: Red Color Component Fraction, Green Color Component Fraction, Blue Color Component Fraction, Alpha Color Component Fraction
// Word 3: DrDx Change In Red, DgDx Change In Green, DbDx Change In Blue, DaDx Change In Alpha Per Change In X Coordinate Fraction
// Word 4: DrDe Change In Red, DgDe Change In Green, DbDe Change In Blue, DaDe Change In Alpha Along The Edge Integer
// Word 5: DrDy Change In Red, DgDy Change In Green, DbDy Change In Blue, DaDy Change In Alpha Per Change In Y Coordinate Integer
// Word 6: DrDe Change In Red, DgDe Change In Green, DbDe Change In Blue, DaDe Change In Alpha Along The Edge Fraction
// Word 7: DrDy Change In Red, DgDy Change In Green, DbDy Change In Blue, DaDy Change In Alpha Per Change In Y Coordinate Fraction
// Texture_Coefficients: s,t,w, dsdx,dtdx,dwdx, sf,tf,wf, dsdxf,dtdxf,dwdxf, dsde,dtde,dwde, dsdy,dtdy,dwdy, dsdef,dtdef,dwdef, dsdyf,dtdyf,dwdyf
// Word 0: S Texture Coordinate Integer, T Texture Coordinate Integer, W Normalized Inverse Depth Integer
// Word 1: DsDx Change In S, DtDx Change In T, DwDx Change In W Per Change In X Coordinate Integer
// Word 2: S Texture Coordinate Fraction, T Texture Coordinate Fraction, W Normalized Inverse Depth Fraction
// Word 3: DsDx Change In S, DtDx Change In T, DwDx Change In W Per Change In X Coordinate Fraction
// Word 4: DsDe Change In S, DtDe Change In T, DwDe Change In W Along The Edge Integer
// Word 5: DsDy Change In S, DtDy Change In T, DwDy Change In W Per Change In Y Coordinate Integer
// Word 6: DsDe Change In S, DtDe Change In T, DwDe Change In W Along The Edge Fraction
// Word 7: DsDy Change In S, DtDy Change In T, DwDy Change In W Per Change In Y Coordinate Fraction
// ZBuffer_Coefficients: z,zf,dzdx,dzdxf, dzde,dzdef,dzdy,dzdyf
// Word 0: Z Inverse Depth Integer, Fraction, DzDx Change In Z Per Change In X Coordinate Integer, Fraction (ZBuffer Coefficients)
// Word 1: DzDe Change In Z Along Major Edge Integer, Fraction, DzDy Change In Z Per Change In Y Coordinate Integer, Fraction
// Texture_Rectangle: xl,yl, tile, xh,yh, s,t, dsdx,dtdy
// Word 0: Bottom Right X/Y, Tile ID, Top Left X/Y (Fixed Point 10.2)
// Word 1: S/T Texture Coordinate Top Left (Fixed Point S.10.5), DsDx Change In S Per Change In X, DtDy Change In T Per Change In Y (Fixed Point S.5.10)
// Texture_Rectangle_Flip: xl,yl, tile, xh,yh, s,t, dsdx,dtdy ; Same As Texture Rectangle Except Hardware Swaps S/T & DsDx/DtDy
// Word 0: Bottom Right X/Y, Tile ID, Top Left X/Y (Fixed Point 10.2)
// Word 1: S/T Texture Coordinate Top Left (Fixed Point S.10.5), DsDx Change In S Per Change In X, DtDy Change In T Per Change In Y (Fixed Point S.5.10)
// Sync_Load: Stall Execution Of Load Commands, Until Preceeding Primitives Completely Finish (Usually Preceed Load Commands)
// Sync_Pipe: Stall Pipeline, Until Preceeding Primitives Completely Finish (Software Can Optimize Usage)
// Sync_Tile: Allows Synchronization Between Commands That Write To The Same Tile Descriptor That An Immediately Previous Command Is Reading
// Sync_Full: Stall RDP Until Last DRAM Buffer Is Read Or Written From Any Preceeding Primitive (Needed If Memory Is To Be Reused)
// Set_Key_GB: wg,wb,cg,sg,cb,sb ; Set The Coefficients Used For Green/Blue Keying, KEY G/B = CLAMP(0.0, -ABS((G/B - CENTER)* SCALE) + WIDTH, 1.0) KEY ALPHA = MINIMUM OF KEY R/G/B
// Word: WIDTH G/B (Size Of Half Key Window Including Soft Edge)*SCALE, CENTER G/B Defines Color Or Intensity At Which Key Is Active (0..255), SCALE GB 1.0/(SIZE OF SOFT EDGE) (0..255)
// Set_Key_R: wr,cr,sr ; Set The Coefficients Used For Red Keying, KEY R = CLAMP(0.0, -ABS((R - CENTER)* SCALE) + WIDTH, 1.0) KEY ALPHA = MINIMUM OF KEY R/G/B
// Word: WIDTH R (Size Of Half Key Window Including Soft Edge)*SCALE, CENTER R Defines Color Or Intensity At Which Key Is Active (0..255), SCALE R 1.0/(SIZE OF SOFT EDGE) (0..255)
// Set_Convert: k0,k1,k2,k3,k4,k5 ; Updates The Coefficients For Converting YUV Pixels To RGB, R = C0*(Y-16)+C1*V, G = C0*(Y-16)+C2*U-C3*V, B = C0*(Y-16)+C4*U
// Word: K0, K1, K2, K3, K4, K5 Term Of YUV-RGB Conversion Matrix
// Set_Scissor: xh,yh,xl,yl,lo ; Set The Scissoring Of Primitives
// Word: Top Left X/Y, Bottom Right X/Y (Fixed Point 10.2), Scissor Field Enable & Scissor Field Even/Odd
constant SCISSOR_EVEN(0) // Set_Scissor O: Field Even (Bit 24)
constant SCISSOR_ODD(1) // Set_Scissor O: Field Odd (Bit 24)
constant SCISSOR_FIELD(1) // Set_Scissor F: Scissor Field Enable (Bit 25)
// Set_Prim_Depth: pz,pdz ; Set The Depth Of Primitives
// Word: Primitive Z Depth, Primitive Delta Z Depth
// Set_Other_Modes: Settings ; Set The Other Modes
// Set_Other_Modes LO Word
constant ALPHA_COMPARE_EN($00000000000001) // Set_Other_Modes A: Conditional Color Write On Alpha Compare (Bit 0)
constant DITHER_ALPHA_EN($00000000000002) // Set_Other_Modes B: Use Random Noise In Alpha Compare, Otherwise Use Blend Alpha In Alpha Compare (Bit 1)
constant Z_SOURCE_SEL($00000000000004) // Set_Other_Modes C: Choose Between Primitive Z And Pixel Z (Bit 2)
constant ANTIALIAS_EN($00000000000008) // Set_Other_Modes D: If Not Force Blend, Allow Blend Enable - Use CVG Bits (Bit 3)
constant Z_COMPARE_EN($00000000000010) // Set_Other_Modes E: Conditional Color Write Enable On Depth Comparison (Bit 4)
constant Z_UPDATE_EN($00000000000020) // Set_Other_Modes F: Enable Writing Of Z If Color Write Enabled (Bit 5)
constant IMAGE_READ_EN($00000000000040) // Set_Other_Modes G: Enable Color/CVG Read/Modify/Write Memory Access (Bit 6)
constant COLOR_ON_CVG($00000000000080) // Set_Other_Modes H: Only Update Color On Coverage Overflow (Transparent Surfaces) (Bit 7)
constant CVG_DEST_CLAMP($00000000000000) // Set_Other_Modes I: CVG Destination Clamp (Normal) (Bit 8..9)
constant CVG_DEST_WRAP($00000000000100) // Set_Other_Modes I: CVG Destination Wrap (WAS Assume Full CVG) (Bit 8..9)
constant CVG_DEST_ZAP($00000000000200) // Set_Other_Modes I: CVG Destination Zap (Force To Full CVG) (Bit 8..9)
constant CVG_DEST_SAVE($00000000000300) // Set_Other_Modes I: CVG Destination Save (Don't Overwrite Memory CVG) (Bit 8..9)
constant Z_MODE_OPAQUE($00000000000000) // Set_Other_Modes J: Z Mode Opaque (Bit 10..11)
constant Z_MODE_INTERPENETRATING($00000000000400) // Set_Other_Modes J: Z Mode Interpenetrating (Bit 10..11)
constant Z_MODE_TRANSPARENT($00000000000800) // Set_Other_Modes J: Z Mode Transparent (Bit 10..11)
constant Z_MODE_DECAL($00000000000C00) // Set_Other_Modes J: Z Mode Decal (Bit 10..11)
constant CVG_TIMES_ALPHA($00000000001000) // Set_Other_Modes K: Use CVG Times Alpha For Pixel Alpha And Coverage (Bit 12)
constant ALPHA_CVG_SELECT($00000000002000) // Set_Other_Modes L: Use CVG (Or CVG*Alpha) For Pixel Alpha (Bit 13)
constant FORCE_BLEND($00000000004000) // Set_Other_Modes M: Force Blend Enable (Bit 14)
//*RESERVED*($00000000008000) // Set_Other_Modes N: This Mode Bit Is Not Currently Used, But May Be In The Future (Bit 15)
constant B_M2B_1_0($00000000000000) // Set_Other_Modes O: Blend Modeword, Multiply 2b Input Select 0, Cycle 1 (Bit 16..17)
constant B_M2B_1_1($00000000010000) // Set_Other_Modes O: Blend Modeword, Multiply 2b Input Select 1, Cycle 1 (Bit 16..17)
constant B_M2B_1_2($00000000020000) // Set_Other_Modes O: Blend Modeword, Multiply 2b Input Select 2, Cycle 1 (Bit 16..17)
constant B_M2B_1_3($00000000030000) // Set_Other_Modes O: Blend Modeword, Multiply 2b Input Select 3, Cycle 1 (Bit 16..17)
constant B_M2B_0_0($00000000000000) // Set_Other_Modes P: Blend Modeword, Multiply 2b Input Select 0, Cycle 0 (Bit 18..19)
constant B_M2B_0_1($00000000040000) // Set_Other_Modes P: Blend Modeword, Multiply 2b Input Select 1, Cycle 0 (Bit 18..19)
constant B_M2B_0_2($00000000080000) // Set_Other_Modes P: Blend Modeword, Multiply 2b Input Select 2, Cycle 0 (Bit 18..19)
constant B_M2B_0_3($000000000C0000) // Set_Other_Modes P: Blend Modeword, Multiply 2b Input Select 3, Cycle 0 (Bit 18..19)
constant B_M2A_1_0($00000000000000) // Set_Other_Modes Q: Blend Modeword, Multiply 2a Input Select 0, Cycle 1 (Bit 20..21)
constant B_M2A_1_1($00000000100000) // Set_Other_Modes Q: Blend Modeword, Multiply 2a Input Select 1, Cycle 1 (Bit 20..21)
constant B_M2A_1_2($00000000200000) // Set_Other_Modes Q: Blend Modeword, Multiply 2a Input Select 2, Cycle 1 (Bit 20..21)
constant B_M2A_1_3($00000000300000) // Set_Other_Modes Q: Blend Modeword, Multiply 2a Input Select 3, Cycle 1 (Bit 20..21)
constant B_M2A_0_0($00000000000000) // Set_Other_Modes R: Blend Modeword, Multiply 2a Input Select 0, Cycle 0 (Bit 22..23)
constant B_M2A_0_1($00000000400000) // Set_Other_Modes R: Blend Modeword, Multiply 2a Input Select 1, Cycle 0 (Bit 22..23)
constant B_M2A_0_2($00000000800000) // Set_Other_Modes R: Blend Modeword, Multiply 2a Input Select 2, Cycle 0 (Bit 22..23)
constant B_M2A_0_3($00000000C00000) // Set_Other_Modes R: Blend Modeword, Multiply 2a Input Select 3, Cycle 0 (Bit 22..23)
constant B_M1B_1_0($00000000000000) // Set_Other_Modes S: Blend Modeword, Multiply 1b Input Select 0, Cycle 1 (Bit 24..25)
constant B_M1B_1_1($00000001000000) // Set_Other_Modes S: Blend Modeword, Multiply 1b Input Select 1, Cycle 1 (Bit 24..25)
constant B_M1B_1_2($00000002000000) // Set_Other_Modes S: Blend Modeword, Multiply 1b Input Select 2, Cycle 1 (Bit 24..25)
constant B_M1B_1_3($00000003000000) // Set_Other_Modes S: Blend Modeword, Multiply 1b Input Select 3, Cycle 1 (Bit 24..25)
constant B_M1B_0_0($00000000000000) // Set_Other_Modes T: Blend Modeword, Multiply 1b Input Select 0, Cycle 0 (Bit 26..27)
constant B_M1B_0_1($00000004000000) // Set_Other_Modes T: Blend Modeword, Multiply 1b Input Select 1, Cycle 0 (Bit 26..27)
constant B_M1B_0_2($00000008000000) // Set_Other_Modes T: Blend Modeword, Multiply 1b Input Select 2, Cycle 0 (Bit 26..27)
constant B_M1B_0_3($0000000C000000) // Set_Other_Modes T: Blend Modeword, Multiply 1b Input Select 3, Cycle 0 (Bit 26..27)
constant B_M1A_1_0($00000000000000) // Set_Other_Modes U: Blend Modeword, Multiply 1a Input Select 0, Cycle 1 (Bit 28..29)
constant B_M1A_1_1($00000010000000) // Set_Other_Modes U: Blend Modeword, Multiply 1a Input Select 1, Cycle 1 (Bit 28..29)
constant B_M1A_1_2($00000020000000) // Set_Other_Modes U: Blend Modeword, Multiply 1a Input Select 2, Cycle 1 (Bit 28..29)
constant B_M1A_1_3($00000030000000) // Set_Other_Modes U: Blend Modeword, Multiply 1a Input Select 3, Cycle 1 (Bit 28..29)
constant B_M1A_0_0($00000000000000) // Set_Other_Modes V: Blend Modeword, Multiply 1a Input Select 0, Cycle 0 (Bit 30..31)
constant B_M1A_0_1($00000040000000) // Set_Other_Modes V: Blend Modeword, Multiply 1a Input Select 1, Cycle 0 (Bit 30..31)
constant B_M1A_0_2($00000080000000) // Set_Other_Modes V: Blend Modeword, Multiply 1a Input Select 2, Cycle 0 (Bit 30..31)
constant B_M1A_0_3($000000C0000000) // Set_Other_Modes V: Blend Modeword, Multiply 1a Input Select 3, Cycle 0 (Bit 30..31)
// Set_Other_Modes HI Word
//*RESERVED*($00000F00000000) // Set_Other_Modes: Reserved For Future Use, Default Value Is $F (Bit 32..35)
constant ALPHA_DITHER_SEL_PATTERN($00000000000000) // Set_Other_Modes V1: Alpha Dither Selection Pattern (Bit 36..37)
constant ALPHA_DITHER_SEL_PATTERNB($00001000000000) // Set_Other_Modes V1: Alpha Dither Selection ~Pattern (Bit 36..37)
constant ALPHA_DITHER_SEL_NOISE($00002000000000) // Set_Other_Modes V1: Alpha Dither Selection Noise (Bit 36..37)
constant ALPHA_DITHER_SEL_NO_DITHER($00003000000000) // Set_Other_Modes V1: Alpha Dither Selection No Dither (Bit 36..37)
constant RGB_DITHER_SEL_MAGIC_SQUARE_MATRIX($00000000000000) // Set_Other_Modes V2: RGB Dither Selection Magic Square Matrix (Preferred If Filtered) (Bit 38..39)
constant RGB_DITHER_SEL_STANDARD_BAYER_MATRIX($00004000000000) // Set_Other_Modes V2: RGB Dither Selection Standard Bayer Matrix (Preferred If Not Filtered) (Bit 38..39)
constant RGB_DITHER_SEL_NOISE($00008000000000) // Set_Other_Modes V2: RGB Dither Selection Noise (As Before) (Bit 38..39)
constant RGB_DITHER_SEL_NO_DITHER($0000C000000000) // Set_Other_Modes V2: RGB Dither Selection No Dither (Bit 38..39)
constant KEY_EN($00010000000000) // Set_Other_Modes W: Enables Chroma Keying (Bit 40)
constant CONVERT_ONE($00020000000000) // Set_Other_Modes X: Color Convert Texel That Was The Ouput Of The Texture Filter On Cycle0, Used To Qualify BI_LERP_1 (Bit 41)
constant BI_LERP_1($00040000000000) // Set_Other_Modes Y: 1=BI_LERP, 0=Color Convert Operation In Texture Filter. Used In Cycle 1 (Bit 42)
constant BI_LERP_0($00080000000000) // Set_Other_Modes Z: 1=BI_LERP, 0=Color Convert Operation In Texture Filter. Used In Cycle 0 (Bit 43)
constant MID_TEXEL($00100000000000) // Set_Other_Modes a: Indicates Texture Filter Should Do A 2x2 Half Texel Interpolation, Primarily Used For MPEG Motion Compensation Processing (Bit 44)
constant SAMPLE_TYPE($00200000000000) // Set_Other_Modes b: Determines How Textures Are Sampled: 0=1x1 (Point Sample), 1=2x2. Note That Copy (Point Sample 4 Horizontally Adjacent Texels) Mode Is Indicated By CYCLE_TYPE (Bit 45)
constant TLUT_TYPE($00400000000000) // Set_Other_Modes c: Type Of Texels In Table, 0=16b RGBA(5/5/5/1), 1=IA(8/8) (Bit 46)
constant EN_TLUT($00800000000000) // Set_Other_Modes d: Enable Lookup Of Texel Values From TLUT. Meaningful If Texture Type Is Index, Tile Is In Low TMEM, TLUT Is In High TMEM, And Color Image Is RGB (Bit 47)
constant TEX_LOD_EN($01000000000000) // Set_Other_Modes e: Enable Texture Level Of Detail (LOD) (Bit 48)
constant SHARPEN_TEX_EN($02000000000000) // Set_Other_Modes f: Enable Sharpened Texture (Bit 49)
constant DETAIL_TEX_EN($04000000000000) // Set_Other_Modes g: Enable Detail Texture (Bit 50)
constant PERSP_TEX_EN($08000000000000) // Set_Other_Modes h: Enable Perspective Correction On Texture (Bit 51)
constant CYCLE_TYPE_1_CYCLE($00000000000000) // Set_Other_Modes i: Display Pipeline Cycle Control Mode 1 Cycle (Bit 52..53)
constant CYCLE_TYPE_2_CYCLE($10000000000000) // Set_Other_Modes i: Display Pipeline Cycle Control Mode 2 Cycle (Bit 52..53)
constant CYCLE_TYPE_COPY($20000000000000) // Set_Other_Modes i: Display Pipeline Cycle Control Mode Copy (Bit 52..53)
constant CYCLE_TYPE_FILL($30000000000000) // Set_Other_Modes i: Display Pipeline Cycle Control Mode Fill (Bit 52..53)
//*RESERVED*($40000000000000) // Set_Other_Modes j: This Mode Bit Is Not Currently Used, But May Be In The Future (Bit 54)
constant ATOMIC_PRIM($80000000000000) // Set_Other_Modes k: Force Primitive To Be Written To Frame Buffer Before Read Of Following Primitive
// Load_Tlut: sl,tl,tile,sh,th ; Used To Initiate A Load From DRAM Of An Indexed Texture Lookup Table (TLUT) (This Table Dereferences Color Indexed Texels Before Texture Filtering)
// Word: Low S Index Into Table (0..255), Low T Normally Zero, Tile ID, High S Index Into Table, High T Normally Zero (Fixed Point 10.2, Fractional Bits Should Be Zero)
// Set_Tile_Size: sl,tl,tile,sh,th ; Set The Tile Size
// Word: Low S/T Coordinate Of Tile In Image, Tile ID, High S/T Coordinate Of Tile In Image (Fixed Point 10.2)
// Load_Block: sl,tl,tile,sh,dxt ; Loads A TMEM Tile With A Single Memory "Span" From SL,TL To SH,TL (During Tile Load, T Coordinate Is Incremented By DxT Every 8 TMEM Bytes)
// Word: Low S/T Coordinate Of Tile In Image, Tile ID, High S Coordinate Of Tile In Image (Fixed Point 10.2), Unsigned Increment Value
// Load_Tile: sl,tl,tile,sh,th ; Loads A TMEM Tile
// Word: Low S/T Coordinate Of Tile In Image, Tile ID, High S/T Coordinate Of Tile In Image (Fixed Point 10.2)
// Set_Tile: hi,lo ; Set The Tile
// Word: Set Tile Settings
// Set_Tile LO Word
constant SHIFT_S_0($0) // Set_Tile: Shift 0 Level Of Detail Shift For S Addresses (Bit 0..3)
constant SHIFT_S_1($1) // Set_Tile: Shift 1 Level Of Detail Shift For S Addresses (Bit 0..3)
constant SHIFT_S_2($2) // Set_Tile: Shift 2 Level Of Detail Shift For S Addresses (Bit 0..3)
constant SHIFT_S_3($3) // Set_Tile: Shift 3 Level Of Detail Shift For S Addresses (Bit 0..3)
constant SHIFT_S_4($4) // Set_Tile: Shift 4 Level Of Detail Shift For S Addresses (Bit 0..3)
constant SHIFT_S_5($5) // Set_Tile: Shift 5 Level Of Detail Shift For S Addresses (Bit 0..3)
constant SHIFT_S_6($6) // Set_Tile: Shift 6 Level Of Detail Shift For S Addresses (Bit 0..3)
constant SHIFT_S_7($7) // Set_Tile: Shift 7 Level Of Detail Shift For S Addresses (Bit 0..3)
constant SHIFT_S_8($8) // Set_Tile: Shift 8 Level Of Detail Shift For S Addresses (Bit 0..3)
constant SHIFT_S_9($9) // Set_Tile: Shift 9 Level Of Detail Shift For S Addresses (Bit 0..3)
constant SHIFT_S_A($A) // Set_Tile: Shift A Level Of Detail Shift For S Addresses (Bit 0..3)
constant SHIFT_S_B($B) // Set_Tile: Shift B Level Of Detail Shift For S Addresses (Bit 0..3)
constant SHIFT_S_C($C) // Set_Tile: Shift C Level Of Detail Shift For S Addresses (Bit 0..3)
constant SHIFT_S_D($D) // Set_Tile: Shift D Level Of Detail Shift For S Addresses (Bit 0..3)
constant SHIFT_S_E($E) // Set_Tile: Shift E Level Of Detail Shift For S Addresses (Bit 0..3)
constant SHIFT_S_F($F) // Set_Tile: Shift F Level Of Detail Shift For S Addresses (Bit 0..3)
constant MASK_S_0($0) // Set_Tile: Mask 0 For Wrapping/Mirroring In S Direction, Zero = Clamp (Bit 14..17)
constant MASK_S_1($1) // Set_Tile: Mask 1 For Wrapping/Mirroring In S Direction, Pass (Mask) LSBs Of S Address (Bit 4..7)
constant MASK_S_2($2) // Set_Tile: Mask 2 For Wrapping/Mirroring In S Direction, Pass (Mask) LSBs Of S Address (Bit 4..7)
constant MASK_S_3($3) // Set_Tile: Mask 3 For Wrapping/Mirroring In S Direction, Pass (Mask) LSBs Of S Address (Bit 4..7)
constant MASK_S_4($4) // Set_Tile: Mask 4 For Wrapping/Mirroring In S Direction, Pass (Mask) LSBs Of S Address (Bit 4..7)
constant MASK_S_5($5) // Set_Tile: Mask 5 For Wrapping/Mirroring In S Direction, Pass (Mask) LSBs Of S Address (Bit 4..7)
constant MASK_S_6($6) // Set_Tile: Mask 6 For Wrapping/Mirroring In S Direction, Pass (Mask) LSBs Of S Address (Bit 4..7)
constant MASK_S_7($7) // Set_Tile: Mask 7 For Wrapping/Mirroring In S Direction, Pass (Mask) LSBs Of S Address (Bit 4..7)
constant MASK_S_8($8) // Set_Tile: Mask 8 For Wrapping/Mirroring In S Direction, Pass (Mask) LSBs Of S Address (Bit 4..7)
constant MASK_S_9($9) // Set_Tile: Mask 9 For Wrapping/Mirroring In S Direction, Pass (Mask) LSBs Of S Address (Bit 4..7)
constant MASK_S_A($A) // Set_Tile: Mask A For Wrapping/Mirroring In S Direction, Pass (Mask) LSBs Of S Address (Bit 4..7)
constant MASK_S_B($B) // Set_Tile: Mask B For Wrapping/Mirroring In S Direction, Pass (Mask) LSBs Of S Address (Bit 4..7)
constant MASK_S_C($C) // Set_Tile: Mask C For Wrapping/Mirroring In S Direction, Pass (Mask) LSBs Of S Address (Bit 4..7)
constant MASK_S_D($D) // Set_Tile: Mask D For Wrapping/Mirroring In S Direction, Pass (Mask) LSBs Of S Address (Bit 4..7)
constant MASK_S_E($E) // Set_Tile: Mask E For Wrapping/Mirroring In S Direction, Pass (Mask) LSBs Of S Address (Bit 4..7)
constant MASK_S_F($F) // Set_Tile: Mask F For Wrapping/Mirroring In S Direction, Pass (Mask) LSBs Of S Address (Bit 4..7)
constant MIRROR_S(1) // Set_Tile: Mirror Enable For S Direction (Bit 8)
constant CLAMP_S(1) // Set_Tile: Clamp Enable For S Direction (Bit 9)
constant SHIFT_T_0($0) // Set_Tile: Shift 0 Level Of Detail Shift For T Addresses (Bit 10..13)
constant SHIFT_T_1($1) // Set_Tile: Shift 1 Level Of Detail Shift For T Addresses (Bit 10..13)
constant SHIFT_T_2($2) // Set_Tile: Shift 2 Level Of Detail Shift For T Addresses (Bit 10..13)
constant SHIFT_T_3($3) // Set_Tile: Shift 3 Level Of Detail Shift For T Addresses (Bit 10..13)
constant SHIFT_T_4($4) // Set_Tile: Shift 4 Level Of Detail Shift For T Addresses (Bit 10..13)
constant SHIFT_T_5($5) // Set_Tile: Shift 5 Level Of Detail Shift For T Addresses (Bit 10..13)
constant SHIFT_T_6($6) // Set_Tile: Shift 6 Level Of Detail Shift For T Addresses (Bit 10..13)
constant SHIFT_T_7($7) // Set_Tile: Shift 7 Level Of Detail Shift For T Addresses (Bit 10..13)
constant SHIFT_T_8($8) // Set_Tile: Shift 8 Level Of Detail Shift For T Addresses (Bit 10..13)
constant SHIFT_T_9($9) // Set_Tile: Shift 9 Level Of Detail Shift For T Addresses (Bit 10..13)
constant SHIFT_T_A($A) // Set_Tile: Shift A Level Of Detail Shift For T Addresses (Bit 10..13)
constant SHIFT_T_B($B) // Set_Tile: Shift B Level Of Detail Shift For T Addresses (Bit 10..13)
constant SHIFT_T_C($C) // Set_Tile: Shift C Level Of Detail Shift For T Addresses (Bit 10..13)
constant SHIFT_T_D($D) // Set_Tile: Shift D Level Of Detail Shift For T Addresses (Bit 10..13)
constant SHIFT_T_E($E) // Set_Tile: Shift E Level Of Detail Shift For T Addresses (Bit 10..13)
constant SHIFT_T_F($F) // Set_Tile: Shift F Level Of Detail Shift For T Addresses (Bit 10..13)
constant MASK_T_0($0) // Set_Tile: Mask 0 For Wrapping/Mirroring In T Direction, Zero = Clamp (Bit 14..17)
constant MASK_T_1($1) // Set_Tile: Mask 1 For Wrapping/Mirroring In T Direction, Pass (Mask) LSBs Of T Address (Bit 14..17)
constant MASK_T_2($2) // Set_Tile: Mask 2 For Wrapping/Mirroring In T Direction, Pass (Mask) LSBs Of T Address (Bit 14..17)
constant MASK_T_3($3) // Set_Tile: Mask 3 For Wrapping/Mirroring In T Direction, Pass (Mask) LSBs Of T Address (Bit 14..17)
constant MASK_T_4($4) // Set_Tile: Mask 4 For Wrapping/Mirroring In T Direction, Pass (Mask) LSBs Of T Address (Bit 14..17)
constant MASK_T_5($5) // Set_Tile: Mask 5 For Wrapping/Mirroring In T Direction, Pass (Mask) LSBs Of T Address (Bit 14..17)
constant MASK_T_6($6) // Set_Tile: Mask 6 For Wrapping/Mirroring In T Direction, Pass (Mask) LSBs Of T Address (Bit 14..17)
constant MASK_T_7($7) // Set_Tile: Mask 7 For Wrapping/Mirroring In T Direction, Pass (Mask) LSBs Of T Address (Bit 14..17)
constant MASK_T_8($8) // Set_Tile: Mask 8 For Wrapping/Mirroring In T Direction, Pass (Mask) LSBs Of T Address (Bit 14..17)
constant MASK_T_9($9) // Set_Tile: Mask 9 For Wrapping/Mirroring In T Direction, Pass (Mask) LSBs Of T Address (Bit 14..17)
constant MASK_T_A($A) // Set_Tile: Mask A For Wrapping/Mirroring In T Direction, Pass (Mask) LSBs Of T Address (Bit 14..17)
constant MASK_T_B($B) // Set_Tile: Mask B For Wrapping/Mirroring In T Direction, Pass (Mask) LSBs Of T Address (Bit 14..17)
constant MASK_T_C($C) // Set_Tile: Mask C For Wrapping/Mirroring In T Direction, Pass (Mask) LSBs Of T Address (Bit 14..17)
constant MASK_T_D($D) // Set_Tile: Mask D For Wrapping/Mirroring In T Direction, Pass (Mask) LSBs Of T Address (Bit 14..17)
constant MASK_T_E($E) // Set_Tile: Mask E For Wrapping/Mirroring In T Direction, Pass (Mask) LSBs Of T Address (Bit 14..17)
constant MASK_T_F($F) // Set_Tile: Mask F For Wrapping/Mirroring In T Direction, Pass (Mask) LSBs Of T Address (Bit 14..17)
constant MIRROR_T(1) // Set_Tile: Mirror Enable For T Direction (Bit 18)
constant CLAMP_T(1) // Set_Tile: Clamp Enable For T Direction (Bit 19)
constant PALETTE_0($0) // Set_Tile: Palette Number 0 For 4Bit Color Indexed Texels, This Number Is The MS 4Bits Of An 8Bit Index (Bit 20..23)
constant PALETTE_1($1) // Set_Tile: Palette Number 1 For 4Bit Color Indexed Texels, This Number Is The MS 4Bits Of An 8Bit Index (Bit 20..23)
constant PALETTE_2($2) // Set_Tile: Palette Number 2 For 4Bit Color Indexed Texels, This Number Is The MS 4Bits Of An 8Bit Index (Bit 20..23)
constant PALETTE_3($3) // Set_Tile: Palette Number 3 For 4Bit Color Indexed Texels, This Number Is The MS 4Bits Of An 8Bit Index (Bit 20..23)
constant PALETTE_4($4) // Set_Tile: Palette Number 4 For 4Bit Color Indexed Texels, This Number Is The MS 4Bits Of An 8Bit Index (Bit 20..23)
constant PALETTE_5($5) // Set_Tile: Palette Number 5 For 4Bit Color Indexed Texels, This Number Is The MS 4Bits Of An 8Bit Index (Bit 20..23)
constant PALETTE_6($6) // Set_Tile: Palette Number 6 For 4Bit Color Indexed Texels, This Number Is The MS 4Bits Of An 8Bit Index (Bit 20..23)
constant PALETTE_7($7) // Set_Tile: Palette Number 7 For 4Bit Color Indexed Texels, This Number Is The MS 4Bits Of An 8Bit Index (Bit 20..23)
constant PALETTE_8($8) // Set_Tile: Palette Number 8 For 4Bit Color Indexed Texels, This Number Is The MS 4Bits Of An 8Bit Index (Bit 20..23)
constant PALETTE_9($9) // Set_Tile: Palette Number 9 For 4Bit Color Indexed Texels, This Number Is The MS 4Bits Of An 8Bit Index (Bit 20..23)
constant PALETTE_A($A) // Set_Tile: Palette Number A For 4Bit Color Indexed Texels, This Number Is The MS 4Bits Of An 8Bit Index (Bit 20..23)
constant PALETTE_B($B) // Set_Tile: Palette Number B For 4Bit Color Indexed Texels, This Number Is The MS 4Bits Of An 8Bit Index (Bit 20..23)
constant PALETTE_C($C) // Set_Tile: Palette Number C For 4Bit Color Indexed Texels, This Number Is The MS 4Bits Of An 8Bit Index (Bit 20..23)
constant PALETTE_D($D) // Set_Tile: Palette Number D For 4Bit Color Indexed Texels, This Number Is The MS 4Bits Of An 8Bit Index (Bit 20..23)
constant PALETTE_E($E) // Set_Tile: Palette Number E For 4Bit Color Indexed Texels, This Number Is The MS 4Bits Of An 8Bit Index (Bit 20..23)
constant PALETTE_F($F) // Set_Tile: Palette Number F For 4Bit Color Indexed Texels, This Number Is The MS 4Bits Of An 8Bit Index (Bit 20..23)
// Set_Tile/Set_Texture_Image/Set_Color_Image HI Word
constant SIZE_OF_PIXEL_4B(0) // Set_Tile/Set_Texture_Image/Set_Color_Image: Size Of Pixel/Texel Color Element 4B (Bit 51..52)
constant SIZE_OF_PIXEL_8B(1) // Set_Tile/Set_Texture_Image/Set_Color_Image: Size Of Pixel/Texel Color Element 8B (Bit 51..52)
constant SIZE_OF_PIXEL_16B(2) // Set_Tile/Set_Texture_Image/Set_Color_Image: Size Of Pixel/Texel Color Element 16B (Bit 51..52)
constant SIZE_OF_PIXEL_32B(3) // Set_Tile/Set_Texture_Image/Set_Color_Image: Size Of Pixel/Texel Color Element 32B (Bit 51..52)
constant IMAGE_DATA_FORMAT_RGBA(0) // Set_Tile/Set_Texture_Image/Set_Color_Image: Image Data Format RGBA (Bit 53..55)
constant IMAGE_DATA_FORMAT_YUV(1) // Set_Tile/Set_Texture_Image/Set_Color_Image: Image Data Format YUV (Bit 53..55)
constant IMAGE_DATA_FORMAT_COLOR_INDX(2) // Set_Tile/Set_Texture_Image/Set_Color_Image: Image Data Format COLOR_INDX (Bit 53..55)
constant IMAGE_DATA_FORMAT_IA(3) // Set_Tile/Set_Texture_Image/Set_Color_Image: Image Data Format IA (Bit 53..55)
constant IMAGE_DATA_FORMAT_I(4) // Set_Tile/Set_Texture_Image/Set_Color_Image: Image Data Format I (Bit 53..55)
// Fill_Rectangle: xl,yl,xh,yh
// Word: Bottom Right X/Y, Top Left X/Y (Fixed Point 10.2)
// Set_Fill_Color: Set The Filling Color
// Word: Packed Color: If The Color Image Was Set BE 16B RGBA, Then The Fill Color Would Be Two Horizontally Adjacent 16B RGBA Pixels
// Set_Fog_Color: Set The Fog Color
// Word: RGBA Color Components
// Set_Blend_Color: Set The Blending Color
// Word: RGBA Color Components
// Set_Prim_Color: minlev,levfrac,lo ; Set The Primitive Color
// Word: Prim Min Level: Minimum Clamp For LOD Fraction When In Detail Or Sharpen Texture Modes (Fixed Point 0.5), Prim Level Frac: Level Of Detail Fraction For Primitive, Used Primarily In Multi-Tile Operations For Rectangle Primitives (Fixed Point 0.8), RGBA Color Components
// Set_Env_Color: Set The Environment Color
// Word: RGBA Color Components
// Set_Combine_Mode: sub_aR0, mulR0, sub_aA0, mulA0, sub_aR1, mulR1, sub_bR0, sub_bR1, sub_aA1, mulA1, addR0, sub_bA0, addA0, addR1, sub_bA1, addA1 ; Set The Combine Mode
// Word: SUB_A, Multiply Input RGB Components CYCLE 0, SUB_A, Multiply Input ALPHA Components CYCLE 0, SUB_A, Multiply Input RGB Components CYCLE 1, SUB_B, Multiply Input RGB Components CYCLE 0, SUB_B, Multiply Input RGB Components CYCLE 1, SUB_A, Multiply Input ALPHA Components CYCLE 1, Adder Input RGB Components CYCLE 0, SUB_B Input ALPHA Components CYCLE 0, Adder Input ALPHA Components CYCLE 0, Adder Input RGB Components CYCLE 1, SUB_B Input ALPHA Components CYCLE 1, Adder Input ALPHA Components CYCLE 1
// Set_Texture_Image: Set The Texture Image
// Word: Image Data Format, Size Of Pixel/Texel Color Element, Width Of Image In Pixels - 1, Base Address (Top Left Corner) Of Image In DRAM
// Set_Z_Image: Set The Z Buffer Image
// Word: Base Address (Top Left Corner) Of Image In DRAM, In Bytes
// Set_Color_Image: Set The Color Image
// Word: Image Data Format, Size Of Pixel/Texel Color Element, Width Of Image In Pixels: Image Width=Width+1, Base Address (Top Left Corner) Of Image In DRAM

77
xxd.asm Normal file
View File

@ -0,0 +1,77 @@
xxd:
// a0: source address
// a1: source length
// a2: destination (string) address
// a3: destination (string) maximum length
// v0: error code (0 is OK)
beqz a1, xxdExit
lli v0, 0 // delay slot
lli v1, 0x20 // ascii space
xxdLoop:
lbu t0, 0(a0)
subiu a1, a1, 1
addiu a0, a0, 1
// split byte into nybbles
srl t1, t0, 4
andi t0, t0, 0xF
// convert nybbles to ascii bytes
sltiu at, t0, 0xA
bnez at,+
addiu t2, t0, 0x30 // (delay slot)
addiu t2, t0, 0x41 - 0xA
+
sltiu at, t1, 0xA
bnez at,+
addiu t3, t1, 0x30 // (delay slot)
addiu t3, t1, 0x41 - 0xA
+
subiu a3, a3, 3
blezl a3, xxdExit
lli v0, 1
sb v1, 0(a2) // write space
sb t3, 1(a2) // write high nybble
sb t2, 2(a2) // write low nybble
addiu a2, a2, 3
// pretty-printing:
andi at, a0, 0xF
bnez at,+
lli t9, 0x0A // (delay slot) ascii newline
subiu a3, a3, 1
blezl a3, xxdExit
lli v0, 1
sb t9, 0(a2) // write newline
b ++
addiu a2, a2, 1 // delay slot
+
andi at, a0, 0x3
bnez at,+
nop // delay slot
subiu a3, a3, 1
blezl a3, xxdExit
lli v0, 1
sb v1, 0(a2) // write extra space
addiu a2, a2, 1
+
bnez a1, xxdLoop
nop // delay slot
beqz a3, xxdExit
nop // delay slot
xxdZero:
// fill the remaining bytes with nulls
sb r0, 0(a2)
subiu a3, a3, 1
bnez a3, xxdZero
addiu a2, a2, 1 // delay slot
xxdExit:
jr ra
nop // delay slot