YACASL2
Loading...
Searching...
No Matches
assemble.c
Go to the documentation of this file.
1#include "assemble.h"
2#include <stdio.h>
3#include <stdlib.h>
4#include <string.h>
5#include <ctype.h>
6#include <assert.h>
7#include <errno.h>
8
17void printline(FILE *stream, const char *filename, int lineno, char *line);
18
30WORD getadr(const char *prog, const char *str, PASS pass);
31
42WORD grword(const char *str, bool is_x);
43
52WORD getliteral(const char *str, PASS pass);
53
62WORD getliteralquote(const char *str);
63
71void writememory(WORD word, WORD adr, PASS pass);
72
79void writestr(const char *str, PASS pass);
80
87void writedc(const char *str, PASS pass);
88
96void assemble_start(const CMDLINE *cmdl, PASS pass);
97
105void assemble_ds(const CMDLINE *cmdl, PASS pass);
106
114void assemble_end(const CMDLINE *cmdl, PASS pass);
115
123void assemble_dc(const CMDLINE *cmdl, PASS pass);
124
143void assemble_in(const CMDLINE *cmdl, PASS pass);
144
165void assemble_out(const CMDLINE *cmdl, PASS pass);
166
184void assemble_rpush(const CMDLINE *cmdl, PASS pass);
185
203void assemble_rpop(const CMDLINE *cmdl, PASS pass);
204
209
223bool casl2cmd(CMD *cmdtbl, const CMDLINE *cmdl, PASS pass);
224
233bool assemble_comet2cmd(const CMDLINE *cmdl, PASS pass);
234
243bool assembletok(const CMDLINE *cmdl, PASS pass);
244
255bool assembleline(const char *line, PASS pass);
256
260static CERR cerr_assemble[] = {
261 { 106, "operand mismatch in CASL II command" },
262 { 107, "no label in START" },
263 { 108, "not command of operand \"r\"" },
264 { 109, "not command of operand \"r1,r2\"" },
265 { 110, "not command of operand \"r,adr[,x]\"" },
266 { 111, "not command of operand \"adr[,x]\"" },
267 { 112, "not command of no operand" },
268 { 113, "operand too many in COMET II command" },
269 { 119, "out of COMET II memory" },
270 { 120, "GR0 in operand x" },
271 { 122, "cannot create hash table" },
272 { 124, "more than one character in literal" },
273 { 125, "not GR in operand x" },
274 { 126, "syntax error in character constant. In CASL II, two consecutive apostrophes ('') represent a single apostrophe (')." },
275 { 127, "empty character constant" },
276};
277
281static CMD ascmd[] = {
282 { "START", assemble_start },
283 { "END", assemble_end },
284 { "DS", assemble_ds },
285 { "DC", assemble_dc },
286 { "", NULL }
287};
288
292static CMD macrocmd[] = {
293 { "OUT", assemble_out },
294 { "IN", assemble_in },
295 { "RPUSH", assemble_rpush },
296 { "RPOP", assemble_rpop },
297 { "", NULL }
298};
299
300ASPTR *asptr = NULL;
301
302ASMODE asmode = {false, false, false, false, false};
303
304void printline(FILE *stream, const char *filename, int lineno, char *line)
305{
306 fprintf(stream, "%s:%5d:%s", filename, lineno, line);
307}
308
309WORD getadr(const char *prog, const char *str, PASS pass)
310{
311 WORD adr = 0;
312
313 if(str[0] == '=') {
314 adr = getliteral(str, pass);
315 } else if(isdigit(str[0]) || str[0] == '-' || str[0] == '#') {
316 adr = nh2word(str);
317 } else {
318 if(pass == SECOND) {
319 if((adr = getlabel(prog, str)) == 0xFFFF) {
320 adr = getlabel("", str);
321 }
322 if(adr == 0xFFFF) {
323 setcerr(103, str); /* label not found */
324 }
325 }
326 }
327 return adr;
328}
329
330WORD grword(const char *str, bool is_x)
331{
332 WORD r = 0;
333
334 /* "GR[0-7]" 以外の文字列では、0xFFFFを返して終了 */
335 if(strlen(str) != 3 ||
336 strncmp(str, "GR", 2) != 0 ||
337 str[2] < '0' || str[2] > '0' + (GRSIZE - 1))
338 {
339 return 0xFFFF;
340 }
341 r = (WORD)(str[2] - '0');
342 /* GR0は指標レジスタとして用いることができない */
343 if(is_x == true && r == 0x0) {
344 setcerr(120, ""); /* GR0 in operand x */
345 return 0;
346 }
347 return r;
348}
349
350WORD getliteral(const char *str, PASS pass)
351{
352 assert(str[0] == '=');
353 str++;
354 WORD val = 0;
355 WORD adr = 0;
356
357 if(str[0] == '\'') {
358 val = getliteralquote(str);
359 } else {
360 val = nh2word(str);
361 }
362 if(cerr->num == 0) {
363 /* PASS FIRSTでは、lptrがまだ確定していない(ENDで初めて確定する)ため、
364 * 重複排除の登録・検索は行わず、従来通りダミーの書き込みのみ行う */
365 if(pass == FIRST) {
366 adr = asptr->lptr;
367 writememory(val, (asptr->lptr)++, pass);
368 } else {
369 /* PASS SECONDでは、lptrはEND処理で正しく確定済みなので、重複排除が有効 */
370 char llabel[LITERALSIZE + 1];
371 sprintf(llabel, "=%04X", val);
372 adr = getlabel("", llabel);
373 if(adr == 0xFFFF) {
374 adr = asptr->lptr;
375 writememory(val, (asptr->lptr)++, pass);
376 addlabel("", llabel, adr);
377 }
378 }
379 }
380 return adr;
381}
382
383WORD getliteralquote(const char *str)
384{
385 assert(str[0] == '\'');
386 size_t len = strlen(str);
387 WORD val = 0;
388 if(str[1] == '\'' && len == 2) {
389 setcerr(127, str); /* empty character constant */
390 } else if (len == 1 || str[len - 1] != '\'') {
391 setcerr(123, str); /* unclosed quote */
392 } else if((str[1] != '\'' && len > 3) || (str[1] == '\'' && len > 4)) {
393 setcerr(124, str); /* more than one character in literal */
394 } else if(str[1] == '\'' && len == 3 && str[2] == '\'') {
395 setcerr(126, str); /* syntax error in character constant. In CASL II, two consecutive apostrophes ('') represent a single apostrophe ('). */
396 } else {
397 val = (WORD)str[1];
398 }
399 return val;
400}
401
402void writememory(WORD word, WORD adr, PASS pass)
403{
404 char *n = NULL;
405
406 /* メモリオーバーの場合、エラー発生 */
407 if(adr >= sys->memsize) {
408 setcerr(119, (n = word2n(adr))); /* out of COMET II memory */
409 FREE(n);
410 return;
411 }
412 (sys->memory)[adr] = word;
413 if(pass == SECOND && asmode.asdetail == true) {
414 fprintf(stdout, "\t#%04X\t#%04X\n", adr, word);
415 }
416}
417
418void writestr(const char *str, PASS pass)
419{
420 assert(str[0] == '\'');
421
422 /* 空文字列(DC '')はエラー */
423 if(str[1] == '\'' && str[2] == '\0') {
424 setcerr(127, str); /* empty character constant */
425 } else {
426 int i = 1;
427 do {
428 if(str[i] == '\0') {
429 /* 閉じクォートがないまま文字列が終了の場合 */
430 setcerr(123, str); /* unclosed quote */
431 break;
432 }
433 if(str[i] == '\'') {
434 if(str[i + 1] != '\0' && str[i + 1] != '\'') {
435 setcerr(126, str); /* syntax error in character constant. In CASL II, two consecutive apostrophes ('') represent a single apostrophe ('). */
436 break;
437 } else if(str[i + 1] == '\0') {
438 break; /* 正常終了 */
439 } else {
440 /* エスケープされたアポストロフィ:1文字として書き込み、2文字分進める */
441 writememory('\'', (asptr->ptr)++, pass);
442 i += 2;
443 }
444 } else {
445 writememory(str[i++], (asptr->ptr)++, pass);
446 }
447 } while(1);
448 }
449}
450
451void writedc(const char *str, PASS pass)
452{
453 WORD adr = 0;
454
455 if(*str == '\'') {
456 writestr(str, pass);
457 } else {
458 if(str[0] == '#' || isdigit(str[0]) || str[0] == '-') {
459 adr = nh2word(str);
460 } else {
461 if(pass == SECOND && (adr = getlabel(asptr->prog, str)) == 0xFFFF) {
462 adr = getlabel("", str);
463 }
464 if(pass == SECOND && adr == 0xFFFF) {
465 setcerr(103, str); /* label not found */
466 }
467 }
468 writememory(adr, (asptr->ptr)++, pass);
469 }
470}
471
472void assemble_start(const CMDLINE *cmdl, PASS pass)
473{
474 if(cmdl->opd->opdc > 1) {
475 setcerr(106, ""); /* operand count mismatch */
476 return;
477 }
478 if(!cmdl->label[0]) {
479 setcerr(107, ""); /* no label in START */
480 return;
481 }
482 /* プログラム名の設定 */
483 strcpy(asptr->prog, cmdl->label);
484 /* オペランドがある場合、書き込みと実行の開始アドレスを設定 */
485 if(cmdl->opd->opdv[0] != NULL) {
486 asptr->ptr = execptr->start = getadr(asptr->prog, cmdl->opd->opdv[0], pass);
487 }
488}
489
490void assemble_end(const CMDLINE *cmdl, PASS pass)
491{
492 if(cmdl->opd->opdc > 0) {
493 setcerr(106, ""); /* operand count mismatch */
494 return;
495 }
496 /* 1回目のアセンブルの場合は、リテラル領域開始アドレスを設定 */
497 if(pass == FIRST) {
498 asptr->lptr = asptr->ptr;
499 }
500 /* 2回目のアセンブルの場合は、リテラル領域終了アドレスを実行終了アドレスとして設定 */
501 else if(pass == SECOND) {
502 execptr->end = asptr->lptr;
503 }
504 strcpy(asptr->prog, "");
505}
506
507void assemble_ds(const CMDLINE *cmdl, PASS pass)
508{
509 if(cmdl->opd->opdc != 1) {
510 setcerr(106, ""); /* operand count mismatch */
511 return;
512 }
513 for(int i = 0; i < atoi(cmdl->opd->opdv[0]); i++) {
514 writememory(0x0, (asptr->ptr)++, pass);
515 if(cerr->num > 0) {
516 break;
517 }
518 }
519}
520
521void assemble_dc(const CMDLINE *cmdl, PASS pass)
522{
523 if(cmdl->opd->opdc == 0 || cmdl->opd->opdc >= OPDSIZE) {
524 setcerr(106, ""); /* operand count mismatch */
525 return;
526 }
527 for(int i = 0; i < cmdl->opd->opdc; i++) {
528 writedc(cmdl->opd->opdv[i], pass);
529 if(cerr->num > 0) {
530 break;
531 }
532 }
533}
534
535void assemble_in(const CMDLINE *cmdl, PASS pass)
536{
537 char *line = malloc_chk(LINESIZE + 1, "assemble_in.line");
538
539 if(cmdl->opd->opdc == 0 || cmdl->opd->opdc > 2) {
540 setcerr(106, ""); /* operand count mismatch */
541 return;
542 }
543 assembleline(" PUSH 0,GR1", pass);
544 assembleline(" PUSH 0,GR2", pass);
545 sprintf(line, " LAD GR1,%s", cmdl->opd->opdv[0]);
546 assembleline(line, pass);
547 sprintf(line, " LAD GR2,%s", cmdl->opd->opdv[1]);
548 assembleline(line, pass);
549 assembleline(" SVC 1", pass);
550 assembleline(" POP GR2", pass);
551 assembleline(" POP GR1", pass);
552 FREE(line);
553}
554
555void assemble_out(const CMDLINE *cmdl, PASS pass)
556{
557 char *line = malloc_chk(LINESIZE + 1, "assemble_out.line");
558
559 if(cmdl->opd->opdc == 0 || cmdl->opd->opdc > 2) {
560 setcerr(106, ""); /* operand count mismatch */
561 return;
562 }
563 assembleline(" PUSH 0,GR1", pass);
564 assembleline(" PUSH 0,GR2", pass);
565 sprintf(line, " LAD GR1,%s", cmdl->opd->opdv[0]);
566 assembleline(line, pass);
567 sprintf(line, " LAD GR2,%s", cmdl->opd->opdv[1]);
568 assembleline(line, pass);
569 assembleline(" SVC 2", pass);
570 assembleline(" LAD GR1,=#A", pass);
571 assembleline(" LAD GR2,=1", pass);
572 assembleline(" SVC 2", pass);
573 assembleline(" POP GR2", pass);
574 assembleline(" POP GR1", pass);
575 FREE(line);
576}
577
578void assemble_rpush(const CMDLINE *cmdl, PASS pass)
579{
580 char *line = malloc_chk(LINESIZE + 1, "assemble_rpush.line");
581
582 if(cmdl->opd->opdc > 0) {
583 setcerr(106, ""); /* operand count mismatch */
584 return;
585 }
586 for(int i = 1; i <= GRSIZE-1; i++) {
587 sprintf(line, " PUSH 0,GR%d", i);
588 assembleline(line, pass);
589 }
590 FREE(line);
591}
592
593void assemble_rpop(const CMDLINE *cmdl, PASS pass)
594{
595 char *line = malloc_chk(LINESIZE + 1, "assemble_rpop.line");
596
597 if(cmdl->opd->opdc > 0) {
598 setcerr(106, ""); /* operand count mismatch */
599 return;
600 }
601 for(int i = GRSIZE-1; i >= 1; i--) {
602 sprintf(line, " POP GR%d", i);
603 assembleline(line, pass);
604 }
605 FREE(line);
606}
607
608bool casl2cmd(CMD *cmdtbl, const CMDLINE *cmdl, PASS pass)
609{
610 void (*cmdptr)(const CMDLINE *, PASS) = NULL;
611
612 for(int i = 0; cmdtbl[i].name[0]; i++) {
613 if(strcmp(cmdl->cmd, cmdtbl[i].name) == 0) {
614 cmdptr = cmdtbl[i].ptr;
615 (*cmdptr)(cmdl, pass);
616 return true;
617 }
618 }
619 return false;
620}
621
622bool assemble_comet2cmd(const CMDLINE *cmdl, PASS pass)
623{
624 WORD cmd = 0;
625 WORD r_r1 = 0;
626 WORD x_r2 = 0;
627 WORD adr = 0;
628
629 /* オペランドなし */
630 if(cmdl->opd->opdc == 0) {
631 if((cmd = getcmdcode(cmdl->cmd, NONE)) == 0xFFFF) {
632 setcerr(112, cmdl->cmd); /* not command of no operand */
633 return false;
634 }
635 writememory(cmd, (asptr->ptr)++, pass);
636 }
637 /* 第1オペランドは汎用レジスタ */
638 else if((r_r1 = grword(cmdl->opd->opdv[0], false)) != 0xFFFF) {
639 /* オペランド数1 */
640 if(cmdl->opd->opdc == 1) {
641 if((cmd = getcmdcode(cmdl->cmd, R_)) == 0xFFFF) {
642 setcerr(108, cmdl->cmd); /* not command of operand "r" */
643 return false;
644 }
645 cmd |= (r_r1 << 4);
646 writememory(cmd, (asptr->ptr)++, pass);
647 }
648 /* オペランド数2。第2オペランドは汎用レジスタ */
649 else if(cmdl->opd->opdc == 2 && (x_r2 = grword(cmdl->opd->opdv[1], false)) != 0xFFFF) {
650 if((cmd = getcmdcode(cmdl->cmd, R1_R2)) == 0xFFFF) {
651 setcerr(109, cmdl->cmd); /* not command of operand "r1,r2" */
652 return false;
653 }
654 cmd |= ((r_r1 << 4) | x_r2); /* 第1オペランド、第2オペランドともに汎用レジスタ */
655 /* メモリへの書き込み */
656 writememory(cmd, (asptr->ptr)++, pass);
657 }
658 /* オペランド数2または3 */
659 else if(cmdl->opd->opdc == 2 || cmdl->opd->opdc == 3) {
660 if((cmd = getcmdcode(cmdl->cmd, R_ADR_X)) == 0xFFFF) {
661 setcerr(110, cmdl->cmd); /* not command of operand "r,adr[,x]" */
662 return false;
663 }
664 cmd |= (r_r1 << 4); /* 第1オペランドは汎用レジスタ */
665 /* オペランド数3の場合 */
666 if(cmdl->opd->opdc == 3) { /* 第3オペランドは指標レジスタとして用いる汎用レジスタ */
667 if((x_r2 = grword(cmdl->opd->opdv[2], true)) == 0xFFFF) {
668 setcerr(125, cmdl->cmd); /* not GR in operand x */
669 return false;
670 }
671 cmd |= x_r2;
672 }
673 adr = getadr(asptr->prog, cmdl->opd->opdv[1], pass); /* 第2オペランドはアドレス */
674 /* メモリへの書き込み */
675 writememory(cmd, (asptr->ptr)++, pass);
676 writememory(adr, (asptr->ptr)++, pass);
677 } else {
678 setcerr(113, cmdl->cmd); /* operand too many in COMET II command */
679 return false;
680 }
681 }
682 /* オペランド数1または2。第1オペランドはアドレス */
683 else if(cmdl->opd->opdc == 1 || cmdl->opd->opdc == 2) {
684 if((cmd = getcmdcode(cmdl->cmd, ADR_X)) == 0xFFFF) {
685 setcerr(111, cmdl->cmd); /* not command of operand "adr[,x]" */
686 return false;
687 }
688 /* オペランド数2の場合 */
689 if(cmdl->opd->opdc == 2) { /* 第2オペランドは指標レジスタとして用いる汎用レジスタ */
690 x_r2 = grword(cmdl->opd->opdv[1], true);
691 if(cerr->num > 0) {
692 return false;
693 }
694 cmd |= x_r2;
695 }
696 /* CALLの場合はプログラムの入口名を表すラベルを取得 */
697 /* CALL以外の命令の場合と、プログラムの入口名を取得できない場合は、 */
698 /* 同一プログラム内のラベルを取得 */
699 if(pass == SECOND && cmd == 0x8000) { /* CALL命令 */
700 adr = getlabel("", cmdl->opd->opdv[0]);
701 }
702 if(cmd != 0x8000 || (pass == SECOND && adr == 0xFFFF)) {
703 adr = getadr(asptr->prog, cmdl->opd->opdv[0], pass);
704 }
705 /* メモリへの書込 */
706 writememory(cmd, (asptr->ptr)++, pass);
707 writememory(adr, (asptr->ptr)++, pass);
708 }
709 return (cerr->num == 0) ? true : false;
710}
711
712bool assembletok(const CMDLINE *cmdl, PASS pass)
713{
714 /* 命令がない場合 */
715 if(!cmdl->cmd[0]) {
716 return true;
717 }
718 /* アセンブラ命令またはマクロ命令の書込 */
719 if(casl2cmd(ascmd, cmdl, pass) == false && casl2cmd(macrocmd, cmdl, pass) == false) {
720 /* 機械語命令の書込 */
721 if(assemble_comet2cmd(cmdl, pass) == false) {
722 if(cerr->num == 0) {
723 setcerr(113, cmdl->cmd); /* operand too many in COMET II command */
724 }
725 }
726 }
727 return (cerr->num == 0) ? true : false;
728}
729
730bool assembleline(const char *line, PASS pass)
731{
732 CMDLINE *cmdl = NULL;
733 bool stat = true;
734
735 cmdl = linetok(line);
736 stat = (cerr->num == 0) ? true : false;
737 if(cmdl != NULL) {
738 if(stat == true) {
739 if(pass == FIRST && cmdl->label[0]) {
740 stat = addlabel(asptr->prog, cmdl->label, asptr->ptr);
741 }
742 }
743 if(stat == true) {
744 stat = assembletok(cmdl, pass);
745 }
746 FREE(cmdl->label);
747 if(cmdl->opd != NULL) {
748 for(int i = 0; i < cmdl->opd->opdc; i++) {
749 FREE(cmdl->opd->opdv[i]);
750 }
751 }
752 FREE(cmdl->opd);
753 FREE(cmdl->cmd);
754 }
755 FREE(cmdl);
756 return stat;
757}
758
764bool assemblefile(const char *file, PASS pass)
765{
766 int lineno = 1;
767 char *line = NULL;
768 FILE *fp = NULL;
769
770 if((fp = fopen(file, "r")) == NULL) {
771 cerr->num = errno;
772 perror(file);
773 return false;
774 }
775 for(line = malloc_chk(LINESIZE + 1, "assemble.line"); fgets(line, LINESIZE, fp); lineno++) {
776 if((pass == FIRST && asmode.src == true) || (pass == SECOND && asmode.asdetail == true)) {
777 printline(stdout, file, lineno, line);
778 }
779 if(assembleline(line, pass) == false) {
780 break;
781 }
782 }
783 if(cerr->num > 0) {
784 fprintf(stderr, "Assemble error - %d: %s\n", cerr->num, cerr->msg);
785 printline(stderr, file, lineno, line);
786 }
787 FREE(line);
788 fclose(fp);
789 return (cerr->num == 0) ? true : false;
790}
791
792bool assemble(int filec, char *filev[], WORD adr)
793{
794 int i;
795 PASS pass;
796 WORD bp[filec];
797 bool stat = false;
798
799 asptr = malloc_chk(sizeof(ASPTR), "asptr"); /* アセンブル時のプロパティ用の領域確保 */
800 asptr->prog = malloc_chk(LABELSIZE + 1, "asptr.prog");
801 asptr->ptr = adr;
802 /* アセンブル。ラベル表作成のため、2回行う */
803 for(pass = FIRST; pass <= SECOND; pass++) {
804 for(i = 0; i < filec; i++) {
805 /* データの格納開始位置 */
806 if(pass == FIRST) {
807 bp[i] = asptr->ptr;
808 } else if(pass == SECOND) {
809 asptr->ptr = bp[i];
810 }
811 if(execmode.trace == true || execmode.dump == true ||
812 asmode.src == true || asmode.label == true || asmode.asdetail == true)
813 {
814 fprintf(stdout, "\nAssemble %s (%d)\n", filev[i], pass);
815 }
816 /* ファイルをアセンブル */
817 stat = assemblefile(filev[i], pass);
818 if(stat == false) {
819 goto asfin;
820 }
821 }
822 if(asmode.label == true) {
823 if(pass == FIRST) {
824 printlabel();
825 if(asmode.onlylabel == true) {
826 break;
827 }
828 }
829 if(pass == SECOND) {
830 printliteral();
831 }
832 }
833 }
834asfin:
835 freelabel(); /* ラベルハッシュ表を解放 */
836 FREE(asptr->prog); /* アセンブル時のプロパティを解放 */
837 FREE(asptr);
838 return stat;
839}
840
841/* assemble.hで定義された関数群 */
849
850void outassemble(const char *file)
851{
852 FILE *fp = NULL;
853
854 if((fp = fopen(file, "w")) == NULL) {
855 perror(file);
856 exit(1);
857 }
858 fwrite(sys->memory, sizeof(WORD), execptr->end, fp);
859 fclose(fp);
860}
WORD getadr(const char *prog, const char *str, PASS pass)
アドレスを返す
Definition assemble.c:309
void assemble_start(const CMDLINE *cmdl, PASS pass)
アセンブラ命令STARTの処理
Definition assemble.c:472
void assemble_rpop(const CMDLINE *cmdl, PASS pass)
マクロ命令 "RPOP" をメモリに書き込む
Definition assemble.c:593
bool assemble_comet2cmd(const CMDLINE *cmdl, PASS pass)
システムCOMET IIの命令をアセンブルする
Definition assemble.c:622
bool assembletok(const CMDLINE *cmdl, PASS pass)
トークンをアセンブルする
Definition assemble.c:712
bool assemblefile(const char *file, PASS pass)
指定された名前のファイルをアセンブル
Definition assemble.c:764
void writestr(const char *str, PASS pass)
文字をメモリに書き込む
Definition assemble.c:418
void assemble_ds(const CMDLINE *cmdl, PASS pass)
アセンブラ命令DSの処理
Definition assemble.c:507
void assemble_dc(const CMDLINE *cmdl, PASS pass)
アセンブラ命令DCの処理
Definition assemble.c:521
void assemble_out(const CMDLINE *cmdl, PASS pass)
マクロ命令 "OUT OBUF,LEN" をアセンブル
Definition assemble.c:555
void outassemble(const char *file)
ファイルにアセンブル結果を書き込む
Definition assemble.c:850
WORD getliteral(const char *str, PASS pass)
リテラルを返す
Definition assemble.c:350
WORD grword(const char *str, bool is_x)
汎用レジスタを表す文字列からレジスタ番号を返す
Definition assemble.c:330
void printline(FILE *stream, const char *filename, int lineno, char *line)
ファイルストリームの現在行を番号付きで表示する
Definition assemble.c:304
bool assembleline(const char *line, PASS pass)
1行をアセンブルする
Definition assemble.c:730
void addcerrlist_assemble()
アセンブルエラーをエラーリストに追加する
Definition assemble.c:842
WORD getliteralquote(const char *str)
'ではじまる文字列からWORD値を返す
Definition assemble.c:383
static CMD ascmd[]
アセンブラ命令
Definition assemble.c:281
bool casl2cmd(CMD *cmdtbl, const CMDLINE *cmdl, PASS pass)
アセンブラ言語CASL IIの命令を処理する。
Definition assemble.c:608
void writedc(const char *str, PASS pass)
DC命令を書込
Definition assemble.c:451
void assemble_end(const CMDLINE *cmdl, PASS pass)
アセンブラ命令ENDの処理
Definition assemble.c:490
static CERR cerr_assemble[]
アセンブルのエラー
Definition assemble.c:260
static CMD macrocmd[]
マクロ命令
Definition assemble.c:292
void assemble_in(const CMDLINE *cmdl, PASS pass)
マクロ命令 "IN IBUF,LEN" をアセンブル
Definition assemble.c:535
void writememory(WORD word, WORD adr, PASS pass)
アドレス値をメモリに書き込む
Definition assemble.c:402
bool assemble(int filec, char *filev[], WORD adr)
指定された1つまたは複数のファイルを2回アセンブル
Definition assemble.c:792
void assemble_rpush(const CMDLINE *cmdl, PASS pass)
マクロ命令 "RPUSH" をメモリに書き込む
Definition assemble.c:578
PASS
アセンブラが、1回目か2回目かを表す数値
Definition assemble.h:67
@ FIRST
Definition assemble.h:68
@ SECOND
Definition assemble.h:69
void addcerrlist_label()
ラベルのエラーをエラーリストに追加する
Definition label.c:122
bool addlabel(const char *prog, const char *label, WORD adr)
プログラム名、ラベル、アドレスをラベル表に追加する
Definition label.c:144
void printlabel()
ラベル表を表示する
Definition label.c:173
ASMODE asmode
アセンブルモード: src, label, onlylabel, asdetail, onlyassemble
Definition assemble.c:302
ASPTR * asptr
アセンブル時の、現在およびリテラルのアドレスとプログラム入口名: ptr, lptr, prog
Definition assemble.c:300
WORD getlabel(const char *prog, const char *label)
プログラム名とラベルに対応するアドレスをラベル表から検索する
Definition label.c:127
void printliteral()
リテラルを表示する
Definition label.c:178
void freelabel()
ラベル表を解放する
Definition label.c:183
CERR * cerr
現在のエラー
Definition cerr.c:10
struct _CERR CERR
エラーを表すデータ型
void addcerrlist(int cerrc, CERR cerrv[])
エラーリストを作成・追加する
Definition cerr.c:14
void setcerr(int num, const char *str)
現在のエラーを設定する
Definition cerr.c:46
#define FREE(ptr)
メモリを解放するマクロ
Definition cmem.h:22
void * malloc_chk(size_t size, const char *tag)
mallocを実行し、0で初期化する
Definition cmem.c:23
#define ARRAYSIZE(array)
配列のサイズを返すマクロ
Definition cmem.h:15
@ GRSIZE
Definition struct.h:19
EXECPTR * execptr
Definition struct.c:13
@ R_
Definition struct.h:97
@ R_ADR_X
Definition struct.h:80
@ ADR_X
Definition struct.h:92
@ NONE
Definition struct.h:101
@ R1_R2
Definition struct.h:86
SYSTEM * sys
COMET IIの仮想実行マシンシステム
Definition struct.c:8
WORD getcmdcode(const char *cmd, CMDTYPE type)
Definition struct.c:164
EXECMODE execmode
実行モード: trace, logical, dump, reverse, monitor, step
Definition exec.c:90
アセンブルモードを表すデータ型
Definition assemble.h:13
アセンブル時の現在およびリテラルのアドレスとプログラム入口名を表すデータ型
Definition assemble.h:29
Definition struct.h:107
void * ptr
Definition struct.h:109
char * name
Definition struct.h:108
命令行を表すデータ型
Definition token.h:42
OPD * opd
Definition token.h:45
char * cmd
Definition token.h:44
char * label
Definition token.h:43
int opdc
Definition token.h:35
char * opdv[OPDSIZE]
Definition token.h:36
CMDLINE * linetok(const char *line)
行から、ラベル・コマンド・オペランドを取得する
Definition token.c:97
void addcerrlist_tok()
トークン取得のエラーを追加する
Definition token.c:91
@ LINESIZE
Definition token.h:27
@ LABELSIZE
Definition token.h:18
@ LITERALSIZE
Definition token.h:20
@ 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