; TALK.MAC 06MAY82 ; .ENABL LC ; ; PROGRAM TALK ; ; ; Written By: N.K.BEWTRA,COMPUTER SCIENCES CORPORATION ; ; Date Written: December 16, 1980 ; ; Last Update: May 6, 1982 ; ; ; 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]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 PROGRAM IDENTIFICATION ; .IDENT /V05.11/ INTRO:: .ASCII <15><12>/TLK: Version V05.11 / .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 ; NUMBER OF RECS TO IGNORE WHEN A HELP MODE ; ; CMD IS ECHOED NLRFLG::.BYTE 0 ; FLAG INDICATING IF PREVIOUS PORT RECORD NULL 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 .IF DF VAX CMDA:: .ASCII /COPY TT: / LENCMA==.-CMDA FNAMEA::.BLKB 35. ; AREA FOR VAX/VMS 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 .IF DF VAX CMDB:: .ASCII /COPY / ; VAX/VMS COPY COMMAND LENCMB==.-CMDB .ENDC .IF DF SIGMA9 FNAMEB::.BLKB 32. ; AREA FOR SIGMA-9 FILE NAME .IFF FNAMEB::.BLKB 35. ; AREA FOR RSX11 OR VAX FILE NAME .ENDC ; .EVEN PASMSG:: ; PAUSE MESSAGE .ASCII <15><12>/** TALK INTERRUPTED: TO RESTART, TYPE "UNSTOP / TSKNAM::.BLKB 6 .ASCII /"/<15><12> LENPM==.-PASMSG .EVEN ; ; CSI$ DEF$G ; 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:: 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 CLRB PTISEF ; CLEAR INDICATOR 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 9$: 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 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 ; ; .END TALK