From a6c001d42c0a5107c218589e18c45901ae531a21 Mon Sep 17 00:00:00 2001 From: CrashOveride95 Date: Fri, 17 Sep 2021 17:53:53 -0400 Subject: [PATCH] Remove Fast3D --- Makefile | 12 +- lib/rsp.s | 8 - rsp/fast3d.s | 1766 -------------------------------------------------- rsp/gbi.inc | 19 - 4 files changed, 3 insertions(+), 1802 deletions(-) delete mode 100644 rsp/fast3d.s delete mode 100644 rsp/gbi.inc diff --git a/Makefile b/Makefile index ac9b921e..2d129fe7 100644 --- a/Makefile +++ b/Makefile @@ -114,20 +114,14 @@ TARGET := sm64.$(VERSION) # GRUCODE - selects which RSP microcode to use. -# f3d_old - default for JP and US versions -# f3d_new - default for EU and Shindou versions # f3dex - # f3dex2 - # l3dex2 - F3DEX2 version that only renders in wireframe # f3dzex - newer, experimental microcode used in Animal Crossing # super3d - extremely experimental version of Fast3D lacking many features for speed -$(eval $(call validate-option,GRUCODE,f3d_old f3dex f3dex2 f3dex2pl f3d_new f3dzex super3d l3dex2)) +$(eval $(call validate-option,GRUCODE,f3dex f3dex2 f3dex2pl f3dzex super3d l3dex2)) -ifeq ($(GRUCODE),f3d_old) - DEFINES += F3D_OLD=1 -else ifeq ($(GRUCODE),f3d_new) # Fast3D 2.0H - DEFINES += F3D_NEW=1 -else ifeq ($(GRUCODE),f3dex) # Fast3DEX +ifeq ($(GRUCODE),f3dex) # Fast3DEX DEFINES += F3DEX_GBI=1 F3DEX_GBI_SHARED=1 else ifeq ($(GRUCODE),f3dex2) # Fast3DEX2 DEFINES += F3DEX_GBI_2=1 F3DEX_GBI_SHARED=1 @@ -521,7 +515,7 @@ libultra: $(BUILD_DIR)/libultra.a $(BUILD_DIR)/asm/boot.o: $(IPL3_RAW_FILES) $(BUILD_DIR)/src/game/crash_screen.o: $(CRASH_TEXTURE_C_FILES) $(BUILD_DIR)/src/game/version.o: $(BUILD_DIR)/src/game/version_data.h -$(BUILD_DIR)/lib/rsp.o: $(BUILD_DIR)/rsp/rspboot.bin $(BUILD_DIR)/rsp/fast3d.bin $(BUILD_DIR)/rsp/audio.bin +$(BUILD_DIR)/lib/rsp.o: $(BUILD_DIR)/rsp/rspboot.bin $(BUILD_DIR)/rsp/audio.bin $(SOUND_BIN_DIR)/sound_data.o: $(SOUND_BIN_DIR)/sound_data.ctl $(SOUND_BIN_DIR)/sound_data.tbl $(SOUND_BIN_DIR)/sequences.bin $(SOUND_BIN_DIR)/bank_sets $(BUILD_DIR)/levels/scripts.o: $(BUILD_DIR)/include/level_headers.h diff --git a/lib/rsp.s b/lib/rsp.s index 4c82b25a..1619a1da 100644 --- a/lib/rsp.s +++ b/lib/rsp.s @@ -15,10 +15,6 @@ glabel rspbootTextEnd glabel gspSuper3D_fifoTextStart .incbin "lib/PR/super3d/Super3D.bin" glabel gspSuper3D_fifoTextEnd -#else -glabel gspFast3D_fifoTextStart /* Use regular Fast3D bins (default) */ - .incbin "rsp/fast3d.bin" -glabel gspFast3D_fifoTextEnd #endif #else /* Use one of the Fast3DEX series grucodes. */ @@ -171,10 +167,6 @@ glabel gspS2DEX2_fifoTextEnd glabel gspSuper3D_fifoDataStart .incbin "lib/PR/super3d/Super3D_data.bin" glabel gspSuper3D_fifoDataEnd -#else -glabel gspFast3D_fifoDataStart - .incbin "rsp/fast3d_data.bin" -glabel gspFast3D_fifoDataEnd #endif #else /* Using one of the Fast3DEX series grucodes */ diff --git a/rsp/fast3d.s b/rsp/fast3d.s deleted file mode 100644 index e44432b6..00000000 --- a/rsp/fast3d.s +++ /dev/null @@ -1,1766 +0,0 @@ -.rsp - -.include "rsp/rsp_defs.inc" -.include "rsp/gbi.inc" - -// This file assumes DATA_FILE and CODE_FILE are set on the command line - -.if version() < 110 - .error "armips 0.11 or newer is required" -.endif - -// Overlay table data member offsets -overlay_load equ 0x0000 -overlay_len equ 0x0004 -overlay_imem equ 0x0006 -.macro OverlayEntry, loadStart, loadEnd, imemAddr - .dw loadStart - .dh (loadEnd - loadStart - 1) & 0xFFFF - .dh (imemAddr) & 0xFFFF -.endmacro - -.macro jumpTableEntry, addr - .dh addr & 0xFFFF -.endmacro - -// RSP DMEM -.create DATA_FILE, 0x0000 - -// 0x0000-0x0027: Overlay Table -overlayInfo0: - OverlayEntry orga(Overlay0Address), orga(Overlay0End), Overlay0Address -overlayInfo1: - OverlayEntry orga(Overlay1Address), orga(Overlay1End), Overlay1Address -overlayInfo2: - OverlayEntry orga(Overlay2Address), orga(Overlay2End), Overlay2Address -overlayInfo3: - OverlayEntry orga(Overlay3Address), orga(Overlay3End), Overlay3Address -overlayInfo4: - OverlayEntry orga(Overlay4Address), orga(Overlay4End), Overlay4Address - -// 0x0028-0x009F: ?? -.dw 0x0FFAF006 -.dw 0x7FFF0000 -.dw 0x00000001 -.dw 0x0002FFFF -.dw 0x40000004 -.dw 0x06330200 -.dw 0x7FFFFFF8 -.dw 0x00080040 -.dw 0x00208000 -.dw 0x01CCCCCC -.dw 0x0001FFFF -.dw 0x00010001 -.dw 0x0001FFFF -.dw 0x00010001 -.dw 0x00020002 -.dw 0x00020002 - -// 0x0068 -.dw 0x00020002 -.dw 0x00020002 - -data0070: -.dw 0x00010000 - -// 0x0074 -.dh 0x0000 -// 0x0076 -.dh 0x0001 - -// 0x0078 -.dw 0x00000001 -.dw 0x00000001 -.dw 0x00010000 -.dw 0x0000FFFF -.dw 0x00000001 -.dw 0x0000FFFF -.dw 0x00000000 -.dw 0x0001FFFF -.dw 0x00000000 -.dw 0x00010001 - -// 0x00A0-0x00A1 -lightEntry: - jumpTableEntry load_lighting - -// 0x00A2-0x00A3: ?? -.dh 0x7FFF - -// 0x00A4-0x00B3: ?? -.dw 0x571D3A0C -.dw 0x00010002 -.dw 0x01000200 -.dw 0x40000040 - -// 0x00B4 -.dh 0x0000 - -// 0x00B6-0x00B7 -taskDoneEntry: - jumpTableEntry overlay_4_entry - -// 0x00B8 -lower24Mask: -.dw 0x00FFFFFF - -// 0x00BC: Operation Types -operationJumpTable: - jumpTableEntry dispatch_dma // cmds 0x00-0x3f -spNoopEntry: - jumpTableEntry SP_NOOP // cmds 0x40-0x7f - jumpTableEntry dispatch_imm // cmds 0x80-0xbf - jumpTableEntry dispatch_rdp // cmds 0xc0-0xff - -// 0x00C4: DMA operations -dmaJumpTable: - jumpTableEntry SP_NOOP // 0x00 - jumpTableEntry dma_MTX // 0x01 - jumpTableEntry SP_NOOP // 0x02 - jumpTableEntry dma_MOVEMEM // 0x03 - jumpTableEntry dma_VTX // 0x04 - jumpTableEntry SP_NOOP // 0x05 - jumpTableEntry dma_DL // 0x06 - jumpTableEntry SP_NOOP // 0x07 - jumpTableEntry SP_NOOP // 0x08 - jumpTableEntry SP_NOOP // 0x09 - -// 0x00D8: Immediate operations -immediateJumpTableBase equ (immediateJumpTable - ((0xB2 << 1) & 0xFE)) -.ifdef F3D_OLD - jumpTableEntry imm_UNKNOWN -.endif -immediateJumpTable: - jumpTableEntry imm_RDPHALF_CONT // 0xB2 - jumpTableEntry imm_RDPHALF_2 // 0xB3 - jumpTableEntry imm_RDPHALF_1 // 0xB4 - jumpTableEntry SP_NOOP // 0xB5? - jumpTableEntry imm_CLEARGEOMETRYMODE // 0xB6 - jumpTableEntry imm_SETGEOMETRYMODE // 0xB7 - jumpTableEntry imm_ENDDL // 0xB8 - jumpTableEntry imm_SETOTHERMODE_L // 0xB9 - jumpTableEntry imm_SETOTHERMODE_H // 0xBA - jumpTableEntry imm_TEXTURE // 0xBB - jumpTableEntry imm_MOVEWORD // 0xBC - jumpTableEntry imm_POPMTX // 0xBD - jumpTableEntry imm_CULLDL // 0xBE - jumpTableEntry imm_TRI1 // 0xBF - -// 0x00F6: Label constants -labelLUT: - jumpTableEntry found_in -foundOutEntry: - jumpTableEntry found_out - jumpTableEntry found_first_in - jumpTableEntry found_first_out -clipDrawEntry: - jumpTableEntry clip_draw_loop -performClipEntry: - jumpTableEntry perform_clip -nextClipEntry: - jumpTableEntry next_clip -DMAWaitEntry: - jumpTableEntry dma_wait_dl - -// 0x0106: ?? -data0106: -.dh 0x0000 - -.ifdef F3D_NEW -.dh 0x0000 -.endif - -// 0x0108: DRAM pointer -dramPtr: -.dw 0x00000000 -.dh 0x0000 // 0x10C: RDPHALF_2 - -.dh 0x0000 - -// 0x110: display list stack size -displayListStackSize: -.dh 0x0000 -.dh 0xFFFF // 0x112: RDPHALF_1 - -.dw 0x00000000 // 0x114: geometrymode (bit 1 is texture ON) -.dw 0xEF080CFF // 0x118: othermode -.dw 0x00000000 -.dw 0x00000000 // 0x120: texture max mipmap levels, tile descriptor enable/disable -.dh 0x0000 // 0x124: texture scaling factor S axis (horizontal) U16 fraction -.dh 0x0000 // 0x126: texture scaling factor T axis (vertical) -.dw 0x00000000 // 0x128: some dpc dma address state - -numLights: -.dw 0x80000040 // 0x12c: num lights, bit 31 = needs init, bits 11:0 = (num_lights+1)*32 -.dw 0x00000000 // 0x130: dram stack pointer 1 -.dw 0x00000000 // 0x134: dram stack pointer modelview matrices - -data0138: -.dw 0x40004000 // 0x138: txtatt (unused?) - -.dw 0x00000000 -.dw 0x00000000 -.dw 0x00000000 -.dw 0x00000000 -.dw 0x00000000 - -.dw 0x00000000 // 0x150: output buffer - -.dw 0x00000000 // 0x154: output buffer size - -data0158: -.dh 0x0000 // 0x158: ?? -.dh 0x0000 -.dw 0x00000000 // 0x15c: dram stack end? - -// 0x160-0x19f: RSP memory segment table -segmentTable: -.fill 0x40, 0 - -// 0x1a0: Lights -.dw 0x80000000 -.dw 0x80000000 -.dw 0x00000000 -.dw 0x00000000 - -lookAtY: // 0x1b0: lookaty -.dw 0x00800000, 0x00800000, 0x7F000000, 0x00000000 -.dw 0x00000000, 0x00000000, 0x00000000, 0x00000000 - -lookAtX: // 0x1d0: lookatx -.dw 0x00000000, 0x00000000, 0x007F0000, 0x00000000 -.dw 0x00000000, 0x00000000, 0x00000000, 0x00000000 - -// 0x1f0: L0..L7 light info (32 bytes each) -lightInfo0: // 0x1f0 -.dw 0x00000000, 0x00000000, 0x00000000, 0x00000000 -.dw 0x00000000, 0x00000000, 0xE0011FFF, 0x00040000 - -lightInfo1: // 0x210 -.dw 0xFF000000, 0xFF000000, 0x00000000, 0x00000000 -.dw 0x00000000, 0x00000000, 0x00000000, 0x00000000 - -lightInfo2: // 0x230 -.dw 0x00000000, 0x00000000, 0x00000000, 0x00000000 -.dw 0x00000000, 0x00000000, 0x00000000, 0x00000000 - -lightInfo3: // 0x250 -.dw 0x00000000, 0x00000000, 0x00000000, 0x00000000 -.dw 0x00000000, 0x00000000, 0x00000000, 0x00000000 - -lightInfo4: // 0x270 - -// L4-L7 overlap with version string -.definelabel lightInfo5, lightInfo4 + 0x20 // 0x290 -.definelabel lightInfo6, lightInfo5 + 0x20 // 0x2b0 -.definelabel lightInfo7, lightInfo6 + 0x20 // 0x2d0 - -.if defined(F3D_OLD) || defined(VERSION_EU) - .asciiz "RSP SW Version: 2.0D, 04-01-96" -.elseif defined(F3D_NEW) - .asciiz "RSP SW Version: 2.0H, 02-12-97" -.endif -.asciiz "SGI U64 GFX SW TEAM: S Anderson, S Carr, H Cheng, K Luster, R Moore, N Pooley, A Srinivasan", 0x0A - -.dw 0x00000000 - -// 0x2f0-0x31f: DMEM table -dmemTableOffset equ (dmemTable - 0x80) -dmemTable: - .dh viewport, lookAtY, lookAtX, lightInfo0, lightInfo1, lightInfo2, lightInfo3, lightInfo4 - .dh lightInfo5, lightInfo6, lightInfo7, data0138, mpMatrix+0x10, mpMatrix+0x20, mpMatrix+0x30, mpMatrix - .dh numLights, data0070, segmentTable, fogFactors, lightInfo0, pointsBuffer -.ifdef F3D_NEW - .dh displayListStackSize, 0x0000 -.else - .dh 0x0000, 0x0000 -.endif - -// 0x320: Viewport (0x010 bytes) -viewport: -.dw 0x00000000, 0x00000000, 0x00000000, 0x00000000 - -// 0x330: fog factors (three 16-bit integers: mul, add, min) -fogFactors: -.dh 0x0100, 0x0000, 0x00FF - -// 0x336: display list stack (return addresses) -displayListStack: // this is not 4-byte aligned -.fill 0x2a, 0 - -// 0x360-0x39f: Modelview matrix top of stack (0x40 bytes) -modelViewMatrixStack: -.fill 0x40, 0 - -// 0x3a0-0x3df Projection Matrix top of stack (0x40 bytes) -projectionMatrixStack: -.fill 0x40, 0 - -// 0x3e0-0x41f: MP matrix (Modelview * Projection) -mpMatrix: -.fill 0x40, 0 - -// 0x420: Points buffer (0x280 bytes) -pointsBuffer: -.fill 0x280, 0 - -// 0x6a0-0x7df: input display list buffer -inputDisplayList: -.fill 0x140, 0 - -// 0x7E0-0x7ff: input data -inputData: -.fill (0x800 - 0x7E0), 0 - -.close // DATA_FILE - -// uninitialized variables -.definelabel setupTemp, 0x08E0 -.definelabel data08e4, 0x08E4 -.definelabel data08e8, 0x08E8 -.definelabel data08ec, 0x08EC -.definelabel data08f0, 0x08F0 -.definelabel clipTemp, 0x0940 -.definelabel data0942, 0x0942 -.definelabel data0944, 0x0944 -.definelabel data0946, 0x0946 -.definelabel rdpOutput, 0x09E0 -.definelabel scratchSpace, 0x0DE0 -.definelabel data0DE4, 0x0DE4 -.definelabel data0DE8, 0x0DE8 - -.create CODE_FILE, 0x04001080 - -// Overlay 0 -Overlay0Address: - j f3d_04001780 - addi $29, $zero, displayListStackSize - jal segmented_to_physical - add $19, $24, $zero - add $20, $zero, $22 - jal dma_read_write - addi $17, $zero, 0x00 - -// $1 = most significant 2 bits of cmd byte << 1 -// $25 = first command word -dispatch_task: - lh $2, (operationJumpTable)($1) - jr $2 - srl $2, $25, 23 // $2 = MSbyte << 1 - -SP_NOOP: - mfc0 $2, SP_STATUS - andi $2, $2, 0x0080 - bne $2, $zero, f3d_040010cc - lh $21, 0x26($zero) -f3d_040010b8: - bgtz $28, read_next_task_entry - nop - j load_display_list_dma - lh $ra, DMAWaitEntry -f3d_040010c8: - lh $21, taskDoneEntry -f3d_040010cc: - j load_overlay - ori $30, $zero, overlayInfo4 - -load_display_list_dma: - addi $28, $zero, 0x0140 // size of display list - add $21, $zero, $ra - addi $20, $zero, inputDisplayList - add $19, $zero, $26 // TASK_DATA_PTR - addi $18, $zero, 0x013f - jal dma_read_write - addi $17, $zero, 0x00 - jr $21 - addi $27, $zero, inputDisplayList // initial pointer - -// load overlay into IMEM -// $30 = offset into overlay table -// $21 = return address -load_overlay_fcn: - add $21, $zero, $ra -load_overlay: - lw $19, overlay_load($30) - lh $18, overlay_len($30) - lh $20, overlay_imem($30) - jal dma_read_write - addi $17, $zero, 0x00 - jal wait_while_dma_busy - nop - jr $21 - -segmented_to_physical: - lw $11, lower24Mask - srl $12, $19, 22 - andi $12, $12, 0x3c - and $19, $19, $11 - add $13, $zero, $12 - lw $12, 0x0160($13) - jr $ra - add $19, $19, $12 - -// $20 = SP_MEM address -// $19 = DRAM address -// $18 = length - 1 -// $17 = 1:write, 0:read -dma_read_write: -@@dma_full: - mfc0 $11, SP_DMA_FULL - bne $11, $zero, @@dma_full - nop - mtc0 $20, SP_MEM_ADDR - bgtz $17, @@dma_write - mtc0 $19, SP_DRAM_ADDR - jr $ra - mtc0 $18, SP_RD_LEN -@@dma_write: - jr $ra - mtc0 $18, SP_WR_LEN - -wait_while_dma_busy: - mfc0 $11, SP_DMA_BUSY - bne $11, $zero, wait_while_dma_busy - nop - jr $ra - nop - -f3d_04001178: // sends stuff to RDP - add $21, $zero, $ra - lw $19, 0x18($29) - addi $18, $23, -0x09e0 - lw $23, 0x44($29) - blez $18, f3d_040011f4 - add $20, $19, $18 - sub $20, $23, $20 - bgez $20, f3d_040011b8 -f3d_04001198: - mfc0 $20, DPC_STATUS - andi $20, $20, DPC_STATUS_START_VALID - bne $20, $zero, f3d_04001198 -f3d_040011a4: - mfc0 $23, DPC_CURRENT - lw $19, 0x40($29) - beq $23, $19, f3d_040011a4 - nop - mtc0 $19, DPC_START -f3d_040011b8: - mfc0 $23, DPC_CURRENT - sub $20, $19, $23 - bgez $20, f3d_040011d4 - add $20, $19, $18 - sub $20, $20, $23 - bgez $20, f3d_040011b8 - nop -f3d_040011d4: - add $23, $19, $18 - addi $18, $18, -0x01 - addi $20, $zero, rdpOutput // output to RDP - jal dma_read_write - addi $17, $zero, 0x01 - jal wait_while_dma_busy - sw $23, 0x18($29) - mtc0 $23, DPC_END -f3d_040011f4: - jr $21 - addi $23, $zero, rdpOutput - -// codes 0x80-0xBF -// $2 = immediate cmd byte << 1 -dispatch_imm: - andi $2, $2, 0x00fe - lh $2, (immediateJumpTableBase)($2) // data IMM offset - jr $2 - lbu $1, -0x01($27) - -imm_TRI1: - lbu $5, -0x04($27) - lbu $1, -0x03($27) - lbu $2, -0x02($27) - lbu $3, -0x01($27) - sll $5, $5, 2 - sll $1, $1, 2 - sll $2, $2, 2 - sll $3, $3, 2 - addi $1, $1, pointsBuffer - addi $2, $2, pointsBuffer - addi $3, $3, pointsBuffer - sw $1, scratchSpace - sw $2, data0DE4 - sw $3, data0DE8 - lw $4, (scratchSpace)($5) - j f3d_04001998 - lh $30, spNoopEntry - -imm_POPMTX: -.ifdef F3D_NEW - sbv $v31[6], 0x1c($29) -.endif - lw $19, 0x24($29) - lw $3, 0x4c($29) - addi $20, $zero, modelViewMatrixStack - addi $18, $zero, 0x3f - sub $3, $3, $19 - addi $3, $3, -0x0280 - bgez $3, SP_NOOP // stop if stack is empty - addi $19, $19, -0x40 - jal dma_read_write // read new top from DRAM - addi $17, $zero, 0x00 - jal wait_while_dma_busy - addi $3, $zero, mpMatrix // MP matrix (modelview * projection) - j f3d_04001444 // recompute MP matrix - sw $19, 0x24($29) - -imm_MOVEWORD: - lbu $1, -0x05($27) - lhu $2, -0x07($27) - lh $5, 0x030e($1) - add $5, $5, $2 - j SP_NOOP - sw $24, 0x00($5) - -imm_TEXTURE: - sw $25, 0x10($29) - sw $24, 0x14($29) - lh $2, 0x06($29) - andi $2, $2, 0xfffd - andi $3, $25, 0x0001 - sll $3, $3, 1 - or $2, $2, $3 - j SP_NOOP - sh $2, 0x06($29) - -imm_SETOTHERMODE_H: - j @f3d_040012d0 - addi $7, $29, 8 -imm_SETOTHERMODE_L: - addi $7, $29, 0x0c -@f3d_040012d0: - lw $3, 0x00($7) - addi $8, $zero, -1 - lbu $5, -0x05($27) - lbu $6, -0x06($27) - addi $2, $zero, 1 - sllv $2, $2, $5 - addi $2, $2, -1 - sllv $2, $2, $6 - xor $2, $2, $8 - and $2, $2, $3 - or $3, $2, $24 - sw $3, 0x00($7) - lw $25, 0x08($29) - j f3d_040013a8 - lw $24, 0x0c($29) - -imm_CULLDL: - andi $25, $25, 0x03ff -.ifdef F3D_OLD - ori $2, $zero, 0xffff -.else - ori $2, $zero, 0x7070 -.endif -@@f3d_04001314: - lh $3, 0x0444($25) - addi $25, $25, 0x28 - bne $25, $24, @@f3d_04001314 - and $2, $2, $3 - beq $2, $zero, SP_NOOP - -DL_STACK_SIZE_OFFSET equ (defined(F3D_OLD) ? 0x00 : 0x4A) - -imm_ENDDL: - lb $2, (DL_STACK_SIZE_OFFSET)($29) - addi $2, $2, -4 - bltz $2, f3d_040010c8 - addi $3, $2, displayListStack - lw $26, 0x00($3) - sb $2, (DL_STACK_SIZE_OFFSET)($29) - j SP_NOOP - addi $28, $zero, 0 - -imm_SETGEOMETRYMODE: - lw $2, 0x04($29) - or $2, $2, $24 - j SP_NOOP - sw $2, 0x04($29) - -imm_CLEARGEOMETRYMODE: - lw $2, 0x04($29) - addi $3, $zero, -1 - xor $3, $3, $24 - and $2, $2, $3 - j SP_NOOP - sw $2, 0x04($29) - -.ifdef F3D_OLD -imm_RDPHALF_1: - j SP_NOOP - sh $24, 0x02($29) -imm_RDPHALF_2: -.else -imm_RDPHALF_1: -.endif - j f3d_040010b8 - sw $24, -0x04($29) - -.ifdef F3D_OLD -imm_UNKNOWN: -.else -imm_RDPHALF_CONT: -.endif - ori $2, $zero, 0x0000 -.ifdef F3D_OLD -imm_RDPHALF_CONT: -.else -imm_RDPHALF_2: -.endif - j f3d_040013a8 - lw $25, -0x04($29) - -// codes 0xC0-0xFF -dispatch_rdp: - sra $2, $25, 24 - addi $2, $2, 3 - bltz $2, f3d_040013a8 - addi $2, $2, 0x18 - jal segmented_to_physical - add $19, $24, $zero - add $24, $19, $zero -f3d_040013a8: - sw $25, 0x00($23) - sw $24, 0x04($23) - jal f3d_04001178 - addi $23, $23, 0x08 - bgtz $2, SP_NOOP - nop - j f3d_040010b8 - -dispatch_dma: - andi $2, $2, 0x01fe - lh $2, (dmaJumpTable)($2) - jal wait_while_dma_busy - lbu $1, -0x07($27) - jr $2 - andi $6, $1, 0x000f - -dma_MTX: - sbv $v31[6], 0x1c($29) // lights need re-init - andi $8, $1, 0x0001 // 1=projection, 0=modelview - bne $8, $zero, f3d_04001454 - andi $7, $1, 0x0002 // 1=load, 0=multiply - addi $20, $zero, modelViewMatrixStack - andi $8, $1, 0x0004 // 1=push, 0=no push - beq $8, $zero, f3d_04001420 - lqv $v26[0], 0x30($22) - lw $19, 0x24($29) // DRAM stack pointer 2 - lw $8, 0x4c($29) // DRAM stack end - addi $17, $zero, 1 - addi $1, $19, 0x40 - beq $19, $8, f3d_04001420 - addi $12, $zero, 0x3f // BUG: wrong register, should be $18 - jal dma_read_write - sw $1, 0x24($29) - jal wait_while_dma_busy -f3d_04001420: - lqv $v28[0], 0x10($22) - beq $7, $zero, f3d_04001460 - lqv $v27[0], 0x20($22) - sqv $v26[0], 0x30($20) - lqv $v29[0], 0x00($22) - sqv $v28[0], 0x10($20) -f3d_04001438: - addi $3, $zero, mpMatrix - sqv $v27[0], 0x20($20) - sqv $v29[0], 0x00($20) -f3d_04001444: - addi $1, $zero, modelViewMatrixStack - addi $2, $zero, projectionMatrixStack - j f3d_04001484 - lh $ra, spNoopEntry -f3d_04001454: - lqv $v26[0], 0x30($22) - j f3d_04001420 - addi $20, $zero, projectionMatrixStack -f3d_04001460: - addiu $3, $zero, scratchSpace - addu $1, $zero, $22 // input matrix from user - jal f3d_04001484 - addu $2, $zero, $20 // current P matrix or M top - sqv $v6[0], 0x30($20) // store result to P or M - sqv $v5[0], 0x10($20) - lqv $v27[0], 0x00($3) - j f3d_04001438 - lqv $v29[0], -0x20($3) -f3d_04001484: - addi $19, $3, 0x10 -f3d_04001488: - vmudh $v5, $v31, $v31[0] // clear accumulator and $v5 - addi $18, $1, 8 -f3d_04001490: - ldv $v3[0], 0x00($2) - ldv $v4[0], 0x20($2) - lqv $v1[0], 0x00($1) - lqv $v2[0], 0x20($1) - ldv $v3[8], 0x00($2) - ldv $v4[8], 0x20($2) - vmadl $v6, $v4, $v2[0h] - addi $1, $1, 2 - vmadm $v6, $v3, $v2[0h] - addi $2, $2, 8 - vmadn $v6, $v4, $v1[0h] - vmadh $v5, $v3, $v1[0h] - bne $1, $18, f3d_04001490 - vmadn $v6, $v31, $v31[0] - addi $2, $2, -0x20 - addi $1, $1, 8 - sqv $v5[0], 0x00($3) - sqv $v6[0], 0x20($3) - bne $3, $19, f3d_04001488 - addi $3, $3, 0x10 - jr $ra - nop -f3d_040014e8: - addi $8, $zero, viewport - lqv $v3[0], 0x50($zero) - lsv $v19[0], 0x02($29) // RDPHALF_1, contains persp normalize - lh $3, 0x04($29) // geometrymode - ldv $v0[0], 0x00($8) // viewport scale - ldv $v1[0], 0x08($8) // viewport translate - ldv $v0[8], 0x00($8) - ldv $v1[8], 0x08($8) - jr $ra - vmudh $v0, $v0, $v3 // negate Y? - -load_mp_matrix: - addi $8, $zero, mpMatrix - ldv $v11[0], 0x18($8) // load into $v8-v15, dup lower half and higher half - ldv $v11[8], 0x18($8) // $v8-v11 integer parts, $v12-v15 frac parts - ldv $v15[0], 0x38($8) - ldv $v15[8], 0x38($8) -f3d_04001524: - ldv $v8[0], 0x00($8) - ldv $v9[0], 0x08($8) - ldv $v10[0], 0x10($8) - ldv $v12[0], 0x20($8) - ldv $v13[0], 0x28($8) - ldv $v14[0], 0x30($8) - ldv $v8[8], 0x00($8) - ldv $v9[8], 0x08($8) - ldv $v10[8], 0x10($8) - ldv $v12[8], 0x20($8) - ldv $v13[8], 0x28($8) - jr $ra - ldv $v14[8], 0x30($8) - -dma_MOVEMEM: - lqv $v0[0], 0x00($22) - lh $5, (dmemTableOffset)($1) - j SP_NOOP - sqv $v0[0], 0x00($5) - -dma_VTX: - lh $8, spNoopEntry - sh $8, data0106 - srl $1, $1, 4 - addi $5, $1, 1 // num vertex - addi $9, $5, 0 - ldv $v2[0], 0x00($22) // input data - ldv $v2[8], 0x10($22) // load 2nd vertex (assuming it exists) - addi $7, $zero, pointsBuffer - sll $8, $6, 5 // dest index - sll $6, $6, 3 - add $8, $6, $8 // 40 bytes per vertex - jal f3d_040014e8 - add $7, $7, $8 - llv $v17[0], 0x14($29) // texture scaling - jal load_mp_matrix - llv $v17[8], 0x14($29) -@f3d_040015a8: - vmudn $v28, $v12, $v2[0h] // x * first row frac - llv $v18[0], 0x08($22) - vmadh $v28, $v8, $v2[0h] // x * first row int - lw $15, 0x0c($22) // XR, YG, ZB, AA - vmadn $v28, $v13, $v2[1h] // y * second row frac - lw $16, 0x1c($22) - vmadh $v28, $v9, $v2[1h] // y * second row int - andi $1, $3, G_LIGHTING_H - vmadn $v28, $v14, $v2[2h] // z * third row frac - vmadh $v28, $v10, $v2[2h] // z * third row int - vmadn $v28, $v15, $v31[1] // 1 * fourth row frac - llv $v18[8], 0x18($22) - vmadh $v29, $v11, $v31[1] // 1 * fourth row int - bne $1, $zero, load_lighting - addi $22, $22, 0x20 // next 2 vertices -@f3d_040015e4: - vmudm $v18, $v18, $v17 // U *= S scale, V *= T scale (result >> 16) -@f3d_040015e8: - lsv $v21[0], 0x76($zero) - vmudn $v20, $v28, $v21[0] - vmadh $v21, $v29, $v21[0] - vch $v3, $v29, $v29[3h] // do trivial clip rejection - vcl $v3, $v28, $v28[3h] // by comparing xyz with w - cfc2 $13, vcc - vch $v3, $v29, $v21[3h] - vcl $v3, $v28, $v20[3h] - andi $8, $13, 0x0707 // filter out xyz clip result for 1st vertex - andi $13, $13, 0x7070 // filter out xyz clip result for 2nd vertex - sll $8, $8, 4 - sll $13, $13, 16 - or $13, $13, $8 - cfc2 $14, vcc - andi $8, $14, 0x0707 - vadd $v21, $v29, $v31[0] - andi $14, $14, 0x7070 - vadd $v20, $v28, $v31[0] - sll $14, $14, 12 - vmudl $v28, $v28, $v19[0] // persp normalize, used to improve precision - or $8, $8, $14 - vmadm $v29, $v29, $v19[0] - or $8, $8, $13 - vmadn $v28, $v31, $v31[0] - sh $8, 0x24($7) - jal f3d_04001000 // compute 1/w - lh $13, -0x1a($22) // $13 unused? - vge $v6, $v27, $v31[0] // 1/w >= 0? - sdv $v21[0], 0x00($7) // store xyzw int - vmrg $v6, $v27, $v30[0] - sdv $v20[0], 0x08($7) // store xyzw frac - vmudl $v5, $v20, $v26[3h] // mul xyzw with 1/w - vmadm $v5, $v21, $v26[3h] - vmadn $v5, $v20, $v6[3h] - vmadh $v4, $v21, $v6[3h] - addi $9, $9, -1 // decrement vertex input count - vmudl $v5, $v5, $v19[0] // take away persp normalize factor - vmadm $v4, $v4, $v19[0] - vmadn $v5, $v31, $v31[0] - andi $12, $3, G_FOG_H - ldv $v2[0], 0x00($22) // pre-load next vertices from input - vmudh $v7, $v1, $v31[1] // viewport translate * 0001 - ldv $v2[8], 0x10($22) - vmadn $v7, $v5, $v0 // viewport scale - ldv $v29[0], 0x28($zero) - vmadh $v6, $v4, $v0 - ldv $v29[8], 0x28($zero) - vmadn $v7, $v31, $v31[0] // $v6$v7 contains vertex results after viewport - vge $v6, $v6, $v29[1q] // some saturating 0FFA-F006 - sw $15, 0x10($7) - beq $12, $zero, @@f3d_040016e0 // skip fog? - vlt $v6, $v6, $v29[0q] - lqv $v3[0], 0x0330($zero) - vmudn $v5, $v5, $v3[0] // mul fog factor (default 1) - vmadh $v4, $v4, $v3[0] - vadd $v4, $v4, $v3[1] // add parameter (default 0) - vge $v4, $v4, $v31[0] - vlt $v4, $v4, $v3[2] // min parameter (default 0xff) - sbv $v4[5], 0x13($7) // high z for 1st vertex, store in AA - sw $16, 0x18($7) - sbv $v4[13], 0x1b($7) // high z for 2nd vertex, store in AA - lw $16, 0x18($7) -@@f3d_040016e0: - slv $v18[0], 0x14($7) // texture coordinates, 1st vertex - sdv $v6[0], 0x18($7) // xyz_int after viewport - ssv $v7[4], 0x1e($7) // z_frac after viewport - ssv $v27[6], 0x20($7) // 1/w - ssv $v26[6], 0x22($7) - blez $9, @@f3d_04001728 - addi $9, $9, -1 // decrement vertex input counter again - sdv $v21[8], 0x28($7) - sdv $v20[8], 0x30($7) - slv $v18[8], 0x3c($7) // texture coordinates, 2nd vertex - sw $16, 0x38($7) - sdv $v6[8], 0x40($7) - ssv $v7[12], 0x46($7) - ssv $v27[14], 0x48($7) - ssv $v26[14], 0x4a($7) - sw $8, 0x4c($7) // puts high hword first - addi $7, $7, 0x50 - bgtz $9, @f3d_040015a8 -@@f3d_04001728: - lh $8, data0106 - jr $8 - nop - -dma_DL: - bgtz $1, @@f3d_04001754 // 0=store ret addr, 1=end DL after branch - lb $2, (DL_STACK_SIZE_OFFSET)($29) - addi $4, $2, -0x24 // DL stack full? - bgtz $4, SP_NOOP - addi $3, $2, displayListStack - addi $2, $2, 4 - sw $26, 0x00($3) // store return address on DL stack - sb $2, (DL_STACK_SIZE_OFFSET)($29) -@@f3d_04001754: - jal segmented_to_physical - add $19, $24, $zero - add $26, $19, $zero - j SP_NOOP - addi $28, $zero, 0x00 - -// Overlays 2-4 will overwrite the following code -.org 0x04001768 -f3d_04001768: - ori $30, $zero, overlayInfo2 - b load_overlay - lh $21, performClipEntry - -load_lighting: - ori $30, $zero, overlayInfo3 - b load_overlay - lh $21, lightEntry - -f3d_04001780: - ori $2, $zero, 0x2800 // clear yielded, clear taskdone - mtc0 $2, SP_STATUS - lqv $v31[0], 0x30($zero) - lqv $v30[0], 0x40($zero) - lw $4, OSTask_addr + OSTask_flags - andi $4, $4, 0x0001 - bne $4, $zero, @@f3d_04001870 - nop - lw $23, 0x28($1) // task output buff - lw $3, 0x2c($1) // task output buff size - sw $23, 0x40($29) - sw $3, 0x44($29) - mfc0 $4, DPC_STATUS - andi $4, $4, DPC_STATUS_XBUS_DMA - bne $4, $zero, @@f3d_040017e4 - mfc0 $4, DPC_END - sub $23, $23, $4 - bgtz $23, @@f3d_040017e4 - mfc0 $5, DPC_CURRENT - beq $5, $zero, @@f3d_040017e4 - nop - beq $5, $4, @@f3d_040017e4 - nop - j @@f3d_04001800 - ori $3, $4, 0x0000 -@@f3d_040017e4: - mfc0 $4, DPC_STATUS - andi $4, $4, DPC_STATUS_START_VALID - bne $4, $zero, @@f3d_040017e4 - addi $4, $zero, DPC_STATUS_CLR_XBUS - mtc0 $4, DPC_STATUS - mtc0 $3, DPC_START - mtc0 $3, DPC_END -@@f3d_04001800: - sw $3, 0x18($29) - addi $23, $zero, rdpOutput - lw $5, 0x10($1) // TASK_UCODE (DRAM address) - lw $2, overlayInfo1 - lw $3, overlayInfo2 - lw $4, overlayInfo3 - lw $6, overlayInfo4 - add $2, $2, $5 // apply DRAM offset - add $3, $3, $5 - add $4, $4, $5 - add $6, $6, $5 - sw $2, overlayInfo1 // store back with DRAM offsets - sw $3, overlayInfo2 - sw $4, overlayInfo3 - sw $6, overlayInfo4 - jal load_overlay_fcn - addi $30, $zero, overlayInfo1 - jal load_display_list_dma - lw $26, 0x30($1) // TASK_DATA_PTR - lw $2, 0x20($1) // TASK_DRAM_STACK - sw $2, 0x20($29) - sw $2, 0x24($29) - addi $2, $2, 0x0280 // end of stack? - sw $2, 0x4c($29) - lw $2, -0x08($zero) // TASK_YIELD_DATA_PTR - sw $2, dramPtr - j dma_wait_dl - nop -@@f3d_04001870: - jal load_overlay_fcn - addi $30, $zero, overlayInfo1 - lw $23, data08F0 - lw $28, data08E4 - lw $27, data08E8 - j SP_NOOP - lw $26, data08EC - -// 0x0400188c-0x04001987: bunch of nops -.fill 0xfc, 0 -.ifdef F3D_OLD - .fill 16, 0 -.endif - -// from G_TRI1 -f3d_04001998: - lh $11, 0x24($3) - lh $8, 0x24($2) - lh $9, 0x24($1) - and $12, $11, $8 - or $11, $11, $8 - and $12, $12, $9 - andi $12, $12, 0x7070 - bne $12, $zero, SP_NOOP // all vertices outside screen, return - or $11, $11, $9 - andi $11, $11, 0x4343 - bne $11, $zero, f3d_04001768 // halfway outside, so trigger clipping routine -f3d_040019c4: - llv $v13[0], 0x18($1) // xy_int after viewport - llv $v14[0], 0x18($2) - llv $v15[0], 0x18($3) - lw $13, 0x04($29) // geometrymode - addi $8, $zero, setupTemp // setup temp area - lsv $v21[0], 0x02($29) - lsv $v5[0], 0x06($1) // w_int p1 - vsub $v10, $v14, $v13 // p2-p1 - lsv $v6[0], 0x0e($1) // w_frac p1 - vsub $v9, $v15, $v13 // p3-p1 - lsv $v5[2], 0x06($2) - vsub $v12, $v13, $v14 // p1-p2 - lsv $v6[2], 0x0e($2) - lsv $v5[4], 0x06($3) - lsv $v6[4], 0x0e($3) - vmudh $v16, $v9, $v10[1] // (p3-p1)*((p2-p1)_y) - lh $9, 0x1a($1) // y_int after viewport - vsar $v18, $v18, $v18[1] // high into $v18 - lh $10, 0x1a($2) - vsar $v17, $v17, $v17[0] // bits 47..31 of ACC - lh $11, 0x1a($3) - vmudh $v16, $v12, $v9[1] // (p1-p2)*((p3-p1)_y) - andi $14, $13, G_CULL_FRONT - vsar $v20, $v20, $v20[1] - andi $15, $13, G_CULL_BACK - vsar $v19, $v19, $v19[0] - addi $12, $zero, 0 // now sort p1,p2,p3 by y -@@sort_points_loop: - slt $7, $10, $9 - blez $7, @@f3d_04001a58 - add $7, $10, $zero // y2_int < y1_int (after viewport) - add $10, $9, $zero // swap $9/$10 and swap $1/$2 - add $9, $7, $zero - addu $7, $2, $zero - addu $2, $1, $zero - addu $1, $7, $zero - xori $12, $12, 0x0001 // xor that we swapped p1 and p2 - nop // interesting place for NOP -@@f3d_04001a58: - vaddc $v28, $v18, $v20 - slt $7, $11, $10 - vadd $v29, $v17, $v19 - blez $7, @@f3d_04001a88 - add $7, $11, $zero // y3_int < y2_int? - add $11, $10, $zero // swap p2, p3 - add $10, $7, $zero - addu $7, $3, $zero - addu $3, $2, $zero - addu $2, $7, $zero - j @@sort_points_loop // go back to test y1 and new y2 - xori $12, $12, 0x0001 // xor that we swapped p2 and p3 -@@f3d_04001a88: - vlt $v27, $v29, $v31[0] - llv $v15[0], 0x18($3) // xy_int after viewport for new p3 - vor $v26, $v29, $v28 - llv $v14[0], 0x18($2) - llv $v13[0], 0x18($1) - blez $12, @@f3d_04001ab0 // skip if even number of swaps - vsub $v4, $v15, $v14 // p3-p2 - vmudn $v28, $v28, $v31[3] - vmadh $v29, $v29, $v31[3] - vmadn $v28, $v31, $v31[0] -@@f3d_04001ab0: - vsub $v10, $v14, $v13 // p2-p1 - mfc2 $17, $v27[0] - vsub $v9, $v15, $v13 // p3-p1 - mfc2 $16, $v26[0] - sra $17, $17, 31 - vmov $v29[3], $v29[0] - and $15, $15, $17 - vmov $v28[3], $v28[0] - vmov $v4[2], $v10[0] - beq $16, $zero, @@f3d_04001fd0 // skip this triangle? - xori $17, $17, 0xffff - vlt $v27, $v29, $v31[0] - and $14, $14, $17 - vmov $v4[3], $v10[1] - or $16, $15, $14 - vmov $v4[4], $v9[0] - bgtz $16, @@f3d_04001fd0 - vmov $v4[5], $v9[1] - mfc2 $7, $v27[0] - jal f3d_04001000 - addi $6, $zero, 0x80 // left major flag - bltz $7, @@f3d_04001b10 - lb $5, 0x07($29) // low byte for geometrymode - addi $6, $zero, 0 -@@f3d_04001b10: - vmudm $v9, $v4, $v31[4] - vmadn $v10, $v31, $v31[0] - vrcp $v8[1], $v4[1] - vrcph $v7[1], $v31[0] - ori $5, $5, 0x00c8 // OR with RDP command code - lb $7, 0x12($29) // mpmap level and tile ID - vrcp $v8[3], $v4[3] - vrcph $v7[3], $v31[0] - vrcp $v8[5], $v4[5] - vrcph $v7[5], $v31[0] - or $6, $6, $7 - vmudl $v8, $v8, $v30[4] - sb $5, 0x00($23) - vmadm $v7, $v7, $v30[4] - sb $6, 0x01($23) - vmadn $v8, $v31, $v31[0] - vmudh $v4, $v4, $v31[5] - lsv $v12[0], 0x18($2) - vmudl $v6, $v6, $v21[0] - lsv $v12[4], 0x18($1) - vmadm $v5, $v5, $v21[0] - lsv $v12[8], 0x18($1) - vmadn $v6, $v31, $v31[0] - sll $7, $9, 14 - vmudl $v1, $v8, $v10[0q] - vmadm $v1, $v7, $v10[0q] - vmadn $v1, $v8, $v9[0q] - vmadh $v0, $v7, $v9[0q] - mtc2 $7, $v2[0] - vmadn $v1, $v31, $v31[0] - sw $3, 0x00($8) - vmudl $v8, $v8, $v31[4] - vmadm $v7, $v7, $v31[4] - vmadn $v8, $v31, $v31[0] - vmudl $v1, $v1, $v31[4] - vmadm $v0, $v0, $v31[4] - vmadn $v1, $v31, $v31[0] - sh $11, 0x02($23) // YL - vand $v16, $v1, $v30[1] - sh $9, 0x06($23) // YH - vmudm $v12, $v12, $v31[4] - sw $2, 0x04($8) - vmadn $v13, $v31, $v31[0] - sw $1, 0x08($8) - sh $10, 0x04($23) // YM - vcr $v0, $v0, $v30[6] - ssv $v12[0], 0x08($23) // XL - vmudl $v11, $v16, $v2[0] - ssv $v13[0], 0x0a($23) // XL, frac - vmadm $v10, $v0, $v2[0] - ssv $v0[2], 0x0c($23) // DxLDy - vmadn $v11, $v31, $v31[0] - ssv $v1[2], 0x0e($23) // DxLDy, frac - andi $7, $5, G_TEXTURE_ENABLE - addi $15, $8, 8 - addi $16, $8, 0x10 - vsubc $v3, $v13, $v11[1q] - ssv $v0[10], 0x14($23) // DxHDy - vsub $v9, $v12, $v10[1q] - ssv $v1[10], 0x16($23) // DxHDy, frac - vsubc $v21, $v6, $v6[1] - ssv $v0[6], 0x1c($23) // DxMDy - vlt $v19, $v5, $v5[1] - ssv $v1[6], 0x1e($23) // DxMDy, frac - vmrg $v20, $v6, $v6[1] - ssv $v9[8], 0x10($23) // XH - vsubc $v21, $v20, $v6[2] - ssv $v3[8], 0x12($23) // XH, frac - vlt $v19, $v19, $v5[2] - ssv $v9[4], 0x18($23) // XM - vmrg $v20, $v20, $v6[2] - ssv $v3[4], 0x1a($23) // XM, frac - addi $23, $23, 0x20 - blez $7, @@f3d_04001cfc // no texture? - vmudl $v20, $v20, $v30[5] - lw $14, 0x00($15) - vmadm $v19, $v19, $v30[5] - lw $17, -0x04($15) - vmadn $v20, $v31, $v31[0] - lw $18, -0x08($15) - llv $v9[0], 0x14($14) - llv $v9[8], 0x14($17) - llv $v22[0], 0x14($18) - lsv $v11[0], 0x22($14) - lsv $v12[0], 0x20($14) - lsv $v11[8], 0x22($17) - vmov $v9[2], $v30[0] - lsv $v12[8], 0x20($17) - vmov $v9[6], $v30[0] - lsv $v24[0], 0x22($18) - vmov $v22[2], $v30[0] - lsv $v25[0], 0x20($18) - vmudl $v6, $v11, $v20[0] - vmadm $v6, $v12, $v20[0] - ssv $v19[0], 0x44($8) - vmadn $v6, $v11, $v19[0] - ssv $v20[0], 0x4c($8) - vmadh $v5, $v12, $v19[0] - vmudl $v16, $v24, $v20[0] - vmadm $v16, $v25, $v20[0] - vmadn $v20, $v24, $v19[0] - vmadh $v19, $v25, $v19[0] - vmudm $v16, $v9, $v6[0h] - vmadh $v9, $v9, $v5[0h] - vmadn $v10, $v31, $v31[0] - vmudm $v16, $v22, $v20[0] - vmadh $v22, $v22, $v19[0] - vmadn $v23, $v31, $v31[0] - sdv $v9[8], 0x10($16) - sdv $v10[8], 0x18($16) - sdv $v9[0], 0x00($16) - sdv $v10[0], 0x08($16) - sdv $v22[0], 0x20($16) - sdv $v23[0], 0x28($16) - vabs $v9, $v9, $v9 - llv $v19[0], 0x10($16) - vabs $v22, $v22, $v22 - llv $v20[0], 0x18($16) - vabs $v19, $v19, $v19 - vge $v17, $v9, $v22 - vmrg $v18, $v10, $v23 - vge $v17, $v17, $v19 - vmrg $v18, $v18, $v20 -@@f3d_04001cfc: - slv $v17[0], 0x40($8) - slv $v18[0], 0x48($8) - andi $7, $5, (G_SHADE | G_TEXTURE_ENABLE | G_ZBUFFER) - blez $7, @@f3d_04001fcc // skip code below if no bits set - vxor $v18, $v31, $v31 - luv $v25[0], 0x10($3) - vadd $v16, $v18, $v30[5] - luv $v15[0], 0x10($1) - vadd $v24, $v18, $v30[5] - andi $7, $13, 0x0200 - vadd $v5, $v18, $v30[5] - bgtz $7, @@f3d_04001d3c - luv $v23[0], 0x10($2) - luv $v25[0], 0x10($4) - luv $v15[0], 0x10($4) - luv $v23[0], 0x10($4) -@@f3d_04001d3c: - vmudm $v25, $v25, $v31[7] - vmudm $v15, $v15, $v31[7] - vmudm $v23, $v23, $v31[7] - ldv $v16[8], 0x18($8) - ldv $v15[8], 0x10($8) - ldv $v24[8], 0x28($8) - ldv $v23[8], 0x20($8) - ldv $v5[8], 0x38($8) - ldv $v25[8], 0x30($8) - lsv $v16[14], 0x1e($1) - lsv $v15[14], 0x1c($1) - lsv $v24[14], 0x1e($2) - lsv $v23[14], 0x1c($2) - lsv $v5[14], 0x1e($3) - lsv $v25[14], 0x1c($3) - vsubc $v12, $v24, $v16 - vsub $v11, $v23, $v15 - vsubc $v20, $v16, $v5 - vsub $v19, $v15, $v25 - vsubc $v10, $v5, $v16 - vsub $v9, $v25, $v15 - vsubc $v22, $v16, $v24 - vsub $v21, $v15, $v23 - vmudn $v6, $v10, $v4[3] - vmadh $v6, $v9, $v4[3] - vmadn $v6, $v22, $v4[5] - vmadh $v6, $v21, $v4[5] - vsar $v9, $v9, $v9[0] - vsar $v10, $v10, $v10[1] - vmudn $v6, $v12, $v4[4] - vmadh $v6, $v11, $v4[4] - vmadn $v6, $v20, $v4[2] - vmadh $v6, $v19, $v4[2] - vsar $v11, $v11, $v11[0] - vsar $v12, $v12, $v12[1] - vmudl $v6, $v10, $v26[3] - vmadm $v6, $v9, $v26[3] - vmadn $v10, $v10, $v27[3] - vmadh $v9, $v9, $v27[3] - vmudl $v6, $v12, $v26[3] - vmadm $v6, $v11, $v26[3] - vmadn $v12, $v12, $v27[3] - sdv $v9[0], 0x08($23) - vmadh $v11, $v11, $v27[3] - sdv $v10[0], 0x18($23) - vmudn $v6, $v12, $v31[1] - vmadh $v6, $v11, $v31[1] - vmadl $v6, $v10, $v1[5] - vmadm $v6, $v9, $v1[5] - vmadn $v14, $v10, $v0[5] - sdv $v11[0], 0x28($23) - vmadh $v13, $v9, $v0[5] - sdv $v12[0], 0x38($23) - vmudl $v28, $v14, $v2[0] - sdv $v13[0], 0x20($23) - vmadm $v6, $v13, $v2[0] - sdv $v14[0], 0x30($23) - vmadn $v28, $v31, $v31[0] - vsubc $v18, $v16, $v28 - vsub $v17, $v15, $v6 - andi $7, $5, G_SHADE - blez $7, @@f3d_04001e44 - andi $7, $5, G_TEXTURE_ENABLE - addi $23, $23, 0x40 - sdv $v17[0], -0x40($23) - sdv $v18[0], -0x30($23) -@@f3d_04001e44: - blez $7, @@f3d_04001f48 - andi $7, $5, G_ZBUFFER - addi $16, $zero, 0x0800 - mtc2 $16, $v19[0] - vabs $v24, $v9, $v9 - ldv $v20[8], 0x40($8) - vabs $v25, $v11, $v11 - ldv $v21[8], 0x48($8) - vmudm $v24, $v24, $v19[0] - vmadn $v26, $v31, $v31[0] - vmudm $v25, $v25, $v19[0] - vmadn $v27, $v31, $v31[0] - vmudl $v21, $v21, $v19[0] - vmadm $v20, $v20, $v19[0] - vmadn $v21, $v31, $v31[0] - vmudn $v26, $v26, $v31[2] - vmadh $v24, $v24, $v31[2] - vmadn $v26, $v31, $v31[0] - vmadn $v23, $v27, $v31[1] - vmadh $v22, $v25, $v31[1] - addi $16, $zero, 0x40 - vmadn $v6, $v21, $v31[1] - mtc2 $16, $v19[0] - vmadh $v5, $v20, $v31[1] - vsubc $v23, $v6, $v6[5] - vge $v5, $v5, $v5[5] - vmrg $v6, $v6, $v6[5] - vsubc $v23, $v6, $v6[6] - vge $v5, $v5, $v5[6] - vmrg $v6, $v6, $v6[6] - vmudl $v6, $v6, $v19[0] - vmadm $v5, $v5, $v19[0] - vmadn $v6, $v31, $v31[0] - vrcph $v23[0], $v5[4] - vrcpl $v6[0], $v6[4] - vrcph $v5[0], $v31[0] - vmudn $v6, $v6, $v31[2] - vmadh $v5, $v5, $v31[2] - vlt $v5, $v5, $v31[1] - vmrg $v6, $v6, $v31[0] - vmudl $v20, $v18, $v6[0] - vmadm $v20, $v17, $v6[0] - vmadn $v20, $v18, $v5[0] - vmadh $v19, $v17, $v5[0] - vmudl $v22, $v10, $v6[0] - vmadm $v22, $v9, $v6[0] - vmadn $v22, $v10, $v5[0] - sdv $v19[8], 0x00($23) - vmadh $v21, $v9, $v5[0] - sdv $v20[8], 0x10($23) - vmudl $v24, $v12, $v6[0] - vmadm $v24, $v11, $v6[0] - vmadn $v24, $v12, $v5[0] - sdv $v21[8], 0x08($23) - vmadh $v23, $v11, $v5[0] - sdv $v22[8], 0x18($23) - vmudl $v26, $v14, $v6[0] - vmadm $v26, $v13, $v6[0] - vmadn $v26, $v14, $v5[0] - sdv $v23[8], 0x28($23) - vmadh $v25, $v13, $v5[0] - sdv $v24[8], 0x38($23) - addi $23, $23, 0x40 - sdv $v25[8], -0x20($23) - sdv $v26[8], -0x10($23) -@@f3d_04001f48: - blez $7, @@f3d_04001fcc - vmudn $v14, $v14, $v30[4] - vmadh $v13, $v13, $v30[4] - vmadn $v14, $v31, $v31[0] - vmudn $v16, $v16, $v30[4] - vmadh $v15, $v15, $v30[4] - vmadn $v16, $v31, $v31[0] - ssv $v13[14], 0x08($23) - vmudn $v10, $v10, $v30[4] - ssv $v14[14], 0x0a($23) - vmadh $v9, $v9, $v30[4] - vmadn $v10, $v31, $v31[0] - vmudn $v12, $v12, $v30[4] - vmadh $v11, $v11, $v30[4] - vmadn $v12, $v31, $v31[0] - lbu $7, 0x11($29) - sub $7, $zero, $7 - beq $7, $zero, @@f3d_04001f9c - mtc2 $7, $v6[0] - vch $v11, $v11, $v6[0] - vcl $v12, $v12, $v31[0] -@@f3d_04001f9c: - ssv $v9[14], 0x04($23) - vmudl $v28, $v14, $v2[0] - ssv $v10[14], 0x06($23) - vmadm $v6, $v13, $v2[0] - ssv $v11[14], 0x0c($23) - vmadn $v28, $v31, $v31[0] - ssv $v12[14], 0x0e($23) - vsubc $v18, $v16, $v28 - vsub $v17, $v15, $v6 - addi $23, $23, 0x10 - ssv $v17[14], -0x10($23) - ssv $v18[14], -0x0e($23) -@@f3d_04001fcc: - jal f3d_04001178 -@@f3d_04001fd0: - nop - jr $30 - nop - nop -Overlay0End: - -// Overlay 1 -.headersize 0x04001000 - orga() -.definelabel Overlay1LoadStart, orga() -// reciprocal method, see RSP Programmers Guide page 79 -// $v29[3]=s_int, $v28[3]=s_frac, $v29[7]=t_int, $v28[7]=t_frac -// out: $v27[3,7]=s,t int, $v26[3,7]=s,t frac -Overlay1Address: -f3d_04001000: - vrcph $v27[3], $v29[3] - vrcpl $v26[3], $v28[3] - vrcph $v27[3], $v29[7] - vrcpl $v26[7], $v28[7] - vrcph $v27[7], $v31[0] - vmudn $v26, $v26, $v31[2] // 0002, << 1 since input is S15.16 - vmadh $v27, $v27, $v31[2] - vmadn $v26, $v31, $v31[0] - // $v27[3]=sres_int, $v26[3]=sres_frac, $v27[7]=tres_int, $v26[7]=tres_frac - lqv $v23[0], 0x60($zero) - vxor $v22, $v31, $v31 // (1/w)*w - vmudl $v24, $v26, $v28 - vmadm $v24, $v27, $v28 - vmadn $v24, $v26, $v29 - vmadh $v25, $v27, $v29 - // $v24=frac, $v25=int, should be very close to 1.0 - vsubc $v24, $v22, $v24 // take 2.0-result (better rounding?) - vsub $v25, $v23, $v25 - vmudl $v22, $v26, $v24 // (2.0-(1/w)*w)*(1/w) - vmadm $v23, $v27, $v24 - vmadn $v26, $v26, $v25 - vmadh $v27, $v27, $v25 - jr $ra - nop - -dma_wait_dl: - jal wait_while_dma_busy - addi $27, $zero, inputDisplayList - -read_next_task_entry: - lw $25, 0x00($27) // first command word - lw $24, 0x04($27) // second command word - srl $1, $25, 29 - andi $1, $1, 0x0006 // $1 = (two MSbits) << 1 - addi $26, $26, 8 // increase next task in DRAM ptr - addi $27, $27, 8 // increase next task in DMEM ptr - addi $28, $28, -8 // decrease task count left in DMEM - bgtz $1, dispatch_task - andi $18, $25, 0x01ff - addi $22, $zero, inputData // command that loads data input -Overlay1End: - - -// Overlay 2 -.headersize 0x04001768 - orga() -Overlay2Address: - b perform_clip - sh $ra, data0158 - nop - nop - ori $30, $zero, overlayInfo3 - b load_overlay - lh $21, lightEntry - -perform_clip: - sh $3, clipTemp - sh $2, data0942 - sh $1, data0944 - sh $zero, data0946 - ori $7, $zero, 0x0db8 - ori $30, $zero, clipTemp - ori $6, $zero, 0x000c -next_clip: - or $5, $30, $30 - xori $30, $30, 0x0014 -f3d_040017a8: - beq $6, $zero, @f3d_04001954 - lh $11, 0xa6($6) - addi $6, $6, -2 - ori $17, $zero, 0x0000 - or $18, $zero, $zero - -found_in: - ori $2, $5, 0x0000 - -found_out: - j f3d_040017d4 - addi $14, $30, 2 -f3d_040017c8: - and $8, $8, $11 - beq $8, $18, f3d_o2_04001804 - addi $2, $2, 2 -f3d_040017d4: - or $20, $10, $zero - sh $10, 0x00($14) - addi $14, $14, 2 -f3d_040017e0: - lh $10, 0x00($2) - bne $10, $zero, f3d_040017c8 - lh $8, 0x24($10) - addi $8, $17, -2 - bgtz $8, f3d_040017e0 - ori $2, $5, 0x0000 - beq $8, $zero, f3d_040017a8 - nop - j f3d_04001980 -f3d_o2_04001804: - xor $18, $18, $11 - lh $8, lo(labelLUT)($17) - addi $17, $17, 2 - jr $8 - lh $8, nextClipEntry - -found_first_in: - mtc2 $10, $v13[0] - or $10, $20, $zero - mfc2 $20, $v13[0] - ori $14, $30, 0x0000 - lh $8, foundOutEntry - -found_first_out: - sh $8, data0106 - addi $7, $7, 0x28 - sh $7, 0x00($14) - sh $zero, 0x02($14) - ldv $v9[0], 0x00($10) - ldv $v10[0], 0x08($10) - ldv $v4[0], 0x00($20) - ldv $v5[0], 0x08($20) - sll $8, $6, 2 - ldv $v1[0], 0x70($8) - vmudh $v0, $v1, $v31[3] - vmudn $v12, $v5, $v1 - vmadh $v11, $v4, $v1 - vmadn $v12, $v31, $v31[0] - vmadn $v28, $v10, $v0 - vmadh $v29, $v9, $v0 - vmadn $v28, $v31, $v31[0] - vaddc $v26, $v28, $v28[0q] - vadd $v27, $v29, $v29[0q] - vaddc $v28, $v26, $v26[1h] - vadd $v29, $v27, $v27[1h] - mfc2 $8, $v29[6] - vrcph $v7[3], $v29[3] - vrcpl $v3[3], $v28[3] - vrcph $v7[3], $v31[0] - vmudn $v3, $v3, $v31[2] - bgez $8, f3d_040018a4 - vmadh $v7, $v7, $v31[2] - vmudn $v3, $v3, $v31[3] - vmadh $v7, $v7, $v31[3] -f3d_040018a4: - veq $v7, $v7, $v31[0] - vmrg $v3, $v3, $v31[3] - vmudl $v28, $v28, $v3[3] - vmadm $v29, $v29, $v3[3] - jal f3d_04001000 - vmadn $v28, $v31, $v31[0] - vaddc $v28, $v12, $v12[0q] - vadd $v29, $v11, $v11[0q] - vaddc $v12, $v28, $v28[1h] - vadd $v11, $v29, $v29[1h] - vmudl $v15, $v12, $v26 - vmadm $v15, $v11, $v26 - vmadn $v15, $v12, $v27 - vmadh $v8, $v11, $v27 - vmudl $v28, $v31, $v31[5] - vmadl $v15, $v15, $v3[3] - vmadm $v8, $v8, $v3[3] - vmadn $v15, $v31, $v31[0] - veq $v8, $v8, $v31[0] - vmrg $v15, $v15, $v31[3] - vne $v15, $v15, $v31[0] - vmrg $v15, $v15, $v31[1] - vnxor $v8, $v15, $v31[0] - vaddc $v8, $v8, $v31[1] - vadd $v29, $v29, $v29 - vmudl $v28, $v5, $v8[3h] - vmadm $v29, $v4, $v8[3h] - vmadl $v28, $v10, $v15[3h] - vmadm $v29, $v9, $v15[3h] - vmadn $v28, $v31, $v31[0] - luv $v12[0], 0x10($10) - luv $v11[0], 0x10($20) - llv $v12[8], 0x14($10) - llv $v11[8], 0x14($20) - vmudm $v18, $v12, $v15[3] - vmadm $v18, $v11, $v8[3] - suv $v18[0], 0x00($7) - sdv $v18[8], 0x08($7) - ldv $v18[0], 0x08($7) - jal f3d_040014e8 - lw $15, 0x00($7) - mfc2 $10, $v13[0] - j @f3d_040015e8 - ori $9, $zero, 0x0001 -@f3d_04001954: - lh $8, 0x00($5) - sh $8, 0xb4($zero) - sh $5, data0106 - lh $30, clipDrawEntry - -clip_draw_loop: - lh $8, data0106 - lh $3, 0xb4($zero) - lh $2, 0x02($8) - lh $1, 0x04($8) - addi $8, $8, 2 - bne $1, $zero, f3d_040019c4 - sh $8, data0106 -f3d_04001980: - j SP_NOOP - nop -Overlay2End: - -// Overlay 3 -.headersize 0x04001768 - orga() -Overlay3Address: - ori $30, $zero, overlayInfo2 - b load_overlay - lh $21, performClipEntry - lw $1, numLights - sw $15, 0x00($7) // normal vector 1st vertex - sw $16, 0x04($7) // normal vector 2nd vertex - bltz $1, @init_lights - lpv $v4[0], 0x00($7) - luv $v7[0], 0x01d0($1) // ambient RGB - vxor $v27, $v27, $v27 -@@f3d_04001790: - vge $v7, $v7, $v31[0] // max(0, $v7) - lpv $v5[0], 0x01c0($1) // calculated light - vadd $v27, $v27, $v7 - luv $v7[0], 0x01b0($1) // light's RGB - vor $v20, $v6, $v31[0] - vmulf $v6, $v4, $v5 // mul normal vector - vadd $v3, $v6, $v6[1q] - vadd $v6, $v3, $v6[2h] - vmulf $v7, $v7, $v6[0h] // $v6[0] and $v6[4] contain dot product - bgtz $1, @@f3d_04001790 - addi $1, $1, -0x20 - suv $v27[0], 0x00($7) - andi $8, $3, G_TEXTURE_GEN_H - sb $15, 0x03($7) - sb $16, 0x07($7) - lw $15, 0x00($7) - beq $8, $zero, @f3d_040015e4 - lw $16, 0x04($7) - andi $8, $3, G_TEXTURE_GEN_LINEAR_H // not used in SM64 - lpv $v7[0], 0x90($29) - ldv $v6[0], 0xa0($zero) - vmadn $v20, $v7, $v20[0h] - beq $8, $zero, @@f3d_o3_04001804 - vmadm $v18, $v31, $v31[0] - vmulf $v7, $v18, $v18 - vmulf $v7, $v7, $v18 - vmulf $v20, $v7, $v6[1] - vmacf $v20, $v7, $v6[3] - vmacf $v18, $v18, $v6[2] -@@f3d_o3_04001804: - j @f3d_040015e4 - vadd $v18, $v18, $v31[4] - -@init_lights: - andi $1, $1, 0x0fff - sw $1, numLights - jal f3d_04001524 - addi $8, $zero, modelViewMatrixStack - ori $8, $zero, scratchSpace - stv $v8[2], 0x10($8) // transpose - stv $v8[4], 0x20($8) - stv $v8[12], 0x30($8) - stv $v8[14], 0x40($8) - ltv $v8[14], 0x10($8) - ltv $v8[12], 0x20($8) - ltv $v8[4], 0x30($8) - ltv $v8[2], 0x40($8) - sdv $v12[8], 0x10($8) - sdv $v13[8], 0x20($8) - sdv $v14[8], 0x30($8) - ldv $v12[0], 0x10($8) - ldv $v13[0], 0x20($8) - ldv $v14[0], 0x30($8) -f3d_04001858: - lpv $v5[0], 0x01b8($1) // this light's dir vector - vmulf $v5, $v5, $v31[4] - vmudn $v6, $v12, $v5[0h] - vmadn $v6, $v13, $v5[1h] - vmadn $v6, $v14, $v5[2h] - vmadm $v3, $v31, $v31[0] - vmudm $v6, $v3, $v31[2] - vmacf $v3, $v8, $v5[0h] - vmacf $v3, $v9, $v5[1h] - vmacf $v3, $v10, $v5[2h] - vmadn $v6, $v31, $v31[0] - vmudl $v5, $v6, $v6 - vmadm $v5, $v3, $v6 - vmadn $v5, $v6, $v3 - vmadh $v26, $v3, $v3 - vaddc $v7, $v5, $v5[1q] - vadd $v4, $v26, $v26[1q] - vaddc $v7, $v5, $v7[0h] - vadd $v4, $v26, $v4[0h] - vrsqh $v11[0], $v4[2] // normalize vector - vrsql $v15[0], $v7[2] - vrsqh $v11[0], $v31[0] - vmudl $v15, $v15, $v30[3] - vmadm $v11, $v11, $v30[3] - vmadn $v15, $v31, $v31[0] - vmudl $v7, $v6, $v15[0] - vmadm $v7, $v3, $v15[0] - vmadn $v7, $v6, $v11[0] - vmadh $v4, $v3, $v11[0] - vmadn $v7, $v31, $v31[0] - ldv $v2[0], 0xf8($29) - vge $v7, $v7, $v2[0] - vlt $v7, $v7, $v2[1] - vmudn $v7, $v7, $v2[2] - spv $v7[0], 0x01c0($1) - lw $8, 0x01c0($1) - sw $8, 0x01c4($1) - bgtz $1, f3d_04001858 - addi $1, $1, -0x20 - j load_mp_matrix - lh $ra, lightEntry - nop -Overlay3End: - -// Overlay 4 -.headersize 0x04001768 - orga() -Overlay4Address: - j f3d_04001788 - nop -overlay_4_entry: - nop - jal wait_while_dma_busy - ori $2, $zero, 0x4000 - mtc0 $2, SP_STATUS - break - nop -f3d_04001788: - ori $2, $zero, 0x1000 - sw $28, data08E4 - sw $27, data08E8 - sw $26, data08EC - sw $23, data08F0 - lw $19, dramPtr - ori $20, $zero, 0x0000 - ori $18, $zero, 0x08ff - jal dma_read_write - ori $17, $zero, 0x0001 - jal wait_while_dma_busy - nop - j f3d_040010c8 - mtc0 $2, SP_STATUS - nop - nop - addiu $zero, $zero, 0xbeef - nop -Overlay4End: - -.close // CODE_FILE diff --git a/rsp/gbi.inc b/rsp/gbi.inc deleted file mode 100644 index 1ea1314c..00000000 --- a/rsp/gbi.inc +++ /dev/null @@ -1,19 +0,0 @@ -// GBI: Graphics Binary Interface - -G_FOG equ 0x00010000 -G_LIGHTING equ 0x00020000 -G_TEXTURE_GEN equ 0x00040000 -G_TEXTURE_GEN_LINEAR equ 0x00080000 - -G_FOG_H equ (G_FOG/0x10000) -G_LIGHTING_H equ (G_LIGHTING/0x10000) -G_TEXTURE_GEN_H equ (G_TEXTURE_GEN/0x10000) -G_TEXTURE_GEN_LINEAR_H equ(G_TEXTURE_GEN_LINEAR/0x10000) - - -G_CULL_BACK equ 0x00002000 -G_CULL_FRONT equ 0x00001000 - -G_ZBUFFER equ 0x00000001 -G_TEXTURE_ENABLE equ 0x00000002 -G_SHADE equ 0x00000004