X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fexec.c;h=4da91b7dd8c5849930ab9b2ed408eed4addd58ae;hb=b7b124bade56862ddc6e61bae0a16051f46c7f36;hp=e9426027b515c4705f214b1f6c0f4ee0fdae727c;hpb=fd77389ef0a4c9c31228b5f71e9073a11ada9853;p=YACASL2.git diff --git a/src/exec.c b/src/exec.c index e942602..4da91b7 100644 --- a/src/exec.c +++ b/src/exec.c @@ -16,6 +16,7 @@ static CERR cerr_exec[] = { { 205, "Stack Pointer (SP) - cannot allocate stack buffer" }, { 206, "Address - out of COMET II memory" }, { 207, "Stack Pointer (SP) - out of COMET II memory" }, + { 209, "not GR in operand x" }, }; /** @@ -44,9 +45,9 @@ bool loadassemble(char *file) perror(file); return false; } - prog->end = prog->start + - fread(sys->memory, sizeof(WORD), sys->memsize - prog->start, fp); - if(prog->end == sys->memsize) { + execptr->end = execptr->start + + fread(sys->memory, sizeof(WORD), sys->memsize - execptr->start, fp); + if(execptr->end == sys->memsize) { setcerr(201, file); /* Loading - full of COMET II memory */ fprintf(stderr, "Load error - %d: %s\n", cerr->num, cerr->msg); status = false; @@ -347,7 +348,7 @@ bool exec() /* フラグレジスタの初期値設定 */ sys->cpu->fr = 0x0; sys->cpu->sp = sys->memsize; - sys->cpu->pr = prog->start; + sys->cpu->pr = execptr->start; /* 機械語の実行 */ for (; ; ) { clock_begin = clock(); @@ -357,7 +358,7 @@ bool exec() setcerr(204, errpr); /* Program Register (PR) - out of COMET II memory */ } /* スタック領域を確保できない場合はエラー */ - else if(sys->cpu->sp <= prog->end) { + else if(sys->cpu->sp <= execptr->end) { sprintf(errpr, "PR:#%04X", sys->cpu->pr); setcerr(205, errpr); /* Stack Pointer (SP) - cannot allocate stack buffer */ } @@ -393,11 +394,21 @@ bool exec() sys->cpu->pr++; /* オペランドの取り出し */ if(cmdtype == R1_R2) { - assert(x_r2 < GRSIZE); + /* オペランドの数値が汎用レジスタの範囲外の場合はエラー */ + if(x_r2 > GRSIZE - 1) { + sprintf(errpr, "PR:#%04X", sys->cpu->pr-1); + setcerr(209, errpr); /* not GR in operand x */ + goto execerr; + } val = sys->cpu->gr[x_r2]; } else if(cmdtype == R_ADR_X || cmdtype == R_ADR_X_ || cmdtype == ADR_X) { - assert(x_r2 < GRSIZE); + /* オペランドの数値が汎用レジスタの範囲外の場合はエラー */ + if(x_r2 > GRSIZE - 1) { + sprintf(errpr, "PR:#%04X", sys->cpu->pr-1); + setcerr(209, errpr); /* not GR in operand x */ + goto execerr; + } /* 実効アドレス(値または値が示す番地)を取得 */ val = sys->memory[sys->cpu->pr++]; /* 指標アドレスを加算 */ @@ -501,20 +512,20 @@ bool exec() } break; case 0x7000: /* PUSH */ - assert(sys->cpu->sp > prog->end && sys->cpu->sp <= sys->memsize); + assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize); sys->memory[--(sys->cpu->sp)] = val; break; case 0x7100: /* POP */ - assert(sys->cpu->sp > prog->end && sys->cpu->sp <= sys->memsize); + assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize); sys->cpu->gr[r_r1] = sys->memory[(sys->cpu->sp)++]; break; case 0x8000: /* CALL */ - assert(sys->cpu->sp > prog->end && sys->cpu->sp <= sys->memsize); + assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize); sys->memory[--(sys->cpu->sp)] = sys->cpu->pr; sys->cpu->pr = val; break; case 0x8100: /* RET */ - assert(sys->cpu->sp > prog->end && sys->cpu->sp <= sys->memsize); + assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize); if(sys->cpu->sp == sys->memsize) { return true; } else {