YACASL2
Loading...
Searching...
No Matches
assemble.c
Go to the documentation of this file.
1#include "assemble.h"
2
11void printline(FILE *stream, const char *filename, int lineno, char *line);
12
24WORD getadr(const char *prog, const char *str, PASS pass);
25
38WORD grword(const char *str, bool is_x);
39
48WORD getliteral(const char *str, PASS pass);
49
57void writememory(WORD word, WORD adr, PASS pass);
58
66void writestr(const char *str, bool literal, PASS pass);
67
74void writedc(const char *str, PASS pass);
75
83void assemble_start(const CMDLINE *cmdl, PASS pass);
84
92void assemble_ds(const CMDLINE *cmdl, PASS pass);
93
101void assemble_end(const CMDLINE *cmdl, PASS pass);
102
110void assemble_dc(const CMDLINE *cmdl, PASS pass);
111
130void assemble_in(const CMDLINE *cmdl, PASS pass);
131
152void assemble_out(const CMDLINE *cmdl, PASS pass);
153
171void assemble_rpush(const CMDLINE *cmdl, PASS pass);
172
191void assemble_rpop(const CMDLINE *cmdl, PASS pass);
192
197
211bool casl2cmd(CMD *cmdtbl, const CMDLINE *cmdl, PASS pass);
212
221bool assemble_comet2cmd(const CMDLINE *cmdl, PASS pass);
222
231bool assembletok(const CMDLINE *cmdl, PASS pass);
232
243bool assembleline(const char *line, PASS pass);
244
248static CERR cerr_assemble[] = {
249 { 106, "operand mismatch in CASL II command" },
250 { 107, "no label in START" },
251 { 108, "not command of operand \"r\"" },
252 { 109, "not command of operand \"r1,r2\"" },
253 { 110, "not command of operand \"r,adr[,x]\"" },
254 { 111, "not command of operand \"adr[,x]\"" },
255 { 112, "not command of no operand" },
256 { 113, "operand too many in COMET II command" },
257 { 119, "out of COMET II memory" },
258 { 120, "GR0 in operand x" },
259 { 122, "cannot create hash table" },
260 { 124, "more than one character in literal" },
261 { 125, "not GR in operand x" },
262};
263
267static CMD ascmd[] = {
268 { "START", assemble_start },
269 { "END", assemble_end },
270 { "DS", assemble_ds },
271 { "DC", assemble_dc },
272 { "", NULL }
273};
274
278static CMD macrocmd[] = {
279 { "OUT", assemble_out },
280 { "IN", assemble_in },
281 { "RPUSH", assemble_rpush },
282 { "RPOP", assemble_rpop },
283 { "", NULL }
284};
285
286ASPTR *asptr = NULL;
287
288ASMODE asmode = {false, false, false, false, false};
289
290void printline(FILE *stream, const char *filename, int lineno, char *line)
291{
292 fprintf(stream, "%s:%5d:%s", filename, lineno, line);
293}
294
295WORD getadr(const char *prog, const char *str, PASS pass)
296{
297 WORD adr = 0;
298
299 if(str[0] == '=') {
300 adr = getliteral(str, pass);
301 } else if(isdigit(str[0]) || str[0] == '-' || str[0] == '#') {
302 adr = nh2word(str);
303 } else {
304 if(pass == SECOND) {
305 if((adr = getlabel(prog, str)) == 0xFFFF) {
306 setcerr(103, str); /* label not found */
307 }
308 }
309 }
310 return adr;
311}
312
313WORD grword(const char *str, bool is_x)
314{
315 WORD r = 0;
316
317 /* "GR[0-7]" 以外の文字列では、0xFFFFを返して終了 */
318 if(strlen(str) != 3 ||
319 strncmp(str, "GR", 2) != 0 ||
320 str[2] < '0' || str[2] > '0' + (GRSIZE - 1))
321 {
322 return 0xFFFF;
323 }
324 r = (WORD)(str[2] - '0');
325 /* GR0は指標レジスタとして用いることができない */
326 if(is_x == true && r == 0x0) {
327 setcerr(120, ""); /* GR0 in operand x */
328 return 0;
329 }
330 return r;
331}
332
333WORD getliteral(const char *str, PASS pass)
334{
335 assert(str[0] == '=');
336 WORD adr = asptr->lptr;
337
338 str++;
339 if(str[0] == '\'') { /* 文字定数 */
340 writestr(str, true, pass);
341 } else {
342 writememory(nh2word(str), (asptr->lptr)++, pass);
343 }
344 return adr;
345}
346
347void writememory(WORD word, WORD adr, PASS pass)
348{
349 char *n = NULL;
350
351 /* メモリオーバーの場合、エラー発生 */
352 if(adr >= sys->memsize) {
353 setcerr(119, (n = word2n(adr))); /* out of COMET II memory */
354 FREE(n)
355 return;
356 }
357 (sys->memory)[adr] = word;
358 if(pass == SECOND && asmode.asdetail == true) {
359 fprintf(stdout, "\t#%04X\t#%04X\n", adr, word);
360 }
361}
362
363void writestr(const char *str, bool literal, PASS pass)
364{
365 assert(str[0] == '\'');
366 bool lw = false;
367
368 /* 「'」の場合、1文字スキップし、次の文字が「'」でなければ正常終了 */
369 for(int i = 1; str[i] != '\'' || str[++i] == '\''; i++) {
370 /* 「'」が閉じないまま文字列が終了した場合はエラー */
371 if(!str[i]) {
372 setcerr(123, str); /* unclosed quote */
373 break;
374 }
375 if(literal == true && lw == true) {
376 setcerr(124, str); /* more than one character in literal */
377 break;
378 }
379 /*リテラルの場合はリテラル領域に書込 */
380 if(literal == true) {
381 writememory(str[i], (asptr->lptr)++, pass);
382 lw = true;
383 } else {
384 writememory(str[i], (asptr->ptr)++, pass);
385 }
386 }
387}
388
389void writedc(const char *str, PASS pass)
390{
391 WORD adr = 0;
392
393 if(*str == '\'') {
394 writestr(str, false, pass);
395 } else {
396 if(str[0] == '#' || isdigit(str[0]) || str[0] == '-') {
397 adr = nh2word(str);
398 } else {
399 if(pass == SECOND && (adr = getlabel(asptr->prog, str)) == 0xFFFF) {
400 setcerr(103, str); /* label not found */
401 }
402 }
403 writememory(adr, (asptr->ptr)++, pass);
404 }
405}
406
407void assemble_start(const CMDLINE *cmdl, PASS pass)
408{
409 if(cmdl->opd->opdc > 1) {
410 setcerr(106, ""); /* operand count mismatch */
411 return;
412 }
413 if(!cmdl->label[0]) {
414 setcerr(107, ""); /* no label in START */
415 return;
416 }
417 /* プログラム名の設定 */
418 strcpy(asptr->prog, cmdl->label);
419 /* オペランドがある場合、書き込みと実行の開始アドレスを設定 */
420 if(cmdl->opd->opdv[0] != NULL) {
421 asptr->ptr = execptr->start = getadr(asptr->prog, cmdl->opd->opdv[0], pass);
422 }
423}
424
425void assemble_end(const CMDLINE *cmdl, PASS pass)
426{
427 if(cmdl->opd->opdc > 0) {
428 setcerr(106, ""); /* operand count mismatch */
429 return;
430 }
431 /* 1回目のアセンブルの場合は、リテラル領域開始アドレスを設定 */
432 if(pass == FIRST) {
433 asptr->lptr = asptr->ptr;
434 }
435 /* 2回目のアセンブルの場合は、リテラル領域終了アドレスを実行終了アドレスとして設定 */
436 else if(pass == SECOND) {
437 execptr->end = asptr->lptr;
438 }
439 strcpy(asptr->prog, "");
440}
441
442void assemble_ds(const CMDLINE *cmdl, PASS pass)
443{
444 if(cmdl->opd->opdc != 1) {
445 setcerr(106, ""); /* operand count mismatch */
446 return;
447 }
448 for(int i = 0; i < atoi(cmdl->opd->opdv[0]); i++) {
449 writememory(0x0, (asptr->ptr)++, pass);
450 if(cerr->num > 0) {
451 break;
452 }
453 }
454}
455
456void assemble_dc(const CMDLINE *cmdl, PASS pass)
457{
458 if(cmdl->opd->opdc == 0 || cmdl->opd->opdc >= OPDSIZE) {
459 setcerr(106, ""); /* operand count mismatch */
460 return;
461 }
462 for(int i = 0; i < cmdl->opd->opdc; i++) {
463 writedc(cmdl->opd->opdv[i], pass);
464 if(cerr->num > 0) {
465 break;
466 }
467 }
468}
469
470void assemble_in(const CMDLINE *cmdl, PASS pass)
471{
472 char *line = malloc_chk(LINESIZE + 1, "assemble_in.line");
473
474 if(cmdl->opd->opdc == 0 || cmdl->opd->opdc > 2) {
475 setcerr(106, ""); /* operand count mismatch */
476 return;
477 }
478 assembleline(" PUSH 0,GR1", pass);
479 assembleline(" PUSH 0,GR2", pass);
480 sprintf(line, " LAD GR1,%s", cmdl->opd->opdv[0]);
481 assembleline(line, pass);
482 sprintf(line, " LAD GR2,%s", cmdl->opd->opdv[1]);
483 assembleline(line, pass);
484 assembleline(" SVC 1", pass);
485 assembleline(" POP GR2", pass);
486 assembleline(" POP GR1", pass);
487 FREE(line);
488}
489
490void assemble_out(const CMDLINE *cmdl, PASS pass)
491{
492 char *line = malloc_chk(LINESIZE + 1, "assemble_out.line");
493
494 if(cmdl->opd->opdc == 0 || cmdl->opd->opdc > 2) {
495 setcerr(106, ""); /* operand count mismatch */
496 return;
497 }
498 assembleline(" PUSH 0,GR1", pass);
499 assembleline(" PUSH 0,GR2", pass);
500 sprintf(line, " LAD GR1,%s", cmdl->opd->opdv[0]);
501 assembleline(line, pass);
502 sprintf(line, " LAD GR2,%s", cmdl->opd->opdv[1]);
503 assembleline(line, pass);
504 assembleline(" SVC 2", pass);
505 assembleline(" LAD GR1,=#A", pass);
506 assembleline(" LAD GR2,=1", pass);
507 assembleline(" SVC 2", pass);
508 assembleline(" POP GR2", pass);
509 assembleline(" POP GR1", pass);
510 FREE(line);
511}
512
513void assemble_rpush(const CMDLINE *cmdl, PASS pass)
514{
515 char *line = malloc_chk(LINESIZE + 1, "assemble_rpush.line");
516
517 if(cmdl->opd->opdc > 0) {
518 setcerr(106, ""); /* operand count mismatch */
519 return;
520 }
521 for(int i = 1; i <= GRSIZE-1; i++) {
522 sprintf(line, " PUSH 0,GR%d", i);
523 assembleline(line, pass);
524 }
525 FREE(line);
526}
527
528void assemble_rpop(const CMDLINE *cmdl, PASS pass)
529{
530 char *line = malloc_chk(LINESIZE + 1, "assemble_rpop.line");
531
532 if(cmdl->opd->opdc > 0) {
533 setcerr(106, ""); /* operand count mismatch */
534 return;
535 }
536 for(int i = GRSIZE-1; i >= 1; i--) {
537 sprintf(line, " POP GR%d", i);
538 assembleline(line, pass);
539 }
540 FREE(line);
541}
542
543bool casl2cmd(CMD *cmdtbl, const CMDLINE *cmdl, PASS pass)
544{
545 void (*cmdptr)(const CMDLINE *, PASS) = NULL;
546
547 for(int i = 0; cmdtbl[i].name[0]; i++) {
548 if(strcmp(cmdl->cmd, cmdtbl[i].name) == 0) {
549 cmdptr = cmdtbl[i].ptr;
550 (*cmdptr)(cmdl, pass);
551 return true;
552 }
553 }
554 return false;
555}
556
557bool assemble_comet2cmd(const CMDLINE *cmdl, PASS pass)
558{
559 WORD cmd = 0;
560 WORD r_r1 = 0;
561 WORD x_r2 = 0;
562 WORD adr = 0;
563
564 /* オペランドなし */
565 if(cmdl->opd->opdc == 0) {
566 if((cmd = getcmdcode(cmdl->cmd, NONE)) == 0xFFFF) {
567 setcerr(112, cmdl->cmd); /* not command of no operand */
568 return false;
569 }
570 writememory(cmd, (asptr->ptr)++, pass);
571 }
572 /* 第1オペランドは汎用レジスタ */
573 else if((r_r1 = grword(cmdl->opd->opdv[0], false)) != 0xFFFF) {
574 /* オペランド数1 */
575 if(cmdl->opd->opdc == 1) {
576 if((cmd = getcmdcode(cmdl->cmd, R_)) == 0xFFFF) {
577 setcerr(108, cmdl->cmd); /* not command of operand "r" */
578 return false;
579 }
580 cmd |= (r_r1 << 4);
581 writememory(cmd, (asptr->ptr)++, pass);
582 }
583 /* オペランド数2。第2オペランドは汎用レジスタ */
584 else if(cmdl->opd->opdc == 2 && (x_r2 = grword(cmdl->opd->opdv[1], false)) != 0xFFFF) {
585 if((cmd = getcmdcode(cmdl->cmd, R1_R2)) == 0xFFFF) {
586 setcerr(109, cmdl->cmd); /* not command of operand "r1,r2" */
587 return false;
588 }
589 cmd |= ((r_r1 << 4) | x_r2); /* 第1オペランド、第2オペランドともに汎用レジスタ */
590 /* メモリへの書き込み */
591 writememory(cmd, (asptr->ptr)++, pass);
592 }
593 /* オペランド数2または3 */
594 else if(cmdl->opd->opdc == 2 || cmdl->opd->opdc == 3) {
595 if((cmd = getcmdcode(cmdl->cmd, R_ADR_X)) == 0xFFFF) {
596 setcerr(110, cmdl->cmd); /* not command of operand "r,adr[,x]" */
597 return false;
598 }
599 cmd |= (r_r1 << 4); /* 第1オペランドは汎用レジスタ */
600 /* オペランド数3の場合 */
601 if(cmdl->opd->opdc == 3) { /* 第3オペランドは指標レジスタとして用いる汎用レジスタ */
602 if((x_r2 = grword(cmdl->opd->opdv[2], true)) == 0xFFFF) {
603 setcerr(125, cmdl->cmd); /* not GR in operand x */
604 return false;
605 }
606 cmd |= x_r2;
607 }
608 adr = getadr(asptr->prog, cmdl->opd->opdv[1], pass); /* 第2オペランドはアドレス */
609 /* メモリへの書き込み */
610 writememory(cmd, (asptr->ptr)++, pass);
611 writememory(adr, (asptr->ptr)++, pass);
612 } else {
613 setcerr(113, cmdl->cmd); /* operand too many in COMET II command */
614 return false;
615 }
616 }
617 /* オペランド数1または2。第1オペランドはアドレス */
618 else if(cmdl->opd->opdc == 1 || cmdl->opd->opdc == 2) {
619 if((cmd = getcmdcode(cmdl->cmd, ADR_X)) == 0xFFFF) {
620 setcerr(111, cmdl->cmd); /* not command of operand "adr[,x]" */
621 return false;
622 }
623 /* オペランド数2の場合 */
624 if(cmdl->opd->opdc == 2) { /* 第2オペランドは指標レジスタとして用いる汎用レジスタ */
625 x_r2 = grword(cmdl->opd->opdv[1], true);
626 if(cerr->num > 0) {
627 return false;
628 }
629 cmd |= x_r2;
630 }
631 /* CALLの場合はプログラムの入口名を表すラベルを取得 */
632 /* CALL以外の命令の場合と、プログラムの入口名を取得できない場合は、 */
633 /* 同一プログラム内のラベルを取得 */
634 if(pass == SECOND && cmd == 0x8000) { /* CALL命令 */
635 adr = getlabel("", cmdl->opd->opdv[0]);
636 }
637 if(cmd != 0x8000 || (pass == SECOND && adr == 0xFFFF)) {
638 adr = getadr(asptr->prog, cmdl->opd->opdv[0], pass);
639 }
640 /* メモリへの書込 */
641 writememory(cmd, (asptr->ptr)++, pass);
642 writememory(adr, (asptr->ptr)++, pass);
643 }
644 return (cerr->num == 0) ? true : false;
645}
646
647bool assembletok(const CMDLINE *cmdl, PASS pass)
648{
649 /* 命令がない場合 */
650 if(!cmdl->cmd[0]) {
651 return true;
652 }
653 /* アセンブラ命令またはマクロ命令の書込 */
654 if(casl2cmd(ascmd, cmdl, pass) == false && casl2cmd(macrocmd, cmdl, pass) == false) {
655 /* 機械語命令の書込 */
656 if(assemble_comet2cmd(cmdl, pass) == false) {
657 if(cerr->num == 0) {
658 setcerr(113, cmdl->cmd); /* operand too many in COMET II command */
659 }
660 }
661 }
662 return (cerr->num == 0) ? true : false;
663}
664
665bool assembleline(const char *line, PASS pass)
666{
667 CMDLINE *cmdl = NULL;
668 bool stat = true;
669
670 cmdl = linetok(line);
671 stat = (cerr->num == 0) ? true : false;
672 if(cmdl != NULL) {
673 if(stat == true) {
674 if(pass == FIRST && cmdl->label[0]) {
675 stat = addlabel(asptr->prog, cmdl->label, asptr->ptr);
676 }
677 }
678 if(stat == true) {
679 stat = assembletok(cmdl, pass);
680 }
681 FREE(cmdl->label);
682 if(cmdl->opd != NULL) {
683 for(int i = 0; i < cmdl->opd->opdc; i++) {
684 FREE(cmdl->opd->opdv[i]);
685 }
686 }
687 FREE(cmdl->opd);
688 FREE(cmdl->cmd);
689 }
690 FREE(cmdl);
691 return stat;
692}
693
699bool assemblefile(const char *file, PASS pass)
700{
701 int lineno = 1;
702 char *line = NULL;
703 FILE *fp = NULL;
704
705 if((fp = fopen(file, "r")) == NULL) {
706 cerr->num = errno;
707 perror(file);
708 return false;
709 }
710 for(line = malloc_chk(LINESIZE + 1, "assemble.line"); fgets(line, LINESIZE, fp); lineno++) {
711 if((pass == FIRST && asmode.src == true) || (pass == SECOND && asmode.asdetail == true)) {
712 printline(stdout, file, lineno, line);
713 }
714 if(assembleline(line, pass) == false) {
715 break;
716 }
717 }
718 if(cerr->num > 0) {
719 fprintf(stderr, "Assemble error - %d: %s\n", cerr->num, cerr->msg);
720 printline(stderr, file, lineno, line);
721 }
722 FREE(line);
723 fclose(fp);
724 return (cerr->num == 0) ? true : false;
725}
726
727bool assemble(int filec, char *filev[], WORD adr)
728{
729 int i;
730 PASS pass;
731 WORD bp[filec];
732 bool stat = false;
733
734 asptr = malloc_chk(sizeof(ASPTR), "asptr"); /* アセンブル時のプロパティ用の領域確保 */
735 asptr->prog = malloc_chk(LABELSIZE + 1, "asptr.prog");
736 asptr->ptr = adr;
737 /* アセンブル。ラベル表作成のため、2回行う */
738 for(pass = FIRST; pass <= SECOND; pass++) {
739 for(i = 0; i < filec; i++) {
740 /* データの格納開始位置 */
741 if(pass == FIRST) {
742 bp[i] = asptr->ptr;
743 } else if(pass == SECOND) {
744 asptr->ptr = bp[i];
745 }
746 if(execmode.trace == true || execmode.dump == true ||
747 asmode.src == true || asmode.label == true || asmode.asdetail == true)
748 {
749 fprintf(stdout, "\nAssemble %s (%d)\n", filev[i], pass);
750 }
751 /* ファイルをアセンブル */
752 stat = assemblefile(filev[i], pass);
753 if(stat == false) {
754 goto asfin;
755 }
756 }
757 if(pass == FIRST && asmode.label == true) {
758 fprintf(stdout, "\nLabel::::\n");
759 printlabel();
760 if(asmode.onlylabel == true) {
761 break;
762 }
763 }
764 }
765asfin:
766 freelabel(); /* ラベルハッシュ表を解放 */
767 FREE(asptr->prog); /* アセンブル時のプロパティを解放 */
768 FREE(asptr);
769 return stat;
770}
771
772/* assemble.hで定義された関数群 */
780
781void outassemble(const char *file)
782{
783 FILE *fp = NULL;
784
785 if((fp = fopen(file, "w")) == NULL) {
786 perror(file);
787 exit(1);
788 }
789 fwrite(sys->memory, sizeof(WORD), execptr->end, fp);
790 fclose(fp);
791}
WORD getadr(const char *prog, const char *str, PASS pass)
アドレスを返す
Definition assemble.c:295
void assemble_start(const CMDLINE *cmdl, PASS pass)
アセンブラ命令STARTの処理
Definition assemble.c:407
void assemble_rpop(const CMDLINE *cmdl, PASS pass)
マクロ命令 "RPOP" をメモリに書き込む
Definition assemble.c:528
bool assemble_comet2cmd(const CMDLINE *cmdl, PASS pass)
システムCOMET IIの命令をアセンブルする
Definition assemble.c:557
bool assembletok(const CMDLINE *cmdl, PASS pass)
トークンをアセンブルする
Definition assemble.c:647
bool assemblefile(const char *file, PASS pass)
指定された名前のファイルをアセンブル
Definition assemble.c:699
void assemble_ds(const CMDLINE *cmdl, PASS pass)
アセンブラ命令DSの処理
Definition assemble.c:442
void assemble_dc(const CMDLINE *cmdl, PASS pass)
アセンブラ命令DCの処理
Definition assemble.c:456
void assemble_out(const CMDLINE *cmdl, PASS pass)
マクロ命令 "OUT OBUF,LEN" をアセンブル
Definition assemble.c:490
void outassemble(const char *file)
ファイルにアセンブル結果を書き込む
Definition assemble.c:781
WORD getliteral(const char *str, PASS pass)
リテラルを返す
Definition assemble.c:333
WORD grword(const char *str, bool is_x)
汎用レジスタを表す文字列からレジスタ番号を返す
Definition assemble.c:313
void printline(FILE *stream, const char *filename, int lineno, char *line)
ファイルストリームの現在行を番号付きで表示する
Definition assemble.c:290
bool assembleline(const char *line, PASS pass)
1行をアセンブルする
Definition assemble.c:665
void addcerrlist_assemble()
アセンブルエラーをエラーリストに追加する
Definition assemble.c:773
static CMD ascmd[]
アセンブラ命令
Definition assemble.c:267
bool casl2cmd(CMD *cmdtbl, const CMDLINE *cmdl, PASS pass)
アセンブラ言語CASL IIの命令を処理する。
Definition assemble.c:543
void writedc(const char *str, PASS pass)
DC命令を書込
Definition assemble.c:389
void assemble_end(const CMDLINE *cmdl, PASS pass)
アセンブラ命令ENDの処理
Definition assemble.c:425
static CERR cerr_assemble[]
アセンブルのエラー
Definition assemble.c:248
static CMD macrocmd[]
マクロ命令
Definition assemble.c:278
void assemble_in(const CMDLINE *cmdl, PASS pass)
マクロ命令 "IN IBUF,LEN" をアセンブル
Definition assemble.c:470
void writememory(WORD word, WORD adr, PASS pass)
アドレス値をメモリに書き込む
Definition assemble.c:347
bool assemble(int filec, char *filev[], WORD adr)
指定された1つまたは複数のファイルを2回アセンブル
Definition assemble.c:727
void assemble_rpush(const CMDLINE *cmdl, PASS pass)
マクロ命令 "RPUSH" をメモリに書き込む
Definition assemble.c:513
void writestr(const char *str, bool literal, PASS pass)
文字をメモリに書き込む
Definition assemble.c:363
PASS
アセンブラが、1回目か2回目かを表す数値
Definition assemble.h:72
@ FIRST
Definition assemble.h:73
@ SECOND
Definition assemble.h:74
void addcerrlist_label()
ラベルのエラーをエラーリストに追加する
Definition label.c:84
bool addlabel(const char *prog, const char *label, WORD adr)
プログラム名、ラベル、アドレスをラベル表に追加する
Definition label.c:106
void printlabel()
ラベル表を表示する
Definition label.c:135
ASMODE asmode
アセンブルモード: src, label, onlylabel, asdetail, onlyassemble
Definition assemble.c:288
ASPTR * asptr
アセンブル時の、現在およびリテラルのアドレスとプログラム入口名: ptr, lptr, prog
Definition assemble.c:286
WORD getlabel(const char *prog, const char *label)
プログラム名とラベルに対応するアドレスをラベル表から検索する
Definition label.c:89
void freelabel()
ラベル表を解放する
Definition label.c:158
CERR * cerr
現在のエラー
Definition cerr.c:9
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
@ GRSIZE
Definition struct.h:17
EXECPTR * execptr
Definition struct.c:12
@ R_
Definition struct.h:93
@ R_ADR_X
Definition struct.h:76
@ ADR_X
Definition struct.h:88
@ NONE
Definition struct.h:97
@ R1_R2
Definition struct.h:82
SYSTEM * sys
COMET IIの仮想実行マシンシステム
Definition struct.c:7
WORD getcmdcode(const char *cmd, CMDTYPE type)
Definition struct.c:153
EXECMODE execmode
実行モード: trace, logical, dump, monitor, step
Definition exec.c:88
アセンブルモードを表すデータ型
Definition assemble.h:18
アセンブル時の現在およびリテラルのアドレスとプログラム入口名を表すデータ型
Definition assemble.h:34
Definition struct.h:103
const void * ptr
Definition struct.h:105
char * name
Definition struct.h:104
命令行を表すデータ型
Definition token.h:41
OPD * opd
Definition token.h:44
char * cmd
Definition token.h:43
char * label
Definition token.h:42
int opdc
Definition token.h:34
char * opdv[OPDSIZE]
Definition token.h:35
CMDLINE * linetok(const char *line)
行から、ラベル・コマンド・オペランドを取得する
Definition token.c:97
void addcerrlist_tok()
トークン取得のエラーを追加する
Definition token.c:91
@ LINESIZE
Definition token.h:26
@ LABELSIZE
Definition token.h:18
@ OPDSIZE
Definition token.h:19
unsigned short WORD
16ビットの数値を表すデータ型
Definition word.h:9
WORD nh2word(const char *str)
10進数または16進数の文字列をWORD値に変換する
Definition word.c:82
void addcerrlist_word()
wordデータ型についてのエラーをエラーリストに追加する
Definition word.c:77
char * word2n(WORD word)
WORD値を10進数値を表す文字列に変換する
Definition word.c:102