!* MODIFIED 02/09/79 TO VERSION 6 - HANDLE LONG FILENAMES !* MODIFIED 08/08/79 TO VERSION 5 - CLOSE OUTPUT FILES !* MODIFIED 19/12/78 TO VERSION 4 - KSV13 BLOCK PREFIX ! BROUGHT FROM 475 AND MODIFIED FOR 2970 - 9/5/78 !! ! ALAN ANDERSON 22/12/77 !! !!******************************************************* !!* * !!* THIS PROGRAM READS OMF OBJECTS INTO EMAS * !!* FROM A TAPE WRITTEN IN VME-K COPY OUT FORMAT. * !!* * !!******************************************************* !! !! TAPE FORMAT IS: !! <-----------------FILE 1---------------------> !! *V* *H* *H* *H* *H* *H* *H* *D* *D* *E* *E* !! *O* *D* *D* *D* *D* *D* *D* TM *A*->*A* TM *O* *O* TM < FILE2 >< FILEN > TM TM !! *L* *R* *R* *R* *R* *R* *R* *T* *T* *F* *F* !! *1* *1* *2* *3* *4* *5* *6* *A* *A* *1* *2* !! !! EXTERNALROUTINE READKTAPE(STRING (8) TAPE) EXTERNALROUTINESPEC OPENOMF(STRING (32) S,INTEGER N,MODE) EXTERNALROUTINESPEC WRITEOMF(INTEGER N, A,L) EXTERNALROUTINESPEC CLOSEOMF(INTEGER N) EXTERNALROUTINESPEC OPENMT(STRING (6) TAPE) EXTERNALROUTINESPEC READMT(INTEGER AD, INTEGERNAME L, FLAG) EXTERNALROUTINESPEC SKIPMT(INTEGER N) EXTERNALROUTINESPEC SKIPTMMT(INTEGER N) EXTERNALROUTINESPEC REWINDMT EXTERNALROUTINESPEC UNLOADMT EXTERNALROUTINESPEC PROMPT(STRING (17) S) SYSTEMROUTINESPEC ETOI(INTEGER A, L) EXTERNALSTRINGFNSPEC DATE EXTERNALSTRINGFNSPEC TIME BYTEINTEGERARRAY B(0 : 4115) CONSTINTEGER TM = 1 STRING (255) FILE INTEGER FLAG, NUMFILES, LEN, CDISP, LASTDISP, RLEN, I ROUTINE READLINE(STRING (255) NAME LINE) WHILE NEXTSYMBOL = NL THEN SKIPSYMBOL; ! SKIP BLANK LINES LINE = "" WHILE NEXTSYMBOL # NL THEN LINE = LINE.NEXTITEM C AND SKIPSYMBOL SKIPSYMBOL END NUMFILES = 1 PRINTSTRING(" ".DATE." ".TIME." VSN 6 ") OPENMT(TAPE) REWINDMT SKIPMT(1); ! GET PAST LABEL CYCLE ; ! THROUGH FILES NEXTF: LEN=4116 ;! MAX LEN READMT(ADDR(B(0)),LEN,FLAG); ! HDR1 IF FLAG = TM THEN START PRINTSTRING(" Tape ends ") -> END FINISH -> ERRORR UNLESS FLAG = 0 -> ERRORF UNLESS B(6) = X'C8' AND B(7) = X'C4' C AND B(8) = X'D9' AND B(9) = X'F1' PRINTSTRING(' File') WRITE(NUMFILES,1) ETOI(ADDR(B(10)),17); ! FILE NAME B(9) = 17 PRINTSTRING(" ".STRING(ADDR(B(9)))) NEWLINE SKIPMT(4); ! HDR2 LEN=4116 ;! MAX LEN READMT(ADDR(B(0)),LEN,FLAG); ! HDR6 -> ERRORR UNLESS FLAG = 0 -> ERRORF UNLESS B(9) = X'F6' SKIPMT(1); ! SKIP TM PROMPT("EMAS filename:") GETNAME: READLINE(FILE) STOP IF FILE="NO" OR FILE="STOP" OR FILE=".END" IF LENGTH(FILE) > 23 THEN PRINTSTRING("Illegal filename ") AND -> GETNAME IF FILE="" THEN SKIPTMMT(2) AND ->NEXTF OPENOMF(FILE,1,1) CYCLE I = 1,1,10000; ! THROUGH DATA BLOCKS LEN=4116 ;! MAX LEN READMT(ADDR(B(0)),LEN,FLAG) EXIT IF FLAG = TM -> ERRORR UNLESS FLAG = 0 LASTDISP = B(6)<<8+B(7) CDISP = 8 UNTIL CDISP > LASTDISP THEN CYCLE RLEN = B(CDISP)<<8+B(CDISP+1) ->ERRORF IF RLEN<=0 WRITEOMF(1,ADDR(B(CDISP+4)),RLEN-4) CDISP = CDISP+RLEN REPEAT REPEAT CLOSEOMF(1) NEWLINE WRITE(I-1,1) PRINTSTRING(" data blocks read") SKIPTMMT(1); ! PAST TRAILERS TO NEXT FILE REPEAT -> END ERRORF: PRINTSTRING(" Tape format error") MONITOR -> END ERRORR: PRINTSTRING(" READMT fails /") WRITE(FLAG,1) END: UNLOADMT END ENDOFFILE