]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/1a/lex.c
remove old copies of kernels l.s from cmd/?a
[plan9front.git] / sys / src / cmd / 1a / lex.c
1 #include <ctype.h>
2 #define EXTERN
3 #include "a.h"
4 #include "y.tab.h"
5
6 void
7 main(int argc, char *argv[])
8 {
9         char *p;
10         int nout, nproc, status, i, c;
11
12         thechar = '1';
13         thestring = "68000";
14         memset(debug, 0, sizeof(debug));
15         cinit();
16         outfile = 0;
17         include[ninclude++] = ".";
18         ARGBEGIN {
19         default:
20                 c = ARGC();
21                 if(c >= 0 || c < sizeof(debug))
22                         debug[c] = 1;
23                 break;
24
25         case 'o':
26                 outfile = ARGF();
27                 break;
28
29         case 'D':
30                 p = ARGF();
31                 if(p)
32                         Dlist[nDlist++] = p;
33                 break;
34
35         case 'I':
36                 p = ARGF();
37                 setinclude(p);
38                 break;
39         } ARGEND
40         if(*argv == 0) {
41                 print("usage: %ca [-options] file.s\n", thechar);
42                 errorexit();
43         }
44         if(argc > 1 && systemtype(Windows)){
45                 print("can't assemble multiple files on windows\n");
46                 errorexit();
47         }
48         if(argc > 1 && !systemtype(Windows)) {
49                 nproc = 1;
50                 if(p = getenv("NPROC"))
51                         nproc = atol(p);        /* */
52                 c = 0;
53                 nout = 0;
54                 for(;;) {
55                         while(nout < nproc && argc > 0) {
56                                 i = myfork();
57                                 if(i < 0) {
58                                         i = mywait(&status);
59                                         if(i < 0)
60                                                 errorexit();
61                                         if(status)
62                                                 c++;
63                                         nout--;
64                                         continue;
65                                 }
66                                 if(i == 0) {
67                                         print("%s:\n", *argv);
68                                         if(assemble(*argv))
69                                                 errorexit();
70                                         exits(0);
71                                 }
72                                 nout++;
73                                 argc--;
74                                 argv++;
75                         }
76                         i = mywait(&status);
77                         if(i < 0) {
78                                 if(c)
79                                         errorexit();
80                                 exits(0);
81                         }
82                         if(status)
83                                 c++;
84                         nout--;
85                 }
86         }
87         if(assemble(argv[0]))
88                 errorexit();
89         exits(0);
90 }
91
92 int
93 assemble(char *file)
94 {
95         char ofile[100], incfile[20], *p;
96         int i, of;
97
98         strcpy(ofile, file);
99         p = utfrrune(ofile, pathchar());
100         if(p) {
101                 include[0] = ofile;
102                 *p++ = 0;
103         } else
104                 p = ofile;
105         if(outfile == 0) {
106                 outfile = p;
107                 if(outfile){
108                         p = utfrrune(outfile, '.');
109                         if(p)
110                                 if(p[1] == 's' && p[2] == 0)
111                                         p[0] = 0;
112                         p = utfrune(outfile, 0);
113                         p[0] = '.';
114                         p[1] = thechar;
115                         p[2] = 0;
116                 } else
117                         outfile = "/dev/null";
118         }
119         p = getenv("INCLUDE");
120         if(p) {
121                 setinclude(p);
122         } else {
123                 if(systemtype(Plan9)) {
124                         sprint(incfile,"/%s/include", thestring);
125                         setinclude(strdup(incfile));
126                 }
127         }
128
129         of = mycreat(outfile, 0664);
130         if(of < 0) {
131                 yyerror("%ca: cannot create %s", thechar, outfile);
132                 errorexit();
133         }
134         Binit(&obuf, of, OWRITE);
135
136         pass = 1;
137         pinit(file);
138         for(i=0; i<nDlist; i++)
139                 dodefine(Dlist[i]);
140         yyparse();
141         if(nerrors) {
142                 cclean();
143                 return nerrors;
144         }
145
146         pass = 2;
147         outhist();
148         pinit(file);
149         for(i=0; i<nDlist; i++)
150                 dodefine(Dlist[i]);
151         yyparse();
152         cclean();
153         return nerrors;
154 }
155
156 struct
157 {
158         char    *name;
159         ushort  type;
160         ushort  value;
161 } itab[] =
162 {
163         "SP",           LSP,    D_AUTO,
164         "SB",           LSB,    D_EXTERN,
165         "FP",           LFP,    D_PARAM,
166         "PC",           LPC,    D_BRANCH,
167         "TOS",          LTOS,   D_TOS,
168         "CCR",          LTOS,   D_CCR,
169         "SR",           LTOS,   D_SR,
170         "SFC",          LTOS,   D_SFC,
171         "DFC",          LTOS,   D_DFC,
172         "CACR",         LTOS,   D_CACR,
173         "USP",          LTOS,   D_USP,
174         "VBR",          LTOS,   D_VBR,
175         "CAAR",         LTOS,   D_CAAR,
176         "MSP",          LTOS,   D_MSP,
177         "ISP",          LTOS,   D_ISP,
178         "FPCR",         LTOS,   D_FPCR,
179         "FPSR",         LTOS,   D_FPSR,
180         "FPIAR",        LTOS,   D_FPIAR,
181         "TC",           LTOS,   D_TC,
182         "ITT0",         LTOS,   D_ITT0,
183         "ITT1",         LTOS,   D_ITT1,
184         "DTT0",         LTOS,   D_DTT0,
185         "DTT1",         LTOS,   D_DTT1,
186         "MMUSR",        LTOS,   D_MMUSR,
187         "URP",          LTOS,   D_URP,
188         "SRP",          LTOS,   D_SRP,
189
190         "R0",           LDREG,  D_R0+0,
191         "R1",           LDREG,  D_R0+1,
192         "R2",           LDREG,  D_R0+2,
193         "R3",           LDREG,  D_R0+3,
194         "R4",           LDREG,  D_R0+4,
195         "R5",           LDREG,  D_R0+5,
196         "R6",           LDREG,  D_R0+6,
197         "R7",           LDREG,  D_R0+7,
198
199         "A0",           LAREG,  D_A0+0,
200         "A1",           LAREG,  D_A0+1,
201         "A2",           LAREG,  D_A0+2,
202         "A3",           LAREG,  D_A0+3,
203         "A4",           LAREG,  D_A0+4,
204         "A5",           LAREG,  D_A0+5,
205         "A6",           LAREG,  D_A0+6,
206         "A7",           LAREG,  D_A0+7,
207
208         "F0",           LFREG,  D_F0+0,
209         "F1",           LFREG,  D_F0+1,
210         "F2",           LFREG,  D_F0+2,
211         "F3",           LFREG,  D_F0+3,
212         "F4",           LFREG,  D_F0+4,
213         "F5",           LFREG,  D_F0+5,
214         "F6",           LFREG,  D_F0+6,
215         "F7",           LFREG,  D_F0+7,
216
217         "ABCD",         LTYPE1, AABCD,
218         "ADDB",         LTYPE1, AADDB,
219         "ADDL",         LTYPE1, AADDL,
220         "ADDW",         LTYPE1, AADDW,
221         "ADDXB",        LTYPE1, AADDXB,
222         "ADDXL",        LTYPE1, AADDXL,
223         "ADDXW",        LTYPE1, AADDXW,
224         "ADJSP",        LTYPE5, AADJSP,
225         "ANDB",         LTYPE1, AANDB,
226         "ANDL",         LTYPE1, AANDL,
227         "ANDW",         LTYPE1, AANDW,
228         "ASLB",         LTYPE1, AASLB,
229         "ASLL",         LTYPE1, AASLL,
230         "ASLW",         LTYPE1, AASLW,
231         "ASRB",         LTYPE1, AASRB,
232         "ASRL",         LTYPE1, AASRL,
233         "ASRW",         LTYPE1, AASRW,
234         "BCASE",        LTYPE7, ABCASE,
235         "BCC",          LTYPE6, ABCC,
236         "BCHG",         LTYPE1, ABCHG,
237         "BCLR",         LTYPE1, ABCLR,
238         "BCS",          LTYPE6, ABCS,
239         "BEQ",          LTYPE6, ABEQ,
240         "BFCHG",        LTYPEA, ABFCHG,
241         "BFCLR",        LTYPEA, ABFCLR,
242         "BFEXTS",       LTYPEA, ABFEXTS,
243         "BFEXTU",       LTYPEA, ABFEXTU,
244         "BFFFO",        LTYPEA, ABFFFO,
245         "BFINS",        LTYPEA, ABFINS,
246         "BFSET",        LTYPEA, ABFSET,
247         "BFTST",        LTYPEA, ABFTST,
248         "BGE",          LTYPE6, ABGE,
249         "BGT",          LTYPE6, ABGT,
250         "BHI",          LTYPE6, ABHI,
251         "BKPT",         LTYPE1, ABKPT,
252         "BLE",          LTYPE6, ABLE,
253         "BLS",          LTYPE6, ABLS,
254         "BLT",          LTYPE6, ABLT,
255         "BMI",          LTYPE6, ABMI,
256         "BNE",          LTYPE6, ABNE,
257         "BPL",          LTYPE6, ABPL,
258         "BRA",          LTYPE6, ABRA,
259         "BSET",         LTYPE1, ABSET,
260         "BSR",          LTYPE3, ABSR,
261         "BTST",         LTYPE1, ABTST,
262         "BVC",          LTYPE6, ABVC,
263         "BVS",          LTYPE6, ABVS,
264         "CALLM",        LTYPE1, ACALLM,
265         "CAS2B",        LTYPE1, ACAS2B,
266         "CAS2L",        LTYPE1, ACAS2L,
267         "CAS2W",        LTYPE1, ACAS2W,
268         "CASB",         LTYPE1, ACASB,
269         "CASEW",        LTYPE2, ACASEW,
270         "CASL",         LTYPE1, ACASL,
271         "CASW",         LTYPE1, ACASW,
272         "CHK2B",        LTYPE1, ACHK2B,
273         "CHK2L",        LTYPE1, ACHK2L,
274         "CHK2W",        LTYPE1, ACHK2W,
275         "CHKL",         LTYPE1, ACHKL,
276         "CHKW",         LTYPE1, ACHKW,
277         "CLRB",         LTYPE3, ACLRB,
278         "CLRL",         LTYPE3, ACLRL,
279         "CLRW",         LTYPE3, ACLRW,
280         "CMP2B",        LTYPE1, ACMP2B,
281         "CMP2L",        LTYPE1, ACMP2L,
282         "CMP2W",        LTYPE1, ACMP2W,
283         "CMPB",         LTYPE1, ACMPB,
284         "CMPL",         LTYPE1, ACMPL,
285         "CMPW",         LTYPE1, ACMPW,
286         "DATA",         LTYPE4, ADATA,
287         "DBCC",         LTYPE7, ADBCC,
288         "DBCS",         LTYPE7, ADBCS,
289         "DBEQ",         LTYPE7, ADBEQ,
290         "DBF",          LTYPE7, ADBF,
291         "DBGE",         LTYPE7, ADBGE,
292         "DBGT",         LTYPE7, ADBGT,
293         "DBHI",         LTYPE7, ADBHI,
294         "DBLE",         LTYPE7, ADBLE,
295         "DBLS",         LTYPE7, ADBLS,
296         "DBLT",         LTYPE7, ADBLT,
297         "DBMI",         LTYPE7, ADBMI,
298         "DBNE",         LTYPE7, ADBNE,
299         "DBPL",         LTYPE7, ADBPL,
300         "DBT",          LTYPE7, ADBT,
301         "DBVC",         LTYPE7, ADBVC,
302         "DBVS",         LTYPE7, ADBVS,
303         "DIVSL",        LTYPE1, ADIVSL,
304         "DIVSW",        LTYPE1, ADIVSW,
305         "DIVUL",        LTYPE1, ADIVUL,
306         "DIVUW",        LTYPE1, ADIVUW,
307         "END",          LTYPE2, AEND,
308         "EORB",         LTYPE1, AEORB,
309         "EORL",         LTYPE1, AEORL,
310         "EORW",         LTYPE1, AEORW,
311         "EXG",          LTYPE1, AEXG,
312         "EXTBL",        LTYPE3, AEXTBL,
313         "EXTBW",        LTYPE3, AEXTBW,
314         "EXTWL",        LTYPE3, AEXTWL,
315         "FABSB",        LTYPE1, AFABSB,
316         "FABSD",        LTYPE1, AFABSD,
317         "FABSF",        LTYPE1, AFABSF,
318         "FABSL",        LTYPE1, AFABSL,
319         "FABSW",        LTYPE1, AFABSW,
320         "FACOSB",       LTYPE1, AFACOSB,
321         "FACOSD",       LTYPE1, AFACOSD,
322         "FACOSF",       LTYPE1, AFACOSF,
323         "FACOSL",       LTYPE1, AFACOSL,
324         "FACOSW",       LTYPE1, AFACOSW,
325         "FADDB",        LTYPE1, AFADDB,
326         "FADDD",        LTYPE1, AFADDD,
327         "FADDF",        LTYPE1, AFADDF,
328         "FADDL",        LTYPE1, AFADDL,
329         "FADDW",        LTYPE1, AFADDW,
330         "FASINB",       LTYPE1, AFASINB,
331         "FASIND",       LTYPE1, AFASIND,
332         "FASINF",       LTYPE1, AFASINF,
333         "FASINL",       LTYPE1, AFASINL,
334         "FASINW",       LTYPE1, AFASINW,
335         "FATANB",       LTYPE1, AFATANB,
336         "FATAND",       LTYPE1, AFATAND,
337         "FATANF",       LTYPE1, AFATANF,
338         "FATANHB",      LTYPE1, AFATANHB,
339         "FATANHD",      LTYPE1, AFATANHD,
340         "FATANHF",      LTYPE1, AFATANHF,
341         "FATANHL",      LTYPE1, AFATANHL,
342         "FATANHW",      LTYPE1, AFATANHW,
343         "FATANL",       LTYPE1, AFATANL,
344         "FATANW",       LTYPE1, AFATANW,
345         "FBEQ",         LTYPE6, AFBEQ,
346         "FBF",          LTYPE6, AFBF,
347         "FBGE",         LTYPE6, AFBGE,
348         "FBGT",         LTYPE6, AFBGT,
349         "FBLE",         LTYPE6, AFBLE,
350         "FBLT",         LTYPE6, AFBLT,
351         "FBNE",         LTYPE6, AFBNE,
352         "FBT",          LTYPE6, AFBT,
353         "FCMPB",        LTYPE1, AFCMPB,
354         "FCMPD",        LTYPE1, AFCMPD,
355         "FCMPF",        LTYPE1, AFCMPF,
356         "FCMPL",        LTYPE1, AFCMPL,
357         "FCMPW",        LTYPE1, AFCMPW,
358         "FCOSB",        LTYPE1, AFCOSB,
359         "FCOSD",        LTYPE1, AFCOSD,
360         "FCOSF",        LTYPE1, AFCOSF,
361         "FCOSHB",       LTYPE1, AFCOSHB,
362         "FCOSHD",       LTYPE1, AFCOSHD,
363         "FCOSHF",       LTYPE1, AFCOSHF,
364         "FCOSHL",       LTYPE1, AFCOSHL,
365         "FCOSHW",       LTYPE1, AFCOSHW,
366         "FCOSL",        LTYPE1, AFCOSL,
367         "FCOSW",        LTYPE1, AFCOSW,
368         "FDBEQ",        LTYPE7, AFDBEQ,
369         "FDBF",         LTYPE7, AFDBF,
370         "FDBGE",        LTYPE7, AFDBGE,
371         "FDBGT",        LTYPE7, AFDBGT,
372         "FDBLE",        LTYPE7, AFDBLE,
373         "FDBLT",        LTYPE7, AFDBLT,
374         "FDBNE",        LTYPE7, AFDBNE,
375         "FDBT",         LTYPE7, AFDBT,
376         "FDIVB",        LTYPE1, AFDIVB,
377         "FDIVD",        LTYPE1, AFDIVD,
378         "FDIVF",        LTYPE1, AFDIVF,
379         "FDIVL",        LTYPE1, AFDIVL,
380         "FDIVW",        LTYPE1, AFDIVW,
381         "FETOXB",       LTYPE1, AFETOXB,
382         "FETOXD",       LTYPE1, AFETOXD,
383         "FETOXF",       LTYPE1, AFETOXF,
384         "FETOXL",       LTYPE1, AFETOXL,
385         "FETOXM1B",     LTYPE1, AFETOXM1B,
386         "FETOXM1D",     LTYPE1, AFETOXM1D,
387         "FETOXM1F",     LTYPE1, AFETOXM1F,
388         "FETOXM1L",     LTYPE1, AFETOXM1L,
389         "FETOXM1W",     LTYPE1, AFETOXM1W,
390         "FETOXW",       LTYPE1, AFETOXW,
391         "FGETEXPB",     LTYPE1, AFGETEXPB,
392         "FGETEXPD",     LTYPE1, AFGETEXPD,
393         "FGETEXPF",     LTYPE1, AFGETEXPF,
394         "FGETEXPL",     LTYPE1, AFGETEXPL,
395         "FGETEXPW",     LTYPE1, AFGETEXPW,
396         "FGETMANB",     LTYPE1, AFGETMANB,
397         "FGETMAND",     LTYPE1, AFGETMAND,
398         "FGETMANF",     LTYPE1, AFGETMANF,
399         "FGETMANL",     LTYPE1, AFGETMANL,
400         "FGETMANW",     LTYPE1, AFGETMANW,
401         "FINTB",        LTYPE1, AFINTB,
402         "FINTD",        LTYPE1, AFINTD,
403         "FINTF",        LTYPE1, AFINTF,
404         "FINTL",        LTYPE1, AFINTL,
405         "FINTRZB",      LTYPE1, AFINTRZB,
406         "FINTRZD",      LTYPE1, AFINTRZD,
407         "FINTRZF",      LTYPE1, AFINTRZF,
408         "FINTRZL",      LTYPE1, AFINTRZL,
409         "FINTRZW",      LTYPE1, AFINTRZW,
410         "FINTW",        LTYPE1, AFINTW,
411         "FLOG10B",      LTYPE1, AFLOG10B,
412         "FLOG10D",      LTYPE1, AFLOG10D,
413         "FLOG10F",      LTYPE1, AFLOG10F,
414         "FLOG10L",      LTYPE1, AFLOG10L,
415         "FLOG10W",      LTYPE1, AFLOG10W,
416         "FLOG2B",       LTYPE1, AFLOG2B,
417         "FLOG2D",       LTYPE1, AFLOG2D,
418         "FLOG2F",       LTYPE1, AFLOG2F,
419         "FLOG2L",       LTYPE1, AFLOG2L,
420         "FLOG2W",       LTYPE1, AFLOG2W,
421         "FLOGNB",       LTYPE1, AFLOGNB,
422         "FLOGND",       LTYPE1, AFLOGND,
423         "FLOGNF",       LTYPE1, AFLOGNF,
424         "FLOGNL",       LTYPE1, AFLOGNL,
425         "FLOGNP1B",     LTYPE1, AFLOGNP1B,
426         "FLOGNP1D",     LTYPE1, AFLOGNP1D,
427         "FLOGNP1F",     LTYPE1, AFLOGNP1F,
428         "FLOGNP1L",     LTYPE1, AFLOGNP1L,
429         "FLOGNP1W",     LTYPE1, AFLOGNP1W,
430         "FLOGNW",       LTYPE1, AFLOGNW,
431         "FMODB",        LTYPE1, AFMODB,
432         "FMODD",        LTYPE1, AFMODD,
433         "FMODF",        LTYPE1, AFMODF,
434         "FMODL",        LTYPE1, AFMODL,
435         "FMODW",        LTYPE1, AFMODW,
436         "FMOVEB",       LTYPE1, AFMOVEB,
437         "FMOVED",       LTYPE1, AFMOVED,
438         "FMOVEF",       LTYPE1, AFMOVEF,
439         "FMOVEL",       LTYPE1, AFMOVEL,
440         "FMOVEW",       LTYPE1, AFMOVEW,
441         "FMULB",        LTYPE1, AFMULB,
442         "FMULD",        LTYPE1, AFMULD,
443         "FMULF",        LTYPE1, AFMULF,
444         "FMULL",        LTYPE1, AFMULL,
445         "FMULW",        LTYPE1, AFMULW,
446         "FNEGB",        LTYPE8, AFNEGB,
447         "FNEGD",        LTYPE8, AFNEGD,
448         "FNEGF",        LTYPE8, AFNEGF,
449         "FNEGL",        LTYPE8, AFNEGL,
450         "FNEGW",        LTYPE8, AFNEGW,
451         "FREMB",        LTYPE1, AFREMB,
452         "FREMD",        LTYPE1, AFREMD,
453         "FREMF",        LTYPE1, AFREMF,
454         "FREML",        LTYPE1, AFREML,
455         "FREMW",        LTYPE1, AFREMW,
456         "FSCALEB",      LTYPE1, AFSCALEB,
457         "FSCALED",      LTYPE1, AFSCALED,
458         "FSCALEF",      LTYPE1, AFSCALEF,
459         "FSCALEL",      LTYPE1, AFSCALEL,
460         "FSCALEW",      LTYPE1, AFSCALEW,
461         "FSEQ",         LTYPE1, AFSEQ,
462         "FSF",          LTYPE1, AFSF,
463         "FSGE",         LTYPE1, AFSGE,
464         "FSGT",         LTYPE1, AFSGT,
465         "FSINB",        LTYPE1, AFSINB,
466         "FSIND",        LTYPE1, AFSIND,
467         "FSINF",        LTYPE1, AFSINF,
468         "FSINHB",       LTYPE1, AFSINHB,
469         "FSINHD",       LTYPE1, AFSINHD,
470         "FSINHF",       LTYPE1, AFSINHF,
471         "FSINHL",       LTYPE1, AFSINHL,
472         "FSINHW",       LTYPE1, AFSINHW,
473         "FSINL",        LTYPE1, AFSINL,
474         "FSINW",        LTYPE1, AFSINW,
475         "FSLE",         LTYPE1, AFSLE,
476         "FSLT",         LTYPE1, AFSLT,
477         "FSNE",         LTYPE1, AFSNE,
478         "FSQRTB",       LTYPE1, AFSQRTB,
479         "FSQRTD",       LTYPE1, AFSQRTD,
480         "FSQRTF",       LTYPE1, AFSQRTF,
481         "FSQRTL",       LTYPE1, AFSQRTL,
482         "FSQRTW",       LTYPE1, AFSQRTW,
483         "FST",          LTYPE1, AFST,
484         "FSUBB",        LTYPE1, AFSUBB,
485         "FSUBD",        LTYPE1, AFSUBD,
486         "FSUBF",        LTYPE1, AFSUBF,
487         "FSUBL",        LTYPE1, AFSUBL,
488         "FSUBW",        LTYPE1, AFSUBW,
489         "FTANB",        LTYPE1, AFTANB,
490         "FTAND",        LTYPE1, AFTAND,
491         "FTANF",        LTYPE1, AFTANF,
492         "FTANHB",       LTYPE1, AFTANHB,
493         "FTANHD",       LTYPE1, AFTANHD,
494         "FTANHF",       LTYPE1, AFTANHF,
495         "FTANHL",       LTYPE1, AFTANHL,
496         "FTANHW",       LTYPE1, AFTANHW,
497         "FTANL",        LTYPE1, AFTANL,
498         "FTANW",        LTYPE1, AFTANW,
499         "FTENTOXB",     LTYPE1, AFTENTOXB,
500         "FTENTOXD",     LTYPE1, AFTENTOXD,
501         "FTENTOXF",     LTYPE1, AFTENTOXF,
502         "FTENTOXL",     LTYPE1, AFTENTOXL,
503         "FTENTOXW",     LTYPE1, AFTENTOXW,
504         "FTSTB",        LTYPE1, AFTSTB,
505         "FTSTD",        LTYPE1, AFTSTD,
506         "FTSTF",        LTYPE1, AFTSTF,
507         "FTSTL",        LTYPE1, AFTSTL,
508         "FTSTW",        LTYPE1, AFTSTW,
509         "FTWOTOXB",     LTYPE1, AFTWOTOXB,
510         "FTWOTOXD",     LTYPE1, AFTWOTOXD,
511         "FTWOTOXF",     LTYPE1, AFTWOTOXF,
512         "FTWOTOXL",     LTYPE1, AFTWOTOXL,
513         "FTWOTOXW",     LTYPE1, AFTWOTOXW,
514         "FMOVEM",       LTYPE1, AFMOVEM,
515         "FMOVEMC",      LTYPE1, AFMOVEMC,
516         "FRESTORE",     LTYPE3, AFRESTORE,
517         "FSAVE",        LTYPE3, AFSAVE,
518         "GLOBL",        LTYPE1, AGLOBL,
519         "GOK",          LTYPE2, AGOK,
520         "HISTORY",      LTYPE2, AHISTORY,
521         "ILLEG",        LTYPE2, AILLEG,
522         "INSTR",        LTYPE3, AINSTR,
523         "JMP",          LTYPE3, AJMP,
524         "JSR",          LTYPE3, AJSR,
525         "LEA",          LTYPE1, ALEA,
526         "LINKL",        LTYPE1, ALINKL,
527         "LINKW",        LTYPE1, ALINKW,
528         "LOCATE",       LTYPE1, ALOCATE,
529         "LONG",         LTYPE3, ALONG,
530         "LSLB",         LTYPE1, ALSLB,
531         "LSLL",         LTYPE1, ALSLL,
532         "LSLW",         LTYPE1, ALSLW,
533         "LSRB",         LTYPE1, ALSRB,
534         "LSRL",         LTYPE1, ALSRL,
535         "LSRW",         LTYPE1, ALSRW,
536         "MOVB",         LTYPE1, AMOVB,
537         "MOVEM",        LTYPE1, AMOVEM,
538         "MOVEPL",       LTYPE1, AMOVEPL,
539         "MOVEPW",       LTYPE1, AMOVEPW,
540         "MOVESB",       LTYPE1, AMOVESB,
541         "MOVESL",       LTYPE1, AMOVESL,
542         "MOVESW",       LTYPE1, AMOVESW,
543         "MOVL",         LTYPE1, AMOVL,
544         "MOVW",         LTYPE1, AMOVW,
545         "MULSL",        LTYPE1, AMULSL,
546         "MULSW",        LTYPE1, AMULSW,
547         "MULUL",        LTYPE1, AMULUL,
548         "MULUW",        LTYPE1, AMULUW,
549         "NAME",         LTYPE1, ANAME,
550         "NBCD",         LTYPE3, ANBCD,
551         "NEGB",         LTYPE3, ANEGB,
552         "NEGL",         LTYPE3, ANEGL,
553         "NEGW",         LTYPE3, ANEGW,
554         "NEGXB",        LTYPE3, ANEGXB,
555         "NEGXL",        LTYPE3, ANEGXL,
556         "NEGXW",        LTYPE3, ANEGXW,
557         "NOP",          LTYPE9, ANOP,
558         "NOTB",         LTYPE3, ANOTB,
559         "NOTL",         LTYPE3, ANOTL,
560         "NOTW",         LTYPE3, ANOTW,
561         "ORB",          LTYPE1, AORB,
562         "ORL",          LTYPE1, AORL,
563         "ORW",          LTYPE1, AORW,
564         "PACK",         LTYPE1, APACK,
565         "PEA",          LTYPE3, APEA,
566         "RESET",        LTYPE2, ARESET,
567         "ROTLB",        LTYPE1, AROTLB,
568         "ROTLL",        LTYPE1, AROTLL,
569         "ROTLW",        LTYPE1, AROTLW,
570         "ROTRB",        LTYPE1, AROTRB,
571         "ROTRL",        LTYPE1, AROTRL,
572         "ROTRW",        LTYPE1, AROTRW,
573         "ROXLB",        LTYPE1, AROXLB,
574         "ROXLL",        LTYPE1, AROXLL,
575         "ROXLW",        LTYPE1, AROXLW,
576         "ROXRB",        LTYPE1, AROXRB,
577         "ROXRL",        LTYPE1, AROXRL,
578         "ROXRW",        LTYPE1, AROXRW,
579         "RTD",          LTYPE3, ARTD,
580         "RTE",          LTYPE2, ARTE,
581         "RTM",          LTYPE3, ARTM,
582         "RTR",          LTYPE2, ARTR,
583         "RTS",          LTYPE2, ARTS,
584         "SBCD",         LTYPE1, ASBCD,
585         "SCC",          LTYPE3, ASCC,
586         "SCS",          LTYPE3, ASCS,
587         "SEQ",          LTYPE3, ASEQ,
588         "SF",           LTYPE3, ASF,
589         "SGE",          LTYPE3, ASGE,
590         "SGT",          LTYPE3, ASGT,
591         "SHI",          LTYPE3, ASHI,
592         "SLE",          LTYPE3, ASLE,
593         "SLS",          LTYPE3, ASLS,
594         "SLT",          LTYPE3, ASLT,
595         "SMI",          LTYPE3, ASMI,
596         "SNE",          LTYPE3, ASNE,
597         "SPL",          LTYPE3, ASPL,
598         "ST",           LTYPE3, AST,
599         "STOP",         LTYPE3, ASTOP,
600         "SUBB",         LTYPE1, ASUBB,
601         "SUBL",         LTYPE1, ASUBL,
602         "SUBW",         LTYPE1, ASUBW,
603         "SUBXB",        LTYPE1, ASUBXB,
604         "SUBXL",        LTYPE1, ASUBXL,
605         "SUBXW",        LTYPE1, ASUBXW,
606         "SVC",          LTYPE2, ASVC,
607         "SVS",          LTYPE2, ASVS,
608         "SWAP",         LTYPE3, ASWAP,
609         "SYS",          LTYPE2, ASYS,
610         "TAS",          LTYPE3, ATAS,
611         "TEXT",         LTYPEB, ATEXT,
612         "TRAP",         LTYPE3, ATRAP,
613         "TRAPCC",       LTYPE2, ATRAPCC,
614         "TRAPCS",       LTYPE2, ATRAPCS,
615         "TRAPEQ",       LTYPE2, ATRAPEQ,
616         "TRAPF",        LTYPE2, ATRAPF,
617         "TRAPGE",       LTYPE2, ATRAPGE,
618         "TRAPGT",       LTYPE2, ATRAPGT,
619         "TRAPHI",       LTYPE2, ATRAPHI,
620         "TRAPLE",       LTYPE2, ATRAPLE,
621         "TRAPLS",       LTYPE2, ATRAPLS,
622         "TRAPLT",       LTYPE2, ATRAPLT,
623         "TRAPMI",       LTYPE2, ATRAPMI,
624         "TRAPNE",       LTYPE2, ATRAPNE,
625         "TRAPPL",       LTYPE2, ATRAPPL,
626         "TRAPT",        LTYPE2, ATRAPT,
627         "TRAPV",        LTYPE2, ATRAPV,
628         "TRAPVC",       LTYPE2, ATRAPVC,
629         "TRAPVS",       LTYPE2, ATRAPVS,
630         "TSTB",         LTYPE3, ATSTB,
631         "TSTL",         LTYPE3, ATSTL,
632         "TSTW",         LTYPE3, ATSTW,
633         "UNLK",         LTYPE3, AUNLK,
634         "UNPK",         LTYPE1, AUNPK,
635         "WORD",         LTYPE3, AWORD,
636
637         0
638 };
639
640 void
641 cinit(void)
642 {
643         Sym *s;
644         int i;
645
646         nullgen.sym = S;
647         nullgen.offset = 0;
648         nullgen.type = D_NONE;
649         if(FPCHIP)
650                 nullgen.dval = 0;
651         for(i=0; i<sizeof(nullgen.sval); i++)
652                 nullgen.sval[i] = 0;
653         nullgen.displace = 0;
654         nullgen.type = D_NONE;
655         nullgen.field = 0;
656
657         nerrors = 0;
658         iostack = I;
659         iofree = I;
660         peekc = IGN;
661         nhunk = 0;
662         for(i=0; i<NHASH; i++)
663                 hash[i] = S;
664         for(i=0; itab[i].name; i++) {
665                 s = slookup(itab[i].name);
666                 s->type = itab[i].type;
667                 s->value = itab[i].value;
668         }
669
670         pathname = allocn(pathname, 0, 100);
671         if(mygetwd(pathname, 99) == 0) {
672                 pathname = allocn(pathname, 100, 900);
673                 if(mygetwd(pathname, 999) == 0)
674                         strcpy(pathname, "/???");
675         }
676 }
677
678 void
679 syminit(Sym *s)
680 {
681
682         s->type = LNAME;
683         s->value = 0;
684 }
685
686 void
687 cclean(void)
688 {
689         Gen2 g2;
690
691         g2.from = nullgen;
692         g2.to = nullgen;
693         outcode(AEND, &g2);
694         Bflush(&obuf);
695 }
696
697 void
698 zname(char *n, int t, int s)
699 {
700
701         Bputc(&obuf, ANAME);    /* as */
702         Bputc(&obuf, ANAME>>8);
703         Bputc(&obuf, t);                /* type */
704         Bputc(&obuf, s);                /* sym */
705         while(*n) {
706                 Bputc(&obuf, *n);
707                 n++;
708         }
709         Bputc(&obuf, 0);
710 }
711
712 void
713 zaddr(Gen *a, int s)
714 {
715         long l;
716         int i, t;
717         char *n;
718         Ieee e;
719
720         t = 0;
721         if(a->field)
722                 t |= T_FIELD;
723         if(a->displace != 0)
724                 t |= T_INDEX;
725         if(a->offset != 0)
726                 t |= T_OFFSET;
727         if(s != 0)
728                 t |= T_SYM;
729
730         if(a->type == D_FCONST)
731                 t |= T_FCONST;
732         else
733         if(a->type == D_SCONST)
734                 t |= T_SCONST;
735         else
736         if(a->type & ~0xff)
737                 t |= T_TYPE;
738         Bputc(&obuf, t);
739
740         if(t & T_FIELD) {       /* implies field */
741                 i = a->field;
742                 Bputc(&obuf, i);
743                 Bputc(&obuf, i>>8);
744         }
745         if(t & T_INDEX) {       /* implies index, scale, displace */
746                 i = D_NONE;
747                 Bputc(&obuf, i);
748                 Bputc(&obuf, i>>8);
749                 Bputc(&obuf, 0);
750                 l = a->displace;
751                 Bputc(&obuf, l);
752                 Bputc(&obuf, l>>8);
753                 Bputc(&obuf, l>>16);
754                 Bputc(&obuf, l>>24);
755         }
756         if(t & T_OFFSET) {      /* implies offset */
757                 l = a->offset;
758                 Bputc(&obuf, l);
759                 Bputc(&obuf, l>>8);
760                 Bputc(&obuf, l>>16);
761                 Bputc(&obuf, l>>24);
762         }
763         if(t & T_SYM)           /* implies sym */
764                 Bputc(&obuf, s);
765         if(t & T_FCONST) {
766                 ieeedtod(&e, a->dval);
767                 l = e.l;
768                 Bputc(&obuf, l);
769                 Bputc(&obuf, l>>8);
770                 Bputc(&obuf, l>>16);
771                 Bputc(&obuf, l>>24);
772                 l = e.h;
773                 Bputc(&obuf, l);
774                 Bputc(&obuf, l>>8);
775                 Bputc(&obuf, l>>16);
776                 Bputc(&obuf, l>>24);
777                 return;
778         }
779         if(t & T_SCONST) {
780                 n = a->sval;
781                 for(i=0; i<NSNAME; i++) {
782                         Bputc(&obuf, *n);
783                         n++;
784                 }
785                 return;
786         }
787         i = a->type;
788         Bputc(&obuf, i);
789         if(t & T_TYPE)
790                 Bputc(&obuf, i>>8);
791 }
792
793 void
794 outcode(int a, Gen2 *g2)
795 {
796         int sf, st, t;
797         Sym *s;
798
799         if(pass == 1)
800                 goto out;
801
802 jackpot:
803         sf = 0;
804         s = g2->from.sym;
805         while(s != S) {
806                 sf = s->sym;
807                 if(sf < 0 || sf >= NSYM)
808                         sf = 0;
809                 t = g2->from.type & D_MASK;
810                 if(h[sf].type == t)
811                 if(h[sf].sym == s)
812                         break;
813                 zname(s->name, t, sym);
814                 s->sym = sym;
815                 h[sym].sym = s;
816                 h[sym].type = t;
817                 sf = sym;
818                 sym++;
819                 if(sym >= NSYM)
820                         sym = 1;
821                 break;
822         }
823         st = 0;
824         s = g2->to.sym;
825         while(s != S) {
826                 st = s->sym;
827                 if(st < 0 || st >= NSYM)
828                         st = 0;
829                 t = g2->to.type & D_MASK;
830                 if(h[st].type == t)
831                 if(h[st].sym == s)
832                         break;
833                 zname(s->name, t, sym);
834                 s->sym = sym;
835                 h[sym].sym = s;
836                 h[sym].type = t;
837                 st = sym;
838                 sym++;
839                 if(sym >= NSYM)
840                         sym = 1;
841                 if(st == sf)
842                         goto jackpot;
843                 break;
844         }
845         Bputc(&obuf, a);
846         Bputc(&obuf, a>>8);
847         Bputc(&obuf, lineno);
848         Bputc(&obuf, lineno>>8);
849         Bputc(&obuf, lineno>>16);
850         Bputc(&obuf, lineno>>24);
851         zaddr(&g2->from, sf);
852         zaddr(&g2->to, st);
853
854 out:
855         if(a != AGLOBL && a != ADATA)
856                 pc++;
857 }
858
859 void
860 outhist(void)
861 {
862         Gen g;
863         Hist *h;
864         char *p, *q, *op, c;
865         int n;
866
867         g = nullgen;
868         c = pathchar();
869         for(h = hist; h != H; h = h->link) {
870                 p = h->name;
871                 op = 0;
872                 if(p && p[0] != c && h->offset == 0 && pathname){
873                         /* on windows skip drive specifier in pathname */
874                         if(systemtype(Windows) && pathname[1] == ':') {
875                                 op = p;
876                                 p = pathname+2;
877                                 c = *p;
878                         } else if(pathname[0] == c){
879                                 op = p;
880                                 p = pathname;
881                         }
882                 }
883                 while(p) {
884                         q = strchr(p, c);
885                         if(q) {
886                                 n = q-p;
887                                 if(n == 0){
888                                         n = 1;  /* leading "/" */
889                                         *p = '/';       /* don't emit "\" on windows */
890                                 }
891                                 q++;
892                         } else {
893                                 n = strlen(p);
894                                 q = 0;
895                         }
896                         if(n) {
897                                 Bputc(&obuf, ANAME);
898                                 Bputc(&obuf, ANAME>>8);
899                                 Bputc(&obuf, D_FILE);   /* type */
900                                 Bputc(&obuf, 1);        /* sym */
901                                 Bputc(&obuf, '<');
902                                 Bwrite(&obuf, p, n);
903                                 Bputc(&obuf, 0);
904                         }
905                         p = q;
906                         if(p == 0 && op) {
907                                 p = op;
908                                 op = 0;
909                         }
910                 }
911                 g.offset = h->offset;
912
913                 Bputc(&obuf, AHISTORY);
914                 Bputc(&obuf, AHISTORY>>8);
915                 Bputc(&obuf, h->line);
916                 Bputc(&obuf, h->line>>8);
917                 Bputc(&obuf, h->line>>16);
918                 Bputc(&obuf, h->line>>24);
919                 zaddr(&nullgen, 0);
920                 zaddr(&g, 0);
921         }
922 }
923
924 #include "../cc/lexbody"
925 #include "../cc/macbody"
926 #include "../cc/compat"