X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=src%2Fexec.c;h=b9f987157f1991cb8979bed1ca5fe099331cfc19;hp=1862973f10fd2d94445828d544b18e6352565f09;hb=ccc3acda4256e10a822e41e84f6c9991271c2f61;hpb=0e3065564e83037d5fbbb3e0e1595e7ce95ce8eb diff --git a/src/exec.c b/src/exec.c index 1862973..b9f9871 100644 --- a/src/exec.c +++ b/src/exec.c @@ -40,10 +40,9 @@ void svcout() if(memory[GR[1]+i] == '\0') { break; } - /* 「文字の組」の符号表に記載された文字と、改行(CR)/タブを表示 - それ以外の文字は、「.」で表す */ - if(((c = (char)(memory[GR[1]+i])) >= 0x20 && c <= 0x7E) || c == 0xA || c == '\t') - { + /* 「文字の組」の符号表に記載された文字と、改行(CR)/タブを表示 */ + /* それ以外の文字は、「.」で表す */ + if(((c = (char)(memory[GR[1]+i])) >= 0x20 && c <= 0x7E) || c == 0xA || c == '\t') { putchar(c); } else { putchar('.'); @@ -72,12 +71,11 @@ WORD adda(WORD val0, WORD val1) long temp; FR = 0x0; - temp = (short)val0 + (short)val1; + temp = (signed short)val0 + (signed short)val1; if(temp > 32767 || temp < -32768) { FR += OF; } - res = (WORD)(temp & 0xFFFF); - if((res & 0x8000) > 0x0) { + if(((res = (WORD)(temp & 0xFFFF)) & 0x8000) == 0x8000) { FR += SF; } else if(res == 0x0) { FR += ZF; @@ -98,12 +96,10 @@ WORD addl(WORD val0, WORD val1) WORD res; FR = 0x0; - temp = val0 + val1; - if(temp < 0 || temp > 65535) { + if((temp = val0 + val1) < 0 || temp > 65535) { FR += OF; } - res = (WORD)(temp & 0xFFFF); - if((res & 0x8000) > 0x0) { + if(((res = (WORD)(temp & 0xFFFF)) & 0x8000) == 0x8000) { FR += SF; } else if(res == 0x0) { FR += ZF; @@ -139,8 +135,8 @@ void cpl(WORD val0, WORD val1) } } -/* 算術左シフト。フラグを設定して値を返す。 - 算術演算なので、第15ビットは送り出されない */ +/* 算術左シフト。フラグを設定して値を返す。 */ +/* 算術演算なので、第15ビットは送り出されない */ WORD sla(WORD val0, WORD val1) { FR = 0x0; @@ -171,7 +167,7 @@ WORD sra(WORD val0, WORD val1) res = (val0 & 0x7FFF) >> val1; /* 符号(第15ビット)が1の場合、符号と空いたビット位置に1を設定 COMET IIの仕様で、シフトの結果空いたビット位置には符号と同じものが入る */ - if((sign = val0 & 0x8000) > 0x0) { + if((sign = val0 & 0x8000) == 0x8000) { for(i = 0; i <= val1; i++) { res |= onbit; onbit >>= 1; @@ -224,7 +220,7 @@ WORD srl(WORD val0, WORD val1) FR += OF; } /* 第15ビットが1のとき、SFは1 */ - if((res & 0x8000) > 0x0) { + if((res & 0x8000) == 0x8000) { FR += SF; } /* 演算結果が0のとき、ZFは1 */ @@ -234,11 +230,11 @@ WORD srl(WORD val0, WORD val1) return res; } -/* 仮想マシンのリセット */ +/* COMET II仮想マシンのリセット */ void reset() { int i; - for(i = 0; i <= 7; i++) { + for(i = 0; i < REGSIZE; i++) { GR[i] = 0x0; } SP = PR = FR = 0x0; @@ -256,7 +252,7 @@ void exec() char *errpr = malloc(8); clock_t clock_begin, clock_end; - if(tracemode) { + if((&execmode)->tracemode) { fprintf(stdout, "\nExecuting machine codes\n"); } /* フラグレジスタの初期値設定 */ @@ -292,15 +288,15 @@ void exec() if(cerrno > 0) { goto execerr; } - if(tracemode){ + if((&execmode)->tracemode){ fprintf(stdout, "#%04X: Register::::\n", PR); dspregister(); } - if(dumpmode){ + if((&execmode)->dumpmode){ fprintf(stdout, "#%04X: Memory::::\n", PR); dumpmemory(); } - if(dumpmode || tracemode) { + if((&execmode)->dumpmode || (&execmode)->tracemode) { fprintf(stdout, "\n"); } PR++;