X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=src%2Fexec.c;h=887d9feace03d90c142e7921216683ecca68782a;hp=e9426027b515c4705f214b1f6c0f4ee0fdae727c;hb=e30fe2ecea035a6b9dbcd879f975b1ade3ff8eb8;hpb=fd77389ef0a4c9c31228b5f71e9073a11ada9853 diff --git a/src/exec.c b/src/exec.c index e942602..887d9fe 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" }, }; /** @@ -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++]; /* 指標アドレスを加算 */