オプション修正。dumpmemoryで開始、終了のアドレスを指定できるように
[YACASL2.git] / src / comet2.c
1 #include "package.h"
2 #include "exec.h"
3
4 /**
5  * comet2コマンドのオプション
6  */
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     {"debug", no_argument, NULL, 'b'},
13     {"monitor", no_argument, NULL, 'm'},
14     {"memorysize", required_argument, NULL, 'M'},
15     {"clocks", required_argument, NULL, 'C'},
16     { "version", no_argument, NULL, 'v' },
17     {"help", no_argument, NULL, 'h'},
18     {0, 0, 0, 0},
19 };
20
21 /**
22  * @brief comet2コマンドのメイン
23  *
24  * @return 正常終了時は0、異常終了時は1
25  *
26  * @param argc コマンドライン引数の数
27  * @param *argv[] コマンドライン引数の配列
28  */
29 int main(int argc, char *argv[])
30 {
31     int memsize = DEFAULT_MEMSIZE, clocks = DEFAULT_CLOCKS;
32     int opt, stat = 0;
33     const char *version = PACKAGE_VERSION,  *cmdversion = "comet2 of YACASL2 version %s\n";
34     const char *usage = "Usage: %s [-tTdmvh] [-M <MEMORYSIZE>] [-C <CLOCKS>] FILE\n";
35
36     /* オプションの処理 */
37     while((opt = getopt_long(argc, argv, "tTdmM:C:vh", longopts, NULL)) != -1) {
38         switch(opt) {
39         case 't':
40             execmode.trace = true;
41             break;
42         case 'T':
43             execmode.trace = true;
44             execmode.logical = true;
45             break;
46         case 'd':
47             execmode.dump = true;
48             break;
49         case 'm':
50             execmode.step = true;
51             break;
52         case 'M':
53             memsize = atoi(optarg);
54             break;
55         case 'C':
56             clocks = atoi(optarg);
57             break;
58         case 'v':
59             fprintf(stdout, cmdversion, version);
60             return 0;
61         case 'h':
62             fprintf(stdout, usage, argv[0]);
63             return 0;
64         case '?':
65             fprintf(stderr, usage, argv[0]);
66             exit(1);
67         }
68     }
69     /* エラーの定義 */
70     cerr_init();
71     addcerrlist_load();
72     addcerrlist_exec();
73
74     if(argv[optind] == NULL) {
75         setcerr(211, "");    /* object file not specified */
76         fprintf(stderr, "comet2 error - %d: %s\n", cerr->num, cerr->msg);
77         freecerr();             /* エラーの解放 */
78         exit(1);
79     }
80
81     /* COMET II仮想マシンのリセット */
82     reset(memsize, clocks);
83     execptr->start = 0;
84     if(loadassemble(argv[optind]) == true) {
85         exec();                /* プログラム実行 */
86     }
87     /* COMET II仮想マシンのシャットダウン */
88     shutdown();
89     stat = (cerr->num == 0) ? 0 : 1;
90     freecerr();                 /* エラーの解放 */
91     return stat;
92 }