.NLIST TITLE CONTRL,CONTRL .LIST .PAGE .SBTTL CONTRL - PROCESS ALL INPUT DATA AND COMMANDS ; CONTRL.MAC 01AUG84 ; ; .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$: CMP COUNTP,#QSIZEP ; 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$ JSR PC,OUTTRM ; FLUSH OUTPUT TO TERMINAL 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 9$ ; IF GT, NO TSTB PTOFF ; PORT OUTPUT ALREADY SUSPENDED? BNE 9$ ; IF NE, NO JSR PC, PSLEEP ; SUSPEND PORT OUTPUT FROM HOST .ENDC ;NDF IBMTSO .IF DF CKFREE INC NSLEEP ; INCREMENT STATISTICS COUNT .ENDC ;CKFREE 9$: CMP OUTPTR,#OUTBUF+OUTSIZ ; IS TERMINAL OUTPUT BUFFER FULL? BLO 2$ ; NOT FULL, CHECK FOR MORE OUTPUT 10$: JSR PC,OUTTRM ; FLUSH TERMINAL OUTPUT BUFFER 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 JMP 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 300$ ; 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 ; 300$: JMP 3$ .NLIST TITLE PRTIN,CONTRL .LIST .PAGE .SBTTL PRTIN - PROCESS PORT INPUT CHARACTERS ; PRTIN:: TSTB WT2FLG ; IS COMMAND BEING ECHOED? BEQ 5$ ; NO MOVB R0,@OUTPTR ; ECHO CHARACTER INC OUTPTR ; INCREMENT TERMINAL OUTPUT POINTER CMPB R0,#15 ; IS THIS THE END OF THE COMMAND? BNE 3$ ; NO DECB WT2FLG ; IGNORED THIS RECORD - COUNT IT .IF DF RSXBIN BNE 3$ ; IF STILL IN OUTPUT PROMPT TSTB HLPFLG ; BINARY TRANSFER (TALK HELPING)? BEQ 3$ ; NOT BINARY TRANSFER QIOMAC R0,#WALTIO,#MES1,#2,Y ; OUTPUT EXTRA CR/LF .ENDC ;RSXBIN 3$: JMP 30$ ; 5$: TSTB RDIFLG ; IS INPUT REDIRECTED? BEQ 10$ ; NO .IF DF RSXBIN TSTB HLPFLG ; IS TALK HELPING? BEQ 6$ ; NO, NOT BINARY FILE MOVB R0,INPRMP ; SAVE INPUT PROMPT CMPB R0,#'+ BEQ 7$ ; IF PROMPT IS FLAG FOR OK XFER CMPB R0,#'- BEQ 7$ ; IF PROMPT IS FLAG FOR RETRY XFER BR 10$ ; UNKNOWN PROMPT, MUST JUST BE ECHO .ENDC ;RSXBIN 6$: CMPB R0, #WTCHAR ; CHARACTER PROMPT FOR NEXT FILE READ? BNE 10$ ; NO 7$: 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 MOV R1,-(SP) MOV OUTPTR,R1 ; GET OUTPUT BUFFER ADDRESS MOVB ERASE,(R1)+ ; ERASE LAST CHAR ON CRT MOVB ERASE+1,(R1)+ MOVB ERASE+2,(R1)+ MOV R1,OUTPTR ; UPDATE OUTPUT POINTER DEC NDEL ; DECREMENT NUMBER OF DELETES PENDING BR 12$ .ENDC ;SIGDEL .IF DF RSXBIN TSTB RDOFLG ; REDIRECTED OUTPUT? BEQ 11$ ; NO TSTB HLPFLG ; IS TALK HELPING? (BINARY TRANSFER) BNE 12$ ; YES, DON'T ECHO CHAR .ENDC ;RSXBIN 11$: MOVB R0,@OUTPTR ; WRITE CHAR TO TERMINAL INC OUTPTR ; INCREMENT POINTER ADDRESS 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,OUTTRM ; FLUSH TERMINAL OUTPUT BUFFER 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$: .IF DF RSXBIN TSTB HLPFLG ; BINARY FILE TRANSFER? BEQ 29$ ; IF NO JSR PC,CNVBIN ; CONVERT INPUT RECORD FROM HEX TST CKSUM ; CHECKSUM SHOULD BE ZERO BEQ 28$ ; IF RECORD OK MOV #OFBUFF,R1 ; ECHO THE INPUT RECORD MOV OFBPTR,R2 ; (IT MAY HAVE BEEN AN ERROR MSG) SUB R1,R2 QIOMAC R0,#WALTIO,R1,R2,Y MOVB #'-,CHAR ; ECHO "-" FOR BAD HANDSHAKE JSR PC,SENDPR QIOMAC R0,#WALTIO,#CHAR,#1,Y MOV #OFBUFF,OFBPTR ; RESET BUFFER POINTER BR 30$ 28$: MOVB #'+,CHAR ; ECHO "+" FOR GOOD HANDSHAKE JSR PC,SENDPR QIOMAC R0,#WALTIO,#CHAR,#1,Y 29$: .ENDC ;RSXBIN JSR PC, WRTBUF ; WRITE BUFFER TO FILE 30$: RTS PC .NLIST TITLE OUTTRM,CONTRL .LIST .PAGE .SBTTL OUTTRM - WRITE OUTPUT BUFFER TO TERMINAL OUTTRM:: MOV OUTPTR,R1 ; GET THE OUTPUT POINTER SUB #OUTBUF,R1 ; SUBTRACT BUFFER ADDRESS TO GET LENGTH BEQ 10$ ; IF BUFFER IS EMPTY, DON'T WRITE QIOMAC R0,#WALTIO,#OUTBUF,R1,Y ; WRITE THE BUFFERED DATA MOV #OUTBUF,OUTPTR ; RESET THE OUTPUT POINTER 10$: 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 .IF DF RSXBIN .BYTE 'S-100 ; ^S ON RSX11M (BINARY TRANSFER) .IFF .ERROR SIGMA9, RSX11, VAX, OR IBM HOST MUST BE DEFINED! .ENDC ;RSXBIN .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 .IF DF RSXBIN .BYTE 'Q-100 ; ^Q ON RSX11M (BINARY TRANSFER) .IFF .ERROR SIGMA9, RSX11, VAX, OR IBM HOST MUST BE DEFINED! .ENDC ;RSXBIN .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$ .IF DF RSXBIN TSTB HLPFLG ; IS IT A BINARY FILE TRANSFER? BEQ 3$ ; IF NO MOV FFBY,FDBOUT+F.FFBY ; SET LAST BYTE AND LAST BLOCK ... MOV EFBK,FDBOUT+F.EFBK ; IN FDB MOV EFBK+2,FDBOUT+F.EFBK+2 BR 5$ .ENDC ;RSXBIN 3$: CMP OFBPTR, #OFBUFF ; ANYTHING IN THE BUFFER? BEQ 5$ JSR PC, WRTBUF ; WRITE WHAT'S LEFT IN THE BUFFER 5$: 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 .IF DF RSXBIN TSTB HLPFLG ; IS TALK HELPING? BNE 20$ ; YES, BINARY FILE .ENDC ;RSXBIN 5$: GET$ #FDBIN ; READ A RECORD FROM FILE BCS 1$ MOV F.NRBD(R0), R1 ; GET LENGTH OF RECORD READ .IF DF RSXBIN BR 50$ 20$: MOV OLDINL,R1 ; GET OLD INPUT LENGTH CMPB #'+,INPRMP ; CHECK INPUT PROMPT FOR GOOD XFER BNE 50$ ; IF NOT GOOD, RE-XMIT CMP BLKPTR,#BLKBUF+512. ; BUFFER EMPTY YET? BLO 30$ ; IF NOT, USE IT UP .MCALL READ$,WAIT$ READ$ #FDBIN,#BLKBUF,#512.,,#15 BCS 1$ WAIT$ #FDBIN BCS 1$ MOV #BLKBUF,BLKPTR ; RESET POINTER TO BEGINNING OF BUF 30$: JSR PC,TOBIN ; CONVERT A LINE FOR SENDING MOV R1,OLDINL ; SAVE INPUT LENGTH 50$: .ENDC ;RSXBIN INC NREC ; UPDATE COUNT OF RECORDS FROM FILE INC NRECA ; UPDATE COUNT SINCE LAST MESSAGE .IIF DF IBMTSO TST R1 .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 JSR PC,SENDPR ; SEND A CHARACTER 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 .IF DF RSXBIN TSTB HLPFLG ; BINARY FILE TRANSFER? BEQ 30$ ; IF NO MOV BLKPTR,R0 ; GET CURRENT BLOCK POINTER BNE 10$ ; IF NON-ZERO, FILE IS OPEN JSR PC,OPNBIN ; IF ZERO, OPEN NEW OUTPUT FILE ... MOV #BLKBUF,BLKPTR ; WITH ATTRIBUTES BR 40$ 10$: CMP BLKPTR,#BLKBUF+512. ; OUTPUT BUFFER FULL? BLO 40$ ; IF NOT FULL .MCALL WRITE$,WAIT$ WRITE$ #FDBOUT,#BLKBUF,#512.,,#15 BCS 25$ WAIT$ #FDBOUT 25$: MOV #BLKBUF,BLKPTR ; RESET BLOCK POINTER BR 40$ 30$: .ENDC ;RSXBIN PUT$ #FDBOUT, , OFBPTR ; WRITE BUFFER TO OUTPUT FILE 40$: 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 .IF DF RSXBIN TITLE CNVBIN,CONTRL .LIST .PAGE .SBTTL CNVBIN - CONVERT OUTPUT RECORD FROM HEX ; CNVBIN:: MOV #OFBUFF,R0 ; START RECORD POINTER MOV BLKPTR,R1 ; GET DISK BUFFER POINTER BNE 5$ ; IF NON-ZERO, FILE IS OPEN MOV #BLKBUF,R1 ; OTHERWISE, COPY ATTRIBUTES ... ; ... TO BEGINNING OF BUFFER 5$: MOV OFBPTR,R2 ; GET LENGTH OF INPUT RECORD SUB R0,R2 MOV #1,CKSUM ; INITIALIZE CHECKSUM 10$: MOVB (R0)+,R3 ; GET INPUT CHARACTER SUB #77,R3 ; SUBTRACT '?' OFFSET SWAB R3 ; MOVE TO UPPER 5 BITS OF WORD ASL R3 ASL R3 ASL R3 BIC #003777,R3 MOVB (R0)+,R4 ; GET NEXT CHARACTER SUB #77,R4 ; SUBTRACT '?' OFFSET ASL R4 ; MOVE TO MIDDLE 6 BITS OF WORD ASL R4 ASL R4 ASL R4 ASL R4 BIC #174037,R4 BIS R4,R3 ; ADD TO FIRST 5 BITS MOVB (R0)+,R4 ; GET NEXT CHARACTER SUB #77,R4 ; SUBTRACT '?' OFFSET BIC #177740,R4 ; GET LOWER 5 BITS BIS R4,R3 ; ADD TO OTHER 11 BITS MOV R3,(R1)+ ; MOVE FINAL WORD TO DISK BUFFER ADD R3,CKSUM ; ADD WORD TO CHECKSUM SUB #3,R2 ; SUBTRACT 3 CHARS FROM INPUT REC LEN BGT 10$ ; IF MORE CHARS LEFT, LOOP TST -(R1) ; ADJUST POINTER TO TAKE OFF ... ; ... INPUT CHECKSUM TST BLKPTR ; CHECK INITIAL DISK BUFFER POINTER BEQ 20$ ; IF ZERO, DON'T UPDATE POINTER MOV R1,BLKPTR ; UPDATE DISK BUFFER POINTER 20$: RTS PC .ENDC ;RSXBIN .LIST .IF DF RSXBIN .NLIST TITLE TOBIN,CONTRL .LIST .PAGE .ENDC ;RSXBIN .IF DF RSXBIN .SBTTL TOBIN - CONVERT INPUT RECORD TO BINARY FOR SENDING ; TOBIN:: MOV BLKPTR,R0 ; GET POINTER WITHIN INPUT BLOCK MOV #INBUFF,R1 MOV #-1,CKSUM ; START CHECKSUM AT -1 10$: MOV (R0)+,R2 ; GET INPUT WORD SUB R2,CKSUM ; ADJUST CHECKSUM CALL BINWRD ; CONVERT WORD TO BINARY CMP R0,#BLKBUF+512. ; BUFFER EMPTY YET? BHIS 20$ ; IF EMPTY CMP R1,#INBUFF+70. ; CONVERSION BUFFER FULL YET? BLO 10$ ; IF NOT FULL 20$: MOV CKSUM,R2 ; GET RESULTING CHECKSUM CALL BINWRD ; CONVERT TO BINARY SUB #INBUFF,R1 ; GET CONVERSION BUFFER LENGTH MOV R0,BLKPTR ; UPDATE THE BLOCK POINTER RTS PC .ENDC ;RSXBIN .IF DF RSXBIN .NLIST TITLE BINWRD,CONTRL .LIST .PAGE .ENDC ;RSXBIN .IF DF RSXBIN .SBTTL BINWRD - CONVERT SINGLE WORD TO BINARY FOR SENDING ; BINWRD:: MOV R2,R3 ; GET TOP 5 BITS OF WORD SWAB R3 ASR R3 ASR R3 ASR R3 BIC #177740,R3 ADD #77,R3 ; ADD OFFSET OF '?' MOVB R3,(R1)+ ; MOVE TO RECORD BUFFER MOV R2,R3 ; GET MIDDLE 6 BITS OF WORD ASR R3 ASR R3 ASR R3 ASR R3 ASR R3 BIC #177700,R3 ADD #77,R3 ; ADD OFFSET OF '?' MOVB R3,(R1)+ ; MOVE TO RECORD BUFFER BIC #177740,R2 ; GET BOTTOM 5 BITS OF WORD ADD #77,R2 ; ADD OFFSET OF '?' MOVB R2,(R1)+ ; MOVE TO RECORD BUFFER RTS PC .ENDC ;RSXBIN .NLIST TITLE ,CONTRL .LIST ; .END