!*****************************************************
!*                                                   *
!* THIS ROUTINE TAKES A SQ FILE IN OMF FORMAT AS     *
!* INPUT BY THE BATPIN PROGRAM FROM A BATCH          *
!* ARCHIVE TAPE, AND ASSUMING THERE IS ONLY ONE AREA *
!* FORMING A MICRO PROGRAM TRANSLATES THIS INTO      *
!* A FILE SUITABLE FOR INPUT TO CHOPFIX              *
!*                                                   *
!*****************************************************
!!
!!

EXTERNALROUTINE  OMF2MP(STRING  (255) S)
EXTERNALROUTINESPEC  OPENOMF(STRING  (32) S, INTEGER  CH, MODE)
EXTERNALROUTINESPEC  READOMF(INTEGER  CH, A, INTEGERNAME  L)
SYSTEMROUTINESPEC  OUTFILE(STRING  (15) S,  C 
      INTEGER  LEN, MAXLEN, PROT, INTEGERNAME  CONAD, LAG)
SYSTEMROUTINESPEC  MOVE(INTEGER  LEN, FROMAD, TOAD)
SYSTEMROUTINESPEC  PHEX(INTEGER  N)
!!
STRING  (17) INFILE, OUTF
INTEGER  TOTAL, J, K, L, CONAD, FLAG
RECORDFORMAT  BFM(BYTEINTEGER  TYPE, LASTENTRY, IIN0, IIN1,  C 
      INTEGER  DISP, LEN)
RECORDNAME  BHEAD(BFM)
RECORDFORMAT  FPFM(BYTEINTEGER  TYPE, PROPERTIES, ESIZE0,  C 
      ESIZE1, IIN0, IIN1, NAME USE, STRING  (32) NAME)
RECORDNAME  FP(FPFM)
INTEGER  ESIZE
BYTEINTEGERARRAY  B(0 : 4120)
!!
!!
   -> ERRORP UNLESS  S -> INFILE.(",").OUTF
!!
   OPENOMF(INFILE,1,0)
!!
   READOMF(1,ADDR(B(0)),L);             ! PROPERTIES RECORD MUST COME FIRST
   IF  B(0) = 0 START ;                 ! CHECK PROPERTIES RECORD
      J = 0
      CYCLE ;                           ! THROUGH PROPERTIES ENTRIES
! CYCLE THROUGH PROPERTIES RECORD TO GET LENGTH OF AREA
         FP == RECORD(ADDR(B(J)))
         ESIZE = (FP_ESIZE0<<8)!FP_ESIZE1
         IF  FP_TYPE = 1 START 
            ESIZE = (FP_ESIZE0<<8)!FP_ESIZE1
            K = 8+LENGTH(FP_NAME)
            WHILE  ((K+3)>>2) < ESIZE THEN  CYCLE 
                                        ! THROUGH OPTIONAL WORDS
               IF  BYTEINTEGER(ADDR(B(J+K))) = 0 C 
                  THEN  TOTAL = INTEGER(ADDR(B(J+K))) AND  -> OK
               K = K+4
            REPEAT 
         FINISH ;                       ! OF TYPE 1
         -> ERRORN IF  FP_NAME USE&1 = 1;    ! END OFP PROPERTIES RECORD
         J = J+(ESIZE<<2)
      REPEAT 
   FINISH 
OK:
   PRINTSTRING("
SIZE OF THE AREA IS ")
   PHEX(TOTAL)
   PRINTSTRING("(HEX) BYTES. ")
   CONAD = 0
   OUTFILE(OUTF,X'40000',0,0,CONAD,FLAG)
   -> ERRORO UNLESS  FLAG = 0
!!
!!
   CYCLE ;                              ! THROUGH RECORDS IN SQ FILE
      READOMF(1,ADDR(B(0)),L)
      EXIT  IF  L = 0
      BHEAD == RECORD(ADDR(B(0)))
      -> NEXT IF  BHEAD_TYPE # 8
      MOVE(BHEAD_LEN,ADDR(B(12)),CONAD+BHEAD_DISP+32)
NEXT:
   REPEAT 
!!
!! FILL IN HEADER
!!
   INTEGER(CONAD) = X'40000';            ! ACTUAL LENGTH OF FILE CONTENTS
   INTEGER(CONAD+4) = 32;               ! LENGTH OF FILE HEADER
   INTEGER(CONAD+8) = X'40000';     ! MAXIMUM FILE LENGTH
   INTEGER(CONAD+12) = 5
   RETURN 
ERRORP:

   PRINTSTRING("
PARAMETERS - SHOULD BE IN FORM INFILE/OUTFILE ")
   STOP 
ERRORO:

   PRINTSTRING("
OUTFILE FAILS FLAG = ")
   WRITE(FLAG,0)
   STOP 
ERRORN:

   PRINTSTRING("
NO AREA RECORD IN PROPERTIES ")
   STOP 
END ;                                   ! OF OMFTOSRC
ENDOFFILE