mirror of
https://github.com/perfect-dark-pc-port/perfect_dark.git
synced 2026-10-23 15:52:41 +02:00
Introduce multi-version support
This commit is contained in:
1 parent
230473348b
commit
9f17b12316
13 files changed
+10189
-69
No files matched your search
@@ -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
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
@@ -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
@@ -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
@@ -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]
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user