エラー表をコマンドごとに持つよう内部構造を変更
[YACASL2.git] / src / comet2.c
1 #include "casl2.h"
2 #include "exec.h"
3 #define _GNU_SOURCE
4 #include <getopt.h>
5
6 static struct option longopts[] = {
7     {"trace", no_argument, NULL, 't'},
8     {"tracearithmetic", no_argument, NULL, 't'},
9     {"tracelogical", no_argument, NULL, 'T'},
10     {"dump", no_argument, NULL, 'd'},
11     {"memorysize", required_argument, NULL, 'M'},
12     {"clocks", required_argument, NULL, 'C'},
13     {"help", no_argument, NULL, 'h'},
14     {0, 0, 0, 0}
15 };
16
17 EXECMODE execmode = {false, false, false};
18
19 /* エラー番号とエラーメッセージ */
20 CERRARRAY cerr[] = {
21     { 201, "execute - out of COMET II memory" },
22     { 202, "SVC input - out of Input memory" },
23     { 203, "SVC output - out of COMET II memory" },
24     { 204, "Program Register (PR) - out of COMET II memory" },
25     { 205, "Stack Pointer (SP) - cannot allocate stack buffer" },
26     { 206, "Address - out of COMET II memory" },
27     { 207, "Stack Pointer (SP) - out of COMET II memory" },
28     { 0, NULL },
29 };
30
31 /* 指定されたファイルからアセンブル結果を読込 */
32 bool inassemble(char *file) {
33     FILE *fp;
34     reset();
35     if((fp = fopen(file, "r")) == NULL) {
36         perror(file);
37         return false;
38     }
39     fread(memory, sizeof(WORD), memsize, fp);
40     fclose(fp);
41     return true;
42 }
43
44 /* comet2コマンド */
45 int main(int argc, char *argv[])
46 {
47     int opt;
48     const char *usage = "Usage: %s [-tTdh] [-M <memorysize>] [-C <clocks>] FILE\n";
49
50     while((opt = getopt_long(argc, argv, "tTdM:C:h", longopts, NULL)) != -1) {
51         switch(opt) {
52         case 't':
53             (&execmode)->tracemode = true;
54             break;
55         case 'T':
56             (&execmode)->tracemode = true;
57             (&execmode)->logicalmode = true;
58             break;
59         case 'd':
60             (&execmode)->dumpmode = true;
61             break;
62         case 'M':
63             memsize = atoi(optarg);
64             break;
65         case 'C':
66             clocks = atoi(optarg);
67             break;
68         case 'h':
69             fprintf(stdout, usage, argv[0]);
70             return 0;
71         case '?':
72             fprintf(stderr, usage, argv[0]);
73             exit(-1);
74         }
75     }
76     if(inassemble(argv[optind]) == true) {
77         exec();    /* プログラム実行 */
78     }
79     if(cerrno > 0) {
80         freecerr();
81         exit(-1);
82     }
83     return 0;
84 }