home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
vol_200
/
292_01
/
aslist.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-07-17
|
7KB
|
420 lines
/* aslist.c */
/*
* (C) Copyright 1989,1990
* All Rights Reserved
*
* Alan R. Baldwin
* 721 Berkeley St.
* Kent, Ohio 44240
*/
#include <stdio.h>
#include <setjmp.h>
#include <string.h>
#include <alloc.h>
#include "asm.h"
/*
* Copy a block of source and code to
* the listing file. If no listing file or
* the current line is not to be listed
* just return. Multiple code bytes get
* put out on extra lines after the source
* line.
*/
VOID
list()
{
register char *wp;
register int *wpt;
register nb;
if (lfp == NULL || lmode == NLIST)
return;
slew(lfp);
while (ep < &eb[NERR])
*ep++ = ' ';
fprintf(lfp, "%.2s", eb);
if (lmode == SLIST) {
fprintf(lfp, "%24s%5u %s\n", "", line, ib);
return;
}
if (xflag == 0) { /* HEX */
fprintf(lfp, " %04X", laddr);
if (lmode == ALIST) {
fprintf(lfp, "%19s%5u %s\n", "", line, ib);
return;
}
wp = cb;
wpt = cbt;
nb = (int) (cp - cb);
list1(wp, wpt, nb, 1);
fprintf(lfp, " %5u %s\n", line, ib);
while ((nb -= 6) > 0) {
wp += 6;
wpt += 6;
slew(lfp);
fprintf(lfp, "%7s", "");
list1(wp, wpt, nb, 0);
putc('\n', lfp);
}
} else
if (xflag == 1) { /* OCTAL */
fprintf(lfp, " %06o", laddr);
if (lmode == ALIST) {
fprintf(lfp, "%17s%5u %s\n", "", line, ib);
return;
}
wp = cb;
wpt = cbt;
nb = (int) (cp - cb);
list1(wp, wpt, nb, 1);
fprintf(lfp, " %5u %s\n", line, ib);
while ((nb -= 4) > 0) {
wp += 4;
wpt += 4;
slew(lfp);
fprintf(lfp, "%9s", "");
list1(wp, wpt, nb, 0);
putc('\n', lfp);
}
} else
if (xflag == 2) { /* DECIMAL */
fprintf(lfp, " %05u", laddr);
if (lmode == ALIST) {
fprintf(lfp, "%17s%5u %s\n", "", line, ib);
return;
}
wp = cb;
wpt = cbt;
nb = (int) (cp - cb);
list1(wp, wpt, nb, 1);
fprintf(lfp, " %5u %s\n", line, ib);
while ((nb -= 4) > 0) {
wp += 4;
wpt += 4;
slew(lfp);
fprintf(lfp, "%9s", "");
list1(wp, wpt, nb, 0);
putc('\n', lfp);
}
}
}
/*
* Send bytes of code to the listing.
* A subroutine of `list'.
*/
VOID
list1(wp, wpt, nb, f)
register char *wp;
register int nb, *wpt;
{
register i;
if (xflag == 0) { /* HEX */
if (nb > 6)
nb = 6;
for (i=0; i<nb; ++i) {
list2(*wpt++);
fprintf(lfp, "%02X", (*wp++)&0377);
}
if (f) {
while (i < 6) {
fprintf(lfp, " ");
++i;
}
}
} else
if (xflag == 1) { /* OCTAL */
if (nb > 4)
nb = 4;
for (i=0; i<nb; ++i) {
list2(*wpt++);
fprintf(lfp, "%03o", (*wp++)&0377);
}
if (f) {
while (i < 4) {
fprintf(lfp, " ");
++i;
}
}
} else
if (xflag == 2) { /* DECIMAL */
if (nb > 4)
nb = 4;
for (i=0; i<nb; ++i) {
list2(*wpt++);
fprintf(lfp, "%03u", (*wp++)&0377);
}
if (f) {
while (i < 4) {
fprintf(lfp, " ");
++i;
}
}
}
}
/*
* Send relocation type to the listing.
* A subroutine of `list1'.
*/
VOID
list2(t)
register int t;
{
register int c;
c = ' ';
if (fflag == 1) {
if (t & R_RELOC) {
c = '`';
}
} else
if (fflag >= 2) {
if (t & R_RELOC) {
if (t & (R_PAG0|R_PAG)) {
c = '*';
} else if (t & R_USGN) {
c = 'u';
} else if (t & R_PCR) {
c = 'p';
} else {
c = 'r';
}
if (t & R_HIGH) c += 1;
}
}
putc(c, lfp);
}
/*
* Increment the count of lines on the
* page. If the page overflows:
* 1) put out a page skip,
* 2) a title,
* 3) a subtitle,
* 4) and reset the line count.
*/
VOID
slew(fp)
FILE *fp;
{
if (lop++ >= NLPP) {
fprintf(fp, "\fASxxxx Assembler %s (%s), page %u.\n",
VERSION, cpu, ++page);
fprintf(fp, "%s\n", tb);
fprintf(fp, "%s\n\n", stb);
lop = 5;
}
}
/*
* Symbol and Area Table Output
*/
VOID
lstsym(fp)
FILE *fp;
{
register int c, i, j, k;
register char *ptr;
int nmsym, narea;
struct sym *sp;
struct sym **p;
struct area *ap;
/*
* Symbol Table Header
*/
strcpy(stb, &symtbl[0]);
lop = NLPP;
if (fp == tfp)
page = 0;
slew(fp);
/*
* Find number of symbols
*/
nmsym = 0;
for (i=0; i<NHASH; i++) {
sp = symhash[i];
while (sp) {
if (sp != &dot)
++nmsym;
sp = sp->s_sp;
}
}
if (nmsym == 0)
goto atable;
/*
* Allocate space for an array of pointers to symbols
* and load array.
*/
if ((p = (struct sym **) malloc(sizeof((struct sym *) sp)*nmsym))
== NULL) {
fprintf(fp, "Insufficient space to build Symbol Table.\n");
return;
}
nmsym = 0;
for (i=0; i<NHASH; i++) {
sp = symhash[i];
while (sp) {
if (sp != &dot)
p[nmsym++] = sp;
sp = sp->s_sp;
}
}
/*
* Bubble Sort on Symbol Table Array
*/
j = 1;
c = nmsym - 1;
while (j) {
j = 0;
for (i=0; i<c; ++i) {
if (strcmp(&p[i]->s_id[0],&p[i+1]->s_id[0]) > 0) {
j = 1;
sp = p[i+1];
p[i+1] = p[i];
p[i] = sp;
}
}
}
/*
* Symbol Table Output
*/
for (i=0; i<nmsym;) {
sp = p[i];
if (sp->s_area) {
j = sp->s_area->a_ref;
if (xflag == 0) {
fprintf(fp, " %2X ", j);
} else
if (xflag == 1) {
fprintf(fp, "%3o ", j);
} else
if (xflag == 2) {
fprintf(fp, "%3u ", j);
}
} else {
fprintf(fp, " ");
}
ptr = &sp->s_id[0];
while (ptr < &sp->s_id[NCPS]) {
if ((c = *ptr++) != 0) {
putc(c, fp);
} else {
putc(' ', fp);
}
}
if (sp->s_flag & S_ASG) {
putc('=', fp);
} else {
putc(' ', fp);
}
if (sp->s_type == S_NEW) {
if (xflag == 0) {
fprintf(fp, " **** ");
} else
if (xflag == 1) {
fprintf(fp, "****** ");
} else
if (xflag == 2) {
fprintf(fp, " ***** ");
}
} else {
j = sp->s_addr;
if (xflag == 0) {
fprintf(fp, " %04X ", j);
} else
if (xflag == 1) {
fprintf(fp, "%06o ", j);
} else
if (xflag == 2) {
fprintf(fp, " %05u ", j);
}
}
j = 0;
if (sp->s_flag & S_GBL) {
putc('G', fp);
++j;
}
if (sp->s_area != NULL) {
putc('R', fp);
++j;
}
if (sp->s_type == S_NEW) {
putc('X', fp);
++j;
}
if (++i % 3 == 0) {
putc('\n', fp);
slew(fp);
} else
if (i < nmsym) {
while (j++ < 4)
putc(' ', fp);
fprintf(fp, "| ");
}
}
putc('\n', fp);
/*
* Area Table Header
*/
atable:
strcpy(stb, &aretbl[0]);
lop = NLPP;
slew(fp);
/*
* Area Table Output
*/
narea = 0;
ap = areap;
while (ap) {
++narea;
ap = ap->a_ap;
}
for (i=0; i<narea; ++i) {
ap = areap;
for (j=i+1; j<narea; ++j)
ap = ap->a_ap;
j = ap->a_ref;
if (xflag == 0) {
fprintf(fp, " %2X ", j);
} else
if (xflag == 1) {
fprintf(fp, " %3o ", j);
} else
if (xflag == 2) {
fprintf(fp, " %3u ", j);
}
ptr = &ap->a_id[0];
while (ptr < &ap->a_id[NCPS]) {
if ((c = *ptr++) != 0) {
putc(c, fp);
} else {
putc(' ', fp);
}
}
j = ap->a_size;
k = ap->a_flag;
if (xflag==0) {
fprintf(fp, " size %4X flags %X\n", j, k);
} else
if (xflag==1) {
fprintf(fp, " size %6o flags %o\n", j, k);
} else
if (xflag==2) {
fprintf(fp, " size %5u flags %u\n", j, k);
}
}
}