diff options
author | Robert de Bath <rdebath@poboxes.com> | 1996-11-03 22:33:35 +0100 |
---|---|---|
committer | Lubomir Rintel <lkundrak@v3.sk> | 2013-10-23 23:33:35 +0200 |
commit | c218c617b5be443b7968308506969ad2b726d73c (patch) | |
tree | 0051f396af56133d24fcf2ab757fabc78c1a09bf /dis88/dismain.c | |
parent | 0936b9aeab611665645a4e6bafaded7ca76dd189 (diff) | |
parent | 0d2fbe9b1bd284ce2cad55be17e8f2c896031a25 (diff) | |
download | dev86-c218c617b5be443b7968308506969ad2b726d73c.tar.gz |
Import Dev86src-0.0.8.tar.gzv0.0.8
Diffstat (limited to 'dis88/dismain.c')
-rw-r--r-- | dis88/dismain.c | 64 |
1 files changed, 46 insertions, 18 deletions
diff --git a/dis88/dismain.c b/dis88/dismain.c index f9ec6c5..dc150de 100644 --- a/dis88/dismain.c +++ b/dis88/dismain.c @@ -37,6 +37,7 @@ static char *OFILE = NULL; /* Points to output file name */ static char *PRG; /* Name of invoking program */ static unsigned long zcount; /* Consecutive "0" byte count */ int objflg = 0; /* Flag: output object bytes */ +int force = 0; /* Flag: override some checks */ #define unix 1 #define i8086 1 @@ -134,7 +135,7 @@ objdump(c) {/* * * * * * * * * * START OF objdump() * * * * * * * * * */ - register int k; + register int k,j; int retval = 0; if (objptr == OBJMAX) @@ -168,13 +169,31 @@ objdump(c) for (k = 0; k < objptr; ++k) { - printf("0x%02.2x",objbuf[k]); + printf("$%02.2x",objbuf[k]); if (k < (objptr - 1)) putchar(','); - else - putchar('\n'); } + for (k = objptr; k < OBJMAX; ++k) + printf(" "); + + printf(" | \""); + + for (k = 0; k < objptr; ++k) + { + if (objbuf[k] > ' ' && objbuf[k] <= '~' ) + putchar(objbuf[k]); + else switch(objbuf[k]) + { + case '\t': printf("\\t"); break; + case '\n': printf("\\n"); break; + case '\f': printf("\\f"); break; + case '\r': printf("\\r"); break; + default: putchar('.'); break; + } + } + printf("\"\n"); + objptr = 0; return (retval); @@ -355,10 +374,7 @@ distext() printf("| File is executable\n\n"); if (HDR.a_flags & A_SEP) - { - printf("| File has split I/D space, and may have\n"); - printf("| extraneous instructions in text segment\n\n"); - } + printf("| File has split I/D space\n\n"); prolog(); @@ -370,7 +386,9 @@ distext() for (PC = 0L; PC < HDR.a_text; ++PC) { - j = getchar() & 0xff; + j = getchar(); + if( j == EOF ) break; + j &= 0xFF; if ((j == 0) && ((PC + 1L) == HDR.a_text)) { ++PC; @@ -392,7 +410,7 @@ Fetch() if( symptr>=0 && getlab(N_TEXT) != NULL ) { --PC; return -1; } /* #define FETCH(p) ++PC; p = getchar() & 0xff; objbuf[objptr++] = p */ - p = getchar() & 0xff; + p = getchar(); objbuf[objptr++] = p; return p; } @@ -426,6 +444,7 @@ disdata() unsigned long end; putchar('\n'); + if( HDR.a_data == 0 ) return; if (HDR.a_flags & A_SEP) { @@ -476,6 +495,8 @@ static void disbss() putchar('\n'); + if( HDR.a_bss == 0 ) return; + if (HDR.a_flags & A_SEP) end = HDR.a_data + HDR.a_bss; else @@ -539,6 +560,9 @@ main(argc,argv) else ++objflg; break; + case 'f' : + force++; + break; default : usage(PRG); } @@ -573,22 +597,28 @@ main(argc,argv) if (BADMAG(HDR)) { - sprintf(a,"input file %s not in object format",IFILE); - fatal(PRG,a); + if (!force) + { + sprintf(a,"input file %s not in object format",IFILE); + fatal(PRG,a); + } + + memset(&HDR, '\0', sizeof(struct exec)); + HDR.a_text = 0x10000L; } - if (HDR.a_cpu != A_I8086) + if (HDR.a_cpu != A_I8086 && !force) { sprintf(a,"%s is not an 8086/8088 object file",IFILE); fatal(PRG,a); } if (HDR.a_hdrlen <= A_MINHDR) + { HDR.a_trsize = HDR.a_drsize = 0L; HDR.a_tbase = HDR.a_dbase = 0L; -/* AST emergency patch - HDR.a_lnums = HDR.a_toffs = 0L; -*/ + /* HDR.a_lnums = HDR.a_toffs = 0L; */ + } reloff = HDR.a_text /* Compute reloc data offset */ + HDR.a_data @@ -628,8 +658,6 @@ main(argc,argv) read(fd, (char *) &symtab[symptr],sizeof(struct nlist)); symptr--; } - else - fprintf(stderr,"%s: warning: no symbols\n",PRG); close(fd); |