2023-02-15 22:28:04 -08:00
MAKEFLAGS += --no-builtin-rules
MAKEFLAGS += --no-builtin-variables
.SUFFIXES :
2023-02-14 16:03:21 -08:00
default :
2023-02-15 22:28:04 -08:00
@echo 'How to use this Makefile'
@echo 'Method 1) Select a microcode, just run e.g. `make F3DZEX_NoN_2.06H`'
@echo 'Method 2) `make ok`, builds all ucodes which have MD5 sums, to check if :OK:'
@echo 'Method 3) `make all`, builds all ucodes in database'
@echo 'Method 4) Custom microcode build via custom.mk file. Create a file custom.mk'
@echo 'with contents like this:'
@echo 'NAME := your_custom_ucode_name'
@echo 'GAMES := Your Romhack Name'
@echo 'ID_STR := Modded F3DZEX by LeEtHaCkEr64 / Real N64 or RSP LLE only. NO PROJECT64'
@echo ' ^ (this must be the exact number of characters)'
@echo 'OPTIONS := CFG_NoN CFG_POINT_LIGHTING etc.'
@echo 'Then run `make your_custom_ucode_name`. See the Makefile for the list of options.'
2023-02-14 10:44:08 -08:00
2023-02-15 22:28:04 -08:00
# With the defaults--all of these options unset--you get 2.08 (Banjo-Tooie),
# which has none of the bugs / the latest versions of everything, except
# G_BRANCH_Z (F3DEX2), no point lighting, and no NoN. Enabling the different
# BUG_ options *gives* you the bugs--the default is always with the bugs fixed.
# If you are modding and adding options, you just have to add them here, and
# in the options list for your custom configuration.
2023-02-14 10:44:08 -08:00
ALL_OPTIONS := \
CFG_G_BRANCH_W \
CFG_XBUS \
CFG_NoN \
CFG_POINT_LIGHTING \
CFG_OLD_TRI_WRITE \
CFG_EXTRA_0A_BEFORE_ID_STR \
CFG_G_SPECIAL_1_IS_RECALC_MVP \
CFG_CLIPPING_SUBDIVIDE_DESCENDING \
BUG_CLIPPING_FAIL_WHEN_SUM_ZERO \
BUG_NO_CLAMP_SCREEN_Z_POSITIVE \
BUG_TEXGEN_LINEAR_CLOBBER_S_T \
2023-02-14 16:03:21 -08:00
BUG_WRONG_INIT_VZERO \
2023-02-15 22:28:04 -08:00
BUG_FAIL_IF_CARRY_SET_AT_INIT \
2023-02-14 16:03:21 -08:00
BUG_HARMLESS_TASKDONE_WRONG_ADDR
2023-02-14 10:44:08 -08:00
ARMIPS ?= armips
2023-02-15 22:28:04 -08:00
PARENT_OUTPUT_DIR ?= ./build
i f e q ( $( PARENT_OUTPUT_DIR ) , . )
$( error Cannot build directly in repo directory; see Makefile for details.)
# The problem is that we want to be able to have targets like F3DEX2_2.08,
# but this would also be the directory itself, whose existence and possible
# modification needs to be handled by the Makefile. It is possible to write
# the Makefile where the directory is the main target for that microcode, but
# this has worse behavior in case of modification to the directory. Worse, if
# it was done this way, then it would break if the user tried to set
# PARENT_OUTPUT_DIR anywhere else. So, better to support building everywhere
# but here than to support only building here.
e n d i f
2023-02-14 10:44:08 -08:00
NO_COL := \0 33[ 0m
RED := \0 33[ 0; 31m
GREEN := \0 33[ 0; 32m
YELLOW := \0 33[ 0; 33m
BLUE := \0 33[ 0; 34m
2023-02-15 22:28:04 -08:00
INFO := $( BLUE)
2023-02-14 10:44:08 -08:00
SUCCESS := $( GREEN)
FAILURE := $( RED)
WARNING := $( YELLOW)
$(PARENT_OUTPUT_DIR) :
@printf " $( INFO) Creating parent output directory $( NO_COL) \n "
i f e q ( $( OS ) , W i n d o w s _ N T )
2023-02-15 22:28:04 -08:00
mkdir $@
2023-02-14 10:44:08 -08:00
e l s e
2023-02-15 22:28:04 -08:00
mkdir -p $@
2023-02-14 10:44:08 -08:00
e n d i f
ALL_UCODES :=
ALL_UCODES_WITH_MD5S :=
2023-02-14 16:03:21 -08:00
ALL_OUTPUT_DIRS :=
2023-02-14 10:44:08 -08:00
2023-02-15 22:28:04 -08:00
d e f i n e r e s e t _ v a r s
NAME :=
GAMES := ( Not used in any retail games)
ID_STR := Custom F3DEX2-based microcode, github.com/Mr-Wiseguy/f3dex2 & Nintendo
ID_STR := RSP Gfx ucode F3DEX fifo 2.04H Yoshitaka Yasumoto 1998 Nintendo.
MD5_CODE :=
MD5_DATA :=
OPTIONS :=
e n d e f
2023-02-14 10:44:08 -08:00
d e f i n e u c o d e _ r u l e
2023-02-15 22:28:04 -08:00
# Variables defined outside the function need one dollar sign, whereas
# variables defined within the function need two. This is because make first
# expands all this text, substituting single-dollar-sign variables, and then
# executes all of it, causing all the assignments to actually happen.
2023-02-14 10:44:08 -08:00
ifeq ( $( NAME) ,)
2023-02-15 22:28:04 -08:00
$$ ( error Microcode name not set!)
2023-02-14 10:44:08 -08:00
endif
2023-02-15 22:28:04 -08:00
UCODE_OUTPUT_DIR := $( PARENT_OUTPUT_DIR) /$( NAME)
2023-02-14 10:44:08 -08:00
ifeq ( $( OS) ,Windows_NT)
2023-02-15 22:28:04 -08:00
UCODE_OUTPUT_DIR := $$ ( subst /,\, $$ ( UCODE_OUTPUT_DIR) )
2023-02-14 10:44:08 -08:00
endif
CODE_FILE := $$ ( UCODE_OUTPUT_DIR) /$( NAME) .code
DATA_FILE := $$ ( UCODE_OUTPUT_DIR) /$( NAME) .data
SYM_FILE := $$ ( UCODE_OUTPUT_DIR) /$( NAME) .sym
TEMP_FILE := $$ ( UCODE_OUTPUT_DIR) /$( NAME) .tmp.s
ALL_UCODES += $( NAME)
2023-02-15 22:28:04 -08:00
ifneq ( $( MD5_CODE) ,)
2023-02-14 10:44:08 -08:00
ALL_UCODES_WITH_MD5S += $( NAME)
endif
2023-02-15 22:28:04 -08:00
ALL_OUTPUT_DIRS += $$ ( UCODE_OUTPUT_DIR)
OFF_OPTIONS := $( filter-out $( OPTIONS) ,$( ALL_OPTIONS) )
OPTIONS_EQU :=
$$ ( foreach option,$( OPTIONS) ,$$ ( eval OPTIONS_EQU += -equ $$ ( option) 1) )
OFF_OPTIONS_EQU :=
$$ ( foreach o2,$$ ( OFF_OPTIONS) ,$$ ( eval OFF_OPTIONS_EQU += -equ $$ ( o2) 0) )
2023-02-14 10:44:08 -08:00
ARMIPS_CMDLINE := \
2023-02-15 22:28:04 -08:00
-strequ CODE_FILE $$ ( CODE_FILE) \
-strequ DATA_FILE $$ ( DATA_FILE) \
$$ ( OPTIONS_EQU) \
$$ ( OFF_OPTIONS_EQU) \
2023-02-14 10:44:08 -08:00
f3dex2.s \
2023-02-15 22:28:04 -08:00
-sym2 $$ ( SYM_FILE) \
-temp $$ ( TEMP_FILE)
# Microcode target
.PHONY: $( NAME)
$( NAME) : $$ ( CODE_FILE)
# Directory target variables, see below.
$$ ( UCODE_OUTPUT_DIR) : UCODE_OUTPUT_DIR:= $$ ( UCODE_OUTPUT_DIR)
# Directory target recipe
$$ ( UCODE_OUTPUT_DIR) :
@echo " $( INFO) Creating directory $$ (UCODE_OUTPUT_DIR) $( NO_COL) "
2023-02-14 10:44:08 -08:00
ifeq ( $( OS) ,Windows_NT)
2023-02-15 22:28:04 -08:00
@mkdir $$ ( UCODE_OUTPUT_DIR)
2023-02-14 10:44:08 -08:00
else
2023-02-15 22:28:04 -08:00
@mkdir -p $$ ( UCODE_OUTPUT_DIR)
2023-02-14 10:44:08 -08:00
endif
2023-02-15 22:28:04 -08:00
# Code file target variables. make does not expand variables within recipes
# until the recipe is executed, meaning that all the parts of the recipe would
# have the values from the very last microcode in the file. Here, we set
# target-specific variables--effectively local variables within the recipe--
# to the values from the global variables have right now. We are only
# targeting CODE_FILE even though we also want DATA_FILE, because target-
# specific variables may not work as expected with multiple targets from one
# recipe.
$$ ( CODE_FILE) : NAME:= $$ ( NAME)
$$ ( CODE_FILE) : GAMES:= $$ ( GAMES)
$$ ( CODE_FILE) : ID_STR:= $$ ( ID_STR)
$$ ( CODE_FILE) : ARMIPS_CMDLINE:= $$ ( ARMIPS_CMDLINE)
$$ ( CODE_FILE) : MD5_CODE:= $$ ( MD5_CODE)
$$ ( CODE_FILE) : MD5_DATA:= $$ ( MD5_DATA)
$$ ( CODE_FILE) : CODE_FILE:= $$ ( CODE_FILE)
$$ ( CODE_FILE) : DATA_FILE:= $$ ( DATA_FILE)
# Target recipe
$$ ( CODE_FILE) : ./f3dex2.s ./rsp/* | $$ ( UCODE_OUTPUT_DIR)
@printf " $( INFO) Building microcode: $$ (NAME) for $$ (GAMES) $( NO_COL) \n "
$( ARMIPS) -strequ ID_STR " $$ (ID_STR) " $$ ( ARMIPS_CMDLINE)
ifneq ( $$ ( MD5_CODE) ,)
@( printf " $$ (MD5_CODE) $$ (CODE_FILE) " | md5sum --status -c -) && printf " $( SUCCESS) $$ (NAME) code matches $( NO_COL) \n " || printf " $( FAILURE) $$ (NAME) code differs $( NO_COL) \n "
@( printf " $$ (MD5_DATA) $$ (DATA_FILE) " | md5sum --status -c -) && printf " $( SUCCESS) $$ (NAME) data matches $( NO_COL) \n " || printf " $( FAILURE) $$ (NAME) data differs $( NO_COL) \n "
else ifneq ( $( 1) ,1)
@printf " $( WARNING) MD5 sums not in database for $$ (NAME) $( NO_COL) \n "
2023-02-14 10:44:08 -08:00
endif
2023-02-15 22:28:04 -08:00
$$ ( eval $$ ( call reset_vars) )
2023-02-14 10:44:08 -08:00
e n d e f
2023-02-15 22:28:04 -08:00
$( eval $ ( call reset_vars ) )
2023-02-13 23:00:03 -08:00
i f n e q ( "$(wildcard custom.mk)" , "" )
include custom.mk
2023-02-15 22:28:04 -08:00
$( eval $( call ucode_rule) )
2023-02-13 23:00:03 -08:00
e n d i f
NAME := F3DEX2_2.04H
GAMES := Kirby 64, Smash 64
ID_STR := RSP Gfx ucode F3DEX fifo 2.04H Yoshitaka Yasumoto 1998 Nintendo.
MD5_CODE := d3a58568fa7cf042de370912a47c3b5f
MD5_DATA := 6639b2fd15a73c5446aff592bb599983
2023-02-15 22:28:04 -08:00
OPTIONS := \
CFG_OLD_TRI_WRITE \
CFG_EXTRA_0A_BEFORE_ID_STR \
CFG_G_SPECIAL_1_IS_RECALC_MVP \
CFG_CLIPPING_SUBDIVIDE_DESCENDING \
BUG_CLIPPING_FAIL_WHEN_SUM_ZERO \
BUG_NO_CLAMP_SCREEN_Z_POSITIVE \
BUG_TEXGEN_LINEAR_CLOBBER_S_T \
BUG_FAIL_IF_CARRY_SET_AT_INIT \
BUG_HARMLESS_TASKDONE_WRONG_ADDR
$( eval $ ( call ucode_rule ) )
2023-02-13 23:00:03 -08:00
NAME := F3DEX2_NoN_2.04H
ID_STR := RSP Gfx ucode F3DEX.NoN fifo 2.04H Yoshitaka Yasumoto 1998 Nintendo.
2023-02-15 22:28:04 -08:00
OPTIONS := \
CFG_NoN \
CFG_OLD_TRI_WRITE \
CFG_EXTRA_0A_BEFORE_ID_STR \
CFG_G_SPECIAL_1_IS_RECALC_MVP \
CFG_CLIPPING_SUBDIVIDE_DESCENDING \
BUG_CLIPPING_FAIL_WHEN_SUM_ZERO \
BUG_NO_CLAMP_SCREEN_Z_POSITIVE \
BUG_TEXGEN_LINEAR_CLOBBER_S_T \
BUG_FAIL_IF_CARRY_SET_AT_INIT \
BUG_HARMLESS_TASKDONE_WRONG_ADDR
$( eval $ ( call ucode_rule ) )
2023-02-13 23:00:03 -08:00
NAME := F3DEX2_2.07
GAMES := Rocket: Robot on Wheels
ID_STR := RSP Gfx ucode F3DEX fifo 2.07 Yoshitaka Yasumoto 1998 Nintendo.
MD5_CODE := 1523b8e38a9eae698b48909a0c0c0279
MD5_DATA := 25be72ec04e2e6a23dfa7666645f0662
2023-02-15 22:28:04 -08:00
OPTIONS := \
BUG_FAIL_IF_CARRY_SET_AT_INIT
$( eval $ ( call ucode_rule ) )
2023-02-13 23:00:03 -08:00
NAME := F3DEX2_2.07_XBUS
GAMES := Lode Runner 3-D
ID_STR := RSP Gfx ucode F3DEX xbus 2.07 Yoshitaka Yasumoto 1998 Nintendo.
MD5_CODE := b882f402e115ffaf05a9ee44f354c441
MD5_DATA := 71436bdc62d9263d5c2fefa783cffd4f
2023-02-15 22:28:04 -08:00
OPTIONS := \
CFG_XBUS \
BUG_FAIL_IF_CARRY_SET_AT_INIT \
BUG_HARMLESS_TASKDONE_WRONG_ADDR
$( eval $ ( call ucode_rule ) )
2023-02-13 23:00:03 -08:00
NAME := F3DEX2_NoN_2.07
ID_STR := RSP Gfx ucode F3DEX.NoN fifo 2.07 Yoshitaka Yasumoto 1998 Nintendo.
2023-02-15 22:28:04 -08:00
OPTIONS := \
CFG_NoN \
BUG_FAIL_IF_CARRY_SET_AT_INIT
$( eval $ ( call ucode_rule ) )
2023-02-13 23:00:03 -08:00
NAME := F3DEX2_2.08
GAMES := Banjo-Tooie
ID_STR := RSP Gfx ucode F3DEX fifo 2.08 Yoshitaka Yasumoto 1999 Nintendo.
MD5_CODE := 6ccf5fc392e440fb23bc7d7f7d71047c
MD5_DATA := 3a3a406acb4295d33fa6e918dd3a7ae4
2023-02-15 22:28:04 -08:00
OPTIONS :=
$( eval $ ( call ucode_rule ) )
2023-02-13 23:00:03 -08:00
NAME := F3DEX2_2.08_XBUS
GAMES := Power Rangers
ID_STR := RSP Gfx ucode F3DEX xbus 2.08 Yoshitaka Yasumoto 1999 Nintendo.
MD5_CODE := 38cbd8ef2cd168141347047cf7ec4fba
MD5_DATA := dcb9a145381557d146683ddb853c6cfd
2023-02-15 22:28:04 -08:00
OPTIONS := \
CFG_XBUS \
BUG_HARMLESS_TASKDONE_WRONG_ADDR
$( eval $ ( call ucode_rule ) )
2023-02-13 23:00:03 -08:00
NAME := F3DEX2_NoN_2.08
ID_STR := RSP Gfx ucode F3DEX.NoN fifo 2.08 Yoshitaka Yasumoto 1999 Nintendo.
MD5_CODE := b5c366b55a032f232aa309cda21be3d7
MD5_DATA := 2c8dedc1b1e2fe6405c9895c4290cf2b
2023-02-15 22:28:04 -08:00
OPTIONS := \
CFG_NoN
$( eval $ ( call ucode_rule ) )
2023-02-13 23:00:03 -08:00
NAME := F3DEX2_2.08PL
GAMES := Paper Mario
ID_STR := RSP Gfx ucode F3DEX fifo 2.08 Yoshitaka Yasumoto/Kawasedo 1999.
MD5_CODE := 6a5117e62e51d87020fb81dc493efcb6
MD5_DATA := 1a6b826322aab9c93da61356af5ead40
2023-02-15 22:28:04 -08:00
OPTIONS := \
CFG_POINT_LIGHTING
$( eval $ ( call ucode_rule ) )
2023-02-13 23:00:03 -08:00
NAME := F3DEX2_NoN_2.08PL
2023-02-15 22:28:04 -08:00
# ID_STR copied from nearclipping version above for emulator compatibility
2023-02-13 23:00:03 -08:00
ID_STR := RSP Gfx ucode F3DEX fifo 2.08 Yoshitaka Yasumoto/Kawasedo 1999.
2023-02-15 22:28:04 -08:00
OPTIONS := \
CFG_NoN \
CFG_POINT_LIGHTING
$( eval $ ( call ucode_rule ) )
2023-02-13 23:00:03 -08:00
NAME := F3DZEX_2.06H
2023-02-15 22:28:04 -08:00
# ID_STR copied from NoN version below for emulator compatibility
2023-02-13 23:00:03 -08:00
ID_STR := RSP Gfx ucode F3DZEX.NoN fifo 2.06H Yoshitaka Yasumoto 1998 Nintendo.
2023-02-15 22:28:04 -08:00
OPTIONS := \
CFG_G_BRANCH_W \
CFG_OLD_TRI_WRITE \
BUG_WRONG_INIT_VZERO \
BUG_FAIL_IF_CARRY_SET_AT_INIT
$( eval $ ( call ucode_rule ) )
2023-02-13 23:00:03 -08:00
NAME := F3DZEX_NoN_2.06H
GAMES := Ocarina of Time
ID_STR := RSP Gfx ucode F3DZEX.NoN fifo 2.06H Yoshitaka Yasumoto 1998 Nintendo.
MD5_CODE := 96a1a7a8eab45e0882aab9e4d8ccbcc3
MD5_DATA := e48c7679f1224b7c0947dcd5a4d0c713
2023-02-15 22:28:04 -08:00
OPTIONS := \
CFG_G_BRANCH_W \
CFG_NoN \
CFG_OLD_TRI_WRITE \
BUG_WRONG_INIT_VZERO \
BUG_FAIL_IF_CARRY_SET_AT_INIT
$( eval $ ( call ucode_rule ) )
2023-02-13 23:00:03 -08:00
NAME := F3DZEX_2.08I
2023-02-15 22:28:04 -08:00
# ID_STR copied from NoN version below for emulator compatibility
2023-02-13 23:00:03 -08:00
ID_STR := RSP Gfx ucode F3DZEX.NoN fifo 2.08I Yoshitaka Yasumoto/Kawasedo 1999.
2023-02-15 22:28:04 -08:00
OPTIONS := \
CFG_G_BRANCH_W \
CFG_POINT_LIGHTING \
BUG_WRONG_INIT_VZERO
$( eval $ ( call ucode_rule ) )
2023-02-13 23:00:03 -08:00
NAME := F3DZEX_NoN_2.08I
GAMES := Majora' s Mask
ID_STR := RSP Gfx ucode F3DZEX.NoN fifo 2.08I Yoshitaka Yasumoto/Kawasedo 1999.
MD5_CODE := ca0a31df36dbeda69f09e9850e68c7f7
MD5_DATA := d31cea0e173c6a4a09e4dfe8f259c91b
2023-02-15 22:28:04 -08:00
OPTIONS := \
CFG_G_BRANCH_W \
CFG_NoN \
CFG_POINT_LIGHTING \
BUG_WRONG_INIT_VZERO
$( eval $ ( call ucode_rule ) )
2023-02-13 23:00:03 -08:00
NAME := F3DZEX_2.08J
2023-02-15 22:28:04 -08:00
# ID_STR copied from NoN version below for emulator compatibility
2023-02-13 23:00:03 -08:00
ID_STR := RSP Gfx ucode F3DZEX.NoN fifo 2.08J Yoshitaka Yasumoto/Kawasedo 1999.
2023-02-15 22:28:04 -08:00
OPTIONS := \
CFG_G_BRANCH_W \
CFG_POINT_LIGHTING
$( eval $ ( call ucode_rule ) )
2023-02-13 23:00:03 -08:00
NAME := F3DZEX_NoN_2.08J
GAMES := Animal Forest
ID_STR := RSP Gfx ucode F3DZEX.NoN fifo 2.08J Yoshitaka Yasumoto/Kawasedo 1999.
MD5_CODE := a7f45433a67950cdd239ee40f1dd36c1
MD5_DATA := f17544afa0dce84d589ec3d8c38254c7
2023-02-15 22:28:04 -08:00
OPTIONS := \
CFG_G_BRANCH_W \
CFG_NoN \
CFG_POINT_LIGHTING
$( eval $ ( call ucode_rule ) )
2023-02-14 16:03:21 -08:00
.PHONY : default ok all clean
all : $( ALL_UCODES )
ok : $( ALL_UCODES_WITH_MD 5S )
clean :
@printf " $( WARNING) Deleting all built microcode files $( NO_COL) \n "
2023-02-15 22:28:04 -08:00
@echo " rm -rf $( ALL_OUTPUT_DIRS) "