eb4df1a466d1c38e376e2f6385282c1b5951324a
[rmac] / 68kgen.c
1 ////////////////////////////////////////////////////////////////////////////////////////////////////
2 // RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System
3 // 68KGEN.C - Tool to Generate 68000 Opcode Table
4 // Copyright (C) 199x Landon Dyer, 2011 Reboot and Friends
5 // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
6 // Source Utilised with the Kind Permission of Landon Dyer
7
8 #include <stdio.h>
9 #include <ctype.h>
10 #include <stdlib.h>
11
12 #define EOS     '\0'
13
14 int kwnum = 1;                  /* current op# for kwgen output */
15
16 FILE *kfp;                      /* keyword file */
17
18 int lineno = 0;
19
20 void error(char *, char *);
21 void procln(int, char **);
22
23 void main(int argc, char **argv) {
24         char *namv[256];
25         char *s;
26         int namcnt;
27         char ln[256];
28
29         if (argc == 2)
30                 if ((kfp = fopen(argv[1], "w")) == NULL)
31                         error("Cannot create: %s", argv[1]);
32
33         while (gets(ln) != NULL)
34         {
35                 ++lineno;                       /* bump line# */
36                 if (*ln == '#')         /* ignore comments */
37                         continue;
38
39                 /*
40                  *  Tokenize line (like the way "argc, argv" works)
41                  *  and pass it to the parser.
42                  */
43                 namcnt = 0;
44                 s = ln;
45                 while (*s)
46                         if (isspace(*s))
47                                 ++s;
48                         else
49                         {
50                                 namv[namcnt++] = s;
51                                 while (*s && !isspace(*s))
52                                         ++s;
53                                 if (isspace(*s))
54                                         *s++ = EOS;
55                         }
56
57                 if (namcnt)
58                         procln(namcnt, namv);
59         }
60 }
61
62
63 /*
64  *  Parse line
65  */
66 void procln(int namc, char **namv) {
67         int i, j;
68         char *s;
69
70         if (namc == 1)          /* alias for previous entry */
71         {
72                 fprintf(kfp, "%s\t%d\n", namv[0], kwnum-1+1000);
73                 return;
74         }
75
76         if (namc < 5)
77         {
78                 fprintf(stderr, "%d: missing fields\n", lineno);
79                 exit(1);
80         }
81
82         if (*namv[0] != '-')            /* output keyword name */
83                 fprintf(kfp, "%s\t%d\n", namv[0], kwnum + 1000);
84
85         printf("/*%4d %-6s*/  {", kwnum, namv[0]);
86
87         if (*namv[1] == '!')
88                 printf("CGSPECIAL");
89         else for (s = namv[1], i=0; *s; ++s)
90                 printf("%sSIZ%c", (i++ ? "|" : ""), *s);
91         printf(", %s, %s, ", namv[2], namv[3]);
92
93         if (*namv[4] == '%')            /* enforce little fascist percent signs */
94         {
95                 for (i=1, j=0; i < 17; ++i)
96                 {
97                         j <<= 1;
98                         if (namv[4][i] == '1' ||
99                                   isupper(namv[4][i]))
100                                 ++j;
101                 }
102                 printf("0x%04x, ", j);
103         }
104         else printf("%s, ", namv[4]);
105
106         if (namc == 7 &&
107                   *namv[6] == '+')
108                 printf("%d, ", kwnum+1);
109         else printf("0, ");
110
111         printf("%s},\n", namv[5]);
112
113         ++kwnum;
114 }
115
116 void error(char *s, char *s1) {
117         fprintf(stderr, s, s1);
118         fprintf(stderr, "\n");
119         exit(1);
120 }
121