home *** CD-ROM | disk | FTP | other *** search
- Path: uunet!allbery
- From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
- Newsgroups: comp.sources.misc
- Subject: v06i038: 68K COFF dissassembler - patch 1
- Message-ID: <48167@uunet.UU.NET>
- Date: 4 Feb 89 03:25:21 GMT
- Sender: allbery@uunet.UU.NET
- Reply-To: alex@umbc3.umbc.edu (Alex S. Crain)
- Lines: 1941
- Approved: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
-
- 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
-