mirror of
https://github.com/PDP-10/its.git
synced 2026-04-26 04:07:36 +00:00
Files from CLIB; AR2 CLIB.
This commit is contained in:
282
src/clib/maklib.c
Normal file
282
src/clib/maklib.c
Normal file
@@ -0,0 +1,282 @@
|
||||
# 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);
|
||||
}
|
||||
Reference in New Issue
Block a user