YACASL2
Loading...
Searching...
No Matches
exec.c
Go to the documentation of this file.
1#include "exec.h"
2#include "monitor.h"
3
11char *pr2str(WORD pr);
12
17void svcin();
18
23void svcout();
24
30void setfr(WORD adr);
31
39WORD get_r_r1(WORD oprx);
40
48WORD get_x_r2(WORD oprx);
49
58WORD get_adr_x(WORD adr, WORD oprx);
59
68WORD get_val_adr_x(WORD adr, WORD oprx);
69
73static CERR cerr_exec[] = {
74 { 201, "Program Register (PR) - memory overflow" },
75 { 202, "Stack Pointer (SP) - stack overflow" },
76 { 203, "Stack Pointer (SP) - stack underflow" },
77 { 204, "OP in word #1 - not command code" },
78 { 205, "r/r1 in word #1 - not GR" },
79 { 206, "x/r2 in word #1 - not GR" },
80 { 207, "address in word #2 - out of memory" },
81 { 208, "SVC input - memory overflow" },
82 { 209, "SVC output - memory overflow" },
83};
84
88EXECMODE execmode = {false, false, false, 0, 0xFFFF, false, false};
89
90char *pr2str(WORD pr)
91{
92 char *str = malloc_chk(CERRSTRSIZE + 1, "pr2str.pr");
93
94 sprintf(str, "PR:#%04X", pr);
95 return str;
96}
97
98void svcin()
99{
100 int i;
101 char *buf = malloc_chk(INSIZE + 1, "svcin.buf");
102
103 if(fgets(buf, INSIZE, stdin) == NULL) {
104 sys->memory[sys->cpu->gr[1]] = sys->memory[sys->cpu->gr[2]] = 0x0;
105 return;
106 }
107 for(i = 0; i < INSIZE; i++) {
108 if(!buf[i] || buf[i] == '\n') {
109 --i;
110 break;
111 }
112 if(sys->cpu->gr[1] + i > execptr->end) {
113 setcerr(208, ""); /* SVC input - memory overflow */
114 break;
115 }
116 sys->memory[sys->cpu->gr[1] + i] = buf[i];
117 }
118 sys->memory[sys->cpu->gr[2]] = i + 1;
119 FREE(buf);
120}
121
122void svcout()
123{
124 int i;
125 WORD w;
126
127 for(i = 0; i < sys->memory[sys->cpu->gr[2]]; i++) {
128 if(sys->cpu->gr[1] + i > execptr->end) {
129 setcerr(209, ""); /* SVC output - memory overflow */
130 return;
131 }
132 /* 「JIS X 0201ラテン文字・片仮名用8ビット符号で規定する文字の符号表」
133 に記載された文字と、改行(CR)/タブを表示 */
134 /* それ以外の文字は、「.」で表す */
135 if(((w = sys->memory[sys->cpu->gr[1]+i]) >= 0x20 && w <= 0x7E) || /* JIS X 0201ラテン文字 */
136 (w >= 0xA0 && w <= 0xFE) || /* JIS X 0201片仮名用8ビット符号 */
137 w == 0xA || w == '\t')
138 {
139 putchar((char)w);
140 } else {
141 putchar('.');
142 }
143 }
144}
145
146void setfr(WORD adr)
147{
148 sys->cpu->fr = 0x0;
149 /* 第15ビットが1のとき、SFは1 */
150 if((adr & 0x8000) == 0x8000) {
151 sys->cpu->fr += SF;
152 }
153 /* 演算結果が0のとき、ZFは1 */
154 if(adr == 0x0) {
155 sys->cpu->fr += ZF;
156 }
157}
158
160{
161 WORD r = 0;
162 char *s = NULL;
163
164 if((r = ((oprx & 0x00F0) >>4)) > GRSIZE - 1) {
165 setcerr(205, s = pr2str(sys->cpu->pr)); /* r/r1 in word #1 - not GR */
166 FREE(s);
167 return 0x0;
168 }
169 return r;
170}
171
173{
174 WORD x = 0;
175 char *s = NULL;
176
177 if((x = (oprx & 0x000F)) > GRSIZE - 1) {
178 setcerr(206, s = pr2str(sys->cpu->pr)); /* r/r1 in word #1 - not GR */
179 FREE(s);
180 return 0x0;
181 }
182 return x;
183}
184
186{
187 WORD a = adr;
188 WORD x = get_x_r2(oprx);
189
190 if(x > 0) {
191 a += sys->cpu->gr[x];
192 }
193 return a;
194}
195
197{
198 WORD a = 0;
199 char *s = NULL;
200
201 if((a = get_adr_x(adr, oprx)) >= sys->memsize) {
202 setcerr(207, s = pr2str(sys->cpu->pr + 1)); /* address in word #2 - out of memory */
203 FREE(s);
204 return 0x0;
205 }
206 return sys->memory[a];
207}
208
209/* exec.hで定義された関数群 */
214
215void nop()
216{
217 sys->cpu->pr += 1;
218}
219
221{
222 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
223 setfr(sys->cpu->gr[get_r_r1(w[0])] = get_val_adr_x(w[1], w[0]));
224 sys->cpu->pr += 2;
225}
226
228{
229 WORD w[] = {sys->memory[sys->cpu->pr]};
230 setfr(sys->cpu->gr[get_r_r1(w[0])] = sys->cpu->gr[get_x_r2(w[0])]);
231 sys->cpu->pr += 1;
232}
233
234void st()
235{
236 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
237 sys->memory[get_adr_x(w[1], w[0])] = sys->cpu->gr[get_r_r1(w[0])];
238 sys->cpu->pr += 2;
239}
240
241void lad()
242{
243 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
244 sys->cpu->gr[get_r_r1(w[0])] = get_adr_x(w[1], w[0]);
245 sys->cpu->pr += 2;
246}
247
248void adda(WORD r, WORD val)
249{
250 long tmp;
251
252 sys->cpu->fr = 0x0;
253 /* 引数の値を16ビット符号付整数として加算し、オーバーフローをチェック */
254 assert(sizeof(short) * 8 == 16 && (short)0xFFFF == -1);
255 if((tmp = (short)(sys->cpu->gr[r]) + (short)val) > 32767 || tmp < -32768) {
256 sys->cpu->fr += OF;
257 }
258 /* 加算した結果を、WORD値に戻す */
259 sys->cpu->gr[r] = (WORD)(tmp & 0xFFFF);
260 if((sys->cpu->gr[r] & 0x8000) == 0x8000) {
261 sys->cpu->fr += SF;
262 } else if(sys->cpu->gr[r] == 0x0) {
263 sys->cpu->fr += ZF;
264 }
265}
266
268{
269 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
270 adda(get_r_r1(w[0]), get_val_adr_x(w[1], w[0]));
271 sys->cpu->pr += 2;
272}
273
275{
276 WORD w[] = {sys->memory[sys->cpu->pr]};
277 adda(get_r_r1(w[0]), sys->cpu->gr[get_x_r2(w[0])]);
278 sys->cpu->pr += 1;
279}
280
282{
283 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
284 adda(get_r_r1(w[0]), ~(get_val_adr_x(w[1], w[0])) + 1);
285 sys->cpu->pr += 2;
286}
287
289{
290 WORD w[] = {sys->memory[sys->cpu->pr]};
291 adda(get_r_r1(w[0]), ~(sys->cpu->gr[get_x_r2(w[0])]) + 1);
292 sys->cpu->pr += 1;
293}
294
295void addl_gr(WORD r, WORD val, bool add)
296{
297 unsigned long o = 0;
298 unsigned long s = 0;
299
300 o = sys->cpu->gr[r];
301 sys->cpu->fr = 0; /* flag initialize */
302
303 if(add == true) {
304 s = o + val;
305 if(s > 0xFFFF) {
306 sys->cpu->fr += OF;
307 }
308 } else {
309 if(o < val) {
310 sys->cpu->fr += OF;
311 }
312 s = o + (~val + 1);
313 if(s > 0xFFFF) {
314 s &= 0xFFFF;
315 }
316 }
317 sys->cpu->gr[r] = (WORD)s;
318
319 if((s & 0x8000) == 0x8000) {
320 sys->cpu->fr += SF;
321 }
322 else if(s == 0x0) {
323 sys->cpu->fr += ZF;
324 }
325}
326
328{
329 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
330 addl_gr(get_r_r1(w[0]), get_val_adr_x(w[1], w[0]), true);
331 sys->cpu->pr += 2;
332}
333
335{
336 WORD w[] = {sys->memory[sys->cpu->pr]};
337 addl_gr(get_r_r1(w[0]), sys->cpu->gr[get_x_r2(w[0])], true);
338 sys->cpu->pr += 1;
339}
340
342{
343 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
344 addl_gr(get_r_r1(w[0]), get_val_adr_x(w[1], w[0]), false);
345 sys->cpu->pr += 2;
346}
347
349{
350 WORD w[] = {sys->memory[sys->cpu->pr]};
351 addl_gr(get_r_r1(w[0]), sys->cpu->gr[get_x_r2(w[0])], false);
352 sys->cpu->pr += 1;
353}
354
356{
357 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
358 setfr(sys->cpu->gr[get_r_r1(w[0])] &= get_val_adr_x(w[1], w[0]));
359 sys->cpu->pr += 2;
360}
361
363{
364 WORD w[] = {sys->memory[sys->cpu->pr]};
365 setfr(sys->cpu->gr[get_r_r1(w[0])] &= sys->cpu->gr[get_x_r2(w[0])]);
366 sys->cpu->pr += 1;
367}
368
370{
371 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
372 setfr(sys->cpu->gr[get_r_r1(w[0])] |= get_val_adr_x(w[1], w[0]));
373 sys->cpu->pr += 2;
374}
375
377{
378 WORD w[] = {sys->memory[sys->cpu->pr]};
379 setfr(sys->cpu->gr[get_r_r1(w[0])] |= sys->cpu->gr[get_x_r2(w[0])]);
380 sys->cpu->pr += 1;
381}
382
384{
385 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
386 setfr(sys->cpu->gr[get_r_r1(w[0])] ^= get_val_adr_x(w[1], w[0]));
387 sys->cpu->pr += 2;
388}
389
391{
392 WORD w[] = {sys->memory[sys->cpu->pr]};
393 setfr(sys->cpu->gr[get_r_r1(w[0])] ^= sys->cpu->gr[get_x_r2(w[0])]);
394 sys->cpu->pr += 1;
395}
396
397void cpa(WORD r, WORD val)
398{
399 sys->cpu->fr = 0;
400 if((short)sys->cpu->gr[r] < (short)val) {
401 sys->cpu->fr = SF;
402 } else if(sys->cpu->gr[r] == val) {
403 sys->cpu->fr = ZF;
404 }
405}
406
408{
409 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
410 cpa(get_r_r1(w[0]), get_val_adr_x(w[1], w[0]));
411 sys->cpu->pr += 2;
412}
413
415{
416 WORD w[] = {sys->memory[sys->cpu->pr]};
417 cpa(get_r_r1(w[0]), sys->cpu->gr[get_x_r2(w[0])]);
418 sys->cpu->pr += 1;
419}
420
421void cpl(WORD r, WORD val)
422{
423 sys->cpu->fr = 0x0;
424 if(sys->cpu->gr[r] < val) {
425 sys->cpu->fr = SF;
426 } else if(sys->cpu->gr[r] == val) {
427 sys->cpu->fr = ZF;
428 }
429}
430
432{
433 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
434 cpl(get_r_r1(w[0]), get_val_adr_x(w[1], w[0]));
435 sys->cpu->pr += 2;
436}
437
439{
440 WORD w[] = {sys->memory[sys->cpu->pr]};
441 cpl(get_r_r1(w[0]), sys->cpu->gr[get_x_r2(w[0])]);
442 sys->cpu->pr += 1;
443}
444
445void sla()
446{
447 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
448 WORD r = get_r_r1(w[0]);
449 WORD sign = sys->cpu->gr[r] & 0x8000;
450 WORD last = 0;
451
452 sys->cpu->fr = 0;
453 sys->cpu->gr[r] &= 0x7FFF;
454 for(int i = 0; i < get_adr_x(w[1], w[0]); i++) {
455 last = sys->cpu->gr[r] & 0x4000;
456 sys->cpu->gr[r] <<= 1;
457 }
458 sys->cpu->gr[r] = sign | (sys->cpu->gr[r] & 0x7FFF);
459 /* OFに、レジスタから最後に送り出されたビットの値を設定 */
460 if(last > 0x0) {
461 sys->cpu->fr += OF;
462 }
463 /* 符号(第15ビット)が1のとき、SFは1 */
464 if(sign > 0x0) {
465 sys->cpu->fr += SF;
466 }
467 /* 演算結果が0のとき、ZFは1 */
468 if(sys->cpu->gr[r] == 0x0) {
469 sys->cpu->fr += ZF;
470 }
471 sys->cpu->pr += 2;
472}
473
474void sra()
475{
476 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
477 WORD r = get_r_r1(w[0]);
478 WORD sign = sys->cpu->gr[r] & 0x8000;
479 WORD last = 0;
480
481 sys->cpu->fr = 0;
482 sys->cpu->gr[r] &= 0x7FFF;
483 for(int i = 0; i < get_adr_x(w[1], w[0]); i++) {
484 last = sys->cpu->gr[r] & 0x1;
485 sys->cpu->gr[r] >>= 1;
486 if(sign > 0) {
487 sys->cpu->gr[r] |= 0x4000;
488 }
489 }
490 sys->cpu->gr[r] = sign | sys->cpu->gr[r];
491 /* OFに、レジスタから最後に送り出されたビットの値を設定 */
492 if(last > 0x0) {
493 sys->cpu->fr += OF;
494 }
495 /* 符号(第15ビット)が1のとき、SFは1 */
496 if(sign > 0x0) {
497 sys->cpu->fr += SF;
498 }
499 /* 演算結果が0のとき、ZFは1 */
500 if(sys->cpu->gr[r] == 0x0) {
501 sys->cpu->fr += ZF;
502 }
503 sys->cpu->pr += 2;
504}
505
506void sll()
507{
508 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
509 WORD last = 0;
510 WORD r = get_r_r1(w[0]);
511
512 sys->cpu->fr = 0x0;
513 for(int i = 0; i < get_adr_x(w[1], w[0]); i++) {
514 last = sys->cpu->gr[r] & 0x8000;
515 sys->cpu->gr[r] <<= 1;
516 }
517 /* OFに、レジスタから最後に送り出されたビットの値を設定 */
518 if(last > 0x0) {
519 sys->cpu->fr += OF;
520 }
521 /* 第15ビットが1のとき、SFは1 */
522 if((sys->cpu->gr[r] & 0x8000) > 0x0) {
523 sys->cpu->fr += SF;
524 }
525 /* 演算結果が0のとき、ZFは1 */
526 if(sys->cpu->gr[r] == 0x0) {
527 sys->cpu->fr += ZF;
528 }
529 sys->cpu->pr += 2;
530}
531
532void srl()
533{
534 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
535 WORD last = 0;
536 WORD r = get_r_r1(w[0]);
537
538 sys->cpu->fr = 0x0;
539 for(int i = 0; i < get_adr_x(w[1], w[0]); i++) {
540 last = sys->cpu->gr[r] & 0x0001;
541 sys->cpu->gr[r] >>= 1;
542 }
543 /* OFに、レジスタから最後に送り出されたビットの値を設定 */
544 if(last > 0x0) {
545 sys->cpu->fr += OF;
546 }
547 /* 第15ビットが1のとき、SFは1 */
548 if((sys->cpu->gr[r] & 0x8000) > 0x0) {
549 sys->cpu->fr += SF;
550 }
551 /* 演算結果が0のとき、ZFは1 */
552 if(sys->cpu->gr[r] == 0x0) {
553 sys->cpu->fr += ZF;
554 }
555 sys->cpu->pr += 2;
556}
557
558void jpl()
559{
560 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
561 if((sys->cpu->fr & (SF | ZF)) == 0) {
562 sys->cpu->pr = get_adr_x(w[1], w[0]);
563 } else {
564 sys->cpu->pr += 2;
565 }
566}
567
568void jmi()
569{
570 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
571 if((sys->cpu->fr & SF) > 0) {
572 sys->cpu->pr = get_adr_x(w[1], w[0]);
573 } else {
574 sys->cpu->pr += 2;
575 }
576}
577
578void jnz()
579{
580 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
581 if((sys->cpu->fr & ZF) == 0) {
582 sys->cpu->pr = get_adr_x(w[1], w[0]);
583 } else {
584 sys->cpu->pr += 2;
585 }
586}
587
588void jze()
589{
590 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
591 if((sys->cpu->fr & ZF) > 0) {
592 sys->cpu->pr = get_adr_x(w[1], w[0]);
593 } else {
594 sys->cpu->pr += 2;
595 }
596}
597
598void jov()
599{
600 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
601 if((sys->cpu->fr & OF) > 0) {
602 sys->cpu->pr = get_adr_x(w[1], w[0]);
603 } else {
604 sys->cpu->pr += 2;
605 }
606}
607
608void jump()
609{
610 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
611 sys->cpu->pr = get_adr_x(w[1], w[0]);
612}
613
614void push()
615{
616 assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize);
617 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
618 sys->memory[--(sys->cpu->sp)] = get_adr_x(w[1], w[0]);
619 sys->cpu->pr += 2;
620}
621
622void pop()
623{
624 assert(sys->cpu->sp > execptr->end);
625 WORD w[] = {sys->memory[sys->cpu->pr]};
626 char *s = NULL;
627
628 if(sys->cpu->sp >= sys->memsize) {
629 setcerr(203, s = pr2str(sys->cpu->pr)); /* Stack Pointer (SP) - stack underflow */
630 FREE(s);
631 } else {
632 sys->cpu->gr[get_r_r1(w[0])] = sys->memory[(sys->cpu->sp)++];
633 sys->cpu->pr += 1;
634 }
635}
636
637void call()
638{
639 assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize);
640 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
641 sys->memory[--(sys->cpu->sp)] = sys->cpu->pr + 1;
642 sys->cpu->pr = get_adr_x(w[1], w[0]);
643}
644
645void ret()
646{
647 assert(sys->cpu->sp <= sys->memsize);
648 if(sys->cpu->sp == sys->memsize) {
649 execptr->stop = true;
650 } else if(sys->cpu->sp < sys->memsize) {
651 sys->cpu->pr = sys->memory[(sys->cpu->sp)++] + 1;
652 }
653}
654
655void svc()
656{
657 WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
658 switch(get_adr_x(w[1], w[0]))
659 {
660 case 0x0: /* STOP */
661 execptr->stop = true;
662 break;
663 case 0x1: /* IN */
664 svcin();
665 break;
666 case 0x2: /* OUT */
667 svcout();
668 break;
669 }
670 sys->cpu->pr += 2;
671}
672
673void exec()
674{
675 clock_t clock_begin = 0;
676 clock_t clock_end = 0;
677 void (*cmdptr)() = NULL;
678 char *s = NULL;
679 const char *monmsg = "COMET II machine code monitor. Type ? for help.\n";
680
681 create_cmdtable(HASH_CODE); /* 命令のコードとタイプがキーのハッシュ表を作成 */
682
683 if(execmode.trace == true) {
684 fprintf(stdout, "\nExecuting machine codes\n");
685 }
686 /* 機械語の実行 */
687 for (sys->cpu->pr = execptr->start; ; ) {
688 clock_begin = clock(); /* クロック周波数設定のため、実行開始時間を格納 */
689 if(execmode.dump || execmode.trace) { /* traceまたはdumpオプション指定時、改行を出力 */
690 if(execmode.trace) { /* traceオプション指定時、レジスタを出力 */
691 fprintf(stdout, "#%04X: Register::::\n", sys->cpu->pr);
692 dspregister();
693 }
694 if(execmode.dump) { /* dumpオプション指定時、メモリを出力 */
695 fprintf(stdout, "#%04X: Memory::::\n", sys->cpu->pr);
696 dumpmemory(execmode.dump_start, execmode.dump_end);
697 }
698 fprintf(stdout, "\n");
699 }
700 /* ステップモードまたはブレークポイントの場合、モニターを起動 */
701 if(
702 (execmode.monitor == true && sys->cpu->pr == execptr->start) ||
703 execmode.step == true || getbps(sys->cpu->pr) == true)
704 {
705 if(sys->cpu->pr == execptr->start) {
706 fprintf(stdout, "%s", monmsg);
707 }
708 monitor();
709 }
710 /* プログラムレジスタをチェック */
711 if(sys->cpu->pr >= sys->memsize) {
712 setcerr(201, s = pr2str(sys->cpu->pr)); /* Program Register (PR) - memory overflow */
713 goto execfin;
714 }
715 /* スタックポインタをチェック */
716 if(sys->cpu->sp <= execptr->end) {
717 setcerr(202, s = pr2str(sys->cpu->pr)); /* Stack Pointer (SP) - stack overflow */
718 goto execfin;
719 }
720 /* コードから命令を取得 */
721 /* 取得できない場合はエラー終了 */
722 if((cmdptr = getcmdptr(sys->memory[sys->cpu->pr] & 0xFF00)) == NULL) {
723 setcerr(204, s = pr2str(sys->cpu->pr)); /* OP in word #1 - not command code */
724 goto execfin;
725 }
726 /* 命令の実行 */
727 (*cmdptr)();
728 /* エラー発生時はエラー終了 */
729 if(cerr->num > 0) {
730 goto execfin;
731 }
732 /* 終了フラグがtrueの場合は、モニターまたは正常終了 */
733 if(execptr->stop == true) {
734 if(execmode.monitor == true) {
735 fprintf(stdout, "Return to top.\n");
736 monitor();
737 } else {
738 break;
739 }
740 }
741 /* クロック周波数の設定 */
742 do {
743 clock_end = clock();
744 } while(clock_end - clock_begin < CLOCKS_PER_SEC / sys->clocks);
745 }
746execfin:
747 FREE(s);
748 freebps();
749 free_cmdtable(HASH_CODE); /* 命令のコードとタイプがキーのハッシュ表を解放 */
750 if(cerr->num > 0) {
751 fprintf(stderr, "Execute error - %d: %s\n", cerr->num, cerr->msg);
752 }
753}
CERR * cerr
現在のエラー
Definition cerr.c:9
@ CERRSTRSIZE
Definition cerr.h:38
struct _CERR CERR
エラーを表すデータ型
void addcerrlist(int cerrc, CERR cerrv[])
エラーリストを作成・追加する
Definition cerr.c:13
void setcerr(int num, const char *str)
現在のエラーを設定する
Definition cerr.c:45
#define FREE(ptr)
メモリを解放するマクロ
Definition cmem.h:21
void * malloc_chk(size_t size, const char *tag)
mallocを実行し、0で初期化する
Definition cmem.c:3
#define ARRAYSIZE(array)
配列のサイズを返すマクロ
Definition cmem.h:14
void exec()
COMET II仮想マシンを実行する
Definition exec.c:673
void and_r_adr_x()
AND命令 - オペランドr,adr,x。語長2.
Definition exec.c:355
void st()
ST命令。語長2.
Definition exec.c:234
void svcin()
標準入力から文字データを読込(SVC 1)
Definition exec.c:98
void jmi()
JMI命令。語長2.
Definition exec.c:568
void svc()
SVC命令。語長2.
Definition exec.c:655
void suba_r1_r2()
SUBA命令 - オペランドr1,r2。語長1.
Definition exec.c:288
void cpl(WORD r, WORD val)
Definition exec.c:421
void cpl_r_adr_x()
CPL命令 - オペランドr,adr,x。語長2.
Definition exec.c:431
void sra()
SRA命令 - オペランドr,adr,x。語長2.
Definition exec.c:474
void pop()
POP命令。語長1.
Definition exec.c:622
void adda(WORD r, WORD val)
Definition exec.c:248
void svcout()
標準出力へ文字データを書出(SVC 2)
Definition exec.c:122
void adda_r1_r2()
ADDA命令 - オペランドr1,r2。語長1.
Definition exec.c:274
void xor_r1_r2()
XOR命令 - オペランドr1,r2。語長1.
Definition exec.c:390
void subl_r_adr_x()
SUBL命令 - オペランドr,adr,x。語長2.
Definition exec.c:341
void sla()
SLA命令 - オペランドr,adr,x。語長2.
Definition exec.c:445
WORD get_val_adr_x(WORD adr, WORD oprx)
2つのWORD値からadr[,x]のアドレスに格納されている値を取得
Definition exec.c:196
char * pr2str(WORD pr)
プログラムレジスタ(PR)を表すWORD値を文字列に変換
Definition exec.c:90
void srl()
SRL命令 - オペランドr,adr,x。語長2.
Definition exec.c:532
WORD get_adr_x(WORD adr, WORD oprx)
2つのWORD値からadr[,x]を取得
Definition exec.c:185
WORD get_x_r2(WORD oprx)
WORD値からx/r2を取得
Definition exec.c:172
void ld_r_adr_x()
LD命令 - オペランドr,adr,x。語長2.
Definition exec.c:220
void jnz()
JNZ命令。語長2.
Definition exec.c:578
void adda_r_adr_x()
ADDA命令 - オペランドr,adr,x。語長2.
Definition exec.c:267
void addl_r1_r2()
ADDL命令 - オペランドr1,r2。語長1.
Definition exec.c:334
void cpl_r1_r2()
CPL命令 - オペランドr1,r2。語長1.
Definition exec.c:438
WORD get_r_r1(WORD oprx)
WORD値からr/r1を取得
Definition exec.c:159
void jump()
JUMP命令。語長2.
Definition exec.c:608
void subl_r1_r2()
SUBL命令 - オペランドr1,r2。語長1.
Definition exec.c:348
void cpa_r1_r2()
CPA命令 - オペランドr1,r2。語長1.
Definition exec.c:414
void addl_gr(WORD r, WORD val, bool add)
Definition exec.c:295
void push()
PUSH命令。語長2.
Definition exec.c:614
void cpa(WORD r, WORD val)
Definition exec.c:397
void nop()
NOP命令。語長1(OPのみ)
Definition exec.c:215
void cpa_r_adr_x()
CPA命令 - オペランドr,adr,x。語長2.
Definition exec.c:407
void and_r1_r2()
AND命令 - オペランドr1,r2。語長1.
Definition exec.c:362
void addcerrlist_exec()
実行エラーをエラーリストに追加する
Definition exec.c:210
void ret()
RET命令。語長1(OPのみ)
Definition exec.c:645
void or_r_adr_x()
OR命令 - オペランドr,adr,x。語長2.
Definition exec.c:369
void suba_r_adr_x()
SUBA命令 - オペランドr,adr,x。語長2.
Definition exec.c:281
static CERR cerr_exec[]
実行エラーの定義
Definition exec.c:73
void addl_r_adr_x()
ADDL命令 - オペランドr,adr,x。語長2.
Definition exec.c:327
void sll()
SLL命令 - オペランドr,adr,x。語長2.
Definition exec.c:506
void call()
CALL命令。語長2.
Definition exec.c:637
void jpl()
JPL命令。語長2.
Definition exec.c:558
void lad()
LAD命令。語長2.
Definition exec.c:241
void setfr(WORD adr)
ロード/論理積/論理和/排他的論理和のフラグ設定。OFは常に0
Definition exec.c:146
void xor_r_adr_x()
XOR命令 - オペランドr,adr,x。語長2.
Definition exec.c:383
void jze()
JZE命令。語長2.
Definition exec.c:588
void or_r1_r2()
OR命令 - オペランドr1,r2。語長1.
Definition exec.c:376
void jov()
JOV命令。語長2.
Definition exec.c:598
void ld_r1_r2()
LD命令 - オペランドr1,r2。語長1.
Definition exec.c:227
@ INSIZE
Definition exec.h:14
void dumpmemory(WORD start, WORD end)
COMET IIのメモリを表示する
Definition dump.c:4
void dspregister()
COMET IIのレジスタを表示する
Definition dump.c:38
void monitor()
COMET IIモニターを起動する
Definition monitor.c:397
bool getbps(WORD adr)
ブレークポイント表にアドレスがある場合はtrue、ない場合はfalseを返す
Definition monitor.c:29
void freebps()
ブレークポイント表を解放する
Definition monitor.c:120
@ HASH_CODE
Definition struct.h:61
@ GRSIZE
Definition struct.h:17
EXECPTR * execptr
Definition struct.c:12
bool create_cmdtable(CMDTAB_HASH hash)
命令ハッシュ表を作成する
Definition struct.c:113
@ OF
Definition struct.h:26
@ ZF
Definition struct.h:28
@ SF
Definition struct.h:27
const void * getcmdptr(WORD code)
Definition struct.c:188
void free_cmdtable(CMDTAB_HASH hash)
Definition struct.c:135
SYSTEM * sys
COMET IIの仮想実行マシンシステム
Definition struct.c:7
EXECMODE execmode
実行モード: trace, logical, dump, monitor, step
Definition exec.c:88
実行モードを表すデータ型
Definition struct.h:140
unsigned short WORD
16ビットの数値を表すデータ型
Definition word.h:9