.ENABL LC .NLIST TITLE CNPRT,CNPRT .LIST .PAGE .IF DF PIODIR .SBTTL CNPRT - CONNECT TO PORT ; CNPRT.MAC 01DEC82 ; ; .MCALL CINT$,TCBDF$ ; TCBDF$ ; DEFINE TCB OFFSETS CINT$ ; DEFINE CINT$ OFFSETS (C.INVE) 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 <15><12>/** Failed to connect (DSW=%D) - try another port / .ASCIZ /(^Z to exit) **/ .EVEN CNPRT:: 1$: .IF EQ MAXCHN ; IF ONLY PORT 0 DEFINED CLR R1 ; ZERO REGISTER .IFF ; IF MORE THAN ONE PORT DEFINED 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 .ENDC ;MAXCHN ; MORE THAN ONE PORT DEFINED 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 CALL $SWSTK,55$ ; SWITCH TO SYSTEM STATE MOV $TKTCB,R1 ;; GET TCB ADDRESS BIS #T3.PRV,T.ST3(R1) ;; SET TASK PRIVILEGED RETURN ; RETURN FROM SYSTEM STATE 55$: 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 CALL $SWSTK,6$ ; SWITCH TO SYSTEM STATE MOV $TKTCB,R1 ;; GET TCB ADDRESS BIC #T3.PRV,T.ST3(R1) ;; SET TASK NON-PRIVILEGED RETURN ; RETURN FROM SYSTEM STATE 6$: RTS PC 9$: MOV #INBUFF,R0 ; ERROR MESSAGE BUFFER MOV #CFMSG,R1 ; MESSAGE STRING FOR $EDMSG MOV #$DSW,R2 ; DSW ERROR VALUE TO CONVERT CALL $EDMSG ; PREPARE ERROR MESSAGE QIOMAC R0, #WALTIO, #INBUFF, R1, Y .IF EQ MAXCHN ; IF ONLY PORT 0 DEFINED SEC ; SET ERROR INDICATOR RTS PC ; RETURN .IFF ; IF MORE THAN ONE PORT DEFINED JMP 1$ ; REQUEST ANOTHER PORT NUMBER .ENDC ;MAXCHN ; IF MORE THAN ONE PORT DEFINED .ENDC ;PIODIR .NLIST TITLE DCNPRT,CNPRT .LIST .PAGE .IF DF PIODIR .SBTTL DCNPRT - DISCONNECT PORT ; ; SUBROUTINE TO DISCONNECT THE PORT DCNMSG: .ASCII <15><12>/** DISCONNECTED FROM PORT **/<15><12> LENDCM=.-DCNMSG .EVEN DCNPRT:: CALL $SWSTK,1$ ; SWITCH TO SYSTEM STATE MOV $TKTCB,R1 ;; GET TCB ADDRESS BIS #T3.PRV,T.ST3(R1) ;; SET TASK PRIVILEGED RETURN ; RETURN FROM SYSTEM STATE 1$: DIR$ #DCINTR ; DISCONNECT INTERRUPT FOR RECEIVE DIR$ #DCINTX ; DISCONNECT INTERRUPT FOR TRANSMIT QIOMAC R0, #WALTIO, #DCNMSG, #LENDCM, Y ; REPORT DISCONNECT RTS PC .ENDC ;PIODIR .PAGE .NLIST TITLE ASNPRT,CNPRT .LIST .IF NDF PIODIR .SBTTL ASNPRT - OBTAIN AND ASSIGN TT UNIT NUMBER FOR PORT QUERY1: .ASCII <15><12>/TLK: Enter device TT number of port: / LENQ1=.-QUERY1 .EVEN DEV: .ASCII /TT/ .EVEN ASNPRT:: CLRB R3 ; ASSUME NO READ ERROR QIOMAC R0, #WALTIO, #QUERY1, #LENQ1 ; SET UP DPB FOR WRITE QIOMAC R0, #RVBTIO, #INBUFF, #INBSIZ ; SET UP DPB FOR READ 1$: QIOMAC #WALTIO, , , , Y ; ISSUE WRITE QIOMAC #RVBTIO, , , , Y ; ISSUE READ CMPB IOSTAT, #IS.SUC ; ERROR DURING READ? BEQ 2$ INCB R3 ; INDICATE ERROR ASSIGNING UNIT BR 3$ 2$: MOV #INBUFF, R0 ; GET BUFFER ADDRESS MOV IOSTAT+2, R1 ; GET NUMBER OF CHARACTERS READ MOVB INBUFF,INTRO2 ; MOVE TERMINAL NUMBER TO MESSAGE AREA DEC R1 ; DECREMENT COUNT BLE 6$ ; BRANCH IF COUNT NOW ZERO OR LESS MOVB INBUFF+1,INTRO2+1 ; MOVE SECOND DIGIT OF TERMINAL NUMBER ; (ASSUMPTION HERE: 2 DIGITS MAX) 6$: INC R1 ; RESTORE COUNT ADD R0, R1 ; COMPUTE NEXT FREE LOCATION IN INPUT BUFFER MOVB #40, (R1) ; STOP CHARACTER TRANSLATION CALL $COTB ; CONVERT ASCII TO BINARY CMPB #40, R2 ; CONVERSION ERROR? BNE 1$ ; YES, REQUERY ALUN$S #3, DEV, R1 ; ASSIGN LUN 3 TO PORT BCS 1$ ; IF ASSIGN FAILED, REQUERY 3$: RTS PC .ENDC ;NDF PIODIR .PAGE .NLIST TITLE SUMRY,CNPRT .LIST .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 ;CKFREE .NLIST TITLE RPTERR,CNPRT .LIST .PAGE .IF DF PIODIR .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 ;CKRERR .ENDC ;PIODIR .NLIST TITLE ,CNPRT .LIST ; .END