X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=src%2Fexec.c;h=c91fc8637ce0000a04777844dc3787c15bbfa147;hp=aa99076b72168519d513664d9768d4af4c780793;hb=019b584feedf0402e473fba3e0e7752db78e616a;hpb=d30262d3338bf9ad2f9a965a546834927a7238de diff --git a/src/exec.c b/src/exec.c index aa99076..c91fc86 100644 --- a/src/exec.c +++ b/src/exec.c @@ -158,8 +158,11 @@ void setfr(WORD adr) WORD get_r_r1(WORD oprx) { WORD r; + char *s; + if((r = ((oprx & 0x00F0) >>4)) > GRSIZE - 1) { - setcerr(205, pr2str(sys->cpu->pr)); /* r/r1 in word #1 - not GR */ + setcerr(205, s = pr2str(sys->cpu->pr)); /* r/r1 in word #1 - not GR */ + FREE(s); return 0x0; } return r; @@ -171,8 +174,11 @@ WORD get_r_r1(WORD oprx) WORD get_x_r2(WORD oprx) { WORD x; + char *s; + if((x = (oprx & 0x000F)) > GRSIZE - 1) { - setcerr(206, pr2str(sys->cpu->pr)); /* r/r1 in word #1 - not GR */ + setcerr(206, s = pr2str(sys->cpu->pr)); /* r/r1 in word #1 - not GR */ + FREE(s); return 0x0; } return x; @@ -197,8 +203,11 @@ WORD get_adr_x(WORD adr, WORD oprx) WORD get_val_adr_x(WORD adr, WORD oprx) { WORD a; + char *s; + if((a = get_adr_x(adr, oprx)) >= sys->memsize) { - setcerr(207, pr2str(sys->cpu->pr + 1)); /* address in word #2 - out of memory */ + setcerr(207, s = pr2str(sys->cpu->pr + 1)); /* address in word #2 - out of memory */ + FREE(s); return 0x0; } return sys->memory[a]; @@ -796,10 +805,11 @@ void jump() */ void push() { + assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize); WORD w[2]; + w[0] = sys->memory[sys->cpu->pr]; w[1] = sys->memory[sys->cpu->pr + 1]; - assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize); sys->memory[--(sys->cpu->sp)] = get_adr_x(w[1], w[0]); sys->cpu->pr += 2; } @@ -810,11 +820,18 @@ void push() */ void pop() { - assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize); - WORD w[1]; - w[0] = sys->memory[sys->cpu->pr]; - sys->cpu->gr[get_r_r1(w[0])] = sys->memory[(sys->cpu->sp)++]; - sys->cpu->pr += 1; + assert(sys->cpu->sp > execptr->end); + WORD w; + char *s; + + if(sys->cpu->sp >= sys->memsize) { + setcerr(203, s = pr2str(sys->cpu->pr)); /* Stack Pointer (SP) - stack underflow */ + FREE(s); + } else { + w = sys->memory[sys->cpu->pr]; + sys->cpu->gr[get_r_r1(w)] = sys->memory[(sys->cpu->sp)++]; + sys->cpu->pr += 1; + } } /** @@ -877,6 +894,7 @@ void exec() { clock_t clock_begin, clock_end; void (*cmdptr)(); + char *s; create_code_type(); /* 命令のコードとタイプがキーのハッシュ表を作成 */ if(execmode.trace == true) { @@ -896,21 +914,23 @@ void exec() } fprintf(stdout, "\n"); } - /* プログラムレジスタとスタックポインタをチェック */ - if(sys->cpu->pr >= sys->memsize || sys->cpu->sp > sys->memsize || sys->cpu->sp <= execptr->end) { - if(sys->cpu->pr >= sys->memsize) { - setcerr(201, pr2str(sys->cpu->pr)); /* Program Register (PR) - memory overflow */ - } else if(sys->cpu->sp <= execptr->end) { - setcerr(202, pr2str(sys->cpu->pr)); /* Stack Pointer (SP) - stack overflow */ - } else if(sys->cpu->sp > sys->memsize) { - setcerr(203, pr2str(sys->cpu->pr)); /* Stack Pointer (SP) - stack underflow */ - } + /* プログラムレジスタをチェック */ + if(sys->cpu->pr >= sys->memsize) { + setcerr(201, s = pr2str(sys->cpu->pr)); /* Program Register (PR) - memory overflow */ + FREE(s); + goto execfin; + } + /* スタックポインタをチェック */ + if(sys->cpu->sp <= execptr->end) { + setcerr(202, s = pr2str(sys->cpu->pr)); /* Stack Pointer (SP) - stack overflow */ + FREE(s); goto execfin; } /* コードから命令を取得 */ /* 取得できない場合はエラー終了 */ if((cmdptr = getcmdptr(sys->memory[sys->cpu->pr] & 0xFF00)) == NULL) { - setcerr(204, pr2str(sys->cpu->pr)); /* OP in word #1 - not command code */ + setcerr(204, s = pr2str(sys->cpu->pr)); /* OP in word #1 - not command code */ + FREE(s); goto execfin; } /* 命令の実行 */