Initial commit

This commit is contained in:
Mr-Wiseguy
2020-09-17 20:09:02 -04:00
commit bb7554c137
5 changed files with 2154 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
F3DZEX_*/
F3DEX2_*/
.vscode

149
Makefile Normal file
View File

@@ -0,0 +1,149 @@
# Selects the microcode to assemble. Options are F3DEX2 and F3DZEX
UCODE ?= F3DEX2
# Set to 1 to enable NoN(No Nearclipping). Note that no official F3DZEX exists without NoN.
NoN ?= 0
# Selects which version of a given microcode to build:
# F3DEX2:
# 2.08 (Banjo-Tooie, the best game on the N64)
# 2.04H (Kirby 64, Smash 64)
#
# F3DZEX:
# 2.08J (Animal Forest) (Recommended over 2.08I due to a change properly zeroes out $v0)
# 2.08I (Majora's Mask)
# 2.06H (Ocarina of Time)
VERSION ?= 2.08
ARMIPS ?= armips
COMPARE_DIR ?= C:\m64\sm64_f3dzex\lib\PR\f3dex2
# List of all microcodes buildable with this codebase
UCODES := F3DEX2_2.08 F3DEX2_2.04H \
F3DEX2_NoN_2.08 F3DEX2_NoN_2.04H \
F3DZEX_2.08J F3DZEX_2.08I F3DZEX_2.06H \
F3DZEX_NoN_2.08J F3DZEX_NoN_2.08I F3DZEX_NoN_2.06H
# F3DEX2
MD5_CODE_F3DEX2_2.08 := 6ccf5fc392e440fb23bc7d7f7d71047c
MD5_DATA_F3DEX2_2.08 := 3a3a406acb4295d33fa6e918dd3a7ae4
MD5_CODE_F3DEX2_NoN_2.08 := b5c366b55a032f232aa309cda21be3d7
MD5_DATA_F3DEX2_NoN_2.08 := 2c8dedc1b1e2fe6405c9895c4290cf2b
MD5_CODE_F3DEX2_2.04H := d3a58568fa7cf042de370912a47c3b5f
MD5_DATA_F3DEX2_2.04H := 6639b2fd15a73c5446aff592bb599983
# F3DZEX
MD5_CODE_F3DZEX_NoN_2.08J := a7f45433a67950cdd239ee40f1dd36c1
MD5_DATA_F3DZEX_NoN_2.08J := f17544afa0dce84d589ec3d8c38254c7
MD5_CODE_F3DZEX_NoN_2.08I := ca0a31df36dbeda69f09e9850e68c7f7
MD5_DATA_F3DZEX_NoN_2.08I := d31cea0e173c6a4a09e4dfe8f259c91b
MD5_CODE_F3DZEX_NoN_2.06H := 96a1a7a8eab45e0882aab9e4d8ccbcc3
MD5_DATA_F3DZEX_NoN_2.06H := e48c7679f1224b7c0947dcd5a4d0c713
# Microcode strings
# F3DEX2
NAME_F3DEX2_2.08 := RSP Gfx ucode F3DEX fifo 2.08 Yoshitaka Yasumoto 1999 Nintendo.
NAME_F3DEX2_2.04H := RSP Gfx ucode F3DEX fifo 2.04H Yoshitaka Yasumoto 1998 Nintendo.
NAME_F3DEX2_NoN_2.08 := RSP Gfx ucode F3DEX.NoN fifo 2.08 Yoshitaka Yasumoto 1999 Nintendo.
NAME_F3DEX2_NoN_2.04H := RSP Gfx ucode F3DEX.NoN fifo 2.04H Yoshitaka Yasumoto 1998 Nintendo.
# F3DZEX
NAME_F3DZEX_2.08J := RSP Gfx ucode F3DZEX.NoN fifo 2.08J Yoshitaka Yasumoto/Kawasedo 1999.
NAME_F3DZEX_2.08I := RSP Gfx ucode F3DZEX.NoN fifo 2.08I Yoshitaka Yasumoto/Kawasedo 1999.
NAME_F3DZEX_2.06H := RSP Gfx ucode F3DZEX.NoN fifo 2.06H Yoshitaka Yasumoto 1998 Nintendo.
# Use the same name as NoN so that emulators recognize it since there was no F3DZEX without NoN
NAME_F3DZEX_NoN_2.08J := RSP Gfx ucode F3DZEX.NoN fifo 2.08J Yoshitaka Yasumoto/Kawasedo 1999.
NAME_F3DZEX_NoN_2.08I := RSP Gfx ucode F3DZEX.NoN fifo 2.08I Yoshitaka Yasumoto/Kawasedo 1999.
NAME_F3DZEX_NoN_2.06H := RSP Gfx ucode F3DZEX.NoN fifo 2.06H Yoshitaka Yasumoto 1998 Nintendo.
ID_F3DEX2_2.04H := 0
ID_F3DEX2_2.08 := 1
ID_F3DZEX_2.06H := 0
ID_F3DZEX_2.08I := 1
ID_F3DZEX_2.08J := 2
TYPE_F3DEX2 := 0
TYPE_F3DZEX := 1
NO_COL := \033[0m
BOLD := # \033[1m
RED := \033[0;31m
GREEN := \033[0;32m
YELLOW := \033[0;33m
BLUE := \033[0;34m
INFO := $(NO_COL)
SUCCESS := $(GREEN)
FAILURE := $(RED)
WARNING := $(YELLOW)
# Sets up the variables for a microcode rule
define set_vars
FULL_UCODE := $(1)
# These need to be eval'd to use their values in this same function
CUR_UCODE_WITHOUT_NON := $(subst _NoN,,$(1))
CUR_VERSION := $$(subst F3DZEX_,,$$(subst F3DEX2_,,$$(CUR_UCODE_WITHOUT_NON)))
CUR_UCODE := $$(patsubst %_$$(CUR_VERSION),%,$$(CUR_UCODE_WITHOUT_NON))
OUTPUT_DIR := $(1)
CODE_FILE := $$(OUTPUT_DIR)/$(1).code
DATA_FILE := $$(OUTPUT_DIR)/$(1).data
SYM_FILE := $$(OUTPUT_DIR)/$(1).sym
TEMP_FILE := $$(OUTPUT_DIR)/$(1).tmp.s
ifeq ($(findstring _NoN,$(1)),)
CUR_NoN := 0
else
CUR_NoN := 1
endif
NAME := $(NAME_$(1))
ID := $$(ID_$$(CUR_UCODE_WITHOUT_NON))
TYPE := $$(TYPE_$$(CUR_UCODE))
CODE_MD5 := $$(MD5_CODE_$(1))
DATA_MD5 := $$(MD5_DATA_$(1))
endef
# Sets up the microcode make rules
define ucode_rule
$(eval $(call set_vars,$(1)))
$(CODE_FILE) $(DATA_FILE) $(SYM_FILE) $(SYM2_FILE) $(TEMP_FILE): ./f3dex2.s ./rsp/* $(OUTPUT_DIR)
@printf "$(INFO)Building microcode: $(FULL_UCODE)$(NO_COL)\n"
@$(ARMIPS) -strequ DATA_FILE $(DATA_FILE) -strequ CODE_FILE $(CODE_FILE) -strequ NAME "$(NAME)" -equ UCODE_TYPE $(TYPE) -equ UCODE_ID $(ID) -equ NoN $(CUR_NoN) f3dex2.s -sym2 $(SYM_FILE) -temp $(TEMP_FILE)
ifeq ($(CODE_MD5),)
@printf " $(WARNING)Nothing to compare $(1) to!$(NO_COL)\n"
else
@(printf "$(CODE_MD5) *$(CODE_FILE)" | md5sum --status -c -) && printf " $(SUCCESS)$(1) code matches$(NO_COL)\n" || printf " $(FAILURE)$(1) code differs$(NO_COL)\n"
@(printf "$(DATA_MD5) *$(DATA_FILE)" | md5sum --status -c -) && printf " $(SUCCESS)$(1) data matches$(NO_COL)\n" || printf " $(FAILURE)$(1) data differs$(NO_COL)\n"
endif
$(OUTPUT_DIR):
@printf "$(INFO)Creating directory: ./$(OUTPUT_DIR)$(NO_COL)\n"
@mkdir $(OUTPUT_DIR)
OUTPUT_DIRS += $(OUTPUT_DIR)
CODE_FILES += $(CODE_FILE)
endef
ifeq ($(NoN),1)
SUFFIX := _NoN
else
SUFFIX :=
endif
INPUT_UCODE := $(UCODE)$(SUFFIX)_$(VERSION)
OUTPUT_DIR := $(INPUT_UCODE)
CODE_FILE := $(OUTPUT_DIR)/$(INPUT_UCODE).code
DATA_FILE := $(OUTPUT_DIR)/$(INPUT_UCODE).data
default: $(CODE_FILE) $(DATA_FILE)
$(foreach ucode,$(UCODES),$(eval $(call ucode_rule,$(ucode))))
all: $(CODE_FILES)
clean:
@printf "$(WARNING)Deleting all built microcode files$(NO_COL)\n"
@rm -rf $(OUTPUT_DIRS)
.PHONY: default check all clean

1885
f3dex2.s Normal file

File diff suppressed because it is too large Load Diff

83
rsp/gbi.inc Normal file
View File

@@ -0,0 +1,83 @@
// GBI: Graphics Binary Interface
// Geometry mode flags
G_ZBUFFER equ 0x00000001
G_TEXTURE_ENABLE equ 0x00000002
G_SHADE equ 0x00000004
G_CULL_FRONT equ 0x00000200
G_CULL_BACK equ 0x00000400
G_CULL_BOTH equ 0x00000600
G_FOG equ 0x00010000
G_LIGHTING equ 0x00020000
G_TEXTURE_GEN equ 0x00040000
G_TEXTURE_GEN_LINEAR equ 0x00080000
G_LOD equ 0x00100000
G_SHADING_SMOOTH equ 0x00200000
G_POINT_LIGHTING equ 0x00400000
G_CLIPPING equ 0x00800000
; dma
G_NOOP equ 0x00
G_RDPHALF_2 equ 0xf1
G_SETOTHERMODE_H equ 0xe3
G_SETOTHERMODE_L equ 0xe2
G_RDPHALF_1 equ 0xe1
G_SPNOOP equ 0xe0
G_ENDDL equ 0xdf
G_DL equ 0xde
G_LOAD_UCODE equ 0xdd
G_MOVEMEM equ 0xdc
G_MOVEWORD equ 0xdb
G_MTX equ 0xda
G_GEOMETRYMODE equ 0xd9
G_POPMTX equ 0xd8
G_TEXTURE equ 0xd7
G_DMA_IO equ 0xd6
G_SPECIAL_1 equ 0xd5
G_SPECIAL_2 equ 0xd4
G_SPECIAL_3 equ 0xd3
; immediate
G_VTX equ 0x01
G_MODIFYVTX equ 0x02
G_CULLDL equ 0x03
G_BRANCH_Z equ 0x04
G_TRI1 equ 0x05
G_TRI2 equ 0x06
G_QUAD equ 0x07
G_LINE3D equ 0x08
; rdp
G_SETCIMG equ 0xff
G_SETZIMG equ 0xfe
G_SETTIMG equ 0xfd
G_SETCOMBINE equ 0xfc
G_SETENVCOLOR equ 0xfb
G_SETPRIMCOLOR equ 0xfa
G_SETBLENDCOLOR equ 0xf9
G_SETFOGCOLOR equ 0xf8
G_SETFILLCOLOR equ 0xf7
G_FILLRECT equ 0xf6
G_SETTILE equ 0xf5
G_LOADTILE equ 0xf4
G_LOADBLOCK equ 0xf3
G_SETTILESIZE equ 0xf2
G_LOADTLUT equ 0xf0
G_RDPSETOTHERMODE equ 0xef
G_SETPRIMDEPTH equ 0xee
G_SETSCISSOR equ 0xed
G_SETCONVERT equ 0xec
G_SETKEYR equ 0xeb
G_SETKEYGB equ 0xea
G_RDPFULLSYNC equ 0xe9
G_RDPTILESYNC equ 0xe8
G_RDPPIPESYNC equ 0xe7
G_RDPLOADSYNC equ 0xe6
G_TEXRECTFLIP equ 0xe5
G_TEXRECT equ 0xe4
G_MTX_P_MV equ 0x04
G_MTX_MUL_LOAD equ 0x02
G_MTX_NOPUSH_PUSH equ 0x01
vtxSize equ 0x10

33
rsp/rsp_defs.inc Normal file
View File

@@ -0,0 +1,33 @@
// RSP definitions
// OSTask placed at end of DMEM (IMEM_START - sizeof(OSTask))
.definelabel OSTask_addr, 0xFC0
// OSTask data member offsets
OSTask_flags equ 0x04
OSTask_ucode equ 0x10
OSTask_ucode_size equ 0x14 // ucode_size is ignored
OSTask_ucode_data equ 0x18
OSTask_ucode_data_size equ 0x1C
// flags
OS_TASK_DP_WAIT equ 0x0002
// RSP Status flags
SPSTATUS_SIGNAL0_SET equ 0x0080
// RDP Status read flags
DPC_STATUS_XBUS_DMA equ 0x0001
DPC_STATUS_DMA_BUSY equ 0x0100
DPC_STATUS_START_VALID equ 0x0400
// RDP Status write flags
DPC_STATUS_CLR_XBUS equ 0x0001
// Types
TYPE_F3DEX2 equ 0
TYPE_F3DZEX equ 1
UCODE_HAS_POINT_LIGHTING equ (UCODE_TYPE == TYPE_F3DZEX && UCODE_ID >= 1)
UCODE_IS_206_OR_OLDER equ ((UCODE_TYPE == TYPE_F3DZEX && UCODE_ID < 1) || (UCODE_TYPE == TYPE_F3DEX2 && UCODE_ID < 1))
UCODE_IS_F3DEX2_204H equ (UCODE_TYPE == TYPE_F3DEX2 && UCODE_ID == 0)