diff --git a/emul_inst_decipher.c b/emul_inst_decipher.c index a4538a1..bf03de5 100644 --- a/emul_inst_decipher.c +++ b/emul_inst_decipher.c @@ -125,9 +125,10 @@ emul_reg_set(Spc, pc+1); } -void emul_inst_dec_reset_pc() { - emul_inst_dec_set_pc(0); - emul_reg_set(Spc, 0); +void emul_inst_dec_reset_pc(int pc) { + emul_out_std_debug("Resetting PC = %d\n", pc); + emul_inst_dec_set_pc(pc); + emul_reg_set(Spc, pc); } /* ファイルからデータをロードする,ファイルは自動的にクローズされる @@ -146,6 +147,7 @@ emul_out_std_debug("Now loading file %s...\n", filename); line = 0; + emul_out_std_debug("program_line_current+line=%d\n", program_line_current+line); while ( fgets(program[program_line_current+line], LOAD_LINE_WIDTH_MAX, fp) != NULL ) { emul_out_std_debug("Now loading file line %d\n", line); emul_out_std_debug("[%d]>>%s\n", program_line_current+line, program[program_line_current+line]); @@ -197,15 +199,17 @@ // 読み込みを開始する先頭がヌルなら新しい行を読み込む if ( *current == '\0' ) { // 読み込める行がない場合終了 - if ( !(program_line_current < program_line_max) ) return 0; + if ( !(program_line_current < program_line_max) ) { return 0; } // 次の行を読み込むためPCを更新 emul_inst_dec_update_pc(); // 次の行を読み込むためcurrentのポインタをリセット current = line; // currentにセット strcpy(current, program[program_line_current]); - emul_out_std_debug("get_token: program_line_current %d\n", program_line_current); - emul_out_std_debug("get_token: program_line_current \"%s\"\n", program[program_line_current]); + emul_out_std_debug("get_token: program_line_current %d\n" + , program_line_current); + emul_out_std_debug("get_token: program[%d] \"%s\"\n" + , program[program_line_current]); emul_out_std_debug("get_token: current = \"%s\"\n", current); // 読み込みを行った場合はシフトフラグをセット fShift = 1; diff --git a/emul_inst_exec.c b/emul_inst_exec.c index ea75932..372362b 100644 --- a/emul_inst_exec.c +++ b/emul_inst_exec.c @@ -21,14 +21,19 @@ exitcode_t emul_inst_exec_pseudo(char token[LOAD_TOKEN_MAX]); // load label void emul_inst_exec_load_label() { + static int start_pc = -1; char token[LOAD_TOKEN_MAX]; int ps_id; + // 開始地点を記憶 + if (start_pc == -1) start_pc = emul_reg_get(Spc); // トークンを取得 if ( emul_inst_dec_get_token(token) == 0 ) { emul_out_std_err("Non exist next token\n"); emul_out_std_err("Loading Label Finish!\n"); - // 次のトークンが見つからない場合終了, pcのアドレスを初期化 - emul_inst_dec_reset_pc(); + // 次のトークンが見つからない場合終了, pcのアドレスを読み込み開始時点の状態に戻す + // bug + emul_inst_dec_reset_pc(start_pc); + start_pc = -1; return ; } emul_out_std_debug("[label] load token: %s\n", token); @@ -53,8 +58,12 @@ } int emul_inst_exec_load(char *filename) { + int current_pc = emul_reg_get(Spc); + // プログラムカウンタを更新する + emul_inst_dec_update_pc(); // ロードできないなら終了 if ( emul_inst_dec_load(filename) == 0 ) return 0; + emul_inst_dec_reset_pc(current_pc); // できたらラベルも読み込み emul_inst_exec_load_label(); return 1; @@ -287,6 +296,8 @@ emul_out_std("\n"); } +/* :EXEC +* ファイルからプログラムを読み込み実行する */ void emul_inst_exec_pseudo_exec(char *filename) { emul_inst_exec_load(filename); } diff --git a/emul_repl.c b/emul_repl.c index bcf0435..b43696b 100644 --- a/emul_repl.c +++ b/emul_repl.c @@ -146,6 +146,9 @@ int index = 0; int history = 0; + // 何はともあれヌル代入 + input[0] = '\0'; + getyx(win, y, x); getmaxyx(win, temp_y, temp_x); scrollok(win, TRUE); diff --git a/sample/label.asm b/sample/label.asm new file mode 100644 index 0000000..78fc781 --- /dev/null +++ b/sample/label.asm @@ -0,0 +1,10 @@ +#LABEL LOOP +addi $s0 $zero 10 +addi $s1 $s1 1 +slt $t0 $s1 $s0 +beq $t0 $zero EXIT + +#REGCAT $s1 +j LOOP + +#LABEL EXIT