a7fb3f59ec18fe7fd10a88eaeb7c1620868670b9
[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 CERRARRAY 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     if((endptr = startptr + fread(memory, sizeof(WORD), memsize-startptr, fp)) == memsize) {
38         setcerr(201, NULL);    /* Load object file - full of COMET II memory */
39         fprintf(stderr, "Execute error - %d: %s\n", cerrno, cerrmsg);
40         status = false;
41     }
42     fclose(fp);
43     return status;
44 }
45
46 /* comet2コマンド */
47 int main(int argc, char *argv[])
48 {
49     int opt;
50     const char *usage = "Usage: %s [-tTdh] [-M <MEMORYSIZE>] [-C <CLOCKS>] FILE\n";
51
52     addcerrlist_comet2();
53     while((opt = getopt_long(argc, argv, "tTdM:C:h", longopts, NULL)) != -1) {
54         switch(opt) {
55         case 't':
56             execmode.trace = true;
57             break;
58         case 'T':
59             execmode.trace = true;
60             execmode.logical = true;
61             break;
62         case 'd':
63             execmode.dump = true;
64             break;
65         case 'M':
66             memsize = atoi(optarg);
67             break;
68         case 'C':
69             clocks = atoi(optarg);
70             break;
71         case 'h':
72             fprintf(stdout, usage, argv[0]);
73             return 0;
74         case '?':
75             fprintf(stderr, usage, argv[0]);
76             exit(-1);
77         }
78     }
79     if(argv[optind] == NULL) {
80         setcerr(208, NULL);    /* object file is not specified */
81         fprintf(stderr, "comet2 error - %d: %s\n", cerrno, cerrmsg);
82         goto comet2err;
83     }
84     reset();
85     startptr = 0;
86     if(loadassemble(argv[optind]) == true) {
87         exec();    /* プログラム実行 */
88     }
89     shutdown();
90     if(cerrno > 0) {
91         goto comet2err;
92     }
93     return 0;
94 comet2err:
95     freecerr();
96     exit(-1);
97 }