X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=src%2Fexec.c;h=4b3ed782d90334989d82f58cf2972846d6e0dc9c;hp=d811c92611f94437274fdd8ce46120f7a40d2038;hb=faec695d5b7ecf7dd3e4a07ac926ea93ca89020b;hpb=1e636c95bf237645b6c9117e3eb64aa2d8aa4c90 diff --git a/src/exec.c b/src/exec.c index d811c92..4b3ed78 100644 --- a/src/exec.c +++ b/src/exec.c @@ -17,7 +17,7 @@ void svcin() --i; break; } - if(GR[1] + i >= MEMSIZE - 1) { + if(GR[1] + i >= memsize - 1) { setcerr(202, NULL); /* SVC input - out of Input memory */ break; } @@ -33,7 +33,7 @@ void svcout() char c; for(i = 0; i < GR[2]; i++) { - if(GR[1] + i >= MEMSIZE - 1) { + if(GR[1] + i >= memsize - 1) { setcerr(203, NULL); /* SVC output - out of Comet II memory */ return; } @@ -42,7 +42,8 @@ void svcout() } /* 「文字の組」の符号表に記載された文字と、改行(CR)/タブを表示 それ以外の文字は、「.」で表す */ - if(((c = (char)(memory[GR[1]+i])) >= 0x20 && c <= 0x7E) || c == 0xA || c == '\t') { + if(((c = (char)(memory[GR[1]+i])) >= 0x20 && c <= 0x7E) || c == 0xA || c == '\t') + { putchar(c); } else { putchar('.'); @@ -255,7 +256,8 @@ void reset() GR[i] = 0x0; } SP = PR = FR = 0x0; - for(i = 0; i < MEMSIZE; i++) { + memory = malloc(memsize); + for(i = 0; i < memsize; i++) { memory[i] = 0x0; } } @@ -266,23 +268,31 @@ void exec() WORD op, r_r1, x_r2, val; CMDTYPE cmdtype; char *errpr = malloc(8); + clock_t clock_begin, clock_end; + if(tracemode) { fprintf(stdout, "\nExecuting machine codes\n"); } /* フラグレジスタの初期値設定 */ FR = 0x0; - SP = MEMSIZE; + SP = memsize; PR = startptr; if(create_code_type() == false) { goto execerr; } /* 機械語の実行 */ for (; ; ) { + clock_begin = clock(); /* プログラムレジスタのアドレスが主記憶の範囲外の場合はエラー */ - if(PR >= MEMSIZE) { + if(PR >= memsize) { sprintf(errpr, "PR:#%04X", PR); setcerr(204, errpr); /* Program Register (PR) - out of COMET II memory */ } + /* スタック領域のアドレスが主記憶の範囲外の場合はエラー */ + if(SP > memsize) { + sprintf(errpr, "PR:#%04X", PR); + setcerr(207, errpr); /* Stack Pointer (SP) - out of COMET II memory */ + } /* スタック領域を確保できない場合はエラー */ if(SP <= endptr) { sprintf(errpr, "PR:#%04X", PR); @@ -322,7 +332,7 @@ void exec() } /* ロード/算術論理演算命令/比較演算命令では、アドレスに格納されている内容を取得 */ if(cmdtype == R_ADR_X_) { - if(val >= MEMSIZE) { + if(val >= memsize) { sprintf(errpr, "PR:#%04X", PR-1); setcerr(206, errpr); /* Address - out of COMET II memory */ goto execerr; @@ -416,18 +426,21 @@ void exec() } break; case 0x7000: /* PUSH */ + assert(SP > endptr && SP <= memsize); memory[--SP] = val; break; case 0x7100: /* POP */ + assert(SP > endptr && SP <= memsize); GR[r_r1] = memory[SP++]; break; case 0x8000: /* CALL */ + assert(SP > endptr && SP <= memsize); memory[--SP] = PR; PR = val; break; case 0x8100: /* RET */ - assert(SP > endptr && SP <= MEMSIZE); - if(SP == MEMSIZE) { + assert(SP > endptr && SP <= memsize); + if(SP == memsize) { return; } else { PR = memory[SP++]; @@ -448,6 +461,10 @@ void exec() default: break; } + do { + clock_end = clock(); + } while(clock_end - clock_begin < CLOCKS_PER_SEC / clocks); +/* printf("PR:%04X; time: %f\n", PR, (double)((clock_end - clock_begin) * CLOCKS_PER_SEC)); */ } execerr: fprintf(stderr, "Execute error - %d: %s\n", cerrno, cerrmsg);