!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