Introduce multi-version support

This commit is contained in:
Ryan Dwyer committed 2020-04-14 17:12:59 +10:00
1 parent 230473348b
commit 9f17b12316
13 files changed
+10189 -69

No files matched your search

+56 -34
View File
@@ -1,18 +1,47 @@
# User configurable # User configurable
REGION=ntsc ROMID ?= ntsc-final
RELEASE=final PIRACYCHECKS ?= 1
QEMU_IRIX ?= tools/irix/qemu-irix
IRIX_ROOT ?= tools/irix/root
################################################################################ ################################################################################
# Not user configurable
ROMID := $(REGION)-$(RELEASE) export ROMID
NTSC=0
PAL=0
JAP=0
ifeq ($(ROMID),ntsc-beta)
NTSC=1
VERSION=0
endif
ifeq ($(ROMID),ntsc-1.0)
NTSC=1
VERSION=1
endif
ifeq ($(ROMID),ntsc-final)
NTSC=1
VERSION=2
endif
ifeq ($(ROMID),pal-beta)
PAL=1
VERSION=3
endif
ifeq ($(ROMID),pal-final)
PAL=1
VERSION=4
endif
ifeq ($(ROMID),jap-final)
JAP=1
VERSION=5
endif
E_DIR := extracted/$(ROMID) E_DIR := extracted/$(ROMID)
B_DIR := build/$(ROMID) B_DIR := build/$(ROMID)
QEMU_IRIX := tools/irix/qemu-irix
IRIX_ROOT := tools/irix/root
ifeq ($(shell type mips64-elf-ld >/dev/null 2>/dev/null; echo $$?), 0) ifeq ($(shell type mips64-elf-ld >/dev/null 2>/dev/null; echo $$?), 0)
TOOLCHAIN := mips64-elf TOOLCHAIN := mips64-elf
else ifeq ($(shell type mips-linux-gnu-ld >/dev/null 2>/dev/null; echo $$?), 0) else ifeq ($(shell type mips-linux-gnu-ld >/dev/null 2>/dev/null; echo $$?), 0)
@@ -23,27 +52,20 @@ else
TOOLCHAIN := mips-elf TOOLCHAIN := mips-elf
endif endif
ifeq ($(REGION),ntsc) CFLAGS := -DVERSION=$(VERSION) \
VERSION_CFLAGS := -DNTSC=1 -DPAL=0 -DJAP=0 -DNTSC=$(NTSC) \
endif -DPAL=$(PAL) \
ifeq ($(REGION),pal) -DJAP=$(JAP) \
VERSION_CFLAGS := -DNTSC=0 -DPAL=1 -DJAP=0 -DPIRACYCHECKS=$(PIRACYCHECKS) \
endif -Wo,-loopunroll,0 \
ifeq ($(REGION),jap) -Wab,-r4300_mul \
VERSION_CFLAGS := -DNTSC=0 -DPAL=0 -DJAP=1 -non_shared \
endif -G 0 \
-Xcpluscomm \
ifeq ($(RELEASE),beta) -woff 649,819,820,821,838,852 \
RELEASE_CFLAGS := -DBETA=1 -DREL1=0 -DFINAL=0 -w2 \
endif -I src/include \
ifeq ($(RELEASE),1.0) -mips2
RELEASE_CFLAGS := -DBETA=0 -DREL1=1 -DFINAL=0
endif
ifeq ($(RELEASE),final)
RELEASE_CFLAGS := -DBETA=0 -DREL1=0 -DFINAL=1
endif
CFLAGS := $(VERSION_CFLAGS) $(RELEASE_CFLAGS) -DPIRACYCHECKS=1 -Wo,-loopunroll,0 -Wab,-r4300_mul -non_shared -G 0 -Xcpluscomm -woff 649,819,820,821,838,852 -w2 -I src/include -mips2
C_FILES := $(shell find src -name '*.c') C_FILES := $(shell find src -name '*.c')
O_FILES := $(patsubst %.c, %.o, $(C_FILES)) O_FILES := $(patsubst %.c, %.o, $(C_FILES))
@@ -133,7 +155,7 @@ pads: $(ASSET_BG_PADS_FILES)
# BG tile files # BG tile files
src/files/bgdata/bg_%_tiles.o: src/files/bgdata/bg_%_tiles.s src/files/bgdata/bg_%_tiles.o: src/files/bgdata/bg_%_tiles.s
$(TOOLCHAIN)-as -march=vr4300 -mabi=32 -I src/include -EB -o $@ $< $(TOOLCHAIN)-as --defsym VERSION=$(VERSION) -march=vr4300 -mabi=32 -I src/include -EB -o $@ $<
$(B_DIR)/files/bgdata/bg_%_tiles.elf: src/files/bgdata/bg_%_tiles.o $(B_DIR)/files/bgdata/bg_%_tiles.elf: src/files/bgdata/bg_%_tiles.o
@mkdir -p $(B_DIR)/files/bgdata @mkdir -p $(B_DIR)/files/bgdata
@@ -268,13 +290,13 @@ gvars: $(B_DIR)/ucode/gvars.bin
# Miscellaneous # Miscellaneous
extract: extract:
tools/extract $(ROMID) tools/extract
$(B_DIR)/ucode/gamezips.bin: $(B_DIR)/ucode/game.bin $(B_DIR)/ucode/gamezips.bin: $(B_DIR)/ucode/game.bin
tools/mkgamezips tools/mkgamezips
test: all test: all
@md5sum --quiet -c checksums.md5 @md5sum --quiet -c checksums.$(ROMID).md5
$(B_DIR)/files/%.o: $(B_DIR)/files/% $(B_DIR)/files/%.o: $(B_DIR)/files/%
/bin/echo -e ".data\n.incbin \"$<\"" > $(B_DIR)/file.s /bin/echo -e ".data\n.incbin \"$<\"" > $(B_DIR)/file.s
@@ -301,7 +323,7 @@ $(B_DIR)/ucode/filenames.bin: $(B_DIR)/ucode/filenames.elf
$(TOOLCHAIN)-objcopy $< $@ -O binary $(TOOLCHAIN)-objcopy $< $@ -O binary
$(B_DIR)/pd.elf: $(O_FILES) $(ASSET_O_FILES) ld/pd.ld $(B_DIR)/pd.elf: $(O_FILES) $(ASSET_O_FILES) ld/pd.ld
cpp -P ld/pd.ld -o $(B_DIR)/pd.ld cpp -DROMID=$(ROMID) -DVERSION=$(VERSION) -P ld/pd.ld -o $(B_DIR)/pd.ld
$(TOOLCHAIN)-ld --no-check-sections -T $(B_DIR)/pd.ld --print-map -o $@ > $(B_DIR)/pd.map $(TOOLCHAIN)-ld --no-check-sections -T $(B_DIR)/pd.ld --print-map -o $@ > $(B_DIR)/pd.map
$(B_DIR)/pd.bin: $(B_DIR)/pd.elf $(B_DIR)/pd.bin: $(B_DIR)/pd.elf
@@ -312,12 +334,12 @@ all: $(UCODE_BIN_FILES) $(ASSET_O_FILES)
rom: $(UCODE_BIN_FILES) $(B_DIR)/ucode/gamezips.bin $(ASSET_O_FILES) rom: $(UCODE_BIN_FILES) $(B_DIR)/ucode/gamezips.bin $(ASSET_O_FILES)
TOOLCHAIN=$(TOOLCHAIN) tools/buildrom TOOLCHAIN=$(TOOLCHAIN) tools/buildrom
tools/checksum build/ntsc-final/pd.z64 --write tools/checksum $(B_DIR)/pd.z64 --write
clean: clean:
rm -rf build/* rm -rf build/*
find src -name '*.o' -delete find src -name '*.o' -delete
binclean: binclean:
rm -f build/ntsc-final/ucode/*.bin rm -f $(B_DIR)/ucode/*.bin
find src/{boot,game,gvars,lib,inflate} -name '*.o' -delete find src/{boot,game,gvars,lib,inflate} -name '*.o' -delete
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File renamed without changes.
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -3,7 +3,7 @@
varname = _filesSegmentRomStart + . - _filesSegmentRamStart; \ varname = _filesSegmentRomStart + . - _filesSegmentRamStart; \
__rompos = varname; \ __rompos = varname; \
.file##id : AT(__rompos) { \ .file##id : AT(__rompos) { \
build/ntsc-final/files/filename.o (.data); \ build/ROMID/files/filename.o (.data); \
} \ } \
__rompos += SIZEOF(.file##id) __rompos += SIZEOF(.file##id)
+8
View File
@@ -2020,6 +2020,7 @@
#define SAVEFILEFLAG_41 0x41 #define SAVEFILEFLAG_41 0x41
#define SAVEFILEFLAG_42 0x42 #define SAVEFILEFLAG_42 0x42
#define SAVEFILEFLAG_43 0x43 #define SAVEFILEFLAG_43 0x43
#define SAVEFILEFLAG_47 0x47
#define SCREENRATIO_NORMAL 0 #define SCREENRATIO_NORMAL 0
#define SCREENRATIO_16_9 1 #define SCREENRATIO_16_9 1
@@ -2573,3 +2574,10 @@
#define BODY_ELVISWAISTCOAT 0x94 #define BODY_ELVISWAISTCOAT 0x94
#define BODY_DARK_LEATHER 0x95 #define BODY_DARK_LEATHER 0x95
#define BODY_DARK_NEGOTIATOR 0x96 #define BODY_DARK_NEGOTIATOR 0x96
#define VERSION_NTSC_BETA 0
#define VERSION_NTSC_1_0 1
#define VERSION_NTSC_FINAL 2
#define VERSION_PAL_BETA 3
#define VERSION_PAL_FINAL 4
#define VERSION_JAP_FINAL 5
+7
View File
@@ -4,6 +4,13 @@
.data .data
.set VERSION_NTSC_BETA, 0
.set VERSION_NTSC_1_0, 1
.set VERSION_NTSC_FINAL, 2
.set VERSION_PAL_BETA, 3
.set VERSION_PAL_FINAL, 4
.set VERSION_JAP_FINAL, 5
.macro tileabstract numverts, ai, flags, u4, u6, u8, ua, uc .macro tileabstract numverts, ai, flags, u4, u6, u8, ua, uc
.short \numverts .short \numverts
.byte \ai .byte \ai
+22 -16
View File
@@ -5,7 +5,7 @@ import re
import subprocess import subprocess
def main(): def main():
fd = open('build/ntsc-final/pd.z64', 'wb+') fd = open(bdir() + '/pd.z64', 'wb+')
# The retail ROM contains truncated duplicates of some segments. # The retail ROM contains truncated duplicates of some segments.
# For example, the real boot segment is at 0x1000 - 0x3050, but the tail end # For example, the real boot segment is at 0x1000 - 0x3050, but the tail end
@@ -56,22 +56,22 @@ def get_header():
return binary return binary
def get_rspboot(): def get_rspboot():
return getfilecontents('extracted/ntsc-final/ucode/rspboot.bin') return getfilecontents(edir() + '/ucode/rspboot.bin')
def get_boot(): def get_boot():
return getfilecontents('build/ntsc-final/ucode/boot.bin') return getfilecontents(bdir() + '/ucode/boot.bin')
def get_lib(): def get_lib():
return zip('build/ntsc-final/ucode/lib.bin') return zip(bdir() + '/ucode/lib.bin')
def get_gamedata(): def get_gamedata():
return zip('build/ntsc-final/ucode/gamedata.bin') return zip(bdir() + '/ucode/gamedata.bin')
def get_inflate(): def get_inflate():
return getfilecontents('build/ntsc-final/ucode/inflate.bin') return getfilecontents(bdir() + '/ucode/inflate.bin')
def get_gamezips(): def get_gamezips():
return getfilecontents('build/ntsc-final/ucode/gamezips.bin') return getfilecontents(bdir() + '/ucode/gamezips.bin')
def get_unknown(): def get_unknown():
return getfrombaserom(0x157120, 0x69b268) return getfrombaserom(0x157120, 0x69b268)
@@ -80,19 +80,19 @@ def get_fonts():
return getfrombaserom(0x7f2388, 0x17ec8) return getfrombaserom(0x7f2388, 0x17ec8)
def get_sfxctl(): def get_sfxctl():
return getfilecontents('extracted/ntsc-final/audio/sfx.ctl') return getfilecontents(edir() + '/audio/sfx.ctl')
def get_sfxtbl(): def get_sfxtbl():
return getfilecontents('extracted/ntsc-final/audio/sfx.tbl') return getfilecontents(edir() + '/audio/sfx.tbl')
def get_seqctl(): def get_seqctl():
return getfilecontents('extracted/ntsc-final/audio/music.ctl') return getfilecontents(edir() + '/audio/music.ctl')
def get_seqtbl(): def get_seqtbl():
return getfilecontents('extracted/ntsc-final/audio/music.tbl') return getfilecontents(edir() + '/audio/music.tbl')
def get_midi(): def get_midi():
return getfilecontents('extracted/ntsc-final/audio/sequences.bin') return getfilecontents(edir() + '/audio/sequences.bin')
def write_files(fd): def write_files(fd):
start = getlinkervariable('_filesSegmentRomStart') start = getlinkervariable('_filesSegmentRomStart')
@@ -101,7 +101,7 @@ def write_files(fd):
write_binary(fd, 0xed83a0, getfromldbin(start, end - start)) write_binary(fd, 0xed83a0, getfromldbin(start, end - start))
def get_filenames(): def get_filenames():
return getfilecontents('build/ntsc-final/ucode/filenames.bin') return getfilecontents(bdir() + '/ucode/filenames.bin')
def get_textures(): def get_textures():
return getfrombaserom(0x01d65f40, 0x29a0c0) return getfrombaserom(0x01d65f40, 0x29a0c0)
@@ -113,14 +113,14 @@ def getfilecontents(filename):
return binary return binary
def getfrombaserom(offset, len): def getfrombaserom(offset, len):
fd = open('pd.ntsc-final.z64', 'rb') fd = open('pd.%s.z64' % os.environ['ROMID'], 'rb')
fd.seek(offset) fd.seek(offset)
binary = fd.read(len) binary = fd.read(len)
fd.close() fd.close()
return binary return binary
def getfromldbin(offset, len): def getfromldbin(offset, len):
fd = open('build/ntsc-final/pd.bin', 'rb') fd = open(bdir() + '/pd.bin', 'rb')
fd.seek(offset) fd.seek(offset)
binary = fd.read(len) binary = fd.read(len)
fd.close() fd.close()
@@ -129,13 +129,19 @@ def getfromldbin(offset, len):
def zip(filename): def zip(filename):
return subprocess.check_output(['tools/rarezip', filename]) return subprocess.check_output(['tools/rarezip', filename])
def bdir():
return 'build/%s' % os.environ['ROMID']
def edir():
return 'extracted/%s' % os.environ['ROMID']
def getlinkervariable(varname): def getlinkervariable(varname):
if 'TOOLCHAIN' in os.environ: if 'TOOLCHAIN' in os.environ:
cmd = '%s-objdump' % os.environ['TOOLCHAIN'] cmd = '%s-objdump' % os.environ['TOOLCHAIN']
else: else:
cmd = 'mips64-elf-objdump' cmd = 'mips64-elf-objdump'
objdump = subprocess.check_output([cmd, 'build/ntsc-final/pd.elf', '-t']).decode('utf-8') objdump = subprocess.check_output([cmd, bdir() + '/pd.elf', '-t']).decode('utf-8')
matches = re.findall(r'^([0-9a-f]+) .*? %s$' % varname, objdump, re.MULTILINE) matches = re.findall(r'^([0-9a-f]+) .*? %s$' % varname, objdump, re.MULTILINE)
return int(matches[0], 16) return int(matches[0], 16)
+2 -16
View File
@@ -1,20 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# Extract assets from a Perfect Dark ROM. import os, zlib
#
# Place ROM in the main project directory, named pd.<romid>.z64, then run this
# with tools/extract <romid>. The directory extracted/<romid>/ will be created
# and populated.
#
# Supported ROM IDs are:
# ntsc-beta
# ntsc-1.0
# ntsc-final
# pal-beta
# pal-final
# jap-final
import os, sys, zlib
class Extractor: class Extractor:
def extract(self, romid): def extract(self, romid):
@@ -280,5 +266,5 @@ class Extractor:
} }
extractor = Extractor() extractor = Extractor()
extractor.extract(sys.argv[1]) extractor.extract(os.environ['ROMID'])
+2 -2
View File
@@ -21,7 +21,7 @@ The format of the gamezips binary is:
def main(): def main():
zips = get_zips() zips = get_zips()
fd = open('build/ntsc-final/ucode/gamezips.bin', 'wb') fd = open('build/%s/ucode/gamezips.bin' % os.environ['ROMID'], 'wb')
pos = len(zips) * 4 + 4 pos = len(zips) * 4 + 4
# Write pointer array # Write pointer array
@@ -65,7 +65,7 @@ def get_filecontents(filename):
return binary return binary
def get_zips(): def get_zips():
binary = get_filecontents('build/ntsc-final/ucode/game.bin') binary = get_filecontents('build/%s/ucode/game.bin' % os.environ['ROMID'])
parts = [binary[i:i+0x1000] for i in range(0, len(binary), 0x1000)] parts = [binary[i:i+0x1000] for i in range(0, len(binary), 0x1000)]
return [zip(part) for part in parts] return [zip(part) for part in parts]