X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=src%2Fexec.c;h=2cd6d8ae2dd0ebbe87ab47bdf474c3cea480eed6;hp=17ac66bc13d4518c8ba2421cd9124cb1965ae717;hb=b0f981469cdea23225ca5c3ef0ca6759d6a92b43;hpb=2b0ff8e75f11c5fb58e16e95d8195d6f1252c97c diff --git a/src/exec.c b/src/exec.c index 17ac66b..2cd6d8a 100644 --- a/src/exec.c +++ b/src/exec.c @@ -1,6 +1,21 @@ #include "casl2.h" #include "exec.h" +/* 実行のエラー定義 */ +CERRARRAY cerr_exec[] = { + { 202, "SVC input - out of Input memory" }, + { 203, "SVC output - out of COMET II memory" }, + { 204, "Program Register (PR) - out of COMET II memory" }, + { 205, "Stack Pointer (SP) - cannot allocate stack buffer" }, + { 206, "Address - out of COMET II memory" }, + { 207, "Stack Pointer (SP) - out of COMET II memory" }, +}; + +bool addcerrlist_exec() +{ + return addcerrlist(ARRAYSIZE(cerr_exec), cerr_exec); +} + /* 実行モード: trace, logical, dump */ EXECMODE execmode = {false, false, false}; @@ -250,20 +265,6 @@ WORD srl(WORD val0, WORD val1) return res; } -/* COMET II仮想マシンのリセット */ -void reset() -{ - int i; - for(i = 0; i < REGSIZE; i++) { - GR[i] = 0x0; - } - SP = PR = FR = 0x0; - memory = malloc(memsize); - for(i = 0; i < memsize; i++) { - memory[i] = 0x0; - } -} - /* 仮想マシンCOMET IIでの実行 */ void exec() { @@ -272,6 +273,7 @@ void exec() char *errpr = malloc(CERRSTRSIZE + 1); clock_t clock_begin, clock_end; + addcerrlist_exec(); if(execmode.trace) { fprintf(stdout, "\nExecuting machine codes\n"); } @@ -310,14 +312,17 @@ void exec() if(cerrno > 0) { goto execerr; } + /* traceオプション指定時、レジスタを出力 */ if(execmode.trace){ fprintf(stdout, "#%04X: Register::::\n", PR); dspregister(); } + /* dumpオプション指定時、メモリを出力 */ if(execmode.dump){ fprintf(stdout, "#%04X: Memory::::\n", PR); dumpmemory(); } + /* どちらかのオプション指定時、改行を出力 */ if(execmode.dump || execmode.trace) { fprintf(stdout, "\n"); } @@ -328,6 +333,7 @@ void exec() val = GR[x_r2]; } else if(cmdtype == R_ADR_X || cmdtype == R_ADR_X_ || cmdtype == ADR_X) { + assert(x_r2 < REGSIZE); /* 実効アドレス(値または値が示す番地)を取得 */ val = memory[PR++]; /* 指標アドレスを加算 */ @@ -351,7 +357,7 @@ void exec() /* 命令の実行 */ switch(op) { - case 0x0: /* NOP */ + case 0x0: /* NOP */ break; case 0x1000: /* LD */ setfr(GR[r_r1] = val); @@ -362,87 +368,87 @@ void exec() case 0x1200: /* LAD */ GR[r_r1] = val; break; - case 0x2000: /* ADDA */ + case 0x2000: /* ADDA */ GR[r_r1] = adda(GR[r_r1], val); break; - case 0x2100: /* SUBA */ + case 0x2100: /* SUBA */ GR[r_r1] = suba(GR[r_r1], val); break; - case 0x2200: /* ADDL */ + case 0x2200: /* ADDL */ GR[r_r1] = addl(GR[r_r1], val); break; - case 0x2300: /* SUBL */ + case 0x2300: /* SUBL */ GR[r_r1] = subl(GR[r_r1], val); break; - case 0x3000: /* AND */ + case 0x3000: /* AND */ setfr(GR[r_r1] &= val); break; - case 0x3100: /* OR */ + case 0x3100: /* OR */ setfr(GR[r_r1] |= val); break; - case 0x3200: /* XOR */ + case 0x3200: /* XOR */ setfr(GR[r_r1] ^= val); break; - case 0x4000: /* CPA */ + case 0x4000: /* CPA */ cpa(GR[r_r1], val); break; - case 0x4100: /* CPL */ + case 0x4100: /* CPL */ cpl(GR[r_r1], val); break; - case 0x5000: /* SLA */ + case 0x5000: /* SLA */ GR[r_r1] = sla(GR[r_r1], val); break; - case 0x5100: /* SRA */ + case 0x5100: /* SRA */ GR[r_r1] = sra(GR[r_r1], val); break; - case 0x5200: /* SLL */ + case 0x5200: /* SLL */ GR[r_r1] = sll(GR[r_r1], val); break; - case 0x5300: /* SRL */ + case 0x5300: /* SRL */ GR[r_r1] = srl(GR[r_r1], val); break; - case 0x6100: /* JMI */ + case 0x6100: /* JMI */ if((FR & SF) > 0) { PR = val; } break; - case 0x6200: /* JNZ */ + case 0x6200: /* JNZ */ if((FR & ZF) == 0) { PR = val; } break; - case 0x6300: /* JZE */ + case 0x6300: /* JZE */ if((FR & ZF) > 0) { PR = val; } break; - case 0x6400: /* JUMP */ + case 0x6400: /* JUMP */ PR = val; break; - case 0x6500: /* JPL */ + case 0x6500: /* JPL */ if((FR & (SF | ZF)) == 0) { PR = val; } break; - case 0x6600: /* JOV */ + case 0x6600: /* JOV */ if((FR & OF) > 0) { PR = val; } break; - case 0x7000: /* PUSH */ + case 0x7000: /* PUSH */ assert(SP > endptr && SP <= memsize); memory[--SP] = val; break; - case 0x7100: /* POP */ + case 0x7100: /* POP */ assert(SP > endptr && SP <= memsize); GR[r_r1] = memory[SP++]; break; - case 0x8000: /* CALL */ + case 0x8000: /* CALL */ assert(SP > endptr && SP <= memsize); memory[--SP] = PR; PR = val; break; - case 0x8100: /* RET */ + case 0x8100: /* RET */ assert(SP > endptr && SP <= memsize); if(SP == memsize) { return; @@ -450,7 +456,7 @@ void exec() PR = memory[SP++]; break; } - case 0xf000: /* SVC */ + case 0xF000: /* SVC */ switch(val) { case 0x0: /* EXIT */