.PAGE .SBTTL CNPRT - CONNECT TO PORT ; ; .MCALL CINT$ ; CINT$ 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 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 .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 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 ; .END