pdp11v/usr/src/cmd/kunb.c

Compare this file to the similar file:
Show the results in this format:

/* @(#)kunb.c	1.2 */
#include <stdio.h>
#include <a.out.h>

#ifdef vax
struct filehdr fhdr;
struct aouthdr hdr;
#define a_magic	magic
#define	a_text	tsize
#endif
#ifdef pdp11
struct exec hdr;
#endif

char *opn[16] = {
	"add",	"addc",	"subc",	"inc",
	"adc",	"asl",	"aslc",	"dec",
	"mov",	"mov",	"orn",	"and",
	"or",	"xor",	"sub",	"addn"
};

char *srcr[32] = {
	"idl",	"idh",	"odl",	"odh",
	"ial",	"iah",	"oal",	"oah",
	"lur0",	"lur1",	"lur2",	"lur3",
	"lur4",	"lur5",	"lur6",	"lur7",
	"csr0",	"csr1",	"csr2",	"csr3",
	"csr4",	"csr5",	"csr6",	"csr7",
	"npr",	"nprx",
	"pc", "%pc", "mar", "%mar",
	"NEX6", "NEX7",
};

char *dstr[32] = {
	"idl",	"idh",	"odl",	"odh",
	"ial",	"iah",	"oal",	"oah",
	"lur0",	"lur1",	"lur2",	"lur3",
	"lur4",	"lur5",	"lur6",	"lur7",
	"csr0",	"csr1",	"csr2",	"csr3",
	"csr4",	"csr5",	"csr6",	"csr7",
	"npr",	"nprx",
	"NEX10", "pcr",
	"NEX12", "NEX13", "NEX14", "NEX15",
};

char *brn[8] = {
	"jmp",	"br",	"brc",	"brz",
	"br0",	"br1",	"br4",	"br7"
};

char *marn[4] = {
	"-", "%mar", "mar", "mar++"
};

#define	NKMCI	4096
short	kbuf[NKMCI];
short	kbit[NKMCI/16];

main(argc, argv)
char **argv;
{
	register ins, i;
	int	last, areg, breg, dst, mar, op;
	int	rflag;

	while (argc > 1) {
		if (argv[1][0]=='-' && argv[1][1]=='o') {
			if (argc<3) {
				fprintf(stderr, "missing -o file\n");
				exit(1);
			}
			if (freopen(argv[2], "w", stdout)==NULL) {
				fprintf(stderr, "cannot open output %s\n",argv[2]);
				exit(1);
			}
			argc -= 2;
			argv += 2;
			continue;
		}
		if (freopen(argv[1], "r", stdin)==NULL) {
			fprintf(stderr, "cannot open input %s\n",argv[1]);
			exit(1);
		}
		argc--;
		argv++;
	}
#ifdef vax
	read(0, &fhdr, sizeof fhdr);
#endif
	if (read(0, &hdr, sizeof hdr) <= 0) {
		fprintf(stderr, "No input data\n");
		exit(1);
	}
	last = hdr.a_text;
	if (hdr.a_magic==0410) {
		lseek(0, (long)(sizeof hdr), 0);
#ifdef vax
		lseek(0, (long)(sizeof(struct filehdr) +
			2*sizeof(struct scnhdr)), 1);
#endif
	} else if(hdr.a_magic==0440) {
		lseek(0, (long)(sizeof hdr)+48L, 0);
#ifdef vax
		lseek(0, (long)(sizeof(struct filehdr) +
			2*sizeof(struct scnhdr)), 1);
#endif
	} else {
		lseek(0, 0L, 0);
		last = sizeof kbuf;
	}
	last = read(0, kbuf, last)/sizeof(short);
	if (last <= 0) {
		fprintf(stderr, "No input data\n");
		exit(1);
	}
	for (i=0; i<last; i++) {
		if ((kbuf[i]&0160000)==0100000) {
			ins = (kbuf[i]&0377)+((kbuf[i]&014000)>>3)+(i&~01777);
			kbit[ins>>4] |= (1<<(ins&017));
		}
		if ((kbuf[i]&0163400)==0100400 &&
		    (kbuf[i+1]&0163400)!=0100400)
			kbit[(i+1)>>4] |= 1<<((i+1)&017);
		if (kbuf[i])
			op = i;
	}
	last = op+1;
	for(i=0; i<last; i++) {
		ins = kbuf[i];
		areg = ins&017;
		breg = (ins&0360)>>4;
		dst = (ins&03400)>>8;
		mar = (ins&014000)>>11;
		op = (ins>>13)&07;
		rflag = 0;
		if ((i&0377)==0)
			printf("P%d:\n",i>>8);
		if (kbit[i>>4]&(1<<(i&017)))
			printf("L%o:\t\t/*P%oL%o*/\n",i,(i>>8)&017,i&0377);
		putchar('\t');
		switch(op) {
		case 0:
			if (ins==0) {
				while(kbuf[i+1]==0) i++;
				printf(".org\t%d",i+1);
				break;
			}
			printf("mov\t");
			if (ins&0377)
				printf("0%o",ins&0377);
			else	printf("0");
			goto dest;
		case 1:
		case 5:
			if (op==5)
				breg += 16;
			printf("mov\t%s",srcr[breg]);
			goto dest;
		case 2:
		case 3:
			printf("%s\t",opn[breg]);
			switch(breg) {
			case 9:
				if (op==3)
					printf("brg");
				else	printf("mem");
				break;
			default:
				rflag++;
			case 8:
				if (breg<3 || breg>8)
					if(op==3)
						printf("brg,");
					else	printf("mem,");
				if(dst==2||dst==4)
					printf("r0");
				else	printf("r%d",areg);
			}
		dest:
			switch(dst) {
			case 0:
				printf(",%s",marn[mar]);
				break;
			case 1:
				printf(",brg");
				goto destmar;
			case 2:
				printf(",%s",dstr[areg+16]);
				goto destmar;
			case 3:
				printf(",brg>>");
				goto destmar;
			case 4:
				printf(",%s",dstr[areg]);
				goto destmar;
			case 5:
				printf(",mem");
				goto destmar;
			case 6:
				if (rflag && mar==0)
					break;
				printf(",r%d",areg);
				goto destmar;
			case 7:
				printf(",r%d|brg",areg);
			destmar:
				if (mar)
					printf("|%s",marn[mar]);
			}
			break;
		case 4:
			printf("%s\t",brn[dst]);
			if (dst==0) {
				printf("%o",ins&0377);
				break;
			}
			dst = (ins&0377)+(mar<<8)+(i&~01777);
			printf("%c%o",(dst<last)?'L':'U',dst);
			break;
		case 6:
		case 7:
			printf("%s\t(", brn[dst]);
			switch(breg) {
			case 8:
				printf("r%d",areg);
				break;
			case 9:
				if (op==6)
					printf("mem");
				else	printf("brg");
				break;
			default:
				printf("%s,",opn[breg]);
				if (breg<3 || breg>7)
					if (op==6)
						printf("mem,");
					else	printf("brg,");
				printf("r%d",areg);
			}
			putchar(')');
			if (mar)
				printf(",p%d",mar);
		}
		putchar('\n');
	}
	printf("E%o:\n",last);
}