X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=src%2Fexec.c;h=5dc4eb101ae845ce927e08fab6e2ca3320fc8db6;hp=68717d80815e52b816e280f34616e6bbd6af1e86;hb=4aaa5bc19f9fe9f0bb22d2854e91d0b9f78d8708;hpb=f925850726e8cd1e429abe88fc5d96bdc74b987a diff --git a/src/exec.c b/src/exec.c index 68717d8..5dc4eb1 100644 --- a/src/exec.c +++ b/src/exec.c @@ -150,7 +150,7 @@ static void setfr(WORD val) /** * NOP命令 */ -void nop(const WORD r, const WORD v) +void nop(const WORD r, const WORD adr) { } @@ -158,38 +158,38 @@ void nop(const WORD r, const WORD v) /** * LD命令 */ -void ld(const WORD r, const WORD v) +void ld(const WORD r, const WORD adr) { - setfr(sys->cpu->gr[r] = v); + setfr(sys->cpu->gr[r] = adr); } /** * ST命令 */ -void st(const WORD r, const WORD v) +void st(const WORD r, const WORD adr) { - sys->memory[v] = sys->cpu->gr[r]; + sys->memory[adr] = sys->cpu->gr[r]; } /** * LAD命令 */ -void lad(const WORD r, const WORD v) +void lad(const WORD r, const WORD adr) { - sys->cpu->gr[r] = v; + sys->cpu->gr[r] = adr; } /** * ADDA命令 */ -void adda(const WORD r, const WORD v) +void adda(const WORD r, const WORD adr) { long tmp; sys->cpu->fr = 0x0; /* 引数の値を16ビット符号付整数として加算し、オーバーフローをチェック */ assert(sizeof(short) * 8 == 16 && (short)0xFFFF == -1); - if((tmp = (short)(sys->cpu->gr[r]) + (short)v) > 32767 || tmp < -32768) { + if((tmp = (short)(sys->cpu->gr[r]) + (short)adr) > 32767 || tmp < -32768) { sys->cpu->fr += OF; } /* 加算した結果を、WORD値に戻す */ @@ -204,20 +204,20 @@ void adda(const WORD r, const WORD v) /** * SUBA命令 */ -void suba(const WORD r, const WORD v) +void suba(const WORD r, const WORD adr) { - adda(r, (~v + 1)); + adda(r, (~adr + 1)); } /** * ADDL命令 */ -void addl(const WORD r, const WORD v) +void addl(const WORD r, const WORD adr) { long tmp; sys->cpu->fr = 0x0; - if((tmp = sys->cpu->gr[r] + v) < 0 || tmp > 65535) { + if((tmp = sys->cpu->gr[r] + adr) < 0 || tmp > 65535) { sys->cpu->fr += OF; } if(((sys->cpu->gr[r] = (WORD)(tmp & 0xFFFF)) & 0x8000) == 0x8000) { @@ -230,44 +230,44 @@ void addl(const WORD r, const WORD v) /** * SUBL命令 */ -void subl(const WORD r, const WORD v) +void subl(const WORD r, const WORD adr) { - addl(r, (~v + 1)); + addl(r, (~adr + 1)); } /** * AND命令 */ -void and(const WORD r, const WORD v) +void and(const WORD r, const WORD adr) { - setfr(sys->cpu->gr[r] &= v); + setfr(sys->cpu->gr[r] &= adr); } /** * OR命令 */ -void or(const WORD r, const WORD v) +void or(const WORD r, const WORD adr) { - setfr(sys->cpu->gr[r] |= v); + setfr(sys->cpu->gr[r] |= adr); } /** * XOR命令 */ -void xor(const WORD r, const WORD v) +void xor(const WORD r, const WORD adr) { - setfr(sys->cpu->gr[r] ^= v); + setfr(sys->cpu->gr[r] ^= adr); } /** * CPA命令 */ -void cpa(const WORD r, const WORD v) +void cpa(const WORD r, const WORD adr) { sys->cpu->fr = 0x0; - if((short)sys->cpu->gr[r] < (short)v) { + if((short)sys->cpu->gr[r] < (short)adr) { sys->cpu->fr = SF; - } else if(sys->cpu->gr[r] == v) { + } else if(sys->cpu->gr[r] == adr) { sys->cpu->fr = ZF; } } @@ -275,12 +275,12 @@ void cpa(const WORD r, const WORD v) /** * CPL命令 */ -void cpl(const WORD r, const WORD v) +void cpl(const WORD r, const WORD adr) { sys->cpu->fr = 0x0; - if(sys->cpu->gr[r] < v) { + if(sys->cpu->gr[r] < adr) { sys->cpu->fr = SF; - } else if(sys->cpu->gr[r] == v) { + } else if(sys->cpu->gr[r] == adr) { sys->cpu->fr = ZF; } } @@ -289,7 +289,7 @@ void cpl(const WORD r, const WORD v) /** * SLA命令。算術演算なので、第15ビットは送り出されない */ -void sla(const WORD r, const WORD v) +void sla(const WORD r, const WORD adr) { WORD sign, last = 0x0; int i; @@ -297,7 +297,7 @@ void sla(const WORD r, const WORD v) sys->cpu->fr = 0x0; sign = sys->cpu->gr[r] & 0x8000; sys->cpu->gr[r] &= 0x7FFF; - for(i = 0; i < v; i++) { + for(i = 0; i < adr; i++) { last = sys->cpu->gr[r] & 0x4000; sys->cpu->gr[r] <<= 1; } @@ -321,7 +321,7 @@ void sla(const WORD r, const WORD v) * 算術演算なので、第15ビットは送り出されない * 空いたビット位置には符号と同じものが入る */ -void sra(const WORD r, const WORD v) +void sra(const WORD r, const WORD adr) { WORD sign, last = 0x0; int i; @@ -329,7 +329,7 @@ void sra(const WORD r, const WORD v) sys->cpu->fr = 0x0; sign = sys->cpu->gr[r] & 0x8000; sys->cpu->gr[r] &= 0x7FFF; - for(i = 0; i < v; i++) { + for(i = 0; i < adr; i++) { last = sys->cpu->gr[r] & 0x1; sys->cpu->gr[r] >>= 1; if(sign > 0) { @@ -354,13 +354,13 @@ void sra(const WORD r, const WORD v) /** * SLL命令 */ -void sll(const WORD r, const WORD v) +void sll(const WORD r, const WORD adr) { WORD last = 0x0; int i; sys->cpu->fr = 0x0; - for(i = 0; i < v; i++) { + for(i = 0; i < adr; i++) { last = sys->cpu->gr[r] & 0x8000; sys->cpu->gr[r] <<= 1; } @@ -381,13 +381,13 @@ void sll(const WORD r, const WORD v) /** * SRL命令 */ -void srl(const WORD r, const WORD v) +void srl(const WORD r, const WORD adr) { WORD last = 0x0; int i; sys->cpu->fr = 0x0; - for(i = 0; i < v; i++) { + for(i = 0; i < adr; i++) { last = sys->cpu->gr[r] & 0x0001; sys->cpu->gr[r] >>= 1; } @@ -408,74 +408,74 @@ void srl(const WORD r, const WORD v) /** * JMI命令 */ -void jmi(const WORD r, const WORD v) +void jmi(const WORD r, const WORD adr) { if((sys->cpu->fr & SF) > 0) { - sys->cpu->pr = v; + sys->cpu->pr = adr; } } /** * JNZ命令 */ -void jnz(const WORD r, const WORD v) +void jnz(const WORD r, const WORD adr) { if((sys->cpu->fr & ZF) == 0) { - sys->cpu->pr = v; + sys->cpu->pr = adr; } } /** * JZE命令 */ -void jze(const WORD r, const WORD v) +void jze(const WORD r, const WORD adr) { if((sys->cpu->fr & ZF) > 0) { - sys->cpu->pr = v; + sys->cpu->pr = adr; } } /** * JUMP命令 */ -void jump(const WORD r, const WORD v) +void jump(const WORD r, const WORD adr) { - sys->cpu->pr = v; + sys->cpu->pr = adr; } /** * JPL命令 */ -void jpl(const WORD r, const WORD v) +void jpl(const WORD r, const WORD adr) { if((sys->cpu->fr & (SF | ZF)) == 0) { - sys->cpu->pr = v; + sys->cpu->pr = adr; } } /** * JOV命令 */ -void jov(const WORD r, const WORD v) +void jov(const WORD r, const WORD adr) { if((sys->cpu->fr & OF) > 0) { - sys->cpu->pr = v; + sys->cpu->pr = adr; } } /** * PUSH命令 */ -void push(const WORD r, const WORD v) +void push(const WORD r, const WORD adr) { assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize); - sys->memory[--(sys->cpu->sp)] = v; + sys->memory[--(sys->cpu->sp)] = adr; } /** * POP命令 */ -void pop(const WORD r, const WORD v) +void pop(const WORD r, const WORD adr) { assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize); sys->cpu->gr[r] = sys->memory[(sys->cpu->sp)++]; @@ -484,17 +484,17 @@ void pop(const WORD r, const WORD v) /** * CALL命令 */ -void call(const WORD r, const WORD v) +void call(const WORD r, const WORD adr) { assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize); sys->memory[--(sys->cpu->sp)] = sys->cpu->pr; - sys->cpu->pr = v; + sys->cpu->pr = adr; } /** * RET命令 */ -void ret(const WORD r, const WORD v) +void ret(const WORD r, const WORD adr) { assert(sys->cpu->sp <= sys->memsize); if(sys->cpu->sp == sys->memsize) { @@ -507,9 +507,9 @@ void ret(const WORD r, const WORD v) /** * SVC命令 */ -void svc(const WORD r, const WORD v) +void svc(const WORD r, const WORD adr) { - switch(v) + switch(adr) { case 0x0: execptr->stop = true; @@ -529,7 +529,7 @@ void svc(const WORD r, const WORD v) bool exec() { WORD op, r_r1, x_r2, val; - CMDTYPE cmdtype; + CMD *cmd; void (*cmdptr)(); clock_t clock_begin, clock_end; @@ -545,49 +545,45 @@ bool exec() /* 機械語の実行 */ for (sys->cpu->pr = execptr->start; ; ) { clock_begin = clock(); - /* プログラムレジスタのアドレスが主記憶の範囲外の場合はエラー終了 */ - if(sys->cpu->pr >= sys->memsize) { - setcerr(204, pr2str(sys->cpu->pr)); /* Program Register (PR) - out of COMET II memory */ - goto execerr; - } - /* スタック領域を確保できない場合はエラー終了 */ - else if(sys->cpu->sp <= execptr->end) { - setcerr(205, pr2str(sys->cpu->pr)); /* Stack Pointer (SP) - cannot allocate stack buffer */ - goto execerr; + /* traceまたはdumpオプション指定時、改行を出力 */ + if(execmode.dump || execmode.trace) { + /* traceオプション指定時、レジスタを出力 */ + if(execmode.trace){ + fprintf(stdout, "#%04X: Register::::\n", sys->cpu->pr); + dspregister(); + } + /* dumpオプション指定時、メモリを出力 */ + if(execmode.dump){ + fprintf(stdout, "#%04X: Memory::::\n", sys->cpu->pr); + dumpmemory(); + } + fprintf(stdout, "\n"); } - /* スタック領域のアドレスが主記憶の範囲外の場合はエラー終了 */ - else if(sys->cpu->sp > sys->memsize) { - setcerr(207, pr2str(sys->cpu->pr)); /* Stack Pointer (SP) - out of COMET II memory */ + /* プログラムレジスタとスタックポインタをチェック */ + if(sys->cpu->pr >= sys->memsize || sys->cpu->sp <= execptr->end || sys->cpu->sp > sys->memsize) { + if(sys->cpu->pr >= sys->memsize) { + setcerr(204, pr2str(sys->cpu->pr)); /* Program Register (PR) - out of COMET II memory */ + } else if(sys->cpu->sp <= execptr->end) { + setcerr(205, pr2str(sys->cpu->pr)); /* Stack Pointer (SP) - cannot allocate stack buffer */ + } else if(sys->cpu->sp > sys->memsize) { + setcerr(207, pr2str(sys->cpu->pr)); /* Stack Pointer (SP) - out of COMET II memory */ + } goto execerr; } /* 命令の取り出し */ op = sys->memory[sys->cpu->pr] & 0xFF00; /* 命令の解読 */ /* 命令がCOMET II命令ではない場合はエラー終了 */ - if((cmdtype = getcmdtype(op)) == NOTCMD) { + if((cmd = getcmd(op)) == NULL) { setcerr(210, pr2str(sys->cpu->pr)); /* not command code of COMET II */ goto execerr; } - cmdptr = getcmdptr(op); + cmdptr = cmd->ptr; r_r1 = (sys->memory[sys->cpu->pr] >> 4) & 0xF; x_r2 = sys->memory[sys->cpu->pr] & 0xF; - /* traceオプション指定時、レジスタを出力 */ - if(execmode.trace){ - fprintf(stdout, "#%04X: Register::::\n", sys->cpu->pr); - dspregister(); - } - /* dumpオプション指定時、メモリを出力 */ - if(execmode.dump){ - fprintf(stdout, "#%04X: Memory::::\n", sys->cpu->pr); - dumpmemory(); - } - /* traceまたはdumpオプション指定時、改行を出力 */ - if(execmode.dump || execmode.trace) { - fprintf(stdout, "\n"); - } sys->cpu->pr++; /* オペランドの取り出し */ - if(cmdtype == R1_R2) { + if(cmd->type == R1_R2) { /* オペランドの数値が汎用レジスタの範囲外の場合はエラー */ if(x_r2 > GRSIZE - 1) { setcerr(209, pr2str(sys->cpu->pr-1)); /* not GR in operand x */ @@ -595,7 +591,7 @@ bool exec() } val = sys->cpu->gr[x_r2]; } - else if(cmdtype == R_ADR_X || cmdtype == R_ADR_X_ || cmdtype == ADR_X) { + else if(cmd->type == R_ADR_X || cmd->type == R_ADR_X_ || cmd->type == ADR_X) { /* オペランドの数値が汎用レジスタの範囲外の場合はエラー */ if(x_r2 > GRSIZE - 1) { setcerr(209, pr2str(sys->cpu->pr-1)); /* not GR in operand x */ @@ -608,7 +604,7 @@ bool exec() val += sys->cpu->gr[x_r2]; } /* ロード/算術論理演算命令/比較演算命令では、アドレスに格納されている内容を取得 */ - if(cmdtype == R_ADR_X_) { + if(cmd->type == R_ADR_X_) { if(val >= sys->memsize) { setcerr(206, pr2str(sys->cpu->pr-1)); /* Address - out of COMET II memory */ goto execerr;