1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-01-17 16:44:41 +00:00
AZBevier b6523197ef SEL32: Add CSW (console switches) and BOOTR (boot regs) variables.
SEL32: Fix sel32_clk.c coding error in interval timer code.
SEL32: Update to latest makecode.c utility and add makefile.
SEL32: Update diag.ini file to show how to set boot regs and CSW values.
2019-09-01 16:37:26 -07:00

2299 lines
77 KiB
C

/*
* makecode.c
*
* This program uncompresses an MPX compressed object file and
* dumps the object records into a file named "testcode.mem"
* as absolute data. This code can then be loaded into the
* sel32 simulator using the "load testcode.mem" command. The
* assembler code must be assembled as asbolute code with
* origin at 0.
*
* input - stdin or specified file name
* output - file testcode.mem in local directory.
*
*/
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
//#undef DOTRACE
#define DOTRACE
//#define JUNK
#ifdef JUNK
//#define QUIET
//#define QUIET1
//#define QUIET8
#endif
#define uint32 unsigned int
#define int32 int
void codedump(int sect);
int rbl(unsigned char *buf, int n);
void putloi(unsigned char *s, int cnt);
int getloi(unsigned char *s, int lim);
int rmopen(int cfcb);
int rmclose(int cfcb);
int rmread(int cfcb, unsigned char *buffer);
int binary = 1;
int dounix; /* set if doing unix object */
int first; /* set after 1st time */
int ifd; /* input file number */
int main(int argc, char *argv[])
{
unsigned char s[BUFSIZ];
int i;
#ifndef JUNK
setbuf(stdout, 0);
#endif
if (argc == 1)
{ /* no file given, use stdin */
ifd = fileno(stdin);
}
else
{
if ((ifd = open(*++argv, O_RDWR)) < 0)
{
fprintf(stderr, "file %s not found\n", *argv);
exit(1);
}
}
while (1)
{
memset(s, '\0', BUFSIZ);
if ((i = rbl(s, (int)BUFSIZ)) <= 0)
exit(0);
s[i] = '\0';
putloi(s, i);
}
}
/* get a line of input. */
int getloi(s, lim) /* right from the book. */
unsigned char s[];
int lim;
{
int c, i, j;
j = rmread(ifd, s);
if (j <= 0)
return (0);
if (!binary)
{
s[j] = '\n';
for (i = 0; --lim > 0 && i < j;)
{
c = s[i];
s[i++] = c;
if ((*s != 0xbf) && (*s != 0x9f))
{
if (c == '\n')
{
if ((s[i - 1] == '\n') && (i > 1))
{
while ((s[i - 2] == ' ') && (i > 1))
--i;
s[i - 1] = '\n';
}
s[i] = '\0';
return (i);
}
}
}
return (i);
}
return (j);
}
int com_org[256]; /* common origin */
int com_size[256]; /* common size (mod 32 bytes) */
int com_base[256]; /* common base address in dsect */
int last_ds; /* endi of last common defined */
/* com_addr is always dsect sect_addr */
char comname[8]; /* name of common, blank filled */
int sect_org[256]; /* sect origin */
int sect_size[256]; /* sect size */
int sect_base[256]; /* sect base */
unsigned char *sect_addr[256]; /* sect address */
int curr_sect; /* current section */
int doem; /* 1st time flag */
#define MEM_SIZE 0x40000 /* 256k memory */
/*#define MEM_START 0x20000*//* where to start */
#define MEM_START 0x00000 /* where to start */
unsigned char *sa;
struct dpr { /* datapool reference table */
char name[8]; /* datapool item name */
unsigned int refa; /* address of reference */
};
#define DP_SIZE 100 /* datapool reference size */
int ndpr;
int dp_size; /* # allocated */
struct dpr *datapool; /* enough for 100 references */
struct extr { /* external reference table */
char name[8]; /* item name */
unsigned int refa; /* address of reference */
unsigned int sba; /* string back to next reference */
};
#define EXT_SIZE 100 /* external reference size */
int nextr;
int ext_size; /* # allocated */
struct extr *external; /* enough for 100 references */
struct defr { /* definition reference table */
char name[8]; /* item name */
unsigned int refa; /* address of reference */
};
#define DEF_SIZE 100 /* external definition size */
int ndefr;
int def_size; /* # allocated */
struct defr *defined; /* enough for 100 references */
unsigned int endaddr; /* end transfer address, if given */
/*
** output line of text from the source
*/
void putloi(unsigned char *s, int cnt)
{
int i, j, k, l;
int seq;
int bc = s[1];
int type, objcnt, repeat, bound;
int exttype, offset;
int temp1, temp2;
struct dpr *pdpp;
struct extr *pextp;
struct defr *pdefp;
if (!doem)
{
temp1 = MEM_SIZE;
curr_sect = 0; /* dsect */
sect_base[curr_sect] = MEM_START; /* assume dsect start */
sect_org[curr_sect] = 0; /* origin */
#ifdef NOT_NOW
sect_size[curr_sect] = MEM_SIZE; /* size */
#endif
/* get area momory */
sect_addr[curr_sect] = (unsigned char *)calloc(MEM_SIZE, 1);
/* get datapool ref storage */
datapool = (struct dpr *)calloc(DP_SIZE, sizeof(struct dpr));
dp_size = DP_SIZE; /* # allocated */
ndpr = 0; /* no ref yet */
/* get external ref storage */
external = (struct extr *)calloc(EXT_SIZE, sizeof(struct extr));
ext_size = EXT_SIZE; /* # allocated */
nextr = 0; /* no ref yet */
/* get external def storage */
defined = (struct defr *)calloc(DEF_SIZE, sizeof(struct defr));
def_size = DEF_SIZE; /* # allocated */
ndefr = 0; /* no ref yet */
doem = 1;
}
/* if(*s == 0xdf)printf("**last record\n"); */
seq = s[4] << 8 | s[5];
#ifdef QUIET
fprintf(stderr, "**record %x cnt %d\n", seq, bc);
#endif
offset = 6;
doit:
if (offset >= bc + 6)
return;
type = (s[offset] >> 4) & 0x0f; /* get object record type */
objcnt = s[offset] & 0x0f; /* get object record count */
if (objcnt == 0)
objcnt = 16; /* zero cnt means 16 */
switch (type)
{
case 0: /* absolute data */
sa = sect_addr[curr_sect]; /* address of section */
#ifdef QUIET
fprintf(stderr, "addr %x abs data cnt = %d data = ",
sect_org[curr_sect] + sect_base[curr_sect], objcnt);
#endif
for (k = 0; k < objcnt; k++)
{
#ifdef QUIET
if (k > 0 && (k % 4 == 0))
printf(" ");
fprintf(stderr, "%.2x", s[k + offset + 1]);
#endif
/* put data in memory */
sa[sect_org[curr_sect]++] = s[k + offset + 1];
}
if (!first)
{
first = 1; /* we been here */
type = 0;
for (k = 0; k < 4; k++)
{
type |= (s[k + offset + 1] << ((3 - k) * 8));
}
if (type == 0x2243223a)
dounix = 1; /* doing c object */
}
#ifdef QUIET
fprintf(stderr, "\n");
#endif
offset += (objcnt + 1);
break;
case 1: /* program origin */
#ifdef QUIET8
fprintf(stderr, "%s program origin addr = ", (s[offset + 1] & 0x80) ? "rel" : "abs");
#endif
s[offset + 1] &= 0x7f; /* turn off rel bit */
temp1 = 0; /* clear for new org */
for (k = 0; k < objcnt; k++)
{
#ifdef QUIET8
fprintf(stderr, "%.2x", s[k + offset + 1]);
#endif
temp1 = (temp1 << 8) | s[offset + 1 + k];
}
#ifdef QUIET8
fprintf(stderr, "\n");
#endif
sect_org[curr_sect] = temp1; /* set new origin */
offset += (objcnt + 1);
break;
case 2: /* absolute data repeat */
#ifdef OLD_JUNK
fprintf(stderr, "DUMP abs data repeat cnt = %d\n", objcnt);
for (k = 0; k < objcnt + 1; k++)
{
if (k > 0 && (k % 20 == 0))
fprintf(stderr, "\n");
fprintf(stderr, "%.2x ", s[offset + k]);
}
fprintf(stderr, "\n");
#endif
sa = sect_addr[curr_sect]; /* address of section */
repeat = s[offset + 1];
if (repeat == 0)
repeat = 1;
#ifdef QUIET
fprintf(stderr, "abs data repeat cnt = %d\n", repeat);
#endif
for (i = 0; i < repeat; i++)
{
for (k = 0; k < objcnt - 1; k++)
{
#ifdef QUIET
fprintf(stderr, "%.2x ", s[k + offset + 2]);
#endif
/* put data in memory */
sa[sect_org[curr_sect]++] = s[k + offset + 2];
}
}
#ifdef QUIET
fprintf(stderr, "\n");
#endif
offset += (objcnt + 1);
break;
case 3: /* transfer address */
#ifdef OLD_JUNK
fprintf(stderr, "DUMP transfer address cnt = %d\n", objcnt);
for (k = 0; k < objcnt + 1; k++)
{
if (k > 0 && (k % 20 == 0))
fprintf(stderr, "\n");
fprintf(stderr, "%.2x ", s[offset + k]);
}
fprintf(stderr, "\n");
#endif
#ifdef QUIET
fprintf(stderr, "transfer address cnt = %d addr = ", objcnt);
#endif
temp1 = 0;
s[offset + 1] &= 0x7f; /* turn off rel bit */
for (k = 0; k < objcnt; k++)
{
temp1 = (temp1 << 8) | s[k + offset + 1];
#ifdef QUIET
fprintf(stderr, "%.2x", s[k + offset + 1]);
#endif
}
temp1 += sect_base[curr_sect];
endaddr = temp1;
#ifdef QUIET
fprintf(stderr, "\n");
#endif
offset += (objcnt + 1);
break;
case 4: /* relocatable data */
sa = sect_addr[curr_sect]; /* address of section */
#ifdef QUIET
fprintf(stderr, "addr %x rel data cnt = %d data = ",
sect_org[curr_sect] + sect_base[curr_sect], objcnt);
#endif
for (k = 0; k < objcnt; k++)
{
if (k == 0)
temp1 = 0;
temp1 = (temp1 << 8) | s[offset + 1 + k];
if (k > 0 && (k % 4 == 3))
{
temp1 += sect_base[curr_sect];
#ifdef QUIET
fprintf(stderr, "%.8x", temp1);
fprintf(stderr, " ");
#endif
/* put data in memory */
for (i = 0; i < 4; i++)
sa[sect_org[curr_sect]++] = (temp1 >> ((3 - i) * 8)) & 0xff;
temp1 = 0;
}
}
#ifdef QUIET
fprintf(stderr, "\n");
#endif
offset += (objcnt + 1);
break;
case 5: /* program name */
bound = s[offset + 1 + objcnt - 1];
repeat = s[offset + 1 + objcnt - 2];
/* see if 'C' object */
if (repeat == 0x04)
dounix = 1; /* doing c object */
#ifdef JUNK
fprintf(stderr, "program name = ");
#endif
#ifdef QUIET9
fprintf(stderr, " PROGRAM ");
for (k = 0; k < objcnt - 3; k++)
{
fprintf(stderr, "%c", s[k + offset + 1]);
}
fprintf(stderr, "\n");
#endif
#ifdef QUIET1
fprintf(stderr, " bound = %x obj type = %x", bound, repeat);
fprintf(stderr, "\n");
#endif
offset += (objcnt + 1);
break;
case 6: /* relocatable data repeat */
sa = sect_addr[curr_sect]; /* address of section */
repeat = s[offset + 1];
if (repeat == 0)
repeat = 1;
#ifdef QUIET
fprintf(stderr, "rel data repeat cnt = %d\n", repeat);
#endif
for (j = 0; j < repeat; j++)
{
for (k = 0; k < objcnt - 1; k++)
{
if (k == 0)
temp1 = 0;
temp1 = (temp1 << 8) | s[offset + 2 + k];
if (k > 0 && (k % 4 == 3))
{
temp1 += sect_base[curr_sect];
#ifdef QUIET
fprintf(stderr, "%.8x", temp1);
fprintf(stderr, " ");
#endif
/* put data in memory */
for (i = 0; i < 4; i++)
sa[sect_org[curr_sect]++] = (temp1 >> ((3 - i) * 8)) & 0xff;
temp1 = 0;
}
}
}
#ifdef QUIET
fprintf(stderr, "\n");
#endif
offset += (objcnt + 1);
break;
case 7: /* external definition */
#ifdef JUNK
fprintf(stderr, "%s external def name = ", (s[offset + 1 + objcnt - 3] & 0x80) ? "rel" : "abs");
#endif
s[offset + 1 + objcnt - 3] &= 0x7f; /* turn off rel bit */
bound = s[offset + 1 + objcnt - 3] << 16 | s[offset + 1 + objcnt - 2] << 8 | s[offset + 1 + objcnt - 1];
if (ndefr >= def_size)
{ /* we need to resize */
defined = (struct defr *)realloc((void *)defined, (def_size + 10) * sizeof(struct defr));
def_size += 10; /* 10 more */
}
pdefp = &defined[ndefr]; /* ref data address */
#ifdef QUIET9
fprintf(stderr, " DEF ");
memset(pdefp->name, ' ', 8); /* blank name buffer */
for (k = 0; k < objcnt - 3; k++)
{
fprintf(stderr, "%c", s[k + offset + 1]);
pdefp->name[k] = s[k + offset + 1];
}
#endif
pdefp->refa = bound + sect_base[curr_sect];
ndefr++; /* next reference */
#ifdef JUNK
fprintf(stderr, " address = %x", bound);
#endif
#ifdef QUIET9
fprintf(stderr, "\n");
#endif
offset += (objcnt + 1);
break;
case 8: /* forward reference */
#ifdef QUIET9
fprintf(stderr, "%s forward reference addr = ", (s[offset + 1] & 0x80) ? "rel" : "abs");
#endif
s[offset + 1] &= 0x7f; /* turn off rel bit */
#ifdef QUIET9
for (k = 0; k < objcnt - 3; k++)
{
fprintf(stderr, "%.2x", s[k + offset + 1]);
}
fprintf(stderr, " sb addr = ");
for (k = 3; k < objcnt; k++)
{
fprintf(stderr, "%.2x", s[k + offset + 1]);
}
fprintf(stderr, "\n");
#endif
offset += (objcnt + 1);
break;
case 9: /* external reference */
#ifdef JUNK
fprintf(stderr, "%s external ref name = ", (s[offset + 1 + objcnt - 3] & 0x80) ? "rel" : "abs");
#endif
s[offset + 1 + objcnt - 3] &= 0x7f; /* turn off rel bit */
bound = s[offset + 1 + objcnt - 3] << 16 | s[offset + 1 + objcnt - 2] << 8 | s[offset + 1 + objcnt - 1];
if (nextr >= ext_size)
{ /* we need to resize */
external = (struct extr *)realloc((void *)external, (ext_size + 10) * sizeof(struct extr));
ext_size += 10; /* 10 more */
}
pextp = &external[nextr]; /* ref data address */
#ifndef QUIET9
fprintf(stderr, " EXT ");
memset(pextp->name, ' ', 8); /* blank name buffer */
for (k = 0; k < objcnt - 3; k++)
{
fprintf(stderr, "%c", s[k + offset + 1]);
pextp->name[k] = s[k + offset + 1];
}
#endif
pextp->refa = sect_org[curr_sect] + sect_base[curr_sect];
pextp->sba = bound + sect_base[curr_sect];
nextr++; /* next reference */
#ifdef JUNK
fprintf(stderr, " sb addr = %x", bound);
#endif
#ifdef QUIET9
fprintf(stderr, "\n");
#endif
offset += (objcnt + 1);
break;
case 10: /* common definition */
#ifdef QUIET9
fprintf(stderr, "common def name = ");
#endif
/* get common block number */
repeat = s[offset + 1 + objcnt - 3];
/* get common size */
bound = s[offset + 1 + objcnt - 2] << 8 | s[offset + 1 + objcnt - 1];
#ifdef QUIET9
for (k = 0; k < objcnt - 3; k++)
{
fprintf(stderr, "%c", s[k + offset + 1]);
}
fprintf(stderr, " block = %d size = %x\n", repeat, bound);
#endif
offset += (objcnt + 1);
break;
case 11: /* common reference */
/* get common block number */
i = s[offset + 1]; /* block number */
sa = sect_addr[0]; /* address in dsect */
#ifdef QUIET8
fprintf(stderr, "common ref block = %d cnt %d data = ", i, objcnt - 1);
#endif
for (k = 0; k < objcnt - 1; k++)
{
if (k == 0)
temp1 = 0;
temp1 = (temp1 << 8) | s[offset + 2 + k];
if (k > 0 && (k % 4 == 3))
{
#ifdef QUIET8
fprintf(stderr, "%.8x", temp1);
fprintf(stderr, " ");
#endif
temp1 += com_base[i] + sect_base[0];
#ifdef QUIET8
fprintf(stderr, "(%.8x)", temp1);
fprintf(stderr, " ");
#endif
/* put data in memory */
for (j = 0; j < 4; j++)
sa[sect_org[curr_sect]++] = (temp1 >> ((3 - j) * 8)) & 0xff;
temp1 = 0;
#ifdef QUIET8
if (k > 0 && (k % 20 == 0))
fprintf(stderr, "\n");
#endif
}
}
#ifdef QUIET8
if (k % 20 != 0)
fprintf(stderr, "\n");
#endif
offset += (objcnt + 1);
break;
case 12: /* datapool reference */
sa = sect_addr[curr_sect]; /* address of section */
#ifdef JUNK
fprintf(stderr, "datapool ref number %d size %d\n", ndpr, dp_size);
#endif
fprintf(stderr, "DATAPOOL COMMON ");
if (ndpr >= dp_size)
{ /* we need to resize */
datapool = (struct dpr *)realloc((void *)datapool, (dp_size + 10) * sizeof(struct dpr));
dp_size += 10; /* 10 more */
}
pdpp = &datapool[ndpr]; /* ref data address */
memset(pdpp->name, ' ', 8); /* blank name buffer */
for (k = 0; k < objcnt - 4; k++)
{
fprintf(stderr, "%c", s[k + offset + 1]);
pdpp->name[k] = s[k + offset + 1];
}
pdpp->refa = sect_org[curr_sect] + sect_base[curr_sect];
ndpr++; /* next reference */
#ifdef JUNK
fprintf(stderr, " at %x addr = ", sect_org[curr_sect] + sect_base[curr_sect]);
#endif
for (k = 0; k < 4; k++)
{
if (k == 0)
temp1 = 0;
temp1 = (temp1 << 8) | s[k + offset + objcnt + 1 - 4];
if (k > 0 && (k % 4 == 3))
{
/* temp1 += sect_base[curr_sect]; */
/* put data in memory */
for (i = 0; i < 4; i++)
sa[sect_org[curr_sect]++] = (temp1 >> ((3 - i) * 8)) & 0xff;
temp1 = 0;
}
#ifdef JUNK
fprintf(stderr, "%.2x", s[k + offset + objcnt + 1 - 4]);
#endif
}
fprintf(stderr, "\n");
offset += (objcnt + 1);
break;
case 13: /* escape to extended functions */
objcnt = s[offset] & 0x0f; /* get sub type */
exttype = s[offset + 1]; /* get ext type */
switch (exttype)
{
case 0: /* undefined */
for (k = 0; k < s[offset + 2]; k++)
{
if (k > 0 && (k % 20 == 0))
fprintf(stderr, "\n");
fprintf(stderr, "%.2x ", s[offset + k]);
}
fprintf(stderr, "\n");
offset += s[offset + 2];
break;
case 1: /* section definition */
#ifdef QUIET8
fprintf(stderr, "section def bound = %x num = %d size = ", s[offset + 3], s[offset + 4]);
temp1 = 0;
for (k = 0; k < 3; k++)
{
fprintf(stderr, "%.2x", s[offset + 5 + k]);
temp1 = (temp1 << 8) | s[offset + 5 + k];
}
fprintf(stderr, " name = ");
for (k = 0; k < 8; k++)
{
fprintf(stderr, "%c", s[offset + 8 + k]);
}
fprintf(stderr, "\n");
#endif
curr_sect = s[offset + 4]; /* sect # */
if (curr_sect == 0)
sect_base[curr_sect] = 0x20000; /* assume dsect start */
if (curr_sect == 1)
{
/* assume csect start */
temp2 = (temp1 / 0x2000) + 1; /* mod page size */
sect_base[curr_sect] = 0x80000 - (temp2 * 0x2000);
}
sect_org[curr_sect] = 0; /* origin */
temp2 = sect_size[curr_sect]; /* get old size */
if (temp2 == 0 && curr_sect == 0)
temp2 = MEM_SIZE; /* initial allocation */
sect_size[curr_sect] = temp1; /* new size */
/* get area momory */
if (sect_addr[curr_sect])
{ /* if we got one */
/* resize */
sect_addr[curr_sect] = (unsigned char *)realloc((void *)sect_addr[curr_sect], temp1);
/* clear new memory */
if ((temp1 - temp2) > 0)
memset(sect_addr[curr_sect] + temp2, 0, temp1 - temp2);
}
else /* get a new one */
sect_addr[curr_sect] = (unsigned char *)calloc(temp1, 1);
offset += s[offset + 2];
break;
case 2: /* section origin */
#ifdef QUIET8
fprintf(stderr, "section origin bound = %x sect %s origin = ",
s[offset + 3], s[offset + 4] == 0 ? "DSECT" : s[offset + 4] == 1 ? "CSECT" : "UNKNOWN");
temp1 = 0;
for (k = 0; k < 3; k++)
{
fprintf(stderr, "%.2x", s[offset + 5 + k]);
temp1 = (temp1 << 8) | s[offset + 5 + k];
}
fprintf(stderr, "\n");
#endif
curr_sect = s[offset + 4]; /* sect # */
sect_org[curr_sect] = temp1; /* origin */
offset += s[offset + 2];
break;
case 3: /* section relocatable ref */
repeat = s[offset + 5];
sa = sect_addr[curr_sect]; /* address of section */
if (repeat == 0)
repeat = 1; /* 0 is 1 */
#ifdef QUIET
fprintf(stderr, "addr %x sect rel ref %s rep cnt = %d data = ",
sect_org[curr_sect] + sect_base[curr_sect],
s[offset + 4] == 0 ? "DSECT" : s[offset + 4] == 1 ? "CSECT" : "UNKNOWN", repeat);
#endif
for (k = 0; k < (s[offset + 2] - 6); k++)
{
if (k == 0)
temp1 = 0;
temp1 = (temp1 << 8) | s[offset + 6 + k];
if (k > 0 && (k % 4 == 3))
{
temp1 += sect_base[s[offset + 4]];
#ifdef QUIET
fprintf(stderr, "%.8x", temp1);
fprintf(stderr, " ");
#endif
/* put data in memory */
for (i = 0; i < 4; i++)
sa[sect_org[curr_sect]++] = (temp1 >> ((3 - i) * 8)) & 0xff;
temp1 = 0;
}
#ifdef QUIET
if (k > 0 && (k % 20 == 0))
fprintf(stderr, "\n");
#endif
}
#ifdef QUIET
if (k % 20 != 0)
fprintf(stderr, "\n");
#endif
offset += s[offset + 2];
break;
case 4: /* section transfer address */
#ifdef QUIET
fprintf(stderr, "section transfer address num = %d address = ", s[offset + 4]);
for (k = 0; k < 3; k++)
{
fprintf(stderr, "%.2x", s[offset + 5 + k]);
}
fprintf(stderr, "\n");
#endif
offset += s[offset + 2];
break;
case 5: /* section external def */
#ifdef QUIET
fprintf(stderr, "sect ext def num = %d address = ", s[offset + 4]);
for (k = 0; k < 3; k++)
{
fprintf(stderr, "%.2x", s[offset + 5 + k]);
}
fprintf(stderr, " name = ");
for (k = 0; k < s[offset + 2] - 8; k++)
{
fprintf(stderr, "%c", s[offset + 8 + k]);
}
fprintf(stderr, "\n");
#endif
offset += s[offset + 2];
break;
case 6: /* section external ref */
#ifdef QUIET
fprintf(stderr, "section ext ref num = %d sb address = ", s[offset + 4]);
for (k = 0; k < 3; k++)
{
fprintf(stderr, "%.2x", s[offset + 5 + k]);
}
fprintf(stderr, " name = ");
for (k = 0; k < s[offset + 2] - 8; k++)
{
fprintf(stderr, "%c", s[offset + 8 + k]);
}
fprintf(stderr, "\n");
#endif
offset += s[offset + 2];
break;
case 7: /* section forward ref */
#ifdef QUIET
fprintf(stderr, "sect forward ref num = %d address = ", s[offset + 4]);
for (k = 0; k < 3; k++)
{
fprintf(stderr, "%.2x", s[offset + 5 + k]);
}
fprintf(stderr, " num = %d sb addr = ", s[offset + 8]);
for (k = 0; k < 3; k++)
{
fprintf(stderr, "%.2x", s[offset + 9 + k]);
}
fprintf(stderr, "\n");
#endif
offset += s[offset + 2];
break;
case 8: /* large common def */
#ifdef QUIET8
fprintf(stderr, "large com def num = %d sb size = ", s[offset + 4]);
#endif
i = s[offset + 4]; /* common number */
temp1 = 0; /* size of common */
for (k = 0; k < 3; k++)
{
#ifdef QUIET8
fprintf(stderr, "%.2x", s[offset + 5 + k]);
#endif
temp1 = (temp1 << 8) | s[offset + 5 + k];
}
/* common is on 32 byte boundry and mod 32 bytes */
/* set dsect origin mod 32 bytes */
sect_org[0] = (sect_org[0] + 31) & ~31;
com_base[i] = sect_org[0]; /* addr of common in dsect */
com_org[i] = 0; /* curr origin in common */
com_size[i] = temp1; /* common size */
#ifdef QUIET8
fprintf(stderr, " org %x base %x", com_org[i], com_base[i]);
fprintf(stderr, " name = ");
#endif
memset(comname, ' ', 8); /* blank name buffer */
if (ndefr >= def_size)
{ /* we need to resize */
defined = (struct defr *)realloc((void *)defined, (def_size + 10) * sizeof(struct defr));
def_size += 10; /* 10 more */
}
pdefp = &defined[ndefr]; /* ref data address */
/* copy in common name */
memset(pdefp->name, ' ', 8); /* blank name buffer */
for (k = 0; k < s[offset + 2] - 8; k++)
{
comname[k] = s[offset + 8 + k];
pdefp->name[k] = s[k + offset + 8];
#ifdef QUIET8
fprintf(stderr, "%c", s[offset + 8 + k]);
#endif
}
#ifdef QUIET8
fprintf(stderr, "\n");
#endif
#ifdef QUIET8
fprintf(stderr, "%.8s COMMON c_%d(%d)\n", comname, i, temp1);
#endif
/* set next dsect origin */
sect_org[0] += ((temp1 + 31) & ~31); /* new origin */
last_ds = sect_org[0]; /* save new ds start */
pdefp->refa = com_base[i] + sect_base[0];
ndefr++; /* next reference */
offset += s[offset + 2];
break;
case 9: /* large common origin */
i = s[offset + 4]; /* block number */
#ifdef QUIET8
fprintf(stderr, "large com origin num = %d sb origin = ", s[offset + 4]);
#endif
temp1 = 0; /* size of common */
for (k = 0; k < 3; k++)
{
temp1 = (temp1 << 8) | s[offset + 5 + k];
#ifdef QUIET8
fprintf(stderr, "%.2x", s[offset + 5 + k]);
#endif
}
#ifdef QUIET8
fprintf(stderr, "\n");
#endif
/* reset origin in common block */
com_org[i] = temp1; /* new origin in common */
offset += s[offset + 2];
break;
case 10: /* large common ref */
i = s[offset + 4]; /* block number */
sa = sect_addr[0]; /* address in dsect */
repeat = s[offset + 5];
if (repeat == 0)
repeat = 1; /* 0 is 1 */
#ifdef QUIET8
fprintf(stderr, "large com ref num = %d rep cnt = %d data = ", s[offset + 4], repeat);
#endif
for (j = 0; j < repeat; j++)
{
for (k = 0; k < (s[offset + 2] - 6); k++)
{
if (k == 0)
temp1 = 0;
temp1 = (temp1 << 8) | s[offset + 6 + k];
if (k > 0 && (k % 4 == 3))
{
#ifdef QUIET8
fprintf(stderr, "%.8x", temp1);
fprintf(stderr, " ");
#endif
temp1 += com_base[i] + sect_base[0];
/* put data in memory */
for (l = 0; l < 4; l++)
sa[sect_org[curr_sect]++] = (temp1 >> ((3 - l) * 8)) & 0xff;
temp1 = 0;
}
#ifdef QUIET8
if (k > 0 && (k % 20 == 0))
fprintf(stderr, "\n");
#endif
}
#ifdef QUIET8
if (k % 20 != 0)
fprintf(stderr, "\n");
#endif
}
offset += s[offset + 2];
break;
case 11: /* debugger information */
#ifdef NOTNOW
fprintf(stderr, "debugger info: flg: %d len: %d %s %s type: ",
objcnt, s[offset + 2], s[offset + 3] & 2 ? "abs" : "rel",
s[offset + 3] & 1 ? "CSECT" : "DSECT");
switch (s[offset + 4])
{
case 0:
fprintf(stderr, "int * 1");
break;
case 1:
fprintf(stderr, "int * 2");
break;
case 2:
fprintf(stderr, "int * 4");
break;
case 3:
fprintf(stderr, "int * 8");
break;
case 4:
fprintf(stderr, "real * 4");
break;
case 5:
fprintf(stderr, "real * 8");
break;
case 6:
fprintf(stderr, "complex * 8");
break;
case 7:
fprintf(stderr, "complex * 16");
break;
case 8:
fprintf(stderr, "bit logical");
break;
case 9:
fprintf(stderr, "logical * 1");
break;
case 10:
fprintf(stderr, "logical * 4");
break;
case 11:
fprintf(stderr, "char * n");
break;
case 12:
fprintf(stderr, "type 12");
break;
case 13:
fprintf(stderr, "type 13");
break;
case 14:
fprintf(stderr, "statement label");
break;
case 15:
fprintf(stderr, "proceedure");
break;
default:
fprintf(stderr, "unknown type %d", s[offset + 4]);
break;
}
#endif
bound = 0;
for (k = 0; k < 3; k++)
{
bound = (bound << 8) | (s[offset + 5 + k]);
}
#ifdef QUIET8
fprintf(stderr, "\n* %s address: %x bitnum: %x",
s[offset + 3] & 1 ? "csect" : "dsect", bound >> 3, bound & 7);
fprintf(stderr, " size: %d symbol: ", s[offset + 8] << 8 | s[offset + 9]);
/* now print the 8 chars of the symbol */
for (k = 0; k < s[offset + 2] - 10; k++)
{
fprintf(stderr, "%c", s[offset + 10 + k]);
}
/* see if common */
if (s[offset + 2] == 26)
{
fprintf(stderr, " common: ");
for (k = 0; k < 8; k++)
{
fprintf(stderr, "%c", s[offset + 18 + k]);
}
}
fprintf(stderr, "\n");
#endif
offset += s[offset + 2];
break;
case 12: /* object creation information */
/* object creation date/time */
if (objcnt == 0)
{
#ifdef QUIET8
fprintf(stderr, "* OBJECT CREATED ");
#ifdef JUNK
fprintf(stderr, "object creation date/time: ");
#endif
for (k = 0; k < 8; k++)
{
fprintf(stderr, "%c", s[offset + 4 + k]);
}
fprintf(stderr, " ");
for (k = 0; k < 8; k++)
{
fprintf(stderr, "%c", s[offset + 12 + k]);
}
fprintf(stderr, "\n");
#endif
offset += s[offset + 2];
break;
}
/* product id leader */
if (objcnt == 1)
{
#ifdef QUIET8
fprintf(stderr, "* product id: ");
for (k = 0; k < s[offset + 2] - 4; k++)
{
fprintf(stderr, "%c", s[offset + 4 + k]);
}
fprintf(stderr, "\n");
#endif
offset += s[offset + 2];
break;
}
/* generating processor info */
if (objcnt == 2)
{
#ifdef QUIET8
fprintf(stderr, "* generating processor info: opt wd1 = ");
for (k = 0; k < 4; k++)
{
fprintf(stderr, "%.2x", s[offset + 4 + k]);
}
fprintf(stderr, " opt wd2 = ");
for (k = 0; k < 4; k++)
{
fprintf(stderr, "%.2x", s[offset + 8 + k]);
}
#ifdef FUTURE
fprintf(stderr, " rev lev = ");
for (k = 0; k < 4; k++)
{
fprintf(stderr, "%.2x", s[offset + 12 + k]);
}
#endif
fprintf(stderr, "\n");
fprintf(stderr, "* rrs cnt = ");
for (k = 0; k < 2; k++)
{
fprintf(stderr, "%.2x", s[offset + 16 + k]);
}
fprintf(stderr, " incl cnt = ");
for (k = 0; k < 2; k++)
{
fprintf(stderr, "%.2x", s[offset + 18 + k]);
}
/* fprintf(stderr, "\n"); */
fprintf(stderr, " pathname: ");
for (k = 0; k < s[offset + 2] - 20; k++)
{
fprintf(stderr, "%c", s[offset + 20 + k]);
}
fprintf(stderr, "\n");
#endif
offset += s[offset + 2];
break;
}
/* required resources info */
if (objcnt == 3)
{
#ifdef QUIET8
repeat = s[offset + 3];
fprintf(stderr, "* required resource info: %s lfc = ",
repeat & 1 ? "FORT incl file" : "req obj file");
for (k = 0; k < 3; k++)
{
fprintf(stderr, "%c", s[offset + 5 + k]);
}
fprintf(stderr, "\n");
repeat = s[offset + 10];
fprintf(stderr, "* acc mode = ");
for (k = 0; k < 4; k++)
{
fprintf(stderr, "%.2x", s[offset + 12 + k]);
}
fprintf(stderr, " opts = ");
for (k = 0; k < 4; k++)
{
fprintf(stderr, "%.2x", s[offset + 16 + k]);
}
fprintf(stderr, " pathname: ");
for (k = 0; k < s[offset + 2] - 20; k++)
{
fprintf(stderr, "%c", s[offset + 20 + k]);
}
fprintf(stderr, "\n");
#ifdef OLD_JUNK
fprintf(stderr, "PNAM LEN %d PATH LEN %d\n", repeat, s[offset + 2] - 20);
#endif
#endif
offset += s[offset + 2];
break;
}
#ifdef QUIET8
for (k = 0; k < s[offset + 2]; k++)
{
if (k > 0 && (k % 20 == 0))
fprintf(stderr, "\n");
fprintf(stderr, "%.2x ", s[offset + k]);
}
fprintf(stderr, "\n");
#endif
offset += s[offset + 2];
break;
case 13: /* multiple datapool ref */
#ifdef QUIET8
fprintf(stderr, "multiple datapool ref sym =");
for (k = 0; k < (s[offset + 2] - 12); k++)
{
fprintf(stderr, "%c ", s[offset + 4 + k]);
}
fprintf(stderr, "\naddr = ");
for (k = 0; k < 4; k++)
{
fprintf(stderr, "%.2x ", s[offset + 2] - 8 + k);
}
fprintf(stderr, " pool num = ");
for (k = 0; k < 4; k++)
{
fprintf(stderr, "%.2x ", s[offset + 2] - 4 + k);
}
fprintf(stderr, "\n");
#endif
offset += s[offset + 2];
break;
case 14: /* new debugger information */
#ifdef QUIET9
#ifdef NOT_NOW
fprintf(stderr, "new debugger info (hex dump)\n");
for (k = 0; k < s[offset + 2]; k++)
{
if (k > 0 && (k % 20 == 0))
fprintf(stderr, "\n");
fprintf(stderr, "%.2x ", s[offset + k]);
}
fprintf(stderr, "\n");
#endif
fprintf(stderr, "new debugger info: flags: %x type: ", s[offset + 3]);
#endif
#ifdef QUIET9
if (dounix)
{
/* see if we have an enum */
if (s[offset + 4] & 0x20)
{
fprintf(stderr, "enum ");
}
/* see if stack variable */
if (s[offset + 3] & 0x10)
{
fprintf(stderr, "stack ");
}
/* see if register variable */
if (s[offset + 3] & 0x04)
{
fprintf(stderr, "register ");
}
/* see if pointer */
if (s[offset + 3] & 0x20)
{
int indcnt = s[offset + 5];
/* print number of indirections */
while (indcnt--)
fprintf(stderr, "*");
}
switch (s[offset + 4] & ~0x20)
{
case 0:
fprintf(stderr, "char");
break;
case 1:
fprintf(stderr, "short");
break;
case 2:
fprintf(stderr, "int");
break;
case 3:
fprintf(stderr, "long");
break;
case 4:
fprintf(stderr, "float");
break;
case 5:
fprintf(stderr, "double");
break;
case 6:
fprintf(stderr, "struct ");
for (k = 0; k < 8; k++)
{
fprintf(stderr, "%c", s[offset + 20 + k]);
}
break;
case 7:
fprintf(stderr, "union ");
for (k = 0; k < 8; k++)
{
fprintf(stderr, "%c", s[offset + 20 + k]);
}
break;
case 8:
fprintf(stderr, "uchar");
break;
case 9:
fprintf(stderr, "ushort");
break;
case 10:
fprintf(stderr, "uint");
break;
case 11:
fprintf(stderr, "ulong");
break;
case 12:
fprintf(stderr, "enum");
break;
case 13:
fprintf(stderr, "struct def");
break;
case 14:
fprintf(stderr, "statement label");
break;
case 15:
fprintf(stderr, "entry point");
break;
case 16:
fprintf(stderr, "illegal");
break;
case 17:
fprintf(stderr, "CSECT load origin");
break;
case 18:
fprintf(stderr, "DSECT load origin");
break;
default:
fprintf(stderr, "unknown type %d", s[offset + 4]);
break;
}
}
else
{
/* see if we have a parameter */
if ((s[offset + 4] & 0x60) == 0x20)
{
fprintf("parameter ");
}
switch (s[offset + 4] & ~0x20)
{
case 0:
fprintf(stderr, "int * 1");
break;
case 1:
fprintf(stderr, "int * 2");
break;
case 2:
fprintf(stderr, "int * 4");
break;
case 3:
fprintf(stderr, "int * 8");
break;
case 4:
fprintf(stderr, "real * 4");
break;
case 5:
fprintf(stderr, "real * 8");
break;
case 6:
fprintf(stderr, "complex * 8");
break;
case 7:
fprintf(stderr, "complex * 16");
break;
case 8:
fprintf(stderr, "bit logical");
break;
case 9:
fprintf(stderr, "logical * 1");
break;
case 10:
fprintf(stderr, "logical * 4");
break;
case 11:
fprintf(stderr, "char * n");
break;
case 12:
fprintf(stderr, "type 12");
break;
case 13:
fprintf(stderr, "type 13");
break;
case 14:
fprintf(stderr, "statement label");
break;
case 15:
fprintf(stderr, "proceedure");
break;
default:
fprintf(stderr, "unknown type %d", s[offset + 4]);
break;
}
}
fprintf(stderr, " rsvd: %x size: %d\n", s[offset + 5], s[offset + 6] * 256 + s[offset + 7]);
#endif
repeat = 0;
for (k = 0; k < 4; k++)
{
repeat = (repeat << 8) | s[offset + 8 + k];
}
#ifdef QUIET8
fprintf(stderr, "* %s address: %x, bitnum: %d symbol: ",
s[offset + 3] & 1 ? "csect" : "dsect", repeat >> 3, repeat & 7);
for (k = 0; k < 8; k++)
{
fprintf(stderr, "%c", s[offset + 12 + k]);
}
fprintf(stderr, "\n");
#endif
/* only look at ISC type if len is > 20 */
if (s[offset + 2] <= 20)
goto wedone;
/* only look at ISC type if flags is zero */
/* and not a parameter */
if (s[offset + 3] <= 1 && s[offset + 4] < 0x20)
{
#ifdef QUIET8
/* do ISC record */
fprintf(stderr, "* ISC type: ");
switch (s[offset + 20] & 0x7f)
{
case 0:
fprintf(stderr, "no src");
break;
case 1:
fprintf(stderr, "declaration");
break;
case 2:
fprintf(stderr, "xeq statement");
break;
case 3:
fprintf(stderr, "cont line");
break;
case 4:
fprintf(stderr, "comment");
break;
case 5:
fprintf(stderr, "FORTRAN err");
break;
default:
fprintf(stderr, "undefined %x", s[offset + 20] & 0x7f);
break;
}
fprintf(stderr, " caret %d\n", s[offset + 21]);
#endif
/* only process source if caret is zero */
if (s[offset + 21] != 0)
goto wedone;
if (s[offset + 20] & 0x80)
{
/* uncompressed source */
int srccnt = s[offset + 22];
int blkcnt = s[offset + 23];
#ifdef QUIET8
for (k = 0; k < blkcnt; k++)
{
fprintf(stderr, " "); /* blanks */
}
for (k = 0; k < srccnt; k++)
{
fprintf(stderr, "%c", s[offset + 24 + k]); /* source */
}
#endif
}
else
{
/* compressed source */
unsigned char chr;
int srccnt = s[offset + 22];
int blkcnt = s[offset + 23];
int j = 0;
int l = offset + 24;
#ifdef QUIET8
for (k = 0; k < blkcnt; k++)
{
fprintf(stderr, " "); /* blanks */
}
for (k = 0; k < srccnt; k++)
{
switch (j)
{
case 0:
chr = ((s[offset + l]) >> 2) & 0x3f + 32;
j++;
break;
case 1:
chr = (((s[offset + l++] & 3) << 4) | ((s[offset + l] & 0xf0) >> 4) + 32);
j++;
break;
case 2:
chr = (((s[offset + l++] & 0xf) << 2) | ((s[offset + l] & 0xc0) >> 6) + 32);
j++;
break;
case 3:
chr = ((s[offset + l] & 0x3f) + 32);
j = 0;
break;
}
fprintf(stderr, "%c", chr); /* source */
}
#endif
}
#ifdef QUIET8
fprintf(stderr, "\n");
#endif
}
else
{ /* else handle Encore debug record */
int srccnt;
unsigned int srcval;
unsigned int srcval2;
int sv; /* switch value */
int xx = 20; /* array info offset */
/* First look for a parameter. Flags will be zero. */
/* Type will be >= 32 (0x20) */
if (dounix)
{
sv = s[offset + 3] & 0x48;
}
else
{
sv = s[offset + 3];
}
switch (s[offset + 3])
{ /* switch on flags */
case 0x00: /* parameter */
switch (s[offset + 4] & 0x1f)
{
case 0: /* int * 1 */
case 9: /* logical * 1 */
#ifdef QUIET8
/* wd 5 byte 0 has value */
fprintf(stderr, "* param value: 0x");
fprintf(stderr, "%.2x", s[offset + 20]);
fprintf(stderr, "\n");
#endif
break;
case 1: /* int * 2 */
/* wd 5 bytes 0-1 has value */
srcval = s[offset + 20] << 8 | s[offset + 21];
#ifdef QUIET8
fprintf(stderr, "* param value: 0x");
fprintf(stderr, "%.4x", srcval);
fprintf(stderr, "\n");
#endif
break;
case 2: /* int * 4 */
case 4: /* real * 4 */
case 10: /* logical * 4 */
/* wd 5 bytes 0-3 has value */
srcval = s[offset + 20] << 24
| s[offset + 21] << 16 | s[offset + 22] << 8 | s[offset + 23];
#ifdef QUIET8
fprintf(stderr, "* param value: 0x");
fprintf(stderr, "%.8x", srcval);
fprintf(stderr, "\n");
#endif
break;
case 3: /* int * 8 */
case 5: /* real * 8 */
case 6: /* complex * 8 */
/* wd 5-6 bytes 0-3 has value */
srcval = s[offset + 20] << 24
| s[offset + 21] << 16 | s[offset + 22] << 8 | s[offset + 23];
srcval2 = s[offset + 24] << 24
| s[offset + 25] << 16 | s[offset + 26] << 8 | s[offset + 27];
#ifdef QUIET8
fprintf(stderr, "* param value: 0x");
fprintf(stderr, "%.8x %.8x", srcval, srcval2);
fprintf(stderr, "\n");
#endif
break;
case 7: /* complex * 16 */
/* wd 5-6 bytes 0-3 has value */
srcval = s[offset + 20] << 24
| s[offset + 21] << 16 | s[offset + 22] << 8 | s[offset + 23];
srcval2 = s[offset + 24] << 24
| s[offset + 25] << 16 | s[offset + 26] << 8 | s[offset + 27];
#ifdef QUIET8
fprintf(stderr, "* param value: 0x");
fprintf(stderr, "%.8x %.8x ", srcval, srcval2);
#endif
/* wd 7-8 bytes 0-3 has value */
srcval = s[offset + 28] << 24
| s[offset + 29] << 16 | s[offset + 30] << 8 | s[offset + 31];
srcval2 = s[offset + 32] << 24
| s[offset + 33] << 16 | s[offset + 34] << 8 | s[offset + 35];
#ifdef QUIET8
fprintf(stderr, "%.8x %.8x", srcval, srcval2);
fprintf(stderr, "\n");
#endif
break;
case 8: /* bit logical */
/* wd 5 bit 0 has value */
#ifdef QUIET8
fprintf(stderr, "* param value: ");
fprintf(stderr, "%s\n", s[offset + 20] & 0x80 ? ".TRUE. (1)" : ".FALSE. (0)");
#endif
break;
case 11: /* char * n */
/* size has array length */
/* wds 5 - 8 has char values */
srccnt = s[offset + 6] << 8 | s[offset + 7];
#ifdef QUIET8
fprintf(stderr, "* param value (%d): ", srccnt);
if (srccnt > 16)
srccnt = 16;
for (k = 0; k < srccnt; k++)
{
fprintf(stderr, "%c", s[offset + 20 + k]);
}
fprintf(stderr, "\n");
#endif
break;
default:
goto jumpit;
}
break;
case 0x04: /* datapool */
if (dounix)
{
/* register variable, ignore */
break;
}
else
{
#ifdef QUIET8
/* print datapool name */
fprintf(stderr, "* len = %d Dpool: ", s[offset + 2]);
#endif
}
#ifdef QUIET8
for (k = 0; k < 8; k++)
{
fprintf(stderr, "%c", s[offset + 20 + k]);
}
fprintf(stderr, "\n");
#endif
break;
case 0x08: /* common symbol */
#ifdef QUIET8
if (dounix)
{
/* print struct/union ref name */
fprintf(stderr, "* len = %d S/U ref: ", s[offset + 2]);
}
else
{
/* print common name */
fprintf(stderr, "* len = %d Common: ", s[offset + 2]);
}
for (k = 0; k < 8; k++)
{
fprintf(stderr, "%c", s[offset + 20 + k]);
}
fprintf(stderr, "\n");
#endif
break;
case 0x48: /* array of structures */
xx = 28; /* account for struct name */
case 0x40: /* array info present */
#ifdef QUIET8
fprintf(stderr, "* array dims: %d bnds: %d len: %d lbflags %x sbflags %x\n",
s[offset + xx + 0], s[offset + xx + 1], s[offset + xx + 4],
s[offset + xx + 2] << 8 | s[offset + xx + 3],
s[offset + xx + 6] << 8 | s[offset + xx + 7]);
fprintf(stderr, "* wds: ");
for (k = 0; k < s[offset + xx + 4] - 8; k++)
{
if (k > 0 && (k % 4 == 0))
{
if ((k % 20 == 0))
fprintf(stderr, "\n");
else
fprintf(stderr, " ");
}
fprintf(stderr, "%.2x", s[offset + xx + 8 + k]);
}
fprintf(stderr, "\n");
#endif
break;
case 0x50: /* array parameters */
#ifdef QUIET8
fprintf(stderr, "* array param dims: %d bnds: %d len: %d lbflags %x sbflags %x\n",
s[offset + 20], s[offset + 21], s[offset + 24],
s[offset + 22] << 8 | s[offset + 23], s[offset + 26] << 8 | s[offset + 27]);
fprintf(stderr, "* wds: ");
for (k = 0; k < s[offset + 24] - 8; k++)
{
if (k > 0 && (k % 20 == 0))
fprintf(stderr, "\n");
fprintf(stderr, "%.2x ", s[offset + 28 + k]);
}
fprintf(stderr, "\n");
#endif
break;
case 0x01: /* CSECT */
case 0x02: /* absolute address */
case 0x10: /* parameter/stack variable */
case 0x20: /* ext memory address/pointer */
#ifdef QUIET8
fprintf(stderr, "* unprocessed flags %x\n", s[offset + 3]);
#endif
default:
jumpit:
#ifdef QUIET8
fprintf(stderr, "* Encore record flags = %x\n", s[offset + 3]);
fprintf(stderr, "Encore debugger info (hex dump)\n");
for (k = 0; k < s[offset + 2]; k++)
{
if (k > 0 && (k % 20 == 0))
fprintf(stderr, "\n");
fprintf(stderr, "%.2x ", s[offset + k]);
}
fprintf(stderr, "\n");
#endif
break;
}
}
wedone:
offset += s[offset + 2];
break;
case 15: /* undefined */
#ifdef QUIET8
for (k = 0; k < s[offset + 2]; k++)
{
if (k > 0 && (k % 20 == 0))
fprintf(stderr, "\n");
fprintf(stderr, "%.2x ", s[offset + k]);
}
fprintf(stderr, "\n");
#endif
offset += s[offset + 2];
break;
}
break;
case 14: /* common origin */
/* get common block number */
repeat = s[offset + 1];
/* get common size */
bound = s[offset + 2] << 8 | s[offset + 3];
#ifdef QUIET8
fprintf(stderr, "common origin block = %x origin = %x\n", repeat, bound);
#endif
offset += (objcnt + 1);
break;
case 15: /* object termination */
#ifdef QUIET
fprintf(stderr, "program object termination\n");
#endif
offset += (objcnt + 1);
/* define dsect start */
if ((ndefr + 1) >= def_size)
{ /* we need to resize */
defined = (struct defr *)realloc((void *)defined, (def_size + 10) * sizeof(struct defr));
def_size += 10; /* 10 more */
}
pdefp = &defined[ndefr]; /* ref data address */
strcpy(pdefp->name, "DS"); /* dsect start */
ndefr++; /* next reference */
pdefp->refa = sect_base[0] + last_ds; /* ds start */
pdefp++;
if (sect_size[1])
{
/* define csect start */
strcpy(pdefp->name, "CS"); /* dsect start */
ndefr++; /* next reference */
pdefp->refa = sect_base[0]; /* section start */
pdefp++;
}
/* dump csect/dsect */
curr_sect = 0; /* dsect */
/* if no size given, use last origin address */
if (sect_size[curr_sect] == 0)
sect_size[0] = sect_org[0];
#ifdef NODUMP
fprintf(stderr, "DSECT contents %x bytes\n", sect_size[0]);
sa = sect_addr[0]; /* address of section */
temp2 = 0;
for (j = 0; j < sect_size[0]; j += 4)
{
fprintf(stderr, "%.4x ", j);
for (i = 0; i < 4; i++)
{
fprintf(stderr, "%0.2x", sa[j + i]);
}
fprintf(stderr, " ");
for (i = 0; i < 4; i++)
{
if (sa[j + i] >= 0x20 && sa[j + i] < 0x7f)
fprintf(stderr, "%c", sa[j + i]);
else
fprintf(stderr, ".", sa[j + i]);
}
fprintf(stderr, "\n");
}
#endif
#ifdef DOTRACE
if (sect_size[0])
codedump(0); /* go dump the code */
#endif
curr_sect = 1; /* csect */
#ifdef NODUMP
fprintf(stderr, "CSECT contents %x bytes\n", sect_size[1]);
sa = sect_addr[1]; /* address of section */
temp2 = 0;
for (j = 0; j < sect_size[1]; j += 4)
{
fprintf(stderr, "%.4x ", j);
for (i = 0; i < 4; i++)
{
fprintf(stderr, "%02x", sa[j + i]);
}
fprintf(stderr, " ");
for (i = 0; i < 4; i++)
{
if (sa[j + i] >= 0x20 && sa[j + i] < 0x7f)
fprintf(stderr, "%c", sa[j + i]);
else
fprintf(stderr, ".", sa[j + i]);
}
fprintf(stderr, "\n");
}
#endif
#ifdef DONOTDOCSECT
if (sect_size[1])
codedump(1); /* dump the instructions */
#endif
/* we may have several objects, start over */
free((void *)datapool); /* free storage */
free((void *)external); /* free storage */
free((void *)defined); /* free storage */
for (i = 0; i < 256; i++) /* check all sections */
if (sect_addr[i]) /* if we got one */
free((void *)sect_addr[i]); /* free memory */
doem = 0; /* reinitialize if more object */
break;
}
goto doit;
}
unsigned char line[BUFSIZ];
int cmpop = 0;
int cmpflg = 0;
int bcnt = 0;
unsigned char *bptr = 0;
int recl = 0;
int rbl(unsigned char *buf, int n)
{
int count = 0;
unsigned char *cp;
int i;
unsigned char *linadrs = line;
if (!cmpop)
{ /* see if we tested for compressed */
cmpop = 1; /* set comp tested flag */
/* read in the first record */
if ((recl = getloi(line, BUFSIZ)) == 0)
return (0); /* this means eof */
linadrs = line;
if (*linadrs == 0xbf || *linadrs == 0x9f)
{ /* is this file compressed */
cmpflg = 1; /* set comp data flag */
bcnt = linadrs[1]; /* set record count */
bptr = &linadrs[6]; /* set data address */
}
else
goto re00;
}
if (cmpflg)
{ /* reading compressed data? */
if (bcnt == 0)
{ /* any data left in buffer */
re18:
/* read in a data record */
if ((recl = getloi(line, BUFSIZ)) == 0)
return (0); /* this means eof */
linadrs = line;
if ((*linadrs & 0xdf) != 0x9f) /* is this valid rec */
return (EOF); /* error if not */
bcnt = linadrs[1]; /* set record count */
bptr = &linadrs[6]; /* set data address */
}
re20:
/* see if any blanks */
if (i = *bptr++)
{ /* next buffer pointer */
if (i == 0xff)
goto re60; /* if eol, get out */
while (i--)
{
if (count < n)
{
*buf++ = ' '; /* put blank in buffer */
count++;
}
}
}
if (--bcnt <= 0)
goto re18; /* read next record */
if (i = *bptr++)
{ /* next buffer pointer */
while (i--)
{
if (count < n)
*buf++ = *bptr; /* put char in buffer */
bcnt--; /* decr count */
bptr++; /* next buffer pointer */
count++;
}
}
if (--bcnt <= 0)
goto re18; /* read next record */
goto re20;
re60:
bcnt--; /* decr count */
if ((*--buf == ' ') && (count == 1))
{
*buf = '\n'; /* put new line at eol */
*++buf = '\0'; /* put new line at eol */
}
else
{
count++;
*++buf = '\n'; /* put new line at eol */
*++buf = '\0'; /* put new line at eol */
}
/* fprintf(stderr, "ret cnt = %ld\n", count); */
return (count);
}
else
{
/* non compressed read here */
/* read the next record */
if ((recl = getloi(line, BUFSIZ)) == 0)
return (0); /* this means eof */
re00:
/* here we need to strip off blank put in during write */
/* this is because mpx does not support zero length blocks */
if (!binary)
{
if ((recl == 1) && (*linadrs == ' '))
recl = 0;
/* now append new line to end of buffer */
*(cp = linadrs + recl) = '\n'; /* point to last char */
}
else
{
cp = linadrs + recl - 1; /* point to last char */
}
/* copy this layer buffer to upper caller's buffer */
/* fprintf(stderr, "recl = %x, cp = %x, linadrs = %x\n", recl, cp, linadrs); */
while (count < n)
{
if (linadrs > cp)
break;
*buf++ = *linadrs++;
count++;
}
}
/* fprintf(stderr, "ret1 cnt = %ld\n", count); */
return (count);
}
/*~!bbio.c*/
/* Name: bbio.c Part No.: _______-____r
*
* Copyright 1991 - J B Systems, Morrison, CO
*
* The recipient of this product specifically agrees not to distribute,
* disclose, or disseminate in any way, to any one, nor use for its own
* benefit, or the benefit of others, any information contained herein
* without the expressed written consent of J B Systems.
*
* RESTRICTED RIGHTS LEGEND
*
* Use, duplication, or disclosure by the Government is subject to
* restriction as set forth in paragraph (b) (3) (B) of the Rights
* in Technical Data and Computer Software Clause in DAR 7-104.9
* (a).
*/
#ident "@(#)nbrtl:bbio.c 1.0"
#include <stdio.h>
/********************************************************************/
/* These routines handle blocked and optionally compressed MPX files */
#define IOCMAX 10 /* start with 10 for now */
struct ioc {
int iofcb; /* fcb for i/o */
int afcb; /* callers fcb address */
unsigned char *bufaddr; /* callers buffer address */
int bufcnt; /* callers buffer size */
unsigned char *cba; /* current buffer address */
unsigned char *rcba; /* record control block pointer */
int cpp; /* current pool position */
int cfp; /* current file position */
char cbn; /* current buffer number */
char nab; /* number of active buffers */
struct { /* ioc bit flags */
unsigned openop:1; /* open flag */
unsigned writop:1; /* last op was write */
unsigned outaop:1; /* output active flag */
unsigned compop:1; /* if set, tested for comp'ed file */
unsigned cmpflg:1; /* if set, reading comp'ed file */
unsigned iocaloc:1; /* ioc allocated */
unsigned free:3; /* free flags, available */
} flag;
int bcnt; /* compressed rec cur count */
unsigned char *bptr; /* compressed rec pointer */
unsigned char *bufa; /* start of contiguous buffers */
};
struct ioc iocx[IOCMAX];
#define ERRFLAG 0x04000000
#define EOFFLAG 0x02000000
#define EOMFLAG 0x01000000
#define RCBEOF 0x80 /* bit 0 */
#define RCBBOB 0x40 /* bit 1 */
#define RCBEOB 0x20 /* bit 2 */
#define RCBNULL 0x10 /* bit 3 */
#define RCBCONT 0x08 /* bit 4 */
#define SBLR 0
#define BCLR 1
#define SBTR 2
#define BCTR 3
#define BLKSIZE 768
#define BLKS (10*BLKSIZE)
/* forword definition */
int bfredf(struct ioc *wioc);
int plredf(struct ioc *wioc);
/* ircont - establish ioc address for this fcb */
/* input - file number */
/* output - ioc address */
struct ioc *ircont(int cfcb)
{
int i;
struct ioc *wioc; /* current ioc */
for (i = 0, wioc = &iocx[0]; i < IOCMAX; wioc = &iocx[++i])
{
if (wioc->flag.iocaloc)
if (wioc->afcb == cfcb)
{
return (wioc);
}
}
/* not yet allocated, get a new one */
for (i = 0, wioc = &iocx[0]; i < IOCMAX; wioc = &iocx[++i])
{
if (!wioc->flag.iocaloc)
{
wioc->flag.iocaloc = 1; /* ioc allocated */
if ((wioc->bufa = (unsigned char *)malloc(BLKS)) == 0)
{
fprintf(stderr, "ioc malloc error\n");
return (0);
}
/* initialize new ioc */
wioc->afcb = cfcb; /* save callers fcb address */
wioc->iofcb = cfcb; /* use callers fcb for I/O */
wioc->cba = wioc->bufa; /* set buffer addr in fcb */
wioc->cbn = 0; /* no curr buf number */
wioc->nab = 0; /* no active bufs */
/* clear flags */
wioc->flag.openop = 0; /* open ioc */
wioc->flag.writop = 0;
wioc->flag.outaop = 0;
wioc->flag.compop = 0;
wioc->flag.cmpflg = 0;
wioc->cpp = 0; /* pool empty */
wioc->bcnt = 0; /* no compress cnt */
wioc->bptr = 0; /* no pointer either */
wioc->cfp = 1; /* curr position is 1st blk */
return (wioc);
}
}
fprintf(stderr, "no ioc space left\n");
return (0);
}
/* rmopen - open up a file stream */
int rmopen(int cfcb)
{
struct ioc *wioc;
wioc = ircont(cfcb);
if (wioc->flag.openop)
return (1); /* return o.k. */
/* not open yet, do open */
wioc->flag.openop = 1; /* mark open */
return (1); /* return o.k. */
}
/* rmclose - close a file stream */
int rmclose(int cfcb)
{
struct ioc *wioc;
wioc = ircont(cfcb);
if (!wioc->flag.openop)
return (1); /* if not open, return o.k. */
/* open, do close */
wioc->flag.openop = 0; /* mark closed */
wioc->flag.iocaloc = 0; /* mark unallocated */
free(wioc->bufa); /* free buffer */
return (1);
}
/* rmread - read from file stream */
int rmread(int cfcb, unsigned char *buffer)
{
struct ioc *wioc;
int fillcnt, i, bytecnt;
unsigned char *buffp;
rmopen(cfcb); /* make sure open */
wioc = ircont(cfcb);
if (wioc->flag.writop)
fprintf(stderr, "read after write not allowed");
if (wioc->cpp == 0)
{ /* if no data in pool yet, read it in */
bfredf(wioc); /* read in a block */
wioc->rcba = wioc->cba + 4;
/* have we tested for comp data yet */
if (!wioc->flag.compop)
{
wioc->flag.compop = 1;
/* test for comp rec */
if (wioc->rcba[4] == 0xbf || wioc->rcba[4] == 0x9f)
{
wioc->flag.cmpflg = 1; /* this is comp data */
wioc->bcnt = 0; /* init pointer */
}
}
}
bytecnt = 0; /* no bytes to caller yet */
buffp = buffer; /* save caller buff addr */
if (wioc->flag.cmpflg) /* reading compressed */
if (wioc->bcnt)
goto re07; /* any data left */
re18:
if (wioc->rcba[SBLR] & RCBEOB)
{
re06:
if (bfredf(wioc) == -1)
return (-1);
wioc->rcba = wioc->cba + 4;
}
#define JIM /* define for non-library reading */
#ifdef JIM
if (wioc->rcba[SBTR] & RCBEOF)
{
#else
if (wioc->rcba[SBTR] & RCBEOF)
{
wioc->rcba[SBTR] &= ~RCBEOF;
goto re06;
#endif
re05:
return (-1); /* return EOF */
}
if (wioc->flag.cmpflg)
{ /* reading compressed */
if ((wioc->rcba[4] & 0xdf) != 0x9f)
{
return (-1); /* return EOF */
}
wioc->bptr = wioc->rcba + 10; /* first data byte */
wioc->bcnt = wioc->rcba[5]; /* get bytes this record */
if (wioc->bcnt == 0)
{
re10:
wioc->rcba += (wioc->rcba[BCTR] + 4);
goto re18;
}
re07:
if (*wioc->bptr)
{ /* got blanks */
if (*wioc->bptr == 0xff)
{
wioc->bptr++;
if (--wioc->bcnt == 0)
{
wioc->rcba += (wioc->rcba[BCTR] + 4);
wioc->bptr = wioc->rcba + 10;
}
wioc->bufcnt = bytecnt;
return (bytecnt);
}
for (i = *wioc->bptr; i; *buffp++ = ' ', i--, bytecnt++);
}
wioc->bptr++;
if (--wioc->bcnt > 0)
{
if (i = *wioc->bptr)
{
wioc->bptr++;
wioc->bcnt--;
for (; i; i--)
{
*buffp++ = *wioc->bptr++;
bytecnt++;
wioc->bcnt--;
}
if (wioc->bcnt)
goto re07;
goto re10;
}
re24:
wioc->bptr++;
if (--wioc->bcnt > 0)
goto re07;
}
goto re10;
}
/* process uncompressed record */
wioc->bufcnt = wioc->rcba[BCTR];
for (i = 0; i < wioc->bufcnt; i++)
buffer[i] = wioc->rcba[i + 4];
wioc->rcba += (wioc->rcba[BCTR] + 4);
return (wioc->bufcnt);
}
/* bfredf - read next buffer from file stream */
int bfredf(struct ioc *wioc)
{
unsigned char *cbaddr;
/* see if next buffer in memory */
if (wioc->cbn >= wioc->nab)
{
/* no, read in next pool */
if (plredf(wioc) == -1) /* read next pool */
return (-1); /* show EOF */
wioc->cbn = 1; /* we start at 1st buffer */
cbaddr = wioc->bufa; /* reset address pointer */
}
else
{
wioc->cbn++; /* bump buffer number */
cbaddr = wioc->cba + BLKSIZE; /* next buffer address */
}
wioc->cba = cbaddr; /* set new address */
/* check for cnt < 0x300 (768) */
/* check for BOB on in control bits */
return (1); /* return O.K. */
}
/* plredf - read next buffer pool from file stream */
int plredf(struct ioc *wioc)
{
int retc;
/* read the file */
retc = read(wioc->iofcb, wioc->bufa, BLKS);
if (retc <= 0)
{
return (-1); /* show EOF for error */
}
/* compute # of block we read */
wioc->nab = (retc + BLKSIZE - 1) / BLKSIZE;
wioc->cpp = wioc->cfp; /* update curr pool position */
wioc->cfp += wioc->nab; /* update current file position */
return 0;
}
/*
* Dump without executing it to file "testcode.mem
*/
void codedump(int sect)
{
int i;
uint32 *memory; /* memory address */
int tr_start; /* first loc to trace */
int tr_stop; /* last loc to trace */
FILE *fp;
if ((fp = fopen("testcode.mem", "w")) == NULL)
{
fprintf(stderr, "unable to open file 'testcode.mem' for output, aborting.\n");
return;
}
tr_start = sect_base[sect]; /* starting psw */
if (tr_start != 0)
{
fprintf(stderr, "program does not start at zero, aborting.\n");
return;
}
memory = (uint32 *)sect_addr[sect]; /* real memory pointer */
tr_stop = sect_base[sect] + sect_size[sect];
#ifndef QUIET
fprintf(stderr, "tr_start %x tr_stop %x memory %x\n", tr_start, tr_stop, (uint32 *)memory);
#endif
/* write out the memory to disk */
fwrite(memory, sizeof(char), sect_size[sect], fp);
while (tr_start < tr_stop)
{
uint32 data = *memory;
uint32 byte;
#ifdef QUIET
fprintf(stderr, "addr %0x - data %0x\n", (int32)tr_start, *memory);
#else
fprintf(stderr, "addr %0x - data %0.2x%0.2x%0.2x%0.2x\n", (int32)tr_start,
(data >> 0) & 0xff,
(data >> 8) & 0xff,
(data >> 16) & 0xff,
(data >> 24) & 0xff);
#endif
#ifdef NOBIGENDIAN
byte = (data >> 24) & 0xff;
fputc(byte, fp); /* 1st char */
byte = (data >> 16) & 0xff;
fputc(byte, fp); /* 2nd char */
byte = (data >> 8) & 0xff;
fputc(byte, fp); /* 3rd char */
byte = data & 0xff;
fputc(byte, fp); /* 4th char */
fputc('\n', fp); /* cr */
#endif
memory++;
tr_start += 4;
}
return;
}