bool loadassemble(const char *file)
{
FILE *fp;
- bool status = true;
+ bool stat = true;
assert(file != NULL);
if((fp = fopen(file, "r")) == NULL) {
if(execptr->end == sys->memsize) {
setcerr(210, file); /* load - memory overflow */
fprintf(stderr, "Load error - %d: %s\n", cerr->num, cerr->msg);
- status = false;
+ stat = false;
}
fclose(fp);
- return status;
+ return stat;
}
/**
* プログラムレジスタ(PR)を表す文字列を返す
- **/
+ */
char *pr2str(WORD pr) {
char *str = malloc_chk(CERRSTRSIZE + 1, "pr2str.pr");
break;
}
if(sys->cpu->gr[1] + i > execptr->end) {
- setcerr(208, NULL); /* SVC input - memory overflow */
+ setcerr(208, ""); /* SVC input - memory overflow */
break;
}
sys->memory[sys->cpu->gr[1]+i] = *(buffer + i);
for(i = 0; i < sys->memory[sys->cpu->gr[2]]; i++) {
if(sys->cpu->gr[1] + i > execptr->end) {
- setcerr(209, NULL); /* SVC output - memory overflow */
+ setcerr(209, ""); /* SVC output - memory overflow */
return;
}
/* 「文字の組」の符号表に記載された文字と、改行(CR)/タブを表示 */
/**
* WORD値からr/r1を取得
*/
-WORD r_r1(WORD oprx)
+WORD get_r_r1(WORD oprx)
{
WORD r;
if((r = ((oprx & 0x00F0) >>4)) > GRSIZE - 1) {
/**
* WORD値からx/r2を取得
*/
-WORD x_r2(WORD oprx)
+WORD get_x_r2(WORD oprx)
{
WORD x;
if((x = (oprx & 0x000F)) > GRSIZE - 1) {
/**
* 2つのWORD値からadr[,x]を取得
*/
-WORD adrx(WORD adr, WORD oprx)
+WORD get_adr_x(WORD adr, WORD oprx)
{
WORD a = adr, x;
- if((x = x_r2(oprx)) > 0) {
+ if((x = get_x_r2(oprx)) > 0) {
a += sys->cpu->gr[x];
}
return a;
/**
* 2つのWORD値からadr[,x]のアドレスに格納されている内容を取得
*/
-WORD val_adrx(WORD adr, WORD oprx)
+WORD get_val_adr_x(WORD adr, WORD oprx)
{
WORD a;
- if((a = adrx(adr, oprx)) >= sys->memsize) {
+ if((a = get_adr_x(adr, oprx)) >= sys->memsize) {
setcerr(207, pr2str(sys->cpu->pr + 1)); /* address in word #2 - out of memory */
return 0x0;
}
/**
* NOP命令。語長1(OPのみ)
+ * \relates exec
*/
void nop()
{
/**
* LD命令 - オペランドr,adr,x。語長2
+ * \relates exec
*/
void ld_r_adr_x()
{
WORD w[2];
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
- setfr(sys->cpu->gr[r_r1(w[0])] = val_adrx(w[1], w[0]));
+ setfr(sys->cpu->gr[get_r_r1(w[0])] = get_val_adr_x(w[1], w[0]));
sys->cpu->pr += 2;
}
/**
* LD命令 - オペランドr1,r2。語長1
+ * \relates exec
*/
void ld_r1_r2()
{
WORD w[1];
w[0] = sys->memory[sys->cpu->pr];
- setfr(sys->cpu->gr[r_r1(w[0])] = sys->cpu->gr[x_r2(w[0])]);
+ setfr(sys->cpu->gr[get_r_r1(w[0])] = sys->cpu->gr[get_x_r2(w[0])]);
sys->cpu->pr += 1;
}
/**
* ST命令。語長2
+ * \relates exec
*/
void st()
{
WORD w[2];
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
- sys->memory[adrx(w[1], w[0])] = sys->cpu->gr[r_r1(w[0])];
+ sys->memory[get_adr_x(w[1], w[0])] = sys->cpu->gr[get_r_r1(w[0])];
sys->cpu->pr += 2;
}
/**
* LAD命令。語長2
+ * \relates exec
*/
void lad()
{
WORD w[2];
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
- sys->cpu->gr[r_r1(w[0])] = adrx(w[1], w[0]);
+ sys->cpu->gr[get_r_r1(w[0])] = get_adr_x(w[1], w[0]);
sys->cpu->pr += 2;
}
/**
- * ADDA命令のテンプレート
+ * ADDA命令のテンプレート\n
* 汎用レジスタrに値valを算術加算
*/
void adda(WORD r, WORD val)
/**
* ADDA命令 - オペランドr,adr,x。語長2
+ * \relates exec
*/
void adda_r_adr_x()
{
WORD w[2];
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
- adda(r_r1(w[0]), val_adrx(w[1], w[0]));
+ adda(get_r_r1(w[0]), get_val_adr_x(w[1], w[0]));
sys->cpu->pr += 2;
}
/**
* ADDA命令 - オペランドr1,r2。語長1
+ * \relates exec
*/
void adda_r1_r2()
{
WORD w[1];
w[0] = sys->memory[sys->cpu->pr];
- adda(r_r1(w[0]), sys->cpu->gr[x_r2(w[0])]);
+ adda(get_r_r1(w[0]), sys->cpu->gr[get_x_r2(w[0])]);
sys->cpu->pr += 1;
}
/**
* SUBA命令 - オペランドr,adr,x。語長2
+ * \relates exec
*/
void suba_r_adr_x()
{
WORD w[2];
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
- adda(r_r1(w[0]), ~(val_adrx(w[1], w[0])) + 1);
+ adda(get_r_r1(w[0]), ~(get_val_adr_x(w[1], w[0])) + 1);
sys->cpu->pr += 2;
}
/**
* SUBA命令 - オペランドr1,r2。語長1
+ * \relates exec
*/
void suba_r1_r2()
{
WORD w[1];
w[0] = sys->memory[sys->cpu->pr];
- adda(r_r1(w[0]), ~(sys->cpu->gr[x_r2(w[0])]) + 1);
+ adda(get_r_r1(w[0]), ~(sys->cpu->gr[get_x_r2(w[0])]) + 1);
sys->cpu->pr += 1;
}
/**
- * ADDL命令のテンプレート
+ * ADDL命令のテンプレート\n
* 汎用レジスタrに値valを論理加算
*/
void addl(WORD r, WORD val)
/**
* ADDL命令 - オペランドr,adr,x。語長2
+ * \relates exec
*/
void addl_r_adr_x()
{
WORD w[2];
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
- addl(r_r1(w[0]), val_adrx(w[1], w[0]));
+ addl(get_r_r1(w[0]), get_val_adr_x(w[1], w[0]));
sys->cpu->pr += 2;
}
/**
* ADDL命令 - オペランドr1,r2。語長1
+ * \relates exec
*/
void addl_r1_r2()
{
WORD w[1];
w[0] = sys->memory[sys->cpu->pr];
- addl(r_r1(w[0]), sys->cpu->gr[x_r2(w[0])]);
+ addl(get_r_r1(w[0]), sys->cpu->gr[get_x_r2(w[0])]);
sys->cpu->pr += 1;
}
/**
* SUBL命令 - オペランドr,adr,x。語長2
+ * \relates exec
*/
void subl_r_adr_x()
{
WORD w[2];
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
- addl(r_r1(w[0]), ~(val_adrx(w[1], w[0])) + 1);
+ addl(get_r_r1(w[0]), ~(get_val_adr_x(w[1], w[0])) + 1);
sys->cpu->pr += 2;
}
+
/**
* SUBL命令 - オペランドr1,r2。語長1
+ * \relates exec
*/
void subl_r1_r2()
{
WORD w[1];
w[0] = sys->memory[sys->cpu->pr];
- addl(r_r1(w[0]), ~(sys->cpu->gr[x_r2(w[0])]) + 1);
+ addl(get_r_r1(w[0]), ~(sys->cpu->gr[get_x_r2(w[0])]) + 1);
sys->cpu->pr += 1;
}
/**
* AND命令 - オペランドr,adr,x。語長2
+ * \relates exec
*/
void and_r_adr_x()
{
WORD w[2];
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
- setfr(sys->cpu->gr[r_r1(w[0])] &= val_adrx(w[1], w[0]));
+ setfr(sys->cpu->gr[get_r_r1(w[0])] &= get_val_adr_x(w[1], w[0]));
sys->cpu->pr += 2;
}
/**
* AND命令 - オペランドr1,r2。語長1
+ * \relates exec
*/
void and_r1_r2()
{
WORD w[1];
w[0] = sys->memory[sys->cpu->pr];
- setfr(sys->cpu->gr[r_r1(w[0])] &= sys->cpu->gr[x_r2(w[0])]);
+ setfr(sys->cpu->gr[get_r_r1(w[0])] &= sys->cpu->gr[get_x_r2(w[0])]);
sys->cpu->pr += 1;
}
/**
* OR命令 - オペランドr,adr,x。語長2
+ * \relates exec
*/
void or_r_adr_x()
{
WORD w[2];
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
- setfr(sys->cpu->gr[r_r1(w[0])] |= val_adrx(w[1], w[0]));
+ setfr(sys->cpu->gr[get_r_r1(w[0])] |= get_val_adr_x(w[1], w[0]));
sys->cpu->pr += 2;
}
/**
* OR命令 - オペランドr1,r2。語長1
+ * \relates exec
*/
void or_r1_r2()
{
WORD w[1];
w[0] = sys->memory[sys->cpu->pr];
- setfr(sys->cpu->gr[r_r1(w[0])] |= sys->cpu->gr[x_r2(w[0])]);
+ setfr(sys->cpu->gr[get_r_r1(w[0])] |= sys->cpu->gr[get_x_r2(w[0])]);
sys->cpu->pr += 1;
}
/**
* XOR命令 - オペランドr,adr,x。語長2
+ * \relates exec
*/
void xor_r_adr_x()
{
WORD w[2];
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
- setfr(sys->cpu->gr[r_r1(w[0])] ^= val_adrx(w[1], w[0]));
+ setfr(sys->cpu->gr[get_r_r1(w[0])] ^= get_val_adr_x(w[1], w[0]));
sys->cpu->pr += 2;
}
/**
* XOR命令 - オペランドr1,r2。語長1
+ * \relates exec
*/
void xor_r1_r2()
{
WORD w[1];
w[0] = sys->memory[sys->cpu->pr];
- setfr(sys->cpu->gr[r_r1(w[0])] ^= sys->cpu->gr[x_r2(w[0])]);
+ setfr(sys->cpu->gr[get_r_r1(w[0])] ^= sys->cpu->gr[get_x_r2(w[0])]);
sys->cpu->pr += 1;
}
/**
- * CPA命令のテンプレート
+ * CPA命令のテンプレート\n
* 汎用レジスタrの内容と値valを算術比較
*/
void cpa(WORD r, WORD val)
/**
* CPA命令 - オペランドr,adr,x。語長2
+ * \relates exec
*/
void cpa_r_adr_x()
{
WORD w[2];
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
- cpa(r_r1(w[0]), val_adrx(w[1], w[0]));
+ cpa(get_r_r1(w[0]), get_val_adr_x(w[1], w[0]));
sys->cpu->pr += 2;
}
/**
* CPA命令 - オペランドr1,r2。語長1
+ * \relates exec
*/
void cpa_r1_r2()
{
WORD w[1];
w[0] = sys->memory[sys->cpu->pr];
- cpa(r_r1(w[0]), sys->cpu->gr[x_r2(w[0])]);
+ cpa(get_r_r1(w[0]), sys->cpu->gr[get_x_r2(w[0])]);
sys->cpu->pr += 1;
}
/**
- * CPL命令のテンプレート
+ * CPL命令のテンプレート\n
* 汎用レジスタrの内容と値valを論理比較
*/
void cpl(WORD r, WORD val)
/**
* CPL命令 - オペランドr,adr,x。語長2
+ * \relates exec
*/
void cpl_r_adr_x()
{
WORD w[2];
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
- cpl(r_r1(w[0]), val_adrx(w[1], w[0]));
+ cpl(get_r_r1(w[0]), get_val_adr_x(w[1], w[0]));
sys->cpu->pr += 2;
}
/**
* CPL命令 - オペランドr1,r2。語長1
+ * \relates exec
*/
void cpl_r1_r2()
{
WORD w[1];
w[0] = sys->memory[sys->cpu->pr];
- cpl(r_r1(w[0]), sys->cpu->gr[x_r2(w[0])]);
+ cpl(get_r_r1(w[0]), sys->cpu->gr[get_x_r2(w[0])]);
sys->cpu->pr += 1;
}
/**
- * SLA命令 - オペランドr,adr,x。語長2
+ * SLA命令 - オペランドr,adr,x。語長2\n
* 算術演算なので、第15ビットは送り出されない
+ * \relates exec
*/
void sla()
{
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
sys->cpu->fr = 0x0;
- sign = sys->cpu->gr[(r = r_r1(w[0]))] & 0x8000;
+ sign = sys->cpu->gr[(r = get_r_r1(w[0]))] & 0x8000;
sys->cpu->gr[r] &= 0x7FFF;
- for(i = 0; i < adrx(w[1], w[0]); i++) {
+ for(i = 0; i < get_adr_x(w[1], w[0]); i++) {
last = sys->cpu->gr[r] & 0x4000;
sys->cpu->gr[r] <<= 1;
}
}
/**
- * SRA命令 - オペランドr,adr,x。語長2
- * 算術演算なので、第15ビットは送り出されない
+ * SRA命令 - オペランドr,adr,x。語長2\n
+ * 算術演算なので、第15ビットは送り出されない\n
* 空いたビット位置には符号と同じものが入る
+ * \relates exec
*/
void sra()
{
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
sys->cpu->fr = 0x0;
- sign = sys->cpu->gr[(r = r_r1(w[0]))] & 0x8000;
+ sign = sys->cpu->gr[(r = get_r_r1(w[0]))] & 0x8000;
sys->cpu->gr[r] &= 0x7FFF;
- for(i = 0; i < adrx(w[1], w[0]); i++) {
+ for(i = 0; i < get_adr_x(w[1], w[0]); i++) {
last = sys->cpu->gr[r] & 0x1;
sys->cpu->gr[r] >>= 1;
if(sign > 0) {
/**
* SLL命令 - オペランドr,adr,x。語長2
+ * \relates exec
*/
void sll()
{
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
sys->cpu->fr = 0x0;
- for(i = 0; i < adrx(w[1], w[0]); i++) {
- last = sys->cpu->gr[(r = r_r1(w[0]))] & 0x8000;
+ for(i = 0; i < get_adr_x(w[1], w[0]); i++) {
+ last = sys->cpu->gr[(r = get_r_r1(w[0]))] & 0x8000;
sys->cpu->gr[r] <<= 1;
}
/* OFに、レジスタから最後に送り出されたビットの値を設定 */
/**
* SRL命令 - オペランドr,adr,x。語長2
+ * \relates exec
*/
void srl()
{
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
sys->cpu->fr = 0x0;
- r = r_r1(w[0]);
- for(i = 0; i < adrx(w[1], w[0]); i++) {
+ r = get_r_r1(w[0]);
+ for(i = 0; i < get_adr_x(w[1], w[0]); i++) {
last = sys->cpu->gr[r] & 0x0001;
sys->cpu->gr[r] >>= 1;
}
/**
* JPL命令。語長2
+ * \relates exec
*/
void jpl()
{
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
if((sys->cpu->fr & (SF | ZF)) == 0) {
- sys->cpu->pr = adrx(w[1], w[0]);
+ sys->cpu->pr = get_adr_x(w[1], w[0]);
} else {
sys->cpu->pr += 2;
}
/**
* JMI命令。語長2
+ * \relates exec
*/
void jmi()
{
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
if((sys->cpu->fr & SF) > 0) {
- sys->cpu->pr = adrx(w[1], w[0]);
+ sys->cpu->pr = get_adr_x(w[1], w[0]);
} else {
sys->cpu->pr += 2;
}
/**
* JNZ命令。語長2
+ * \relates exec
*/
void jnz()
{
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
if((sys->cpu->fr & ZF) == 0) {
- sys->cpu->pr = adrx(w[1], w[0]);
+ sys->cpu->pr = get_adr_x(w[1], w[0]);
} else {
sys->cpu->pr += 2;
}
/**
* JZE命令。語長2
+ * \relates exec
*/
void jze()
{
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
if((sys->cpu->fr & ZF) > 0) {
- sys->cpu->pr = adrx(w[1], w[0]);
+ sys->cpu->pr = get_adr_x(w[1], w[0]);
} else {
sys->cpu->pr += 2;
}
/**
* JOV命令。語長2
+ * \relates exec
*/
void jov()
{
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
if((sys->cpu->fr & OF) > 0) {
- sys->cpu->pr = adrx(w[1], w[0]);
+ sys->cpu->pr = get_adr_x(w[1], w[0]);
} else {
sys->cpu->pr += 2;
}
/**
* JUMP命令。語長2
+ * \relates exec
*/
void jump()
{
WORD w[2];
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
- sys->cpu->pr = adrx(w[1], w[0]);
+ sys->cpu->pr = get_adr_x(w[1], w[0]);
}
/**
* PUSH命令。語長2
+ * \relates exec
*/
void push()
{
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize);
- sys->memory[--(sys->cpu->sp)] = adrx(w[1], w[0]);
+ sys->memory[--(sys->cpu->sp)] = get_adr_x(w[1], w[0]);
sys->cpu->pr += 2;
}
/**
* POP命令。語長1
+ * \relates exec
*/
void pop()
{
assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize);
WORD w[1];
w[0] = sys->memory[sys->cpu->pr];
- sys->cpu->gr[r_r1(w[0])] = sys->memory[(sys->cpu->sp)++];
+ sys->cpu->gr[get_r_r1(w[0])] = sys->memory[(sys->cpu->sp)++];
sys->cpu->pr += 1;
}
/**
* CALL命令。語長2
+ * \relates exec
*/
void call()
{
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
sys->memory[--(sys->cpu->sp)] = sys->cpu->pr + 1;
- sys->cpu->pr = adrx(w[1], w[0]);
+ sys->cpu->pr = get_adr_x(w[1], w[0]);
}
/**
* RET命令。語長1(OPのみ)
+ * \relates exec
*/
void ret()
{
/**
* SVC命令。語長2
+ * \relates exec
*/
void svc()
{
WORD w[2];
w[0] = sys->memory[sys->cpu->pr];
w[1] = sys->memory[sys->cpu->pr + 1];
- switch(adrx(w[1], w[0]))
+ switch(get_adr_x(w[1], w[0]))
{
case 0x0: /* STOP */
execptr->stop = true;
/**
* 仮想マシンCOMET IIの実行
+ * \class exec
*/
void exec()
{