Consolidate license copies
[its.git] / system / chaos.287
1 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
2 ;;;
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.
7 ;;;
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.
12 ;;;
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.
16
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
19                          ; LONG AGO
20 IFN FTRCHK, .ERR REDUNDANT CHECKING ENABLED IN CHAOS ROUTINES
21
22 ;NOTES:
23 ; WINDOW SIZE ADJUSTMENT STUFF
24 ; ROUND TRIP TIME MEASUREMENT & OTHER METERING
25 ; BETTER METERING, SOME METERS ARE CURRENTLY MISSING
26
27 SUBTTL CH-10 HARDWARE DEFINITIONS
28
29 IFN CH10P,[
30 CHX==470        ;I/O DEVICE NUMBER
31
32 ;CONI/CONO BITS
33                 ;1.1-1.3 PIA
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)
53 ];CH10P
54
55 IFN CH11P,[
56 $INSRT KSNET
57 ];CH11P
58 \f
59 SUBTTL CHAOS NET VARIABLES
60
61 EBLK
62
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
72
73 ;Internet address of my Chaosnet Interface
74 IMPUS4==<.BYTE 4 ? 0 ? .BYTE 8 ? 128. ? 31. ? .BYTE 16. ? MYCHAD>
75
76 ;PER-INDEX VARIABLES
77
78 CHSUSR: REPEAT NINDX,-1         ;-1 INDEX NOT IN USE
79                                 ;OTHERWISE RH USER
80  $CHSUO==220600                 ;3.1-3.6 OUTPUT CHANNEL NUMBER (77=IOPUSHED)
81  $CHSUI==300600                 ;3.7-4.3 INPUT CHANNEL NUMBER (77=IOPUSHED)
82                                 ;4.9 ZERO IF IN USE
83
84 CHSSTA: REPEAT NINDX,-1         ;RH STATE, LH FLAGS
85  %CF==525252(1)
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
91
92  %CS==,,-1
93    .SEE %CSCLS  ;FOR SYMBOLS FOR STATES
94
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
113
114 CHAOSW: -1 ? 0  ;SWITCH FOR ALLOCATING INDICES
115 CHALCP: 0       ;LAST INDEX ALLOCATED, USED TO CIRCULARIZE ALLOCATION
116
117 CHIRFJ: SIXBIT/CHAOS/ ? 0       ;AGENT OF CHAOS
118 .SEE NETUSW ;NON-ZERO ENABLES RFC'S FROM HOSTS OTHER THAN SELF.
119 \f
120 ;METERS
121
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
132
133 ;BUFFER QUEUES.  EACH HAS A ONE-WORD HEADER, WHICH IS ZERO
134 ;IF IT IS EMPTY, OR CONTAINS FIRST,,LAST BUFFER ADDRESS.
135
136 CHQFRE: 0       ;FREE LIST
137 CHQRFC: 0       ;PENDING RFCS
138 CHQLSN: 0       ;PENDING LISTENS
139 CHCLNQ: 0 .SEE CHCLN
140
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
145
146 IFN T11CHP,[
147 ;VARIABLES FOR TEN-11 INTERFACE CONNECTING TO CHAOS NET
148
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.
172 ];T11CHP
173
174 IFN DLCP,[
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)
178
179 .SEE DLCINI     ;WHEN THE 11 SEES THIS NON-ZERO, IT KNOWS ITS HAS
180                 ; BEEN RELOADED AND RESETS ITS PACKET POINTER TO 0
181                 ; AND CLEARS DLCINI.
182 DLCSBF: 0       ;CURRENT BUFFER, 10 SEND SIDE (1 OR 0)
183
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
190
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
197
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
202 ];DLCP
203
204 IFN CH10P,[
205 ;VARIABLES FOR CH10 INTERFACE ONLY
206
207 CHXCNO: CHXREN+CHXTEN+CHXCHN    ;CONO BITS CURRENTLY IN EFFECT
208 ];CH10P
209
210 IFN CH11P,[
211 ;VARIABLES FOR CH11 INTERFACE ONLY
212
213 CHXCSR: %CAREN+%CATEN           ;CURRENT BITS WANTED IN CSR
214 ];CH11P
215
216 IFN CH10P+CH11P,[
217 ;VARIABLES THAT WOULD OTHERWISE BE IN THE FRONT-END
218
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
222
223 ;ROUTING STUFF
224 NSUBNT==122.    ;122 is maximum possible
225 SBNRUT: REPEAT NSUBNT, 1000,,3040       ;COST,,GATEWAY ADDRESS
226
227 ;EXTRA METERS
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
234 ];CH10P+CH11P
235 IFN CH11P,[
236 CHNSPZ: 0       ;NUMBER OF TIMERS BIT COUNTER SPAZZED
237 ];CH11P
238
239 BBLK
240 \f
241 ;Get definitions of packet format
242
243 IF1,[
244 $INSRT CHSDEF
245
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
248
249 $CPKSX==$CHXRI+40000,,2 ;REAL PART OF SOURCE INDEX
250 $CPKDX==$CHXRI+40000,,1 ;REAL PART OF DESTINATION INDEX
251
252 ];IF1
253
254 ;;; Debugging Info
255
256 ;;; This contains the last N headers received from the network
257 NRECHD==20
258 EBLK
259 RECHDP: RECHDR          ;POINTER TO NEXT
260 RECHDR: BLOCK NRECHD*%CPKDT
261 BBLK
262 \f
263 SUBTTL CHAOS NET OPEN (.CALL CHAOSO)
264
265 ;.CALL CHAOSO,RCVCHN,XMTCHN,<RECEIVE,,TRANSMIT>
266
267 CHASO:  JRST OPNL12             ; Say "mode not avail"
268 CHAOSO: HRRZS A
269         HRRZS B
270         CAIGE A,20
271          CAIL B,20
272           JRST OPNL14           ;BAD CHANNEL NUMBER ARGUMENT
273         CAMN A,B
274          JRST OPNL33            ;BOTH CHANNELS SAME IS ILLEGAL
275         PUSH P,A                ;SAVE ARGS, CLOSE THE SPECIFIED CHANNELS
276         PUSH P,B
277         PUSH P,C
278         MOVE R,A
279         ADDI R,IOCHNM(U)
280         PUSHJ P,CCLOSE
281         MOVE R,-1(P)            ;B
282         ADDI R,IOCHNM(U)
283         PUSHJ P,CCLOSE
284         POP P,C
285         POP P,B
286         POP P,A
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
290             CHAOSW
291         MOVE I,CHALCP           ;ALLOCATE AN INDEX
292         SOJL I,CHASO2
293 CHASO1: SKIPL CHSUSR(I)
294          SOJGE I,CHASO1
295         JUMPGE I,CHASO3
296 CHASO2: MOVEI I,NINDX           ;REACHED BEGINNING, WRAP AROUND TO END
297         CAMN I,CHALCP
298          JRST OPNL6             ;ALL INDICES IN USE
299         MOVEM I,CHALCP
300         SOJA I,CHASO1
301
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
306         HRLZM C,CHSWIN(I)
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
311         HRRI T,CHAIDN
312         ADDI A,IOCHNM(U)
313         MOVEM T,(A)
314         HRRI T,CHAODN
315         ADDI B,IOCHNM(U)
316         MOVEM T,(B)
317         JRST LSWPJ1             ;SUCCESS RETURN
318
319 ;INITIALIZE CONNECTION IN I
320 CHASO4: SETZM CHSNBF(I)
321         SETZM CHSNOS(I)
322         SETZM CHSIBF(I)
323         SETZM CHSPBF(I)
324         SETZM CHSOBF(I)
325         SETZM CHSACK(I)
326         SETZM CHSPKN(I)         ;START PACKET NUMBERING AT ONE
327         SETZM CHSOBP(I)
328         SETZM CHSOBC(I)
329         SETZM CHSIBP(I)
330         SETZM CHSIBC(I)
331         MOVSI T,%CFOFF .SEE %CSCLS
332         MOVEM T,CHSSTA(I)
333         LDB TT,[$CHXUN+40000,,CHSLCL(I)]
334         CAIE TT,CHXMUN          ;INCREMENT THE UNIQUIZER
335          AOSA TT
336           MOVEI TT,1            ;BUT MAKE SURE IT ISN'T ZERO
337         DPB TT,[$CHXUN+40000,,CHSLCL(I)]
338         SETZM CHSFRN(I)
339         POPJ P,
340 \f
341 SUBTTL CHAOS NET CLOSE, FINISH, WHYINT, NETBLK, CHAOSQ
342
343 ;CLOSE A CHAOS CHANNEL.
344 CHACLS: HLRZ I,(R)              ;GET VARIABLES INDEX
345         MOVSI A,%CFCLS
346         TDNN A,CHSSTA(I)        ;ONLY REALLY CLOSE WHEN BOTH CHANNELS CLOSED
347          JRST CHACS7
348         PUSHJ P,CHACS1          ;FLUSH ALL BUFFERS OF THIS CONNECTION
349         HRRZ T,CHSSTA(I)
350         CAIN T,%CSOPN
351          PUSHJ P,CHABGI         ;SEND A CLS IF OPEN AND MEM AVAIL
352           JRST CHACS4
353         MOVE T,CHSFRN(I)
354         MOVEM T,%CPKS(A)
355         MOVE T,CHSLCL(I)
356         MOVEM T,%CPKD(A)
357         MOVEI B,[ASCIZ/Channel closed/]
358         PUSHJ P,CHIRF2
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
363         SETZM CHQLSN
364 CHACS5: MOVEI Q,W               ;GET NEXT PACKET OFF OLD LIST
365         PUSHJ P,CHAQGF
366         JUMPE A,NETONJ          ;EXHAUSTED
367         LDB B,[$CPKSX(A)]       ;GET OWNER
368         CAME B,I
369          JRST [ MOVEI Q,CHQLSN  ;NOT THIS INDEX, PUT BACK
370                 PUSHJ P,CHAQPL
371                 JRST CHACS5 ]
372         PUSHJ P,CHABRT          ;FREE
373         JRST CHACS5
374
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
381         DPB T,B
382         SETZM (R)
383         POPJ P,
384
385 ;THIS FLUSHES ALL BUFFERS FOR CONNECTION IN I
386 CHACS1: MOVSI A,%CFOFF          ;INHIBIT RETRANSMISSIONS
387         IORB A,CHSSTA(I)
388         LDB E,[$CFTTN,,CHSSTA(I)]
389         EXCH E,I
390         TLNE A,%CFSTY
391          PUSHJ P,NSTYN0         ;DISCONNECT FROM STY
392           JFCL
393         EXCH E,I
394 IFN DLCP,[
395         MOVEI Q,DLCXMQ          ;REMOVE THIS INDEX'S BUFFERS FROM DL10 TRANSMIT LIST
396         PUSHJ P,CFLXMQ
397 ];DLCP
398 IFN T11CHP,[
399         MOVEI Q,T11XMQ          ;REMOVE THIS INDEX'S BUFFERS FROM TEN11 TRANSMIT LIST
400         PUSHJ P,CFLXMQ
401 ];T11CHP
402 IFN CH10P+CH11P,[
403         MOVEI Q,CHXXMQ          ;REMOVE THIS INDEX'S BUFFERS FROM CH10 TRANSMIT LIST
404         PUSHJ P,CFLXMQ
405 ];CH10P+CH11P
406         MOVEI Q,CHSIBF(I)       ;RETURN RECEIVE BUFFERS
407         PUSHJ P,CHALFR
408         MOVEI Q,CHSPBF(I)       ;RETURN OUT OF ORDER RECEIVE BUFFERS
409         PUSHJ P,CHALFR
410         MOVEI Q,CHSOBF(I)       ;RETURN TRANSMIT BUFFERS
411         PUSHJ P,CHALFR
412 IFE FTRCHK,[
413         SKIPE A,CHSOBP(I)       ;RETURN STREAM I/O BUFFERS
414          PUSHJ P,CHBPFR
415         SKIPE A,CHSIBP(I)
416          PUSHJ P,CHBPFR
417 ];FTRCHK
418 IFN FTRCHK,[
419         SKIPN A,CHSOBP(I)
420          JRST .+3
421           SETZM CHSOBP(I)
422           PUSHJ P,CHBPFR
423         SKIPN A,CHSIBP(I)
424          JRST .+3
425           SETZM CHSIBP(I)
426           PUSHJ P,CHBPFR
427 ];FTRCHK
428         POPJ P,
429 \f
430 ;.CALL FORCE ON A CHAOS OUTPUT CHANNEL.
431 CHAFRC: HLRZ I,(R)
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
439         ADDI A,2
440         MOVSI T,(SETZ)          ;DATA OPCODE
441         MOVEM T,(A) .SEE $CPKOP
442         MOVEI T,%CPMXC          ;SET BYTE COUNT
443         SUB T,CHSOBC(I)
444         DPB T,[$CPKNB(A)]
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
448         SETZM CHSOBC(I)
449         POPJ P,
450
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
454 CHAFIN: HLRZ T,(R)
455         PUSHJ P,[HRRZ A,CHSWIN(T)
456                  CAMG A,CHSNOS(T)
457                   AOS (P)
458                  POPJ P, ]
459          PUSHJ P,UFLS
460         JRST POPJ1
461
462 ;.CALL WHYINT ON A CHAOS CHANNEL.
463 ;RESULTS ARE:   A/ %WYCHA
464 ;               B/ STATE
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#
469 CHAWHY: HLRZ I,(R)
470         MOVEI A,%WYCHA
471         HRRZ B,CHSSTA(I)
472         HRLZ C,CHSNBF(I)        ;NUMBER OF PACKETS AVAILABLE
473         SKIPE CHSIBP(I)
474          ADD C,[1,,]            ;ADD 1 IF PARTIALLY-READ INPUT BUFFER EXISTS
475         MOVSI D,%CFSTY
476         TDNE D,CHSSTA(I)
477          MOVEI C,0              ;NO INPUT AVAILABLE IF DIRECT-CONNECTED
478         SKIPLE CHSNOS(I)
479          HRR C,CHSNOS(I)
480         MOVE D,CHSWIN(I)
481         LDB E,[$CHSUO,,CHSUSR(I)]
482         CAIN E,77
483          MOVEI E,-1
484         LDB T,[$CHSUI,,CHSUSR(I)]
485         CAIN T,77
486          TLOA E,-1
487           HRL E,T
488         JRST POPJ1
489
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)]
497         TLO D,(NW%CHS)
498         POPJ P,
499
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
503         SUBI T,IOCHNM(U)
504         SKIPN I
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
512         POPJ P,
513 \f
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
518 ;VAL 1 - NEW STATE
519 ;VAL 2 - TIME LEFT
520 CHANBK: HRRZ T,(R)
521         CAIL T,CHAIDN
522          CAILE T,CHAODN
523 IFN NCPP,  JRST ANETBL          ;NOT A CHAOS CHANNEL, TRY ARPANET
524 IFE NCPP,  JRST OPNL34
525         HLRZ I,(R)
526         MOVE T,I                ;SAVE INDEX IN T FOR FLSINS
527         CAIGE W,3
528          JRST [ HRLOI D,377777  ;NO TIME GIVEN, USE INFINITY
529                 JRST CHANB4 ]
530         TLNE C,1000             ;SKIP IF POINTER RATHER THAN IMMEDIATE
531          JRST [ HRRZ D,C        ;GET IMMEDIATE TIME
532                 ADD D,TIME
533                 JRST CHANB4 ]
534         XCTR XRW,[MOVES D,(C)]  ;GET TIME, CHECK WRITEABILITY
535         JUMPGE D,[ MOVNS D      ;RELATIVE TIME, MAKE NEGATIVE ABSOLUTE
536                    SUB D,TIME
537                    JRST .+1 ]
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
543          PUSHJ P,UFLS
544         MOVE B,D
545         SUB B,TIME              ;HOW MUCH USED?
546         HRRZ A,CHSSTA(I)        ;NEW STATE
547         JRST POPJ1
548
549 CHANB2: HRRZ A,CHSSTA(T)        ;CURRENT STATE
550         CAME A,AC0S+B(U)        ;SKIP IF STILL MATCH
551          JRST POPJ1
552         MOVE A,AC0S+D(U)        ;TIMEOUT TIME
553         CAMG A,TIME
554          AOS (P)
555         POPJ P,
556
557 ;.CALL CHAOSQ
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
565         PUSHJ P,CHAQGF
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
569         MOVE T,C
570         XCTR XBW,[BLT T,%CPMXW-1(C)]
571         JRST POPJ1
572 \f
573 SUBTTL CHAOS NET IOT ROUTINES
574
575 ;.CALL PKTIOT.  ARG1 CHANNEL, ARG2 ADDRESS OF %CPMXW-WORD BUFFER
576 PKTIOT: HRRZ A,(R)
577         CAIN A,CHAODN
578          JRST CHPKO
579         CAIE A,CHAIDN
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
586                  JRST CHPKI ]
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
592         XCTR XBW,[BLT B,(T)]
593         LDB TT,[$CPKOP(A)]      ;GET OPCODE
594         CAIGE TT,%CODAT         ;ACKNOWLEDGE IF DATA
595          CAIN TT,%COEOF         ;OR EOF MARK
596           PUSHJ P,CHPKIA
597         SOS CHSNBF(I)           ;NOW REMOVE BUFFER FROM RECEIVE LIST
598         MOVEI Q,CHSIBF(I)
599         PUSHJ P,CHAQGF
600         PUSHJ P,CHABRT          ;AND RETURN TO FREE
601         JRST POPJ1              ;SUCCESS
602
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
611          PUSHJ P,UFLS
612         POPJ P,                 ;RETRY
613
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
618          JRST CHASTO
619         HLRZ TT,CHSACK(I)       ;GET LAST ONE REALLY ACKNOWLEDGED
620         SUB T,TT                ;GET NUMBER OF PACKETS AWAITING ACK
621         SKIPGE T
622          ADDI T,200000
623         IMULI T,3               ;MORE THAN ONE THIRD THE WINDOW SIZE?
624 IFN FTRCHK,[
625         MOVE TT,-1(A)
626         CAMN TT,[ASCII/LUNCH/]
627          BUG PAUSE,[CHAOS BUFFER ADDRESS TRASHED],OCT,A
628 ];FTRCHK
629         HLRZ TT,CHSWIN(I)
630         CAML T,TT
631          PUSHJ P,CHASTO         ;YES, SEND ACK (CAN'T PCLSR)
632         POPJ P,
633
634 ;SET UP FOR CHAOS IOT
635 CHAIOS: HLRZ I,(R)              ;GET INDEX
636         MOVE E,CHSSTA(I)
637         TLNE E,%CFSTY+%CFCLS
638          JRST IOCR10            ;CAN'T DO I/O WHILE DIRECT-CONNECTED OR HALF-CLOSED
639         HRRZS E                 ;RETURN STATE IN E
640         POPJ P,
641 \f
642 ;UNIT-MODE INPUT.
643 ;1.4 IN CTLBTS IS DON'T-HANG MODE
644         SKIPA T,[SIOKT]
645 CHAUI:   MOVEI T,CHRKT
646         PUSHJ P,CHAIOS          ;SET UP I, E
647         MOVE E,[440800,,4]
648         JSP B,(T)
649             CHSIBP(I)
650             CHSIBC(I)
651             CHAIBG
652             CHAIBD
653             0
654             TRNA
655
656 ;CHAOS INPUT BUFFER DISCARD
657 CHAIBD: SKIPN A,CHSIBP(I)
658          POPJ P,
659         SETZM CHSIBP(I)
660         SETZM CHSIBC(I)
661         JRST CHBPFR
662
663 ;CHAOS INPUT BUFFER GET
664 CHAIBG: HLRZ A,CHSIBF(I)        ;GET FIRST RECEIVE BUFFER
665         JUMPE A,CHAIB2          ;NONE
666         LDB TT,[$CPKOP(A)]      ;IS IT NORMAL DATA?
667         CAIE TT,%CODAT
668          JRST CHAIB1            ;NO
669         PUSHJ P,CHAIB3          ;YES, ACKNOWLEDGE AND REMOVE FROM LIST
670         LDB J,[$CPKNB(A)]       ;SET UP FOR BYTE STREAM INPUT
671         MOVEI TT,%CPKDT(A)
672         JRST SIOBG1
673
674 CHAIB3: PUSH P,B
675         PUSH P,C
676         PUSH P,E
677         PUSHJ P,CHPKIA          ;SEND ACKNOWLEDGEMENT
678         POP P,E
679         POP P,C
680         POP P,B
681         SOS CHSNBF(I)           ;REMOVE BUFFER FROM RECEIVE LIST
682         MOVEI Q,CHSIBF(I)
683         JRST CHAQGF
684
685 CHAIB1: CAIE TT,%COEOF
686          JRST CHAIB2
687         PUSHJ P,CHAIB3          ;EOF PACKET, ACKNOWLEDGE IT
688         PUSHJ P,CHABRT          ;RETURN IT TO FREE
689         JRST POPJ2              ;AND SIGNAL EOF
690
691 CHAIB2: MOVE TT,CTLBTS(U)       ;CHECK DON'T-HANG MODE
692         TRNE TT,10
693          JRST POPJ2             ;YES, EOF
694         JUMPN A,IOCR10          ;NO, ABNORMAL PACKET, BARF
695         PUSHJ P,CHPKI0          ;AWAIT INPUT
696         JRST CHAIBG             ;RETRY
697 \f
698 ;UNIT-MODE OUTPUT.
699 ;1.4 IN CTLBTS IS DON'T-HANG MODE
700         SKIPA T,[SIOKT]
701 CHAUO:   MOVEI T,CHRKT
702         PUSHJ P,CHAIOS          ;SET UP I, E
703         CAIE E,%CSOPN
704          JRST IOCR10            ;NOT OPEN, ERROR
705         MOVE E,[440800,,4]
706         JSP B,(T)
707             SETZ CHSOBP(I)
708             CHSOBC(I)
709             CHAOBG
710             CHAOBW
711             0
712             TRNA
713
714 ;GET NEW OUTPUT BUFFER
715 CHAOBG: SKIPG CHSNOS(I)         ;WINDOW FULL
716          PUSHJ P,[ MOVE TT,CTLBTS(U)
717                    TRNN TT,10
718                     JRST UFLS
719                    SUB P,[1,,1]
720                    JRST POPJ2 ] ;DON'T HANG MODE, RETURN "EOF"
721         PUSH P,B
722         PUSHJ P,CHABGT          ;SET UP AN OUTPUT BUFFER
723         POP P,B
724
725         MOVEI TT,%CPKDT(A)
726         MOVEI J,%CPMXC
727         JRST SIOBG1
728
729 ;WRITE OUTPUT BUFFER
730 CHAOBW: PUSH P,B
731         PUSH P,C
732         PUSH P,E
733         PUSHJ P,CHAFC1
734         POP P,E
735         JRST POPCBJ
736 \f
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
742         CAIG D,%CPMXC
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
746         LSH D,-2
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
750             CHPKO2
751         MOVEM H,(A)             ;STORE PACKET HEADER, NOT STORED WITH BLT
752         HRRI J,1(A)             ; BECAUSE MIGHT HAVE CHANGED AFTER ERROR CHECK
753         ADDI D,-1(A)
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
757          JRST CHODAT            ;DATA
758         LDB D,[$CPKOP(A)]       ;GET OPCODE
759         CAIGE D,%COMAX          ;DISPATCH ON IT
760          JRST @.+1(D)
761         OFFSET -.
762         JRST IOCER3             ;OPCODE OUT OF BOUNDS
763 %CORFC::JRST CHORFC
764 %COOPN::JRST CHOOPN
765 %COCLS::JRST CHOCLS
766 %COFWD::JRST CHOFWD
767 %COANS::JRST CHOFWD
768 %COSNS::JRST IOCER3
769 %COSTS::JRST IOCER3
770 %CORUT::JRST IOCER3
771 %COLOS::JRST IOCER3
772 %COLSN::JRST CHOLSN
773 %COMNT::JRST IOCER3
774 %COEOF::JRST CHOEOF
775 %COUNC::JRST CHOUNC
776 %COBRD::JRST IOCER9             ;UNTIL I IMPLEMENT IT
777 %COMAX::OFFSET 0
778
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
782         PUSHJ P,CHABRT
783         JRST POPQJ
784
785 ;SENDING %COEOF (END-FILE MARK)
786 CHOEOF: CAIE E,%CSOPN           ;CONNECTION MUST BE OPEN
787          JRST IOCR10
788         SKIPG CHSNOS(I)
789          PUSHJ P,UFLS           ;WINDOW FULL, WAIT
790         JRST CHOOP1             ;SEND RETRANSMITTABLE CONTROL PACKET
791
792 ;SENDING REQUEST FOR CONNECTION
793 CHORFC: PUSHJ P,CHORF1          ;RE-INITIALIZE CONNECTION
794         MOVSI B,777774          ;SAVE DESTINATION HOST, CLEAR OTHER BITS
795         ANDB B,%CPKD(A)
796         MOVEM B,CHSFRN(I)
797         MOVEI E,%CSRFS          ;PUT INTO RFC-SENT STATE
798         JRST CHOOP1             ;GO SEND
799
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
803         PUSH P,A
804         PUSH P,B
805         PUSHJ P,CHACS1          ;FLUSH BUFFERS FROM CONNECTION
806         PUSHJ P,CHASO4          ;REINITIALIZE VARIABLES
807         JRST POPBAJ
808
809 ;"SENDING" LISTEN
810 CHOLSN: PUSHJ P,CHORF1
811         PUSHJ P,LSWDEL          ;GOING TO USE PACKET
812         MOVEI E,%CSLSN          ;PUT INTO LISTENING STATE
813         HRRM E,CHSSTA(I)
814         MOVEI Q,CHQRFC          ;NOW SEARCH PENDING-RFC QUEUE
815         CONO PI,NETOFF
816         PUSHJ P,CHAQSR
817          JRST [ CONO PI,NETON   ;NO MATCH, PUT ONTO LISTENING QUEUE
818                 MOVEI Q,CHQLSN
819                 MOVE T,CHSLCL(I)
820                 MOVEM T,%CPKS(A)
821                 JRST CHAQPL ]
822         PUSHJ P,CHIRF0          ;MATCH, JOIN INTERRUPT LEVEL CODE
823         JRST NETONJ
824 \f
825 ;SENDING OPEN
826 CHOOPN: CAIE E,%CSRFC           ;CONNECTION MUST BE RFC-RECEIVED
827          JRST IOCR10
828         MOVEI TT,4              ;SET BYTE COUNT TO 4
829         DPB TT,[$CPKNB(A)]
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
838         MOVEM T,CHSITM(I)
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
842         CAIL B,177777
843          TDZA B,B
844           ADDI B,1
845         HRRM B,CHSPKN(I)
846         DPB B,[$CPKPN(A)]
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
853         MOVEM B,%CPKS(A)
854         MOVE D,CHSFRN(I)        ;SET UP DESTINATION
855         MOVEM D,%CPKD(A)
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
862         PUSHJ P,CHAQPL
863         JRST CHAXM0             ;GO TRANSMIT
864
865 ;SENDING CLOSE
866 CHOCLS: CAIE E,%CSOPN           ;CONNECTION MUST BE OPEN
867 ;SEND FWD OR ANS
868 CHOFWD:  CAIN E,%CSRFC          ; OR RFC-RECEIVED
869           TLOA E,%CFOFF         ;PUT IT INTO THE CLOSED STATE
870            JRST IOCR10
871         HLLZM E,CHSSTA(I) .SEE %CSCLS
872         PUSHJ P,LSWDEL          ;BUFFER WILL BE USED
873         JRST CHODT2             ;GO TRANSMIT
874
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
880         CAIN E,%CSOPN
881          JRST CHOUN2
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
886         MOVEM E,CHSSTA(I)
887         MOVE D,%CPKD(A)         ;Save destination
888         MOVEM D,CHSFRN(I)
889 CHOUN2: MOVE D,CHSFRN(I)        ;Set up destination
890         MOVEM D,%CPKD(A)
891 CHOUN1: MOVE B,CHSLCL(I)        ;Set up source
892         MOVEM B,%CPKS(A)
893         PUSHJ P,LSWDEL
894         SETOM -2(A)
895         JRST CHAXMT
896
897 OVHMTR CHX
898
899 ;SENDING REGULAR PACKET
900 CHODAT: CAIE E,%CSOPN           ;CONNECTION MUST BE OPEN
901          JRST IOCR10
902         SKIPG CHSNOS(I)
903          PUSHJ P,UFLS           ;WINDOW FULL, WAIT
904         PUSHJ P,LSWDEL          ;BUFFER WILL BE USED
905 CHODT1: HRRZ B,CHSPKN(I)        ;ASSIGN PACKET NUMBER
906         CAIL B,177777
907          TDZA B,B
908           ADDI B,1
909         HRRM B,CHSPKN(I)
910         DPB B,[$CPKPN(A)]
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
917         MOVEM B,%CPKS(A)
918         MOVE D,CHSFRN(I)        ;SET UP DESTINATION
919         MOVEM D,%CPKD(A)
920         SETOM -2(A)             ;NOTE NOT ON TRANSMIT LIST YET
921         SKIPL (A)               ;SKIP IF DATA PACKET
922          JRST CHAXMT
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
928         PUSHJ P,CHAQPL
929         SOSA CHSNOS(I)          ;USE UP WINDOW, SKIP
930 ;SKIPS THROUGH INTO CHAXMT
931 \f;SKIPS IN
932 SUBTTL CHAOS NET PACKET TRANSMIT ROUTINE
933
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
942 CHAXM0: ANDI E,177
943         AOS CHNPO
944         MOVE T,TIME
945         MOVEM T,-1(A)           ;SET TIME OF LAST TRANSMISSION
946         CONO PI,NETOFF          ;ONE PROCESS AT A TIME, TO PROTECT INTERFACE VARIABLES
947 IFN FTRCHK,[
948         HLRZ J,-2(A)            ;I TOLD YOU TO SETOM -2(A)
949         CAIE J,-1
950          BUG PAUSE,[CHAOS BUFFER THREAD TRASHED],OCT,A,OCT,-2(A)
951 ];FTRCHK
952 IFN DLCP,[
953 ;FOR NOW, JUST ALWAYS SHIP IT OUT THE DL10
954 IFN FTRCHK,[
955         HLRZ J,DLCXMQ           ;MAKE SURE NOT PUTTING ON LIST TWICE
956         JUMPE J,.+7
957         CAMN J,A
958          BUG PAUSE,[CHAOS BUFFER ALREADY ON DLCXMQ],OCT,A
959         HLRZ J,-2(J)
960         CAIN J,-1
961          BUG PAUSE,[DLCXMQ THREAD TRASHED]
962         JUMPN J,.-5
963         MOVEI J,1               ;MAKE SURE NOT ACTIVE TO 11
964         HRRZ T,DLCSA1(J)
965         CAMN T,A
966          BUG PAUSE,[CHAOS BUFFER ALREADY ACTIVE TO 11],OCT,A
967         SOJGE J,.-3
968 ];FTRCHK
969         HRRZS -2(A)             ;PUT END-LIST INDICATOR IN LH (FLAGS TRANSMIT ACTIVE)
970         MOVE J,DLCSBF           ;SEE IF SEND BUFFER IS FREE
971         SKIPE DLCSS1(J)
972          JRST CHXMD1
973         PUSHJ P,DLCXMT          ;YES, SEND THE PACKET NOW
974         JRST CHXMD2
975
976 CHXMD1: HRRZ B,DLCXMQ           ;NO BUFFERS FREE RIGHT NOW, QUEUE
977         JUMPE B,[ HRLZM A,DLCXMQ ? JRST .+2 ]
978          HRLM A,-2(B)
979         HRRM A,DLCXMQ
980 CHXMD2: CONO PI,PICON(E)        ;RESTORE PI
981         POPJ P,
982 ];DLCP
983 IFN T11CHP,[
984 ;FOR NOW, JUST ALWAYS SHIP IT OUT THE TEN11
985         PUSHJ P,T11CHK          ;SEE IF TEN-11 IS READY
986          JRST CHXME3            ;NO
987         SKIPE @T11OBP           ;SEE IF HAVE AVAILABLE OUTPUT BUFFER
988          JRST CHXME1            ;NO
989         PUSHJ P,T11XMT          ;SEND THE PACKET NOW
990         JRST CHXME2
991
992 CHXME3: HRROS T,-2(A)           ;TEN11 DOWN, DISCARD PACKET
993         AOJN T,CHXME2
994         PUSHJ P,CHABRT
995         JRST CHXME2
996
997 CHXME1: HRRZ B,T11XMQ           ;NO BUFFERS FREE RIGHT NOW, QUEUE
998         JUMPE B,[ HRLZM A,T11XMQ ? JRST .+2 ]
999          HRLM A,-2(B)
1000         HRRM A,T11XMQ
1001         HRRZS -2(A)             ;PUT END-LIST INDICATOR IN LH
1002 CHXME2: CONO PI,PICON(E)        ;RESTORE PI
1003         POPJ P,
1004 ];T11CHP
1005 IFN CH10P,[
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 ]
1009          HRLM A,-2(B)
1010         HRRM A,CHXXMQ
1011         HRRZS -2(A)             ;PUT END-LIST INDICATOR IN LH
1012         MOVEI B,CHXTEN          ;ENABLE TRANSMIT-DONE INTERRUPT
1013         IORM B,CHXCNO
1014         CONO CHX,@CHXCNO
1015         CONO PI,PICON(E)        ;RESTORE PI
1016         POPJ P,
1017 ];CH10P
1018 IFN CH11P,[
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 ]
1022          HRLM A,-2(B)
1023         HRRM A,CHXXMQ
1024         HRRZS -2(A)             ;PUT END-LIST INDICATOR IN LH
1025         MOVEI B,%CATEN          ;ENABLE TRANSMIT-DONE INTERRUPT
1026         IORB B,CHXCSR
1027         IOWRI B,CAICSR
1028         CONO PI,PICON(E)        ;RESTORE PI
1029         POPJ P,
1030 ];CH11P
1031 \f
1032 SUBTTL CHAOS NET DIRECT CONNECT TO STY
1033
1034 OVHMTR CHS
1035
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
1039         MOVE TT,CHSSTA(I)
1040         TLNN TT,%CFSTY
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
1048                 PUSHJ P,CHABGI
1049                  JRST STYCH3    ;NO CORE, WAIT ONE CLOCK TICK
1050                 MOVEI D,%CPKDT(A)
1051                 HRLI D,440800
1052                 MOVEM D,CHSOBP(I)
1053                 MOVEI E,%CPMXC
1054                 MOVEM E,CHSOBC(I)
1055                 JRST .+3 ]
1056           SKIPG E,CHSOBC(I)
1057            JRST STYCH4          ;BUFFER FULL, FORCE IT
1058         EXCH R,I                ;I GETS TTY, R GETS CHAOS
1059         CONO PI,TTYOFF
1060         MOVEM D,DBBBP           ;SET UP BUFFER FOR TTY OUTPUT INTERRUPT LEVEL
1061         MOVEM E,DBBCC
1062         MOVEM E,DBBCC1
1063         PUSH P,R
1064         SETOM TYPNTF
1065         PUSHJ P,TYP             ;GENERATE OUTPUT
1066         SETZM TYPNTF
1067         POP P,R
1068         EXCH R,I                ;I GETS CHAOS, R GETS TTY
1069         MOVE D,DBBBP            ;ADVANCE POINTERS
1070         MOVEM D,CHSOBP(I)
1071         MOVE E,DBBCC
1072         SUB E,DBBCC1            ;MINUS # CHARS OUTPUT GENERATED
1073         CONO PI,TTYON
1074         ADDM E,CHSOBC(I)
1075 STYCH4: PUSHJ P,CHAFC1          ;FORCE THE BUFFER
1076         JRST STYCHA             ;CHECK FOR MORE OUTPUT
1077 \f
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
1081                 HLRZ A,CHSIBF(I)
1082                 JUMPE A,STYNT8  ;NONE, RETURN TO STYNTC
1083                 LDB TT,[$CPKOP(A)]
1084                 CAIE TT,%CODAT
1085                  JRST STYCH9    ;RANDOM PACKET, DISCONNECT
1086                 PUSHJ P,CHPKIA  ;ACKNOWLEDGE GOBBLING OF THIS PACKET
1087                 SOS CHSNBF(I)   ;REMOVE BUFFER FROM RECEIVE LIST
1088                 MOVEI Q,CHSIBF(I)
1089                 PUSHJ P,CHAQGF
1090                 LDB E,[$CPKNB(A)]       ;SET UP FOR BYTE STREAM INPUT
1091                 MOVEM E,CHSIBC(I)
1092                 MOVEI D,%CPKDT(A)
1093                 HRLI D,440800
1094                 MOVEM D,CHSIBP(I)
1095                 JRST STYCH1 ]
1096         ILDB A,CHSIBP(I)        ;GET CHARACTER OF INPUT
1097         TRNE A,200
1098          JRST [ AOS CHSIBC(I)   ;WOOPS, SPECIAL CHARACTER, NEEDS USER ATTENTION
1099                 MOVSI A,8_14    ;SO PUT IT BACK AND DISCONNECT
1100                 ADDM A,CHSIBP(I)
1101                 JRST STYCH9 ]
1102         EXCH R,I                ;I GETS TTY, R GETS CHAOS
1103         PUSH P,R
1104         PUSH P,I
1105         CONO PI,TTYOFF
1106         PUSHJ P,NTYI5           ;GIVE CHARACTER TO TTY INPUT INTERRUPT LEVEL
1107         CONO PI,TTYON
1108         POP P,R
1109         POP P,I                 ;I GETS CHAOS, R GETS TTY ((POP IN REVERSE ORDER))
1110         JRST STYCH1             ;TRY FOR MORE INPUT
1111
1112 STYCH9: PUSH P,I
1113         MOVE I,R                ;I GETS TTY
1114         PUSHJ P,NSTYN0          ;DISCONNECT THE STY
1115          JRST 4,.
1116         POP P,I                 ;I GETS CHAOS
1117         PUSHJ P,CHINTI          ;WAKE UP THE TELNET SERVER
1118         JRST STYNT8             ;GO HANDLE OTHER STYS
1119 \f
1120 SUBTTL CHAOS NET CLOCK LEVEL STUFF
1121
1122 OVHMTR CHC
1123
1124 ;HERE FROM 1/2 SECOND CLOCK.  DO RETRANSMISSIONS AND DELAYED STS'S
1125 CHACLK:
1126 IFN DLCP,[
1127         CONO PI,NETOFF
1128         PUSHJ P,DLCIBG          ;GET MEMORY FOR INPUT BUFFERS IF NEEDED
1129         CONO PI,NETON
1130 ];DLCP
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
1134           SOJGE I,CHACL0
1135         JUMPL I,CPOPJ           ;JUMP IF ALL INDICES DONE
1136         PUSHJ P,CHARTR          ;RETRANSMIT IF NEEDED
1137         MOVSI B,%CFSTS
1138         TDNE B,CHSSTA(I)        ;SEND STS IF NEEDED
1139          PUSHJ P,CHASTO
1140         SOJGE I,CHACL0
1141         POPJ P,
1142
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
1149         MOVE T,TIME
1150         SUB T,CHSITM(I)         ;TIME SINCE LAST COMMUNICATION FROM OTHER END
1151         CAILE T,90.*30.
1152          JRST [ MOVEI W,%CSINC  ;TOO LONG, CONNECTION BROKEN
1153                 PUSHJ P,CHINT
1154                 JRST CHA5C1 ]
1155         HRRZ B,CHSSTA(I)        ;ONLY PROBE IF OPEN (COULD BE RFC-SENT)
1156         CAIE B,%CSOPN
1157          JRST CHA5C1
1158         HRRZ B,CHSWIN(I)        ;SEE IF NO TRANSMIT WINDOW (LOST STS DURING OPEN)
1159         JUMPE B,CHA5C2
1160         HRRZ B,CHSACK(I)        ;SEE IF AWAITING ACK (WINDOW NOT EMPTY)
1161         HRRZ C,CHSPKN(I)
1162         CAMN B,C
1163          CAIL T,60.*30.
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
1167         MOVEM T,(A)
1168         AOS CHNSNS
1169         PUSHJ P,CHODT2
1170         JRST CHA5C1
1171
1172 CHA5C4: MOVEI B,[ASCIZ/Timeout/]
1173         MOVEI Q,CHQRFC          ;TIME-OUT FIRST RFC ON LIST
1174         PUSHJ P,CHAQGF
1175         JUMPE A,CHA5C5
1176         MOVE T,-1(A)
1177         ADDI T,60.*30.          ;TIME-OUT IS ONE MINUTE
1178         PUSHJ P,[ CAMG T,TIME
1179                    JRST CHIRF2
1180                   JRST CHAQPF ]
1181 CHA5C5:
1182 IFN CH10P,[
1183         MOVEI T,CHXREN+CHXTEN   ;WAKE UP IN CASE OF TIMING ERROR
1184         IORM T,CHXCNO           ;IN DEALING WITH CHXCNO
1185         CONO CHX,@CHXCNO
1186         MOVSI T,-NSUBNT         ;DECAY ROUTING COSTS
1187         CONO PI,NETOFF          ;PREVENT RUT PACKET FROM COMING IN
1188 CHA5C6: HLRZ TT,SBNRUT(T)
1189         ADDI TT,1
1190         CAIG TT,1000
1191          HRLM TT,SBNRUT(T)
1192         AOBJN T,CHA5C6
1193         CONO PI,NETON
1194 ];CH10P
1195 IFN CH11P,[
1196         MOVEI T,%CAREN+%CATEN   ;WAKE UP IN CASE OF TIMING ERROR
1197         IORB T,CHXCSR           ;IN DEALING WITH CHXCSR
1198         IOWRI T,CAICSR
1199         MOVSI T,-NSUBNT         ;DECAY ROUTING COSTS
1200         CONO PI,NETOFF          ;PREVENT RUT PACKET FROM COMING IN
1201 CHA5C6: HLRZ TT,SBNRUT(T)
1202         ADDI TT,1
1203         CAIG TT,1000
1204          HRLM TT,SBNRUT(T)
1205         AOBJN T,CHA5C6
1206         CONO PI,NETON
1207 ];CH11P
1208         MOVEI T,5*60.
1209         MOVEI C,CHA5CK
1210         JRST CLQREE
1211
1212 OVHMTR CHR
1213
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)
1223         CAME T,TIME
1224          CAIE TT,-1
1225           JRST CHART2           ;ANYTHING AFTER THIS IS LIKELY TO LOSE ALSO
1226         AOS CHNRTR
1227         PUSHJ P,CHAXMT          ;RETRANSMIT THIS
1228 ;       HRRZ A,-2(A)            ;THREAD TO NEXT
1229 ;       JUMPN A,CHART1
1230 CHART2: CONO PI,PICON(W)
1231         POPJ P,
1232 \f
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
1237         IORM D,CHSSTA(I)
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)]
1246         AOS CHNSTS
1247         JRST CHODT2             ;FIRE IT OFF
1248
1249 DPBRCP: HLRZ B,CHSPKN(I)
1250         SKIPE T,CHSIBF(I)
1251          LDB B,[$CPKPN(T)]
1252         DPB B,[242000,,%CPKDT(A)]
1253         POPJ P,
1254 \f
1255 SUBTTL CHAOS NET INTERRUPT-LEVEL INPUT PROCESSING
1256
1257 OVHMTR CHI
1258
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
1263         MOVEI D,%CPKDT(B)
1264         HRL B,A
1265         BLT B,-1(D)
1266         CAIN D,RECHDR+<NRECHD*%CPKDT>
1267          MOVEI D,RECHDR
1268         MOVEM D,RECHDP
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/]
1280         CAILE C,%CPMXC
1281          JRST CHALOS
1282         SKIPGE (A)              ;TEST OPCODE
1283          JRST CHIDAT            ;DATA PACKET
1284         MOVEI B,[ASCIZ/Illegal opcode/]
1285         CAIGE D,%COMAX
1286          JRST @.+1(D)
1287         OFFSET -.
1288         JRST CHALOS             ;ILLEGAL, FLUSH
1289 %CORFC::JRST CHIRFC
1290 %COOPN::JRST CHIOPN
1291 %COCLS::JRST CHICLS
1292 %COFWD::JRST CHIANS
1293 %COANS::JRST CHIANS
1294 %COSNS::JRST CHISNS
1295 %COSTS::JRST CHISTS
1296 %CORUT::
1297 IFE CH10P+CH11P,JRST CHABRT     ;IGNORE
1298 IFN CH10P+CH11P,JRST CHIRUT
1299 %COLOS::JRST CHILOS
1300 %COLSN::JRST CHALOS             ;ILLEGAL, FLUSH
1301 %COMNT::JRST CHABRT             ;IGNORE
1302 %COEOF::JRST CHIDAT
1303 %COUNC::JRST CHIUNC
1304 %COBRD::JRST CHIBRD
1305 %COMAX::OFFSET 0
1306
1307 ;FORWARDING
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
1312         ADDI B,1
1313         CAIL B,20
1314          JRST [ AOS CHNPFL ? JRST CHABRT ]      ;LOOP, DISCARD
1315         DPB B,[$CPKFC(A)]
1316         SETOM -2(A)             ;NOT ON SEND LIST
1317         AOS CHNPF
1318         JRST CHAXMT
1319
1320 IFN CH10P+CH11P,[               ;INCOMING ROUTING INFO
1321 CHIRUT: LSH C,-2                ;NUMBER OF SUBNET ENTRIES
1322         JUMPE C,CHABRT          ;COULD BE ZERO-LENGTH
1323         MOVEI D,%CPKDT(A)
1324         HRLI D,442000
1325         LDB E,[$CPKSA(A)]       ;SOURCE HOST IS GATEWAY
1326 CHIRU1: ILDB T,D                ;SUBNET
1327         ILDB TT,D               ;COST
1328         HLRZ B,SBNRUT(T)        ;COST OF EXISTING ROUTE
1329         CAIGE T,NSUBNT
1330          CAMLE TT,B
1331           JRST CHIRU2
1332         HRLM TT,SBNRUT(T)       ;THIS IS BEST ROUTE NOW
1333         HRRM E,SBNRUT(T)
1334 CHIRU2: SOJG C,CHIRU1
1335         JRST CHABRT
1336 ];CH10P+CH11P
1337
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
1343         PUSHJ P,CHFNDX
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
1348         CAIE E,%CSOPN
1349          POPJ P,                ;NOT OPEN, IGNORE
1350         JRST CHASTO             ;REPLY WITH STS
1351
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
1355         CAIE E,%CSRFS
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
1359
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
1365         PUSH P,A
1366         MOVEI Q,CHSPBF(I)       ;DISCARD OUT-OF-ORDER PACKETS
1367         PUSHJ P,CHALFR
1368         HRRZS CHSNBF(I)
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
1371         JUMPE A,CHIC2B
1372         PUSHJ P,CHABR1
1373         JRST CHIC2A
1374
1375 CHIC2B: POP P,A
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]
1380          CAIE C,6
1381           JRST CHIRF7
1382         MOVS TT,%CPKDT+1(A)
1383         XORI TT,(<.BYTE 8 ? "U ? "S>)
1384         TRNN TT,(<.BYTE 8 ? -1 ? -1>)
1385          JRST CHIRF3
1386 CHIRF7: MOVEI Q,CHQLSN          ;SEARCH LISTENING QUEUE
1387         PUSHJ P,CHAQSR
1388          JRST CHIRF1            ;NOT FOUND, LOAD SERVER
1389         EXCH A,B                ;A LSN, B RFC
1390         LDB I,[$CPKSX(A)]       ;GET CORRESPONDING INDEX
1391         HRRZ E,CHSSTA(I)
1392         CAIE E,%CSLSN
1393          JRST 4,.
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
1397         HRLM B,CHSPKN(I)
1398         MOVE B,%CPKS(A)
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
1402         MOVEM T,CHSITM(I)
1403         JRST CHICL2
1404         
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.
1409         JUMPE T,CHIRD1
1410 CHIRD0: CAMN C,%CPKS(T)
1411          JRST CHABRT            ;THIS RFC IS A DUPLICATE, IGNORE IT
1412         HRRZ T,-2(T)
1413         JUMPN T,CHIRD0
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
1416          CAME C,CHSFRN(T)
1417           AOBJN T,CHIRD2
1418         JUMPGE T,CHIRD3         ;NO DUPLICATE OF THIS RFC, QUEUE IT
1419         HRRZ TT,CHSSTA(T)
1420         CAIE TT,%CSOPN
1421          CAIN TT,%CSRFC
1422           JRST CHABRT           ;REALLY A DUPLICATE, DISCARD
1423         AOBJN T,CHIRD2
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
1431         CONO PI,NETOFF
1432         PUSHJ P,NUJBST
1433          JRST [ CONO PI,PICON(Q)
1434                 JRST CHABRT ]   ;RING BUFFER FULL, IGNORE, RETRY WILL CATCH
1435         CONO PI,PICON(Q)
1436         MOVE T,TIME             ;REMEMBER WHEN THIS RFC WAS QUEUED
1437         MOVEM T,-1(A)
1438         MOVEI Q,CHQRFC
1439         JRST CHAQPF             ;PUT ON FRONT OF QUEUE
1440
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
1449         DPB T,[$CPKOP(A)]
1450         MOVE T,%CPKS(A)         ;EXCHANGE SOURCE AND DESTINATION
1451         EXCH T,%CPKD(A)
1452         MOVEM T,%CPKS(A)
1453         MOVE D,[440800,,%CPKDT(A)]
1454 CHIRF4: ILDB T,B
1455         JUMPE T,CHIRF5
1456         IDPB T,D
1457         AOJA C,CHIRF4
1458
1459 CHIRF5: DPB C,[$CPKNB(A)]
1460         SETOM -2(A)             ;NOT ON ANY SEND LIST
1461         JRST CHAXMT             ;SEND IT
1462 \f
1463 ;HERE FOR RFC TO "STATUS" 
1464 EXPUNGE FOO,BAR
1465 DEFINE FOO NAME
1466 BAR==0
1467 .BYTE 8
1468 IRPC CH,,NAME
1469 "CH
1470 BAR==BAR+1
1471 TERMIN
1472 IFG BAR-4, .ERR NAME MORE THAN 4 CHARACTERS
1473 REPEAT 4-BAR, 0
1474 .BYTE
1475 TERMIN
1476
1477 CHIRF3: MOVE B,[MNAME FOO ,,]   ;NAME OF MACHINE IN 8-BIT ASCII
1478 EXPUNGE FOO,BAR
1479         MOVEM B,%CPKDT(A)
1480         SETZM %CPKDT+1(A)
1481         MOVSI B,%CPKDT+1(A)
1482         HRRI B,%CPKDT+2(A)
1483         BLT B,%CPKDT+7(A)
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)
1487         HRLI B,441000
1488         MOVE T,CHNPI
1489         PUSHJ P,CHRF3A
1490         MOVE T,CHNPO
1491         PUSHJ P,CHRF3A
1492 IFN CH10P+CH11P,[
1493         MOVE T,CHNABT
1494         PUSHJ P,CHRF3A
1495         MOVE T,CHNLOS
1496         PUSHJ P,CHRF3A
1497         MOVE T,CHNCRC
1498         PUSHJ P,CHRF3A
1499         MOVE T,CHNCR2
1500         PUSHJ P,CHRF3A
1501         MOVE T,CHNPLE
1502         ADD T,CHNWLE
1503         PUSHJ P,CHRF3A
1504 ];CH10P+CH11P
1505         MOVEI T,%COANS
1506         SETZM (A) .SEE $CPKFC
1507         DPB T,[$CPKOP(A)]
1508         MOVE T,%CPKS(A)         ;EXCHANGE SOURCE AND DESTINATION
1509         EXCH T,%CPKD(A)
1510         MOVEM T,%CPKS(A)
1511         MOVEI C,13*4+IFN CH10P+CH11P,[20.]      ;BYTE COUNT
1512         JRST CHIRF5             ;SEND
1513
1514 CHRF3A: MOVEI TT,4
1515         IDPB T,B
1516         LSH T,-8
1517         SOJG TT,.-2
1518         POPJ P,
1519 \f
1520 ;HERE TO CONVERT A BRD INTO AN RFC
1521
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
1540         BLT D,(TT)
1541         SETZI TT,
1542         DPB TT,[$CPKAN(A)]      ;ZERO THE ACK FIELD
1543         MOVE TT,MYCHAD
1544         DPB TT,[$CPKDA(A)]      ;PRETEND IT WAS FOR ME
1545         JRST CHIRFC             ;AND HANDLE IT AS AN RFC
1546
1547 \f
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
1553         CAIGE I,NINDX
1554          SKIPGE CHSUSR(I)
1555           POPJ P,               ;NO MATCH
1556         SKIPGE CHSSTA(I) .SEE %CFOFF
1557          POPJ P,                ;NOT TALKING TO NETWORK
1558         HRRZ E,CHSSTA(I)
1559         MOVE TT,%CPKD(A)
1560         MOVE T,%CPKS(A)
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
1565           POPJ P,               ;NO MATCH
1566         MOVE T,TIME
1567         MOVEM T,CHSITM(I)
1568         JRST POPJ1              ;SUCCEED, CALLER CHECKS THE STATE
1569
1570 ;INTERRUPT LEVEL PROCESSING OF RECEIVED OPN PACKET
1571 CHIOPN: PUSHJ P,CHFNDX          ;FIND CONNECTION TO BE OPENED
1572          JRST CHALOS
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
1577         MOVE B,%CPKS(A)
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
1581         MOVEI W,%CSOPN
1582         ;DROP INTO CHINT
1583
1584 ;COME HERE WITH INDEX IN I AND NEW STATE IN W, TO CHANGE STATE AND INTERRUPT
1585 CHINT:  HRRM W,CHSSTA(I)
1586         MOVE T,TIME
1587         MOVEM T,CHSITM(I)       ;IN CASE GOT HERE FROM CHOLSN
1588         MOVSI T,%CFOFF
1589         CAIE W,%CSOPN
1590          IORM T,CHSSTA(I)       ;DISENGAGE PI LEVEL
1591         CAIN W,%CSOPN
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?
1596         TLNN TT,%CFSTY
1597          JRST CHINT4            ;USER
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
1601          JRST PIONJ
1602         MOVE TT,STYNTA          ;ADD TO LIST
1603         MOVEM TT,STYNTL-NFSTTY(T)
1604         MOVEM T,STYNTA
1605         JRST PIONJ
1606
1607 CHINT4: SKIPGE TT,CHSUSR(I)
1608          JRST 4,.
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
1611         CAIN T,77
1612          POPJ P,                ;IOPUSH'D, NO INTERRUPT
1613         MOVE T,CHNBIT(T)
1614         AND T,MSKST2(TT)
1615         IORM T,IFPIR(TT)
1616         POPJ P,
1617 \f
1618 OVHMTR CHD
1619
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
1631         SUB T,C
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
1636         LDB TT,[$CPKOP(T)]
1637         CAIE TT,%COUNC
1638          JRST [ LDB B,[$CPKPN(T)]
1639                 JRST CHIDT6 ]
1640         HLRZ T,CHSIBF(I)        ;IF IT'S AN UNC, HAVE TO GO FIND CORRECT PACKET
1641 CHIDT5: LDB TT,[$CPKOP(T)]
1642         CAIE TT,%COUNC
1643          LDB B,[$CPKPN(T)]
1644         HRRZ T,-2(T)
1645         JUMPN T,CHIDT5
1646 CHIDT6: ADDI B,1
1647         ANDI B,177777           ;NEXT IN-ORDER PACKET EXPECTED
1648         CAMN B,C
1649          JRST CHIDT1            ;EQUAL, IT GOES ON THE END OF CHSIBF(I) LIST.
1650         SUB B,C                 ;NOT EQUAL, COMPARE THEM MODULO 2^16.
1651         TRNN B,100000
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
1661         TRNE E,100000
1662          JRST [ MOVE B,D        ;E IS LESS, KEEP LOOPING
1663                 HRRZ D,-2(B)
1664                 JUMPN D,CHIDT3
1665                 JRST .+1 ]      ;REACHED END PUT IT HERE
1666         SKIPE B
1667          HRRM A,-2(B)           ;THREAD ONTO PREVIOUS PACKET
1668         SKIPN D
1669 CHIDT4:  HRRM A,CHSPBF(I)       ;THREAD ONTO BACK OF LIST
1670         SKIPN B
1671          HRLM A,CHSPBF(I)       ;THREAD ONTO FRONT OF LIST
1672         HRRM D,-2(A)            ;THREAD IN BEFORE PACKET IN D
1673         MOVSI B,1
1674         ADDM B,CHSNBF(I)
1675         POPJ P,
1676
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
1681         AOS CHSNBF(I)
1682         MOVEI Q,CHSIBF(I)
1683         PUSHJ P,CHAQPL          ;PUT ON END OF RECEIVE LIST
1684         HLRZ A,CHSPBF(I)        ;GET FIRST OUT-OF-ORDER PACKET
1685         JUMPE A,CPOPJ           ;NONE
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.
1688          TDZA C,C
1689           ADDI C,1
1690         CAME B,C
1691          POPJ P,                ;NO
1692         MOVEI Q,CHSPBF(I)
1693         PUSHJ P,CHAQGF          ;YES, PULL PACKET OF OUT-OF-ORDER LIST
1694         MOVSI B,-1
1695         ADDM B,CHSNBF(I)
1696         JRST CHIDT1             ;AND GO PUT ONTO IN-ORDER LIST
1697
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
1701         AOS CHNPD
1702         JRST CHASTO
1703
1704 ;HERE FOR RECEIVING AN UNC PACKET
1705 CHIUNC: LDB I,[$CPKDI(A)]       ;Destination index zero?
1706         JUMPE I,CHIUN2  
1707         LDB I,[$CPKDX(A)]       ;GET REAL-INDEX PART OF DESTINATION INDEX
1708         CAIGE I,NINDX
1709          SKIPGE CHSUSR(I)
1710           JRST CHALOS           ;NO MATCH
1711         MOVE TT,%CPKD(A)        ;DESTINATION ADDRESS MATCHES?
1712         CAME TT,CHSLCL(I)
1713          JRST CHALOS
1714         HRRZ E,CHSSTA(I)        ;IN FOREIGN PROTOCOL MODE?
1715         CAIN E,%CSFRN
1716          JRST CHIUN1
1717         MOVE TT,%CPKS(A)        ;NORMAL PROTOCOL, SOURCE ADDRESS MUST MATCH
1718         CAMN TT,CHSFRN(I)
1719          CAIE E,%CSOPN          ;AND STATE MUST BE OPEN
1720           JRST CHALOS
1721 CHIUN1: MOVE TT,TIME
1722         MOVEM TT,CHSITM(I)
1723         SKIPE T,CHSIBF(I)       ;DISCARD PACKET IF OVER WINDOW SIZE
1724          JRST [ LDB TT,[$CPKOP(T)]      ; AND ALREADY HAVE AN UNC
1725                 HRRZ T,CHSNBF(I)
1726                 HLRZ Q,CHSWIN(I)
1727                 CAML T,Q
1728                  CAIE TT,%COUNC
1729                   JRST .+2
1730                 JRST CHABRT ]           
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
1734         JRST CHAQPL
1735
1736 CHIUN2:
1737 IFE INETP,JRST CHALOS           ;No comprendo internet
1738 IFN INETP,[
1739         LDB I,[$CPKAN(A)]       ;Protocol number
1740         CAIE I,8_8              ;DOD Internet #x0800
1741          JRST CHALOS
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
1745         ADDI A,3
1746         LSH A,-2
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
1751         HRRI T,1(B)
1752         ADDI B,(C)              ;Address of last destination word
1753         BLT T,(B)
1754         EXCH A,J                ;Free the Chaosnet packet
1755         CALL CHABRT
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
1760
1761 CHIUN3: MOVE A,J                ;Discard Chaosnet packet
1762         CALRET CHABRT
1763 ];INETP
1764 \f
1765 OVHMTR CHJ
1766
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
1772
1773 ;INTERRUPT LEVEL PROCESSING OF STS
1774 CHISTS: PUSHJ P,CHFNDX
1775          JRST CHALOS
1776         CAIE E,%CSOPN           ;CONNECTION MUST BE OPEN
1777          JRST CHALOS
1778 CHIST1: LDB B,[042000,,%CPKDT(A)]       ;GET NEW WINDOW SIZE
1779         CAILE B,MXWIND
1780          MOVEI B,MXWIND
1781         HRRM B,CHSWIN(I)
1782         LDB B,[242000,,%CPKDT(A)]       ;PROCESS RECEIPT
1783         PUSHJ P,CHIAK0
1784         PUSHJ P,CHABRT
1785         JRST CHARTR             ;RETRANSMIT
1786
1787 OVHMTR CHA
1788
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
1796         SUB D,T
1797         TRNE D,100000
1798          HRRM T,CHSACK(I)       ;ACKNOWLEDGED PACKET NUMBER IS NEW START OF WINDOW
1799         PUSH P,A
1800         HLRZ A,CHSOBF(I)        ;MAP DOWN SEND LIST
1801         JUMPE A,CHIAK2          ;LIST EMPTY
1802 CHIAK1: LDB D,[$CPKPN(A)]
1803         SUBM B,D
1804         TRNE D,100000
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
1809 IFN DLCP,[
1810         MOVEI Q,DLCXMQ          ;ON TRANSMIT LIST, TRY TO TAKE OFF
1811         PUSHJ P,CHIAKF
1812 ];DLCP
1813 IFN T11CHP,[
1814         MOVEI Q,T11XMQ
1815         PUSHJ P,CHIAKF
1816 ];T11CHP
1817 IFN CH10P+CH11P,[
1818         MOVEI Q,CHXXMQ
1819         PUSHJ P,CHIAKF
1820 ];CH10P+CH11P
1821         CAIA                    ;AND DON'T FREE IT
1822 CHIAK3:  PUSHJ P,CHABRT
1823         HRLM C,CHSOBF(I)
1824         SKIPE A,C
1825          JRST CHIAK1
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
1830         SUB T,C
1831         SKIPLE T
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
1839         JRST POPAJ
1840
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.
1844 CHIKF1: SKIPA D,T
1845 CHIAKF:  MOVEI D,2(Q)           ;LH[-2(D)] POINTS TO (T)
1846         HLRZ T,-2(D)
1847         JUMPE T,CPOPJ           ;NOT FOUND
1848         CAIE T,(A)
1849          JRST CHIKF1
1850         HLRZ T,-2(A)            ;LINK OUT
1851         HRLM T,-2(D)
1852         JUMPN T,CHABRT          ;JUMP IF DIDN'T DELETE LAST PACKET IN LIST
1853         HRRM D,(Q)              ;NEW LAST PACKET IN LIST
1854         CAIN D,2(Q)
1855          SETZM (Q)              ;FOO, TRANSMIT LIST NOW EMPTY
1856         JRST CHABRT
1857 \f
1858 SUBTTL CHAOS NET DL10 INTERRUPT ROUTINE
1859
1860 OVHMTR CHH
1861
1862 IFN DLCP,[
1863
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
1866         ANDI E,177
1867         PUSH P,E
1868         CONO PI,NETOFF
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
1871         CAME R,DLCRS1(J)
1872          SOJGE J,.-1
1873         JUMPL J,DLCWK2
1874         MOVE A,DLCRA1(J)        ;GOT INPUT, PROCESS IT
1875         SETZM DLCRS1(J)         ;BUFFER SLOT NOT OCCUPIED NOW
1876 IFN KS10P, CLRCSH
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
1882
1883 DLCWK2: MOVEI J,1               ;SCAN CHANNELS FOR OUTPUT DONE
1884         CAME R,DLCSS1(J)
1885 DLCWK3:  SOJGE J,.-1
1886         JUMPL J,DLCWK4
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
1892         SETZM DLCSS1(J)
1893         JRST DLCWK3
1894
1895 DLCWK4: MOVE J,DLCSBF           ;TRY TO SEND SOME OUTPUT
1896         SKIPE DLCSS1(J)
1897          JRST DLCWK9            ;BUFFER BUSY
1898         HLRZ A,DLCXMQ           ;GET ANOTHER OFF TRANSMIT QUEUE
1899         JUMPE A,DLCWK9          ;QUEUE EMPTY
1900         HLRZ T,-2(A)
1901 IFN FTRCHK,[
1902         CAIN T,-1
1903          BUG PAUSE,[CHAOS LIST THREAD TRASHED],OCT,A,OCT,-2(A)
1904 ];FTRCHK
1905         HRLM T,DLCXMQ
1906 IFN FTRCHK,[
1907         JUMPN T,.+4
1908           CAME A,DLCXMQ         ;REACHED END OF LIST, END IN RIGHT PLACE?
1909            BUG PAUSE,[DCLXMQ THREAD TRASHED]
1910           SETZM DLCXMQ
1911 ];FTRCHK
1912 IFE FTRCHK,[
1913         SKIPN T
1914          SETZM DLCXMQ
1915 ];FTRCHK
1916         PUSHJ P,DLCXMT          ;SEND IT ON THIS BUFFER
1917         JRST DLCWK4             ;GO TRY TO SEND ON OTHER BUFFER
1918
1919 DLCWK9: POP P,E
1920         CONO PI,PICON(E)        ;RESTORE PI
1921         POPJ P,
1922 \f
1923 ;THIS ROUTINE SUPPLIES AN INPUT BUFFER TO THE 11 ON ALL BUFFERS THAT NEED IT
1924 ;CALL WITH INTERRUPTS OFF OR IN PROGRESS
1925 DLCIBG: MOVEI J,1
1926         SKIPE DLCRS1(J)
1927 DLCIB1:  SOJGE J,.-1
1928         JUMPL J,CPOPJ
1929         PUSHJ P,CHABGI          ;GET A BUFFER
1930          JRST [ SETZM DLCRA1(J) ;NO MEMORY, WILL TRY AGAIN AT CLOCK LEVEL
1931                 SETZM DLCRS1(J)
1932                 POPJ P, ]
1933         SETZM (A)               ;CLEAR THE BUFFER SINCE THE DL10 DOESN'T TOUCH LOW 4 BITS
1934         HRLZ T,A
1935         HRRI T,1(A)
1936         BLT T,%CPMXW-1(A)
1937         MOVEM A,DLCRA1(J)       ;MAKE AVAILABLE TO PDP11
1938         HRLI A,120000
1939         MOVEM A,DLCRP1(J)
1940         SOS DLCRP1(J)
1941 IFN KS10P, .ERR CLRCSH not needed here?
1942 IFN KL10P, PUSHJ P,DLCSWP       ;SWEEP CACHE BEFORE SIGNALLING 11
1943         MOVEI T,1
1944         MOVEM T,DLCRS1(J)
1945         CONO DLC,100040+TTYCHN  ;INTERRUPT 11
1946         JRST DLCIB1             ;TRY FOR OTHER BUFFER ALSO
1947
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
1951         MOVEM A,DLCSA1(J)
1952         HRLI A,120000
1953         MOVEM A,DLCSP1(J)       ;GIVE 11 POINTER TO NEW PACKET
1954         SOS DLCSP1(J)
1955 IFN KS10P, .ERR CLRCSH not needed here?
1956 IFN KL10P, PUSHJ P,DLCSWP       ;SWEEP CACHE, PUTTING PACKET INTO CORE
1957         MOVEI T,1
1958         MOVEM T,DLCSS1(J)       ;ACTIVATE PDP11
1959         CONO DLC,100040+TTYCHN
1960         XORI J,1                ;NEXT BUFFER
1961         MOVEM J,DLCSBF
1962         POPJ P,
1963
1964 IFN KL10P,[
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
1972         MOVSI D,(POPJ P,)
1973         JRST B
1974 ];KL10P
1975 ];DLCP
1976 \f
1977 SUBTTL CHAOS NET TEN-11 INTERFACE STUFF
1978
1979 IFN T11CHP,[
1980 ;THIS ROUTINE CHECKS FOR TEN-11 INITIALIZATION, SKIP-RETURNS IF OK TO USE
1981 ;CLOBBERS T,TT
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
1992                  MOVSI T,-1
1993                  MOVEM T,T11I11
1994                  JRST T11CK1 ]  ;AND INIT OURSELVES
1995         SKIPE T11I11            ;WAITING FOR 11 TO REINIT?
1996          POPJ P,                ;YES, WAIT
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)
2001         LSH TT,-2
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
2005         ADD TT,T11IBB
2006         MOVEM TT,T11IBE         ;INIT POINTERS
2007         MOVEM TT,T11OBB
2008         MOVEM TT,T11OBP
2009         ADD TT,T
2010         MOVEM TT,T11OBE
2011         HRREI T,-T11CHS-2000(TT)
2012         JUMPG T,T11LUZ          ;COMMUNICATION AREA LONGER THAN 1K
2013         MOVE T,T11IBB
2014         MOVEM T,T11IBP
2015 T11CK2: SETZM (T)               ;CLEAR BUFFER HEADERS
2016         ADD T,T11BSZ
2017         CAMGE T,TT
2018          JRST T11CK2
2019         MOVEM T,T11WIN          ;WE'RE WINNING (MAKE T11WIN POSITIVE NON-ZERO)
2020         SETZM T11I10            ;INIT DONE
2021         JRST POPJ1
2022
2023 ;HERE IF PDP11 PARAMETERS DON'T MATCH WHAT WE EXPECT
2024 T11LUZ: SETZM T11WIN            ;NOT WINNING
2025         POPJ P,
2026 \f
2027 ;HERE FROM CLOCK LEVEL TO CHECK ON TEN-11 CHAOS NET CHANNEL
2028 T11WAK: PUSHJ P,T11CHK          ;IS EVERYTHING OK?
2029          POPJ P,                ;NO.
2030 T11WK0: MOVE C,T11IBP           ;CHECK INPUT
2031         SKIPN (C)
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
2036         LSH D,-2
2037         CAILE D,%CPMXW          ;DON'T GET FAKED OUT BY CLOBBERED COUNT
2038          MOVEI D,%CPMXW
2039         PUSHJ P,CHABGI          ;GET PLACE TO PUT IT
2040          JRST T11WK1            ;NONE AVAILABLE
2041         HRLOI E,-1(D)
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
2047 T11WK4: ADD H,(E)
2048         LSH H,-1
2049         TRZE H,10
2050          TLO H,(SETZ)
2051         AOBJN E,T11WK4
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
2055         CAML C,T11IBE
2056          MOVE C,T11IBB
2057         MOVEM C,T11IBP
2058         CAME H,TT
2059          JRST [ AOS T11CKE      ;COUNT CHECKSUM ERRORS
2060                 PUSHJ P,CHABRT  ;AND DISCARD PACKET
2061                 JRST T11WK0 ]
2062         CONO PI,NETOFF
2063         PUSHJ P,CHAPII          ;PROCESS THE INPUT
2064         CONO PI,NETON
2065         JRST T11WK0
2066
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
2074         SKIPN B
2075          SETZM T11XMQ
2076         PUSHJ P,T11XMT          ;COPY PACKET INTO 11
2077         CONO PI,NETON
2078         JRST T11WK1             ;LOOK FOR MORE OUTPUT
2079
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
2084         ADDI C,4*%CPKDT+3
2085         LSH C,-2                ;CONVERT TO WORD COUNT
2086         MOVE Q,(Q)[ -1          ;MASK FOR BYTES TO RETAIN IN LAST WORD
2087                     <.BYTE 8 ? -1>
2088                     <.BYTE 8 ? -1 ? -1>
2089                     <.BYTE 8 ? -1 ? -1 ? -1> ]
2090         MOVEI TT,-1(C)
2091         ADD TT,A
2092         ANDM Q,(TT)             ;MASK OFF LAST WORD
2093         HRLOI C,-1(C)
2094         EQVI C,(A)              ;AOBJN PTR
2095         MOVEI TT,0              ;COMPUTE XOR CHECKSUM IN TT
2096         SKIPA B,T11OBP          ;-> CURRENT OUTPUT BUFFER IN 11
2097 T11XM1:  ADDI B,1
2098         MOVE T,(C)
2099         TRZ T,17                ;CLEAR BITS 10-11 TREATS SPECIALLY
2100         ADD TT,T                ;COMPUTE CHECKSUM
2101         LSH TT,-1
2102         TRZE TT,10
2103          TLO TT,(SETZ)
2104         MOVEM T,2(B)
2105         AOBJN C,T11XM1
2106         MOVE B,T11OBP
2107         MOVEM TT,1(B)           ;GIVE CHECKSUM TO 11
2108         MOVSI TT,-1
2109         MOVEM TT,0(B)           ;GIVE PACKET TO 11
2110         ADD B,T11BSZ            ;ADVANCE BUFFER POINTER
2111         CAML B,T11OBE
2112          MOVE B,T11OBB
2113         MOVEM B,T11OBP
2114         HRROS T,-2(A)           ;TAKE PACKET OFF TRANSMIT LIST
2115         AOJN T,.+2
2116          PUSHJ P,CHABRT         ;NOT ON SEND LIST, FREE IT
2117         POPJ P,
2118 ];T11CHP
2119 \f
2120 SUBTTL CH-10 INTERRUPT ROUTINES
2121
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.
2125
2126 IFN CH10P,[
2127
2128 EBLK
2129
2130 CHXACS: BLOCK 20
2131 CHXPDL: -60,,.
2132         BLOCK 60
2133
2134 CHXBRK: 0
2135 BBLK
2136         MOVEM 17,CHXACS+17
2137         MOVEI 17,CHXACS
2138         BLT 17,CHXACS+16
2139         MOVE P,CHXPDL
2140         CONSO CHX,CHXRCV        ;PACKET RECEIVED?
2141          JRST CHXBK5
2142         PUSHJ P,CHABGI          ;GET PLACE TO PUT PACKET
2143          JRST [ MOVEI T,CHXREN  ;NONE AVAILABLE, DISABLE INTR
2144                 ANDCAM T,CHXCNO
2145                 CONO CHX,@CHXCNO
2146                 JRST CHXBK5 ]
2147         CONSZ CHX,CHXCRC+CHXWLE ;CHECK FOR ERRORS
2148          JRST [ CONSZ CHX,CHXCRC
2149                  AOSA CHNCRC
2150                   AOS CHNWLE
2151                 JRST CHXBK4 ]   ;IGNORE PACKET
2152         DATAI CHX,T             ;FIRST DATAI YIELDS GARBAGE
2153         MOVEI T,CHXSWB          ;DISABLE BYTE SWAPPING
2154         ANDCAM T,CHXCNO
2155         CONO CHX,@CHXCNO
2156         HRLI A,-%CPKDT          ;READ HEADER
2157         DATAI CHX,(A)
2158         AOBJN A,.-1
2159         HRRZI A,-%CPKDT(A)
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
2163          JRST CHXBK4
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
2167         EQVI D,%CPKDT(A)
2168         JUMPGE D,.+3            ;EMPTY PACKET BOUNDARY CASE
2169          DATAI CHX,(D)
2170          AOBJN D,.-1
2171         DATAI CHX,T             ;NOW READ AND IGNORE HARDWARE HEADER
2172         TLNE T+1,400000
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
2178                 TLNE T,(CHXPLE)
2179                  AOSA CHNPLE
2180                   TRNN T,CHXCRC
2181                    JRST CHXBK4
2182                 AOS CHNCR2
2183                 JRST CHXBK4 ]
2184         CONO PI,NETOFF-1
2185         PUSHJ P,CHAPII          ;PROCESS THE INPUT
2186         CONO PI,NETON-1
2187         CAIA
2188 CHXBK4:  PUSHJ P,CHABRT         ;DIDN'T USE BUFFER AFTER ALL
2189         CONI CHX,T              ;COUNT LOST PACKETS
2190         LDB T,[$CHXLC,,T]
2191         ADDM T,CHNLOS
2192         MOVEI T,CHXREN          ;ENABLE RECEIVER FOR NEXT PACKET
2193         IORB T,CHXCNO
2194         CONO CHX,CHXRCV(T)
2195 CHXBK5: CONSO CHX,CHXXMT        ;TRANSMIT DONE?
2196          JRST CHXBK9
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
2204         MOVEI T,CHXTEN
2205         IORB T,CHXCNO
2206         CONO CHX,CHXXMT(T)      ;RETRANSMIT PACKET
2207         JRST CHXBK9
2208
2209 CHXBK7: SETZM CHOSTA            ;TRANSMITTER IDLE, LOOK FOR NEXT PACKET
2210         CONO PI,PIOFF
2211         HLRZ A,CHXXMQ           ;ANYTHING QUEUED FOR TRANSMISSION?
2212         JUMPE A,[ MOVEI T,CHXTEN        ;DISABLE INTERRUPTS
2213                   ANDCAM T,CHXCNO
2214                   CONO CHX,@CHXCNO
2215                   CONO PI,PION
2216                   JRST CHXBK9 ]
2217         HLRZ B,-2(A)            ;CDR TRANSMIT QUEUE
2218         HRLM B,CHXXMQ
2219         SKIPN B
2220          SETZM CHXXMQ           ;QUEUE EMPTY NOW
2221         CONO PI,PION
2222         AOS CHOSTA              ;NOW SEND THIS PACKET
2223         MOVEI T,CHXHLF+CHXSWB   ;CLEAR HALFWORD, BYTE-SWAP MODES
2224         ANDCAM T,CHXCNO
2225         CONO CHX,@CHXCNO
2226         HRLI A,-%CPKDT          ;TRANSMIT HEADER
2227         DATAO CHX,(A)
2228         AOBJN A,.-1
2229         HRRZI A,-%CPKDT(A)
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
2235         EQVI D,%CPKDT(A)
2236         JUMPGE D,.+3            ;EMPTY PACKET BOUNDARY CASE
2237          DATAO CHX,(D)
2238          AOBJN D,.-1
2239         MOVEI T,CHXHLF+CHXTEN   ;SWITCH TO HALFWORD MODE, ENABLE DONE INTR
2240         IORM T,CHXCNO
2241         CONO CHX,@CHXCNO
2242         TLNE T+1,400000         ;SEND EXTRA HALFWORD IF NEEDED
2243          DATAO CHX,(D)
2244         MOVEI T,CHXSWB          ;DISABLE SWAP BYTES MODE
2245         ANDCAM T,CHXCNO
2246         CONO CHX,@CHXCNO
2247         LDB T,[$CPKDN(A)]       ;GET DESTINATION SUBNET
2248         HRRZ D,SBNRUT(T)        ;GATEWAY TO THAT SUBNET
2249         CAIGE T,NSUBNT
2250          CAIN T,MYCHAD_-8       ;IF ON LOCAL CABLE
2251           LDB D,[$CPKDA(A)]     ;GO DIRECT
2252         LSH D,16.+4
2253         DATAO CHX,D             ;STORE HARDWARE DESTINATION ADDRESS
2254         MOVE T,CHXCNO           ;TRANSMIT PACKET
2255         CONO CHX,CHXXMT(T)
2256         CONI CHX,T
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
2263         BLT 17,17
2264         JRST 12,@CHXBRK
2265
2266 CHSWAB: LDB T,[$CPKOP(A)]       ;DOES THIS PACKET NEED BYTE SWAPPING?
2267         TRNE T,200
2268          JRST [ TRNE T,100
2269                  POPJ P,        ;BINARY DATA
2270                 JRST CHSWB1 ]   ;CHARACTER DATA
2271         IDIVI T,40
2272         MOVE T,CHSWBT(T)
2273         LSH T,(T+1)
2274         JUMPL T,CPOPJ           ;BINARY CONTROL PACKET
2275 CHSWB1: MOVEI T,CHXSWB          ;CHARACTER, SWAP DEM BYTES
2276         IORM T,CHXCNO
2277         CONO CHX,@CHXCNO
2278         POPJ P,
2279
2280 CHSWBT: 1_<35.-%COOPN>+1_<35.-%COSTS>+1_<35.-%CORUT>
2281         0 ? 0 ? 0
2282 ];CH10P
2283 \f
2284 SUBTTL CH-11 INTERRUPT ROUTINES
2285
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.)
2294
2295 IFN CH11P,[
2296
2297 ;;; Macros that will eventually be instructions
2298
2299 DEFINE PACK16 AC,E              ;AC,AC+1 right-aligned and zero-filled
2300         LSH AC,16.
2301         IOR AC,AC+1
2302         LSH AC,4
2303         MOVEM AC,E
2304 TERMIN
2305
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
2310         ADDI AC+1,(AC+1)
2311         ADDI AC+1,(AC+1)
2312         ADDI AC+1,(AC+1)        ;B1,B4 in position in AC+1
2313         IOR AC,AC+1
2314         MOVEM AC,E
2315 TERMIN
2316
2317 DEFINE UNPK16 AC,E              ;Doesn't bother masking off garbage bits
2318         MOVE AC,E
2319         MOVE AC+1,AC
2320         ROT AC,16.              ;First halfword right-aligned
2321         LSH AC+1,-4             ;Second halfword right-aligned
2322 TERMIN
2323
2324 DEFINE UNPK8 AC,E
2325         MOVE AC,E               ;B1B2B3B4...
2326         ROT AC,8                ;B2B3B4...B1
2327         MOVE AC+1,AC
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
2333 TERMIN
2334
2335 EBLK
2336
2337 CHXACS: BLOCK 20
2338 CHXSVH: 0
2339 CHXPDL: -60,,.
2340         BLOCK 60
2341
2342 CHXBKH: 0                       ;Hardware interrupt on TTYCHN comes here
2343 BBLK
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
2347         ANDCAB T,CHXCSR
2348         IOWRI T,CAICSR
2349         MOVE T,CHXSVH
2350         JRST 12,@CHXBKH
2351 EBLK
2352
2353 CHXBRK: 0                       ;Software interrupt on CHXCHN comes here
2354 BBLK
2355         CONO PI,020000+200_<-CHXCHN>    ;BAG-BITING DEC LOSERS
2356         MOVEM 17,CHXACS+17
2357         MOVEI 17,CHXACS
2358         BLT 17,CHXACS+16
2359         MOVE P,CHXPDL
2360         IORDI T,CAICSR          ;Check for received packet
2361         TRNN T,%CARDN
2362          JRST CHXBK3            ;No incoming packet yet
2363         TRNE T,%CAERR           ;Check for error in received packet
2364          JRST [ AOS CHNCRC
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
2368         TRNE R,17
2369          JRST [ AOS CHNWLE      ;Length not a multiple of 16
2370                 JRST CHXBK1 ]
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
2374                 JRST CHXBK1 ]
2375         HRLI A,-%CPKDT          ;Copy out the packet header
2376 CHSRC1: IORDI B,CAIRBF
2377         IORDI C,CAIRBF
2378         PACK16 B,(A)
2379         AOBJN A,CHSRC1
2380         PUSHJ P,CHSHDR          ;Decode the header
2381          JRST CHSRC4            ;No byte swapping
2382         JUMPGE D,CHSRC3
2383 CHSRC2: IORDI B,CAIRBF          ;Read out the data, byte-swapped
2384         IORDI C,CAIRBF
2385         PACK8 B,(D)
2386         AOBJN D,CHSRC2
2387 CHSRC3: JUMPGE H,CHSRC7         ;Jump if even packet length
2388         IORDI B,CAIRBF          ;Residual halfword
2389         SETZ C,                 ;Somebody depends on zero here
2390         PACK8 B,(D)
2391         AOJA D,CHSRC7
2392
2393 CHSRC4: JUMPGE D,CHSRC6
2394 CHSRC5: IORDI B,CAIRBF          ;Read out the data, halfwords
2395         IORDI C,CAIRBF
2396         PACK16 B,(D)
2397         AOBJN D,CHSRC5
2398 CHSRC6: JUMPL H,[ IORDI B,CAIRBF        ;Residual halfword
2399                   SETZ C,               ;Somebody depends on zero here
2400                   PACK16 B,(D)
2401                   AOJA D,CHSRC7 ]
2402 CHSRC7: SUB D,R                 ;AOBJN pointer minus number of words in packet
2403         CAIE A,(D)
2404          JRST [ AOS CHNPLE      ;Packet length disagrees with hardware length
2405                 JRST CHXBK2 ]
2406         IORDI T,CAIRBF          ;Read the three hardware header words
2407         IORDI T,CAIRBF
2408         IORDI T,CAIRBF
2409         IORDI T,CAICSR
2410         TRNE T,%CAERR           ;Make sure packet came out of RAM okay
2411          JRST [ AOS CHNCR2      ;Garbage, try again
2412                 JRST CHXBK2 ]
2413         IORDI T,CAIRBC          ;Make sure counter didn't spazz
2414         CAIE T,7777
2415          JRST [ AOS CHNSPZ
2416                 JRST CHXBK2 ]
2417         CONO PI,NETOFF-1        ;Get to network interrupt level
2418         PUSHJ P,CHAPII          ;Process the input
2419         CONO PI,NETON-1
2420 CHXBK1: IORDI T,CAICSR          ;Count lost packets
2421         LDB TT,[$CALOS,,T]
2422         ADDM TT,CHNLOS
2423         MOVE TT,CHXCSR
2424         IORI TT,%CARCL          ;Enable receiver for next packet
2425         IOWRI TT,CAICSR
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?
2438                   JRST CHXBK6 ]
2439         HLRZ B,-2(A)            ;CDR transmit queue
2440         HRLM B,CHXXMQ
2441         SKIPN B
2442          SETZM CHXXMQ           ;Queue empty now
2443         CONO PI,PION
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
2452         IORI T,%CATDN
2453         IOWRI T,CAICSR
2454         HRLI A,-%CPKDT          ;Transmit header
2455 CHXXM1: UNPK16 B,(A)
2456         IOWRI B,CAIWBF
2457         IOWRI C,CAIWBF
2458         AOBJN A,CHXXM1
2459         PUSHJ P,CHSHDR          ;Decode the header
2460          JRST CHXXM4            ;No byte swapping
2461         JUMPGE D,CHXXM3
2462 CHXXM2: UNPK8 B,(D)             ;Transmit data with byte swapping
2463         IOWRI B,CAIWBF
2464         IOWRI C,CAIWBF
2465         AOBJN D,CHXXM2
2466 CHXXM3: JUMPGE H,CHXXM7         ;Jump if even packet length
2467         UNPK8 B,(D)             ;Transmit residual bytes
2468         IOWRI B,CAIWBF
2469         JRST CHXXM7
2470
2471 CHXXM4: JUMPGE D,CHXXM6
2472 CHXXM5: UNPK16 B,(D)            ;Transmit data with byte swapping
2473         IOWRI B,CAIWBF
2474         IOWRI C,CAIWBF
2475         AOBJN D,CHXXM5
2476 CHXXM6: JUMPGE H,CHXXM7         ;Jump if even packet length
2477         UNPK16 B,(D)            ;Transmit residual bytes
2478         IOWRI B,CAIWBF
2479 CHXXM7: LDB T,[$CPKDN(A)]       ;Get destination subnet
2480         HRRZ D,SBNRUT(T)        ;Gateway to that subnet
2481         CAIGE T,NSUBNT
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
2488         IORB A,CHXCSR
2489         IOWRI A,CAICSR
2490         MOVSI 17,CHXACS         ;Dismiss software interrupt
2491         BLT 17,17
2492         JRST 12,@CHXBRK
2493
2494 CHXBK2: PUSHJ P,CHABRT          ;Packet no good, discard it
2495         JRST CHXBK1
2496
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).
2500 ; T,U get clobbered
2501 ; Returns:
2502 ;       +1  16-bit data
2503 ;       +2  8-bit data
2504 CHSHDR: HRRZI A,-%CPKDT(A)      ;Restore packet address
2505         LDB W,[$CPKNB(A)]       ;Get size of packet in bytes
2506         CAILE W,%CPMXC
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
2511         EQVI D,%CPKDT(A)
2512         LDB T,[$CPKOP(A)]       ;Does this packet need byte swapping?
2513         TRNE T,200
2514          JRST [ TRNN T,100
2515                  AOS (P)        ;Character data
2516                 POPJ P, ]       ;Binary data
2517         IDIVI T,40
2518         MOVE T,CHSWBT(T)
2519         LSH T,(T+1)
2520         JUMPL T,CPOPJ           ;Binary control packet
2521         JRST POPJ1              ;Characters
2522
2523 CHSWBT: 1_<35.-%COOPN>+1_<35.-%COSTS>+1_<35.-%CORUT>
2524         0 ? 0 ? 0
2525 ];CH11P
2526 \f
2527 SUBTTL CHAOS NET BUFFER LIST STUFF
2528
2529 OVHMTR CHL
2530
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
2542
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)
2545
2546 ;THESE ROUTINES TURN OFF INTERRUPTS MOMENTARILY SO THAT
2547 ;LISTS MAY BE SAFELY MANIPULATED.
2548
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
2556 IFN FTRCHK,[
2557         JUMPN T,PIONJ
2558         HRRZ T,(Q)
2559         CAIE T,(A)
2560          BUG PAUSE,[CHAOS LIST TRASHED],OCT,Q
2561         SETZM (Q)               ;IS NOW EMPTY
2562 ];FTRCHK
2563 IFE FTRCHK,[
2564         SKIPN T
2565          SETZM (Q)              ;IS NOW EMPTY
2566 ];FTRCHK
2567         CONO PI,PION
2568         POPJ P,
2569
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
2572         ANDI A,-PKTBSZ
2573         ADDI A,2
2574         JRST CHABRT
2575
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
2579         ;DROPS THROUGH
2580 ;RETURN BUFFER POINTED BY A TO FREE STORAGE.  CLOBBERS T, Q.
2581 CHABRT: MOVEI Q,CHQFRE
2582 IFN FTRCHK,[
2583         SKIPN A
2584          BUG PAUSE,[FREEING 0]
2585 ];FTRCHK
2586         MOVE T,[ASCII/LUNCH/]   ;TANSTAAFL
2587         MOVEM T,-1(A)
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
2591
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
2594         CONO PI,PIOFF
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
2598                  JRST PIONJ ]
2599         HRLM A,(Q)              ;WAS EMPTY, ALSO IS NEW FIRST
2600         CONO PI,PION
2601         POPJ P,
2602
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
2608         SKIPN T
2609          HRRM A,(Q)             ;WAS EMPTY, ALSO MAKE NEW LAST
2610         CONO PI,PION
2611         POPJ P,
2612 \f
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
2616          JRST CHABG0
2617         POPJ P,                 ;WIN
2618         
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
2622         PUSHJ P,CHAQGF
2623         JUMPE A,CPOPJ
2624         SETZM -1(A)             ;NO LUNCH
2625         SOS CHFRBF
2626         JRST POPJ1
2627
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
2631          CAIA
2632           JRST POPJ1            ;WON, RETURN
2633         CONI PI,Q               ;SAVE PI CHANNELS ON STATUS
2634         ANDI Q,177
2635         CONO PI,UTCOFF          ;MAKE THE WORLD SAFE FOR IOMQ
2636         MOVE B,CHTTBF
2637         CAIL B,CHMXBF           ;MAKE SURE NOT TO USE UP ALL CORE
2638          JRST CHABG4
2639         PUSHJ P,IOMQ            ;GET 1K OF MEMORY
2640          JRST CHABG3            ;MEM NOT AVAILABLE, FAIL
2641         CONO PI,PICON(Q)        ;WON, RESTORE PI STATUS
2642         MOVEI B,MUCHA
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
2647         ADDI A,PKTBSZ-1
2648         AOBJN A,CHABG2
2649         MOVEI B,<2000/PKTBSZ>   ;THIS MANY MORE BUFFERS HAVE BEEN CREATED
2650         ADDM B,CHTTBF
2651         JRST CHABGI             ;NOW GO ALLOCATE ONE
2652
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
2656         CAMLE B,TIME
2657          JRST CHABG3
2658 IFE CH10P, BUG CHECK,[CHAOS NET ATTEMPTING TO USE TOO MUCH CORE]
2659 IFN CH10P,[
2660         CONI CHX,B
2661         BUG CHECK,[CHAOS NET ATTEMPTING TO USE TOO MUCH CORE, CONI=],OCT,B,[CONO=],OCT,CHXCNO,[CHOSTA=],OCT,CHOSTA
2662 ];CH10P
2663         MOVE B,TIME
2664         MOVEM B,CHMXTM
2665 CHABG3: CONO PI,PICON(Q)        ;LOST, RESTORE PI STATUS
2666         POPJ P,                 ;AND TAKE ERROR RETURN
2667
2668 ;FREE A WHOLE LIST OF BUFFERS, Q-> HEAD.  DESTROYS A,T
2669 CHALFR: PUSHJ P,CHAQGF
2670         JUMPE A,CPOPJ
2671         PUSH P,Q
2672         PUSHJ P,CHABR1          ;FREE UNLESS STILL ON TRANSMIT LIST
2673         POP P,Q
2674         JRST CHALFR
2675
2676 ;Q -> A TRANSMIT QUEUE, FLUSH ALL BUFFERS BELONGING TO INDEX I.
2677 ;CLOBBERS A,B,C,T
2678 CFLXMQ: PUSH P,Q
2679         CONO PI,NETOFF          ;DON'T LET TRANSMIT LIST CHANGE (AT ALL)
2680         HLRZ A,(Q)              ;HEAD OF TRANSMIT LIST
2681         JUMPE A,CFLXM3
2682         MOVEI B,2(Q)            ;B PREVIOUS PACKET, A CURRENT, C NEXT
2683 CFLXM1: HLRZ C,-2(A)            ;GET THREAD TO NEXT
2684 IFN FTRCHK,[
2685         CAIN C,-1
2686          JRST 4,.               ;CLAIMS NOT TO BE ON LIST?
2687 ];FTRCHK
2688         LDB T,[$CPKSX(A)]       ;GET THIS PACKET'S INDEX
2689         CAME T,I
2690          JRST CFLXM2
2691         HRLM C,-2(B)            ;THREAD PREVIOUS TO NEXT
2692         HRROS T,-2(A)           ;IF THIS BUFFER IS NOT ALSO ON SEND LIST,
2693         AOJN T,.+2
2694          PUSHJ P,CHABRT         ;RETURN IT
2695         SKIPA Q,(P)
2696 CFLXM2:  MOVE B,A
2697         SKIPE A,C
2698          JRST CFLXM1
2699         HRRM B,(Q)              ;LAST PACKET ON LIST MAY HAVE CHANGED
2700         CAIN B,2(Q)
2701          SETZM (Q)              ;TRANSMIT QUEUE IS NOW EMPTY
2702 CFLXM3: POP P,Q
2703         JRST NETONJ
2704 \f
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
2715         MOVEI D,%CPKDT(A)
2716         HRLI D,440800
2717         MOVEI E,%CPKDT(B)
2718         HRLI E,440800
2719 CHAQS2: ILDB T,D
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
2724          JRST CHAQS5
2725         SOJLE C,CHAQS3
2726         SOJG H,CHAQS2
2727         ILDB T,D
2728         CAIE T,40
2729          JRST CHAQS4
2730 CHAQS5: HRRZ C,-2(B)            ;WON, DELINK PACKET FROM LIST
2731         JUMPE J,[ HRLM C,(Q)
2732                   JUMPN C,POPJ1
2733          IFN FTRCHK,[
2734                   HRRZ C,(Q)    ;CHECK LIST ENDING IN RIGHT PLACE
2735                   CAIE C,(B)
2736                    JRST 4,.
2737                 ];FTRCHK
2738                   SETZM (Q)
2739                   JRST POPJ1 ]
2740         HRRM C,-2(J)
2741         JUMPN C,POPJ1
2742         HRRM J,(Q)              ;TOOK LAST PACKET, STORE NEW LAST
2743         JRST POPJ1
2744
2745 CHAQS3: SOJLE H,CHAQS5
2746         ILDB TT,E
2747         CAIN TT,40
2748          JRST CHAQS5
2749 CHAQS4: MOVE J,B                ;THIS ONE DOESN'T MATCH, TRY NEXT
2750         HRRZ B,-2(B)
2751         JUMPN B,CHAQS1
2752         POPJ P,                 ;NO MATCHES
2753
2754 ;THIS ROUTINE RUNS IN THE CORE JOB AND CLEANS UP MEMORY USED BY CHAOS BUFFERS
2755 ;SMASHES ALL ACS
2756 CHCLN:  SKIPE A,CHTTBF          ;SEE IF 2/3 OR MORE OF BUFFERS FREE
2757          SKIPN B,CHFRBF
2758           POPJ P,               ;NO BUFFERS OR NONE FREE, NOTHING TO DO
2759         SUBM A,B
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
2764 .ELSE   MOVEI D,255.
2765 CHCLN0: LDB A,[MUR,,MEMBLT(D)]
2766         CAIE A,MUCHA
2767 CHCLN4:  SOJGE D,CHCLN0
2768         JUMPL D,CPOPJ
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/]
2773 CHCLN5: CAME T,1(A)
2774          JRST CHCLN4            ;NOT FREE, DON'T BOTHER WITH SLOW STUFF
2775         ADDI A,PKTBSZ-1
2776         AOBJN A,CHCLN5
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
2780         JUMPE A,CHCLN2
2781         LDB B,[121000,,A]
2782         CAMN B,D
2783          JRST [ MOVEI Q,CHCLNQ  ;THIS ONE'S ON THE PAGE, SAVE IT
2784                 PUSHJ P,CHAQPL
2785                 AOJA C,.+2 ]    ;COUNT THEM
2786           PUSHJ P,CHABRT        ;NOT ON THE PAGE, PUT BACK
2787         SOJG E,CHCLN1
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
2791         ADDM C,CHTTBF
2792         MOVE A,D
2793         PUSHJ P,MEMR
2794         JRST CHCLN
2795
2796 OVHMTR CHZ