fix assembly of F_ARGS opcodes on pre-v3
This commit is contained in:
+7
-5
@@ -1879,6 +1879,7 @@ std::string assemble_quest_script(const std::string& text) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Assemble code segment
|
// Assemble code segment
|
||||||
|
bool version_has_args = F_HAS_ARGS & v_flag(quest_version);
|
||||||
const auto& opcodes = opcodes_by_name_for_version(quest_version);
|
const auto& opcodes = opcodes_by_name_for_version(quest_version);
|
||||||
StringWriter code_w;
|
StringWriter code_w;
|
||||||
for (size_t line_num = 1; line_num <= lines.size(); line_num++) {
|
for (size_t line_num = 1; line_num <= lines.size(); line_num++) {
|
||||||
@@ -1908,7 +1909,8 @@ std::string assemble_quest_script(const std::string& text) {
|
|||||||
auto line_tokens = split(line, ' ', 1);
|
auto line_tokens = split(line, ' ', 1);
|
||||||
const auto& opcode_def = opcodes.at(line_tokens.at(0));
|
const auto& opcode_def = opcodes.at(line_tokens.at(0));
|
||||||
|
|
||||||
if (!(opcode_def->flags & F_ARGS)) {
|
bool use_args = version_has_args && (opcode_def->flags & F_ARGS);
|
||||||
|
if (!use_args) {
|
||||||
if ((opcode_def->opcode & 0xFF00) == 0x0000) {
|
if ((opcode_def->opcode & 0xFF00) == 0x0000) {
|
||||||
code_w.put_u8(opcode_def->opcode);
|
code_w.put_u8(opcode_def->opcode);
|
||||||
} else {
|
} else {
|
||||||
@@ -1930,7 +1932,7 @@ std::string assemble_quest_script(const std::string& text) {
|
|||||||
strip_leading_whitespace(line_tokens[1]);
|
strip_leading_whitespace(line_tokens[1]);
|
||||||
|
|
||||||
if (starts_with(line_tokens[1], "...")) {
|
if (starts_with(line_tokens[1], "...")) {
|
||||||
if (!(opcode_def->flags & F_ARGS)) {
|
if (!use_args) {
|
||||||
throw runtime_error(string_printf("(line %zu) \'...\' can only be used with F_ARGS opcodes", line_num));
|
throw runtime_error(string_printf("(line %zu) \'...\' can only be used with F_ARGS opcodes", line_num));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1987,7 +1989,7 @@ std::string assemble_quest_script(const std::string& text) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (opcode_def->flags & F_ARGS) {
|
if (use_args) {
|
||||||
auto label_it = labels_by_name.find(arg);
|
auto label_it = labels_by_name.find(arg);
|
||||||
if (arg.empty()) {
|
if (arg.empty()) {
|
||||||
throw runtime_error("argument is empty");
|
throw runtime_error("argument is empty");
|
||||||
@@ -2058,7 +2060,7 @@ std::string assemble_quest_script(const std::string& text) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} else { // Not F_ARGS
|
} else { // Not use_args
|
||||||
auto add_label = [&](const string& name, bool is32) -> void {
|
auto add_label = [&](const string& name, bool is32) -> void {
|
||||||
if (!labels_by_name.count(name)) {
|
if (!labels_by_name.count(name)) {
|
||||||
throw runtime_error("label not defined: " + name);
|
throw runtime_error("label not defined: " + name);
|
||||||
@@ -2157,7 +2159,7 @@ std::string assemble_quest_script(const std::string& text) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opcode_def->flags & F_ARGS) {
|
if (use_args) {
|
||||||
if ((opcode_def->opcode & 0xFF00) == 0x0000) {
|
if ((opcode_def->opcode & 0xFF00) == 0x0000) {
|
||||||
code_w.put_u8(opcode_def->opcode);
|
code_w.put_u8(opcode_def->opcode);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user