!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