mirror of
https://github.com/pmret/papermario.git
synced 2024-11-08 12:02:30 +01:00
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:
parent
de800e9c9f
commit
f5a6d26ca8
1
.gitignore
vendored
1
.gitignore
vendored
@ -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
2
Jenkinsfile
vendored
@ -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'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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)"
|
||||||
|
@ -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.
Binary file not shown.
2
tools/build/cc/gcc/.gitignore
vendored
Normal file
2
tools/build/cc/gcc/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
*
|
||||||
|
!.gitignore
|
@ -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
54
tools/build/first_ok.sh
Normal 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.
Binary file not shown.
Binary file not shown.
@ -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
|
||||||
|
@ -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.
|
||||||
|
@ -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")
|
||||||
|
6
tools/splat/segtypes/n64/cpp.py
Normal file
6
tools/splat/segtypes/n64/cpp.py
Normal 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"
|
Loading…
Reference in New Issue
Block a user