82336133842284504213d9c8ff8ada42afb23209
[YACASL2.git] / src / comet2.c
1 #include "casl2.h"
2 #include "exec.h"
3 #define _GNU_SOURCE
4 #include <getopt.h>
5
6 /* comet2コマンドのオプション */
7 static struct option longopts[] = {
8     {"trace", no_argument, NULL, 't'},
9     {"tracearithmetic", no_argument, NULL, 't'},
10     {"tracelogical", no_argument, NULL, 'T'},
11     {"dump", no_argument, NULL, 'd'},
12     {"memorysize", required_argument, NULL, 'M'},
13     {"clocks", required_argument, NULL, 'C'},
14     {"help", no_argument, NULL, 'h'},
15     {0, 0, 0, 0}
16 };
17
18 /* comet2のエラー定義 */
19 CERR cerr_comet2[] = {
20     { 201, "load object file - full of COMET II memory" },
21     { 208, "object file is not specified" },
22 };
23 bool addcerrlist_comet2()
24 {
25     return addcerrlist(ARRAYSIZE(cerr_comet2), cerr_comet2);
26 }
27
28 /* 指定されたファイルからアセンブル結果を読込 */
29 bool loadassemble(char *file) {
30     FILE *fp;
31     bool status = true;
32
33     if((fp = fopen(file, "r")) == NULL) {
34         perror(file);
35         return false;
36     }
37     progprop->end = progprop->start +
38         fread(memory, sizeof(WORD), memsize-progprop->start, fp);
39     if(progprop->end == memsize) {
40         setcerr(201, NULL);    /* Load object file - full of COMET II memory */
41         fprintf(stderr, "Execute error - %d: %s\n", cerr->num, cerr->msg);
42         status = false;
43     }
44     fclose(fp);
45     return status;
46 }
47
48 /* comet2コマンド */
49 int main(int argc, char *argv[])
50 {
51     int opt, retval = 0;
52     const char *usage = "Usage: %s [-tTdh] [-M <MEMORYSIZE>] [-C <CLOCKS>] FILE\n";
53
54     /* エラーの初期化 */
55     cerr = malloc_chk(sizeof(CERR), "cerr");
56     addcerrlist_comet2();
57     /* オプションの処理 */
58     while((opt = getopt_long(argc, argv, "tTdM:C:h", longopts, NULL)) != -1) {
59         switch(opt) {
60         case 't':
61             execmode.trace = true;
62             break;
63         case 'T':
64             execmode.trace = true;
65             execmode.logical = true;
66             break;
67         case 'd':
68             execmode.dump = true;
69             break;
70         case 'M':
71             memsize = atoi(optarg);
72             break;
73         case 'C':
74             clocks = atoi(optarg);
75             break;
76         case 'h':
77             fprintf(stdout, usage, argv[0]);
78             return 0;
79         case '?':
80             fprintf(stderr, usage, argv[0]);
81             exit(-1);
82         }
83     }
84     if(argv[optind] == NULL) {
85         setcerr(208, NULL);    /* object file is not specified */
86         fprintf(stderr, "comet2 error - %d: %s\n", cerr->num, cerr->msg);
87         exit(-1);
88     }
89     reset();
90     progprop->start = 0;
91     if(loadassemble(argv[optind]) == true) {
92         create_code_type();    /* 命令と命令タイプがキーのハッシュ表を作成 */
93         exec();                /* プログラム実行 */
94         free_code_type();      /* 命令と命令タイプがキーのハッシュ表を解放 */
95     }
96     /* COMET II仮想マシンのシャットダウン */
97     shutdown();
98     if(cerr->num > 0) {
99         retval = -1;
100     }
101     /* エラーの解放 */
102     freecerr();
103     return retval;
104 }