ref: 9b69f546334e94ec191d35b15dcaace98fbdcb1b
dir: /sys/src/cmd/1a/lex.c/
#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, *p;
int i, of;
ofile = strdup(file);
p = utfrrune(ofile, pathchar());
if(p) {
include[0] = ofile;
*p++ = 0;
} else
p = ofile;
if(outfile == 0) {
if(p){
outfile = p;
p = utfrrune(outfile, '.');
if(p)
if(p[1] == 's' && p[2] == 0)
p[0] = 0;
outfile = smprint("%s.%C", outfile, thechar);
} else
outfile = "/dev/null";
}
p = getenv("INCLUDE");
if(p) {
setinclude(p);
} else {
if(systemtype(Plan9))
setinclude(smprint("/%s/include", thestring));
}
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;
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"