diff --git a/src/sys/nact.cpp b/src/sys/nact.cpp index 70ea1e0..ee6fe56 100644 --- a/src/sys/nact.cpp +++ b/src/sys/nact.cpp @@ -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; } diff --git a/src/sys/nact.h b/src/sys/nact.h index d728561..a435de8 100644 --- a/src/sys/nact.h +++ b/src/sys/nact.h @@ -111,12 +111,8 @@ protected: // コマンドパーサ void execute(); - // シナリオデータ Scenario sco; - // アドレス、ページ管理 - int prev_addr; - // 変数 uint16 var[512]; uint16 var_stack[30][20]; diff --git a/src/sys/nact_sys1.cpp b/src/sys/nact_sys1.cpp index a47f5a2..b31e8e0 100644 --- a/src/sys/nact_sys1.cpp +++ b/src/sys/nact_sys1.cpp @@ -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() diff --git a/src/sys/nact_sys2.cpp b/src/sys/nact_sys2.cpp index 9d049f5..08e3c87 100644 --- a/src/sys/nact_sys2.cpp +++ b/src/sys/nact_sys2.cpp @@ -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); } } } diff --git a/src/sys/nact_sys3.cpp b/src/sys/nact_sys3.cpp index bbe796c..82045ef 100644 --- a/src/sys/nact_sys3.cpp +++ b/src/sys/nact_sys3.cpp @@ -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() diff --git a/src/sys/scenario.cpp b/src/sys/scenario.cpp index 4a0dd0c..40f1dfd 100644 --- a/src/sys/scenario.cpp +++ b/src/sys/scenario.cpp @@ -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); + } +} \ No newline at end of file diff --git a/src/sys/scenario.h b/src/sys/scenario.h index fa3db57..00e1339 100644 --- a/src/sys/scenario.h +++ b/src/sys/scenario.h @@ -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 data_; int page_; int addr_; + int cmd_start_addr; std::vector label_stack; std::vector> page_stack; };