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