1
0
mirror of https://github.com/PDP-10/its.git synced 2026-04-03 21:02:59 +00:00
Files
PDP-10.its/arc/ar5:c/MAKLIB C
2018-05-15 07:06:17 +02:00

283 lines
6.0 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# include "c.defs"
# include "its.bits"
/*
MAKLIB
*ITS*
Shared C Library Construction Program
Loads library stuff from TS CLIB into an inferior. Writes
pure part as a sharable file. Constructs a MIDAS program
to load the impure part and define all symbols.
*** Instructions for constructing a new version of the
shared C library:
1. Edit the file MKCLIB STINKR to contain all of the
files you want to be in the library. See that file
for further instructions.
2. Create a TS CLIB in the C directory by running Stinkr on
MKCLIB STINKR.
3. Create a TS MAKLIB using MAKLIB STINKR.
4. Run TS MAKLIB.
The STINKR files are kept in C10LIB.
*/
# define MAXSYMS 4000 /* maximum number of symbols */
# define NAMMASK 0037777777777 /* name mask away flags */
# define SYMMASK 0037777777777 /* symtab mask for name */
struct _syment {int sym, val;};
typedef struct _syment syment;
syment symtab[MAXSYMS];
syment *csymp, *esymp;
main (argc, argv) char *argv[];
{int flib, fmak, version, nam, val, npage, pgno, zeroc;
int j, jch, pch, ilo, ihi, plo, phi, count;
char svers[20], buf[50], vbuf[100];
filespec ff;
syment *p;
/* open library program file */
pch = fopen ("TS CLIB", UII);
if (pch < 0)
{puts ("Unable to find TS CLIB");
return;
}
/* create an inferior job */
j = j_create (020);
if (j < 0)
{puts ("Unable to create inferior job");
return;
}
j_name (j, &ff);
jch = open (&ff, UII);
if (jch < 0)
{puts ("Unable to open inferior job");
return;
}
/* load CLIB program into inferior */
if (sysload (jch, pch))
{puts ("Unable to load TS CLIB");
return;
}
rsymtab (pch);
flib = copen ("c/[clib].>", 'w', "b");
if (flib < 0)
{puts ("Unable to create library file");
return;
}
filnam (itschan (flib), &ff);
version = ff.fn2;
c6tos (version, svers);
apfname (buf, "c/[cmak].foo", svers);
fmak = copen (buf, 'w');
if (fmak < 0)
{puts ("Unable to create maker file");
cclose (flib);
delete ("c/clib.>");
return;
}
cprint ("Creating C library version %s\n", svers);
cprint (fmak, ";\tSHARED C LIBRARY MAKER -- VERSION %s\n\n", svers);
cprint (fmak, ".INSRT C;NC INSERT\n");
cprint (fmak, "TITLE CLIB C LIBRARY VERSION %s\n\n", svers);
p = symtab;
while (p < csymp)
{nam = p->sym;
val = p->val;
++p;
prname (nam, fmak, 0);
cprint (fmak, "\"=%o\n", val);
}
cputc ('\n', fmak);
/* now define impure area */
ilo = jread (lookup (rdname ("SEG0LO")), jch);
ihi = jread (lookup (rdname ("SEG1HI")), jch);
count = ihi - ilo + 1;
cprint (fmak, "\t.IDATA\n\n");
zeroc = 0;
access (jch, ilo);
while (--count >= 0)
{val = uiiot (jch);
if (val)
{if (zeroc>0) cprint (fmak, "\tBLOCK\t%o\n", zeroc);
zeroc = 0;
cprint (fmak, "\t%o\n", val);
}
else ++zeroc;
}
if (zeroc>0) cprint (fmak, "\tBLOCK\t%o\n", zeroc);
cputc ('\n', fmak);
plo = jread (lookup (rdname ("SEG2LO")), jch);
phi = jread (lookup (rdname ("SEG3HI")), jch);
phi =+ 0100;
plo =& ~01777;
npage = (phi - plo + 02000) >> 10;
pgno = plo >> 10;
cprint (fmak, "IPATCH\": BLOCK 40\n\
.CODE\n\
INIT\": MOVEI P,ARGV\n\
PUSHJ P,MAPIN\"\n\
MOVEI A,ZMAIN\"\n\
HRRM A,CALLER\"\n\
GO START\"\n\n\
MAPIN: .CALL [SETZ\n\
SIXBIT/OPEN/\n\
1000,,1 ; CHANNEL 1\n\
[SIXBIT/DSK/]\n\
[SIXBIT/[CLIB]/]\n\
[SIXBIT/%s/]\n\
SETZ [SIXBIT/C/]\n\
]\n\
.VALUE [ASCIZ/: UNABLE TO GET LIBRARY FILE /]\n\
MOVE A,[-%d.,,%o]\n\
.CALL [SETZ\n\
'CORBLK\n\
1000,,200000 ; READ-ONLY\n\
1000,,-1 ; PUT IN MY MAP\n\
A ; AOBJN POINTER\n\
401000,,1 ; FROM FILE\n\
]\n\
.VALUE [ASCIZ/: UNABLE TO MAP IN LIBRARY FILE /]\n\
.CLOSE 1,\n\
POPJ P,\n\n\
MAPOUT\":MOVE A,[-%d.,,%o]\n\
.CALL [SETZ\n\
'CORBLK\n\
1000,,0 ; DELETE\n\
1000,,-1 ; FROM ME\n\
400000,,A ; AOBJN POINTER\n\
]\n\
.VALUE [ASCIZ/: CAN'T MAP OUT LIBRARY PAGES /]\n\
POPJ P,\n\n\
SINIT\": MOVE A,[PUSHJ P,MAPIN]\n\
MOVEM A,ISTART\"\n\
MOVE A,[PUSHJ P,MAPOUT]\n\
MOVEM A,IDONE\"\n\
GO LINIT\"\n\n", svers, npage, pgno, npage, pgno);
cprint (fmak, ".PDATA\NEND INIT\n");
cclose (fmak);
count = phi - plo + 1;
count = (count + 01777) & ~01777;
access (jch, plo);
while (--count >= 0)
{val = uiiot (jch);
cputi (val, flib);
}
cclose (flib);
fmak = copen (vbuf, 'w', "s");
cprint (fmak, ":KILL\r:MIDAS C;[CREL] %s _ C;[CMAK] %s\r", svers, svers);
cclose (fmak);
valret (vbuf);
}
int jread (loc, jch)
{access (jch, loc);
return (uiiot (jch));
}
/**********************************************************************
SYMBOL TABLE
**********************************************************************/
rsymtab (ch)
{int count;
csymp = symtab;
esymp = symtab + MAXSYMS;
uiiot (ch);
count = -((uiiot (ch) >> 18) | 0777777000000) / 2;
uiiot (ch);
uiiot (ch);
--count;
while (--count >= 0)
{int n, val;
n = uiiot (ch) & SYMMASK;
val = uiiot (ch);
csymp->sym = n;
csymp->val = val;
++csymp;
}
}
int lookup (sym)
{syment *p;
for (p = symtab; p < csymp; ++p)
if (p->sym == sym) return (p->val);
puts ("symbol missing");
return (01000000);
}
char tab40[] {' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
'W', 'X', 'Y', 'Z', '.', '$', '%'};
rdname (p) char *p;
{int w, factor, c;
char *s;
s = p;
w = 0;
factor = (40*40*40*40*40);
while (c = *s++)
{int i;
if (c==' ') continue;
if (factor == 0) continue;
if (c>='a' && c<='z') c =+ ('A'-'a');
for (i=0;i<40;++i)
if (c == tab40[i])
{w =+ (i * factor);
factor =/ 40;
break;
}
if (i>=40) break;
}
return (w);
}
prname (n, fn, w)
{n =& NAMMASK;
if (n) p40 (n, fn);
}
p40 (i, fn)
{int a;
if (a = i/40) p40 (a, fn);
i =% 40;
if (i) cputc (tab40[i], fn);
}