mirror of
https://github.com/HackerN64/F3DEX3.git
synced 2026-01-21 10:37:45 -08:00
Initial commit
This commit is contained in:
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
F3DZEX_*/
|
||||
F3DEX2_*/
|
||||
.vscode
|
||||
|
||||
149
Makefile
Normal file
149
Makefile
Normal 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
|
||||
83
rsp/gbi.inc
Normal file
83
rsp/gbi.inc
Normal 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
33
rsp/rsp_defs.inc
Normal 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)
|
||||
Reference in New Issue
Block a user