BEGIN 
EXTERNALROUTINESPEC  OPENSQ(INTEGER  I)
EXTERNALROUTINESPEC  WRITESQ(INTEGER  CH,NAME  A,B)
EXTERNALROUTINESPEC  CLOSESQ(INTEGER  CH)
EXTERNALROUTINESPEC  READSQ(INTEGER  I,NAME  S,F)
!TEST* ; %EXTERNALROUTINESPEC REWINDMT
!TEST* ; %EXTERNALROUTINESPEC OPENMT(%STRING (7) S)
SYSTEMROUTINESPEC  ITOE(INTEGER  START, FINISH)
!TEST* ; %EXTERNALROUTINESPEC UNLOADMT
!TEST* ; %EXTERNALROUTINESPEC WRITEMT(%INTEGER START, LEN,  %C
     INTEGERNAME  FLAG)
!TEST* ; %EXTERNALROUTINESPEC WREOFMT(%INTEGERNAME FLAG)
EXTERNALROUTINESPEC  DEFINE(STRING  (63) S)
SYSTEMROUTINESPEC  OUTFILE(STRING  (15) S,  C 
      INTEGER  LENGTH, MAXBYTES, PROTECTION,  C 
      INTEGERNAME  CONAD, FLAG)
ROUTINESPEC  READIN(INTEGER  SIZE)
ROUTINESPEC  OUT6K
SYSTEMROUTINESPEC  MOVE(INTEGER  L,F,T)
EXTERNALROUTINESPEC  PROMPT(STRING  (15) S)

   ROUTINE  READLINE(STRING  (255) NAME  LINE)
      WHILE  NEXTSYMBOL = NL THEN  SKIPSYMBOL;    ! SKIP BLANK LINES
      LINE = ''
      WHILE  NEXTSYMBOL # NL C 
         THEN  LINE = LINE.NEXTITEM AND  SKIPSYMBOL
      SKIPSYMBOL
   END 
!EXTRA*  %ROUTINE OPENMT(%STRING(7) S)
!EXTRA*  DEFINE('SQ2,T,,F2048')
!EXTRA*  OPENSQ(2)
!EXTRA*  
!EXTRA*  %END
!EXTRA*  %ROUTINE UNLOADMT
!EXTRA*  %END
!EXTRA*  %ROUTINE WRITEMT(%INTEGER START,LEN,%INTEGERNAME FLAG)
!EXTRA*  WRITESQ(2,INTEGER(START),INTEGER(START+LEN))
!EXTRA*  FLAG=0
!EXTRA*  %END
!EXTRA*  %ROUTINE REWINDMT
!EXTRA*  %END
!EXTRA*  %ROUTINE WREOFMT(%INTEGERNAME FLAG)
!EXTRA*  FLAG=0
!EXTRA*  %END
STRING  (7) TAPE, ANS
STRING  (15) OFILE, INFILE, USER
OWNBYTEINTEGERARRAY  VOL1(1 : 80) =  C 
X'E5',X'D6',X'D3',X'F1',X'40'(75),2
OWNBYTEINTEGERARRAY  HDR1(1 : 80) =  C 
X'C8',X'C4',X'D9',X'F1',X'F0'(3),
                                X'F1',X'40'(19),X'F0'(7),X'F1',
                                X'F0'(6),X'40',X'F0'(5),X'40',
X'F0'(5),X'40',1,
                                X'F0'(3),X'40'(22)
OWNBYTEINTEGERARRAY  HDR2(1 : 80) =  C 
X'C8',X'C4',X'D9',X'F2',X'C6',
                                X'F0',X'F6',X'F2',X'F4',X'F0',X'F0',
                                X'F2',X'F0',X'F4',X'F8',X'40'(35),
                                X'F0'(2),X'40'(28)
OWNBYTEINTEGERARRAY  HDR3(1 : 80) =  C 
X'C8',X'C4',X'D9',X'F3',0(3),X'48',
                                 X'80'(4),0(3),1,X'80'(16),0(3),2,
                                 X'40'(24),0(3),1,0(3),1,X'40'(12)
OWNBYTEINTEGERARRAY  HDR4(1 : 80) =  C 
X'C8',X'C4',X'D9',X'F4',0(3),X'48',
                                X'40'(4),X'80'(32),X'E8',X'40'(3),X'E8',
                                X'40'(3),X'E8',X'40'(3),X'E8',X'40'(3),
                                X'E8',X'40'(3),X'E8',X'40'(3),0,3,0,
                                X'00',0(3),2,X'80'(4)
OWNBYTEINTEGERARRAY  HDR5(1 : 80) =  C 
X'C8',X'C4',X'D9',X'F5',0(3),X'34',
                                X'80'(44),1(2),0(2),X'80'(4),X'E8',
                                X'40'(3),X'E8',X'40'(3),0,3,0,0,
                                0(3),2,X'80'(4)
OWNBYTEINTEGERARRAY  EOF1(1 : 80) =  C 
X'C8',X'C4',X'D9',X'F1',X'F0'(3),
                                X'F1',X'40'(19),X'F0'(7),X'F1',
                                X'F0'(12),X'40',X'F0'(5),X'40',X'20',
                                X'F0'(3),X'40'(22)
OWNBYTEINTEGERARRAY  EOF2(1 : 80) =  C 
X'C8',X'C4',X'D9',X'F2',X'C6',
                                X'F0',X'F6',X'F2',X'F4',X'F0',X'F0',
                                X'F2',X'F0',X'F4',X'F8',X'40'(35),
                                X'F0'(2),X'40'(28)
INTEGERARRAY  BLOCK(0 : 1600)
INTEGER  BLOCKADDR, BLOCK COUNT, CONTENT, I
   BLOCKADDR = ADDR(BLOCK(1))
INTEGER  FLAG, DIGIT1, DIGIT2, DIGIT3
INTEGERARRAY  BK(1 : 256);              ! BODY KEYS RECORD - UP TO 60 INITIALISED CMNS
BYTEINTEGERARRAYNAME  W
BYTEINTEGERARRAYFORMAT  WFM(1 : X'40000')
INTEGER  BKL, PRL
INTEGER  OUTP;                          ! POINTER INTO 6K BLOCK OUTPUT BUFFER(WORDS)
INTEGER  BKP;                           ! POINTER INTO BODY KEYS( WORDS) 
INTEGER  WP;                            ! WORK FILE POINTER ( BYTE ) 
INTEGER  BLOCKDATA;                     ! BLOCKING INFO
INTEGER  LEFT;                          ! BYTES LEFT IN AREA
INTEGER  SLB;                           ! SPACE LEFT IN 2K BLOCK
INTEGER  WORKCONAD
!!
!!
   OUTFILE('SS#KT',X'40000',0,0,WORKCONAD,FLAG)
   IF  FLAG # 0 START 
      PRINTSTRING('
CREATE WORKFILE FAILS
')
      WRITE(FLAG,1)
      STOP 
   FINISH 
   W == ARRAY(WORKCONAD,WFM)
!!
   PROMPT('TAPE LABEL:')
   READ LINE(TAPE)
   OPENMT(TAPE)
   PROMPT('RELABEL:')
   READ LINE(ANS)
   IF  ANS = 'Y' OR  ANS = 'YES' START 
      PROMPT('NEW LABEL:')
      READ LINE(TAPE)
      REWINDMT
      STRING(ADDR(VOL1(4))) = TAPE
      VOL1(4) = X'F1'
      ITOE(ADDR(VOL1(5)),6)
      WRITEMT(ADDR(VOL1(1)),80,FLAG)
      -> ERRORV UNLESS  FLAG = 0
   FINISH 
   PROMPT('INPUT FILE:')
   READ LINE(INFILE)
   DEFINE('SQ1,'.INFILE)
   OPENSQ(1)
   PROMPT('K USER:')
   READ LINE(USER)
   PROMPT('OUTPUT FILE:')
   READ LINE(OFILE)
   STRING(ADDR(HDR3(44))) = OFILE
   HDR3(44) = X'40'
   STRING(ADDR(HDR3(36))) = USER
   HDR3(36) = 2
   ITOE(ADDR(HDR3(37)),LENGTH(USER))
   ITOE(ADDR(HDR3(45)),LENGTH(OFILE))
! MAY REQUIRE AN INDEX FILENAME AT HDR3(69).
   WRITEMT(ADDR(HDR1(1)),80,FLAG)
   -> ERRORH UNLESS  FLAG = 0
   WRITEMT(ADDR(HDR2(1)),80,FLAG)
   -> ERRORH UNLESS  FLAG = 0
   WRITEMT(ADDR(HDR3(1)),80,FLAG)
   -> ERRORH UNLESS  FLAG = 0
   WRITEMT(ADDR(HDR4(1)),80,FLAG)
   -> ERRORH UNLESS  FLAG = 0
   WRITEMT(ADDR(HDR5(1)),80,FLAG)
   -> ERRORH UNLESS  FLAG = 0
WREOFMT(FLAG)   ;! TM
->ERRORTM UNLESS  FLAG=0
!!
!! READ IN BODY KEYS RECORD
!!
   READSQ(1,BK(1),BK(256))
   BKL = BK(1)//4
   PRL = BK(2)
!!
   BLOCK COUNT=0
CYCLE  I=0,1,1600
BLOCK(I)=0
REPEAT 
     OUTP=1
   CYCLE  BKP = 1,3,BKL-2;              ! AREAS
UNLESS  BKP=1 THEN  LEFT=BK(BKP+2) AND  SLB=X'7F0' C 
ELSE  LEFT=PRL AND  SLB=X'7FC'
      READIN(LEFT);                     ! COPY NEXT AREA INTO WORK FILE
      WP = 1
      BLOCKDATA = X'80'
      CYCLE ;                           ! BLOCK OUT AREA IN 2K CHUNKS
UNLESS  BKP=1 START     ;! NOT PROPERTIES RECORD
BLOCK(OUTP)=(4<<24)!12
BLOCK(OUTP+1)=BK(BKP)     ;! IIN
BLOCK(OUTP+2)=0    ;! DISPLACEMENT
OUTP=OUTP+3
FINISH 
IF  LEFT<=SLB START      ;! LAST OR ONLY
            IF  BLOCKDATA # X'80' THEN  BLOCKDATA = X'82' C 
               ELSE  BLOCKDATA = X'80'
            BLOCK(OUTP) = (BLOCKDATA<<24)!(LEFT+4)
            MOVE(LEFT,ADDR(W(WP)),ADDR(BLOCK(OUTP+1)))
IF  OUTP<512 THEN  OUTP=513 ELSE  START 
IF  OUTP <1024 THEN  OUTP=1025 ELSE  OUTP=1536
FINISH 
      IF  OUTP=1536 THEN  OUT6K 
EXIT 
         FINISH 
         IF  BLOCKDATA = X'81' THEN  BLOCKDATA = X'83';   ! START -> CONTINUE
         IF  BLOCKDATA = X'80' THEN  BLOCKDATA = X'81';   ! START
         BLOCK(OUTP) = (BLOCKDATA<<24)!(SLB+4)
         MOVE(SLB,ADDR(W(WP)),ADDR(BLOCK(OUTP+1)))
IF  OUTP<512 THEN  OUTP=513 ELSE  START 
IF  OUTP<1024 THEN  OUTP=1025 ELSE  OUTP=1536
FINISH 
         LEFT = LEFT-SLB
         WP = WP+SLB
IF  BKP=1 THEN  SLB=X'7FC' ELSE  SLB=X'7F0'
         IF  OUTP = 1536 THEN  OUT6K
      REPEAT 
   REPEAT 
BLOCK(OUTP)=X'88000004'   ;! MODULE TERMINATION RECORD
IF  OUTP<1024 THEN  BLOCK(1025)=X'88000004'
IF  OUTP<512 THEN  BLOCK(513)=X'88000004'
OUT6K
   WREOFMT(FLAG);                       ! TM
   -> ERRORTM UNLESS  FLAG = 0
   DIGIT1 = BLOCK COUNT//100
   DIGIT2 = (BLOCK COUNT-DIGIT1*100)//10
   DIGIT3 = BLOCK COUNT-(DIGIT1*100+DIGIT2*10)
   EOF1(56) = DIGIT1+X'F0'
   EOF1(57) = DIGIT2+X'F0'
   EOF1(58) = DIGIT3+X'F0'
   WRITEMT(ADDR(EOF1(1)),80,FLAG)
   -> ERRORH UNLESS  FLAG = 0
   WRITEMT(ADDR(EOF2(1)),80,FLAG)
   -> ERRORH UNLESS  FLAG = 0
   WREOFMT(FLAG);                       ! TM
   -> ERRORTM UNLESS  FLAG = 0
! A TEST FOR MORE THAN ONE FILE MAY BE INSERTED HERE AND
! IF +VE THEN RETURN TO 'PROMPT('INPUTFILE:')'.
   WREOFMT(FLAG);                       ! TM
   -> ERRORTM UNLESS  FLAG = 0
   UNLOADMT
   NEWLINE
   WRITE(BLOCK COUNT,1)
   PRINTSTRING(' BLOCKS WRITTEN TO TAPE
')
   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 
!!
!!!

   ROUTINE  READIN(INTEGER  SIZE)
   INTEGER  A
                  A=1
PRINTSTRING('
READING IN ')
WRITE(SIZE,4)
NEWLINE
      WHILE  A <= SIZE THEN  CYCLE 
         READSQ(1,W(A),W(A+1023))
         A = A+1024
      REPEAT 
   END 

   ROUTINE  OUT6K
   INTEGER  I
BLOCK(0)=X'2A0C1004'
      WRITEMT(ADDR(BLOCK(0)),6240,FLAG)
      IF  FLAG # 0 START 
         PRINTSTRING('
WRITEMT FAILS ')
         WRITE(FLAG,1)
         STOP 
      FINISH 
     CYCLE  I=0,1,1600
       BLOCK(I)=0
     REPEAT 
      BLOCKCOUNT = BLOCKCOUNT+1
OUTP=1
   END 
ENDOFPROGRAM