1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-20 16:38:16 +00:00

Newer version of STINKR source.

Extracted from src:<c>-stink.-ipak-.9 dated 1981-04-17.
This commit is contained in:
Adam Sampson
2019-11-18 19:50:50 +00:00
committed by Lars Brinkhoff
parent 1b877287b6
commit 3a7127a1af
7 changed files with 73 additions and 58 deletions

View File

@@ -1,7 +1,7 @@
# include "c.defs"
# include <c.defs>
# define PAGE_SHIFT 10
# ifdef tops20
# ifndef ITS
# define PAGE_SHIFT 9
# endif
@@ -11,7 +11,7 @@
# define ORIGIN_0 0100
# define ORIGIN_1 0400000
# ifdef tops20
# ifndef ITS
# define ORIGIN_0 0140
# endif
@@ -83,3 +83,7 @@ typedef struct _progent progent;
# define wleft(w) ((w)>>18)
# define wright(w) ((w)&0777777)
# define wcons(l,r) (((l)<<18)|((r)&0777777))
# define LHALF halves (0777777, 0)
# define RHALF 0777777
# define ACFIELD halves (0740, 0)

View File

@@ -28,7 +28,7 @@ jinit ()
while (--jnwindow >= 0)
{jcpage[jnwindow] = -1;
jwpage[jnwindow] = pg_get (1);
jwpage[jnwindow] = pgget (1);
jwindow[jnwindow] = jwpage[jnwindow] << PAGE_SHIFT;
}
jnwindow = 0;

View File

@@ -14,6 +14,8 @@ int jbhandle (j)
{return (j_ch (j));
}
pgget (n) {return (pg_get (n));}
pgwzero (jch, p)
int jch;
int p;

View File

@@ -29,24 +29,7 @@ int j_kill (j)
{_KFORK (j);
}
int pg_get (n)
{static int space[(NWINDOW+1)*PAGE_SIZE];
/* space used for windows */
static int *sp {space};
/* pointer to next available page */
int i, pn;
i = sp;
if (i & PAGE_MASK) /* sp hasn't been aligned yet */
{i =+ PAGE_MASK;
i =& ~PAGE_MASK;
}
pn = i >> PAGE_SHIFT; /* page number of allocated page */
i =+ PAGE_SIZE; /* advance to next page */
sp = i;
return (pn);
}
pgget (n) {return (pg_get (n) >> PAGE_SHIFT);}
pgwzero (jch, p)
int jch;

View File

@@ -88,7 +88,7 @@ leprog ()
}
}
getval (n, sub) name n; int sub;
getval (value, n, sub) name n; int value, sub;
{symbol s;
int swap, action, flags, global;
@@ -100,28 +100,32 @@ getval (n, sub) name n; int sub;
if (!global)
{error ("reference to local symbol %x not implemented", n);
return (0);
return (value);
}
s = symfind (n);
if (symdefined (s))
{int val;
{int val, nval;
val = symvalue (s);
if (swap) val = wswap (val);
if (sub) val = -val;
switch (action) {
case fa_word: break;
case fa_right: val =& 0777777; break;
case fa_left: val =& ~0777777; break;
case fa_ac: val =& 0740000000; break;
}
return (val);
nval = compute_fixup (action, value, val);
if (debug) cprint (" changed %o => %o", value, nval);
return (nval);
}
if (ovflag)
{error ("%x undefined in assignment", n);
return (0);
return (value);
}
symaddfix (s, fixcons (sub, swap, action, loc));
return (0);
return (value);
}
int fmasks [] {halves (0777777, 0777777), RHALF, LHALF, ACFIELD};
int compute_fixup (kind, old, new)
{kind = fmasks[kind];
return ((old & ~kind) | (((old & kind) + (new & kind)) & kind));
}
linkreq (n, chain) name n; int chain;
@@ -224,14 +228,23 @@ reloc (l)
{int n, o;
if (l < 0 || l >= 01000000)
{error ("bad relocatable value");
return (0);
}
n = nvsegs - 1;
if (l >= segvorg[n] + segvsiz[n]) return (creloc[0] + l - 01000000);
n = nvsegs;
while (--n >= 0) if ((o = l - segvorg[n]) >= 0) break;
if (o<0)
while (--n >= 0)
if ((o = l - segvorg[n]) >= 0) break;
if (n < 0)
{error ("virtual address %o not in any segment", l);
return (0);
}
if (o > segvsiz[n]) /* permit label at end of segment */
error ("virtual address %o beyond end of segment", l);
n = creloc[n] + o;
if (n<0 || n>=01000000)
if (n < 0 || n >= 01000000)
{error ("address wraparound");
n =& 0777777;
}
@@ -242,7 +255,7 @@ char *actnam[] {"word", "right half of", "left half of", "AC of"};
dofixup (f, val) fixup f;
{int lc, action, sub, swap;
{int lc, action, sub, swap, oval, nval;
sub = fixsub (f);
swap = fixswap (f);
action = fixact (f);
@@ -251,11 +264,7 @@ dofixup (f, val) fixup f;
actnam[action], lc, val);
if (swap) {val = wswap (val); if (debug) cprint (" (swap)");}
if (sub) {val = -val; if (debug) cprint (" (subtract)");}
switch (action) {
case fa_word: break;
case fa_right: val =& 0777777; break;
case fa_left: val =& ~0777777; break;
case fa_ac: val =& 0740000000; break;
}
jwrite (lc, jread (lc) + val);
oval = jread (lc);
jwrite (lc, nval = compute_fixup (action, oval, val));
if (debug) cprint (" changed %o => %o", oval, nval);
}

View File

@@ -416,23 +416,27 @@ standard()
codeword =<< 3;
data = *blkp++;
switch (code) {
case 0: value =+ data; outval ();
continue;
case 1: value =+ wcons(wleft(data),reloc(wright(data)));
case 0: value = add_both (value, data);
outval ();
continue;
case 2: value =+ wcons(reloc(wleft(data)),wright(data));
case 1: data = wcons(wleft(data), reloc(wright(data)));
value = add_both (value, data);
outval ();
continue;
case 3: value =+ wcons(reloc(wleft(data)),
reloc(wright(data)));
case 2: data = wcons(reloc(wleft(data)), wright(data));
value = add_both (value, data);
outval ();
continue;
case 3: data = wcons(reloc(wleft(data)), reloc(wright(data)));
value = add_both (value, data);
outval ();
continue;
case 4: sym = data;
value =+ getval (sym, 0);
value = getval (value, sym, 0);
continue;
case 5: sym = data;
value =+ getval (sym, 1);
value = getval (value, sym, 1);
continue;
case 6: linkreq (data, *blkp++);
continue;
@@ -459,6 +463,10 @@ standard()
}
}
int add_both (x, y)
{return (wcons (wleft(x) + wleft(y), wright(x) + wright(y)));}
outval ()
{if (ovflag)

View File

@@ -341,11 +341,20 @@ int sopen (fnbuf, m, o) char fnbuf[], *o;
}
f = copen (fnbuf, m, o);
if (f == OPENLOSS)
{cprint ("\nUnable to open %s\n", fnbuf);
cprint ("Use what filename instead ('*' to ignore)? ");
gets (temp);
if (temp[0] == '*' && temp[1] == 0) return (OPENLOSS);
if (temp[0]) stcpy (temp, fnbuf);
{char *p, c;
f = copen ("", 'w');
cprint (f, "\nUnable to open %s\n", fnbuf);
cprint (f, "Use what filename instead\
('*' to ignore)? ");
cclose (f);
f = copen ("", 'r');
p = temp;
while ((c = cgetc (f)) && c != '\n') *p++ = c;
*p++ = 0;
cclose (f);
if (temp[0] == 0 || (temp[0] == '*' && temp[1] == 0))
return (OPENLOSS);
stcpy (temp, fnbuf);
}
else return (f);
}