;<11-UTILITIES>PIP10.P11.7, 31-Mar-80 14:47:39, Edit by KINZELMAN .NLIST TTM EDIT=34 ;3/31/80 .TITLE PIP10: RT-11 (V4) TO PDP-10 PIP. ;BY PAUL KINZELMAN ;DIGITAL EQUIPMENT CORP. ;MAYNARD, MASS. 01754 ;ML 1-3, E63 X2473 ;PROGRAM INPUTS FILES FROM A PDP-10 "NO HEADER" TAPE ;WRITTEN BY COPY OR PIP ON TOPS-10 OR TOPS-20 ;AND WRITES A DISK FILE ON THE RT11 SYSTEM. ;NOTE THAT THE PROGRAM ONLY HANDLES PDP-10 STANDARD ;7-BIT ASCII AND PDP-11 BINARY FILES. ;ALSO DELETES SOS LINE #'S AND NULL CHARS ;AUTOMATICALLY FROM ASCII FILES ;WILL ALSO GO FROM RT-11 DISK TO MAGTAPE IN PDP-10 FORMAT ;AFTER STARTING UP THE PROGRAM, YOU WILL BE ASKED FOR ;THE TAPE DRIVE NUMBER (IF ANY) AND THE PROGRAM MODE. ;TYPE THE TAPE DRIVE AS MT3: OR MT5: (ETC.) ;THE FOLLOWING SWITCHES ARE RELEVANT: ;/W SAYS WRITE ON THE TAPE FOR A DSK TO TAPE TRANSFER. ; (READ FROM TAPE IS THE DEFAULT) ;/N SAYS DON'T WARN BEFORE DELETING DSK FILE ON DSK WRITE ; OPERATIONS IF THE SPECIFIED FILE ALREADY EXISTS. ;IF YOU REQUESTED A MTA WRITE OR READ OPERATION, ;YOU ARE ASKED FOR THE DSK FILE NAME. TYPE: ;FILE.EXT OR SY:FILE.EXT OR DK3:FILE.EXT (ETC.) ;THE FOLLOWING SWITCHES ARE RELEVANT: ;/U FOR A DSK TO TAPE TRANSFER SAYS THAT THE FILE YOU ;ARE TYPING IS THE LAST ONE FOR THE TAPE. (YOU ;DON'T HAVE TO USE THE /U SWITCH. 2 TAPE MARKS ;ARE WRITTEN AFTER EACH FILE AND THEN THE DRIVE ;IS BACKSPACED 1 RECORD IN PREPARATION FOR THE NEXT FILE) ;/B FOR A DSK TO TAPE OR TAPE TO DSK TRANSFER SAYS ;PACK THE DATA IN BINARY FORMAT RATHER ;THAN THE DEFAULT (ASCII). (NOTE THAT ON FILES WITH ;THE EXTENSION "OBJ" ARE DEFAULTED TO BINARY HOWEVER) ;BINARY FORMAT SHOULD BE COMPRESSED (THE DEFAULT FOR MACY11). ;/A SAYS FILE IS IN ASCII MODE ;/N SAYS DON'T WARN BEFORE DELETING DSK FILE ON DSK WRITE ; OPERATIONS IF THE SPECIFIED FILE ALREADY EXISTS. .GLOBL O.ODT .MCALL ..V2..,.REGDEF,.FETCH,.LOOKUP,.READW,.CLOSE,.RELEAS .MCALL .PRINT,.EXIT,.CSISPC,.ENTER,.WRITW,.SPFUN,.CSTAT .MCALL .DSTATUS, .SRESET, .TTYIN, .TTINR ..V2.. .REGDEF STODT: JMP O.ODT ;INIT ODT JMP O.ODT+2 ;RESTART, CLR BRKPNTS JMP O.ODT+4 ;RESTART, KEEP BRKPNTS EDIT ;CURRENT EDIT NUMBER JMP START ;START PROGRAM ENTRY ;TABLE STORAGE AREAS RWAREA: .BLKW 10 LKAREA: .BLKW 5 L1AREA: .BLKW 5 WRAREA: .BLKW 10 CSAREA: .BLKW 50 FILENM=CSAREA+36 ;INPUT FILE NAME POINTER WR1ARE: .BLKW 10 WR2ARE: .BLKW 10 ENAREA: .BLKW 10 LKDARE: .BLKW 10 FILLEN: 0 ;LENGTH OF FILE IN BLKS RDAREA: .BLKW 10 CAREA: .BLKW 20 WRTARE: .BLKW 10 RDDARE: .BLKW 10 TLAREA: .BLKW 10 AR1: .BLKW 4 ERBLK: .BLKW 4 BLOCK: 0 ;DSK BLOCK COUNT UNLSW: 0 ;-1 IF LAST FILE AND WE SHOULD UNLOAD AFTER BINFLG: 0 ;0 IF ASCII PACK, -1 IF BINARY FUNCTN: 0 ;CURRENT FUNCTION: ;< 0 FOR DSK TO TAPE ; 0 FOR TAPE TO DSK OLDBYT: 0 ;MEMORY FOR LAST BYTE FOR BYTE PACKING MTRAD5: 0 ;CURRENT MTA# IN RAD50 .WORD 0,0,0 ;REST OF FILE LSTBYT: 0 ;LST BYTE+1 WRITTEN BY MTA MSIZE: 0 ;# WDS TO WRITE ON TAPE NOWARN: 0 ;-1 = DON'T WARN DEVICE TO DSK CLOBBER FLG ; (-1 IF HE TYPED /N) THUFLG: 0 ;-1= DON'T WARN ON THIS FILE ONLY .MACRO HDRMAC VER .ASCIZ #PIP10 V'VER, /H FOR HELP: #<200> .ENDM START: .SRESET .PRINT #BPRMPT ;PRINT PROMPT MESSAGE MOV SP,R5 ;SAVE SP FOR DEBUG CLR FUNCTN ;DEFAULT FUNCTION CLR NOWARN ;WARN IF FILE CLOBBER .CSISPC #CSAREA,#DEFEXT,#0 ;GET FROM USER MOV FILENM,MTRAD5 ;GET THE MTA DEV # MOV (SP)+,R5 ;GET # SWITCHES BEQ ENST ;NO SWITCHES 2$: MOV (SP)+,R1 ;GET 1ST SWTITCH BGE 3$ ;VALUE? MOV (SP)+,R2 ;YES, GET IT 3$: CMPB R1,#'H ;NEED THE HLP MESSAGE? BNE 12$ ;NO .PRINT #HM1 BR START 12$: CMPB R1,#'W ;W? BNE 4$ ;NO MOV #177777,FUNCTN ;DO OTHER DIRECTION, WRT TO TAPE 4$: CMPB R1,#'N ;IS IT N? BNE 10$ ;NO MOV #177777,NOWARN ;YES, SET FLG 10$: DEC R5 ;ANOTHER SWITCH? BNE 2$ ;YES ENST: 1$: TST FUNCTN ;WHICH DIRECTION? BNE 23$ JMP RDMTAP ;TAP TO DSK ;DSK TO TAPE 23$: JSR PC, OPNWMT ;OPEN THE MTA FOR WRITE WRMLP: JSR PC, OPNDSR ;OPEN DSK FILE FOR READ WRMLP1: JSR PC, RDDFIL ;GET A BLK 1$: JSR PC, DSK.MT ;CONVRT PACKING FORMATS CMP R5,#DBUFF+1000 ;LAST DSK DATA? BLT 1$ ;NO, ANOTHER CMP BLOCK,FILLEN ;DONE? BLT WRMLP1 ;NO .CLOSE #1 JSR PC, WRMFIL ;OUTPUT LAST BUFFERFULL JSR PC, WRMEOT ;AND DO EOT TST UNLSW ;DONE ALL? BEQ WRMLP ;NO, ANOTHER FILE. JMP DONALL ;REW AND EXIT ;ROUTINE TO MOVE DATA TAPE TO DSK RDMTAP: JSR PC,OPNRMT ;OPEN THE MTA FOR A READ RDMLP: JSR PC,RDMFIL ;READ AN MTA FILE BR DONALL ;SECOND TM SEEN (LOGICAL EOT) BR RECCON ;RECORD DONALL: .SPFUN #RWAREA,#3,#373,#0 ;REWIND .CLOSE #3 ;CLOSE OUT TAPE .EXIT ;AND DONE RECCON: JSR PC,OPNDSW ;ANOTHER RECORD, OPEN A DSK FILE 3$: JSR PC,MT.DSK ;FIX UP 1 CHARACTER CMP R4,LSTBYT ;HAVE WE DONE ALL MTA DATA? BLT 3$ ;NO, DO SOME MORE JSR PC,RDMFIL ;YES, GET ANOTHER RECORD BR 4$ ;TM - THE END OF RECORD BR 3$ ;WE GOT ANOTHER RECORD 4$: JSR PC,WRDFIL ;WRITE THE REST OF THE DSK RECORD .CLOSE #2 ;CLOSE THE DSK BR RDMLP ;NOW SEE IF ANOTHER FILE ;ROUTINE TO READ A DSK BLOCK RDDFIL: .READW #RDDARE,#1,#DBUFF,#400,BLOCK BCS RDERR ;ERROR INC BLOCK ;ANOTHER BLOCK MOV #DBUFF,R5 ;RESET DISK BUFFER INDEX RTS PC RDERR: .PRINT #MM5 ;DISK ERROR .CLOSE #1 .CLOSE #3 .EXIT ;ROUTINE TO WRITE A DSK BLOCK WRDFIL: CMP #DBUFF,R5 BEQ 1$ ;NO DSK DATA, RTN NOW MOV R5,R0 BIT #1,R0 ;EVEN # BYTES? BEQ 4$ ;YES CLRB (R0)+ ;NO, MAKE EVEN 4$: SUB #DBUFF,R0 ;CALCULATE # BYTES ASR R0 ;FIND # WDS MOV R0,WRAREA+6 ;SET UP # BYTES MOV R5,R0 ;NOW WE MUST MANUALLY 0FILL 2$: CMP R0,#DBUFF+1000 BGE 3$ CLRB (R0)+ BR 2$ 3$: .WRITW #WRAREA,#2,#DBUFF,#400,BLOCK BCS WDERR ;ERROR INC BLOCK ;ANOTHER BLOCK MOV #DBUFF,R5 ;RESET DISK BUFFER INDEX 1$: RTS PC WDERR: .PRINT #MM4 ;DISK ERROR JMP DONALL ;OPEN THE DISK FILE FOR A WRITE OBJEXT: .RAD50 /OBJ/ BINEXT: .RAD50 /BIN/ OPNDSW: MOV #DBUFF,R5 ;RESET DSK BUFFER POINTER CLR THUFLG CLR BLOCK ;START AT BLOCK 0 CLR BINFLG .PRINT #PRMPT ;ASK USER MOV SP,R3 .CSISPC #CSAREA,#DEFEXT,#0 ;ASK USER FOR FILE NAME BCS OER1 CMP BINEXT,FILENM+6 ;DID HE TYPE .BIN? BEQ 10$ ;BR IF YES CMP OBJEXT,FILENM+6 ;DID HE TYPE .OBJ? BNE 9$ ;BR IF NO 10$: MOV #177777,BINFLG ;YES, DEFAULT TO BIN 9$: MOV (SP)+,R0 ;GET THE SWITCH COUNT BEQ OP1DSW ;NO SWITCHES 4$: MOV (SP)+,R1 ;GET SWITCH BGE 5$ ;NO VALUE TST (SP)+ ;POP OFF VALUE 5$: CMPB #'B,R1 ;WAS IT B? BNE 6$ ;NO MOV #177777,BINFLG ;YES, SET BINARY FORMAT FLG 6$: CMPB #'N,R1 BNE 7$ ;NOT N BIS #177777,THUFLG 7$: CMPB #'A,R1 ;/A? BNE 8$ ;NO CLR BINFLG ;YES, GO TO ASCII FMT 8$: DEC R0 ;ANOTHER SWITCH? BNE 4$ ;YES ;ENTRY TO JUST OPEN PREVIOUSLY TYPED FILE OP1DSW: .FETCH #DHNDLR,#FILENM ;GET DSK HANDLER BCC 1$ JMP 17$ 1$: .LOOKUP #TLAREA,#2,#FILENM,#-1 BCS 2$ ;SHOULDN'T FIND THE FILE TST NOWARN ;SHOULD WE WARN HIM? BNE 8$ ;NO TST THUFLG BNE 8$ .PRINT #MM14 ;TELL HIM FILE EXISTS .TTYIN ;WAIT FOR RESPONSE MOV R0,R1 ;SAVE THE RESPONSE 7$: .TTYIN ;CLR OUT BUFFER CMP #12,R0 ;WAIT FOR LF BNE 7$ ;WAIT UNTIL CLR .CLOSE #2 ;CLOSE THE FILE BIC #177600,R1 ;CLR OUT OTHER BITS CMP R1,#'Y ;YES? BNE OPNDSW ;ANYTHING ELSE, DON'T DELETE BR 2$ ;FILE WASN'T OPENED 8$: .CLOSE #2 ;CLOSE THE FILE 2$: .ENTER #ENAREA,#2,#FILENM,#-1 BCS OER3 MOV #MDTAB,MDPNTR ;RESET FORMAT CONTROL POINTER TST BINFLG ;ARE WE BINARY FORMAT? BEQ 40$ ;NO MOV #MDBTAB,MDPNTR ;IF BIN OR OBJ, DIFFERENT PACKING FMT 40$: RTS PC ;THE DSK FILE IS OPENED 17$: .PRINT #MM6 JMP OPNDSW ;TRY AGN OER1: .PRINT #MM7 JMP OPNDSW ;TRY AGN OER3: .PRINT #MM3 .EXIT ;OPEN A FILE FOR READING FROM THE DSK OPNDSR: MOV #DBUFF,R5 ;RESET DSK BUFFER POINTER CLR BLOCK ;START AT BLOCK 0 CLR BINFLG CLR UNLSW ;DON'T UNLOAD TAPE YET .PRINT #PRMPT ;ASK USER MOV SP,R3 .CSISPC #CSAREA,#DEFEXT,#0 ;ASK USER FOR FILE NAME BCS OER1 CMP BINEXT,FILENM+6 ;DID HE TYPE /BIN? BEQ 10$ ;BR IF YES CMP OBJEXT,FILENM+6 ;DID HE TYPE /OBJ? BNE 9$ ;NO 10$: MOV #177777,BINFLG ;YES, SET DEFAULT TO BIN 9$: MOV (SP)+,R0 ;GET THE SWITCH COUNT BEQ OP1DSR ;NO SWITCHES 4$: MOV (SP)+,R1 ;GET SWITCH BGE 3$ ;NO VALUE TST (SP)+ ;POP OFF VALUE 3$: CMPB #'U,R1 ;WAS IT U? BNE 2$ ;NO MOV #177777,UNLSW ;YES, SET LAST FILE FLG TST FILENM+2 ;IF NO FILE, DONE BNE 2$ JMP DONALL ;NULL FILENM, REW AND EXIT 2$: CMPB #'B,R1 ;B? BNE 6$ ;NO MOV #177777,BINFLG ;YES, BINARY FORMAT 6$: CMPB #'A,R1 ;/A? BNE 8$ ;NO CLR BINFLG ;YES, SET TO ASCII 8$: DEC R0 ;ANOTHER SWITCH? BNE 4$ ;YES OP1DSR: .FETCH #DHNDLR,#FILENM ;GET DSK HANDLER BCC 11$ JMP 33$ 11$: .LOOKUP #LKDARE,#1,#FILENM BCC 7$ .PRINT #MM16 BR OPNDSR 7$: MOV R0,FILLEN ;GET FILE LENGTH CLR DMPNTR ;RESET THE PACKING INDEX TST BINFLG ;BINARY MODE? BEQ 10$ ;NO MOV #DMBTAB-DMTAB,DMPNTR ;YES 10$: RTS PC ;THE DSK FILE IS OPENED 33$: .PRINT #MM6 BR OPNDSR ;TRY AGN ;ROUTINE TO OPEN THE MAGTAPE FOR READ OPNRMT: .FETCH #MHNDLR,#MTRAD5 ;GET THE HANDLER BCC 1$ .PRINT #MM8 .EXIT 1$: .LOOKUP #LKAREA,#3,#MTRAD5,#0 BCS 3$ ;ERROR DURING LOOKUP .SPFUN #AR1,#3,#-5,,,#ERBLK BCS PRWE RTS PC ;AND DONE 3$: .PRINT #MM9 .EXIT PRWE: .PRINT #RWMSG .EXIT ;ROUTINE TO OPEN THE MAGTAPE FOR WRITE OPNWMT: .FETCH #MHNDLR,#MTRAD5 ;GET THE HANDLER BCC 1$ .PRINT #MM8 .EXIT 1$: .LOOKUP #L1AREA,#3,#MTRAD5,#0 BCS 3$ ;ERROR ON LOOKUP .SPFUN #AR1,#3,#-5,,,#ERBLK BCS PRWE MOV #MBUFF,R4 ;SET UP BUFFER INDEX RTS PC ;AND DONE 3$: .PRINT #MM11 .EXIT ;ROUTINE TO FINISH OFF THE FILE ON MTA WRMEOT: JSR PC, WTMSUB ;WRITE EOT JSR PC, WTMSUB ;AND AGAIN JSR PC, SPRSUB ;AND SP REV OVER 2ND ONE RTS PC WTMSUB: .SPFUN #WR1ARE,#3,#-1,,,#ERBLK ;WRT TM BCC 1$ TSTB @#52 ;TST ERR BYTE BEQ 1$ ;BR IF NOT HARD .PRINT #MM12 1$: RTS PC SPRSUB: .SPFUN #WR2ARE,#3,#-3,,#1,#ERBLK ;SP REV 1 FILE BCC 1$ TSTB @#52 ;TST ERR BYTE BEQ 1$ ;BR IF NOT HARD .PRINT #MM13 1$: RTS PC ;ROUTINE TO READ A BLOCK FROM MAGTAPE RDMFIL: MOV #MBUFF+5000,LSTBYT ;SET UP LAST BYTE XFERED .SPFUN #RDAREA,#3,#-8.,#MBUFF,#2400,#ERBLK BCC 10$ ;NO ERROR TSTB @#52 ;CHK ERR BYTE BEQ 3$ ;BR IF NOT HARD ERROR CMP #6,ERBLK ;REC TOO SHORT? BEQ 6$ .PRINT #BMSG BR 10$ 6$: MOV #MBUFF+5000,R0 MOV ERBLK+2,R1 ;GET DIFFERENCE COUNT (WDS) ASL R1 ;CONVT TO BYTES SUB R1,R0 MOV R0,LSTBYT ;SET UP LAST BYTE XFERED ;THE FOLLOWING DIVIDE BY 5 LOOP IS TO SEE IF THERE WAS AN ODD NUMBER OF BYTES ;TRANSFERRED FROM THE 10. RT-11 ISN'T SMART ENOUGH TO KNOW WHETHER THERE WAS ;AN ODD NUMBER OF BYTES BECAUSE IT COUNTS WORDS NOT BYTES. WE MUST SEE IF 5 ;GOES EVENLY INTO THE NUMBER OF WORDS TIMES 2 (= # BYTES). IF NOT, WE KNOW WE ;HAD ONE LESS BYTE THAN WE THOUGHT ON THE BASIS OF WORD COUNT. MOV #5000,R0 ;GET MAX REC CNT SUB ERBLK+2,R0 ;CALCULATE # WDS XFERED CLR R1 ;INIT DIVIDE BY 5 QUOTIENT 5$: CMP R1,R0 ;COUNTS EQUAL? BEQ 10$ ;YES, EVEN # BYTES XFERED BGT 7$ ;NO, BIGGER, ODD # BYTES ADD #5,R1 ;ADD IN ANOTHER 5 BR 5$ ;LOOP BACK 7$: DEC LSTBYT ;HERE IF ODD # BYTES, FIX COUNT BR 10$ 3$: BITB #1,ERBLK ;TEST ERROR BNE 2$ ;BR IF WE HIT TM 10$: ADD #2,(SP) ;GIVE RECORD RTN 2$: MOV #MBUFF,R4 ;RESET BUFFER INDEX MOV #MDTAB,MDPNTR ;RESET FORMAT CONTROL POINTER TST BINFLG ;ARE WE BINARY FORMAT? BEQ 4$ ;NO MOV #MDBTAB,MDPNTR ;IF BIN OR OBJ, DIFFERENT PACKING FMT 4$: RTS PC ;FILE TO WRITE ON MAGTAPE FROM MTAPE BUFFER WRMFIL: CMP #MBUFF,R4 ;ANYTHING THERE? BEQ 1$ ;NO CMP #12,DMPNTR ;FORMAT 0? BEQ 2$ ;YES, NO EXTRA BYTES BLT 4$ ;IF BINARY MODE TST DMPNTR ;THIS CODE MAKES SURE THAT BEQ 2$ ;WE WRITE AN EVEN 3$: CLRB (R4)+ ;NUMBER OF PIP-10 INC DMPNTR ;WORDS ON THE TAPE SO THE 10 INC DMPNTR ;DOESN'T FILL IN GARBAGE FOR THE CMP #12,DMPNTR ;REST OF THE FRAMES IN THE WORD BNE 3$ 2$: CMP R4,#MBUFF+24 BGE 6$ ;OK LENGTH CLRB (R4)+ ;TOO SHORT, PROTECT AGNST NOISE RECORDS BR 2$ 6$: MOV R4,R0 ;YES, COPY THE INDEX SUB #MBUFF,R0 ;CALCULATE # BYTES BIT #1,R0 ;ODD? BEQ 7$ ;NO, OK MOV #5,R1 ;YES, CLR OUT OTHER 5 BYTES 8$: CLRB (R4)+ INC R0 DEC R1 ;ANOTHER BYTE?? BNE 8$ 7$: ASR R0 MOV R0,MSIZE ;# WDS TO WRITE .SPFUN #WRTARE,#3,#-7.,#MBUFF,MSIZE,#ERBLK BCC 5$ ;ERROR .PRINT #BWMSG 5$: MOV #MBUFF,R4 ;RESTORE THE INDEX CLR DMPNTR ;RESET THE PACKING INDEX TST BINFLG ;BINARY MODE? BEQ 1$ ;NO MOV #DMBTAB-DMTAB,DMPNTR ;YES 1$: RTS PC 4$: CMP #16,DMPNTR ;IN MIDDLE OF BINARY PACK? BNE 2$ ;NO CLRB (R4)+ CLRB (R4)+ ;YES, CLR SO EVEN NR PDP-10 WDS CLRB (R4)+ BR 2$ ;DESCRIPTION OF FORMAT CONVERSION: ;THE PDP-10 WRITES ON TAPE IN CORE-DUMP IN THE FOLLOWING MANNER: ; (THE 1ST FRAME BITS GO 17 16 15 14 13 12 11 10 ; (THE 2ND FRAME BITS GO 27 26 25 24 23 22 21 20 ; AND 17 IS THE HIGH ORDER BIT.) ; SO TAPE BIT 34 WOULD BE 3RD FRAME, OCTAL 020 ;PDP-10 BITS TO TAPE CONVERSION: ;("/" IN THE PDP-10 WORDS INDICATES DIVISIONS BETWEEN 7BIT ASCII CHARACTERS) ;-10 BIT: 0 1 2 3 4 5 6/ 7 8 9 10 11 12 13/ 14 15 16 17 ; TAPE: 17 16 15 14 13 12 11 10--27 26 25 24 23 22 21 20--37 36 ;-10 BIT: 18 19 20/ 21 22 23 24 25 26 27/ 28 29 30 31 32 33 34/ 35 ; TAPE: 35 34 33 32 31 30--47 46 45 44 43 42 41 40--53 52 51 50 ;(TAPE BITS 57, 56, ARE 0) ;(TAPE BIT 55 IS SAME AS 41, 54 SAME AS 40) ;(PDP-10 BIT 35 ON SIGNIFIES LINE NUMBER FOR SOS FILES) ;PDP-11 TO TAPE CONVERSION: ;PDP-11 BIT: 15 14 13 12 11 10 9 8-- 7 6 5 4 3 2 1 0 ;TAPE BIT: 27 26 25 24 23 21 21 20--17 16 15 14 13 12 11 10 ;PDP-10 BINARY PACKING FORMAT OF PDP-11 BINARY FILES: ;(PDP-10 BITS 0, 1, 18, 19 ARE 0) ;-10 BIT: 0 1/ 2 3 4 5 6 7 8 9/ 10 11 12 13 14 15 16 17/ ;-11 BYTE: 0 0- 27 26 25 24 23 22 21 20- 17 16 15 14 13 12 11 10 ;-10 BIT: 18 19/ 20 21 22 23 24 25 26 27/ 28 29 30 31 32 33 34 35 ;-11 BYTE: 0 0- 47 46 45 44 43 42 41 40- 37 36 35 34 33 32 31 30 ;THIS ROUTINE MOVES DATA FROM THE TAPE ;BUFFER (INDEXED BY R4) TO THE DSK BUFFER ;(INDEXED BY R5) AND CONVERTS THE DATA ;TO THE PDP-10 PACKING STYLE. MT.DSK: MOV @MDPNTR,R0 ;GET THE INDEX JMP (R0) ;JUMP THRU TABLE MDPNTR: 0 ;CURRENT JUMP ADR MDTAB: BYT1 ;ASCII BYT2 BYT3 BYT4 BYT5 BYT1 SKTAB: SKPTAB ;SKIP THE TAB FOLLOWING LINE NUMBER MDBTAB: BBYT1 ;BIN OR OBJ BBYT2 BBYT1 ;HANDLE 1ST PDP-10 BYTE ;PDP-10 BITS 0 TO 6 BYT1: MOV R4,R0 ;COPY MTA INDEX ADD #4,R0 ;LOOK AT BYTE #5 CMP R0, LSTBYT ;EXCEEDED BUFFER? BGE BYT1A ;YES, SAME FORMAT BITB #1,(R0)+ ;IS BIT 35 FROM THE PDP-10 ON? BEQ BYT1A ;NO, IT'S REGULAR LINE MOV R0,R4 ;YES, LINE NUMBER. SKIP THE WORD MOV #SKTAB,MDPNTR ;SET UP TO SKIP THE TAB, TOO RTS PC SKPTAB: TSTB (R4)+ ;DELETE THE TAB MOV #MDTAB+2,MDPNTR ;SET UP FOR NORMAL CONVRT NEXT BYTE RTS PC ;AND DONE BYT1A: MOV #MDTAB,MDPNTR ;RESET POINTER MOVB (R4)+,R0 BR BD1 ;HANDLE 2ND PDP-10 BYTE. ;PDP-10 BITS 7-13 BYT2: MOVB -(R4),R0 SWAB R0 CLRB R0 ;CLR OTHER BYTE TSTB (R4)+ BISB (R4)+,R0 BR BD2 ;HANDLE 3RD PDP-10 BYTE ;PDP-10 BITS 14-20 BYT3: MOVB -(R4),R0 SWAB R0 CLRB R0 ;CLR OTHER BYTE TSTB (R4)+ BISB (R4)+,R0 BR BD3 ;HANDLE 5TH PDP-10 BYTE: ;PDP-10 BITS 28 TO 34 BYT5: MOVB -(R4),R1 ASL R1 ASL R1 ASL R1 BIC #177607,R1 TSTB (R4)+ MOVB (R4)+,R0 ASR R0 BIC #177740,R0 ;NEED ONLY 3 BITS FROM LAST FRAME BISB R1,R0 BR BYTDN1 ;HANDLE 4TH PDP-10 BYTE ;PDP-10 BITS 21-27 BYT4: MOVB -(R4),R0 SWAB R0 CLRB R0 ;CLR OTHER BYTE TSTB (R4)+ BISB (R4)+,R0 ASR R0 BD3: ASR R0 BD2: ASR R0 BD1: ASR R0 BYTDN1: BIC #177600,R0 TSTB R0 ;DELETE ZERO BYTES BEQ BDN1 BYTBDN: MOVB R0,(R5)+ ;ALLOW 0'S IN BINARY CMP R5,#DBUFF+1000 ;IS DSK BUFFER FULL? BLT BDN1 ;NO JSR PC,WRDFIL ;YES, DO AND OUT DSK BDN1: INC MDPNTR INC MDPNTR ;NEXT TABLE ENTRY RTS PC ;HANDLES PDP-10 16 BIT BYTE, BITS 2 TO 17 BBYT1: MOV #MDBTAB,MDPNTR ;RESET POINTER MOVB (R4)+,R0 SWAB R0 CLRB R0 ;CLR OTHER BYTE BISB (R4)+,R0 ASL R0 ASL R0 MOVB (R4),R1 BIC #177477,R1 ASL R1 ASL R1 SWAB R1 BB2C: BIS R1,R0 MOVB R0,(R5)+ SWAB R0 BR BYTBDN ;HANDLES 16 BIT BYTE IN BITS 20 TO 35 BBYT2: MOVB (R4)+,R0 SWAB R0 CLRB R0 BISB (R4)+,R0 ASL R0 ASL R0 ASL R0 ASL R0 MOVB (R4)+,R1 BIC #177700,R1 BR BB2C ;ROUTINE TO CONVERT FROM DSK PACKING TO PDP-10 TAPE PACKING DSK.MT: MOV DMPNTR,R0 ;GET PACKING INDEX JMP @DMTAB(R0) ;JUMP THRU TABLE DMPNTR: 0 DMTAB: DBYT1 ;CONVRTS IN ASCII FORMAT DBYT2 DBYT3 DBYT4 DBYT5 DBYT1 ;WRAP AROUND DMBTAB: DBBYT1 DBBYT2 DBBYT1 ;CONVRT 1ST BYTE TO PDP10 BITS 0-6 DBYT1: CLR DMPNTR ;RESET FORMAT POINTER MOVB (R5)+,R1 ;GET A BYTE FROM DSK BUFFER BEQ DONDB1 ;IF 0, RTN ASL R1 ;SHIFT LEFT BR DBPUT ;STORE IN MTA BUFFER ;CONVRT 2ND BYTE TO PDP10 BITS 7-13 DBYT2: MOVB (R5)+,R0 BEQ DONDB1 ;IF NEW BYTE 0, RTN MOV R0,R1 ;COPY IT ROLB R0 ROLB R0 ROLB R0 BIC #177776,R0 ;SAVE HI BIT BISB R0,-(R4) ;SET UP LO BIT OF 1ST WD INC R4 ;FUDGE INDEX ASL R1 ASL R1 BR DBPUT ;PUT NEW CHAR IN BUFFER ;CONVRT 3RD BYTE TO PDP10 BITS 14-20 DBYT3: MOVB (R5)+,R0 ;GET A NEW BYTE BEQ DONDB1 ;DON'T XMIT ZERO BYTES MOVB R0,R1 ;COPY IT ASL R0 ASL R0 ASL R0 SWAB R0 BIC #177774,R0 BISB R0,-(R4) INC R4 ;PUT INDEX BACK ASL R1 ASL R1 ASL R1 BR DBPUT ;CONVRT 4TH BYTE TO PDP10 BITS 21-27 DBYT4: MOVB (R5)+,R0 BEQ DONDB1 MOV R0,R1 ASR R0 ASR R0 ASR R0 ASR R0 BIC #177770,R0 BISB R0,-(R4) INC R4 ASL R1 ASL R1 ASL R1 ASL R1 BR DBPUT ;CONVRT 5TH BYTE TO PDP10 BITS 28-34 DBYT5: MOVB (R5)+,R0 BEQ DONDB1 MOV R0,R1 ASR R0 ASR R0 ASR R0 BIC #177760,R0 BISB R0,-(R4) INC R4 ASL R1 BIC #177701,R1 DBPUT: MOVB R1,(R4)+ ;STORE IN MTA BUFFER INC DMPNTR ;NEXT TABLE ENTRY INC DMPNTR CMP R4,#MBUFF+1200 BLT DONDB1 ;BR IF BUFFER NOT FULL YET JSR PC, WRMFIL ;FULL, OUTPUT IT DONDB1: RTS PC ;ROUTINE TO MOVE DATA FROM DSK TO TAPE IN BINARY PACKING DBBYT1: MOV #DMBTAB-DMTAB,DMPNTR ;RESET ROUTINE POINTER MOVB (R5)+,R1 ;GET A BYTE FROM DSK BUFFER MOV R1,OLDBYT ;SAVE FOR LATER SWAB R1 CLRB R1 BISB (R5)+,R1 MOV R1,TMP0 ;SAVE FOR LATER ROR R1 ROR R1 BICB #300,R1 MOVB R1,(R4)+ ;STORE IN MTA BUFFER MOV TMP0,R1 ;GET SAVED VALUE SWAB R1 ASR R1 ASR R1 BR DBPUT ;PUT THE OTHER ONE THERE TOO TMP0: 0 ;THIS ROUTINE HANDLES THE 2ND 16BIT BYTE DBBYT2: MOVB OLDBYT,R0 ;GET LEFTOVER FROM BEFORE SWAB R0 CLRB R0 MOVB (R5)+,R1 MOV R1,TMP0 ;SAVE FOR LATER BISB (R5),R0 ASRB R0 ASRB R0 ASR R0 ASR R0 BIC #60,R0 MOVB R0,(R4)+ ;FRAME 3 MOVB (R5)+,R0 ROR R1 ROR R1 ROR R1 ROR R1 ASL R0 ASL R0 ASL R0 ASL R0 BIC #177417,R0 BIC #360,R1 BIS R0,R1 MOVB R1,(R4)+ MOV TMP0,R1 ;RESTORE BIC #177760,R1 BR DBPUT .NLIST BEX BPRMPT: HDRMAC \EDIT HM1: .ASCII 'FOR 10 INTERCHANGE, TYPE MT:/W/N/A:'<15><12> .ASCII <11>'/(W - DSK TO TAPE, DEFAULT IS TAPE TO DSK)'<15><12> .ASCII <11>'/A: - MODIFY TAPE UNIBUS ADR TO .'<15><12> .ASCII <11>' TM11 DEFAULT IS 172520, TU16 IS 172440'<15><12> .ASCII 'USE THE /N SWITCH TO NOT WARN YOU IF YOU TYPE'<15><12> .ASCII /AN EXISTING FILE FOR OUTPUT THAT WILL BE CLOBBERED./<15><12> .ASCII 'YOU WILL THEN BE ASKED FOR FILE.EXT/B'<15><12> .ASCII <11>'/B IS BINARY PACKING, DEFAULT IS ASCII'<15><12> .ASCII /IF TAPE TO DSK, A FILE IS XFERED AND YOU ARE ASKED/<15><12> .ASCII /FOR THE NEXT FILE UNTIL 2 TM'S IN A ROW (EOT)/<15><12> .ASCII 'IF DSK TO TAPE, TYPE /U AFTER THE LAST FILE TO'<15><12> .ASCIZ /SIGNIFY THE LAST FILE. OR TYPE ^C TO THE FILE PROMPT/<15><12> MM3: .ASCIZ/?OUT CHAN BUSY/ MM4: .ASCIZ/FATAL DISK WRT ERROR (DISK FULL?)/ MM5: .ASCIZ/FATAL DISK READ ERROR/ MM6: .ASCIZ /?DISK DEV FETCH BARFED/ MM7: .ASCII /?SYNTAX ERROR/<15><12>/ /<200> MM8: .ASCIZ/TAPE FETCH BARFED/ MM9: .ASCIZ/LOOKUP ON MT BARFED/ MM11: .ASCIZ/LOOKUP ON MT BARFED/ MM12: .ASCIZ/ERROR DURING WRT TAPE MARK/ MM13: .ASCIZ/ERROR DURING SPACE REV/ MM14: .ASCII/FILE ALREADY EXISTS... DELETE (Y OR N) - /<200> MM16: .ASCIZ/FILE NOT FOUND/ BMSG: .ASCIZ /?HARD TAPE READ ERROR, CONTINUING.../ BWMSG: .ASCIZ/?HARD WRT TAPE ERROR, CONTINUING.../ PRMPT: .ASCII /TYPE FILE.EXT - /<200> RWMSG: .ASCIZ/REWIND ERROR/ .LIST BEX .EVEN DEFEXT: .RAD50 /TEN/ ;DEFAULT EXTENSIONS .RAD50 /TEN/ .RAD50 /TEN/ .RAD50 /TEN/ .EVEN ;BUFFERS MUST START ON WORD BOUNDARIES MBUFF: .BLKW 2400 ;MTA DATA BUFFER 0 ;IN CASE OVERFLOW OF BUFFER DBUFF: .BLKW 400 ;DSK DATA BUFFER 0 ;IN CASE OVERFLOW OF INDEX MHNDLR: .BLKW 3000 DHNDLR: .BLKW 3000 .END START