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