Add Scenario::unknown_command() for error reporting

This commit is contained in:
kichikuou
2024-12-10 09:12:55 +09:00
parent ffa3a364ce
commit 4ec1a12daa
7 changed files with 50 additions and 48 deletions
+2 -4
View File
@@ -163,7 +163,7 @@ void NACT::execute()
sco.skip_syseng_rev_marker();
// 1コマンド実行
prev_addr = sco.addr();
sco.mark_cmd_start();
uint8 cmd = sco.getd();
if(set_palette && cmd != 'P') {
@@ -293,10 +293,8 @@ void NACT::execute()
if (is_message(cmd)) {
sco.ungetd();
message(0);
} else if (cmd >= 0x20 && cmd < 0x7f) {
sys_error("Unknown Command: '%c' at page = %d, addr = %d", cmd, sco.page(), prev_addr);
} else {
sys_error("Unknown Command: %02x at page = %d, addr = %d", cmd, sco.page(), prev_addr);
sco.unknown_command(cmd);
}
break;
}
-4
View File
@@ -111,12 +111,8 @@ protected:
// コマンドパーサ
void execute();
// シナリオデータ
Scenario sco;
// アドレス、ページ管理
int prev_addr;
// 変数
uint16 var[512];
uint16 var_stack[30][20];
+28 -30
View File
@@ -145,7 +145,7 @@ void NACT_Sys1::cmd_branch()
if(!condition) {
// 次の'}'命令までスキップする(ネストも考慮する)
for(;;) {
prev_addr = sco.addr();
sco.mark_cmd_start();
uint8 cmd = sco.getd();
if(cmd == '!') {
@@ -221,10 +221,8 @@ void NACT_Sys1::cmd_branch()
} else if (is_message(cmd)) {
sco.ungetd();
sco.skip(encoding->mblen(sco.ptr()));
} else if (cmd >= 0x20 && cmd < 0x7f) {
sys_error("Unknown Command: '%c' at page = %d, addr = %d", cmd, sco.page(), prev_addr);
} else {
sys_error("Unknown Command: %02x at page = %d, addr = %d", cmd, sco.page(), prev_addr);
sco.unknown_command(cmd);
}
}
}
@@ -547,20 +545,20 @@ void NACT_Sys1::cmd_a()
void NACT_Sys1::cmd_b()
{
// 未使用
sys_error("Unknown Command: 'B' at page = %d, addr = %d", sco.page(), prev_addr);
// Unused
sco.unknown_command('B');
}
void NACT_Sys1::cmd_d()
{
// 未使用
sys_error("Unknown Command: 'D' at page = %d, addr = %d", sco.page(), prev_addr);
// Unused
sco.unknown_command('D');
}
void NACT_Sys1::cmd_e()
{
// 未使用
sys_error("Unknown Command: 'E' at page = %d, addr = %d", sco.page(), prev_addr);
// Unused
sco.unknown_command('E');
}
void NACT_Sys1::cmd_f()
@@ -597,26 +595,26 @@ void NACT_Sys1::cmd_g()
void NACT_Sys1::cmd_h()
{
// 未使用
sys_error("Unknown Command: 'H' at page = %d, addr = %d", sco.page(), prev_addr);
// Unused
sco.unknown_command('H');
}
void NACT_Sys1::cmd_i()
{
// 未使用
sys_error("Unknown Command: 'I' at page = %d, addr = %d", sco.page(), prev_addr);
// Unused
sco.unknown_command('I');
}
void NACT_Sys1::cmd_j()
{
// 未使用
sys_error("Unknown Command: 'J' at page = %d, addr = %d", sco.page(), prev_addr);
// Unused
sco.unknown_command('J');
}
void NACT_Sys1::cmd_k()
{
// 未使用
sys_error("Unknown Command: 'K' at page = %d, addr = %d", sco.page(), prev_addr);
// Unused
sco.unknown_command('K');
}
void NACT_Sys1::cmd_l()
@@ -719,20 +717,20 @@ void NACT_Sys1::cmd_l()
void NACT_Sys1::cmd_m()
{
// 未使用
sys_error("Unknown Command: 'M' at page = %d, addr = %d", sco.page(), prev_addr);
// Unused
sco.unknown_command('M');
}
void NACT_Sys1::cmd_n()
{
// 未使用
sys_error("Unknown Command: 'N' at page = %d, addr = %d", sco.page(), prev_addr);
// Unused
sco.unknown_command('N');
}
void NACT_Sys1::cmd_o()
{
// 未使用
sys_error("Unknown Command: 'O' at page = %d, addr = %d", sco.page(), prev_addr);
// Unused
sco.unknown_command('O');
}
void NACT_Sys1::cmd_p()
@@ -867,8 +865,8 @@ void NACT_Sys1::cmd_s()
void NACT_Sys1::cmd_t()
{
// 未使用
sys_error("Unknown Command: 'T' at page = %d, addr = %d", sco.page(), prev_addr);
// Unused
sco.unknown_command('T');
}
void NACT_Sys1::cmd_u()
@@ -891,14 +889,14 @@ void NACT_Sys1::cmd_u()
void NACT_Sys1::cmd_v()
{
// 未使用
sys_error("Unknown Command: 'V' at page = %d, addr = %d", sco.page(), prev_addr);
// Unused
sco.unknown_command('V');
}
void NACT_Sys1::cmd_w()
{
// 未使用
sys_error("Unknown Command: 'W' at page = %d, addr = %d", sco.page(), prev_addr);
// Unused
sco.unknown_command('W');
}
void NACT_Sys1::cmd_x()
+2 -4
View File
@@ -85,7 +85,7 @@ void NACT_Sys2::cmd_branch()
if(!condition) {
// 次の'}'命令までスキップする(ネストも考慮する)
for(;;) {
prev_addr = sco.addr();
sco.mark_cmd_start();
uint8 cmd = sco.getd();
if(cmd == '!') {
@@ -259,10 +259,8 @@ void NACT_Sys2::cmd_branch()
} else if (is_message(cmd)) {
sco.ungetd();
sco.skip(encoding->mblen(sco.ptr()));
} else if (cmd >= 0x20 && cmd < 0x7f) {
sys_error("Unknown Command: '%c' at page = %d, addr = %d", cmd, sco.page(), prev_addr);
} else {
sys_error("Unknown Command: %02x at page = %d, addr = %d", cmd, sco.page(), prev_addr);
sco.unknown_command(cmd);
}
}
}
+2 -2
View File
@@ -328,8 +328,8 @@ void NACT_Sys3::cmd_b()
void NACT_Sys3::cmd_d()
{
// 未使用
sys_error("Unknown Command: 'D' at page = %d, addr = %d", sco.page(), prev_addr);
// Unused
sco.unknown_command('D');
}
void NACT_Sys3::cmd_e()
+12 -4
View File
@@ -14,7 +14,7 @@ void Scenario::skip_string(Encoding *enc, uint8_t terminator)
void Scenario::get_syseng_string(char* buf, int size, Encoding *enc, uint8_t terminator)
{
int start_addr = addr();
int start_addr = addr_;
int i = 0;
for (uint8_t c = getd(); c != terminator; c = getd()) {
@@ -22,7 +22,7 @@ void Scenario::get_syseng_string(char* buf, int size, Encoding *enc, uint8_t ter
ungetd();
int len = enc->mblen(ptr());
if (i + len >= size)
sys_error("String buffer overrun at %d:0x%x", page(), start_addr);
sys_error("String buffer overrun at %d:0x%x", page_, start_addr);
memcpy(&buf[i], ptr(), len);
i += len;
skip(len);
@@ -40,7 +40,7 @@ void Scenario::label_call(int label)
jump_to(label_stack.back());
label_stack.pop_back();
} else {
label_stack.push_back(addr());
label_stack.push_back(addr_);
jump_to(label);
}
}
@@ -56,7 +56,15 @@ void Scenario::page_call(int target_page)
page_jump(pair.first, pair.second);
page_stack.pop_back();
} else {
page_stack.emplace_back(page(), addr());
page_stack.emplace_back(page_, addr_);
page_jump(target_page, 2);
}
}
[[noreturn]] void Scenario::unknown_command(uint8_t cmd) {
if (cmd >= 0x20 && cmd < 0x7f) {
sys_error("Unknown Command: '%c' at %d:0x%d", cmd, page_, cmd_start_addr);
} else {
sys_error("Unknown Command: %02x at %d:0x%d", cmd, page_, cmd_start_addr);
}
}
+4
View File
@@ -54,11 +54,15 @@ public:
void page_stack_pop() { page_stack.pop_back(); }
void page_stack_clear() { page_stack.clear(); }
void mark_cmd_start() { cmd_start_addr = addr_; }
[[noreturn]] void unknown_command(uint8_t cmd);
private:
Dri adisk;
std::vector<uint8_t> data_;
int page_;
int addr_;
int cmd_start_addr;
std::vector<int> label_stack;
std::vector<std::pair<int, int>> page_stack;
};