エラー時の動作を修正
[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 /* エラー番号とエラーメッセージ */
19 CERRARRAY cerr[] = {
20     { 201, "Load object file - full of COMET II memory" },
21     { 202, "SVC input - out of Input memory" },
22     { 203, "SVC output - out of COMET II memory" },
23     { 204, "Program Register (PR) - out of COMET II memory" },
24     { 205, "Stack Pointer (SP) - cannot allocate stack buffer" },
25     { 206, "Address - out of COMET II memory" },
26     { 207, "Stack Pointer (SP) - out of COMET II memory" },
27     { 0, NULL },
28 };
29
30 /* 指定されたファイルからアセンブル結果を読込 */
31 bool loadassemble(char *file) {
32     FILE *fp;
33     if((fp = fopen(file, "r")) == NULL) {
34         perror(file);
35         return false;
36     }
37     endptr = startptr + fread(memory, sizeof(WORD), memsize, fp);
38     fclose(fp);
39     return true;
40 }
41
42 /* comet2コマンド */
43 int main(int argc, char *argv[])
44 {
45     int opt;
46     const char *usage = "Usage: %s [-tTdh] [-M <memorysize>] [-C <clocks>] FILE\n";
47
48     while((opt = getopt_long(argc, argv, "tTdM:C:h", longopts, NULL)) != -1) {
49         switch(opt) {
50         case 't':
51             (&execmode)->trace = true;
52             break;
53         case 'T':
54             (&execmode)->trace = true;
55             (&execmode)->logical = true;
56             break;
57         case 'd':
58             (&execmode)->dump = true;
59             break;
60         case 'M':
61             memsize = atoi(optarg);
62             break;
63         case 'C':
64             clocks = atoi(optarg);
65             break;
66         case 'h':
67             fprintf(stdout, usage, argv[0]);
68             return 0;
69         case '?':
70             fprintf(stderr, usage, argv[0]);
71             exit(-1);
72         }
73     }
74     reset();
75     startptr = 0;
76     if(loadassemble(argv[optind]) == true) {
77         exec();    /* プログラム実行 */
78     }
79     if(cerrno > 0) {
80         freecerr();
81         exit(-1);
82     }
83     return 0;
84 }