Ultrix-3.1/src/ucb/l11/obint.c

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


/**********************************************************************
 *   Copyright (c) Digital Equipment Corporation 1984, 1985, 1986.    *
 *   All Rights Reserved. 					      *
 *   Reference "/usr/src/COPYRIGHT" for applicable restrictions.      *
 **********************************************************************/

static Sccsid[] = "@(#)obint.c	3.0	4/22/86";
/*   Object File Interpreter  */

#define	WORD	unsigned int
char *tack();
WORD getword();

# include	<stdio.h>

main(argc, argv)
int	argc;
char	*argv[];

{
	int 	whicharg;
	char	*filename;
	char	*cat_obj();

	if (argc == 1)
	{
		fprintf(stderr, "Error: no argument specified\n");
		exit(1);
	}

	for (whicharg = 1; whicharg < argc; whicharg++)
	{
		filename = tack(argv[whicharg], ".obj");
		printf("\n\n\nFile Name: %s\n", filename);
		gsd(filename);
		code(filename);
		lst(filename);
	}
}

gsd(fname)
char	*fname;
{
	char	sname[7];	/* symbol name */
	int	attr;		/* byte specifing attributes */
	int	type;		/* byte specifing type of symbol */
	int	value;		/* value of the symbol */
	char	*pstring();	/* function returning pointer to psect attribute string */
	char	*gsstring();	/* function returning global symbol attribute string */

	printf("\n\nProgram Sections, Global Symbols and Definitions:\n\n");
	ch_input(fname, 001);
	while(morebytes())
	{
		dc_symbol(sname);
		attr = getbyte();
		type = getbyte();
		value = getword();
		switch(type)
		{
			case 0:
				printf("program title: %s\n", sname);
				break;
			
			case 1:
				printf("program section: <%s>", sname);
				printf(" %s, size: %06o\n", pstring(attr), value);
				break;

			case 2:
				printf("internal symbol table: %s", sname);
				printf(" %03o %06o\n", attr, value);
				break;

			case 3:
				printf("transfer address in <%s>, ", sname);
				printf("location: %06o\n", value);
				break;

			case 4:
				printf("global symbol: %s", sname);
				printf(" %s, value: %06o\n", gsstring(attr), value);
				break;

			case 5:
				printf("program section: <%s>", sname);
				printf(" %s, size: %06o\n", pstring(attr), value);
				break;

			case 6:
				printf("version identification: %s\n", sname);
				break;

			default:
				fprintf(stderr, "gsd type out of range %03o\n", type);
				exit(0);
		}
	}
}

code(fname)
char 	*fname;
{
	char		sname[7];	/* symbol name buffer */
	char		vrstring[40];	/* string used as an argument to */
					/* a virtual register directive */
	int		drctv;		/* code directive */
	int		i;
	int		temp;		/* possible virtual register directive */
	int		getbyte();	/* returns byte from checksum buffer */
	WORD	getword();	/* returns word from checksum buffer */

	printf("\n\nCode and Directives:\n\n");
	ch_input(fname, 017);
	while (morebytes())
	{
		switch (drctv = getbyte())
		{
			case 000:
				printf("load zero word\n");
				break;

			case 002:
				printf("load zero relative \n");
				break;

			case 004:
				printf("load %06o\n", getword());
				break;

			case 006:
				printf("load %06o - (glc + 2)\n", getword());
				break;

			case 010:
				printf("load rel const of current psect\n");
				break;

			case 014:
				printf("load %06o + (rel const of current psect)\n", getword());
				break;

			case 020:
				dc_symbol(sname);
				regcheck(sname);
				printf("load %s\n", sname);
				break;

			case 022:
				dc_symbol(sname);
				regcheck(sname);
				printf("load %s - (glc + 2)\n", sname);
				break;

			case 030:
				dc_symbol(sname);
				printf("load rel const of <%s>\n", sname);
				break;

			case 032:
				dc_symbol(sname);
				printf("load rel const of <%s> - (glc + 2)\n", sname);
				break;

			case 034:
				dc_symbol(sname);
				printf("load rel const of <%s> + %06o\n", sname, getword());
				break;

			case 036:
				dc_symbol(sname);
				printf("load rel const of <%s> + %06o - (glc + 2)\n", sname, getword());
				break;

			case 040:
				do040();
				break;

			case 044:
				sprintf(vrstring, "%06o", getword());
				vrdirect(vrstring, getbyte());
				break;

			case 050:
				strcpy(vrstring, "current psect rel const");
				if ((temp = getbyte()) == 0)
					printf("reset glc to %s\n", vrstring);
				else
					vrdirect(vrstring, temp);
				break;

			case 054:
				sprintf(vrstring, "(%06o + current psect rel const)", getword());
				if ((temp = getbyte()) == 0)
					printf("reset glc to %s\n", vrstring);
				else
					vrdirect(vrstring, temp);
				break;

			case 060:
				dc_symbol(sname);
				regcheck(sname);
				vrdirect(sname, getbyte());
				break;

			case 070:
				dc_symbol(sname);
				sprintf(vrstring, "rel const of <%s>", sname);
				if ((temp = getbyte()) == 0)
					printf("current psect is <%s>; reset glc to %s\n", sname, vrstring);
				else
					vrdirect(vrstring, temp);
				break;

			case 074:
				dc_symbol(sname);
				sprintf(vrstring, "(rel const of <%s> + %06o)", sname, getword());
				if ((temp = getbyte()) == 0)
					printf("current psect is <%s>; reset glc to %s\n", sname, vrstring);
				else
					vrdirect(vrstring, temp);
				break;

			case 0200:
				printf("load zero byte\n");
				break;

			case 0204:
				printf("load byte %03o\n", getbyte());
				break;

			case 0220:
				dc_symbol(sname);
				regcheck(sname);
				printf("load %s as a byte\n", sname);
				break;

			default:
				fprintf(stderr, "Unrecognizable code command: %03o\n", drctv);
				for (i = 0; i < 8; i++)
					fprintf(stderr, "%03o ", getbyte());
				printf("\n");
				exit(1);
		}
	}
}


lst(fname)	/* local symbol table dump */
char	*fname;
{
	char	sname[7];
	char	*sattr;		/* local symbol attributes */
	int	pnumb;		/* number of psect the symbol is defined in */
	char	*lsstring();	/* returns string of attributes */

	printf("\n\nLocal Symbols:\n\n");
	ch_input(fname, 022);	/* change input to local symbols */
	while (morebytes())
	{
		dc_symbol(sname);
		sattr = lsstring(getbyte());
		pnumb = getbyte();
		printf("%s  %06o  section: %03o  %s\n", sname, getword(), pnumb, sattr);
	}
}


char	*pstring(attr)	/* decodes attr (which specifies psect attributes) */
			/* into a string, returns pointer to the string */
int	attr;
{
	static char	string[80];

	if (attr & 001)
		strcpy(string, "shr ");
	else
		strcpy(string, "prv ");
	if (attr & 002)
		strcat(string, "ins ");
	else if (attr & 004)
		strcat(string, "bss ");
	else
		strcat(string, "dat ");
	if (attr & 020)
		strcat(string, "ovr ");
	else
		strcat(string, "cat ");
	if (attr & 040)
		strcat(string, "rel ");
	else
		strcat(string, "abs ");
	if (attr & 0100)
		strcat(string, "gbl");
	else
		strcat(string, "loc");
	return(string);
}


regcheck(s)	/* checks to see if the string is suppossed to */
		/* represent a register rather than a symbol, */
		/* if so it adds "reg." to the string */
char	*s;
{
	if (*s == ' ')
	{
		strcpy(s, "reg.");
		*(s + 4) = ' ';
		*(s + 5) += 'A' - 'a';
	}
}


vrdirect(s, drctv)		/* print virtual register directive */
char	 	*s;		/* string argument to directive */
WORD drctv;	/* the directive */
{
	char	reg;	/* destination character register */

	reg = 'A' + getbyte() - 1;
	switch (drctv)
	{
		case 0200:
			printf("move %s to reg  %c\n", s, reg);
			break;

		case 0201:
			printf("add %s to reg  %c\n", s, reg);
			break;

		case 0202:
			printf("subtract %s from reg  %c\n", s, reg);
			break;

		case 0203:
			printf("multiply %s into reg  %c\n", s, reg);
			break;

		case 0204:
			printf("divide %s int reg  %c\n", s, reg);
			break;

		case 0205:
			printf("bit \"and\" %s with reg  %c\n", s, reg);
			break;

		case 0206:
			printf("bit \"or\" %s with reg  %c\n", s, reg);
			break;

		default:
			fprintf(stderr, "Unrecognizable v.r. directive: %03o\n", drctv);
			exit(1);
	}
}


do040()		/* 040 is used for misc. directives to virtual registers */

{
	int	drctv;		/* the drctv */
	char	getreg();	/* destination character register */
	char	sname[7];	/* symbol name */

	switch (drctv = getbyte())
	{
		case 001:
			printf("move low address of relocatable code to reg  %c\n", getreg());
			break;

		case 002:
			printf("move high address of relocatable code to reg %c\n", getreg());
			break;

		case 003:
			dc_symbol(sname);
			printf("move low reloc address of %s to reg %c\n", sname, getreg());
			break;

		case 004:
			dc_symbol(sname);
			printf("move high reloc address of %s to reg %c\n", sname, getreg());
			break;

		case 0200:
			printf("clear reg  %c\n", getreg());
			break;

		case 0201:
			printf("do nothing to reg  %c\n", getreg());
			break;

		default:
			fprintf(stderr, "Unrecognizable 040 directive: %03o, reg %c\n", drctv, getreg());
			exit(1);
	}
}


char	getreg()	/* reads a byte to determine register character */

{
	return('A' + getbyte() - 1);
}

char 	*gsstring(attr)	/* decodes attr (which specifies global symbol */
			/* attributes) into a string */
int	attr;
{
	static char	string[50];

	if (!(attr & 010))
		strcpy(string, "und ");
	else
	{
		strcpy(string, "def ");
		if (attr & 040)
			strcat(string, "rel ");
		else
			strcat(string, "abs ");
	}
	return (string);
}


char 	*lsstring(attr)	/* decodes attr (which specifies local symbol */
			/* attributes) into a string */
int	attr;
{
	static char	string[50];

	if (!(attr & 010))
		strcpy(string, "und ");
	else
	{
		strcpy(string, "def ");
		if (attr & 040)
			strcat(string, "rel ");
		else
			strcat(string, "abs ");
		if (attr & 0100)
			strcat(string, "gbl ");
		if (attr & 001)
			strcat(string, "reg ");
		if (attr & 002)
			strcat(string, "lbl ");
		if (attr & 0200)
			strcat(string, "hkl ");
	}
	return (string);
}


/***********************  bail_out  ****************************************/


bail_out()
{
	exit();
}