Directory of image this file is from
This file as a plain text file
TITLE SEND3 -- PIM MODE SEND/RECEIVE ROUTINE SUBTTL FOR PDP-8 <==> PDP-10 COMMUNICATION XALL ;SEND AND RECEIVE FILES TO DEVICE 'TTY:' ; ;SEND: PDP8 --> PDP10 ;RECEIVE: PDP10 --> PDP8 ; NOTE: "SEND" AND "RECEIVE" ARE DEFINED FROM THE ; POINT OF VIEW OF THE PDP-8. ; ; IN RESPONSE TO THE "*" PROMPT, ENTER: ; ; FILENAME=[/SWITCH] ;FOR 'SEND' (8-->10) ; ALLOWED SWITCHES: ; NONE SEND ASCII MODE ; /B SEND BINARY (SKED) MODE ; ; FILENAME[/SWITCH] ;FOR 'RECEIVE' (10-->8) ; ALLOWED SWITCHES: ; NONE RECEIVE ASCII MODE ; /B RECEIVE BINARY (SKED) MODE ; /I RECEIVE IMAGE (PAL10) MODE ; ; NOTE: BINARY (SKED) MODE CAN ALSO BE USED FOR SAVE ; FILES, ALTHOUGH THE FORMAT OF THE FILE ON THE PDP-10 ; HAS NO MEANINGFUL RELATIONSHIP TO THE FORMAT ON THE PDP-8. ;ADDITIONS THAT WOULD BE NICE: ; 1. ALLOW "/P" ON 10-->8 MEAN THE SAME AS FOR "PIP". ; I.E. HANDLE FORTRAN CARRIAGE CONTROL CHARACTERS. ; 2. ALLOW EXPLICIT PPN'S AND SFD'S. .JBVER==137 ;SET VERSION # FOR MONITER LOC .JBVER 6 RELOC ;VARIOUS DEFINITIONS NOT KNOWN TO <FAIL> COMPILER: OPDEF IONDX. [CALLI 127] OPDEF IONEOU [TTCALL 15,] TTY==1 ;INPUT CHANNEL OUNIT==2 ;OUTPUT CHANNEL .IOASC==0 .IOASL==1 .IOPIM==2 .IOIMG==10 .TOXON==2002 .TOTAP==2020 .TOPAG==2021 .TOPBS==2037 .TOOUC==5 IO.EOF==20000 .TOCIB==3 .TOCOB==4 ON==1 OFF==0 ;DEFINE ACCUMULATORS ------- T1=1 ;TEMPORARY - CHARACTER POINTER FOR COMMAND LINE ; CODE/DECODE BINARY WORD T2=2 ; CHARACTER COUNTER FOR COMMAND LINE ; DECODE BINARY WORD T3=3 ; GET CHARACTER AFTER ^Z P=4 ;SAVES PC FOR CALLS TO GET/PUT CHAR=5 ;HOLDS CHARACTER BEING PROCESSED A1=6 ;CONTAIN TRMOP. PARAMETERS A2=7 ; UDX A3=10 ;CTRL-C CHECK ON "RECEIVE" TP=11 ; POINTS TO A1-3 FOR TRMOP. FUNCTIONS OPT=12 ;RIGHT HALF: ; 0 IF ASCII (.IOASC) ; NON-ZERO IF (SKED) BINARY OR IMAGE (.IOIMG) ;LEFT HALF: ; -1 IF RECEIVE (OUTPUT FROM 10) ; CLEARED WHEN EOF READ ; 0 IF SEND (INPUT TO 10) ; WILL BE SET TO -1 DURING RECEIPT OF ; CKSUM TO PREVENT RECURSION IN <GET>. PB=13 ;SAVES PC FOR BINARY GET/PUT CALL CKSUM=14 ;CHECKSUM PP=15 ;POINTER TO APPROPRIATE GET/PUT ROUTINE ;MACRO TO PRINT ERROR MESSAGES DEFINE ERROR(MSG)< JRST [JSP PB,PIMOFF ;RESET TERMINAL PARAMETERS IF INPUT OUTSTR [ASCIZ\ ? [SEND] MSG \] EXIT] > K232: 0,,232 DEFINE OERROR(MSG)< JRST [IONEOU K232 IONEOU K232 IONEOU [0,,312] IONEOU [0,,377] ;THESE THREE WORDS MAKE A CHECKSUM IONEOU [0,,357] ;FOR ^Z ^Z OUTSTR [ASCIZ\ ? [RECEIVE] MSG \] EXIT] > ;TEXT FOR BUILDING CHECKSUM ERROR MESSAGE CKERTX: ASCIZ\ ? CHECKSUM ERROR \ CKTX=.-1 0,,0 ASCIZ\ \ ;PARAMETERS FOR OPENING DISK IN/OUT FILE ODEV: .IOASC SIXBIT/DSK/ XWD OBUFR,0 OBUFR: BLOCK 3 ONAME: SIXBIT/OUTPUT/ SIXBIT/FILE/ XWD 0,0 ;PROTECTION XWD 0,0 ;PPN TTYIN: BLOCK 3 ;(ALSO USED FOR TTY OUTPUT)
SEND: RESET ;ENTRY POINT!!!!!!!!!!!!!!!!! OUTCHR ["*"] ;GET NAME OF THE INPUT OR OUTPUT FILE ON THE DISK ; AND DECODE SWITCHES. SETZM ONAME SETZM ONAME+1 SETZM ONAME+2 SETZM ONAME+3 SETZM CKSUM MOVE P,[XWD OBUFR,0] ;DEFAULT SETUP IS FOR OUTPUT (SEND) MOVEM P,ODEV+2 MOVE PP,[XWD PUTA,GET] ;DEFAULT MODE IS ASCII HRROI OPT,.IOASC HRRZM OPT,ODEV MOVE T1,[SIXBIT/DSK/] MOVEM T1,ODEV+1 MOVEI T2,6 ;SIX CHARACTERS FOR FILE NAME MOVE T1,[POINT 6,ONAME] ;SETUP POINTER TO LOAD NAME OFLOOP: INCHWL CHAR CAIN CHAR,15 ;<CR> MEANS END OF LINE JRST XNAME CAIN CHAR,"." ;ARE WE STARTING EXTENSION? JRST [MOVE T1,[POINT 6,ONAME+1] MOVEI T2,3 ;THREE CHARACTERS FOR EXTENSION JRST OFLOOP] CAIN CHAR,"/" ;ARE WE STARTING OPTION FIELD? JRST [HRRI OPT,.IOIMG ;YES - DISK IN IMAGE MODE ;FOR ANY LEGAL OPTION HRRZM OPT,ODEV INCHWL CHAR ;YES - GET OPTION CHARACTER CAIN CHAR,"B" JRST [MOVE PP,[XWD PUTB,GETB] JRST OFLOOP] CAIN CHAR,"I" JRST [MOVE PP,[XWD PUTI,[ERROR <BAD SWITCH>]] JRST OFLOOP] OERROR <BAD SWITCH>] CAIN CHAR,"=" JRST [HRRZS OPT, JRST OFLOOP] CAIN CHAR,":" ;CHECK FOR DEVICE SPECIFICATION JRST [MOVE T1,ONAME MOVEM T1,ODEV+1 JRST OFLOOP-2] ;THE CHARACTER WAS NOT AN OPTION, <CR>, ;".", OR "=". THUS IT MUST BE PART ;OF THE FILENAME OR EXTENSION. HRROS OPT, ;IF THERE'S AN "=", IT MUST BE ;AFTER FILE NAME ADDI CHAR,40 ;CHANGE TO SIX BIT IDPB CHAR,T1 SOJGE T2,OFLOOP OERROR <BAD SYNTAX>
XNAME: CLRBFI ;THIS GETS RID OF THE <LF> LEFT ;IN THE BUFER. ;IF LEFT THERE, IT WOULD SCREW UP ;INPUT AND EXIT FUNCTIONS. JUMPL OPT,XNAME2 ;GO PROCESS RECEIVE (PDP10 --> PDP8) ;OPEN DISK FILE FOR OUTPUT (SEND: PDP8 --> PDP10) OPEN OUNIT,ODEV ;OPEN OUTPUT DEVICE - DSK:<FILENAME> OERROR <ERROR OPENING DSK> OUTBUF OUNIT,3 ENTER OUNIT,ONAME OERROR <ERROR ENTERING OUTPUT FILE> OPEN TTY,[.IOPIM ;OPEN TTY IN PIM MODE SIXBIT/TTY/ XWD 0,TTYIN] OERROR <CAN'T OPEN TTY PIM> INBUF TTY,14 MOVE TP,[XWD 3,A1] ;SET TRMOP. POINTER MOVEI A2,TTY IONDX. A2, ;GET UDX OERROR <IONDX. ERROR> MOVEI A1,.TOCIB ;DO CLRBFI IN CASE THE NAME 'TTY' TRMOP. TP, ;WAS ASSIGNED TO SOME OTHER TERMINAL. ERROR <.TOCIB TRMOP. ERROR> MOVEI A1,.TOPAG MOVEI A3,OFF TRMOP. TP, ;SET TTY NO PAGE ERROR <PAGE TRMOP. ERROR> MOVEI A1,.TOXON MOVEI A3,ON TRMOP. TP, ;SET TTY TAPE ERROR <XON TRMOP. ERROR> MOVEI A1,.TOTAP TRMOP. TP, ERROR <TAPE TRMOP. ERROR> MOVEI A1,.TOPBS HRLZI A3,232000 TRMOP. TP, ;SET PIM MODE BREAK CHARACTER ^Z ERROR <.TOPBS ERROR> MOVEI A3,21 ;OUTPUT INITIAL ^Q MOVEI A1,.TOOUC TRMOP. TP, ERROR <CAN'T OUTPUT ^Q>
;MAIN LOOP FOR "SEND" (PDP-8 --> PDP-10) LOOP: JSP P,(PP) ;READS CHARACTER FROM EITHER ;<GET> OR <GETB> LOOP1: SOSGE OBUFR+2 JRST [OUT OUNIT, JRST LOOP1 ERROR <OUTPUT ERROR>] IDPB CHAR,OBUFR+1 JRST LOOP
;GET CHARACTER ROUTINE FOR ASCII "SEND" GET: SOSGE TTYIN+2 ;SUBROUTINE TO GET ONE CHARACTER FROM ;BUFFER AND HANDLE BREAK CHARACTERS JRST [IN TTY, JRST GET ERROR <GET ERROR 1>] ILDB CHAR,TTYIN+1 JUMPL OPT,(P) ;NO RECUSION WHILE RECEIVING CKSUM ADDM CHAR,CKSUM ;ADD THIS CHARACTER TO CHECK-SUM AOJ CKSUM, ;CKSUM ALSO CONTAINS CHARACTER COUNT ; TO CONTROL FOR <NULL> CHARACTERS CAIE CHAR,232 JRST (P) ;RETURN UNLESS BREAK CHARACTER GET2: SOSGE TTYIN+2 JRST [IN TTY, JRST GET2 ERROR <GET ERROR 2>] ILDB T3,TTYIN+1 ;GET CHARACTER FOLLOWING THE ;BREAK CHARACTER ADDM T3,CKSUM ;ADD TO THE CHECKSUM AOJ CKSUM, JUMPE T3,(P) ;IF CHAR=0, BINARY 232 CAIE T3,232 ;2ND 232 MEANS REAL EOF JRST GET ;OTHERWISE BREAK CHARACTER ONLY JRST DONE
;CHARACTER GETTING ROUTINE FOR BINARY 8-->10 TRANSFER GETB: MOVE PB,P ;SAVE RETURN POINTER FOR RETURN JSP P,GET MOVEM CHAR,T1 JSP P,GET DPB CHAR,[POINT 8,T1,23] JSP P,GET DPB CHAR,[POINT 4,T1,15] LSH CHAR,-4 DPB CHAR,[POINT 4,T1,27] MOVE CHAR,T1 JRST (PB)
DONE: ;HERE AFTER 2 ^Z'S IN A ROW ;(MEANS END OF FILE) -- READ CHECKSUM SETO OPT, ;PROTECT FROM RECURSION JSP P,GETB JSP P,GET ;WAIT FOR & REMOVE ^Z FROM INPUT ADD CKSUM,T1 AND CKSUM,[77777777] JSP PB,PIMOFF ;RESET TERMINAL MODE, ETC. JUMPE CKSUM,DONE1 ;CHECKSUM CORRECT!!! CONTINUE AT DONE1 ; ;CHECKSUM WRONG!!! ; MOVEI T1,12 ;# DIGITS FOR CHECKSUM MOVE T2,[POINT 3,T3,5] MOVE A3,[POINT 7,CKTX] DONE2: ILDB CHAR,T2 ;PUT CKSUM IN TEXT STRING ADDI CHAR,60 IDPB CHAR,A3 SOJG T1,DONE2 OUTSTR CKERTX ;OUTPUT IT TO TTY MOVE T1,[SIXBIT\CSE\] ;CHANGE FILE NAME EXTENSION TO .CSE MOVEM T1,ONAME+1 OPEN OUNIT+1,[.IOASC SIXBIT/DSK/ XWD 0,0] ERROR <.CSE OPEN ERROR> LOOKUP OUNIT+1,ONAME ;DELETE THE .CSE FILE ;IF IT ALREADY EXISTS JRST .+3 ;NO .CSE FILE, NO DELETE NECESSARY RENAME OUNIT+1,[0,,0 0,,0] ERROR <.CSE DELETE ERROR> MOVEM T1,ONAME+1 ;RESET PARMS. LOOKUP MAY HAVE CHANGED SETZM ONAME+2 SETZM ONAME+3 RENAME OUNIT,ONAME ERROR <RENAME ERROR> DONE1: CLOSE OUNIT, JUMPE CKSUM,SEND ;RECYCLE UNLESS ERROR EXIT PIMOFF: MOVEI A1,.TOPBS SETZ A3, TRMOP. TP, ;PIM BREAK = 0,,0 JSP P,ERRORD MOVEI A3,OFF ;RESTORE TRMOP. FUNCTIONS MOVEI A1,.TOTAP TRMOP. TP, JSP P,ERRORD MOVEI A1,.TOXON TRMOP. TP, JSP P,ERRORD MOVEI A1,.TOPAG MOVEI A3,ON TRMOP. TP, JSP P,ERRORD MOVEI A1,.TOCIB TRMOP. TP, JSP P,ERRORD JRST (PB) ;PRINT ERROR MESSAGE FOR ERRORS DURING FINAL TRMOP. RESTORE ERRORD: OUTSTR [ASCIZ\ ? DONE ERROR \] JRST (P)
;OPEN FILE FOR INPUT -- PROCESS "RECEIVE" (PDP10 --> PDP8) XNAME2: MOVE T1,ODEV+2 ;SET POINTERS FOR INPUT HLRZM T1,ODEV+2 HLRZM PP,PP OPEN OUNIT,ODEV OERROR <ERROR OPENING DISK> INBUF OUNIT,3 LOOKUP OUNIT,ONAME OERROR <FILE NOT FOUND> OPEN TTY,[.IOPIM ;OPEN TTY IN PIM MODE SIXBIT/TTY/ XWD TTYIN,0] OERROR <CAN'T OPEN TTY PIM> OUTBUF TTY,14 ILOOP: SOSGE OBUFR+2 JRST [IN OUNIT, JRST ILOOP STATO OUNIT,IO.EOF OERROR <INPUT ERROR> JRST IDONE] ;END OF FILE ILDB CHAR,OBUFR+1 JSP P,(PP) JRST ILOOP
;PUT CHARACTER FOR ASCII RECEIVE PUTA: JUMPE CHAR,(P) ;IGNORE ASCII <NULL>'S TRO CHAR,200 ;MAKE CHARACTER "ALWAYS MARK" ;BECAUSE DEC HAS A SCREWEY WAY OF ;USING THEM ON THE PDP8. PUTI: PUT: SOSGE TTYIN+2 JRST [INCHRS A3 ;HAS USER TYPED ^C ? JRST [PUT1: OUT TTY, JRST PUT OERROR <PUT ERROR>] CAIE A3,003 JRST PUT1 EXIT] IDPB CHAR,TTYIN+1 ADDM CHAR,CKSUM AOJ CKSUM, JUMPE OPT,(P) ;EXIT HERE IF IN <IDONE> CAIE CHAR,232 JRST (P) SETZ CHAR, ;IN THIS DIRECTION, ALL 232'S ARE REAL ;DATA. THE EXTRA ZERO MUST BE SEND TO ;INDICATE SAME TO THE RECEIVER. JRST PUT ;PUT BINARY RECEIVE PUTB: MOVE PB,P MOVE T1,CHAR LDB CHAR,[POINT 8,T1,35] JSP P,PUT LDB CHAR,[POINT 8,T1,23] JSP P,PUT LDB T2,[POINT 4,T1,27] LSH T2,4 LDB CHAR,[POINT 4,T1,15] ADD CHAR,T2 JSP P,PUT JRST (PB) IDONE: MOVEI CHAR,232 ;EOF FOUND FOR SOURCE FILE. SETZ OPT, ;SEND TWO ^Z'S FOLLOWED BY THREE ;CHARACTER CHECKSUM. JSP P,PUT JSP P,PUT MOVN CHAR,CKSUM JSP P,PUTB OUT TTY, ;SEND OUT LAST BUFFER SKIPA OERROR <CAN'T CLOSE TTY> CLOSE TTY, EXIT END SEND