.TITLE TRANSL --TRANSLATE RT11 FILES .IDENT -004- ; ;+ ; THIS PROGRAM IS USED TO TRANSLATE SEQUENTIAL PRINT AND EDIT FILES ; FROM RT11 MAGNETIC TAPE FORMAT TO RSX-11D FILES. THE PROBLEM IS ; THAT RT11 DOES NOT SUPPORT THE SAME LEVEL OF ANSII TAPE FORMAT AS ; RSX-11D DOES; IN RT11 MAGNETIC TAPE, THE FILE IS SIMPLY A LIST ; OF BLOCKS WITH THE LINES IN THE FILE SEPARATED BY A PAIR, WHILE RSX-11D EXPECTS RECORD LENGTHS, ; AND SO FORTH. THIS PROGRAM WILL TRANSLATE A FILE FROM AN RT-11 ; MAGNETIC TAPE INTO AN RSX-DIGESTABLE FORM. THE OUTPUT FILE WILL ; HAVE VARYING LENGTH RECORDS AND HAVE THE "CARRIAGE CONTROL IMPLIED" ; ATTRIBUTE. ; ; USE: ; ; MCR>RUN $TRANSLATE ; ---- ; TSL>FILESPEC ; ; - OR, IF INSTALLED AS AN MCR TASK - ; ; MCR>TSL FILESPEC ; ---- ; ; -OR- ; ; MCR>TSL ; ---- ; TSL>FILESPEC ; ----- ; ; FILESPEC IS A STANDARD RSX-11D FILE STRING OF THE FORM ; ; OUTFILE=INFILE ; ; OUTFILE TYPE DEFAULTS TO .TSL; INFILE TYPE DEFAULTS TO ; .LST. ; ; AUTHOR: BRUCE C. WRIGHT DATE: 4-MAY-76 ; ; MODIFICATIONS: ; ; 001 19-FEB-78 BRUCE C. WRIGHT ALLOW BATCH COMMANDS ; 002 20-FEB-78 BRUCE C. WRIGHT BREAKS TO NEW LINE ; 003 08-MAY-78 BRUCE C. WRIGHT IMPROVED ERROR MESSAGES ; 004 25-JUL-78 BRUCE C. WRIGHT FIXED BUG WITH LONG LINES ; ;- .MCALL EXIT$S,GET$,PUT$,OPEN$R,OPEN$W,CLOSE$ .MCALL GCMLB$,GCML$,CSI$,CSI$1,CSI$2 .MCALL BDOFF$,QIOW$ BDOFF$ DEF$L .PSECT CODE,RO,I BEGIN:: MOV SP,SPSAVE ;001 SAVE SP FOR RSTART RSTART: MOV SPSAVE,SP ;001 RECOVER SP GCML$ #CMLBLK ;GET COMMAND LINE BCC GETOK ;SKIP IF GOTTEN OK. CMPB CMLBLK+G.ERR,#GE.IOR BEQ CMDERR ;I/O ERROR CMPB CMLBLK+G.ERR,#GE.OPR BEQ CMDOPE ;OPEN ERROR CMPB CMLBLK+G.ERR,#GE.BIF BEQ CMDSYN ;SYNTAX ERROR CMPB CMLBLK+G.ERR,#GE.MDE BEQ CMDMAX ;MAX @ FILE DEPTH CMPB CMLBLK+G.ERR,#GE.EOF BNE CMDUNK ;EOF ON COMMAND FILE EXIT$S CMDERR: MOV #L.ERR,R1 MOV #M.ERR,R0 INC FATALE ;001 SIGNAL AS FATAL ERROR BR CMDQIO CMDOPE: MOV #L.OPE,R1 MOV #M.OPE,R0 BR CMDQIO CMDSYN: MOV #L.SYN,R1 MOV #M.SYN,R0 BR CMDQIO CMDMAX: MOV #L.MAX,R1 MOV #M.MAX,R0 BR CMDQIO CMDPS1: MOV #L.PS1,R1 MOV #M.PS1,R0 BR CMDQIO CMDPS2: MOV #L.PS2,R1 MOV #M.PS2,R0 BR CMDQIO CMDUNK: MOV #L.UNK,R1 MOV #M.UNK,R0 INC FATALE ;001 SIGNAL AS FATAL ERROR CMDQIO: MOV #$QIOW,-(SP) CALL .DIRDL TST FATALE ;001 FATAL ERROR? BEQ RSTART ;001 NO -- RESTART EXIT$S ;001 YES -- STOP. GETOK: TST CMLBLK+G.CMLD BEQ BEGIN ;LOOP IF NULL INPUT LINE. CSI$1 #CSIBLK,CMLBLK+G.CMLD+2,CMLBLK+G.CMLD BCS CMDPS1 ;PRINT ERROR MESSAGE IF SYNTAX ERROR CSI$2 #CSIBLK,INPUT BCS CMDPS2 ;PRINT ERROR MESSAGE IF TOO MANY SWITCHES OPEN$R #FDBIN,,#CSIBLK+C.DSDS,,,,CMDOPN CSI$2 #CSIBLK,OUTPUT BCS CMDPS2 OPEN$W #FDBOUT,,#CSIBLK+C.DSDS,,,,CMDOPN MOV #BUFOUT,R4 ;POINT TO OUTPUT BUFFER LOCATION. CLR LENGTH ;LENGTH OF INPUT BUFFER = 0 ;TO FOOL THE GETCH ROUTINE INTO ;DOING A READ. MOV #1,COUNT ;AND ALREADY USED ONE. LOOP: CALL GETCH ;GET CHAR INTO R0. CMP R0,#12 ;SKIP IF A BEQ RECEND TST R0 ;SKIP IF A BEQ LOOP CMP R0,#15 ;PRINT LINE IF A BEQ LOOP CMP R0,#14 ;002 IS IT A ? BEQ FOUNDF ;002 YES -- SPECIAL CASE. MOVB R0,(R4)+ ;ELSE SAVE IT CMP R4,#BUFEND ;004 AT END OF BUFFER? BLO LOOP ;004 NO - CONTINUE. RECEND: SUB #BUFOUT,R4 ;COMPUTE BUFFER LENGTH PUT$ #FDBOUT,#BUFOUT,R4,EOFMOD MOV #BUFOUT,R4 ;RESET POINTER BR LOOP ;AND GET MORE FOUNDF: SUB #BUFOUT,R4 ;002 GET LENGTH OF BUFFER SO FAR. BEQ 10$ ;002 SKIP IF NONE. PUT$ #FDBOUT,#BUFOUT,R4,EOFMOD ;002 10$: MOV #BUFOUT,R4 ;002 RECOVER BEGINNING OF LINE MOVB #14,(R4)+ ;002 MOVE IN A BR RECEND ;002 AND HANDLE AS END-OF-LINE. GETCH: CMP COUNT,LENGTH BLT 10$ GET$ #FDBIN,,,EOFMOD MOV FDBIN+F.NRBD,LENGTH CLR COUNT 10$: MOV #BUFIN,R0 ;COMPUTE ADDRESS OF CURRENT CHAR ADD COUNT,R0 ;ADDRESS = BUFFER + USED COUNT INC COUNT ;INCREMENT USED CHAR COUNT. MOVB (R0),R0 ;GET THE CHAR RETURN EOFMOD: CMDOPN: ; ; THE ERROR HANDLING ROUTINE. ; IF AN END-OF-FILE IS DETECTED, THE PROGRAM JUST EXITS. ; CMPB FDBIN+F.ERR,#IE.EOF BNE TROUBL RET: CLOSE$ #FDBIN CLOSE$ #FDBOUT JMP RSTART ;001 RESTART EXECUTION TROUBL: MOV #M.MSG,R1 ;003 GET MESSAGE MOV #L.MSG,R2 ;003 GET MSG LEN CALL .PRFCS ;003 PRINT MESSAGE BR RET ;003 RE-START .PSECT PDATA,RO,D .NLIST BIN M.ERR: .ASCII "TSL -- I/O ERROR ON @ FILE" L.ERR = .-M.ERR .EVEN M.OPE: .ASCII "TSL -- OPEN ERROR ON @ FILE" L.OPE = .-M.OPE .EVEN M.SYN: .ASCII "TSL -- SYNTAX ERROR ON @ FILE" L.SYN = .-M.SYN .EVEN M.MAX: .ASCII "TSL -- MAX @ FILE DEPTH EXCEEDED" L.MAX = .-M.MAX .EVEN M.UNK: .ASCII "TSL -- UNKNOWN COMMAND ERROR" L.UNK = .-M.UNK .EVEN M.PS1: .ASCII "TSL -- SYNTAX ERROR" L.PS1 = .-M.PS1 .EVEN M.PS2: .ASCII "TSL -- ILLEGAL SWITCH" L.PS2 = .-M.PS2 .EVEN M.MSG: .ASCII "TSL" ;003 L.MSG = .-M.MSG ;003 .EVEN .PSECT IDATA,RW,D .MCALL FSRSZ$,FDBDF$,FDRC$A,FDOP$A,FDBF$A,NMBLK$ .MCALL FDAT$A CMLBLK: GCMLB$ 1,TSL,USRBUF,1 USRBUF: .BLKB 82. .EVEN CSI$ .EVEN CSIBLK: .BLKB C.SIZE FSRSZ$ 3,3* FDBIN: FDBDF$ FDRC$A ,BUFIN,512. FDOP$A 2,,INDFN FDBF$A 2 INDFN: NMBLK$ ,LST,,SY,0 FDBOUT: FDBDF$ FDOP$A 3,,OUTDFN FDBF$A 3 FDRC$A FDAT$A R.VAR,FD.CR,,-5.,-5. OUTDFN: NMBLK$ ,TSL,,SY,0 .EVEN BUFIN: .BLKW 256. BUFOUT: .BLKW 256. BUFEND: ;004 LENGTH: .WORD 0 COUNT: .WORD 0 FATALE: .WORD 0 ;001 FATAL ERROR FLAG. SPSAVE: .WORD 0 ;001 STACK SAVE AREA $QIOW: QIOW$ IO.WVB,4,4,,,,<0,0,40> .END BEGIN