; TALK.MAC 30APR81 ; .TITLE TALK .ENABL LC ; ; PROGRAM TALK ; ; ; Written By: N.K.BEWTRA,COMPUTER SCIENCES CORPORATION ; ; Date Written: Dec. 16, 1980 ; ; Last Update: Apr. 30, 1981 ; ; ; Version 5 represents a major rewriting over Version 4, particularly ; for I/O to the port which are now handled through hardware ; character interrupt using the CINT$ ; directive. Version 4 was written by D. FIELD, COMPUTER ; SCIENCES CORPORATION on 8/28/79. ; ; Program modified by: Bob Turkelson ; Code 935 ; NASA/Goddard Space Flight Center ; Greenbelt, MD 20771 ; (301) 344-5003 ; ; Anyone who modifies this program is requested to kindly send a copy ; of the modifications to Bob Turkelson at the above address. ; ; ; ; Program TALK is a Terminal Communication Handler ( Terminal Emulator ) ; running under the RSX-11M Version 3.2 Operating System on any ; PDP-11 family computer. It allows the user to communicate with ; a host computer as a remote terminal. Features also include the ; ability to send files between the PDP-11 computer and the ; host or to copy anything sent by the host computer to ; a file on the PDP-11. ; ; ; This program uses the full-duplex terminal driver to interface with the ; the PDP-11 terminal under no-echo mode; characters are ; displayed on the screen only after receipt back from the ; host. This is in line with the protocol of the Honeywell(Xerox) ; Sigma-9 computer; the program was primarily written to ; communicate with this host for the NASA/GSFC Dynamics Explorer ; Mission. Characters received from the terminal are handled ; through AST interrupts. ; During redirected input, all non-control characters are ignored. ; ; ; For the interface with the port, this program uses the connect ; to interrupt vector CINT$ directive ( for both read and ; write ). Interface with the host is assumed through a ; DLV11-J, 4-channel asynchronous serial line interface, which ; appears as four separate DLV11-E's ( single line asynch ; line interface ) units. These modules receive serial data ; from the peripheral devices, assemble it into parallel data ; and transfer to the LSI-11 bus. The program would also work ; equally well with the DL11-J or DL11-E interfaces which transfer ; data to the Unibus. However, it will not work for a DZ11 type ; asynchronous multiplexer interface since separate vector ; interrupt and control/status registers are assumed for each ; port. ; ; TALK is a privileged task. ; ; ; Assemble instructions are: ; ; TALK,TALK/-SP/CR = [1,1]EXECML/ML,[uic]TALKPRE,TALK ; ; where TALKPRE.MAC is a prefix file which contains system ; dependent parameters. It may be necessary to edit the ; prefix file before assembling TALK. ; ; ; Task Build instructions are: ; ; TALK/MM/PR/-CP/-FP,TALK/-SP/MA = TALK ; [1,54]RSX11M.STB/SS ; [1,1]EXELIB/LB ; ; / ; ; PAR = GEN:0:40000 ; TASK=...TLK ; PRI=95 ; STACK=256 ; UNITS=4 ; ASG=SY:1:2,TI:4 ; ACTFIL=2 ; FMTBUF=0 ; GBLDEF=PAR$TY:200 ; // ; ; .PAGE ; ; ; ; SUMMARY OF DEVICE REGISTER FORMATS AND INTERRUPT VECTOR FORMAT ; ; ; NAME BIT NO 15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00 ; ; RCSR 0 0 0 0 0 0 0 0 RD RI 0 0 0 0 0 RE ; RBUF E O F P X X X X 7 OR 8 BITS OF DATA ; XCSR 0 0 0 0 0 0 0 0 TR TI 0 0 0 0 0 TB ; XBUF X X X X X X X X 7 OR 8 BITS OF DATA ; ; WHERE: ; ; X : NOT USED (0 ) ; RD : RECEIVE DONE [ READ ONLY ] ; SET WHEN ENTIRE CHARACTER RECEIVED ; CLEARED WHEN RBUF IS READ ; RI : RECEIVE INTERRUPT ENABLE (SET & CLEARED BY PROGRAM ; CONTROL ) READ/WRITE ; E : ERROR [READ ONLY] ; O : OVERFLOW ERROR [READ ONLY] ; F : FRAME ERROR [ READ ONLY ] ; P : PARITY ERROR [ READ ONLY ] ; TR : TRANSMIT READY ( SET WHEN XBUF IS EMPTY) [READ ONLY] ; TI : TRANSMIT INTERRUPT ENABLE ( UNDER PROGRAM CONTROL ) ; [READ/WRITE] ; TB : TRANSMIT BREAK [READ/WRITE] ; RE : READ ENABLE ( NOT USED ) ; ; ; ; IF RI IS SET, SETTING OF RD STARTS INTERRUPT SEQUENCE ; IF TI IS SET, SETTING OF TR WILL START INTERRUPT SEQUENCE ; ; ; Interrupt Vector contains the address of the device's interrupt ; service routine. Next word has the processor status (PS) ; word which contains the mode and priority of operation ; for the interrupt routine. ; ; ; EVENT FLAG DEFINITIONS: ; ; 1 Character in the terminal queue signal ; 1 Character in the port queue signal ; 8 PORT 'Transmit Ready' event flag. ; 9 QIO Terminal I/O completion flag. ; ; ; LUN ASSIGNMENTS: ; ; 1 REDIRECTED OUTPUT ; 2 REDIRECTED INPUT ; 4 TERMINAL ; ; .PAGE .SBTTL MACRO DEFINITIONS AND DATA AREA .ENABL LC ; .MACRO QIOMAC R, D, A, C, G ; MACRO TO SET UP DPB .IIF NB MOV D, R ; AND ISSUE DIR$ .IIF NB MOV A, Q.IOPL(R) ; ANY BLANK ARGUMENT .IIF NB MOV C, Q.IOPL+2(R) ; STOPS THAT PORTION OF CODE .IIF NB DIR$ R ; FROM BEING GENERATED .ENDM QIOMAC ; ; MACRO CALLS ; .MCALL ALUN$S, ASTX$S, DSAR$S, GMCR$, CLEF$S, SETF$S, WTSE$S, EXIT$S .MCALL HDRDF$, UCBDF$ .MCALL QIO$, QIOW$, DIR$ .MCALL FDBDF$, FDAT$A, FDRC$A, FDOP$A, FSRSZ$, FDBF$A,NMBLK$ .MCALL CSI$, CSI$1, CSI$2 .MCALL FINIT$, OPEN$R, OPEN$W, GET$, PUT$, CLOSE$ .MCALL CINT$ ; ; ; DEFINITIONS ; SPNCAR = 23 ; SUSPEND PORT QUEUE PROCESSING - ^S RESCAR = 21 ; RESUME PORT QUEUE PROCESSING - ^Q CMDCAR = 27 ; ENTER COMMAND MODE CHARACTER - ^W RDICAR = 111 ; REDIRECT INPUT CHARACTER - I CNICAR = 112 ; CANCEL REDIRECTED INPUT CHARACTER - J RDOCAR = 117 ; REDIRECT OUTPUT CHARACTER - O CNOCAR = 120 ; CANCEL REDIRECTED OUTPUT CHARACTER - P CGECAR = 105 ; CHANGE EOR CHARACTER - E EXICAR = 132 ; EXIT PROGRAM CHARACTER - Z XCCCAR = 103 ; TRANSMIT CONTROL CHARACTER CHARACTER - C RIHCAR = 101 ; REDIRECTED INPUT HELP CHARACTER - A ROHCAR = 102 ; REDIRECTED OUTPUT HELP CHARACTER - B MNUCAR = 115 ; DISPLAY MENU CHARACTER - M .IF DF SIGMA9 PROMPT = 33. ; SIGMA9 PROMPT (!) WTCHAR = 12 ; PROMPT FOR NEXT FILE READ .ENDC .IF DF RSX11 WTCHAR = 12 ; PROMPT FOR NEXT FILE READ .IF DF VAX PROMPT = 36. ; VAX/VMS PROMPT ($) .IFF PROMPT = 62. ; MCR PROMPT (>) .ENDC .ENDC OFBSIZ = 133. ; OUTPUT BUFFER SIZE INBSIZ = 133. ; INPUT BUFFER SIZE ; .PAGE .SBTTL PROGRAM IDENTIFICATION ; .IDENT /T05.04/ ; CHANGE PROGRAM ID IN THIS LINE AND THE NEXT INTRO: .ASCII <15><12>/TLK:Version T05.04/<15><12> LENINM=.-INTRO .EVEN .SBTTL TERMINAL I/O RELATED PARAMETERS CGEFLG: .BYTE 0 ; GET EOR CHARACTER FLAG BNMFLG: .BYTE 0 ; BUILD FILE NAME FLAG EXIFLG: .BYTE 0 ; EXIT PROGRAM FLAG CMDFLG: .BYTE 0 ; COMMAND MODE FLAG BCAFLG: .BYTE 0 ; BUILD COMMAND "A" FLAG BCBFLG: .BYTE 0 ; BUILD COMMAND "B" FLAG QERFLG: .BYTE 0 ; QUEUE OVERFLOW FLAG WT2FLG: .BYTE 0 ; WAIT FOR PROMPT FLAG HLPFLG: .BYTE 0 ; TALK IS HELPING WITH FILE TRANSFER SUSPND: .BYTE 0 ; SUSPEND PROCESSING OF PORT QUEUE PTOFF: .BYTE 0 ; PORT OUTPUT FROM HOST SUSPENDED FLAG .EVEN FNAME: .BLKB 31. ; AREA FOR BUILDING FILE NAME EKOBUF: .ASCII <0><15><12> ; AREA FOR ECHOING TERMINAL INPUT COMMANDS TMC: .BYTE TC.ACR, 0 ; SAVE WRAP AROUND MODE .BYTE TC.BIN, 0 ; SAVE BINARY INPUT MODE .BYTE TC.FDX, 0 ; SAVE DUPLEX MODE .BYTE TC.NEC, 0 ; SAVE ECHO MODE .BYTE TC.RAT, 0 ; SAVE TYPE AHEAD MODE .BYTE TC.8BC, 0 ; SAVE PASS 8 BITS MODE .BYTE TC.SCP, 0 ; SAVE CRT MODE SETMC: .BYTE TC.ACR, 0 ; SET NO WRAP AROUND .BYTE TC.BIN, 1 ; SET BINARY INPUT MODE .BYTE TC.CTS, 0 ; RESUME OUTPUT .BYTE TC.ESQ, 0 ; SET NO ESCAPE SEQUENCES .BYTE TC.FDX, 1 ; SET FULL DUPLEX MODE .BYTE TC.HLD, 0 ; SET NO HOLD SCREEN MODE .BYTE TC.NEC, 1 ; SET NO ECHO MODE .BYTE TC.RAT, 1 ; SET TYPE AHEAD MODE .BYTE TC.SLV, 0 ; SET NO SLAVE MODE .BYTE TC.TBF, 0 ; FLUSH TYPE AHEAD BUFFER .BYTE TC.8BC, 1 ; SET READ ALL BITS MODE ; .EVEN RVBTIO: QIOW$ IO.RVB, 4, 11, , IOSTAT WALTIO: QIOW$ IO.WAL, 4, 11, , IOSTAT DPBTIO: QIOW$ , 4, 11 ; .EVEN OFBUFF: .BLKB OFBSIZ ; OUTPUT FILE BUFFER OFBMAX = . ; MAXIMUM EXTENT OF OUTPUT FILE BUFFER ; .EVEN QUEUE: .BLKB QSIZET ; QUEUE AREA FOR TERMINAL MAXA = . -1 ; MAX ADDRESS FOR QUEUE ; .EVEN IOSTAT: .BLKW 2 ; I/O STATUS BLOCK OFBPTR: .BLKW 1 ; OUTPUT FILE BUFFER POINTER FRONT: .WORD QUEUE ; FIRST CHARACTER IN QUEUE BACK: .WORD QUEUE ; LAST CHARACTER IN QUEUE COUNT: .WORD QSIZET ; NUMBER OF FREE BYTES IN QUEUE NAMECT: .WORD ; NUMBER OF CHARACTERS IN FILE NAME LENCMD: .WORD ; LENGTH OF REMOTE COMMAND ; .EVEN ; CSI$ ; INITIALIZE CSI PACKAGE CSIBLK: .BLKB C.SIZE ; CREATE CSI CONTROL BLOCK ; .EVEN FDBOUT: FDBDF$ ; OUTPUT FILE FDB FDAT$A R.VAR,FD.CR ; VARIABLE LENGTH RECORDS FDRC$A , OFBUFF, OFBSIZ ; RECORD BUFFER FDOP$A 1, CSIBLK+C.DSDS,DFNOUT ; LUN = 1, LATCH ONTO FILENAME AREA DFNOUT: NMBLK$ TLKOUT,,,SY,0 ; DEFAULT NAME SY:TLKOUT.;0 FDBF$A ; INITIALIZE BLOCK BUFFER ; FDBIN: FDBDF$ ; INPUT FILE FDB FDRC$A , INBUFF, INBSIZ ; RECORD BUFFER FDOP$A 2, CSIBLK+C.DSDS,DFNIN ; LUN = 2, LATCH ONTO FILENAME AREA DFNIN: NMBLK$ TLKIN,,,SY,0 ; DEFAULT NAME SY:TLKIN.;0 FDBF$A ; INITIALIZE BLOCK BUFFER ; FSRSZ$ 2 ; INITIALIZE RECORD OPERATIONS .EVEN ; MCRLIN: GMCR$ ; ALLOCATE MCR COMMAND LINE BUFFER ; .IF DF CKFREE .EVEN CKCNTT: .WORD QSIZET ; MINIMUM FREE SPACE COUNT FOR TERMINAL QUEUE CKCNTP: .WORD QSIZEP ; MINIMUM FREE SPACE COUNT FOR PORT QUEUE NSLEEP: .WORD 0 ; NUMBER OF TIMES HOST PUT TO SLEEP .ENDC ; .PAGE .DSABL LSB ; ; DEFINE TABLES ; TBCHN: .IRPC Z,<012> .WORD TBC'Z ; TABLE FOR CHANNEL 'Z' .ENDM .IRPC Z,<012> TBC'Z': .WORD VECT'Z'R ; CHANNEL 'Z' RECEIVE VECTOR .WORD VECT'Z'X ; CHANNEL 'Z' TRANSMIT VECTOR .WORD RCSR'Z' ; CHANNEL 'Z' RECEIVE CONTROL/STATUS REGISTER .WORD RBUF'Z' ; CHANNEL 'Z' RECEIVE BUFFER .WORD XCSR'Z' ; CHANNEL 'Z' TRANSMIT CONTROL/STATUS REGISTER .WORD XBUF'Z' ; CHANNEL 'Z' TRANSMIT BUFFER .ENDM .PAGE .SBTTL PORT I/O RELATED PARAMETERS ; ; DUMMY MACROS FOR CONNECT/DISCONNECT INTERRUPTS FOR RECEIVE ; AND TRANSMIT RESPECTIVELY. ; CINTR: CINT$ 0,ISRBAS,PTINTR,PTEDIR,PR5 CINTX: CINT$ 0,ISRBAS,PTINTX,PTEDIX,PR5 DCINTR: CINT$ 0 DCINTX: CINT$ 0 ; ; ; ; DATA FROM HERE ON WILL MAP INTO KERNEL APR5 AND SHOULD BE ; LESS THAN 8K BYTES TO BE PROPERLY ADDRESSABLE. ; ; ;------ ISRBAS: ;------ ; RVECT: .WORD 0 ; VALUE OF RECEIVE VECTOR XVECT: .WORD 0 ; VALUE OF TRANSMIT VECTOR RCSR: .WORD 0 ; VALUE OF RECEIVE CONTROL/STATUS REG. XCSR: .WORD 0 ; VALUE OF TRANSMIT CONTROL/STATUS REG. RBUF: .WORD 0 ; VALUE OF RECEIVE BUFFER XBUF: .WORD 0 ; VALUE OF TRANSMIT BUFFER CHAR: .BYTE 0 ; INPUT CHARACTER RDIFLG: .BYTE 0 ; REDIRECTED INPUT FLAG RDOFLG: .BYTE 0 ; REDIRECTED OUTPUT FLAG EOR: .BYTE 15 ; EOR CHARACTER TMDATA: .BYTE 0 ; FLAG TO INDICATE TERMINAL DATA PTDATA: .BYTE 0 ; FLAG TO INDICATE PORT DATA PTISEF: .BYTE 0 ; FLAG TO SET EVENT FLAG AT PORT INTERRUPT QOVRPR: .BYTE 0 ; QUEUE OVERFLOW FLAG FOR PORT .EVEN RECCNT: .WORD 0 ; # OF UNSENT REDIRECTED INPUT RECORDS INBUFF: .BLKB INBSIZ ; INPUT FILE BUFFER .BLKB 1 ; EXTRA BYTE FOR .EVEN QUEUEP: .BLKB QSIZEP ; QUEUE AREA FOR PORT MAXAP = . -1 .EVEN FRONTP: .WORD QUEUEP ; ADDRESS OF FIRST CHARACTER IN PORT QUEUE BACKP: .WORD 0 ; NUMBER OF LAST CHARACTER IN PORT QUEUE ; ( RELATIVE TO BEGINNING OF QUEUE ); ; RANGE IS 0 TO QSIZEP-1. ; COUNTP: .WORD QSIZEP ; # OF FREE BYTES IN PORT QUEUE .EVEN .PAGE .SBTTL PTEDIR ; ; ; ENABLE/DISABLE INTERRUPTS SUBROUTINES ; ; AUTOMATICALLY CALLED WHEN: ; ; 1. THE TASK CONNECTS TO INTERRUPT VECTOR - ENABLE INTERRUPTS ; 2. THE TASK DISCONNECTS FROM THE INTERRUPT VECTOR - DISABLE ; INTERRUPTS ; 3. THE TASK IS ABORTED - DISABLE INTERRUPTS ; ; NOTE: THE REST OF THE CODE UNTIL AST: MUST BE IN PIC ; ; PTEDIR: ; PORT ENABLE/DISABLE ROUTINE FOR RECEIVE BCS 20$ ; IF CONDITION SET, DISABLE INTERRUPTS BISB #100,@RCSR ; ENABLE INTERRUPTS FOR RECEIVE RETURN 20$: BICB #100,@RCSR ; DISABLE INTERRUPTS FOR RECEIVE RETURN .PAGE ; ; ENABLE/DISABLE ROUTINE FOR PORT TRANSMIT ; .SBTTL PTEDIX PTEDIX: ; PORT ENABLE/DISABLE ROUTINE FOR TRANSMIT BCC 30$ ; IF CONDITION CLEAR, NO ACTION NECESSARY - ; ; WE DO NOT ENABLE INTERRUPTS FOR TRANSMIT ; ; AT THIS POINT BICB #100,@XCSR ; DISABLE INTERRUPTS FOR TRANSMIT 30$: RETURN .PAGE .SBTTL PTINTR ; ; ISR ROUTINE TO HANDLE THE RECEIPT/TRANSMISSION OF CHARACTERS ; TO THE PORT. THESE ROUTINES ARE ENTERED AT PRIORITY 5 ; (SPECIFIED IN CINT$) WITH: ; ; R4: SAVED AND AVAILABLE FOR USE ; R5: ADDRESS OF THE FORK BLOCK IN THE ITB ; ; ; PORT INTERRUPT ROUTINE FOR RECEIPT ; ; PTINTR: BICB #100,@RCSR ; DISABLE INTERRUPTS 1$: DEC COUNTP ; DECREASE FREE COUNT IN PORT QUEUE BNE 2$ ; CONTINUE TO PROCESS IF QUEUE NOT FULL MOVB #1,QOVRPR ; SET OVERFLOW QUEUE FLAG MOVB @RBUF,R4 ; EMPTY HARDWARE BUFFER INC COUNTP ; RESTORE COUNTER BR 3$ ; NOT ABLE TO STORE THIS CHARACTER 2$: MOV BACKP,R4 ; GET POSITION OF NEXT AVAILABLE BYTE IN QUEUE ADD PC,R4 ADD #QUEUEP-.,R4 ; GET THE PIC ADDRESS OF BYTE MOVB @RBUF,@R4 ; STORE THE RECEIVED CHARACTER INC BACKP ; INCREMENT COUNTER CMP BACKP,#QSIZEP ; ARE WE AT THE END OF THE QUEUE? BNE 3$ ; NO CLR BACKP ; YES, RESET BACKP TO 0 3$: MOVB #1,PTDATA ; INDICATE PORT DATA TSTB PTISEF ; DO WE SET THE EVENT FLAG? BEQ 4$ ; NO CALL @#$FORK2 ; CREATE SYSTEM FORK PROCESS CLR (R3) ; DECLARE FORK BLOCK FREE MOV #1,R0 ; EVENT FLAG=1 MOV X.TCB-X.FORK(R5),R5 ; R5 POINTS TO TCB OF THE TASK CALL @#$SETF ; CALL EXEC SUBROUTINE $SETF MOVB #1,PTDATA ; SET PORT DATA FLAG 4$: BISB #100,@RCSR ; ENABLE INTERRUPTS RETURN .PAGE .SBTTL PTINTX ; ; PORT INTERRUPT ROUTINE FOR TRANSMIT ; ; WE SIMPLY SET THE EVENT FLAG 8., INDICATING THAT THE INTERFACE ; IS READY FOR TRANSMISSION OF ANOTHER CHARACTER ; PTINTX: BICB #100,@XCSR ; DISABLE INTERRUPTS CALL @#$FORK2 ; CREATE SYSTEM PROCESS CLR (R3) ; DECLARE FORK BLOCK FREE MOV #10,R0 ; EVENT FLAG 8. TO BE SET MOV X.TCB-X.FORK(R5),R5 ; R5 POINTS TO TCB OF TASK CALL @#$SETF ; SET THE EVENT FLAG THROUGH EXECUTIVE CALL ; NOTE: INTERRUPTS ARE ENABLED ELSEWHERE WHEN A CHARACTER IS PLACED ; INTO THE TRANSMIT BUFFER RETURN ; ENSURE ISR+DATA+ENABLE/DISABLE ROUTINES ARE WITHIN ONE APR .IIF LT,<20000 - < .-ISRBAS > > .ERROR .PAGE .SBTTL SENDPR ; ; SUBROUTINE TO TRANSMIT DATA TO PORT ; HAVE TO WAIT FOR EVENT FLAG 8 SO THAT WE CAN SEND NEW CHAR ; SENDPR: WTSE$S #10 ; WAIT FOR THE EVENT FLAG 8. CLEF$S #10 ; CLEAR EVENT FLAG 8. MOVB CHAR,@XBUF ; MOVE THE CHARACTER INTO TRANSMISSION BUFFER BISB #100,@XCSR ; ENABLE INTERRUPTS RTS PC .PAGE .SBTTL AST ; AST: DEC COUNT ; DECREASE FREE COUNT IN QUEUE BY ONE BNE 1$ ; CONTINUE TO PROCESS IF QUEUE NOT FULL MOVB #1,QERFLG ; INDICATE QUEUE OVERFLOW FLAG INC COUNT ; RESET COUNT TST (SP)+ ; POP STACK FOR AST EXIT BR 2$ 1$: MOVB (SP)+, @BACK ; PUT CHARACTER ON QUEUE ADD #1, BACK ; SET BACK TO END OF QUEUE CMP BACK, #MAXA+1 ; POINTER OFF END OF QUEUE? BNE 2$ MOV #QUEUE, BACK ; RESET BACK OF QUEUE POINTER 2$: SETF$S #1 ; INDICATE THERE IS SOMETHING IN QUEUE MOVB #1,TMDATA ; INDICATE TERMINAL DATA PRESENCE ASTX$S .PAGE .SBTTL TALK ; TALK:: FINIT$ ; INITIALIZE FCS PACKAGE DIR$ #MCRLIN ; GET AND IGNORE MCR LINE QIOMAC R0,#WALTIO,#INTRO,#LENINM,Y ; WRITE INTRODUCTION MESSAGE JSR PC, CNPRT ; OBTAIN & CONNECT VECTOR FOR PORT BCS 2$ ; ERROR IN CONNECTING A DEVICE? MOV #DPBTIO, R1 ; MOV #TMC, R2 JSR PC, ATTDEV ; ATTACH THE TERMINAL, SET CHARACTERISTICS SETF$S #10 ; SET PORT I/O COMPLETION FLAG JSR PC, CONTRL ; WAIT FOR INPUT JSR PC, DCNPRT ; DISCONNECT THE PORT .IF DF CKFREE JSR PC, SUMRY ; PRINT SPACE USED DURING RUN .ENDC MOV #DPBTIO, R1 ; MOV #TMC, R2 JSR PC, DETDEV ; DETACH THE TERMINAL, RESET CHARACTERISTICS TSTB RDIFLG ; REDIRECTED INPUT? BEQ 1$ JSR PC, CANINP ; CANCEL REDIRECTED INPUT 1$: TSTB RDOFLG ; REDIRECTED OUTPUT? BEQ 2$ JSR PC, CANOUT ; CANCEL REDIRECTED OUTPUT 2$: EXIT$S .PAGE .SBTTL CONTRL ; MES1: .ASCII <15><12>/TLK -- Queue overflow(T) - characters lost/<15><12> LENM1=.-MES1 MES4: .ASCII <15><12>/TLK -- Queue overflow(P) - characters lost/<15><12> LENM4=.-MES4 .EVEN CONTRL: 1$: WTSE$S #1 ; WAIT UNTIL A CHARACTER IS RECEIVED TSTB SUSPND ; IS PORT QUEUE PROCESSING SUSPENDED? BNE 10$ ; YES, GO TEST FOR TERMINAL DATA 2$: TSTB PTDATA ; TEST IF ANY DATA FROM THE PORT BEQ 10$ ; NO, GO PROCESS TERMINAL INPUT 3$: CLRB PTDATA ; RESET PORT DATA FLAG TSTB QOVRPR ; PORT QUEUE OVERFLOW? BEQ 4$ QIOMAC R0,#WALTIO,#MES4,#LENM4,Y ; YES, WRITE MESSAGE CLRB QOVRPR ; CLEAR PORT QUEUE OVERFLOW FLAG 4$: MOVB @FRONTP,R0 ; GET CHAR FROM THE PORT QUEUE CMP FRONTP,#MAXAP ; IS IT AT THE END? BNE 5$ ; NO MOV #QUEUEP,FRONTP ; RESET THE POINTER BR 6$ 5$: INC FRONTP ; INCREASE QUEUE POINTER 6$: INC COUNTP ; INCREASE FREE SPACE COUNTER BICB #PAR$TY, R0 ; OPTIONALLY CLEAR PARITY BIT MOVB R0, R1 ; STORE CHARACTER IN R1 BICB #200, R0 ; INSURE THAT R0 HAS PARITY OFF MOVB R0, CHAR ; STORE 7 BIT CHARACTER JSR PC,PRTIN ; PROCESS THE PORT CHARACTER .IF DF CKFREE CMP CKCNTP,COUNTP ; BLE 30$ ; MOV COUNTP,CKCNTP ; 30$: .ENDC CMP COUNTP,#LOWPQ ; PORT QUEUE FREE BYTES GETTING LOW? BGT 10$ ; IF GT, NO TSTB PTOFF ; PORT OUTPUT ALREADY SUSPENDED? BNE 10$ ; IF NE, NO JSR PC, PSLEEP ; SUSPEND PORT OUTPUT FROM HOST 10$: TSTB TMDATA ; TEST IF ANY TERMINAL CHARACTER BEQ 17$ 12$: CLRB TMDATA ; RESET TERMINAL DATA FLAG TSTB QERFLG ; QUEUE OVERFLOW? BEQ 13$ QIOMAC R0, #WALTIO, #MES1, #LENM1, Y ; WRITE MESSAGE TO TERMINAL CLRB QERFLG ; CLEAR QUEUE OVERFLOW FLAG 13$: MOVB @FRONT, R0 ; GET CHARACTER FROM QUEUE CMP FRONT, #MAXA ; POINTER OFF END OF QUEUE? BNE 14$ MOV #QUEUE, FRONT ; RESET FRONT OF QUEUE POINTER BR 15$ 14$: INC FRONT ; INCREASE QUEUE POINTER 15$: INC COUNT ; INCREASE FREE SPACE COUNTER MOVB R0, CHAR ; STORE 7 BIT CHARACTER JSR PC, TRMIN ; CAME FROM TERMINAL - PROCESS IT .IF DF CKFREE CMP CKCNTT,COUNT ; BLE 31$ ; MOV COUNT,CKCNTT ; 31$: .ENDC TSTB EXIFLG ; WANT TO EXIT PROGRAM? BNE 20$ 16$: CMP #QSIZET,COUNT ; PROCESSED ALL TERMINAL CHARACTERS? BNE 12$ 17$: TSTB SUSPND ; IS PORT QUEUE PROCESSING SUSPENDED? BNE 1$ ; YES, GO WAIT FOR TERMINAL CHARACTER TSTB PTDATA ; CHECK IF ANY CHARS FROM PORT BNE 3$ ; IF NE, THERE IS A CHARACTER 18$: CLEF$S #1 MOVB #1,PTISEF ; SET EVENT FLAG AT NEXT INTERRUPT CMP #QSIZEP,COUNTP ; TEST AGAIN FOR MORE PORT DATA BNE 3$ ; IF NE, PORT DATA RECEIVED SINCE CLEF$S TSTB PTOFF ; HOST OUTPUT CURRENTLY SUSPENDED? BEQ 19$ ; IF EQ, NO JSR PC, PAWAKE ; RESTART HOST OUTPUT 19$: TST RECCNT ; SEND RECORDS TO PORT? BEQ 22$ ; NO BLOCK EXECUTION TILL QUEUE NONEMPTY CLR RECCNT ; INDICATE NO MORE RECORDS (AFTER THIS) ; ; TO BE SENT UNTIL NEXT EOR RECEIVED JSR PC, XFERP ; SEND A RECORD TO THE PORT 22$: JMP CONTRL 20$: DSAR$S WTSE$S #10 ; WAIT UNTIL ALL PORT I/O IS DONE RTS PC .PAGE .SBTTL PRTIN ; PRTIN: TSTB WT2FLG ; IS COMMAND BEING ECHOED? BEQ 5$ ; NO QIOMAC R2,#WALTIO,#CHAR,#1,Y ; ECHO CHARACTER CMPB R0,#15 ; IS THIS THE END OF THE COMMAND? BNE 30$ ; NO CLRB WT2FLG ; RESET FLAG BR 30$ ; 5$: TSTB RDIFLG ; IS INPUT REDIRECTED? BEQ 10$ CMPB R0, #WTCHAR ; CHARACTER PROMPT FOR NEXT FILE READ? BNE 10$ INC RECCNT ; INDICATE ANOTHER RECORD TO SEND TO PORT 10$: QIOMAC R2, #WALTIO, #CHAR, #1, Y ; WRITE CHAR TO TERMINAL TSTB RDOFLG ; IS OUTPUT REDIRECTED? BEQ 30$ CMPB #177,R0 ; IS CHARACTER FROM PORT A DELETE? BEQ 15$ ; IF SO, DO NOT WRITE TO FILE CMPB #15,R0 ; IS CHARACTER FROM PORT A ? BEQ 15$ ; IF SO, DO NOT WRITE TO FILE CMPB #12,R0 ; IS CHARACTER FROM PORT A ? BEQ 15$ ; IF SO, DO NOT WRITE TO FILE TSTB HLPFLG ; IS TALK HELPING? BEQ 14$ ; NO CMP #OFBUFF,OFBPTR ; FIRST CHARACTER IN RECEIVE BUFFER? BNE 14$ ; NO CMPB R0,#PROMPT ; IS CHARACTER A MONITOR PROMPT? BNE 14$ ; NO JSR PC,CANOUT ; EOF, CANCEL REDIRECTED OUTPUT BR 30$ 14$: MOVB R1, @OFBPTR ; PUT NEW CHARACTER INTO BUFFER INC OFBPTR ; BUMP BUFFER POINTER UP CMP OFBPTR, #OFBMAX ; BUFFER FULL? BEQ 20$ 15$: CMPB R0, EOR ; IS THIS AN EOR CHARACTER BNE 30$ 20$: .IF DF SIGMA9 ; DO NOT WRITE NULL RECORDS IF HELPING (AVOIDS NULL ; ; RECORD BEFORE SIGMA 9 PROMPT CHARACTER) TSTB HLPFLG ; IS TALK HELPING? BEQ 25$ ; NO CMP #OFBUFF,OFBPTR ; IS CURRENT RECORD NULL? BEQ 30$ ; YES - DO NOT WRITE .ENDC 25$: JSR PC, WRTBUF ; WRITE BUFFER TO FILE 30$: RTS PC .PAGE .SBTTL TRMIN ; TRMIN: TSTB BNMFLG ; BUILDING A FILE NAME? BEQ 1$ JSR PC, BUILD ; ADD TO FILENAME BR 9$ 1$: TSTB CGEFLG ; CHANGING EOR CHARACTER? BEQ 2$ JSR PC, ENTEOR ; CHANGE EOR CHARACTER BR 9$ 2$: TSTB BCAFLG ; BUILDING COMMAND "A"? BEQ 3$ .IF DF SIGMA9 JSR PC, BLDSCA ; BUILD SIGMA9 COMMAND "A" .ENDC .IF DF RSX11 JSR PC,BLDRCA ; BUILD RSX11 COMMAND "A" .ENDC BR 9$ 3$: TSTB BCBFLG ; BUILDING COMMAND "B"? BEQ 4$ .IF DF SIGMA9 JSR PC, BLDSCB ; BUILD SIGMA9 COMMAND "B" .ENDC .IF DF RSX11 JSR PC,BLDRCB ; BUILD RSX11 COMMAND "B" .ENDC BR 9$ 4$: TSTB CMDFLG ; ENTERING A COMMAND? BEQ 5$ JSR PC, CMDIN ; ENTER THE COMMAND BR 9$ 5$: CMPB R0, #CMDCAR ; ENTER COMMAND MODE? BNE 6$ JSR PC, BREAK ; ENTER COMMAND MODE BR 9$ 6$: CMPB CHAR, #SPNCAR ; SUSPEND PORT QUEUE PROCESSING? BNE 7$ JSR PC,PSLEEP ; PUT HOST TO SLEEP MOVB #1, SUSPND ; SET FLAG BR 9$ 7$: CMPB CHAR, #RESCAR ; RESUME PORT QUEUE PROCESSING? BNE 8$ CLRB SUSPND ; CLEAR FLAG TO WAKE UP HOST BR 9$ 8$: TSTB RDIFLG ; IS INPUT REDIRECTED? BNE 9$ JSR PC,SENDPR ; WRITE CHAR TO PORT 9$: RTS PC .PAGE .SBTTL CMDIN ; MES5: .ASCII <15><12>/TLK -- ILLEGAL COMMAND ISSUED/ LENM5=.-MES5 .EVEN CMDIN: QIOMAC R0, #WALTIO, #EKOBUF ; SET UP PART OF DPB FOR WRITE MOVB CHAR, EKOBUF ; MOVE CHARACTER TO WRITE BUFFER QIOMAC R0, , , #3, Y ; ECHO CHARACTER TO TERMINAL ; CMPB CHAR, #XCCCAR ; TRANSMIT CONTROL CHARACTER? BNE 1$ JSR PC, XMITCC BR 90$ 1$: CMPB CHAR, #RIHCAR ; REDIRECTED INPUT HELP? BNE 2$ JSR PC, RDIHLP BR 90$ 2$: CMPB CHAR, #ROHCAR ; REDIRECTED OUTPUT HELP? BNE 3$ JSR PC, RDOHLP BR 90$ 3$: CMPB CHAR, #MNUCAR ; DISPLAY MENU? BNE 4$ JSR PC, MENU JSR PC, BREAK ; ISSUE COMMAND PROMPT BR 99$ ; DON'T RESET COMMAND FLAG 4$: CMPB CHAR, #CNICAR ; CANCEL REDIRECTED INPUT? BNE 5$ JSR PC, CANINP BR 90$ 5$: CMPB CHAR, #CNOCAR ; CANCEL REDIRECTED OUTPUT? BNE 6$ JSR PC, CANOUT BR 90$ 6$: CMPB CHAR, #CGECAR ; CHANGE EOR CHARACTER? BNE 7$ JSR PC, ASKEOR BR 90$ 7$: CMPB CHAR, #EXICAR ; EXIT PROGRAM? BNE 8$ INCB EXIFLG BR 90$ 8$: CMPB CHAR, #RDICAR ; REDIRECT INPUT? BNE 9$ JSR PC, REDINP BR 90$ 9$: CMPB CHAR, #RDOCAR ; REDIRECT OUTPUT? BNE 10$ JSR PC, REDOUT BR 90$ 10$: CMPB CHAR,#15 ; EXIT COMMAND MODE? BNE 11$ BR 90$ ; RETURN TO MONITOR 11$: CMPB CHAR,#'S ; TRANSMIT ^S TO PORT? BNE 12$ MOVB #19.,CHAR ; GET ^S JSR PC,SENDPR ; SEND IT TO PORT BR 90$ 12$: CMPB CHAR,#'Q ; TRANSMIT ^Q TO PORT? BNE 20$ MOVB #17.,CHAR ; GET ^Q JSR PC,SENDPR ; SEND IT TO PORT BR 90$ 20$: ; ILLEGAL COMMAND CHARACTER QIOMAC R0, #WALTIO, #MES5, #LENM5, Y ; WRITE MESSAGE TO TERMINAL JSR PC, BREAK ; ISSUE COMMAND PROMPT AGAIN BR 99$ ; DON'T RESET COMMAND FLAG ; 90$: CLRB CMDFLG ; CLEAR COMMAND FLAG CLRB SUSPND ; CLEAR SUSPEND FLAG JSR PC,PAWAKE ; WAKE UP THE HOST 99$: RTS PC .PAGE .SBTTL BREAK ; QUERY4: .ASCII <15><12>/TLK:Enter command (M for menu)>/ LENQ4=.-QUERY4 .EVEN BREAK: JSR PC,PSLEEP ; PUT THE HOST TO SLEEP MOVB #1,SUSPND ; SUSPEND PROCESSING OF PORT QUEUE MOVB #1,CMDFLG ; SET FLAG FOR COMMAND MODE QIOMAC R0, #WALTIO, #QUERY4, #LENQ4, Y ; WRITE QUERY4 TO TERMINAL RTS PC .PAGE .SBTTL XMITCC ; XMITCC: MOVB #CMDCAR,CHAR ; GET THE COMMAND CHARACTER JSR PC, SENDPR ; SEND IT TO THE PORT RTS PC .PAGE .SBTTL BLDSCA ; .IF DF SIGMA9 MES6: .ASCII <15><12>/TLK:SIGMA9 file name too long/<15><12> LENM6=.-MES6 .EVEN BLDSCA: CMPB #177, CHAR ; IS CHARACTER A DELETE? BNE 1$ TST NAMECT ; IF A DELETE, IS THIS FIRST INPUT CHARACTER? BEQ 9$ QIOMAC R0, #WALTIO, #ERASE, #3, Y ; ERASE LAST CHARACTER ON TERMINAL DEC NAMECT ; IGNORE LAST CHARACTER IN FNAME DEC LENCMD ; ERASE COMMAND CHARACTER BR 9$ 1$: QIOMAC R0, #WALTIO, #EKOBUF ; SET UP PART OF DPB FOR WRITE MOVB CHAR, EKOBUF ; MOVE CHARACTER TO WRITE BUFFER CMPB CHAR, #15 ; END OF FILE NAME? BNE 3$ QIOMAC R0, , , #3, Y ; ECHO CHARACTER TO TERMINAL CLRB BCAFLG ; TURN OFF BUILD COMMAND FLAG MOV LENCMD,R1 ; GET LENGTH OF COMMAND MOVB CHAR,S9CMDA(R1) ; BUFFER THE INC LENCMD ; UPDATE COMMAND LENGTH INCB WT2FLG ; SET FLAG TO WAIT FOR COMMAND TRANSMIT JSR PC,REDINP ; REDIRECT INPUT BR 9$ 3$: QIOMAC R0, , , #1, Y ; ECHO CHARACTER TO TERMINAL CMP #31., NAMECT ; LONGER THAN ANY LEGAL FILE NAME? BEQ 4$ MOV LENCMD, R1 ; COMMAND LENGTH MOVB CHAR, S9CMDA(R1) ; APPEND CHAR TO COMMAND INC LENCMD ; INCREMENT COMMAND LENGTH INC NAMECT ; BUMP COMMAND POINTER UP BR 9$ 4$: CLRB BCAFLG ; ERROR, TURN OFF BUILD COMMAND FLAG QIOMAC R0, , #MES6, #LENM6, Y ; WRITE MES6 TO TERMINAL 9$: RTS PC .ENDC .PAGE .SBTTL BLDRCA ; .IF DF RSX11 MES6: .ASCII <15><12>/TLK -- PDP file name too long/<15><12> LENM6=.-MES6 PIPEND: .ASCII /=TI:/ LENPE=.-PIPEND .EVEN BLDRCA: CMPB #177, CHAR ; IS CHARACTER A DELETE? BNE 1$ TST NAMECT ; IF A DELETE, IS THIS FIRST INPUT CHARACTER? BEQ 9$ QIOMAC R0, #WALTIO, #ERASE, #3, Y ; ERASE LAST CHARACTER ON TERMINAL DEC NAMECT ; IGNORE LAST CHARACTER IN FNAME DEC LENCMD ; ERASE COMMAND CHARACTER BR 9$ 1$: QIOMAC R0, #WALTIO, #EKOBUF ; SET UP PART OF DPB FOR WRITE MOVB CHAR, EKOBUF ; MOVE CHARACTER TO WRITE BUFFER CMPB CHAR, #15 ; END OF FILE NAME? BNE 3$ QIOMAC R0, , , #3, Y ; ECHO CHARACTER TO TERMINAL MOV LENCMD,R1 ; GET COMMAND LENGTH CLRB BCAFLG ; TURN OFF BUILD COMMAND FLAG INCB WT2FLG ; SET FLAG TO WAIT FOR COMMAND TRANSFER MOV #PIPEND,R2 ; FETCH REST OF COMMAND LINE MOV #LENPE,R3 ; NUMBER OF CHARACTERS REMAINING 5$: MOVB (R2)+,RSCMDA(R1) ; BUFFER THE CHARACTER INC R1 ; UPDATE POINTER INC LENCMD ; UPDATE COMMAND LENGTH SOB R3,5$ ; LOOP MOVB CHAR,RSCMDA(R1) ; BUFFER THE INC LENCMD ; UPDATE THE LENGTH JSR PC,REDINP ; REDIRECT INPUT BR 9$ 3$: QIOMAC R0, , , #1, Y ; ECHO CHARACTER TO TERMINAL CMP #31., NAMECT ; LONGER THAN ANY LEGAL FILE NAME? BEQ 4$ MOV LENCMD, R1 ; COMMAND LENGTH MOVB CHAR, RSCMDA(R1) ; APPEND CHAR TO COMMAND INC LENCMD ; INCREMENT COMMAND LENGTH INC NAMECT ; BUMP COMMAND POINTER UP BR 9$ 4$: CLRB BCAFLG ; ERROR, TURN OFF BUILD COMMAND FLAG QIOMAC R0, , #MES6, #LENM6, Y ; WRITE MES6 TO TERMINAL 9$: RTS PC .ENDC .PAGE .SBTTL BLDSCB .IF DF SIGMA9 ; BLDSCB: CMPB #177, CHAR ; IS CHARACTER A DELETE? BNE 1$ TST NAMECT ; IF A DELETE, IS THIS FIRST INPUT CHARACTER? BEQ 9$ QIOMAC R0, #WALTIO, #ERASE, #3, Y ; ERASE LAST CHARACTER ON TERMINAL DEC NAMECT ; IGNORE LAST CHARACTER IN FNAME DEC LENCMD ; IGNORE LAST CHARACTER IN COMMAND BR 9$ 1$: QIOMAC R0, #WALTIO, #EKOBUF ; SET UP PART OF DPB FOR WRITE MOVB CHAR, EKOBUF ; MOVE CHARACTER TO WRITE BUFFER CMPB CHAR, #15 ; END OF FILE NAME? BNE 3$ MOV LENCMD,R1 ; GET COMMAND LENGTH MOVB CHAR,S9CMDB(R1) ; BUFFER THE INC LENCMD ; UPDATE COMMAND LENGTH QIOMAC R0, , , #3, Y ; ECHO CHARACTER TO TERMINAL CLRB BCBFLG ; TURN OFF BUILD COMMAND FLAG INCB WT2FLG ; SET FLAG TO WAIT FOR < PROMPT JSR PC,REDOUT ; REDIRECT OUTPUT BR 9$ 3$: QIOMAC R0, , , #1, Y ; ECHO CHARACTER TO TERMINAL CMP #31., NAMECT ; LONGER THAN ANY LEGAL FILE NAME? BEQ 4$ MOV LENCMD, R1 ; COMMAND LENGTH MOVB CHAR, S9CMDB(R1) ; APPEND CHAR TO COMMAND INC LENCMD ; INCREMENT COMMAND LENGTH INC NAMECT ; BUMP COMMAND POINTER UP BR 9$ 4$: CLRB BCBFLG ; ERROR, TURN OFF BUILD COMMAND FLAG QIOMAC R0, , #MES6, #LENM6, Y ; WRITE MES6 TO TERMINAL 9$: RTS PC .ENDC .PAGE .SBTTL BLDRCB .IF DF RSX11 ; BLDRCB: CMPB #177, CHAR ; IS CHARACTER A DELETE? BNE 1$ TST NAMECT ; IF A DELETE, IS THIS FIRST INPUT CHARACTER? BEQ 9$ QIOMAC R0, #WALTIO, #ERASE, #3, Y ; ERASE LAST CHARACTER ON TERMINAL DEC NAMECT ; IGNORE LAST CHARACTER IN FNAME DEC LENCMD ; IGNORE LAST CHARACTER IN COMMAND BR 9$ 1$: QIOMAC R0, #WALTIO, #EKOBUF ; SET UP PART OF DPB FOR WRITE MOVB CHAR, EKOBUF ; MOVE CHARACTER TO WRITE BUFFER CMPB CHAR, #15 ; END OF FILE NAME? BNE 3$ MOV LENCMD,R1 ; GET COMMAND LENGTH MOVB CHAR,RSCMDB(R1) ; BUFFER THE INC LENCMD ; UPDATE COMMAND LENGTH QIOMAC R0, , , #3, Y ; ECHO CHARACTER TO TERMINAL CLRB BCBFLG ; TURN OFF BUILD COMMAND FLAG INCB WT2FLG ; SET FLAG TO WAIT FOR < PROMPT JSR PC,REDOUT ; REDIRECT OUTPUT BR 9$ 3$: QIOMAC R0, , , #1, Y ; ECHO CHARACTER TO TERMINAL CMP #31., NAMECT ; LONGER THAN ANY LEGAL FILE NAME? BEQ 4$ MOV LENCMD, R1 ; COMMAND LENGTH MOVB CHAR, RSCMDB(R1) ; APPEND CHAR TO COMMAND INC LENCMD ; INCREMENT COMMAND LENGTH INC NAMECT ; BUMP COMMAND POINTER UP BR 9$ 4$: CLRB BCBFLG ; ERROR, TURN OFF BUILD COMMAND FLAG QIOMAC R0, , #MES6, #LENM6, Y ; WRITE MES6 TO TERMINAL 9$: RTS PC .ENDC .PAGE .SBTTL MENU ; CMENU: .ASCII <15><12>/The following TLK commands are available:/<15><12> .ASCII <15><12>/ A - initiate file transfer to host/ .ASCII <15><12>/ B - initiate file transfer from host/ .ASCII <15><12>/ C - transmit control character (^/ .ASCII /) to port/ .ASCII <15><12>/ E - change end-of-record character/ .ASCII <15><12>/ I - enter redirected input mode/ .ASCII <15><12>/ J - exit redirected input mode/ .ASCII <15><12>/ M - display command menu/ .ASCII <15><12>/ O - enter redirected output mode/ .ASCII <15><12>/ P - exit redirected output mode/ .ASCII <15><12>/ Q - send control Q (^Q) to port/ .ASCII <15><12>/ S - send control S (^S) to port/ .ASCII <15><12>/ Z - exit TLK program/ .ASCII <15><12>/ - exit command mode/<15><12> LENMNU=.-CMENU .EVEN MENU: QIOMAC R0,#WALTIO,#CMENU,#LENMNU,Y ; WRITE MENU TO TERMINAL RTS PC .PAGE .SBTTL RDIHLP ; QUERY6: .ASCII <15><12>/TLK:Enter destination file name:/ LENQ6=.-QUERY6 .IF DF SIGMA9 S9CMDA: .ASCII /COPY ME TO / LENCMA=.-S9CMDA .BLKB 32. ; AREA FOR SIGMA9 FILE NAME .ENDC .IF DF RSX11 RSCMDA: .ASCII /PIP / LENCMA=.-RSCMDA .BLKB 35. .ENDC .EVEN RDIHLP: QIOMAC R0,#WALTIO,#QUERY6,#LENQ6,Y ; WRITE QUERY6 TO TERMINAL INCB BCAFLG ; SET FLAG FOR ENTERING COMMAND MOV #LENCMA,LENCMD ; SET INITIAL LENGTH OF COMMAND CLR NAMECT ; CLEAR FILE NAME LENGTH INCB HLPFLG ; INDICATE THAT TALK IS HELPING RTS PC .PAGE .SBTTL RDOHLP ; QUERY5: .ASCII <15><12>/TLK:Enter source file name:/ LENQ5=.-QUERY5 .IF DF SIGMA9 S9CMDB: .ASCII /COPY / LENCMB=.-S9CMDB .ENDC .IF DF RSX11 RSCMDB: .ASCII /PIP TI:=/ LENCMB=.-RSCMDB .ENDC .BLKB 32. .EVEN RDOHLP: QIOMAC R0,#WALTIO,#QUERY5,#LENQ5,Y ; WRITE QUERY5 TO TERMINAL INCB BCBFLG ; SET FLAG FOR ENTERING COMMAND MOV #LENCMB,LENCMD ; SET INITIAL LENGTH OF COMMAND CLR NAMECT ; CLEAR FILE NAME LENGTH INCB HLPFLG ; INDICATE THAT TALK IS HELPING RTS PC .PAGE .SBTTL PSLEEP ; PTHALT: .IF DF SIGMA9 .ASCII <33>/H/ ; H ON SIGMA 9 .IFF .IF DF RSX11 .BYTE 23 ; ^S ON RSX-11M .IFF .ERROR SIGMA9 OR RSX11 HOST MUST BE DEFINED! .ENDC .ENDC LENHLT=.-PTHALT .EVEN ; PSLEEP: TSTB PTOFF ; IS PORT OUTPUT SUSPENDED? BNE 9$ ; IF NE, NO MOVB #1,PTOFF ; INDICATE HOST OUTPUT SUSPENDED .IF EQ LENHLT-1 ; IF HALT STRING ONE BYTE MOVB PTHALT,CHAR ; STORE THE CHARACTER TO TRANSMIT .IFF ; IF HALT STRING LONGER THAN ONE CHARACTER MOV #LENHLT,R1 ; GET LENGTH OF HALT SEQUENCE MOV #PTHALT,R2 ; GET START OF HALT SEQUENCE 10$: MOVB (R2)+,CHAR ; STORE THIS CHARACTER .IFTF JSR PC, SENDPR ; TRANSMIT THE CHARACTER TO THE PORT .IFF SOB R1,10$ ; LOOP UNTIL ENTIRE HALT SEQUENCE TRANSMITTED .ENDC .IF DF CKFREE INC NSLEEP .ENDC 9$: RTS PC .PAGE .SBTTL PAWAKE ; PTSTRT: .IF DF SIGMA9 .BYTE 33 ; ON SIGMA 9 .IFF .IF DF RSX11 .BYTE 21 ; ^Q ON RSX-11M .IFF .ERROR SIGMA9 OR RSX11 HOST MUST BE DEFINED! .ENDC .ENDC LENSTR=.-PTSTRT .EVEN ; PAWAKE: CLRB PTOFF ; INDICATE RESUMPTION OF HOST OUTPUT .IF EQ LENSTR-1 ; IF RESUME STRING ONE BYTE MOVB PTSTRT,CHAR ; STORE THE CHARACTER TO TRANSMIT .IFF ; IF RESUME STRING LONGER THAN ONE CHARACTER MOV #LENSTR,R1 ; GET LENGTH OF RESUME SEQUENCE MOV #PTSTRT,R2 ; GET START OF RESUME SEQUENCE 10$: MOVB (R2)+,CHAR ; STORE THIS CHARACTER .IFTF JSR PC, SENDPR ; TRANSMIT THE CHARACTER TO THE PORT .IFF SOB R1,10$ ; LOOP UNTIL ENTIRE RESUME SEQUENCE TRANSMITTED .ENDC RTS PC .PAGE .SBTTL SUMRY .IF DF CKFREE MESCKP: .ASCII /%NPORT BUFFER - MAX NUMBER OF CHARS USED:%D/ .ASCII /%NTERM BUFFER - MAX NUMBER OF CHARS USED:%D/ .ASCII /%NNUMBER OF TIMES HOST SLEPT:%D/ .EVEN ARGBLK: .BLKW 3 SUMRY: MOV #QSIZEP,ARGBLK SUB CKCNTP,ARGBLK MOV #QSIZET,ARGBLK+2 SUB CKCNTT,ARGBLK+2 MOV NSLEEP,ARGBLK+4 MOV #INBUFF,R0 MOV #MESCKP,R1 MOV #ARGBLK,R2 CALL $EDMSG MOV R1,PRINT+Q.IOPL+2 DIR$ #PRINT RTS PC .ENDC .PAGE .SBTTL REDINP ; REDINP: TSTB RDIFLG ; IS INPUT ALREADY REDIRECTED? BNE 1$ MOVB #1, BNMFLG ; INDICATE WANT TO OPEN INPUT FILE JSR PC, ASKNM ; ASK FOR FILE NAME 1$: RTS PC .PAGE .SBTTL REDOUT ; REDOUT: TSTB RDOFLG ; ALREADY HAVE REDIRECTED OUTPUT? BNE 1$ MOVB #2, BNMFLG ; INDICATE WANT TO OPEN OUTPUT FILE JSR PC, ASKNM ; ASK FOR FILE NAME MOV #OFBUFF, OFBPTR ; RESET BUFFER POINTER 1$: RTS PC .PAGE .SBTTL CANINP ; CNIMSG: .ASCII <15><12>/** REDIRECTED INPUT CANCELLED **/<15><12> LENCIM=.-CNIMSG .EVEN CANINP: TSTB RDIFLG ; IS INPUT REDIRECTED? BEQ 9$ CLRB R1 ; SET TYPE TO "READ" JSR PC, CLSFLE ; CLOSE INPUT FILE CLRB RDIFLG ; TURN OFF REDIRECTED INPUT FLAG TSTB HLPFLG ; IS TALK HELPING? BEQ 3$ ; NO ; .IF DF SIGMA9 MOVB #27.,CHAR ; SEND F TO PORT FOR JSR PC,SENDPR MOVB #'F,CHAR JSR PC,SENDPR .ENDC ; .IF DF RSX11 MOVB #26.,CHAR ; SEND ^Z TO PORT FOR JSR PC,SENDPR .ENDC ; 3$: CLRB HLPFLG ; CLEAR HELP FLAG QIOMAC R0, #WALTIO, #CNIMSG, #LENCIM, Y ; WRITE MESSAGE CLR RECCNT ; CLEAR RECORD COUNT 9$: RTS PC .PAGE .SBTTL CANOUT ; CNOMSG: .ASCII <15><12>/** REDIRECTED OUTPUT CANCELLED **/<15><12> LENCOM=.-CNOMSG .EVEN CANOUT: TSTB RDOFLG ; IS OUTPUT REDIRECTED? BEQ 9$ CMP OFBPTR, #OFBUFF ; ANYTHING IN THE BUFFER? BEQ 1$ JSR PC, WRTBUF ; WRITE WHAT'S LEFT IN THE BUFFER 1$: MOVB #1, R1 ; SET TYPE TO "WRITE" JSR PC, CLSFLE ; CLOSE OUTPUT FILE CLRB RDOFLG ; TURN OFF REDIRECTED OUTPUT FLAG CLRB HLPFLG ; TURN OFF HELP FLAG QIOMAC R0, #WALTIO, #CNOMSG, #LENCOM, Y ; WRITE MESSAGE 9$: RTS PC .PAGE .SBTTL ASKNM ; QUERY3: .ASCII <15><12>/TLK:Enter PDP file name: / LENQ3=.-QUERY3 .EVEN ASKNM: QIOMAC R0, #WALTIO, #QUERY3, #LENQ3, Y ; WRITE QUERY3 TO TERMINAL CLR NAMECT ; RESET NUMBER OF CHARACTERS IN FILE NAME BUFFER RTS PC .PAGE .SBTTL BUILD ; MES2: .ASCII <15><12>/TLK -- File name too long - not redirected/<15><12> LENM2=.-MES2 ERASE: .BYTE 10, 40, 10 ; CODE TO ERASE LAST CHARACTER WRITTEN .EVEN BUILD: CMPB #177, CHAR ; IS CHARACTER A DELETE? BNE 1$ TST NAMECT ; IF A DELETE, IS THIS FIRST INPUT CHARACTER? BEQ 4$ QIOMAC R0, #WALTIO, #ERASE, #3, Y ; ERASE LAST CHARACTER ON TERMINAL DEC NAMECT ; IGNORE LAST CHARACTER IN FNAME BR 4$ 1$: QIOMAC R0, #WALTIO, #EKOBUF ; SET UP PART OF DPB FOR WRITE MOVB CHAR, EKOBUF ; MOVE CHARACTER TO WRITE BUFFER CMPB CHAR, #15 ; END OF FILE NAME? BNE 2$ QIOMAC R0, , , #1, Y ; ECHO CHARACTER TO TERMINAL JSR PC, OPNFLE ; PARSE AND OPEN FILE CLRB BNMFLG ; TURN OFF BUILD FILE NAME FLAG BR 4$ 2$: QIOMAC R0, , , #1, Y ; ECHO CHARACTER TO TERMINAL CMP #31., NAMECT ; LONGER THAN ANY LEGAL FILE NAME? BEQ 3$ MOV NAMECT, R0 MOVB CHAR, FNAME(R0) ; APPEND CHAR TO FILE NAME INC NAMECT ; BUMP FILE NAME POINTER UP BR 4$ 3$: CLRB BNMFLG ; ERROR, TURN OFF BUILD FILE NAME FLAG QIOMAC R0, , #MES2, #LENM2, Y ; WRITE MES2 TO TERMINAL 4$: RTS PC .PAGE .SBTTL OPNFLE ; MES3: .ASCII <15><12>/TLK -- File open error - not redirected /<15><12> LENM3=.-MES3 RDIMSG: .ASCII <15><12>/** INPUT REDIRECTED **/<15><12> LENRIM=.-RDIMSG RDOMSG: .ASCII <15><12>/** OUTPUT REDIRECTED **/<15><12> LENROM=.-RDOMSG .EVEN OPNFLE: CSI$1 #CSIBLK, #FNAME, NAMECT ; SQUEEZE OUT BLANKS BCS 8$ CSI$2 #CSIBLK, OUTPUT ; PARSE FILE NAME BCS 8$ CMPB #1, BNMFLG ; INPUT OR OUTPUT FILE? BNE 1$ OPEN$R #FDBIN ; OPEN INPUT FILE BCS 8$ INCB RDIFLG ; INDICATE REDIRECTED INPUT QIOMAC R0, #WALTIO, #RDIMSG, #LENRIM, Y ; WRITE MESSAGE MOV #1, RECCNT ; START OFF BY SENDING ONE RECORD TSTB HLPFLG ; IS TALK HELPING? BEQ 9$ ; NO CLR RECCNT ; DON'T SEND RECORD YET JSR PC,SNDCMA ; SEND TRANSFER COMMAND BR 9$ 1$: OPEN$W #FDBOUT ; OPEN OUTPUT FILE BCS 8$ INCB RDOFLG ; INDICATE REDIRECTED OUTPUT QIOMAC R0, #WALTIO, #RDOMSG, #LENROM, Y ; WRITE MESSAGE TSTB HLPFLG ; IS TALK HELPING? BEQ 9$ ; NO JSR PC,SNDCMB ; SEND COMMAND BR 9$ 8$: QIOMAC R0, #WALTIO, #MES3, #LENM3, Y ; WRITE MES3 TO TERMINAL 9$: RTS PC .PAGE .SBTTL SNDCMA ; SNDCMA: .IF DF SIGMA9 MOV #S9CMDA,R1 ; FETCH ADDRESS OF SIGMA9 COMMAND .ENDC .IF DF RSX11 MOV #RSCMDA,R1 ; FETCH ADDRESS OF RSX11 COMMAND .ENDC MOV LENCMD,R2 ; GET LENGTH OF COMMAND 5$: MOVB (R1)+,CHAR ; GET CHARACTER JSR PC,SENDPR ; SEND IT TO PORT SOB R2,5$ ; LOOP RTS PC .PAGE .SBTTL SNDCMB ; SNDCMB: .IF DF SIGMA9 MOV #S9CMDB,R1 ; FETCH ADDRESS OF SIGMA9 COMMAND .ENDC .IF DF RSX11 MOV #RSCMDB,R1 ; FETCH ADDRESS OF RSX11 COMMAND .ENDC MOV LENCMD,R2 ; GET LENGTH OF COMMAND 5$: MOVB (R1)+,CHAR ; GET CHARACTER JSR PC,SENDPR ; SEND IT TO PORT SOB R2,5$ ; LOOP RTS PC .PAGE .SBTTL ASKEOR ; QUERY2: .ASCII <15><12>/TLK:Enter new EOR character: / LENQ2=.-QUERY2 .EVEN ASKEOR: QIOMAC R0, #WALTIO, #QUERY2, #LENQ2, Y ; WRITE QUERY3 TO TERMINAL INCB CGEFLG ; INTERCEPT NEXT TERMINAL CHARACTER FOR EOR RTS PC .PAGE .SBTTL ENTEOR ; ENTEOR: MOVB CHAR, EKOBUF ; MOV CHARACTER TO WRITE BUFFER QIOMAC R0, #WALTIO, #EKOBUF, #3, Y ; ECHO CHARACTER MOVB CHAR, EOR ; SET EOR CHARACTER CLRB CGEFLG ; CLEAR INTERCEPT NEXT CHARACTER FOR EOR FLAG RTS PC .PAGE .SBTTL CLSFLE ; CLSFLE: MOV #FDBIN, R0 ; ASSUME CLOSE INPUT TSTB R1 ; WISH TO CLOSE INPUT? BEQ 1$ MOV #FDBOUT, R0 1$: CLOSE$ R0 ; CLOSE THE FILE RTS PC .PAGE .SBTTL XFERP ; XFERP: WTSE$S #10 ; WAIT UNTIL ALL PORT I/O IS DONE GET$ #FDBIN ; READ A RECORD FROM FILE BCS 1$ MOV F.NRBD(R0), R1 ; GET LENGTH OF RECORD READ MOVB EOR, INBUFF(R1) ; APPEND AN EOR TO THE RECORD INC R1 ; UPDATE RECORD LENGTH MOV #INBUFF,R2 4$: MOVB (R2)+,CHAR ; STORE THE CHARACTER .IF DF RSX11 CLEF$S #1 ; WANT TO WAIT FOR ECHO MOVB #1,PTISEF ; WANT TO SET EVENT FLAG FOR ECHO .ENDC JSR PC,SENDPR ; SEND A CHARACTER .IIF DF RSX11, WTSE$S #1 ; WAIT FOR ECHO SOB R1,4$ ; SEND ONE CHARACTER AT A TIME TILL DONE BR 2$ 1$: JSR PC, CANINP ; ERROR OR EOF DURING READ, CANCEL REDIRECTED INPUT 2$: RTS PC .PAGE .SBTTL WRTBUF ; WRTBUF: SUB #OFBUFF, OFBPTR ; CALCULATE BUFFER LENGTH PUT$ #FDBOUT, , OFBPTR ; WRITE BUFFER TO OUTPUT FILE MOV #OFBUFF, OFBPTR ; RESET BUFFER POINTER RTS PC .PAGE .SBTTL CNPRT ; QUERY1: .ASCII /TLK:Enter channel number of port: / LENQ1=.-QUERY1 CNMSG: .ASCII <15><12>/** CONNECTED TO PORT **/<15><12> LENCNM=.-CNMSG ERR: .ASCIZ /Failed to Connect to Vector Directive Status=%D./ .EVEN PRINT: QIOW$ IO.WVB,4,11,,,, .EVEN CNPRT: QIOMAC R0, #WALTIO, #QUERY1, #LENQ1 ; SET UP DPB FOR WRITE QIOMAC R0, #RVBTIO, #INBUFF, #INBSIZ ; SET UP DPB FOR READ 1$: QIOMAC #WALTIO, , , , Y ; ISSUE WRITE QIOMAC #RVBTIO, , , , Y ; ISSUE READ CMPB IOSTAT, #IS.SUC ; ERROR DURING READ? BEQ 2$ SEC ; INDICATE ERROR ASSIGNING UNIT RTS PC 2$: MOV #INBUFF, R0 ; GET BUFFER ADDRESS MOV IOSTAT+2, R1 ; GET NUMBER OF CHARACTERS READ ADD R0, R1 ; COMPUTE NEXT FREE LOCATION IN INPUT BUFFER MOVB #40, (R1) ; STOP CHARACTER TRANSLATION CALL $COTB ; CONVERT ASCII TO BINARY CMPB #40, R2 ; CONVERSION ERROR? BNE 1$ ; YES, REQUERY TST R1 ; NEGATIVE CHANNEL? BLT 1$ ; YES, REQUERY CMP R1,#MAXCHN ; IS CHANNEL > MAXCHN? BGT 1$ ; YES, REQUERY ASL R1 ; CALCULATE OFFSET MOV TBCHN(R1),R0 ; TABLE ADDRESS FOR CHANNEL MOV (R0),RVECT ; STORE VECTOR ADDRESS MOV (R0),CINTR+C.INVE ; STORE THE VECTOR VALUES IN DIRECTIVES MOV (R0)+,DCINTR+C.INVE MOV (R0),XVECT ; STORE TRANSMIT VECTOR ADDRESS MOV (R0),CINTX+C.INVE ; STORE THE VECTOR VALUES IN DIRECTIVES MOV (R0)+,DCINTX+C.INVE MOV (R0)+,RCSR ; STORE RECEIVE CSR MOV (R0)+,RBUF ; STORE RECEIVE BUFFER ADDRESS MOV (R0)+,XCSR ; STORE TRANSMIT CSR MOV (R0),XBUF ; STORE TRANSMIT BUFFER ADDRESS DIR$ #CINTR ; CONNECT TO RECEIVE INTERRUPT VECTOR BCS 9$ ; CONNECT FAILED DIR$ #CINTX ; CONNECT TO TRANSMIT INTERRUPT VECTOR BCS 9$ ; CONNECT FAILED 3$: CLC ; INDICATE NO ERROR QIOMAC R0, #WALTIO, #CNMSG, #LENCNM, Y ; REPORT SUCCESSFUL CONNECT RTS PC 9$: MOV #INBUFF,R0 ; OUTPUT BUFFER MOV #ERR,R1 MOV #$DSW,R2 ; VALUE TO BE CONVERTED CALL $EDMSG ; FORMAT THE MESSAGE MOV R1,PRINT+Q.IOPL+2 ; NO OF BYTES TO OUTPUT DIR$ #PRINT ; PRINT IT SEC ; INDICATE ERROR RTS PC .PAGE .SBTTL ATTDEV ; ATTDEV: MOV #SF.GMC, Q.IOFN(R1) ; SET UP TO GET CHARACTERISTICS QIOMAC R1, , R2, #14., Y ; GET MULTIPLE CHARACTERISTICS MOV #SF.SMC, Q.IOFN(R1) ; SET UP TO SET CHARACTERISTICS QIOMAC R1, , #SETMC, #22., Y ; SET CHARACTERISTICS FOR PROGRAM MOV #IO.ATA, Q.IOFN(R1) ; SET UP TO ATTACH DEVICE QIOMAC R1, , #AST, R0, Y ; ATTACH DEVICE WITH UNSOLICITED INPUT RTS PC .PAGE .SBTTL DETDEV ; DETDEV: MOV #IO.DET, Q.IOFN(R1) ; SET UP TO DETACH DEVICE QIOMAC R1, , , , Y ; DETACH DEVICE MOV #SF.SMC, Q.IOFN(R1) ; SET UP TO SET CHARACTERISTICS 1$: QIOMAC R1, , R2, #14., Y ; RESET CHARACTERISTICS TO EARLIER STATE RTS PC .PAGE .SBTTL DCNPRT ; ; SUBROUTINE TO DISCONNECT THE PORT DCNMSG: .ASCII <15><12>/** DISCONNECTED FROM PORT **/<15><12> LENDCM=.-DCNMSG .EVEN DCNPRT: DIR$ #DCINTR ; DISCONNECT INTERRUPT FOR RECEIVE DIR$ #DCINTX ; DISCONNECT INTERRUPT FOR TRANSMIT QIOMAC R0, #WALTIO, #DCNMSG, #LENDCM, Y ; REPORT DISCONNECT RTS PC ; ; .END TALK