!! BROUGHT FROM 475 AND MODIFIED FOR 2970 - 9/5/78
!!
! ALAN ANDERSON 3/10/77
!!
!!*******************************************************
!!*                                                     *
!!* THIS PROGRAM READS OMF OBJECTS  INTO EMAS  *
!!* FROM A TAPE IN MAGNETIC MEDIA ENGINEERING FORMAT.   *
!!*                                                     *
!!*************************************************
!!
!! TAPE FORMAT IS:
!!     <--------------FILE 1------------------->                       
!! *V* *H* *H* *U*    *D*  *D*    *E* *E* *U*               
!! *O* *D* *D* *H* TM *A*->*A* TM *O* *O* *T* TM < FILE2 >< FILEN > TM
!! *L* *R* *R* *L*    *T*  *T*    *F* *F* *L*                          
!! *1* *1* *2* *1*    *A*  *A*    *1* *2* *1*                     
!!
!!

EXTERNALROUTINE  READBTAPE(STRING  (63) S)
EXTERNALSTRINGFNSPEC  UINFS(INTEGER  ENTRY)
EXTERNALINTEGERFNSPEC  DSFI(STRING (6) USER, INTEGER  FSYS, C 
TYPE, SET,ADR)
EXTERNALROUTINESPEC  OPENOMF(STRING  (32) S, INTEGER  N, MODE)
EXTERNALROUTINESPEC  WRITEOMF(INTEGER  N, A, L)
EXTERNALROUTINESPEC  CLOSEOMF(INTEGER  CH)
EXTERNALROUTINESPEC  OPENMT(STRING  (6) TAPE)
EXTERNALROUTINESPEC  READMT(INTEGER  AD, INTEGERNAME  L, FLAG)
EXTERNALROUTINESPEC  SKIPMT(INTEGER  N)
EXTERNALROUTINESPEC  SKIPTMMT(INTEGER  N)
EXTERNALROUTINESPEC  REWINDMT
EXTERNALROUTINESPEC  UNLOADMT
SYSTEMINTEGERMAPSPEC  COMREG(INTEGER  N)
EXTERNALROUTINESPEC  NEWPDFILE(STRING  (63) S)
EXTERNALROUTINESPEC  CS(STRING  (63) S)
SYSTEMROUTINESPEC  OUTFILE(STRING  (32) S,  C 
      INTEGER  L, M, P, INTEGERNAME  C, F)
SYSTEMROUTINESPEC  CONNECT(STRING  (32) S,  C 
      INTEGER  ACCESS, MAXBYTES, PROTECTION,  C 
      RECORDNAME  R, INTEGERNAME  FLAG)
RECORDFORMAT  INRFM(INTEGER  CONAD, FILESIZE, B,  C 
      STRING  (6) C, INTEGER  D, F, G, H)
RECORD  IN(INRFM)
EXTERNALROUTINESPEC  DESTROY(STRING  (63) S)
EXTERNALROUTINESPEC  COPY(STRING  (63) S)
EXTERNALROUTINESPEC  PROMPT(STRING  (17) S)
SYSTEMROUTINESPEC  ETOI(INTEGER  A, L)
EXTERNALSTRINGFNSPEC  DATE
EXTERNALSTRINGFNSPEC  TIME
BYTEINTEGERARRAY  B(0 : 4115)
CONSTINTEGER  EIGHTSEG=X'200000'
CONSTINTEGER  TM = 1
STRING  (8) TAPE
INTEGER  PDMAXINDEX, PDINDEX, C26, CONAD
STRING  (56) REST
STRING  (1) SRCCONV
STRING  (32) FILE, SEARCHFILE, PDFILE, TAPEFILE, WFILE
INTEGER  K
INTEGER  FLAG, NUMFILES, LEN, CDISP, LASTDISP, RLEN, I
INTEGER  TENS
INTEGER  MAXFSIZE
STRING (6) USER
CONSTINTEGER  SEG=X'40000'
CONSTINTEGER  WSIZE = X'100000'
CONSTINTEGERARRAY  POWER(0 : 4) =             C 
 1,10,100,1000,10000
!!
ROUTINE  WINDUP
!!
NEWLINE
IF  PDFILE#"" THEN  DESTROY("OMF#TEMP")
IF  SRCCONV="Y" THEN  DESTROY("OMF#TEMP2")
UNLOADMT
STOP 
END 
!!

   ROUTINE  READLINE(STRING  (255) NAME  LINE)
      WHILE  NEXTSYMBOL = NL THEN  SKIPSYMBOL;    ! SKIP BLANK LINES
      LINE = ""
      WHILE  NEXTSYMBOL # NL THEN  LENGTH(LINE) = LENGTH(LINE)+ C 
         1 AND  BYTEINTEGER(ADDR(LINE)+LENGTH(LINE)) =  C 
         NEXTSYMBOL AND  SKIPSYMBOL
      SKIPSYMBOL
       IF  LINE=".END" OR  LINE="STOP" THEN  WINDUP
   END 
!!
!!
USER=UINFS(1)
FLAG=DSFI(USER,-1,12,0,ADDR(MAXFSIZE))
MAXFSIZE=MAXFSIZE*1024
   C26 = COMREG(26)
   SEARCHFILE = ""
   PDFILE = ""
   SRCCONV = "N"
   PDINDEX = 1
   NUMFILES = 1
   PRINTSTRING("
".DATE." ".TIME." VSN 7
")
!!
   IF  S -> TAPE.(",").REST START 
      UNLESS  REST -> SEARCHFILE.(",").PDFILE C 
         THEN  SEARCHFILE = REST
      IF  PDFILE = "" THEN  PRINTSTRING("
SEARCHING ".TAPE. C 
         " FOR FILE ".SEARCHFILE."
")
   FINISH  ELSE  TAPE = S
   IF  PDFILE # "" START 
! CONNECT OR CREATE PDFILE
      CONNECT(PDFILE,0,0,0,IN,FLAG)
      IF  FLAG # 0 START 
         IF  FLAG = 152 OR  FLAG = 218 C 
            THEN  NEWPDFILE(PDFILE) ELSE  -> ERRORC
      FINISH 
      OUTFILE("OMF#TEMP",SEG,MAXFSIZE,0,CONAD,FLAG)
      IF  FLAG # 0 THEN  -> ERRORW
      WFILE = "OMF#TEMP"
IF  SEARCHFILE="" THENC 
      PRINTSTRING("
FILLING PDFILE ".PDFILE." FROM ".TAPE."
")
      PRINTSTRING("
ARE FILES TO BE SOURCE CONVERTED? 
")
      PROMPT("Y/N:")
      READLINE(SRCCONV)
      IF  SRCCONV = "Y" START 
         WFILE = "OMF#TEMP2"
         OUTFILE(WFILE,SEG,MAXFSIZE,0,CONAD,FLAG)
         IF  FLAG # 0 THEN  -> ERRORW
      FINISH 
      PRINTSTRING("
GIVE MAXIMUM NUMBER OF FILES TO BE READ INTO PDFILE
")
      PROMPT("DATA:")
      READLINE(REST)
!!
      PDMAXINDEX = 0
      I = 0
      WHILE  I < LENGTH(REST) THEN  CYCLE 
         TENS = POWER(LENGTH(REST)-(I+1))
         PDMAXINDEX = PDMAXINDEX+((BYTEINTEGER(ADDR(REST)+I+1)- C 
            '0')*TENS)
         I = I+1
      REPEAT 
      NEWLINE
      WRITE(PDMAXINDEX,1)
      NEWLINE
FINISH 
!!
   OPENMT(TAPE)
!    REWINDMT
   SKIPMT(1);                           ! GET PAST LABEL
   CYCLE ;                              ! THROUGH FILES
NEXTF:
      LEN = 96;                         ! MAX LEN 
      READMT(ADDR(B(0)),LEN,FLAG);      ! HDR1
      IF  FLAG = TM THEN  START 
         PRINTSTRING("
TAPE ENDS
")
         WINDUP
      FINISH 
      -> ERRORR UNLESS  FLAG = 0
      -> ERRORF UNLESS  B(6) = X'C8' AND  B(7) = X'C4' C 
         AND  B(8) = X'D9' AND  B(9) = X'F1'
      IF  SEARCHFILE = "" AND  PDFILE = "" START 
         PRINTSTRING("
FILE")
         WRITE(NUMFILES,1)
      FINISH 
      NUMFILES = NUMFILES+1
      ETOI(ADDR(B(10)),10);             ! FILE NAME
      B(9) = 10
      TAPEFILE = STRING(ADDR(B(9)))
WHILE  BYTEINTEGER(ADDR(TAPEFILE) C 
+LENGTH(TAPEFILE))=X'20' THENC 
LENGTH(TAPEFILE)=LENGTH(TAPEFILE)-1
      IF  SEARCHFILE # "" START 
         IF  SEARCHFILE = TAPEFILE START 
            PRINTSTRING("
".SEARCHFILE." FOUND AT LABEL ")
            WRITE(NUMFILES,1)
            NEWLINE
IF  PDFILE#"" START 
PRINTSTRING("
FILLING".PDFILE." FROM ".TAPE." LABEL ")
WRITE(NUMFILES,1)
NEWLINE
SEARCHFILE=""
FINISH 
         FINISH  ELSE  START 
            SKIPTMMT(3)
            -> NEXTF
         FINISH 
      FINISH 
      IF  PDFILE = SEARCHFILE = "" C 
         THEN  PRINTSTRING(" ".TAPEFILE."
")
     ! GET PAST HDR2,UHL , TM
CYCLE  K=1,1,3
READMT(ADDR(B(0)),LEN,FLAG)
IF  FLAG=TM AND  K<3 THEN  ->ERRORF
REPEAT 
->ERRORF UNLESS  FLAG=TM
!!
      LEN = 96;                         ! MAX LEN
      IF  PDFILE = "" START 
         PROMPT("EMASFILENAME:")
         READLINE(FILE)
         IF  FILE = "NO"  THEN  WINDUP
      FINISH  ELSE  FILE = "OMF#TEMP"
      IF  FILE = "R" THEN  SKIPTMMT(2) AND  -> NEXTF
      OPENOMF(FILE,1,1)
      CYCLE  I = 1,1,10000;             ! THROUGH DATA BLOCKS
         LEN = 4116;                    ! MAX LEN
         READMT(ADDR(B(0)),LEN,FLAG)
         EXIT  IF  FLAG = TM
         -> ERRORR UNLESS  FLAG = 0
         LASTDISP = B(6)<<8+B(7)+6
         CDISP = 8
         UNTIL  CDISP > LASTDISP THEN  CYCLE 
            RLEN = B(CDISP)<<8+B(CDISP+1)
            WRITEOMF(1,ADDR(B(CDISP+4)),RLEN-4)
            CDISP = CDISP+RLEN
         REPEAT 
      REPEAT 
     CLOSEOMF(1)
      IF  SRCCONV = "Y" THEN  CS(FILE.",OMF#TEMP2")
      IF  PDFILE # "" AND  C26 # 0 START 
         NEWLINE
         IF  PDFILE # "" THEN  PRINTSTRING(TAPEFILE)
         WRITE(I-1,1)
         PRINTSTRING("  BLOCK")
         IF  I-1 > 1 THEN  PRINTSTRING("S")
         PRINTSTRING(" READ ")
         NEWLINE
      FINISH 
      IF  PDFILE # "" THEN  COPY(WFILE.",".PDFILE."_".TAPEFILE)
      SKIPTMMT(1);                      ! PAST TRAILERS TO NEXT FILE
      IF  PDFILE # "" START 
         PDINDEX = PDINDEX+1
         IF  PDINDEX >= PDMAXINDEX START 
            PDINDEX = 0
            PROMPT("NEXTPDFILE:")
            READLINE(PDFILE)
! CONNECT OR CREATE PDFILE
            CONNECT(PDFILE,0,0,0,IN,FLAG)
            IF  FLAG # 0 START 
               IF  FLAG = 152 OR  FLAG = 218 C 
                  THEN  NEWPDFILE(PDFILE) ELSE  -> ERRORC
            FINISH 
            PRINTSTRING("
FILLING ".PDFILE." FROM ".TAPE. C 
               " LABEL ")
            WRITE(NUMFILES+1,1)
            NEWLINE
      PRINTSTRING("
GIVE MAXIMUM NUMBER OF FILES TO BE READ INTO PDFILE
")
      PROMPT("DATA:")
      READLINE(REST)
!!
      PDMAXINDEX = 0
      I = 0
      WHILE  I < LENGTH(REST) THEN  CYCLE 
         TENS = POWER(LENGTH(REST)-(I+1))
         PDMAXINDEX = PDMAXINDEX+((BYTEINTEGER(ADDR(REST)+I+1)- C 
            '0')*TENS)
         I = I+1
      REPEAT 
      NEWLINE
      WRITE(PDMAXINDEX,1)
      NEWLINE
         FINISH 
      FINISH 
   REPEAT 
   WINDUP
ERRORF:

   PRINTSTRING("
TAPE FORMAT ERROR ")
PRINTSTRING("{
ARE YOU SURE THAT THIS TAPE IS IN BARCHIVE FORMAT?
")
   WINDUP
ERRORC:

   PRINTSTRING("
CANNOT CONNECT PDFILE ".PDFILE." ")
   WRITE(FLAG,1)
   NEWLINE
   WINDUP
ERRORW:

   PRINTSTRING("
CANNOT CREATE WORKFILE ")
   WRITE(FLAG,1)
   NEWLINE
   WINDUP
ERRORR:

   PRINTSTRING("
READMT FAILS /")
   WRITE(FLAG,1)
   WINDUP
END 
ENDOFFILE