constinteger amdahl = 369, xa = 371 CONSTSTRING (1) SNL = " " INCLUDE "TARGET" if TARGET = 2900 start { machine specific constants } conststringname DATE = X'80C0003F' conststringname TIME = X'80C0004B' constinteger SEG SHIFT = 18 finish { 2900 } ! if TARGET = 370 start constinteger SEG SHIFT = 16 finish ! if TARGET = XA or TARGET = AMDAHL start constinteger SEG SHIFT = 20 finish ! unless TARGET = 2900 start constinteger com seg = 31 conststringname DATE = COM SEG << SEG SHIFT + X'3B' conststringname TIME = COM SEG << SEG SHIFT + X'47' constinteger uinf seg = 239 finish !* ! !<TMODEF recordformat c TMODEF(byte FLAG0, FLAG1, FLAG2, FLAG3, {.04} byteinteger PROMPTCHAR, ENDCHAR, {.06} bytearray BREAKBIT1(0:3) {%or %halfintegerarray BREAKBIT2(0:1))} , {.0A} byteinteger PADS, RPTBUF, LINELIMIT, PAGELENG, {.0E} byteintegerARRAY TABVEC(0:7), {.16} byteinteger CR, ESC, DEL, CAN, {.1A} byteinteger FLAGS, INTERNAL STATE, LEADIN1, LEADIN2, XLO, XHI) {.20} !<UINFF recordformat c DIRINFF (string (6)USER, string (31)JOBDOCFILE, {.28} integer MARK, FSYS, {.30} PROCNO, ISUFF, REASON, BATCHID, {.40} SESS LIMIT, INT COUNT, I2, STARTCNSL, {.50} AIOSTAT, SCT DATE, SYNC1 DEST, SYNC2 DEST, {.60} ASYNC DEST, AACCT REC, I3, {.6C} string (15)JOBNAME, {.7C} string (31)BASEFILE, {.9C} integer I4, {.A0} ITADDR0, ITADDR1, ITADDR2, ITADDR3, {.B0} ITADDR4, STREAM ID, DIDENT, SCARCITY, {.C0} PREEMPTAT, string (11)SPOOLRFILE, {.D0} integer FUNDS, SESSLEN, PRIORITY, DECKS, {.E0} DRIVES, PART CLOSE, {.E8} record (TMODEF)TMODES, {108} integer PSLOT, {10C} string (63)ITADDR, {14C} integerarray FCLOSING(0:3), integer CLO FES, {160} integer OUTPUT LIMIT, I5, I6, I7, {170} integer OUT, string (15)OUTNAME, {184} integer HISEG, {188} string (31)FORK, {1A8} integer INSTREAM, OUTSTREAM, {1B0} integer DIRVSN, I8, SCT BLOCK AD, integer PROTOCOL, byteinteger ISEPCHL, ISEPCHR, USEPCH, GSEPCH, string (1)ISEPL, ISEPR, USEP, GSEP, { thus a simple filename has the form: } { user USEP file } { while a complex one has the form: } { user ISEPL index ISEPR USEP group GSEP group GSEP file } integer CLASS, SUBCLASS, integer UEND) if TARGET = 2900 start externalroutinespec dresume(integer a, b, c) EXTERNALINTEGERFNSPEC PRIME CONTINGENCY(ROUTINE ON TRAP) externalstringfnspec derrs(integer i) externalintegerfnspec dsfi(string (6) user, integer i,j,k,l) finish else start {NON 2900} EXTERNALINTEGERFNSPEC DPRIME CONTINGENCY(ROUTINE ON TRAP) externalintegerfnspec dflag(integername flag, stringname txt) externalintegerfnspec dasyncinh(integername act) externalintegerfnspec dsfi(stringname file index,integername fsys, type, set, stringname s, integerarrayname i) finish {NON 2900} externalroutinespec define(integer strm, size, string (15) q) externalroutinespec control( c integer max fsys, queues, qconad, remotes, rconad, streams, sconad, qnconad,snconad,rnconad, link list conad) externalroutinespec read spool config( c string (6) iu, ou, integer ifs, ofs, string (11) if, of, integername qs, qconad, rmts, rconad, strms, sconad, integername qnconad,snconad,rnconad, link list conad) externalroutinespec on trap stringfnspec errs(integer flag) externalinteger my fsys; !FILE SYSTEM OF PROCESS externalinteger my service number; !SERVICE NUMBER I RECIEVE MESSAGES ON externalinteger com36; !RESTART AREA externalinteger bottom of stack; !POINT TO WHICH STACK IS UNWOUND DURING DIAGNOSTICS externalinteger oper no; !OUTPUT MESSAGES TO THIS OPER externalstring (6) my name; !NAME OF PROCESS constinteger abasefile = 32<<SEG SHIFT; !ADDRESS OF BASEFILE constinteger max fsys = 99 constinteger jrnl = 0 constinteger max instructions = x'FFFFFFF' conststring (11) config file = "CFILE" !* !* !* stringfn errs(integer flag) integer i; string (63) error if TARGET = 2900 then result = derrs(flag) else START i = dflag(flag,error) result = error FINISH end if TARGET = 2900 start routine fill system calls(integer sctable, count) !*********************************************************************** !* * !* THIS ROUTINE FILLS IN THE SYSTEM CALL DESCRIPTORS IN THE BGLA * !* USING INFORMATION IN A TABLE AT SCTABLE. THE INFORMATION * !* CONSISTS OF AN I AND J VALUE FOR EACH OF THE DIRECTOR ROUTINES * !* WHICH CAN BE ACCESSED BY SYSTEM CALL. * !* THIS VERSION UPDATED 22.8.78 FOR NEW OBJECT FILE FORMAT. RRM. * !* * !*********************************************************************** recordformat tabf(string (31) name, integer i, j) record (tabf)arrayformat tablef(1 : count) record (tabf)arrayname table recordformat epreff(integer link, refloc, string (31) iden) record (epreff)name epref integer ld, loc, link, p, abgla abgla = abasefile+((integer(abasefile)+x'3FFFF')& c x'FFFC0000') !BASEGLA STARTS AT FIRST FREE SEG BEYOND BASEFILE table == array(sctable,tablef); !MAP ARRAY TABLE ONTO THE SYSTEM CALL TABLE ld = abasefile+integer(abasefile+24);!START OF BASE LOAD DATA link = integer(ld+28); !TOP OF EPREF LIST while link # 0 cycle epref == record(link+abasefile); !MAP EACH REF ONTO EPREF loc = (epref_refloc&x'FFFFFF')+abgla; !ADDRESS OF PLT DESCRIPTOR if integer(loc) = m'NORT' start cycle p = 1,1,count; !LOOK THROUGH SCTABLE if table(p)_name = epref_iden start integer(loc) = x'E3000000'!TABLE(P)_I !SYS CALL DESCRIPTOR integer(loc+4) = table(p)_j !SECOND WORD exit finish repeat finish link = epref_link repeat link = integer(ld+28) while link # 0 cycle ; !CHECK FOR ANY REFS NOT YET SATISFIED epref == record(link+abasefile) print string(epref_iden." NOT IN SYSTEM CALL TABLE".snl) c if integer((epref_refloc&x'FFFFFF')+abgla) = m'NORT' link = epref_link repeat end ; !OF FILL SYSTEM CALLS !* systemroutine ssinit(integer mark, adirinf) !********************************************************************** !* * !* THIS IS THE ROUTINE CALLED BY ASSEMBLER LOADER 'SSLD02' * !* IT JUST CALLS 'FILL SYSTEM CALLS' AND THEN CONTROL * !* * !********************************************************************** string (31) filename string (11) file string (6) user record (dirinff)name dirinf integer flag, queues, remotes, streams, qconad, rconad, sconad, stconad, cstreams, ftp table conad,qnconad,snconad,rnconad, link list conad *stln_flag bottom of stack = flag; !DIAGS GO NO FURTHER BACK THAN THIS ROUTINE dirinf == record(adirinf) myname = dirinf_user my fsys = dirinf_fsys my service number = dirinf_sync1 dest oper no = dirinf_start cnsl fill system calls(dirinf_INT COUNT,dirinf_I2) flag = prime contingency(on trap); !TO CATCH CONTINGENCIES print string("PRIME CONTINGENCY FAILS ".errs(flag).snl) c if flag # 0 define(1,64,".JOURNAL") filename = "" flag = dsfi(my name,my fsys,2,0,addr(filename)) print string("GET CONFIG FROM INDEX FAILS ".errs(flag).snl) c if flag # 0 unless filename -> user.(".").file start user = "" file = "" finish read spool config(user,myname,-1,myfsys,file,config file, queues,qconad,remotes,rconad,streams,sconad, qnconad,snconad,rnconad, link list conad) dresume(-2,0,0); !NOW ALLOW ASYNC INTS control(max fsys,queues,qconad,remotes,rconad,streams,sconad, qnconad,snconad,rnconad, link list conad) if qconad # 0 and sconad # 0 stop ; !IF A RETURN IS MADE end ; !OF SSINIT finish else start {NON 2900} externalroutine start !********************************************************************** !* * !* THIS IS THE ROUTINE CALLED BY DIRECTOR * !* * !********************************************************************** string (31) filename string (11) file string (6) user integerarray dsfiia(0:31) record (dirinff)name dirinf integer flag, queues, remotes, streams, qconad, rconad, sconad, stconad, cstreams, ftp table conad,qnconad,snconad,rnconad, link list conad *st_10,flag bottom of stack = flag dirinf == record(uinf seg << seg shift) myname = dirinf_user my fsys = dirinf_fsys my service number = dirinf_sync1 dest oper no = dirinf_start cnsl flag = Dprime contingency(on trap); !TO CATCH CONTINGENCIES print string("PRIME CONTINGENCY FAILS ".errs(flag).snl) c if flag # 0 define(1,64,".JOURNAL") filename = "" flag = dsfi(my name,my fsys,2,0,filename,dsfiia) print string("GET CONFIG FROM INDEX FAILS ".errs(flag).snl) c if flag # 0 unless filename -> user.(".").file start user = "" file = "" finish read spool config(user,myname,-1,myfsys,file,config file, queues,qconad,remotes,rconad,streams,sconad, qnconad,snconad,rnconad, link list conad) flag = dasyncinh(0); !NOW ALLOW ASYNC INTS control(max fsys,queues,qconad,remotes,rconad,streams,sconad, qnconad,snconad,rnconad, link list conad) if qconad # 0 and sconad # 0 stop ; !IF A RETURN IS MADE end ; !OF start finish {NON 2900} !* !* !* endoffile