Interdata_v6/usr/source/as/as8.c
/*
* Assembler listing routines
*
*
* Copyright (C) 1978, Richard Miller
*/
#define EXTERN extern
#include "as.h"
/*
* Buffer for listing
*/
struct {
char l_loc[5];
char l_locr;
char l_fill1[1];
char l_data[16];
char l_add[8];
char l_addr;
char l_fill3[1];
} lstbuf;
char *listp; /* current output position in l_data */
/*
* Initialize listing buffer
*/
lstinit()
{
register char *p;
register n;
p = &lstbuf;
for (n = sizeof(lstbuf); n--; p++)
*p = ' ';
listp = &lstbuf.l_data[0];
}
/*
* List location counter value
*/
lstloc()
{
lstx(curseg->loc, 5, lstbuf.l_loc);
lstbuf.l_locr = lstreloc(currel);
}
/*
* List the operand address
*/
lstaddr(val, rel)
{
lstx(val, 8, lstbuf.l_add);
lstbuf.l_addr = lstreloc(rel);
}
/*
* List a halfword of code/data
*/
lsth(val)
{
if (listp < &lstbuf.l_data[19])
lstx(val, 4, listp);
listp += 5;
}
/*
* List a byte of data
*/
lstb(val)
{
register n;
if (listp < &lstbuf.l_data[19]) {
for (n = listp-lstbuf.l_data; (n -= 5) > 0; )
;
if (n == -1)
listp++;
lstx(val, 2, listp);
}
listp += 2;
}
/*
* Print out listing line
*/
putline()
{
extern char linebuf[];
if (passl)
printf("%.33s %5d %s", &lstbuf, line, linebuf);
}
/*
* List number in hex with leading zeroes
*/
lstx(value, nibbles, buf)
char *buf;
register value;
{
register char *p;
for (p = buf+nibbles; --p >= buf; ) {
*p = "0123456789ABCDEF"[value&0xf];
value >>= 4;
}
}
/*
* Convert relocation type to readable value
*/
lstreloc(rel)
{
switch (rel&RSEG) {
case RABS:
return('a');
case RTEXT:
return('t');
case RDATA:
return('d');
case RBSS:
return('b');
case REXT:
return('U');
default:
return('?');
}
}