From ec5f28e3f1400b5dacb88eda2d9db472a20b4349 Mon Sep 17 00:00:00 2001 From: Robert de Bath Date: Wed, 1 Jul 1998 01:00:00 +0200 Subject: Import Dev86src-0.14.3.tar.gz --- as/as.c | 9 ++++++--- as/as86_encap.sh | 42 ++++++++++++++++++++++++++++-------------- as/genobj.c | 14 +++++++++++++- as/mops.c | 12 ++++++++++++ as/pops.c | 2 +- as/readsrc.c | 1 - 6 files changed, 60 insertions(+), 20 deletions(-) (limited to 'as') diff --git a/as/as.c b/as/as.c index 4bf76c7..8c26b71 100644 --- a/as/as.c +++ b/as/as.c @@ -68,7 +68,6 @@ char **argv; last_pass=1; process_args(argc, argv); initscan(); - ptext(); assemble(); /* doesn't return, maybe use setjmp */ @@ -130,11 +129,12 @@ PUBLIC void initp1p2() macptop = (macpar = hid_mcpar) + MACPSIZ; lctabtop = (lcptr = lctab = hid_lctab) + NLOC; for (lcp = lctab; lcp < lctabtop; ++lcp) - /* init of lcdata/lc (many times) in loop to save space */ { lcp->data = lcdata = RELBIT; /* lc relocatable until 1st ORG */ lcp->lc = lc = 0; } + if( textseg > 0 ) + lcdata |= textseg; } PRIVATE int my_creat(name, message) @@ -165,6 +165,7 @@ char **argv; #ifdef I80386 setcpu(0xF); #endif + textseg = -1; if (argc <= 1) usage(); @@ -260,7 +261,7 @@ char **argv; case 't': if (!isnextarg || binfil != 0) usage(); - textseg = atoi(nextarg); + textseg = atoi(nextarg); if(textseg>0) textseg+=BSSLOC; --argc; ++argv; break; @@ -296,6 +297,8 @@ char **argv; #ifdef I80386 origcpuid = cpuid; #endif + if( textseg > 0 ) + lcdata |= textseg; inidata = (~binaryg & inidata) | (RELBIT | UNDBIT); } /* IMPBIT from inidata unless binaryg */ diff --git a/as/as86_encap.sh b/as/as86_encap.sh index 6bad886..cba2b3c 100644 --- a/as/as86_encap.sh +++ b/as/as86_encap.sh @@ -44,23 +44,34 @@ RV=0 $LIBDIR/as86 "$@" "$IFILE" -b _$$.bin -s _$$.sym || RV=$? +echo '#ifndef __ASSEMBLY__' > _$$.0 +echo >> _$$.0 +echo '#else' > _$$.3 +echo >> _$$.3 +echo '#endif' > _$$.5 + [ "$RV" = 0 ] && { ( sort _$$.sym echo %%%% od -v -t uC _$$.bin ) | \ - awk > _$$.v -v prefix=$PREFIX ' BEGIN{ + awk -v prefix=$PREFIX -v ofile=_$$ ' BEGIN{ sname = prefix "start"; + sn_file= ofile ".1"; + bn_file= ofile ".2"; + as_file= ofile ".4"; } /^%%%%$/ { flg++; if( flg == 1 ) { if( !started ) - printf "#define %s 0\n", sname; + { + printf "#define %s 0\n", sname > sn_file; + printf "%s = 0\n", sname > as_file; + } - printf "\n"; - printf "static char %sdata[] = {\n", prefix; + printf "static char %sdata[] = {\n", prefix >bn_file; bincount=0; } next; @@ -70,30 +81,33 @@ $LIBDIR/as86 "$@" "$IFILE" -b _$$.bin -s _$$.sym || RV=$? if( substr($2,1,4) == "0000" ) $2=substr($2,5); if( $1 == "+" && $4 == "$start" ) { - printf "#define %s 0x%s\n", sname, $2; + printf "#define %s 0x%s\n", sname, $2 > sn_file; + printf "%s = $%s\n", sname, $2 > as_file; started = 1; } else if( substr($3, 1, 1) == "E" && $4 != "start" && $4 != "size" && $4 != "data" ) { - printf "#define %s%s 0x%s\n", prefix, $4, $2; + printf "#define %s%s 0x%s\n", prefix, $4, $2 > sn_file; + printf "%s%s = $%s\n", prefix, $4, $2 > as_file; } next; } flg==1 { if(NF == 0) next; - printf " "; + printf " " > bn_file; for(i=2;i<=NF;i++) { if( $i >= 32 && $i < 127 && $i != 39 && $i != 92 ) - printf("\047%c\047,", $i); + printf("\047%c\047,", $i) > bn_file; else - printf("%3d,", $i); + printf("%3d,", $i) > bn_file; bincount++; } - printf "\n"; + printf "\n" > bn_file; } END { - printf "};\n\n"; - printf "#define %ssize %d\n", prefix, bincount; + printf "};\n\n" > bn_file; + printf "#define %ssize %d\n\n", prefix, bincount > sn_file; + printf "%ssize = $%04x\n\n", prefix, bincount > as_file; } ' RV=$? @@ -101,8 +115,8 @@ $LIBDIR/as86 "$@" "$IFILE" -b _$$.bin -s _$$.sym || RV=$? [ "$RV" = 0 ] && { if [ "X$OFILE" = "X-" ] - then cat _$$.v - else mv -f _$$.v "$OFILE" || RV=$? + then cat _$$.[0-9] + else cat _$$.[0-9] > "$OFILE" || RV=$? fi } diff --git a/as/genobj.c b/as/genobj.c index 8080265..09eda1c 100644 --- a/as/genobj.c +++ b/as/genobj.c @@ -379,6 +379,8 @@ PUBLIC void objheader() } *copyptr++ = symptr; strsiz += symptr->length + 1; + if (textseg>=0 && (symptr->data & SEGM) == textseg) + strsiz+=2; #if SIZEOF_OFFSET_T > 2 if (isge4byteoffset(symptr->value_reg_or_op.value)) size = 4 + 4; @@ -544,6 +546,8 @@ PUBLIC void objheader() if (size != 0) putobjoffset(symptr->value_reg_or_op.value, size); offset += symptr->length + 1; + if (textseg>=0 && (symptr->data & SEGM) == textseg) + offset+=2; } /* strings */ @@ -554,9 +558,17 @@ PUBLIC void objheader() { symptr = *copyptr++; writeobj(symptr->name, symptr->length); + if (textseg>=0 && (symptr->data & SEGM) == textseg) + { + putobj1('.'); + putobj1(hexdigit[textseg]); + } putobj1(0); } - putobj1(OBJ_SET_SEG | 0); /* default segment 0, |0010|SEGM| */ + if( textseg >= 0 ) + putobj1(OBJ_SET_SEG | textseg); /* default segment, |0010|SEGM| */ + else + putobj1(OBJ_SET_SEG | 0); /* default segment 0, |0010|SEGM| */ } /* write trailer to object file */ diff --git a/as/mops.c b/as/mops.c index d4fb4c3..dd00f3a 100644 --- a/as/mops.c +++ b/as/mops.c @@ -17,6 +17,7 @@ FORWARD void mshort2 P((void)); FORWARD reg_pt regchk P((void)); FORWARD void reldata P((void)); +FORWARD void segadj P((void)); #ifdef I80386 @@ -1059,6 +1060,7 @@ PRIVATE void lbranch(backamount) int backamount; { mcount += defsize + 0x1; + segadj(); if (pass2) { reldata(); @@ -2739,6 +2741,7 @@ PUBLIC void mlong() { mcount += 0x3; /* may be 0x0 or 0x1 here */ expres(); + segadj(); if (pass2) { reldata(); @@ -2926,3 +2929,12 @@ PRIVATE void reldata() else /* same file, segment and relocation */ lastexp.data = (lastexp.data | lcdata) & ~(RELBIT | SEGM); } + +PRIVATE void segadj() +{ + if ((lastexp.data & UNDBIT) && textseg >= 0 ) + { + lastexp.sym->data &= ~SEGM; + lastexp.sym->data |= (lcdata & SEGM); + } +} diff --git a/as/pops.c b/as/pops.c index c9aba90..64e2268 100644 --- a/as/pops.c +++ b/as/pops.c @@ -986,7 +986,7 @@ PUBLIC void ptext() if( textseg <= 0 ) setloc(TEXTLOC); else - setloc(BSSLOC+textseg); + setloc(textseg); } /* .WARN pseudo-op */ diff --git a/as/readsrc.c b/as/readsrc.c index 80c62f2..557ca5d 100644 --- a/as/readsrc.c +++ b/as/readsrc.c @@ -253,7 +253,6 @@ PUBLIC void pproceof() maclevel = iflevel = blocklevel = totwarn = toterr = linum = macnum = 0; initp1p2(); /* reset other varaiables */ - ptext(); if(pass==last_pass) binaryc = binaryg; #ifdef I80386 -- cgit v1.2.1