Skip to content

Commit

Permalink
t7 compiler, test bo4 memory
Browse files Browse the repository at this point in the history
  • Loading branch information
ate47 committed Jul 28, 2024
1 parent cefe580 commit ceda311
Show file tree
Hide file tree
Showing 20 changed files with 504 additions and 107 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ My set of tools. The code is more important than the features, so feel free to r

| Name | Revision | Decompiler | Compiler | PS4 support |
| ------------------------ | -------- | ---------- | -------- | ----------- |
| Black Ops 3 (T7) | 1B | Partial | ||
| Black Ops 3 (T7) | 1C || ||
| Black Ops 3 (T7) | 1B | Partial | ||
| Black Ops 3 (T7) | 1C || ||
| Black Ops 4 (T8) | 36 ||| EXT |
| Black Ops Cold War (T9) | 37 | DEC || EXT |
| Black Ops Cold War (T9) | 38 | DEC || EXT |
Expand Down
4 changes: 3 additions & 1 deletion premake5.lua
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@ project "AtianCodToolsBO4DLL2"
"deps/asmjit/src/",
"deps/rapidjson/include/",
"deps/dbflib/src/lib/",
"deps/hw_break/HwBpLib/inc/",
}

vpaths {
Expand Down Expand Up @@ -263,7 +264,8 @@ project "AtianCodTools"
"deps/dbflib/src/lib/",
"deps/json-rpc-cxx/include/",
"deps/json/include/",
"deps/rapidcsv/src/"
"deps/rapidcsv/src/",
"deps/hw_break/HwBpLib/inc/",
}

vpaths {
Expand Down
2 changes: 1 addition & 1 deletion src/acts/actscli.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ namespace {

// register the vm itself
const char* str = strcontainer.AddString(name);
tool::gsc::opcode::RegisterVM(vm.vm, str, str, vm.vmflags);
tool::gsc::opcode::RegisterVM(vm.vm, str, str, str, vm.vmflags);

auto* platforms = reinterpret_cast<ActsPackVMPlatform*>(pack->header.magic + vm.platformsOffset);

Expand Down
203 changes: 137 additions & 66 deletions src/acts/compiler/gsc_compiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -707,39 +707,6 @@ namespace acts::compiler {
}
};

/*
* Compute the node using the minimum amount of bits
* @return node
*/
AscmNodeOpCode* BuildAscmNodeData(int64_t val) {
if (val == 0) {
return new AscmNodeOpCode(OPCODE_GetZero);
}
if (val > 0) {
if (val < 256) {
return new AscmNodeData<uint8_t>((uint8_t)val, OPCODE_GetByte);
}
if (val < 65536) {
return new AscmNodeData<uint16_t>((uint16_t)val, OPCODE_GetUnsignedShort);
}
if (val < 4294967295) {
return new AscmNodeData<uint32_t>((uint32_t)val, OPCODE_GetUnsignedInteger);
}
} else {
if (val > -256) {
return new AscmNodeData<uint8_t>((uint8_t)(-val), OPCODE_GetNegByte);
}
if (val > -65536) {
return new AscmNodeData<uint16_t>((uint16_t)(-val), OPCODE_GetNegUnsignedShort);
}
if (val >= -4294967295) {
return new AscmNodeData<uint32_t>((uint32_t)(-val), OPCODE_GetNegUnsignedInteger);
}
}

return new AscmNodeData<int64_t>((int64_t)val, OPCODE_GetLongInteger);
}

#define IS_RULE_TYPE(rule, index) (rule && rule->getTreeType() == TREE_RULE && dynamic_cast<RuleContext*>(rule)->getRuleIndex() == index)
#define IS_TERMINAL_TYPE(term, index) (term && term->getTreeType() == TREE_TERMINAL && dynamic_cast<TerminalNode*>(term)->getSymbol()->getType() == index)
#define IS_IDF(rule) (IS_RULE_TYPE((rule), gscParser::RuleIdf) || IS_TERMINAL_TYPE((rule), gscParser::IDENTIFIER))
Expand Down Expand Up @@ -989,8 +956,30 @@ namespace acts::compiler {

void PrintHelp() {
LOG_INFO("-h --help : Print help");
LOG_INFO("-g --game [g] : Set game");
LOG_INFO("-p --platform [p] : Set platform");
{
std::ostringstream games;

size_t idx{};
for (const auto& [vm, vmInfo] : tool::gsc::opcode::GetVMMaps()) {
if (idx++) games << ",";
games << " '" << vmInfo.internalName << "'";
}

LOG_INFO("-g --game [g] : Set game, values:{}.", games.str());
}
{
std::ostringstream platforms;

size_t idx{};

for (size_t i = 1; i < tool::gsc::opcode::PLATFORM_COUNT; i++) {
const char* plt = tool::gsc::opcode::PlatformIdName((tool::gsc::opcode::Platform)i);
if (i) platforms << ",";
platforms << " '" << plt << "'";
}

LOG_INFO("-p --platform [p] : Set platform, values:{}.", platforms.str());
}
LOG_INFO("-d --dbg : Add dev options");
LOG_INFO("-o --output [f] : Set output file (without extension), default: 'compiled'");
LOG_INFO("-D[name] : Define variable");
Expand Down Expand Up @@ -1255,9 +1244,10 @@ namespace acts::compiler {
GscFileType type;
uint64_t currentNamespace;
uint64_t fileName{};
const char* fileNameStr{};
uint64_t fileNameSpace{};
int64_t crc{};
std::set<uint64_t> includes{};
std::set<std::string> includes{};
std::vector<AscmNode*> m_devBlocks{};
std::unordered_map<uint64_t, FunctionObject> exports{};
std::unordered_map<std::string, StringObject> strings{};
Expand All @@ -1282,12 +1272,13 @@ namespace acts::compiler {
}

const char* fn = client ? opt.nameClient : opt.nameServer;
fileName = fn && *fn ? vmInfo->HashPath(fn) : 0;
fileNameStr = fn && *fn ? fn : nullptr;

if (!fileName) {
fileName = vmInfo->HashPath(gscHandler->GetDefaultName(client));
if (!fileNameStr) {
fileNameStr = gscHandler->GetDefaultName(client);
}

fileName = vmInfo->HashPath(fileNameStr);
const char* fns = client ? opt.fileNameSpaceClient : opt.fileNameSpaceServer;
fileNameSpace = fns && *fns ? vmInfo->HashFilePath(opt.fileNameSpaceClient) : 0;

Expand All @@ -1309,27 +1300,68 @@ namespace acts::compiler {
}
}

uint64_t AddInclude(std::string& data) {
if (!(data.ends_with(".gsc") || data.ends_with(".csc")) && !(data.starts_with("script_"))) {
switch (type) {
case FILE_CSC:
data += ".csc";
break;
case FILE_GSC:
data += ".gsc";
break;
}
}
AddHash(data);
includes.insert(vmInfo->HashPath(data.data()));
return 0;
void AddInclude(std::string& data) {
includes.insert(data);
}

bool HasOpCode(OPCode opcode) {
auto [ok, op] = GetOpCodeId(vmInfo->vm, plt, opcode);
return ok;
}

/*
* Compute the node using the minimum amount of bits
* @param val value to encode
* @return node
*/
AscmNodeOpCode* BuildAscmNodeData(int64_t val) {
if (val == 0) {
return new AscmNodeOpCode(OPCODE_GetZero);
}
if (val > 0) {
if (val <= 0x7F && HasOpCode(OPCODE_GetSignedByte)) {
return new AscmNodeData<int8_t>((int8_t)val, OPCODE_GetSignedByte);
}
if (val <= 0xFF && HasOpCode(OPCODE_GetByte)) {
return new AscmNodeData<uint8_t>((uint8_t)val, OPCODE_GetByte);
}
if (val <= 0x7FFF && HasOpCode(OPCODE_GetShort)) {
return new AscmNodeData<int16_t>((int16_t)val, OPCODE_GetShort);
}
if (val <= 0xFFFF && HasOpCode(OPCODE_GetUnsignedShort)) {
return new AscmNodeData<uint16_t>((uint16_t)val, OPCODE_GetUnsignedShort);
}
if (val <= 0x7FFFFFFF && HasOpCode(OPCODE_GetInteger)) {
return new AscmNodeData<int32_t>((int32_t)val, OPCODE_GetInteger);
}
if (val <= 0xFFFFFFFF && HasOpCode(OPCODE_GetUnsignedInteger)) {
return new AscmNodeData<uint32_t>((uint32_t)val, OPCODE_GetUnsignedInteger);
}
}
else {
if (val >= -0x7F && HasOpCode(OPCODE_GetSignedByte)) {
return new AscmNodeData<int8_t>((int8_t)(val), OPCODE_GetSignedByte);
}
if (val >= -0xFF && HasOpCode(OPCODE_GetNegByte)) {
return new AscmNodeData<uint8_t>((uint8_t)(-val), OPCODE_GetNegByte);
}
if (val >= -0x7FFF && HasOpCode(OPCODE_GetShort)) {
return new AscmNodeData<int16_t>((int16_t)(val), OPCODE_GetShort);
}
if (val >= -0xFFFF && HasOpCode(OPCODE_GetNegUnsignedShort)) {
return new AscmNodeData<uint16_t>((uint16_t)(-val), OPCODE_GetNegUnsignedShort);
}
if (val >= -0x7FFFFFFF && HasOpCode(OPCODE_GetInteger)) {
return new AscmNodeData<int32_t>((int32_t)val, OPCODE_GetInteger);
}
if (val >= -0xFFFFFFFFLL && HasOpCode(OPCODE_GetNegUnsignedInteger)) {
return new AscmNodeData<uint32_t>((uint32_t)(-val), OPCODE_GetNegUnsignedInteger);
}
}

return new AscmNodeData<int64_t>(val, OPCODE_GetLongInteger);
}

bool TryHashNodeValue(ParseTree* hashNode, uint64_t& output) {
if (!hashNode) {
return false; // wtf?
Expand Down Expand Up @@ -1587,14 +1619,41 @@ namespace acts::compiler {
}

LOG_TRACE("Compile {} include(s)...", includes.size());
size_t incTable = utils::Allocate(data, sizeof(uint64_t) * includes.size());

size_t incTable{};
if (includes.size()) {
uint64_t* tab = reinterpret_cast<uint64_t*>(&data[incTable]);
if (gscHandler->HasFlag(tool::gsc::GOHF_STRING_NAMES)) {
// store the offsets
incTable = utils::Allocate(data, sizeof(uint32_t) * includes.size());

size_t idx{};

for (uint64_t i : includes) {
*tab = i;
tab++;
for (const std::string& i : includes) {
reinterpret_cast<uint32_t*>(&data[incTable])[idx++] = (uint32_t)data.size();
utils::WriteString(data, i.data());
}
}
else {
// store the hashes
incTable = utils::Allocate(data, sizeof(uint64_t) * includes.size());
uint64_t* tab = reinterpret_cast<uint64_t*>(&data[incTable]);

for (const std::string& i : includes) {
std::string data{ i };
if (!(data.ends_with(".gsc") || data.ends_with(".csc")) && !(data.starts_with("script_"))) {
switch (type) {
case FILE_CSC:
data += ".csc";
break;
case FILE_GSC:
data += ".gsc";
break;
}
}
AddHash(data);

*tab = vmInfo->HashPath(data.data());
tab++;
}
}
}

Expand Down Expand Up @@ -1873,9 +1932,21 @@ namespace acts::compiler {
}
}

uint32_t nameOffSet{};
if (gscHandler->HasFlag(tool::gsc::GOHF_STRING_NAMES)) {
nameOffSet = (uint32_t)data.size();
utils::WriteString(data, fileNameStr);
}

// compile header
gscHandler->file = data.data();
gscHandler->SetName(fileName);

if (nameOffSet) {
gscHandler->SetNameString(nameOffSet);
}
else {
gscHandler->SetName(fileName);
}
gscHandler->SetChecksum(crc);
gscHandler->SetHeader();

Expand Down Expand Up @@ -3694,7 +3765,7 @@ namespace acts::compiler {
ok = false;
}
// push current key
fobj.AddNode(rule->children[i - 1], BuildAscmNodeData(currentKey++));
fobj.AddNode(rule->children[i - 1], obj.BuildAscmNodeData(currentKey++));
}

fobj.AddNode(rule->children[i - 1], new AscmNodeOpCode(OPCODE_AddToArray));
Expand Down Expand Up @@ -4081,30 +4152,30 @@ namespace acts::compiler {
fobj.AddNode(term, new AscmNodeOpCode(OPCODE_GetUndefined));
return true;
case gscParser::BOOL_VALUE:
fobj.AddNode(term, BuildAscmNodeData(term->getText() == "true"));
fobj.AddNode(term, obj.BuildAscmNodeData(term->getText() == "true"));
return true;
case gscParser::FLOATVAL:
fobj.AddNode(term, new AscmNodeData<FLOAT>((FLOAT)std::strtof(term->getText().c_str(), nullptr), OPCODE_GetFloat));
return true;
case gscParser::INTEGER10:
fobj.AddNode(term, BuildAscmNodeData(std::strtoll(term->getText().c_str(), nullptr, 10)));
fobj.AddNode(term, obj.BuildAscmNodeData(std::strtoll(term->getText().c_str(), nullptr, 10)));
return true;
case gscParser::INTEGER16: {
bool neg = term->getText()[0] == '-';
auto val = std::strtoll(term->getText().c_str() + (neg ? 3 : 2), nullptr, 16);
fobj.AddNode(term, BuildAscmNodeData(neg ? -val : val));
fobj.AddNode(term, obj.BuildAscmNodeData(neg ? -val : val));
return true;
}
case gscParser::INTEGER8: {
bool neg = term->getText()[0] == '-';
auto val = std::strtoll(term->getText().c_str() + (neg ? 2 : 1), nullptr, 8);
fobj.AddNode(term, BuildAscmNodeData(neg ? -val : val));
fobj.AddNode(term, obj.BuildAscmNodeData(neg ? -val : val));
return true;
}
case gscParser::INTEGER2: {
bool neg = term->getText()[0] == '-';
auto val = std::strtoll(term->getText().c_str() + (neg ? 3 : 2), nullptr, 2);
fobj.AddNode(term, BuildAscmNodeData(neg ? -val : val));
fobj.AddNode(term, obj.BuildAscmNodeData(neg ? -val : val));
return true;
}
case gscParser::HASHSTRING: {
Expand Down
5 changes: 4 additions & 1 deletion src/acts/tools/gsc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,10 @@ byte GSCOBJHandler::MapFlagsImportToInt(byte flags) {
byte GSCOBJHandler::MapFlagsExportToInt(byte flags) {
return flags;
}


void GSCOBJHandler::SetNameString(uint32_t name) {
throw std::runtime_error("can't set string name for this vm");
}
int GSCOBJHandler::PatchCode(T8GSCOBJContext& ctx) {
size_t opcodeSize = ctx.m_vmInfo->HasFlag(VmFlags::VMF_OPCODE_U16) ? 2 : 1;
if (ctx.m_vmInfo->HasFlag(VmFlags::VMF_HASH64)) {
Expand Down
1 change: 1 addition & 0 deletions src/acts/tools/gsc.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1168,6 +1168,7 @@ namespace tool::gsc {

// Write functions
virtual void SetName(uint64_t name) = 0;
virtual void SetNameString(uint32_t name);
virtual void SetHeader() = 0;
virtual void SetChecksum(uint64_t val) = 0;
virtual uint32_t GetChecksum() = 0;
Expand Down
Loading

0 comments on commit ceda311

Please sign in to comment.