.TITLE REC10 ; 3-AUG-1989 10:50:29 - JMB - changed location of PASMAC (again) ;************************************************************* ; ; THIS EXAMPLE WILL: ; ACCEPT SHORT MESSAGES FROM THE SENDER TASK "SND10" ; PRINT THE MESSAGES ON THE CONSOLE DEVICE (C0:) ; DISCONNECT AND EXIT GRACEFULLY. ; ; To assemble use the following command string: ; ; MAC REC10,REC10/-SP=IN:[130,10]NETLIB/ML,IN:[200,200]REC10 ; ; To task build use the following command string: ; ; TKB REC10,REC10/-SP=REC10,IN:[130,10]NETLIB/LB ; ; ; Note: The IN: device must be the DECnet distribution device ; after the PREGEN (if any) has been performed. ; ;************************************************************* .library /lb:[1,1]netlib.mlb/ .MCALL OPNW$S,SPAW$S,RECW$S,GNDW$S,ACCW$S,CLSW$S,NETDF$ .MCALL QIOW$S,ALUN$C,CLEF$C,WTSE$C,SETF$C,ASTX$S,EXIT$S NETDF$ ; ; DATA AREA ; BUF1: .BLKB 25. ; BUFFER FOR USER MESSAGES .EVEN BUF2: .BLKB M.CBL ; BUFFER FOR NETWORK MESSAGES IOST: .BLKW 2 ; COMPLETION STATUS FOR NETWORK IOST1: .BLKW 2 ; COMP. STAT. FOR GET NET DATA IOST2: .BLKW 2 ; COMP. STAT. FOR ACCEPT CONNECT IOSB: .BLKW 1 ; I/O STATUS ERRCNT: .WORD 0 ; ERROR COUNT CNT: .WORD 0 ; USER MESSAGE CHAR COUNT CNTB: .BLKB 2 ; INTERRUPT MESSAGE CHAR COUNT FLAG: .WORD 0 ; DISCONNECT FLAG .EVEN ; ; CODE ; START: CLR ERRCNT ; INITIALIZE ERROR COUNT TO ZERO ; CLEF$C 10. ; CLEAR EVENT FLAG USED TO MAKE ; SURE CONNECT HAS OCCURRED ALUN$C 1,NS ; ASSIGN LUN 1 FOR NETWORK DATA QUEUE ALUN$C 2,NS ; ASSIGN LUN 2 FOR LOGICAL LINK OPNW$S #1,#1,#IOST,,<0,,#NT.LCB> ; CREATE THE NETWORK DATA QUEUE TSTB IOST ; TEST FOR ERRORS BLE ERR1 SPAW$S #1,#1,#IOST,#CMPAST,<#NETAST> ; SPECIFY AST HANDLING TSTB IOST ; TEST FOR ERRORS BLE ERR2 WTSE$C 10. ; WAIT TO MAKE SURE CONNECT ; HAS OCCURRED LOOP: RECW$S #2,#2,#IOST,,<#BUF1,#25.>; RECEIVE UP TO 25 CHARS TSTB IOST ; TEST FOR ERRORS BLE ERR3 MOV IOST+2,CNT ; OBTAIN CHARACTER COUNT QIOW$S #IO.WLB,#5,#5,,,,<#BUF1,CNT,#40>; TYPE MESSAGE ; ON TERMINAL TST FLAG ; HAS DISCONNECT OCCURRED? BEQ LOOP ; NO, POST ANOTHER RECEIVE CLSW$S #1,#1,#IOST2 ; CLOSE NETWORK TSTB IOST2 ; TEST FOR ERRORS BLE ERR5 EXIT$S ; PROGRAM EXIT BR LOOP ; ; ERROR HANDLING - A SAMPLE DEBUGGING TECHNIQUE ; ERR6: INC ERRCNT ERR5: INC ERRCNT ERR4: INC ERRCNT ERR3: INC ERRCNT ERR2: INC ERRCNT ERR1: INC ERRCNT MOV ERRCNT,R1 ; R1 = ERROR NUMBER MOV $DSW,R2 ; R2 = DIRECTIVE STATUS WORD MOV IOST,R3 ; R3 = I/O STATUS BLOCK (1ST WORD) MOV IOST+2,R4 ; R4 = I/O STATUS BLOCK (2ND WORD) IOT ; ABORT - DUMP REGISTERS ; ; ; AST HANDLING FOR DATA IN NETWORK DATA QUEUE ; CMPAST: MOV (SP)+,IOSB ; SAVE SPA$ I/O STATUS BLOCK ADDR MOV R0,-(SP) ; SAVE R0 MOV IOSB,R0 ; GET I/O STATUS BLOCK ADDRESS CMPB #IS.SUC,(R0) ; SUCCESSFUL? BEQ OKA JMP OUT OKA: MOV 2(R0),R0 ; GET CURRENT NETWORK DATA COUNT BNE OKB JMP OUT OKB: BR GET NETAST: MOV R0,-(SP) ; SAVE R0 MOV #1,R0 ; SET NETWORK DATA COUNT TO 1 GET: GNDW$S #1,#1,#IOST1,,<#BUF2,#M.CBL> ; GET NETWORK DATA BCS OUT ; CARRY BIT SET - ERROR CMPB #IS.SUC,IOST1 ; SUCCESSFUL? BNE OUT CMPB #NT.CON,IOST1+1 ; CHECK IF CONNECT REQUEST BNE OTHER ACCW$S #2,#2,#IOST2,,<#BUF2> ; ACCEPT CONNECTION TSTB IOST2 ; TEST FOR ERRORS BLE ERR4 SETF$C 10. ; SET EVENT FLAG TO INDICATE ; CONNECT HAS OCCURRED BR NEXT OTHER: CMPB #NT.DSC,IOST1+1 ; CHECK IF DISCONNECT REQUEST BNE OTHR2 MOV #1,FLAG ; SET DISCONNECT FLAG BR NEXT ; GO BACK TO MAIN ROUTINE ; ; OTHR2: CMPB #NT.INT,IOST1+1 ; CHECK IF INTERRUPT MESSAGE BEQ OKC JMP ERR6 ; NOT A EXPECTED COMMAND OKC: MOVB IOST1+2,CNTB ; OBTAIN CHARACTER COUNT QIOW$S #IO.WLB,#5,#3, , , ,<#BUF2,CNTB,#40> ; TYPE INTERRUPT MESSAGE ; (NOTE USE OF EF 3 ; INSTEAD OF EF 5) NEXT: NOP DEC R0 ; CHECK IF MORE DATA BEQ OUT JMP GET OUT: MOV (SP)+,R0 ; RESTORE R0 ASTX$S ; AST EXIT ; ; ; .END START