!* THIS PROGRAM TAKEN FROM 4-75 TO 2970 ON 2/5/78 AND MODIFIED
!* TO USE NEW STANDARD DATA FILES THROUGH TEMOPORARY OMF SQ INTERFACE.
!!
!!
!!*******************************************************
!!*                                                     *
!!* THIS PROGRAM PACKAGES OMF OBJECTS PRODUCED ON EMAS  *
!!* ONTO 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*                     
!!
!!
ROUTINESPEC  WRITEBTAPE(STRING  (63) S)

EXTERNALROUTINE  WRITEKTAPE(STRING  (63) S)
   WRITEBTAPE(S)
END 

EXTERNALROUTINE  WRITEBTAPE(STRING  (63) DUMMY)
EXTERNALROUTINESPEC  OPENOMF(STRING  (32) S, INTEGER  CH, MODE)
EXTERNALROUTINESPEC  READOMF(INTEGER  CH, A, INTEGERNAME  L)
EXTERNALROUTINESPEC  CSOMF(STRING  (63) S)
EXTERNALROUTINESPEC  COPY(STRING  (63) S)
SYSTEMROUTINESPEC  ITOE(INTEGER  A, L)
EXTERNALROUTINESPEC  REWINDMT
EXTERNALROUTINESPEC  OPENMT(STRING  (7) S)
EXTERNALROUTINESPEC  UNLOADMT
EXTERNALROUTINESPEC  WRITEMT(INTEGER  START, LEN,  C 
      INTEGERNAME  FLAG)
EXTERNALROUTINESPEC  WRITETMMT(INTEGERNAME  FLAG)
RECORDFORMAT  INRFM(INTEGER  CONAD, FILESIZE, A,  C 
      STRING  (6) B, INTEGER  C, D, E, F)
SYSTEMROUTINESPEC  CONNECT(STRING  (32) S,  C 
      INTEGER  ACCESS, MAXBYTES, PROTECTION,  C 
      RECORDNAME  R, INTEGERNAME  J)
RECORD  IN(INRFM)
SYSTEMROUTINESPEC  MOVE(INTEGER  L, F, T)
EXTERNALSTRINGFNSPEC  TIME
EXTERNALSTRINGFNSPEC  DATE
EXTERNALROUTINESPEC  PROMPT(STRING  (15) S)

   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
   END 
STRING  (7) TAPE
STRING  (32) OFILE, INFILE, USER, BEFORE, AFTER, PDFILE
RECORDFORMAT  FHEADFMT(INTEGER  FILESIZE, LENGTH OF HEADER,  C 
      PHYSICALSIZE, FILETYPE, SUM CHECK, DATE AND TIME, OFFSET,  C 
      NUMPDMEMBERS)
RECORDNAME  FHEAD(FHEADFMT)
RECORDFORMAT  PDF(INTEGER  START, STRING  (11) NAME,  C 
      INTEGER  HOLE, S1, S2, S3)
RECORDARRAYFORMAT  APDF(1 : 10000)(PDF)
RECORDARRAYNAME  PD(PDF)
OWNBYTEINTEGERARRAY  VOL1(1 : 96) =         C 
0(3),0,0,96, C 
X'E5',X'D6',X'D3',X'F1',X'40'(75),X'F2',0(10)
OWNBYTEINTEGERARRAY  HDR1(1 : 96) =         C 
0(3),1,0,96,X'C8',X'C4',X'D9',X'F1', C 
X'40'(17),X'40'(6),X'F0'(3),X'F1',X'F0'(3),X'F1',X'F0'(3),X'F1', C 
X'F0'(2),X'40',X'F9',X'F8',X'F3',X'F5',X'F9', C 
X'40',X'F9',X'F9',X'F3',X'F5',X'F9',X'40',X'F0'(6), C 
X'40'(13),X'40'(7),0(10)
OWNBYTEINTEGERARRAY  HDR2(1 : 96) =         C 
0(3),2,0,96,X'C8',X'C4',X'D9',X'F2', C 
X'E5',X'F0',X'F4',X'F1'(2),X'F6',X'F0',X'F4',X'F1',X'F0'(2), C 
X'40'(35),X'F0',X'F8',X'40'(28),0(10)
OWNBYTEINTEGERARRAY  UHL1(1 : 96) =         C 
0(3),3,0,96,X'E4',X'C8',X'D3',X'F1',X'40'(4), C 
X'F7',X'F8',X'61',X'F1',X'F1',X'61',X'F2',X'F6', C 
X'40'(58),X'D6',X'D4',X'40'(4),0(10)
OWNBYTEINTEGERARRAY  EOF1(1 : 96) =         C 
0(4),0,96,X'C5',X'D6',X'C6',X'F1',X'40'(17), C 
X'40'(6),X'F0'(3),X'F1', C 
X'F0'(3),X'F1',X'F0'(3),X'F1',X'F0'(2), C 
X'40',X'F9',X'F8',X'F3',X'F5',X'F9',X'40', C 
X'F9',X'F9',X'F3',X'F5',X'F9', C 
X'40',X'F0'(6),X'40'(13),X'40'(7),0(10)
OWNBYTEINTEGERARRAY  EOF2(1 : 96) =         C 
0(4),0,96,X'C5',X'D6',X'C6',X'F2', C 
X'E5',X'F0',X'F4',X'F1',X'F1',X'F6',X'F0',X'F4',X'F1', C 
X'F0',X'F0',X'40'(35),X'F0',X'F8',X'40'(28), C 
0(10)
OWNBYTEINTEGERARRAY  UTL1(1 : 96) =        C 
0(4),0,96,X'E4',X'E3',X'D3',X'F1',X'40'(4), C 
X'F7',X'F6',X'61',X'F1',X'F1',X'61',X'F2',X'F6', C 
3,X'40'(40),X'40'(17),X'D6',X'D4',X'40'(4),0(10)
CONSTINTEGER  CHARACTER = 3
INTEGERFNSPEC  FILETYPE
BYTEINTEGERARRAY  BLOCK(0 : 4115)
INTEGER  BLOCKADDR, BLOCK COUNT, I, DATA BLOCKS
INTEGER  L
INTEGER  FLAG, DIGIT1, DIGIT2, DIGIT3
INTEGER  PDINDEX, LASTREC, J
!!
!!
   PRINTSTRING("
".DATE." ".TIME." VSN 2.2
")
   BLOCKADDR = ADDR(BLOCK(0))
   PROMPT('TAPE NAME:')
   READ LINE(TAPE)
   OPENMT(TAPE."*")
   PDINDEX = 0
!   REWINDMT
   BLOCK COUNT = 0
   STRING(ADDR(VOL1(10))) = TAPE
   VOL1(10) = X'F1'
   ITOE(ADDR(VOL1(11)),6)
   WRITEMT(ADDR(VOL1(1)),96,FLAG)
   -> ERRORV UNLESS  FLAG = 0
LOOP:

   IF  PDINDEX = 0 START 
      PROMPT('INPUT FILE:')
      READ LINE(INFILE)
      IF  INFILE = ".END" OR  INFILE = "STOP" THEN  -> LAST
      CONNECT(INFILE,0,0,0,IN,FLAG)
      IF  FLAG # 0 THEN  -> ERRORC
      FHEAD == RECORD(IN_CONAD)
      IF  FHEAD_FILETYPE = 6 START ;    ! PDFILE
         PDFILE = INFILE
         PD == ARRAY(FHEAD_OFFSET+IN_CONAD,APDF)
         PDINDEX = 1
      FINISH 
   FINISH 
   IF  PDINDEX # 0 START 
      INFILE = PDFILE."_".PD(PDINDEX)_NAME
      IF  PDINDEX = FHEAD_NUMPDMEMBERS THEN  PDINDEX = 0 C 
         ELSE  PDINDEX = PDINDEX+1
   FINISH 
   UNLESS  INFILE -> USER.(".").OFILE THEN  OFILE = INFILE
   IF  FILETYPE = CHARACTER START 
      COPY(INFILE.",T#SRCE")
      CSOMF("T#SRCE,T#SQSRCE")
      INFILE = "T#SQSRCE"
      UHL1(81) = X'40'
      UHL1(82) = X'40'
   FINISH  ELSE  START 
      UHL1(81) = X'D6';                 ! O
      UHL1(82) = X'D4';                 ! M
   FINISH 
   OPENOMF(INFILE,1,0)
   IF  OFILE -> BEFORE.("_").AFTER THEN  OFILE = AFTER
! FILL IN FILE NAME - USER IDENTIFIER
   CYCLE  I = 11,1,28
      HDR1(I) = X'40'
      EOF1(I) = X'40'
   REPEAT 
   STRING(ADDR(HDR1(10))) = OFILE
   HDR1(10) = X'F1'
   STRING(ADDR(EOF1(10))) = OFILE
   EOF1(10) = X'F1'
   ITOE(ADDR(HDR1(11)),LENGTH(OFILE))
   ITOE(ADDR(EOF1(11)),LENGTH(OFILE))
!!
   INTEGER(ADDR(HDR1(1))) = BLOCK COUNT+1
   WRITEMT(ADDR(HDR1(1)),96,FLAG)
   -> ERRORH UNLESS  FLAG = 0
   INTEGER(ADDR(HDR2(1))) = BLOCK COUNT+2
   WRITEMT(ADDR(HDR2(1)),96,FLAG)
   -> ERRORH UNLESS  FLAG = 0
   INTEGER(ADDR(UHL1(1))) = BLOCK COUNT+3
   WRITEMT(ADDR(UHL1(1)),96,FLAG)
   -> ERRORH UNLESS  FLAG = 0
   WRITETMMT(FLAG);                     ! TM
   -> ERRORTM UNLESS  FLAG = 0
   BLOCK COUNT = BLOCK COUNT+4
   DATA BLOCKS = 0
!!
!!
!!
   CYCLE 
      BLOCK COUNT = BLOCK COUNT+1
      CYCLE  I = 0,1,4115
         BLOCK(I) = 0
      REPEAT 
      INTEGER(BLOCKADDR) = BLOCK COUNT
      IF  INFILE = "T#SQSRCE" START 
         I = 12
         CYCLE 
            READOMF(1,ADDR(BLOCK(I)),L)
            ITOE(ADDR(BLOCK(I)),L)
            IF  L = 0 THEN  -> EOB
            LASTREC = I-10
            J = L+4
            MOVE(2,ADDR(J)+2,ADDR(BLOCK(I-4)))
            BLOCK(I-2) = 0
            BLOCK(I-1) = 0
            I = I+L+4
            IF  I+200 > 4115 THEN  -> EOB
         REPEAT 
      FINISH  ELSE  START 
         READOMF(1,ADDR(BLOCK(12)),L)
         -> EOF IF  L = 0
         LASTREC = 2
         INTEGER(BLOCKADDR+8) = (L+4)<<16
                                        ! + 1 WORD FOR RCW -BLOCK(3) ITSELF
      FINISH 
EOB:  INTEGER(BLOCKADDR+4) = X'10140000'!LASTREC
      WRITEMT(BLOCKADDR,4116,FLAG)
      -> ERRORB UNLESS  FLAG = 0
      DATA BLOCKS = DATA BLOCKS+1
      -> EOF IF  L = 0
   REPEAT 
EOF:

   WRITETMMT(FLAG);                     ! TM
   -> ERRORTM UNLESS  FLAG = 0
   DIGIT1 = DATA BLOCKS//100
   DIGIT2 = (DATA BLOCKS-DIGIT1*100)//10
   DIGIT3 = DATA BLOCKS-(DIGIT1*100+DIGIT2*10)
   EOF1(64) = DIGIT1+X'F0'
   EOF1(65) = DIGIT2+X'F0'
   EOF1(66) = DIGIT3+X'F0'
   INTEGER(ADDR(EOF1(1))) = BLOCK COUNT+1
   WRITEMT(ADDR(EOF1(1)),96,FLAG)
   -> ERRORH UNLESS  FLAG = 0
   INTEGER(ADDR(EOF2(1))) = BLOCK COUNT+2
   WRITEMT(ADDR(EOF2(1)),96,FLAG)
   -> ERRORH UNLESS  FLAG = 0
   INTEGER(ADDR(UTL1(1))) = BLOCK COUNT+3
   WRITEMT(ADDR(UTL1(1)),96,FLAG)
   -> ERRORH UNLESS  FLAG = 0
   WRITETMMT(FLAG);                     ! TM
   -> ERRORTM UNLESS  FLAG = 0
   BLOCK COUNT = BLOCK COUNT+4
   NEWLINE
   WRITE(DATA BLOCKS,1)
   PRINTSTRING(" BLOCKS WRITTEN TO TAPE
AS ".OFILE." ")
   IF  INFILE = "T#SQSRCE" THEN  PRINTSTRING(" (SOURCE)
") C 
      ELSE  NEWLINE
   -> LOOP
LAST:

   WRITETMMT(FLAG);                     ! TM
   -> ERRORTM UNLESS  FLAG = 0
   UNLOADMT
   STOP 
ERRORV:

   PRINTSTRING('
ERROR WHILE WRITING VOL LABEL
')
   UNLOADMT
   STOP 
ERRORH:

   PRINTSTRING('
ERROR WHILE WRITING HEADER LABEL
')
   UNLOADMT
   STOP 
ERRORB:

   PRINTSTRING('
ERROR WHILE WRITING BLOCK')
   WRITE(BLOCK COUNT+1,1)
   NEWLINE
   UNLOADMT
   STOP 
ERRORTM:

   PRINTSTRING('
ERROR WHILE WRITING TM
')
   UNLOADMT
   STOP 
ERRORC:

   PRINTSTRING("
CANNOT CONNECT ".INFILE." FLAG= ")
   WRITE(FLAG,1)
   UNLOADMT
   NEWLINES(2)
   STOP 
!!
!!!

   INTEGERFN  FILETYPE
   INTEGER  FLAG
   RECORD  IN(INRFM)
      CONNECT(INFILE,0,0,0,IN,FLAG)
      IF  FLAG # 0 START 
         PRINTSTRING("
CANNOT CONNECT ".INFILE." FLAG =")
         WRITE(FLAG,1)
         UNLOADMT
         STOP 
      FINISH 
      RESULT  = INTEGER(IN_CONAD+12)
   END 
END 
ENDOFFILE