; BIGTALK.MAC 02DEC81 ; .TITLE TALK .ENABL LC ; ; PROGRAM TALK ; ; .IIF DF VAX RSX11 = 0 ; SYMBOL RSX11 IS DEFINED FOR ; ; BOTH RSX-11M AND VAX/VMS ; ; FOR THIS VERSION ONLY ; ; Written By: N.K.BEWTRA,COMPUTER SCIENCES CORPORATION ; ; Date Written: December 16, 1980 ; ; Last Update: December 2, 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: J. Yambor ; Computer Sciences Corporation ; ; and 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]EXEMC/ML,[uic]TALKSYS,TALK ; ; where TALKSYS.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$, STOP$S, GTSK$C .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$, MRKT$S ; ; ; DEFINITIONS ; SPNCAR = 23 ; SUSPEND PORT QUEUE PROCESSING - ^S ECOCAR = 17 ; DISCARD/RESTART TERMINAL ECHO COMMAND - ^O RESCAR = 21 ; RESUME PORT QUEUE PROCESSING - ^Q TBCHAR = 2 ; TRANSMIT BREAK CHARACTER - ^B 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 CNXCAR = 130 ; CANCEL BOTH REDIRECT INPUT AND OUTPUT - X PASCAR = 104 ; DETACH FROM TALK - D CGECAR = 105 ; CHANGE EOR CHARACTER - E EXICAR = 132 ; EXIT PROGRAM CHARACTER - Z XCCCAR = 103 ; TRANSMIT CONTROL CHARACTER CHARACTER - C XBCCAR = 113 ; TRANSMIT BREAK CONTROL CHARACTER - K 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. ; RSX-11M MCR PROMPT (>) .ENDC .ENDC OFBSIZ = 133. ; OUTPUT BUFFER SIZE INBSIZ = 133. ; INPUT BUFFER SIZE ; .PAGE .SBTTL PROGRAM IDENTIFICATION ; .IDENT /V05.08/ ; CHANGE PROGRAM ID IN THIS LINE AND THE NEXT INTRO: .ASCII <15><12>/TLK:Version V05.08 / .IIF DF SIGMA9 .ASCII /SIGMA 9/ ; HOST IDENTIFICATION .IF DF VAX .ASCII +VAX/VMS+ .IFF .IIF DF RSX11 .ASCII /PDP-11 RSX-11M/ .ENDC INTRO1: .ASCII <15><12> ; BLANKED AFTER INTRODUCTORY MSG LENINM=.-INTRO .ASCII /Port / INTRO2: .ASCII / /<15><12> ; BYTE FOR PORT NUMBER LENIN2=.-INTRO .EVEN .SBTTL PROGRAM FLAGS AND I/O RELATED DATA 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 BLDFLG: .BYTE 0 ; FLAG INDICATING BNMFLG, BCAFLG, OR BCBFLG SET QERFLG: .BYTE 0 ; QUEUE OVERFLOW FLAG WT2FLG: .BYTE 0 ; WAIT FOR PROMPT FLAG HLPFLG: .BYTE 0 ; TALK IS HELPING WITH FILE TRANSFER NOECHO: .BYTE 0 ; TERMINAL ECHO STATUS FLAG 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 0 ; NUMBER OF CHARACTERS IN FILE NAME LENCMD: .WORD 0 ; LENGTH OF REMOTE COMMAND CMDPTR: .BLKW 1 ; START OF COMMAND STRING POINTER FNPTR: .BLKW 1 ; FILE NAME BUFFER POINTER ; .IF DF SIGMA9 CMDA: .ASCII /COPY ME / ; SIGMA 9 COPY COMMAND .IF DF COPOVR ; "COPY OVER" DESIRED .ASCII /OVER / .IFF ; "COPY TO" DESIRED .ASCII /TO / .ENDC LENCMA=.-CMDA FNAMEA: .BLKB 32. ; AREA FOR SIGMA9 FILE NAME .ENDC .IF DF RSX11 CMDA: .ASCII /PIP / ; RSX-11M COPY COMMAND LENCMA=.-CMDA FNAMEA: .BLKB 35. ; AREA FOR RSX-11M FILE NAME .ENDC .EVEN .IF DF SIGMA9 CMDB: .ASCII /COPY / ; SIGMA 9 COPY COMMAND LENCMB=.-CMDB .ENDC .IF DF RSX11 CMDB: .ASCII /PIP TI:=/ ; RSX-11M COPY COMMAND LENCMB=.-CMDB .ENDC FNAMEB: .BLKB 32. ; AREA FOR FILE NAME ; TRAILA: ; COMMAND "A" TRAILING STRING .IF DF RSX11 .ASCII /=TI:/ ; END OF RSX-11M COPY COMMAND .ENDC LENTRA=.-TRAILA .EVEN PASMSG: ; PAUSE MESSAGE .ASCII <15><12>/** TALK INTERRUPTED: TO RESTART, TYPE "UNSTOP / TSKNAM: .BLKB 6 .ASCII /"/<15><12> LENPM=.-PASMSG .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 ; .LIST MEB TBCHN: .IRPC Z,<01234567> .IF DF VECT'Z'R .WORD TBC'Z ; TABLE FOR CHANNEL 'Z' .ENDC .ENDM .IRPC Z,<01234567> .IF DF VECT'Z'R 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 .ENDC .ENDM .NLIST MEB .PAGE .SBTTL PORT I/O RELATED PARAMETERS ; ; DIRECTIVES FOR CONNECT/DISCONNECT INTERRUPTS FOR RECEIVE AND TRANSMIT ; 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 RCVERR: .WORD 0 ; NUMBER OF RECEIVE ERRORS DETECTED .WORD RCVEST ; ARGUMENT FOR $EDMSG (MUST FOLLOW RCVERR) RCVEST: .WORD 0 ; CUMULATIVE CSR ERROR BITS (OR'ED) 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 - PORT RECEIVE ENABLE/DISABLE ROUTINE ; ; ; 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 ; .SBTTL PTEDIX - PORT TRANSMIT ENABLE/DISABLE ROUTINE ; ; ENABLE/DISABLE ROUTINE FOR PORT TRANSMIT 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 - PORT RECEIVE INTERRUPT SERVICE ROUTINE ; ; 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 QUEUE OVERFLOW FLAG MOVB @RBUF,R4 ; EMPTY HARDWARE BUFFER INC COUNTP ; RESTORE COUNTER BR 6$ ; 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 .IF DF CKRERR ; IF RECEIVE ERRORS CHECKED MOV @RBUF,-(SP) ; GET RECEIVED CHARACTER BUFFER BGE 4$ ; BRANCH IF NO ERROR INC RCVERR ; INCREMENT RECEIVE ERROR COUNTER BIS (SP),RCVEST ; OR CSR ERROR BITS INTO CUMULATIVE STATUS 4$: MOVB (SP)+,@R4 ; STORE THE RECEIVED CHARACTER .IFF ; WITHOUT CHECKING RECEIVE ERRORS MOVB @RBUF,@R4 ; STORE THE RECEIVED CHARACTER .ENDC INC BACKP ; INCREMENT COUNTER CMP BACKP,#QSIZEP ; ARE WE AT THE END OF THE QUEUE? BNE 6$ ; NO CLR BACKP ; YES, RESET BACKP TO 0 6$: MOVB #1,PTDATA ; INDICATE PORT DATA TSTB PTISEF ; DO WE NEED TO SET THE EVENT FLAG? BEQ 9$ ; 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 9$: BISB #100,@RCSR ; ENABLE INTERRUPTS RETURN .PAGE .SBTTL PTINTX - PORT TRANSMIT INTERRUPT SERVICE ROUTINE ; ; 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 - INITIATE TRANSMISSION OF CHARACTER TO PORT ; ; 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 - TERMINAL AST ROUTINE ; 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 INC BACK ; ADVANCE POINTER 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 MAIN PROGRAM ; TALK:: FINIT$ ; INITIALIZE FCS PACKAGE DIR$ #MCRLIN ; GET MCR LINE QIOMAC R0,#WALTIO,#INTRO,#LENINM,Y ; WRITE INTRODUCTION MESSAGE JSR PC, CNPRT ; OBTAIN & CONNECT VECTOR FOR PORT BCC 3$ ; ERROR IN CONNECTING A DEVICE? JMP EXIT ; YES - EXIT 3$: GTSK$C INBUFF ; GET TASK PARAMETERS MOV #TSKNAM,R0 ; ADDRESS OF OUTPUT STRING MOV INBUFF,R1 ; GET FIRST WORD TO CONVERT JSR PC,$C5TA ; CONVERT FIRST WORD OF NAME TO ASCII MOV INBUFF+2,R1 ; GET SECOND WORD OF NAME JSR PC,$C5TA ; CONVERT SECOND WORD TO ASCII JSR PC, ATTDEV ; ATTACH THE TERMINAL, SET CHARACTERISTICS SETF$S #10 ; SET PORT I/O COMPLETION FLAG JSR PC, CONTRL ; WAIT FOR AND PROCESS ALL INPUT JSR PC, DCNPRT ; DISCONNECT THE PORT .IF DF CKFREE JSR PC, SUMRY ; PRINT SPACE USED DURING RUN .ENDC 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: EXIT$S .PAGE .SBTTL CONTRL - PROCESS ALL INPUT DATA AND COMMANDS ; MES1: .ASCII <15><12>/TLK -- / TORP: .BYTE 1 ; FOR T OR P TO INDICATE TERMINAL/PORT QUEUE .ASCII /Queue overflow - characters lost/<15><12> LENM1=.-MES1 .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$ MOVB #'P,TORP ; INDICATE PORT QUEUE IN MESSAGE QIOMAC R0,#WALTIO,#MES1,#LENM1,Y ; 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 ; IS FREE SPACE LESS THAN CURRENT MIN.? BLE 30$ ; NO MOV COUNTP,CKCNTP ; SET MINIMUM FREE SPACE COUNT 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 .IF DF CKFREE INC NSLEEP ; INCREMENT STATISTICS COUNT .ENDC 10$: TSTB TMDATA ; TEST IF ANY TERMINAL CHARACTER BEQ 17$ 12$: CLRB TMDATA ; RESET TERMINAL DATA FLAG TSTB QERFLG ; QUEUE OVERFLOW? BEQ 13$ MOVB #'T,TORP ; INDICATE TERMINAL QUEUE IN MESSAGE 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 BICB #200, R0 ; INSURE THAT R0 HAS PARITY OFF MOVB R0, CHAR ; STORE 7 BIT CHARACTER JSR PC, TRMIN ; CAME FROM TERMINAL - PROCESS IT .IF DF CKFREE CMP CKCNTT,COUNT ; IS FREE SPACE LESS THAN CURRENT MIN.? BLE 31$ ; NO MOV COUNT,CKCNTT ; SET MINIMUM FREE SPACE COUNT 31$: .ENDC TSTB EXIFLG ; WANT TO EXIT PROGRAM? BNE 20$ ; YES 16$: CMP #QSIZET,COUNT ; PROCESSED ALL TERMINAL CHARACTERS? BNE 12$ ; NO 17$: TSTB SUSPND ; IS PORT QUEUE PROCESSING SUSPENDED? BEQ 1750$ ; NO CLEF$S #1 ; CLEAR EVENT FLAG BR 1$ ; GO WAIT FOR TERMINAL INPUT 1750$: 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 - PROCESS PORT INPUT CHARACTERS ; 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$ ; NO CMPB R0, #WTCHAR ; CHARACTER PROMPT FOR NEXT FILE READ? BNE 10$ ; NO INC RECCNT ; INDICATE ANOTHER RECORD TO SEND TO PORT 10$: TSTB NOECHO ; ECHO THE CHARACTER ? BNE 12$ ; NO QIOMAC R2, #WALTIO, #CHAR, #1, Y ; WRITE CHAR TO TERMINAL 12$: TSTB RDOFLG ; IS OUTPUT REDIRECTED? BEQ 30$ ; NO 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 FILE RECORD 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 - PROCESS TERMINAL INPUT CHARACTERS ; ; NOTE: THIS ROUTINE IS ENTERED WITH THE TERMINAL INPUT CHARACTER ; IN CHAR AND R0 ; TRMIN: TSTB BLDFLG ; BUILDING A FILE NAME/CMD "A"/CMD "B"? BEQ 1$ JSR PC, BUILD ; ADD TO FILENAME OR COMMAND "A"/"B" BR 90$ 1$: TSTB CGEFLG ; CHANGING EOR CHARACTER? BEQ 4$ JSR PC, ENTEOR ; CHANGE EOR CHARACTER BR 90$ 4$: TSTB CMDFLG ; ENTERING A COMMAND? BEQ 5$ JSR PC, CMDIN ; ENTER THE COMMAND BR 90$ 5$: CMPB R0, #CMDCAR ; ENTER COMMAND MODE? BNE 15$ JSR PC, BREAK ; ENTER COMMAND MODE BR 90$ 15$: CMPB R0, #TBCHAR ; TRANSMIT BREAK CHARACTER? BNE 6$ JSR PC, SNDBRK BR 90$ 6$: CMPB R0, #SPNCAR ; SUSPEND PORT QUEUE PROCESSING? BNE 7$ JSR PC,PSLEEP ; PUT HOST TO SLEEP MOVB #1, SUSPND ; SET FLAG BR 90$ 7$: CMPB R0, #RESCAR ; RESUME PORT QUEUE PROCESSING? BNE 8$ CLRB SUSPND ; CLEAR FLAG TO WAKE UP HOST BR 90$ 8$: CMPB R0, #ECOCAR ; TOGGLE ECHO STATUS? BNE 80$ TSTB HLPFLG ; ONLY DO THIS IF HELPING BEQ 80$ NEGB NOECHO ; TOGGLE THE FLAG INCB NOECHO BR 90$ ; 80$: TSTB RDIFLG ; IS INPUT REDIRECTED? BNE 90$ JSR PC,SENDPR ; WRITE CHARACTER TO PORT 90$: RTS PC .PAGE .SBTTL CMDIN - COMMAND PROCESSING ; ; 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,#15 ; EXIT COMMAND MODE? BEQ 9000$ ; CMPB CHAR,#SPNCAR ; IGNORE CONTROL-S AND CONTROL-Q BEQ 9900$ ; INPUT WHILE WAITING FOR A COMMAND CMPB CHAR,#RESCAR ; INPUT, TO AVOID PROBLEM WITH VT100 BNE 1$ ; TERMINAL IN SMOOTH SCROLL WITH 9900$: JMP 99$ ; AUTO XON/XOFF ; 9000$: JMP 90$ ; EXIT COMMAND MODE ; 1$: CMPB CHAR,#141 ; IS CHAR LOWER CASE ALPHA (OR ABOVE) BLT 61$ ; NO BICB #40,CHAR ; ASSUME AN ALPHA - ENSURE UPPER CASE ; 61$: CMPB CHAR, #RIHCAR ; REDIRECTED INPUT HELP? BNE 2$ JSR PC, RDIHLP JMP 90$ 2$: CMPB CHAR, #ROHCAR ; REDIRECTED OUTPUT HELP? BNE 3$ JSR PC, RDOHLP JMP 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,#CNXCAR ; CANCEL BOTH REDIRECTED INPUT & OUTPUT? BNE 450$ ; NO JSR PC,PAWAKE ; WAKE UP HOST FIRST (SO IF HELPING ON ; ; SIGMA 9, EOF CHAR SEQ SENT OK) JSR PC, CANINP ; CANCEL REDIRECTED INPUT FIRST BR 550$ ; THEN CANCEL REDIRECTED OUTPUT 450$: CMPB CHAR, #CNICAR ; CANCEL REDIRECTED INPUT? BNE 5$ JSR PC,PAWAKE ; WAKE UP HOST FIRST (SO IF HELPING ON ; ; SIGMA 9, EOF CHAR SEQ SENT OK) JSR PC, CANINP BR 90$ 5$: CMPB CHAR, #CNOCAR ; CANCEL REDIRECTED OUTPUT? BNE 6$ 550$: 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? BEQ 720$ CMPB CHAR, #EXICAR-100 ; EXIT PROGRAM? BNE 8$ 720$: 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, #XCCCAR ; TRANSMIT CONTROL CHARACTER? BNE 11$ MOVB #CMDCAR,CHAR ; PREPARE TO TRANSMIT CHARACTER BR 15$ 11$: CMPB CHAR,#'S ; TRANSMIT ^S TO PORT? BNE 12$ MOVB #19.,CHAR ; GET ^S BR 15$ 12$: CMPB CHAR,#'Q ; TRANSMIT ^Q TO PORT? BNE 13$ MOVB #17.,CHAR ; GET ^Q BR 15$ 13$: CMPB CHAR,#PASCAR ; DETACH FROM TALK? BNE 14$ JSR PC,PAUSE ; STOP THE PROGRAM TEMPORARILY JSR PC, BREAK ; ISSUE COMMAND PROMPT BR 99$ ; DON'T RESET COMMAND FLAG 14$: CMPB CHAR,#XBCCAR ; TRANSMIT BREAK CONTROL CHARACTER? BNE 20$ MOVB #TBCHAR,CHAR ; GET THE BREAK CONTROL CHARACTER 15$: JSR PC,SENDPR ; SEND CHARACTER 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 - INITIATE COMMAND MODE ; 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, #INTRO, #LENIN2, Y ; WRITE VERSION/PORT MSG QIOMAC R0, #WALTIO, #QUERY4, #LENQ4, Y ; WRITE QUERY4 TO TERMINAL RTS PC .PAGE .SBTTL PAUSE - DETACH FROM TALK ; PAUSE: JSR PC,DETDEV ; DETACH TERMINAL QIOMAC R0,#WALTIO,#PASMSG,#LENPM,Y ; WRITE INTERRUPT MESSAGE STOP$S ; STOP THE PROGRAM JSR PC,ATTDEV ; REATTACH TERMINAL RTS PC ; RETURN .PAGE .SBTTL MENU - DISPLAY COMMAND 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>/ D - detach from TALK/ .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>/ K - transmit break control character (^/ .ASCII /) to port/ .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>/ X - exit both redirected input mode and / .ASCII /redirected output mode/ .ASCII <15><12>/ Z or ^Z - exit TLK program/ .ASCII <15><12>/ - exit command mode/<15><12> LENMNU=.-CMENU .EVEN MENU: JSR PC,DETDEV ; DETACH FROM AST'S QIOMAC R0,#WALTIO,#CMENU,#LENMNU,Y ; WRITE MENU TO TERMINAL JSR PC,ATTDEV ; REATTACH FOR AST'S RTS PC .PAGE .SBTTL RDIHLP - USER HELP FOR AUTOMATIC REDIRECT INPUT ; QUERY6: .ASCII <15><12>/TLK:Enter destination file name:/ LENQ6=.-QUERY6 .EVEN RDIHLP: QIOMAC R0,#WALTIO,#QUERY6,#LENQ6,Y ; WRITE QUERY6 TO TERMINAL INCB BCAFLG ; SET FLAG FOR ENTERING COMMAND INCB BLDFLG ; INDICATE ONE OF THE BUILD FLAGS SET MOV #LENCMA,LENCMD ; SET INITIAL LENGTH OF COMMAND CLR NAMECT ; CLEAR FILE NAME LENGTH MOV #FNAMEA,FNPTR ; POINT TO START OF FILE NAME BUFFER MOV #CMDA,CMDPTR ; POINT TO BEGINNING OF COMMAND STRING INCB HLPFLG ; INDICATE THAT TALK IS HELPING RTS PC .PAGE .SBTTL RDOHLP - USER HELP FOR AUTOMATIC REDIRECT OUTPUT ; QUERY5: .ASCII <15><12>/TLK:Enter source file name:/ LENQ5=.-QUERY5 .EVEN RDOHLP: QIOMAC R0,#WALTIO,#QUERY5,#LENQ5,Y ; WRITE QUERY5 TO TERMINAL INCB BCBFLG ; SET FLAG FOR ENTERING COMMAND INCB BLDFLG ; INDICATE ONE OF THE BUILD FLAGS SET MOV #LENCMB,LENCMD ; SET INITIAL LENGTH OF COMMAND CLR NAMECT ; CLEAR FILE NAME LENGTH MOV #FNAMEB,FNPTR ; POINT TO START OF FILE NAME BUFFER MOV #CMDB,CMDPTR ; POINT TO BEGINNING OF COMMAND STRING INCB HLPFLG ; INDICATE THAT TALK IS HELPING RTS PC .PAGE .SBTTL PSLEEP - SUSPEND HOST OUTPUT ; 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 9$: RTS PC .PAGE .SBTTL PAWAKE - RESUME HOST OUTPUT ; 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: TSTB PTOFF ; IS PORT OUTPUT SUSPENDED? BEQ 20$ ; IF EQ, NO 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 20$: RTS PC .PAGE .SBTTL SNDBRK - TRANSMIT A BREAK CHARACTER TO THE HOST ; SNDBRK: BIS #1,@XCSR ; SET THE "TRANSMIT BREAK" BIT IN THE CSR MRKT$S ,#1,#1,#CLRBRK ; MARK TIME FOR 1 TICK, THEN CLEAR BIT CMP #IS.SUC,$DSW ; CHECK DSW FOR SUCCESS BEQ 9$ ; OK, RETURN BIC #1,@XCSR ; ELSE, CLEAR BIT FIRST 9$: RTS PC .PAGE .SBTTL CLRBRK - CLEAR THE "TRANSMIT BREAK" BIT IN THE CSR ; CLRBRK: BIC #1,@XCSR ; CLEAR THE TB BIT TST (SP)+ ; POP STACK FOR AST EXIT ASTX$S ; RETURN FROM AST ROUTINE .PAGE .SBTTL SUMRY - PRODUCE PROGRAM STATISTICS SUMMARY .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 - REDIRECT INPUT ; REDINP: TSTB RDIFLG ; IS INPUT ALREADY REDIRECTED? BNE 1$ CLR RCVERR ; ZERO COUNT OF RECEIVE ERRORS DETECTED CLR RCVEST ; ZERO RECEIVE ERROR STATUS WORD MOVB #1, BNMFLG ; INDICATE WANT TO OPEN INPUT FILE INCB BLDFLG ; INDICATE ONE OF THE BUILD FLAGS SET MOV #FNAME,FNPTR ; POINT TO START OF FILE NAME BUFFER JSR PC, ASKNM ; ASK FOR FILE NAME 1$: RTS PC .PAGE .SBTTL REDOUT - REDIRECT OUTPUT ; REDOUT: TSTB RDOFLG ; ALREADY HAVE REDIRECTED OUTPUT? BNE 1$ CLR RCVERR ; ZERO COUNT OF RECEIVE ERRORS DETECTED CLR RCVEST ; ZERO RECEIVE ERROR STATUS WORD MOVB #2, BNMFLG ; INDICATE WANT TO OPEN OUTPUT FILE INCB BLDFLG ; INDICATE ONE OF THE BUILD FLAGS SET MOV #FNAME,FNPTR ; POINT TO START OF FILE NAME BUFFER JSR PC, ASKNM ; ASK FOR FILE NAME MOV #OFBUFF, OFBPTR ; RESET BUFFER POINTER 1$: RTS PC .PAGE .SBTTL CANINP - CANCEL REDIRECTED INPUT ; 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 CLRB NOECHO ; CLEAR TERMINAL ECHO FLAG ; .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 .IF DF CKRERR ; IF RECEIVE ERRORS CHECKED JSR PC,RPTERR ; REPORT ANY RECEIVE ERRORS DETECTED .ENDC 9$: RTS PC .PAGE .SBTTL CANOUT - CANCEL REDIRECTED OUTPUT ; 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 CLRB NOECHO ; TURN OFF TERMINAL ECHO FLAG QIOMAC R0, #WALTIO, #CNOMSG, #LENCOM, Y ; WRITE MESSAGE .IF DF CKRERR ; IF RECEIVE ERRORS CHECKED JSR PC,RPTERR ; REPORT ANY RECEIVE ERRORS DETECTED .ENDC 9$: RTS PC .PAGE .SBTTL RPTERR - REPORT ANY RECEIVE ERRORS DETECTED ; .IF DF CKRERR ; IF RECEIVE ERRORS CHECKED RCEMSG: .ASCII <15><12>/** %D RECEIVE ERRORS DETECTED; / .ASCIZ /STATUS = %B **/<15><12> .EVEN ; RPTERR: TST RCVERR ; ANY RECEIVE ERRORS? BEQ 20$ ; NO - SKIP MESSAGE MOV RCVEST,R0 ; GET ERROR STATUS WORD BIC #107777,R0 ; CLEAR ALL BUT ERROR STATUS BITS ASH #-12.,R0 ; SHIFT TO GET 3 BITS AT END OF WORD MOV R0,RCVEST ; STORE WORD MOV #INBUFF,R0 ; OUTPUT BUFFER FOR MESSAGE MOV #RCEMSG,R1 ; MESSAGE STRING MOV #RCVERR,R2 ; ERROR COUNT TO BE CONVERTED CALL $EDMSG ; FORMAT THE MESSAGE QIOMAC R0,#WALTIO,#INBUFF,R1,Y ; PRINT THE MESSAGE 20$: RTS PC .ENDC .PAGE .SBTTL ASKNM - REQUEST PDP FILE NAME ; QUERY3: .ASCII <15><12>/TLK:Enter local 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 - BUILD COMMAND "A" OR "B" OR FILE NAME STRING ; ERASE: .BYTE 10, 40, 10 ; CODE TO ERASE LAST CHARACTER WRITTEN MES2: .ASCII <15><12>/TLK -- File name too long -- Not redirected/<15><12> LENM2=.-MES2 MES6: .ASCII <15><12>/TLK -- / .IIF DF SIGMA9 .ASCII /SIGMA9/ .IIF DF RSX11 .ASCII /PDP/ .ASCII / file name too long/<15><12> LENM6=.-MES6 .EVEN BUILD: CMPB #177, CHAR ; IS CHARACTER A DELETE? BNE 2$ ; NO TST NAMECT ; IF YES, IS THIS FIRST INPUT CHARACTER? BNE 1$ ; NO JMP 30$ ; RETURN 1$: QIOMAC R0, #WALTIO, #ERASE, #3, Y ; ERASE LAST CHARACTER ON TERMINAL DEC NAMECT ; IGNORE LAST CHARACTER IN FNAME DEC FNPTR ; UPDATE FILE NAME POINTER BR 30$ ; RETURN 2$: 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 10$ ; NO QIOMAC R0, , , #3, Y ; ECHO CHARACTER TO TERMINAL MOVB CHAR,@FNPTR ; BUFFER THE CLRB BLDFLG ; TURN OFF GENERAL BUILD FLAG TSTB BNMFLG ; ARE WE BUILDING A LOCAL FILE NAME? BNE 8$ ; YES ADD NAMECT,LENCMD ; CALCULATE LENGTH OF COMMAND INC LENCMD ; INCREMENT LENGTH OF COMMAND FOR INCB WT2FLG ; SET FLAG TO WAIT FOR COMMAND TRANSMIT TSTB BCBFLG ; ARE WE BUILDING COMMAND "B"? BNE 4$ ; YES ; ; BUILDING COMMAND "A" HERE .IF NE LENTRA ; APPEND TRAILING CMD STRING, IF ANY MOV #TRAILA,R2 ; GET START OF TRAILING CMD STRING MOV #LENTRA,R3 ; LENGTH OF TRAILING CMD STRING 3$: MOVB (R2)+,@FNPTR ; BUFFER THE CHARACTER INC FNPTR ; INCREMENT POINTER SOB R3,3$ ; LOOP MOVB #15,@FNPTR ; APPEND THE ADD #LENTRA,LENCMD ; UPDATE COMMAND LENGTH .ENDC CLRB BCAFLG ; TURN OFF BUILD FLAG JSR PC,REDINP ; REDIRECT INPUT BR 30$ ; RETURN 4$: CLRB BCBFLG ; TURN OFF BUILD FLAG JSR PC,REDOUT ; REDIRECT OUTPUT BR 30$ ; RETURN 8$: JSR PC,OPNFLE ; PARSE AND OPEN FILE CLRB BNMFLG ; TURN OFF BUILD FLAG TSTB HLPFLG ; IS TALK HELPING? BEQ 30$ ; NO - RETURN JSR PC,SNDCMD ; TRANSMIT COMMAND STRING BR 30$ ; RETURN 10$: QIOMAC R0, , , #1, Y ; ECHO CHARACTER TO TERMINAL CMP #31., NAMECT ; LONGER THAN ANY LEGAL FILE NAME? BEQ 20$ MOVB CHAR,@FNPTR ; APPEND CHARACTER TO COMMAND INC FNPTR ; INCREMENT COMMAND BUFFER POINTER INC NAMECT ; INCREMENT FILE NAME LENGTH BR 30$ 20$: CLRB BCAFLG ; ERROR, TURN OFF BUILD FLAGS CLRB BCBFLG CLRB BLDFLG ; TURN OFF GENERAL BUILD FLAG TSTB BNMFLG ; BUILDING LOCAL FILE NAME? BNE 25$ ; YES QIOMAC R0, , #MES6, #LENM6, Y ; WRITE MESSAGE 6 TO TERMINAL BR 30$ ; RETURN 25$: CLRB BNMFLG ; CLEAR BUILD FLAG QIOMAC R0, , #MES2, #LENM2, Y ; WRITE MESSAGE 2 TO TERMINAL 30$: RTS PC .PAGE .SBTTL OPNFLE - OPEN REDIRECTED INPUT/OUTPUT FILE ; 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 CLR RECCNT ; CLEAR FLAG FOR SENDING RECORDS TSTB HLPFLG ; IS TALK HELPING? BNE 9$ ; YES INC RECCNT ; NO - START OFF BY SENDING ONE RECORD BR 9$ 1$: OPEN$W #FDBOUT ; OPEN OUTPUT FILE BCS 8$ INCB RDOFLG ; INDICATE REDIRECTED OUTPUT QIOMAC R0, #WALTIO, #RDOMSG, #LENROM, Y ; WRITE MESSAGE BR 9$ 8$: QIOMAC R0, #WALTIO, #MES3, #LENM3, Y ; WRITE MES3 TO TERMINAL CLRB HLPFLG ; CLEAR HELPING FLAG 9$: RTS PC .PAGE .SBTTL SNDCMD - SEND COMMAND "A" OR "B" ; SNDCMD: MOV CMDPTR,R1 ; ADDRESS OF COMMAND 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 - INITIATE NEW EOR PROCESSING ; 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 - SET UP NEW EOR CHARACTER ; 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 - CLOSE INPUT OR OUTPUT FILE ; 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 - READ A RECORD AND TRANSFER TO HOST ; 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 - WRITE BUFFER TO OUTPUT FILE ; 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 - CONNECT TO PORT ; QUERY1: .ASCII <15><12>/TLK:Enter channel number of port: / LENQ1=.-QUERY1 CNMSG: .ASCII <15><12>/** CONNECTED TO PORT / CNMSG2: .ASCII / **/<15><12> ; FIRST BYTE FOR PORT NUMBER IN MESSAGE LENCNM=.-CNMSG CFMSG: .ASCII /** Failed to connect to port - try another port / .ASCII /(^Z to exit) **/ LENCFM=.-CFMSG .EVEN CNPRT: 1$: MOVB #' ,INTRO1 ; REPLACE WITH BLANKS IN INTRO MOVB #' ,INTRO1+1 ; MESSAGE (FOR ANOTHER LATER USE) QIOMAC R0, #WALTIO, #QUERY1, #LENQ1 ; SET UP DPB FOR WRITE QIOMAC R0, #RVBTIO, #INBUFF, #INBSIZ ; SET UP DPB FOR READ CMPB #' ,MCRLIN+G.MCRB+4 ; CHECK FOR NON-BLANK IN MCR LINE CHAR 5 BEQ 2$ ; BLANK MOVB MCRLIN+G.MCRB+4,INBUFF ; NON-BLANK - ASSUME A PORT NUMBER MOVB #' ,MCRLIN+G.MCRB+4 ; BLANK, IN CASE WE BRANCH BACK MOV #1,R1 ; ASSUME ONE BYTE ONLY BR 4$ ; DECODE AND TEST 2$: QIOMAC #WALTIO, , , , Y ; ISSUE WRITE QIOMAC #RVBTIO, , , , Y ; ISSUE READ CMPB IOSTAT, #IS.SUC ; ERROR DURING READ? BEQ 3$ SEC ; INDICATE ERROR ASSIGNING UNIT RTS PC 3$: MOV IOSTAT+2, R1 ; GET NUMBER OF CHARACTERS READ 4$: MOV #INBUFF, R0 ; GET BUFFER ADDRESS ADD R0, R1 ; COMPUTE NEXT FREE LOCATION IN 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 CMP R1,#9. ; IS CHANNEL NUMBER ONE DIGIT? BGT 5$ ; NO MOVB R1,R0 ; COPY CHANNEL NUMBER BISB #60,R0 ; CONVERT CHANNEL NUMBER TO ASCII MOVB R0,CNMSG2 ; INSERT CHARACTER INTO MESSAGE MOVB R0,INTRO2 ; ALSO INSERT INTO OTHER MESSAGE 5$: 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 CLC ; INDICATE NO ERROR QIOMAC R0, #WALTIO, #CNMSG, #LENCNM, Y ; REPORT SUCCESSFUL CONNECT RTS PC 9$: QIOMAC R0, #WALTIO, #CFMSG, #LENCFM, Y ; PRINT ERROR MESSAGE BR 1$ ; REQUEST ANOTHER PORT NUMBER .PAGE .SBTTL ATTDEV - ATTACH TERMINAL AND SET CHARACTERISTICS ; ATTDEV: MOV #DPBTIO,R1 ; QIOW$ FOR TERMINAL MOV #TMC,R2 ; TERMINAL CHARACTERISTICS SAVE AREA 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 - DETACH TERMINAL AND RESET CHARACTERISTICS ; DETDEV: MOV #DPBTIO,R1 ; QIOW$ FOR TERMINAL MOV #TMC,R2 ; TERMINAL CHARACTERISCTIS SAVE AREA 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 - DISCONNECT PORT ; ; 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