.TITLE CDPACK .IDENT /V1.4/ ; ; AUTHOR: ; VICKY WHITE ; FERMI NATIONAL ACCELERATOR LABORATORY ; BATAVIA, IL 60510 ; ; UPDATE HISTORY: ; V01 - MAY1882 - VW - ORIGINAL VERSION ; V1.1 - JUL3082 - VW - RELEASE VERSION - FEW LITTLE BUGS FIXED ; V1.2 - OCT1382 - VW - WORD COUNT INSTEAD OF BYTE COUNT RETURNED IN STATUS 2 ; - CONVERSION FOR RSX ONLY. ; V1.3 - 09NOV82 - VW - MESSAGE BLOCK RELEASED ON SUCCESSFUL CLOSE ; V1.4 - 26JUL84 - DB - make CDIN[W] and CDOUT[W] global ; - message block not released on unsuccesful close ; - clean up area around call to DRIVER ; ; ++ ; ; FUNCTION: ; ; THIS IS THE CORE OF THE PACKAGE OF FORTRAN CALLABLE ROUTINES ; WHICH PROVIDE INTER-PROGRAM COMMUNICATION VIA CALLS TO A ; COMMUNICATIONS DRIVER. ; ; THE ROUTINES ARE DESCRIBED IN PN-159 ; ; DETAILS OF THE IMPLEMENTATION PHILOSOPHY AND USE OF THE ; COMMON /CDCM82/ ARE DESCRIBED IN NOTE IN-68. ; ; ; THE ROUTINES ARE FOR USE UNDER BOTH AND RSX11M AND AN RT11 ; OPERATING SYSTEM. ; THE OPERATING SYSTEM DEPENDENT PARTS ARE WRITTEN AS MACROS ; FOR WHICH DIFFERENT VERSIONS EXIST FOR RSX AND RT SYSTEMS. ; ; THE FOLLOWING MACROS ARE USED: ; ----------------------------- ; ; MACROS COMMON TO BOTH RSX AND RT .MCALL CHT$DF ;DEFINE OFFSETS IN CHANNEL TABLE ENTRY .MCALL MBL$DF ;DEFINE OFFSETS IN MESSAGE BLOCK .MCALL $CM82 ;COMMON CDCM82 DEFINITION .MCALL ERR$DF ; ; MACROS WITH DIFFERENT VERSION FOR RSX AND RT ; .MCALL RT$RSX ;DEFINE VERSION: RT-11 OR RSX-11M .MCALL TIMOUT ;SET UP TIMEOUT ON CALL TO DRIVER .MCALL CANTMO ;CANCEL TIMEOUT .MCALL DRIVER ;MAKE CALL TO COMMUNICATIONS DRIVER .MCALL ERRSET ;PUT ERROR RETURN VALUE IN R0 .MCALL ACTION ;SAVE ACTION WHICH IS TO BE PERFORMED ;IN WAY UNDERSTANDABLE TO MACRO DRIVER ;IN VARIABLE CD.FNC .MCALL ACT$DF ;DEFINE SYMBOLS FOR EACH ACTION .MCALL CDI$DF ;DEFINE IO FUNCTION CODES AND STATUS ERRORS ; ; CALL DEFINITION MACROS FOR TABLE STRUCTURES AND SYMBOLS ; ------------------------------------------- ; RT$RSX CDI$DF ACT$DF MBL$DF CHT$DF ERR$DF ASSUME MB.CUR,0 ;(R1) USED WHEREVER MB.CUR(R1) SHOULD ;BE USED - WILL GIVE ASSEMBLY ERROR ;IF OFFSET MB.CUR IS CHANGED ; ; LOCAL SYMBOLS ; ------------- ; ; GLOBAL SYMBOLS ; -------------- .GLOBL CDOPEN ;ROUTINE ENTRY POINTS .GLOBL CDCLOS .GLOBL CDXMT,CDXMTW .GLOBL CDRCV,CDRCVW .GLOBL CDSIG,CDSIGW .GLOBL CDIN,CDINW .GLOBL CDOUT,CDOUTW .GLOBL $MBCHK ;CALLED BY PACKAGE OF ALTERNATE ROUTINES .GLOBL $FNDCH ;SUBROUTINE TO FIND A CHANNEL TABLE ENTRY .GLOBL $FNDMB ;SUBROUTINE TO FIND A MESSAGE BLOCK .GLOBL $FNDBL ;SUBROUTINE TO FIND A MESSAGE BLOCK ;MATCHING ON TYPE .GLOBL $ADDMB ;SUBROUTINE TO ADD A NEW MESSAGE BLOCK ; ; LOCAL VARIABLES ; --------------- ; NONE ; ; GLOBAL VARIABLES ; ---------------- ; NONE ; ; COMMON AREA FOR CDPACK TABLES ; ----------------------------- ; $CM82 ;DEFINE PSECT CDCM82 ; ; ; COMMON AREA FOR ERROR IF BAD ARGUMENTS ; -------------------------------------- .PSECT CDERR,RW,GBL,REL,D,OVR CDERR: .BLKW ; .PAGE .SBTTL MAIN ENTRY POINTS .PSECT ; ; SUBROUTINE CDOPEN(CHAN,RPTC,STAT) ; --------------------------------- ; CDOPEN:: ACTION OPEN MOV #,CD.CUR ;SET UP STATUS FOR CURRENT ACTION BR ARGCHK ; ; SUBROUTINE CDCLOS(CHAN,RPTC,STAT) ; --------------------------------- ; CDCLOS:: ACTION CLOSE ;SAVE TYPE OF ACTION TO BE DONE MOV #,CD.CUR ;SET UP STATUS FOR CURRENT ACTION BR ARGCHK ; ; SUBROUTINE CDXMT AND CDXMTW(CHAN,XPTC,XBUF,XWC,STAT) ; ----------------------------------------------------- ; CDXMT:: CLR CD.CUR ;SET STATUS BITS FOR CURRENT ACTION BR CDXMT2 CDXMTW:: MOV #S.WAIT,CD.CUR ;SET STATUS BITS FOR CURRENT ACTION CDXMT2: ACTION XMT ;SAVE CURRENT ACTION TO BE DONE BIS #S.XMT,CD.CUR BR ARGCHK ; ; SUBROUTINE CDRCV AND CDRVCW(CHAN,RPTC,RBUF,MAXWC,STAT) ; ------------------------------------------------------ ; CDRCV:: CLR CD.CUR ;SET STATUS BITS FOR CURRENT ACTION BR CDRCV2 CDRCVW:: MOV #S.WAIT,CD.CUR ;SET STATUS BITS FOR CURRENT ACTION CDRCV2: ACTION RCV ;SAVE CURRENT ACTION TO BE DONE BIS #S.RCV,CD.CUR ;SET STATUS BITS FOR CURRENT ACTION BR ARGCHK ; ; SUBROUTINE CDSIG AND CDSIGW(CHAN,XPTC,SIGNAL,STAT) ; -------------------------------------------------- ; CDSIG:: CLR CD.CUR ;SET STATUS BITS FOR CURRENT ACTION BR CDSIG2 CDSIGW:: MOV #S.WAIT,CD.CUR ;SET STATUS BITS FOR CURRENT ACTION CDSIG2: ACTION SIGNAL ;SAVE CURRENT ACTION TO BE DON BIS #S.SIG,CD.CUR ;SET STATUS BITS FOR CURRENT ACTION .PAGE ; ; FOR ALL ROUTINES THE ARGUMENTS WILL NOW BE EXTRACTED AND ; PLACED IN REGISTERS ; ; **WARNING** THE NUMBER OF ARGUMENTS IN EACH SUBROUTINE ; CALL IS USED TO DETERMINE THE TYPE OF PARAMETERS. SO BE ; CAREFUL IF YOU ADD ARGUMENTS. ; 3 ARGUMENTS - SUBROUTINE NOT PERFORMING DATA TRANSFER ; 4 ARGUMENTS - SUBROUTINE FOR SEND SIGNAL ONLY ; 5 ARGUMENTS - DATA TRANSFER CALL ; ; A MESSAGE BLOCK IS EITHER FOUND OR CREATED FOR THE CURRENT ; ACTION TO BE PERFORMED ; THE ACTION TO BE PERFORMED HAS BEEN SAVED ALREADY IN CD.FNC ; AND THE STATUS BITS ASSOCIATED WITH THIS ACTION HAVE BEEN ; SET UP IN CD.CUR ; ARGCHK: PUSH ;SAVE ALL REGISTERS - NOT ;NECESSARY IF CALLED FROM FORTRAN ;BUT ROUTINES COULD BE CALLED FROM MACRO MOVB (R5)+,R0 ;GET NUMBER OF SUBROUTINE ARGUMENTS TSTB (R5)+ ;POINT TO FIRST ARGUMENT ; ; 1ST ARGUMENT - ALWAYS CHANNEL NUMBER ; MOV @(R5)+,R1 ;R1 = CHANNEL NUMBER DEC R0 ;1ST ARGUMENT DEALT WITH BNE 2$ ;IF NO MORE ARGS - ERROR JMP XARGS ; ; 2ND ARGUMENT - ALWAYS PACKET TYPE CODE ; 2$: DEC R0 ;2ND ARGUMENT DEALT WITH BNE 5$ ;IF ONLY 2 ARGUMENTS - ERROR JMP XARGS 5$: MOV @(R5)+,R2 ;R2 = PTC CALL $MBCHK ;CALL ROUTINE TO EITHER LOCATE ;EXISTING MESSAGE BLOCK OR GET ;A NEW ONE FOR THIS OPERATION ;R3 CONTAINS TYPE OF ERROR IF R1 = 0 ;R1 = ADDRESS OF MESSAGE BLOCK (OR 0) PUSH R3 ;SAVE ERROR CONDITION (IF ANY) IN ;CASE NEEDED ; ; ; 3RD ARGUMENT - BUFFER ADDRESS, SIGNAL VALUE OR ADDRESS OF STATUS RETURN ; 21$: MOV (R5)+,R3 ;ADDRESS OF BUFFER OR STAT DEC R0 ;3RD ARGUMENT DEALT WITH BNE 30$ ;BRANCH IF MORE ARGUMENTS ; ; -- ONLY 3 ARGUMENTS FOR THIS SUBROUTINE MOV R3,R5 ;R5 = ADDRESS OF STATUS RETURN CLR R3 ;NO BUFFER TO SEND/RECEIVE CLR R4 ;NO WC FOR BUFFER TO SEND/RECEIVE BR DOIO ;CARRY ON AND PERFORM ACTION ; ; 4TH ARGUMENT - WORD COUNT OR ADDRESS OF STATUS RETURN ; 30$: MOV (R5)+,R4 ;R4 = ADDRESS OF WC OR STAT DEC R0 ;4TH ARGUMENT DEALT WITH BNE 40$ ;BRANCH IF MORE ARGUMENTS ; ; -- ONLY 4 ARGUMENTS FOR THIS SUBROUTINE MOV R4,R5 ;R5 = ADDRESS OF STAT CLR R4 ;NO WORD COUNT FOR I/O ;R3 MUST BE ADDRESS OF SIGNAL TO SEND BR DOIO ;NOW PERFORM THE ACTION ; ; 5TH ARGUMENT - STATUS RETURN ; 40$: MOV (R4),R4 ;R4=WC FOR TRANSFER OPERATION MOV (R5),R5 ;R5 = ADDRESS OF STATUS ; ; BR DOIO .PAGE .SBTTL ALTERNATE ROUTINES ; ; ENTRY POINTS FOR THE ALTERNATE ROUTINES, WHERE MOST OF THE ; PARAMETERS HAVE BEEN PREVIOUSLY SET UP AND SAVED IN VARIABLES ; OF THE HEADER AREA OF THE COMMON CDCM82. ; ; SUBROUTINE CDOUT AND CDOUTW(XWC,STAT) ; ------------------------------------- ; ; CDOUT:: CLR CD.CUR ;CURRENT ACTION CMPB (R5),#2 ;CORRECT NO. OF ARGUMENTS? BEQ CDOUT2 JMP XARGS CDOUTW::MOV #S.WAIT,CD.CUR ;SET WAIT MODE CDOUT2: BIS #S.XMT,CD.CUR PUSH ACTION XMT MOVB CD.XPT,R2 ;TRANSMIT PTC MOV CD.XBF,R3 ;TRANSMIT BUFFER ADDRESS TST (R5)+ MOV @(R5),R4 ;BUFFER WORD COUNT TO TRANSMIT BR INOUT ;GO TO COMMON CODE WITH CDIN ; ; SUBROUTINE CDIN AND CDINW(STAT) ; ------------------------------- ; CDIN:: CLR CD.CUR ;SET UP CURRENT STATUS CMPB (R5),#1 ;CHECK ONLY 1 ARGUMENT BEQ CDIN2 ;BRANCH IF NOT 1 ARGUMENT JMP XARGS CDINW:: MOV #S.WAIT,CD.CUR ;SET WAIT MODE CDIN2: BIS #S.RCV,CD.CUR PUSH ACTION RCV MOVB CD.RPT,R2 ;SET RECEIVE PTC MOV CD.RBF,R3 ;SET RECEIVE BUFFER ADDRESS MOV CD.RWC,R4 ;SET RECIEVE BUFFER WC INOUT: MOV CD.LUN,R1 ;SET CHANNEL NUMBER MOV 2(R5),R5 ;ADDRESS OF STATUS RETURN CALL $MBCHK PUSH R3 ;SAVE ERROR CONDITION (IF ANY) ; .PAGE .SBTTL CALL TO COMMUNICATIONS DRIVER ; --------------------------------------------------------------------- ; ; AT THIS POINT THE REGISTERS ARE SET UP AS FOLLOWS: ; ; R1 = ADDRESS OF MESSAGE BLOCK FOR THIS ACTION (OR 0 IF ERROR) ; R2 = PACKET TYPE CODE ; R3 = BUFFER ADDRESS IF DATA IS TO BE TRANSMITTED OR RECEIVED ; 0 IF NO DATA TRANSFER IS INVOLVED IN THIS ACTION ; R4 = WORD COUNT IF DATA TRANSFER, OTHER THAN SIGNAL IS TO BE DONE ; 0 OTHERWISE ; R5 = ADDRESS OF STATUS RETURN BLOCK ; ; THE ERROR CONDITION RETURNED BY $MBCHK IN R3 IS ON THE STACK ; WE ARE NOW READY TO MAKE A CALL TO THE COMMUNICATIONS DRIVER TO ; PERFORM THE REQUIRED ACTION ; ; -------------------------------------------------------------------- DOIO: TST R1 ;MESSAGE BLOCK FOUND? BNE 20$ ;CARRY ON IF MESSAGE BLOCK JMP XERR ;ELSE REPORT ERROR AND QUIT ;- THE ERROR CODE IN ON STACK 20$: POP ;CLEAN ERROR CONDITION FROM STACK BIT #S.WAIT,CD.CUR ;WAIT FOR OPERATION TO COMPLETE ;BEFORE RETURNING FROM SUBROUTINES? BEQ CALLCD ;BRANCH IF NO-WAIT I/O ; ; SET UP A TIMEOUT ON WAITING FOR THE DRIVER REQUEST TO COMPLETE ; TIMOUT ;SET TIMEOUT IF NEEDED ; ; CALL THE DRIVER TO DO THE ACTION ; CALLCD: MOV CD.CUR,(R1) ;SET STATUS BITS IN MESSAGE BLOCK DRIVER ;PERFORM THE ACTION ;ONLY R1 NEED BE PRESERVED BCC 110$ ;BRANCH IF OK ERRSET ;SET MB.ST1 TO THE ERROR ENCOUNTERED CLR MB.ST2(R1) ;INDICATE ERROR BIT #S.OPEN,(R1) ;WAS ERRORED ACTION AN OPEN? BEQ WTIO ;BRANCH IF NOT BIC #S.OPEN,(R1) ;ELSE CLEAR OPEN BIT TO ALLOW ;MSG BLOCK TO BE RELEASED BR WTIO ;TREAT AS IF WAIT I/O ; ; THE CALL TO DRIVER HAS BEEN DONE AND EITHER COMPLETED OR NOT ; 110$: BIT #S.WAIT,(R1) ;DID WE WAIT FOR I/O COMPLETION? BEQ NWIO ;BRANCH IF NO-WAIT I/O BIT #S.OPEN,(R1) ;IS IT 'CDOPEN' REQUEST? BNE NWIO ;IF NE - IT IS, IN THIS CASE BRANCH ; I.E. TREAT AS IF NO-WAIT I/O ; TO GET MESSAGE BLOCK NUMBER ; ; DRIVER ACTION EITHER COMPLETED OR TIMED OUT ; WTIO: CANTMO ;CANCEL TIMEOUT MOV R1,R3 ;SAVE MSG BLOCK ADDRESS MOVB MB.ST1(R1),R0 ;SET STATUS IN R0 MOV MB.ST2(R1),R1 ;2ND WORD OF STATUS ; .IF NDF RT11 ; CMP #IE.DAO,R0 ;BUFFER TRUNCATED? BEQ 119$ CMP #ER.SUC,R0 BNE 120$ 119$: ASR R1 ;CONVERT BYTE COUNT TO WORDS 120$: .ENDC ; BIT #S.CLOS,(R3) ;CLOSE CONNECTION DONE? BEQ 140$ BIS #S.OPEN,(R3) ;STILL OPEN CONNECTION MB CMP #ER.SUC,R0 ;SUCCESSFULLY? BNE 140$ BIC #S.OPEN,(R3) ;IF SO RELEASE MESSAGE BLOCK 140$: BIC #^C,(R3) ;STATUS WILL BE REPORTED ON ;ON RETURN FROM SUBROUTINE ;RELEASE MESSAGE BLOCK BR RET ; ; NO-WAIT I/O IS IN PROGRESS - RETURN THE MESSAGE BLOCK NUMBER ; IN THE 2ND WORD OF THE STATUS BLOCK ; NWIO: BIC #S.WAIT,(R1) ;'CDOPEN' IS COMPLETED BY NOW. ; RESET THE WAIT FLAG. MOV #ER.SUC,R0 ;REPORT THAT THE I/O REQUEST ;HAS BEEN SUCCESSFULLY ISSUED ;IT MAY HAVE ALREADY COMPLETED ;BY NOW BUT THIS WILL NOT BE ;FOUND UNTIL LATER ON CALL TO ;CDSTAT. ALSO MAY HAVE BEEN ;REJECTED WITH ERROR BY DRIVER ;BUT THIS TOO WILL BE REPORTED ;ON NEXT CALL TO CDSTAT MOV MB.MBN(R1),R1 ;2ND STATUS WORD = MB NUMBER BR RET ; ; ERROR CONDITIONS ; ---------------- ; ; ; INSUFFICIENT NUMBER OF ARGUMENTS ; XARGS: MOV #ER.ARG,CDERR BR RET2 ;CANNOT SET PROPER STATUS - BAD ARGS ; ; OTHER ERRORS RETURNED FROM $MBCHK - ERROR CONDITION FROM R3 ; IS ON STACK ; XERR: POP R3 ;RESTORE R3 TO ERROR CONDITION DEC R3 ;R3 = 1 IF NO SPACE FOR NEW MB ;R3 = 2 IF MB EXISTS AND SHOULDNT ;R3 = 3 IF MB DOESNT EXIST AND SHOULD ;R3 = 4 IF NO CHANNEL TABLE ENTRY FOR MB BEQ XSPACE ;REPORT NOT ENOUGH SPACE FOR OPERATIONS ;MESSAGE BLOCK - SO NOT DONE DEC R3 BEQ XDUP ;REPORT DUPLICATE MESSAGE BLOCK DEC R3 BEQ XNOMB ;REPORT NO EXISTING MB FOUND DEC R3 BEQ XNOCHN ;REPORT NO CHANNEL TABLE ENTRY BR XBGCHK ;INTERNAL PACKAGE ERROR ; ; INSUFFICIENT SPACE TO ADD MESSAGE BLOCK ; XSPACE: MOV #ER.SPC,R0 BR RET ; ; OPEN CONNECTION ALREADY EXISTS ; XDUP: MOV #ER.DUP,R0 BR RET ; ; NO OPEN CONNECTION EXISTS ; XNOMB: MOV #ER.OPE,R0 BR RET ; ; NO CHANNEL TABLE ENTRY FOR THIS CHANNEL ; XNOCHN: MOV #ER.CHN,R0 BR RET ; ; ; INTERNAL PACKAGE ERROR - BUGCHECK ; XBGCHK: MOV #ER.BUG,R0 ; ; RETURN TO CALLER ; RET: MOV R0,(R5) ;SET CALLERS RETURN STATUS MOV R1,2(R5) ;SET 2ND WORD OF RETURN STATUS RET2: POP RETURN .PAGE .SBTTL $MBCHK - ROUTINE TO LOCATE/CHECK/ADD MESSAGE BLOCK ; ; THIS ROUTINE ENSURES THAT THERE IS A MESSAGE BLOCK FOR THE ; CURRENT ACTION TO BE PERFORMED ; IT PERFORMS CHECKS BASED ON THE CURRENT ACTION TO BE PERFORMED ; TO SEE IF: ; A MESSAGE BLOCK ALREADY EXISTS FOR THE SAME CHANNEL AND PTC ; AND SHOULD NOT EXIST ; A MESSAGE BLOCK FOR THIS CHANNEL AND PTC DOES NOT EXIST AND ; AND SHOULD ; A MESSAGE BLOCK CANNOT BE ADDED - NOT ENOUGH SPACE ; ; INPUTS: ; R1 = CHANNEL NUMBER ; R2 = PACKET TYPE CODE ; CD.FNC CONTAINS ACTION TO BE PEFORMED AND CD.CUR CONTAINS ; STATUS ASSOCIATED WITH THIS ACTION ; ; ; OUTPUTS: ; R0 = ADDRESS OF OPEN CONNECTION MESSAGE BLOCK IF ACTION=RCV ; R1 = ADDRESS OF THE MESSAGE BLOCK FOR CURRENT ACTION ; R1 = 0 IF ERROR OR NO MESSAGE BLOCK CAN BE ADDED ; R3 = ERROR INDICATION IF R1 = 0 ; 1 = NO SPACE ; 2 = MB ALREADY EXISTS AND SHOULD NOT ; 3 = NO OPEN CONNECTION EXISTING ; 4 = NO CHANNEL TABLE ENTRY FOR THIS CHANNEL ; ; LOCAL MACRO: ; ----------- .MACRO ERRXIT,ERROR ; RETURN FROM ROUTINE WITH MESSAGE BLOCK ADDRESS = 0 AND ERROR STATUS IN R3 CLR R1 ;NO MESSAGE BLOCK ADDRESS MOV #ERROR,R3 BR 900$ .ENDM ; $MBCHK:: PUSH ;SAVE REGISTER CALL $FNDCH ;FIND CHANNEL TABLE ENTRY TST R5 ;ENTRY EXISTS? BNE 5$ ;BRANCH IF EXISTS ERRXIT 4 ;ELSE RETURN ERROR 5$: CLR R3 ;USE R3 FOR MASK TO MATCH TYPE OF ;MESSAGE BLOCK BIT #S.OPEN,CD.CUR ;ACTION = OPEN CONNECTION? BNE 50$ ;BRANCH IF YES BIT #S.CLOS,CD.CUR ;ACTION = CLOSE CONNECTION? BNE 50$ ;BRANCH IF YES BIT #S.RCV,CD.CUR ;ACTION = RECEIVE? BEQ 510$ ;BRANCH IF NOT RCV/OPEN/CLOSE - JUST ;ADD MESSAGE BLOCK FOR XMT/SIG 50$: MOV #S.OPEN,R3 ;ELSE SEARCH FOR OPEN MESSAGE BLOCK 100$: PUSH R1 ;SAVE CHANNEL NO. ON STACK CALL $FNDBL ;FIND MATCHING BLOCK MOV R1,CD.OPE ;MATCHING MESSAGE BLOCK FOUND? BEQ 200$ ;BRANCH IF NOT,ELSE ADDRESS OF ;OPEN CONNECTION MB IN R0 ; ; OPEN CONNECTION MESSAGE BLOCK EXISTS FOR THIS CHANNEL AND PTC ; - CHECK IF IT OUGHT NOT TO ; POP R1 ;RESTORE CHANNEL NUMBER IN R1 BIT #S.OPEN,CD.CUR ;ACTION = OPEN? BEQ 120$ ;IF NOT OPEN ERRXIT 2 ;EXIT WITH ERROR 120$: BIT #S.CLOS,CD.CUR ;ACTION = CLOSE? BEQ 510$ ;IF NOT CLOSE ADD MSG BLOCK MOV CD.OPE,R1 ;ELSE IF CLOSE FOUND MSG BLOCK BR 900$ ; ; OPEN CONNECTION MESSAGE BLOCK DOES NOT EXIST FOR THIS CHANNEL AND PTC ; - CHECK IF IT OUGHT TO (ALL BUT OPEN MUST HAVE OPEN MB) ; 200$: POP R1 BIT #S.OPEN,CD.CUR ;ACTION = OPEN? BNE 510$ ;IF OPEN - OK SHOULD NOT EXIST - ADD IT ERRXIT 3 ;ELSE EXIT WITH ERROR ; ; TRANSMIT BUFFER OR SIGNAL ACTION ; - MUST FIND OR ADD MESSAGE BLOCK FOR THIS ; MOV (SP),R1 ;RESET R1 TO CHANNEL 510$: CALL $ADDMB ;ADD MESSAGE BLOCK ENTRY TST R1 ;ADDED SUCCESSFULLY? BNE 900$ ;BRANCH IF YES ERRXIT 1 ;ELSE RETURN ERROR ; 900$: POP R5 ;RESTORE R5 RETURN .END