!TITLE The System Call Table
!
CONSTINTEGER SCT SHAPE = 1; ! change whenever I J values change
CONSTSTRING (5)DIRECTOR VSN = "22.48"
CONSTSTRING (15) VSN = "07 OCT 85 23"
!
!
! The format of each entry in the table below is
!
! name,n1,n2,n3
!
! where
!
! name is the name of the procedure
!
! n1 is how much below the default ACR you have to be to call
! the procedure (ie 0 means anyone can call it)
!
! n2 is the target ACR (2 except for DLOWERACR which takes you
! down to ACR 1)
!
! n3 is the number of words of parameters to be passed
!
! The System Call Table is arranged in alphabetical order to allow the
! Loader to search for entries more quickly.
!
CONSTINTEGER TOP J VALUE = 100
CONSTSTRING (33)ARRAY PROC(1:TOP J VALUE) = C
"ACREATE2,0,2,12",
"BADPAGE,0,2,3",
"CHANGECONTEXT,0,103,0", {there are 3 specials, the 103 means j=3}
"DACCEPT,0,2,7",
"DASYNCINH,0,2,2",
"DAZ,0,2,6", {for new version of DDAP with a routinename param}
"DBITMAP2,1,2,5",
"DCHACCESS,0,2,6",
"DCHECKBPASS,0,2,5",
"DCHSIZE,0,2,6",
"DCLEARINTMESSAGE,0,2,0",
"DCONNECT,0,2,11",
"DCPUTIME,0,2,0",
"DCREATE,0,2,7",
"DCREATE2,0,2,9",
"DDAP,0,2,6",
"DDELAY,0,2,1",
"DDELUSER,0,2,3",
"DDESTROY,0,2,8",
"DDISABLETERMINALSTREAM1,0,2,4",
"DDISCONNECT,0,2,6",
"DDONATE,0,2,4",
"DDUMP,0,2,4",
"DEMPTYI,0,2,2",
"DENABLETERMINALSTREAM,0,2,6",
"DERROR,0,2,2",
"DERRS,0,2,3",
"DEXECMESS,0,2,5",
"DFILENAMES,0,2,14",
"DFINFO,0,2,6",
"DFSTATUS,0,2,7",
"DFSYS,0,2,4",
"DGETDA,0,2,6",
"DGETINDEXES,0,2,4",
"DGETINDEXES2,0,2,4",
"DINDEX2,0,2,4",
"DINDNO,0,2,5",
"DISCID,0,2,0",
"DLOCK,0,2,4",
"DLOWERACR,6,1,1",
"DMAGCLAIM,0,2,6",
"DMAGIO,0,2,9",
"DMAIL,0,2,4",
"DMESSAGE,0,2,7",
"DMESSAGE2,0,2,8",
"DMODARCH,0,2,10",
"DMODE,0,2,3",
"DMON,0,2,2",
"DNEWARCHINDEX,0,2,4",
"DNEWGEN,0,2,7",
{"DNEWINWARDCALL,0,2,7",}
"DNEWOUTWARDCALL,0,2,9",
"DNEWUSER,0,2,4",
"DNINDA,0,2,4",
"DNOMINATESTACK,0,2,1",
"DOFFER,0,2,7",
"DOPER,0,2,3",
"DOPERPROMPT,0,2,3",
"DOPERR,0,2,4",
"DOUT,0,2,2",
"DOUT11,0,2,2",
"DOUT18,0,2,2",
"DPERMISSION,0,2,11",
{"DPLUGINJVECTOR,0,2,4",}
"DPOFF,0,2,2",
"DPON,0,2,2",
"DPON2,0,2,6",
"DPON3,0,2,7",
"DPRG,0,2,8",
"DPRINTSTRING,0,2,2",
"DPROCEDURE,0,2,2",
"DPROCS,0,2,3",
"DRENAME,0,2,7",
"DRENAMEINDEX,0,2,5",
"DREPLACEINDEX,0,2,3",
"DRESETCONTINGENCY,0,2,0",
"DRESTORE,0,2,8",
"DRESUME,0,2,3",
"DRETRIEVE,0,2,3",
"DSETIC,0,2,1",
"DSETPASSWORD,0,2,8",
"DSFI,0,2,6",
"DSPOOL,0,2,4",
"DSTOP,0,2,1",
"DSUBMIT,0,2,7",
"DSYSAD,0,2,3",
"DTOFF,0,2,2",
"DTRANSFER,0,2,11",
"DUNLOCK,0,2,1",
"DUNPRG,0,2,8",
"DUSERINDEXES,0,2,6",
"FBASE,0,2,5",
"GETAVFSYS,0,2,6",
"GETUSNAMES,0,2,4",
"GETUSNAMES2,0,2,7",
"PRIMECONTINGENCY,0,2,4",
"PRINTMP,0,2,2",
"READID,0,2,1",
"REQUESTINPUT,0,101,0",
"REQUESTOUTPUT,0,102,0",
"S#OPER,0,2,3",
"SETDIRMON,0,2,2"
!>
!
!
!----------------------------------------------------------------------
CONSTSTRING (20) VERSION = "DIRFIX 15 21/12/82"
CONSTINTEGER SEGSIZE = X'00040000'
CONSTINTEGER DRDR UNBDD = X'B1000000'
!
!
!
RECORDFORMAT RF(INTEGER AREALOC, BASELOC)
RECORDFORMAT RELF(INTEGER LINK, N, RECORD (RF)ARRAY R(1 : 2000))
RECORDFORMAT OFMF(INTEGER START, L, PROP)
RECORDFORMAT RRF(INTEGER CONAD, FILETYPE, DATASTART, DATAEND)
RECORDFORMAT CENTF(INTEGER LINK, LOC, STRING (31) IDEN)
RECORDFORMAT DENTF(INTEGER LINK, DISP, L, A, STRING (31) IDEN)
RECORDFORMAT CREFF(INTEGER LINK, REFLOC, STRING (31) IDEN)
RECORDFORMAT DREFF(INTEGER LINK, REFARRAY, L, STRING (31) IDEN)
!**** SYSTEM AND EXTERNAL SPECS******
EXTERNALINTEGERFNSPEC OUTSTREAM
SYSTEMINTEGERFNSPEC CURRENT PACKED DT
EXTERNALROUTINESPEC DEFINE(STRING (255) S)
SYSTEMROUTINESPEC PSYSMES(INTEGER ROOT, FLAG)
SYSTEMROUTINESPEC TRIM(STRING (31) FILE, INTEGERNAME FLAG)
SYSTEMROUTINESPEC DISCONNECT(STRING (31) S, INTEGERNAME FLAG)
SYSTEMROUTINESPEC SETPAR(STRING (255) S)
SYSTEMSTRINGFNSPEC SPAR(INTEGER N)
SYSTEMROUTINESPEC CONNECT(STRING (31) FILE, C
INTEGER MODE, HOLE, PROT, RECORD (RRF)NAME RR, INTEGERNAME FLAG)
SYSTEMROUTINESPEC OUTFILE(STRING (31) FILE, C
INTEGER SIZE, HOLE, PROT, INTEGERNAME CONAD, FLAG)
SYSTEMROUTINESPEC MOVE(INTEGER LEN, FROM, TO)
SYSTEMROUTINESPEC PHEX(INTEGER I)
SYSTEMSTRINGFNSPEC ITOS(INTEGER N)
!
!
!
RECORDFORMAT IDENS ARRF(STRING (31) IDEN, INTEGER I, J)
RECORDFORMAT SCTEF(INTEGER TYPE, ACR, DRDR0, DRDR1)
RECORDFORMAT OBJF(INTEGER NEXTFREEBYTE, CODERELST, GLARELST, C
SCT RELST)
! THE SC TABLE IS PUT AT "SCT RELST" IN THE FILE POINTED TO BY FILEAD.
! THE FIRST FOUR WORDS FROM THERE ARE DEFINED AS FOLLOWS:
RECORDFORMAT SCT HDRF(INTEGER HORIZ VECTOR BOUND, SCT RELST, C
IDENS ARRAY RELST, DT STAMP, C
STRING (15) FIXUP DATE, INTEGER ENDF)
! THE IDENS ARRAY RELATIVE START IS A BYTE OFFSET FROM THE START OF THESE
! FOUR WORDS (IE. FROM SCT BLOCK AD).
!--------------------------------------------------------------------------
CONSTINTEGER DEFAULT ACR = 10
INTEGERFN STOI(STRING (9)S)
INTEGER I, J
I = 0
CYCLE J = 1, 1, LENGTH(S)
I = 10 * I + CHARNO(S, J) & 15
REPEAT
RESULT = I
END ; ! OF STOI
!
!-----------------------------------------------------------------------
ROUTINE W(STRING (255)S)
PRINTSTRING(S)
NEWLINE
END
!
!-----------------------------------------------------------------------
!
EXTERNALROUTINE SCT VSN(STRING (255)S)
W("Director ".DIRECTORVSN." of ".VSN)
END
!
!-----------------------------------------------------------------------
!
EXTERNALINTEGERFN BUILD SCT(INTEGER FILEAD, INFILEAD)
! MAKES THE SYSTEM CALL TABLE AND ALSO
! A RECORDARRAY WITH THE ENTRY-POINT IDENTS AND THE CORRESPONDING I,J
! VALUES.
INTEGER EP, F, LINK, ERRORS, LIST1HEAD
INTEGER J, SCT BLOCK AD, IDENS RELST
STRING (31) ENT, S, W1, W2, W3, D1, LAST
RECORDFORMAT L1F(INTEGER LINK, REFLOC, STRING (31) IDEN)
RECORD (L1F)NAME LIST1
RECORD (OBJF)NAME H
RECORD (SCT HDRF)NAME SCT HDR
RECORD (IDENS ARRF)ARRAYFORMAT AF(1 : TOP J VALUE)
RECORD (IDENS ARRF)ARRAYNAME A
RECORD (SCTEF)ARRAYFORMAT SCTEAF(0 : TOP J VALUE)
RECORD (SCTEF)ARRAYNAME SCTE
CONSTSTRING (3) ARRAY MTH(0 : 11) = C
"JAN","FEB","MAR","APR","MAY","JUN", C
"JUL","AUG","SEP","OCT","NOV","DEC"
CONSTSTRINGNAME DATE=X'80C0003F'
CONSTINTEGER GLACODE = 2
CONSTINTEGER DIRGLA SEG = 3; ! LOCAL 3
INTEGER DACR, TARG, N
!
!
!
W("BUILD SCT VSN ".VSN)
ERRORS = 0
LIST1HEAD = INTEGER(INFILEAD+INTEGER(INFILEAD+24)+4)
!FIRST ENTRY IN LOAD DATA
H == RECORD(FILEAD)
SCT BLOCK AD = FILEAD+H_SCT RELST
SCT HDR == RECORD(SCT BLOCK AD)
SCT HDR_HORIZ VECTOR BOUND = TOP J VALUE+1
SCT HDR_SCT RELST = ADDR(SCT HDR_ENDF)-ADDR(SCT HDR)
IDENS RELST = ADDR(SCT HDR_ENDF)-ADDR(SCT HDR)+(TOP J VALUE+1)<<4
SCT HDR_IDENS ARRAY RELST = IDENS RELST
SCT HDR_DT STAMP = SCT SHAPE
DATE -> S.("/").W1.("/").W2
D1 = S." ".MTH(STOI(W1)-1)." ".W2
SCT HDR_FIXUP DATE = DIRECTOR VSN." ".D1
! UPDATE THE FILE HEADER
H_NEXTFREEBYTE = H_NEXTFREEBYTE+IDENS RELST+40*(TOP J VALUE)
SCTE == ARRAY(SCT BLOCK AD+SCT HDR_SCT RELST,SCTEAF)
A == ARRAY(SCT BLOCK AD+IDENS RELST,AF)
! START OF CODE SEG HAS FILE HEADER
!----------------------------------------------------------------
SCTE(0) = 0
LAST = "AAA"; ! to check alphabetical order
J = 0
CYCLE EP = 1,1,TOP J VALUE
! WE OUGHT TO CHECK THAT THE SCT AND THE ARRAY OF NAMES EACH LIE
! WITHIN ONE PAGE (AS CURRENTLY ARRANGED) ...
PROC(EP) -> ENT.(",").W1.(",").W2.(",").W3
A(EP)_IDEN = ENT; ! procedure name
!
DACR = DEFAULT ACR - STOI(W1)
TARG = STOI(W2)
N = STOI(W3) + 5; ! number of words for call
PRINTSTRING(ENT); SPACES(21-LENGTH(ENT))
!
PRINTSTRING("OUT-OF-ORDER ") AND ERRORS = ERRORS+1 IF LAST > ENT
LAST = ENT
!
IF TARG > 100 START ; ! special entry
A(EP)_I = 3
A(EP)_J = TARG - 100
FINISH ELSE START
!
F = 0; ! anticipate failure (in search for entry)
LINK = LIST1HEAD
WHILE LINK # 0 CYCLE
LIST1 == RECORD(INFILEAD + LINK)
IF LIST1_IDEN = ENT AND LIST1_REFLOC >> 24 = GLACODE START
F = 1; ! found
EXIT
FINISH
LINK = LIST1_LINK
REPEAT
!
IF F = 0 START
ERRORS = ERRORS+1
W(" NOT FOUND")
FINISH ELSE START
J = J + 1
PRINTSTRING(" J-VALUE =")
WRITE(J,1)
SCTE(J)_TYPE = X'80000000'!(DACR<<20); ! TYPE=INWARD CALL
SCTE(J)_ACR = (N<<24) ! (TARG<<20) ! X'40000'; ! PRIV=1
SCTE(J)_DRDR0 = DRDR UNBDD
SCTE(J)_DRDR1 = DIRGLA SEG<<18+LIST1_REFLOC&X'FFFFFF'
A(EP)_I = 1
A(EP)_J = J
FINISH
FINISH
NEWLINE
REPEAT
RESULT = ERRORS
END ; ! BUILD SCT
!
!
!
EXTERNALROUTINE DIRFIX(STRING (255)S)
!
!
INTEGER AREACODE, AREADISP, BASECODE, BASEDISP, N, DR0, DR1
INTEGER UNSATCODE, UNSATDATA, CUROUTSTREAM, BLOCKS
INTEGER FLAG, INBASE, OUTBASE, LOC, I, LINK, LEN, OUTLEN, AD
INTEGER REFARRAY
STRING (31)IN, OUT, LIST
CONSTINTEGER CODESTART = X'80000'
CONSTINTEGER GLASTART = X'C0000'
INTEGERARRAY BASE(1 : 7); !AREA START ADDRESSES IN FILE 'OUT'
INTEGERARRAY LBASE(1 : 7); !AREA START ADDRESSES WHEN LOADED
INTEGERARRAYFORMAT LDATAAF(0 : 14)
INTEGERARRAYFORMAT REFLOCAF(1 : 1000)
INTEGERARRAYNAME LDATA, REFLOC
RECORD (CENTF)NAME CENT
RECORD (DENTF)NAME DENT
RECORD (OFMF)ARRAYFORMAT OFMAF(1 : 7)
RECORD (OFMF)ARRAYNAME OFM
RECORD (CREFF)NAME CREF
RECORD (DREFF)NAME DREF
RECORD (RELF)NAME REL
RECORD (RRF) RR
!
!
!
ROUTINE PRINTBOTH(STRING (255) S)
!PRINTS MESSAGE TERMINATED BY NEWLINE ON BOTH STREAMS CUROUTSTREAM AND 1
W(S)
SELECTOUTPUT(CUROUTSTREAM)
W(S)
SELECTOUTPUT(1)
END ; ! PRINT BOTH
!
!
!
ROUTINE FAIL(STRING (100)S)
SELECTOUTPUT(0)
PRINTSTRING("FAILURE IN FIX - ".S)
STOP
END
!
!
!
ROUTINE FINDCODEEP(STRING (31)ENTRY, INTEGERNAME DR0, DR1, FLAG)
INTEGER LINK
RECORD (CENTF)NAME CENT
LINK = LDATA(1)
WHILE LINK # 0 CYCLE
CENT == RECORD(INBASE+LINK)
IF ENTRY = CENT_IDEN START
DR0 = X'B1000000'
DR1 = LBASE((CENT_LOC>>24)&X'F')+CENT_LOC&X'FFFFFF'
FLAG = 0
RETURN
FINISH
LINK = CENT_LINK
REPEAT
W("UNSAT REF ".ENTRY)
FLAG = 1
UNSATCODE = UNSATCODE+1
END
!
!
!
ROUTINE FINDDATAEP(STRING (31)ENTRY, INTEGERNAME AD, FLAG)
INTEGER LINK
RECORD (DENTF)NAME DENT
LINK = LDATA(4)
WHILE LINK # 0 CYCLE
DENT == RECORD(INBASE+LINK)
IF ENTRY = DENT_IDEN START
AD = LBASE(DENT_A)+DENT_DISP
FLAG = 0
RETURN
FINISH
LINK = DENT_LINK
REPEAT
W("UNSAT DATA REF ".ENTRY)
AD = 0; !NULL VALUE
FLAG = 1
UNSATDATA = UNSATDATA+1
END
!
!
!
SETPAR(S)
IN = SPAR(1)
OUT = SPAR(2)
LIST = SPAR(3)
!
IF LIST = "" THEN LIST = "T#LIST"; !DEFAULT LISTING FILE
CUROUTSTREAM = OUTSTREAM
DEFINE("1,".LIST)
SELECTOUTPUT(1)
PRINTBOTH(VERSION)
W("INPUT: ".IN)
W("OUTPUT: ".OUT)
PRINTSTRING("CODESTART: ")
PHEX(CODESTART)
NEWLINE
PRINTSTRING("GLASTART: ")
PHEX(GLASTART)
NEWLINES(2)
!
UNSATCODE = 0
UNSATDATA = 0
CONNECT(IN,0,0,0,RR,FLAG); !CONNECT INPUT FILE - READ
-> ERR IF FLAG # 0
IF INTEGER(RR_CONAD+12) # 1 THEN FAIL("INVALID FILETYPE")
INBASE = RR_CONAD
LEN = RR_DATAEND
OUTLEN = LEN+8192; !DIRECTOR NEEDS ROOM FOR SC TABLE
OUTFILE(OUT,OUTLEN+4096,0,0,OUTBASE,FLAG);!ALLOW FOR ALIGNMENT IN SUPERVISOR - A BIT GENEROUS
-> ERR IF FLAG # 0
MOVE(LEN,INBASE,OUTBASE); !COPY FILE TO 'OUT'
LDATA == ARRAY(INBASE+INTEGER(INBASE+24),LDATAAF)
!LOAD DATA
OFM == ARRAY(INBASE+INTEGER(INBASE+28)+4,OFMAF)
!OBJECT FILE MAP
CYCLE I = 1,1,5
BASE(I) = OUTBASE+OFM(I)_START
REPEAT
LBASE(1) = OFM(1)_START+CODESTART; !START OF LOADED CODE
LBASE(2) = GLASTART; !START OF LOADED GLA
LBASE(4) = OFM(4)_START+CODESTART; !START OF LOADED SST
LBASE(5) = OFM(2)_L+GLASTART; !START OF LOADED UST
!NOW GO THROUGH CODE REFS FILLING IN INFO
LINK = LDATA(7); !STATIC CODE REFS
WHILE LINK # 0 CYCLE
CREF == RECORD(LINK+INBASE)
FINDCODEEP(CREF_IDEN,DR0,DR1,FLAG)
LOC = BASE(CREF_REFLOC>>24)+CREF_REFLOC&X'FFFFFF'
INTEGER(LOC) = DR0
INTEGER(LOC+4) = DR1
LINK = CREF_LINK
REPEAT
!NOW DEAL WITH DATA REFS
LINK = LDATA(9)
WHILE LINK # 0 CYCLE
DREF == RECORD(LINK+INBASE)
REFARRAY = (DREF_REFARRAY&X'7FFFFFFF')+INBASE
!AND OFF COMMON BIT
N = INTEGER(REFARRAY)
REFLOC == ARRAY(REFARRAY+4,REFLOCAF)
FINDDATAEP(DREF_IDEN,AD,FLAG)
CYCLE N = 1,1,N
LOC = BASE(REFLOC(N)>>24)+REFLOC(N)&X'FFFFFF'
INTEGER(LOC) = INTEGER(LOC)+AD
REPEAT
LINK = DREF_LINK
REPEAT
! NOW DEAL WITH RELOCATION REQUESTS
LINK = LDATA(14)
WHILE LINK # 0 CYCLE
REL == RECORD(LINK+INBASE)
CYCLE N = 1,1,REL_N; !NO OF RELOCATION ENTRIES IN THIS BLOCK
AREACODE = REL_R(N)_AREALOC>>24
AREADISP = REL_R(N)_AREALOC&X'FFFFFF'
BASECODE = REL_R(N)_BASELOC>>24
BASEDISP = REL_R(N)_BASELOC&X'FFFFFF'
LOC = BASE(AREACODE)+AREADISP
INTEGER(LOC) = INTEGER(LOC)+LBASE(BASECODE)+BASEDISP
REPEAT
LINK = REL_LINK
REPEAT
INTEGER(OUTBASE+16) = X'1B800032'; ! jump to start of DIRLDR
!
!
!NOW PRINT MAP OF ENTRY POINTS
W("NAME ENTRY POINT")
LINK = LDATA(1); !HEAD OF CODE EP LIST
WHILE LINK # 0 CYCLE
CENT == RECORD(INBASE+LINK)
PRINTSTRING(CENT_IDEN)
SPACES(32-LENGTH(CENT_IDEN))
LOC = BASE((CENT_LOC>>24)&X'F')+CENT_LOC&X'FFFFFF'
PHEX(INTEGER(LOC+4))
NEWLINE
LINK = CENT_LINK
REPEAT
!
!
!NOW PRINT MAP OF DATA ENTRIES IF ANY
LINK = LDATA(4); !HEAD OF DATA EP LIST
IF LINK # 0 START
W("NAME LENGTH ADDRESS")
WHILE LINK # 0 CYCLE
DENT == RECORD(INBASE+LINK)
PRINTSTRING(DENT_IDEN)
SPACES(32-LENGTH(DENT_IDEN))
WRITE(DENT_L,10)
SPACES(5)
PHEX(LBASE(DENT_A)+DENT_DISP)
NEWLINE
LINK = DENT_LINK
REPEAT
FINISH
!
INTEGER(OUTBASE+24) = OFM(2)_START; !START OF GLAP
INTEGER(OUTBASE+28) = OFM(2)_L + OFM(5)_L; ! length of GLAP
INTEGER(OUTBASE+8) = INTEGER(OUTBASE+24); ! probably not used !!!
INTEGER(OUTBASE) = (INTEGER(INBASE+24) + 127) & (-128)
INTEGER(OUTBASE+12) = INTEGER(OUTBASE); ! start of SCT, used by Director
!
FLAG = BUILDSCT(OUTBASE,INBASE); !NEED INBASE TO GET AT LOAD DATA
PRINTBOTH("NUMBER OF SCT FAULTS: ".ITOS(FLAG)) UNLESS FLAG = 0
!
!
!
BLOCKS = (INTEGER(OUTBASE) + 4095)>>12; !NO OF 4K BLOCKS
TRIM(OUT,FLAG)
DISCONNECT(OUT,FLAG)
!
IF UNSATCODE = 0 = UNSATDATA START
PRINTBOTH("ALL REFS FILLED")
FINISH ELSE START
IF UNSATCODE > 0 START
PRINTBOTH(ITOS(UNSATCODE). C
" UNSATISFIED CODE REFERENCES")
FINISH
IF UNSATDATA > 0 THEN START
PRINTBOTH(ITOS(UNSATDATA). C
" UNSATISFIED DATA REFERENCES")
FINISH
FINISH
PRINTBOTH("NUMBER OF 4K BLOCKS: ".ITOS(BLOCKS))
RETURN
ERR:
SELECTOUTPUT(0)
IF FLAG # 0 THEN PSYSMES(1000,FLAG)
END
ENDOFFILE