.NLIST TITLE CONTRL,CONTRL .LIST .PAGE .SBTTL CONTRL - PROCESS ALL INPUT DATA AND COMMANDS ; CONTRL.MAC 01DEC82 ; ; .ENABL LC 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 ;CKFREE .IF NDF IBMTSO 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 .ENDC ;NDF IBMTSO .IF DF CKFREE INC NSLEEP ; INCREMENT STATISTICS COUNT .ENDC ;CKFREE 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 ;CKFREE 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 .IF NDF IBMTSO TSTB PTOFF ; HOST OUTPUT CURRENTLY SUSPENDED? BEQ 19$ ; IF EQ, NO JSR PC, PAWAKE ; RESTART HOST OUTPUT .ENDC ;NDF IBMTSO 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 .NLIST TITLE PRTIN,CONTRL .LIST .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 DECB WT2FLG ; IGNORED THIS RECORD - COUNT IT 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 .IF DF IBMTSO MRKT$S #5,#10.,#1 ; WAIT A LITTLE (ON IBM) WTSE$S #5 .ENDC ;IBMTSO 10$: TSTB NOECHO ; ECHO THE CHARACTER ? BNE 12$ ; NO .IF DF SIGDEL CMPB R0, EOR ; IS THIS AN EOR CHARACTER? BNE 13$ ; NO CLR NDEL ; FORGET DELETES WHEN EOR RECEIVED 13$: TST NDEL ; ANY DELETED CHARACTERS PENDING? BLE 11$ ; NO CMPB R0,#'\ ; IS CHARACTER A BACKSLASH? BNE 11$ ; NO QIOMAC R2, #WALTIO, #ERASE, #3, Y ; ERASE LAST CHAR ON CRT DEC NDEL ; DECREMENT NUMBER OF DELETES PENDING BR 12$ .ENDC ;SIGDEL 11$: 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 .IF DF SIGMA9 ! VAX TSTB NLRFLG ; IF LAST RECORD NOT NULL, ASSUME PROMPT BEQ 14$ ; CHARACTER WAS IN THE FILE - CONTINUE .ENDC ;SIGMA9 ! VAX 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 ! VAX ; DELAY WRITING NULL RECORDS IF HELPING ; ; AVOIDS NULL REC BEFORE PROMPT CHAR TSTB HLPFLG ; IS TALK HELPING? BEQ 25$ ; NO TSTB NLRFLG ; WAS PREVIOUS RECORD NULL? BEQ 23$ ; NO JSR PC, WRTNUL ; WRITE NULL RECORD TO FILE 23$: MOVB #1,NLRFLG ; ASSUME A NULL RECORD CMP #OFBUFF,OFBPTR ; IS CURRENT RECORD NULL? BEQ 30$ ; YES - DO NOT WRITE YET CLRB NLRFLG ; INDICATE RECORD NOT NULL .ENDC ;SIGMA9 ! VAX 25$: JSR PC, WRTBUF ; WRITE BUFFER TO FILE 30$: RTS PC .NLIST TITLE TRMIN,CONTRL .LIST .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$: .IF DF PIODIR CMPB R0, #TBCHAR ; TRANSMIT BREAK CHARACTER? BNE 6$ JSR PC, SNDBRK BR 90$ .ENDC ;PIODIR 6$: CMPB R0, #SPNCAR ; SUSPEND PORT QUEUE PROCESSING? BNE 7$ .IF NDF IBMTSO JSR PC,PSLEEP ; PUT HOST TO SLEEP MOVB #1, SUSPND ; SET FLAG .ENDC ;NDF IBMTSO 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$ .IF DF SIGDEL CMPB R0, #177 ; IS CHARACTER A DELETE BNE 22$ ; NO INC NDEL ; YES - REMEMBER IT .ENDC ;SIGDEL 22$: JSR PC,SENDPR ; WRITE CHARACTER TO PORT 90$: RTS PC .NLIST TITLE PSLEEP,CONTRL .LIST .PAGE .SBTTL PSLEEP - SUSPEND HOST OUTPUT ; PTHALT: .IF DF SIGMA9 .ASCII <33>/H/ ; H ON SIGMA 9 .IFF .IF DF RSX11 .BYTE 'S-100 ; ^S ON RSX-11M .IFF .IF DF VAX .BYTE 'S-100 ; ^S ON VAX .IFF .IF DF IBMTSO .BYTE '? ; NONE, YET, ON IBM .IFF .ERROR SIGMA9, RSX11, VAX, OR IBM HOST MUST BE DEFINED! .ENDC ;IBMTSO .ENDC ;VAX .ENDC ;RSX11 .ENDC ;SIGMA9 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 ;LENHLT-1 9$: RTS PC .NLIST TITLE PAWAKE,CONTRL .LIST .PAGE .SBTTL PAWAKE - RESUME HOST OUTPUT ; PTSTRT: .IF DF SIGMA9 .BYTE 33 ; ON SIGMA 9 .IFF .IF DF RSX11 .BYTE 'Q-100 ; ^Q ON RSX-11M .IFF .IF DF VAX .BYTE 'Q-100 ; ^Q ON VAX .IFF .IF DF IBMTSO .BYTE '? ; NONE, YET, ON IBM .IFF .ERROR SIGMA9, RSX11, VAX, OR IBM HOST MUST BE DEFINED! .ENDC ;IBMTSO .ENDC ;VAX .ENDC ;RSX11 .ENDC ;SIGMA9 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 ;LENSTR-1 20$: RTS PC .NLIST TITLE BREAK,CONTRL .LIST .PAGE .SBTTL BREAK - INITIATE COMMAND MODE ; QUERY4: .ASCII <15><12>/TLK:Enter command (M for menu)>/ LENQ4=.-QUERY4 .EVEN BREAK:: .IF NDF IBMTSO JSR PC,PSLEEP ; PUT THE HOST TO SLEEP MOVB #1,SUSPND ; SUSPEND PROCESSING OF PORT QUEUE .ENDC ;IBMSTO 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 .NLIST TITLE REDINP,CONTRL .LIST .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 .NLIST TITLE REDOUT,CONTRL .LIST .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 .NLIST TITLE SNDBRK,CONTRL .LIST .PAGE .IF DF PIODIR .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 .ENDC ;PIODIR .NLIST TITLE CANINP,CONTRL .LIST .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 ; .IFF MOVB #'Z-100,CHAR ; SEND ^Z TO PORT FOR JSR PC,SENDPR .ENDC ;SIGMA9 ; 3$: CLRB HLPFLG ; CLEAR HELP FLAG QIOMAC R0, #WALTIO, #CNIMSG, #LENCIM, Y ; WRITE MESSAGE CLR RECCNT ; CLEAR RECORD COUNT 9$: RTS PC .NLIST TITLE CANOUT,CONTRL .LIST .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 9$: RTS PC .NLIST TITLE ASKNM,CONTRL .LIST .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 .NLIST TITLE CLSFLE,CONTRL .LIST .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 .NLIST TITLE XFERP,CONTRL .LIST .PAGE .SBTTL XFERP - READ A RECORD AND TRANSFER TO THE HOST ; XFERP:: WTSE$S #10 ; WAIT UNTIL ALL PORT I/O IS DONE 5$: GET$ #FDBIN ; READ A RECORD FROM FILE BCS 1$ INC NREC ; UPDATE COUNT OF RECORDS FROM FILE INC NRECA ; UPDATE COUNT SINCE LAST MESSAGE MOV F.NRBD(R0), R1 ; GET LENGTH OF RECORD READ .IIF DF IBMTSO BEQ 5$ MOVB EOR, INBUFF(R1) ; APPEND AN EOR TO THE RECORD INC R1 ; UPDATE RECORD LENGTH MOV #INBUFF,R2 .IF DF PIODIR 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 ;RSX11 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$ .IFF ;PIODIR QIOMAC R0,#WARPIO,R2,R1,Y ; WRITE RECORD TO PORT BR 2$ .ENDC ;PIODIR 1$: JSR PC, CANINP ; ERROR OR EOF DURING READ, CANCEL REDIRECTED INPUT 2$: RTS PC .NLIST TITLE WRTBUF,CONTRL .LIST .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 .NLIST TITLE WRTNUL,CONTRL .LIST .PAGE .SBTTL WRTNUL - WRITE NULL RECORD TO OUTPUT FILE ; WRTNUL:: PUT$ #FDBOUT, , #0 ; WRITE NULL RECORD TO OUTPUT FILE RTS PC .NLIST TITLE ATTDEV,CONTRL .LIST .PAGE .SBTTL ATTDEV - ATTACH TERMINAL OR PORT AND SET CHARACTERISTICS ; ; Entered with R0 = 0 to attach terminal ; with R0 = 1 to attach port ; ATTDEV:: TST R0 ; ATTACH THE TERMINAL? BNE 1$ ; NO MOV #DPBTIO, R1 ; SET UP FOR THE TERMINAL MOV #TMC, R2 MOV #AST, R3 BR 2$ 1$: .IF NDF PIODIR MOV #DPBPIO, R1 ; SET UP FOR THE PORT MOV #PMC, R2 MOV #PRTAST, R3 .ENDC ;NDF PIODIR 2$: 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, , R3, R0, Y ; ATTACH DEVICE WITH UNSOLICITED INPUT RTS PC .NLIST TITLE DETDEV,CONTRL .LIST .PAGE .SBTTL DETDEV - DETACH TERMINAL OR PORT AND RESET CHARACTERISTICS ; ; Entered with R0 = 0 to detach terminal ; with R0 = 1 to detach port ; DETDEV:: TST R0 ; DETACH THE TERMINAL? BNE 1$ ; NO MOV #DPBTIO, R1 ; SET UP FOR THE TERMINAL MOV #TMC, R2 BR 2$ 1$: .IF NDF PIODIR MOV #DPBPIO, R1 ; SET UP FOR THE PORT MOV #PMC, R2 .ENDC ;NDF PIODIR 2$: 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 QIOMAC R1, , R2, #14., Y ; RESET CHARACTERISTICS TO EARLIER STATE RTS PC .NLIST TITLE ,CONTRL .LIST ; .END