Full GCC Compiler (#378)

* fx table work

* fx data

* blah

* render_effects_UI

* split out effects.c

* initial testing of full gcc compiler

* don't touch undefined syms/funcs auto

* git subrepo pull --force tools/splat

subrepo:
  subdir:   "tools/splat"
  merged:   "25b848a230"
upstream:
  origin:   "https://github.com/ethteck/splat.git"
  branch:   "master"
  commit:   "25b848a230"
git-subrepo:
  version:  "0.4.3"
  origin:   "https://github.com/ingydotnet/git-subrepo"
  commit:   "2f68596"

* 4 npc funcs

* nine sef commands

* test

* test2

* run undefined_syms through cpp, remove bss and dead syms files

* nuContQueryRead

* update compiler

* configure fixes

* Update compiler binaries with latest build

* permuter_settings

* xgcc -> gcc

* change permissions

* .

* fix permuter stuff

* gcc is the bane of my existence

* non-dumb mac cpp

* build .cpp files with g++

* ccache

* hide stdout/stderr from ccache check

* fix #374

* tar something and other

* ok!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

* lol

* fix linux install

* 👍

* 👍👍

* Make cousin J happy

* always 👍

* git subrepo pull (merge) tools/splat

subrepo:
  subdir:   "tools/splat"
  merged:   "09a5715405"
upstream:
  origin:   "https://github.com/ethteck/splat.git"
  branch:   "master"
  commit:   "09a5715405"
git-subrepo:
  version:  "0.4.3"
  origin:   "https://github.com/ingydotnet/git-subrepo"
  commit:   "2f68596"

Co-authored-by: alex <16batesa@gmail.com>
This commit is contained in:
Ethan Roseman 2021-08-23 06:55:26 +09:00 committed by GitHub
parent de800e9c9f
commit f5a6d26ca8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 132 additions and 39 deletions

1
.gitignore vendored
View File

@ -36,6 +36,7 @@ build/
/include/sprite/ /include/sprite/
/include/map /include/map
/tools/permuter_settings.toml /tools/permuter_settings.toml
/tools/build/first_ok
# Assets # Assets
/assets/* /assets/*

2
Jenkinsfile vendored
View File

@ -8,6 +8,8 @@ pipeline {
steps { steps {
sh 'cp /usr/local/etc/roms/papermario.us.z64 ver/us/baserom.z64' sh 'cp /usr/local/etc/roms/papermario.us.z64 ver/us/baserom.z64'
sh 'cp /usr/local/etc/roms/papermario.jp.z64 ver/jp/baserom.z64' sh 'cp /usr/local/etc/roms/papermario.jp.z64 ver/jp/baserom.z64'
sh 'curl -L "https://github.com/pmret/gcc-papermario/releases/download/master/linux.tar.gz" | tar zx -C tools/build/cc/gcc'
sh 'curl -L "https://github.com/pmret/binutils-papermario/releases/download/master/linux.tar.gz" | tar zx -C tools/build/cc/gcc'
sh './configure' sh './configure'
} }
} }

View File

@ -967,7 +967,7 @@ typedef struct {
// Assume they return an Effect*, and this struct is accessed at unk_0C, // Assume they return an Effect*, and this struct is accessed at unk_0C,
// but this struct differs from EffectInstanceData // but this struct differs from EffectInstanceData
// Search for "struct N(temp)" for examples // Search for "struct N(temp)" for examples
typedef struct { typedef struct EffectInstanceDataThing {
char unk_00[0x4]; char unk_00[0x4];
f32 unk_04; f32 unk_04;
f32 unk_08; f32 unk_08;

View File

@ -1426,8 +1426,7 @@ enum NpcIDs {
NPC_BTL_MERLEE = -10, NPC_BTL_MERLEE = -10,
}; };
typedef UNK_TYPE TriggerFlag; enum {
enum TriggerFlags {
TRIGGER_WALL_PUSH = 0x00000040, TRIGGER_WALL_PUSH = 0x00000040,
TRIGGER_FLOOR_TOUCH = 0x00000080, TRIGGER_FLOOR_TOUCH = 0x00000080,
TRIGGER_WALL_PRESS_A = 0x00000100, TRIGGER_WALL_PRESS_A = 0x00000100,

View File

@ -94,4 +94,8 @@
#define ASCII_TO_U32(a, b, c, d) ((u32)((a << 24) | (b << 16) | (c << 8) | (d << 0))) #define ASCII_TO_U32(a, b, c, d) ((u32)((a << 24) | (b << 16) | (c << 8) | (d << 0)))
#ifdef PERMUTER
#define SCRIPT(...) {}
#endif
#endif #endif

View File

@ -44,7 +44,7 @@ typedef struct Map {
/* 0x14 */ char* bgName; /* 0x14 */ char* bgName;
/* 0x18 */ MapInit init; ///< Return TRUE to skip normal asset (shape/hit/bg/tex) loading. /* 0x18 */ MapInit init; ///< Return TRUE to skip normal asset (shape/hit/bg/tex) loading.
/* 0x1C */ union { /* 0x1C */ union {
u32 u32; u32 word;
struct { struct {
char unk_1C[0x2]; char unk_1C[0x2];
s8 songVariation; ///< 0 or 1. @see bgm_get_map_default_variation s8 songVariation; ///< 0 or 1. @see bgm_get_map_default_variation

View File

@ -8,6 +8,10 @@ fi
uname=`uname` uname=`uname`
if [[ "$uname" == "Darwin" ]]; then if [[ "$uname" == "Darwin" ]]; then
echo "Downloading gcc/binutils for macOS"
curl -L "https://github.com/pmret/gcc-papermario/releases/download/master/mac.tar.gz" | tar zx -C tools/build/cc/gcc
curl -L "https://github.com/pmret/binutils-papermario/releases/download/master/mac.tar.gz" | tar zx -C tools/build/cc/gcc
echo "Installing packages for macOS" echo "Installing packages for macOS"
if ! command -v brew >/dev/null 2>&1; then if ! command -v brew >/dev/null 2>&1; then
@ -28,6 +32,10 @@ if [[ "$uname" == "Darwin" ]]; then
exit exit
fi fi
echo "Downloading gcc/binutils for Linux"
curl -L "https://github.com/pmret/gcc-papermario/releases/download/master/linux.tar.gz" | tar zx -C tools/build/cc/gcc
curl -L "https://github.com/pmret/binutils-papermario/releases/download/master/linux.tar.gz" | tar zx -C tools/build/cc/gcc
# Debian and derivatives (apt) # Debian and derivatives (apt)
if cat /etc/os-release | grep -E 'ID=debian|ID_LIKE=debian' &> /dev/null; then if cat /etc/os-release | grep -E 'ID=debian|ID_LIKE=debian' &> /dev/null; then
echo "Installing packages for Debian or derivative (apt)" echo "Installing packages for Debian or derivative (apt)"

View File

@ -151,7 +151,7 @@ void load_map_by_IDs(s16 areaID, s16 mapID, s16 loadType) {
gPlayerStatus.targetYaw = gPlayerStatus.currentYaw; gPlayerStatus.targetYaw = gPlayerStatus.currentYaw;
func_801497FC(D_8008FF60[map->unk_1C.u32 % 4]); func_801497FC(D_8008FF60[map->unk_1C.word % 4]);
sfx_reset_door_sounds(); sfx_reset_door_sounds();
if (initStatus == 0) { if (initStatus == 0) {

Binary file not shown.

2
tools/build/cc/gcc/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
*
!.gitignore

View File

@ -2,6 +2,7 @@
from typing import List, Dict, Set, Union from typing import List, Dict, Set, Union
from pathlib import Path from pathlib import Path
import subprocess
import sys import sys
import ninja_syntax import ninja_syntax
from glob import glob from glob import glob
@ -9,11 +10,7 @@ from glob import glob
# Configuration: # Configuration:
VERSIONS = ["us", "jp"] VERSIONS = ["us", "jp"]
DO_SHA1_CHECK = True DO_SHA1_CHECK = True
DO_FIRST_OK = True
CPPFLAGS = "-w -Iver/$version/build/include -Iinclude -Isrc -Iassets/$version -D _LANGUAGE_C -D _FINALROM -D VERSION=$version " \
"-ffreestanding -DF3DEX_GBI_2 -D_MIPS_SZLONG=32"
CFLAGS = "-G0 -O2 -quiet -fno-common -Wuninitialized -Wmissing-braces"
ASFLAGS = "-G0"
# Paths: # Paths:
ROOT = Path(__file__).parent.parent.parent ROOT = Path(__file__).parent.parent.parent
@ -32,34 +29,34 @@ def rm_recursive(path: Path):
path.unlink() path.unlink()
def exec_shell(command: List[str]) -> str: def exec_shell(command: List[str]) -> str:
import subprocess
ret = subprocess.run(command, stdout=subprocess.PIPE, text=True) ret = subprocess.run(command, stdout=subprocess.PIPE, text=True)
return ret.stdout return ret.stdout
def write_ninja_rules(ninja: ninja_syntax.Writer, cpp: str, cppflags: str, extra_cflags: str): def write_ninja_rules(ninja: ninja_syntax.Writer, cpp: str, cppflags: str, extra_cflags: str):
# platform-specific # platform-specific
if sys.platform == "darwin": if sys.platform == "darwin":
os_dir = "mac"
iconv = "tools/iconv.py UTF-8 SHIFT-JIS" iconv = "tools/iconv.py UTF-8 SHIFT-JIS"
elif sys.platform == "linux": elif sys.platform == "linux":
from os import uname
if uname()[4] == "aarch64":
os_dir = "arm"
else:
os_dir = "linux"
iconv = "iconv --from UTF-8 --to SHIFT-JIS" iconv = "iconv --from UTF-8 --to SHIFT-JIS"
else: else:
raise Exception(f"unsupported platform {sys.platform}") raise Exception(f"unsupported platform {sys.platform}")
ccache = ""
try:
subprocess.call(["ccache"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
except FileNotFoundError:
ccache = ""
cross = "mips-linux-gnu-" cross = "mips-linux-gnu-"
cc = f"{ccache}{BUILD_TOOLS}/cc/gcc/gcc"
cxx = f"{ccache}{BUILD_TOOLS}/cc/gcc/g++"
compile_script = f"$python {BUILD_TOOLS}/cc_dsl/compile_script.py"
cc1 = f"{BUILD_TOOLS}/{os_dir}/cc1" CPPFLAGS = "-w -Iver/$version/build/include -Iinclude -Isrc -Iassets/$version -D_LANGUAGE_C -D_FINALROM -DVERSION=$version " \
nu64as = f"{BUILD_TOOLS}/{os_dir}/mips-nintendo-nu64-as" "-ffreestanding -DF3DEX_GBI_2 -D_MIPS_SZLONG=32"
cflags = CFLAGS + " " + extra_cflags cflags = f"-c -G0 -O2 -fno-common -Wuninitialized -Wmissing-braces -B {BUILD_TOOLS}/cc/gcc/ {extra_cflags}"
ninja.variable("python", sys.executable) ninja.variable("python", sys.executable)
@ -75,7 +72,7 @@ def write_ninja_rules(ninja: ninja_syntax.Writer, cpp: str, cppflags: str, extra
ninja.rule("sha1sum", ninja.rule("sha1sum",
description="check $in", description="check $in",
command="sha1sum -c $in && touch $out" if DO_SHA1_CHECK else "touch $out", command="sha1sum -c $in && touch $out" + ("&& bash tools/build/first_ok.sh" if DO_FIRST_OK else "") if DO_SHA1_CHECK else "touch $out",
) )
ninja.rule("cpp", ninja.rule("cpp",
@ -84,15 +81,22 @@ def write_ninja_rules(ninja: ninja_syntax.Writer, cpp: str, cppflags: str, extra
) )
ninja.rule("cc", ninja.rule("cc",
description="cc($version) $in $cflags", description="cc $in",
command=f"bash -o pipefail -c '{cpp} {CPPFLAGS} {cppflags} -MD -MF $out.d $in -o - | {iconv} | {cc1} {cflags} $cflags -o - | {nu64as} {ASFLAGS} - -o $out'", command=f"bash -o pipefail -c '{cpp} {CPPFLAGS} {cppflags} -MD -MF $out.d $in -o - | {iconv} > $out.i && {cc} {cflags} $cflags $out.i -o $out'",
depfile="$out.d", depfile="$out.d",
deps="gcc", deps="gcc",
) )
ninja.rule("cc_dsl", ninja.rule("cc_dsl",
description="cc_dsl($version) $in $cflags", description="cc $in $cflags",
command=f"bash -o pipefail -c '{cpp} {CPPFLAGS} {cppflags} -MD -MF $out.d $in -o - | $python {BUILD_TOOLS}/cc_dsl/compile_script.py | {iconv} | {cc1} {cflags} $cflags -o - | {nu64as} {ASFLAGS} - -o $out'", command=f"bash -o pipefail -c '{cpp} {CPPFLAGS} {cppflags} -MD -MF $out.d $in -o - | {compile_script} | {iconv} > $out.i && {cc} {cflags} $cflags $out.i -o $out'",
depfile="$out.d",
deps="gcc",
)
ninja.rule("cxx",
description="cxx $in",
command=f"bash -o pipefail -c '{cpp} {CPPFLAGS} {cppflags} -MD -MF $out.d $in -o - | {iconv} > $out.i && {cxx} {cflags} $cflags $out.i -o $out'",
depfile="$out.d", depfile="$out.d",
deps="gcc", deps="gcc",
) )
@ -169,7 +173,7 @@ def write_ninja_rules(ninja: ninja_syntax.Writer, cpp: str, cppflags: str, extra
ninja.rule("pm_charset_palettes", command=f"$python {BUILD_TOOLS}/pm_charset_palettes.py $out $in") ninja.rule("pm_charset_palettes", command=f"$python {BUILD_TOOLS}/pm_charset_palettes.py $out $in")
with Path("tools/permuter_settings.toml").open("w") as f: with Path("tools/permuter_settings.toml").open("w") as f:
f.write(f"compiler_command = \"{cpp} {CPPFLAGS} {cppflags} -DPERMUTER | {iconv} | {cc1} {cflags} -o - | {nu64as} {ASFLAGS}\"\n") f.write(f"compiler_command = \"{cc} {CPPFLAGS.replace('$version', 'us')} {cflags} -DPERMUTER -fforce-addr\"\n")
f.write(f"assembler_command = \"{cross}as -EB -march=vr4300 -mtune=vr4300 -Iinclude\"\n") f.write(f"assembler_command = \"{cross}as -EB -march=vr4300 -mtune=vr4300 -Iinclude\"\n")
f.write( f.write(
""" """
@ -268,7 +272,8 @@ class Configure:
def write_ninja(self, ninja: ninja_syntax.Writer, skip_outputs: Set[str]): def write_ninja(self, ninja: ninja_syntax.Writer, skip_outputs: Set[str]):
import segtypes import segtypes
import segtypes.n64.data # Doesn't get imported on jp for some odd reason (should maybe be a * import?) import segtypes.n64.data
import segtypes.n64.Yay0
assert self.linker_entries is not None assert self.linker_entries is not None
@ -300,7 +305,7 @@ class Configure:
if task == "yay0": if task == "yay0":
implicit.append(YAY0_COMPRESS_TOOL) implicit.append(YAY0_COMPRESS_TOOL)
elif task in ["cc", "cc_dsl"]: elif task in ["cc", "cc_dsl", "cxx"]:
order_only.append("generated_headers_" + self.version) order_only.append("generated_headers_" + self.version)
ninja.build( ninja.build(
@ -338,6 +343,8 @@ class Configure:
# check for dsl # check for dsl
task = "cc" task = "cc"
if entry.src_paths[0].suffixes[-1] == ".cpp":
task = "cxx"
with entry.src_paths[0].open() as f: with entry.src_paths[0].open() as f:
s = f.read() s = f.read()
if "SCRIPT(" in s or "#pragma SCRIPT" in s or "#include \"world/common/foliage.inc.c\"" in s: if "SCRIPT(" in s or "#pragma SCRIPT" in s or "#include \"world/common/foliage.inc.c\"" in s:

54
tools/build/first_ok.sh Normal file
View File

@ -0,0 +1,54 @@
if [ -f "tools/build/first_ok" ]; then
exit
fi
touch tools/build/first_ok
printf "\e[48;5;0m \e[48;5;3m \e[48;5;58m \e[48;5;237m \e[48;5;235m \e[48;5;236m \e[48;5;3m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;236m \e[48;5;235m \e[48;5;234m \e[48;5;52m \e[48;5;234m \e[48;5;236m \e[48;5;235m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;234m \e[48;5;235m \e[48;5;52m \e[48;5;1m \e[48;5;52m \e[48;5;234m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;234m \e[48;5;235m \e[48;5;52m \e[48;5;124m \e[48;5;52m \e[48;5;234m \e[48;5;235m \e[48;5;233m \e[48;5;52m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;52m \e[48;5;235m \e[48;5;234m \e[48;5;52m \e[48;5;124m \e[48;5;1m \e[48;5;52m \e[48;5;235m \e[48;5;234m \e[48;5;236m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;236m \e[48;5;233m \e[48;5;52m \e[48;5;1m \e[48;5;88m \e[48;5;124m \e[48;5;88m \e[48;5;138m \e[48;5;131m \e[48;5;88m \e[48;5;124m \e[48;5;88m \e[48;5;52m \e[48;5;234m \e[48;5;232m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;234m \e[48;5;236m \e[48;5;234m \e[48;5;52m \e[48;5;88m \e[48;5;124m \e[48;5;125m \e[48;5;95m \e[48;5;246m \e[48;5;248m \e[48;5;145m \e[48;5;247m \e[48;5;138m \e[48;5;95m \e[48;5;124m \e[48;5;1m \e[48;5;52m \e[48;5;234m \e[48;5;52m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;233m \e[48;5;234m \e[48;5;52m \e[48;5;124m \e[48;5;138m \e[48;5;248m \e[48;5;52m \e[48;5;243m \e[48;5;249m \e[48;5;52m \e[48;5;181m \e[48;5;125m \e[48;5;124m \e[48;5;88m \e[48;5;52m \e[48;5;234m \e[48;5;237m \e[48;5;9m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;236m \e[48;5;233m \e[48;5;52m \e[48;5;1m \e[48;5;124m \e[48;5;138m \e[48;5;248m \e[48;5;52m \e[48;5;249m \e[48;5;125m \e[48;5;124m \e[48;5;88m \e[48;5;124m \e[48;5;52m \e[48;5;237m \e[48;5;52m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;233m \e[48;5;236m \e[48;5;52m \e[48;5;1m \e[48;5;88m \e[48;5;124m \e[48;5;138m \e[48;5;248m \e[48;5;52m \e[48;5;95m \e[48;5;236m \e[48;5;52m \e[48;5;95m \e[48;5;236m \e[48;5;52m \e[48;5;250m \e[48;5;89m \e[48;5;124m \e[48;5;88m \e[48;5;52m \e[48;5;236m \e[48;5;238m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;235m \e[48;5;52m \e[48;5;88m \e[48;5;124m \e[48;5;138m \e[48;5;248m \e[48;5;52m \e[48;5;138m \e[48;5;238m \e[48;5;52m \e[48;5;245m \e[48;5;238m \e[48;5;52m \e[48;5;250m \e[48;5;124m \e[48;5;52m \e[48;5;233m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;234m \e[48;5;52m \e[48;5;88m \e[48;5;124m \e[48;5;125m \e[48;5;138m \e[48;5;249m \e[48;5;233m \e[48;5;234m \e[48;5;7m \e[48;5;89m \e[48;5;124m \e[48;5;125m \e[48;5;124m \e[48;5;52m \e[48;5;233m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;52m \e[48;5;233m \e[48;5;52m \e[48;5;124m \e[48;5;88m \e[48;5;232m \e[48;5;233m \e[48;5;232m \e[48;5;233m \e[48;5;232m \e[48;5;52m \e[48;5;125m \e[48;5;124m \e[48;5;88m \e[48;5;52m \e[48;5;233m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;52m \e[48;5;233m \e[48;5;52m \e[48;5;124m \e[48;5;52m \e[48;5;234m \e[48;5;233m \e[48;5;234m \e[48;5;233m \e[48;5;52m \e[48;5;1m \e[48;5;124m \e[48;5;88m \e[48;5;52m \e[48;5;235m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;52m \e[48;5;233m \e[48;5;52m \e[48;5;124m \e[48;5;88m \e[48;5;233m \e[48;5;234m \e[48;5;52m \e[48;5;235m \e[48;5;233m \e[48;5;234m \e[48;5;88m \e[48;5;124m \e[48;5;88m \e[48;5;52m \e[48;5;235m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;52m \e[48;5;233m \e[48;5;52m \e[48;5;125m \e[48;5;124m \e[48;5;1m \e[48;5;232m \e[48;5;233m \e[48;5;232m \e[48;5;233m \e[48;5;235m \e[48;5;94m \e[48;5;131m \e[48;5;95m \e[48;5;137m \e[48;5;94m \e[48;5;131m \e[48;5;52m \e[48;5;234m \e[48;5;235m \e[48;5;232m \e[48;5;233m \e[48;5;232m \e[48;5;124m \e[48;5;88m \e[48;5;52m \e[48;5;235m \e[48;5;0m \e[48;5;233m \e[48;5;232m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;52m \e[48;5;233m \e[48;5;234m \e[48;5;52m \e[48;5;124m \e[48;5;1m \e[48;5;52m \e[48;5;233m \e[48;5;235m \e[48;5;95m \e[48;5;137m \e[48;5;234m \e[48;5;235m \e[48;5;52m \e[48;5;137m \e[48;5;52m \e[48;5;234m \e[48;5;239m \e[48;5;137m \e[48;5;131m \e[48;5;234m \e[48;5;233m \e[48;5;52m \e[48;5;124m \e[48;5;88m \e[48;5;52m \e[48;5;235m \e[48;5;0m \e[48;5;232m \e[48;5;233m \e[48;5;232m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;232m \e[48;5;233m \e[48;5;124m \e[48;5;52m \e[48;5;233m \e[48;5;95m \e[48;5;131m \e[48;5;137m \e[48;5;233m \e[48;5;234m \e[48;5;233m \e[48;5;137m \e[48;5;233m \e[48;5;234m \e[48;5;58m \e[48;5;137m \e[48;5;95m \e[48;5;239m \e[48;5;233m \e[48;5;52m \e[48;5;88m \e[48;5;1m \e[48;5;233m \e[48;5;234m \e[48;5;0m \e[48;5;233m \e[48;5;237m \e[48;5;240m \e[48;5;243m \e[48;5;239m \e[48;5;237m \e[48;5;233m \e[48;5;232m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;232m \e[48;5;88m \e[48;5;234m \e[48;5;233m \e[48;5;234m \e[48;5;137m \e[48;5;232m \e[48;5;233m \e[48;5;137m \e[48;5;233m \e[48;5;237m \e[48;5;137m \e[48;5;95m \e[48;5;234m \e[48;5;233m \e[48;5;236m \e[48;5;235m \e[48;5;232m \e[48;5;0m \e[48;5;233m \e[48;5;240m \e[48;5;8m \e[48;5;248m \e[48;5;145m \e[48;5;8m \e[48;5;240m \e[48;5;233m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;233m \e[48;5;232m \e[48;5;234m \e[48;5;233m \e[48;5;52m \e[48;5;137m \e[48;5;232m \e[48;5;233m \e[48;5;232m \e[48;5;131m \e[48;5;94m \e[48;5;95m \e[48;5;232m \e[48;5;233m \e[48;5;238m \e[48;5;137m \e[48;5;95m \e[48;5;234m \e[48;5;233m \e[48;5;232m \e[48;5;0m \e[48;5;233m \e[48;5;240m \e[48;5;8m \e[48;5;145m \e[48;5;249m \e[48;5;246m \e[48;5;237m \e[48;5;233m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;232m \e[48;5;233m \e[48;5;235m \e[48;5;94m \e[48;5;137m \e[48;5;234m \e[48;5;235m \e[48;5;52m \e[48;5;131m \e[48;5;137m \e[48;5;95m \e[48;5;234m \e[48;5;235m \e[48;5;239m \e[48;5;137m \e[48;5;95m \e[48;5;233m \e[48;5;0m \e[48;5;233m \e[48;5;237m \e[48;5;241m \e[48;5;145m \e[48;5;249m \e[48;5;247m \e[48;5;242m \e[48;5;232m \e[48;5;233m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;233m \e[48;5;235m \e[48;5;239m \e[48;5;234m \e[48;5;58m \e[48;5;137m \e[48;5;52m \e[48;5;239m \e[48;5;95m \e[48;5;137m \e[48;5;95m \e[48;5;52m \e[48;5;94m \e[48;5;137m \e[48;5;131m \e[48;5;58m \e[48;5;234m \e[48;5;235m \e[48;5;239m \e[48;5;234m \e[48;5;0m \e[48;5;232m \e[48;5;233m \e[48;5;237m \e[48;5;241m \e[48;5;248m \e[48;5;145m \e[48;5;247m \e[48;5;242m \e[48;5;233m \e[48;5;232m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;233m \e[48;5;234m \e[48;5;58m \e[48;5;131m \e[48;5;52m \e[48;5;234m \e[48;5;52m \e[48;5;137m \e[48;5;52m \e[48;5;95m \e[48;5;137m \e[48;5;52m \e[48;5;238m \e[48;5;137m \e[48;5;95m \e[48;5;52m \e[48;5;234m \e[48;5;235m \e[48;5;58m \e[48;5;95m \e[48;5;234m \e[48;5;233m \e[48;5;237m \e[48;5;241m \e[48;5;248m \e[48;5;249m \e[48;5;145m \e[48;5;247m \e[48;5;242m \e[48;5;233m \e[48;5;232m \e[48;5;0m \e[0m
\e[48;5;233m \e[48;5;235m \e[48;5;137m \e[48;5;238m \e[48;5;236m \e[48;5;95m \e[48;5;137m \e[48;5;52m \e[48;5;137m \e[48;5;95m \e[48;5;235m \e[48;5;137m \e[48;5;95m \e[48;5;52m \e[48;5;137m \e[48;5;234m \e[48;5;233m \e[48;5;240m \e[48;5;8m \e[48;5;145m \e[48;5;249m \e[48;5;145m \e[48;5;247m \e[48;5;242m \e[48;5;233m \e[48;5;234m \e[48;5;0m \e[0m
\e[48;5;233m \e[48;5;235m \e[48;5;131m \e[48;5;137m \e[48;5;238m \e[48;5;58m \e[48;5;137m \e[48;5;233m \e[48;5;234m \e[48;5;137m \e[48;5;95m \e[48;5;235m \e[48;5;233m \e[48;5;237m \e[48;5;137m \e[48;5;52m \e[48;5;137m \e[48;5;234m \e[48;5;233m \e[48;5;245m \e[48;5;145m \e[48;5;8m \e[48;5;242m \e[48;5;235m \e[48;5;234m \e[48;5;232m \e[48;5;0m \e[0m
\e[48;5;233m \e[48;5;235m \e[48;5;131m \e[48;5;58m \e[48;5;137m \e[48;5;131m \e[48;5;95m \e[48;5;237m \e[48;5;232m \e[48;5;233m \e[48;5;137m \e[48;5;239m \e[48;5;234m \e[48;5;233m \e[48;5;234m \e[48;5;237m \e[48;5;95m \e[48;5;137m \e[48;5;94m \e[48;5;137m \e[48;5;234m \e[48;5;233m \e[48;5;232m \e[48;5;8m \e[48;5;248m \e[48;5;145m \e[48;5;249m \e[48;5;8m \e[48;5;246m \e[48;5;8m \e[48;5;243m \e[48;5;239m \e[48;5;233m \e[48;5;235m \e[48;5;3m \e[0m
\e[48;5;233m \e[48;5;235m \e[48;5;131m \e[48;5;95m \e[48;5;234m \e[48;5;137m \e[48;5;95m \e[48;5;234m \e[48;5;233m \e[48;5;95m \e[48;5;137m \e[48;5;94m \e[48;5;238m \e[48;5;233m \e[48;5;137m \e[48;5;95m \e[48;5;52m \e[48;5;137m \e[48;5;234m \e[48;5;233m \e[48;5;250m \e[48;5;145m \e[48;5;249m \e[48;5;241m \e[48;5;247m \e[48;5;145m \e[48;5;248m \e[48;5;249m \e[48;5;145m \e[48;5;248m \e[48;5;242m \e[48;5;234m \e[48;5;233m \e[48;5;232m \e[48;5;233m \e[0m
\e[48;5;233m \e[48;5;235m \e[48;5;131m \e[48;5;95m \e[48;5;52m \e[48;5;137m \e[48;5;95m \e[48;5;233m \e[48;5;235m \e[48;5;94m \e[48;5;131m \e[48;5;137m \e[48;5;131m \e[48;5;235m \e[48;5;234m \e[48;5;233m \e[48;5;137m \e[48;5;95m \e[48;5;52m \e[48;5;131m \e[48;5;234m \e[48;5;236m \e[48;5;241m \e[48;5;249m \e[48;5;145m \e[48;5;249m \e[48;5;241m \e[48;5;247m \e[48;5;249m \e[48;5;145m \e[48;5;249m \e[48;5;242m \e[48;5;235m \e[48;5;233m \e[0m
\e[48;5;233m \e[48;5;235m \e[48;5;94m \e[48;5;131m \e[48;5;137m \e[48;5;131m \e[48;5;232m \e[48;5;233m \e[48;5;234m \e[48;5;52m \e[48;5;95m \e[48;5;131m \e[48;5;130m \e[48;5;95m \e[48;5;58m \e[48;5;52m \e[48;5;232m \e[48;5;233m \e[48;5;236m \e[48;5;131m \e[48;5;137m \e[48;5;95m \e[48;5;233m \e[48;5;237m \e[48;5;241m \e[48;5;145m \e[48;5;249m \e[48;5;241m \e[48;5;242m \e[48;5;241m \e[48;5;249m \e[48;5;145m \e[48;5;249m \e[48;5;145m \e[48;5;241m \e[48;5;237m \e[48;5;233m \e[0m
\e[48;5;0m \e[48;5;234m \e[48;5;237m \e[48;5;238m \e[48;5;239m \e[48;5;137m \e[48;5;58m \e[48;5;235m \e[48;5;234m \e[48;5;233m \e[48;5;237m \e[48;5;235m \e[48;5;234m \e[48;5;233m \e[48;5;239m \e[48;5;95m \e[48;5;137m \e[48;5;95m \e[48;5;238m \e[48;5;233m \e[48;5;236m \e[48;5;95m \e[48;5;102m \e[48;5;249m \e[48;5;145m \e[48;5;248m \e[48;5;245m \e[48;5;248m \e[48;5;249m \e[48;5;59m \e[48;5;237m \e[48;5;233m \e[0m
\e[48;5;0m \e[48;5;232m \e[48;5;234m \e[48;5;137m \e[48;5;95m \e[48;5;137m \e[48;5;238m \e[48;5;235m \e[48;5;233m \e[48;5;235m \e[48;5;137m \e[48;5;131m \e[48;5;95m \e[48;5;52m \e[48;5;88m \e[48;5;95m \e[48;5;241m \e[48;5;249m \e[48;5;145m \e[48;5;247m \e[48;5;241m \e[48;5;249m \e[48;5;145m \e[48;5;249m \e[48;5;242m \e[48;5;247m \e[48;5;145m \e[48;5;248m \e[48;5;240m \e[48;5;237m \e[48;5;233m \e[0m
\e[48;5;0m \e[48;5;232m \e[48;5;233m \e[48;5;234m \e[48;5;52m \e[48;5;137m \e[48;5;234m \e[48;5;232m \e[48;5;233m \e[48;5;232m \e[48;5;233m \e[48;5;234m \e[48;5;173m \e[48;5;131m \e[48;5;94m \e[48;5;234m \e[48;5;52m \e[48;5;124m \e[48;5;95m \e[48;5;241m \e[48;5;249m \e[48;5;145m \e[48;5;247m \e[48;5;242m \e[48;5;250m \e[48;5;249m \e[48;5;145m \e[48;5;249m \e[48;5;145m \e[48;5;249m \e[48;5;250m \e[48;5;242m \e[48;5;235m \e[48;5;233m \e[0m
\e[48;5;0m \e[48;5;232m \e[48;5;233m \e[48;5;232m \e[48;5;233m \e[48;5;52m \e[48;5;137m \e[48;5;239m \e[48;5;235m \e[48;5;233m \e[48;5;234m \e[48;5;235m \e[48;5;233m \e[48;5;234m \e[48;5;137m \e[48;5;52m \e[48;5;234m \e[48;5;232m \e[48;5;52m \e[48;5;1m \e[48;5;124m \e[48;5;95m \e[48;5;241m \e[48;5;249m \e[48;5;145m \e[48;5;247m \e[48;5;242m \e[48;5;237m \e[48;5;240m \e[48;5;243m \e[48;5;145m \e[48;5;248m \e[48;5;241m \e[48;5;237m \e[48;5;234m \e[48;5;232m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;232m \e[48;5;0m \e[48;5;233m \e[48;5;234m \e[48;5;238m \e[48;5;95m \e[48;5;94m \e[48;5;238m \e[48;5;239m \e[48;5;95m \e[48;5;239m \e[48;5;238m \e[48;5;95m \e[48;5;94m \e[48;5;239m \e[48;5;233m \e[48;5;52m \e[48;5;88m \e[48;5;124m \e[48;5;95m \e[48;5;241m \e[48;5;249m \e[48;5;145m \e[48;5;247m \e[48;5;242m \e[48;5;8m \e[48;5;245m \e[48;5;246m \e[48;5;249m \e[48;5;145m \e[48;5;246m \e[48;5;238m \e[48;5;234m \e[48;5;232m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;235m \e[48;5;236m \e[48;5;233m \e[48;5;235m \e[48;5;239m \e[48;5;95m \e[48;5;137m \e[48;5;95m \e[48;5;235m \e[48;5;234m \e[48;5;52m \e[48;5;232m \e[48;5;52m \e[48;5;1m \e[48;5;52m \e[48;5;124m \e[48;5;95m \e[48;5;241m \e[48;5;249m \e[48;5;145m \e[48;5;247m \e[48;5;241m \e[48;5;145m \e[48;5;238m \e[48;5;234m \e[48;5;232m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;233m \e[48;5;234m \e[48;5;235m \e[48;5;233m \e[48;5;234m \e[48;5;52m \e[48;5;234m \e[48;5;52m \e[48;5;234m \e[48;5;233m \e[48;5;52m \e[48;5;124m \e[48;5;95m \e[48;5;59m \e[48;5;249m \e[48;5;247m \e[48;5;241m \e[48;5;247m \e[48;5;249m \e[48;5;145m \e[48;5;249m \e[48;5;238m \e[48;5;234m \e[48;5;232m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;233m \e[48;5;234m \e[48;5;238m \e[48;5;237m \e[48;5;235m \e[48;5;234m \e[48;5;235m \e[48;5;61m \e[48;5;234m \e[48;5;235m \e[48;5;89m \e[48;5;124m \e[48;5;88m \e[48;5;124m \e[48;5;88m \e[48;5;234m \e[48;5;60m \e[48;5;61m \e[48;5;235m \e[48;5;124m \e[48;5;88m \e[48;5;241m \e[48;5;247m \e[48;5;145m \e[48;5;250m \e[48;5;241m \e[48;5;249m \e[48;5;145m \e[48;5;249m \e[48;5;233m \e[48;5;232m \e[48;5;0m \e[0m
\e[48;5;232m \e[48;5;233m \e[48;5;235m \e[48;5;237m \e[48;5;243m \e[48;5;242m \e[48;5;238m \e[48;5;234m \e[48;5;235m \e[48;5;4m \e[48;5;235m \e[48;5;53m \e[48;5;88m \e[48;5;124m \e[48;5;125m \e[48;5;124m \e[48;5;88m \e[48;5;238m \e[48;5;4m \e[48;5;25m \e[48;5;26m \e[48;5;19m \e[48;5;4m \e[48;5;236m \e[48;5;1m \e[48;5;125m \e[48;5;124m \e[48;5;88m \e[48;5;95m \e[48;5;8m \e[48;5;245m \e[48;5;246m \e[48;5;239m \e[48;5;241m \e[48;5;242m \e[48;5;245m \e[48;5;249m \e[48;5;145m \e[48;5;245m \e[48;5;233m \e[48;5;232m \e[48;5;0m \e[0m
\e[48;5;233m \e[48;5;237m \e[48;5;241m \e[48;5;145m \e[48;5;248m \e[48;5;247m \e[48;5;241m \e[48;5;234m \e[48;5;18m \e[48;5;19m \e[48;5;234m \e[48;5;88m \e[48;5;124m \e[48;5;88m \e[48;5;237m \e[48;5;17m \e[48;5;26m \e[48;5;25m \e[48;5;26m \e[48;5;55m \e[48;5;234m \e[48;5;89m \e[48;5;124m \e[48;5;88m \e[48;5;124m \e[48;5;95m \e[48;5;59m \e[48;5;242m \e[48;5;237m \e[48;5;59m \e[48;5;243m \e[48;5;145m \e[48;5;249m \e[48;5;145m \e[48;5;248m \e[48;5;242m \e[48;5;233m \e[48;5;0m \e[0m
\e[48;5;233m \e[48;5;238m \e[48;5;246m \e[48;5;145m \e[48;5;249m \e[48;5;59m \e[48;5;238m \e[48;5;236m \e[48;5;234m \e[48;5;56m \e[48;5;55m \e[48;5;234m \e[48;5;88m \e[48;5;124m \e[48;5;234m \e[48;5;18m \e[48;5;26m \e[48;5;20m \e[48;5;19m \e[48;5;234m \e[48;5;89m \e[48;5;124m \e[48;5;1m \e[48;5;52m \e[48;5;235m \e[48;5;242m \e[48;5;237m \e[48;5;59m \e[48;5;243m \e[48;5;249m \e[48;5;145m \e[48;5;238m \e[48;5;233m \e[48;5;0m \e[0m
\e[48;5;233m \e[48;5;238m \e[48;5;246m \e[48;5;145m \e[48;5;248m \e[48;5;145m \e[48;5;245m \e[48;5;234m \e[48;5;143m \e[48;5;239m \e[48;5;236m \e[48;5;235m \e[48;5;55m \e[48;5;96m \e[48;5;137m \e[48;5;236m \e[48;5;54m \e[48;5;25m \e[48;5;235m \e[48;5;89m \e[48;5;124m \e[48;5;52m \e[48;5;233m \e[48;5;234m \e[48;5;238m \e[48;5;235m \e[48;5;233m \e[48;5;102m \e[48;5;0m \e[0m
\e[48;5;233m \e[48;5;238m \e[48;5;246m \e[48;5;145m \e[48;5;248m \e[48;5;243m \e[48;5;241m \e[48;5;94m \e[48;5;143m \e[48;5;136m \e[48;5;95m \e[48;5;18m \e[48;5;4m \e[48;5;60m \e[48;5;137m \e[48;5;136m \e[48;5;172m \e[48;5;94m \e[48;5;60m \e[48;5;61m \e[48;5;4m \e[48;5;236m \e[48;5;88m \e[48;5;124m \e[48;5;52m \e[48;5;234m \e[48;5;0m \e[48;5;232m \e[48;5;0m \e[48;5;232m \e[48;5;234m \e[48;5;235m \e[48;5;234m \e[48;5;232m \e[48;5;59m \e[48;5;0m \e[0m
\e[48;5;232m \e[48;5;238m \e[48;5;247m \e[48;5;145m \e[48;5;239m \e[48;5;237m \e[48;5;137m \e[48;5;136m \e[48;5;137m \e[48;5;20m \e[48;5;26m \e[48;5;20m \e[48;5;25m \e[48;5;137m \e[48;5;136m \e[48;5;60m \e[48;5;20m \e[48;5;26m \e[48;5;234m \e[48;5;236m \e[48;5;88m \e[48;5;124m \e[48;5;234m \e[48;5;0m \e[48;5;232m \e[48;5;234m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;233m \e[48;5;240m \e[48;5;243m \e[48;5;249m \e[48;5;240m \e[48;5;237m \e[48;5;137m \e[48;5;136m \e[48;5;137m \e[48;5;20m \e[48;5;26m \e[48;5;25m \e[48;5;20m \e[48;5;19m \e[48;5;137m \e[48;5;173m \e[48;5;137m \e[48;5;136m \e[48;5;137m \e[48;5;60m \e[48;5;26m \e[48;5;25m \e[48;5;56m \e[48;5;4m \e[48;5;234m \e[48;5;124m \e[48;5;235m \e[48;5;234m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;233m \e[48;5;237m \e[48;5;59m \e[48;5;145m \e[48;5;248m \e[48;5;239m \e[48;5;235m \e[48;5;54m \e[48;5;143m \e[48;5;94m \e[48;5;237m \e[48;5;20m \e[48;5;26m \e[48;5;25m \e[48;5;20m \e[48;5;26m \e[48;5;61m \e[48;5;95m \e[48;5;136m \e[48;5;52m \e[48;5;237m \e[48;5;20m \e[48;5;26m \e[48;5;20m \e[48;5;25m \e[48;5;24m \e[48;5;236m \e[48;5;235m \e[48;5;239m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;233m \e[48;5;235m \e[48;5;237m \e[48;5;102m \e[48;5;145m \e[48;5;239m \e[48;5;235m \e[48;5;19m \e[48;5;60m \e[48;5;239m \e[48;5;237m \e[48;5;26m \e[48;5;20m \e[48;5;26m \e[48;5;61m \e[48;5;243m \e[48;5;60m \e[48;5;237m \e[48;5;54m \e[48;5;20m \e[48;5;26m \e[48;5;20m \e[48;5;26m \e[48;5;25m \e[48;5;4m \e[48;5;235m \e[48;5;234m \e[48;5;238m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;233m \e[48;5;235m \e[48;5;241m \e[48;5;249m \e[48;5;239m \e[48;5;235m \e[48;5;19m \e[48;5;26m \e[48;5;55m \e[48;5;26m \e[48;5;20m \e[48;5;61m \e[48;5;26m \e[48;5;19m \e[48;5;20m \e[48;5;25m \e[48;5;26m \e[48;5;20m \e[48;5;4m \e[48;5;235m \e[48;5;234m \e[48;5;238m \e[48;5;0m \e[0m
\e[48;5;0m \e[48;5;232m \e[48;5;234m \e[48;5;237m \e[48;5;236m \e[48;5;235m \e[48;5;19m \e[48;5;26m \e[48;5;20m \e[48;5;26m \e[48;5;20m \e[48;5;4m \e[48;5;235m \e[48;5;234m \e[48;5;238m \e[48;5;0m \e[0m
";

Binary file not shown.

Binary file not shown.

View File

@ -6,7 +6,7 @@
[subrepo] [subrepo]
remote = https://github.com/ethteck/splat.git remote = https://github.com/ethteck/splat.git
branch = master branch = master
commit = 25b848a230458b50c0d9124cf9af872cebb44ef2 commit = 09a5715405e8eaedad8923b9b7ae80d73d4e7c41
parent = 08f58ae5d9d266caf805fdee477008f88e84f1f9 parent = 5d055900eb9f590595b5628e665f419b8bde8508
method = merge method = merge
cmdver = 0.4.3 cmdver = 0.4.3

View File

@ -1,5 +1,12 @@
# splat Release Notes # splat Release Notes
### 0.7.6
* Fixed a bug involving detection of defined functions in c files for GLOBAL_ASM-using projects
* Added options to disable the creation of undefined_funcs/syms_auto.txt files
* Add a Vtx segment type for creating c files containg model vertex data in the n64 libultra Vtx format
* Added a `cpp` segment type which is identical to `c` but looks for a file with the extension ".cpp" instead of ".c".
### 0.7.5: all_ types and auto_all_sections ### 0.7.5: all_ types and auto_all_sections
If you have a group segment with multiple c files and want splat to automatically create linker entries at a given position for each code object (c, asm, hasm) in the segment, you can use an `all_` type for that section. For example, you can add `[auto, all_bss]` as the last subsegment in a segment. This will direct splat to create a linker entry for each code object in the segment. This saves a lot of time when it comes to manually adding .bss subsegments for bss support, for example. The same thing can be done for data and rodata sections, but note this should probably be done later into a project when all data / rodata is migrated to c files, as the `all_` types lose the rom positioning information that's necessary for splat to do proper disassembly. If you have a group segment with multiple c files and want splat to automatically create linker entries at a given position for each code object (c, asm, hasm) in the segment, you can use an `all_` type for that section. For example, you can add `[auto, all_bss]` as the last subsegment in a segment. This will direct splat to create a linker entry for each code object in the segment. This saves a lot of time when it comes to manually adding .bss subsegments for bss support, for example. The same thing can be done for data and rodata sections, but note this should probably be done later into a project when all data / rodata is migrated to c files, as the `all_` types lose the rom positioning information that's necessary for splat to do proper disassembly.

View File

@ -71,6 +71,14 @@ class N64SegC(N64SegCodeSubsegment):
asm_out_dir = options.get_asm_path() / "nonmatchings" / self.dir asm_out_dir = options.get_asm_path() / "nonmatchings" / self.dir
asm_out_dir.mkdir(parents=True, exist_ok=True) asm_out_dir.mkdir(parents=True, exist_ok=True)
is_new_c_file = False
c_path = self.out_path()
if c_path:
if not os.path.exists(c_path) and options.get("create_new_c_files", True):
self.create_c_file(self.funcs_text, asm_out_dir, c_path)
is_new_c_file = True
for func in self.funcs_text: for func in self.funcs_text:
func_name = self.parent.get_symbol(func, type="func", local_only=True).name func_name = self.parent.get_symbol(func, type="func", local_only=True).name
@ -78,14 +86,9 @@ class N64SegC(N64SegCodeSubsegment):
if func_name not in self.defined_funcs: if func_name not in self.defined_funcs:
self.create_c_asm_file(self.funcs_text, func, asm_out_dir, func_name) self.create_c_asm_file(self.funcs_text, func, asm_out_dir, func_name)
else: else:
if func_name in self.global_asm_funcs: if func_name in self.global_asm_funcs or is_new_c_file:
self.create_c_asm_file(self.funcs_text, func, asm_out_dir, func_name) self.create_c_asm_file(self.funcs_text, func, asm_out_dir, func_name)
c_path = self.out_path()
if c_path:
if not os.path.exists(c_path) and options.get("create_new_c_files", True):
self.create_c_file(self.funcs_text, asm_out_dir, c_path)
def get_gcc_inc_header(self): def get_gcc_inc_header(self):
ret = [] ret = []
ret.append(".set noat # allow manual use of $at") ret.append(".set noat # allow manual use of $at")

View File

@ -0,0 +1,6 @@
from segtypes.n64.c import N64SegC
from util import options
class N64SegCpp(N64SegC):
def out_path(self):
return options.get_src_path() / self.dir / f"{self.name}.cpp"