!! BROUGHT FROM 475 AND MODIFIED FOR 2970 - 9/5/78
!!
! ALAN ANDERSON 3/10/77
!!
!!*******************************************************
!!* *
!!* THIS PROGRAM READS OMF OBJECTS INTO EMAS *
!!* FROM A TAPE IN MAGNETIC MEDIA ENGINEERING FORMAT. *
!!* *
!!*************************************************
!!
!! TAPE FORMAT IS:
!! <--------------FILE 1------------------->
!! *V* *H* *H* *U* *D* *D* *E* *E* *U*
!! *O* *D* *D* *H* TM *A*->*A* TM *O* *O* *T* TM < FILE2 >< FILEN > TM
!! *L* *R* *R* *L* *T* *T* *F* *F* *L*
!! *1* *1* *2* *1* *A* *A* *1* *2* *1*
!!
!!
EXTERNALROUTINE READBTAPE(STRING (63) S)
EXTERNALSTRINGFNSPEC UINFS(INTEGER ENTRY)
EXTERNALINTEGERFNSPEC DSFI(STRING (6) USER, INTEGER FSYS, C
TYPE, SET,ADR)
EXTERNALROUTINESPEC OPENOMF(STRING (32) S, INTEGER N, MODE)
EXTERNALROUTINESPEC WRITEOMF(INTEGER N, A, L)
EXTERNALROUTINESPEC CLOSEOMF(INTEGER CH)
EXTERNALROUTINESPEC OPENMT(STRING (6) TAPE)
EXTERNALROUTINESPEC READMT(INTEGER AD, INTEGERNAME L, FLAG)
EXTERNALROUTINESPEC SKIPMT(INTEGER N)
EXTERNALROUTINESPEC SKIPTMMT(INTEGER N)
EXTERNALROUTINESPEC REWINDMT
EXTERNALROUTINESPEC UNLOADMT
SYSTEMINTEGERMAPSPEC COMREG(INTEGER N)
EXTERNALROUTINESPEC NEWPDFILE(STRING (63) S)
EXTERNALROUTINESPEC CS(STRING (63) S)
SYSTEMROUTINESPEC OUTFILE(STRING (32) S, C
INTEGER L, M, P, INTEGERNAME C, F)
SYSTEMROUTINESPEC CONNECT(STRING (32) S, C
INTEGER ACCESS, MAXBYTES, PROTECTION, C
RECORDNAME R, INTEGERNAME FLAG)
RECORDFORMAT INRFM(INTEGER CONAD, FILESIZE, B, C
STRING (6) C, INTEGER D, F, G, H)
RECORD IN(INRFM)
EXTERNALROUTINESPEC DESTROY(STRING (63) S)
EXTERNALROUTINESPEC COPY(STRING (63) S)
EXTERNALROUTINESPEC PROMPT(STRING (17) S)
SYSTEMROUTINESPEC ETOI(INTEGER A, L)
EXTERNALSTRINGFNSPEC DATE
EXTERNALSTRINGFNSPEC TIME
BYTEINTEGERARRAY B(0 : 4115)
CONSTINTEGER EIGHTSEG=X'200000'
CONSTINTEGER TM = 1
STRING (8) TAPE
INTEGER PDMAXINDEX, PDINDEX, C26, CONAD
STRING (56) REST
STRING (1) SRCCONV
STRING (32) FILE, SEARCHFILE, PDFILE, TAPEFILE, WFILE
INTEGER K
INTEGER FLAG, NUMFILES, LEN, CDISP, LASTDISP, RLEN, I
INTEGER TENS
INTEGER MAXFSIZE
STRING (6) USER
CONSTINTEGER SEG=X'40000'
CONSTINTEGER WSIZE = X'100000'
CONSTINTEGERARRAY POWER(0 : 4) = C
1,10,100,1000,10000
!!
ROUTINE WINDUP
!!
NEWLINE
IF PDFILE#"" THEN DESTROY("OMF#TEMP")
IF SRCCONV="Y" THEN DESTROY("OMF#TEMP2")
UNLOADMT
STOP
END
!!
ROUTINE READLINE(STRING (255) NAME LINE)
WHILE NEXTSYMBOL = NL THEN SKIPSYMBOL; ! SKIP BLANK LINES
LINE = ""
WHILE NEXTSYMBOL # NL THEN LENGTH(LINE) = LENGTH(LINE)+ C
1 AND BYTEINTEGER(ADDR(LINE)+LENGTH(LINE)) = C
NEXTSYMBOL AND SKIPSYMBOL
SKIPSYMBOL
IF LINE=".END" OR LINE="STOP" THEN WINDUP
END
!!
!!
USER=UINFS(1)
FLAG=DSFI(USER,-1,12,0,ADDR(MAXFSIZE))
MAXFSIZE=MAXFSIZE*1024
C26 = COMREG(26)
SEARCHFILE = ""
PDFILE = ""
SRCCONV = "N"
PDINDEX = 1
NUMFILES = 1
PRINTSTRING("
".DATE." ".TIME." VSN 7
")
!!
IF S -> TAPE.(",").REST START
UNLESS REST -> SEARCHFILE.(",").PDFILE C
THEN SEARCHFILE = REST
IF PDFILE = "" THEN PRINTSTRING("
SEARCHING ".TAPE. C
" FOR FILE ".SEARCHFILE."
")
FINISH ELSE TAPE = S
IF PDFILE # "" START
! CONNECT OR CREATE PDFILE
CONNECT(PDFILE,0,0,0,IN,FLAG)
IF FLAG # 0 START
IF FLAG = 152 OR FLAG = 218 C
THEN NEWPDFILE(PDFILE) ELSE -> ERRORC
FINISH
OUTFILE("OMF#TEMP",SEG,MAXFSIZE,0,CONAD,FLAG)
IF FLAG # 0 THEN -> ERRORW
WFILE = "OMF#TEMP"
IF SEARCHFILE="" THENC
PRINTSTRING("
FILLING PDFILE ".PDFILE." FROM ".TAPE."
")
PRINTSTRING("
ARE FILES TO BE SOURCE CONVERTED?
")
PROMPT("Y/N:")
READLINE(SRCCONV)
IF SRCCONV = "Y" START
WFILE = "OMF#TEMP2"
OUTFILE(WFILE,SEG,MAXFSIZE,0,CONAD,FLAG)
IF FLAG # 0 THEN -> ERRORW
FINISH
PRINTSTRING("
GIVE MAXIMUM NUMBER OF FILES TO BE READ INTO PDFILE
")
PROMPT("DATA:")
READLINE(REST)
!!
PDMAXINDEX = 0
I = 0
WHILE I < LENGTH(REST) THEN CYCLE
TENS = POWER(LENGTH(REST)-(I+1))
PDMAXINDEX = PDMAXINDEX+((BYTEINTEGER(ADDR(REST)+I+1)- C
'0')*TENS)
I = I+1
REPEAT
NEWLINE
WRITE(PDMAXINDEX,1)
NEWLINE
FINISH
!!
OPENMT(TAPE)
! REWINDMT
SKIPMT(1); ! GET PAST LABEL
CYCLE ; ! THROUGH FILES
NEXTF:
LEN = 96; ! MAX LEN
READMT(ADDR(B(0)),LEN,FLAG); ! HDR1
IF FLAG = TM THEN START
PRINTSTRING("
TAPE ENDS
")
WINDUP
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'
IF SEARCHFILE = "" AND PDFILE = "" START
PRINTSTRING("
FILE")
WRITE(NUMFILES,1)
FINISH
NUMFILES = NUMFILES+1
ETOI(ADDR(B(10)),10); ! FILE NAME
B(9) = 10
TAPEFILE = STRING(ADDR(B(9)))
WHILE BYTEINTEGER(ADDR(TAPEFILE) C
+LENGTH(TAPEFILE))=X'20' THENC
LENGTH(TAPEFILE)=LENGTH(TAPEFILE)-1
IF SEARCHFILE # "" START
IF SEARCHFILE = TAPEFILE START
PRINTSTRING("
".SEARCHFILE." FOUND AT LABEL ")
WRITE(NUMFILES,1)
NEWLINE
IF PDFILE#"" START
PRINTSTRING("
FILLING".PDFILE." FROM ".TAPE." LABEL ")
WRITE(NUMFILES,1)
NEWLINE
SEARCHFILE=""
FINISH
FINISH ELSE START
SKIPTMMT(3)
-> NEXTF
FINISH
FINISH
IF PDFILE = SEARCHFILE = "" C
THEN PRINTSTRING(" ".TAPEFILE."
")
! GET PAST HDR2,UHL , TM
CYCLE K=1,1,3
READMT(ADDR(B(0)),LEN,FLAG)
IF FLAG=TM AND K<3 THEN ->ERRORF
REPEAT
->ERRORF UNLESS FLAG=TM
!!
LEN = 96; ! MAX LEN
IF PDFILE = "" START
PROMPT("EMASFILENAME:")
READLINE(FILE)
IF FILE = "NO" THEN WINDUP
FINISH ELSE FILE = "OMF#TEMP"
IF FILE = "R" 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)+6
CDISP = 8
UNTIL CDISP > LASTDISP THEN CYCLE
RLEN = B(CDISP)<<8+B(CDISP+1)
WRITEOMF(1,ADDR(B(CDISP+4)),RLEN-4)
CDISP = CDISP+RLEN
REPEAT
REPEAT
CLOSEOMF(1)
IF SRCCONV = "Y" THEN CS(FILE.",OMF#TEMP2")
IF PDFILE # "" AND C26 # 0 START
NEWLINE
IF PDFILE # "" THEN PRINTSTRING(TAPEFILE)
WRITE(I-1,1)
PRINTSTRING(" BLOCK")
IF I-1 > 1 THEN PRINTSTRING("S")
PRINTSTRING(" READ ")
NEWLINE
FINISH
IF PDFILE # "" THEN COPY(WFILE.",".PDFILE."_".TAPEFILE)
SKIPTMMT(1); ! PAST TRAILERS TO NEXT FILE
IF PDFILE # "" START
PDINDEX = PDINDEX+1
IF PDINDEX >= PDMAXINDEX START
PDINDEX = 0
PROMPT("NEXTPDFILE:")
READLINE(PDFILE)
! CONNECT OR CREATE PDFILE
CONNECT(PDFILE,0,0,0,IN,FLAG)
IF FLAG # 0 START
IF FLAG = 152 OR FLAG = 218 C
THEN NEWPDFILE(PDFILE) ELSE -> ERRORC
FINISH
PRINTSTRING("
FILLING ".PDFILE." FROM ".TAPE. C
" LABEL ")
WRITE(NUMFILES+1,1)
NEWLINE
PRINTSTRING("
GIVE MAXIMUM NUMBER OF FILES TO BE READ INTO PDFILE
")
PROMPT("DATA:")
READLINE(REST)
!!
PDMAXINDEX = 0
I = 0
WHILE I < LENGTH(REST) THEN CYCLE
TENS = POWER(LENGTH(REST)-(I+1))
PDMAXINDEX = PDMAXINDEX+((BYTEINTEGER(ADDR(REST)+I+1)- C
'0')*TENS)
I = I+1
REPEAT
NEWLINE
WRITE(PDMAXINDEX,1)
NEWLINE
FINISH
FINISH
REPEAT
WINDUP
ERRORF:
PRINTSTRING("
TAPE FORMAT ERROR ")
PRINTSTRING("{
ARE YOU SURE THAT THIS TAPE IS IN BARCHIVE FORMAT?
")
WINDUP
ERRORC:
PRINTSTRING("
CANNOT CONNECT PDFILE ".PDFILE." ")
WRITE(FLAG,1)
NEWLINE
WINDUP
ERRORW:
PRINTSTRING("
CANNOT CREATE WORKFILE ")
WRITE(FLAG,1)
NEWLINE
WINDUP
ERRORR:
PRINTSTRING("
READMT FAILS /")
WRITE(FLAG,1)
WINDUP
END
ENDOFFILE