recordformatspec  dict cell fm
recordformat  dict fm -
  (record (dict fm)name  alt,record (dict cell fm)name  tree)
recordformat  dict cell fm -
  (record (dict cell fm)name  parent,left,right,
   integer  token,string (255)s)

recordformat  event fm -
  (byte  event,sub, half  line,
   integer  extra,string (255-32)message,
   integer  pc,integerarray  display(1:7),
   integerarray  r(0:15))

recordformat  scb fm -
  (integer  p,l,bs,bl,fs,fl,fastpc,gla,serpc,mode,
   record (scb fm)name  next,record (*)name  acb,
   integer  a,b,c,d,string (255)filename)

!File connection record.
!Keeps track of pre-loaded files (tentative)

recordformat  fcr fm -
  (record (fcr fm)name  next,integer  start,size,half  count,flags)

recordformat  trap fm (record (trap fm)name  next,integer  pc,gla,spare)

!Heap cells look like this when they're holes.  When they're used,
!they look like (%byte level %or %integer size, <user portion>).

recordformat  heap cell fm -
  (byte  level or  integer  size,
   record (heap cell fm)name  forward,backward)
recordformat  heap header fm -
  (byte  level or  integer  size,
   record (heap cell fm)name  holes,integer  front,limit,end)

!FE02 Object file header.

recordformat  fe02 header fm -
  (half  tyver,flags,export,import,integer  codesize,half  reset,main,
   integer  ownsize,stackreq,short  dlim,charlim,spare1,spare2)

!FE02 External object descriptor.

recordformat  fe02 object fm -
  (half  flags,extra,integer  type,offset,string (255)name)

!FE02 indirector (GLA entry).
!For data object it's just a 4-byte pointer.
!For %system procedures it's a 6-byte JMP.
!For %external procedures it's a 12-byte {Move.l #??,A4; Jmp ??}.
!For %dynamics it's also 12 bytes, which are like %externals after
!the first call, but initially different.

recordformat  fe02 indir fm -
  (integer  address or  -
   half  op1, integer  opd1, half  op2,integer  opd2)

!(Loader's) Module activation record.
!Keeps track, within the current program activation, of which
!modules are loaded, and where their respective GLAs are.

recordformat  mar fm -
  (record (mar fm)name  next,record (fe02 header fm)name  header,integer  gla)
  
!(Loader's) Loaded external object.
!Keeps track, within the current program activation, of which
!external objects are loaded, where their FE02 descriptors are,
!what module they're in, and where the objects themselves are.

recordformat  leo fm -
  (record (leo fm)name  left,right,
   record (fe02 object fm)name  object,
   record (mar fm)name  module,integer  address)

!(Loader's) Program activation record.
!Contains a link to the next (more global) program activation record
!in the same process, and the roots for the list of module activation
!records and the tree of object activatiuons records.

recordformat  par fm -
  (record (par fm)name  next,
   record (mar fm)name  modules,record (leo fm)name  objects)

!(Loader's) Undischarged dynamic reference record.
!Contains (a path to) all the information needed by the loader
!to satisfy a dynamic procedure reference.

recordformat  dyn fm {undischarged dynamic reference} -
  (record (fe02 object fm)name  object,record (par fm)name  program)

!Layout of a Process-Own-Area.

recordformat  poa fm(bytearray  b(1:1024) or -
  record (trap fm)name  trap or -
  integer  evlink,integerarray  display(1:7),
  byte  event,eventsub,short  eventline,integer  eventextra,
  string (255-32)eventmessage,
  integer  eventpc,integerarray  eventdisplay(1:7),
  integerarray  eventr(0:15),
  integer  scratch1,scratch2,excepth,
  record (par fm)name  topprog,
  (record (heap header fm)name  heap or  integer  heapbase,stacklim),
  record (scb fm)name  curin,curout,integer  instream,outstream,
  record (scb fm)namearray  in,out(0:7),string (255)cliparam,
  record (dict fm)name  masterdict,extdict,moddict,logdict,fildict,comdict,
  integer  membot,memtop)

systemroutinespec  connectfile(string (255)file,integer  mode,
   integername  start,size)

systemroutinespec  resetinput
systemroutinespec  resetoutput
systemintegerfnspec  instream
systemintegerfnspec  outstream
systemstring (255)fnspec  cliparam
systempredicatespec  split(string (255)name  s,l,r)

systemroutinespec  heapput(integer  x)
systemroutinespec  mark
systemroutinespec  release

systemroutinespec  preconnect(string (255)file,integer  start,size)
systemroutinespec  install(record (fe02 header fm)name  h,string (255)file)
systemroutinespec  preload(String (255) file)

externalroutinespec  run process (string (255) file,
                                  Integer  space,priority)

systemintegerfnspec  makeentry(string (255)name,record (dict fm)name  dict)
systemintegerfnspec  findentry(string (255)name,record (dict fm)name  dict)
systemstring (255)fnspec  translateentry(integer  t)
systemroutinespec  deleteentry(integer  t,record (dict fm)name  d)
systemintegerfnspec  firstentry(record (dict fm)name  d)
systemintegerfnspec  nextentry(integer  t)
systemrecord (dict fm)mapspec  create dict(string (255)s)
systemrecord (dict fm)mapspec  find dict(string (255)s)

systemrecord (scb fm)mapspec  new scb(string (*)name  s)
systemrecord (scb fm)mapspec  open(integer  mode,string (255)filename)

systemroutinespec  toupper(string (*)name  s)
systemstring (*)mapspec  newstring(string (255)s)
systempredicatespec  dynamicload(string (255)s,integername  pc,gla)

systemroutinespec  prompt(string (255)s)

systemroutinespec  createlogicalname(string (255)log,equiv)
systemroutinespec  deletelogicalname(string (255)s)
systempredicatespec  translatelogicalname(string (*)name  s)

constinteger  inputmode=0,outputmode=1,appendmode=2,modifymode=3

constinteger  {function codes for IO service} -
  ser closin = 0,
  ser closout = 1,
  ser setin = 2,
  ser setout = 3,
  ser prompt = 4,
  ser dropout = 5,
  ser refresh = 6,
  ser flush = 7

@0(a5) record (poa fm)poa