mirror of
https://github.com/PDP-10/stacken.git
synced 2026-05-05 15:54:16 +00:00
1898 lines
59 KiB
Plaintext
1898 lines
59 KiB
Plaintext
.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
|
||
|