1 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
3 ;;; This program is free software; you can redistribute it and/or
4 ;;; modify it under the terms of the GNU General Public License as
5 ;;; published by the Free Software Foundation; either version 3 of the
6 ;;; License, or (at your option) any later version.
8 ;;; This program is distributed in the hope that it will be useful,
9 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
10 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 ;;; General Public License for more details.
13 ;;; You should have received a copy of the GNU General Public License
14 ;;; along with this program; if not, write to the Free Software
15 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 IFE IMPP, IFE CH11P, .ERR NOT EVERYTHING IN CHAOS WILL WORK WITHOUT IMP
18 IFNDEF FTRCHK, FTRCHK==0 ;PROBABLY FOUND ALL THE BUGS THIS WAS GOOD FOR
20 IFN FTRCHK, .ERR REDUNDANT CHECKING ENABLED IN CHAOS ROUTINES
23 ; WINDOW SIZE ADJUSTMENT STUFF
24 ; ROUND TRIP TIME MEASUREMENT & OTHER METERING
25 ; BETTER METERING, SOME METERS ARE CURRENTLY MISSING
27 SUBTTL CH-10 HARDWARE DEFINITIONS
30 CHX==470 ;I/O DEVICE NUMBER
34 CHXTEN==10 ;1.4 TRANSMIT INTERRUPT ENABLE
35 CHXREN==20 ;1.5 RECEIVE INTERRUPT ENABLE
36 CHXSPY==40 ;1.6 MATCH ANY DESTINATION
37 CHXLUP==100 ;1.7 LOOP BACK
38 CHXSWB==200 ;1.8 SWAP BYTES
39 CHXHLF==400 ;1.9 HALFWORD DATAO
40 CHXXMT==1000 ;2.1 TRANSMIT DONE (CONI)
41 ; TRANSMIT OR RETRANSMIT PACKET (CONO)
42 CHXRCV==2000 ;2.2 RECEIVE DONE (CONI)
43 ; ENABLE TO RECEIVE NEXT PACKET (CONO)
44 CHXABT==4000 ;2.3 TRANSMIT ABORTED (CONI)
45 ; RESET TRANSMITTER (CONO)
46 $CHXLC==140400 ;2.4-2.7 LOST COUNT (CONI)
47 CHXRST==10000 ;2.4 RESET (CONO)
48 CHXCRC==200000 ;2.8 CRC ERROR (CONI)
49 CHXWLE==400000 ;2.9 WORD LENGTH ERROR (CONI)
50 CHXPLE==1,, ;3.1 PACKET LENGTH ERROR (CONI)
51 CHXOVR==2,, ;3.2 OVERRUN (CONI)
52 $CHXAD==242000 ;3.3-4.9 CHAOSNET ADDRESS (CONI)
59 SUBTTL CHAOS NET VARIABLES
63 $CHXRI==001200 ;REAL INDEX PART (LOW TEN BITS) - IS IN LH(IOCHNM)
64 $CHXUN==120600 ;UNIQUIZATION PART (TOP SIX BITS)
65 CHXMUN==1_6-1 ;MAXIMUM VALUE OF UNIQUIZER
66 MXWIND==100 ;MAXIMUM WINDOW SIZE (8K WORDS)
67 .SEE MYCHAD ;SUBNET AND HOST OF MYSELF
68 .SEE DLCP ;1 MEANS USE DL10 TO GET TO CHAOS NET
69 .SEE T11CHP ;1 MEANS USE TEN-11 INTERFACE TO GET TO CHAOS NET
70 .SEE CH10P ;1 MEANS USE CH10 HARDWARE TO GET TO CHAOS NET
71 .SEE CH11P ;1 MEANS USE UNIBUS CHAOSNET HARDWARE ON KS10
73 ;Internet address of my Chaosnet Interface
74 IMPUS4==<.BYTE 4 ? 0 ? .BYTE 8 ? 128. ? 31. ? .BYTE 16. ? MYCHAD>
78 CHSUSR: REPEAT NINDX,-1 ;-1 INDEX NOT IN USE
80 $CHSUO==220600 ;3.1-3.6 OUTPUT CHANNEL NUMBER (77=IOPUSHED)
81 $CHSUI==300600 ;3.7-4.3 INPUT CHANNEL NUMBER (77=IOPUSHED)
84 CHSSTA: REPEAT NINDX,-1 ;RH STATE, LH FLAGS
86 %CFOFF==400000 ;SIGN BIT MEANS TURNED OFF AT PI LEVEL, NO TALKING TO NETWORK
87 %CFSTS==200000 ;SEND STS PACKET AS SOON AS POSSIBLE (1/2 SECOND CLOCK)
88 %CFCLS==100000 ;HALF-CLOSED FLAG
89 %CFSTY==040000 ;DIRECT-CONNECTED TO STTY FLAG
90 $CFTTN==220600 ;TTY NUMBER OF STTY CONNECTED TO
93 .SEE %CSCLS ;FOR SYMBOLS FOR STATES
95 CHSNBF: BLOCK NINDX ;LH LENGTH(CHSPBF), RH LENGTH(CHSIBF)
96 CHSNOS: BLOCK NINDX ;NUMBER OF FREE OUTPUT SLOTS IN THE WINDOW
97 CHSIBF: BLOCK NINDX ;RECEIVE BUFFER POINTERS FIRST,,LAST
98 CHSPBF: BLOCK NINDX ;OUT OF ORDER RECEIVE BUFFER POINTERS FIRST,,LAST
99 CHSOBF: BLOCK NINDX ;TRANSMIT BUFFER POINTERS FIRST,,LAST
100 CHSITM: BLOCK NINDX ;TIME OF LAST INPUT FROM NET
101 CHSWIN: BLOCK NINDX ;WINDOW SIZE RECEIVE,,TRANSMIT
102 CHSPKN: BLOCK NINDX ;LAST PACKET# GIVEN TO USER,,LAST PACKET# SENT BY USER
103 CHSACK: BLOCK NINDX ;LAST PACKET# ACKNOWLEDGED RECEIVE,,TRANSMIT (START OF WINDOW)
104 CHSLCL: REPEAT NINDX,<.BYTE 16. ? MYCHAD ? 100000+.RPCNT>
105 ;BYTE (16) LOCAL HOST, LOCAL INDEX (4) 0
106 ;NOTE THIS SAVES THE UNIQUIZER BITS FOR THIS INDEX
107 CHSFRN: BLOCK NINDX ;BYTE (16) FOREIGN HOST, FOREIGN INDEX (4) 0
108 ;THESE FOUR ARE FOR BYTE-STREAM I/O
109 CHSOBP: BLOCK NINDX ;BYTE PNTR TO OUTPUT BUFFER, 0 IF NONE
110 CHSOBC: BLOCK NINDX ;BYTE COUNT, NUMBER OF BYTE SPACES LEFT IN OUTPUT BUFFER
111 CHSIBP: BLOCK NINDX ;BYTE PNTR TO INPUT BUFFER, 0 IF NONE
112 CHSIBC: BLOCK NINDX ;BYTE COUNT, NUMBER OF VALID BYTES REMAINING IN INPUT BUFFER
114 CHAOSW: -1 ? 0 ;SWITCH FOR ALLOCATING INDICES
115 CHALCP: 0 ;LAST INDEX ALLOCATED, USED TO CIRCULARIZE ALLOCATION
117 CHIRFJ: SIXBIT/CHAOS/ ? 0 ;AGENT OF CHAOS
118 .SEE NETUSW ;NON-ZERO ENABLES RFC'S FROM HOSTS OTHER THAN SELF.
122 CHNPI: 0 ;NUMBER OF PACKETS INPUT (REALLY TO 10)
123 CHNPO: 0 ;NUMBER OF PACKETS OUTPUT (ALL CAUSES)
124 CHNPF: 0 ;NUMBER OF PACKETS FORWARDED
125 CHNSTS: 0 ;NUMBER OF STS PACKETS OUTPUT
126 CHNSNS: 0 ;NUMBER OF SNS PACKETS OUTPUT
127 CHNRTR: 0 ;NUMBER OF RETRANSMITTED PACKETS OUTPUT
128 CHNPFL: 0 ;NUMBER OF PACKETS DISCARDED (FORWARDING LOOP)
129 CHNPD: 0 ;NUMBER OF PACKETS DISCARDED (DUPLICATES)
130 CHNIPI: 0 ;NUMBER OF INTERNET PACKETS IN FROM CHAOSNET
131 CHNIPO: 0 ;NUMBER OF INTERNET FRAGMENTS OUT TO CHAOSNET
133 ;BUFFER QUEUES. EACH HAS A ONE-WORD HEADER, WHICH IS ZERO
134 ;IF IT IS EMPTY, OR CONTAINS FIRST,,LAST BUFFER ADDRESS.
137 CHQRFC: 0 ;PENDING RFCS
138 CHQLSN: 0 ;PENDING LISTENS
141 CHFRBF: 0 ;NUMBER OF FREE BUFFERS
142 CHTTBF: 0 ;TOTAL NUMBER OF BUFFERS
143 IF2 CHMXBF==50.*<1024./<%CPMXW+2>> ;MAX CORE FOR CHAOS NET 50K
144 CHMXTM: 0 ;TIME OF LAST COMPLAINT ABOUT USING TOO MUCH CORE
147 ;VARIABLES FOR TEN-11 INTERFACE CONNECTING TO CHAOS NET
149 .SEE T11CHS ;EXEC ADDRESS OF PDP11 COMMUNICATION AREA
150 T11VER=T11CHS ;VERSION NUMBER
151 T11I10=T11CHS+1 ;INIT 10
152 T11I11=T11CHS+2 ;INIT 11
153 T11PRM=T11CHS+3 ;.WORD BUFFER SIZE, # BUFFERS
154 ;THEN 4 SPARE DOUBLEWORDS
155 T11IBB: T11CHS+8 ;BEGINNING OF INPUT BUFFERS
156 T11IBE: 0 ;END OF INPUT BUFFERS
157 T11IBP: 0 ;POINTER TO NEXT INPUT BUFFER
158 T11OBB: 0 ;BEGINNING OF OUTPUT BUFFERS
159 T11OBE: 0 ;END OF OUTPUT BUFFERS
160 T11OBP: 0 ;POINTER TO NEXT OUTPUT BUFFER
161 T11BSZ: 0 ;BUFFER SIZE IN PDP10 WORDS
162 T11WIN: 0 ;1 WINNING, -1 HAVE TOLD 11 TO INIT, 0 NOT WINNING
163 T11XMQ: 0 ;QUEUED TRANSMISSION QUEUE
164 T11CKE: 0 ;COUNT OF CHECKSUM ERRORS
165 ;THE FIRST 32-BIT WORD OF A BUFFER IS 0 IF IDLE, OR
166 ;NON-ZERO IF BUFFER IS TO BE SENT TO OTHER MACHINE.
167 ;THE SECOND 32-BIT WORD IS THE CHECKSUM, WHICH IS
168 ;COMPUTED BY ADDING ALL THE 32-BIT WORDS, IGNORING OVERFLOW,
169 ; AND LOGICALLY SHIFTING RIGHT ONE BIT AFTER EACH ADD; BITS SHIFTED
170 ; OUT ON THE RIGHT ARE BROUGHT BACK IN ON THE LEFT.
171 ;IF THE NUMBER OF 16-BIT WORDS IS ODD, THE LEFT-OVER ONE BETTER BE 0.
175 ;VARIABLES FOR INTERFACE TO CHAOS NET ON PDP11 ON DL10
176 ;.SEE INDICATES A VARIABLE SHARED BETWEEN 10 AND 11
177 ;NOTE THAT THE DL10 HARDWARE LIMITS PACKET LENGTH TO 256 WORDS (1K BYTES)
179 .SEE DLCINI ;WHEN THE 11 SEES THIS NON-ZERO, IT KNOWS ITS HAS
180 ; BEEN RELOADED AND RESETS ITS PACKET POINTER TO 0
182 DLCSBF: 0 ;CURRENT BUFFER, 10 SEND SIDE (1 OR 0)
184 DLCSA1: 0 ;ADDRESS OF PACKET BEING SENT
185 DLCSA2: 0 ;DITTO, SECOND BUFFER
186 .SEE DLCSP1 ;POINTER USED BY PDP11 TO COPY PACKET (16-BIT BYTES)
187 .SEE DLCSP2 ;DITTO, SECOND BUFFER
188 .SEE DLCSS1 ;STATE FOR BUFFER 1, 0 IDLE, 1 SENT TO 11, 2 11 DONE
189 .SEE DLCSS2 ;STATE FOR BUFFER 2
191 DLCRA1: 0 ;ADDRESS OF PACKET BUFFER RECEIVING A PACKET
192 DLCRA2: 0 ;DITTO, SECOND BUFFER
193 .SEE DLCRP1 ;POINTER USED BY PDP11 TO COPY PACKET (16-BIT BYTES)
194 .SEE DLCRP2 ;DITTO, SECOND BUFFER
195 .SEE DLCRS1 ;STATE FOR BUFFER 1, 0 IDLE, 1 AWAITING 11, 2 CONTAINS A PACKET
196 .SEE DLCRS2 ;STATE FOR BUFFER 2
198 DLCXMQ: 0 ;TRANSMIT BUFFER LIST FOR DL10
199 ;NOTE THAT THIS IS NOT A REGULAR BUFFER LIST SINCE
200 ;IT IS THREADED THROUGH LH INSTEAD OF RH. WE DO MAINTAIN
201 ;POINTERS TO FIRST,,LAST HOWEVER
205 ;VARIABLES FOR CH10 INTERFACE ONLY
207 CHXCNO: CHXREN+CHXTEN+CHXCHN ;CONO BITS CURRENTLY IN EFFECT
211 ;VARIABLES FOR CH11 INTERFACE ONLY
213 CHXCSR: %CAREN+%CATEN ;CURRENT BITS WANTED IN CSR
217 ;VARIABLES THAT WOULD OTHERWISE BE IN THE FRONT-END
219 CHXXMQ: 0 ;HEAD,,TAIL OF TRANSMIT QUEUE
220 CHOSTA: 0 ;OUTPUT STATUS: 0 IDLE, ELSE NUMBER OF TRANSMISSIONS
221 NCHRTR==4 ;TRANSMIT UP TO 4 TIMES IN FACE OF COLLISIONS
224 NSUBNT==122. ;122 is maximum possible
225 SBNRUT: REPEAT NSUBNT, 1000,,3040 ;COST,,GATEWAY ADDRESS
228 CHNABT: 0 ;NUMBER OF TRANSMIT ABORTS
229 CHNCRC: 0 ;NUMBER OF CRC ERRORS BEFORE READING PACKET
230 CHNCR2: 0 ;NUMBER OF CRC ERRORS AFTER READING PACKET
231 CHNWLE: 0 ;NUMBER OF WORD LENGTH ERRORS (NOT MULTIPLE OF 16 BITS)
232 CHNPLE: 0 ;NUMBER OF PACKET LENGTH ERRORS (DISAGREES WITH LENGTH IN HEADER)
233 CHNLOS: 0 ;NUMBER OF PACKETS LOST DUE TO RECEIVER BUSY
236 CHNSPZ: 0 ;NUMBER OF TIMERS BIT COUNTER SPAZZED
241 ;Get definitions of packet format
246 PKTBSZ==%CPMXW+2 ;PACKET BUFFER IS 2 HEADER WORDS + MAX SIZE PACKET
247 IFN <PKTBSZ&<-PKTBSZ>>-PKTBSZ, .ERR PKTBSZ IS SUPPOSED TO BE A POWER OF 2
249 $CPKSX==$CHXRI+40000,,2 ;REAL PART OF SOURCE INDEX
250 $CPKDX==$CHXRI+40000,,1 ;REAL PART OF DESTINATION INDEX
256 ;;; This contains the last N headers received from the network
259 RECHDP: RECHDR ;POINTER TO NEXT
260 RECHDR: BLOCK NRECHD*%CPKDT
263 SUBTTL CHAOS NET OPEN (.CALL CHAOSO)
265 ;.CALL CHAOSO,RCVCHN,XMTCHN,<RECEIVE,,TRANSMIT>
267 CHASO: JRST OPNL12 ; Say "mode not avail"
272 JRST OPNL14 ;BAD CHANNEL NUMBER ARGUMENT
274 JRST OPNL33 ;BOTH CHANNELS SAME IS ILLEGAL
275 PUSH P,A ;SAVE ARGS, CLOSE THE SPECIFIED CHANNELS
287 MOVE U,USER ;TO SAVE ULCERS
288 HRRZM A,UUAC(U) ;REMEMBER INPUT CHNL # FOR ERRS
289 PUSHJ P,SWTL ;LOCK CHAOS INDEX ASSIGNMENT SWITCH
291 MOVE I,CHALCP ;ALLOCATE AN INDEX
293 CHASO1: SKIPL CHSUSR(I)
296 CHASO2: MOVEI I,NINDX ;REACHED BEGINNING, WRAP AROUND TO END
298 JRST OPNL6 ;ALL INDICES IN USE
302 CHASO3: MOVEM I,CHALCP ;SAVE SCAN POINTER FOR NEXT TIME
303 PUSHJ P,CHASO4 ;INIT VARIOUS STUFF
304 CAILE C,MXWIND ;SET UP WINDOW SIZE
305 MOVEI C,MXWIND ;DON'T LET USER USE UP TOO MUCH WIRED CORE
307 HRRZM U,CHSUSR(I) ;VARIABLES INITIALIZED, MAKE INDEX IN USE.
308 DPB A,[$CHSUI,,CHSUSR(I)]
309 DPB B,[$CHSUO,,CHSUSR(I)]
310 HRLZ T,I ;SET UP USER'S IOCHNM WORDS
317 JRST LSWPJ1 ;SUCCESS RETURN
319 ;INITIALIZE CONNECTION IN I
320 CHASO4: SETZM CHSNBF(I)
326 SETZM CHSPKN(I) ;START PACKET NUMBERING AT ONE
331 MOVSI T,%CFOFF .SEE %CSCLS
333 LDB TT,[$CHXUN+40000,,CHSLCL(I)]
334 CAIE TT,CHXMUN ;INCREMENT THE UNIQUIZER
336 MOVEI TT,1 ;BUT MAKE SURE IT ISN'T ZERO
337 DPB TT,[$CHXUN+40000,,CHSLCL(I)]
341 SUBTTL CHAOS NET CLOSE, FINISH, WHYINT, NETBLK, CHAOSQ
343 ;CLOSE A CHAOS CHANNEL.
344 CHACLS: HLRZ I,(R) ;GET VARIABLES INDEX
346 TDNN A,CHSSTA(I) ;ONLY REALLY CLOSE WHEN BOTH CHANNELS CLOSED
348 PUSHJ P,CHACS1 ;FLUSH ALL BUFFERS OF THIS CONNECTION
351 PUSHJ P,CHABGI ;SEND A CLS IF OPEN AND MEM AVAIL
357 MOVEI B,[ASCIZ/Channel closed/]
359 CHACS4: CONO PI,NETOFF
360 SETZM (R) ;CLOSE THIS CHANNEL
361 SETOM CHSUSR(I) ;RETURN INDEX
362 MOVE W,CHQLSN ;FLUSH ANY PENDING LSN PACKET
364 CHACS5: MOVEI Q,W ;GET NEXT PACKET OFF OLD LIST
366 JUMPE A,NETONJ ;EXHAUSTED
367 LDB B,[$CPKSX(A)] ;GET OWNER
369 JRST [ MOVEI Q,CHQLSN ;NOT THIS INDEX, PUT BACK
375 CHACS7: IORM A,CHSSTA(I) .SEE %CFCLS
376 HRRZ B,(R) ;GET DIRECTION
377 CAIN B,CHAIDN ;AS A BYTE POINTER TO CHANNEL NUMBER
378 SKIPA B,[$CHSUI,,CHSUSR(I)]
379 MOVE B,[$CHSUO,,CHSUSR(I)]
380 MOVEI T,77 ;CLOSE THAT CHANNEL
385 ;THIS FLUSHES ALL BUFFERS FOR CONNECTION IN I
386 CHACS1: MOVSI A,%CFOFF ;INHIBIT RETRANSMISSIONS
388 LDB E,[$CFTTN,,CHSSTA(I)]
391 PUSHJ P,NSTYN0 ;DISCONNECT FROM STY
395 MOVEI Q,DLCXMQ ;REMOVE THIS INDEX'S BUFFERS FROM DL10 TRANSMIT LIST
399 MOVEI Q,T11XMQ ;REMOVE THIS INDEX'S BUFFERS FROM TEN11 TRANSMIT LIST
403 MOVEI Q,CHXXMQ ;REMOVE THIS INDEX'S BUFFERS FROM CH10 TRANSMIT LIST
406 MOVEI Q,CHSIBF(I) ;RETURN RECEIVE BUFFERS
408 MOVEI Q,CHSPBF(I) ;RETURN OUT OF ORDER RECEIVE BUFFERS
410 MOVEI Q,CHSOBF(I) ;RETURN TRANSMIT BUFFERS
413 SKIPE A,CHSOBP(I) ;RETURN STREAM I/O BUFFERS
430 ;.CALL FORCE ON A CHAOS OUTPUT CHANNEL.
432 SKIPGE CHSSTA(I) .SEE %CFOFF
433 JRST OPNL7 ;DEVICE NOT READY
434 AOS (P) ;WILL TAKE SUCCESS RETURN
435 CHAFC1: SKIPN A,CHSOBP(I)
436 POPJ P, ;NO BUFFERED OUTPUT TO BE FORCED
437 SUBI A,1 ;SIOKT LIKES TO POINT BP AT NEXT BUFFER
438 ANDI A,-PKTBSZ ;GET PACKET POINTER
440 MOVSI T,(SETZ) ;DATA OPCODE
441 MOVEM T,(A) .SEE $CPKOP
442 MOVEI T,%CPMXC ;SET BYTE COUNT
445 PUSHJ P,[JUMPN T,CHODT1 ;IF THERE IS ANYTHING IN THE BUFFER, TRANSMIT IT
446 JRST CHABRT ] ;OTHERWISE, JUST THROW IT AWAY
447 SETZM CHSOBP(I) ;NOW THERE IS NO BUFFER
451 ;.CALL FINISH ON A CHAOS OUTPUT CHANNEL. WAIT FOR ALL BUFFERS
452 ;ON SEND LIST TO GET SENT AND ACKNOWLEDGED.
453 ;HANGS FOREVER IF SOCKET GETS INTO AN IMPROPER STATE, BUT YOU SHOULD GET AN INTERRUPT
455 PUSHJ P,[HRRZ A,CHSWIN(T)
462 ;.CALL WHYINT ON A CHAOS CHANNEL.
463 ;RESULTS ARE: A/ %WYCHA
465 ; C/ LH NUMBER OF INPUT PACKETS AVAILABLE
466 ; RH NUMBER OF OUTPUT SLOTS AVAILABLE
467 ; D/ WINDOW SIZE (RECEIVE,,TRANSMIT)
468 ; E/ INPUT CHNL#,,OUTPUT CHNL#
472 HRLZ C,CHSNBF(I) ;NUMBER OF PACKETS AVAILABLE
474 ADD C,[1,,] ;ADD 1 IF PARTIALLY-READ INPUT BUFFER EXISTS
477 MOVEI C,0 ;NO INPUT AVAILABLE IF DIRECT-CONNECTED
481 LDB E,[$CHSUO,,CHSUSR(I)]
484 LDB T,[$CHSUI,,CHSUSR(I)]
490 ;.CALL RFNAME on a CHAOS channel. A contains index.
491 ;Returns results analogous to RFNAME on TCP: and (almost) RFNAME on NET:.
492 ;"FN1" is local index, "FN2" is foreign index, "SNAME" is foreign host
493 ;number in HOSTS3 format.
494 CHARCH: LDB B,[042000,,CHSLCL(A)]
495 LDB C,[042000,,CHSFRN(A)]
496 LDB D,[242000,,CHSFRN(A)]
500 ;IOPDL ROUTINES. I IS 0 FOR IOPUSH, 1 FOR IOPOP. R POINTS AT IOCHNM WORD.
501 ;C(R) IS SET UP TO THIS DEVICE IN EITHER CASE.
502 CHAIOP: HRRZ T,R ;DISCOVER CHANNEL NUMBER
505 MOVEI T,77 ;IOPUSH, USE 77
506 HLRZ I,(R) ;GET CHAOS INDEX
507 HRRZ B,(R) ;GET DIRECTION
508 CAIN B,CHAIDN ;AS A BYTE POINTER TO CHANNEL NUMBER
509 SKIPA B,[$CHSUI,,CHSUSR(I)]
510 MOVE B,[$CHSUO,,CHSUSR(I)]
511 DPB T,B ;ADJUST SAVED CHANNEL NUMBER
514 ;.CALL NETBLK ON A CHAOS CHANNEL.
515 ;ARG 1 - CHANNEL (COMES IN IN R)
516 ;ARG 2 - UNDESIRED STATE
517 ;ARG 3 - OPTIONAL TIMEOUT, WRITTEN BACK UNLESS IMMEDIATE
523 IFN NCPP, JRST ANETBL ;NOT A CHAOS CHANNEL, TRY ARPANET
524 IFE NCPP, JRST OPNL34
526 MOVE T,I ;SAVE INDEX IN T FOR FLSINS
528 JRST [ HRLOI D,377777 ;NO TIME GIVEN, USE INFINITY
530 TLNE C,1000 ;SKIP IF POINTER RATHER THAN IMMEDIATE
531 JRST [ HRRZ D,C ;GET IMMEDIATE TIME
534 XCTR XRW,[MOVES D,(C)] ;GET TIME, CHECK WRITEABILITY
535 JUMPGE D,[ MOVNS D ;RELATIVE TIME, MAKE NEGATIVE ABSOLUTE
538 UMOVEM D,(C) ;STORE BACK ABSOLUTE TIME
539 MOVNS D ;MAKE POSITIVE
540 CHANB4: MOVEM D,AC0S+D(U) ;SAVE ABSOLUTE TIME TO WAIT UNTIL
541 MOVEM B,AC0S+B(U) ;SAVE UNDESIRED STATE
542 PUSHJ P,CHANB2 ;SKIP IF STATE CHANGE OR TIMEOUT
545 SUB B,TIME ;HOW MUCH USED?
546 HRRZ A,CHSSTA(I) ;NEW STATE
549 CHANB2: HRRZ A,CHSSTA(T) ;CURRENT STATE
550 CAME A,AC0S+B(U) ;SKIP IF STILL MATCH
552 MOVE A,AC0S+D(U) ;TIMEOUT TIME
558 ;ARG 1 - ADDRESS OF A %CPMXW-WORD PACKET BUFFER
559 ;FINDS THE FIRST PACKET ON THE PENDING-RFC QUEUE, COPIES IT
560 ;INTO THE USER'S BUFFER, AND RETURNS IT TO THE QUEUE.
561 CHAOSQ: MOVE C,A ;SAVE POINTER TO USER'S BUFFER
562 HRL A,A ;MAKE SURE USER'S BUFFER IS SWAPPED IN
563 XCTR XBRW,[BLT A,%CPMXW-1(C)] ;AND NO MAR BREAK SET
564 MOVEI Q,CHQRFC ;GET FIRST PACKET ON RFC QUEUE
566 JUMPE A,OPNL4 ;QUEUE IS EMPTY
567 PUSHJ P,CHAQPL ;PUT BACK AT END OF QUEUE
568 HRL C,A ;COPY PACKET TO USER
570 XCTR XBW,[BLT T,%CPMXW-1(C)]
573 SUBTTL CHAOS NET IOT ROUTINES
575 ;.CALL PKTIOT. ARG1 CHANNEL, ARG2 ADDRESS OF %CPMXW-WORD BUFFER
580 JRST OPNL34 ;WRONG TYPE DEVICE
581 ;CHAOSNET INPUT PKTIOT
582 ;B POINTS TO %CPMXW-WORD PACKET BUFFER
583 CHPKI: PUSHJ P,CHAIOS ;SET UP I, E
584 HLRZ A,CHSIBF(I) ;GET FIRST RECEIVE BUFFER
585 JUMPE A,[PUSHJ P,CHPKI0 ;LIST EMPTY
587 HRL B,A ;COPY TO USER BEFORE REMOVING FROM LISTS
588 LDB T,[$CPKNB(A)] ;GET SIZE OF PACKET
589 ADDI T,4*%CPKDT+3 ;HEADER PLUS ROUND-UP TO NEXT WORD BOUNDARY
590 LSH T,-2 ;CONVERT BYTES TO WORDS
591 ADDI T,-1(B) ;ADDRESS OF LAST DESTINATION WORD
593 LDB TT,[$CPKOP(A)] ;GET OPCODE
594 CAIGE TT,%CODAT ;ACKNOWLEDGE IF DATA
595 CAIN TT,%COEOF ;OR EOF MARK
597 SOS CHSNBF(I) ;NOW REMOVE BUFFER FROM RECEIVE LIST
600 PUSHJ P,CHABRT ;AND RETURN TO FREE
603 ;INPUT WITH INPUT BUFFER EMPTY. MUSTN'T BASH B,C,E.
604 CHPKI0: SKIPGE CHSSTA(I) .SEE %CFOFF
605 JRST [ HRRZ T,CHSSTA(I)
606 CAIE T,%CSFRN ;CHAOSNET OR FOREIGN PROTOCOL?
607 JRST IOCR10 ;IOT WITH CHANNEL IN IMPROPER STATE
608 JRST .+1 ] ;WAIT BUT DON'T TRY TO TOUCH WINDOW SIZE
609 ;HERE CONSIDER INCREASING WINDOW SIZE
610 SKIPN CHSIBF(I) ;AWAIT INPUT
614 ;ACKNOWLEDGE DATA PACKET IN A. ITS OPCODE IN TT.
615 CHPKIA: LDB T,[$CPKPN(A)] ;GET PACKET #
616 HRLM T,CHSPKN(I) ;IT NOW NEEDS TO BE ACKNOWLEDGED
617 CAIN TT,%COEOF ;ALWAYS ACKNOWLEDGE EOF RIGHT AWAY
619 HLRZ TT,CHSACK(I) ;GET LAST ONE REALLY ACKNOWLEDGED
620 SUB T,TT ;GET NUMBER OF PACKETS AWAITING ACK
623 IMULI T,3 ;MORE THAN ONE THIRD THE WINDOW SIZE?
626 CAMN TT,[ASCII/LUNCH/]
627 BUG PAUSE,[CHAOS BUFFER ADDRESS TRASHED],OCT,A
631 PUSHJ P,CHASTO ;YES, SEND ACK (CAN'T PCLSR)
634 ;SET UP FOR CHAOS IOT
635 CHAIOS: HLRZ I,(R) ;GET INDEX
638 JRST IOCR10 ;CAN'T DO I/O WHILE DIRECT-CONNECTED OR HALF-CLOSED
639 HRRZS E ;RETURN STATE IN E
643 ;1.4 IN CTLBTS IS DON'T-HANG MODE
646 PUSHJ P,CHAIOS ;SET UP I, E
656 ;CHAOS INPUT BUFFER DISCARD
657 CHAIBD: SKIPN A,CHSIBP(I)
663 ;CHAOS INPUT BUFFER GET
664 CHAIBG: HLRZ A,CHSIBF(I) ;GET FIRST RECEIVE BUFFER
666 LDB TT,[$CPKOP(A)] ;IS IT NORMAL DATA?
669 PUSHJ P,CHAIB3 ;YES, ACKNOWLEDGE AND REMOVE FROM LIST
670 LDB J,[$CPKNB(A)] ;SET UP FOR BYTE STREAM INPUT
677 PUSHJ P,CHPKIA ;SEND ACKNOWLEDGEMENT
681 SOS CHSNBF(I) ;REMOVE BUFFER FROM RECEIVE LIST
685 CHAIB1: CAIE TT,%COEOF
687 PUSHJ P,CHAIB3 ;EOF PACKET, ACKNOWLEDGE IT
688 PUSHJ P,CHABRT ;RETURN IT TO FREE
689 JRST POPJ2 ;AND SIGNAL EOF
691 CHAIB2: MOVE TT,CTLBTS(U) ;CHECK DON'T-HANG MODE
694 JUMPN A,IOCR10 ;NO, ABNORMAL PACKET, BARF
695 PUSHJ P,CHPKI0 ;AWAIT INPUT
699 ;1.4 IN CTLBTS IS DON'T-HANG MODE
702 PUSHJ P,CHAIOS ;SET UP I, E
704 JRST IOCR10 ;NOT OPEN, ERROR
714 ;GET NEW OUTPUT BUFFER
715 CHAOBG: SKIPG CHSNOS(I) ;WINDOW FULL
716 PUSHJ P,[ MOVE TT,CTLBTS(U)
720 JRST POPJ2 ] ;DON'T HANG MODE, RETURN "EOF"
722 PUSHJ P,CHABGT ;SET UP AN OUTPUT BUFFER
737 ;CHAOSNET OUTPUT PKTIOT.
738 ;B POINTS TO %CPMXW-WORD PACKET BUFFER
739 CHPKO: PUSHJ P,CHAIOS ;SET UP I, E
740 UMOVE H,(B) ;GET HEADER WORD OF USER'S PACKET BUFFER
741 LDB D,[$CPKNB H] ;GET BYTE COUNT
743 TLNE H,(.BM $CPKMV) ;WE DON'T SUPPORT MUPPETS ANY MORE
744 JRST IOCER3 ;BYTE LENGTH OUT OF BOUNDS
745 ADDI D,4*%CPKDT+3 ;CONVERT BYTES TO WORDS, INCLUDING HEADER WDS
747 MOVSI J,1(B) ;SAVE ADDRESS+1 OF USER'S PACKET
748 PUSHJ P,CHABGT ;GET A BUFFER
749 PUSHJ P,LOSSET ;RETURN IT IF PCLSR
751 MOVEM H,(A) ;STORE PACKET HEADER, NOT STORED WITH BLT
752 HRRI J,1(A) ; BECAUSE MIGHT HAVE CHANGED AFTER ERROR CHECK
754 XCTR XBR,[BLT J,(D)] ;COPY USER'S PACKET INTO SYSTEM
755 AOS (P) ;GOING TO SUCCEED
756 SKIPGE (A) ;SKIP IF CONTROL PACKET
758 LDB D,[$CPKOP(A)] ;GET OPCODE
759 CAIGE D,%COMAX ;DISPATCH ON IT
762 JRST IOCER3 ;OPCODE OUT OF BOUNDS
776 %COBRD::JRST IOCER9 ;UNTIL I IMPLEMENT IT
779 ;LOSSET ROUTINE TO RETURN BUFFER A POINTS TO.
780 CHPKO2: MOVE A,AC0S+A(U)
781 PUSH P,Q ;MAY CLOBBER ONLY A AND T
785 ;SENDING %COEOF (END-FILE MARK)
786 CHOEOF: CAIE E,%CSOPN ;CONNECTION MUST BE OPEN
789 PUSHJ P,UFLS ;WINDOW FULL, WAIT
790 JRST CHOOP1 ;SEND RETRANSMITTABLE CONTROL PACKET
792 ;SENDING REQUEST FOR CONNECTION
793 CHORFC: PUSHJ P,CHORF1 ;RE-INITIALIZE CONNECTION
794 MOVSI B,777774 ;SAVE DESTINATION HOST, CLEAR OTHER BITS
797 MOVEI E,%CSRFS ;PUT INTO RFC-SENT STATE
800 ;RE-INITIALIZE CONNECTION WHEN USER OUTPUTS RFC OR LSN
801 ;FLUSHES ANY OLD PACKET BUFFERS, CHANGES UNIQUIZER IN INDEX#
802 CHORF1: JUMPN E,IOCR10 .SEE %CSCLS ;CONNECTION MUST BE CLOSED
805 PUSHJ P,CHACS1 ;FLUSH BUFFERS FROM CONNECTION
806 PUSHJ P,CHASO4 ;REINITIALIZE VARIABLES
810 CHOLSN: PUSHJ P,CHORF1
811 PUSHJ P,LSWDEL ;GOING TO USE PACKET
812 MOVEI E,%CSLSN ;PUT INTO LISTENING STATE
814 MOVEI Q,CHQRFC ;NOW SEARCH PENDING-RFC QUEUE
817 JRST [ CONO PI,NETON ;NO MATCH, PUT ONTO LISTENING QUEUE
822 PUSHJ P,CHIRF0 ;MATCH, JOIN INTERRUPT LEVEL CODE
826 CHOOPN: CAIE E,%CSRFC ;CONNECTION MUST BE RFC-RECEIVED
828 MOVEI TT,4 ;SET BYTE COUNT TO 4
830 PUSHJ P,DPBRCP ;INCLUDE RECEIPT
831 HLRZ B,CHSWIN(I) ;INCLUDE WINDOW SIZE
832 DPB B,[042000,,%CPKDT(A)]
833 MOVEI E,%CSOPN ;MAKE IT OPEN
834 ;HERE TO SEND A RETRANSMITTABLE CONTROL PACKET (RFC OR OPN), NEW STATE IN E
835 ;THIS PACKET WILL GET TAKEN OFF THE CHSOBF LIST BY RECEIPT IN THE NORMAL WAY
836 ;THIS CODE COPIED FROM CHODAT WITH SOME MODIFICATIONS
837 CHOOP1: MOVE T,TIME ;UPDATE CHSITM SO WON'T THINK HOST IS DOWN
839 MOVEM E,CHSSTA(I) ;AND CLEAR %CFOFF (NO OTHER LH FLAGS CAN BE ON)
840 PUSHJ P,LSWDEL ;BUFFER WILL BE USED
841 HRRZ B,CHSPKN(I) ;ASSIGN PACKET NUMBER
847 HLRZ B,CHSPKN(I) ;GET PACKET NUMBER TO ACKNOWLEDGE
848 HRLM B,CHSACK(I) ;REMEMBER IT HAS BEEN
849 DPB B,[$CPKAN(A)] ;PIGGY-BACK THIS ACKNOWLEDGE
850 MOVE B,[<.BM $CPKOP>+<.BM $CPKNB>]
851 ANDM B,(A) ;CLEAR FORWARDING COUNT AND UNUSED FIELD
852 MOVE B,CHSLCL(I) ;SET UP SOURCE
854 MOVE D,CHSFRN(I) ;SET UP DESTINATION
856 SETOM -2(A) ;NOTE NOT ON TRANSMIT LIST YET
857 CONI PI,E ;SUPER KLUDGERY REQUIRED HERE! FOREIGN HOST MIGHT RECEIPT
858 CONO PI,NETOFF ;THIS PACKET JUST AS WE START TO TRANSMIT IT. THIS IS A
859 ;VIOLATION OF PROTOCOL, BUT SHOULDN'T CRASH I.T.S. BECAUSE THE
860 ;PACKET ABOUT TO BE GIVEN TO CHAXMT HAS BEEN FREED ALREADY.
861 MOVEI Q,CHSOBF(I) ;PUT ON END OF SEND LIST
863 JRST CHAXM0 ;GO TRANSMIT
866 CHOCLS: CAIE E,%CSOPN ;CONNECTION MUST BE OPEN
868 CHOFWD: CAIN E,%CSRFC ; OR RFC-RECEIVED
869 TLOA E,%CFOFF ;PUT IT INTO THE CLOSED STATE
871 HLLZM E,CHSSTA(I) .SEE %CSCLS
872 PUSHJ P,LSWDEL ;BUFFER WILL BE USED
873 JRST CHODT2 ;GO TRANSMIT
875 ;Here for transmitting an UNC packet. It could be part of a connection
876 ;or it could be foreign-protocol mode. In any case transmit it without
877 ;munging the header very much.
878 CHOUNC: CAIN E,%CSFRN
879 JRST CHOUN1 ;Okay to transmit UNC now
882 JUMPN E,IOCR10 .SEE %CSCLS ;Bad state
883 SKIPE CHSPBF(I) ;I guess out of order packets would
884 JRST IOCR10 ; cause some confusion in the NCP.
885 MOVE E,[%CFOFF,,%CSFRN] ;Put into foreign-protocol state
887 MOVE D,%CPKD(A) ;Save destination
889 CHOUN2: MOVE D,CHSFRN(I) ;Set up destination
891 CHOUN1: MOVE B,CHSLCL(I) ;Set up source
899 ;SENDING REGULAR PACKET
900 CHODAT: CAIE E,%CSOPN ;CONNECTION MUST BE OPEN
903 PUSHJ P,UFLS ;WINDOW FULL, WAIT
904 PUSHJ P,LSWDEL ;BUFFER WILL BE USED
905 CHODT1: HRRZ B,CHSPKN(I) ;ASSIGN PACKET NUMBER
911 CHODT2: HLRZ B,CHSPKN(I) ;GET PACKET NUMBER TO ACKNOWLEDGE
912 HRLM B,CHSACK(I) ;REMEMBER IT HAS BEEN
913 DPB B,[$CPKAN(A)] ;PIGGY-BACK THIS ACKNOWLEDGE
914 MOVE B,[<.BM $CPKOP>+<.BM $CPKNB>]
915 ANDM B,(A) ;CLEAR FORWARDING COUNT AND UNUSED FIELD
916 MOVE B,CHSLCL(I) ;SET UP SOURCE
918 MOVE D,CHSFRN(I) ;SET UP DESTINATION
920 SETOM -2(A) ;NOTE NOT ON TRANSMIT LIST YET
921 SKIPL (A) ;SKIP IF DATA PACKET
923 CONI PI,E ;SUPER KLUDGERY REQUIRED HERE! FOREIGN HOST MIGHT RECEIPT
924 CONO PI,NETOFF ;THIS PACKET JUST AS WE START TO TRANSMIT IT. THIS IS A
925 ;VIOLATION OF PROTOCOL, BUT SHOULDN'T CRASH I.T.S. BECAUSE THE
926 ;PACKET ABOUT TO BE GIVEN TO CHAXMT HAS BEEN FREED ALREADY.
927 MOVEI Q,CHSOBF(I) ;PUT ON END OF SEND LIST
929 SOSA CHSNOS(I) ;USE UP WINDOW, SKIP
930 ;SKIPS THROUGH INTO CHAXMT
932 SUBTTL CHAOS NET PACKET TRANSMIT ROUTINE
934 ;CALL WITH PACKET IN A, SMASHES B, C, D, E, T, TT, Q, J
935 ;USES E TO SAVE THE PI STATUS, NOTHING BETTER CLOBBER THIS, OR, BOY, WILL IT EVER LOSE!
936 ;YOU BETTER SETOM -2(A) BEFORE CALLING THIS, AND IF YOU'RE
937 ;PUTTING IT ON A SEND LIST, DO THAT FIRST ALSO.
938 ;THIS CODE ASSUMES THERE IS ONLY ONE INTERFACE, AND IT IS ON A
939 ;PDP11 WHICH WILL TAKE CARE OF THE ROUTING.
940 ;;THIS ROUTINE IS SKIPPED INTO FROM THE PREVIOUS PAGE!
941 CHAXMT: CONI PI,E ;SAVE PI STATUS BEFORE TURNING NETOFF; CALLED FROM MANY LEVELS
945 MOVEM T,-1(A) ;SET TIME OF LAST TRANSMISSION
946 CONO PI,NETOFF ;ONE PROCESS AT A TIME, TO PROTECT INTERFACE VARIABLES
948 HLRZ J,-2(A) ;I TOLD YOU TO SETOM -2(A)
950 BUG PAUSE,[CHAOS BUFFER THREAD TRASHED],OCT,A,OCT,-2(A)
953 ;FOR NOW, JUST ALWAYS SHIP IT OUT THE DL10
955 HLRZ J,DLCXMQ ;MAKE SURE NOT PUTTING ON LIST TWICE
958 BUG PAUSE,[CHAOS BUFFER ALREADY ON DLCXMQ],OCT,A
961 BUG PAUSE,[DLCXMQ THREAD TRASHED]
963 MOVEI J,1 ;MAKE SURE NOT ACTIVE TO 11
966 BUG PAUSE,[CHAOS BUFFER ALREADY ACTIVE TO 11],OCT,A
969 HRRZS -2(A) ;PUT END-LIST INDICATOR IN LH (FLAGS TRANSMIT ACTIVE)
970 MOVE J,DLCSBF ;SEE IF SEND BUFFER IS FREE
973 PUSHJ P,DLCXMT ;YES, SEND THE PACKET NOW
976 CHXMD1: HRRZ B,DLCXMQ ;NO BUFFERS FREE RIGHT NOW, QUEUE
977 JUMPE B,[ HRLZM A,DLCXMQ ? JRST .+2 ]
980 CHXMD2: CONO PI,PICON(E) ;RESTORE PI
984 ;FOR NOW, JUST ALWAYS SHIP IT OUT THE TEN11
985 PUSHJ P,T11CHK ;SEE IF TEN-11 IS READY
987 SKIPE @T11OBP ;SEE IF HAVE AVAILABLE OUTPUT BUFFER
989 PUSHJ P,T11XMT ;SEND THE PACKET NOW
992 CHXME3: HRROS T,-2(A) ;TEN11 DOWN, DISCARD PACKET
997 CHXME1: HRRZ B,T11XMQ ;NO BUFFERS FREE RIGHT NOW, QUEUE
998 JUMPE B,[ HRLZM A,T11XMQ ? JRST .+2 ]
1001 HRRZS -2(A) ;PUT END-LIST INDICATOR IN LH
1002 CHXME2: CONO PI,PICON(E) ;RESTORE PI
1006 ;FOR NOW, JUST ALWAYS SHIP IT OUT THE CH10
1007 HRRZ B,CHXXMQ ;ADD TO END OF TRANSMIT QUEUE
1008 JUMPE B,[ HRLZM A,CHXXMQ ? JRST .+2 ]
1011 HRRZS -2(A) ;PUT END-LIST INDICATOR IN LH
1012 MOVEI B,CHXTEN ;ENABLE TRANSMIT-DONE INTERRUPT
1015 CONO PI,PICON(E) ;RESTORE PI
1019 ;FOR NOW, JUST ALWAYS SHIP IT OUT THE CH11
1020 HRRZ B,CHXXMQ ;ADD TO END OF TRANSMIT QUEUE
1021 JUMPE B,[ HRLZM A,CHXXMQ ? JRST .+2 ]
1024 HRRZS -2(A) ;PUT END-LIST INDICATOR IN LH
1025 MOVEI B,%CATEN ;ENABLE TRANSMIT-DONE INTERRUPT
1028 CONO PI,PICON(E) ;RESTORE PI
1032 SUBTTL CHAOS NET DIRECT CONNECT TO STY
1036 ;CALLED AT CLOCK LEVEL FROM STYNTC WHEN A CHAOS STY IS ENCOUNTERED
1037 ;TTY NUMBER IN I & R
1038 STYCHA: MOVE I,STYNTI-NFSTTY(R) ;GET CHAOS INDEX
1041 JRST 4,. ;CHAOS CONNECTION CLAIMS NOT BE CONNECTED?
1042 JUMPL TT,STYCH9 .SEE %CFOFF ;OK TO USE? IF NOT, DISCONNECT
1043 SKIPGE TTYOAC(R) ;ANY OUTPUT?
1044 JRST STYCH1 ;NO, CHECK FOR INPUT
1045 SKIPN D,CHSOBP(I) ;IF BUFFER ALLOCATED, USE IT
1046 JRST [ SKIPG CHSNOS(I) ;OTHERWISE ALLOCATE ONE
1047 JRST STYCH1 ;WINDOW FULL, WAIT UNTIL REACTIVATED
1049 JRST STYCH3 ;NO CORE, WAIT ONE CLOCK TICK
1057 JRST STYCH4 ;BUFFER FULL, FORCE IT
1058 EXCH R,I ;I GETS TTY, R GETS CHAOS
1060 MOVEM D,DBBBP ;SET UP BUFFER FOR TTY OUTPUT INTERRUPT LEVEL
1065 PUSHJ P,TYP ;GENERATE OUTPUT
1068 EXCH R,I ;I GETS CHAOS, R GETS TTY
1069 MOVE D,DBBBP ;ADVANCE POINTERS
1072 SUB E,DBBCC1 ;MINUS # CHARS OUTPUT GENERATED
1075 STYCH4: PUSHJ P,CHAFC1 ;FORCE THE BUFFER
1076 JRST STYCHA ;CHECK FOR MORE OUTPUT
1078 STYCH3: PUSHJ P,CHINTI ;REACTIVATE SO WILL COME BACK ON NEXT CLOCK TICK
1079 STYCH1: SOSGE CHSIBC(I) ;GET INPUT, IF ANY
1080 JRST [ PUSHJ P,CHAIBD ;DISCARD EXHAUSTED INPUT BUFFER, IF ANY
1082 JUMPE A,STYNT8 ;NONE, RETURN TO STYNTC
1085 JRST STYCH9 ;RANDOM PACKET, DISCONNECT
1086 PUSHJ P,CHPKIA ;ACKNOWLEDGE GOBBLING OF THIS PACKET
1087 SOS CHSNBF(I) ;REMOVE BUFFER FROM RECEIVE LIST
1090 LDB E,[$CPKNB(A)] ;SET UP FOR BYTE STREAM INPUT
1096 ILDB A,CHSIBP(I) ;GET CHARACTER OF INPUT
1098 JRST [ AOS CHSIBC(I) ;WOOPS, SPECIAL CHARACTER, NEEDS USER ATTENTION
1099 MOVSI A,8_14 ;SO PUT IT BACK AND DISCONNECT
1102 EXCH R,I ;I GETS TTY, R GETS CHAOS
1106 PUSHJ P,NTYI5 ;GIVE CHARACTER TO TTY INPUT INTERRUPT LEVEL
1109 POP P,I ;I GETS CHAOS, R GETS TTY ((POP IN REVERSE ORDER))
1110 JRST STYCH1 ;TRY FOR MORE INPUT
1113 MOVE I,R ;I GETS TTY
1114 PUSHJ P,NSTYN0 ;DISCONNECT THE STY
1116 POP P,I ;I GETS CHAOS
1117 PUSHJ P,CHINTI ;WAKE UP THE TELNET SERVER
1118 JRST STYNT8 ;GO HANDLE OTHER STYS
1120 SUBTTL CHAOS NET CLOCK LEVEL STUFF
1124 ;HERE FROM 1/2 SECOND CLOCK. DO RETRANSMISSIONS AND DELAYED STS'S
1128 PUSHJ P,DLCIBG ;GET MEMORY FOR INPUT BUFFERS IF NEEDED
1131 MOVEI I,NINDX-1 ;SCAN ALL INDICES
1132 CHACL0: SKIPL CHSUSR(I) ;SKIP THIS ONE IF NOT IN USE
1133 SKIPGE CHSSTA(I) .SEE %CFOFF ;OR INHIBITED FROM PI LEVEL
1135 JUMPL I,CPOPJ ;JUMP IF ALL INDICES DONE
1136 PUSHJ P,CHARTR ;RETRANSMIT IF NEEDED
1138 TDNE B,CHSSTA(I) ;SEND STS IF NEEDED
1143 ;HERE EVERY 5 SECONDS, TO DO PROBES
1144 CHA5CL: MOVEI I,NINDX-1 ;SCAN ALL INDICES
1145 CHA5C0: SKIPL CHSUSR(I) ;SKIP IF THIS ONE NOT IN USE
1146 SKIPGE CHSSTA(I) .SEE %CFOFF ;OR INHIBITED FROM PI LEVEL
1147 CHA5C1: SOJGE I,CHA5C0
1148 JUMPL I,CHA5C4 ;JUMP IF ALL INDICES DONE
1150 SUB T,CHSITM(I) ;TIME SINCE LAST COMMUNICATION FROM OTHER END
1152 JRST [ MOVEI W,%CSINC ;TOO LONG, CONNECTION BROKEN
1155 HRRZ B,CHSSTA(I) ;ONLY PROBE IF OPEN (COULD BE RFC-SENT)
1158 HRRZ B,CHSWIN(I) ;SEE IF NO TRANSMIT WINDOW (LOST STS DURING OPEN)
1160 HRRZ B,CHSACK(I) ;SEE IF AWAITING ACK (WINDOW NOT EMPTY)
1164 CHA5C2: PUSHJ P,CHABGI ;AWAITING ACK OR IDLE FOR 1 MINUTE, PROBE
1165 JRST CHA5C1 ;NO PROBE, OR NO BUFFER AVAILABLE
1166 MOVSI T,(.DPB %COSNS,($CPKOP),0) ;SENSE PACKET, BYTE-COUNT=0
1172 CHA5C4: MOVEI B,[ASCIZ/Timeout/]
1173 MOVEI Q,CHQRFC ;TIME-OUT FIRST RFC ON LIST
1177 ADDI T,60.*30. ;TIME-OUT IS ONE MINUTE
1178 PUSHJ P,[ CAMG T,TIME
1183 MOVEI T,CHXREN+CHXTEN ;WAKE UP IN CASE OF TIMING ERROR
1184 IORM T,CHXCNO ;IN DEALING WITH CHXCNO
1186 MOVSI T,-NSUBNT ;DECAY ROUTING COSTS
1187 CONO PI,NETOFF ;PREVENT RUT PACKET FROM COMING IN
1188 CHA5C6: HLRZ TT,SBNRUT(T)
1196 MOVEI T,%CAREN+%CATEN ;WAKE UP IN CASE OF TIMING ERROR
1197 IORB T,CHXCSR ;IN DEALING WITH CHXCSR
1199 MOVSI T,-NSUBNT ;DECAY ROUTING COSTS
1200 CONO PI,NETOFF ;PREVENT RUT PACKET FROM COMING IN
1201 CHA5C6: HLRZ TT,SBNRUT(T)
1214 ;RETRANSMIT FOR INDEX IN I
1215 CHARTR: CONI PI,W ;SAVE PI CHANNELS ACTIVE
1216 ANDI W,177 ;CHAXMT BETTER NOT CLOBBER W!
1217 CONO PI,NETOFF ;PI BETTER BE OFF THROUGHOUT THIS ZONE
1218 ; SO WE DON'T GET INTO CHIACK
1219 HLRZ A,CHSOBF(I) ;SCAN DOWN OUTPUT BUFFER LIST
1220 JUMPE A,CHART2 ;EMPTY
1221 CHART1: MOVE T,-1(A) ;DON'T RETRANSMIT IF DONE TOO RECENTLY
1222 HLRZ TT,-2(A) ;OR IF ALREADY ON ITS WAY OUT (DON'T LINK TWICE ON XMIT LIST)
1225 JRST CHART2 ;ANYTHING AFTER THIS IS LIKELY TO LOSE ALSO
1227 PUSHJ P,CHAXMT ;RETRANSMIT THIS
1228 ; HRRZ A,-2(A) ;THREAD TO NEXT
1230 CHART2: CONO PI,PICON(W)
1233 ;THIS ROUTINE SENDS A STS PACKET, OR TRIES TO. FAILURE => SLOW CLOCK WILL TRY AGAIN.
1234 ;CANNOT PCLSR NOR WAIT, CALLABLE FROM INTERRUPT LEVEL.
1235 ;INDEX IN I, CLOBBERS A,B,C,D,E,T,TT,Q,J
1236 CHASTO: MOVSI D,%CFSTS
1238 PUSHJ P,CHABGI ;GET A BUFFER, WITHOUT WAITING
1239 POPJ P, ;CAN'T GET ONE, WILL RETRY AT CLOCK LEVEL
1240 ANDCAM D,CHSSTA(I) ;OK, A STS WILL BE SENT, CLEAR NEED-STS FLAG
1241 MOVE T,[.DPB %COSTS,($CPKOP),<.DPB 4,($CPKNB),0>]
1242 MOVEM T,(A) ;SEND A STS WITH 4 DATA BYTES
1243 PUSHJ P,DPBRCP ;FIRST PAIR IS RECEIPT
1244 HLRZ B,CHSWIN(I) ;SECOND PAIR IS WINDOW SIZE
1245 DPB B,[042000,,%CPKDT(A)]
1247 JRST CHODT2 ;FIRE IT OFF
1249 DPBRCP: HLRZ B,CHSPKN(I)
1252 DPB B,[242000,,%CPKDT(A)]
1255 SUBTTL CHAOS NET INTERRUPT-LEVEL INPUT PROCESSING
1259 ;PROCESS A PACKET RECEIVED AT INTERRUPT LEVEL. BY THE TIME WE GET HERE
1260 ; A BUFFER HAS BEEN ALLOCATED AND FILLED WITH THE DATA FROM THE DEVICE.
1261 ; ITS ADDRESS IS IN A. RETURN VIA POPJ P, WITH ALL REGISTERS CLOBBERED.
1262 CHAPII: MOVE B,RECHDP ;SAVE HEADER FOR DEBUGGING IN RING BUFFER
1266 CAIN D,RECHDR+<NRECHD*%CPKDT>
1269 ;END OF DEBUGGING CODE
1270 LDB D,[$CPKMV(A)] ;MUPPET?
1271 JUMPN D,CHABRT ;FLUSH, NOT SUPPORTED
1272 LDB D,[$CPKOP(A)] ;GET OPCODE
1273 LDB B,[$CPKDA(A)] ;CHECK DESTINATION
1274 CAIE B,MYCHAD ;IF FOR ME,
1275 SKIPN B ;OR FOR ME BY VIRTUE OF BROADCAST
1276 AOSA CHNPI ;ACCEPT IT
1277 JRST CHAPFW ;NOT ME, FORWARD
1278 LDB C,[$CPKNB(A)] ;PASS LENGTH IN C TO OP ROUTINES
1279 MOVEI B,[ASCIZ/Illegal byte count/]
1282 SKIPGE (A) ;TEST OPCODE
1283 JRST CHIDAT ;DATA PACKET
1284 MOVEI B,[ASCIZ/Illegal opcode/]
1288 JRST CHALOS ;ILLEGAL, FLUSH
1297 IFE CH10P+CH11P,JRST CHABRT ;IGNORE
1298 IFN CH10P+CH11P,JRST CHIRUT
1300 %COLSN::JRST CHALOS ;ILLEGAL, FLUSH
1301 %COMNT::JRST CHABRT ;IGNORE
1308 CHAPFW: LDB B,[$CPKDA(A)] ;CHECK DESTINATION HOST
1309 TRNN B,377_8 ;SUBNET 0?
1310 JRST CHABRT ;FLUSH IT, XX-NETWORK-11 IS TRYING TO MAKE US CRASH
1311 LDB B,[$CPKFC(A)] ;INCREMENT FORWARDING COUNT
1314 JRST [ AOS CHNPFL ? JRST CHABRT ] ;LOOP, DISCARD
1316 SETOM -2(A) ;NOT ON SEND LIST
1320 IFN CH10P+CH11P,[ ;INCOMING ROUTING INFO
1321 CHIRUT: LSH C,-2 ;NUMBER OF SUBNET ENTRIES
1322 JUMPE C,CHABRT ;COULD BE ZERO-LENGTH
1325 LDB E,[$CPKSA(A)] ;SOURCE HOST IS GATEWAY
1326 CHIRU1: ILDB T,D ;SUBNET
1328 HLRZ B,SBNRUT(T) ;COST OF EXISTING ROUTE
1332 HRLM TT,SBNRUT(T) ;THIS IS BEST ROUTE NOW
1334 CHIRU2: SOJG C,CHIRU1
1338 ;INTERRUPT-LEVEL PROCESSING OF SNS PACKET
1339 ;NOTE THAT WE DO NOT BARF AT SNS'S TO EXISTENT NON-OPEN CONNECTIONS. IF IT
1340 ;WAS AN RFC-SENT CONNECTION, THIS COULD BREAK IT PREMATURELY IF AN OPN WAS
1341 ;LOST AND THEN A SNS WAS NOT.
1342 CHISNS: MOVEI E,%CSOPN
1344 JRST [ CAIE E,%CSOPN
1345 JRST CHABRT ;CONNECTION EXISTS AND IS NOT OPEN, IGNORE PACKET
1346 JRST CHALOS ] ;CONNECTION DOES NOT EXIST, COMPLAIN
1347 PUSHJ P,CHABRT ;CONNECTION DOES EXIST
1349 POPJ P, ;NOT OPEN, IGNORE
1350 JRST CHASTO ;REPLY WITH STS
1352 ;INTERRUPT LEVEL PROCESSING OF RECEIVED FWD OR ANS
1353 CHIANS: PUSHJ P,CHFNDX ;FIND CONNECTION
1354 JRST CHABRT ;NOBODY AT OTHER END TO RECEIVE A LOS ANYWAY
1356 JRST CHABRT ;NOT IN RFC-SENT STATE, LOSS
1357 ; JRST CHICL1 ;CLOSE THE CONNECTION BUT GIVE TO USER AS INPUT
1358 ;DROPPING THROUGH WILL DO
1360 ;INTERRUPT LEVEL PROCESSING OF RECEIVED CLS PACKET
1361 CHICLS: PUSHJ P,CHFNDX ;FIND CONNECTION BEING CLOSED
1362 JRST CHALOS ;NONE, LOSS
1363 CHICL1: MOVEI W,%CSCLS ;CLOSE THE CONNECTION
1364 CHICL2: PUSHJ P,CHINT ;SET TO STATE IN W, INTERRUPT
1366 MOVEI Q,CHSPBF(I) ;DISCARD OUT-OF-ORDER PACKETS
1369 CHIC2A: MOVEI Q,CHSOBF(I) ;DISCARD TRANSMIT PACKETS, E.G. RFC WHICH RECEIVED
1370 PUSHJ P,CHAQGF ;AN ANS OR FWD, DON'T WANT TO TRANSMIT AGAIN
1376 JRST CHIDT1 ;GIVE PACKET TO USER AS DATA
1377 \f;INTERRUPT LEVEL PROCESSING OF RFC PACKET
1378 CHIRFC: MOVE T,%CPKDT(A) ;CHECK FOR STATUS REQUEST
1379 CAMN T,[.BYTE 8 ? "S ? "T ? "A ? "T]
1383 XORI TT,(<.BYTE 8 ? "U ? "S>)
1384 TRNN TT,(<.BYTE 8 ? -1 ? -1>)
1386 CHIRF7: MOVEI Q,CHQLSN ;SEARCH LISTENING QUEUE
1388 JRST CHIRF1 ;NOT FOUND, LOAD SERVER
1389 EXCH A,B ;A LSN, B RFC
1390 LDB I,[$CPKSX(A)] ;GET CORRESPONDING INDEX
1394 CHIRF0: PUSHJ P,CHABRT ;FOUND, DISCARD LISTEN PACKET
1395 MOVE A,B ;GET OTHER HOST'S RFC
1396 LDB B,[$CPKPN(A)] ;INITIALIZE RECEIVER'S PACKET NUMBER
1399 MOVEM B,CHSFRN(I) ;HOOK 'EM UP
1400 MOVEI W,%CSRFC ;PUT INTO RFC-RECEIVED STATE
1401 MOVE T,TIME ;AND ENGAGE PI LEVEL
1405 ;RFC RECEIVED AND NOT IMMEDIATELY MATCHED TO A LSN. QUEUE AND LOAD SERVER JOB.
1406 ;BUT FIRST CHECK WHETHER THIS IS A DUPLICATE WHICH SHOULD BE DISCARDED.
1407 CHIRF1: MOVE C,%CPKS(A) ;SEARCH PENDING RFC QUEUE FOR RFC FROM
1408 HLRZ T,CHQRFC ;THE SAME SOURCE AS THIS.
1410 CHIRD0: CAMN C,%CPKS(T)
1411 JRST CHABRT ;THIS RFC IS A DUPLICATE, IGNORE IT
1414 CHIRD1: MOVSI T,-NINDX ;SEARCH OPEN AND RFC-RECEIVED CONNECTIONS
1415 CHIRD2: SKIPL CHSUSR(T) ;FOR ONE CONNECTED TO SAME GUY AS SENT RFC
1418 JUMPGE T,CHIRD3 ;NO DUPLICATE OF THIS RFC, QUEUE IT
1422 JRST CHABRT ;REALLY A DUPLICATE, DISCARD
1424 CHIRD3: MOVEI B,[ASCIZ/System not up/]
1425 SKIPL SYSDBG ;REFUSE INCOMING CONNECTIONS IF LOGINS REFUSED
1426 SKIPE NETUSW ;ALLOWING INCOMING NET CONNECTIONS?
1427 JRST CHIRF2 ;NO, REFUSE (EVEN IF FROM OURSELVES)
1428 HRROI T,CHIRFJ ;LOAD JOB
1429 CONI PI,Q ;MUST TURN UTCOFF TO CALL NUJBST
1430 ANDI Q,177 ;SINCE THIS MAY RUN AT OTHER INT LEVELS
1433 JRST [ CONO PI,PICON(Q)
1434 JRST CHABRT ] ;RING BUFFER FULL, IGNORE, RETRY WILL CATCH
1436 MOVE T,TIME ;REMEMBER WHEN THIS RFC WAS QUEUED
1439 JRST CHAQPF ;PUT ON FRONT OF QUEUE
1441 ;COME HERE TO SEND A LOS PACKET IN RESPONSE TO CRUFTY INPUT IN A
1442 ;B SHOULD POINT TO AN ASCIZ STRING FOR WHY.
1443 CHALOS: SKIPA T,[%COLOS]
1444 ;HERE TO REFUSE AN RFC. TURN IT INTO A CLS AND SEND IT BACK.
1445 ;B SHOULD POINT TO AN ASCIZ STRING FOR WHY.
1446 CHIRF2: MOVEI T,%COCLS
1447 HRLI B,440700 ;BP TO MESSAGE
1448 SETZB C,(A) .SEE $CPKFC
1450 MOVE T,%CPKS(A) ;EXCHANGE SOURCE AND DESTINATION
1453 MOVE D,[440800,,%CPKDT(A)]
1459 CHIRF5: DPB C,[$CPKNB(A)]
1460 SETOM -2(A) ;NOT ON ANY SEND LIST
1461 JRST CHAXMT ;SEND IT
1463 ;HERE FOR RFC TO "STATUS"
1472 IFG BAR-4, .ERR NAME MORE THAN 4 CHARACTERS
1477 CHIRF3: MOVE B,[MNAME FOO ,,] ;NAME OF MACHINE IN 8-BIT ASCII
1484 MOVE B,[.BYTE 8 ? MYCHAD/400 ? 1 ? 4+IFN CH10P+CH11P,[10.] ? 0 ]
1485 MOVEM B,%CPKDT+10(A)
1486 MOVEI B,%CPKDT+11(A)
1506 SETZM (A) .SEE $CPKFC
1508 MOVE T,%CPKS(A) ;EXCHANGE SOURCE AND DESTINATION
1511 MOVEI C,13*4+IFN CH10P+CH11P,[20.] ;BYTE COUNT
1520 ;HERE TO CONVERT A BRD INTO AN RFC
1522 CHIBRD: LDB T,[$CPKAN(A)] ;NUMBER OF BITMAP BYTES
1523 LDB TT,[$CPKNB(A)] ;NUMBER OF TOTAL DATA BYES (INCLUDES BITMAP)
1524 CAIG T,32. ;ACK NUMBER NO GREATER THAN 32.
1525 TRNE T,3 ; MUST BE MULTIPLE OF 4
1526 JRST CHABRT ; FREE THE PACKET IF NO GOOD
1527 CAMG TT,T ;MUST BE SOME TEXTUAL RFC DATA AS WELL
1528 JRST CHABRT ; IF NOT, FREE PACKET
1529 MOVE C,TT ;GET NUMBER OF BYTES (CHIRFC WANTS COUNT IN C)
1530 SUB C,T ;WITHOUT BITMAP
1531 DPB C,[$CPKNB(A)] ;NEW BYTE COUNT
1532 LSH T,-2 ;CONVERT BITMAP BYTE COUNT TO WORD COUNT
1533 ADDI TT,3 ;CONVERT BYTE COUNT TO...
1534 LSH TT,-2 ;... WORD COUNT
1535 MOVEI D,%CPKDT(A) ;GET POINTER TO BEGINNING OF DATA
1536 HRL D,D ;IN UPPER AND LOWER HALVES (ALMOST BLT POINTER)
1537 HRLZ T,T ;BITMAP WORD COUNT,,0
1538 ADD D,T ;RFC-STRING,,DATA-FIELD
1539 ADDI TT,%CPKDT-1(A) ;LAST LOCATION FOR BLT
1542 DPB TT,[$CPKAN(A)] ;ZERO THE ACK FIELD
1544 DPB TT,[$CPKDA(A)] ;PRETEND IT WAS FOR ME
1545 JRST CHIRFC ;AND HANDLE IT AS AN RFC
1548 ;ROUTINE TO FIND INDEX PACKET CORRESPONDS TO, SKIP IF FOUND, INDEX IN I.
1549 ;ALSO RETURNS STATE IN E SINCE THAT'S OFTEN HANDY.
1550 ;ALSO SETS B FOR CHALOS
1551 CHFNDX: MOVEI B,[ASCIZ/Connection does not exist at this end/]
1552 LDB I,[$CPKDX(A)] ;GET REAL-INDEX PART OF DESTINATION INDEX
1556 SKIPGE CHSSTA(I) .SEE %CFOFF
1557 POPJ P, ;NOT TALKING TO NETWORK
1561 CAIN E,%CSRFS ;IF IN RFC-SENT STATE, ONLY
1562 AND T,[.BYTE 16. ? -1 ? 0] ;THE SOURCE HOST HAS TO MATCH
1563 CAMN TT,CHSLCL(I) ;COMPARE LOCAL ADDRESS
1564 CAME T,CHSFRN(I) ; AND FOREIGN ADDRESS
1568 JRST POPJ1 ;SUCCEED, CALLER CHECKS THE STATE
1570 ;INTERRUPT LEVEL PROCESSING OF RECEIVED OPN PACKET
1571 CHIOPN: PUSHJ P,CHFNDX ;FIND CONNECTION TO BE OPENED
1573 CAIE E,%CSRFS ;NOT IN RFC-SENT STATE,
1574 JRST CHABRT ; MUST BE DUPLICATE, DISCARD.
1575 LDB B,[$CPKPN(A)] ;GET ITS PACKET NUMBER
1576 HRLM B,CHSPKN(I) ;INITIALIZE PACKET NUMBERING OF RECEIVED MESSAGES
1578 MOVEM B,CHSFRN(I) ;HOOK 'EM UP
1579 PUSHJ P,CHIST1 ;PROCESS AS A STS, DISCARD
1580 PUSHJ P,CHASTO ;RESPOND WITH A STS
1584 ;COME HERE WITH INDEX IN I AND NEW STATE IN W, TO CHANGE STATE AND INTERRUPT
1585 CHINT: HRRM W,CHSSTA(I)
1587 MOVEM T,CHSITM(I) ;IN CASE GOT HERE FROM CHOLSN
1590 IORM T,CHSSTA(I) ;DISENGAGE PI LEVEL
1592 ANDCAM T,CHSSTA(I) ;NOW OPEN, ENGAGE PI LEVEL
1593 ;COME HERE TO INTERRUPT ON THE INPUT CHANNEL. SMASHES T,TT,W
1594 CHINTI: LDB T,[$CHSUI,,CHSUSR(I)]
1595 CHINT2: MOVE TT,CHSSTA(I) ;SIGNAL USER OR STY?
1598 LDB T,[$CFTTN,,TT] ;STY, GET TTY NUMBER
1599 CONO PI,PIOFF ;PROTECT LIST MODIFICATION
1600 SKIPL STYNTL-NFSTTY(T) ;DON'T PUT ON LIST TWICE
1602 MOVE TT,STYNTA ;ADD TO LIST
1603 MOVEM TT,STYNTL-NFSTTY(T)
1607 CHINT4: SKIPGE TT,CHSUSR(I)
1609 MOVSI W,(SETZ) ;PCLSR THE JOB SO IT GETS AN IOC ERROR IF NEEDFUL
1610 IORM W,PIRQC(TT) ;EVEN IF NORMAL INTERRUPTS ARE NOT ENABLED
1612 POPJ P, ;IOPUSH'D, NO INTERRUPT
1620 ;INTERRUPT LEVEL PROCESSING OF RECEIVED DATA PACKET
1621 CHIDAT: PUSHJ P,CHFNDX ;FIND ASSOCIATED CONNECTION
1622 JRST CHALOS ;NONE, LOSS
1623 CAIE E,%CSOPN ;STATE MUST BE OPEN
1624 JRST CHALOS ;BAD, LOSS
1625 PUSHJ P,CHIACK ;PROCESS ACKNOWLEDGEMENT FIELD
1626 ;NOW DECIDE WHETHER IT GOES ON CHSIBF(I), OR ON CHSPBF(I), OR GETS DISCARDED.
1627 HLRZ B,CHSPKN(I) ;LAST PACKET NUMBER GIVEN TO USER
1628 LDB C,[$CPKPN(A)] ;GET PACKET NUMBER OF THE NEW PACKET
1629 HLRZ T,CHSWIN(I) ;RECEIVE WINDOW SIZE
1630 ADDI T,(B) ;HIGHEST LEGAL PACKET NUMBER
1632 TRNE T,100000 ;SKIP IF T >= C
1633 JRST CHABRT ;FOO ON YOU, OVER WINDOW SIZE
1634 HRRZ T,CHSIBF(I) ;COMPUTE NEXT IN-ORDER PACKET EXPECTED
1635 JUMPE T,CHIDT6 ;BASED ON LAST IN-ORDER PACKET
1638 JRST [ LDB B,[$CPKPN(T)]
1640 HLRZ T,CHSIBF(I) ;IF IT'S AN UNC, HAVE TO GO FIND CORRECT PACKET
1641 CHIDT5: LDB TT,[$CPKOP(T)]
1647 ANDI B,177777 ;NEXT IN-ORDER PACKET EXPECTED
1649 JRST CHIDT1 ;EQUAL, IT GOES ON THE END OF CHSIBF(I) LIST.
1650 SUB B,C ;NOT EQUAL, COMPARE THEM MODULO 2^16.
1652 JRST CHIDTD ;B GREATER, THIS IS AN OLD PACKET, DISCARD IT
1653 ;PUT ON CHSPBF(I) IN PROPER ORDER
1654 ;A IS THIS PACKET, C IS HIS NUMBER, B IS PREDECESSOR, D IS NEXT, E IS HIS #
1655 MOVEI B,0 ;SIGNIFY AT FRONT OF LIST
1656 HLRZ D,CHSPBF(I) ;GET FIRST PACKET ON OUT-OF-ORDER LIST
1657 JUMPE D,CHIDT4 ;LIST IS EMPTY
1658 CHIDT3: LDB E,[$CPKPN(D)]
1659 SUB E,C ;COMPARE PACKET NUMBERS
1660 JUMPE E,CHIDTD ;DUPLICATE, DISCARD
1662 JRST [ MOVE B,D ;E IS LESS, KEEP LOOPING
1665 JRST .+1 ] ;REACHED END PUT IT HERE
1667 HRRM A,-2(B) ;THREAD ONTO PREVIOUS PACKET
1669 CHIDT4: HRRM A,CHSPBF(I) ;THREAD ONTO BACK OF LIST
1671 HRLM A,CHSPBF(I) ;THREAD ONTO FRONT OF LIST
1672 HRRM D,-2(A) ;THREAD IN BEFORE PACKET IN D
1677 ;HERE IT GOES ON CHSIBF(I). A HAS PACKET, C HAS ITS PACKET NUMBER.
1678 ;IF GETTING HERE FROM CHICL1, C HAS GARBAGE BUT IT WILL NEVER BE USED.
1679 CHIDT1: SKIPN CHSIBF(I)
1680 PUSHJ P,CHINTI ;THERE WAS NO INPUT, BUT THERE IS NOW, COME AND GET IT
1683 PUSHJ P,CHAQPL ;PUT ON END OF RECEIVE LIST
1684 HLRZ A,CHSPBF(I) ;GET FIRST OUT-OF-ORDER PACKET
1686 LDB B,[$CPKPN(A)] ;SEE IF THIS PACKET IS NOW IN-ORDER
1687 CAIL C,177777 ;BY COMPARING AGAINST C+1 MODULO 2^16.
1693 PUSHJ P,CHAQGF ;YES, PULL PACKET OF OUT-OF-ORDER LIST
1696 JRST CHIDT1 ;AND GO PUT ONTO IN-ORDER LIST
1698 ;HERE IF PACKET IS A DUPLICATE AND IS TO BE DISCARDED. MUST SEND
1699 ;RECEIPT TO SHUT OFF EXCESS RETRANSMISSION.
1700 CHIDTD: PUSHJ P,CHABRT
1704 ;HERE FOR RECEIVING AN UNC PACKET
1705 CHIUNC: LDB I,[$CPKDI(A)] ;Destination index zero?
1707 LDB I,[$CPKDX(A)] ;GET REAL-INDEX PART OF DESTINATION INDEX
1710 JRST CHALOS ;NO MATCH
1711 MOVE TT,%CPKD(A) ;DESTINATION ADDRESS MATCHES?
1714 HRRZ E,CHSSTA(I) ;IN FOREIGN PROTOCOL MODE?
1717 MOVE TT,%CPKS(A) ;NORMAL PROTOCOL, SOURCE ADDRESS MUST MATCH
1719 CAIE E,%CSOPN ;AND STATE MUST BE OPEN
1721 CHIUN1: MOVE TT,TIME
1723 SKIPE T,CHSIBF(I) ;DISCARD PACKET IF OVER WINDOW SIZE
1724 JRST [ LDB TT,[$CPKOP(T)] ; AND ALREADY HAVE AN UNC
1731 PUSHJ P,CHINTI ;THERE WAS NO INPUT, BUT THERE IS NOW, COME AND GET IT
1732 AOS CHSNBF(I) ;PUT ON END OF RECEIVE LIST.
1733 MOVEI Q,CHSIBF(I) ;PACKET NUMBER IS RANDOM, NOTHING LOOKS AT IT
1737 IFE INETP,JRST CHALOS ;No comprendo internet
1739 LDB I,[$CPKAN(A)] ;Protocol number
1740 CAIE I,8_8 ;DOD Internet #x0800
1742 AOS CHNIPI ;Meter Internet packets in from Chaosnet
1743 MOVE J,A ;Save Chaosnet packet
1744 LDB A,[$CPKNB(A)] ;Compute size of Internet datagram in words
1747 MOVE C,A ;Save word count
1748 CALL IPGIPT ;Get buffer to copy datagram into
1749 JRST CHIUN3 ;No buffers available, discard packet
1750 MOVSI T,%CPKDT(J) ;Make BLT pointer
1752 ADDI B,(C) ;Address of last destination word
1754 EXCH A,J ;Free the Chaosnet packet
1756 MOVE A,J ;Datagram structure
1757 MOVE B,C ;Word count
1758 MOVEI C,0 ;Offset to start of IP header
1759 CALRET IPRDGM ;Dispose of datagram
1761 CHIUN3: MOVE A,J ;Discard Chaosnet packet
1767 ;INTERRUPT LEVEL PROCESSING OF LOS
1768 CHILOS: PUSHJ P,CHFNDX ;FIND CONNECTION TO BE BROKEN
1769 JRST CHABRT ;NONE, IGNORE
1770 MOVEI W,%CSLOS ;PUT INTO LOST STATE
1771 JRST CHICL2 ;GIVE PACKET TO USER AS DATA, DISENGAGE, AND INTERRUPT
1773 ;INTERRUPT LEVEL PROCESSING OF STS
1774 CHISTS: PUSHJ P,CHFNDX
1776 CAIE E,%CSOPN ;CONNECTION MUST BE OPEN
1778 CHIST1: LDB B,[042000,,%CPKDT(A)] ;GET NEW WINDOW SIZE
1782 LDB B,[242000,,%CPKDT(A)] ;PROCESS RECEIPT
1785 JRST CHARTR ;RETRANSMIT
1789 ;INTERRUPT LEVEL PROCESSING OF RECEIVED ACKNOWLEDGEMENT.
1790 ;REMOVE THE ACKNOWLEDGED PACKETS FROM THE INDEX'S SEND LIST AND UPDATE CHSNOS(I).
1791 ;NOTE THAT THE LIST IS ASSUMED TO BE SORTED SO WE ONLY
1792 ;REMOVE PACKETS FROM THE FRONT. CLOBBERS B,C,D,T,TT,Q.
1793 CHIACK: LDB B,[$CPKAN(A)] ;PACKET NUMBER BEING RECEIPTED
1794 CHIAK0: LDB T,[$CPKAN(A)] ;ENTER HERE FROM CHISTS
1795 HRRZ D,CHSACK(I) ;GET MAX OF THIS ACKNOWLEDGE AND PREVIOUS
1798 HRRM T,CHSACK(I) ;ACKNOWLEDGED PACKET NUMBER IS NEW START OF WINDOW
1800 HLRZ A,CHSOBF(I) ;MAP DOWN SEND LIST
1801 JUMPE A,CHIAK2 ;LIST EMPTY
1802 CHIAK1: LDB D,[$CPKPN(A)]
1805 JRST CHIAK2 ;RCP# LESS THAN PKT#
1806 HRRZ C,-2(A) ;GET NEXT PACKET
1807 HLLOS D,-2(A) ;MARK NOT ON SEND LIST
1808 AOJE D,CHIAK3 ;AND JUMP IF NOT ON TRANSMIT LIST
1810 MOVEI Q,DLCXMQ ;ON TRANSMIT LIST, TRY TO TAKE OFF
1821 CAIA ;AND DON'T FREE IT
1822 CHIAK3: PUSHJ P,CHABRT
1826 SETZM CHSOBF(I) ;SEND LIST NOW EMPTY
1827 CHIAK2: MOVE D,CHSNOS(I) ;COMPUTE NEW VALUE OF CHSNOS
1828 HRRZ T,CHSACK(I) ;START OF WINDOW
1829 HRRZ C,CHSPKN(I) ;LAST PACKET SENT
1832 SUBI T,200000 ;T GETS NEGATIVE AMOUNT OF WINDOW OCCUPIED
1833 ADD T,CHSWIN(I) ;RH(T) GETS AVAILABLE PORTION OF WINDOW
1834 HRREM T,CHSNOS(I) ;WHICH IS NUMBER OF OUTPUT SLOTS
1835 JUMPG D,POPAJ ;IF FORMERLY THERE WERE NO OUTPUT SLOTS,
1836 LDB T,[$CHSUO,,CHSUSR(I)]
1837 SKIPLE CHSNOS(I) ;AND NOW THERE ARE,
1838 PUSHJ P,CHINT2 ;INTERRUPT ON THE OUTPUT CHANNEL
1841 ;TRY TO TAKE PACKET IN A OFF OF TRANSMIT LIST IN Q.
1842 ;CLOBBER T,Q,D. CALLED WITH INTERRUPTS OFF.
1843 ;MAY RETURN WITH A POINTING TO FREE BUT THAT IS OK AT THIS TIME.
1845 CHIAKF: MOVEI D,2(Q) ;LH[-2(D)] POINTS TO (T)
1847 JUMPE T,CPOPJ ;NOT FOUND
1850 HLRZ T,-2(A) ;LINK OUT
1852 JUMPN T,CHABRT ;JUMP IF DIDN'T DELETE LAST PACKET IN LIST
1853 HRRM D,(Q) ;NEW LAST PACKET IN LIST
1855 SETZM (Q) ;FOO, TRANSMIT LIST NOW EMPTY
1858 SUBTTL CHAOS NET DL10 INTERRUPT ROUTINE
1864 ;COME HERE FROM EACH DL10 INTERRUPT AT TTY LEVEL. SMASH ALL REGISTERS EXCEPT P AND 0.
1865 DLCWAK: CONI PI,E ;SAVE PI STATUS AND SWITCH TO NETWORK INTERRUPT LEVEL
1869 DLCWK1: MOVEI J,1 ;ALWAYS CHECK BOTH BUFFERS SO WE CAN'T GET OUT OF PHASE WITH 11
1870 MOVEI R,2 ;CHECK FOR INPUT AVAILABLE
1874 MOVE A,DLCRA1(J) ;GOT INPUT, PROCESS IT
1875 SETZM DLCRS1(J) ;BUFFER SLOT NOT OCCUPIED NOW
1877 IFN KL10P, PUSHJ P,DLCSWP ;SWEEP CACHE IN CASE ANYONE HAPPENED TO TOUCH BUFFER
1878 SKIPE A ;THIS CAN HAPPEN IF PDP11 WAS JUST STUFFED
1879 PUSHJ P,CHAPII ;PROCESS THE PACKET
1880 PUSHJ P,DLCIBG ;SUPPLY A NEW INPUT BUFFER TO 11
1881 JRST DLCWK1 ;TRY FOR MORE INPUT
1883 DLCWK2: MOVEI J,1 ;SCAN CHANNELS FOR OUTPUT DONE
1887 MOVE A,DLCSA1(J) ;FOUND AN OUTPUT DONE BUFFER
1888 HRROS B,-2(A) ;MARK IT NOT ON TRANSMIT LIST
1889 AOJN B,.+2 ;AND UNLESS IT IS ON SEND LIST
1890 PUSHJ P,CHABRT ;RETURN IT TO FREE
1891 SETZM DLCSA1(J) ;IDLE THIS BUFFER
1895 DLCWK4: MOVE J,DLCSBF ;TRY TO SEND SOME OUTPUT
1897 JRST DLCWK9 ;BUFFER BUSY
1898 HLRZ A,DLCXMQ ;GET ANOTHER OFF TRANSMIT QUEUE
1899 JUMPE A,DLCWK9 ;QUEUE EMPTY
1903 BUG PAUSE,[CHAOS LIST THREAD TRASHED],OCT,A,OCT,-2(A)
1908 CAME A,DLCXMQ ;REACHED END OF LIST, END IN RIGHT PLACE?
1909 BUG PAUSE,[DCLXMQ THREAD TRASHED]
1916 PUSHJ P,DLCXMT ;SEND IT ON THIS BUFFER
1917 JRST DLCWK4 ;GO TRY TO SEND ON OTHER BUFFER
1920 CONO PI,PICON(E) ;RESTORE PI
1923 ;THIS ROUTINE SUPPLIES AN INPUT BUFFER TO THE 11 ON ALL BUFFERS THAT NEED IT
1924 ;CALL WITH INTERRUPTS OFF OR IN PROGRESS
1929 PUSHJ P,CHABGI ;GET A BUFFER
1930 JRST [ SETZM DLCRA1(J) ;NO MEMORY, WILL TRY AGAIN AT CLOCK LEVEL
1933 SETZM (A) ;CLEAR THE BUFFER SINCE THE DL10 DOESN'T TOUCH LOW 4 BITS
1937 MOVEM A,DLCRA1(J) ;MAKE AVAILABLE TO PDP11
1941 IFN KS10P, .ERR CLRCSH not needed here?
1942 IFN KL10P, PUSHJ P,DLCSWP ;SWEEP CACHE BEFORE SIGNALLING 11
1945 CONO DLC,100040+TTYCHN ;INTERRUPT 11
1946 JRST DLCIB1 ;TRY FOR OTHER BUFFER ALSO
1948 ;THIS ROUTINE SENDS PACKET IN A TO DL10 (CALL WITH NETOFF OR IN PROGRESS)
1949 ;SWITCHES BUFFERS, LEAVES NEW ONE IN J
1950 DLCXMT: MOVE J,DLCSBF
1953 MOVEM A,DLCSP1(J) ;GIVE 11 POINTER TO NEW PACKET
1955 IFN KS10P, .ERR CLRCSH not needed here?
1956 IFN KL10P, PUSHJ P,DLCSWP ;SWEEP CACHE, PUTTING PACKET INTO CORE
1958 MOVEM T,DLCSS1(J) ;ACTIVATE PDP11
1959 CONO DLC,100040+TTYCHN
1960 XORI J,1 ;NEXT BUFFER
1965 ;THIS ROUTINE SWEEPS PACKET IN A OUT OF THE CACHE,
1966 ;CLOBBERING B, C, AND D.
1967 IFG PKTBSZ-1000, .ERR PKTBSZ BIGGER THAN HARDWARE PAGE SIZE, CACHE SWEEP LOSES
1968 DLCSWP: LDB D,[111100,,A] ;SWEEP ONE PAGE OF CACHE
1969 SWPUO (D) ;STORING PACKET INTO CORE
1970 MOVE B,[CONSZ 200000] ;AWAIT COMPLETION IN ACS
1971 MOVE C,[JRST B] ;TO MINIMIZE CACHE INTERFERENCE
1977 SUBTTL CHAOS NET TEN-11 INTERFACE STUFF
1980 ;THIS ROUTINE CHECKS FOR TEN-11 INITIALIZATION, SKIP-RETURNS IF OK TO USE
1982 T11CHK: SKIPE TEN11F
1983 JRST T11LUZ ;NOT SUPPOSED TO USE TEN11
1984 MOVE T,T11VER ;CHECK VERSION TO MAKE SURE RIGHT PROGRAM, ETC.
1985 CAME T,[.BYTE 8 ? "H ? "C ? 0 ? 1]
1986 JRST T11LUZ ;PROBABLY TURNED OFF OR WRONG PROGRAM
1987 SKIPE T11I10 ;SHOULD WE REINIT?
1988 JRST T11CK1 ;YES, GO DO SO
1989 SKIPLE T,T11WIN ;ARE WE WINNING?
1990 JRST POPJ1 ;YES, FINE
1991 JUMPE T,[SETOM T11WIN ;NOW THAT VERSION IS OK, TELL 11 TO INIT
1994 JRST T11CK1 ] ;AND INIT OURSELVES
1995 SKIPE T11I11 ;WAITING FOR 11 TO REINIT?
1997 ;HERE TO REINIT. FIRST, PICK UP PARAMETERS.
1998 T11CK1: LDB TT,[242000,,T11PRM] ;BYTES PER PACKET BUFFER
1999 CAIGE TT,<%CPMXW+1>*4 ;BETTER BE RIGHT SIZE
2000 JRST T11LUZ ;TOO SMALL (ASSUME IF TOO BIG, PACKETS WON'T BE)
2002 MOVEM TT,T11BSZ ;SAVE BUFFER SIZE IN PDP10 WORDS
2003 LDB T,[042000,,T11PRM] ;NUMBER OF BUFFERS IN EACH DIRECTION
2004 IMULB T,TT ;NUMBER OF PDP10 WORDS IN EACH DIRECTION
2006 MOVEM TT,T11IBE ;INIT POINTERS
2011 HRREI T,-T11CHS-2000(TT)
2012 JUMPG T,T11LUZ ;COMMUNICATION AREA LONGER THAN 1K
2015 T11CK2: SETZM (T) ;CLEAR BUFFER HEADERS
2019 MOVEM T,T11WIN ;WE'RE WINNING (MAKE T11WIN POSITIVE NON-ZERO)
2020 SETZM T11I10 ;INIT DONE
2023 ;HERE IF PDP11 PARAMETERS DON'T MATCH WHAT WE EXPECT
2024 T11LUZ: SETZM T11WIN ;NOT WINNING
2027 ;HERE FROM CLOCK LEVEL TO CHECK ON TEN-11 CHAOS NET CHANNEL
2028 T11WAK: PUSHJ P,T11CHK ;IS EVERYTHING OK?
2030 T11WK0: MOVE C,T11IBP ;CHECK INPUT
2032 JRST T11WK1 ;NONE AVAILABLE
2033 MOVSI J,2(C) ;POINT TO PACKET
2034 LDB D,[$CPKNB+2(C)] ;GET SIZE OF PACKET
2035 ADDI D,4*%CPKDT+3 ;CONVERT BYTES TO WORDS INCLUDING HEADER
2037 CAILE D,%CPMXW ;DON'T GET FAKED OUT BY CLOBBERED COUNT
2039 PUSHJ P,CHABGI ;GET PLACE TO PUT IT
2040 JRST T11WK1 ;NONE AVAILABLE
2042 EQVI E,(A) ;AOBJN POINTER TO PACKET BUFFER
2043 HRRI J,(A) ;BLT POINTER TO COPY PACKET
2044 ADDI D,-1(A) ;LAST WORD
2045 BLT J,(D) ;COPY PACKET FROM 11 TO 10
2046 MOVEI H,0 ;COMPUTE CHECKSUM
2052 MOVE TT,1(C) ;GET PDP11'S CHECKSUM
2053 SETZM (C) ;GIVE THE 11 BACK THE BUFFER
2054 ADD C,T11BSZ ;ADVANCE THE POINTER
2059 JRST [ AOS T11CKE ;COUNT CHECKSUM ERRORS
2060 PUSHJ P,CHABRT ;AND DISCARD PACKET
2063 PUSHJ P,CHAPII ;PROCESS THE INPUT
2067 T11WK1: CONO PI,NETOFF
2068 SKIPE T11XMQ ;ANY OUTPUT?
2069 SKIPE @T11OBP ;AND OUTPUT BUFFER SPACE AVAILABLE?
2070 JRST NETONJ ;NO, RETURN FROM T11WAK
2071 HLRZ A,T11XMQ ;GET PACKET OFF TRANSMIT QUEUE
2072 HLRZ B,-2(A) ;GET NEXT AFTER THAT
2073 HRLM B,T11XMQ ;BECOMES NEW HEAD OF QUEUE
2076 PUSHJ P,T11XMT ;COPY PACKET INTO 11
2078 JRST T11WK1 ;LOOK FOR MORE OUTPUT
2080 ;SEND PACKET A-> TO 11. SMASHES B,C,T,TT,Q. CALL WITH NETOFF.
2081 T11XMT: LDB C,[$CPKNB(A)] ;GET BYTE COUNT
2082 MOVE Q,C ;MUST CLEAR UNUSED BYTES AT END OF LAST WORD
2083 ANDI Q,3 ;TO MAKE THE CHECKSUM COME OUT RIGHT
2085 LSH C,-2 ;CONVERT TO WORD COUNT
2086 MOVE Q,(Q)[ -1 ;MASK FOR BYTES TO RETAIN IN LAST WORD
2089 <.BYTE 8 ? -1 ? -1 ? -1> ]
2092 ANDM Q,(TT) ;MASK OFF LAST WORD
2094 EQVI C,(A) ;AOBJN PTR
2095 MOVEI TT,0 ;COMPUTE XOR CHECKSUM IN TT
2096 SKIPA B,T11OBP ;-> CURRENT OUTPUT BUFFER IN 11
2099 TRZ T,17 ;CLEAR BITS 10-11 TREATS SPECIALLY
2100 ADD TT,T ;COMPUTE CHECKSUM
2107 MOVEM TT,1(B) ;GIVE CHECKSUM TO 11
2109 MOVEM TT,0(B) ;GIVE PACKET TO 11
2110 ADD B,T11BSZ ;ADVANCE BUFFER POINTER
2114 HRROS T,-2(A) ;TAKE PACKET OFF TRANSMIT LIST
2116 PUSHJ P,CHABRT ;NOT ON SEND LIST, FREE IT
2120 SUBTTL CH-10 INTERRUPT ROUTINES
2122 ;THE GENERAL IDEA IS THAT WE INTERRUPT ON A LOW-PRIORITY INTERRUPT LEVEL,
2123 ;AND DO THE TIME-INTENSIVE PACKET COPYING AT THAT LEVEL. THE GENERAL
2124 ;CHAOS ROUTINES ARE THEN CALLED WITH NETOFF.
2140 CONSO CHX,CHXRCV ;PACKET RECEIVED?
2142 PUSHJ P,CHABGI ;GET PLACE TO PUT PACKET
2143 JRST [ MOVEI T,CHXREN ;NONE AVAILABLE, DISABLE INTR
2147 CONSZ CHX,CHXCRC+CHXWLE ;CHECK FOR ERRORS
2148 JRST [ CONSZ CHX,CHXCRC
2151 JRST CHXBK4 ] ;IGNORE PACKET
2152 DATAI CHX,T ;FIRST DATAI YIELDS GARBAGE
2153 MOVEI T,CHXSWB ;DISABLE BYTE SWAPPING
2156 HRLI A,-%CPKDT ;READ HEADER
2160 PUSHJ P,CHSWAB ;ENABLE BYTE SWAPPING IF NEEDED
2161 LDB T,[$CPKNB(A)] ;GET SIZE OF PACKET
2162 CAILE T,%CPMXC ;DON'T RUN OFF END OF BUFFER
2164 ADDI T,3 ;ROUND UP TO NEXT WORD BOUNDARY
2165 LSHC T,-2 ;CONVERT BYTES TO WORDS, TT GETS REMAINDER
2166 HRLOI D,-1(T) ;MAKE AOBJN POINTER
2168 JUMPGE D,.+3 ;EMPTY PACKET BOUNDARY CASE
2171 DATAI CHX,T ;NOW READ AND IGNORE HARDWARE HEADER
2173 DATAI CHX,T ;THIRD HALFWORD
2174 CONI CHX,T ;CHECK FOR ERRORS
2175 TDNE T,[CHXPLE+CHXCRC+CHXOVR]
2176 JRST [ TLNE T,(CHXOVR)
2177 JRST CHXBKZ ;OVERRRUN CAN'T HAPPEN UNLESS HARDWARE BROKEN
2185 PUSHJ P,CHAPII ;PROCESS THE INPUT
2188 CHXBK4: PUSHJ P,CHABRT ;DIDN'T USE BUFFER AFTER ALL
2189 CONI CHX,T ;COUNT LOST PACKETS
2192 MOVEI T,CHXREN ;ENABLE RECEIVER FOR NEXT PACKET
2195 CHXBK5: CONSO CHX,CHXXMT ;TRANSMIT DONE?
2197 SKIPE T,CHOSTA ;TRANSMIT IN PROGRESS?
2198 CONSO CHX,CHXABT ;AND WAS ABORTED?
2199 JRST CHXBK7 ;NO TO EITHER, LOOK FOR MORE WORK
2200 AOS CHNABT ;METER TRANSMIT ABORTS
2201 CAIL T,NCHRTR ;ABORTED TOO MANY TIMES?
2202 JRST CHXBK7 ;DONE WITH PACKET
2203 AOS CHOSTA ;COUNT RETRANSMISSIONS
2206 CONO CHX,CHXXMT(T) ;RETRANSMIT PACKET
2209 CHXBK7: SETZM CHOSTA ;TRANSMITTER IDLE, LOOK FOR NEXT PACKET
2211 HLRZ A,CHXXMQ ;ANYTHING QUEUED FOR TRANSMISSION?
2212 JUMPE A,[ MOVEI T,CHXTEN ;DISABLE INTERRUPTS
2217 HLRZ B,-2(A) ;CDR TRANSMIT QUEUE
2220 SETZM CHXXMQ ;QUEUE EMPTY NOW
2222 AOS CHOSTA ;NOW SEND THIS PACKET
2223 MOVEI T,CHXHLF+CHXSWB ;CLEAR HALFWORD, BYTE-SWAP MODES
2226 HRLI A,-%CPKDT ;TRANSMIT HEADER
2230 PUSHJ P,CHSWAB ;ENABLE BYTE SWAPPING IF NEEDED
2231 LDB T,[$CPKNB(A)] ;GET SIZE OF PACKET
2232 ADDI T,1 ;ROUND UP TO NEXT HALF WORD BOUNDARY
2233 LSHC T,-2 ;CONVERT BYTES TO WORDS, T+1 GETS REMAINDER
2234 HRLOI D,-1(T) ;MAKE AOBJN POINTER
2236 JUMPGE D,.+3 ;EMPTY PACKET BOUNDARY CASE
2239 MOVEI T,CHXHLF+CHXTEN ;SWITCH TO HALFWORD MODE, ENABLE DONE INTR
2242 TLNE T+1,400000 ;SEND EXTRA HALFWORD IF NEEDED
2244 MOVEI T,CHXSWB ;DISABLE SWAP BYTES MODE
2247 LDB T,[$CPKDN(A)] ;GET DESTINATION SUBNET
2248 HRRZ D,SBNRUT(T) ;GATEWAY TO THAT SUBNET
2250 CAIN T,MYCHAD_-8 ;IF ON LOCAL CABLE
2251 LDB D,[$CPKDA(A)] ;GO DIRECT
2253 DATAO CHX,D ;STORE HARDWARE DESTINATION ADDRESS
2254 MOVE T,CHXCNO ;TRANSMIT PACKET
2257 TLNE T,(CHXOVR) ;CAN'T HAPPEN UNLESS HARDWARE BROKEN
2258 CHXBKZ: BUG HALT,[CHAOS: I/O BUS OVERRUN]
2259 HRROS B,-2(A) ;MARK IT NOT ON TRANSMIT LIST
2260 AOJN B,.+2 ;AND UNLESS IT IS ON SEND LIST
2261 PUSHJ P,CHABRT ;RETURN IT TO FREE
2262 CHXBK9: MOVSI 17,CHXACS ;DISMISS INTERRUPT
2266 CHSWAB: LDB T,[$CPKOP(A)] ;DOES THIS PACKET NEED BYTE SWAPPING?
2269 POPJ P, ;BINARY DATA
2270 JRST CHSWB1 ] ;CHARACTER DATA
2274 JUMPL T,CPOPJ ;BINARY CONTROL PACKET
2275 CHSWB1: MOVEI T,CHXSWB ;CHARACTER, SWAP DEM BYTES
2280 CHSWBT: 1_<35.-%COOPN>+1_<35.-%COSTS>+1_<35.-%CORUT>
2284 SUBTTL CH-11 INTERRUPT ROUTINES
2286 ;The Unibus Chaosnet board interrupts on the same level as TTYs,
2287 ;and comes to CHXBKH via vectored interrupt. We use a programmed
2288 ;interrupt request to drop down to a lower interrupt level for the
2289 ;slow packet-copying operation, so as not to interfere with the TTYs,
2290 ;then turn NETOFF when we call into the Chaosnet NCP.
2291 ;(We actually use NETOFF-1 and NETON-1 so as not to interfere with
2292 ;CLKOFF. This assumes that interrupt levels between CLKCHN and
2293 ;CHXCHN are never turned off.)
2297 ;;; Macros that will eventually be instructions
2299 DEFINE PACK16 AC,E ;AC,AC+1 right-aligned and zero-filled
2306 DEFINE PACK8 AC,E ;AC: ...B2B1 AC+1: ...B4B3 zero-filled!!
2307 ROTC AC,-8 ;B3...B2 B1...B4
2308 ROT AC,-16. ;B1,B2,B3 in position, B4 right-aligned
2309 ADDI AC+1,(AC+1) ;Shift RH(AC+1) left 4 bits
2312 ADDI AC+1,(AC+1) ;B1,B4 in position in AC+1
2317 DEFINE UNPK16 AC,E ;Doesn't bother masking off garbage bits
2320 ROT AC,16. ;First halfword right-aligned
2321 LSH AC+1,-4 ;Second halfword right-aligned
2325 MOVE AC,E ;B1B2B3B4...
2326 ROT AC,8 ;B2B3B4...B1
2328 AND AC,[377_2,,377] ;...B3...B1 zero-filled
2329 ROT AC+1,16. ;B4...B1B2B3
2330 AND AC+1,[377_12,,377_8];B4...B2... zero-filled
2331 IORB AC,AC+1 ;B4B3...B2B1
2332 ROT AC+1,16. ;...B4B3, garbage in high bits
2342 CHXBKH: 0 ;Hardware interrupt on TTYCHN comes here
2344 CONO PI,CHXRQ ;Redirect to lower interrupt level
2345 MOVEM T,CHXSVH ;Clear hardware interrupt enable
2346 MOVEI T,%CAREN+%CATEN ; so the Chaos board will stop interrupting
2353 CHXBRK: 0 ;Software interrupt on CHXCHN comes here
2355 CONO PI,020000+200_<-CHXCHN> ;BAG-BITING DEC LOSERS
2360 IORDI T,CAICSR ;Check for received packet
2362 JRST CHXBK3 ;No incoming packet yet
2363 TRNE T,%CAERR ;Check for error in received packet
2365 JRST CHXBK1 ] ;Ignore packet
2366 IORDI R,CAIRBC ;Number of bits in packet - 1
2367 SUBI R,31. ;Exclude the three extra hardware words
2369 JRST [ AOS CHNWLE ;Length not a multiple of 16
2371 ASH R,-5 ;32-bit word count, rounded up
2372 PUSHJ P,CHABGI ;Get place to put packet
2373 JRST [ AOS CHNLOS ;No buffers, lose this packet
2375 HRLI A,-%CPKDT ;Copy out the packet header
2376 CHSRC1: IORDI B,CAIRBF
2380 PUSHJ P,CHSHDR ;Decode the header
2381 JRST CHSRC4 ;No byte swapping
2383 CHSRC2: IORDI B,CAIRBF ;Read out the data, byte-swapped
2387 CHSRC3: JUMPGE H,CHSRC7 ;Jump if even packet length
2388 IORDI B,CAIRBF ;Residual halfword
2389 SETZ C, ;Somebody depends on zero here
2393 CHSRC4: JUMPGE D,CHSRC6
2394 CHSRC5: IORDI B,CAIRBF ;Read out the data, halfwords
2398 CHSRC6: JUMPL H,[ IORDI B,CAIRBF ;Residual halfword
2399 SETZ C, ;Somebody depends on zero here
2402 CHSRC7: SUB D,R ;AOBJN pointer minus number of words in packet
2404 JRST [ AOS CHNPLE ;Packet length disagrees with hardware length
2406 IORDI T,CAIRBF ;Read the three hardware header words
2410 TRNE T,%CAERR ;Make sure packet came out of RAM okay
2411 JRST [ AOS CHNCR2 ;Garbage, try again
2413 IORDI T,CAIRBC ;Make sure counter didn't spazz
2417 CONO PI,NETOFF-1 ;Get to network interrupt level
2418 PUSHJ P,CHAPII ;Process the input
2420 CHXBK1: IORDI T,CAICSR ;Count lost packets
2424 IORI TT,%CARCL ;Enable receiver for next packet
2426 CHXBK3: TRNN T,%CATDN ;Transmit done?
2427 JRST CHXBK8 ;No, dismiss
2428 SKIPN TT,CHOSTA ;Transmit in progress?
2429 JRST CHXBK7 ;No, look for something to transmit
2430 TRNN T,%CATAB ;Yes, was it aborted?
2431 JRST CHXBK5 ;No, we're done with that packet
2432 AOS CHNABT ;Meter transmit aborts
2433 CAIGE TT,NCHRTR ;Aborted too many times?
2434 JRST CHXBK7 ;No, retransmit it
2435 CHXBK5: CONO PI,PIOFF ;Lock transmit list
2436 HLRZ A,CHXXMQ ;Get packet probably being transmitted now
2437 JUMPE A,[ CONO PI,PION ;It vanished?
2439 HLRZ B,-2(A) ;CDR transmit queue
2442 SETZM CHXXMQ ;Queue empty now
2444 HRROS B,-2(A) ;Mark it not on transmit list
2445 AOJN B,CHXBK6 ;And unless it is on send list
2446 PUSHJ P,CHABRT ;Return it to free
2447 CHXBK6: SETZM CHOSTA ;Transmitter idle, look for next packet
2448 CHXBK7: HLRZ A,CHXXMQ ;Anything queued for transmission?
2449 JUMPE A,CHXBK9 ;No, leave interrupts disabled
2450 AOS CHOSTA ;Count retransmissions
2451 MOVE T,CHXCSR ;Reset transmitter
2454 HRLI A,-%CPKDT ;Transmit header
2455 CHXXM1: UNPK16 B,(A)
2459 PUSHJ P,CHSHDR ;Decode the header
2460 JRST CHXXM4 ;No byte swapping
2462 CHXXM2: UNPK8 B,(D) ;Transmit data with byte swapping
2466 CHXXM3: JUMPGE H,CHXXM7 ;Jump if even packet length
2467 UNPK8 B,(D) ;Transmit residual bytes
2471 CHXXM4: JUMPGE D,CHXXM6
2472 CHXXM5: UNPK16 B,(D) ;Transmit data with byte swapping
2476 CHXXM6: JUMPGE H,CHXXM7 ;Jump if even packet length
2477 UNPK16 B,(D) ;Transmit residual bytes
2479 CHXXM7: LDB T,[$CPKDN(A)] ;Get destination subnet
2480 HRRZ D,SBNRUT(T) ;Gateway to that subnet
2482 CAIN T,MYCHAD_-8 ;If on local cable,
2483 LDB D,[$CPKDA(A)] ; go direct
2484 IOWRI D,CAIWBF ;Store hardware destination address
2485 IORDI T,CAIXMT ;Transmit packet
2486 CHXBK8: MOVEI A,%CATEN ;Enable transmit-done interrupt if xmitting
2487 CHXBK9: IORI A,%CAREN ;Enable receive-done interrupt always
2490 MOVSI 17,CHXACS ;Dismiss software interrupt
2494 CHXBK2: PUSHJ P,CHABRT ;Packet no good, discard it
2497 ;Examine packet in A, return AOBJN pointer to data in D,
2498 ; H is negative if there is an extra halfword after that.
2499 ; W gets number of full words of data (same as LH D).
2504 CHSHDR: HRRZI A,-%CPKDT(A) ;Restore packet address
2505 LDB W,[$CPKNB(A)] ;Get size of packet in bytes
2507 MOVEI W,%CPMXC ;Self-defense
2508 ADDI W,1 ;Round up to next word boundary
2509 LSHC W,-2 ;Convert bytes to words, H gets remainder
2510 HRLOI D,-1(W) ;Make AOBJN pointer
2512 LDB T,[$CPKOP(A)] ;Does this packet need byte swapping?
2515 AOS (P) ;Character data
2516 POPJ P, ] ;Binary data
2520 JUMPL T,CPOPJ ;Binary control packet
2521 JRST POPJ1 ;Characters
2523 CHSWBT: 1_<35.-%COOPN>+1_<35.-%COSTS>+1_<35.-%CORUT>
2527 SUBTTL CHAOS NET BUFFER LIST STUFF
2531 ;BUFFERS ARE PKTBSZ WORDS LONG; 2 HEADER WORDS AND %CPMXW PACKET WORDS.
2532 ;PKTBSZ IS A POWER OF 2 AND LESS THAN 1K (MEMORY PAGE SIZE).
2533 ;NOTE THAT A BUFFER ADDRESS POINTS AT THE FIRST PACKET WORD
2534 ;AND THE HEADER WORDS ARE AT NEGATIVE ADDRESSES.
2535 ;FIRST HEADER WORD: -2(A)
2536 ; RH LIST THREAD FOR MOST LISTS, 0=END, -1=NOT ON LIST
2537 ; LH LIST THREAD FOR TRANSMIT LIST
2538 ;SECOND HEADER WORD: -1(A)
2539 ; TIME RECEIVED OR TIME PUT ON TRANSMIT LIST
2540 ; OR VALUE OF I FOR A PACKET ON THE LSN QUEUE
2541 ; ASCII/LUNCH/ FOR A PACKET ON THE FREE LIST
2543 ;I DO IT THIS WAY (PIOFF) TO AVOID HAVING TO PUSH AND POP PI STATUS,
2544 ;CONO PI,NETOFF CAN LOSE AT INTERRUPT LEVEL (MAINLY THE NETON LOSES)
2546 ;THESE ROUTINES TURN OFF INTERRUPTS MOMENTARILY SO THAT
2547 ;LISTS MAY BE SAFELY MANIPULATED.
2549 ;Q POINTS TO THE HEADER WORD OF A QUEUE, REMOVE THE FIRST
2550 ;THING AND RETURN IN A. (ZERO IF NONE) CLOBBERS T
2551 CHAQGF: CONO PI,PIOFF
2552 HLRZ A,(Q) ;GET FIRST
2553 JUMPE A,PIONJ ;EMPTY
2554 HRRZ T,-2(A) ;GET SECOND
2555 HRLM T,(Q) ;MAKE FIRST
2560 BUG PAUSE,[CHAOS LIST TRASHED],OCT,Q
2561 SETZM (Q) ;IS NOW EMPTY
2565 SETZM (Q) ;IS NOW EMPTY
2570 ;RETURN BUFFER INTO WHICH THE BYTE POINTER IN A POINTS. CLOBBERS A,T,Q
2571 CHBPFR: SUBI A,1 ;SIOKT LIKES TO MAKE BP POINT AT NEXT BUFFER
2576 ;RETURN BUFFER POINTED TO BY A TO FREE UNLESS ON TRANSMIT LIST.
2577 CHABR1: HLLOS T,-2(A) ;RH GETS -1, NO LONGER ON REGULAR LIST
2578 AOJN T,CPOPJ ;EXIT IF STILL ON TRANSMIT LIST
2580 ;RETURN BUFFER POINTED BY A TO FREE STORAGE. CLOBBERS T, Q.
2581 CHABRT: MOVEI Q,CHQFRE
2584 BUG PAUSE,[FREEING 0]
2586 MOVE T,[ASCII/LUNCH/] ;TANSTAAFL
2588 SETOM -2(A) ;NOT ON TRANSMIT LIST NOW (THIS IS WHAT INITS
2589 AOS CHFRBF ; LH[-2(A)] WHEN BUFFER FIRST CREATED)
2590 ;JRST CHAQPL ;DROPS THROUGH
2592 ;A POINTS TO A BUFFER, Q TO A QUEUE. PUT IT ON AS THE LAST THING. BASHES T.
2593 CHAQPL: HLLZS -2(A) ;PUT ENDLIST IN RH
2595 HRRZ T,(Q) ;GET LAST
2596 HRRM A,(Q) ;MAKE NEW LAST
2597 JUMPN T,[HRRM A,-2(T) ;MAKE A COME AFTER IT
2599 HRLM A,(Q) ;WAS EMPTY, ALSO IS NEW FIRST
2603 ;A POINTS TO A BUFFER, Q TO A QUEUE. PUT IT ON AS THE FIRST THING. SMASHES T.
2604 CHAQPF: CONO PI,PIOFF
2605 HLRZ T,(Q) ;GET FIRST
2606 HRRM T,-2(A) ;MAKE SECOND
2607 HRLM A,(Q) ;MAKE NEW FIRST
2609 HRRM A,(Q) ;WAS EMPTY, ALSO MAKE NEW LAST
2613 ;ALLOCATE A BUFFER AT MAIN PROGRAM LEVEL, TO A, MASHES T, TT, Q, B.
2614 CHABG0: PUSHJ P,UDELAY ;WAIT FOR MEMORY
2615 CHABGT: PUSHJ P,CHABGI
2619 ;ALLOCATE A BUFFER, RETURN POINTER TO IT IN A, SKIP. BLOWS AWAY T, TT, Q.
2620 ;NON-SKIP IF NO BUFFERS AVAILABLE. (DOESN'T MAKE NEW ONES IF FREE LIST EMPTY)
2621 CHABAL: MOVEI Q,CHQFRE
2624 SETZM -1(A) ;NO LUNCH
2628 ;ALLOCATE A BUFFER TO A, MAKE NEW IF NONE FREE. OBLITERATES T,Q,B.
2629 ;NON-SKIP IF CAN'T GET MEMORY. (SUITABLE FOR CALLING FROM INT LEVEL)
2630 CHABGI: PUSHJ P,CHABAL ;TRY TO ALLOCATE A BUFFER FROM FREE LIST
2632 JRST POPJ1 ;WON, RETURN
2633 CONI PI,Q ;SAVE PI CHANNELS ON STATUS
2635 CONO PI,UTCOFF ;MAKE THE WORLD SAFE FOR IOMQ
2637 CAIL B,CHMXBF ;MAKE SURE NOT TO USE UP ALL CORE
2639 PUSHJ P,IOMQ ;GET 1K OF MEMORY
2640 JRST CHABG3 ;MEM NOT AVAILABLE, FAIL
2641 CONO PI,PICON(Q) ;WON, RESTORE PI STATUS
2643 DPB B,[MUR,,MEMBLT(A)]
2644 LSH A,10. ;ADDRESS OF 1K OF ALLOCATED MEMORY
2645 ADD A,[-<2000/PKTBSZ>,,2] ;-BUFFERS PER 1K,,OFFSET TO HEADER
2646 CHABG2: PUSHJ P,CHABRT ;PUT THEM ALL ON FREE LIST
2649 MOVEI B,<2000/PKTBSZ> ;THIS MANY MORE BUFFERS HAVE BEEN CREATED
2651 JRST CHABGI ;NOW GO ALLOCATE ONE
2653 ;HERE IF CHAOS NET TRYING TO USE UP TOO MUCH CORE
2654 CHABG4: MOVE B,CHMXTM ;DON'T COMPLAIN TOO OFTEN
2655 ADDI B,60.*30. ;JUST ONCE A MINUTE
2658 IFE CH10P, BUG CHECK,[CHAOS NET ATTEMPTING TO USE TOO MUCH CORE]
2661 BUG CHECK,[CHAOS NET ATTEMPTING TO USE TOO MUCH CORE, CONI=],OCT,B,[CONO=],OCT,CHXCNO,[CHOSTA=],OCT,CHOSTA
2665 CHABG3: CONO PI,PICON(Q) ;LOST, RESTORE PI STATUS
2666 POPJ P, ;AND TAKE ERROR RETURN
2668 ;FREE A WHOLE LIST OF BUFFERS, Q-> HEAD. DESTROYS A,T
2669 CHALFR: PUSHJ P,CHAQGF
2672 PUSHJ P,CHABR1 ;FREE UNLESS STILL ON TRANSMIT LIST
2676 ;Q -> A TRANSMIT QUEUE, FLUSH ALL BUFFERS BELONGING TO INDEX I.
2679 CONO PI,NETOFF ;DON'T LET TRANSMIT LIST CHANGE (AT ALL)
2680 HLRZ A,(Q) ;HEAD OF TRANSMIT LIST
2682 MOVEI B,2(Q) ;B PREVIOUS PACKET, A CURRENT, C NEXT
2683 CFLXM1: HLRZ C,-2(A) ;GET THREAD TO NEXT
2686 JRST 4,. ;CLAIMS NOT TO BE ON LIST?
2688 LDB T,[$CPKSX(A)] ;GET THIS PACKET'S INDEX
2691 HRLM C,-2(B) ;THREAD PREVIOUS TO NEXT
2692 HRROS T,-2(A) ;IF THIS BUFFER IS NOT ALSO ON SEND LIST,
2694 PUSHJ P,CHABRT ;RETURN IT
2699 HRRM B,(Q) ;LAST PACKET ON LIST MAY HAVE CHANGED
2701 SETZM (Q) ;TRANSMIT QUEUE IS NOW EMPTY
2705 ;SEARCH LIST IN Q FOR PACKET WHOSE CONTACT NAME MATCHES THAT
2706 ;OF PACKET IN A, RETURN IT IN B, SKIPPING IF WINNING. CLOBBERS T,TT,C,D,E,H,J.
2707 ;THE PACKET RETURNED IN B IS DE-LINKED FROM THE SEARCHED QUEUE.
2708 ;HAS TO BE CALLED WITH NETOFF OR IN PROGRESS, SO LIST CAN'T GET MUNGED.
2709 ;I HOPE IT'S NOT TOO BLETCHEROUSLY SLOW.
2710 CHAQSR: HLRZ B,(Q) ;GET START OF LIST TO SEARCH
2711 JUMPE B,CPOPJ ;EMPTY, LOSE
2712 MOVEI J,0 ;PACKET PREVIOUS TO B
2713 CHAQS1: LDB C,[$CPKNB(A)] ;SET UP STRING COMPARE LOOP
2714 LDB H,[$CPKNB(B)] ;THIS ASSUMES NO ZERO-LENGTH STRINGS
2720 ILDB TT,E ;DON'T IGNORE CASE, THAT WOULD JUST SLOW THIS
2721 CAME T,TT ;BAG-BITER DOWN EVEN MORE. EVERYONE SHOULD
2722 JRST CHAQS4 ;PUT THEIR CONTACT NAMES IN UPPER-CASE.
2723 CAIN T,40 ;TERMINATE ON SPACE
2730 CHAQS5: HRRZ C,-2(B) ;WON, DELINK PACKET FROM LIST
2731 JUMPE J,[ HRLM C,(Q)
2734 HRRZ C,(Q) ;CHECK LIST ENDING IN RIGHT PLACE
2742 HRRM J,(Q) ;TOOK LAST PACKET, STORE NEW LAST
2745 CHAQS3: SOJLE H,CHAQS5
2749 CHAQS4: MOVE J,B ;THIS ONE DOESN'T MATCH, TRY NEXT
2754 ;THIS ROUTINE RUNS IN THE CORE JOB AND CLEANS UP MEMORY USED BY CHAOS BUFFERS
2756 CHCLN: SKIPE A,CHTTBF ;SEE IF 2/3 OR MORE OF BUFFERS FREE
2758 POPJ P, ;NO BUFFERS OR NONE FREE, NOTHING TO DO
2760 IDIV A,B ;GET RATIO OF TOTAL TO USED
2761 CAIGE A,3 ;NOTE IF B IS ZERO A IS UNCHANGED
2762 POPJ P, ; AND AT LEAST 32.
2763 IFL TSYSM-256., MOVEI D,TSYSM-1 ;SCAN MEMORY FOR CHAOS BUFFER PAGES
2765 CHCLN0: LDB A,[MUR,,MEMBLT(D)]
2767 CHCLN4: SOJGE D,CHCLN0
2769 MOVE A,D ;QUICKLY DETERMINE IF ANY NON-FREE BUFFERS
2770 LSH A,10. ; ON THIS PAGE
2771 HRLI A,-<2000/PKTBSZ>
2772 MOVE T,[ASCII/LUNCH/]
2774 JRST CHCLN4 ;NOT FREE, DON'T BOTHER WITH SLOW STUFF
2777 SETZB C,CHCLNQ ;COLLECT ALL FREE BUFFERS THAT ARE ON THIS PAGE
2778 MOVE E,CHFRBF ;LOOP ABOUT AS MANY TIMES AS THERE ARE FREE BUFFERS
2779 CHCLN1: PUSHJ P,CHABAL ;GET NEXT FREE BUFFER
2783 JRST [ MOVEI Q,CHCLNQ ;THIS ONE'S ON THE PAGE, SAVE IT
2785 AOJA C,.+2 ] ;COUNT THEM
2786 PUSHJ P,CHABRT ;NOT ON THE PAGE, PUT BACK
2788 CHCLN2: CAIE C,<2000/PKTBSZ> ;DID WE GET THE WHOLE PAGE?
2789 JRST [ MOVEI Q,CHCLNQ ? PUSHJ P,CHALFR ? JRST CHCLN4 ]
2790 MOVNS C ;YES, GET RID OF THESE BUFFERS