/DECNET/8 V1A NETWORK SERVICES PROTOCOL / / / / / / / / / /COPYRIGHT (C) 1974,1975,1976,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /NETWORK SERVICES PROTOCOL FOR DECNET/8 / IMPLEMENTED AT SPEC LEVEL 2.2 / /J. ROTH 23-NOV-75 /JR 17-DEC-76 ADDED VERSION 2.2 CHANGES / / WARNING: / / THERE EXISTS A BUG IN THE NETWORK DESIGN, SUCH THAT DROPPAGE / OF LEADING 0 BITS IN THE FIRST FRAME OF THE NSP DATA MESSAGE / IS NOT DETECTED BY CRC. TO CIRCUMVENT THIS BUG, THIS NSP CODE / ALWAYS SETS THE NSP 'BLOCKING' BIT WHEN SENDING, AND IGNORES IT / WHEN RECEIVING. / / / DECNET/8 RELEASE VERSION 1 / DECNET/8 PATCH LEVEL A / APRIL 8,1977 / VERSION=01 PATCH="B /JR01 16-MAY-77 FIX CONNECT REJECT BY DISCONNECT BUG / /TASK DEFINES TASK= NSP CUR= NSPFLD INIWT= 0 FIELD CUR%10 /CCB STATE BIT DEFINES CHNCON= 2000 /SET IF CCB CONNECTED CHNCIS= 1000 /SET IF CI WAS SENT CHNCIR= 400 /SET IF CI WAS RECEIVED CHNCCS= 200 /SET IF CC WAS SENT CHNDIS= 100 /SET IF DISCONNECT IN PROGRESS CHNNLL= 40 /SET IF NORMAL LOGICAL LINK CHNOFL= 4 /SET IF CCB IN OFF LINE MODE /MSGFLG DEFINES RTHBIT= 1 /SET IF ROUTING HEADER PRESENT SMTYP= 4 /SINGLE MESSAGE LSTYP= 10 /LINK STATUS CMTYP= 14 /SET IF THIS IS A CONTROL MESSAGE INTBIT= 20 /SET IF THIS IS AN INTERRUPT MESSAGE EOMBIT= 100 /SET IF THIS IS AN END OF MESSAGE SEGMENT /AUTO INDEX REGISTER RESERVED FOR NSP NSPBXR= 15 /BUFFER INDEX REGISTER FOR "PUTCH" NSPSXR= 16 /GENERAL XR NSPTXR= 17 /GENERAL XR /DDCMP FUNCTION CODES SNDFUN= 0 /SEND MESSAGE ON LINE STRFUN= 1 /START SEQUENCE HLTFUN= 2 /HALT LINE AND RETURN MESSAGES OFLFUN= 3 /SEND MESSAGE OFF LINE /DERAIL REASON CODES INTRSN= 0 /INTERRUPT SEMAPHORE FROM PARTNER CONRSN= 1 /CONNECT INIT RECEIVED DISRSN= 2 /DISCONNECT FROM PARTNER DABRSN= 3 /DISCONNECT ABORT ERRRSN= 10 /NSP ERROR CAUSED LINK TO BREAK LDNRSN= 11 /PHYSICAL LINK CAUSED LINK TO BREAK /STATUS WORD DEFINES (LOW 6 BITS) SUCST= 0 /SUCCESS DISST= 1 /DISCONNECT PREEMPTED DABST= 2 /ABORT PREEMPTED DRJST= 3 /DISCONNECT REJECT BY NSP CRJST= 4 /CONNECT REJECT BY TARGET TASK ILLST= 5 /ILLOGICAL REQUEST (IGNORED) LSTST= 6 /DATA LOST WARNING NODST= 7 /NODE NAME NOT FOUND ERRST= 10 /NSP ERROR PREEMPTED LDNST= 11 /LINE DROPPED PREEMPTING THIS REQ /NSP MESSAGE TYPE AND SUBTYP CODES CONTYP= 20 /CONNECT TYPE DISTYP= 40 /DISCONNECT TYPE CISUBT= 0 /CONNECT INITIATE CCSUBT= 1 /CONNECT CONFIRM CRSUBT= 2 /CONNECT REJECT DISUBT= 0 /DISCONNECT INITIATE DCSUBT= 1 /DISCONNECT CONFIRM DRSUBT= 2 /DISCONNECT REJECT /MISC DEFINETIONS PUTFLG= 2000 /SET IF MOVCCB SHOULD STORE IN USER AREA PKSIZE= 14 /CURRENT SIZE OF NODE POOL PACKETS *65 TSKCDF, 0 /SET DF TO TASKS FIELD 0 /GETS CDF TO TASK SPACE JMP I TSKCDF /RETURN /CONNECT CONTROL BLOCK AREA /COPIED IN FROM USER AREA (WHEN NEEDED) *70 CCBSTA, 0 /STATE WORD CCBDOT, 0 /DEST OBJECT TYPE CCBDN1, 0 /DEST NAME CCBDN2, 0 /(SIXBIT) CCBDN3, 0 CCBDN4, 0 CCBDN5, 0 CCBDN6, 0 CCBDG, 0 /DEST GROUP CCBDU, 0 /DEST USER CCBSOT, 0 /SOURCE OBJECT TYPE CCBSN1, 0 /SOURCE NAME CCBSN2, 0 CCBSN3, 0 CCBSN4, 0 CCBSN5, 0 CCBSN6, 0 CCBSG, 0 /SOURCE GROUP CCBSU, 0 /SOURCE USER [P,PN]... CCBTSK, 0 /TASK BOUND TO THIS CCB CCBDNO, 0 /DEST NODE (RESERVED) CCBLIN, 0 /PHYSICAL LINK NUMBER (DDCMP LINE) CCBND1, 0 /NODE NAME CCBND2, 0 CCBND3, 0 CCBDST, 0 /DSTADR THIS CONNECTION CCBDS2, 0 CCBSRC, 0 /SRCADR THIS CONNECTION CCBSR2, 0 CCBPH, 0 /HEAD OF TRANS REQS WAITING FOR POST CCBTH, 0 /HEAD OF TRANS REQS WAITING FOR TRANS CCBTT, 0 /TAIL OF TRANS/POST QUEUE (NEWEST REQST) CCBRH, 0 /HEAD RECV Q CCBRT, 0 /TAIL RECV Q CCBTRQ, 0 /TRANSMIT REQCNT (FROM USER RECEIVES) CCBTSG, 0 /TRANSMIT SEG COUNT CCBRRQ, 0 /RECEIVED REQCNT (FROM LINE) CCBRSG, 0 /RECEIVED SEG CNT CCBCON, 0 /POINTS TO CONNECT PACKET CCBDIS, 0 /POINTS TO DISCONNECT PACKET CCBINT, 0 /POINTS TO INTERRUPT PACKET (ONLY 1 ALLOWED) CCBIH, 0 /INTERRUPT Q HEAD CCBIT, 0 /INTERRUPT Q TAIL CCBIC, 0 /INTERRUPT QUEUE SIZE CCBSMT, 0 /HEAD OF SINGLE MESSAGE TRANSMIT QUEUE CCBSMR, 0 /HEAD OF SINGLE MESSAGE RECEIVE QUEUE CCBRSN, 0 /GETS REASON CODE FOR INTERRUPT CCBDRL, 0 /DERAIL ADDR (PSEUDO AST) CCBOPL, 0 /BYTE COUNT IN OPTDATA AREA CCBAC, 0 /TASK MAIN-LINE AC CCBPC, 0 /TASK MAIN-LINE PC CCBXDF, 0 /TASK MAIN-LINE CDF /IF ZERO, INDICATES AT TASK LEVEL CCBGLK, 0 /MAINLINE LINK-SETTING INSTR NOPUNCH /DUMMY SECTION TO DEFINE NON-REENTRANT AST EXIT CODE DCA CCBXDF /CLEAR AST LEVEL FLAG TAD CCBAC /GET THE AC NOW ION /RE ENABLE INTERRUPTS JMP I CCBPC /AFTER EXITING CCBRTN, IOF /LOCK INTERRUPTS TAD CCBIH /SEE IF AST LIST EMPTY SNA CLA JMP CCBXDF /IF EMPTY, RETURN TO MAINLINE TAD CCBCHN /ELSE SET AC TO CHANNEL NUMBER CIF CDF NSPFLD /ENTER AST DEQ ROUTINE JMP I CCBDXT CCBDXT, DRLXIT CCBTSW, TSWFLG CCBCHN, 0 /USER CHANNL NUMBER CCBAST, ISZ I CCBTSW /SEE IF SHOULD RESCHEDULE JMP .+3 /JMP IF NO CAL RESCHD /OTHERWISE RESCHEDULE CDF CUR /RESET DF JMP I CCBDRL /NOW ENTER USER AST ROUTINE CCBOPT, 0 /FIRST WORD OF OPTIONAL DATA ENPUNCH /END OF DUMMY SECTION *CCBGLK+1 /RESET THE LOCATION COUNTER /THE NEXT 8. WORDS IN THE CCBTAB HAVE LAST OPTDATA GOT CCBSIZ= CCBOPT+10-CCBSTA /TALLY ALL WORDS IN ACTUAL CCB /COMMON PACKET VARIABLES MSGEF, 0 /POINTS TO EF MSGSTA, 0 /POINTS TO STATUS MSGPKT, 0 /POINTS TO PACKET START MSGFLG, 0 /CURRENT MSGFLGS MSGCCB, 0 /CURRENT CCB (0 MEANS NO CCB INVOLVED) /MISC VARIABLES STATUS, 0 /STAT TO POST OR DERAIL WITH CHAR, 0 /LAST CHAR GOT FROM INPUT BUFFER SRCADR, 0 /ADDRESSES FROM CURRENT RECEIVED MESSAGE SRCAD2, 0 DSTADR, 0 DSTAD2, 0 SIZE, 0 /ACCUMULATES SIZE OF NSP MESSAGES CURBUF, 0 /POINTS TO CURRENT BUFFER PACKET-1 REQCNT, 0 /RECEIVED REQUEST COUNT (IN LS) CCBPTR, 0 /TEMP POINTER FOR SEARCHING CCBTAB *60 CCBBSY, 0 /POINTER TO DDCMP BUSY COUNT DRLPAK, 0 /POINTER TO DERAIL PACKET PKTLNK, 0 /POINTER TO NEXT PACKET (SCANNING Q) GETCHC, 0 /COUNTER FOR CHARACTER INPUT ROUTINE LNKPT, 0 /LINK TABLE COMMON POINTER PAGE /NSP EXECUTIVE PROPER *NETTAB /INSERT OUR VERSION NUMBER IN NETTAB HERE VERSION PATCH *NSPLOC /SET THE LOCATION COUNTER NOW /MAIN NSP IDLE LOOP SLEEP, NSPWT, JMS I (FLUSH /CLEAR ANY REMAINING BUFFERS DMPLP, TAD DRLPAK /POINT AT PACKET LINK WORD TAD (13 DCA NXTPAK CDF DDCFLD TAD I NXTPAK CDF CUR DCA NXTPAK /SAVE LINK TO NEXT TAD DRLPAK SNA /SKP IF ANOTHER PACKET JMP DMPDN /JMP IF DONE JMS I (PUTNOD /ELSE RETURN PAKCET TAD NXTPAK /UPDATE LINK PTR DCA DRLPAK JMP DMPLP /LOOP FOR MORE DMPDN, STL RAR JMS I (MOVCCB /PUT CCB BACK (IF ANY) START, NSPLP, CAL RECEIVE MSGPTR, 0 /GETS POINTER TO BODY OF MESSAGE DCA TSKCDF+1 /RETURNED AC=CALLING CDF TAD MSGPTR DCA MSGSTA /POINT TO STATUS/LINE WORD TAD (37 /STORE LINE NUMBER CDF DDCFLD /ENTER PACKET FIELD AND I MSGSTA CDF CUR DCA MSGLIN /USED IN CI CODE AC7775 TAD MSGSTA /OFFSET TO EF DCA MSGEF AC7776 TAD MSGEF /OFFSET TO PACKET START DCA MSGPKT DCA I (GETCHF /ASSUME NO DATA DCA DRLPAK /ASSUME NO DERAIL PACKET JMS MSGGET DCA MSGFN /GET FUNCTION WORD TAD MSGFN AND (37 /FILTER OUT FUNCTION CODE TAD (JMP I MSGDSP DCA MSGJMP /GENERATE FUNCTION DISPATCH TAD MSGPKT /OFFSET TO SENDDC EXIT IAC DCA MSGCCB /STORE IN TEMP CDF DDCFLD /MSGCCB MAY POINT INTO PACKET FIELD HERE TAD MSGFN AND (37 SNA /SNA IF NOT TRANSMIT TAD I MSGCCB /ELSE SEE IF ALSO NOP EXIT SZA CLA JMP MSGGO /GO IF NOT TRANSMIT COMPLETE AND CONTEXT FREE EXIT TAD (SLEEP /ELSE FIX EXIT UP DCA I MSGCCB ISZ MSGPTR /SKIP CCB NUMBER DCA MSGCCB /FLAG NO CCB HERE CDF CUR /RETURN TO NSP FIELD JMP MSGJMP /JMP TO DISPATCH JMP MSGGO, JMS MSGGET /(THIS CALL RESETS DF TO CUR) DCA MSGCCB /PICK UP CCB NUMBER TAD MSGCCB CLL TAD (-MAXCCB-1 SZL CLA /OUT OF RANGE [0,MAXCCB] JMP ERROR5 /YES, ERROR EXIT TAD MSGCCB /HAND-HOLDING CODE TO CHECK FOR ZERO CHANNL SNA CLA TAD MSGFN /IF USER FUNCTION REQUEST... AND (30 SZA CLA /SZA IF PASSES TEST JMP ERROR5 /ELSE REJECT IT JMS I (MOVCCB /GET CCB (IF ANY) MSGJMP, 0 /DISPATCH TO FUNCTION MSGFN, 0 MSGLIN, 0 /GETS CURRENT LINE NUMBER (IF ANY) NXTPAK, 0 /NSP DISPATCH TABLE MSGDSP, SNDCMP /DDCMP TRANSMIT COMPLETE STRCMP /DDCMP START COMPLETE HLTCMP /DDCMP HALT COMPLETE OFLCMP /DDCMP OFFLINE TRANSMIT COMPLETE RCVMSG /DDCMP RECEIVED MESSAGE RCVSTR /DDCMP RECEIVED START RCVERR /DDCMP THRESHOLD EXCEEDED RCVOFL /DDCMP RECEIVED OFFLINE MESSAGE CNICMD /CONNECT INIT COMMAND CNCCMD /CONNECT CONFIRM COMMAND CNRCMD /CONNECT REJECT COMMAND DISCMD /DISCONNECT COMMAND TRNCMD /SOLICITED TRANSMIT COMMAND TRICMD /INTERRUPT TRANSMIT COMMAND RCVCMD /RECEIVE AND SEND LS RSMCMD /RECEIVE SINGLE MESSAGE TSMCMD /TRANSMIT SINGLE MESSAGE MAXFN= .-MSGDSP-1 /MAXIMUM NSP FUNCTION CODE /PRE INCREMENT AND PICK UP NEXT MESSAGE WORD /ENTRY DF MAY BE RANDOM /EXIT DF ALWAYS CUR MSGGET, 0 JMS TSKCDF ISZ MSGPTR TAD I MSGPTR CDF CUR JMP I MSGGET /SIMPLE ENOUGH? /USER REQUEST ERROR EXITS /(IMAGINATIVE NAMES) NODNFD, IAC /NODE NOT FOUND ERROR6, IAC /DATA LOST WARNING ERROR5, IAC /ILLOGICAL REQUEST ERROR4, IAC /DISC REJECT ERROR3, IAC /CONN REJECT ERROR2, IAC /LINE DROPPED ERROR1, IAC /DISCONNECT PREEMPT POSTXT, JMS I (POSTMS JMP NSPLP /RETURN TO MESSAGE WAIT AT ONCE PAGE /HANDLE RECEIVED MESSSAGE RCVMSG, JMS I (MSGGET /PICK UP CDF DCA I (GETCHF JMS I (MSGGET /PICK UP ADDR-1 DCA I (GETCHP JMS I (MSGGET /PICK UP DDCMP COUNT DCA GETCHC DCA SRCNOD /ASSUME NO SOURCE NODE NUMBER GETFLG, JMS I (GETCH /GET FLAG FIELD / CLL RTR / SPA /SKP IF NOT COUNT FIELD / HLT /***TEMPORARY*** /*** INCOMPATIBILITY *** /IN DECNET-8 WE SET THE LOW ORDER BIT IN ALL MESSAGES /TO GUARD AGAINST SYNCHRONOUS INTERFACES DROPPING /LEADING ZERO BITS. CRC16 WILL NOT DETECT LEADING ZERO BITS /BEING DROPPED. NOTE THAT THE LOW ORDER BIT OF A BYTE IS /CLOCKED OUT FIRST. CLL RAR CLL RAR /END OF KLUDGE SNL /SKP IF ROUTING FLAGS JMP GOTMSF /ELSE GOT MESSAGE FLAGS DCA RTFLGS /STORE ROUT FLAGS JMS I (GETNUM /GET EXTENSIBLE 12 BIT DSTNODE DCA DSTNOD /JUST STORE IT FOR NOW JMS I (GETNUM /GET EXTENSIBLE 12 BIT SRCNODE DCA SRCNOD /JUST STORE IT FOR NOW JMP GETFLG /LOOP FOR NEXT FLAGS FIELD GOTMSF, DCA MSGFLG /STORE SHIFTED MSGFLGS FIELD TAD MSGFLG AND (3 TAD (JMP I TYPDSP DCA TYPJMP TYPJMP, 0 /DISPATCH TO HANDLE MESSAGE TYPE TYPDSP, GOTDM /DATA MESSAGE GOTSM /SINGLE MESSAGE GOTLS /LINK STATUS GOTCM /CONTROL MESSAGE /HANDLE RECEIVED DATA MESSAGES GOTDM, JMS I (GETSD /PICK UP DSTADDR,SRCADDR FIELDS JMS I (CHKDST /CHECK DSTADR FOR A MATCH, GET CCB IF OK JMP I (SLEEP /IGNORE IF NO LINK TAD CCBSTA AND (CHNCON /SEE IF CONNECTED SNA CLA JMP I (BADFMT /BAD FORMAT IF NOT TAD CCBDIS /SEE IF DISCONNECT IN PROGRESS SZA CLA JMP I (SLEEP /IGNORE IF SO JMP I (DMCONT /ELSE CONTINUE PROCESSING RTFLGS, 0 DSTNOD, 0 SRCNOD, 0 /HANDLE RECEIVED CONTROL MESSAGES GOTCM, TAD MSGFLG /GET SHIFTED MSGFLG CLL RTR AND (7 /ISOLATE CONTROL MESSAGE SUBTYPE TAD (JMP I CMDISP DCA CMJMP /STORE INLINE CMJMP, 0 /DISPATCH TO HANDLE CONTROL MESSAGE CMDISP, BADFMT GOTCON /CONNECT MESSAGE GOTDIS /DISCONNECT MESSAGE GOTSTR /STARTUP MESSAGE BADFMT BADFMT BADFMT BADFMT GOTSTR, /***TEMPORARY*** BADFMT, CLA /+++TEMPORARY+++ CAL SUSPND JMP . /---TEMPORARY--- DSTOBJ, 0 /BUFFER FOR CONNECT DSTNAME,SRCNAME DSTNM1, ZBLOCK 6 /MUST BE IN THIS ORDER DSTGRP, 0 DSTUSR, 0 SRCOBJ, 0 SRCNM1, ZBLOCK 6 SRCGRP, 0 SRCUSR, 0 LNKCHR, 0 SEGSIZ, 0 /HANDLE RECEIVED CONNECT MESSAGES GOTCON, JMS I (GETCH AND (3 /ISLOATE CONTYP BITS TAD (JMP I CONDSP DCA CONJMP /SETUP DISPATCH JMS I (GETSD /PICK UP DSTADR,SRCADR JMS I (GETCH /PICK UP LINK CHARACTERISTICS DCA LNKCHR /STORE IN BUFFER JMS I (G12BTS /GET 2 BYTE SEGSIZ DCA SEGSIZ JMS I (GETCH /NOW THROW AWAY USELESS LNKACCT STUFF CMA DCA DSTOBJ /USE BUFFER AS COUNTER SKP TOSACT, JMS I (GETCH /GET A CHAR CLA /CAN IT ISZ DSTOBJ /LOOP IF MORE JMP TOSACT CONJMP, 0 /JMP ON SUBTYPE CONDSP, GOTCI /CONNECT INITIATE GOTCC /CONNECT CONFIRM BADFMT BADFMT PAGE /OK TO RECEIVE DATA NOW DMCONT, TAD MSGFLG /CHECK IF INTERRUPT MESSAGE AND (INTBIT%4 SZA CLA JMP I (GOTINM /GOT INTERRUPT MESSAGE GOTSLM, TAD CCBRH /GOT SOLICITED MESSAGE SNA CLA JMP I (BADFMT /ERROR IF UNEXPECTED JMS TSKCDF TAD CCBRH /UNLINK A REQUEST DCA RCVEF TAD RCVEF IAC DCA NSPSXR TAD I NSPSXR DCA CCBRH AC0002 /SET DM OFFSET TO SKIP FN,CHANNL JMP DMCPYD /ENTER HERE TO COMPLETE SM RECEIVE SMCPYD, TAD CCBSMR /CLEAR SM RECEIVE FROM CCB DCA RCVEF DCA CCBSMR AC0002 /SET POINTER TO STATUS TAD RCVEF DCA NSPSXR TAD (4 /SET OFFSET TO DESCRIPTOR DMCPYD, DCA RCVCDF JMS TSKCDF /GET INTO TASK SPACE DCA I NSPSXR /TENTATIVELY CLEAR STATUS TAD NSPSXR DCA RCVSTA /POINT AT STATUS / ISZ NSPSXR /SKIP FUNCTION / ISZ NSPSXR /SKIP CHANNEL TAD RCVCDF /BUMP PAST NODNAM,DSTNAM IF SM TAD NSPSXR DCA NSPSXR TAD I NSPSXR /NOW PICK UP DESCRIPTOR DCA MOVCDF /CDF TAD I NSPSXR DCA MOVPTR /ADDR TAD I NSPSXR DCA MOVCNT /-CNT TAD NSPSXR DCA RCVSIZ /POINT AT FINAL SIZE CDFCUR, CDF CUR JMS MOVCHRS /MOVE THEM IN JMS TSKCDF DCA I RCVSIZ TAD GETCHC /CHECK IF ANY DATA LEFT SZA CLA /SZA IF NO TAD (LSTST /ELSE STORE WARNING STATUS DCA I RCVSTA TAD TSKCDF+1 DCA RCVCDF TAD RCVEF /CHECK VALIDITY OR EVENT FLAG JMS EFCHK /TO AID IN DEBUGGING TAD RCVEF /NOW POST THE REQUEST CAL POST RCVCDF, 0 JMP I (SLEEP /DONE RCVEF, 0 RCVSTA, 0 RCVSIZ, 0 /BE SURE EVENT FLAG CONTAINS USERS TASK NUMBER IN LOW BITS /ENTRY AC = ADDR OF EF EFCHK, 0 DCA EFPTR JMS TSKCDF /GET INTO USER SPACE TAD I EFPTR /LOOK AT FLAG CDF CUR /RESET DF CIA TAD CCBTSK /COMPARE TO TASK NUMBER CLL RAL SZA CLA HLT /HALT IF NO MATCH JMP I EFCHK /ELSE RETURN EFPTR, 0 /ROUTINE TO MOVE CHARACTERS INTO THE USERS BUFFER /EXIT AC = -NUMBER CHARS MOVED MOVCHR, 0 TAD MOVCNT /COPY COUNT DCA MOVSIZ MOVLUP, TAD GETCHC /ANY LEFT? SNA CLA JMP MOVCHX /NO, DONE JMS I (GETCH /OK, GET ONE MOVCDF, 0 DCA I MOVPTR /STORE IT ISZ MOVPTR / NOP CDF CUR ISZ MOVCNT /BUMP THE COUNT JMP MOVLUP /LOOP IF MORE ALLOWED MOVCHX, TAD MOVCNT CIA TAD MOVSIZ /CALC SIZE MOVED JMP I MOVCHR /EXIT WITH IT MOVPTR, 0 MOVCNT, 0 MOVSIZ, 0 PAGE /HANDLE INTERRUPT MESSAGES GOTINM, TAD GETCHC /GET +NUMBER OF CHARS INTO AC CIA JMS GETOPT /GET "OPTIONAL DATA" INTO A PACKET JMS I (DRLTSK /NOW SCHED A DERAIL, REASON = INTMSG JMP I (SLEEP /ALL DONE /ACQUIRE ANY OPTIONAL DATA /GETS DERAIL PACKET, STORES OPTIONAL DATA AND SIZE /FLUSHES UNUSED DATA GETOPT, 0 CIA /NEGATE SIZE DCA OPTCNT /STORE IT JMS I (GETNOD /GET A PACKET DCA DRLPAK AC0002 /OFFSET TO SIZE WORD TAD DRLPAK DCA DRLSIZ /POINT TO IT CDF DDCFLD DCA I DRLSIZ /ZERO OUT THE SIZE TAD DRLPAK /NOW SET PTR TO OPTIONAL DATA BYTES TAD (3 PKTLP, CDF CUR DCA PKTPTR TAD (-10 /SET FOR 8. BYTES PER PACKET DCA PKTCNT PKTFIL, TAD OPTCNT SZA CLA TAD GETCHC SNA CLA JMP OPTFIN /JMP OUT IF NO MORE DATA JMS I (GETCH /GET A CHAR CDF DDCFLD DCA I PKTPTR /STORE IT ISZ PKTPTR STA /TALLY THE SIZE TAD I DRLSIZ DCA I DRLSIZ CDF CUR ISZ OPTCNT SKP JMP OPTFIN /JMP OUT IF DONE ISZ PKTCNT /TEST PACKET SBYTE COUNT JMP PKTFIL /ITERATE IF MORE JMS I (GETNOD /ELSE GET A PACKET CDF DDCFLD /GET INTO PACKET SPACE DCA I PKTPTR /STORE ITS ADDR IN THE PREV ONE TAD I PKTPTR JMP PKTLP /GO FOR MORE OPTFIN, JMS I (FLUSH /FLUSH ANY UNUSED DATA JMP I GETOPT /DONE /MOVE OPTIONAL DATA OUT OF PACKETS INTO USERS /CCB OPTIONAL DATA BUFFER AND FREE THE PACKETS /USED TO POST CONNECT INIT MESSAGES AND TO SETUP ENTRY /TO THE USERS AST ROUTINE /ENTRY DRLPAK = ADDR OF HEAD PACKET /NSPSXR = OPTDATA BUFFER ADDR-1 MOVOPT, 0 AC0002 /OFFSET TO THE SIZE WORD TAD DRLPAK DCA DRLSIZ CDF DDCFLD TAD I DRLSIZ /GET THE SIZE ON PAGE CDF CUR SNA /TEST FOR NO OPTIONAL DATA JMP MOVOFN /NONE DCA DRLSIZ OPTLP, TAD (3 TAD DRLPAK DCA PKTPTR /SET POINTER TO DATA TAD (-10 /SET BYTES PER PACKET DCA PKTCNT OPTFIL, CDF DDCFLD TAD I PKTPTR ISZ PKTPTR /GET A BYTE JMS TSKCDF DCA I NSPSXR /STORE CDF CUR ISZ DRLSIZ SKP JMP MOVOFN /JMP IF ALL THRU ISZ PKTCNT JMP OPTFIL /LOOP IF MORE IN THIS PACKET CDF DDCFLD TAD I PKTPTR DCA PKTPTR /ELSE PICK UP THREAD TAD DRLPAK /NOW RETURN THIS ONE JMS I (PUTNOD /CALL TO PUTNOD RESETS DF TAD PKTPTR SNA /MUST BE NONZERO!! HLT DCA DRLPAK JMP OPTLP /REITERATE MOVOFN, TAD DRLPAK JMS I (PUTNOD /DUMP THIS LAST PACKET DCA DRLPAK /FLAG IT GONE (FOR CONNECT CONFIRM) JMP I MOVOPT /RETURN DRLSIZ, 0 PKTPTR, 0 PKTCNT, 0 PKTTMP, 0 OPTCNT, 0 /ROUTINE TO SET POINTER INTO CURRENT LCB IFNZRO LCBSIZ-32 <__ASSEMBLY ERROR__> GETLCB, 0 TAD CCBLIN CLL RAL TAD CCBLIN CLL RTL TAD CCBLIN CLL RAL TAD (LCBTAB DCA LCBPTR TAD LCBPTR JMP I GETLCB LCBPTR, 0 PAGE /HANDLE RECEIVED CONNECT INIT AND RECEIVED SINGLE MESSAGE GOTSM, IAC /SET SINGLE MESSAGE FLAG GOTCI, DCA SMFLG /OR CLEAR IT TAD (DSTOBJ-1 DCA NSPTXR /INIT NAME GETTER POINTER JMS I (GETNAM /GET DSTNAME JMS I (GETNAM /GET SRCNAME TAD I (DSTGRP /NULL GROUP? SNA IAC /YES, USE DEFAULT DCA I (DSTGRP TAD I (DSTUSR /NULL USER? SNA AC0002 /YES, USE DEFAULT DCA I (DSTUSR TAD SMFLG /SHOULD WE GET OPTIONAL DATA? SZA CLA JMP SGCCB /JMP IF NO JMS I (GETCH /GO GET SIZE OF OPTIONAL DATA JMS I (GETOPT /GET OPTIONAL DATA + DERAIL PACKET TAD DSTADR SZA CLA /SHOULD BE NULL JMP I (BADFMT SGCCB, JMS I (GETCCB /SETUP CCB SEARCH LOOP SRCHLP, 0 /GETS SEARCH ROUTINE RESUME ADDR DCA NSPTXR /STORE FLAGS IN A TEMP TAD SMFLG SZA CLA JMP SM1 /JMP IF SINGLE MESSAGE TAD NSPTXR /ELSE LOOK AT FLAGS SNA CLA JMP COMPGO /ELIGIBLE FOR CONNECT IF IDLE JMP NXTCCB SM1, TAD I CCBPTR TAD (CCBSMR-1-CCBSTA DCA NSPTXR /OFFSET TO SM PACKET POINTER JMS TSKCDF TAD I NSPTXR CDF CUR SNA CLA /SKP IF ELIGIBLE TO RECEIVE SM JMP NXTCCB COMPGO, TAD (DSTOBJ-1 DCA NSPSXR TAD I CCBPTR TAD (CCBSOT-1-CCBSTA /OFFSET TO SRCNAM-1 DCA NSPTXR TAD M11 DCA COMPNCT /COMPARE 9. WORDS COMPNL, TAD I NSPSXR CIA JMS TSKCDF TAD I NSPTXR CDF CUR SZA CLA JMP NXTCCB /NO MATCH, TRY AGAIN ISZ COMPNCT JMP COMPNL JMS I (MOVCCB /GET IT IN TAD SMFLG SZA CLA JMP SM2 /JMP IF SINGLE MESSAGE TAD M11 DCA SRCHCT /MOVE 9. WORDS TAD (SRCOBJ-1 /HIS SRCNAME IS OUR DSTNAME DCA NSPSXR TAD (CCBDOT-1 DCA NSPTXR CMOVLP, TAD I NSPSXR /COPY NAME NOW DCA I NSPTXR ISZ SRCHCT JMP CMOVLP TAD I (MSGLIN /LINK LINE IN NOW DCA CCBLIN JMS I (CVTNOD /LOOK UP SOURCE NODE NUMBER JMS I (SETNOD /GO MOVE NODE NAME INTO CCB NOW TAD SRCADR /SET THE PARTNERS DSTADR DCA CCBDST TAD SRCAD2 DCA CCBDS2 JMS I (GETLNK /ASSIGN A LOGICAL LINK NOW TAD (CHNCIR /FLAG CI RECEIVED DCA CCBSTA CLA IAC /REASON = CONNECT INIT JMS I (DRLTSK /DERAIL HIM JMP I (SLEEP /DONE NXTCCB, JMS I SRCHLP /ADVANCE TO NEXT CCB JMP I (NOFND /NO FIND, SEND DR BACK SM2, JMS I (CVTNOD /GO LOOK UP SYMBOLIC NODE NAME JMS I (SMCPYN /NOW MOVE IN NODE NAME 6 /POINTER IS 6 WORDS OFF OF EF -3 /3 WORD NAME TAD (SRCOBJ-1 DCA NSPSXR /NOW POINT AT HIS SRCNAME JMS I (SMCPYN /COPY IT IN 7 /POINTER IS 7 WORDS OFF OF EF M11, -11 /9. WORD NAME FIELD / TAD CCBSMR / DCA I (RCVEF /SETUP TO ENTER COMMON DATA MESSAGE CODE / DCA CCBSMR /CLEAR HIS REQUEST FROM CCB / TAD (4 /SET AC = OFFSET TO BUFFER DESCRIPTOR JMP I (SMCPYD /JMP INTO COMMON CODE SRCHCT, 0 COMPNC, 0 SMFLG, 0 PAGE /HANDLE RECEIVED CONNECT CONFIRM GOTCC, JMS I (GETCH /GET SIZE OF OPTIONAL DATA JMS I (GETOPT /GET OPTIONAL DATA + DERAIL PACKET JMS CHKDST /CHECK FOR DSTADR+BRING IN CCB JMP I (SLEEP /IGNORE IF NO LINK TAD CCBSTA /CHECK IF CI WAS SENT AND (CHNCIS SNA CLA JMP RANDCC /UNEXPECTED IF NO CONNECT PENDING DCA CCBTRQ /CLEAR REQCNT TAD CCBSTA AND (7777-CHNCON-CHNCIS TAD (CHNCON DCA CCBSTA /ENTER CONNECTED STATE JMS POSTCN /GO POST THE CONNECT + COPY OPTDATA TAD (LSTYP-CMTYP /BIAS FOR LINK STATUS JMS I (SENDDX /SEND BACK A LINK STATUS SNDLS /SEND A DC TO REJECT CONNECTIONS TO NONEXISTANT OBJECTS NOFND, DCA CCBSRC /SET DSTADR AND SRCADR UP TAD SRCADR DCA CCBDST TAD SRCAD2 DCA CCBDS2 RANDCC, TAD I (MSGLIN /PICK UP LINE NUMBER DCA CCBLIN /STORE FOR CALDDC TAD I (SRCNOD /SET TARGET NODE NUMBER OUT OF RECEIVED NODE DCA CCBDNO JMS I (SENDDX SNDDC /POST PENDING CONNECT INIT /AND COPY PARTNERS OPTIONAL DATA INTO USER AREA /ENTRY AC = STATUS TO POST WITH POSTCN, 0 DCA STATUS /STORE THE STATUS TAD CCBCON /OFFSET TO CONNECT INIT REPLY OPTDATA TAD (10 DCA NSPSXR JMS TSKCDF /GET INTO USER SPACE TAD I NSPSXR CDF DDCFLD /GET INTO PACKET SPACE DCA NSPSXR /SET USER POINTER TAD NSPSXR DCA SIZADR /POINT AT SIZE IAC TAD DRLPAK DCA NSPTXR CDF DDCFLD TAD I NSPTXR JMS TSKCDF /COPY SIZE INTO USER AREA DCA I SIZADR CDF CUR JMS I (MOVOPT /GO MOVE THE DATA AND FREE THE CURRENT PACKETS TAD CCBCON JMS I (POSTPK /NOW POST THE PACKET DCA CCBCON /REMOVE IT FROM CCB TAD SRCADR DCA CCBDST /COPY IN DSTADR OF PARTNER TAD SRCAD2 /COPY HI ORDER TOO DCA CCBDS2 JMP I POSTCN /DONE SIZADR, 0 /CHECK FOR VALID DSTADR /IF OUT OF RANGE, FORMAT ERROR /EXIT TO CALL+1 IF NO LINK ACTIVE, JUST IGNORE IT /EXIT TO CALL+2 IF OK, BRING IN CCB CHKDST, 0 TAD DSTADR SZA /DISALLOW NULL DSTADR TAD (-MAXLNK-1 L7700, SMA CLA JMP I (BADFMT /ERROR TAD DSTADR TAD (LNKTAB-1 /INDEX THE LINK TABLE DCA LNKPT /SET THE POINTER TAD I LNKPT /CHECK THE ENTRY AND L7700 /HIGH 6 BITS CLEAR IF ACTIVE SZA CLA JMP I CHKDST /EXIT TO CALL+1 IF INACTIVE TAD I LNKPT /NOW GET CCB NUMBER SNA JMP I CHKDST /JR01 RETURN IF END OF LIST (INACTIVE) DCA MSGCCB /ELSE SET CCB REF NO JMS I (MOVCCB /MOVE IN CCB NOW ISZ CHKDST /EXIT TO CALL+2 IF VALID JMP I CHKDST /ROUTINE TO PURGE RECEIVE AND /TRANSMIT QUEUES PRIOR TO DISCONNECT /ENTRY AC = STATUS PURGRT, 0 DCA STATUS /STORE THE STATUS TAD CCBPH JMS ABTPKT /ABORT TRANSMITS TAD CCBRH JMS ABTPKT /ABORT RECEIVES TAD CCBINT JMS I (POSTPK /ABORT INTERRUPT MESSAGE DCA CCBINT DCA CCBPH DCA CCBTH DCA CCBTT DCA CCBRH DCA CCBRT JMP I PURGRT /DONE ABTPKT, 0 DCA PKTLNK ABTPKL, TAD PKTLNK SNA JMP I ABTPKT /END OF LIST JMS I (POSTPK JMP ABTPKL /TRY AGAIN PAGE /HANDLE RECEIVED LS MESSAGES GOTLS, JMS I (GETSD /PICK UP SRCADR,DSTADR JMS I (CHKDST /CHECK DSTADR+GET CCB JMP I (SLEEP /IGNORE IF NO LINK TAD SRCADR CIA TAD CCBDST SZA CLA /SRCADR MUST MATCH TOO JMP I (BADFMT JMS I (GETCH /PICK UP REQCNT DCA REQCNT JMS I (GETCH /PICK UP MSGCNT CLA /***TOSS IT*** JMS I (FLUSH /DISCARD REST OF LS TAD CCBDIS SZA CLA JMP I (SLEEP /IGNORE IF DISC IN PROGRESS TAD CCBCON SZA CLA JMP LSCON /CHECK IF CONNECT DONE NOW TAD CCBSTA AND (CHNCON SNA CLA JMP I (SLEEP /DISCARD IF NOT CONNECTED (?) TAD CCBRRQ TAD REQCNT DCA CCBRRQ /UPDATE RECEIVED REQCNT /FALL INTO TRANSMIT LOOP /MAIN TRANSMIT LOOP /ENTERED ON RECEIVED LINK STATUS /AND USER TRANSMIT REQUESTS XMITLP, TAD CCBRRQ /CHECK CURRENT REQCNT SNA CLA JMP I (SLEEP /WAIT IF NO REQUESTS TAD CCBTH /ANYTHING TO TRANSMIT? SNA JMP I (SLEEP /WAIT IF NO PACKETS TAD (5 DCA I (MSGPTR /OFFSET TO DESCRIPTOR ISZ CCBTH ISZ CCBTH JMS TSKCDF TAD I CCBTH /PICK UP LINK WORD DCA CCBTH /UPDATE TRANS HEAD CDF CUR STA TAD CCBRRQ /DECREMENT REQUEST COUNT DCA CCBRRQ TAD (-CMTYP+EOMBIT /BIAS FOR DATA MESSAGE JMS I (SENDDC SNDDM /SEND THE DATA MESSAGE DCA STATUS /CLEAR THE STATUS WORD (SUCCESS) TAD CCBPH SNA JMP IGNPKT /IGNORE IF NOTHING TO SEND JMS I (POSTPK /POST SUCCESS TAD PKTLNK /PICK UP THREAD IGNPKT, DCA CCBPH /UPDATE POST LISTHEAD JMP XMITLP /LOOP FOR MORE /RECEIVED LS WITH PENDING CONNECT LSCON, TAD CCBSTA AND (CHNCCS /DID WE SEND A CONNECT CONFIRM SNA CLA JMP I (SLEEP /NO IGNORE IT DCA CCBRRQ /CLEAR REQUEST COUNT TAD CCBSTA AND (7777-CHNCIS-CHNCIR-CHNCCS-CHNCON TAD (CHNCON DCA CCBSTA /OK, WE'RE UP DCA STATUS /SUCCESS TAD CCBCON JMS I (POSTPK DCA CCBCON JMP I (SLEEP /DONE /ROUTINE TO SCAN A LINES WAITFOR QUEUES PRIOR TO A DISCONNECT /THE CANCEL BITS OF ALL REQUESTS MATCHING OUR CCB /ARE MARKED. OUTDQ IGNORES SUCH REQUESTS AND /OUR COMPLETION ROUTINE SIMPLY DUMPS THEM CANCPK, 0 JMS I (CANCFD /PATCH (PAGE FULL) DCA CANCLK CDF DDCFLD /GET INTO PACKET FIELD CANCLP, TAD CANCLK /CHECK THE LINK WORD SNA /SNA IF MORE JMP CANCXT /ELSE RETURN IAC /OK, OFFSET TO STATUS FIELD DCA NSPSXR /STORE THE POINTER TAD I CANCLK /PICK UP THREAD WORD DCA CANCLK /STORE THE NEXT LINK ISZ NSPSXR /OFFSET TO FUNCTION WORD TAD NSPSXR /STORE POINTER TO IT DCA CANCFN TAD I NSPSXR CIA /NOW COMPARE CCB WORDS TAD MSGCCB SZA CLA /SZA IF MATCH JMP CANCLP /ELSE LOOP TO NEXT ONE TAD I CANCFN /OK, SET THE CANCEL BIT RAL STL RAR DCA I CANCFN /AND STORE IT BACK JMP CANCLP /LOOP TO NEXT ONE CANCXT, CDF CUR /RE ENTER OUR FIELD JMP I CANCPK /RETURN CANCLK, 0 CANCFN, 0 PAGE /HANDLE RECEIVED DISCONNECT MESSAGES GOTDIS, JMS I (GETCH /PICK UP SUBTYP AND (3 /NOW MASK THE DISC SUBTYP CODE TAD (JMP I DISDSP DCA DISJMP JMS I (GETSD /PICK UP DSTADR,SRCADR DISJMP, 0 /DISPATCH ON SUBTYP DISDSP, GOTDI0 /DISCONNECT INITIATE BY USER GOTDI1 /DISCONNECT INITIATE BY NSP GOTDC /DISCONNECT CONFIRM BY NSP BADFMT /ILLEGAL /HANDLE RECEIVED DISCONNECT INIT AND ABORT GOTDI1, JMS I (GETCH DCA DISCOD /SAVE CODE PASSED BY REMOTE NSP SKP CLA /BYPASS GETTING OPTDATA SIZE BYTE GOTDI0, JMS I (GETCH /GET THE SIZE OF THE OPTIONAL DATA FIELD JMS I (GETOPT /NOW GET OPTIONAL DATA AND DERAIL PACKET JMS I (CHKDST /CHK DSTADR AND GET CCB IF OK JMP I (NOFND /ENTER CI PROCESSOR DC CODE OF NO LINK JMS I (FLUSH /RETURN INPUT BUFFERS NOW (SO WE MAY USE 'MSGEF') TAD CCBCON /SEE IF CONNECT REQ PENDING SZA CLA JMP GOTCR /YES, TREAT AS CR CASE TAD CCBDIS /SEE IF USER DISC PENDING SZA CLA JMP GOTDCX /YES, TREAT AS DC (OPTDATA WILL BE LOST) TAD CCBSTA /VERIFY IF ACTUALLY CONNECTED AND (CHNCON SNA CLA JMP I (BADFMT /ERROR, SHOULD BE UNREACHABLE JMS I (CANCPK /OK, CANCEL OUTPUT PACKETS / TAD DISCOD TAD (DISST JMS I (PURGRT /PURGE RECV AND TRANSMITS JMS I (PUTLNK /DEALLOCATE LINK NOW / TAD DISCOD /MUX IN REASON TAD (DISRSN /MUX IN REASON FOR DERAIL JMS I (DRLTSK /SCHED A DERAIL NOW JMS I (SENDDX /NOW SEND A DC SNDDC /HANDLE RECEIVED DISCONNECT CONFIRM GOTDC, JMS I (CHKDST /CHECK DSTADR AND GET CCB IF OK JMP I (SLEEP /IGNORE IF NO LINK JMS I (GETCH /GET CODE PASSED BY REMOTE NSP DCA DISCOD JMS I (FLUSH /CLEAR INPUT BUF NOW (POSTPK USES MSGEF...) TAD (DRJST /TENTATIVELY ASSUME DISCONNECT REJECT STATUS DCA STATUS TAD CCBCON /SEE IF PENDING CONNECT SZA JMP GOTDCC /JMP IF YES GOTDCX, DCA STATUS /CLEAR STATUS = SUCCESS TAD CCBDIS /SEE IF PENDING DISCONNECT SNA JMP I (SLEEP /IF NONE IGNORE IT JMS I (POSTPK /ELSE POST IT COMPLETE DCA CCBDIS /CLEAR IT FROM CCB JMP DMPLNK /GO DUMP LINK AND EXIT GOTDCC, JMS I (POSTPK DCA CCBCON /REMOVE FROM CCB DMPLNK, JMS I (PUTLNK /DEALLOCATE LINK NOW JMP I (SLEEP GOTCR, TAD (CRJST /CONNECTION REJECT BY REMOTE TASK JMS I (POSTCN JMS I (PUTLNK JMS I (SENDDX SNDDC DISCOD, 0 /TEMPORARY PATCHES CANCFD, 0 JMS I (GETLCB TAD (14 DCA CX CDF DDCFLD /GET INTO PACKET FIELD TAD I CX CDF CUR JMP I CANCFD CX, 0 CNIFUD, 0 JMS I (GETLCB TAD (4 DCA CX AC7775 CDF DDCFLD TAD I CX AND (3 CDF CUR JMP I CNIFUD /RETURN STATE IN AC /SUBROUTINE TO COPY OVER SOME DATA TO USER SPACE /ENTRY NSPSXR -> SOURCE POINTER /CALL+1 = OFFSET TO POINTER FIELD /CALL+2 = -WORD COUNT SMCPYN, 0 TAD I SMCPYN /PICK UP OFFSET ISZ SMCPYN TAD CCBSMR /ADD TO BASE OF PACKET DCA CPYCNT /HOLD A SEC STA JMS TSKCDF TAD I CPYCNT /NOW GET FIELD POINTER CDF CUR DCA NSPTXR /SET TARGET POINTER TAD I SMCPYN /NOW GET COUNT ISZ SMCPYN DCA CPYCNT TAD I NSPSXR JMS TSKCDF DCA I NSPTXR CDF CUR ISZ CPYCNT JMP .-5 /LOOP OVER THE DATA JMP I SMCPYN /DONE CPYCNT, 0 PAGE /HANDLE USER CONNECT INITIATE CNICMD, TAD CCBSTA /DO NOT ACCEPT IF NOT IDLE SNA TAD CCBCON SNA TAD CCBDIS SZA CLA JMP I (ERROR5 /ILLEGAL IF NOT IDLE TAD MSGEF DCA CCBCON /OK, HOLD REQUEST JMS I (MSGGET /PICK UP NODE NAME POINTER JMS I (NODCVT /LOOK UP PHYSICAL LINK NUMBER DCA CCBLIN TAD (-4 /ADJUST NSPSXR TAD NSPSXR DCA NSPSXR /TO POINT TO NODTAB ENTRY-1 JMS I (SETNOD /GO SET CCB NODE NAME NOW STA STL /CLEARS LINK+OFFSET FOR XR JMS I (MSGGET /PICK UP DSTNAME POINTER DCA NSPSXR /POINT AT DSTNAME INFO /CLEAR LINK = TO OUR AREA TAD (-11 /MOVE 9. WORDS JMS I (MOVWDS /COPY USERS DSTNAME NOW TAD CCBDOT /INITIAL INSTRUCTION USED BY MOVWDS JMS I (CNIFUD /PATCH TO CHECK STATE OF LINE SNA CLA /SNA IF NOT UP JMP UPNOW /ELSE GET ON WITH IT JMS I (GETNOD /GET A NODE TAD (-1 /BIAS FOR AUTO XR JMS I (CALDDC /CALL DDCMP STRFUN /DO THE START FUNCTION TAD MSGPKT /SUCCESSFUL START, RETURN NODE JMS I (PUTNOD UPNOW, JMS I (GETLNK /ASSIGN A LINK DCA CCBDST /CLEAR DSTADR (NOT YET ASSIGNED) TAD (CHNCIS DCA CCBSTA TAD CCBCON /SET OPTDATA TO SEND TAD (7 JMS I (SETOPT JMS I (SENDDX /LINE UP, SEND A CONNECT INIT SNDCI /HANDLE USER CONNECT CONFIRM CNCCMD, JMS I (CCRCOM /PERFORM PRELIMINARY TESTS TAD CCBSTA /MARK A CC WAS SENT TAD (CHNCCS DCA CCBSTA JMS I (MSGGET /PICK USER OPTDATA ADDR DCA I (OPTPTR /INIT THE POINTER JMS I (SENDDX /SEND THE CONNECT CONFIRM SNDCC /HANDLE USER CONNECT REJECT CNRCMD, JMS I (CCRCOM /PERFORM COMMON PRELIMINARY TESTS JMS I (MSGGET /PICK UP USER OPTDATA PTR DCA I (OPTPTR DCA STATUS /SUCCESSFUL STATUS TAD CCBCON /POST CONNECT PACKET NOW JMS I (POSTPK DCA CCBCON /DONE, REMOVE IT JMS I (PUTLNK /DEASSIGN LINK JMS I (SENDDX /SEND THE CR NOW SNDDI0 /HANDLE USER DISCONNECT COMMANDS DISCMD, TAD CCBDIS /CHECK IF DISCONNECT REQ PENDING SZA CLA JMP I (ERROR5 /YES, ERROR TAD CCBSTA /SEE IF CCB ACTIVE IN ANY WAY SNA JMP I (POSTXT /NO, JUST POST (NOP) AND (CHNCIR /ELSE SEE IF CI RECEIVED SZA CLA JMP CONDSC /JR01 HANDLE ALL EFFECTIVE DISCONNECT REJECTS TAD CCBCON /SEE IF USER SENT CI SZA CLA JMP CISABT /YES HANDLE IT TAD CCBSTA /VERIFY IF ACTUALLY CONNECTED AND (CHNCON SNA CLA DISHLT, HLT /SYSTEM ERROR IF NONE OF THE ABOVE CONDSC, TAD MSGEF /HOLD DISCONNECT REQ DCA CCBDIS JMS I (CANCPK /CANCEL TRANSMIT PACKETS JMS I (PURGRT /PURGE RECV + XMIT REQS TAD CCBDIS TAD (5 JMS I (SETOPT /SET DISC OPTDATA PTR JMS I (SENDDX /NOW SEND THE DISCONNECT INIT SNDDI0 CISABT, JMS I (POSTMS /FIRST POST THE DISCONNECT TAD (DISST /SET STATUS TO DISCONNECT PREEMPT DCA STATUS TAD CCBCON JMS I (POSTPK /POST PENDING CONNECT DCA CCBCON /REMOVE IT FROM CCB JMS I (PUTLNK /DEASSIGN LINK JMP I (SLEEP /DONE PAGE /HANDLE USER RECEIVE COMMANDS /ERROR IF NOT CONNECTED /IF OK, LINKS PACKET ON RECEIVE Q + BUMPS REQCNT /IF LS REQUESTED, SENDS IT WITH CUMULATIVE REQCNT RCVCMD, STA /RECEIVE WITH LINK STATUS RCNCMD, DCA I (SENDDC /RECEIVE WITHOUT LS JMS CONCHK /CHECK STATE OF CONNECTION ISZ CCBTRQ /BUMP TRANSMIT REQCNT TAD MSGEF IAC DCA NSPSXR /NSPSXR TO POINT AT THREAD JMS TSKCDF DCA I NSPSXR /CLEAR THREAD WORD TAD CCBRH SZA CLA JMP RCVNXT TAD MSGEF /EMPTY Q, INIT HEAD DCA CCBRH JMP RCVFIN /GO SET TAIL RCVNXT, TAD CCBRT /NON EMPTY Q, LINK ON TAIL IAC DCA NSPSXR /NSPSXR TO POINT AT LINK TAD MSGEF DCA I NSPSXR /STORE LINK RCVFIN, CDF CUR TAD MSGEF DCA CCBRT ISZ I (SENDDC /TEST THE FLAG JMP I (SLEEP /NO LS NEEDED, WAIT TAD (LSTYP-CMTYP JMS I (SENDDX /LS NEEDED, SEND IT SNDLS /HANDLE SOLICITED TRANSMIT COMMANDS /CHECK IF CONNECTED /IF OK, LINKS ON THE TRANSMIT Q /THEN EXIT TO LS TRANSMIT LOOP /IN THE LOOP, IF REQCNT ALLOWS THE MESSAGE WILL BE SENT TRNCMD, JMS CONCHK /CHECK IF LEGAL TAD MSGEF IAC DCA NSPSXR /POINT AT LINK WORD JMS TSKCDF DCA I NSPSXR /CLEAR IT (EOL) TAD CCBPH SZA CLA JMP TRNNXT /NON EMPTY Q, LINK IT ON TAD MSGEF DCA CCBPH JMP TRNFIN TRNNXT, TAD CCBTT IAC DCA NSPSXR /POINT AT TAIL LINK TAD MSGEF DCA I NSPSXR /LINK THIS ONTO TAIL OF LIST TRNFIN, TAD CCBTH /TRANS HEAD EMPTY? SNA CLA TAD MSGEF /YES, SET IT UP SZA DCA CCBTH TAD MSGEF DCA CCBTT /SET NEW TAIL LINK CDF CUR JMP I (XMITLP /GOTO TRANSMIT LOOP NOW /TRANSMIT UNSOLICITED INTERRUPT MESSAGE TRICMD, JMS CONCHK /CHECK STATE OF CCB TAD CCBINT /**ALLOW ONLY 1 INT SZA CLA JMP I (ERROR5 TAD MSGEF DCA CCBINT /HOLD USERS INTERRUPT PACKET TAD (INTBIT-CMTYP+EOMBIT /SEND OUR MESSAGE JMS I (SENDDC SNDDM DCA STATUS /BACK, CLEAR STATUS = SUCCESS TAD CCBINT /POST USERS INTERRUPT PACKET JMS I (POSTPK DCA CCBINT /REMOVE IT JMP I (SLEEP /CHECK STATE OF CCB FOR CONNECTED STATE CONCHK, 0 TAD CCBDIS SNA CLA TAD CCBSTA AND (CHNCON SNA CLA JMP I (ERROR5 /ILLOGICAL IF NOT CONNECTED JMP I CONCHK /OK /ROUTINE TO SCAN LIST OF CCB'S /EXIT AC = STATUS WORD /EXIT NSPSXR -> STATUS WORD /EXIT MSGCCB = CCB NUMBER GETCCB, 0 DCA MSGCCB /INIT THE POINTERS FIRST TAD (CCBTAB DCA CCBPTR GETLP, ISZ MSGCCB /NOW GET THE NEXT CCB TAD I CCBPTR ISZ CCBPTR SNA /SKP IF NOT EMPTY SLOT JMP MISCCB /ELSE TREAT AS NON EXISTANT DCA TSKCDF+1 /STORE CDF INLINE STA TAD I CCBPTR /PICK UP CCB ADDRESS DCA NSPSXR JMS TSKCDF /INTO TASK FIELD TAD I NSPSXR /TO PICK UP STATE CDF CUR SKP MISCCB, STA /RETURN AC = 7777 IF NONEXISTANT JMS I GETCCB /CALL CALLER BACK GETRET, 0 /GETS END OF LOOP RETURN ISZ CCBPTR /SKIP EXTRA WORDS TAD MSGCCB TAD (-MAXCCB /DONE YET? SZA CLA JMP GETLP /NO DCA MSGCCB /YES, MARK NO CCB NOW JMP I GETRET /EXIT /CHECK THE STATE OF THIS CCB BEFORE ACCEPTING /USER CONNECT CONFIRM OR REJECT CCRCOM, 0 TAD CCBSTA /CHECK IF CI WAS RECEIVED AND (CHNCIR SNA CLA JMP I (ERROR5 /ILLOGICAL IF NO CI RECEIVED TAD CCBDIS /CHECK IF USER DISCONNECT IN PROGRESS SNA TAD CCBCON /CHECK IF PREV CONNECT IN PROGRESS SZA CLA JMP I (ERROR5 /ILLOGICAL IF CON/DIS PENDING TAD MSGEF DCA CCBCON /A VALID REQUEST, SAVE MESSAGE ADDR JMP I CCRCOM /DONE PAGE /HANDLE SINGLE MESSAGE RECEIVES RSMCMD, TAD CCBSMR /ENFORCE SINGLE REQUEST RULE SZA CLA JMP I (ERROR5 /ERROR IF ONE ALREADY PENDING TAD MSGEF /ELSE STORE POINTER TO EF DCA CCBSMR JMP I (SLEEP /DONE (UNTIL WE GET A MESSAGE) /HANDLE SINGLE MESSAGE TRANSMITS TSMCMD, TAD CCBSMT /ENFORCE SINGLE REQUEST RULE SZA CLA JMP I (ERROR5 /ILLEGAL TAD MSGEF /OK, QUEUE IT DCA CCBSMT JMS I (MSGGET /GO GET NODE NAME POINTER JMS I (NODCVT /,LOOK IT UP DCA CCBLIN /STORE THE LINE NUMBER TAD I NSPSXR /ALSO STORE NODE TABLE ENTRY DCA CCBDNO /IN DSTNODE WORD STA STL /FUDGE TO CLEAR LINK AND SUBTRACT ONE JMS I (MSGGET DCA NSPSXR /STORE POINTER TO DSTNAME TAD (-11 /9. WORD NAME BUFFER JMS I (MOVWDS /NOW MOVE INTO TEMP BUFFER TADSMN /BASE TAD TO USE JMS I (CNIFUD /PATCH TO SEE IF LINE ON LINE SNA CLA JMP UPNOW2 /JMP IF YES JMS I (GETNOD /ELSE GET A PACKET TAD (-1 /SUBTRACT 1 JMS I (CALDDC /EXEC DDCMP START FUNCTION STRFUN TAD MSGPKT /NOW RETURN PACKET JMS I (PUTNOD UPNOW2, TAD (SMTYP-CMTYP JMS I (SENDDC /NOW SEND THE SINGLE MESSAGE SNDSM DCA STATUS /SUCCESSFUL STATUS TAD CCBSMT /NOW POST IT JMS I (POSTPK DCA CCBSMT /CLEAR THE POINTER JMP I (SLEEP /READY FOR ANOTHER /ROUTINE TO SEARCH THE NODE TABLE FOR USER REQUESTED NODENAME /ENTRY AC -> USER NAME IN HIS FIELD /EXIT AC = PHYSICAL LINK WORD /EXIT NSPSXR -> MATCHING NODE WORD-1 /EXIT NODPTR -> MATCHING ENTRY-1 /GOTO NODNFD ON NO FIND NODCVT, 0 DCA USRNOD /STORE USER NODE PTR TAD (-MAXNOD DCA NODCNT /INIT LOOP CNTR TAD (NODTAB-1 DCA NODPTR /INIT TABLE PTR NODSRC, TAD NODPTR DCA NSPSXR /SET TO COMPARE 3 WORDS STA TAD USRNOD DCA NSPTXR JMS NODCMP /NOW DO THE COMPARE JMS NODCMP JMS NODCMP TAD I NSPSXR /RETURN PHYS LINK IF MATCH JMP I NODCVT /DONE NODCMP, 0 JMS TSKCDF /INTO USER SPACE TAD I NSPTXR CDF CUR CIA TAD I NSPSXR SNA CLA /SNA IF NO MATCH JMP I NODCMP /ELSE RETURN TAD NODPTR TAD (5 /OFFSET TO NEXT ENTRY DCA NODPTR ISZ NODCNT JMP NODSRC /GO AGAIN IF MORE JMP I (NODNFD /ELSE TAKE ERROR EXIT USRNOD, 0 NODCNT, 0 NODPTR, 0 /PICK UP DSTADR,SRCADR GETSD, 0 JMS I (GETCH /PICK UP DSTADR BYTE DCA DSTADR /STORE IT JMS I (GETCH DCA DSTAD2 JMS I (GETCH /PICK UP SRCADR BYTE DCA SRCADR /STORE IT JMS I (GETCH DCA SRCAD2 JMP I GETSD /AUXILLIARY ROUTINE TO SET OPTPTR /AC = USER ADDR LOC SETOPT, 0 DCA NSPSXR JMS TSKCDF /GET INTO TASK FIELD TAD I NSPSXR CDF CUR DCA I (OPTPTR /NOW SET POINTER JMP I SETOPT /DONE PAGE /HANDLE RECEIVED START REQUESTS ON LINE RCVSTR, TAD (LDNRSN /PASS LINE FAILURE REASON JMS SRCHCC /SEARCH+MARK DOWN ANY CCB'S TAD LINE /COPY LINE FOR CALDDC DCA CCBLIN IAC /OFFSET TO MSGEF-1 TAD MSGPKT /RE-USE THIS NODE JMS I (CALDDC /PASS IT TO DDCMP 'DIRECT' STRFUN /START FUNCTION DMPPAK, TAD MSGPKT /SUCCESS RETURN JMS I (PUTNOD /RETURN PACKET JMP I (SLEEP /DONE /HANDLE RECEIVED ERROR CONDITIONS ON A LINE RCVERR, TAD (LDNRSN /LINE FAILED REASON JMS SRCHCC /PURGE ALL I/O AC0002 /DUMP THIS NODE NOW JMP DMPPAK /HANDLE RECEIVED OFFLINE MESSAGES RCVOFL, HLT /**TEMPORARY** /HANDLE STARTUP FAILURES /CONTINUATION OF EXECUTION FOR STARTUPS /INITIATED BY USER (CI ON IDLE LINE) OR BY LINE /(STRT RECEIVED) STRFAL, JMS I (PURGCC /PURGE ALL PENDING REQUESTS (IF ANY) JMP DMPPAK /NOW DUMP THE PACKET AND EXIT /ROUTINE TO SEARCH LINK TABLE FOR /CCB'S ACTIVE AND BOUND TO CURRENT LINE /ENTRY AC = INHIBIT BITS SRCHCC, 0 DCA BRKRSN /STORE REASON TO BREAK LINK CDF DDCFLD /LOOK INTO PACKET FIELD TAD I MSGSTAT CDF CUR AND (77 /ISOLATE LINE DCA LINE TAD (LNKTAB /INIT LINK TABLE POINTER DCA LNKPT TAD (-MAXLNK DCA SRCHCN SRCHL, JMS BRKLNK /TRY TO BREAK THE LINK ISZ LNKPT ISZ SRCHCN JMP SRCHL /GO AGAIN IF MORE DCA MSGCCB /FLAG NO CCB NOW JMP I SRCHCC /ELSE DONE SRCHCN, 0 /ROUTINE TO ABNORMALLY BREAK A LINK /ENTRY BRKRSN = REASON FOR BREAK /ENTRY LNKPT -> LINK TABLE ENTRY TO TRY AND REMOVE BRKLNK, 0 TAD I LNKPT AND (7700 /SEE IF AN ACTIVE ENTRY SNA CLA TAD I LNKPT SNA JMP I BRKLNK /EXIT IF END OF LIST DCA MSGCCB /ELSE TAKE CCB NUMBER TAD MSGCCB CLL RAL TAD (CCBTAB-3 /INDEX THE CCB TABLE DCA NSPSXR TAD I NSPSXR DCA TSKCDF+1 /SETUP USER CDF TAD I NSPSXR DCA CCBPTR /SET CCB BASE ADDR JMS TSKCDF /GET INTO USER FIELD TAD I CCBPTR /EXAMINE STATE BITS SNA CLA JMP BRKXIT /IGNORE IF INACTIVE TAD CCBPTR TAD (CCBLIN-CCBSTA-1 DCA NSPSXR /INDEX TO LINE TAD I NSPSXR CIA TAD LINE /SEE IF MATCH SZA CLA JMP BRKXIT /EXIT IF INCONSISTANT TAD CCBPTR /OFFSET TO SRCADR TAD (CCBSRC-CCBSTA-1 DCA NSPSXR TAD I NSPSXR CIA TAD LNKPT TAD (-LNKTAB+1 SZA CLA /SZA IF LINK NUMBER CONSISTANT JMP BRKXIT /ELSE IGNORE CDF CUR /OK, BRING IN CCB JMS I (MOVCCB JMS PURGCC /PURGE ITS I/O JMS I (PUTLNK /NOW DEASSIGN THE LINK (WON'T CHANGE LNKPT) JMS I (GETNOD DCA DRLPAK /GET A DERAIL PACKET AC0002 /OFFSET TO OPTIONAL DATA SIZE WORD TAD DRLPAK DCA PURGCC CDF DDCFLD /ENTER FIELD OF PACKETS DCA I PURGCC /CLEAR IT CDF CUR /REENTER OUR FIELD TAD BRKRSN /PICK UP BREAK REASON JMS I (DRLTSK /DERAIL TASK STL RAR JMS I (MOVCCB /MOVE CCB BACK BRKXIT, CDF CUR /RESET DF JMP I BRKLNK /DONE BRKRSN, 0 LINE, 0 /PURGE PENDING REQUESTS ON A LINE PURGCC, 0 TAD MSGCCB SNA CLA /SNA IF CCB THERE JMP I PURGCC /ELSE NO OP TAD (LDNST /SET STATUS FOR PACKETS JMS I (PURGRT /DUMP RECV/XMIT REQS TAD CCBCON /CONNECT PACKET JMS I (POSTPK DCA CCBCON TAD CCBDIS /DISCONNECT PACKET JMS I (POSTPK DCA CCBDIS DCA CCBSTA JMP I PURGCC /DONE PAGE /SPECIAL ROUTINE TO DO CONTEXT FREE SENDDC CALL /IE: NO USELESS CONTEXT SWITCH OF CCB UPON COMPLETION SENDDX, 0 DCA MSGFLG /STORE DATA MESSAGE FLAG TAD SENDDX /COPY ENTRY ADDR OVER DCA SENDDC JMP SENDGO /SENDDX.NE.0 FLAGGING CONTEXT FREE CALL /ROUTINE TO SEND NSP MESSAGES /ENTRY AC = MSGFLGS-CMTYP /IE: CONTROL MESSAGE ASSUMED /CALL+1 = TYPE OF MESSAGE TO SEND SENDDC, 0 DCA MSGFLG /STORE DATA MESSAGE FLAG DCA SENDDX /FLAG CONTEXT SAVING EXIT SENDGO, TAD I SENDDC ISZ SENDDC /STORE DISPATCH ADDR DCA SNDDSP JMS I (GETNOD TAD (7 DCA NSPSXR /OFFSET TO DESCRIPTOR FIELD STA DCA I (PUTCHC /SET TO -1 TO INIT PUTCH DCA SIZE /CLEAR TO INIT PUTCH TAD CCBDNO /TEST FOR ADJACENT NODE SPA SNA CLA JMP NORTHD /NO HEADER OR ADJACENT AC0002 /ELSE GENERATE RTHDR IAC /*** SET LOW ORDER BIT FOR DP8E FIX *** JMS I (PUTCH /SEND OUT RTFLGS TAD CCBDNO /SEND DSTNODE JMS I (PUTNUM TAD I (NETTAB+4 /SEND SRCNODE (US) JMS I (PUTNUM NORTHD, TAD (CMTYP TAD MSGFLG IAC /*** SET LOW ORDER BIT FOR DP8E FIX *** JMS I (PUTCH /SEND OUT MSGFLGS TAD .+1 /PICK UP CDF INSTR TO PACKETS CDF DDCFLD /GET INTO PACKET SPACE DCA I NSPSXR TAD CURBUF /SETUP DESCRIPTOR POINTER DCA I NSPSXR TAD NSPSXR /SAVE PACKET SIZE ADDR IAC DCA SNDSIZ CDF CUR /BACK TO NSP FIELD JMP I SNDDSP /FINAL SEND PROCESSING SNDFIN, CDF DDCFLD /ENTER PACKET SPACE TAD SIZE CIA DCA I SNDSIZ /NOW STORE SIZE TAD SNDSIZ /BACK TO START OF PACKET TAD (-13 JMS CALDDC SNDFUN JMS I (SNDRTN /RETURN BUFFERS JMP I SENDDC /DONE SNDSIZ, 0 /INTERFACE TO SEND A CALL TO DDCMP /NORMAL COMPLETION WILL RETURN /ENTRY AC = PACKET ADDR-1 /CALL+1 = DDCMP FUNCTION CODE SNDDSP, CALDDC, 0 CDF DDCFLD DCA NSPSXR /SAVE POINTER TAD CALDDC /STORE RETURN ADDRS DCA I NSPSXR /(MINI-STACK) TAD SENDDX /SEE IF NOP EXIT SNA CLA /SNA IF YES TAD SENDDC /ELSE STORE ACTUAL RETURN DCA I NSPSXR DCA I NSPSXR /CLEAR EF TAD NSPSXR DCA PKTEF /POINT TO IT DCA I NSPSXR /CLEAR CDF DCA I NSPSXR /CLEAR PTR TAD CCBLIN DCA I NSPSXR /STORE LINE IN STATUS WORD (LOW 6 BITS) CDF CUR TAD I CALDDC CDF DDCFLD DCA I NSPSXR /STORE FUNCTION CODE TAD MSGCCB DCA I NSPSXR /STORE CCB REF NUMBER CDF CUR CIF DDCFLD /CALL THE INTERFACE TO SEND THE MESSAGE JMS I (DDCFNC /(DDCMP FUNCTION CALL) PKTEF, 0 JMP I (SLEEP /DONE /HANDLE ALL DDCMP FUNCTION CALL COMPLETIONS /IF OPERATION IS SUCCESSFUL, NORMAL /RETURN WILL BE MADE THRU CALDDC AND SENDDC /OTHERWISE A FUNCTION DEPENDANT ERROR EXIT IS MADE OFLCMP, IAC HLTCMP, IAC STRCMP, IAC SNDCMP, TAD (JMP I FAILDS DCA FAILJ /PRECALC FAILURE EXIT CDF DDCFLD TAD I MSGSTAT AND (77 DCA CCBLIN /GET LINE TAD I MSGSTAT CDF CUR AND (7700 SZA CLA /SZA IF ALL'S WELL FAILJ, 0 /ELSE GOTO ERROR ROUTINE TAD I (MSGFN /OK, CHECK FUNCTION CANCEL BIT SPA CLA /SPA IF NOT CANCELED JMP I (CNCLED /IT'S ON, JUST DUMP IT AC7775 /OFFSET TO STACK TAD MSGEF DCA NSPSXR CDF DDCFLD TAD I NSPSXR /PICK UP CALDDC EXIT DCA CALDDC TAD I NSPSXR /PICK UP SENDDC EXIT DCA SENDDC CDF CUR JMP I CALDDC /RETURN FAILDS, SNDFAL /SEND DATA FAILED STRFAL /STRT FAILED HLTFAL /HALT FAILED OFLFAL /OFFLINE FAILED PAGE /TRANSMIT FAILED ON THE LINE /NO NEED TO INFORM USER NOW SINCE DDCMP /WILL ALWAYS PASS A LINE FAIL MESSAGE TO HANDLE IT SNDFAL, CNCLED, JMS I (SNDRTN /RETURN THIS PACKET AND IT'S BUFFERS JMP I (SLEEP /DONE OFLFAL, HLTFAL, HLT /**UNREACHABLE /SEND CONNECT MESSAGES SNDCC, IAC /CONNECT CONFIRM SNDCI, JMS CDCOMN /CONNECT INITIATE CONTYP /INSERT COMMON CON/DIS DATA TAD (053 /++TEMPORARY++ JMS I (PUTCH /SEND OUT LNKCHR TAD (265 JMS I (PUTCH /SEND OUT SEGSIZ JMS I (PUTCH /--TEMPORARY-- JMS I (PUTCH /STUFF THE LNKACCT FIELD TAD SUBTYP /KLUDGE TO CHECK IF CON INIT SZA CLA JMP SNDOPT /DONT SEND DSTNAM,SRCNAM IF NOT CI TAD (CCBDOT JMS I (PUTNAM TAD (CCBSOT JMS I (PUTNAM JMP SNDOPT /GO SEND OPT DATA /SEND DISCONNECT MESSAGES SNDDI0, JMS CDCOMN /DISCONNECT INITIATE DISTYP SNDOPT, JMS I (PUTOPT /SEND OPT DATA NOW JMP I (SNDFIN /DONE SNDDC, IAC SNDDI1, IAC JMS CDCOMN DISTYP TAD REASON JMS I (PUTCH /NOW SEND OUT THE REASON CODE JMP I (SNDFIN /DONE /CONNECT, DISCONNECT COMMON ROUTINE /AC = SUBTYP CDCOMN, 0 DCA SUBTYP /STORE THE SUBTYPE TAD NSPBXR /HOLD THE BUFFER POINTER A SEC DCA FLGPTR TAD I CDCOMN CDF DDCFLD /GET INTO DDCMP SPACE TAD I FLGPTR DCA I FLGPTR /ADD IN THE SUBTYPE CODE CDF CUR /BACK TO OUR DF TAD SUBTYP JMS I (PUTCH /SEND THE SUBTYPE CODE JMS PUTSD /SEND OUT DSTADR,SRCADR JMP I CDCOMN SUBTYP, 0 REASON, 0 FLGPTR, 0 /HANDLE REQUEST FOR LINK STATUS MESSAGE SNDLS, JMS PUTSD /SEND OUT DSTADR,SRCADR TAD CCBTRQ /SEND CUM REQCNT JMS I (PUTCH TAD CCBTRQ /STUFF OUT THE MSGCNT JMS I (PUTCH DCA CCBTRQ /CLEAR COUNT NOW JMP I (SNDFIN /HANDLE REQUEST FOR SINGLE MESSAGE SNDSM, TAD (SMDOT JMS I (PUTNAM /SEND DST NAME TAD (CCBSOT JMS I (PUTNAM /SEND SRC NAME JMP SNDATA /NOW DO COMMON DATA SEND /HANDLE REQUEST FOR DATA MESSAGE SNDDM, JMS PUTSD /SEDN OUT DSTADR,SRCADR BYTES SNDATA, JMS I (MSGGET /NOW FETCH BUFFER DESCRIPTOR CDF DDCFLD /ENTER PACK DF (STORE DIRECT TO NOT ALTER SIZE) DCA I NSPBXR /CDF STA JMS I (MSGGET /GET NEXT WORD (RESETS DF) CDF DDCFLD /BACK TO PACKET DF DCA I NSPBXR /PTR-1 JMS I (MSGGET /RESETS DF AGAIN CIA /TALLY CUMULATIVE SIZE TAD SIZE DCA SIZE JMP I (SNDFIN /SEND OUT DSTADDR AND SRCADDR PUTSD, 0 TAD CCBDST /SEND OUT DSTADDR FIRST JMS I (PUTCH TAD CCBDS2 JMS I (PUTCH TAD CCBSRC /NOW SEND OUT SRCADDR JMS I (PUTCH TAD CCBSR2 JMS I (PUTCH JMP I PUTSD /GET A NODE FROM THE FREE LIST /EXIT AC -> NODE /ENTRY DF MAY BE RANDOM /EXIT DF = CUR /FATAL HALT IF NODE POOL EXHAUSTED **TEMPORARY** GETNOD, 0 CDF DDCFLD /GET INTO PACKET FIELD CIF CUR /DISABLE INTERRUPTS TAD I (FREHD SNA NODHLT, HLT /**TEMPORARY** DCA CURNOD TAD I CURNOD DCA I (FREHD DCA I CURNOD /ALWAYS CLEAR THE THREAD WORD BEFORE EXITING TAD CURNOD /KLUDGE: CLEAR DERAIL PACKET DATA LINK TOO TAD (13 /ITS OFFSET IS 11. WORDS FROM START DCA CURDLK DCA I CURDLK TAD CURNOD CDF CUR JMP I GETNOD CURDLK, 0 /PUT A NODE IN THE FREE LIST /ENTRY AC -> NODE PUTNOD, 0 SNA HLT CDF DDCFLD CIF CUR /DISABLE INTERRUPTS DCA CURNOD TAD I (FREHD DCA I CURNOD TAD CURNOD DCA I (FREHD CDF CUR /RE ENTER OUT DF JMP I PUTNOD CURNOD, 0 PAGE /PUT A CHARACTER IN THE NSP HEADER /AC = CHARACTER /GETS NODE IF ONE NEEDED (PUTCHC = -1 ON ENTRY) /LINKS TO PREV (IF THERE IS ONE) /ON EXIT NSPBXR MUST POINT AT CHAR JUST STORED PUTCH, 0 ISZ PUTCHC /CHECK PACKET COUNTER JMP PUTCHL /GO STORE IT IF ROOM LEFT DCA PUTCHR /STORE CHAR A SEC JMS I (GETNOD /GET A PACKET DCA NXTBUF TAD SIZE SNA CLA /SKP IF NOT THE FIRST NODE (REQUIRING NO BACK LINK) JMP NOLINK TAD .+1 /GET A CDF INSTR CDF DDCFLD /GET INTO DDCMP PACKET FIELD DCA I NSPBXR /STORE IN CURRENT NODE TAD NXTBUF DCA I NSPBXR /STORE ADDR-1 ALSO TAD NXTBUF DCA I THSBUF /SET LINK FOR RELEASE OF BUFFERS NOLINK, TAD NXTBUF DCA THSBUF /MAKE NEXT CURRENT TAD THSBUF DCA NSPBXR /SET AUTO PTR TAD (-PKSIZE+3+2 /SET COUNT (2 WORDS SHORT TO ALLOW FOR USER BUF LINKS) DCA PUTCHC TAD PUTCHR PUTCHL, CDF DDCFLD DCA I NSPBXR /STORE CHAR IN PACKET CDF CUR ISZ SIZE JMP I PUTCH /RETURN NXTBUF, 0 THSBUF= CURBUF PUTCHR, 0 PUTCHC, 0 /RETURN PACKETS USED DURING OUTPUT SNDRTN, 0 AC0002 /OFFSET TO PTR-1 TAD I (MSGPTR DCA THSNOD CDF DDCFLD /GET INTO DDCMP FIELD TAD I THSNOD /LOOK AT THREAD DCA NXTNOD TAD MSGPKT JMP RTNGO /JMP INTO LOOP RTNLP, CDF DDCFLD /GET INTO DDCMP AND PACKET SPACE DCA THSNOD TAD I THSNOD DCA NXTNOD /LINK TO NEXT PACKET TAD THSNOD /NOW RETURN THIS ONE RTNGO, JMS I (PUTNOD TAD NXTNOD /SEE IF ANY MORE SZA JMP RTNLP /JMP IF YES JMP I SNDRTN THSNOD, 0 NXTNOD, 0 /ROUTINE TO LOOK UP A NODE NUMBER OR LINE NUMBER IN NODTAB /EXIT NSPSXR -> NODNUM-1 CVTNOD, 0 TAD (-MAXNOD /INITIALIZE TABLE SIZE TO SEARCH DCA NSPTXR TAD (NODTAB+2 /SET TABLE POINTER TO LINE WORD DCA NSPSXR CVTSCH, TAD I NSPSXR CIA TAD I (MSGLIN /COMPARE LINES FIRST SZA CLA JMP NXTND /NO MATCH IF NOT SAME LINE TAD I (SRCNOD /SEE IF NODE SPEC SZA JMP NONADJ /YES, COMPARE IT TAD I NSPSXR /NO, SEE IF ADJACENT FLAG SET SMA CLA JMP NXTND1 /NO, TRY AGAIN JMP GOTND /GOT IT NONADJ, CIA TAD I NSPSXR CLL RAL /ONLY COMPARE 11 BITS SZA CLA JMP NXTND1 /NOT SAME GOTND, TAD NSPSXR /GOT NODE, BACKUP TO 6BIT NAME TAD (-5 DCA NSPSXR JMP I CVTNOD /DONE NXTND, IAC /OFFSET TO NEXT ENTRY NXTND1, TAD (3 TAD NSPSXR DCA NSPSXR ISZ NSPTXR JMP CVTSCH /ITERATE IF MORE JMP I CVTNOD /NO FIND, IGNORE /ROUTINE TO SETUP NODE NAME IN CCB /ENTRY NSPSXR -> NODE NUMBER-1 SETNOD, 0 TAD I NSPSXR /NOW COPY IT IN DCA CCBND1 TAD I NSPSXR DCA CCBND2 TAD I NSPSXR DCA CCBND3 ISZ NSPSXR /SKIP LINE NUMBER (PHYS LINK) TAD I NSPSXR DCA CCBDNO /NOW SET NODE WORD JMP I SETNOD /DONE /EXPAND AND SEND 6BIT CHARS P6BTS, 0 TAD (40 AND (77 TAD (40 /USE THE STANDARD UNPACKING TRICK DCA I (PCH /HOLD TAD I (PCH /SEE IF NON BLANK AND (37 SNA CLA JMP I (PUTNRT /YES TAD I (PCH /NO SEND IT JMS I (PCH JMP I P6BTS PAGE /GET CONNECT NAME FIELDS /ENTRY NSPTXR -> BUFFER /THIS ROUTINE ONLY HANDLES FORMAT 0 OR 1 FIELDS GETNAM, 0 TAD NSPTXR IAC DCA NAMPTR /COPY BUFFER POINTER TAD (-7 DCA NAMCNT DCA I NSPTXR ISZ NAMCNT JMP .-2 /CLEAR NAME BUFFER JMS I (GETCH /GET OBJTYP AND (177 /MASK OUT EXTENSIBLE BIT DCA I NAMPTR /STORE IN FIRST WORD OF BUFFER TAD CHAR /BE SURE DESCRIP FOLLOWS AND (200 SNA CLA /SKP IF OK JMP I (BADFMT /ELSE GIVE ERROR JMS I (GETCH CLL RAR /FORMAT BIT TO LINK SZA /TEST IF FORMAT 0 OR 1 JMP I (BADFMT /JMP IF NOT SNL /SET OFFSET FOR UIC FIELDS TAD (4 /ADD 4 BYTES IF UIC DCA NAMCNT CML STA RAL /SET ISZ FLAG TO SKIP IF FORMAT 0 DCA FMTFLG JMS I (GETCH /GET IMAGE FIELD SIZE CMA /-SIZE-1 TAD NAMCNT /ADJUST FOR 4 BYTE UIC FIELDS SMA JMP I (BADFMT /ERROR IF NOTHING FOLLOWS DCA NAMCNT ISZ FMTFLG JMP NOUIC /JMP PAST UIC IF FORMAT 1 JMS I (G12BTS /GET GROUP DCA I NSPTXR JMS I (G12BTS /GET USER SKP NOUIC, DCA I NSPTXR /CLEAR UIC IF NONE DCA I NSPTXR /NSPTXR IS NOW AT END OF BUFFER NAMLP, ISZ NAMPTR /PRE INCREMENT PTR JMS GCH /GET A CHAR CLL RTL /SHIFT LEFT CLL RTL CLL RTL DCA I NAMPTR JMS GCH /GET ANOTHER CHARACTER TAD I NAMPTR /ADD INTO PREV ONE DCA I NAMPTR JMP NAMLP /LOOP IF MORE /GET ANOTHER IMAGE FIELD CHAR GCH, 0 ISZ NAMCNT /TEST COUNT SKP /SKP IF MORE JMP I GETNAM /RETURN IF NONE JMS I (GETCH AND (77 /MASK TO 6 BITS JMP I GCH /COMPOSE A FORMAT 0 NAME FIELD /ENTRY AC -> NAME BUFFER PUTNAM, 0 DCA NAMPTR /STORE POINTER TO NAME TAD NAMPTR /OFFSET TO UIC NOW TAD (7 DCA UICPTR TAD I NAMPTR /GET OBJTYP AND (177 /MASK ONLY LOW 7 BITS TAD (200 /ADD IN EXTENSIBLE BIT JMS I (PUTCH /SEND OUT OBJTYP TAD I UICPTR SNA CLA /SEND UIC IF IT EXISTS IAC JMS I (PUTCH /SEND OUT FORMAT BYTE JMS I (PUTCH /SEND OUT IMAGE SIZE BYTE TAD NSPBXR /GET ITS ADDRESS IN BUFFER DCA SIZPTR /SAVE IT TAD I UICPTR /SEE IF UIC PRESENT SNA CLA JMP NOPUIC /JMP IF NONE JMS P12BTS /SEND GROUP JMS P12BTS /SEND USER NOPUIC, TAD (-6 DCA NAMCNT /SET FOR 12 CHARACTERS PUTNLP, ISZ NAMPTR TAD I NAMPTR /GET NEXT 6 BITS CLL RTR RTR RTR JMS I (P6BTS /PUT OUT EXPANDED 6 BIT CHAR TAD I NAMPTR JMS I (P6BTS /SEND LOW 6 BITS ISZ NAMCNT JMP PUTNLP /LOOP FOR NEXT PUTNRT, JMP I PUTNAM /DONE /LOW LEVEL CHAR SENDER PCH, 0 JMS I (PUTCH /PUT IN BUFFER CDF DDCFLD ISZ I SIZPTR /TALLY BYTE CDF CUR JMP I PCH /UNPACK 12 BITS TO TWO BINARY BYTES P12BTS, 0 TAD I UICPTR AND (377 /GET LOW 8 BITS JMS PCH /SEND IT TAD I UICPTR CLL RTL RTL RAL AND (17 JMS PCH /SEND HIGH 4 BITS ISZ UICPTR JMP I P12BTS SIZPTR, 0 UICPTR, 0 NAMPTR, 0 NAMCNT, 0 FMTFLG, 0 PAGE /GET AN EXTENSIBLE BINARY FIELD /12 BITS MAXIMUM (DOES NOT CHECK FOR OVERFLOW) GETNUM, 0 JMS GETCH /GET THE FIRST BYTE DCA PUTNUM /STORE IT TAD PUTNUM AND G7600 /SEE IF EXTENSIBLE BIT SET SNA CLA /SKP IF YES JMP GETFIN /ELSE RETURN 7 BITS JMS GETCH /GET THE NEXT 5 BITS RTR RTR RTR /SHIFT INTO PLACE AND G7600 /MASK ONLY 5 BITS TAD G7600 /SUBTRACT OUT EXT BIT GETFIN, TAD PUTNUM /ADD THE LOW BITS JMP I GETNUM /RETURN /PUT AN EXTENSIBLE BINARY FIELD OUT /ENTER WITH AC = 12 BIT (MAXIMUM) NUMBER TO SEND PUTNUM, 0 DCA GETNUM /STORE THE NUMBER TAD GETNUM CLL TAD G7600 /SET LINK IF .GT. 177 AND (177 /MASK ONLY 7 BITS SZL TAD (200 /SET EXTENSIBLE BIT IF .GT. 177 JMS I (PUTCH /SEND IT OUT TAD GETNUM /GET NUMBER BACK AND G7600 /RE TEST HIGH 5 BITS SNA JMP I PUTNUM /RETURN IF DONE CLL RTL RTL RTL JMS I (PUTCH /SEND THE NEXT 5 BITS JMP I PUTNUM /RETURN /GET 12 BIT GROUP AND USER BYTES G12BTS, 0 JMS I (GETCH /GET LOW 8 BITS DCA G12CHR /STORE JMS I (GETCH AND (17 CLL RTR RTR RAR TAD G12CHR /ADD IN LOW 8 JMP I G12BTS G12CHR= PUTNUM /GET A CHARACTER FROM THE CURRENT BUFFER /MARK LOCATION CLEAR (-1) WHEN DONE /THERE MUST BE A CHAR, ELSE BAD FORMAT MESSAGE GETCH, 0 TAD GETCHC /ANY? SNA CLA JMP I (BADFMT /NO ERROR GETCHF, 0 /GETS FIELD OF DATA ISZ GETCHP /PREINCREMENT CHAR POINTER TAD I GETCHP SMA /SMA IF LINK JMP GOTCH /ELSE GOT A CHAR DCA GETCHF /SET THE FIELD INLINE ISZ GETCHP TAD I GETCHP /GET THE NEW POINTER DCA GETCHP JMP GETCHF GOTCH, DCA CHAR /SAVE THE CURRENT CHAR STA DCA I GETCHP /MARK THAT LOCATION FREE CDF CUR TAD CHAR ISZ GETCHC JMP I GETCH JMP I GETCH /PROTECT AGAINST OVERFLOW GETCHP, 0 /ROUTINE TO FLUSH RECEIVED BUFFERS (IF ANY) FLUSH, 0 TAD GETCHF SNA CLA /SNA IF ANY JMP I FLUSH /ELSE NO OP FLUSHL, TAD GETCHC SNA CLA JMP RTNPK /RETURN PACKET IF DONE JMS GETCH G7600, 7600 JMP FLUSHL RTNPK, TAD MSGEF /BACK TO THE SHADOWS JMS I (PUTNOD DCA GETCHF /FLAG NO DATA NOW (MAY BE RECALLED) JMP I FLUSH /DONE /ROUTINE TO SEND OPTIONAL DATA (CONNECT AND DISCONNECT) /ENTRY OPTPTR SET INTO USER AREA /IF OPTPTR = 0 THEN NO DATA /ELSE STRING TERMINATED BY NEG WORD PUTOPT, 0 JMS I (PUTCH /ALLOCATE THE IMAGE SIZE BYTE TAD NSPBXR DCA I (SIZPTR /SAVE PTR TO IT TAD OPTPTR /TEST THE POINTER SNA CLA JMP I PUTOPT PUTOLP, JMS TSKCDF /GET INTO TASK FIELD TAD I OPTPTR /GET NEXT BYTE ISZ OPTPTR CDF CUR SPA JMP PUTORT /RETURN IF AT DELIMITER JMS I (PCH /ELSE SEND IT JMP PUTOLP PUTORT, CLA /AC RANDOM DCA OPTPTR /FLAG NO MORE DATA JMP I PUTOPT /DONE OPTPTR, 0 PAGE /ROUTINE TO ENQ A DERAIL REQUEST /ENTRY DRLPAK -> DERAIL PACKET /IF THE QUEUE IS EMPTY, FAKES A BRANCH TO "DRLXIT" TO DO THE DERAIL /ENTRY AC = REASON DRLTSK, 0 CDF DDCFLD /ENTER FIELD OF NODE POOL ISZ DRLPAK /FUDGE THE PACKET ADDR DCA I DRLPAK /STORE REASON CODE STA TAD DRLPAK DCA DRLPAK TAD CCBXDF /LOOK AT AST "BUSY FLAG" SNA CLA JMP FRSHDR /JMP IF ZERO, NOT IN AST TAD CCBIH /ASSUME AST RUNNING, SEE IF Q EMPTY SNA CLA JMP DRL0 /JMP IF YES TAD DRLPAK /ELSE LINK ON END OF Q DCA I CCBIT JMP DRLRDY /GO FINISH UP DRL0, TAD DRLPAK /INITIALIZE HEAD OF LIST DCA CCBIH JMP DRLRDY /GO FINISH UP FRSHDR, TAD DRLPAK DCA CCBIH TAD CCBTSK /INDEX EXEC TASK STATE TABLE CLL RTL /4 WDS PER ENTRY TAD (TSTABL-1 DCA NSPSXR TAD NSPSXR DCA NSPTXR /TO TWO POINTERS CDF00, CDF TAD I NSPSXR DCA CCBGLK /HOLD FLAGS A SEC TAD I NSPSXR /GET USER PC DCA CCBPC /STORE IT TAD I NSPSXR DCA CCBAC /STORE AC TAD CCBGLK /ISOLATE DATA FIELD AND (7 CLL RTL RAL TAD CDF00 DCA CCBXDF /STORE CDF INLINE TAD CCBGLK SMA CLA TAD (CLL-STL TAD (STL DCA CCBGLK /STORE LINK SETTING INSTR INLINE /NOW SCHECULE ENTRY INTO DRLXIT WITH AC SET UP TAD (CUR DCA I NSPTXR /SET DF=0 AND IF=CUR TAD (DRLXIT DCA I NSPTXR /SET PC TO DRLXIT TAD MSGCCB DCA I NSPTXR /SET AC=CCB NUMBER CDF CUR TAD CCBTSK /MAKE HIM RUNNABLE NOW CAL UNBARG MSGWT!EORMWT /BY UNBLOCKING MESSAGE WAIT DRLRDY, CDF DDCFLD TAD DRLPAK /DIDDLE THE TAIL OF THE Q DCA CCBIT DCA I CCBIT /CLEAR THE THREAD WORD (END OF LIST) DCA DRLPAK /FLAG PACKET GONZO CDF CUR JMP I DRLTSK /DONE /ASSIGN A LOGICAL LINK TO A CCB /LOGICAL LINKS ARE ASSIGNED FIFO /FATAL HALT IF NONE LEFT (CANNOT OCCUR) GETLNK, 0 TAD LNKHD /CHECK FREELIST HEAD SNA LNKHLT, HLT /SYSTEM ERROR: MAXCCB.LT.MAXLNK ALWAYS DCA LNKPT TAD I LNKHD /THREAD TO NEXT DCA LNKHD TAD MSGCCB /NOW COPY IN CCB REF NUMBER DCA I LNKPT TAD LNKPT TAD (-LNKTAB+1 DCA CCBSRC /CALC AND STORE SRCADR NOW DCA CCBSR2 /STORE NULL QUALIFIER FOR NOW DCA CCBRRQ /CLEAR REQUEST COUNTS NOW DCA CCBTRQ JMP I GETLNK /DONE /DEASSIGN A LOGICAL LINK PUTLNK, 0 TAD CCBSRC /POINT AT THIS ENTRY IN THE TABLE TAD (LNKTAB-1 DCA LNKPT TAD LNKPT /NOW LINK ON TAIL OF Q DCA I LNKTL TAD LNKPT DCA LNKTL /UPDATE EOL PTR DCA I LNKTL /CLEAR EOL DCA CCBSTA /NOW CLEAR STATUS BITS IN CCB JMP I PUTLNK /DONE LNKHD, LNKTAB /FIRST ENTRY IS ADDR #1 LNKTL, LNKEND /THE INIT END OF LIST /POST A PACKET /ENTRY AC = POINTER TO EF POSTPK, 0 SNA JMP I POSTPK /NO OP IF NOTHING DCA MSGEF /ELSE POINT AT IT AC0002 TAD MSGEF /OFFSET TO THREAD WORD DCA MSGSTAT JMS TSKCDF TAD I MSGSTAT DCA PKTLNK /SAVE IT ISZ MSGSTAT TAD STATUS /POST IT NOW JMS POSTMS JMP I POSTPK /POST A MESSAGE POSTMS, 0 JMS TSKCDF /GET INTO USER SPACE DCA I MSGSTAT /STORE STATUS TAD TSKCDF+1 DCA POSTMF /COPY CDF INLINE TAD MSGEF /CHECK FOR VALID EF JMS I (EFCHK TAD MSGEF CAL POST POSTMF, 0 JMP I POSTMS /DONE PAGE /DERAIL EXIT ROUTINE - USED TO DEQ THE NEXT DERAIL PACKET /RUNS AS AN EXTENSION OF THE USERS TASK WITH TASK SWITCHING INHIBITED /ENTRY AC = CCB NUMBER (PASSED BY USER) DRLXIT, CLL RAL /CLEARS LINK + MULTIPLIES BY 2 TAD (CCBTAB-3 /FIRST SET AC TO CCB TABLE IOF /NOW INHIBIT INTERRUPTS DCA NSPSXR /SINCE NSPSXR ISN'T CONTEXT SWITCHED CDF ION /TURN INTERRUPTS BACK ON DCA I (TSWFLG /WITH TASK SWITCHING INHIBITED CDF CUR TAD I NSPSXR /COPY TASK CDF INLINE DCA TSKCDF+1 TAD I NSPSXR TAD (CCBIH-CCBSTA-1 DCA DRLCCB /NOW POINT AT INTERRUPT BLOCK /COPY DERAIL BLOCK IN DRLPUT, TAD DRLCCB /FIRST INIT THE POINTERS DCA NSPSXR TAD (CCBIH-CCBGLK-1 JMS MOVWDS /NOW MOVE THE DERAIL BLOCK TAD CCBIH /PROTOTYPE TAD FOR MOVWDS SNL JMP DRLNXT /CONTINUE TAD TSKCDF+1 TAD (CIF-CDF DCA .+1 /STORE CIF INLINE 0 CDF 0 /SET DF TO EXEC FIELD (FOR TSWFLG CHECK) JMP I DRLSHD /GO SCHEDULE IT DRLNXT, TAD DRLCCB TAD (CCBAST-CCBIH+1 DCA DRLSHD /POINT DRLSHD AT CCBAST TAD CCBIH /LOOK AT HEAD OF QUEUE SNA HLT /FATAL ERROR DCA NSPTXR /SECOND WORD OF PACKET IS REASON CODE CDF DDCFLD /GET INTO PACKET SPACE TAD I NSPTXR DCA CCBRSN TAD DRLCCB TAD (CCBOPT-CCBIH DCA NSPSXR /POINT AT OPTIONAL DATA AREA-1 TAD I NSPTXR /THIRD WORD IS -SIZE OF OPTIONAL DATA DCA CCBOPL /STORE NEW SIZE OVER OLD TAD CCBIH /PASS HEAD OF INT QUEUE IN DRLPAK TO MOVOPT DCA DRLPAK TAD I CCBIH DCA CCBIH CDF CUR JMS I (MOVOPT /GO MOVE THE OPTIONAL DATA STL JMP DRLPUT /PUT DERAIL BLOCK BACK AND EXIT /MOVE CCB IN OR OUT OF OUR AREA /AC1 = 1 IF SHOULD PUT CCB IN USERS AREA MOVCCB, 0 TAD MSGCCB /PICK UP CCB NUMBER CLL RAL /MULTIPLY BY 2, PUTFLG TO LINK SNA /SNA IF CCB THERE JMP I MOVCCB /ELSE TREAT AS NOP TAD (CCBTAB-3 /INDEX CCB TABLE DCA NSPTXR TAD I NSPTXR /PICK UP CDF INSTR SNA HLT /FATAL HALT IF CCB NOT LOADED DCA TSKCDF+1/STORE INLINE CML STA /FUDGE AC AND LINK TAD I NSPTXR /PICK UP CCB ADDRESS DCA NSPSXR /STORE IN AUTO XR TAD (CCBSTA-CCBGLK-1 /NUMBER OF WORDS TO MOVE JMS MOVWDS /EXEC THE MOVE LOOP TAD CCBSTA /BASE TAD FOR MOVWDS JMP I MOVCCB /DONE /LOOP MOVES DATA TO/FROM USERS AREA /NSPSXR = USER POINTER /CALL+1 = BASE TAD CCB... /NSPTXR = NSP POINTER /AC = - NO WORDS TO MOVE /L = 1 TO MOVE TO USER /MUST NOT TOUCH THE LINK MOVWDS, 0 DCA DRLCNT /STORE COUNT TAD I MOVWDS /PICK UP TAD CCB... DCA TOUSR /STORE INLINE TAD TOUSR /NOW CVT TO DCA CCB... TAD (2000 DCA TODCA /STORE IN LINE JMS TSKCDF /GET INTO USER SPACE SZL /LINK = 0 TO NSP PAGE 0 JMP TOUSR /LINK = 1 TO USER SPACE TONSP, TAD I NSPSXR /GET USER WORD TODCA, 0 /DCA CCB...+N ISZ TODCA /BUMP INSTR ISZ DRLCNT /BUMP COUNT JMP TONSP /ITERATE JMP MOVWDN /DONE TOUSR, 0 /TAD CCB...+N DCA I NSPSXR /STORE IN USER SPACE ISZ TOUSR ISZ DRLCNT JMP TOUSR /ITERATE MOVWDN, CDF CUR ISZ MOVWDS /SKIP INLINE INSTR JMP I MOVWDS /DONE DRLCNT, 0 DRLCCB, 0 DRLSHD, 0 SMDOT, 0 /SPECIAL BUFFER FOR SINGLE MESSAGE SENDS SMDN1, 0 0 0 0 0 0 SMDG, 0 SMDU, 0 TADSMN= TAD SMDOT /SYMBOL REFERRED TO OFF PAGE PAGE *CCBTAB+40 LNKTAB, .+1;.+1;.+1;.+1 .+1;.+1;.+1;.+1 .+1;.+1;.+1;.+1 .+1;.+1;.+1;.+1 .+1;.+1;.+1;.+1 LNKEND, 0 MAXLNK= LNKEND-LNKTAB+1 $$$$$$