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  print log(integer  stream, q)
externalroutinespec  control(integer  lines, database conad, pointers addr)
externalroutinespec  read ft config( c 
   string  (6) iu, ou, integer  ifs, ofs,
   string  (11) if, of,integername  lines, database conad, pointers addr)
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, lines, database conad, pointers addr
   *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
   print log(1,jrnl)

   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 ft config(user,myname,-1,myfsys,file,config file, lines, database conad,pointers addr)
   dresume(-2,0,0);                     !NOW ALLOW ASYNC INTS
   control(lines, database conad,pointers addr)
   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, lines, database conad, pointers addr
   *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
   print log(1,jrnl)

   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 ft config(user,myname,-1,myfsys,file,config file, lines, database conad,pointers addr)
   flag = dasyncinh(0);                     !NOW ALLOW ASYNC INTS
   control(lines, database conad,pointers addr)
   stop ;                               !IF A RETURN IS MADE
end ;                                   !OF start

finish   {NON 2900}

!*
!*
!*
endoffile