TARGET_HOME="/home/nick/src/Ack-5.5/stage"; export TARGET_HOME
UTIL_HOME="/home/nick/src/Ack-5.5/stage"; export UTIL_HOME
SRC_HOME="/home/nick/src/Ack-5.5"; export SRC_HOME
-SYSNAME=""; export SYSNAME
+SYSNAME="ANY"; export SYSNAME
ACM="z80"; export ACM
CURRENT="y"; export CURRENT
SYS="V7"; export SYS
LIMIT="y"; export LIMIT
CONFIG="/home/nick/src/Ack-5.5/build"; export CONFIG
DISABLE_LANG=" Modula-2 Pascal Occam Basic Fortran"; export DISABLE_LANG
-DISABLE_SUP=" i86 xenix3 minix i386 6500 6800 6805 6809 i80 em22 em24 em44 m68k2 pmds minixST m68k4 pmds4 sun2 mantra m68020 sun3 sparc sparc_solaris ns pdp s2650 vax4 z8000 arm"; export DISABLE_SUP
+DISABLE_SUP=" i86 xenix3 minix i386 6500 6800 6805 6809 i80 em24 em44 m68k2 pmds minixST m68k4 pmds4 sun2 mantra m68020 sun3 sparc sparc_solaris ns pdp s2650 vax4 z8000 arm"; export DISABLE_SUP
DO_MACHINE_INDEP="y"; export DO_MACHINE_INDEP
MACH_LIST="i86 xenix3 minix i386 6500 6800 6805 6809 i80 em22 em24 em44 m68k2 pmds minixST m68k4 pmds4 sun2 mantra m68020 sun3 sparc sparc_solaris ns pdp s2650 vax4 z80 z8000 arm"; export MACH_LIST
SYSVAX=""; export SYSVAX
+#!/bin/sh
+
: '$Id: lint-lib.ack,v 1.2 1994/06/23 13:46:53 ceriel Exp $'
: Create a lint library file. The name of the library file is constructed
TARGET_HOME="/home/nick/src/Ack-5.5/stage"; export TARGET_HOME
UTIL_HOME="/home/nick/src/Ack-5.5/stage"; export UTIL_HOME
SRC_HOME="/home/nick/src/Ack-5.5"; export SRC_HOME
-SYSNAME=""; export SYSNAME
+SYSNAME="ANY"; export SYSNAME
ACM="z80"; export ACM
CURRENT="y"; export CURRENT
SYS="V7"; export SYS
LIMIT="y"; export LIMIT
CONFIG="/home/nick/src/Ack-5.5/build"; export CONFIG
DISABLE_LANG=" Modula-2 Pascal Occam Basic Fortran"; export DISABLE_LANG
-DISABLE_SUP=" i86 xenix3 minix i386 6500 6800 6805 6809 i80 em22 em24 em44 m68k2 pmds minixST m68k4 pmds4 sun2 mantra m68020 sun3 sparc sparc_solaris ns pdp s2650 vax4 z8000 arm"; export DISABLE_SUP
+DISABLE_SUP=" i86 xenix3 minix i386 6500 6800 6805 6809 i80 em24 em44 m68k2 pmds minixST m68k4 pmds4 sun2 mantra m68020 sun3 sparc sparc_solaris ns pdp s2650 vax4 z8000 arm"; export DISABLE_SUP
DO_MACHINE_INDEP="y"; export DO_MACHINE_INDEP
MACH_LIST="i86 xenix3 minix i386 6500 6800 6805 6809 i80 em22 em24 em44 m68k2 pmds minixST m68k4 pmds4 sun2 mantra m68020 sun3 sparc sparc_solaris ns pdp s2650 vax4 z80 z8000 arm"; export MACH_LIST
SYSVAX=""; export SYSVAX
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright".
*/
-#define as_magic (sp_magic|(14<<8))
+#define as_magic (sp_magic|(15<<8))
#!/bin/sh
-#sudo apt-get install groff
+#sudo apt-get install groff catdoc
rm -rf build stage
sh INSTALL
};
struct proctab {
- cons_t pr_off; /* distance from pb */
cons_t pr_loc; /* number of bytes locals */
+ cons_t pr_off; /* distance from pb */
+ cons_t pr_len;
};
}
for( ; r ; r= r->r_next ) {
if (r->r_typ == RELLOC) {
- r->r_typ = RELADR;
k = r->r_val.rel_lp;
if (k->l_defined==YES)
r->r_val.rel_i = k->l_min + textbytes;
}
setline();
do_proc();
+ proctab[prptr->p_num].pr_len =
+ textbytes - proctab[prptr->p_num].pr_off;
break;
case ps_mes:
switch( int_cast getint() ) {
int line_num; /* line number for error messages */
int nerrors; /* number of nonfatal errors */
cons_t consiz; /* size of U,I or F value */
+cons_t procbytes; /* size of process table */
cons_t textbytes; /* size of code file */
cons_t databytes; /* highwater mark in data */
FOFFSET dataoff; /* size of data file */
extern int pass;
extern int line_num;
extern int nerrors;
+extern cons_t procbytes;
extern cons_t textbytes;
extern cons_t databytes;
extern FOFFSET dataoff;
* | <UNUSED> | /
* |________________________|
* | |
+ * | PROCTABLE |
+ * | |
+ * |_ _ _ _ _ _ _ _ _ _ _ _ |
+ * | |
* | TEXT | zero filled
* | | if not word multiple
* |________________________|
* | DATA |
* | |
* |________________________|
- * | |
- * | PROCTABLE |
- * | |
- * |________________________|
*
*
*/
+ procbytes = procnum * 3 * ptrsize;
remtext = textbytes%wordsize ;
if ( remtext != 0 ) remtext = wordsize-remtext ;
xput16(ptrsize,ifile);
xput16(0,ifile);
xput16(0,ifile);
- xputa(textbytes+remtext ,ifile);
+ xputa(procbytes+textbytes+remtext,ifile);
xputa((cons_t)datablocks,ifile);
xputa((cons_t)procnum,ifile);
xputa((cons_t)searchproc(MAIN,xprocs,oursize->n_xproc)->p_num,
xputa((cons_t)0,ifile);
xputa((cons_t)0,ifile);
+ for (i=0;i<procnum;i++) {
+ xputarb(ptrsize,proctab[i].pr_loc,ifile);
+ xputarb(ptrsize,proctab[i].pr_off+procbytes,ifile);
+ xputarb(ptrsize,proctab[i].pr_len,ifile);
+ }
+
textprocess(tfile,ifile);
while ( remtext-- ) xputc(0,ifile) ;
dataprocess(dfile,ifile);
- for (i=0;i<procnum;i++) {
- xputarb(ptrsize,proctab[i].pr_loc,ifile);
- xputarb(ptrsize,proctab[i].pr_off,ifile);
- }
if ( fclose(ifile)==EOF ) ;
}
for (i=0 ; i<dataoff && !ieof ; i++) {
if (i==datareloc.r_off) {
switch(datareloc.r_typ) {
+ case RELLOC:
+ datareloc.r_val.rel_i += procbytes;
+ /* fallthru */
case RELADR:
xputa(xgeta(f1)+datareloc.r_val.rel_i,f2) ;
i += ptrsize-1 ;
classdefs.h: \
makeclassdef \
$(SRC_DIR)/cldefs.src
- makeclassdef $(EMH)/em_mnem.h $(SRC_DIR)/cldefs.src > classdefs.h
+ ./makeclassdef $(EMH)/em_mnem.h $(SRC_DIR)/cldefs.src > classdefs.h
makeclassdef: \
$(SRC_DIR)/makecldef.c
ep = (struct ep *)Malloc((size)(NProc * sizeof (struct ep)),
"entry points");
for (idf = 0; idf < NProc; idf++) {
- register struct proc *pr = &proctab[idf];
-
+ struct proc pt;
+
+ read_proctab(idf, &pt);
ep[idf].ep_idf = idf;
- ep[idf].ep_ep = pr->pr_ep;
- ep[idf].ep_nloc = pr->pr_nloc;
+ ep[idf].ep_ep = pt.pr_ep;
+ ep[idf].ep_nloc = pt.pr_nloc;
}
/* a very naive sorting algorithm */
#include "fra.h"
#include "rsb.h"
#include "linfil.h"
+#include "proctab.h"
extern int running; /* from main.c */
if (old_LB != new_LB) {
wtrap(WGTORSB, EBADGTO);
}
+ read_proctab(PI, &proctab);
newLB(new_LB);
pop_frames();
int rsbcode;
{
/* legality of new_PI has already been checked */
- register size nloc = proctab[new_PI].pr_nloc;
- register ptr ep = proctab[new_PI].pr_ep;
push_frame(SP); /* remember AB */
pushrsb(rsbcode);
/* do the call */
PI = new_PI;
- st_inc(nloc);
- newPC(ep);
+ read_proctab(new_PI, &proctab);
+ st_inc(proctab.pr_nloc);
+ newPC(proctab.pr_ep);
spoilFRA();
LOG(("@p5 call: new_PI = %lu, nloc = %lu, ep = %lu",
- new_PI, nloc, ep));
+ new_PI, proctab.pr_nloc, proctab.pr_ep));
}
/************************************************************************
}
else
if (pi < NProc) {
+ struct proc pt;
+
+ read_proctab(pi, &pt);
sprintf(pr_descr, "(%ld,%ld)",
- pi, (long)proctab[pi].pr_nloc);
+ pi, (long)pt.pr_nloc);
}
else {
sprintf(pr_descr, "%ld >>>> ILLEGAL <<<<", pi);
rd_text();
rd_gda();
- rd_proctab();
rd_close();
#include "logging.h"
#include "global.h"
#include "log.h"
-#include "alloc.h"
+#include "memdirect.h"
+#include "text.h"
#include "proctab.h"
-struct proc *proctab;
-PRIVATE long pr_cnt;
+struct proc proctab; /* changes when PI changes */
-init_proctab()
+read_proctab(p, pt)
+ register ptr p;
+ register struct proc *pt;
{
- proctab = (struct proc *)
- Malloc(NProc * sizeof (struct proc), "proctable");
- pr_cnt = 0;
+ p *= psize * 3;
+ pt->pr_nloc = p_in_text(p);
+ p += psize;
+ pt->pr_ep = p_in_text(p);
+ p += psize;
+ pt->pr_ff = pt->pr_ep + p_in_text(p);
}
-add_proc(nloc, ep)
- size nloc;
- ptr ep;
-{
- register struct proc *pr = &proctab[pr_cnt++];
- register struct proc *p;
- register ptr ff = DB;
-
- LOG((" r6 add_proc: pr_cnt = %ld, nloc = %lu, ep = %lu",
- pr_cnt-1, nloc, ep));
- if (ep > DB)
- fatal("procedure entry point outside text segment");
-
- pr->pr_nloc = nloc;
- pr->pr_ep = ep;
- /* examine all old proc descriptors */
- for (p = &proctab[0]; p < pr; p++) {
- if ( /* the old one starts earlier */
- p->pr_ep < pr->pr_ep
- && /* it seems to end later */
- p->pr_ff > pr->pr_ep
- ) { /* update its limit */
- p->pr_ff = pr->pr_ep;
- }
- if ( /* the old one starts later */
- p->pr_ep > pr->pr_ep
- && /* our limit is beyond the old procedure entry point*/
- ff > p->pr_ep
- ) { /* update our limit */
- ff = p->pr_ep;
- }
- }
- pr->pr_ff = ff;
-}
-
-end_init_proctab()
-{
#ifdef LOGGING
+dump_proctab()
+{
register long p;
if (!check_log(" r6"))
return;
for (p = 0; p < NProc; p++) {
- register struct proc *pr = &proctab[p];
+ struct proc pt;
+ read_proctab(p, &pt);
LOG((" r5: proctab[%ld]: nloc = %d, ep = %lu, ff = %lu",
- p, pr->pr_nloc, pr->pr_ep, pr->pr_ff));
+ p, pt.pr_nloc, pt.pr_ep, pt.pr_ff));
}
-#endif /* LOGGING */
}
+#endif /* LOGGING */
ptr pr_ff; /* first address not in proc */
};
-extern struct proc *proctab;
+extern struct proc proctab;
* rd_header() - read object file header. *
* rd_text() - read program text. *
* rd_gda() - read global data area. *
- * rd_proctab() - read procedure descriptors, *
* rd_close() - close object file. *
* *
************************************************************************/
NTEXT = rd_int(psize);
NDATA = rd_int(psize);
NPROC = rd_int(psize);
+ if (NPROC < 0 || NPROC * psize * 3 > NTEXT)
+ fatal("Bad proc table");
ENTRY = rd_int(psize);
if (ENTRY < 0 || ENTRY >= NPROC)
fatal("Bad entry point");
dt_prot(i2p(4), psize);
}
-rd_proctab()
-{
- register long p;
-
- init_proctab();
- for (p = 0; p < NPROC; p++) {
- register long nloc = rd_int(psize);
- register ptr ep = i2p(rd_int(psize));
-
- add_proc(nloc, ep);
- }
- end_init_proctab();
-}
-
rd_close()
{
fclose(load_fp);
#ifdef LOGGING
{
/* check SP */
- register ptr properSP = LB - proctab[PI].pr_nloc;
+ register ptr properSP = LB - proctab.pr_nloc;
if (SP < properSP)
warning(rtt ? WRTTSTL : WRETSTL);
from Return Status Block
*/
PI = st_lds(SP + rsb_PI, psize);
+ read_proctab(PI, &proctab);
newPC(st_ldip(SP + rsb_PC));
newLB(st_lddp(SP + rsb_LB));
putLIN((long) st_ldu(SP + rsb_LIN, LINSIZE));
newPC(p)
register ptr p;
{
- register struct proc *pr = &proctab[PI];
-
if (p >= DB) {
wtrap(WPCOVFL, EBADPC);
}
- if (p < pr->pr_ep || p >= pr->pr_ff) {
+ if (p < proctab.pr_ep || p >= proctab.pr_ff) {
wtrap(WPCPROC, EBADPC);
}
PC = p;