Trailing-Edge
-
PDP-10 Archives
-
tops10_703_distr_bb-x140b-sb
-
10,7/703anf/dnnsp.p11
There are 3 other files named dnnsp.p11 in the archive. Click here to see a list.
.SBTTL 1.0 DNNSP 0.0 -- DECNET COMPATIBLE CODE 28 MAR 79
.IF NE,FTDCP1
VRNSP==011 ;FILE EDIT NUMBER
;***********************************************************************
;
;
; DNNSP 0.0 10-MAY-76 -- DECNET COMPATIBLE CODE
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1976,1977,1978,1979,1980,1981,1984 BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;***********************************************************************
.SBTTL 1.1 NSPDEF 0.0 12-MAY-76 -- SYMBOL DEFINITIONS
;***********************************************************************
;
; NSPDEF 0.0 12-MAY-76 -- SYMBOL DEFINITIONS
;
;***********************************************************************
.SBTTL 1.1.1 LEDEF 0.0 12-MAY-76 -- LINK ENTRY DEFS
;***********************************************************************
;
; LEDEF 0.0 12-MAY-76 -- LINK ENTRY DEFS
;
;***********************************************************************
BLOCK LE
XX NSP ;NSP LINK ADDRESS
XX CON ;CONVERTED NCL LINK ADDRESS
X NCL ;NCL LINK ADDRESS
XX STS ;STATUS BITS
LES.DV=B7 ;DEVICE CONNECTION
LES.WD=B6 ;WAITING FOR DISCONNECT CONFIRM
LES.FL=B5 ;FLUSH OUTPUT TO NSP
LES.SD=B4 ;SEND DISCONNECT CONFIRM TO NSP
LES.SL=B3 ;SEND 0 LINK STATUS
X SIZ,0 ;SIZE OF LINK TABLE ENTRY
LEPCNK=CNKSIZ/LE.SIZ ;NUMBER OF LINK ENTRIES PER CHUNK
NSPINT=B3 ;INTERRUPT BIT IN MSGFLG
NSPCM=B1 ;MESSAGE IS CM IF 1
.SBTTL 1.2 NSPDAT 0.0 10-MAY-76 -- DATA AREAS
;***********************************************************************
;
; NSPDAT 0.0 10-MAY-76 -- DATA AREAS
;
;***********************************************************************
NSPCNT: .WORD 0 ;COUNT OF NCL SUBMESSAGE
NSPCVL: .WORD 0 ;VALUE OF COUNT (FOR LATER FILL-IN)
NSPMSG: .WORD 0 ;ADDRESS OF MESSAGE FOR NSP
NSPLB: .WORD 0 ;ADDRESS OF LINE BLOCK FOR DCP LINE
NSPMML: .WORD 0 ;MAXIMUM NSP DATA LENGTH
NSPFLG: .BYTE 0 ;FLAG BITS
NSPREA: .BYTE 0 ;STORAGE FOR REASON CODE
NSP.ST=B7 ;A ONE INDICATES WE ARE STRIPPING COUNT/TYPE FROM NCL DATA
NSPNCT: .BYTE 0 ;NCL NCT STORED HERE
NSPSRC: .BYTE 0 ;NSP SOURCE LINK ADDRESS
NSPDST: .BYTE 0 ;NSP DESTINATION LINK ADDRESS
NSPOPT: .BYTE 0 ;OPTIONAL DATA
.EVEN
.SBTTL 1.3 NSPRSS 0.0 12-MAY-76 -- START ON LINE
;***********************************************************************
;
; NSPRSS 0.0 12-MAY-76 -- START ON LINE
;
;***********************************************************************
; STACK LOOKS LIKE:
; 0 DDCMP RETURN ADDR
NSPRSS: ;HERE FROM DDCMP WHEN IT STARTS LINE
MOV LB.SCB(J),SB ;IS AN SCB ALREADY ATTACHED TO LINE?
BEQ 10$ ;NO, BRANCH
CLR LB.LCT(J) ;CLEAR LINK COUNT
CLR LB.LLE(J) ;CLEAR LAST POINTER ALSO
MOV LB.LKT(J),R0 ;GET CHUNK ADDRESS
BEQ 8$ ;IF NONE, DONE
JSR PC,FRECKS ;FREE CHUNKS
CLR LB.LKT(J) ;CLEAR POINTER TO LINK TABLE
8$: ;HERE WHEN DONE CLEANING OUT LINK TABLE
CLR LB.SCB(J) ;YES, DETACH IT
JSR PC,ROUTE ;RE-ROUTE WITH THIS STATION MISSING
JSR PC,SNDNGH ;TELL EVERYONE HE IS NOW GONE
10$:
JSR PC,MAKSCB ;FIND A FREE SCB
.IF NE,DGUTS
BCC 20$ ;CONTINUE IF SUCCESSFUL
30$:
BIC #LS.XRP!LS.NRP!LS.STK,(J);CLEAR ALL THE BITS DDCMP JUST SET
BIS #LS..ST,(J) ;MAKE LINE DO STARTS AGAIN
RTS PC ;AND RETURN TO TRY AGAIN LATER
20$:
.ENDC; NE,DGUTS
MOVB LB.NNM(J),R0 ;GET NODE NUMBER TO USE FOR LIST LINE
BIC #177400,R0 ;CLEAR HIGH ORDER BITS
MOV SB,-(SP) ;SAVE SCB ADDRESS
JSR PC,FNDSCB ;SEE IF A NODE WITH THIS NUMBER ALREADY EXISTS
BEQ 40$ ;NO, BRANCH; PHEW!
;HERE WHEN A NODE ALREADY EXISTS WITH THE NODE NUMBER ASSEMBLED FOR THIS DCP LINE
.IF NE,DGUTS
TWIDDLE ;COUNT HOW OFTEN IT HAPPENDS
BR 30$ ;AND GO BACK TO STARTING THE LINE
.IFF; NE,DGUTS
TRAP ;SOMEBODY GOOFED!
.ENDC; NE,DGUTS
40$: ;HERE IF NODE NUMBER OK
MOV (SP)+,SB ;GET BACK SCB ADDRESS
MOV SB,LB.SCB(J) ;POINT TO IT IN THE LINE BLOCK
MOV R0,SB.NNM(SB) ;SAVE NODE NUMBER IN THE SCB
SAVE <R0,R1,R2,R3> ;SAVE SOME REGISTERS
.IF NE,SNMSIZ ;IF LENGTH OF FIELD IS NOT ZERO
JSR PC,NSPCPY ;COPY STATION NAME
.WORD LB.SNM ;LINE BLOCK DISPLACEMENT
.WORD SB.SNM ;STATIONC CONTROL BLOCK DISPLACEMENT
.WORD SNMSIZ ;NUMBER OF BYTES TO COPY
.ENDC; NE,SNMSIZ
.IF NE,SIDSIZ ;IF FIELD LENGTH NOT ZERO
JSR PC,NSPCPY ;COPY STATION IDENTIFICATION TO SCB
.WORD LB.SID
.WORD SB.SID
.WORD SIDSIZ
.ENDC; NE,SIDSIZ
.IF NE,DATESZ ;IF FIELD LENGTH IS NOT ZERO
JSR PC,NSPCPY ;COPY DATA FROM LINE BLOCK TO SCB
.WORD LB.DAT
.WORD SB.DAT
.WORD DATESZ
.ENDC; NE,DATESZ
RESTOR <R3,R2,R1,R0> ;RESTORE THE REGISTERS
BIS #<SF.HID!SF.NSP!SBF.IC!SBF.IU!SBF.SQ>,(SB);SET BITS IN SCB: IN CONTACT, HAVE ID, IN USE, NSP LINE, AND SEQUENTIAL NODE
; MOV J,SB.LBA(SB) ;SAVE LINE FOR ROUTING
CLR LB.NSS(J) ;NO STATUS BITS YET
JSR PC,ADDSQN ;ADD A SEQUENTIAL NODE
JSR PC,ROUTE ;DO ROUTING
JSR PC,SNDNGH ;TELL EVERYONE ABOUT NEW NODE
RTS PC ;EXIT
.SBTTL 1.4 NSPOUT 0.0 10-MAY-76 -- SEND MSG TO NSP
;***********************************************************************
;
; NSPOUT 0.0 10-MAY-76 -- SEND MSG TO NSP
;
;***********************************************************************
; STACK LOOKS LIKE:
; 0 DDQDAT + ? (DDCMP RETURN)
; 2 #JRSTR
; 4 J VALUE
; 6 NCR.10 + ? (NCL RETURN)
; 10 SB VALUE
; REGISTERS
; R0 ADDRESS OF FIRST CHUNK OF NCL MESSAGE
; R2 THE CHARACTER SOH (DDCMP PUT IT THERE)
; SB CONTAINS DNA VALUE (I.E. THE DCP SCB)
; J CONTAINS LINE BLOCK FROM SB.LBA(SB)
NSPOUT: ;DO OUTPUT TO NSP
SAVE <R5,R4,R2,R0> ;SAVE SOME REGISTERS
; STACK LOOKS LIKE:
; 0 R0
; 2 R2
; 4 R4
; 6 R5
; 10 DDQDAT + ? (DDCMP RETURN)
; 12 #JRSTR
; 14 J VALUE
; 16 NCR.10 + ? (NCL RETURN)
; 20 SB VALUE
MOV J,NSPLB ;SAVE LINE BLOCK ADDRESS
MOV CN.NCT(R0),R1 ;GET NCT
MOVB R1,NSPNCT ;SAVE IT FOR LATER
BIC #^C7,R1 ;CLEAR ALL BUT MESSAGE TYPE
BNE NSPBAD ;IF NOT NUMBERED CONTROL OR DATA, BRANCH
MOV CN.CNT(R0),R2 ;RESTORE MESSAGE COUNT FOR NCL MESSAGE
JSR PC,GETEXN ;GET DLA
TST R0 ;TEST FOR ZERO
BEQ NSPOCM ;YES, SEND A CONTROL MESSAGE
BR NSPODM ;NO, MUST BE DATA
; NCL SHOULD NEVER SEND START/STACK/ACK/NAK/REP/NODEID
; TO A SEQUENTIAL NODE WITH HID ON. WE SHOULD NEVER GET HERE.
.SBTTL 1.4.1 NSPBAD 0.0 10-MAY-76 -- BAD MESSAGE
;***********************************************************************
;
; NSPBAD 0.0 10-MAY-76 -- BAD MESSAGE
;
;***********************************************************************
NSPBAD: ;NCL SENT A MESSAGE WE CANNOT HANDLE
.IF NE,DGUTS
TWIDDLE ;COUNT OCCURENCE
BR NSPOFL ;FLUSH MESSAGE
.IFF; NE,DGUTS
TRAP ;HALT
.ENDC; NE,DGUTS
;HERE TO DECREMENT NCL'S RECEIVED MESSAGE COUNT, SO THIS
; NUMBERED MESSAGE WILL EVENTUALLY APPEAR AGAIN.
NSPORT: ;CAUSE RETRANSMISSION (BY SENDER) OF MESSAGE
; STACK LOOKS LIKE:
; 0 R0
; 2 R2
; 4 R4
; 6 R5
; 10 DDQDAT + ? (DDCMP RETURN)
; 12 #JRSTR
; 14 J VALUE
; 16 NCR.10 + ? (NCL RETURN)
; 20 SB VALUE
MOV 20(SP),SB ;RESTORE WINDOW POINTER
DECB SB.RMN(SB) ;DE-COMMIT THIS MESSAGE
;HERE TO FLUSH A MESSAGE FROM NCL
.SBTTL 1.4.2 NSPOFL 0.0 10-MAY-76 -- FLUSH OUTPUT MESSAGE
;***********************************************************************
;
; NSPOFL 0.0 10-MAY-76 -- FLUSH OUTPUT MESSAGE
;
;***********************************************************************
NSPOFL: ;FLUSH OUTPUT MESSAGE
; STACK LOOKS LIKE:
; 0 R0
; 2 R2
; 4 R4
; 6 R5
; 10 DDQDAT + ? (DDCMP RETURN)
; 12 #JRSTR
; 14 J VALUE
; 16 NCR.10 + ? (NCL RETURN)
; 20 SB VALUE
MOV (SP)+,R0 ;RESTORE START OF NCL MESSAGE
JSR PC,NCLODN ;GIVE THE MESSAGE BACK TO NCL
MOV (SP)+,R2 ;RESTORE R2
.IF NE,FT.CHK
CMP R2,#SOH ;IT BETTER BE SOH
BEQ 10$ ;YES, BRANCH
TRAP ;NO, HALT
10$: ;HERE WHEN R2 CONTENTS OK
.ENDC; NE,FT.CHK
MOV (SP)+,R4 ;RESTORE R4
MOV (SP)+,R5 ;RESTORE R5
ADD #4,SP ;SKIP OVER DDCMP RETURN, AND #JRSTR
MOV (SP)+,J ;RESTORE J
RTS PC ;GO BACK TO NCL
.SBTTL 1.4.3 NSPODM 0.0 10-MAY-76 -- OUTPUT A DATA MESSAGE
;***********************************************************************
;
; NSPODM 0.0 10-MAY-76 -- OUTPUT A DATA MESSAGE
;
;***********************************************************************
; STACK LOOKS LIKE:
; 0 R0
; 2 R2
; 4 R4
; 6 R5
; 10 DDQDAT + ? (DDCMP RETURN)
; 12 #JRSTR
; 14 J VALUE
; 16 NCR.10 + ? (NCL RETURN)
; 20 SB VALUE
NSPODM: ;WRITE OUT A DATA MESSAGE
JSR PC,NSPFDL ;FIND DLA (RETURNS LINK ENTRY POINTER IN R1)
BEQ NSPBAD ;DATA MESSAGE WHEN NO LINK?
MOVB LE.NSP(R1),NSPDST ;SAVE DESTINATION LINK ADDRESS
MOVB LE.CON(R1),NSPSRC ;SAVE SOURCE LINK ADDRESS
MOV LB.MML(J),NSPMML ;GET MAX MESSAGE LENGTH
JSR PC,NSPFST ;SET STRIP BIT IN NSPFLG
JSR PC,NSPBMG ;START OUTPUT MESSAGE
CLR R0 ;MAKE MSGFLG FIELD
BITB #NCFINT,NSPNCT ;WAS NCL MESSAGE AN INTERRUPT MESSAGE?
BEQ 10$ ;NO, CONTINUE
BIS #NSPINT,R0 ;SET INTERRUPT BIT IN MSFLG
MOV #11.,NSPMML ;SHORTEN MAX DATA LENGTH
10$: ;MSGFLG IN R0
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOVB NSPDST,R0 ;GET DESTINATION LINK ADDRESS
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOVB NSPSRC,R0 ;GET SOURCE LINK ADDRESS
JSR PC,NSPPBY ;PUT INTO MESSAGE
CLR NSPCNT ;CLEAR COUNTER (FOR STRIPPING)
20$: ;DATA COPYING LOOP
TST R2 ;ANY MORE DATA IN NCL MESSAGE?
BEQ NSPOQU ;NO, BRANCH WHEN DONE
BITB #NSP.ST,NSPFLG ;ARE WE STRIPPING COUNT AND TYPE FIELDS?
BEQ 25$ ;NO, CONTINUE
TST NSPCNT ;CHECK COUNT OF SUB-MESSAGE
BNE 25$ ;IF MORE TO GO, BRANCH
JSR PC,GETEXN ;GET NEXT COUNT FIELD
DEC R0 ;SUBTRACT ONE FOR TYPE BYTE
MOV R0,NSPCNT ;SAVE COUNT
JSR PC,GETBYT ;THROW AWAY TYPE
BR 20$ ;AND TRY AGAIN (IN CASE NO DATA)
25$: ;HERE FOR REAL DATA BYTE
CMP R4,NSPMML ;HAVE WE PUT ENOUGH INTO NSP MESSAGE YET?
BHIS NSPOVF ;YES, HANDLE MESSAGE OVERFLOW
JSR PC,GETBYT ;GET DATA BYTE
DEC NSPCNT ;DECREMENT SUB-MESSAGE BYTE COUNTER
JSR PC,NSPPBY ;STORE BYTE IN NSP MESSAGE
BCS NSPOFF ;IF NO MORE ROOM, BRANCH
BR 20$ ;CONTINUE LOOPING ON DATA
.SBTTL 1.4.4 NSPOQU 0.0 12-MAY-76 -- QUEUE OUTPUT TO DDCMP
;***********************************************************************
;
; NSPOQU 0.0 12-MAY-76 -- QUEUE OUTPUT TO DDCMP
;
;***********************************************************************
NSPOQU: ;HERE WHEN DONE COPYING DATA INTO NSP MESSAGE
MOV NSPMSG,R0 ;POINT TO BEGINNING OF MESSAGE
MOV R4,CN.LEN(R0) ;STORE LENGTH IN 1ST CHUNK
MOV (SP)+,R0 ;GET NCL MESSAGE START BACK
JSR PC,NCLODN ;GIVE IT BACK TO NCL (HE WILL THROW AWAY UNLESS FROM SEQUENTIAL NODE)
MOV (SP)+,R2 ;RESTORE R2
.IF NE,FT.CHK
CMP #SOH,R2 ;MAKE SURE IT'S GOOD
BEQ 36$ ;OK, CONTINUE
TRAP ;PROGRAMMING ERROR
36$: ;HERE AFTER R2 CHECKED
.ENDC; NE,FT.CHK
MOV (SP)+,R4 ;RESTORE R4
MOV (SP)+,R5 ;RESTORE R5
MOV NSPMSG,R0 ;POINT TO NEW MESSAGE
RTS PC ;RETURN TO DDCMP
NSPOVF: ;HERE WHEN MESSAGE OVERFLOWS NSP MAX DATA LENGTH
TRAP
NSPOFF: ;HERE WHEN WE RUN OUT OF CHUNKS BUILDING MESSAGE
MOV NSPMSG,R0 ;GET START OF MESSAGE
JSR PC,FRECKS ;FREE THE CHUNKS
JMP NSPORT ;GET MESSAGE RETRANSMITTED LATER
.SBTTL 1.4.5 NSPOCM 0.0 17-MAY-76 -- OUTPUT A CONTROL MESSAGE
;***********************************************************************
;
; NSPOCM 0.0 17-MAY-76 -- OUTPUT A CONTROL MESSAGE
;
;***********************************************************************
NSPOCM: ;SEND A CONTROL MESSAGE TO NSP
; STACK LOOKS LIKE:
; 0 R0
; 2 R2
; 4 R4
; 6 R5
; 10 DDQDAT + ? (DDCMP RETURN)
; 12 #JRSTR
; 14 J VALUE
; 16 NCR.10 + ? (NCL RETURN)
; 20 SB VALUE
; REGISTERS:
;
; R2 CONTAINS COUNT FOR NCL MESSAGE
; R3 CONTAINS BYTE POINTER FOR NCL MESSAGE (AFTER DLA)
; J CONTAINS LINE BLOCK ADDRESS ON ENTRY
; SB CONTAINS SCB FOR DCP ON ENTRY
;
; USAGE
;
; R1 POINTER TO LINK ENTRY
; R4 COUNT FOR OUTPUT MESSAGE
; R5 BYTE POINTER FOR OUTPUT MESSAGE
JSR PC,GETEXN ;GET COUNT
DEC R0 ;SUBTRACT ONE FOR TYPE
MOV R0,NSPCNT ;SAVE IT FOR LATER
JSR PC,GETBYT ;GET TYPE
CMP R0,#1 ;CONNECT?
BEQ NSPOCN ;YES, SEND CONNECT
CMP R0,#2 ;DISCONNECT?
BNE .+6 ;SKIP AROUND JMP
JMP NSPODC ;SEND DISCONNECT MESSAGE OR DUMMY DATA
CMP R0,#4 ;REQUEST CONFIGURATION?
BNE 10$ ;NO, CONTINUE LOOKING
BIS #NS.CNF,LB.NSS(J) ;YES, SET NEED TO SEND CONFIG BIT
JSR PC,NSPQ ;WAKE NSP LOW LEVEL
BR 20$ ;AND FLUSH MESSAGE
10$: ;HERE IF NOT REQUEST CONFIGURATION
CMP R0,#6 ;DATA REQUEST?
BNE 20$ ;SKIP AROUND JUMP
JMP NSPOLS ;SEND LINK STATUS MESSAGE
20$: ;HERE TO SEE IF NEIGHBORS MESSAGE
CMP R0,#3 ;IS IT NEIGHBORS?
BNE 30$ ;NO, FLUSH IT
22$: ;YES, HAVE TO CHECK IF OUR BUDDY DISAPPEARED
TST R2 ;ANY MORE LEFT IN MESSAGE?
BEQ 25$ ;NO, HE WENT AWAY
JSR PC,GETEXN ;GET NODE NUMBER
CMPB R0,LB.DNA(J) ;IS IT OUR FRIEND?
BEQ 30$ ;YES, FLUSH REST OF MESSAGE
JSR PC,GETBYT ;GET LINK LVL TO THROW AWAY
BR 22$ ;KEEP LOOKING
25$: ;HERE WHEN OUR PARTNER HAS DISAPPEARED
TST LB.LCT(J) ;ANY LINKS?
BEQ 30$ ;NO, DOESN'T MATTER
BIS #LS..ST,@J ;YES, RESTART LINE SO HE KNOWS
;HERE IF A CONTROL TYPE SENT WHICH SHOULD BE IGNORED (LIKE CONFIGURATION)
30$: ;FLUSH MESSAGE
JMP NSPOFL ;FLUSH MESSAGE
.SBTTL 1.4.6 NSPOCN 0.0 12-MAY-76 -- SEND A CONNECT MESSAGE
;***********************************************************************
;
; NSPOCN 0.0 12-MAY-76 -- SEND A CONNECT MESSAGE
;
;***********************************************************************
NSPOCN: ;SEND A CONNECT MESSAGE
; STACK LOOKS LIKE:
; 0 R0
; 2 R2
; 4 R4
; 6 R5
; 10 DDQDAT + ? (DDCMP RETURN)
; 12 #JRSTR
; 14 J VALUE
; 16 NCR.10 + ? (NCL RETURN)
; 20 SB VALUE
; REGISTERS:
;
; R2 CONTAINS COUNT FOR NCL MESSAGE
; R3 CONTAINS BYTE POINTER FOR NCL MESSAGE (AFTER DLA)
; J CONTAINS LINE BLOCK ADDRESS ON ENTRY
; SB CONTAINS SCB FOR DCP ON ENTRY
;
; USAGE
;
; R1 POINTER TO LINK ENTRY
; R4 COUNT FOR OUTPUT MESSAGE
; R5 BYTE POINTER FOR OUTPUT MESSAGE
JSR PC,NSPBMG ;START A MESSAGE
MOV #NSPCM,R0 ;MSGFLG WITH CM BIT
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOV #1,R0 ;TYPE FOR CONNECT MESSAGE
JSR PC,NSPPBY ;STORE IN MESSAGE
JSR PC,GETEXN ;GET DLA
TST R0 ;CHECK FOR ZERO (I.E. INITIATE)
BNE NSPCNC ;NO, MUST BE CONFIRM; BRANCH
JSR PC,GETEXN ;GET SLA
JSR PC,NSPCLE ;CREATE A LINK ENTRY (R1 CONTAINS ADDRESS)
MOV R0,LE.NCL(R1) ;PUT NCL ADDRESS INTO IT
JSR PC,NSPBCO ;BUILD ONE-BYTE LINK FOR NSP
CLR R0 ;SUB-TYPE (INITIATE)
JSR PC,NSPPBY ;STORE IN MESSAGE
MOVB LE.NSP(R1),R0 ;GET DESTADDR
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOVB LE.CON(R1),R0 ;GET SRCADDR
JSR PC,NSPPBY ;PUT INTO MESSAGE
JSR PC,GETBYT ;GET OBJECT TYPE
CMP #11,R0 ;TASK?
BEQ 40$ ;YES, GO COPY IN NAME
MOV R0,-(SP) ;SAVE OBJECT TYPE FOR LATER
CLR R0 ;OBJECT TYPE FOR TASK
JSR PC,NSPPBY ;PUT INTO MESSAGE
BIS #LES.DV,LE.STS(R1) ;SET DEVICE BIT IN LINK ENTRY
MOV #'O!200,R0 ;PUT TASK NAME OBJOON INTO MESSAGE
;WHERE "OO" IS OBJECT TYPE, "N" IS NUMBER
JSR PC,NSPPBY ;PUT "O" INTO MESSAGE
MOV #'B!200,R0 ;GET "B"
JSR PC,NSPPBY ;PUT "B" INTO MESSAGE
MOV #'J!200,R0 ;GET "J"
JSR PC,NSPPBY ;PUT "J" INTO MESSAGE
MOV (SP),R0 ;GET OBJECT TYPE
ROR R0 ;SHIFT
ROR R0 ; SECOND DIGIT
ROR R0 ; TO CORRECT PLACE
BIC #177770,R0 ;CLEAR EXTRA BITS
ADD #260,R0 ;MAKE INTO EXTENDED ^^ASCII\\ NUMBER
JSR PC,NSPPBY ;PUT 1ST DIGIT OF OBJECT TYPE INTO NAME
MOV (SP)+,R0 ;GET OBJECT TYPE BACK
BIC #177770,R0 ;CLEAR EXTRANEOUS BITS
ADD #260,R0 ;MAKE INTO NUMBER
JSR PC,NSPPBY ;STORE IN MESSAGE
JSR PC,GETBYT ;GET UNIT NUMBER
BIC #177770,R0 ;CLEAR EXTRA
ADD #60,R0 ;MAKE INTO NUMBER
JSR PC,NSPPBY ;PUT UNIT NUMBER INTO MESSAGE
CLR R0 ;ZERO
JSR PC,NSPPBY ; GROUP
JSR PC,NSPPBY ; AND USER
BR 43$ ;CONTINUE
40$: ;HERE WHEN DESTINATION IS TASK
JSR PC,NSPEXC ;COPY TASK NAME AND PUT 0 GROUP AND USER ON
43$: ;HERE FOR SECOND NAME
JSR PC,GETBYT ;GET SOURCE OBJECT TYPE (TO THROW AWAY)
JSR PC,NSPEXC ;COPY REST OF SOURCE
BIT #LES.DV,LE.STS(R1) ;WAS THIS A DEVICE?
BEQ 47$ ;NO, DON'T PUT OPTIONAL DATA IN
45$: ;HERE TO PROCESS MML AND FEA FIELDS
JSR PC,GETEXN ;PROCESS MML FIELD (TO SKIP OVER IT)
46$: ;LOOP FOR COPYING FEATURES
TST R2 ;ANY MORE LEFT IN MESSAGE?
BEQ 47$ ;NO, STOP
JSR PC,GETBYT ;GET NEXT BYTE
JSR PC,NSPPBY ;PUT INTO OPTIONAL DATA
BR 46$ ;CONTINUE LOOKING
47$: ;HERE WHEN DONE BUILDING NSP CONNECT
JMP NSPOQU ;QUEUE IT TO DDCMP
NSPCNC: ;HERE TO HANDLE CONNECT CONFIRM
JSR PC,NSPFDL ;FIND LINK ENTRY FROM DLA
JSR PC,GETEXN ;GET SLA
MOV R0,LE.NCL(R1) ;SAVE IN LINK ENTRY TABLE
JSR PC,NSPBCO ;MAKE A UNIQUE ADDRESS TO USE FOR NSP
MOV #1,R0 ;CODE FOR CONFIRM
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOVB LE.NSP(R1),R0 ;DESTADDR
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOVB LE.CON(R1),R0 ;SRCADDR
JSR PC,NSPPBY ;PUT INTO MESSAGE
JSR PC,GETBYT ;GET OBJECT TYPE
CMP R0,#11 ;SHOULD BE TASK
BEQ 55$ ;YES, CONTINUE
TRAP ;BAD!!!!
55$: ;HERE IF OBJECT TYPE OK
JSR PC,NSPEXC ;COPY PROCESS NAME
JSR PC,GETBYT ;GET SOURCE OBJECT TYPE
CMP R0,#11 ;IS IT TASK?
BNE 56$ ;NO, HANDLE DEVICE CASE
JSR PC,NSPEXC ;YES, COPY IT
BR 57$ ;CONTINUE
56$: ;HERE TO HANDLE NON-TASK SRCNAME
JSR PC,NSPPBY ;PUT OBJECT TYPE
JSR PC,GETBYT ;GET UNIT
JSR PC,NSPPBY ;PUT IT INTO MESSAGE AS WELL
57$: ;HERE WHEN DONE WITH CONNECT CONFIRM
JMP NSPOQU ;GO QUEUE IT TO DDCMP
.SBTTL 1.4.7 NSPODC 0.0 12-MAY-76 -- SEND DISCONNECT
;***********************************************************************
;
; NSPODC 0.0 12-MAY-76 -- SEND DISCONNECT
;
;***********************************************************************
NSPODC: ;
; STACK LOOKS LIKE:
; 0 R0
; 2 R2
; 4 R4
; 6 R5
; 10 DDQDAT + ? (DDCMP RETURN)
; 12 #JRSTR
; 14 J VALUE
; 16 NCR.10 + ? (NCL RETURN)
; 20 SB VALUE
; REGISTERS:
;
; R2 CONTAINS COUNT FOR NCL MESSAGE
; R3 CONTAINS BYTE POINTER FOR NCL MESSAGE (AFTER DLA)
; J CONTAINS LINE BLOCK ADDRESS ON ENTRY
; SB CONTAINS SCB FOR DCP ON ENTRY
;
; USAGE
;
; R1 POINTER TO LINK ENTRY
; R4 COUNT FOR OUTPUT MESSAGE
; R5 BYTE POINTER FOR OUTPUT MESSAGE
JSR PC,NSPBMG ;START MESSAGE
JSR PC,GETEXN ;GET DLA
JSR PC,NSPFDL ;FIND LINK ENTRY FOR IT
BITB #LES.DV,LE.STS(R1) ;IS THIS A DEVICE?
BNE NSPODD ;YES, DO SPECIAL HANDLING
NSPOD1: ;START OF DISCONNECT MESSAGE
MOV #NSPCM,R0 ;MSGFLG WITH CM BIT ON
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOV #2,R0 ;TYPE FOR DISCONNECT
JSR PC,NSPPBY ;PUT INTO MESSAGE
JSR PC,GETEXN ;GET SLA
MOV LE.NCL(R1),R0 ;
MOV #4,-(SP) ;ASSUME INITIATE SUB-TYPE
TST R0 ;WAS SLA 0?
BNE 12$ ;NO, OUR ASSUMPTION WAS GOOD
MOV #33,(SP) ;ASSUME REJECT SUBTYPE
BR 13$ ;AND CONTINUE
12$: ;HERE TO TEST FOR POSSIBLILITY OF DISCONNECT CONFIRM
BITB #LES.WD,LE.STS(R1) ;WERE WE WAITING FOR DISCONNECT CONFIRM
BEQ 13$ ;NO, WE WERE RIGHT BEFORE
MOV #5,(SP) ;YES, SO IT SHOULD BE DISCONNECT CONFIRM
13$: ;HERE WHEN WE HAVE DECIDED TYPE OF DISCONNECT
MOVB (SP),R0 ;GET SUBTYPE AND REASON
JSR PC,NSPPBY ;STORE IN MESSAGE
JSR PC,GETBYT ;GET REASON (THROW IT AWAY)
MOVB LE.NSP(R1),R0 ;GET DESTADDR
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOVB LE.CON(R1),R0 ;GET SRCADDR
JSR PC,NSPPBY ;PUT INTO MESSAGE
CMP (SP)+,#4 ;WAS IT INITIATE?
BEQ 15$ ;YES, BRANCH
JSR PC,NSPDLE ;NO, DELETE LINK ENTRY
14$: ;HERE TO QUEUE MESSAGE OUT
JMP NSPOQU ;SEND IT TO DDCMP
15$: ;HERE WHEN DISCONNECT INITIATE
BISB #LES.WD,LE.STS(R1) ;SET WAITING FOR DISCONNECT CONFIRM BIT
BR 14$ ;GO QUEUE MESSAGE
.SBTTL 1.4.10 NSPODD 0.0 02-JUN-76 -- OUTPUT DUMMY DISCONNECT
;***********************************************************************
;
; NSPODD 0.0 02-JUN-76 -- OUTPUT DUMMY DISCONNECT
;
;***********************************************************************
NSPODD: ;FOR DEVICES, SEND DATA MESSAGE WITH NO DATA INSTEAD OF DISCONNECT
; STACK LOOKS LIKE:
; 0 R0
; 2 R2
; 4 R4
; 6 R5
; 10 DDQDAT + ? (DDCMP RETURN)
; 12 #JRSTR
; 14 J VALUE
; 16 NCR.10 + ? (NCL RETURN)
; 20 SB VALUE
TST LE.NCL(R1) ;IS SOURCE NOT DEFINED?
BEQ NSPOD1 ;YES, SEND REGULAR DISCONNECT REJECT
BISB #LES.WD,LE.STS(R1) ;SHOW WE ARE WAITING
MOV #NSPINT,R0 ;MSGFLG FOR INTERRUPT DATA MESSAGE
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOVB LE.NSP(R1),R0 ;DESTADDR
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOVB LE.CON(R1),R0 ;SRCADDR
JSR PC,NSPPBY ;PUT INTO MESSAGE
JSR PC,NSPFST ;SET STRIP BIT IF STRIPPING DESIRED
BITB #NSP.ST,NSPFLG ;ARE WE STRIPPING?
BNE 10$ ;YES, LEAVE OFF COUNT AND TYPE
MOV #1,R0 ;COUNT = 1
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOV #2,R0 ;TYPE = DATA WITH EOR
JSR PC,NSPPBY ;PUT INTO MESSAGE
10$: ;HERE WHEN DONE CONSTRUCTING DUMMY MESSAGE
JMP NSPOQU ;SEND MESSAGE OUT
.SBTTL 1.4.11 NSPOLS 0.0 12-MAY-76 -- SEND LINK STATUS
;***********************************************************************
;
; NSPOLS 0.0 12-MAY-76 -- SEND LINK STATUS
;
;***********************************************************************
NSPOLS: ;SEND A LINK STATUS FOR DATA REQUESTS
; STACK LOOKS LIKE:
; 0 R0
; 2 R2
; 4 R4
; 6 R5
; 10 DDQDAT + ? (DDCMP RETURN)
; 12 #JRSTR
; 14 J VALUE
; 16 NCR.10 + ? (NCL RETURN)
; 20 SB VALUE
; REGISTERS:
;
; R2 CONTAINS COUNT FOR NCL MESSAGE
; R3 CONTAINS BYTE POINTER FOR NCL MESSAGE (AFTER DLA)
; J CONTAINS LINE BLOCK ADDRESS ON ENTRY
; SB CONTAINS SCB FOR DCP ON ENTRY
;
; USAGE
;
; R1 POINTER TO LINK ENTRY
; R4 COUNT FOR OUTPUT MESSAGE
; R5 BYTE POINTER FOR OUTPUT MESSAGE
JSR PC,GETEXN ;GET DLA
JSR PC,NSPFDL ;FIND LINK ENTRY
JSR PC,GETEXN ;GET DATA REQUEST COUNT
MOV R0,-(SP) ;SAVE DATA REQUEST COUNT
JSR PC,NSPBMG ;START MESSAGE
MOV #NSPCM,R0 ;MSGFLG WITH CM BIT ON
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOV #3,R0 ;TYPE IS LINK STATUS
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOVB LE.NSP(R1),R0 ;DESTADDR
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOVB LE.CON(R1),R0 ;SRCADDR
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOVB (SP)+,R0 ;GET REQUEST COUNT
JSR PC,NSPPBY ;PUT INTO MESSAGE
JMP NSPOQU ;QUEUE MESSAGE OUT
.SBTTL 1.5 NSPINP 0.0 15-MAY-76 -- NSP INPUT ROUTINES
;***********************************************************************
;
; NSPINP 0.0 15-MAY-76 -- NSP INPUT ROUTINES
;
;***********************************************************************
NSPINP: ;HERE WHEN WE RECEIVE NSP MESSAGE
; REGISTERS
;
; R0 POINTER TO FIRST CHUNK OF MESSAGE
; J POINTER TO LINE BLOCK FOR DCP
; STACK LOOKS LIKE:
; 0 RETURN TO DDCMP
MOV J,NSPLB ;SAVE POINTER TO LINE BLOCK
MOV R0,-(SP) ;SAVE START OF MESSAGE
; STACK LOOKS LIKE:
; 0 START OF MESSAGE (R0)
; 2 RETURN TO DDCMP
MOV CN.LEN(R0),R2 ;GET LENGTH
MOV R0,R3 ;POINT TO FIRST CHUNK
ADD #CN.NCT,R3 ;NOW MAKE THAT FIRST DATA
JSR PC,NSPBMG ;START A MESSAGE
CLRB NSPNCT ;ZERO NCT
JSR PC,GETBYT ;GET NCT
BIT #NSPCM,R0 ;WAS THIS A CONTROL MESSAGE?
BNE NSPICM ;YES, HANDLE CONTROL MESSAGE
BIT #NSPINT,R0 ;WAS THIS INTERRUPT MESSAGE?
BEQ 10$ ;NO, CONTINUE
BISB #NCFINT,NSPNCT ;YES, SET INTERRUPT BIT IN NCT
10$: ;
JSR PC,NSPBNC ;PUT NCL HEADER IN MESSAGE
JSR PC,GETEXN ;GET DESTADDR
JSR PC,NSPFDA ;FIND IT
JSR PC,GETEXN ;GET SR(CADDR
CMPB LE.NSP(R1),R0 ;COMPARE WITH LINK ENTRY
BEQ 15$ ;BRANCH IF EQUAL
TRAP ;ERROR SOMEWHERE!
15$: ;HERE TO PUT DLA INTO NCL MESSAGE
MOV LE.NCL(R1),R0 ;GET DLA
JSR PC,NSPPEX ;PUT INTO MESSAGE
JSR PC,NSPFST ;SET STRIP BIT
BIT #NSP.ST,NSPFLG ;ARE WE STRIPPING?
BEQ 20$ ;NO, JUST COPY DATA
MOV R2,R0 ;GET LENGTH
INC R0 ;AUGMENT FOR TYPE
JSR PC,NSPPEX ;STORE COUNT
MOV #2,R0 ;TYPE IS DATA [mco 9695]
JSR PC,NSPPBY ;STORE TYPE
20$: ;HERE TO COPY DATA BYTES
TST R2 ;ANY MORE TO COPY?
BEQ 30$ ;NO, FINISH UP
JSR PC,GETBYT ;GET NEXT BYTE
JSR PC,NSPPBY ;PUT INTO MESSAGE
BR 20$ ;KEEP LOOKING FOR DATA
30$: ;HERE TO PUT LENGTH INTO MESSAGE
MOV NSPMSG,R0 ;PUT TO FIRST CHUNK OF NCL MESSAGE
MOV R4,CN.LEN(R0) ;PUT COUNT INTO APPROPRIATE PLACE
BR NSPNCL
NSPNCL: ;HERE WHEN DONE BUILDING DATA MESSAGE
MOV (SP)+,R0 ;GET START OF NCL MESSAGE
JSR PC,FRECKS ;FREE ITS CHUNKS
MOV NSPMSG,R0 ;GET START OF NCL MESSAGE
PJMP NCLIN1 ;PASS IT TO NCL [mco 9696]
.SBTTL 1.5.1 NSPICM 0.0 15-MAY-76 -- RECEIVED NSP CONTROL MSG
;***********************************************************************
;
; NSPICM 0.0 15-MAY-76 -- RECEIVED NSP CONTROL MSG
;
;***********************************************************************
NSPICM: ;HERE TO HANDLE NSP CONTROL MESSAGE
JSR PC,GETBYT ;GET MESSAGE TYPE
CMP R0,#4 ;IS IT BIGGER THAN MAX?
BGT 20$ ;YES, ERROR BRANCH
ASL R0 ;SHIFT LEFT FOR DISPATCH
JMP @10$(R0) ;GO TO RIGHT ROUTINE
10$: ;DISPATCH TABLE FOR MESSAGE TYPES
.WORD 20$ ;0 SHOULDN'T HAPPEN
.WORD NSPICN ;WHERE TO GO FOR CONNECT
.WORD NSPIDC ;DISCONNECT
.WORD NSPILS ;LINK STATUS
.WORD NSPIER ;ERROR
20$: ;HERE WHEN ILLEGAL MESSAGE TYPE IS FOUND
TRAP ;BUT IT CAN'T BE ANYTHING ELSE!
.SBTTL 1.5.2 NSPICN 0.0 15-MAY-76 -- NSP CONNECT MESSAGE
;***********************************************************************
;
; NSPICN 0.0 15-MAY-76 -- NSP CONNECT MESSAGE
;
;***********************************************************************
NSPICN: ;HERE TO PROCESS CONNECT MESSAGE
JSR PC,GETBYT ;GET SUB-TYPE
CMP R0,#2 ;IS IT GREATER THAN MAX?
BGT 20$ ;YES, BRANCH ON ERROR
ASL R0 ;SHIFT FOR DISPATCH
JMP @10$(R0) ;GO TO PROPER ROUTINE
10$: ;DISPATCH TABLE FOR CONNECT SUB-TYPES
.WORD NSPICI ;CONNECT INITIATE
.WORD NSPICC ;CONNECT CONFIRM
.WORD NSPLMB ;CONNECT REJECT IS LIKE DISCONNECT REJECT
20$: ;HERE IF BAD CONNECT SUB-TYPE
TRAP ;WHAT ELSE?
.SBTTL 1.5.3 NSPICI 0.0 15-MAY-76 -- NSP CONNECT INITIATE
;***********************************************************************
;
; NSPICI 0.0 15-MAY-76 -- NSP CONNECT INITIATE
;
;***********************************************************************
NSPICI: ;HERE ON CONNECT INITIATE
JSR PC,GETBYT ;GET DESTADDR
TST R0 ;CHECK RESULTS
BEQ 5$ ;BETTER NOT BE ANY
TRAP ;BAD CONNECT INITIATE MESSAGE
5$: ;HERE IF DESTADDR OK
JSR PC,GETBYT ;GET SRCADDR
JSR PC,NSPFDA ;SEARCH FOR IT IN LINK TABLE
BEQ 10$ ;BETTER NOT BE THERE!
TRAP ;WE HAVE THIS LINK ALREADY.
10$: ;HERE IF SRCADDR IS KOSHER
JSR PC,NSPCLE ;CREATE A LINK TABLE ENTRY
MOVB R0,LE.NSP(R1) ;STORE NSP LINK ADDRESS
JSR PC,NSPBNC ;PUT NCL HEADER INTO MESSAGE
JSR PC,NSPPBY ;PUT 0 DLA
MOV R5,NSPCNT ;SAVE POINTER TO COUNT
JSR PC,NSPPEX ;2-BYTE COUNT (TO BE FILLED IN LATER)
MOV R4,NSPCVL ;SAVE CURRENT COUNT VALUE
MOV #1,R0 ;CONNECT TYPE
JSR PC,NSPPBY ;PUT INTO MESSAGE
CLR R0 ;DLA IS ZERO
JSR PC,NSPPBY ;PUT INTO MESSAGE
NSPIC1: ;COMMON CODE FOR INITIATE AND CONFIRM
MOVB LE.NSP(R1),R0 ;GET SLA
JSR PC,NSPPBY ;PUT INTO MESSAGE
JSR PC,GETBYT ;GET DESTINATION OBJECT TYPE
TST R0 ;SEE IF IT IS TASK
BNE 20$ ;NO, PUT IT INTO MESSAGE
MOV #11,R0 ;YES, PUT TASK NCL OBJECT TYPE
20$: ;PUT DEST OBJ TYPE INTO MESSAGE
JSR PC,NSPPBY ;PUT DEST OBJ TYPE INTO MESSAGE
30$: JSR PC,GETBYT ;GET PID BYTE
JSR PC,NSPPBY ;PUT INTO MESSAGE
BIT #200,R0 ;WAS THAT LAST?
BNE 30$ ;NO, CONTINUE
JSR PC,GETEXN ;THROW AWAY GROUP
JSR PC,GETEXN ;AND USER
JSR PC,GETBYT ;GET SOURCE OBJECT TYPE
TST R0 ;CHECK IF TASK
BNE 40$ ;NO, CONTINUE
BIT #LES.DV,LE.STS(R1) ;IS THIS DEVICE ? (CONFIRM ONLY)
BEQ 35$ ;NO, PROCEED NORMALLY
JSR PC,GETBYT ;YES, GET "O"
JSR PC,GETBYT ;GET "B"
JSR PC,GETBYT ;GET "J"
JSR PC,GETBYT ;GET HIGH ORDER DIGIT OF OBJECT TYPE
BIC #177770,R0 ;CLEAR EXTRA BITS
ROL R0 ;SHIFT
ROL R0 ; INTO CORRECT
ROL R0 ; POSITION
MOV R0,-(SP) ;SAVE FOR LATER
JSR PC,GETBYT ;GET LOW ORDER DIGIT OF OBJECT TYPE
BIC #177770,R0 ;CLEAR EXTRA BITS
ADD (SP)+,R0 ;MAKE OBJECT TYP
JSR PC,NSPPBY ;PUT INTO MESSAGE
JSR PC,GETBYT ;GET UNIT NUMBER
BIC #177770,R0 ;CLEAR EXTRA BITS
JSR PC,NSPPBY ;PUT UNIT NUMBER INTO MESSAGE
BR 42$ ;GO THROW AWAY GROUP AND USER
35$: ;HERE IF IT REALLY WAS A TASK
MOV #11,R0 ;NCL OBJECT TYPE FOR TASK
40$: ;HERE IF SOURCE OBJ TYPE IS GOOD
JSR PC,NSPPBY ;PUT INTO MESSAGE
41$: ;LOOP TO COPY PID EXTENSIBLE STRING
JSR PC,GETBYT ;GET NEXT BYTE
JSR PC,NSPPBY ;PUT INTO MESSAGE
BIT #200,R0 ;WAS THAT LAST?
BNE 41$ ;NO, KEEP GOING
42$: ;HERE TO FLUSH GROUP AND USER
JSR PC,GETEXN ;YES, GET GROUP
JSR PC,GETEXN ;AND USER (FOR WASTEBASKET)
MOV J,-(SP) ;SAVE J
MOV NSPLB,J ;GET LINE BLOCK ADDRESS
MOV LB.MML(J),R0 ;GET MAXIMUM MESSAGE LENGTH FOR LINE
MOV (SP)+,J ;RESTORE J
JSR PC,NSPPEX ;PUT INTO MESSAGE
50$: ;LOOP PUTTING IN OPTIONAL DATA
TST R2 ;ANY MORE IN SOURCE MESSAGE
BEQ NSPICX ;NO, EXIT
JSR PC,GETBYT ;GET NEXT BYTE
JSR PC,NSPPBY ;COPY INTO TARGET MESSAGE
BR 50$ ;AND KEEP LOOKING
NSPICX: ;HERE WHEN DONE BUILDING NCL MESSAGE
MOV NSPMSG,R0 ;PUT TO START OF MESSAGE
MOV R4,CN.LEN(R0) ;PUT COUNT INTO CHUNK
SUB NSPCVL,R4 ;GET COUNT FOR NCL
MOV R4,R0 ;COPY INTO CORRECT REGISTER
MOV NSPCNT,R5 ;PUT POINTER BACK
JSR PC,NSPPEX ;2-BYTE COUNT INTO MESSAGE
JMP NSPNCL ;GIVE MESSAGE TO NCL
.SBTTL 1.5.4 NSPICC 0.0 15-MAY-76 -- NSP CONNECT CONFIRM
;***********************************************************************
;
; NSPICC 0.0 15-MAY-76 -- NSP CONNECT CONFIRM
;
;***********************************************************************
NSPICC: ;HERE WHEN WE RECEIVE AN NSP CONNECT CONFIRM
JSR PC,GETBYT ;GET DESTADDR
BEQ 10$ ;ERROR IF ZERO
JSR PC,NSPFDA ;FIND LINK IN TABLE
BEQ 10$ ;ERROR IF NOT THERE
JSR PC,GETBYT ;GET SRCADDR
MOVB R0,LE.NSP(R1) ;SAVE IT IN LINK TABLE
CLRB NSPNCT ;INITIALIZE NCT
JSR PC,NSPBNC ;START MESSAGE
JSR PC,NSPPBY ;DLA OF 0
MOV R5,NSPCNT ;SAVE POINTER FOR COUNT
JSR PC,NSPPEX ;PUT A ZERO COUNT FOR NOW
MOV R4,NSPCVL ;SAVE COUNT ALSO
MOV #1,R0 ;CONNECT TYPE
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOV LE.NCL(R1),R0 ;GET DLA
JSR PC,NSPPEX ;PUT INTO MESSAGE
BIS #LES.SL,LE.STS(R1) ;INDICATE WE NEED TO SEND LINK STATUS
JSR PC,NSPQ ;QUEUE LINE BLOCK
JMP NSPIC1 ;AND CONTINUE
10$: ;HERE ON ERROR
TRAP ;PROTOCOL ERROR
.SBTTL 1.5.5 NSPIDC 0.0 17-MAY-76 -- NSP DISCONNECT
;***********************************************************************
;
; NSPIDC 0.0 17-MAY-76 -- NSP DISCONNECT
;
;***********************************************************************
NSPIDC: ;HERE WHEN WE RECEIVE NSP DISCONNECT
JSR PC,GETBYT ;GET SUB-TYPE
MOVB R0,NSPREA ;SAVE FOR REASON
JSR PC,GETBYT ;GET DESTADDR
MOVB R0,NSPDST ;SAVE IT
JSR PC,NSPFDA ;FIND LINK TABLE ENTRY
BNE 9$ ;IF THERE, CONTINUE
JMP NSPIBD ;ELSE, FLUSH MESSAGE
9$: ;HERE WHEN LINK TABLE ENTRY FOUND
JSR PC,GETBYT ;GET SRCADDR
MOVB R0,NSPSRC ;SAVE FOR LATER
MOVB NSPREA,R0 ;GET BACK SUB-TYPE AND REASON
BIC #177770,R0 ;MASK OUT REASON
SUB #3,R0 ;MAKE ZERO ORIGIN
BMI 20$ ;IF NEGATIVE, CODE WAS TOO LOW
CMP R0,#3 ;SEE IF TOO HIGH
BGT 20$ ;YES, ERROR
ASL R0 ;SHIFT FOR DISPATCH
JMP @10$(R0) ;DISPATCH ON TYPE TO PROPER ROUTINE
10$: ;DISPATCH TABLE FOR NSP DISCONNECT TYPES
.WORD NSPDCR ;DISCONNECT REJECT
.WORD NSPDCI ;DISCONNECT INITIATE
.WORD NSPDCC ;DISCONNECT CONFIRM
.WORD NSPDCI ;DISCONNECT ABORT (HANDLED EXACLTLY LIKE INITIATE)
20$: ;HERE IF BAD DISCONNECT TYPE
TRAP ;BETTER STOP
.SBTTL 1.5.6 NSPDCR 0.0 17-MAY-76 -- NSP DISCONNECT REJECT
;***********************************************************************
;
; NSPDCR 0.0 17-MAY-76 -- NSP DISCONNECT REJECT
;
;***********************************************************************
NSPLMB: JSR PC,GETBYT ;GET DEST ADDR
TST R0 ;CHECK RESULTS
BNE 10$ ;BETTER HAVE DEST ADDR
TRAP ;ERROR IF ZERO
10$: JSR PC,NSPFDA ;FIND LINK IN TABLE
BNE 20$ ;CHECK RESULTS
TRAP ;ERROR IF ZERO
20$: CLRB NSPREA ;USE 0 ERROR CODE
NSPDCR: ;HERE WHEN WE HAVE DISCONNECT REJECT FROM NSP
TSTB LE.NSP(R1) ;WAS CONNECTION COMPLETED?
BEQ NSPDCO ;NO, BRANCH
BISB #LES.FL!LES.WD,LE.STS(R1);YES, WE'LL HAVE TO WAIT FOR DISCONNECT FROM NCL
NSPDCO: ;HERE AFTER DETERMINING IF CONNECTION COMPLETE
CLRB NSPNCT ;ZERO NCT
JSR PC,NSPBNC ;START MESSAGE
JSR PC,NSPPBY ;PUT IN 0 DLA
MOV R5,NSPCNT ;SAVE POINTER
JSR PC,NSPPEX ;PUT A ZERO COUNT FOR NOW
MOV R4,NSPCVL ;SAVE COUNT
MOV #2,R0 ;DISCONNECT TYPE = 2
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOV LE.NCL(R1),R0 ;DLA
JSR PC,NSPPEX ;PUT INTO MESSAGE
MOVB LE.NSP(R1),R0 ;SLA
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOVB NSPREA,R0 ;GET REASON AND SUBTYPE
ASR R0 ;SHIFT
ASR R0 ; OUT
ASR R0 ; SUB-TYPE BITS
CLR -(SP) ;START WITH DEFAULT 0 REASON CODE
BITB #LES.DV,LE.STS(R1) ;IS THIS A DEVICE CONNECTION?
; BEQ 15$ ;NO, LEAVE 0 DEFAULT
INC (SP) ;YES, MAKE 1 DEFAULT
15$: ;HERE AFTER DECIDING DEFAULT REASON
CMP R0,#3 ;WAS IT NO SUCH PROCESS?
BNE 20$ ;NO, TRY NEXT
BITB #LES.DV,LE.STS(R1) ;IS IT A DEVICE?
BNE 22$ ;YES, USE DEFAULT
MOV #4,(SP) ;PUT PROCESS NOT THERE REASON CODE INTO MESSAGE
BR 22$ ;DONE
20$: ;HERE TO TRY ANOTHER CODE
CMP R0,#6 ;WAS IT NODE SHUTTING DOWN?
BNE 22$ ;NO, PUT INTO MESSAGE
MOV #2,(SP) ;USE NCL TOO MANY CONNECTS TO NODE
22$: ;HERE WHEN DONE DECIDING NCL REASON
MOV (SP)+,R0 ;GET REASON
JSR PC,NSPPBY ;PUT INTO MESSAGE
30$: ;HERE TO COPY OPTIONAL DATA INTO NCL MESSAGE
TST R2 ;ANY LEFT?
BEQ 40$ ;NO, DONE
JSR PC,GETBYT ;YES, GET A BYTE
JSR PC,NSPPBY ;PUT INTO MESSAGE
BR 30$ ;AND LOOK FOR NEXT
40$: ;HERE WHEN DONE BUILDING NCL DISCONNECT
BITB #LES.WD,LE.STS(R1) ;ARE WE WAITING FOR A RESPONSE?
BNE 45$ ;YES, BRANCH
JSR PC,NSPDLE ;NO, DELETE LINK TABLE ENTRY
45$: ;HERE TO FINISH UP AND GIVE TO NCL
JMP NSPICX ;PUT IN COUNT AND GIVE TO NCL
.SBTTL 1.5.7 NSPDCI 0.0 17-MAY-76 -- NSP DISCONNECT INITIATE
;***********************************************************************
;
; NSPDCI 0.0 17-MAY-76 -- NSP DISCONNECT INITIATE
;
;***********************************************************************
NSPDCI: ;HERE TO PROCESS NSP DISCONNECT INITIATE
BITB #LES.DV,LE.STS(R1) ;IS THIS A DEVICE?
BNE 10$ ;YES, GO HANDLE IT
5$: ;HERE WHEN NOT DEVICE LINK, OR WHEN NOT IN DUMMY DISCONNECT STATE
TSTB LE.NSP(R1) ;IS LINK COMPLETED?
BNE 6$ ;YES, CONTINUE
TRAP ;PROTOCOL ERROR
6$: ;HERE ON VALID DISCONNECT INITIATE
BISB #LES.WD,LE.STS(R1) ;INDICATE WE SHOULD WAIT FOR CONFIRM
BR NSPDCO ;AND HANDLE AS DISCONNECT REJECT
10$: ;HERE IF LINK IS A DEVICE
BITB #LES.WD,LE.STS(R1) ;HAVE WE SENT DUMMY DISCONNECT?
BEQ 5$ ;NO, GO DO NORMAL THINGS
BISB #LES.SD,LE.STS(R1) ;YES, INDICATE THAT WE MUST SEND DISCONNECT CONFIRM OURSELVES
JSR PC,NSPQ ;WAKE UP NSP LOW LEVEL
;IT WILL SEND IT, AND THEN DELETE LINK TABLE ENTRY
BR NSPDCO ;AND SEND DISCONNECT TO NCL
.SBTTL 1.5.10 NSPDCC 0.0 17-MAY-76 -- NSP DISCONNECT CONFIRM
;***********************************************************************
;
; NSPDCC 0.0 17-MAY-76 -- NSP DISCONNECT CONFIRM
;
;***********************************************************************
NSPDCC: ;HERE ON NSP DISCONNECT CONFRIM
BITB #LES.WD,LE.STS(R1) ;WERE WE WAITING FOR A CONFIRM?
BNE 10$ ;YES, CONTINUE
TRAP ;NO, THAT IS BAD
10$: ;HERE ON VALID DISCONNECT CONFIRM
BICB #LES.WD,LE.STS(R1) ;CLEAR WAITING BIT (TO CAUSE LINK ENTRY TO DISAPPEAR)
BR NSPDCO ;AND GO TO COMMON CODE
.SBTTL 1.5.11 NSPILS 0.0 17-MAY-76 -- NSP LINK STATUS
;***********************************************************************
;
; NSPILS 0.0 17-MAY-76 -- NSP LINK STATUS
;
;***********************************************************************
NSPILS: ;HERE ON NSP LINK STATUS
JSR PC,GETBYT ;GET DESTADDR
JSR PC,NSPFDA ;FIND A LINK TABLE ENTRY
BEQ NSPIBD ;NONE!! BAD MESSAGE
JSR PC,GETBYT ;GET SRCADDR
CMPB R0,LE.NSP(R1) ;BETTER BE THE SAME
BNE NSPIBD ;IT WASN'T, SO BRANCH
JSR PC,GETBYT ;GET REQUEST COUNT
TST R0 ;CHECK FOR 0
BNE 10$ ;NON-ZERO, SO BRANCH
;HERE WHEN WE GET A NULL LINK STATUS MESSAGE
NSPIBD=. ;FLUSH INPUT AND OUTPUT MESSAGES
MOV NSPMSG,R0 ;POINT TO BEGINNING OF NCL MESSAGE
JSR PC,FRECKS ;FREE IT
MOV (SP)+,R0 ;GET START OF NSP MESSAGE
JSR PC,FRECKS ;FREE IT ALSO
RTS PC ;AND RETURN TO DDCMP
10$: ;HERE ON REAL LINK STATUS
MOV R0,-(SP) ;SAVE DATA REQUEST COUNT
CLRB NSPNCT ;ZERO NCT
JSR PC,NSPBNC ;START MESSAGE
JSR PC,NSPPBY ;PUT IN 0 DLA
MOV #4,R0 ;COUNT
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOV #6,R0 ;TYPE = DATA REQUEST
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOV LE.NCL(R1),R0 ;GET DLA
JSR PC,NSPPEX ;PUT INTO MESSAGE
MOV (SP)+,R0 ;GET REQUEST COUNT
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOV NSPMSG,R0 ;GET START OF NCL MESSAGE
MOV R4,CN.LEN(R0) ;PUT LENGTH INTO CHUNK
JMP NSPNCL ;AND SEND IT ON ITS WAY
.SBTTL 1.5.12 NSPIER 0.0 17-MAY-76 -- NSP ERROR MESSAGE
;***********************************************************************
;
; NSPIER 0.0 17-MAY-76 -- NSP ERROR MESSAGE
;
;***********************************************************************
NSPIER: ;HERE ON NSP ERROR MESSAGE
TRAP ;SHOULDN'T HAPPEN
.SBTTL 1.6 NSPODN 0.0 12-MAY-76 -- OUTPUT DONE ROUTINE
;***********************************************************************
;
; NSPODN 0.0 12-MAY-76 -- OUTPUT DONE ROUTINE
;
;***********************************************************************
NSPODN: ;HERE WHEN OUTPUT DONE
JSR PC,FRECKS ;THROW MESSAGE AWAY
RTS PC ;RETURN
.SBTTL 1.7 NSPCHK 0.0 19-MAY-76 -- CHECK FOR ACTION
;***********************************************************************
;
; NSPCHK 0.0 19-MAY-76 -- CHECK FOR ACTION
;
;***********************************************************************
NSPCHK: ;HERE TO CHECK NSP QUEUE
CMP NS.PTR,NS.TKR ;ANYTHING IN QUEUE?
BEQ NSPCHR ;NO, RETURN
CMP NS.TKR,#<NS.QUE+NS.SIZ> ;TAKER PAST END?
BLO .+10 ;NO, SKIP NEXT INSTRUCTION
MOV #NS.QUE,NS.TKR ;POINT IT BACK TO BEGINNING
MOV @NS.TKR,J ;GET LINE BLOCK ADDRESS
ADD #2,NS.TKR ;ADVANCE TAKER
BIC #NS.NSQ,LB.NSS(J) ;CLEAR QUEUED BIT
SAVE <SB> ;SAVE POINTER TO SCB
MOV LB.SCB(J),SB ;GET OUR SCB
BIT #NS.CNF,LB.NSS(J) ;DO WE HAVE TO SEND CONFIGURATION?
BEQ 10$ ;NO, TRY INDIVIDUAL LINKS
JSR PC,NSPSCF ;YES, SEND CONFIGURATION
10$: ;HERE TO LOOP OVER LINKS
MOV LB.LKT(J),R1 ;GET POINTER TO LINK TABLE
ADD #2,R1 ;ADJUST TO FIRST LINK
MOV LB.LCT(J),R3 ;GET COUNT OF LINKS
BEQ 30$ ;IF NONE, WE ARE DONE
15$: ;LOOP THROUGH LINKS
BITB #LES.SL,LE.STS(R1) ;NEED TO SEND ZERO LINK STATUS TO NSP?
BEQ 20$ ;NO, KEEP LOOKING
JSR PC,NSPSLS ;YES, DO IT
20$: ;CHECK OTHER ACTIVITY
BITB #LES.SD,LE.STS(R1) ;DO WE NEED TO SEND DISCONNECT CONFIRM TO NSP?
BEQ 25$ ;NO, ADVANCE TO NEXT LINK
JSR PC,NSPSDC ;YES, DO IT
25$: ;COUNT OUT LINKS
ADD #LE.SIZ,R1
SOB R3,15$ ;KEEP LOOPING TILL ALL LINKS EXHAUSTED
30$: ;HERE WHEN FINISHED WITH LINE
RESTOR <SB> ;RESTOR REGISTER
NSPCHR: ;RETURN TO CALLER
RTS PC
.SBTTL 1.7.1 NSPSCF 0.0 17-MAY-76 -- SEND CONFIG
;***********************************************************************
;
; NSPSCF 0.0 17-MAY-76 -- SEND CONFIG
;
;***********************************************************************
NSPSCF: ;SEND CONFIGURATION
SAVE <R1,R3,J> ;SAVE REGS
MOV #NSPCFS,R2 ;SIZE OF CONFIGURATION SECTION IN LINE BLOCK
CLRB NSPNCT ;ZERO NCT
JSR PC,NSPBMG ;START A MESSAGE
JSR PC,NSPBNC ;AND PUT HEADER INTO IT
JSR PC,NSPPBY ;PUT DLA=0
MOV R5,NSPCNT ;SAVE POINTER
JSR PC,NSPPEX ;PUT 0 EXTENSIBLE COUNT
MOV R4,NSPCVL ;SAVE COUNT VALUE
MOV #5,R0 ;TYPE = CONFIG
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOV NSPLB,R3 ;GET ADDRESS OF LINE BLOCK
ADD #LB.CNF,R3 ;POINT TO CONFIG AREA
10$: ;HERE TO COPY CONFIGURATION
TST R2 ;ANY MORE LEFT?
BEQ 20$ ;NO, DONE
MOVB (R3)+,R0 ;GET OBJECT TYPE
BEQ 20$ ;IF ZERO, DONE
JSR PC,NSPPBY ;PUT OBJECT TYPE IN
MOVB (R3)+,R0 ;GET COUNT
JSR PC,NSPPBY ;PUT INTO MESSAGE
CLR R0 ;ZERO PID
JSR PC,NSPPBY ;PUT INTO MESSAGE
SUB #2,R2 ;WE HAVE USED UP TWO BYTES IN AREA
BR 10$ ;KEEP LOOKING
20$: ;HERE WHEN DONE COPYING CONFIG
MOV NSPMSG,R0 ;POINT TO MESSAGE
MOV R4,CN.LEN(R0) ;STORE LENGTH
MOV NSPCNT,R5 ;POINT BACK TO COUNT
MOV R4,R0 ;GET CURRENT COUNT
SUB NSPCVL,R0 ;SUBTRACT PREVIOUS
JSR PC,NSPPEX ;PUT INTO MESSAGE
MOV NSPMSG,R0 ;GET MESSAGE POINTER
JSR PC,NCLIN1 ;GIVE TO NCL [mco 9696]
RESTOR <J> ;GET LINE BLOCK POINTER BACK
BIC #NS.CNF,LB.NSS(J) ;NO LONGER NEED TO SEND CONFIGURATION
RESTOR <R3,R1> ;RESTORE REST OF THE REGS
RTS PC ;AND RETURN
.SBTTL 1.7.2 NSPSDC 0.0 17-MAY-76 -- SEND DISCONNECT TO NSP
;***********************************************************************
;
; NSPSDC 0.0 17-MAY-76 -- SEND DISCONNECT TO NSP
;
;***********************************************************************
NSPSDC: ;SEND DISCONNECT CONFIRM TO NSP
SAVE <J,R3,R1> ;SAVE REGS
JSR PC,NSPBMG ;START A MESSAGE
MOV #NSPCM,R0 ;MSGFLG
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOV #2,R0 ;TYPE = DISCONNECT
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOV #5,R0 ;SUBTYPE = 5 (CONFIRM), REASON = 0
JSR PC,NSPPBY ;PUT INTO MESSAGE
JSR PC,NSPSAD ;PUT ADDRESSES INTO MESSAGE
JSR PC,NSPDLE ;DELETE LINK TABLE ENTRY
MOV (SP),R1 ;GET LINK ENTRY POINTER BACK
BICB #LES.SD,LE.STS(R1) ;WE HAVE SENT IT, SO CLEAR BIT
NSPSND: ;HERE TO SEND MESSAGE TO NSP
MOV NSPMSG,R0 ;POINT TO BEGINNING OF MESSAGE
MOV R4,CN.LEN(R0) ;STORE LENGTH IN CHUNK
MOV NSPLB,J ;POINT TO LINE BLOCK
MOV LB.SCB(J),SB ;ALSO SCB
MOV SB,DNA ;STORE DESTINATION WHERE DDCMP WANTS IT
MOV #SOH,R2 ;DDCMP WANTS STARTING CHAR IN R2
JSR PC,DDQNSP ;QUEUE IT UP
RESTOR <R1,R3,J> ;RESTORE REGS
RTS PC ;AND RETURN
.SBTTL 1.7.3 NSPSLS 0.0 17-MAY-76 -- SEND LINK STATUS
;***********************************************************************
;
; NSPSLS 0.0 17-MAY-76 -- SEND LINK STATUS
;
;***********************************************************************
NSPSLS: ;SEND 0 LINK STATUS TO NSP
SAVE <J,R3,R1> ;SAVE REGS
JSR PC,NSPBMG ;START MESSAGE
MOV #NSPCM,R0 ;MSGFLG
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOV #3,R0 ;TYPE = LINK STATUS
JSR PC,NSPPBY ;PUT INTO MESSGE
JSR PC,NSPSAD ;PUT LINK ADDRESSES INTO MESSAGE
CLR R0 ;ZERO FOR DATA REQUEST COUNT
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOV (SP),R1 ;GET LINK ENTRY POINTER BACK
BICB #LES.SL,LE.STS(R1) ;WE HAVE SENT IT, SO CLEAR BIT
PBRNCH NSPSND ;AND SEND IT OFF
.SBTTL 1.7.4 NSPSAD 0.0 17-MAY-76 -- SEND ADDRESSES TO NSP
;***********************************************************************
;
; NSPSAD 0.0 17-MAY-76 -- SEND ADDRESSES TO NSP
;
;***********************************************************************
NSPSAD: ;SEND DESTADDR AND SRCADDR
MOVB LE.NSP(R1),R0 ;GET DESTINATION (NSP) ADDRESS
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOVB LE.CON(R1),R0 ;GET SOURCE (NCL CONVERTED) ADDRESS
JSR PC,NSPPBY ;PUT INTO MESSAGE
RTS PC
.SBTTL 1.10 NSPSUB 0.0 10-MAY-76 -- SUBROUTINES
;***********************************************************************
;
; NSPSUB 0.0 10-MAY-76 -- SUBROUTINES
;
;***********************************************************************
.SBTTL 1.10.1 NSPCPY 0.0 10-MAY-76 -- COPY FROM LB TO SCB
;***********************************************************************
;
; NSPCPY 0.0 10-MAY-76 -- COPY FROM LB TO SCB
;
;***********************************************************************
NSPCPY: ;COPY FROM LINE BLOCK TO SCB
; THIS SUBROUTINE DESTROYS R0, R1, R2, AND R3
;
; IT IS CALLED BY
;
; JSR PC,NSPCPY
; .WORD LBDISP ;LINE BLOCK DISPLACEMENT
; .WORD SCBDSP ;STATION CONTROL BLOCK DISPLACEMENT
; .WORD COUNT ;NUMBER OF BYTES TO COPY
; --> ONLY RETURN
MOV @SP,R0 ;GET RETURN PC INTO R0
MOV (R0)+,R1 ;GET LINE BLOCK DISPLACEMENT
ADD J,R1 ;MAKE INTO ADDRESS
MOV (R0)+,R2 ;GET SCB DISPLACEMENT
ADD SB,R2 ;MAKE INTO ADDRESS
MOV (R0)+,R3 ;GET COUNT
MOV R0,@SP ;UPDATE RETURN PC
10$: ;LOOP TO COPY BYTES
MOVB (R1)+,(R2)+ ;COPY BYTE FROM LB TO SCB
SOB R3,10$ ;DECREMENT COUNTER, AND LOOP IF NOT DONE
DEC R2 ;BACK UP DESTINATION POINTERONE
BICB #200,@R2 ;CLEAR EXTENSIBLE BIT (IN CASE SOMEONE FORGOT)
RTS PC ;RETURN
.SBTTL 1.10.2 NSPEXC 0.0 15-MAY-76 -- COPY PROCESS NAME INTO MSG
;***********************************************************************
;
; NSPEXC 0.0 15-MAY-76 -- COPY PROCESS NAME INTO MSG
;
;***********************************************************************
NSPEXC: ;WILL PUT OBJ-TYPE=0, PROCESS NAME, GROUP=0, USER=0 INTO OUTPUT MESSAGE
CLR R0 ;OBJECT-TYPE
JSR PC,NSPPBY ;PUT INTO MESSAGE
MOV #20$,10$+2 ;POINT TO CHARACTER GET SUBROUTINE
CLR -(SP) ;ZERO COUNTER
10$: ;LOOP PUTTING IN BYTES OF EXTENSIBLE FIELD
JSR PC,20$ ;GET NEXT BYTE
CMP (SP),#6 ;CHECK IF ENOUGH
BEQ 11$ ;YES, JUST SKIP BYTES
JSR PC,NSPPBY ;PUT INTO MESSAGE
INC (SP) ;INCREMENT COUNTER
11$: ;HERE TO CHECK IF END OF EXTENSIBLE STRING
BIT #200,R0 ;WAS EXTENSIBLE BIT ON?
BNE 10$ ;YES, KEEP LOOKING FOR MORE
TST (SP)+ ;CLEAN UP STACK
BICB #200,-1(R5) ;CLEAR EXTENSIBLE BIT IN STRING
CLR R0 ;GROUP=0
JSR PC,NSPPBY ;PUT INTO MESSAGE
JSR PC,NSPPBY ;PUT ZERO USER CODE INTO MESSAGE ALSO
RTS PC ;RETURN TO CALLER
20$: ;HERE TO GET NEXT CHARACTER TO PUT INTO STRING
JSR PC,GETBYT ;GET BYTE FROM MESSAGE
MOV R0,-(SP) ;SAVE IT ON STACK
BIC #177600,R0 ;CLEAR EXTENSIBLE BIT
CMP #133,R0 ;WAS IT "["?
BNE 30$ ;NO, SKIP
MOV (SP),R0 ;YES, GET REAL CHARACTER BACK,
MOV #240,(SP) ;REPLACE WITH BLANK,
MOV #40$,10$+2 ;AND POINT TO NEW CHARACTER GET ROUTINE
25$: ;LOOP TO FLUSH EXTRA CHARACTERS
BIT #200,R0 ;WAS EXTENSIBLE BIT ON?
BEQ 30$ ;NO, DONE
JSR PC,GETBYT ;GET NEXT CHARACTER
BR 25$ ;AND CHECK IT TOO
30$: ;HERE TO PASS CHARACTER TO CALLER
MOV (SP)+,R0 ;GET CHARACTER BACK
RTS PC ;AND RETURN
40$: ;HERE AFTER "[" SEEN
MOV #240,R0 ;GET AN EXTENDED BLANK
CMP 2(SP),#6 ;HAS COUNT REACHED LIMIT YET?
BLT 45$ ;NO, BRANCH
BIC #200,R0 ;YES, CLEAR EXTENSIBLE BIT
45$: ;HERE TO PASS CHARACTER BACK
RTS PC ;RETURN
.SBTTL 1.10.3 NSPFST 0.0 12-MAY-76 -- SET STRIP BIT
;***********************************************************************
;
; NSPFST 0.0 12-MAY-76 -- SET STRIP BIT
;
;***********************************************************************
NSPFST: ;SEE IF THIS LINK WANTS STRIP COUNT/DATA
CLRB NSPFLG ;CLEAR FLAG BITS
BIT #LES.DV,LE.STS(R1) ;IS THIS A DEVICE?
BNE 5$ ;YES, DON'T STRIP
BISB #NSP.ST,NSPFLG ;NO, SET STRIP BIT
5$: ;HERE WHEN STRIP BIT OK
RTS PC ;RETURN
.SBTTL 1.10.4 NSPBMG 0.0 10-MAY-76 -- START OUTPUT MESSAGE
;***********************************************************************
;
; NSPBMG 0.0 10-MAY-76 -- START OUTPUT MESSAGE
;
;***********************************************************************
NSPBMG: ;BEGIN AN OUTPUT MESSAGE
; THIS SUBROUTINE STARTS AN OUTPUT MESSAGE BY GETTING A CHUNK,
; AND INITIALIZING THE BYTE POINTER REGISTER (R5) AND THE
; COUNT REGISTER (R4).
;
; DESTROYS R0, R4, AND R5.
;
; CALL IS:
;
; JSR PC,NSPBMG
; --> ONLY RETURN
;
; IF RETURN IS UNSUCCESSFUL, CARRY BIT IS SET.; ELSE CLEAR.
; UPON SUCCESSFUL RETURN, R4 CONTAINS 0 AND R5 POINTS TO FIRST
; BYTE OF MESSAGE.
SEC ;ASSUME BAD RETURN
JSR PC,GETCNK ;GET A CHUNK
BEQ 10$ ;IF NONE, RETURN
CLC ;SET GOOD RETURN CODE
MOV R0,NSPMSG ;SAVE START OF MESSAGE
CLR R4 ;CLEAR COUNT REGISTER
MOV R0,R5 ;PUT START ADDRESS INTO BYTE POINTER REGISTER
CLR CN.MLK(R5) ;CLEAR MESSAGE LINK
.IIF NE,DEVN, CLR CN.DDB(R5) ;AND DDB LINK
ADD #CN.NCT,R5 ;POINT TO FIRST DATA BYTE
10$: ;HERE TO EXIT
RTS PC ;RETURN
.SBTTL 1.10.5 NSPPEX 0.0 10-MAY-76 -- PUT EXTENSIBLE FIELD INTO MSG
;***********************************************************************
;
; NSPPEX 0.0 10-MAY-76 -- PUT EXTENSIBLE FIELD INTO MSG
;
;***********************************************************************
NSPPEX: ;SUBROUTINE TO PUT EXTENSIBLE NUMBER IN OUTPUT MESAGE
MOV R0,-(SP) ;SAVE VALUE
JSR PC,NSPEXB ;PUT BYTE WITH EXTENSIBLE BIT ON
MOV (SP)+,R0 ;GET VALUE BACK
ASL R0 ;SHIFT HIGH ORDER BIT OF LOW BYTE INTO HIGH BYTE
SWAB R0 ;SWITCH BYTES
BIC #200,R0 ;CLEAR EXTENSIBLE BIT
PBRNCH NSPPBY ;PUT BYTE INTO MESSAGE
NSPEXB: ;TURN ON EXTENSIBLE BIT AND PUT INTO MESSAGE
BIS #200,R0 ;TURN ON EXTENSIBLE BIT
; PJMP NSPPBY ;PUT INTO MESSAGE
.SBTTL 1.10.6 NSPPBY 0.0 10-MAY-76 -- PUT BYTE INTO OUTPUT MESSAGE
;***********************************************************************
;
; NSPPBY 0.0 10-MAY-76 -- PUT BYTE INTO OUTPUT MESSAGE
;
;***********************************************************************
NSPPBY: ;PUT A BYTE INTO OUTPUT MESSAGE
CLC ;CLEAR ERROR INDICATOR
MOVB R0,(R5)+ ;PUT BYTE AT POINTER AND ADVANCE POINTER
INC R4 ;INCREMENT BYTE COUNT
BIT #CNKSIZ-1,R5 ;IS IT NOW POINTING PAST END?
BNE 20$ ;NO, EXIT
MOV R0,-(SP) ;SAVE DATA ON STACK
SEC ;ASSUME BAD RETURN
JSR PC,GETCNK ;GET A CHUNK
BEQ 10$ ;NONE, SO EXIT
CLC ;CLEAR BAD RETURN INDICATOR
MOV R0,-CNKSIZ(R5) ;LINK NEW CHUNK TO OLD
MOV R0,R5 ;POINT TO NEW CHUNK
CLR (R5)+ ;CLEAR ITS FOWARD LINK
10$: ;HERE TO CLEAN STACK AND EXIT
MOV (SP)+,R0 ;RESTORE DATA
20$: ;HERE TO EXIT
RTS PC ;RETURN
.SBTTL 1.10.7 NSPCLE 0.1 20-MAY-76 -- CREATE LINK ENTRY
;***********************************************************************
;
; NSPCLE 0.1 20-MAY-76 -- CREATE LINK ENTRY
;
;***********************************************************************
NSPCLE: ;CREATE A LINK ENTRY
; THIS SUBROUTINE CREATES A NEW LINK ENTRY, LEAVING
; THE ADDRESS OF THE ZEROED ENTRY IN R1.
;
; IT EXPECTS THAT THE LINE BLOCK ADDRESS BE IN NSPLB.
; IT ONLY MODIFIES R1 TO RETURN THE ADDRESS OF THE
; LINK ENTRY, OR 0 IF NO ENTRIES WERE AVAILABLE.
;
; CALL IS:
;
; JSR PC,NSPCLE
; BEQ FAIL
;
SAVE <R4,R3,R2,R0> ;SAVE SOME REGISTERS
MOV #LE.SIZ,R3 ;GET SIZE OF LINK ENTRY
MOV NSPLB,R2 ;GET LINE BLOCK ADDRESS
MOV R2,R0 ;COPY IT
ADD #LB.LKT,R0 ;POINT TO ADDRESS OF TABLE
MOV LB.LLE(R2),R1 ;GET LAST USED ENTRY
BEQ 5$ ;NONE, SO GET ONE
MOV R1,R0 ;COPY ENTRY ADDRESS
BIC #CNKSIZ-1,R0 ;GET BEGINNING OF CHUNK
ADD #LE.SIZ*2,R1 ;POINT TO PAST END OF NEW ENTRY
ADD #CNKSIZ,R0 ;POINT PAST END OF CHUNK
CMP R1,R0 ;COMPARE THE TWO
BLOS 10$ ;BRANCH IF IT WILL FIT
SUB #CNKSIZ,R0 ;ELSE POINT TO BEGINNING OF CHUNK AGAIN
5$: ;HERE TO GET A CHUNK, CHAIN TO PREVIOUS
MOV R0,R4 ;SAVE CURRENT CHUNK ADDRESS
CLR R1 ;ASSUME THE WORST
JSR PC,GETCNK ;GET ANOTHER
BEQ 20$ ;EGADS, NO CHUNKS!
MOV R0,@R4 ;POINT LAST ONE AT THIS ONE
CLR @R0 ;MAKE SURE NEW ONE POINTS NOWHERE
MOV R0,R1 ;COPY CHUNK ADDRESS
ADD #LE.SIZ+2,R1 ;ADD 2 FOR LINK PLUS ENTRY SIZE
10$: ;R1 POINTS TO NEW ENTRY + 1
SUB R3,R1 ;BACK TO START OF ENTRY
MOV NSPLB,R0 ;GET LINE BLOCK ADDRESS
INC LB.LCT(R0) ;INCREMENT COUNT OF LINKS ACTIVE
MOV R1,LB.LLE(R0) ;SAVE LAST ENTRY ADDRESS
MOV R1,R0 ;COPY START OF ENTRY
15$: ;LOOP TO CLEAR OUT LINK ENTRY
CLRB (R0)+ ;CLEAR THIS BYTE
SOB R3,15$ ;LOOP TILL DONE
20$: ;HERE TO RESTORE REGS AND EXIT
RESTOR <R0,R2,R3,R4> ;CLEAN UP STACK
TST R1 ;SET CONDITION FOR RETURN
RTS PC ;RETURN TO CALLER
.SBTTL 1.10.10 NSPDLE 0.0 20-MAY-76 -- DELETE LINK ENTRY
;***********************************************************************
;
; NSPDLE 0.0 20-MAY-76 -- DELETE LINK ENTRY
;
;***********************************************************************
NSPDLE: ;DELETE LINK TABLE ENTRY
SAVE <R3,R2,R0> ;SAVE SOME REGISTERS
MOV NSPLB,R2 ;GET LINE BLOCK ADDRESS
MOV LB.LLE(R2),R0 ;GET LAST ENTRY
ASSERT NE ;BETTER NOT BE 0
TST LB.LCT(R2) ;GET COUNT OF ENTRIES
ASSERT NE ;BETTER BE SOME
MOV #LE.SIZ,R3 ;GET SIZE OF ENTRY
10$: ;HERE TO COPY LAST INTO DELETE ENTRY
MOVB (R0)+,(R1)+ ;COPY ONE BYTE
SOB R3,10$ ;LOOP TILL COUNT EXHAUSTED
SUB #LE.SIZ+2,R0 ;CHECK IF THIS WAS FIRST ONE IN CHUNK
BIT #CNKSIZ-1,R0 ;BEGINNING OF CHUNK?
BNE 30$ ;NO, JUST DECREMENT
MOV R2,R1 ;POINT TO
ADD #LB.LKT,R1 ;AND ADDRESS OF FIRST CHUNK
20$: ;LOOP LOOKING FOR NEXT TO LAST CHUNK
TST @(R1) ;IS NEXT CHUNK'S LINK 0?
BEQ 21$ ;YES, DONE
MOV @R1,R1 ;NO, GET NEXT CHUNK
BR 20$ ;AND KEEP LOOKING
21$: ;HERE WITH R1 = NEXT TO LAST CHUNK
;(OR POINTER IN LINE BLOCK IF ONLY 1)
ASSERT R0,EQ,@R1 ;MAKE SURE IT IS CONSISTENT
CLR @R1 ;DE-LINK FROM PREVIOUS
JSR PC,FRECKS ;FREE CHUNK
MOV #<LE.SIZ-2>,R0 ;IN CASE NO MORE CHUNKS EXIST
TST LB.LKT(R2) ;DID WE FREE LAST CHUNK?
BEQ 30$ ;YES, DECREMENT COUNT (TO 0) AND EXIT
MOV R1,R0 ;NO, COPY BEGINNING OF NEW LAST CHUNK
ADD #<<LEPCNK+1>*LE.SIZ>,R0 ;POINT 2 BEFORE ENTRY AFTER LAST ENTRY
30$: ;HERE WHEN ENTRY MOVED
DEC LB.LCT(R2) ;ONE LESS ENTRY
SUB #<LE.SIZ-2>,R0 ;ADJUST TO START OF LINK ENTRY
MOV R0,LB.LLE(R2) ;POINT TO NEW LAST ENTRY
RESTOR <R0,R2,R3> ;RESTORE REGISTERS
RTS PC ;RETURN TO CALLER
.SBTTL 1.10.11 NSPLES 0.1 20-MAY-76 -- SEARCH LINK ENTRIES
;***********************************************************************
;
; NSPLES 0.1 20-MAY-76 -- SEARCH LINK ENTRIES
;
;***********************************************************************
NSPLES: ;SEARCH LINK ENTRIES
; THIS SUBROUTINE SEARCHES THROUGH THE LINK ENTRIES THAT
; ARE ACTIVE FOR A DCP LINE.
;
; IT RETURNS THE ADDRESS OF THE LINK ENTRY MATCHING
; THE CRITERION IN R1, OR 0 IF NONE IS FOUND.
; IT MODIFIES NO OTHER REGISTER.
;
;
; IT IS EXPECTED THAT THE VALUE TO BE COMPARED AGAINST IS IN R0,
; AND THAT THE COMPARING INSTRUCTION IS THEREFORE ONLY 2 WORDS
; LONG.
;
; THE CALL IS:
;
; JSR PC,NSPLES ;CALL ROUTINE
; CMP R0,LE.XXX(R1) ;THIS IS THE COMPARE INSTRUCTION
; RTS PC ;EVENTUAL RETURN IS TO HERE
SAVE <R3,R2,J> ;SAVE SOME REGISTERS
MOV NSPLB,J ;GET LINE BLOCK ADDRESS
MOV LB.LCT(J),R3 ;GET COUNT OF ACTIVE ENTRIES
MOV LB.LKT(J),R2 ;GET POINTER TO START OF ENTRIES
BEQ 16$ ;NONE, SO WE ARE FINISHED
INC R3 ;ADD ONE TO COUNT
BR 12$ ;DO INITIAL CHUNK ADJUSTMENTS
10$: ;LOOP TO EXAMINE ENTRIES
JSR PC,@6(SP) ;DO COMPARISON
BEQ 20$ ;IF EQUAL, WE HAVE FOUND IT
ADD #LE.SIZ,R1 ;OTHERWISE, POINT TO NEXT
CMP R1,R2 ;ARE WE PAST END?
BLO 15$ ;NO, CONTINUE
SUB #CNKSIZ,R2 ;YES, POINT TO BEGINNING OF CHUNK
MOV @R2,R2 ;GET LINK
12$: ;ADJUST REG VALUES AT BEGINNING OF CHUNK
MOV R2,R1 ;COPY START OF CHUNK
ADD #CNKSIZ,R2 ;POINT TO END OF CHUNK IN R2
ADD #2,R1 ;POINT TO FIRST ENTRY WITHIN CHUNK IN R1
15$: ;COUNT OUT LINK ENTRIES
SOB R3,10$ ;DECREMENT COUNT AND TRY AGAIN
16$: ;HERE IF NOT FOUND
CLR R1 ;ZERO RETURN REGISTER
20$: ;HERE TO RETURN
RESTOR <J,R2,R3> ;RESTORE REGISTERS
ADD #4,@SP ;UPDATE PC FOR RETURN
TST R1 ;SET CONDITION
RTS PC ;RETURN
.SBTTL 1.10.12 NSPFDL 0.1 20-MAY-76 -- FIND NSP DLA
;***********************************************************************
;
; NSPFDL 0.1 20-MAY-76 -- FIND NSP DLA
;
;***********************************************************************
NSPFDL: ;FIND DLA AS NSP ADDRESS
JSR PC,NSPLES ;DO SEARCH
CMPB R0,LE.NSP(R1) ;WITH THIS COMPARE ROUTINE
RTS PC ;RETURN (BOTH FOR COMPARE ROUTINE AND FINAL EXIT)
.SBTTL 1.10.13 NSPFDA 0.1 20-MAY-76 -- FIND NCL DESTADDR
;***********************************************************************
;
; NSPFDA 0.1 20-MAY-76 -- FIND NCL DESTADDR
;
;***********************************************************************
NSPFDA: ;FIND DESTADRR AS CONVERTED NCL ADDRESS
JSR PC,NSPLES ;DO SEARCH
CMPB R0,LE.CON(R1) ;WITH THIS COMPARE ROUTINE
RTS PC ;RETURN (BOTH FOR COMPARE ROUTINE AND FINAL EXIT)
.SBTTL 1.10.14 NSPBCO 0.0 15-MAY-76 -- MAKE UNIQUE NCL LINK ADDR
;***********************************************************************
;
; NSPBCO 0.0 15-MAY-76 -- MAKE UNIQUE NCL LINK ADDR
;
;***********************************************************************
NSPBCO: ;BUILD CONVERTED NCL LINK ADDRESS
MOV R1,-(SP) ;SAVE LINK ENTRY ADDRESS
MOV LE.NCL(R1),R0 ;PICK UP NCL LINK ADDRESS
BIC #^C277,R0 ;CLEAR UPPER BYTE
JSR PC,NSPFDA ;SEARCH FOR THIS IN TABLE
BNE 20$ ;WAS ALREADY THERE, WE HAVE TO LOOP
10$: ;HERE WHEN WE FOUND A UNIQUE VALUE FOR LE.CON
MOV (SP)+,R1 ;RESTORE LINK ENTRY POINTER
MOVB R0,LE.CON(R1) ;SAVE VALUE
RTS PC ;RETURN TO CALLER
20$: ;HERE TO LOOP THROUGH POSSIBLE VALUES
MOV #1,R0 ;INITIAL VALUE
30$: ;LOOP TO CHECK IF VALUE ALREADY IN TABLE
BIT #277,R0 ;HAVE WE PAST ONE BYTE?
BEQ 10$ ;YES, NO UNIQUE VALUE
JSR PC,NSPFDA ;CHECK THIS VALUE
BEQ 10$ ;NO ENTRY, SO WE ARE DONE
INC R0 ;MAKE NUMBER ONE HIGHER
BR 30$ ;AND CONTINUE LOOP
.SBTTL 1.10.15 NSPBNC 0.0 16-MAY-76 -- MAKE NCL HEADER
;***********************************************************************
;
; NSPBNC 0.0 16-MAY-76 -- MAKE NCL HEADER
;
;***********************************************************************
NSPBNC: ;SUBROUTINE TO PUT NCL HEADER INTO MESSAGE
MOV #NCFSEQ+NCFSNA,R0 ;PROTOTYPE NCT
MOVB NSPNCT,-(SP) ;GET NCT SKELETON
ADD (SP)+,R0 ;ADD SKELETON BITS TO R0 VALUE
JSR PC,NSPPBY ;PUT INTO MESSAGE
ADD #LB.DNA,NSPLB ;POINT TO DESTINATION NODE ADDRESS
MOVB @NSPLB,R0 ;GET IT
JSR PC,NSPPBY ;PUT INTO MESSAGE
DEC NSPLB ;POINT TO LB.NNM (WHICH IMMEDIATELY PRECEDS LB.DNA)
MOVB @NSPLB,R0 ;AND GET NSP NODE NUMBER
JSR PC,NSPPBY ;PUT INTO MESSAGE
SUB #LB.NNM,NSPLB ;RESTORE THIS TO LINE BLOCK ADDRESS
CLR R0 ;ZERO FOR NCA AND NCN
JSR PC,NSPPBY ;PUT NCA INTO MESSAGE
JSR PC,NSPPBY ;PUT NCN INTO MESSAGE
RTS PC ;RETURN TO CALLER
.SBTTL 1.10.16 NSPQ 0.0 17-MAY-76 -- WAKE NSP UP
;***********************************************************************
;
; NSPQ 0.0 17-MAY-76 -- WAKE NSP UP
;
;***********************************************************************
NSPQ: ;QUEUE A REQUEST TO NSP
SAVE <J,R2> ;SAVE REGS
MOV NSPLB,J ;POINT TO LINE BLOCK
PIOFF ;TURN OFF INTERRUPTS
BIT #NS.NSQ,LB.NSS(J) ;ALREADY SOMETHING QUEUED?
BNE 10$ ;YES, EXIT
BIS #NS.NSQ,LB.NSS(J) ;NO, INDICATE THAT NOW THERE IS
CMP NS.PTR,#<NS.QUE+NS.SIZ> ;IS PUTTER PAST END?
BLO 5$ ;NO, BRANCH
MOV #NS.QUE,NS.PTR ;YES, RESET TO BEGINNING
5$: ;HERE TO ACTUALLY PUT DATA INTO QUEUE
MOV J,@NS.PTR ;LINE BLOCK ADDRESS AT PUTTER
ADD #2,NS.PTR ;ADVANCE PUTTER
10$: ;HERE WHEN DONE
PION ;ALLOW INTERRUPTS AGAIN
RESTOR <R2,J> ;RESTORE REGS
RTS PC ;RETURN
.ENDC; NE,FTDCP1