af4bfb84d1a6e3d535b51fac05c87ccb02c71116
[YACASL2.git] / src / comet2.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #define _GNU_SOURCE
4 #include <getopt.h>
5
6 #include "exec.h"
7 #include "cmem.h"
8 #include "cerr.h"
9
10 /**
11  * comet2コマンドのオプション
12  */
13 static struct option longopts[] = {
14     {"trace", no_argument, NULL, 't'},
15     {"tracearithmetic", no_argument, NULL, 't'},
16     {"tracelogical", no_argument, NULL, 'T'},
17     {"dump", no_argument, NULL, 'd'},
18     {"memorysize", required_argument, NULL, 'M'},
19     {"clocks", required_argument, NULL, 'C'},
20     {"help", no_argument, NULL, 'h'},
21     {0, 0, 0, 0},
22 };
23
24 /**
25  * comet2コマンドのメイン
26  */
27 int main(int argc, char *argv[])
28 {
29     int memsize = DEFAULT_MEMSIZE, clocks = DEFAULT_CLOCKS;
30     int opt, status = 0;
31     const char *usage = "Usage: %s [-tTdh] [-M <MEMORYSIZE>] [-C <CLOCKS>] FILE\n";
32
33     cerr_init();
34     addcerrlist_load();
35     addcerrlist_exec();
36
37     /* オプションの処理 */
38     while((opt = getopt_long(argc, argv, "tTdM:C:h", longopts, NULL)) != -1) {
39         switch(opt) {
40         case 't':
41             execmode.trace = true;
42             break;
43         case 'T':
44             execmode.trace = true;
45             execmode.logical = true;
46             break;
47         case 'd':
48             execmode.dump = true;
49             break;
50         case 'M':
51             memsize = atoi(optarg);
52             break;
53         case 'C':
54             clocks = atoi(optarg);
55             break;
56         case 'h':
57             fprintf(stdout, usage, argv[0]);
58             return 0;
59         case '?':
60             fprintf(stderr, usage, argv[0]);
61             exit(-1);
62         }
63     }
64     if(argv[optind] == NULL) {
65         setcerr(211, NULL);    /* object file not specified */
66         fprintf(stderr, "comet2 error - %d: %s\n", cerr->num, cerr->msg);
67         exit(-1);
68     }
69     /* COMET II仮想マシンのリセット */
70     reset(memsize, clocks);
71     execptr->start = 0;
72     if(loadassemble(argv[optind]) == true) {
73         create_code_type();    /* タイプがキーの命令ハッシュ表を作成 */
74         exec();                /* プログラム実行 */
75         free_code_type();      /* タイプがキーの命令ハッシュ表を解放 */
76     }
77     /* COMET II仮想マシンのシャットダウン */
78     shutdown();
79     if(cerr->num > 0) {
80         status = -1;
81     }
82     /* エラーの解放 */
83     freecerr();
84     return status;
85 }