summaryrefslogtreecommitdiff
path: root/sys/src/cmd/1a/lex.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/1a/lex.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/1a/lex.c')
-rwxr-xr-xsys/src/cmd/1a/lex.c926
1 files changed, 926 insertions, 0 deletions
diff --git a/sys/src/cmd/1a/lex.c b/sys/src/cmd/1a/lex.c
new file mode 100755
index 000000000..ee42859fd
--- /dev/null
+++ b/sys/src/cmd/1a/lex.c
@@ -0,0 +1,926 @@
+#include <ctype.h>
+#define EXTERN
+#include "a.h"
+#include "y.tab.h"
+
+void
+main(int argc, char *argv[])
+{
+ char *p;
+ int nout, nproc, status, i, c;
+
+ thechar = '1';
+ thestring = "68000";
+ memset(debug, 0, sizeof(debug));
+ cinit();
+ outfile = 0;
+ include[ninclude++] = ".";
+ ARGBEGIN {
+ default:
+ c = ARGC();
+ if(c >= 0 || c < sizeof(debug))
+ debug[c] = 1;
+ break;
+
+ case 'o':
+ outfile = ARGF();
+ break;
+
+ case 'D':
+ p = ARGF();
+ if(p)
+ Dlist[nDlist++] = p;
+ break;
+
+ case 'I':
+ p = ARGF();
+ setinclude(p);
+ break;
+ } ARGEND
+ if(*argv == 0) {
+ print("usage: %ca [-options] file.s\n", thechar);
+ errorexit();
+ }
+ if(argc > 1 && systemtype(Windows)){
+ print("can't assemble multiple files on windows\n");
+ errorexit();
+ }
+ if(argc > 1 && !systemtype(Windows)) {
+ nproc = 1;
+ if(p = getenv("NPROC"))
+ nproc = atol(p); /* */
+ c = 0;
+ nout = 0;
+ for(;;) {
+ while(nout < nproc && argc > 0) {
+ i = myfork();
+ if(i < 0) {
+ i = mywait(&status);
+ if(i < 0)
+ errorexit();
+ if(status)
+ c++;
+ nout--;
+ continue;
+ }
+ if(i == 0) {
+ print("%s:\n", *argv);
+ if(assemble(*argv))
+ errorexit();
+ exits(0);
+ }
+ nout++;
+ argc--;
+ argv++;
+ }
+ i = mywait(&status);
+ if(i < 0) {
+ if(c)
+ errorexit();
+ exits(0);
+ }
+ if(status)
+ c++;
+ nout--;
+ }
+ }
+ if(assemble(argv[0]))
+ errorexit();
+ exits(0);
+}
+
+int
+assemble(char *file)
+{
+ char ofile[100], incfile[20], *p;
+ int i, of;
+
+ strcpy(ofile, file);
+ p = utfrrune(ofile, pathchar());
+ if(p) {
+ include[0] = ofile;
+ *p++ = 0;
+ } else
+ p = ofile;
+ if(outfile == 0) {
+ outfile = p;
+ if(outfile){
+ p = utfrrune(outfile, '.');
+ if(p)
+ if(p[1] == 's' && p[2] == 0)
+ p[0] = 0;
+ p = utfrune(outfile, 0);
+ p[0] = '.';
+ p[1] = thechar;
+ p[2] = 0;
+ } else
+ outfile = "/dev/null";
+ }
+ p = getenv("INCLUDE");
+ if(p) {
+ setinclude(p);
+ } else {
+ if(systemtype(Plan9)) {
+ sprint(incfile,"/%s/include", thestring);
+ setinclude(strdup(incfile));
+ }
+ }
+
+ of = mycreat(outfile, 0664);
+ if(of < 0) {
+ yyerror("%ca: cannot create %s", thechar, outfile);
+ errorexit();
+ }
+ Binit(&obuf, of, OWRITE);
+
+ pass = 1;
+ pinit(file);
+ for(i=0; i<nDlist; i++)
+ dodefine(Dlist[i]);
+ yyparse();
+ if(nerrors) {
+ cclean();
+ return nerrors;
+ }
+
+ pass = 2;
+ outhist();
+ pinit(file);
+ for(i=0; i<nDlist; i++)
+ dodefine(Dlist[i]);
+ yyparse();
+ cclean();
+ return nerrors;
+}
+
+struct
+{
+ char *name;
+ ushort type;
+ ushort value;
+} itab[] =
+{
+ "SP", LSP, D_AUTO,
+ "SB", LSB, D_EXTERN,
+ "FP", LFP, D_PARAM,
+ "PC", LPC, D_BRANCH,
+ "TOS", LTOS, D_TOS,
+ "CCR", LTOS, D_CCR,
+ "SR", LTOS, D_SR,
+ "SFC", LTOS, D_SFC,
+ "DFC", LTOS, D_DFC,
+ "CACR", LTOS, D_CACR,
+ "USP", LTOS, D_USP,
+ "VBR", LTOS, D_VBR,
+ "CAAR", LTOS, D_CAAR,
+ "MSP", LTOS, D_MSP,
+ "ISP", LTOS, D_ISP,
+ "FPCR", LTOS, D_FPCR,
+ "FPSR", LTOS, D_FPSR,
+ "FPIAR", LTOS, D_FPIAR,
+ "TC", LTOS, D_TC,
+ "ITT0", LTOS, D_ITT0,
+ "ITT1", LTOS, D_ITT1,
+ "DTT0", LTOS, D_DTT0,
+ "DTT1", LTOS, D_DTT1,
+ "MMUSR", LTOS, D_MMUSR,
+ "URP", LTOS, D_URP,
+ "SRP", LTOS, D_SRP,
+
+ "R0", LDREG, D_R0+0,
+ "R1", LDREG, D_R0+1,
+ "R2", LDREG, D_R0+2,
+ "R3", LDREG, D_R0+3,
+ "R4", LDREG, D_R0+4,
+ "R5", LDREG, D_R0+5,
+ "R6", LDREG, D_R0+6,
+ "R7", LDREG, D_R0+7,
+
+ "A0", LAREG, D_A0+0,
+ "A1", LAREG, D_A0+1,
+ "A2", LAREG, D_A0+2,
+ "A3", LAREG, D_A0+3,
+ "A4", LAREG, D_A0+4,
+ "A5", LAREG, D_A0+5,
+ "A6", LAREG, D_A0+6,
+ "A7", LAREG, D_A0+7,
+
+ "F0", LFREG, D_F0+0,
+ "F1", LFREG, D_F0+1,
+ "F2", LFREG, D_F0+2,
+ "F3", LFREG, D_F0+3,
+ "F4", LFREG, D_F0+4,
+ "F5", LFREG, D_F0+5,
+ "F6", LFREG, D_F0+6,
+ "F7", LFREG, D_F0+7,
+
+ "ABCD", LTYPE1, AABCD,
+ "ADDB", LTYPE1, AADDB,
+ "ADDL", LTYPE1, AADDL,
+ "ADDW", LTYPE1, AADDW,
+ "ADDXB", LTYPE1, AADDXB,
+ "ADDXL", LTYPE1, AADDXL,
+ "ADDXW", LTYPE1, AADDXW,
+ "ADJSP", LTYPE5, AADJSP,
+ "ANDB", LTYPE1, AANDB,
+ "ANDL", LTYPE1, AANDL,
+ "ANDW", LTYPE1, AANDW,
+ "ASLB", LTYPE1, AASLB,
+ "ASLL", LTYPE1, AASLL,
+ "ASLW", LTYPE1, AASLW,
+ "ASRB", LTYPE1, AASRB,
+ "ASRL", LTYPE1, AASRL,
+ "ASRW", LTYPE1, AASRW,
+ "BCASE", LTYPE7, ABCASE,
+ "BCC", LTYPE6, ABCC,
+ "BCHG", LTYPE1, ABCHG,
+ "BCLR", LTYPE1, ABCLR,
+ "BCS", LTYPE6, ABCS,
+ "BEQ", LTYPE6, ABEQ,
+ "BFCHG", LTYPEA, ABFCHG,
+ "BFCLR", LTYPEA, ABFCLR,
+ "BFEXTS", LTYPEA, ABFEXTS,
+ "BFEXTU", LTYPEA, ABFEXTU,
+ "BFFFO", LTYPEA, ABFFFO,
+ "BFINS", LTYPEA, ABFINS,
+ "BFSET", LTYPEA, ABFSET,
+ "BFTST", LTYPEA, ABFTST,
+ "BGE", LTYPE6, ABGE,
+ "BGT", LTYPE6, ABGT,
+ "BHI", LTYPE6, ABHI,
+ "BKPT", LTYPE1, ABKPT,
+ "BLE", LTYPE6, ABLE,
+ "BLS", LTYPE6, ABLS,
+ "BLT", LTYPE6, ABLT,
+ "BMI", LTYPE6, ABMI,
+ "BNE", LTYPE6, ABNE,
+ "BPL", LTYPE6, ABPL,
+ "BRA", LTYPE6, ABRA,
+ "BSET", LTYPE1, ABSET,
+ "BSR", LTYPE3, ABSR,
+ "BTST", LTYPE1, ABTST,
+ "BVC", LTYPE6, ABVC,
+ "BVS", LTYPE6, ABVS,
+ "CALLM", LTYPE1, ACALLM,
+ "CAS2B", LTYPE1, ACAS2B,
+ "CAS2L", LTYPE1, ACAS2L,
+ "CAS2W", LTYPE1, ACAS2W,
+ "CASB", LTYPE1, ACASB,
+ "CASEW", LTYPE2, ACASEW,
+ "CASL", LTYPE1, ACASL,
+ "CASW", LTYPE1, ACASW,
+ "CHK2B", LTYPE1, ACHK2B,
+ "CHK2L", LTYPE1, ACHK2L,
+ "CHK2W", LTYPE1, ACHK2W,
+ "CHKL", LTYPE1, ACHKL,
+ "CHKW", LTYPE1, ACHKW,
+ "CLRB", LTYPE3, ACLRB,
+ "CLRL", LTYPE3, ACLRL,
+ "CLRW", LTYPE3, ACLRW,
+ "CMP2B", LTYPE1, ACMP2B,
+ "CMP2L", LTYPE1, ACMP2L,
+ "CMP2W", LTYPE1, ACMP2W,
+ "CMPB", LTYPE1, ACMPB,
+ "CMPL", LTYPE1, ACMPL,
+ "CMPW", LTYPE1, ACMPW,
+ "DATA", LTYPE4, ADATA,
+ "DBCC", LTYPE7, ADBCC,
+ "DBCS", LTYPE7, ADBCS,
+ "DBEQ", LTYPE7, ADBEQ,
+ "DBF", LTYPE7, ADBF,
+ "DBGE", LTYPE7, ADBGE,
+ "DBGT", LTYPE7, ADBGT,
+ "DBHI", LTYPE7, ADBHI,
+ "DBLE", LTYPE7, ADBLE,
+ "DBLS", LTYPE7, ADBLS,
+ "DBLT", LTYPE7, ADBLT,
+ "DBMI", LTYPE7, ADBMI,
+ "DBNE", LTYPE7, ADBNE,
+ "DBPL", LTYPE7, ADBPL,
+ "DBT", LTYPE7, ADBT,
+ "DBVC", LTYPE7, ADBVC,
+ "DBVS", LTYPE7, ADBVS,
+ "DIVSL", LTYPE1, ADIVSL,
+ "DIVSW", LTYPE1, ADIVSW,
+ "DIVUL", LTYPE1, ADIVUL,
+ "DIVUW", LTYPE1, ADIVUW,
+ "END", LTYPE2, AEND,
+ "EORB", LTYPE1, AEORB,
+ "EORL", LTYPE1, AEORL,
+ "EORW", LTYPE1, AEORW,
+ "EXG", LTYPE1, AEXG,
+ "EXTBL", LTYPE3, AEXTBL,
+ "EXTBW", LTYPE3, AEXTBW,
+ "EXTWL", LTYPE3, AEXTWL,
+ "FABSB", LTYPE1, AFABSB,
+ "FABSD", LTYPE1, AFABSD,
+ "FABSF", LTYPE1, AFABSF,
+ "FABSL", LTYPE1, AFABSL,
+ "FABSW", LTYPE1, AFABSW,
+ "FACOSB", LTYPE1, AFACOSB,
+ "FACOSD", LTYPE1, AFACOSD,
+ "FACOSF", LTYPE1, AFACOSF,
+ "FACOSL", LTYPE1, AFACOSL,
+ "FACOSW", LTYPE1, AFACOSW,
+ "FADDB", LTYPE1, AFADDB,
+ "FADDD", LTYPE1, AFADDD,
+ "FADDF", LTYPE1, AFADDF,
+ "FADDL", LTYPE1, AFADDL,
+ "FADDW", LTYPE1, AFADDW,
+ "FASINB", LTYPE1, AFASINB,
+ "FASIND", LTYPE1, AFASIND,
+ "FASINF", LTYPE1, AFASINF,
+ "FASINL", LTYPE1, AFASINL,
+ "FASINW", LTYPE1, AFASINW,
+ "FATANB", LTYPE1, AFATANB,
+ "FATAND", LTYPE1, AFATAND,
+ "FATANF", LTYPE1, AFATANF,
+ "FATANHB", LTYPE1, AFATANHB,
+ "FATANHD", LTYPE1, AFATANHD,
+ "FATANHF", LTYPE1, AFATANHF,
+ "FATANHL", LTYPE1, AFATANHL,
+ "FATANHW", LTYPE1, AFATANHW,
+ "FATANL", LTYPE1, AFATANL,
+ "FATANW", LTYPE1, AFATANW,
+ "FBEQ", LTYPE6, AFBEQ,
+ "FBF", LTYPE6, AFBF,
+ "FBGE", LTYPE6, AFBGE,
+ "FBGT", LTYPE6, AFBGT,
+ "FBLE", LTYPE6, AFBLE,
+ "FBLT", LTYPE6, AFBLT,
+ "FBNE", LTYPE6, AFBNE,
+ "FBT", LTYPE6, AFBT,
+ "FCMPB", LTYPE1, AFCMPB,
+ "FCMPD", LTYPE1, AFCMPD,
+ "FCMPF", LTYPE1, AFCMPF,
+ "FCMPL", LTYPE1, AFCMPL,
+ "FCMPW", LTYPE1, AFCMPW,
+ "FCOSB", LTYPE1, AFCOSB,
+ "FCOSD", LTYPE1, AFCOSD,
+ "FCOSF", LTYPE1, AFCOSF,
+ "FCOSHB", LTYPE1, AFCOSHB,
+ "FCOSHD", LTYPE1, AFCOSHD,
+ "FCOSHF", LTYPE1, AFCOSHF,
+ "FCOSHL", LTYPE1, AFCOSHL,
+ "FCOSHW", LTYPE1, AFCOSHW,
+ "FCOSL", LTYPE1, AFCOSL,
+ "FCOSW", LTYPE1, AFCOSW,
+ "FDBEQ", LTYPE7, AFDBEQ,
+ "FDBF", LTYPE7, AFDBF,
+ "FDBGE", LTYPE7, AFDBGE,
+ "FDBGT", LTYPE7, AFDBGT,
+ "FDBLE", LTYPE7, AFDBLE,
+ "FDBLT", LTYPE7, AFDBLT,
+ "FDBNE", LTYPE7, AFDBNE,
+ "FDBT", LTYPE7, AFDBT,
+ "FDIVB", LTYPE1, AFDIVB,
+ "FDIVD", LTYPE1, AFDIVD,
+ "FDIVF", LTYPE1, AFDIVF,
+ "FDIVL", LTYPE1, AFDIVL,
+ "FDIVW", LTYPE1, AFDIVW,
+ "FETOXB", LTYPE1, AFETOXB,
+ "FETOXD", LTYPE1, AFETOXD,
+ "FETOXF", LTYPE1, AFETOXF,
+ "FETOXL", LTYPE1, AFETOXL,
+ "FETOXM1B", LTYPE1, AFETOXM1B,
+ "FETOXM1D", LTYPE1, AFETOXM1D,
+ "FETOXM1F", LTYPE1, AFETOXM1F,
+ "FETOXM1L", LTYPE1, AFETOXM1L,
+ "FETOXM1W", LTYPE1, AFETOXM1W,
+ "FETOXW", LTYPE1, AFETOXW,
+ "FGETEXPB", LTYPE1, AFGETEXPB,
+ "FGETEXPD", LTYPE1, AFGETEXPD,
+ "FGETEXPF", LTYPE1, AFGETEXPF,
+ "FGETEXPL", LTYPE1, AFGETEXPL,
+ "FGETEXPW", LTYPE1, AFGETEXPW,
+ "FGETMANB", LTYPE1, AFGETMANB,
+ "FGETMAND", LTYPE1, AFGETMAND,
+ "FGETMANF", LTYPE1, AFGETMANF,
+ "FGETMANL", LTYPE1, AFGETMANL,
+ "FGETMANW", LTYPE1, AFGETMANW,
+ "FINTB", LTYPE1, AFINTB,
+ "FINTD", LTYPE1, AFINTD,
+ "FINTF", LTYPE1, AFINTF,
+ "FINTL", LTYPE1, AFINTL,
+ "FINTRZB", LTYPE1, AFINTRZB,
+ "FINTRZD", LTYPE1, AFINTRZD,
+ "FINTRZF", LTYPE1, AFINTRZF,
+ "FINTRZL", LTYPE1, AFINTRZL,
+ "FINTRZW", LTYPE1, AFINTRZW,
+ "FINTW", LTYPE1, AFINTW,
+ "FLOG10B", LTYPE1, AFLOG10B,
+ "FLOG10D", LTYPE1, AFLOG10D,
+ "FLOG10F", LTYPE1, AFLOG10F,
+ "FLOG10L", LTYPE1, AFLOG10L,
+ "FLOG10W", LTYPE1, AFLOG10W,
+ "FLOG2B", LTYPE1, AFLOG2B,
+ "FLOG2D", LTYPE1, AFLOG2D,
+ "FLOG2F", LTYPE1, AFLOG2F,
+ "FLOG2L", LTYPE1, AFLOG2L,
+ "FLOG2W", LTYPE1, AFLOG2W,
+ "FLOGNB", LTYPE1, AFLOGNB,
+ "FLOGND", LTYPE1, AFLOGND,
+ "FLOGNF", LTYPE1, AFLOGNF,
+ "FLOGNL", LTYPE1, AFLOGNL,
+ "FLOGNP1B", LTYPE1, AFLOGNP1B,
+ "FLOGNP1D", LTYPE1, AFLOGNP1D,
+ "FLOGNP1F", LTYPE1, AFLOGNP1F,
+ "FLOGNP1L", LTYPE1, AFLOGNP1L,
+ "FLOGNP1W", LTYPE1, AFLOGNP1W,
+ "FLOGNW", LTYPE1, AFLOGNW,
+ "FMODB", LTYPE1, AFMODB,
+ "FMODD", LTYPE1, AFMODD,
+ "FMODF", LTYPE1, AFMODF,
+ "FMODL", LTYPE1, AFMODL,
+ "FMODW", LTYPE1, AFMODW,
+ "FMOVEB", LTYPE1, AFMOVEB,
+ "FMOVED", LTYPE1, AFMOVED,
+ "FMOVEF", LTYPE1, AFMOVEF,
+ "FMOVEL", LTYPE1, AFMOVEL,
+ "FMOVEW", LTYPE1, AFMOVEW,
+ "FMULB", LTYPE1, AFMULB,
+ "FMULD", LTYPE1, AFMULD,
+ "FMULF", LTYPE1, AFMULF,
+ "FMULL", LTYPE1, AFMULL,
+ "FMULW", LTYPE1, AFMULW,
+ "FNEGB", LTYPE8, AFNEGB,
+ "FNEGD", LTYPE8, AFNEGD,
+ "FNEGF", LTYPE8, AFNEGF,
+ "FNEGL", LTYPE8, AFNEGL,
+ "FNEGW", LTYPE8, AFNEGW,
+ "FREMB", LTYPE1, AFREMB,
+ "FREMD", LTYPE1, AFREMD,
+ "FREMF", LTYPE1, AFREMF,
+ "FREML", LTYPE1, AFREML,
+ "FREMW", LTYPE1, AFREMW,
+ "FSCALEB", LTYPE1, AFSCALEB,
+ "FSCALED", LTYPE1, AFSCALED,
+ "FSCALEF", LTYPE1, AFSCALEF,
+ "FSCALEL", LTYPE1, AFSCALEL,
+ "FSCALEW", LTYPE1, AFSCALEW,
+ "FSEQ", LTYPE1, AFSEQ,
+ "FSF", LTYPE1, AFSF,
+ "FSGE", LTYPE1, AFSGE,
+ "FSGT", LTYPE1, AFSGT,
+ "FSINB", LTYPE1, AFSINB,
+ "FSIND", LTYPE1, AFSIND,
+ "FSINF", LTYPE1, AFSINF,
+ "FSINHB", LTYPE1, AFSINHB,
+ "FSINHD", LTYPE1, AFSINHD,
+ "FSINHF", LTYPE1, AFSINHF,
+ "FSINHL", LTYPE1, AFSINHL,
+ "FSINHW", LTYPE1, AFSINHW,
+ "FSINL", LTYPE1, AFSINL,
+ "FSINW", LTYPE1, AFSINW,
+ "FSLE", LTYPE1, AFSLE,
+ "FSLT", LTYPE1, AFSLT,
+ "FSNE", LTYPE1, AFSNE,
+ "FSQRTB", LTYPE1, AFSQRTB,
+ "FSQRTD", LTYPE1, AFSQRTD,
+ "FSQRTF", LTYPE1, AFSQRTF,
+ "FSQRTL", LTYPE1, AFSQRTL,
+ "FSQRTW", LTYPE1, AFSQRTW,
+ "FST", LTYPE1, AFST,
+ "FSUBB", LTYPE1, AFSUBB,
+ "FSUBD", LTYPE1, AFSUBD,
+ "FSUBF", LTYPE1, AFSUBF,
+ "FSUBL", LTYPE1, AFSUBL,
+ "FSUBW", LTYPE1, AFSUBW,
+ "FTANB", LTYPE1, AFTANB,
+ "FTAND", LTYPE1, AFTAND,
+ "FTANF", LTYPE1, AFTANF,
+ "FTANHB", LTYPE1, AFTANHB,
+ "FTANHD", LTYPE1, AFTANHD,
+ "FTANHF", LTYPE1, AFTANHF,
+ "FTANHL", LTYPE1, AFTANHL,
+ "FTANHW", LTYPE1, AFTANHW,
+ "FTANL", LTYPE1, AFTANL,
+ "FTANW", LTYPE1, AFTANW,
+ "FTENTOXB", LTYPE1, AFTENTOXB,
+ "FTENTOXD", LTYPE1, AFTENTOXD,
+ "FTENTOXF", LTYPE1, AFTENTOXF,
+ "FTENTOXL", LTYPE1, AFTENTOXL,
+ "FTENTOXW", LTYPE1, AFTENTOXW,
+ "FTSTB", LTYPE1, AFTSTB,
+ "FTSTD", LTYPE1, AFTSTD,
+ "FTSTF", LTYPE1, AFTSTF,
+ "FTSTL", LTYPE1, AFTSTL,
+ "FTSTW", LTYPE1, AFTSTW,
+ "FTWOTOXB", LTYPE1, AFTWOTOXB,
+ "FTWOTOXD", LTYPE1, AFTWOTOXD,
+ "FTWOTOXF", LTYPE1, AFTWOTOXF,
+ "FTWOTOXL", LTYPE1, AFTWOTOXL,
+ "FTWOTOXW", LTYPE1, AFTWOTOXW,
+ "FMOVEM", LTYPE1, AFMOVEM,
+ "FMOVEMC", LTYPE1, AFMOVEMC,
+ "FRESTORE", LTYPE3, AFRESTORE,
+ "FSAVE", LTYPE3, AFSAVE,
+ "GLOBL", LTYPE1, AGLOBL,
+ "GOK", LTYPE2, AGOK,
+ "HISTORY", LTYPE2, AHISTORY,
+ "ILLEG", LTYPE2, AILLEG,
+ "INSTR", LTYPE3, AINSTR,
+ "JMP", LTYPE3, AJMP,
+ "JSR", LTYPE3, AJSR,
+ "LEA", LTYPE1, ALEA,
+ "LINKL", LTYPE1, ALINKL,
+ "LINKW", LTYPE1, ALINKW,
+ "LOCATE", LTYPE1, ALOCATE,
+ "LONG", LTYPE3, ALONG,
+ "LSLB", LTYPE1, ALSLB,
+ "LSLL", LTYPE1, ALSLL,
+ "LSLW", LTYPE1, ALSLW,
+ "LSRB", LTYPE1, ALSRB,
+ "LSRL", LTYPE1, ALSRL,
+ "LSRW", LTYPE1, ALSRW,
+ "MOVB", LTYPE1, AMOVB,
+ "MOVEM", LTYPE1, AMOVEM,
+ "MOVEPL", LTYPE1, AMOVEPL,
+ "MOVEPW", LTYPE1, AMOVEPW,
+ "MOVESB", LTYPE1, AMOVESB,
+ "MOVESL", LTYPE1, AMOVESL,
+ "MOVESW", LTYPE1, AMOVESW,
+ "MOVL", LTYPE1, AMOVL,
+ "MOVW", LTYPE1, AMOVW,
+ "MULSL", LTYPE1, AMULSL,
+ "MULSW", LTYPE1, AMULSW,
+ "MULUL", LTYPE1, AMULUL,
+ "MULUW", LTYPE1, AMULUW,
+ "NAME", LTYPE1, ANAME,
+ "NBCD", LTYPE3, ANBCD,
+ "NEGB", LTYPE3, ANEGB,
+ "NEGL", LTYPE3, ANEGL,
+ "NEGW", LTYPE3, ANEGW,
+ "NEGXB", LTYPE3, ANEGXB,
+ "NEGXL", LTYPE3, ANEGXL,
+ "NEGXW", LTYPE3, ANEGXW,
+ "NOP", LTYPE9, ANOP,
+ "NOTB", LTYPE3, ANOTB,
+ "NOTL", LTYPE3, ANOTL,
+ "NOTW", LTYPE3, ANOTW,
+ "ORB", LTYPE1, AORB,
+ "ORL", LTYPE1, AORL,
+ "ORW", LTYPE1, AORW,
+ "PACK", LTYPE1, APACK,
+ "PEA", LTYPE3, APEA,
+ "RESET", LTYPE2, ARESET,
+ "ROTLB", LTYPE1, AROTLB,
+ "ROTLL", LTYPE1, AROTLL,
+ "ROTLW", LTYPE1, AROTLW,
+ "ROTRB", LTYPE1, AROTRB,
+ "ROTRL", LTYPE1, AROTRL,
+ "ROTRW", LTYPE1, AROTRW,
+ "ROXLB", LTYPE1, AROXLB,
+ "ROXLL", LTYPE1, AROXLL,
+ "ROXLW", LTYPE1, AROXLW,
+ "ROXRB", LTYPE1, AROXRB,
+ "ROXRL", LTYPE1, AROXRL,
+ "ROXRW", LTYPE1, AROXRW,
+ "RTD", LTYPE3, ARTD,
+ "RTE", LTYPE2, ARTE,
+ "RTM", LTYPE3, ARTM,
+ "RTR", LTYPE2, ARTR,
+ "RTS", LTYPE2, ARTS,
+ "SBCD", LTYPE1, ASBCD,
+ "SCC", LTYPE3, ASCC,
+ "SCS", LTYPE3, ASCS,
+ "SEQ", LTYPE3, ASEQ,
+ "SF", LTYPE3, ASF,
+ "SGE", LTYPE3, ASGE,
+ "SGT", LTYPE3, ASGT,
+ "SHI", LTYPE3, ASHI,
+ "SLE", LTYPE3, ASLE,
+ "SLS", LTYPE3, ASLS,
+ "SLT", LTYPE3, ASLT,
+ "SMI", LTYPE3, ASMI,
+ "SNE", LTYPE3, ASNE,
+ "SPL", LTYPE3, ASPL,
+ "ST", LTYPE3, AST,
+ "STOP", LTYPE3, ASTOP,
+ "SUBB", LTYPE1, ASUBB,
+ "SUBL", LTYPE1, ASUBL,
+ "SUBW", LTYPE1, ASUBW,
+ "SUBXB", LTYPE1, ASUBXB,
+ "SUBXL", LTYPE1, ASUBXL,
+ "SUBXW", LTYPE1, ASUBXW,
+ "SVC", LTYPE2, ASVC,
+ "SVS", LTYPE2, ASVS,
+ "SWAP", LTYPE3, ASWAP,
+ "SYS", LTYPE2, ASYS,
+ "TAS", LTYPE3, ATAS,
+ "TEXT", LTYPEB, ATEXT,
+ "TRAP", LTYPE3, ATRAP,
+ "TRAPCC", LTYPE2, ATRAPCC,
+ "TRAPCS", LTYPE2, ATRAPCS,
+ "TRAPEQ", LTYPE2, ATRAPEQ,
+ "TRAPF", LTYPE2, ATRAPF,
+ "TRAPGE", LTYPE2, ATRAPGE,
+ "TRAPGT", LTYPE2, ATRAPGT,
+ "TRAPHI", LTYPE2, ATRAPHI,
+ "TRAPLE", LTYPE2, ATRAPLE,
+ "TRAPLS", LTYPE2, ATRAPLS,
+ "TRAPLT", LTYPE2, ATRAPLT,
+ "TRAPMI", LTYPE2, ATRAPMI,
+ "TRAPNE", LTYPE2, ATRAPNE,
+ "TRAPPL", LTYPE2, ATRAPPL,
+ "TRAPT", LTYPE2, ATRAPT,
+ "TRAPV", LTYPE2, ATRAPV,
+ "TRAPVC", LTYPE2, ATRAPVC,
+ "TRAPVS", LTYPE2, ATRAPVS,
+ "TSTB", LTYPE3, ATSTB,
+ "TSTL", LTYPE3, ATSTL,
+ "TSTW", LTYPE3, ATSTW,
+ "UNLK", LTYPE3, AUNLK,
+ "UNPK", LTYPE1, AUNPK,
+ "WORD", LTYPE3, AWORD,
+
+ 0
+};
+
+void
+cinit(void)
+{
+ Sym *s;
+ int i;
+
+ nullgen.sym = S;
+ nullgen.offset = 0;
+ nullgen.type = D_NONE;
+ if(FPCHIP)
+ nullgen.dval = 0;
+ for(i=0; i<sizeof(nullgen.sval); i++)
+ nullgen.sval[i] = 0;
+ nullgen.displace = 0;
+ nullgen.type = D_NONE;
+ nullgen.field = 0;
+
+ nerrors = 0;
+ iostack = I;
+ iofree = I;
+ peekc = IGN;
+ nhunk = 0;
+ for(i=0; i<NHASH; i++)
+ hash[i] = S;
+ for(i=0; itab[i].name; i++) {
+ s = slookup(itab[i].name);
+ s->type = itab[i].type;
+ s->value = itab[i].value;
+ }
+
+ pathname = allocn(pathname, 0, 100);
+ if(mygetwd(pathname, 99) == 0) {
+ pathname = allocn(pathname, 100, 900);
+ if(mygetwd(pathname, 999) == 0)
+ strcpy(pathname, "/???");
+ }
+}
+
+void
+syminit(Sym *s)
+{
+
+ s->type = LNAME;
+ s->value = 0;
+}
+
+void
+cclean(void)
+{
+ Gen2 g2;
+
+ g2.from = nullgen;
+ g2.to = nullgen;
+ outcode(AEND, &g2);
+ Bflush(&obuf);
+}
+
+void
+zname(char *n, int t, int s)
+{
+
+ Bputc(&obuf, ANAME); /* as */
+ Bputc(&obuf, ANAME>>8);
+ Bputc(&obuf, t); /* type */
+ Bputc(&obuf, s); /* sym */
+ while(*n) {
+ Bputc(&obuf, *n);
+ n++;
+ }
+ Bputc(&obuf, 0);
+}
+
+void
+zaddr(Gen *a, int s)
+{
+ long l;
+ int i, t;
+ char *n;
+ Ieee e;
+
+ t = 0;
+ if(a->field)
+ t |= T_FIELD;
+ if(a->displace != 0)
+ t |= T_INDEX;
+ if(a->offset != 0)
+ t |= T_OFFSET;
+ if(s != 0)
+ t |= T_SYM;
+
+ if(a->type == D_FCONST)
+ t |= T_FCONST;
+ else
+ if(a->type == D_SCONST)
+ t |= T_SCONST;
+ else
+ if(a->type & ~0xff)
+ t |= T_TYPE;
+ Bputc(&obuf, t);
+
+ if(t & T_FIELD) { /* implies field */
+ i = a->field;
+ Bputc(&obuf, i);
+ Bputc(&obuf, i>>8);
+ }
+ if(t & T_INDEX) { /* implies index, scale, displace */
+ i = D_NONE;
+ Bputc(&obuf, i);
+ Bputc(&obuf, i>>8);
+ Bputc(&obuf, 0);
+ l = a->displace;
+ Bputc(&obuf, l);
+ Bputc(&obuf, l>>8);
+ Bputc(&obuf, l>>16);
+ Bputc(&obuf, l>>24);
+ }
+ if(t & T_OFFSET) { /* implies offset */
+ l = a->offset;
+ Bputc(&obuf, l);
+ Bputc(&obuf, l>>8);
+ Bputc(&obuf, l>>16);
+ Bputc(&obuf, l>>24);
+ }
+ if(t & T_SYM) /* implies sym */
+ Bputc(&obuf, s);
+ if(t & T_FCONST) {
+ ieeedtod(&e, a->dval);
+ l = e.l;
+ Bputc(&obuf, l);
+ Bputc(&obuf, l>>8);
+ Bputc(&obuf, l>>16);
+ Bputc(&obuf, l>>24);
+ l = e.h;
+ Bputc(&obuf, l);
+ Bputc(&obuf, l>>8);
+ Bputc(&obuf, l>>16);
+ Bputc(&obuf, l>>24);
+ return;
+ }
+ if(t & T_SCONST) {
+ n = a->sval;
+ for(i=0; i<NSNAME; i++) {
+ Bputc(&obuf, *n);
+ n++;
+ }
+ return;
+ }
+ i = a->type;
+ Bputc(&obuf, i);
+ if(t & T_TYPE)
+ Bputc(&obuf, i>>8);
+}
+
+void
+outcode(int a, Gen2 *g2)
+{
+ int sf, st, t;
+ Sym *s;
+
+ if(pass == 1)
+ goto out;
+
+jackpot:
+ sf = 0;
+ s = g2->from.sym;
+ while(s != S) {
+ sf = s->sym;
+ if(sf < 0 || sf >= NSYM)
+ sf = 0;
+ t = g2->from.type & D_MASK;
+ if(h[sf].type == t)
+ if(h[sf].sym == s)
+ break;
+ zname(s->name, t, sym);
+ s->sym = sym;
+ h[sym].sym = s;
+ h[sym].type = t;
+ sf = sym;
+ sym++;
+ if(sym >= NSYM)
+ sym = 1;
+ break;
+ }
+ st = 0;
+ s = g2->to.sym;
+ while(s != S) {
+ st = s->sym;
+ if(st < 0 || st >= NSYM)
+ st = 0;
+ t = g2->to.type & D_MASK;
+ if(h[st].type == t)
+ if(h[st].sym == s)
+ break;
+ zname(s->name, t, sym);
+ s->sym = sym;
+ h[sym].sym = s;
+ h[sym].type = t;
+ st = sym;
+ sym++;
+ if(sym >= NSYM)
+ sym = 1;
+ if(st == sf)
+ goto jackpot;
+ break;
+ }
+ Bputc(&obuf, a);
+ Bputc(&obuf, a>>8);
+ Bputc(&obuf, lineno);
+ Bputc(&obuf, lineno>>8);
+ Bputc(&obuf, lineno>>16);
+ Bputc(&obuf, lineno>>24);
+ zaddr(&g2->from, sf);
+ zaddr(&g2->to, st);
+
+out:
+ if(a != AGLOBL && a != ADATA)
+ pc++;
+}
+
+void
+outhist(void)
+{
+ Gen g;
+ Hist *h;
+ char *p, *q, *op, c;
+ int n;
+
+ g = nullgen;
+ c = pathchar();
+ for(h = hist; h != H; h = h->link) {
+ p = h->name;
+ op = 0;
+ if(p && p[0] != c && h->offset == 0 && pathname){
+ /* on windows skip drive specifier in pathname */
+ if(systemtype(Windows) && pathname[1] == ':') {
+ op = p;
+ p = pathname+2;
+ c = *p;
+ } else if(pathname[0] == c){
+ op = p;
+ p = pathname;
+ }
+ }
+ while(p) {
+ q = strchr(p, c);
+ if(q) {
+ n = q-p;
+ if(n == 0){
+ n = 1; /* leading "/" */
+ *p = '/'; /* don't emit "\" on windows */
+ }
+ q++;
+ } else {
+ n = strlen(p);
+ q = 0;
+ }
+ if(n) {
+ Bputc(&obuf, ANAME);
+ Bputc(&obuf, ANAME>>8);
+ Bputc(&obuf, D_FILE); /* type */
+ Bputc(&obuf, 1); /* sym */
+ Bputc(&obuf, '<');
+ Bwrite(&obuf, p, n);
+ Bputc(&obuf, 0);
+ }
+ p = q;
+ if(p == 0 && op) {
+ p = op;
+ op = 0;
+ }
+ }
+ g.offset = h->offset;
+
+ Bputc(&obuf, AHISTORY);
+ Bputc(&obuf, AHISTORY>>8);
+ Bputc(&obuf, h->line);
+ Bputc(&obuf, h->line>>8);
+ Bputc(&obuf, h->line>>16);
+ Bputc(&obuf, h->line>>24);
+ zaddr(&nullgen, 0);
+ zaddr(&g, 0);
+ }
+}
+
+#include "../cc/lexbody"
+#include "../cc/macbody"
+#include "../cc/compat"