!*****************************************************
!* *
!* 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