summaryrefslogtreecommitdiff
path: root/as
diff options
context:
space:
mode:
authorRobert de Bath <rdebath@poboxes.com>1998-07-01 01:00:00 +0200
committerLubomir Rintel <lkundrak@v3.sk>2013-10-23 23:40:31 +0200
commitec5f28e3f1400b5dacb88eda2d9db472a20b4349 (patch)
treeb3215b2306709d0412fd7845c78ca63ccaa2e29b /as
parent2f828530e36a02c5b4c534e42ab812370c2bf7d9 (diff)
downloaddev86-ec5f28e3f1400b5dacb88eda2d9db472a20b4349.tar.gz
Import Dev86src-0.14.3.tar.gzv0.14.3
Diffstat (limited to 'as')
-rw-r--r--as/as.c9
-rw-r--r--as/as86_encap.sh42
-rw-r--r--as/genobj.c14
-rw-r--r--as/mops.c12
-rw-r--r--as/pops.c2
-rw-r--r--as/readsrc.c1
6 files changed, 60 insertions, 20 deletions
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