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