174a4d8c2SCharles.Forsyth #define EXTERN
274a4d8c2SCharles.Forsyth #include "a.h"
374a4d8c2SCharles.Forsyth #include "y.tab.h"
474a4d8c2SCharles.Forsyth #include <ctype.h>
574a4d8c2SCharles.Forsyth
674a4d8c2SCharles.Forsyth void
main(int argc,char * argv[])774a4d8c2SCharles.Forsyth main(int argc, char *argv[])
874a4d8c2SCharles.Forsyth {
974a4d8c2SCharles.Forsyth char *p;
1074a4d8c2SCharles.Forsyth int nout, nproc, status, i, c;
1174a4d8c2SCharles.Forsyth
1274a4d8c2SCharles.Forsyth thechar = 'k';
1374a4d8c2SCharles.Forsyth thestring = "sparc";
1474a4d8c2SCharles.Forsyth memset(debug, 0, sizeof(debug));
1574a4d8c2SCharles.Forsyth cinit();
1674a4d8c2SCharles.Forsyth outfile = 0;
1774a4d8c2SCharles.Forsyth include[ninclude++] = ".";
1874a4d8c2SCharles.Forsyth ARGBEGIN {
1974a4d8c2SCharles.Forsyth default:
2074a4d8c2SCharles.Forsyth c = ARGC();
2174a4d8c2SCharles.Forsyth if(c >= 0 || c < sizeof(debug))
2274a4d8c2SCharles.Forsyth debug[c] = 1;
2374a4d8c2SCharles.Forsyth break;
2474a4d8c2SCharles.Forsyth
2574a4d8c2SCharles.Forsyth case 'o':
2674a4d8c2SCharles.Forsyth outfile = ARGF();
2774a4d8c2SCharles.Forsyth break;
2874a4d8c2SCharles.Forsyth
2974a4d8c2SCharles.Forsyth case 'D':
3074a4d8c2SCharles.Forsyth p = ARGF();
3174a4d8c2SCharles.Forsyth if(p)
3274a4d8c2SCharles.Forsyth Dlist[nDlist++] = p;
3374a4d8c2SCharles.Forsyth break;
3474a4d8c2SCharles.Forsyth
3574a4d8c2SCharles.Forsyth case 'I':
3674a4d8c2SCharles.Forsyth p = ARGF();
3774a4d8c2SCharles.Forsyth setinclude(p);
3874a4d8c2SCharles.Forsyth break;
3974a4d8c2SCharles.Forsyth } ARGEND
4074a4d8c2SCharles.Forsyth if(*argv == 0) {
4174a4d8c2SCharles.Forsyth print("usage: %ca [-options] file.s\n", thechar);
4274a4d8c2SCharles.Forsyth errorexit();
4374a4d8c2SCharles.Forsyth }
4474a4d8c2SCharles.Forsyth if(argc > 1 && systemtype(Windows)){
4574a4d8c2SCharles.Forsyth print("can't assemble multiple files on windows\n");
4674a4d8c2SCharles.Forsyth errorexit();
4774a4d8c2SCharles.Forsyth }
4874a4d8c2SCharles.Forsyth if(argc > 1 && !systemtype(Windows)) {
4974a4d8c2SCharles.Forsyth nproc = 1;
5074a4d8c2SCharles.Forsyth if(p = getenv("NPROC"))
5174a4d8c2SCharles.Forsyth nproc = atol(p); /* */
5274a4d8c2SCharles.Forsyth c = 0;
5374a4d8c2SCharles.Forsyth nout = 0;
5474a4d8c2SCharles.Forsyth for(;;) {
5574a4d8c2SCharles.Forsyth while(nout < nproc && argc > 0) {
5674a4d8c2SCharles.Forsyth i = myfork();
5774a4d8c2SCharles.Forsyth if(i < 0) {
5874a4d8c2SCharles.Forsyth i = mywait(&status);
5974a4d8c2SCharles.Forsyth if(i < 0)
6074a4d8c2SCharles.Forsyth errorexit();
6174a4d8c2SCharles.Forsyth if(status)
6274a4d8c2SCharles.Forsyth c++;
6374a4d8c2SCharles.Forsyth nout--;
6474a4d8c2SCharles.Forsyth continue;
6574a4d8c2SCharles.Forsyth }
6674a4d8c2SCharles.Forsyth if(i == 0) {
6774a4d8c2SCharles.Forsyth print("%s:\n", *argv);
6874a4d8c2SCharles.Forsyth if(assemble(*argv))
6974a4d8c2SCharles.Forsyth errorexit();
7074a4d8c2SCharles.Forsyth exits(0);
7174a4d8c2SCharles.Forsyth }
7274a4d8c2SCharles.Forsyth nout++;
7374a4d8c2SCharles.Forsyth argc--;
7474a4d8c2SCharles.Forsyth argv++;
7574a4d8c2SCharles.Forsyth }
7674a4d8c2SCharles.Forsyth i = mywait(&status);
7774a4d8c2SCharles.Forsyth if(i < 0) {
7874a4d8c2SCharles.Forsyth if(c)
7974a4d8c2SCharles.Forsyth errorexit();
8074a4d8c2SCharles.Forsyth exits(0);
8174a4d8c2SCharles.Forsyth }
8274a4d8c2SCharles.Forsyth if(status)
8374a4d8c2SCharles.Forsyth c++;
8474a4d8c2SCharles.Forsyth nout--;
8574a4d8c2SCharles.Forsyth }
8674a4d8c2SCharles.Forsyth }
8774a4d8c2SCharles.Forsyth if(assemble(argv[0]))
8874a4d8c2SCharles.Forsyth errorexit();
8974a4d8c2SCharles.Forsyth exits(0);
9074a4d8c2SCharles.Forsyth }
9174a4d8c2SCharles.Forsyth
9274a4d8c2SCharles.Forsyth int
assemble(char * file)9374a4d8c2SCharles.Forsyth assemble(char *file)
9474a4d8c2SCharles.Forsyth {
9574a4d8c2SCharles.Forsyth char ofile[100], incfile[20], *p;
9674a4d8c2SCharles.Forsyth int i, of;
9774a4d8c2SCharles.Forsyth
9874a4d8c2SCharles.Forsyth strcpy(ofile, file);
9974a4d8c2SCharles.Forsyth p = utfrrune(ofile, pathchar());
10074a4d8c2SCharles.Forsyth if(p) {
10174a4d8c2SCharles.Forsyth include[0] = ofile;
10274a4d8c2SCharles.Forsyth *p++ = 0;
10374a4d8c2SCharles.Forsyth } else
10474a4d8c2SCharles.Forsyth p = ofile;
10574a4d8c2SCharles.Forsyth if(outfile == 0) {
10674a4d8c2SCharles.Forsyth outfile = p;
10774a4d8c2SCharles.Forsyth if(outfile){
10874a4d8c2SCharles.Forsyth p = utfrrune(outfile, '.');
10974a4d8c2SCharles.Forsyth if(p)
11074a4d8c2SCharles.Forsyth if(p[1] == 's' && p[2] == 0)
11174a4d8c2SCharles.Forsyth p[0] = 0;
11274a4d8c2SCharles.Forsyth p = utfrune(outfile, 0);
11374a4d8c2SCharles.Forsyth p[0] = '.';
11474a4d8c2SCharles.Forsyth p[1] = thechar;
11574a4d8c2SCharles.Forsyth p[2] = 0;
11674a4d8c2SCharles.Forsyth } else
11774a4d8c2SCharles.Forsyth outfile = "/dev/null";
11874a4d8c2SCharles.Forsyth }
11974a4d8c2SCharles.Forsyth p = getenv("INCLUDE");
12074a4d8c2SCharles.Forsyth if(p) {
12174a4d8c2SCharles.Forsyth setinclude(p);
12274a4d8c2SCharles.Forsyth } else {
12374a4d8c2SCharles.Forsyth if(systemtype(Plan9)) {
12474a4d8c2SCharles.Forsyth sprint(incfile,"/%s/include", thestring);
12574a4d8c2SCharles.Forsyth setinclude(strdup(incfile));
12674a4d8c2SCharles.Forsyth }
12774a4d8c2SCharles.Forsyth }
12874a4d8c2SCharles.Forsyth
12974a4d8c2SCharles.Forsyth of = mycreat(outfile, 0664);
13074a4d8c2SCharles.Forsyth if(of < 0) {
13174a4d8c2SCharles.Forsyth yyerror("%ca: cannot create %s", thechar, outfile);
13274a4d8c2SCharles.Forsyth errorexit();
13374a4d8c2SCharles.Forsyth }
13474a4d8c2SCharles.Forsyth Binit(&obuf, of, OWRITE);
13574a4d8c2SCharles.Forsyth
13674a4d8c2SCharles.Forsyth pass = 1;
13774a4d8c2SCharles.Forsyth pinit(file);
13874a4d8c2SCharles.Forsyth for(i=0; i<nDlist; i++)
13974a4d8c2SCharles.Forsyth dodefine(Dlist[i]);
14074a4d8c2SCharles.Forsyth yyparse();
14174a4d8c2SCharles.Forsyth if(nerrors) {
14274a4d8c2SCharles.Forsyth cclean();
14374a4d8c2SCharles.Forsyth return nerrors;
14474a4d8c2SCharles.Forsyth }
14574a4d8c2SCharles.Forsyth
14674a4d8c2SCharles.Forsyth pass = 2;
14774a4d8c2SCharles.Forsyth outhist();
14874a4d8c2SCharles.Forsyth pinit(file);
14974a4d8c2SCharles.Forsyth for(i=0; i<nDlist; i++)
15074a4d8c2SCharles.Forsyth dodefine(Dlist[i]);
15174a4d8c2SCharles.Forsyth yyparse();
15274a4d8c2SCharles.Forsyth cclean();
15374a4d8c2SCharles.Forsyth return nerrors;
15474a4d8c2SCharles.Forsyth }
15574a4d8c2SCharles.Forsyth
15674a4d8c2SCharles.Forsyth struct
15774a4d8c2SCharles.Forsyth {
15874a4d8c2SCharles.Forsyth char *name;
15974a4d8c2SCharles.Forsyth ushort type;
16074a4d8c2SCharles.Forsyth ushort value;
16174a4d8c2SCharles.Forsyth } itab[] =
16274a4d8c2SCharles.Forsyth {
16374a4d8c2SCharles.Forsyth "SP", LSP, D_AUTO,
16474a4d8c2SCharles.Forsyth "SB", LSB, D_EXTERN,
16574a4d8c2SCharles.Forsyth "FP", LFP, D_PARAM,
16674a4d8c2SCharles.Forsyth "PC", LPC, D_BRANCH,
16774a4d8c2SCharles.Forsyth
16874a4d8c2SCharles.Forsyth "FSR", LFSR, D_FSR,
16974a4d8c2SCharles.Forsyth "CSR", LFSR, D_CSR,
17074a4d8c2SCharles.Forsyth
17174a4d8c2SCharles.Forsyth "FQ", LFPQ, D_FPQ,
17274a4d8c2SCharles.Forsyth "CQ", LFPQ, D_CPQ,
17374a4d8c2SCharles.Forsyth
17474a4d8c2SCharles.Forsyth "Y", LPSR, D_Y,
17574a4d8c2SCharles.Forsyth "PSR", LPSR, D_PSR,
17674a4d8c2SCharles.Forsyth "WIM", LPSR, D_WIM,
17774a4d8c2SCharles.Forsyth "TBR", LPSR, D_TBR,
17874a4d8c2SCharles.Forsyth
17974a4d8c2SCharles.Forsyth "R", LR, 0,
18074a4d8c2SCharles.Forsyth "R0", LREG, 0,
18174a4d8c2SCharles.Forsyth "R1", LREG, 1,
18274a4d8c2SCharles.Forsyth "R2", LREG, 2,
18374a4d8c2SCharles.Forsyth "R3", LREG, 3,
18474a4d8c2SCharles.Forsyth "R4", LREG, 4,
18574a4d8c2SCharles.Forsyth "R5", LREG, 5,
18674a4d8c2SCharles.Forsyth "R6", LREG, 6,
18774a4d8c2SCharles.Forsyth "R7", LREG, 7,
18874a4d8c2SCharles.Forsyth "R8", LREG, 8,
18974a4d8c2SCharles.Forsyth "R9", LREG, 9,
19074a4d8c2SCharles.Forsyth "R10", LREG, 10,
19174a4d8c2SCharles.Forsyth "R11", LREG, 11,
19274a4d8c2SCharles.Forsyth "R12", LREG, 12,
19374a4d8c2SCharles.Forsyth "R13", LREG, 13,
19474a4d8c2SCharles.Forsyth "R14", LREG, 14,
19574a4d8c2SCharles.Forsyth "R15", LREG, 15,
19674a4d8c2SCharles.Forsyth "R16", LREG, 16,
19774a4d8c2SCharles.Forsyth "R17", LREG, 17,
19874a4d8c2SCharles.Forsyth "R18", LREG, 18,
19974a4d8c2SCharles.Forsyth "R19", LREG, 19,
20074a4d8c2SCharles.Forsyth "R20", LREG, 20,
20174a4d8c2SCharles.Forsyth "R21", LREG, 21,
20274a4d8c2SCharles.Forsyth "R22", LREG, 22,
20374a4d8c2SCharles.Forsyth "R23", LREG, 23,
20474a4d8c2SCharles.Forsyth "R24", LREG, 24,
20574a4d8c2SCharles.Forsyth "R25", LREG, 25,
20674a4d8c2SCharles.Forsyth "R26", LREG, 26,
20774a4d8c2SCharles.Forsyth "R27", LREG, 27,
20874a4d8c2SCharles.Forsyth "R28", LREG, 28,
20974a4d8c2SCharles.Forsyth "R29", LREG, 29,
21074a4d8c2SCharles.Forsyth "R30", LREG, 30,
21174a4d8c2SCharles.Forsyth "R31", LREG, 31,
21274a4d8c2SCharles.Forsyth
21374a4d8c2SCharles.Forsyth "C", LC, 0,
21474a4d8c2SCharles.Forsyth "C0", LCREG, 0,
21574a4d8c2SCharles.Forsyth "C1", LCREG, 1,
21674a4d8c2SCharles.Forsyth "C2", LCREG, 2,
21774a4d8c2SCharles.Forsyth "C3", LCREG, 3,
21874a4d8c2SCharles.Forsyth "C4", LCREG, 4,
21974a4d8c2SCharles.Forsyth "C5", LCREG, 5,
22074a4d8c2SCharles.Forsyth "C6", LCREG, 6,
22174a4d8c2SCharles.Forsyth "C7", LCREG, 7,
22274a4d8c2SCharles.Forsyth "C8", LCREG, 8,
22374a4d8c2SCharles.Forsyth "C9", LCREG, 9,
22474a4d8c2SCharles.Forsyth "C10", LCREG, 10,
22574a4d8c2SCharles.Forsyth "C11", LCREG, 11,
22674a4d8c2SCharles.Forsyth "C12", LCREG, 12,
22774a4d8c2SCharles.Forsyth "C13", LCREG, 13,
22874a4d8c2SCharles.Forsyth "C14", LCREG, 14,
22974a4d8c2SCharles.Forsyth "C15", LCREG, 15,
23074a4d8c2SCharles.Forsyth "C16", LCREG, 16,
23174a4d8c2SCharles.Forsyth "C17", LCREG, 17,
23274a4d8c2SCharles.Forsyth "C18", LCREG, 18,
23374a4d8c2SCharles.Forsyth "C19", LCREG, 19,
23474a4d8c2SCharles.Forsyth "C20", LCREG, 20,
23574a4d8c2SCharles.Forsyth "C21", LCREG, 21,
23674a4d8c2SCharles.Forsyth "C22", LCREG, 22,
23774a4d8c2SCharles.Forsyth "C23", LCREG, 23,
23874a4d8c2SCharles.Forsyth "C24", LCREG, 24,
23974a4d8c2SCharles.Forsyth "C25", LCREG, 25,
24074a4d8c2SCharles.Forsyth "C26", LCREG, 26,
24174a4d8c2SCharles.Forsyth "C27", LCREG, 27,
24274a4d8c2SCharles.Forsyth "C28", LCREG, 28,
24374a4d8c2SCharles.Forsyth "C29", LCREG, 29,
24474a4d8c2SCharles.Forsyth "C30", LCREG, 30,
24574a4d8c2SCharles.Forsyth "C31", LCREG, 31,
24674a4d8c2SCharles.Forsyth
24774a4d8c2SCharles.Forsyth "F", LF, 0,
24874a4d8c2SCharles.Forsyth "F0", LFREG, 0,
24974a4d8c2SCharles.Forsyth "F2", LFREG, 2,
25074a4d8c2SCharles.Forsyth "F4", LFREG, 4,
25174a4d8c2SCharles.Forsyth "F6", LFREG, 6,
25274a4d8c2SCharles.Forsyth "F8", LFREG, 8,
25374a4d8c2SCharles.Forsyth "F10", LFREG, 10,
25474a4d8c2SCharles.Forsyth "F12", LFREG, 12,
25574a4d8c2SCharles.Forsyth "F14", LFREG, 14,
25674a4d8c2SCharles.Forsyth "F16", LFREG, 16,
25774a4d8c2SCharles.Forsyth "F18", LFREG, 18,
25874a4d8c2SCharles.Forsyth "F20", LFREG, 20,
25974a4d8c2SCharles.Forsyth "F22", LFREG, 22,
26074a4d8c2SCharles.Forsyth "F24", LFREG, 24,
26174a4d8c2SCharles.Forsyth "F26", LFREG, 26,
26274a4d8c2SCharles.Forsyth "F28", LFREG, 28,
26374a4d8c2SCharles.Forsyth "F30", LFREG, 30,
26474a4d8c2SCharles.Forsyth "F1", LFREG, 1,
26574a4d8c2SCharles.Forsyth "F3", LFREG, 3,
26674a4d8c2SCharles.Forsyth "F5", LFREG, 5,
26774a4d8c2SCharles.Forsyth "F7", LFREG, 7,
26874a4d8c2SCharles.Forsyth "F9", LFREG, 9,
26974a4d8c2SCharles.Forsyth "F11", LFREG, 11,
27074a4d8c2SCharles.Forsyth "F13", LFREG, 13,
27174a4d8c2SCharles.Forsyth "F15", LFREG, 15,
27274a4d8c2SCharles.Forsyth "F17", LFREG, 17,
27374a4d8c2SCharles.Forsyth "F19", LFREG, 19,
27474a4d8c2SCharles.Forsyth "F21", LFREG, 21,
27574a4d8c2SCharles.Forsyth "F23", LFREG, 23,
27674a4d8c2SCharles.Forsyth "F25", LFREG, 25,
27774a4d8c2SCharles.Forsyth "F27", LFREG, 27,
27874a4d8c2SCharles.Forsyth "F29", LFREG, 29,
27974a4d8c2SCharles.Forsyth "F31", LFREG, 31,
28074a4d8c2SCharles.Forsyth
28174a4d8c2SCharles.Forsyth "ADD", LADDW, AADD,
28274a4d8c2SCharles.Forsyth "ADDCC", LADDW, AADDCC,
28374a4d8c2SCharles.Forsyth "ADDX", LADDW, AADDX,
28474a4d8c2SCharles.Forsyth "ADDXCC", LADDW, AADDXCC,
28574a4d8c2SCharles.Forsyth "AND", LADDW, AAND,
28674a4d8c2SCharles.Forsyth "ANDCC", LADDW, AANDCC,
28774a4d8c2SCharles.Forsyth "ANDN", LADDW, AANDN,
28874a4d8c2SCharles.Forsyth "ANDNCC", LADDW, AANDNCC,
28974a4d8c2SCharles.Forsyth "BA", LBRA, ABA,
29074a4d8c2SCharles.Forsyth "BCC", LBRA, ABCC,
29174a4d8c2SCharles.Forsyth "BCS", LBRA, ABCS,
29274a4d8c2SCharles.Forsyth "BE", LBRA, ABE,
29374a4d8c2SCharles.Forsyth "BG", LBRA, ABG,
29474a4d8c2SCharles.Forsyth "BGE", LBRA, ABGE,
29574a4d8c2SCharles.Forsyth "BGU", LBRA, ABGU,
29674a4d8c2SCharles.Forsyth "BL", LBRA, ABL,
29774a4d8c2SCharles.Forsyth "BLE", LBRA, ABLE,
29874a4d8c2SCharles.Forsyth "BLEU", LBRA, ABLEU,
29974a4d8c2SCharles.Forsyth "BN", LBRA, ABN,
30074a4d8c2SCharles.Forsyth "BNE", LBRA, ABNE,
30174a4d8c2SCharles.Forsyth "BNEG", LBRA, ABNEG,
30274a4d8c2SCharles.Forsyth "BPOS", LBRA, ABPOS,
30374a4d8c2SCharles.Forsyth "BVC", LBRA, ABVC,
30474a4d8c2SCharles.Forsyth "BVS", LBRA, ABVS,
30574a4d8c2SCharles.Forsyth "CB0", LBRA, ACB0,
30674a4d8c2SCharles.Forsyth "CB01", LBRA, ACB01,
30774a4d8c2SCharles.Forsyth "CB012", LBRA, ACB012,
30874a4d8c2SCharles.Forsyth "CB013", LBRA, ACB013,
30974a4d8c2SCharles.Forsyth "CB02", LBRA, ACB02,
31074a4d8c2SCharles.Forsyth "CB023", LBRA, ACB023,
31174a4d8c2SCharles.Forsyth "CB03", LBRA, ACB03,
31274a4d8c2SCharles.Forsyth "CB1", LBRA, ACB1,
31374a4d8c2SCharles.Forsyth "CB12", LBRA, ACB12,
31474a4d8c2SCharles.Forsyth "CB123", LBRA, ACB123,
31574a4d8c2SCharles.Forsyth "CB13", LBRA, ACB13,
31674a4d8c2SCharles.Forsyth "CB2", LBRA, ACB2,
31774a4d8c2SCharles.Forsyth "CB23", LBRA, ACB23,
31874a4d8c2SCharles.Forsyth "CB3", LBRA, ACB3,
31974a4d8c2SCharles.Forsyth "CBA", LBRA, ACBA,
32074a4d8c2SCharles.Forsyth "CBN", LBRA, ACBN,
32174a4d8c2SCharles.Forsyth "CMP", LCMP, ACMP,
32274a4d8c2SCharles.Forsyth "CPOP1", LCPOP, ACPOP1,
32374a4d8c2SCharles.Forsyth "CPOP2", LCPOP, ACPOP2,
32474a4d8c2SCharles.Forsyth "DATA", LDATA, ADATA,
32574a4d8c2SCharles.Forsyth "DIV", LADDW, ADIV,
32674a4d8c2SCharles.Forsyth "DIVL", LADDW, ADIVL,
32774a4d8c2SCharles.Forsyth "END", LEND, AEND,
32874a4d8c2SCharles.Forsyth "FABSD", LFCONV, AFABSD,
32974a4d8c2SCharles.Forsyth "FABSF", LFCONV, AFABSF,
33074a4d8c2SCharles.Forsyth "FABSX", LFCONV, AFABSX,
33174a4d8c2SCharles.Forsyth "FADDD", LFADD, AFADDD,
33274a4d8c2SCharles.Forsyth "FADDF", LFADD, AFADDF,
33374a4d8c2SCharles.Forsyth "FADDX", LFADD, AFADDX,
33474a4d8c2SCharles.Forsyth "FBA", LBRA, AFBA,
33574a4d8c2SCharles.Forsyth "FBE", LBRA, AFBE,
33674a4d8c2SCharles.Forsyth "FBG", LBRA, AFBG,
33774a4d8c2SCharles.Forsyth "FBGE", LBRA, AFBGE,
33874a4d8c2SCharles.Forsyth "FBL", LBRA, AFBL,
33974a4d8c2SCharles.Forsyth "FBLE", LBRA, AFBLE,
34074a4d8c2SCharles.Forsyth "FBLG", LBRA, AFBLG,
34174a4d8c2SCharles.Forsyth "FBN", LBRA, AFBN,
34274a4d8c2SCharles.Forsyth "FBNE", LBRA, AFBNE,
34374a4d8c2SCharles.Forsyth "FBO", LBRA, AFBO,
34474a4d8c2SCharles.Forsyth "FBU", LBRA, AFBU,
34574a4d8c2SCharles.Forsyth "FBUE", LBRA, AFBUE,
34674a4d8c2SCharles.Forsyth "FBUG", LBRA, AFBUG,
34774a4d8c2SCharles.Forsyth "FBUGE", LBRA, AFBUGE,
34874a4d8c2SCharles.Forsyth "FBUL", LBRA, AFBUL,
34974a4d8c2SCharles.Forsyth "FBULE", LBRA, AFBULE,
35074a4d8c2SCharles.Forsyth "FCMPD", LFADD, AFCMPD,
35174a4d8c2SCharles.Forsyth "FCMPED", LFADD, AFCMPED,
35274a4d8c2SCharles.Forsyth "FCMPEF", LFADD, AFCMPEF,
35374a4d8c2SCharles.Forsyth "FCMPEX", LFADD, AFCMPEX,
35474a4d8c2SCharles.Forsyth "FCMPF", LFADD, AFCMPF,
35574a4d8c2SCharles.Forsyth "FCMPX", LFADD, AFCMPX,
35674a4d8c2SCharles.Forsyth "FDIVD", LFADD, AFDIVD,
35774a4d8c2SCharles.Forsyth "FDIVF", LFADD, AFDIVF,
35874a4d8c2SCharles.Forsyth "FDIVX", LFADD, AFDIVX,
35974a4d8c2SCharles.Forsyth "FMOVD", LFMOV, AFMOVD,
36074a4d8c2SCharles.Forsyth "FMOVDF", LFCONV, AFMOVDF,
36174a4d8c2SCharles.Forsyth "FMOVDW", LFCONV, AFMOVDW,
36274a4d8c2SCharles.Forsyth "FMOVDX", LFCONV, AFMOVDX,
36374a4d8c2SCharles.Forsyth "FMOVF", LFMOV, AFMOVF,
36474a4d8c2SCharles.Forsyth "FMOVFD", LFCONV, AFMOVFD,
36574a4d8c2SCharles.Forsyth "FMOVFW", LFCONV, AFMOVFW,
36674a4d8c2SCharles.Forsyth "FMOVFX", LFCONV, AFMOVFX,
36774a4d8c2SCharles.Forsyth "FMOVWD", LFCONV, AFMOVWD,
36874a4d8c2SCharles.Forsyth "FMOVWF", LFCONV, AFMOVWF,
36974a4d8c2SCharles.Forsyth "FMOVWX", LFCONV, AFMOVWX,
37074a4d8c2SCharles.Forsyth "FMOVX", LFCONV, AFMOVX,
37174a4d8c2SCharles.Forsyth "FMOVXD", LFCONV, AFMOVXD,
37274a4d8c2SCharles.Forsyth "FMOVXF", LFCONV, AFMOVXF,
37374a4d8c2SCharles.Forsyth "FMOVXW", LFCONV, AFMOVXW,
37474a4d8c2SCharles.Forsyth "FMULD", LFADD, AFMULD,
37574a4d8c2SCharles.Forsyth "FMULF", LFADD, AFMULF,
37674a4d8c2SCharles.Forsyth "FMULX", LFADD, AFMULX,
37774a4d8c2SCharles.Forsyth "FNEGD", LFCONV, AFNEGD,
37874a4d8c2SCharles.Forsyth "FNEGF", LFCONV, AFNEGF,
37974a4d8c2SCharles.Forsyth "FNEGX", LFCONV, AFNEGX,
38074a4d8c2SCharles.Forsyth "FSQRTD", LFCONV, AFSQRTD,
38174a4d8c2SCharles.Forsyth "FSQRTF", LFCONV, AFSQRTF,
38274a4d8c2SCharles.Forsyth "FSQRTX", LFCONV, AFSQRTX,
38374a4d8c2SCharles.Forsyth "FSUBD", LFADD, AFSUBD,
38474a4d8c2SCharles.Forsyth "FSUBF", LFADD, AFSUBF,
38574a4d8c2SCharles.Forsyth "FSUBX", LFADD, AFSUBX,
38674a4d8c2SCharles.Forsyth "GLOBL", LTEXT, AGLOBL,
38774a4d8c2SCharles.Forsyth "IFLUSH", LFLUSH, AIFLUSH,
38874a4d8c2SCharles.Forsyth "JMPL", LJMPL, AJMPL,
38974a4d8c2SCharles.Forsyth "JMP", LJMPL, AJMP,
39074a4d8c2SCharles.Forsyth "MOD", LADDW, AMOD,
39174a4d8c2SCharles.Forsyth "MODL", LADDW, AMODL,
39274a4d8c2SCharles.Forsyth "MOVB", LMOVB, AMOVB,
39374a4d8c2SCharles.Forsyth "MOVBU", LMOVB, AMOVBU,
39474a4d8c2SCharles.Forsyth "MOVD", LMOVD, AMOVD,
39574a4d8c2SCharles.Forsyth "MOVH", LMOVB, AMOVH,
39674a4d8c2SCharles.Forsyth "MOVHU", LMOVB, AMOVHU,
39774a4d8c2SCharles.Forsyth "MOVW", LMOVW, AMOVW,
39874a4d8c2SCharles.Forsyth "MUL", LADDW, AMUL,
39974a4d8c2SCharles.Forsyth "MULSCC", LADDW, AMULSCC,
40074a4d8c2SCharles.Forsyth "NOP", LNOP, ANOP,
40174a4d8c2SCharles.Forsyth "OR", LADDW, AOR,
40274a4d8c2SCharles.Forsyth "ORCC", LADDW, AORCC,
40374a4d8c2SCharles.Forsyth "ORN", LADDW, AORN,
40474a4d8c2SCharles.Forsyth "ORNCC", LADDW, AORNCC,
40574a4d8c2SCharles.Forsyth "RESTORE", LADDW, ARESTORE,
40674a4d8c2SCharles.Forsyth "RETT", LRETT, ARETT,
40774a4d8c2SCharles.Forsyth "RETURN", LRETRN, ARETURN,
40874a4d8c2SCharles.Forsyth "SAVE", LADDW, ASAVE,
40974a4d8c2SCharles.Forsyth "SLL", LADDW, ASLL,
41074a4d8c2SCharles.Forsyth "SRA", LADDW, ASRA,
41174a4d8c2SCharles.Forsyth "SRL", LADDW, ASRL,
41274a4d8c2SCharles.Forsyth "SUB", LADDW, ASUB,
41374a4d8c2SCharles.Forsyth "SUBCC", LADDW, ASUBCC,
41474a4d8c2SCharles.Forsyth "SUBX", LADDW, ASUBX,
41574a4d8c2SCharles.Forsyth "SUBXCC", LADDW, ASUBXCC,
41674a4d8c2SCharles.Forsyth "SWAP", LSWAP, ASWAP,
41774a4d8c2SCharles.Forsyth "TA", LTRAP, ATA,
41874a4d8c2SCharles.Forsyth "TADDCC", LADDW, ATADDCC,
41974a4d8c2SCharles.Forsyth "TADDCCTV", LADDW, ATADDCCTV,
42074a4d8c2SCharles.Forsyth "TAS", LSWAP, ATAS,
42174a4d8c2SCharles.Forsyth "TCC", LTRAP, ATCC,
42274a4d8c2SCharles.Forsyth "TCS", LTRAP, ATCS,
42374a4d8c2SCharles.Forsyth "TE", LTRAP, ATE,
42474a4d8c2SCharles.Forsyth "TEXT", LTEXT, ATEXT,
42574a4d8c2SCharles.Forsyth "TG", LTRAP, ATG,
42674a4d8c2SCharles.Forsyth "TGE", LTRAP, ATGE,
42774a4d8c2SCharles.Forsyth "TGU", LTRAP, ATGU,
42874a4d8c2SCharles.Forsyth "TL", LTRAP, ATL,
42974a4d8c2SCharles.Forsyth "TLE", LTRAP, ATLE,
43074a4d8c2SCharles.Forsyth "TLEU", LTRAP, ATLEU,
43174a4d8c2SCharles.Forsyth "TN", LTRAP, ATN,
43274a4d8c2SCharles.Forsyth "TNE", LTRAP, ATNE,
43374a4d8c2SCharles.Forsyth "TNEG", LTRAP, ATNEG,
43474a4d8c2SCharles.Forsyth "TPOS", LTRAP, ATPOS,
43574a4d8c2SCharles.Forsyth "TSUBCC", LADDW, ATSUBCC,
43674a4d8c2SCharles.Forsyth "TSUBCCTV", LADDW, ATSUBCCTV,
43774a4d8c2SCharles.Forsyth "TVC", LTRAP, ATVC,
43874a4d8c2SCharles.Forsyth "TVS", LTRAP, ATVS,
43974a4d8c2SCharles.Forsyth "UNIMP", LUNIMP, AUNIMP,
44074a4d8c2SCharles.Forsyth "WORD", LUNIMP, AWORD,
44174a4d8c2SCharles.Forsyth "XNOR", LADDW, AXNOR,
44274a4d8c2SCharles.Forsyth "XNORCC", LADDW, AXNORCC,
44374a4d8c2SCharles.Forsyth "XOR", LXORW, AXOR,
44474a4d8c2SCharles.Forsyth "XORCC", LADDW, AXORCC,
44574a4d8c2SCharles.Forsyth
44674a4d8c2SCharles.Forsyth "SCHED", LSCHED, 0,
44774a4d8c2SCharles.Forsyth "NOSCHED", LSCHED, 0x80,
44874a4d8c2SCharles.Forsyth
44974a4d8c2SCharles.Forsyth 0
45074a4d8c2SCharles.Forsyth };
45174a4d8c2SCharles.Forsyth
45274a4d8c2SCharles.Forsyth void
cinit(void)45374a4d8c2SCharles.Forsyth cinit(void)
45474a4d8c2SCharles.Forsyth {
45574a4d8c2SCharles.Forsyth Sym *s;
45674a4d8c2SCharles.Forsyth int i;
45774a4d8c2SCharles.Forsyth
45874a4d8c2SCharles.Forsyth nullgen.sym = S;
45974a4d8c2SCharles.Forsyth nullgen.offset = 0;
46074a4d8c2SCharles.Forsyth nullgen.type = D_NONE;
46174a4d8c2SCharles.Forsyth nullgen.name = D_NONE;
46274a4d8c2SCharles.Forsyth nullgen.reg = NREG;
46374a4d8c2SCharles.Forsyth nullgen.xreg = NREG;
46474a4d8c2SCharles.Forsyth if(FPCHIP)
46574a4d8c2SCharles.Forsyth nullgen.dval = 0;
46674a4d8c2SCharles.Forsyth for(i=0; i<sizeof(nullgen.sval); i++)
46774a4d8c2SCharles.Forsyth nullgen.sval[i] = 0;
46874a4d8c2SCharles.Forsyth
46974a4d8c2SCharles.Forsyth nerrors = 0;
47074a4d8c2SCharles.Forsyth iostack = I;
47174a4d8c2SCharles.Forsyth iofree = I;
47274a4d8c2SCharles.Forsyth peekc = IGN;
47374a4d8c2SCharles.Forsyth nhunk = 0;
47474a4d8c2SCharles.Forsyth for(i=0; i<NHASH; i++)
47574a4d8c2SCharles.Forsyth hash[i] = S;
47674a4d8c2SCharles.Forsyth for(i=0; itab[i].name; i++) {
47774a4d8c2SCharles.Forsyth s = slookup(itab[i].name);
47874a4d8c2SCharles.Forsyth s->type = itab[i].type;
47974a4d8c2SCharles.Forsyth s->value = itab[i].value;
48074a4d8c2SCharles.Forsyth }
48174a4d8c2SCharles.Forsyth
48274a4d8c2SCharles.Forsyth pathname = allocn(pathname, 0, 100);
48374a4d8c2SCharles.Forsyth if(mygetwd(pathname, 99) == 0) {
48474a4d8c2SCharles.Forsyth pathname = allocn(pathname, 100, 900);
48574a4d8c2SCharles.Forsyth if(mygetwd(pathname, 999) == 0)
486*45a20ab7Sforsyth strcpy(pathname, "/?");
48774a4d8c2SCharles.Forsyth }
48874a4d8c2SCharles.Forsyth }
48974a4d8c2SCharles.Forsyth
49074a4d8c2SCharles.Forsyth void
syminit(Sym * s)49174a4d8c2SCharles.Forsyth syminit(Sym *s)
49274a4d8c2SCharles.Forsyth {
49374a4d8c2SCharles.Forsyth
49474a4d8c2SCharles.Forsyth s->type = LNAME;
49574a4d8c2SCharles.Forsyth s->value = 0;
49674a4d8c2SCharles.Forsyth }
49774a4d8c2SCharles.Forsyth
49874a4d8c2SCharles.Forsyth void
cclean(void)49974a4d8c2SCharles.Forsyth cclean(void)
50074a4d8c2SCharles.Forsyth {
50174a4d8c2SCharles.Forsyth
50274a4d8c2SCharles.Forsyth outcode(AEND, &nullgen, NREG, &nullgen);
50374a4d8c2SCharles.Forsyth Bflush(&obuf);
50474a4d8c2SCharles.Forsyth }
50574a4d8c2SCharles.Forsyth
50674a4d8c2SCharles.Forsyth void
zname(char * n,int t,int s)50774a4d8c2SCharles.Forsyth zname(char *n, int t, int s)
50874a4d8c2SCharles.Forsyth {
50974a4d8c2SCharles.Forsyth
51074a4d8c2SCharles.Forsyth Bputc(&obuf, ANAME);
51174a4d8c2SCharles.Forsyth Bputc(&obuf, t); /* type */
51274a4d8c2SCharles.Forsyth Bputc(&obuf, s); /* sym */
51374a4d8c2SCharles.Forsyth while(*n) {
51474a4d8c2SCharles.Forsyth Bputc(&obuf, *n);
51574a4d8c2SCharles.Forsyth n++;
51674a4d8c2SCharles.Forsyth }
51774a4d8c2SCharles.Forsyth Bputc(&obuf, 0);
51874a4d8c2SCharles.Forsyth }
51974a4d8c2SCharles.Forsyth
52074a4d8c2SCharles.Forsyth void
zaddr(Gen * a,int s)52174a4d8c2SCharles.Forsyth zaddr(Gen *a, int s)
52274a4d8c2SCharles.Forsyth {
52374a4d8c2SCharles.Forsyth long l;
52474a4d8c2SCharles.Forsyth int i;
52574a4d8c2SCharles.Forsyth char *n;
52674a4d8c2SCharles.Forsyth Ieee e;
52774a4d8c2SCharles.Forsyth
52874a4d8c2SCharles.Forsyth Bputc(&obuf, a->type);
52974a4d8c2SCharles.Forsyth Bputc(&obuf, a->reg);
53074a4d8c2SCharles.Forsyth Bputc(&obuf, s);
53174a4d8c2SCharles.Forsyth Bputc(&obuf, a->name);
53274a4d8c2SCharles.Forsyth switch(a->type) {
53374a4d8c2SCharles.Forsyth default:
53474a4d8c2SCharles.Forsyth print("unknown type %d\n", a->type);
53574a4d8c2SCharles.Forsyth exits("arg");
53674a4d8c2SCharles.Forsyth
53774a4d8c2SCharles.Forsyth case D_NONE:
53874a4d8c2SCharles.Forsyth case D_REG:
53974a4d8c2SCharles.Forsyth case D_FREG:
54074a4d8c2SCharles.Forsyth case D_CREG:
54174a4d8c2SCharles.Forsyth case D_PREG:
54274a4d8c2SCharles.Forsyth break;
54374a4d8c2SCharles.Forsyth
54474a4d8c2SCharles.Forsyth case D_OREG:
54574a4d8c2SCharles.Forsyth case D_ASI:
54674a4d8c2SCharles.Forsyth case D_CONST:
54774a4d8c2SCharles.Forsyth case D_BRANCH:
54874a4d8c2SCharles.Forsyth l = a->offset;
54974a4d8c2SCharles.Forsyth Bputc(&obuf, l);
55074a4d8c2SCharles.Forsyth Bputc(&obuf, l>>8);
55174a4d8c2SCharles.Forsyth Bputc(&obuf, l>>16);
55274a4d8c2SCharles.Forsyth Bputc(&obuf, l>>24);
55374a4d8c2SCharles.Forsyth break;
55474a4d8c2SCharles.Forsyth
55574a4d8c2SCharles.Forsyth case D_SCONST:
55674a4d8c2SCharles.Forsyth n = a->sval;
55774a4d8c2SCharles.Forsyth for(i=0; i<NSNAME; i++) {
55874a4d8c2SCharles.Forsyth Bputc(&obuf, *n);
55974a4d8c2SCharles.Forsyth n++;
56074a4d8c2SCharles.Forsyth }
56174a4d8c2SCharles.Forsyth break;
56274a4d8c2SCharles.Forsyth
56374a4d8c2SCharles.Forsyth case D_FCONST:
56474a4d8c2SCharles.Forsyth ieeedtod(&e, a->dval);
56574a4d8c2SCharles.Forsyth Bputc(&obuf, e.l);
56674a4d8c2SCharles.Forsyth Bputc(&obuf, e.l>>8);
56774a4d8c2SCharles.Forsyth Bputc(&obuf, e.l>>16);
56874a4d8c2SCharles.Forsyth Bputc(&obuf, e.l>>24);
56974a4d8c2SCharles.Forsyth Bputc(&obuf, e.h);
57074a4d8c2SCharles.Forsyth Bputc(&obuf, e.h>>8);
57174a4d8c2SCharles.Forsyth Bputc(&obuf, e.h>>16);
57274a4d8c2SCharles.Forsyth Bputc(&obuf, e.h>>24);
57374a4d8c2SCharles.Forsyth break;
57474a4d8c2SCharles.Forsyth }
57574a4d8c2SCharles.Forsyth }
57674a4d8c2SCharles.Forsyth
57774a4d8c2SCharles.Forsyth void
outcode(int a,Gen * g1,int reg,Gen * g2)57874a4d8c2SCharles.Forsyth outcode(int a, Gen *g1, int reg, Gen *g2)
57974a4d8c2SCharles.Forsyth {
58074a4d8c2SCharles.Forsyth int sf, st, t;
58174a4d8c2SCharles.Forsyth Sym *s;
58274a4d8c2SCharles.Forsyth
58374a4d8c2SCharles.Forsyth if(pass == 1)
58474a4d8c2SCharles.Forsyth goto out;
58574a4d8c2SCharles.Forsyth if(g1->xreg != NREG) {
58674a4d8c2SCharles.Forsyth if(reg != NREG || g2->xreg != NREG)
58774a4d8c2SCharles.Forsyth yyerror("bad addressing modes");
58874a4d8c2SCharles.Forsyth reg = g1->xreg;
58974a4d8c2SCharles.Forsyth } else
59074a4d8c2SCharles.Forsyth if(g2->xreg != NREG) {
59174a4d8c2SCharles.Forsyth if(reg != NREG)
59274a4d8c2SCharles.Forsyth yyerror("bad addressing modes");
59374a4d8c2SCharles.Forsyth reg = g2->xreg;
59474a4d8c2SCharles.Forsyth }
59574a4d8c2SCharles.Forsyth jackpot:
59674a4d8c2SCharles.Forsyth sf = 0;
59774a4d8c2SCharles.Forsyth s = g1->sym;
59874a4d8c2SCharles.Forsyth while(s != S) {
59974a4d8c2SCharles.Forsyth sf = s->sym;
60074a4d8c2SCharles.Forsyth if(sf < 0 || sf >= NSYM)
60174a4d8c2SCharles.Forsyth sf = 0;
60274a4d8c2SCharles.Forsyth t = g1->name;
60374a4d8c2SCharles.Forsyth if(h[sf].type == t)
60474a4d8c2SCharles.Forsyth if(h[sf].sym == s)
60574a4d8c2SCharles.Forsyth break;
60674a4d8c2SCharles.Forsyth zname(s->name, t, sym);
60774a4d8c2SCharles.Forsyth s->sym = sym;
60874a4d8c2SCharles.Forsyth h[sym].sym = s;
60974a4d8c2SCharles.Forsyth h[sym].type = t;
61074a4d8c2SCharles.Forsyth sf = sym;
61174a4d8c2SCharles.Forsyth sym++;
61274a4d8c2SCharles.Forsyth if(sym >= NSYM)
61374a4d8c2SCharles.Forsyth sym = 1;
61474a4d8c2SCharles.Forsyth break;
61574a4d8c2SCharles.Forsyth }
61674a4d8c2SCharles.Forsyth st = 0;
61774a4d8c2SCharles.Forsyth s = g2->sym;
61874a4d8c2SCharles.Forsyth while(s != S) {
61974a4d8c2SCharles.Forsyth st = s->sym;
62074a4d8c2SCharles.Forsyth if(st < 0 || st >= NSYM)
62174a4d8c2SCharles.Forsyth st = 0;
62274a4d8c2SCharles.Forsyth t = g2->name;
62374a4d8c2SCharles.Forsyth if(h[st].type == t)
62474a4d8c2SCharles.Forsyth if(h[st].sym == s)
62574a4d8c2SCharles.Forsyth break;
62674a4d8c2SCharles.Forsyth zname(s->name, t, sym);
62774a4d8c2SCharles.Forsyth s->sym = sym;
62874a4d8c2SCharles.Forsyth h[sym].sym = s;
62974a4d8c2SCharles.Forsyth h[sym].type = t;
63074a4d8c2SCharles.Forsyth st = sym;
63174a4d8c2SCharles.Forsyth sym++;
63274a4d8c2SCharles.Forsyth if(sym >= NSYM)
63374a4d8c2SCharles.Forsyth sym = 1;
63474a4d8c2SCharles.Forsyth if(st == sf)
63574a4d8c2SCharles.Forsyth goto jackpot;
63674a4d8c2SCharles.Forsyth break;
63774a4d8c2SCharles.Forsyth }
63874a4d8c2SCharles.Forsyth Bputc(&obuf, a);
63974a4d8c2SCharles.Forsyth Bputc(&obuf, reg|nosched);
64074a4d8c2SCharles.Forsyth Bputc(&obuf, lineno);
64174a4d8c2SCharles.Forsyth Bputc(&obuf, lineno>>8);
64274a4d8c2SCharles.Forsyth Bputc(&obuf, lineno>>16);
64374a4d8c2SCharles.Forsyth Bputc(&obuf, lineno>>24);
64474a4d8c2SCharles.Forsyth zaddr(g1, sf);
64574a4d8c2SCharles.Forsyth zaddr(g2, st);
64674a4d8c2SCharles.Forsyth
64774a4d8c2SCharles.Forsyth out:
64874a4d8c2SCharles.Forsyth if(a != AGLOBL && a != ADATA)
64974a4d8c2SCharles.Forsyth pc++;
65074a4d8c2SCharles.Forsyth }
65174a4d8c2SCharles.Forsyth
65274a4d8c2SCharles.Forsyth void
outhist(void)65374a4d8c2SCharles.Forsyth outhist(void)
65474a4d8c2SCharles.Forsyth {
65574a4d8c2SCharles.Forsyth Gen g;
65674a4d8c2SCharles.Forsyth Hist *h;
65774a4d8c2SCharles.Forsyth char *p, *q, *op, c;
65874a4d8c2SCharles.Forsyth int n;
65974a4d8c2SCharles.Forsyth
66074a4d8c2SCharles.Forsyth g = nullgen;
66174a4d8c2SCharles.Forsyth c = pathchar();
66274a4d8c2SCharles.Forsyth for(h = hist; h != H; h = h->link) {
66374a4d8c2SCharles.Forsyth p = h->name;
66474a4d8c2SCharles.Forsyth op = 0;
66574a4d8c2SCharles.Forsyth /* on windows skip drive specifier in pathname */
66674a4d8c2SCharles.Forsyth if(systemtype(Windows) && p && p[1] == ':'){
66774a4d8c2SCharles.Forsyth p += 2;
66874a4d8c2SCharles.Forsyth c = *p;
66974a4d8c2SCharles.Forsyth }
67074a4d8c2SCharles.Forsyth if(p && p[0] != c && h->offset == 0 && pathname){
67174a4d8c2SCharles.Forsyth /* on windows skip drive specifier in pathname */
67274a4d8c2SCharles.Forsyth if(systemtype(Windows) && pathname[1] == ':') {
67374a4d8c2SCharles.Forsyth op = p;
67474a4d8c2SCharles.Forsyth p = pathname+2;
67574a4d8c2SCharles.Forsyth c = *p;
67674a4d8c2SCharles.Forsyth } else if(pathname[0] == c){
67774a4d8c2SCharles.Forsyth op = p;
67874a4d8c2SCharles.Forsyth p = pathname;
67974a4d8c2SCharles.Forsyth }
68074a4d8c2SCharles.Forsyth }
68174a4d8c2SCharles.Forsyth while(p) {
68274a4d8c2SCharles.Forsyth q = strchr(p, c);
68374a4d8c2SCharles.Forsyth if(q) {
68474a4d8c2SCharles.Forsyth n = q-p;
68574a4d8c2SCharles.Forsyth if(n == 0){
68674a4d8c2SCharles.Forsyth n = 1; /* leading "/" */
68774a4d8c2SCharles.Forsyth *p = '/'; /* don't emit "\" on windows */
68874a4d8c2SCharles.Forsyth }
68974a4d8c2SCharles.Forsyth q++;
69074a4d8c2SCharles.Forsyth } else {
69174a4d8c2SCharles.Forsyth n = strlen(p);
69274a4d8c2SCharles.Forsyth q = 0;
69374a4d8c2SCharles.Forsyth }
69474a4d8c2SCharles.Forsyth if(n) {
69574a4d8c2SCharles.Forsyth Bputc(&obuf, ANAME);
69674a4d8c2SCharles.Forsyth Bputc(&obuf, D_FILE); /* type */
69774a4d8c2SCharles.Forsyth Bputc(&obuf, 1); /* sym */
69874a4d8c2SCharles.Forsyth Bputc(&obuf, '<');
69974a4d8c2SCharles.Forsyth Bwrite(&obuf, p, n);
70074a4d8c2SCharles.Forsyth Bputc(&obuf, 0);
70174a4d8c2SCharles.Forsyth }
70274a4d8c2SCharles.Forsyth p = q;
70374a4d8c2SCharles.Forsyth if(p == 0 && op) {
70474a4d8c2SCharles.Forsyth p = op;
70574a4d8c2SCharles.Forsyth op = 0;
70674a4d8c2SCharles.Forsyth }
70774a4d8c2SCharles.Forsyth }
70874a4d8c2SCharles.Forsyth g.offset = h->offset;
70974a4d8c2SCharles.Forsyth
71074a4d8c2SCharles.Forsyth Bputc(&obuf, AHISTORY);
71174a4d8c2SCharles.Forsyth Bputc(&obuf, 0);
71274a4d8c2SCharles.Forsyth Bputc(&obuf, h->line);
71374a4d8c2SCharles.Forsyth Bputc(&obuf, h->line>>8);
71474a4d8c2SCharles.Forsyth Bputc(&obuf, h->line>>16);
71574a4d8c2SCharles.Forsyth Bputc(&obuf, h->line>>24);
71674a4d8c2SCharles.Forsyth zaddr(&nullgen, 0);
71774a4d8c2SCharles.Forsyth zaddr(&g, 0);
71874a4d8c2SCharles.Forsyth }
71974a4d8c2SCharles.Forsyth }
72074a4d8c2SCharles.Forsyth
72174a4d8c2SCharles.Forsyth #include "../cc/lexbody"
72274a4d8c2SCharles.Forsyth #include "../cc/macbody"
723