.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 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 .IF DF VAX .BYTE 23 ; ^S ON VAX .IFF .ERROR SIGMA9, RSX11, OR VAX HOST MUST BE DEFINED! .ENDC .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 .IF DF VAX .BYTE 21 ; ^Q ON VAX .IFF .ERROR SIGMA9, RSX11, OR VAX HOST MUST BE DEFINED! .ENDC .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 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 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 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 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 #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 - 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 .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 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 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 ; .END