!***************************************************** !* * !* 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 SOURCE FORMAT SUITABLE FOR INCLUSION IN IMP * !* COMPILATION. * !* * !***************************************************** !! !! EXTERNALROUTINE CMP(STRING (63) 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) EXTERNALROUTINESPEC DESTROY(STRING (63) S) SYSTEMROUTINESPEC PHEX(INTEGER N) !! STRING (17) INFILE, OUTF CONSTINTEGERARRAY POWER(0 : 9) = C 1,10,100,1000,10000,100000,1000000, C 10000000,100000000,1000000000 INTEGER TOTAL, I, J, K, L, CONAD, FLAG, F, NEWL, TENS 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) ROUTINESPEC HXWORD(INTEGERNAME FROMAD, TOAD) OWNINTEGER LAST INTEGER ESIZE, LASTWORD, DUPS, N, P, G, FIG, ST, NUM 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. ") F = 0 OUTFILE("SS#SWRK",TOTAL,0,0,F,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)),F+BHEAD_DISP) NEXT: REPEAT !! !! OUTFILE(OUTF,X'40000',0,0,CONAD,FLAG) -> ERRORO UNLESS FLAG = 0 I = CONAD+32 DUPS = 0 NEWL = 0 LASTWORD = -500; ! HOPE THIS NEVER IS THE FIRST VALUE TOTAL = F+TOTAL NUM = 0 UNTIL F >= TOTAL THEN CYCLE NUM = NUM+1 IF INTEGER(F) = LASTWORD THEN DUPS = DUPS+1 ELSE START IF DUPS > 0 START BACKIN: N = I-1 BYTEINTEGER(N) = '(' G = 1 DUPS = DUPS+1 ST = 0 CYCLE P = 9,-1,0 TENS = POWER(P) IF DUPS >= TENS OR ST = 1 C THEN BYTEINTEGER(N+G) = '0'+(DUPS//(TENS)) C AND G = G+1 AND FIG = DUPS//TENS C AND DUPS = DUPS-(FIG*TENS) AND ST = 1 REPEAT I = N+G BYTEINTEGER(I) = ')' BYTEINTEGER(I+1) = ',' I = I+2 -> END IF LAST = 1 FINISH DUPS = 0 LASTWORD = INTEGER(F) NEWL = NEWL+1 IF NEWL = 5 THEN BYTEINTEGER(I) = NL C AND I = I+1 AND NEWL = 0 HXWORD(F,I) FINISH F = F+4 REPEAT IF DUPS > 0 THEN LAST = 1 AND -> BACKIN END: IF NEWL = 0 THEN BYTEINTEGER(I-2) = NL C ELSE BYTEINTEGER(I-1) = NL ! GET RID OF LAST COMMA !! !! FILL IN HEADER !! INTEGER(CONAD) = I-CONAD; ! ACTUAL LENGTH OF FILE CONTENTS INTEGER(CONAD+4) = 32; ! LENGTH OF FILE HEADER INTEGER(CONAD+8) = (I-CONAD)+16; ! MAXIMUM FILE LENGTH INTEGER(CONAD+12) = 3 WRITE(NUM,0); PRINTSTRING(" WORDS "); NEWLINE DESTROY("SS#SWRK") STOP !! !! !! ROUTINE HXWORD(INTEGERNAME FROMAD, TOAD) CONSTBYTEINTEGERARRAY HX(0 : 15) = C '0','1','2','3','4', C '5','6','7','8','9','A','B','C','D','E','F' INTEGER I BYTEINTEGER(TOAD) = 'X' BYTEINTEGER(TOAD+1) = '''' TOAD = TOAD+2 CYCLE I = FROMAD,1,FROMAD+3 BYTEINTEGER(TOAD) = HX(BYTEINTEGER(I)>>4) BYTEINTEGER(TOAD+1) = HX(BYTEINTEGER(I)&15) TOAD = TOAD+2 REPEAT BYTEINTEGER(TOAD) = '''' BYTEINTEGER(TOAD+1) = ',' TOAD = TOAD+2 END 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