[comp.sources.misc] v06i038: 68K COFF dissassembler - patch 1

allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) (02/04/89)

Posting-number: Volume 6, Issue 38
Submitted-by: alex@umbc3.umbc.edu (Alex S. Crain)
Archive-name: 68kdisasm/patch01

	These patches are for the 68K COFF dissassembler that passed through
here some time ago. It makes the dissassembler pretty specific to AT&Ts
UNIX-PC, but if you have one of those, it does some pretty neat stuff. See
the ChangeLog file for details.

					:alex
Alex Crain
Systems Programmer			alex@umbc3.umbc.edu       (NEW DOMAIN!)
Univ Md Baltimore County		nerwin!alex@umbc3.umbc.edu

	BTW: some of this code is copyrighted to various people. I didn't
remove any copyrights, but I don't think that I added any here, and at this
point, if you can pull a profit off this sucker, you diserve the bread you 
get. Course, you've gotta maintain it :-).

------------------------------ snip,snip,snip ---------------------------------
#!/bin/sh
# shar:	Shell Archiver  (v1.22)
#
#	Run the following text with /bin/sh to create:
#	  ChangeLog
#	  DIFFS
#	  Makefile
#	  README.diffs
#	  constant.c
#	  kernal.h
#	  parseifile.h
#	  parseifile.y
#
sed 's/^X//' << 'SHAR_EOF' > ChangeLog &&
XWed Jan 18 00:45:24 1989  Alex  (alex at nerwin)
X
X	* constant.c [lookp_address ()] - change to return a value for any
X	legal shlib address (0x300000 -> 0x380000), instead of the first &
X	last symbols.
X
X	* kernal.h - fill this file with interesting addresses.
X
X	* alloc.c [mkdref ()] allow for addresses to point to objects of
X	length 0.
X
XTue Jan 17 11:14:21 1989  Alex  (alex at nerwin)
X
X	* main.c [doopts ()] - added two globals, kernal and dup_error,
X	which are turned on with -k and -D respectively, to turn on kernal
X	symbol lookup and DUP??? symbol names (and errors).
X
X	* robj.c [dosymb ()] - added a test for dup_error in the case of
X	duplicate symbols. If dup_error is not set, duplicate symbols are
X	simply ignores.
X
XMon Jan 16 23:53:26 1989  Alex  (alex at nerwin)
X
X	* constant.c [replaces syms.c] - instead of syms.c, generate
X	shlib.h in the same manner. include this file, along with kernal.h
X	into constants.c which contains the lookup code. lookup_address ()
X	looks up an address in he shared library symbols (shlib.h) and
X	returns a symbol and option offset in a single string. 
X	lookup_kernal_address () is simular but does not calculate an
X	offset, retunring 0 if the address is not found.
X
X	* iset.c - many small changes
X	[prea ()] - output a '&' before a constant hex address.
X	[pmovc ()] - format MOVEC as MOV
X	[pcs2 ()] - movm becomes mov.m, ouput a '%' before dest register name.
X
XSun Jan 15 22:37:48 1989  Alex  (alex at nerwin)
X
X	* syms.c [lookup_address()] - this now returns either:
X		 a) a symbol name
X		 b) a symbol name + an offset as a single string ("%s+0x%x")
X		 c) (char *) 0 if the given address is greater then the larest
X		 known symbol value.
X
X
XMon Jan  9 00:08:25 1989  Alex  (alex at nerwin)
X
X	* parseifile.c [new file] - generate a file containing a sorted,
X	initialized array of shared library symbols that can be loaded
X	into the disassembler.
X	
X	* syms.c [new file] - generated by parseifile.
X
X	* iset.c [paddr()] - try to resolve unknown hex addresses by 
X	first looking them up in the initialized array with
X	lookup_address(). If this doesn't work, try to generate a label
X	for the address with mkdlab(). At this point we are only printing
X	absolute address that don't exist in the text or data areas, and
X	arn't referenced in /lib/shlib.ifile.
X
X	* prin.c [pdata(), pbss()] - teach the print routines about 0
X	length objects. We handle these by searhingthrough memory to find
X	the next object, and using the difference as the size of the
X	current one.
X
X	* prin.c [ptext()] - add a _start symbol to the beginning of the
X	text area. Don't verify the entry point, though.
X
SHAR_EOF
chmod 0666 ChangeLog || echo "restore of ChangeLog fails"
sed 's/^X//' << 'SHAR_EOF' > DIFFS &&
X*** olddis/alloc.c	Fri Jan 20 11:13:48 1989
X--- test/alloc.c	Sat Jan 21 20:45:31 1989
X***************
X*** 286,292
X  	if  (dent.d_type != D_BYTE)  {
X  		if  (dent.d_type != wsize)  {
X  			if  (dent.d_type == D_ADDR)  {
X! 				if  (wsize != D_LONG)
X  					unimpl("Addr word usage");
X  			}
X  			else  if  (dent.d_type > wsize)  {
X
X--- 286,292 -----
X  	if  (dent.d_type != D_BYTE)  {
X  		if  (dent.d_type != wsize)  {
X  			if  (dent.d_type == D_ADDR)  {
X! 				if  (wsize != D_LONG && size > 0)
X  					unimpl("Addr word usage");
X  			}
X  			else  if  (dent.d_type > wsize)  {
X*** olddis/conv.c	Fri Jan 20 11:13:49 1989
X--- test/conv.c	Sun Jan 22 22:13:47 1989
X***************
X*** 9,15
X      unsigned suntype;
X  
X      /*	everything in shlib is an external constant	*/
X!     if (sym->n_value >= 0x300000) {
X  	sym->n_scnum = N_ABS;
X       	sym->n_sclass = C_EXT;
X      }
X
X--- 9,15 -----
X      unsigned suntype;
X  
X      /*	everything in shlib is an external constant	*/
X!     if (sym->n_value >= 0x300000 && sym->n_value < 0x380000) {
X  	sym->n_scnum = N_ABS;
X       	sym->n_sclass = C_EXT;
X      }
X*** olddis/heur.c	Fri Jan 20 11:13:59 1989
X--- test/heur.c	Sun Jan 22 19:06:25 1989
X***************
X*** 312,318
X  	int	lng;
X  	long	npos;
X  
X! 	while  (pos < endt)  {
X  		gette(&mainfile, pos, &tent);
X  		if  (tent.t_amap)	/*  Been here  */
X  			return;
X
X--- 312,318 -----
X  	int	lng;
X  	long	npos;
X  
X! 	while  (pos && pos < endt)  {
X  		gette(&mainfile, pos, &tent);
X  		if  (tent.t_amap)	/*  Been here  */
X  			return;
X***************
X*** 362,368
X  	int	lng;
X  	
X  	endt = mainfile.ef_tbase + mainfile.ef_tsize;
X! 	pos = mainfile.ef_entry;
X  nextv:
X  	for  (;  pos < endt;)  {
X  		gette(&mainfile, pos, &tent);
X
X--- 362,369 -----
X  	int	lng;
X  	
X  	endt = mainfile.ef_tbase + mainfile.ef_tsize;
X! 	if ((pos = mainfile.ef_entry) == 0) 
X! 	    pos = mainfile.ef_tbase;
X  nextv:
X  	for  (;  pos < endt;)  {
X  		gette(&mainfile, pos, &tent);
X*** olddis/iset.c	Fri Jan 20 11:13:20 1989
X--- test/iset.c	Tue Jan 24 12:52:24 1989
X***************
X*** 35,40
X  void	mkdref();
X  long	gettw();
X  symbol	textlab();
X  
X  int	l1(), l2(), el1(), lea(), lmove(), lcbch(), jj();
X  int	limed(), lsbit(), lmvml(), lone(), loone(), lonew(), lonel();
X
X--- 35,41 -----
X  void	mkdref();
X  long	gettw();
X  symbol	textlab();
X+ char *	lookup_address(), * lookup_kernal_address ();
X  
X  int	l1(), l2(), el1(), lea(), lmove(), lcbch(), jj();
X  int	limed(), lsbit(), lmvml(), lone(), loone(), lonew(), lonel();
X***************
X*** 104,111
X  	0xf100, 0x5000, lone,  pqu,   "add",
X  	0xf100, 0x5100, lone,  pqu,   "sub",
X  	0xf100, 0x7000, l1,    pmqu,  0,
X! 	0xf1c0, 0x80c0, lonew, podreg,"divu",
X! 	0xf1c0, 0x81c0, lonew, podreg,"divs",
X  	0xf1f0, 0x8100, l1,    ptreg, "sbcd",
X  	0xf000, 0x8000, loone, pomode,"or",
X  	0xf1f0, 0x9100, l1,    ptreg, "subx.b",
X
X--- 105,112 -----
X  	0xf100, 0x5000, lone,  pqu,   "add",
X  	0xf100, 0x5100, lone,  pqu,   "sub",
X  	0xf100, 0x7000, l1,    pmqu,  0,
X! 	0xf1c0, 0x80c0, lonew, podreg,"divu.w",
X! 	0xf1c0, 0x81c0, lonew, podreg,"divs.w",
X  	0xf1f0, 0x8100, l1,    ptreg, "sbcd",
X  	0xf000, 0x8000, loone, pomode,"or",
X  	0xf1f0, 0x9100, l1,    ptreg, "subx.b",
X***************
X*** 118,125
X  	0xf100, 0xb000, loone, pomode,"cmp",
X  	0xf1c0, 0xb1c0, loone, pomode,"cmp",
X  	0xf100, 0xb100, loone, pomode,"eor",
X! 	0xf1c0, 0xc0c0, lonew, podreg,"mulu",
X! 	0xf1c0, 0xc1c0, lonew, podreg,"muls",
X  	0xf1f0, 0xc100, l1,    ptreg, "abcd",
X  	0xf130, 0xc100, l1,    pexg,  0,
X  	0xf000, 0xc000, loone, pomode,"and",
X
X--- 119,126 -----
X  	0xf100, 0xb000, loone, pomode,"cmp",
X  	0xf1c0, 0xb1c0, loone, pomode,"cmp",
X  	0xf100, 0xb100, loone, pomode,"eor",
X! 	0xf1c0, 0xc0c0, lonew, podreg,"mulu.w",
X! 	0xf1c0, 0xc1c0, lonew, podreg,"muls.w",
X  	0xf1f0, 0xc100, l1,    ptreg, "abcd",
X  	0xf130, 0xc100, l1,    pexg,  0,
X  	0xf000, 0xc000, loone, pomode,"and",
X***************
X*** 420,426
X   */
X  
X  void prind(n)
X! unsigned short n;
X  {
X  	if ((short) n > -128 && (short) n < 128)
X  		(void) printf("%d", (long) ((short) n));
X
X--- 421,427 -----
X   */
X  
X  void prind(n)
X!      long n;
X  {
X     if (n & 0x8000) n |= 0xffff0000;
X     (void) printf (((n > 128 || n < -128) ? "0x%x" : "%d"), n);
X***************
X*** 422,431
X  void prind(n)
X  unsigned short n;
X  {
X! 	if ((short) n > -128 && (short) n < 128)
X! 		(void) printf("%d", (long) ((short) n));
X! 	else
X! 		(void) printf("0x%x",(unsigned long) n);
X  }
X     
X  int	findleng(tc)
X
X--- 423,430 -----
X  void prind(n)
X       long n;
X  {
X!    if (n & 0x8000) n |= 0xffff0000;
X!    (void) printf (((n > 128 || n < -128) ? "0x%x" : "%d"), n);
X  }
X         
X  
X***************
X*** 446,453
X  char * reg;
X  unsigned  disp;
X  {
X- int	szc;
X- 
X  	(void) printf("%d(%s,", disp & 0xff, reg);
X  	if  (disp & 0x8000) {
X  		(void) fputs(areg[(disp >> 12) & 0x7]);
X
X--- 446,451 -----
X  char * reg;
X  unsigned  disp;
X  {
X  	(void) printf("%d(%s,", disp & 0xff, reg);
X  	if  (disp & 0x8000) {
X  		(void) fputs(areg[(disp >> 12) & 0x7], stdout);
X***************
X*** 450,456
X  
X  	(void) printf("%d(%s,", disp & 0xff, reg);
X  	if  (disp & 0x8000) {
X! 		(void) fputs(areg[(disp >> 12) & 0x7]);
X  		(void) putchar('.');
X  	}
X  	else
X
X--- 448,454 -----
X  {
X  	(void) printf("%d(%s,", disp & 0xff, reg);
X  	if  (disp & 0x8000) {
X! 		(void) fputs(areg[(disp >> 12) & 0x7], stdout);
X  		(void) putchar('.');
X  	}
X  	else
X***************
X*** 466,471
X  {
X  	t_entry	tent;
X  	symbol	symb;
X  
X  	gette(&mainfile, pos, &tent);
X  	if  (tent.t_relsymb != NULL)  {
X
X--- 464,473 -----
X  {
X  	t_entry	tent;
X  	symbol	symb;
X+ 	long t_pos;
X+ 	int pass2 = 0, i;
X+ 	char *p;
X+ 	extern char kernal;
X  
X       start:
X  	/*
X***************
X*** 467,472
X  	t_entry	tent;
X  	symbol	symb;
X  
X  	gette(&mainfile, pos, &tent);
X  	if  (tent.t_relsymb != NULL)  {
X  		symb = tent.t_relsymb;
X
X--- 469,479 -----
X  	char *p;
X  	extern char kernal;
X  
X+      start:
X+ 	/*
X+ 	 *  look up the address and see if it has a label. 
X+ 	 *  If so, print the label and return.
X+ 	 */
X  	gette(&mainfile, pos, &tent);
X  	if  (tent.t_relsymb != NULL)  {
X  		symb = tent.t_relsymb;
X***************
X*** 478,484
X  		    (void) printf("+0x%x", tent.t_reldisp);
X  		return;
X  	}
X! 	if ((pos = gettw(&mainfile, pos, R_LONG)) >= 0x290000)
X  	 {
X  	    register int i;
X  	    for (i=0; i < abstab.c_int; i++)
X
X--- 485,515 -----
X  		    (void) printf("+0x%x", tent.t_reldisp);
X  		return;
X  	}
X! 
X! 	/*
X! 	 *  No label, so calculate the address to print (like gettw)
X! 	 *
X! 	 */
X! 	t_pos = tent.t_contents;
X! 	gette(&mainfile, pos+2, &tent);
X! 	t_pos = (t_pos << 16) + tent.t_contents;
X! 
X! 	/*
X! 	 *  check the list of absolute symbols.
X! 	 */
X! 
X! 	for (i=0; i < abstab.c_int; i++)
X! 	       if (abstab.c_symb[i]->s_value == t_pos)
X! 		{	     
X! 		   (void) fputs(abstab.c_symb[i]->s_name, stdout);
X! 		   return;
X! 		}
X! 
X! 	/*
X! 	 *  check the list of shlib constants.
X! 	 */
X! 
X! 	if (p = lookup_address(t_pos))
X  	 {
X  	    (void) fputs(p, stdout);
X  	    return;
X***************
X*** 480,492
X  	}
X  	if ((pos = gettw(&mainfile, pos, R_LONG)) >= 0x290000)
X  	 {
X! 	    register int i;
X! 	    for (i=0; i < abstab.c_int; i++)
X! 	        if (abstab.c_symb[i]->s_value == pos)
X! 		 {	     
X! 		    (void) fputs(abstab.c_symb[i]->s_name, stdout);
X! 		    return;
X! 		 }
X  	 }
X  	(void) printf("0x%x", pos);
X  }
X
X--- 511,518 -----
X  
X  	if (p = lookup_address(t_pos))
X  	 {
X! 	    (void) fputs(p, stdout);
X! 	    return;
X  	 }
X  
X  	/*
X***************
X*** 488,494
X  		    return;
X  		 }
X  	 }
X! 	(void) printf("0x%x", pos);
X  }
X  
X  int	prea(ea, pos, sz)
X
X--- 514,547 -----
X  	    (void) fputs(p, stdout);
X  	    return;
X  	 }
X! 
X! 	/*
X! 	 *  If this is kernal code, lookup our kernal addresses.
X! 	 */
X! 
X! 	if (kernal && (p = lookup_kernal_address(t_pos)))
X! 	 {
X! 	    (void) fputs (p, stdout);
X! 	    return;
X! 	 }
X! 
X! 	/* If we've tried this already, just print the address and return. */
X! 	if (pass2)
X! 	 {
X! 	    (void) printf("&0x%x", t_pos); 
X! 	    return;
X! 	 }
X! 
X! 	/* we couldn't match up the address with anything, so decide that
X! 	   its data and give it a label. Its really too late to do this, 
X! 	   because by the time this gets called, we cant do backward 
X! 	   referencing. */
X! 
X! 	mkdref(pos,0);
X! 	pass2 = 1;
X! 	goto start;
X! 
X! 	/*NOTREACHED*/
X  }
X  
X  int	prea(ea, pos, sz)
X***************
X*** 529,534
X  		switch  (reg)  {
X  		case  0:
X  			disp = gettw(&mainfile, pos, R_WORD);
X  			(void) prind(disp);
X  			(void) putchar('.');
X  			(void) putchar('w');
X
X--- 582,588 -----
X  		switch  (reg)  {
X  		case  0:
X  			disp = gettw(&mainfile, pos, R_WORD);
X+ 			(void) putchar('&');
X  			(void) prind(disp);
X  			return	2;
X  		case  1:
X***************
X*** 530,537
X  		case  0:
X  			disp = gettw(&mainfile, pos, R_WORD);
X  			(void) prind(disp);
X- 			(void) putchar('.');
X- 			(void) putchar('w');
X  			return	2;
X  		case  1:
X  			paddr(pos);
X
X--- 584,589 -----
X  			disp = gettw(&mainfile, pos, R_WORD);
X  			(void) putchar('&');
X  			(void) prind(disp);
X  			return	2;
X  		case  1:
X  			paddr(pos);
X***************
X*** 538,544
X  			return	4;
X  		case  2:{
X  			symbol symb;
X! 			register int addr;
X  			disp = 
X  			    ((short) gettw(&mainfile, pos, R_WORD));
X    			if ((addr=pos+disp) < 0  ||  
X
X--- 590,596 -----
X  			return	4;
X  		case  2:{
X  			symbol symb;
X! 			register long addr;
X  			disp = 
X  			    ((short) gettw(&mainfile, pos, R_WORD));
X    			if ((addr=pos+disp) < 0  ||  
X***************
X*** 570,577
X  			piword("%pc", (unsigned)gettw(&mainfile, pos, R_WORD));
X  			return	2;
X  		case  4:
X! 			(void) putchar('&');
X! 			if  (sz < 4)
X  				(void) prind(gettw(&mainfile, pos, R_WORD));
X  			else
X  				paddr(pos);
X
X--- 622,629 -----
X  			piword("%pc", (unsigned)gettw(&mainfile, pos, R_WORD));
X  			return	2;
X  		case  4:
X! 			if  (sz < 4) {
X! 				(void) putchar('&');
X  				(void) prind(gettw(&mainfile, pos, R_WORD));
X  			}
X  			else
X***************
X*** 573,578
X  			(void) putchar('&');
X  			if  (sz < 4)
X  				(void) prind(gettw(&mainfile, pos, R_WORD));
X  			else
X  				paddr(pos);
X  			return	sz;
X
X--- 625,631 -----
X  			if  (sz < 4) {
X  				(void) putchar('&');
X  				(void) prind(gettw(&mainfile, pos, R_WORD));
X+ 			}
X  			else
X  				paddr(pos);
X  			return	sz;
X***************
X*** 692,698
X  	int	disp = gettw(&mainfile, pos+2, R_WORD);
X  	int	ctrl = ((disp >> 10) & 2) | (disp & 1);
X  
X! 	(void) fputs("movc\t", stdout);
X  	if  ((te->t_contents & 1) == 0)
X  		(void) fputs(creg[ctrl], stdout);
X  	if  (disp & 0x8000)
X
X--- 745,751 -----
X  	int	disp = gettw(&mainfile, pos+2, R_WORD);
X  	int	ctrl = ((disp >> 10) & 2) | (disp & 1);
X  
X! 	(void) fputs("mov\t", stdout);
X  	if  ((te->t_contents & 1) == 0)
X  		(void) fputs(creg[ctrl], stdout);
X  	if  (disp & 0x8000)
X***************
X*** 714,720
X  
X  	/* we need to swith the operands to compare instrucions. */
X  	if (strcmp (optab[te->t_iindex].prarg, "cmp")) {
X! 		(void) printf("%s.%c\t&", optab[te->t_iindex].prarg, sz);
X  		if  (sz == 'l')  {
X  			paddr(pos+2);
X  			(void) putchar(',');
X
X--- 767,773 -----
X  
X  	/* we need to swith the operands to compare instrucions. */
X  	if (strcmp (optab[te->t_iindex].prarg, "cmp")) {
X! 		(void) printf("%s.%c\t", optab[te->t_iindex].prarg, sz);
X  		if  (sz == 'l')  {
X  			paddr(pos+2);
X  			(void) putchar(',');
X***************
X*** 721,726
X  			(void) prea(te->t_contents, pos+4, 4);
X  		}
X  		else  {
X  			(void) prind(gettw(&mainfile, pos+2, R_WORD));
X  			(void) putchar(',');
X  			(void) prea(te->t_contents, pos+2, 2);
X
X--- 774,780 -----
X  			(void) prea(te->t_contents, pos+4, 4);
X  		}
X  		else  {
X+ 		        (void) putchar('&');
X  			(void) prind(gettw(&mainfile, pos+2, R_WORD));
X  			(void) putchar(',');
X  			(void) prea(te->t_contents, pos+2, 2);
X***************
X*** 731,737
X  		if  (sz == 'l')  {
X  			(void) prea(te->t_contents, pos+4, 4);
X  			(void) putchar(',');
X- 			(void) putchar('&');
X  			paddr(pos+2);
X  		}
X  		else  {
X
X--- 785,790 -----
X  		if  (sz == 'l')  {
X  			(void) prea(te->t_contents, pos+4, 4);
X  			(void) putchar(',');
X  			paddr(pos+2);
X  		}
X  		else  {
X***************
X*** 804,810
X  {
X  	unsigned  tc  =  te->t_contents;
X  	
X! 	(void) fputs("movw\t", stdout);
X  	if  ((tc & 0xffc0) == 0x40c0)  {
X  		(void) fputs("%sr,", stdout);
X  		(void) prea(tc, pos, 2);
X
X--- 857,863 -----
X  {
X  	unsigned  tc  =  te->t_contents;
X  	
X! 	(void) fputs("mov.w\t", stdout);
X  	if  ((tc & 0xffc0) == 0x40c0)  {
X  		(void) fputs("%sr,", stdout);
X  		(void) prea(tc, pos, 2);
X***************
X*** 812,817
X  	else  {
X  		(void) prea(tc, pos, 2);
X  		(void) putchar(',');
X  		(void) fputs(optab[te->t_iindex].prarg, stdout);
X  	}
X  }
X
X--- 865,871 -----
X  	else  {
X  		(void) prea(tc, pos, 2);
X  		(void) putchar(',');
X+ 		(void) putchar('%');
X  		(void) fputs(optab[te->t_iindex].prarg, stdout);
X  	}
X  }
X***************
X*** 831,837
X  t_entry	*te;
X  long	pos;
X  {
X! 	if (! strncmp(optab[te->t_iindex].prarg, "tas") && 
X  	    (te->t_contents & 0x3f) == 0x3c) {
X  		symbol symb;
X  		t_entry tstr;
X
X--- 885,891 -----
X  t_entry	*te;
X  long	pos;
X  {
X! 	if (! strcmp(optab[te->t_iindex].prarg, "tas") && 
X  	    (te->t_contents & 0x3f) == 0x3c) {
X  		symbol symb;
X  		t_entry tstr;
X***************
X*** 836,843
X  		symbol symb;
X  		t_entry tstr;
X  		int counter = te->t_lng -2;
X! 		int offset = (pos += 4);
X! 		int dest;
X  		char * sw_label;
X  
X  		(void) printf("swbeg\t&%d\n", counter);
X
X--- 890,897 -----
X  		symbol symb;
X  		t_entry tstr;
X  		int counter = te->t_lng -2;
X! 		long offset = (pos += 4);
X! 		long dest;
X  		char * sw_label;
X  
X  		(void) printf("swbeg\t&%d\n", counter);
X***************
X*** 843,849
X  		(void) printf("swbeg\t&%d\n", counter);
X  
X  		symb = textlab(pos, pos);
X! 		printf("%s:\n", sw_label = symb->s_name);
X  
X  		while (counter--) {
X  			gette(&mainfile, pos, &tstr);
X
X--- 897,903 -----
X  		(void) printf("swbeg\t&%d\n", counter);
X  
X  		symb = textlab(pos, pos);
X! 		(void) printf("%s:\n", sw_label = symb->s_name);
X  
X  		while (counter--) {
X  			gette(&mainfile, pos, &tstr);
X***************
X*** 854,860
X   			     || dest >= mainfile.ef_tbase+mainfile.ef_tsize
X   			     || (dest & 1) != 0 )) {
X  				if (symb = textlab(dest,offset))
X! 					printf("\tshort\t%s-%s\n", 
X  						symb->s_name,sw_label);
X  				else
X  					printf("\tshort\t0x%x\t# Can't label destination.\n", 
X
X--- 908,914 -----
X   			     || dest >= mainfile.ef_tbase+mainfile.ef_tsize
X   			     || (dest & 1) != 0 )) {
X  				if (symb = textlab(dest,offset))
X! 					(void) printf("\tshort\t%s-%s\n", 
X  						symb->s_name,sw_label);
X  				else
X  					(void) printf("\tshort\t0x%x\t# Can't label destination.\n", 
X***************
X*** 857,863
X  					printf("\tshort\t%s-%s\n", 
X  						symb->s_name,sw_label);
X  				else
X! 					printf("\tshort\t0x%x\t# Can't label destination.\n", 
X  							tstr.t_contents);
X  			}
X  			else 
X
X--- 911,917 -----
X  					(void) printf("\tshort\t%s-%s\n", 
X  						symb->s_name,sw_label);
X  				else
X! 					(void) printf("\tshort\t0x%x\t# Can't label destination.\n", 
X  							tstr.t_contents);
X  			}
X  			else 
X***************
X*** 861,867
X  							tstr.t_contents);
X  			}
X  			else 
X! 				printf("\tshort\t0x%x\t# Illegal address\n", 
X  						tstr.t_contents);
X  			pos += 2;
X  		}
X
X--- 915,921 -----
X  							tstr.t_contents);
X  			}
X  			else 
X! 				(void) printf("\tshort\t0x%x\t# Illegal address\n", 
X  						tstr.t_contents);
X  			pos += 2;
X  		}
X***************
X*** 964,971
X  t_entry	*te;
X  long	pos;
X  {
X! 	(void) printf("link\t%s,&%d", areg[te->t_contents & 0x7],
X! 				gettw(&mainfile, pos+2, R_WORD));
X  }
X  
X  
X
X--- 1018,1025 -----
X  t_entry	*te;
X  long	pos;
X  {
X! 	(void) printf("link\t%s,&", areg[te->t_contents & 0x7]);
X! 	prind (gettw(&mainfile, pos+2, R_WORD));
X  }
X  
X  
X*** olddis/libmtch.c	Fri Jan 20 11:13:25 1989
X--- test/libmtch.c	Sat Jan 21 20:45:34 1989
X***************
X*** 102,108
X  	char	*bp, *ep = NULL, *pathb, *pathe, *fullpath = NULL;
X  	static	char	*pathn;
X  	extern	char	*getenv();
X-  	char	magic[8];
X  	struct	ar_hdr	arhdr;
X  	LDFILE *ldptr;
X  
X
X--- 102,107 -----
X  	char	*bp, *ep = NULL, *pathb, *pathe, *fullpath = NULL;
X  	static	char	*pathn;
X  	extern	char	*getenv();
X  	struct	ar_hdr	arhdr;
X  	LDFILE *ldptr;
X  
X***************
X*** 153,160
X  found:
X  
X  	str = fullpath? fullpath: str;
X!  	if  (FREAD(magic, sizeof(magic),1,ldptr) != 1  ||
X!  		strcmp(magic, ARMAG) != 0)  {
X  		if  (ep != NULL)  {
X  			(void) fprintf(stderr, "%s is not library file\n", str);
X  			exit(103);
X
X--- 152,158 -----
X  found:
X  
X  	str = fullpath? fullpath: str;
X!  	if  (TYPE(ldptr) != ARTYPE) {
X  		if  (ep != NULL)  {
X  			(void) fprintf(stderr, "%s is not library file\n", str);
X  			exit(103);
X*** olddis/main.c	Fri Jan 20 11:14:02 1989
X--- test/main.c	Sat Jan 21 20:45:35 1989
X***************
X*** 46,51
X  int	rel;			/*  File being analysed is relocatable  */
X  int	lpos;
X  char    shlibout;		/*  output values for shlib constants */
X  
X  symbol	dosymb();
X  struct	libit	*getfnam();
X
X--- 46,53 -----
X  int	rel;			/*  File being analysed is relocatable  */
X  int	lpos;
X  char    shlibout;		/*  output values for shlib constants */
X+ char	kernal;
X+ char	dup_error;
X  
X  symbol	dosymb();
X  struct	libit	*getfnam();
X***************
X*** 50,55
X  symbol	dosymb();
X  struct	libit	*getfnam();
X  
X  /*
X   *	Get hex characters, also allowing for 'k' and 'm'.
X   */
X
X--- 52,58 -----
X  symbol	dosymb();
X  struct	libit	*getfnam();
X  
X+ #if 0
X  /*
X   *	Get hex characters, also allowing for 'k' and 'm'.
X   */
X***************
X*** 95,100
X  		}
X  	}
X  }
X  
X  /*
X   *	Process entry line options.  Return number dealt with.
X
X--- 98,104 -----
X  		}
X  	}
X  }
X+ #endif
X  
X  /*
X   *	Process entry line options.  Return number dealt with.
X***************
X*** 136,141
X  			shlibout++;
X  			goto  nx;
X  
X  		case  'a':
X  			noabs++;
X  			goto  nx;
X
X--- 140,153 -----
X  			shlibout++;
X  			goto  nx;
X  
X+ 		case 'k':
X+ 			kernal++;
X+ 			goto nx;
X+ 
X+ 		case 'D':
X+ 			dup_error++;
X+ 			goto nx;
X+ 
X  		case  'a':
X  			noabs++;
X  			goto  nx;
X***************
X*** 227,233
X  	}
X  	
X  	lfd = getfnam(argv[1]);
X! 	if  (TYPE(lfd->ldptr) == ARTYPE)  {
X  		(void) fprintf(stderr, "Main file (%s) cannot be library\n", argv[1]);
X  		exit(2);
X  	}
X
X--- 239,245 -----
X  	}
X  	
X  	lfd = getfnam(argv[1]);
X! 	if  (TYPE(lfd->ldptr) == ARTYPE && lfd->lf_name[0])  {
X  		(void) fprintf(stderr, "Main file (%s) cannot be library\n", argv[1]);
X  		exit(2);
X  	}
X***************
X*** 305,308
X  	pbss(&mainfile);
X  	bfclose(&mainfile);
X  	exit(0);
X  }
X
X--- 317,321 -----
X  	pbss(&mainfile);
X  	bfclose(&mainfile);
X  	exit(0);
X+ 	/* NOTREACHED */
X  }
X*** olddis/prin.c	Fri Jan 20 11:14:05 1989
X--- test/prin.c	Sat Jan 21 20:45:35 1989
X***************
X*** 102,108
X  	register  long	tpos, endt;
X  	t_entry	tstr;
X  
X! 	(void) fputs("\ttext\n", stdout);
X  	
X  	tpos = fid->ef_tbase;
X  	endt = tpos + fid->ef_tsize;
X
X--- 102,108 -----
X  	register  long	tpos, endt;
X  	t_entry	tstr;
X  
X! 	(void) fputs("\tglobal _start\n_start:\n\ttext\n", stdout);
X  	
X  	tpos = fid->ef_tbase;
X  	endt = tpos + fid->ef_tsize;
X***************
X*** 142,148
X  {
X  	register  long	dpos, endd;
X  	register  int	lng, ccnt;
X- 	unsigned  ctyp;
X  	int	had, par, inc;
X  	char	*msg;
X  	d_entry	dstr;
X
X--- 142,147 -----
X  {
X  	register  long	dpos, endd;
X  	register  int	lng, ccnt;
X  	int	had, par, inc;
X  	char	*msg;
X  	d_entry	dstr;
X***************
X*** 156,162
X  		
X  		getde(fid, dpos, &dstr);
X  		plabs(dstr.d_lab, S_DATA);
X! 			
X  		switch  (dstr.d_type)  {
X  		case  D_CONT:
X  			(void) fprintf(stderr, "Data sync error\n");
X
X--- 155,161 -----
X  		
X  		getde(fid, dpos, &dstr);
X  		plabs(dstr.d_lab, S_DATA);
X! 
X  		switch  (dstr.d_type)  {
X  		case  D_CONT:
X  			(void) fprintf(stderr, "Data sync error\n");
X***************
X*** 165,171
X  			
X  		case  D_ASC:
X  		case  D_ASCZ:
X- 			ctyp = dstr.d_type;
X  			lng = dstr.d_lng;
X  		nextline:
X  			(void) fputs("\tbyte\t", stdout);
X
X--- 164,169 -----
X  			
X  		case  D_ASC:
X  		case  D_ASCZ:
X  			lng = dstr.d_lng;
X  		nextline:
X  			if (lng > 0)
X***************
X*** 168,176
X  			ctyp = dstr.d_type;
X  			lng = dstr.d_lng;
X  		nextline:
X! 			(void) fputs("\tbyte\t", stdout);
X! 			ccnt=0;
X! 			while  (lng > 0)  {
X  				if (ccnt) (void) putchar(',');
X  				getde(fid, dpos, &dstr);
X  				switch  (dstr.d_contents)  {
X
X--- 166,177 -----
X  		case  D_ASCZ:
X  			lng = dstr.d_lng;
X  		nextline:
X! 			if (lng > 0)
X! 			 {
X! 			    (void) fputs("\tbyte\t", stdout);
X! 			    ccnt=0;
X! 			    while  (lng > 0)  
X! 			     {
X  				if (ccnt) (void) putchar(',');
X  				getde(fid, dpos, &dstr);
X  				switch  (dstr.d_contents)  {
X***************
X*** 228,234
X  					(void) putchar('\n');
X  					goto nextline;
X  				}
X! 			}
X  			(void) putchar('\n');
X  			break;
X  
X
X--- 229,245 -----
X  					(void) putchar('\n');
X  					goto nextline;
X  				}
X! 			     }
X! 			 }
X! 			else
X! 			 {
X! 			    int last = dpos;
X! 			    do {		    
X! 			       dpos += 2;
X! 			       getde(fid, dpos, &dstr);
X! 			    } while(dpos < endd && dstr.d_lab == (symbol) 0);
X! 			    (void) printf("\tspace\t%d\n", dpos - last);
X! 			 }
X  			(void) putchar('\n');
X  			break;
X  
X***************
X*** 249,261
X  			par = R_LONG;
X  			inc = 4;
X  		wrest:
X! 			(void) putchar('\t');
X! 			(void) fputs(msg, stdout);
X! 			(void) putchar('\t');
X! 			lng = dstr.d_lng;
X! 			lpos = 16;
X! 			had = 0;
X! 			while  (lng > 0)  {
X  				if  (lpos > LINELNG) {
X  					(void) putchar('\n');
X  					(void) putchar('\t');
X
X--- 260,275 -----
X  			par = R_LONG;
X  			inc = 4;
X  		wrest:
X! 			if (lng > 0)
X! 			 {
X! 			    (void) putchar('\t');
X! 			    (void) fputs(msg, stdout);
X! 			    (void) putchar('\t');
X! 			    lng = dstr.d_lng;
X! 			    lpos = 16;
X! 			    had = 0;
X! 			    while  (lng > 0)  
X! 			     {
X  				if  (lpos > LINELNG) {
X  					(void) putchar('\n');
X  					(void) putchar('\t');
X***************
X*** 272,278
X  				lng -= inc;
X  				dpos += inc;
X  				had++;
X! 			}
X  			(void) putchar('\n');
X  			break;
X  
X
X--- 286,302 -----
X  				lng -= inc;
X  				dpos += inc;
X  				had++;
X! 			     }
X! 			 }
X! 			else
X! 			 {
X! 			    int last = dpos;
X! 			    do {		    
X! 			       dpos += 2;
X! 			       getde(fid, dpos, &dstr);
X! 			    } while(dpos < endd && dstr.d_lab == (symbol) 0);
X! 			    (void) printf("\tspace\t%d\n", dpos - last);
X! 			 }
X  			(void) putchar('\n');
X  			break;
X  
X***************
X*** 323,330
X  	while  (bpos < endb)  {
X  		getde(fid, bpos, &bstr);
X  		plabs(bstr.d_lab, S_BSS);
X! 		(void) printf("\tspace\t%d\n", bstr.d_lng);
X! 		bpos += bstr.d_lng;
X  	}
X  	
X  	getde(fid, endb, &bstr);
X
X--- 347,366 -----
X  	while  (bpos < endb)  {
X  		getde(fid, bpos, &bstr);
X  		plabs(bstr.d_lab, S_BSS);
X! 		if (bstr.d_lng)
X! 		 {
X! 		    (void) printf("\tspace\t%d\n", bstr.d_lng);
X! 		    bpos += bstr.d_lng;
X! 		 }
X! 		else
X! 		 {
X! 		    int last = bpos;
X! 		    do {		    
X! 		       bpos += 2;
X! 		       getde(fid, bpos, &bstr);
X! 		    } while(bpos < endb && bstr.d_lab == (symbol) 0);
X! 		    (void) printf("\tspace\t%d\n", bpos - last);
X! 		 }
X  	}
X  	
X  	getde(fid, endb, &bstr);
X*** olddis/robj.c	Fri Jan 20 11:13:34 1989
X--- test/robj.c	Sat Jan 21 20:45:37 1989
X***************
X*** 36,43
X  long	gettw(), getdw();
X  void	reallst(), lclash(), nomem(), unimpl();
X  void	addit();
X! char	*malloc();
X! long	lseek();
X  
X  int	par_entry, par_round, nmods, donedrel, donebrel;
X  struct	commit	abstab, comtab, dreltab;
X
X--- 36,42 -----
X  long	gettw(), getdw();
X  void	reallst(), lclash(), nomem(), unimpl();
X  void	addit();
X! unsigned convtosun();
X  
X  int	nmods, donedrel, donebrel;
X  struct	commit	abstab, comtab, dreltab;
X***************
X*** 39,45
X  char	*malloc();
X  long	lseek();
X  
X! int	par_entry, par_round, nmods, donedrel, donebrel;
X  struct	commit	abstab, comtab, dreltab;
X  long	trelpos, drelpos, brelpos;
X  
X
X--- 38,44 -----
X  void	addit();
X  unsigned convtosun();
X  
X! int	nmods, donedrel, donebrel;
X  struct	commit	abstab, comtab, dreltab;
X  long	trelpos, drelpos, brelpos;
X  
X***************
X*** 378,383
X  {
X  	t_entry	tstr;
X  	d_entry	dstr;
X  	
X  	if  (!sy->s_newsym)  {
X   		if  (type & S_EXT)  {
X
X--- 377,383 -----
X  {
X  	t_entry	tstr;
X  	d_entry	dstr;
X+ 	extern char dup_error;
X  	
X  	if  (!sy->s_newsym) {
X  	   if (dup_error)  {
X***************
X*** 379,392
X  	t_entry	tstr;
X  	d_entry	dstr;
X  	
X! 	if  (!sy->s_newsym)  {
X!  		if  (type & S_EXT)  {
X! 			(void) fprintf(stderr, "Duplicate symbol %s\n", sy->s_name);
X! 			/* exit(10);  temporary? */
X! 		}
X! 		if  (++sy->s_defs > nmods)
X! 			nmods = sy->s_defs;
X! 		sy = inventsymb("DUP");
X  	}
X  
X  	sy->s_value = val;
X
X--- 379,396 -----
X  	d_entry	dstr;
X  	extern char dup_error;
X  	
X! 	if  (!sy->s_newsym) {
X! 	   if (dup_error)  {
X! 	      if  (type & S_EXT)  {
X! 		 (void) fprintf(stderr, "Duplicate symbol %s\n", sy->s_name);
X! 		 /* exit(10);  temporary? */
X! 	      }
X! 	      if  (++sy->s_defs > nmods)
X! 	       nmods = sy->s_defs;
X! 	      sy = inventsymb("DUP");
X! 	   }
X! 	   else
X! 	       return sy;
X  	}
X  
X  	sy->s_value = val;
X***************
X*** 656,662
X   */
X  /* trelpos, drelpos ??? */
X  
X! rrell2(ldptr, ldptr2, outf)
X  LDFILE *ldptr,*ldptr2;	/*  a.out file (possibly in library)  */
X  ef_fid	outf;		/*  Output file descriptor  */
X  {
X
X--- 660,666 -----
X   */
X  /* trelpos, drelpos ??? */
X  
X! void rrell2(ldptr, ldptr2, outf)
X  LDFILE *ldptr,*ldptr2;	/*  a.out file (possibly in library)  */
X  ef_fid	outf;		/*  Output file descriptor  */
X  {
X***************
X*** 667,673
X  	struct syment isym;
X  	int nreloc;
X  	unsigned rtype;
X- 	register  long	size;
X  	register  symbol  csymb;
X  	long	pos, mpos, mval, lval;
X  	int	dhere = 0;		/*  Mark whether bss done  */
X
X--- 671,676 -----
X  	struct syment isym;
X  	int nreloc;
X  	unsigned rtype;
X  	register  symbol  csymb;
X  	long	pos, mpos, mval, lval;
X  	int	dhere = 0;		/*  Mark whether bss done  */
X***************
X*** 675,681
X  	ldshread(ldptr,1,&tsect);
X  	ldshread(ldptr,2,&dsect);
X   	if  (tsect.s_nreloc <= 0  &&  dsect.s_nreloc <= 0)
X! 		return	0;
X  
X  	nreloc = tsect.s_nreloc;
X  
X
X--- 678,684 -----
X  	ldshread(ldptr,1,&tsect);
X  	ldshread(ldptr,2,&dsect);
X   	if  (tsect.s_nreloc <= 0  &&  dsect.s_nreloc <= 0)
X! 		return;
X  
X  	nreloc = tsect.s_nreloc;
X  
X*** olddis/unc.h	Fri Jan 20 11:14:07 1989
X--- test/unc.h	Sat Jan 21 20:45:38 1989
X***************
X*** 178,180
X  #define S_FN   0x1f		/* file name symbol */
X  #define S_EXT  01		/* external bit, or'ed in */
X  #define S_TYPE 0x1e		/* mask for all the type bits */
X
X--- 178,185 -----
X  #define S_FN   0x1f		/* file name symbol */
X  #define S_EXT  01		/* external bit, or'ed in */
X  #define S_TYPE 0x1e		/* mask for all the type bits */
X+ 
X+ 
X+ char * malloc();
X+ void free (), exit ();
X+ long lseek();
SHAR_EOF
chmod 0666 DIFFS || echo "restore of DIFFS fails"
sed 's/^X//' << 'SHAR_EOF' > Makefile &&
XCC=gcc
XLD=/bin/ld
XCFLAGS=-O -fwritable-strings
XLDFLAGS=
XOBJS=	alloc.o file.o libmtch.o robj.o iset.o prin.o heur.o main.o \
X	conv.o constant.o
XSHAREDLIB=/lib/shlib.ifile /lib/crt0s.o
XLIBS=-lgcc
X#SHAREDLIB=/lib/crt0.o
X#LIBS=-lc
X
Xdis:	$(OBJS)
X	$(LD) $(LDFLAGS) -o dis $(OBJS) $(SHAREDLIB) -lld $(LIBS)
X
X$(OBJS): unc.h
X
Xshlib.h: parseifile
X	./parseifile > shlib.h
X
Xparseifile: y.tab.o
X	$(LD) $(LDFLAGS) -o parseifile y.tab.o $(SHAREDLIB) $(LIBS)
X
Xy.tab.o: y.tab.c
X	$(CC) $(CFLAGS) -c y.tab.c
X
Xy.tab.c: parseifile.y parseifile.h
X	yacc -v parseifile.y
X
Xconstant.c: shlib.h
X
SHAR_EOF
chmod 0666 Makefile || echo "restore of Makefile fails"
sed 's/^X//' << 'SHAR_EOF' > README.diffs &&
X
XThis distribution cantains the file of patches (DIFFS), 4 new source files
X(constant.c kernal.h parseifile.y parseifile.h) and the change log (ChangeLog).
XThe documentation (man pages? wee don't need no stinkin' man pages!) is
Xforthcoming.
X
SHAR_EOF
chmod 0666 README.diffs || echo "restore of README.diffs fails"
sed 's/^X//' << 'SHAR_EOF' > constant.c &&
Xstruct symbol {
X   int address;
X   char * name;
X};
X
X#include "shlib.h"
X
Xchar *
Xlookup_address(n)
X  long int n;
X{
X   struct symbol * lo = symtab,
X   		 * hi = &symtab[TABLE_SIZE],
X		 * mid;
X   char * new, * malloc ();
X
X   if (n < 0x300000 || n > 0x380000)
X       return (char *) 0;
X
X   while (lo <= hi)
X    {
X       mid = lo + (hi - lo)/2;
X       if (n == mid->address)
X	   return mid->name;
X       else if (n > mid->address)
X	   lo = mid + 1;
X       else
X	   hi = mid - 1;
X    }
X   mid = (hi > lo ? lo : hi);
X   new = malloc ((unsigned) strlen (mid->name) + 10);
X   sprintf(new, "%s+0x%x", mid->name, n - mid->address);
X   return new;
X}
X
X#include "kernal.h"
X
Xchar *
Xlookup_kernal_address(n)
X  long int n;
X{
X   struct symbol * lo = kerntab,
X   		 * hi = &kerntab[KERNAL_TABLE_SIZE],
X		 * mid;
X
X   while (lo <= hi)
X    {
X       mid = lo + (hi - lo)/2;
X       if (n == mid->address)
X	   return mid->name;
X       else if (n > mid->address)
X	   lo = mid + 1;
X       else
X	   hi = mid - 1;
X    }
X
X   return (char *) 0;
X}
X
SHAR_EOF
chmod 0666 constant.c || echo "restore of constant.c fails"
sed 's/^X//' << 'SHAR_EOF' > kernal.h &&
X/*
X  kernal.h - interesting kernal addresses from various header files.
X
X  This file is probably extremly dependant on the OS version. As distributed
X  is was created from the 3.51 header files. I did my best to be accurate, but
X  there may be typos (i did check).
X*/
X
X#define KERNAL_TABLE_SIZE 142
X
Xstruct symbol kerntab[] = {
X   {0x70000, "VPG_BASE"},
X   {0x70900, "u.u_rsav"},
X   {0x70934, "u.u_qsav"},
X   {0x70968, "u.u_ssav"},
X   {0x7099C, "u.u_segflg"},
X   {0x7099D, "u.u_error"},
X   {0x7099E, "u.u_uid"},
X   {0x709A0, "u.u_gid"},
X   {0x709A2, "u.u_ruid"},
X   {0x709A4, "u.u_rgid"},
X   {0x709A6, "u.u_procp"},
X   {0x709AA, "u.u_ap"},
X   {0x709AE, "u.u_rval1"},
X   {0x709B2, "u.u_rval2"},
X   {0x709B6, "u.u_base"},
X   {0x709BA, "u.u_count"},
X   {0x709BE, "u.u_offset"},
X   {0x709C2, "u.u_fmode"},
X   {0x709C4, "u.u_pbsize"},
X   {0x709C6, "u.u_pboff"},
X   {0x709C8, "u.u_pbdev"},
X   {0x709CA, "u.u_rablock"},
X   {0x709CE, "u.u_errcnt"},
X   {0x709D0, "u.u_cdir"},
X   {0x709D4, "u.u_rdir"},
X   {0x709D8, "u.u_dirp"},
X   {0x709E8, "u.u_pdir"},
X   {0x709EC, "u.u_ofile"},
X   {0x709F0, "u.u_pofile"},
X   {0x709f4, "u.FillerYUK"},
X   {0x70A54, "u.u_arg"},
X   {0x70A7C, "u_tsize"},
X   {0x70A80, "u_dsize"},
X   {0x70A84, "u_ssize"},
X   {0x70A88, "u_lsize"},
X   {0x70A8C, "u.u_signal"},
X   {0x70B0C, "u.u_utime"},
X   {0x70B10, "u.u_stime"},
X   {0x70B14, "u.u_cutime"},
X   {0x70B18, "u.u_cstime"},
X   {0x70B1C, "u.u_ar0"},
X   {0x70B20, "u.u_prof.pr_base"},
X   {0x70B24, "u.u_prof.pr_size"},
X   {0x70B28, "u.u_prof.pr_off"},
X   {0x70B2C, "u.u_prof.pr_scale"},
X   {0x70B30, "u.u_ttyp"},
X   {0x70B34, "u.u_ttyd"},
X   {0x70B36, "u.u_exdata.ux_mag"},
X   {0x70B38, "u.u_exdata.ux_stamp"},
X   {0x70B3A, "u.u_exdata.ux_tsize"},
X   {0x70B3E, "u.u_exdata.ux_dsize"},
X   {0x70B42, "u.u_exdata.ux_bsize"},
X   {0x70B46, "u.u_exdata.ux_ssize"},
X   {0x70B4A, "u.u_exdata.ux_entloc"},
X   {0x70B4E, "u.u_exdata.ux_unused"},
X   {0x70B52, "u.u_exdata.ux_relflag"},
X   {0x70B56, "u.u_xlsize"},
X   {0x70B5A, "u.u_comm"},
X   {0x70B68, "u.u_start"},
X   {0x70B6C, "u.u_ticks"},
X   {0x70B70, "u.u_mem"},
X   {0x70B74, "u.u_ior"},
X   {0x70B78, "u.u_iow"},
X   {0x70B7C, "u.u_iosw"},
X   {0x70B80, "u.u_ioch"},
X   {0x70B84, "u.u_acflag"},
X   {0x70B86, "u.u_cmask"},
X   {0x70B88, "u.u_limit"},
X   {0x70B90, "u.u_limit[LIM_NORAISE]"},
X   {0x70B90, "u.u_limit[LIM_FSIZE]"},
X   {0x70B90, "u.u_limit[LIM_CPU]"},
X   {0x70B90, "u.u_limit[LIM_DATA]"},
X   {0x70B90, "u.u_limit[LIM_STACK]"},
X   {0x70B90, "u.u_limit[LIM_CORE]"},
X   {0x70B90, "u.u_limit[LIM_MAXRSS]"},
X   {0x70ba4, "u.u_dmap"},
X   {0x70bca, "u.u_smap"},
X   {0x70bf0, "u.u_cdmap"},
X   {0x70C16, "u.u_csmap"},
X   {0x70C3C, "u.u_outtime"},
X   {0x70C40, "u.u_usize"},
X   {0x70C42, "u.u_lock"},
X   {0x70E00, "VPTE_BASE"},
X   {0x400000, "PG_BASE"},
X   {0x4000C0, "DMA_MAP"},
X   {0x4000DC, "DMA_UPTR"},
X   {0x4000E0, "UPTE"},
X   {0x400100, "USER_MAP"},
X   {0x400600, "MAP_TOP"},
X   {0x410000, "GSR_ADDR"},
X   {0x420000, "VIDMEM"},	
X   {0x430000, "BUS0_ADDR"},
X   {0x440000, "BUS1_ADDR"},
X   {0x450000, "PHONE_STATUS"},
X   {0x460000, "DMA_CNT"},
X   {0x470000, "LP_STATUS_ADDR"},
X   {0x480000, "RTC_WRITE_ADDRESS"},
X   {0x490000, "HNDSET_RELAY"},
X   {0x491000, "LINE_SELECT"},
X   {0x492000, "HOOK1_RELAY"},
X   {0x493000, "HOOK2_RELAY"},
X   {0x494000, "LINE1_ACTIVE"},
X   {0x495000, "LINE2_ACTIVE"},
X   {0x496000, "A_LEAD1_RELAY"},
X   {0x497000, "A_LEAD2_RELAY"},
X   {0x4A0000, "MCR_ADDR"},
X   {0x4B0000, "A_BAUD_ADDR"},
X   {0x4B0400, "DIALER_LOWER"},
X   {0x4B0800, "DIALER_HIGHER"},
X   {0x4C0000, "CSR_ADDR"},
X   {0x4D0000, "DMA_LOADDR"},
X   {0x4D4000, "DMA_HIADDR"},
X   {0x4E0000, "DISK_CNTRL"},
X   {0x4f0000, "LP_DATA_ADDR"},
X   {0xE00000, "HD_BASE"},
X   {0xE10000, "FD_BASE"},
X   {0xE20000, "MCR2_ADDR"},
X   {0xE30000, "RTC_READ_ADDDR"},
X   {0xE40000, "SYSERR_GCR_ADDR"},
X   {0xE41000, "PE_INT_GCR_ADDR"},
X   {0xE42000, "PE_FRC_GCR_ADDR"},
X   {0xE43000, "ROM_GCR_ADDR"},
X   {0xE44000, "L1MD_GCR_ADDR"},
X   {0xE45000, "L2MD_GCR_ADDR"},
X   {0xE46000, "DNCT_GCR_ADDR"},
X   {0xE50000, "A_DATA_ADDR"},
X   {0xE50002, "B_DATA_ADDR"},
X   {0xE50004, "A_CMND_ADDR"},
X   {0xE50006, "B_CMND_ADDR"},
X   {0xE60000, "SCM_0W_Control"},
X   {0xE61000, "SCM_1W_Control"},
X   {0xE62000, "SCM_2R_Control"},
X   {0xE63000, "SCM_3R_Control"},
X   {0xE64000, "SCM_4W_Control"},
X   {0xE65000, "SCM_5W_Control"},
X   {0xE66000, "SCM_6W_Control"},
X   {0xE68000, "SCM_8W_Control"},
X   {0xE69000, "SCM_9W_Control"},
X   {0xE6A000, "SCM_10R_Control"},
X   {0xE70000, "C_CMND_ADDR"},
X   {0xE70002, "C_DATA_ADDR"},
X   {0x7fffffff, "CDLIMIT"},
X};
SHAR_EOF
chmod 0666 kernal.h || echo "restore of kernal.h fails"
sed 's/^X//' << 'SHAR_EOF' > parseifile.h &&
X/*
X * parseifile.h - header file for parseifile.y
X *
X * Written by Alex Crain
X *
X */
X
X#define DEFAULT_IFILE "/lib/shlib.ifile"
X#define DEFAULT_TABLE_SIZE 2500
X
X#define HEADER	"\
X/*\n\
X *  This is a computer generated file.\n\
X *\n\
X *  The file contains a table declaration and accessor function for adding\n\
X *  builting symbol values to the 68k dissassembler.\n\
X *\n\
X *  This file is generated by the parseifile program, written by Alex Crain.\n\
X *\n\
X */\n\
X"
SHAR_EOF
chmod 0666 parseifile.h || echo "restore of parseifile.h fails"
sed 's/^X//' << 'SHAR_EOF' > parseifile.y &&
X%{
X
X/* 
X * ifile processor for unix-pc disassembler
X *
X * Written by Alex Crain - January 1988
X *
X * Copyright 1988 Alex Crain
X */
X
X#include <stdio.h>
X#include <string.h>
X#include <ctype.h>
X#include "parseifile.h"
X
Xchar * malloc ();
Xlong strtol ();
Xint GetC (), NextC (), yylex ();
Xvoid fatal (), gen_file (), UnGetC (), sort_symbols (), exit (), free ();
X
X#define yyerror(MSG) fatal (MSG)
X
Xstruct symbol {
X   long address;
X   char * name;
X};
X
Xstatic char * ifile_name = DEFAULT_IFILE;
Xstatic FILE * ifile;
Xstatic struct symbol * symtab;
Xstatic int table_size = 0, max_table_size = DEFAULT_TABLE_SIZE;
X
Xextern int yydebug;
X#define YYDEBUG 1
X
Xvoid
Xmain (argc, argv)
Xint argc;
Xchar ** argv;
X{
X   int c;
X   extern char * optarg;
X
X   yydebug = 0;
X
X   while ((c = getopt (argc, argv, "df:s:")) != EOF)
X       switch (c)
X	{
X	case 'd':
X	   yydebug = 1;
X	   break;
X	case 'f':
X	   ifile_name = optarg;
X	   break;
X	case 's':
X	   max_table_size = strtol (optarg, (char **) 0, 0);
X	   break;
X	case '?':
X	   fatal ("Usage: parseifile [-d] [-f ifile] [-s table-size].");
X	}
X   
X   if ((ifile = fopen (ifile_name, "r")) == NULL)
X       fatal ("Cannot open ifile.");
X
X   symtab = (struct symbol *) malloc (sizeof(struct symbol) * max_table_size);
X   if (symtab == NULL)
X       fatal ("Out of memory.");
X
X   (void) yyparse ();
X   sort_symbols ();
X   gen_file ();
X   exit (0);
X   /*NOTREACHED*/
X}
X
X%}
X
X%union {
X	long	integer;
X	char *	string;
X}
X
X%token FLAG
X%token '{'
X%token '}'
X%token '='
X%token '+'
X%token ';'
X%token <string> SOMETHING
X
X%type <integer> expression
X
X%%
X
Xfile
X	: definitions
X	;
X
Xdefinitions
X	: definition
X	| definitions definition
X	;
X
Xdefinition
X	: directive
X	| assignment
X	| FLAG
X	;
X
Xdirective
X	: SOMETHING block
X		{ if ($1) (void) free ($1); }
X	;
X
Xassignment
X	: SOMETHING '=' expression ';'
X		{ add_symbol ($1, $3); }
X	;
X
Xexpression 
X	: SOMETHING
X		{ if (isdigit ($1[0]))
X		      $$ = strtol ($1, (char **)0, 0);
X		  else
X		      $$ = lookup_symbol ($1);
X		  (void) free ($1);
X		}
X	| expression '+' SOMETHING
X		{ if (isdigit ($3[0]))
X		      $$ = $1 + strtol ($3, (char **)0, 0);
X		  else
X		      $$ = $1 + lookup_symbol ($3);
X		  (void) free ($3);
X		}
X	;      
X
Xblock
X	: '{' stuff_list '}'
X	| '{' '}'
X	;
X
Xstuff_list
X	: stuff
X	| stuff_list stuff
X	;
X
Xstuff
X	: SOMETHING
X		{ if ($1) (void) free ($1); }
X	| block
X	| '+'
X	| '='
X	| ';'
X	;
X
X%%
X
Xint lookahead = 0;
Xint yylineno = 0;
X
Xint
XGetC ()
X{
X   int c;
X
X   if (lookahead)
X    {
X       c = lookahead;
X       lookahead = 0;
X    }
X   else
X    {
X       c = getc (ifile);
X       if (c == '\n')
X	   yylineno++;
X    }
X   return c;
X}
X
Xint
XNextC ()
X{
X   if (! lookahead)
X       lookahead = getc (ifile);
X   return lookahead;
X}
X
Xvoid 
XUnGetC (c)
X  int c;
X{
X   lookahead = c;
X}
X
Xint
Xyylex ()
X{
X   int c;
X   static char buffer[128];
X
X start:
X   while (((c = GetC ()) != EOF) && isspace (c));
X   if (c == '/' && NextC () == '*')
X    {
X       do {
X	  c=GetC (); 
X       } while (c != EOF && (c != '*' || NextC () != '/'));
X       c = GetC ();
X       goto start;
X    }
X	  
X   if (isalnum (c) || c == '_')
X    {
X       int i = 0;
X
X       while ((isalnum (c) || c == '_') && i < 128)
X	{
X	   buffer[i++] = c;
X	   c = GetC ();
X	}
X       UnGetC (c);
X       buffer[i] = '\0';
X       yylval.string = malloc (sizeof (buffer) + 1);
X       if (yylval.string)
X	   (void) strcpy (yylval.string, buffer);
X       else
X	   fatal ("Out of memory.");
X       if (yydebug) 
X	   (void) printf ("(%s)", buffer);
X       return SOMETHING;
X    }
X
X   if (c == '-')
X    {
X       while ((c = GetC ()) != EOF && c != '\n');
X       return FLAG;
X    }
X
X   switch (c)
X    {
X    case '{':
X    case '}':
X    case '+':
X    case '=':
X    case ';':
X       return c;
X    case EOF:
X       return EOF;
X    default:
X       yylval.string = (char *) 0;
X       return SOMETHING;
X    }
X}
X
Xvoid
Xadd_symbol (symbol,address)
X  char * symbol;
X  long address;
X{
X   symtab[table_size].name = symbol;
X   symtab[table_size].address = address;
X   table_size++;
X}
X
Xvoid
Xgen_file ()
X{
X   int i;
X
X   (void) puts (HEADER);
X   (void) printf ("#define TABLE_SIZE %d\n", table_size);
X   (void) puts ("struct symbol symtab[] = {");
X   for (i=0; i<table_size; i++)
X       (void) printf ("{0x%x,\"%s\"},\n", symtab[i].address, symtab[i].name);
X   (void) puts ("};");
X}
X
Xvoid
Xfatal (msg)
X  char * msg;
X{
X   (void) fputs ("pareifile: ", stderr);
X   if (yylineno)
X       (void) fprintf (stderr, "[line %d]: ", yylineno);
X   (void) fputs (msg, stderr);
X   (void) putc('\n', stderr);
X   (void) exit (1);
X
X}
X
Xlong
Xlookup_symbol(s)
X  char * s;
X{
X   int i = 0;
X
X   while (i < table_size)
X    {
X       if (strcmp (symtab[i].name, s))
X	   i++;
X       else
X	   return symtab[i].address;
X    }
X   fatal ("unreferenced symbol.");
X   /*NOTREACHED*/
X}
X	   
X	   
Xvoid 
Xsort_symbols ()
X{
X   int i, j;
X   for (i = table_size - 1; i; i--)
X       for (j = 0; j < table_size - 1; j++)
X	   if (symtab[j].address > symtab[j+1].address)
X	    {
X	       union { long l; char * s; } temp;
X	       
X	       temp.l = symtab[j].address;
X	       symtab[j].address = symtab[j+1].address;
X	       symtab[j+1].address = temp.l;
X	       temp.s = symtab[j].name;
X	       symtab[j].name = symtab[j+1].name;
X	       symtab[j+1].name = temp.s;
X	    }
X}
SHAR_EOF
chmod 0666 parseifile.y || echo "restore of parseifile.y fails"
exit 0