xref: /inferno-os/utils/ka/lex.c (revision 45a20ab721a513710138340faff3d59a31c3e01e)
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