Consolidate license copies
[its.git] / system / chaos.286
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: CAIE E,%CSOPN
879          CAIN E,%CSFRN
880           JRST CHOUN1           ;Okay to transmit UNC now
881         JUMPN E,IOCR10 .SEE %CSCLS      ;Bad state
882         SKIPE CHSPBF(I)         ;I guess out of order packets would
883          JRST IOCR10            ; cause some confusion in the NCP.
884         MOVE E,[%CFOFF,,%CSFRN] ;Put into foreign-protocol state
885         MOVEM E,CHSSTA(I)
886         MOVE D,%CPKD(A)         ;Save destination
887         MOVEM D,CHSFRN(I)
888 CHOUN1: MOVE B,CHSLCL(I)        ;Set up source
889         MOVEM B,%CPKS(A)
890         MOVE D,CHSFRN(I)        ;Set up destination
891         MOVEM D,%CPKD(A)
892         PUSHJ P,LSWDEL
893         SETOM -2(A)
894         JRST CHAXMT
895
896 OVHMTR CHX
897
898 ;SENDING REGULAR PACKET
899 CHODAT: CAIE E,%CSOPN           ;CONNECTION MUST BE OPEN
900          JRST IOCR10
901         SKIPG CHSNOS(I)
902          PUSHJ P,UFLS           ;WINDOW FULL, WAIT
903         PUSHJ P,LSWDEL          ;BUFFER WILL BE USED
904 CHODT1: HRRZ B,CHSPKN(I)        ;ASSIGN PACKET NUMBER
905         CAIL B,177777
906          TDZA B,B
907           ADDI B,1
908         HRRM B,CHSPKN(I)
909         DPB B,[$CPKPN(A)]
910 CHODT2: HLRZ B,CHSPKN(I)        ;GET PACKET NUMBER TO ACKNOWLEDGE
911         HRLM B,CHSACK(I)        ;REMEMBER IT HAS BEEN
912         DPB B,[$CPKAN(A)]       ;PIGGY-BACK THIS ACKNOWLEDGE
913         MOVE B,[<.BM $CPKOP>+<.BM $CPKNB>]
914         ANDM B,(A)              ;CLEAR FORWARDING COUNT AND UNUSED FIELD
915         MOVE B,CHSLCL(I)        ;SET UP SOURCE
916         MOVEM B,%CPKS(A)
917         MOVE D,CHSFRN(I)        ;SET UP DESTINATION
918         MOVEM D,%CPKD(A)
919         SETOM -2(A)             ;NOTE NOT ON TRANSMIT LIST YET
920         SKIPL (A)               ;SKIP IF DATA PACKET
921          JRST CHAXMT
922         CONI PI,E               ;SUPER KLUDGERY REQUIRED HERE!  FOREIGN HOST MIGHT RECEIPT
923         CONO PI,NETOFF          ;THIS PACKET JUST AS WE START TO TRANSMIT IT.  THIS IS A
924                                 ;VIOLATION OF PROTOCOL, BUT SHOULDN'T CRASH I.T.S. BECAUSE THE
925                                 ;PACKET ABOUT TO BE GIVEN TO CHAXMT HAS BEEN FREED ALREADY.
926         MOVEI Q,CHSOBF(I)       ;PUT ON END OF SEND LIST
927         PUSHJ P,CHAQPL
928         SOSA CHSNOS(I)          ;USE UP WINDOW, SKIP
929 ;SKIPS THROUGH INTO CHAXMT
930 \f;SKIPS IN
931 SUBTTL CHAOS NET PACKET TRANSMIT ROUTINE
932
933 ;CALL WITH PACKET IN A, SMASHES B, C, D, E, T, TT, Q, J
934 ;USES E TO SAVE THE PI STATUS, NOTHING BETTER CLOBBER THIS, OR, BOY, WILL IT EVER LOSE!
935 ;YOU BETTER SETOM -2(A) BEFORE CALLING THIS, AND IF YOU'RE
936 ;PUTTING IT ON A SEND LIST, DO THAT FIRST ALSO.
937 ;THIS CODE ASSUMES THERE IS ONLY ONE INTERFACE, AND IT IS ON A
938 ;PDP11 WHICH WILL TAKE CARE OF THE ROUTING.
939 ;;THIS ROUTINE IS SKIPPED INTO FROM THE PREVIOUS PAGE!
940 CHAXMT:  CONI PI,E              ;SAVE PI STATUS BEFORE TURNING NETOFF; CALLED FROM MANY LEVELS
941 CHAXM0: ANDI E,177
942         AOS CHNPO
943         MOVE T,TIME
944         MOVEM T,-1(A)           ;SET TIME OF LAST TRANSMISSION
945         CONO PI,NETOFF          ;ONE PROCESS AT A TIME, TO PROTECT INTERFACE VARIABLES
946 IFN FTRCHK,[
947         HLRZ J,-2(A)            ;I TOLD YOU TO SETOM -2(A)
948         CAIE J,-1
949          BUG PAUSE,[CHAOS BUFFER THREAD TRASHED],OCT,A,OCT,-2(A)
950 ];FTRCHK
951 IFN DLCP,[
952 ;FOR NOW, JUST ALWAYS SHIP IT OUT THE DL10
953 IFN FTRCHK,[
954         HLRZ J,DLCXMQ           ;MAKE SURE NOT PUTTING ON LIST TWICE
955         JUMPE J,.+7
956         CAMN J,A
957          BUG PAUSE,[CHAOS BUFFER ALREADY ON DLCXMQ],OCT,A
958         HLRZ J,-2(J)
959         CAIN J,-1
960          BUG PAUSE,[DLCXMQ THREAD TRASHED]
961         JUMPN J,.-5
962         MOVEI J,1               ;MAKE SURE NOT ACTIVE TO 11
963         HRRZ T,DLCSA1(J)
964         CAMN T,A
965          BUG PAUSE,[CHAOS BUFFER ALREADY ACTIVE TO 11],OCT,A
966         SOJGE J,.-3
967 ];FTRCHK
968         HRRZS -2(A)             ;PUT END-LIST INDICATOR IN LH (FLAGS TRANSMIT ACTIVE)
969         MOVE J,DLCSBF           ;SEE IF SEND BUFFER IS FREE
970         SKIPE DLCSS1(J)
971          JRST CHXMD1
972         PUSHJ P,DLCXMT          ;YES, SEND THE PACKET NOW
973         JRST CHXMD2
974
975 CHXMD1: HRRZ B,DLCXMQ           ;NO BUFFERS FREE RIGHT NOW, QUEUE
976         JUMPE B,[ HRLZM A,DLCXMQ ? JRST .+2 ]
977          HRLM A,-2(B)
978         HRRM A,DLCXMQ
979 CHXMD2: CONO PI,PICON(E)        ;RESTORE PI
980         POPJ P,
981 ];DLCP
982 IFN T11CHP,[
983 ;FOR NOW, JUST ALWAYS SHIP IT OUT THE TEN11
984         PUSHJ P,T11CHK          ;SEE IF TEN-11 IS READY
985          JRST CHXME3            ;NO
986         SKIPE @T11OBP           ;SEE IF HAVE AVAILABLE OUTPUT BUFFER
987          JRST CHXME1            ;NO
988         PUSHJ P,T11XMT          ;SEND THE PACKET NOW
989         JRST CHXME2
990
991 CHXME3: HRROS T,-2(A)           ;TEN11 DOWN, DISCARD PACKET
992         AOJN T,CHXME2
993         PUSHJ P,CHABRT
994         JRST CHXME2
995
996 CHXME1: HRRZ B,T11XMQ           ;NO BUFFERS FREE RIGHT NOW, QUEUE
997         JUMPE B,[ HRLZM A,T11XMQ ? JRST .+2 ]
998          HRLM A,-2(B)
999         HRRM A,T11XMQ
1000         HRRZS -2(A)             ;PUT END-LIST INDICATOR IN LH
1001 CHXME2: CONO PI,PICON(E)        ;RESTORE PI
1002         POPJ P,
1003 ];T11CHP
1004 IFN CH10P,[
1005 ;FOR NOW, JUST ALWAYS SHIP IT OUT THE CH10
1006         HRRZ B,CHXXMQ           ;ADD TO END OF TRANSMIT QUEUE
1007         JUMPE B,[ HRLZM A,CHXXMQ ? JRST .+2 ]
1008          HRLM A,-2(B)
1009         HRRM A,CHXXMQ
1010         HRRZS -2(A)             ;PUT END-LIST INDICATOR IN LH
1011         MOVEI B,CHXTEN          ;ENABLE TRANSMIT-DONE INTERRUPT
1012         IORM B,CHXCNO
1013         CONO CHX,@CHXCNO
1014         CONO PI,PICON(E)        ;RESTORE PI
1015         POPJ P,
1016 ];CH10P
1017 IFN CH11P,[
1018 ;FOR NOW, JUST ALWAYS SHIP IT OUT THE CH11
1019         HRRZ B,CHXXMQ           ;ADD TO END OF TRANSMIT QUEUE
1020         JUMPE B,[ HRLZM A,CHXXMQ ? JRST .+2 ]
1021          HRLM A,-2(B)
1022         HRRM A,CHXXMQ
1023         HRRZS -2(A)             ;PUT END-LIST INDICATOR IN LH
1024         MOVEI B,%CATEN          ;ENABLE TRANSMIT-DONE INTERRUPT
1025         IORB B,CHXCSR
1026         IOWRI B,CAICSR
1027         CONO PI,PICON(E)        ;RESTORE PI
1028         POPJ P,
1029 ];CH11P
1030 \f
1031 SUBTTL CHAOS NET DIRECT CONNECT TO STY
1032
1033 OVHMTR CHS
1034
1035 ;CALLED AT CLOCK LEVEL FROM STYNTC WHEN A CHAOS STY IS ENCOUNTERED
1036 ;TTY NUMBER IN I & R
1037 STYCHA: MOVE I,STYNTI-NFSTTY(R) ;GET CHAOS INDEX
1038         MOVE TT,CHSSTA(I)
1039         TLNN TT,%CFSTY
1040          JRST 4,.               ;CHAOS CONNECTION CLAIMS NOT BE CONNECTED?
1041         JUMPL TT,STYCH9 .SEE %CFOFF     ;OK TO USE?  IF NOT, DISCONNECT
1042         SKIPGE TTYOAC(R)        ;ANY OUTPUT?
1043          JRST STYCH1            ;NO, CHECK FOR INPUT
1044         SKIPN D,CHSOBP(I)       ;IF BUFFER ALLOCATED, USE IT
1045          JRST [ SKIPG CHSNOS(I) ;OTHERWISE ALLOCATE ONE
1046                  JRST STYCH1    ;WINDOW FULL, WAIT UNTIL REACTIVATED
1047                 PUSHJ P,CHABGI
1048                  JRST STYCH3    ;NO CORE, WAIT ONE CLOCK TICK
1049                 MOVEI D,%CPKDT(A)
1050                 HRLI D,440800
1051                 MOVEM D,CHSOBP(I)
1052                 MOVEI E,%CPMXC
1053                 MOVEM E,CHSOBC(I)
1054                 JRST .+3 ]
1055           SKIPG E,CHSOBC(I)
1056            JRST STYCH4          ;BUFFER FULL, FORCE IT
1057         EXCH R,I                ;I GETS TTY, R GETS CHAOS
1058         CONO PI,TTYOFF
1059         MOVEM D,DBBBP           ;SET UP BUFFER FOR TTY OUTPUT INTERRUPT LEVEL
1060         MOVEM E,DBBCC
1061         MOVEM E,DBBCC1
1062         PUSH P,R
1063         SETOM TYPNTF
1064         PUSHJ P,TYP             ;GENERATE OUTPUT
1065         SETZM TYPNTF
1066         POP P,R
1067         EXCH R,I                ;I GETS CHAOS, R GETS TTY
1068         MOVE D,DBBBP            ;ADVANCE POINTERS
1069         MOVEM D,CHSOBP(I)
1070         MOVE E,DBBCC
1071         SUB E,DBBCC1            ;MINUS # CHARS OUTPUT GENERATED
1072         CONO PI,TTYON
1073         ADDM E,CHSOBC(I)
1074 STYCH4: PUSHJ P,CHAFC1          ;FORCE THE BUFFER
1075         JRST STYCHA             ;CHECK FOR MORE OUTPUT
1076 \f
1077 STYCH3: PUSHJ P,CHINTI          ;REACTIVATE SO WILL COME BACK ON NEXT CLOCK TICK
1078 STYCH1: SOSGE CHSIBC(I)         ;GET INPUT, IF ANY
1079          JRST [ PUSHJ P,CHAIBD  ;DISCARD EXHAUSTED INPUT BUFFER, IF ANY
1080                 HLRZ A,CHSIBF(I)
1081                 JUMPE A,STYNT8  ;NONE, RETURN TO STYNTC
1082                 LDB TT,[$CPKOP(A)]
1083                 CAIE TT,%CODAT
1084                  JRST STYCH9    ;RANDOM PACKET, DISCONNECT
1085                 PUSHJ P,CHPKIA  ;ACKNOWLEDGE GOBBLING OF THIS PACKET
1086                 SOS CHSNBF(I)   ;REMOVE BUFFER FROM RECEIVE LIST
1087                 MOVEI Q,CHSIBF(I)
1088                 PUSHJ P,CHAQGF
1089                 LDB E,[$CPKNB(A)]       ;SET UP FOR BYTE STREAM INPUT
1090                 MOVEM E,CHSIBC(I)
1091                 MOVEI D,%CPKDT(A)
1092                 HRLI D,440800
1093                 MOVEM D,CHSIBP(I)
1094                 JRST STYCH1 ]
1095         ILDB A,CHSIBP(I)        ;GET CHARACTER OF INPUT
1096         TRNE A,200
1097          JRST [ AOS CHSIBC(I)   ;WOOPS, SPECIAL CHARACTER, NEEDS USER ATTENTION
1098                 MOVSI A,8_14    ;SO PUT IT BACK AND DISCONNECT
1099                 ADDM A,CHSIBP(I)
1100                 JRST STYCH9 ]
1101         EXCH R,I                ;I GETS TTY, R GETS CHAOS
1102         PUSH P,R
1103         PUSH P,I
1104         CONO PI,TTYOFF
1105         PUSHJ P,NTYI5           ;GIVE CHARACTER TO TTY INPUT INTERRUPT LEVEL
1106         CONO PI,TTYON
1107         POP P,R
1108         POP P,I                 ;I GETS CHAOS, R GETS TTY ((POP IN REVERSE ORDER))
1109         JRST STYCH1             ;TRY FOR MORE INPUT
1110
1111 STYCH9: PUSH P,I
1112         MOVE I,R                ;I GETS TTY
1113         PUSHJ P,NSTYN0          ;DISCONNECT THE STY
1114          JRST 4,.
1115         POP P,I                 ;I GETS CHAOS
1116         PUSHJ P,CHINTI          ;WAKE UP THE TELNET SERVER
1117         JRST STYNT8             ;GO HANDLE OTHER STYS
1118 \f
1119 SUBTTL CHAOS NET CLOCK LEVEL STUFF
1120
1121 OVHMTR CHC
1122
1123 ;HERE FROM 1/2 SECOND CLOCK.  DO RETRANSMISSIONS AND DELAYED STS'S
1124 CHACLK:
1125 IFN DLCP,[
1126         CONO PI,NETOFF
1127         PUSHJ P,DLCIBG          ;GET MEMORY FOR INPUT BUFFERS IF NEEDED
1128         CONO PI,NETON
1129 ];DLCP
1130         MOVEI I,NINDX-1         ;SCAN ALL INDICES
1131 CHACL0: SKIPL CHSUSR(I)         ;SKIP THIS ONE IF NOT IN USE
1132          SKIPGE CHSSTA(I) .SEE %CFOFF   ;OR INHIBITED FROM PI LEVEL
1133           SOJGE I,CHACL0
1134         JUMPL I,CPOPJ           ;JUMP IF ALL INDICES DONE
1135         PUSHJ P,CHARTR          ;RETRANSMIT IF NEEDED
1136         MOVSI B,%CFSTS
1137         TDNE B,CHSSTA(I)        ;SEND STS IF NEEDED
1138          PUSHJ P,CHASTO
1139         SOJGE I,CHACL0
1140         POPJ P,
1141
1142 ;HERE EVERY 5 SECONDS, TO DO PROBES
1143 CHA5CL: MOVEI I,NINDX-1         ;SCAN ALL INDICES
1144 CHA5C0: SKIPL CHSUSR(I)         ;SKIP IF THIS ONE NOT IN USE
1145          SKIPGE CHSSTA(I) .SEE %CFOFF ;OR INHIBITED FROM PI LEVEL
1146 CHA5C1:   SOJGE I,CHA5C0
1147         JUMPL I,CHA5C4          ;JUMP IF ALL INDICES DONE
1148         MOVE T,TIME
1149         SUB T,CHSITM(I)         ;TIME SINCE LAST COMMUNICATION FROM OTHER END
1150         CAILE T,90.*30.
1151          JRST [ MOVEI W,%CSINC  ;TOO LONG, CONNECTION BROKEN
1152                 PUSHJ P,CHINT
1153                 JRST CHA5C1 ]
1154         HRRZ B,CHSSTA(I)        ;ONLY PROBE IF OPEN (COULD BE RFC-SENT)
1155         CAIE B,%CSOPN
1156          JRST CHA5C1
1157         HRRZ B,CHSWIN(I)        ;SEE IF NO TRANSMIT WINDOW (LOST STS DURING OPEN)
1158         JUMPE B,CHA5C2
1159         HRRZ B,CHSACK(I)        ;SEE IF AWAITING ACK (WINDOW NOT EMPTY)
1160         HRRZ C,CHSPKN(I)
1161         CAMN B,C
1162          CAIL T,60.*30.
1163 CHA5C2:   PUSHJ P,CHABGI        ;AWAITING ACK OR IDLE FOR 1 MINUTE, PROBE
1164            JRST CHA5C1          ;NO PROBE, OR NO BUFFER AVAILABLE
1165         MOVSI T,(.DPB %COSNS,($CPKOP),0) ;SENSE PACKET, BYTE-COUNT=0
1166         MOVEM T,(A)
1167         AOS CHNSNS
1168         PUSHJ P,CHODT2
1169         JRST CHA5C1
1170
1171 CHA5C4: MOVEI B,[ASCIZ/Timeout/]
1172         MOVEI Q,CHQRFC          ;TIME-OUT FIRST RFC ON LIST
1173         PUSHJ P,CHAQGF
1174         JUMPE A,CHA5C5
1175         MOVE T,-1(A)
1176         ADDI T,60.*30.          ;TIME-OUT IS ONE MINUTE
1177         PUSHJ P,[ CAMG T,TIME
1178                    JRST CHIRF2
1179                   JRST CHAQPF ]
1180 CHA5C5:
1181 IFN CH10P,[
1182         MOVEI T,CHXREN+CHXTEN   ;WAKE UP IN CASE OF TIMING ERROR
1183         IORM T,CHXCNO           ;IN DEALING WITH CHXCNO
1184         CONO CHX,@CHXCNO
1185         MOVSI T,-NSUBNT         ;DECAY ROUTING COSTS
1186         CONO PI,NETOFF          ;PREVENT RUT PACKET FROM COMING IN
1187 CHA5C6: HLRZ TT,SBNRUT(T)
1188         ADDI TT,1
1189         CAIG TT,1000
1190          HRLM TT,SBNRUT(T)
1191         AOBJN T,CHA5C6
1192         CONO PI,NETON
1193 ];CH10P
1194 IFN CH11P,[
1195         MOVEI T,%CAREN+%CATEN   ;WAKE UP IN CASE OF TIMING ERROR
1196         IORB T,CHXCSR           ;IN DEALING WITH CHXCSR
1197         IOWRI T,CAICSR
1198         MOVSI T,-NSUBNT         ;DECAY ROUTING COSTS
1199         CONO PI,NETOFF          ;PREVENT RUT PACKET FROM COMING IN
1200 CHA5C6: HLRZ TT,SBNRUT(T)
1201         ADDI TT,1
1202         CAIG TT,1000
1203          HRLM TT,SBNRUT(T)
1204         AOBJN T,CHA5C6
1205         CONO PI,NETON
1206 ];CH11P
1207         MOVEI T,5*60.
1208         MOVEI C,CHA5CK
1209         JRST CLQREE
1210
1211 OVHMTR CHR
1212
1213 ;RETRANSMIT FOR INDEX IN I
1214 CHARTR: CONI PI,W               ;SAVE PI CHANNELS ACTIVE
1215         ANDI W,177              ;CHAXMT BETTER NOT CLOBBER W!
1216         CONO PI,NETOFF          ;PI BETTER BE OFF THROUGHOUT THIS ZONE
1217                                 ; SO WE DON'T GET INTO CHIACK
1218         HLRZ A,CHSOBF(I)        ;SCAN DOWN OUTPUT BUFFER LIST
1219         JUMPE A,CHART2          ;EMPTY
1220 CHART1: MOVE T,-1(A)            ;DON'T RETRANSMIT IF DONE TOO RECENTLY
1221         HLRZ TT,-2(A)           ;OR IF ALREADY ON ITS WAY OUT (DON'T LINK TWICE ON XMIT LIST)
1222         CAME T,TIME
1223          CAIE TT,-1
1224           JRST CHART2           ;ANYTHING AFTER THIS IS LIKELY TO LOSE ALSO
1225         AOS CHNRTR
1226         PUSHJ P,CHAXMT          ;RETRANSMIT THIS
1227 ;       HRRZ A,-2(A)            ;THREAD TO NEXT
1228 ;       JUMPN A,CHART1
1229 CHART2: CONO PI,PICON(W)
1230         POPJ P,
1231 \f
1232 ;THIS ROUTINE SENDS A STS PACKET, OR TRIES TO.  FAILURE => SLOW CLOCK WILL TRY AGAIN.
1233 ;CANNOT PCLSR NOR WAIT, CALLABLE FROM INTERRUPT LEVEL.
1234 ;INDEX IN I, CLOBBERS A,B,C,D,E,T,TT,Q,J
1235 CHASTO: MOVSI D,%CFSTS
1236         IORM D,CHSSTA(I)
1237         PUSHJ P,CHABGI          ;GET A BUFFER, WITHOUT WAITING
1238          POPJ P,                ;CAN'T GET ONE, WILL RETRY AT CLOCK LEVEL
1239         ANDCAM D,CHSSTA(I)      ;OK, A STS WILL BE SENT, CLEAR NEED-STS FLAG
1240         MOVE T,[.DPB %COSTS,($CPKOP),<.DPB 4,($CPKNB),0>]
1241         MOVEM T,(A)             ;SEND A STS WITH 4 DATA BYTES
1242         PUSHJ P,DPBRCP          ;FIRST PAIR IS RECEIPT
1243         HLRZ B,CHSWIN(I)        ;SECOND PAIR IS WINDOW SIZE
1244         DPB B,[042000,,%CPKDT(A)]
1245         AOS CHNSTS
1246         JRST CHODT2             ;FIRE IT OFF
1247
1248 DPBRCP: HLRZ B,CHSPKN(I)
1249         SKIPE T,CHSIBF(I)
1250          LDB B,[$CPKPN(T)]
1251         DPB B,[242000,,%CPKDT(A)]
1252         POPJ P,
1253 \f
1254 SUBTTL CHAOS NET INTERRUPT-LEVEL INPUT PROCESSING
1255
1256 OVHMTR CHI
1257
1258 ;PROCESS A PACKET RECEIVED AT INTERRUPT LEVEL.  BY THE TIME WE GET HERE
1259 ; A BUFFER HAS BEEN ALLOCATED AND FILLED WITH THE DATA FROM THE DEVICE.
1260 ; ITS ADDRESS IS IN A.  RETURN VIA POPJ P, WITH ALL REGISTERS CLOBBERED.
1261 CHAPII: MOVE B,RECHDP           ;SAVE HEADER FOR DEBUGGING IN RING BUFFER
1262         MOVEI D,%CPKDT(B)
1263         HRL B,A
1264         BLT B,-1(D)
1265         CAIN D,RECHDR+<NRECHD*%CPKDT>
1266          MOVEI D,RECHDR
1267         MOVEM D,RECHDP
1268         ;END OF DEBUGGING CODE
1269         LDB D,[$CPKMV(A)]       ;MUPPET?
1270         JUMPN D,CHABRT          ;FLUSH, NOT SUPPORTED
1271         LDB D,[$CPKOP(A)]       ;GET OPCODE
1272         LDB B,[$CPKDA(A)]       ;CHECK DESTINATION
1273         CAIE B,MYCHAD           ;IF FOR ME,
1274          SKIPN B                ;OR FOR ME BY VIRTUE OF BROADCAST
1275           AOSA CHNPI            ;ACCEPT IT
1276            JRST CHAPFW          ;NOT ME, FORWARD
1277         LDB C,[$CPKNB(A)]       ;PASS LENGTH IN C TO OP ROUTINES
1278         MOVEI B,[ASCIZ/Illegal byte count/]
1279         CAILE C,%CPMXC
1280          JRST CHALOS
1281         SKIPGE (A)              ;TEST OPCODE
1282          JRST CHIDAT            ;DATA PACKET
1283         MOVEI B,[ASCIZ/Illegal opcode/]
1284         CAIGE D,%COMAX
1285          JRST @.+1(D)
1286         OFFSET -.
1287         JRST CHALOS             ;ILLEGAL, FLUSH
1288 %CORFC::JRST CHIRFC
1289 %COOPN::JRST CHIOPN
1290 %COCLS::JRST CHICLS
1291 %COFWD::JRST CHIANS
1292 %COANS::JRST CHIANS
1293 %COSNS::JRST CHISNS
1294 %COSTS::JRST CHISTS
1295 %CORUT::
1296 IFE CH10P+CH11P,JRST CHABRT     ;IGNORE
1297 IFN CH10P+CH11P,JRST CHIRUT
1298 %COLOS::JRST CHILOS
1299 %COLSN::JRST CHALOS             ;ILLEGAL, FLUSH
1300 %COMNT::JRST CHABRT             ;IGNORE
1301 %COEOF::JRST CHIDAT
1302 %COUNC::JRST CHIUNC
1303 %COBRD::JRST CHIBRD
1304 %COMAX::OFFSET 0
1305
1306 ;FORWARDING
1307 CHAPFW: LDB B,[$CPKDA(A)]       ;CHECK DESTINATION HOST
1308         TRNN B,377_8            ;SUBNET 0?
1309          JRST CHABRT            ;FLUSH IT, XX-NETWORK-11 IS TRYING TO MAKE US CRASH
1310         LDB B,[$CPKFC(A)]       ;INCREMENT FORWARDING COUNT
1311         ADDI B,1
1312         CAIL B,20
1313          JRST [ AOS CHNPFL ? JRST CHABRT ]      ;LOOP, DISCARD
1314         DPB B,[$CPKFC(A)]
1315         SETOM -2(A)             ;NOT ON SEND LIST
1316         AOS CHNPF
1317         JRST CHAXMT
1318
1319 IFN CH10P+CH11P,[               ;INCOMING ROUTING INFO
1320 CHIRUT: LSH C,-2                ;NUMBER OF SUBNET ENTRIES
1321         JUMPE C,CHABRT          ;COULD BE ZERO-LENGTH
1322         MOVEI D,%CPKDT(A)
1323         HRLI D,442000
1324         LDB E,[$CPKSA(A)]       ;SOURCE HOST IS GATEWAY
1325 CHIRU1: ILDB T,D                ;SUBNET
1326         ILDB TT,D               ;COST
1327         HLRZ B,SBNRUT(T)        ;COST OF EXISTING ROUTE
1328         CAIGE T,NSUBNT
1329          CAMLE TT,B
1330           JRST CHIRU2
1331         HRLM TT,SBNRUT(T)       ;THIS IS BEST ROUTE NOW
1332         HRRM E,SBNRUT(T)
1333 CHIRU2: SOJG C,CHIRU1
1334         JRST CHABRT
1335 ];CH10P+CH11P
1336
1337 ;INTERRUPT-LEVEL PROCESSING OF SNS PACKET
1338 ;NOTE THAT WE DO NOT BARF AT SNS'S TO EXISTENT NON-OPEN CONNECTIONS.  IF IT
1339 ;WAS AN RFC-SENT CONNECTION, THIS COULD BREAK IT PREMATURELY IF AN OPN WAS
1340 ;LOST AND THEN A SNS WAS NOT.
1341 CHISNS: MOVEI E,%CSOPN
1342         PUSHJ P,CHFNDX
1343          JRST [ CAIE E,%CSOPN
1344                  JRST CHABRT    ;CONNECTION EXISTS AND IS NOT OPEN, IGNORE PACKET
1345                 JRST CHALOS ]   ;CONNECTION DOES NOT EXIST, COMPLAIN
1346         PUSHJ P,CHABRT          ;CONNECTION DOES EXIST
1347         CAIE E,%CSOPN
1348          POPJ P,                ;NOT OPEN, IGNORE
1349         JRST CHASTO             ;REPLY WITH STS
1350
1351 ;INTERRUPT LEVEL PROCESSING OF RECEIVED FWD OR ANS
1352 CHIANS: PUSHJ P,CHFNDX          ;FIND CONNECTION
1353          JRST CHABRT            ;NOBODY AT OTHER END TO RECEIVE A LOS ANYWAY
1354         CAIE E,%CSRFS
1355          JRST CHABRT            ;NOT IN RFC-SENT STATE, LOSS
1356 ;       JRST CHICL1             ;CLOSE THE CONNECTION BUT GIVE TO USER AS INPUT
1357         ;DROPPING THROUGH WILL DO
1358
1359 ;INTERRUPT LEVEL PROCESSING OF RECEIVED CLS PACKET
1360 CHICLS: PUSHJ P,CHFNDX          ;FIND CONNECTION BEING CLOSED
1361          JRST CHALOS            ;NONE, LOSS
1362 CHICL1: MOVEI W,%CSCLS          ;CLOSE THE CONNECTION
1363 CHICL2: PUSHJ P,CHINT           ;SET TO STATE IN W, INTERRUPT
1364         PUSH P,A
1365         MOVEI Q,CHSPBF(I)       ;DISCARD OUT-OF-ORDER PACKETS
1366         PUSHJ P,CHALFR
1367         HRRZS CHSNBF(I)
1368 CHIC2A: MOVEI Q,CHSOBF(I)       ;DISCARD TRANSMIT PACKETS, E.G. RFC WHICH RECEIVED
1369         PUSHJ P,CHAQGF          ;AN ANS OR FWD, DON'T WANT TO TRANSMIT AGAIN
1370         JUMPE A,CHIC2B
1371         PUSHJ P,CHABR1
1372         JRST CHIC2A
1373
1374 CHIC2B: POP P,A
1375         JRST CHIDT1             ;GIVE PACKET TO USER AS DATA
1376 \f;INTERRUPT LEVEL PROCESSING OF RFC PACKET
1377 CHIRFC: MOVE T,%CPKDT(A)        ;CHECK FOR STATUS REQUEST
1378         CAMN T,[.BYTE 8 ? "S ? "T ? "A ? "T]
1379          CAIE C,6
1380           JRST CHIRF7
1381         MOVS TT,%CPKDT+1(A)
1382         XORI TT,(<.BYTE 8 ? "U ? "S>)
1383         TRNN TT,(<.BYTE 8 ? -1 ? -1>)
1384          JRST CHIRF3
1385 CHIRF7: MOVEI Q,CHQLSN          ;SEARCH LISTENING QUEUE
1386         PUSHJ P,CHAQSR
1387          JRST CHIRF1            ;NOT FOUND, LOAD SERVER
1388         EXCH A,B                ;A LSN, B RFC
1389         LDB I,[$CPKSX(A)]       ;GET CORRESPONDING INDEX
1390         HRRZ E,CHSSTA(I)
1391         CAIE E,%CSLSN
1392          JRST 4,.
1393 CHIRF0: PUSHJ P,CHABRT          ;FOUND, DISCARD LISTEN PACKET
1394         MOVE A,B                ;GET OTHER HOST'S RFC
1395         LDB B,[$CPKPN(A)]       ;INITIALIZE RECEIVER'S PACKET NUMBER
1396         HRLM B,CHSPKN(I)
1397         MOVE B,%CPKS(A)
1398         MOVEM B,CHSFRN(I)       ;HOOK 'EM UP
1399         MOVEI W,%CSRFC          ;PUT INTO RFC-RECEIVED STATE
1400         MOVE T,TIME             ;AND ENGAGE PI LEVEL
1401         MOVEM T,CHSITM(I)
1402         JRST CHICL2
1403         
1404 ;RFC RECEIVED AND NOT IMMEDIATELY MATCHED TO A LSN.  QUEUE AND LOAD SERVER JOB.
1405 ;BUT FIRST CHECK WHETHER THIS IS A DUPLICATE WHICH SHOULD BE DISCARDED.
1406 CHIRF1: MOVE C,%CPKS(A)         ;SEARCH PENDING RFC QUEUE FOR RFC FROM
1407         HLRZ T,CHQRFC           ;THE SAME SOURCE AS THIS.
1408         JUMPE T,CHIRD1
1409 CHIRD0: CAMN C,%CPKS(T)
1410          JRST CHABRT            ;THIS RFC IS A DUPLICATE, IGNORE IT
1411         HRRZ T,-2(T)
1412         JUMPN T,CHIRD0
1413 CHIRD1: MOVSI T,-NINDX          ;SEARCH OPEN AND RFC-RECEIVED CONNECTIONS
1414 CHIRD2: SKIPL CHSUSR(T)         ;FOR ONE CONNECTED TO SAME GUY AS SENT RFC
1415          CAME C,CHSFRN(T)
1416           AOBJN T,CHIRD2
1417         JUMPGE T,CHIRD3         ;NO DUPLICATE OF THIS RFC, QUEUE IT
1418         HRRZ TT,CHSSTA(T)
1419         CAIE TT,%CSOPN
1420          CAIN TT,%CSRFC
1421           JRST CHABRT           ;REALLY A DUPLICATE, DISCARD
1422         AOBJN T,CHIRD2
1423 CHIRD3: MOVEI B,[ASCIZ/System not up/]
1424         SKIPL SYSDBG            ;REFUSE INCOMING CONNECTIONS IF LOGINS REFUSED
1425          SKIPE NETUSW           ;ALLOWING INCOMING NET CONNECTIONS?
1426           JRST CHIRF2           ;NO, REFUSE (EVEN IF FROM OURSELVES)
1427         HRROI T,CHIRFJ          ;LOAD JOB
1428         CONI PI,Q               ;MUST TURN UTCOFF TO CALL NUJBST
1429         ANDI Q,177              ;SINCE THIS MAY RUN AT OTHER INT LEVELS
1430         CONO PI,NETOFF
1431         PUSHJ P,NUJBST
1432          JRST [ CONO PI,PICON(Q)
1433                 JRST CHABRT ]   ;RING BUFFER FULL, IGNORE, RETRY WILL CATCH
1434         CONO PI,PICON(Q)
1435         MOVE T,TIME             ;REMEMBER WHEN THIS RFC WAS QUEUED
1436         MOVEM T,-1(A)
1437         MOVEI Q,CHQRFC
1438         JRST CHAQPF             ;PUT ON FRONT OF QUEUE
1439
1440 ;COME HERE TO SEND A LOS PACKET IN RESPONSE TO CRUFTY INPUT IN A
1441 ;B SHOULD POINT TO AN ASCIZ STRING FOR WHY.
1442 CHALOS: SKIPA T,[%COLOS]
1443 ;HERE TO REFUSE AN RFC.  TURN IT INTO A CLS AND SEND IT BACK.
1444 ;B SHOULD POINT TO AN ASCIZ STRING FOR WHY.
1445 CHIRF2:  MOVEI T,%COCLS
1446         HRLI B,440700           ;BP TO MESSAGE
1447         SETZB C,(A) .SEE $CPKFC
1448         DPB T,[$CPKOP(A)]
1449         MOVE T,%CPKS(A)         ;EXCHANGE SOURCE AND DESTINATION
1450         EXCH T,%CPKD(A)
1451         MOVEM T,%CPKS(A)
1452         MOVE D,[440800,,%CPKDT(A)]
1453 CHIRF4: ILDB T,B
1454         JUMPE T,CHIRF5
1455         IDPB T,D
1456         AOJA C,CHIRF4
1457
1458 CHIRF5: DPB C,[$CPKNB(A)]
1459         SETOM -2(A)             ;NOT ON ANY SEND LIST
1460         JRST CHAXMT             ;SEND IT
1461 \f
1462 ;HERE FOR RFC TO "STATUS" 
1463 EXPUNGE FOO,BAR
1464 DEFINE FOO NAME
1465 BAR==0
1466 .BYTE 8
1467 IRPC CH,,NAME
1468 "CH
1469 BAR==BAR+1
1470 TERMIN
1471 IFG BAR-4, .ERR NAME MORE THAN 4 CHARACTERS
1472 REPEAT 4-BAR, 0
1473 .BYTE
1474 TERMIN
1475
1476 CHIRF3: MOVE B,[MNAME FOO ,,]   ;NAME OF MACHINE IN 8-BIT ASCII
1477 EXPUNGE FOO,BAR
1478         MOVEM B,%CPKDT(A)
1479         SETZM %CPKDT+1(A)
1480         MOVSI B,%CPKDT+1(A)
1481         HRRI B,%CPKDT+2(A)
1482         BLT B,%CPKDT+7(A)
1483         MOVE B,[.BYTE 8 ? MYCHAD/400 ? 1 ? 4+IFN CH10P+CH11P,[10.] ? 0 ]
1484         MOVEM B,%CPKDT+10(A)
1485         MOVEI B,%CPKDT+11(A)
1486         HRLI B,441000
1487         MOVE T,CHNPI
1488         PUSHJ P,CHRF3A
1489         MOVE T,CHNPO
1490         PUSHJ P,CHRF3A
1491 IFN CH10P+CH11P,[
1492         MOVE T,CHNABT
1493         PUSHJ P,CHRF3A
1494         MOVE T,CHNLOS
1495         PUSHJ P,CHRF3A
1496         MOVE T,CHNCRC
1497         PUSHJ P,CHRF3A
1498         MOVE T,CHNCR2
1499         PUSHJ P,CHRF3A
1500         MOVE T,CHNPLE
1501         ADD T,CHNWLE
1502         PUSHJ P,CHRF3A
1503 ];CH10P+CH11P
1504         MOVEI T,%COANS
1505         SETZM (A) .SEE $CPKFC
1506         DPB T,[$CPKOP(A)]
1507         MOVE T,%CPKS(A)         ;EXCHANGE SOURCE AND DESTINATION
1508         EXCH T,%CPKD(A)
1509         MOVEM T,%CPKS(A)
1510         MOVEI C,13*4+IFN CH10P+CH11P,[20.]      ;BYTE COUNT
1511         JRST CHIRF5             ;SEND
1512
1513 CHRF3A: MOVEI TT,4
1514         IDPB T,B
1515         LSH T,-8
1516         SOJG TT,.-2
1517         POPJ P,
1518 \f
1519 ;HERE TO CONVERT A BRD INTO AN RFC
1520
1521 CHIBRD: LDB T,[$CPKAN(A)]       ;NUMBER OF BITMAP BYTES
1522         LDB TT,[$CPKNB(A)]      ;NUMBER OF TOTAL DATA BYES (INCLUDES BITMAP)
1523         CAIG T,32.              ;ACK NUMBER NO GREATER THAN 32.
1524          TRNE T,3               ; MUST BE MULTIPLE OF 4
1525           JRST CHABRT           ;  FREE THE PACKET IF NO GOOD
1526         CAMG TT,T               ;MUST BE SOME TEXTUAL RFC DATA AS WELL
1527          JRST CHABRT            ; IF NOT, FREE PACKET
1528         MOVE C,TT               ;GET NUMBER OF BYTES (CHIRFC WANTS COUNT IN C)
1529         SUB C,T                 ;WITHOUT BITMAP
1530         DPB C,[$CPKNB(A)]       ;NEW BYTE COUNT
1531         LSH T,-2                ;CONVERT BITMAP BYTE COUNT TO WORD COUNT
1532         ADDI TT,3               ;CONVERT BYTE COUNT TO...
1533         LSH TT,-2               ;... WORD COUNT
1534         MOVEI D,%CPKDT(A)       ;GET POINTER TO BEGINNING OF DATA
1535         HRL D,D                 ;IN UPPER AND LOWER HALVES (ALMOST BLT POINTER)
1536         HRLZ T,T                ;BITMAP WORD COUNT,,0
1537         ADD D,T                 ;RFC-STRING,,DATA-FIELD
1538         ADDI TT,%CPKDT-1(A)     ;LAST LOCATION FOR BLT
1539         BLT D,(TT)
1540         SETZI TT,
1541         DPB TT,[$CPKAN(A)]      ;ZERO THE ACK FIELD
1542         MOVE TT,MYCHAD
1543         DPB TT,[$CPKDA(A)]      ;PRETEND IT WAS FOR ME
1544         JRST CHIRFC             ;AND HANDLE IT AS AN RFC
1545
1546 \f
1547 ;ROUTINE TO FIND INDEX PACKET CORRESPONDS TO, SKIP IF FOUND, INDEX IN I.
1548 ;ALSO RETURNS STATE IN E SINCE THAT'S OFTEN HANDY.
1549 ;ALSO SETS B FOR CHALOS
1550 CHFNDX: MOVEI B,[ASCIZ/Connection does not exist at this end/]
1551         LDB I,[$CPKDX(A)]       ;GET REAL-INDEX PART OF DESTINATION INDEX
1552         CAIGE I,NINDX
1553          SKIPGE CHSUSR(I)
1554           POPJ P,               ;NO MATCH
1555         SKIPGE CHSSTA(I) .SEE %CFOFF
1556          POPJ P,                ;NOT TALKING TO NETWORK
1557         HRRZ E,CHSSTA(I)
1558         MOVE TT,%CPKD(A)
1559         MOVE T,%CPKS(A)
1560         CAIN E,%CSRFS           ;IF IN RFC-SENT STATE, ONLY
1561          AND T,[.BYTE 16. ? -1 ? 0]     ;THE SOURCE HOST HAS TO MATCH
1562         CAMN TT,CHSLCL(I)       ;COMPARE LOCAL ADDRESS
1563          CAME T,CHSFRN(I)       ; AND FOREIGN ADDRESS
1564           POPJ P,               ;NO MATCH
1565         MOVE T,TIME
1566         MOVEM T,CHSITM(I)
1567         JRST POPJ1              ;SUCCEED, CALLER CHECKS THE STATE
1568
1569 ;INTERRUPT LEVEL PROCESSING OF RECEIVED OPN PACKET
1570 CHIOPN: PUSHJ P,CHFNDX          ;FIND CONNECTION TO BE OPENED
1571          JRST CHALOS
1572         CAIE E,%CSRFS           ;NOT IN RFC-SENT STATE,
1573          JRST CHABRT            ; MUST BE DUPLICATE, DISCARD.
1574         LDB B,[$CPKPN(A)]       ;GET ITS PACKET NUMBER
1575         HRLM B,CHSPKN(I)        ;INITIALIZE PACKET NUMBERING OF RECEIVED MESSAGES
1576         MOVE B,%CPKS(A)
1577         MOVEM B,CHSFRN(I)       ;HOOK 'EM UP
1578         PUSHJ P,CHIST1          ;PROCESS AS A STS, DISCARD
1579         PUSHJ P,CHASTO          ;RESPOND WITH A STS
1580         MOVEI W,%CSOPN
1581         ;DROP INTO CHINT
1582
1583 ;COME HERE WITH INDEX IN I AND NEW STATE IN W, TO CHANGE STATE AND INTERRUPT
1584 CHINT:  HRRM W,CHSSTA(I)
1585         MOVE T,TIME
1586         MOVEM T,CHSITM(I)       ;IN CASE GOT HERE FROM CHOLSN
1587         MOVSI T,%CFOFF
1588         CAIE W,%CSOPN
1589          IORM T,CHSSTA(I)       ;DISENGAGE PI LEVEL
1590         CAIN W,%CSOPN
1591          ANDCAM T,CHSSTA(I)     ;NOW OPEN, ENGAGE PI LEVEL
1592 ;COME HERE TO INTERRUPT ON THE INPUT CHANNEL.  SMASHES T,TT,W
1593 CHINTI: LDB T,[$CHSUI,,CHSUSR(I)]
1594 CHINT2: MOVE TT,CHSSTA(I)       ;SIGNAL USER OR STY?
1595         TLNN TT,%CFSTY
1596          JRST CHINT4            ;USER
1597         LDB T,[$CFTTN,,TT]      ;STY, GET TTY NUMBER
1598         CONO PI,PIOFF           ;PROTECT LIST MODIFICATION
1599         SKIPL STYNTL-NFSTTY(T)  ;DON'T PUT ON LIST TWICE
1600          JRST PIONJ
1601         MOVE TT,STYNTA          ;ADD TO LIST
1602         MOVEM TT,STYNTL-NFSTTY(T)
1603         MOVEM T,STYNTA
1604         JRST PIONJ
1605
1606 CHINT4: SKIPGE TT,CHSUSR(I)
1607          JRST 4,.
1608         MOVSI W,(SETZ)          ;PCLSR THE JOB SO IT GETS AN IOC ERROR IF NEEDFUL
1609         IORM W,PIRQC(TT)        ;EVEN IF NORMAL INTERRUPTS ARE NOT ENABLED
1610         CAIN T,77
1611          POPJ P,                ;IOPUSH'D, NO INTERRUPT
1612         MOVE T,CHNBIT(T)
1613         AND T,MSKST2(TT)
1614         IORM T,IFPIR(TT)
1615         POPJ P,
1616 \f
1617 OVHMTR CHD
1618
1619 ;INTERRUPT LEVEL PROCESSING OF RECEIVED DATA PACKET
1620 CHIDAT: PUSHJ P,CHFNDX          ;FIND ASSOCIATED CONNECTION
1621          JRST CHALOS            ;NONE, LOSS
1622         CAIE E,%CSOPN           ;STATE MUST BE OPEN
1623          JRST CHALOS            ;BAD, LOSS
1624         PUSHJ P,CHIACK          ;PROCESS ACKNOWLEDGEMENT FIELD
1625 ;NOW DECIDE WHETHER IT GOES ON CHSIBF(I), OR ON CHSPBF(I), OR GETS DISCARDED.
1626         HLRZ B,CHSPKN(I)        ;LAST PACKET NUMBER GIVEN TO USER
1627         LDB C,[$CPKPN(A)]       ;GET PACKET NUMBER OF THE NEW PACKET
1628         HLRZ T,CHSWIN(I)        ;RECEIVE WINDOW SIZE
1629         ADDI T,(B)              ;HIGHEST LEGAL PACKET NUMBER
1630         SUB T,C
1631         TRNE T,100000           ;SKIP IF T >= C
1632          JRST CHABRT            ;FOO ON YOU, OVER WINDOW SIZE
1633         HRRZ T,CHSIBF(I)        ;COMPUTE NEXT IN-ORDER PACKET EXPECTED
1634         JUMPE T,CHIDT6          ;BASED ON LAST IN-ORDER PACKET
1635         LDB TT,[$CPKOP(T)]
1636         CAIE TT,%COUNC
1637          JRST [ LDB B,[$CPKPN(T)]
1638                 JRST CHIDT6 ]
1639         HLRZ T,CHSIBF(I)        ;IF IT'S AN UNC, HAVE TO GO FIND CORRECT PACKET
1640 CHIDT5: LDB TT,[$CPKOP(T)]
1641         CAIE TT,%COUNC
1642          LDB B,[$CPKPN(T)]
1643         HRRZ T,-2(T)
1644         JUMPN T,CHIDT5
1645 CHIDT6: ADDI B,1
1646         ANDI B,177777           ;NEXT IN-ORDER PACKET EXPECTED
1647         CAMN B,C
1648          JRST CHIDT1            ;EQUAL, IT GOES ON THE END OF CHSIBF(I) LIST.
1649         SUB B,C                 ;NOT EQUAL, COMPARE THEM MODULO 2^16.
1650         TRNN B,100000
1651          JRST CHIDTD            ;B GREATER, THIS IS AN OLD PACKET, DISCARD IT
1652         ;PUT ON CHSPBF(I) IN PROPER ORDER
1653         ;A IS THIS PACKET, C IS HIS NUMBER, B IS PREDECESSOR, D IS NEXT, E IS HIS #
1654         MOVEI B,0               ;SIGNIFY AT FRONT OF LIST
1655         HLRZ D,CHSPBF(I)        ;GET FIRST PACKET ON OUT-OF-ORDER LIST
1656         JUMPE D,CHIDT4          ;LIST IS EMPTY
1657 CHIDT3: LDB E,[$CPKPN(D)]
1658         SUB E,C                 ;COMPARE PACKET NUMBERS
1659         JUMPE E,CHIDTD          ;DUPLICATE, DISCARD
1660         TRNE E,100000
1661          JRST [ MOVE B,D        ;E IS LESS, KEEP LOOPING
1662                 HRRZ D,-2(B)
1663                 JUMPN D,CHIDT3
1664                 JRST .+1 ]      ;REACHED END PUT IT HERE
1665         SKIPE B
1666          HRRM A,-2(B)           ;THREAD ONTO PREVIOUS PACKET
1667         SKIPN D
1668 CHIDT4:  HRRM A,CHSPBF(I)       ;THREAD ONTO BACK OF LIST
1669         SKIPN B
1670          HRLM A,CHSPBF(I)       ;THREAD ONTO FRONT OF LIST
1671         HRRM D,-2(A)            ;THREAD IN BEFORE PACKET IN D
1672         MOVSI B,1
1673         ADDM B,CHSNBF(I)
1674         POPJ P,
1675
1676 ;HERE IT GOES ON CHSIBF(I).  A HAS PACKET, C HAS ITS PACKET NUMBER.
1677 ;IF GETTING HERE FROM CHICL1, C HAS GARBAGE BUT IT WILL NEVER BE USED.
1678 CHIDT1: SKIPN CHSIBF(I)
1679          PUSHJ P,CHINTI         ;THERE WAS NO INPUT, BUT THERE IS NOW, COME AND GET IT
1680         AOS CHSNBF(I)
1681         MOVEI Q,CHSIBF(I)
1682         PUSHJ P,CHAQPL          ;PUT ON END OF RECEIVE LIST
1683         HLRZ A,CHSPBF(I)        ;GET FIRST OUT-OF-ORDER PACKET
1684         JUMPE A,CPOPJ           ;NONE
1685         LDB B,[$CPKPN(A)]       ;SEE IF THIS PACKET IS NOW IN-ORDER
1686         CAIL C,177777           ;BY COMPARING AGAINST C+1 MODULO 2^16.
1687          TDZA C,C
1688           ADDI C,1
1689         CAME B,C
1690          POPJ P,                ;NO
1691         MOVEI Q,CHSPBF(I)
1692         PUSHJ P,CHAQGF          ;YES, PULL PACKET OF OUT-OF-ORDER LIST
1693         MOVSI B,-1
1694         ADDM B,CHSNBF(I)
1695         JRST CHIDT1             ;AND GO PUT ONTO IN-ORDER LIST
1696
1697 ;HERE IF PACKET IS A DUPLICATE AND IS TO BE DISCARDED.  MUST SEND
1698 ;RECEIPT TO SHUT OFF EXCESS RETRANSMISSION.
1699 CHIDTD: PUSHJ P,CHABRT
1700         AOS CHNPD
1701         JRST CHASTO
1702
1703 ;HERE FOR RECEIVING AN UNC PACKET
1704 CHIUNC: LDB I,[$CPKDI(A)]       ;Destination index zero?
1705         JUMPE I,CHIUN2  
1706         LDB I,[$CPKDX(A)]       ;GET REAL-INDEX PART OF DESTINATION INDEX
1707         CAIGE I,NINDX
1708          SKIPGE CHSUSR(I)
1709           JRST CHALOS           ;NO MATCH
1710         MOVE TT,%CPKD(A)        ;DESTINATION ADDRESS MATCHES?
1711         CAME TT,CHSLCL(I)
1712          JRST CHALOS
1713         HRRZ E,CHSSTA(I)        ;IN FOREIGN PROTOCOL MODE?
1714         CAIN E,%CSFRN
1715          JRST CHIUN1
1716         MOVE TT,%CPKS(A)        ;NORMAL PROTOCOL, SOURCE ADDRESS MUST MATCH
1717         CAMN TT,CHSFRN(I)
1718          CAIE E,%CSOPN          ;AND STATE MUST BE OPEN
1719           JRST CHALOS
1720 CHIUN1: MOVE TT,TIME
1721         MOVEM TT,CHSITM(I)
1722         SKIPE T,CHSIBF(I)       ;DISCARD PACKET IF OVER WINDOW SIZE
1723          JRST [ LDB TT,[$CPKOP(T)]      ; AND ALREADY HAVE AN UNC
1724                 HRRZ T,CHSNBF(I)
1725                 HLRZ Q,CHSWIN(I)
1726                 CAML T,Q
1727                  CAIE TT,%COUNC
1728                   JRST .+2
1729                 JRST CHABRT ]           
1730           PUSHJ P,CHINTI        ;THERE WAS NO INPUT, BUT THERE IS NOW, COME AND GET IT
1731         AOS CHSNBF(I)           ;PUT ON END OF RECEIVE LIST.
1732         MOVEI Q,CHSIBF(I)       ;PACKET NUMBER IS RANDOM, NOTHING LOOKS AT IT
1733         JRST CHAQPL
1734
1735 CHIUN2:
1736 IFE INETP,JRST CHALOS           ;No comprendo internet
1737 IFN INETP,[
1738         LDB I,[$CPKAN(A)]       ;Protocol number
1739         CAIE I,8_8              ;DOD Internet #x0800
1740          JRST CHALOS
1741         AOS CHNIPI              ;Meter Internet packets in from Chaosnet
1742         MOVE J,A                ;Save Chaosnet packet
1743         LDB A,[$CPKNB(A)]       ;Compute size of Internet datagram in words
1744         ADDI A,3
1745         LSH A,-2
1746         MOVE C,A                ;Save word count
1747         CALL IPGIPT             ;Get buffer to copy datagram into
1748          JRST CHIUN3            ;No buffers available, discard packet
1749         MOVSI T,%CPKDT(J)       ;Make BLT pointer
1750         HRRI T,1(B)
1751         ADDI B,(C)              ;Address of last destination word
1752         BLT T,(B)
1753         EXCH A,J                ;Free the Chaosnet packet
1754         CALL CHABRT
1755         MOVE A,J                ;Datagram structure
1756         MOVE B,C                ;Word count
1757         MOVEI C,0               ;Offset to start of IP header
1758         CALRET IPRDGM           ;Dispose of datagram
1759
1760 CHIUN3: MOVE A,J                ;Discard Chaosnet packet
1761         CALRET CHABRT
1762 ];INETP
1763 \f
1764 OVHMTR CHJ
1765
1766 ;INTERRUPT LEVEL PROCESSING OF LOS
1767 CHILOS: PUSHJ P,CHFNDX          ;FIND CONNECTION TO BE BROKEN
1768          JRST CHABRT            ;NONE, IGNORE
1769         MOVEI W,%CSLOS          ;PUT INTO LOST STATE
1770         JRST CHICL2             ;GIVE PACKET TO USER AS DATA, DISENGAGE, AND INTERRUPT
1771
1772 ;INTERRUPT LEVEL PROCESSING OF STS
1773 CHISTS: PUSHJ P,CHFNDX
1774          JRST CHALOS
1775         CAIE E,%CSOPN           ;CONNECTION MUST BE OPEN
1776          JRST CHALOS
1777 CHIST1: LDB B,[042000,,%CPKDT(A)]       ;GET NEW WINDOW SIZE
1778         CAILE B,MXWIND
1779          MOVEI B,MXWIND
1780         HRRM B,CHSWIN(I)
1781         LDB B,[242000,,%CPKDT(A)]       ;PROCESS RECEIPT
1782         PUSHJ P,CHIAK0
1783         PUSHJ P,CHABRT
1784         JRST CHARTR             ;RETRANSMIT
1785
1786 OVHMTR CHA
1787
1788 ;INTERRUPT LEVEL PROCESSING OF RECEIVED ACKNOWLEDGEMENT.
1789 ;REMOVE THE ACKNOWLEDGED PACKETS FROM THE INDEX'S SEND LIST AND UPDATE CHSNOS(I).
1790 ;NOTE THAT THE LIST IS ASSUMED TO BE SORTED SO WE ONLY
1791 ;REMOVE PACKETS FROM THE FRONT.  CLOBBERS B,C,D,T,TT,Q.
1792 CHIACK: LDB B,[$CPKAN(A)]       ;PACKET NUMBER BEING RECEIPTED
1793 CHIAK0: LDB T,[$CPKAN(A)]       ;ENTER HERE FROM CHISTS
1794         HRRZ D,CHSACK(I)        ;GET MAX OF THIS ACKNOWLEDGE AND PREVIOUS
1795         SUB D,T
1796         TRNE D,100000
1797          HRRM T,CHSACK(I)       ;ACKNOWLEDGED PACKET NUMBER IS NEW START OF WINDOW
1798         PUSH P,A
1799         HLRZ A,CHSOBF(I)        ;MAP DOWN SEND LIST
1800         JUMPE A,CHIAK2          ;LIST EMPTY
1801 CHIAK1: LDB D,[$CPKPN(A)]
1802         SUBM B,D
1803         TRNE D,100000
1804          JRST CHIAK2            ;RCP# LESS THAN PKT#
1805         HRRZ C,-2(A)            ;GET NEXT PACKET
1806         HLLOS D,-2(A)           ;MARK NOT ON SEND LIST
1807         AOJE D,CHIAK3           ;AND JUMP IF NOT ON TRANSMIT LIST
1808 IFN DLCP,[
1809         MOVEI Q,DLCXMQ          ;ON TRANSMIT LIST, TRY TO TAKE OFF
1810         PUSHJ P,CHIAKF
1811 ];DLCP
1812 IFN T11CHP,[
1813         MOVEI Q,T11XMQ
1814         PUSHJ P,CHIAKF
1815 ];T11CHP
1816 IFN CH10P+CH11P,[
1817         MOVEI Q,CHXXMQ
1818         PUSHJ P,CHIAKF
1819 ];CH10P+CH11P
1820         CAIA                    ;AND DON'T FREE IT
1821 CHIAK3:  PUSHJ P,CHABRT
1822         HRLM C,CHSOBF(I)
1823         SKIPE A,C
1824          JRST CHIAK1
1825         SETZM CHSOBF(I)         ;SEND LIST NOW EMPTY
1826 CHIAK2: MOVE D,CHSNOS(I)        ;COMPUTE NEW VALUE OF CHSNOS
1827         HRRZ T,CHSACK(I)        ;START OF WINDOW
1828         HRRZ C,CHSPKN(I)        ;LAST PACKET SENT
1829         SUB T,C
1830         SKIPLE T
1831          SUBI T,200000          ;T GETS NEGATIVE AMOUNT OF WINDOW OCCUPIED
1832         ADD T,CHSWIN(I)         ;RH(T) GETS AVAILABLE PORTION OF WINDOW
1833         HRREM T,CHSNOS(I)       ;WHICH IS NUMBER OF OUTPUT SLOTS
1834         JUMPG D,POPAJ           ;IF FORMERLY THERE WERE NO OUTPUT SLOTS,
1835         LDB T,[$CHSUO,,CHSUSR(I)]
1836         SKIPLE CHSNOS(I)        ;AND NOW THERE ARE,
1837          PUSHJ P,CHINT2         ;INTERRUPT ON THE OUTPUT CHANNEL
1838         JRST POPAJ
1839
1840 ;TRY TO TAKE PACKET IN A OFF OF TRANSMIT LIST IN Q.
1841 ;CLOBBER T,Q,D.  CALLED WITH INTERRUPTS OFF.
1842 ;MAY RETURN WITH A POINTING TO FREE BUT THAT IS OK AT THIS TIME.
1843 CHIKF1: SKIPA D,T
1844 CHIAKF:  MOVEI D,2(Q)           ;LH[-2(D)] POINTS TO (T)
1845         HLRZ T,-2(D)
1846         JUMPE T,CPOPJ           ;NOT FOUND
1847         CAIE T,(A)
1848          JRST CHIKF1
1849         HLRZ T,-2(A)            ;LINK OUT
1850         HRLM T,-2(D)
1851         JUMPN T,CHABRT          ;JUMP IF DIDN'T DELETE LAST PACKET IN LIST
1852         HRRM D,(Q)              ;NEW LAST PACKET IN LIST
1853         CAIN D,2(Q)
1854          SETZM (Q)              ;FOO, TRANSMIT LIST NOW EMPTY
1855         JRST CHABRT
1856 \f
1857 SUBTTL CHAOS NET DL10 INTERRUPT ROUTINE
1858
1859 OVHMTR CHH
1860
1861 IFN DLCP,[
1862
1863 ;COME HERE FROM EACH DL10 INTERRUPT AT TTY LEVEL.  SMASH ALL REGISTERS EXCEPT P AND 0.
1864 DLCWAK: CONI PI,E               ;SAVE PI STATUS AND SWITCH TO NETWORK INTERRUPT LEVEL
1865         ANDI E,177
1866         PUSH P,E
1867         CONO PI,NETOFF
1868 DLCWK1: MOVEI J,1               ;ALWAYS CHECK BOTH BUFFERS SO WE CAN'T GET OUT OF PHASE WITH 11
1869         MOVEI R,2               ;CHECK FOR INPUT AVAILABLE
1870         CAME R,DLCRS1(J)
1871          SOJGE J,.-1
1872         JUMPL J,DLCWK2
1873         MOVE A,DLCRA1(J)        ;GOT INPUT, PROCESS IT
1874         SETZM DLCRS1(J)         ;BUFFER SLOT NOT OCCUPIED NOW
1875 IFN KS10P, CLRCSH
1876 IFN KL10P, PUSHJ P,DLCSWP       ;SWEEP CACHE IN CASE ANYONE HAPPENED TO TOUCH BUFFER
1877         SKIPE A                 ;THIS CAN HAPPEN IF PDP11 WAS JUST STUFFED
1878          PUSHJ P,CHAPII         ;PROCESS THE PACKET
1879         PUSHJ P,DLCIBG          ;SUPPLY A NEW INPUT BUFFER TO 11
1880         JRST DLCWK1             ;TRY FOR MORE INPUT
1881
1882 DLCWK2: MOVEI J,1               ;SCAN CHANNELS FOR OUTPUT DONE
1883         CAME R,DLCSS1(J)
1884 DLCWK3:  SOJGE J,.-1
1885         JUMPL J,DLCWK4
1886         MOVE A,DLCSA1(J)        ;FOUND AN OUTPUT DONE BUFFER
1887         HRROS B,-2(A)           ;MARK IT NOT ON TRANSMIT LIST
1888         AOJN B,.+2              ;AND UNLESS IT IS ON SEND LIST
1889          PUSHJ P,CHABRT         ;RETURN IT TO FREE
1890         SETZM DLCSA1(J)         ;IDLE THIS BUFFER
1891         SETZM DLCSS1(J)
1892         JRST DLCWK3
1893
1894 DLCWK4: MOVE J,DLCSBF           ;TRY TO SEND SOME OUTPUT
1895         SKIPE DLCSS1(J)
1896          JRST DLCWK9            ;BUFFER BUSY
1897         HLRZ A,DLCXMQ           ;GET ANOTHER OFF TRANSMIT QUEUE
1898         JUMPE A,DLCWK9          ;QUEUE EMPTY
1899         HLRZ T,-2(A)
1900 IFN FTRCHK,[
1901         CAIN T,-1
1902          BUG PAUSE,[CHAOS LIST THREAD TRASHED],OCT,A,OCT,-2(A)
1903 ];FTRCHK
1904         HRLM T,DLCXMQ
1905 IFN FTRCHK,[
1906         JUMPN T,.+4
1907           CAME A,DLCXMQ         ;REACHED END OF LIST, END IN RIGHT PLACE?
1908            BUG PAUSE,[DCLXMQ THREAD TRASHED]
1909           SETZM DLCXMQ
1910 ];FTRCHK
1911 IFE FTRCHK,[
1912         SKIPN T
1913          SETZM DLCXMQ
1914 ];FTRCHK
1915         PUSHJ P,DLCXMT          ;SEND IT ON THIS BUFFER
1916         JRST DLCWK4             ;GO TRY TO SEND ON OTHER BUFFER
1917
1918 DLCWK9: POP P,E
1919         CONO PI,PICON(E)        ;RESTORE PI
1920         POPJ P,
1921 \f
1922 ;THIS ROUTINE SUPPLIES AN INPUT BUFFER TO THE 11 ON ALL BUFFERS THAT NEED IT
1923 ;CALL WITH INTERRUPTS OFF OR IN PROGRESS
1924 DLCIBG: MOVEI J,1
1925         SKIPE DLCRS1(J)
1926 DLCIB1:  SOJGE J,.-1
1927         JUMPL J,CPOPJ
1928         PUSHJ P,CHABGI          ;GET A BUFFER
1929          JRST [ SETZM DLCRA1(J) ;NO MEMORY, WILL TRY AGAIN AT CLOCK LEVEL
1930                 SETZM DLCRS1(J)
1931                 POPJ P, ]
1932         SETZM (A)               ;CLEAR THE BUFFER SINCE THE DL10 DOESN'T TOUCH LOW 4 BITS
1933         HRLZ T,A
1934         HRRI T,1(A)
1935         BLT T,%CPMXW-1(A)
1936         MOVEM A,DLCRA1(J)       ;MAKE AVAILABLE TO PDP11
1937         HRLI A,120000
1938         MOVEM A,DLCRP1(J)
1939         SOS DLCRP1(J)
1940 IFN KS10P, .ERR CLRCSH not needed here?
1941 IFN KL10P, PUSHJ P,DLCSWP       ;SWEEP CACHE BEFORE SIGNALLING 11
1942         MOVEI T,1
1943         MOVEM T,DLCRS1(J)
1944         CONO DLC,100040+TTYCHN  ;INTERRUPT 11
1945         JRST DLCIB1             ;TRY FOR OTHER BUFFER ALSO
1946
1947 ;THIS ROUTINE SENDS PACKET IN A TO DL10 (CALL WITH NETOFF OR IN PROGRESS)
1948 ;SWITCHES BUFFERS, LEAVES NEW ONE IN J
1949 DLCXMT: MOVE J,DLCSBF
1950         MOVEM A,DLCSA1(J)
1951         HRLI A,120000
1952         MOVEM A,DLCSP1(J)       ;GIVE 11 POINTER TO NEW PACKET
1953         SOS DLCSP1(J)
1954 IFN KS10P, .ERR CLRCSH not needed here?
1955 IFN KL10P, PUSHJ P,DLCSWP       ;SWEEP CACHE, PUTTING PACKET INTO CORE
1956         MOVEI T,1
1957         MOVEM T,DLCSS1(J)       ;ACTIVATE PDP11
1958         CONO DLC,100040+TTYCHN
1959         XORI J,1                ;NEXT BUFFER
1960         MOVEM J,DLCSBF
1961         POPJ P,
1962
1963 IFN KL10P,[
1964 ;THIS ROUTINE SWEEPS PACKET IN A OUT OF THE CACHE,
1965 ;CLOBBERING B, C, AND D.
1966 IFG PKTBSZ-1000, .ERR PKTBSZ BIGGER THAN HARDWARE PAGE SIZE, CACHE SWEEP LOSES
1967 DLCSWP: LDB D,[111100,,A]       ;SWEEP ONE PAGE OF CACHE
1968         SWPUO (D)               ;STORING PACKET INTO CORE
1969         MOVE B,[CONSZ 200000]   ;AWAIT COMPLETION IN ACS
1970         MOVE C,[JRST B]         ;TO MINIMIZE CACHE INTERFERENCE
1971         MOVSI D,(POPJ P,)
1972         JRST B
1973 ];KL10P
1974 ];DLCP
1975 \f
1976 SUBTTL CHAOS NET TEN-11 INTERFACE STUFF
1977
1978 IFN T11CHP,[
1979 ;THIS ROUTINE CHECKS FOR TEN-11 INITIALIZATION, SKIP-RETURNS IF OK TO USE
1980 ;CLOBBERS T,TT
1981 T11CHK: SKIPE TEN11F
1982          JRST T11LUZ            ;NOT SUPPOSED TO USE TEN11
1983         MOVE T,T11VER           ;CHECK VERSION TO MAKE SURE RIGHT PROGRAM, ETC.
1984         CAME T,[.BYTE 8 ? "H ? "C ? 0 ? 1]
1985          JRST T11LUZ            ;PROBABLY TURNED OFF OR WRONG PROGRAM
1986         SKIPE T11I10            ;SHOULD WE REINIT?
1987          JRST T11CK1            ;YES, GO DO SO
1988         SKIPLE T,T11WIN         ;ARE WE WINNING?
1989          JRST POPJ1             ;YES, FINE
1990         JUMPE T,[SETOM T11WIN   ;NOW THAT VERSION IS OK, TELL 11 TO INIT
1991                  MOVSI T,-1
1992                  MOVEM T,T11I11
1993                  JRST T11CK1 ]  ;AND INIT OURSELVES
1994         SKIPE T11I11            ;WAITING FOR 11 TO REINIT?
1995          POPJ P,                ;YES, WAIT
1996 ;HERE TO REINIT.  FIRST, PICK UP PARAMETERS.
1997 T11CK1: LDB TT,[242000,,T11PRM] ;BYTES PER PACKET BUFFER
1998         CAIGE TT,<%CPMXW+1>*4   ;BETTER BE RIGHT SIZE
1999          JRST T11LUZ            ;TOO SMALL (ASSUME IF TOO BIG, PACKETS WON'T BE)
2000         LSH TT,-2
2001         MOVEM TT,T11BSZ         ;SAVE BUFFER SIZE IN PDP10 WORDS
2002         LDB T,[042000,,T11PRM]  ;NUMBER OF BUFFERS IN EACH DIRECTION
2003         IMULB T,TT              ;NUMBER OF PDP10 WORDS IN EACH DIRECTION
2004         ADD TT,T11IBB
2005         MOVEM TT,T11IBE         ;INIT POINTERS
2006         MOVEM TT,T11OBB
2007         MOVEM TT,T11OBP
2008         ADD TT,T
2009         MOVEM TT,T11OBE
2010         HRREI T,-T11CHS-2000(TT)
2011         JUMPG T,T11LUZ          ;COMMUNICATION AREA LONGER THAN 1K
2012         MOVE T,T11IBB
2013         MOVEM T,T11IBP
2014 T11CK2: SETZM (T)               ;CLEAR BUFFER HEADERS
2015         ADD T,T11BSZ
2016         CAMGE T,TT
2017          JRST T11CK2
2018         MOVEM T,T11WIN          ;WE'RE WINNING (MAKE T11WIN POSITIVE NON-ZERO)
2019         SETZM T11I10            ;INIT DONE
2020         JRST POPJ1
2021
2022 ;HERE IF PDP11 PARAMETERS DON'T MATCH WHAT WE EXPECT
2023 T11LUZ: SETZM T11WIN            ;NOT WINNING
2024         POPJ P,
2025 \f
2026 ;HERE FROM CLOCK LEVEL TO CHECK ON TEN-11 CHAOS NET CHANNEL
2027 T11WAK: PUSHJ P,T11CHK          ;IS EVERYTHING OK?
2028          POPJ P,                ;NO.
2029 T11WK0: MOVE C,T11IBP           ;CHECK INPUT
2030         SKIPN (C)
2031          JRST T11WK1            ;NONE AVAILABLE
2032         MOVSI J,2(C)            ;POINT TO PACKET
2033         LDB D,[$CPKNB+2(C)]     ;GET SIZE OF PACKET
2034         ADDI D,4*%CPKDT+3       ;CONVERT BYTES TO WORDS INCLUDING HEADER
2035         LSH D,-2
2036         CAILE D,%CPMXW          ;DON'T GET FAKED OUT BY CLOBBERED COUNT
2037          MOVEI D,%CPMXW
2038         PUSHJ P,CHABGI          ;GET PLACE TO PUT IT
2039          JRST T11WK1            ;NONE AVAILABLE
2040         HRLOI E,-1(D)
2041         EQVI E,(A)              ;AOBJN POINTER TO PACKET BUFFER
2042         HRRI J,(A)              ;BLT POINTER TO COPY PACKET
2043         ADDI D,-1(A)            ;LAST WORD
2044         BLT J,(D)               ;COPY PACKET FROM 11 TO 10
2045         MOVEI H,0               ;COMPUTE CHECKSUM
2046 T11WK4: ADD H,(E)
2047         LSH H,-1
2048         TRZE H,10
2049          TLO H,(SETZ)
2050         AOBJN E,T11WK4
2051         MOVE TT,1(C)            ;GET PDP11'S CHECKSUM
2052         SETZM (C)               ;GIVE THE 11 BACK THE BUFFER
2053         ADD C,T11BSZ            ;ADVANCE THE POINTER
2054         CAML C,T11IBE
2055          MOVE C,T11IBB
2056         MOVEM C,T11IBP
2057         CAME H,TT
2058          JRST [ AOS T11CKE      ;COUNT CHECKSUM ERRORS
2059                 PUSHJ P,CHABRT  ;AND DISCARD PACKET
2060                 JRST T11WK0 ]
2061         CONO PI,NETOFF
2062         PUSHJ P,CHAPII          ;PROCESS THE INPUT
2063         CONO PI,NETON
2064         JRST T11WK0
2065
2066 T11WK1: CONO PI,NETOFF
2067         SKIPE T11XMQ            ;ANY OUTPUT?
2068          SKIPE @T11OBP          ;AND OUTPUT BUFFER SPACE AVAILABLE?
2069           JRST NETONJ           ;NO, RETURN FROM T11WAK
2070         HLRZ A,T11XMQ           ;GET PACKET OFF TRANSMIT QUEUE
2071         HLRZ B,-2(A)            ;GET NEXT AFTER THAT
2072         HRLM B,T11XMQ           ;BECOMES NEW HEAD OF QUEUE
2073         SKIPN B
2074          SETZM T11XMQ
2075         PUSHJ P,T11XMT          ;COPY PACKET INTO 11
2076         CONO PI,NETON
2077         JRST T11WK1             ;LOOK FOR MORE OUTPUT
2078
2079 ;SEND PACKET A-> TO 11.  SMASHES B,C,T,TT,Q.  CALL WITH NETOFF.
2080 T11XMT: LDB C,[$CPKNB(A)]       ;GET BYTE COUNT
2081         MOVE Q,C                ;MUST CLEAR UNUSED BYTES AT END OF LAST WORD
2082         ANDI Q,3                ;TO MAKE THE CHECKSUM COME OUT RIGHT
2083         ADDI C,4*%CPKDT+3
2084         LSH C,-2                ;CONVERT TO WORD COUNT
2085         MOVE Q,(Q)[ -1          ;MASK FOR BYTES TO RETAIN IN LAST WORD
2086                     <.BYTE 8 ? -1>
2087                     <.BYTE 8 ? -1 ? -1>
2088                     <.BYTE 8 ? -1 ? -1 ? -1> ]
2089         MOVEI TT,-1(C)
2090         ADD TT,A
2091         ANDM Q,(TT)             ;MASK OFF LAST WORD
2092         HRLOI C,-1(C)
2093         EQVI C,(A)              ;AOBJN PTR
2094         MOVEI TT,0              ;COMPUTE XOR CHECKSUM IN TT
2095         SKIPA B,T11OBP          ;-> CURRENT OUTPUT BUFFER IN 11
2096 T11XM1:  ADDI B,1
2097         MOVE T,(C)
2098         TRZ T,17                ;CLEAR BITS 10-11 TREATS SPECIALLY
2099         ADD TT,T                ;COMPUTE CHECKSUM
2100         LSH TT,-1
2101         TRZE TT,10
2102          TLO TT,(SETZ)
2103         MOVEM T,2(B)
2104         AOBJN C,T11XM1
2105         MOVE B,T11OBP
2106         MOVEM TT,1(B)           ;GIVE CHECKSUM TO 11
2107         MOVSI TT,-1
2108         MOVEM TT,0(B)           ;GIVE PACKET TO 11
2109         ADD B,T11BSZ            ;ADVANCE BUFFER POINTER
2110         CAML B,T11OBE
2111          MOVE B,T11OBB
2112         MOVEM B,T11OBP
2113         HRROS T,-2(A)           ;TAKE PACKET OFF TRANSMIT LIST
2114         AOJN T,.+2
2115          PUSHJ P,CHABRT         ;NOT ON SEND LIST, FREE IT
2116         POPJ P,
2117 ];T11CHP
2118 \f
2119 SUBTTL CH-10 INTERRUPT ROUTINES
2120
2121 ;THE GENERAL IDEA IS THAT WE INTERRUPT ON A LOW-PRIORITY INTERRUPT LEVEL,
2122 ;AND DO THE TIME-INTENSIVE PACKET COPYING AT THAT LEVEL.  THE GENERAL
2123 ;CHAOS ROUTINES ARE THEN CALLED WITH NETOFF.
2124
2125 IFN CH10P,[
2126
2127 EBLK
2128
2129 CHXACS: BLOCK 20
2130 CHXPDL: -60,,.
2131         BLOCK 60
2132
2133 CHXBRK: 0
2134 BBLK
2135         MOVEM 17,CHXACS+17
2136         MOVEI 17,CHXACS
2137         BLT 17,CHXACS+16
2138         MOVE P,CHXPDL
2139         CONSO CHX,CHXRCV        ;PACKET RECEIVED?
2140          JRST CHXBK5
2141         PUSHJ P,CHABGI          ;GET PLACE TO PUT PACKET
2142          JRST [ MOVEI T,CHXREN  ;NONE AVAILABLE, DISABLE INTR
2143                 ANDCAM T,CHXCNO
2144                 CONO CHX,@CHXCNO
2145                 JRST CHXBK5 ]
2146         CONSZ CHX,CHXCRC+CHXWLE ;CHECK FOR ERRORS
2147          JRST [ CONSZ CHX,CHXCRC
2148                  AOSA CHNCRC
2149                   AOS CHNWLE
2150                 JRST CHXBK4 ]   ;IGNORE PACKET
2151         DATAI CHX,T             ;FIRST DATAI YIELDS GARBAGE
2152         MOVEI T,CHXSWB          ;DISABLE BYTE SWAPPING
2153         ANDCAM T,CHXCNO
2154         CONO CHX,@CHXCNO
2155         HRLI A,-%CPKDT          ;READ HEADER
2156         DATAI CHX,(A)
2157         AOBJN A,.-1
2158         HRRZI A,-%CPKDT(A)
2159         PUSHJ P,CHSWAB          ;ENABLE BYTE SWAPPING IF NEEDED
2160         LDB T,[$CPKNB(A)]       ;GET SIZE OF PACKET
2161         CAILE T,%CPMXC          ;DON'T RUN OFF END OF BUFFER
2162          JRST CHXBK4
2163         ADDI T,3                ;ROUND UP TO NEXT WORD BOUNDARY
2164         LSHC T,-2               ;CONVERT BYTES TO WORDS, TT GETS REMAINDER
2165         HRLOI D,-1(T)           ;MAKE AOBJN POINTER
2166         EQVI D,%CPKDT(A)
2167         JUMPGE D,.+3            ;EMPTY PACKET BOUNDARY CASE
2168          DATAI CHX,(D)
2169          AOBJN D,.-1
2170         DATAI CHX,T             ;NOW READ AND IGNORE HARDWARE HEADER
2171         TLNE T+1,400000
2172          DATAI CHX,T            ;THIRD HALFWORD
2173         CONI CHX,T              ;CHECK FOR ERRORS
2174         TDNE T,[CHXPLE+CHXCRC+CHXOVR]
2175          JRST [ TLNE T,(CHXOVR)
2176                  JRST CHXBKZ    ;OVERRRUN CAN'T HAPPEN UNLESS HARDWARE BROKEN
2177                 TLNE T,(CHXPLE)
2178                  AOSA CHNPLE
2179                   TRNN T,CHXCRC
2180                    JRST CHXBK4
2181                 AOS CHNCR2
2182                 JRST CHXBK4 ]
2183         CONO PI,NETOFF-1
2184         PUSHJ P,CHAPII          ;PROCESS THE INPUT
2185         CONO PI,NETON-1
2186         CAIA
2187 CHXBK4:  PUSHJ P,CHABRT         ;DIDN'T USE BUFFER AFTER ALL
2188         CONI CHX,T              ;COUNT LOST PACKETS
2189         LDB T,[$CHXLC,,T]
2190         ADDM T,CHNLOS
2191         MOVEI T,CHXREN          ;ENABLE RECEIVER FOR NEXT PACKET
2192         IORB T,CHXCNO
2193         CONO CHX,CHXRCV(T)
2194 CHXBK5: CONSO CHX,CHXXMT        ;TRANSMIT DONE?
2195          JRST CHXBK9
2196         SKIPE T,CHOSTA          ;TRANSMIT IN PROGRESS?
2197          CONSO CHX,CHXABT       ;AND WAS ABORTED?
2198           JRST CHXBK7           ;NO TO EITHER, LOOK FOR MORE WORK
2199         AOS CHNABT              ;METER TRANSMIT ABORTS
2200         CAIL T,NCHRTR           ;ABORTED TOO MANY TIMES?
2201          JRST CHXBK7            ;DONE WITH PACKET
2202         AOS CHOSTA              ;COUNT RETRANSMISSIONS
2203         MOVEI T,CHXTEN
2204         IORB T,CHXCNO
2205         CONO CHX,CHXXMT(T)      ;RETRANSMIT PACKET
2206         JRST CHXBK9
2207
2208 CHXBK7: SETZM CHOSTA            ;TRANSMITTER IDLE, LOOK FOR NEXT PACKET
2209         CONO PI,PIOFF
2210         HLRZ A,CHXXMQ           ;ANYTHING QUEUED FOR TRANSMISSION?
2211         JUMPE A,[ MOVEI T,CHXTEN        ;DISABLE INTERRUPTS
2212                   ANDCAM T,CHXCNO
2213                   CONO CHX,@CHXCNO
2214                   CONO PI,PION
2215                   JRST CHXBK9 ]
2216         HLRZ B,-2(A)            ;CDR TRANSMIT QUEUE
2217         HRLM B,CHXXMQ
2218         SKIPN B
2219          SETZM CHXXMQ           ;QUEUE EMPTY NOW
2220         CONO PI,PION
2221         AOS CHOSTA              ;NOW SEND THIS PACKET
2222         MOVEI T,CHXHLF+CHXSWB   ;CLEAR HALFWORD, BYTE-SWAP MODES
2223         ANDCAM T,CHXCNO
2224         CONO CHX,@CHXCNO
2225         HRLI A,-%CPKDT          ;TRANSMIT HEADER
2226         DATAO CHX,(A)
2227         AOBJN A,.-1
2228         HRRZI A,-%CPKDT(A)
2229         PUSHJ P,CHSWAB          ;ENABLE BYTE SWAPPING IF NEEDED
2230         LDB T,[$CPKNB(A)]       ;GET SIZE OF PACKET
2231         ADDI T,1                ;ROUND UP TO NEXT HALF WORD BOUNDARY
2232         LSHC T,-2               ;CONVERT BYTES TO WORDS, T+1 GETS REMAINDER
2233         HRLOI D,-1(T)           ;MAKE AOBJN POINTER
2234         EQVI D,%CPKDT(A)
2235         JUMPGE D,.+3            ;EMPTY PACKET BOUNDARY CASE
2236          DATAO CHX,(D)
2237          AOBJN D,.-1
2238         MOVEI T,CHXHLF+CHXTEN   ;SWITCH TO HALFWORD MODE, ENABLE DONE INTR
2239         IORM T,CHXCNO
2240         CONO CHX,@CHXCNO
2241         TLNE T+1,400000         ;SEND EXTRA HALFWORD IF NEEDED
2242          DATAO CHX,(D)
2243         MOVEI T,CHXSWB          ;DISABLE SWAP BYTES MODE
2244         ANDCAM T,CHXCNO
2245         CONO CHX,@CHXCNO
2246         LDB T,[$CPKDN(A)]       ;GET DESTINATION SUBNET
2247         HRRZ D,SBNRUT(T)        ;GATEWAY TO THAT SUBNET
2248         CAIGE T,NSUBNT
2249          CAIN T,MYCHAD_-8       ;IF ON LOCAL CABLE
2250           LDB D,[$CPKDA(A)]     ;GO DIRECT
2251         LSH D,16.+4
2252         DATAO CHX,D             ;STORE HARDWARE DESTINATION ADDRESS
2253         MOVE T,CHXCNO           ;TRANSMIT PACKET
2254         CONO CHX,CHXXMT(T)
2255         CONI CHX,T
2256         TLNE T,(CHXOVR)         ;CAN'T HAPPEN UNLESS HARDWARE BROKEN
2257 CHXBKZ:  BUG HALT,[CHAOS: I/O BUS OVERRUN]
2258         HRROS B,-2(A)           ;MARK IT NOT ON TRANSMIT LIST
2259         AOJN B,.+2              ;AND UNLESS IT IS ON SEND LIST
2260          PUSHJ P,CHABRT         ;RETURN IT TO FREE
2261 CHXBK9: MOVSI 17,CHXACS         ;DISMISS INTERRUPT
2262         BLT 17,17
2263         JRST 12,@CHXBRK
2264
2265 CHSWAB: LDB T,[$CPKOP(A)]       ;DOES THIS PACKET NEED BYTE SWAPPING?
2266         TRNE T,200
2267          JRST [ TRNE T,100
2268                  POPJ P,        ;BINARY DATA
2269                 JRST CHSWB1 ]   ;CHARACTER DATA
2270         IDIVI T,40
2271         MOVE T,CHSWBT(T)
2272         LSH T,(T+1)
2273         JUMPL T,CPOPJ           ;BINARY CONTROL PACKET
2274 CHSWB1: MOVEI T,CHXSWB          ;CHARACTER, SWAP DEM BYTES
2275         IORM T,CHXCNO
2276         CONO CHX,@CHXCNO
2277         POPJ P,
2278
2279 CHSWBT: 1_<35.-%COOPN>+1_<35.-%COSTS>+1_<35.-%CORUT>
2280         0 ? 0 ? 0
2281 ];CH10P
2282 \f
2283 SUBTTL CH-11 INTERRUPT ROUTINES
2284
2285 ;The Unibus Chaosnet board interrupts on the same level as TTYs,
2286 ;and comes to CHXBKH via vectored interrupt.  We use a programmed
2287 ;interrupt request to drop down to a lower interrupt level for the
2288 ;slow packet-copying operation, so as not to interfere with the TTYs,
2289 ;then turn NETOFF when we call into the Chaosnet NCP.
2290 ;(We actually use NETOFF-1 and NETON-1 so as not to interfere with
2291 ;CLKOFF.  This assumes that interrupt levels between CLKCHN and
2292 ;CHXCHN are never turned off.)
2293
2294 IFN CH11P,[
2295
2296 ;;; Macros that will eventually be instructions
2297
2298 DEFINE PACK16 AC,E              ;AC,AC+1 right-aligned and zero-filled
2299         LSH AC,16.
2300         IOR AC,AC+1
2301         LSH AC,4
2302         MOVEM AC,E
2303 TERMIN
2304
2305 DEFINE PACK8 AC,E               ;AC: ...B2B1  AC+1: ...B4B3 zero-filled!!
2306         ROTC AC,-8              ;B3...B2 B1...B4
2307         ROT AC,-16.             ;B1,B2,B3 in position, B4 right-aligned
2308         ADDI AC+1,(AC+1)        ;Shift RH(AC+1) left 4 bits
2309         ADDI AC+1,(AC+1)
2310         ADDI AC+1,(AC+1)
2311         ADDI AC+1,(AC+1)        ;B1,B4 in position in AC+1
2312         IOR AC,AC+1
2313         MOVEM AC,E
2314 TERMIN
2315
2316 DEFINE UNPK16 AC,E              ;Doesn't bother masking off garbage bits
2317         MOVE AC,E
2318         MOVE AC+1,AC
2319         ROT AC,16.              ;First halfword right-aligned
2320         LSH AC+1,-4             ;Second halfword right-aligned
2321 TERMIN
2322
2323 DEFINE UNPK8 AC,E
2324         MOVE AC,E               ;B1B2B3B4...
2325         ROT AC,8                ;B2B3B4...B1
2326         MOVE AC+1,AC
2327         AND AC,[377_2,,377]     ;...B3...B1 zero-filled
2328         ROT AC+1,16.            ;B4...B1B2B3
2329         AND AC+1,[377_12,,377_8];B4...B2... zero-filled
2330         IORB AC,AC+1            ;B4B3...B2B1
2331         ROT AC+1,16.            ;...B4B3, garbage in high bits
2332 TERMIN
2333
2334 EBLK
2335
2336 CHXACS: BLOCK 20
2337 CHXSVH: 0
2338 CHXPDL: -60,,.
2339         BLOCK 60
2340
2341 CHXBKH: 0                       ;Hardware interrupt on TTYCHN comes here
2342 BBLK
2343         CONO PI,CHXRQ           ;Redirect to lower interrupt level
2344         MOVEM T,CHXSVH          ;Clear hardware interrupt enable
2345         MOVEI T,%CAREN+%CATEN   ; so the Chaos board will stop interrupting
2346         ANDCAB T,CHXCSR
2347         IOWRI T,CAICSR
2348         MOVE T,CHXSVH
2349         JRST 12,@CHXBKH
2350 EBLK
2351
2352 CHXBRK: 0                       ;Software interrupt on CHXCHN comes here
2353 BBLK
2354         CONO PI,020000+200_<-CHXCHN>    ;BAG-BITING DEC LOSERS
2355         MOVEM 17,CHXACS+17
2356         MOVEI 17,CHXACS
2357         BLT 17,CHXACS+16
2358         MOVE P,CHXPDL
2359         IORDI T,CAICSR          ;Check for received packet
2360         TRNN T,%CARDN
2361          JRST CHXBK3            ;No incoming packet yet
2362         TRNE T,%CAERR           ;Check for error in received packet
2363          JRST [ AOS CHNCRC
2364                 JRST CHXBK1 ]   ;Ignore packet
2365         IORDI R,CAIRBC          ;Number of bits in packet - 1
2366         SUBI R,31.              ;Exclude the three extra hardware words
2367         TRNE R,17
2368          JRST [ AOS CHNWLE      ;Length not a multiple of 16
2369                 JRST CHXBK1 ]
2370         ASH R,-5                ;32-bit word count, rounded up
2371         PUSHJ P,CHABGI          ;Get place to put packet
2372          JRST [ AOS CHNLOS      ;No buffers, lose this packet
2373                 JRST CHXBK1 ]
2374         HRLI A,-%CPKDT          ;Copy out the packet header
2375 CHSRC1: IORDI B,CAIRBF
2376         IORDI C,CAIRBF
2377         PACK16 B,(A)
2378         AOBJN A,CHSRC1
2379         PUSHJ P,CHSHDR          ;Decode the header
2380          JRST CHSRC4            ;No byte swapping
2381         JUMPGE D,CHSRC3
2382 CHSRC2: IORDI B,CAIRBF          ;Read out the data, byte-swapped
2383         IORDI C,CAIRBF
2384         PACK8 B,(D)
2385         AOBJN D,CHSRC2
2386 CHSRC3: JUMPGE H,CHSRC7         ;Jump if even packet length
2387         IORDI B,CAIRBF          ;Residual halfword
2388         SETZ C,                 ;Somebody depends on zero here
2389         PACK8 B,(D)
2390         AOJA D,CHSRC7
2391
2392 CHSRC4: JUMPGE D,CHSRC6
2393 CHSRC5: IORDI B,CAIRBF          ;Read out the data, halfwords
2394         IORDI C,CAIRBF
2395         PACK16 B,(D)
2396         AOBJN D,CHSRC5
2397 CHSRC6: JUMPL H,[ IORDI B,CAIRBF        ;Residual halfword
2398                   SETZ C,               ;Somebody depends on zero here
2399                   PACK16 B,(D)
2400                   AOJA D,CHSRC7 ]
2401 CHSRC7: SUB D,R                 ;AOBJN pointer minus number of words in packet
2402         CAIE A,(D)
2403          JRST [ AOS CHNPLE      ;Packet length disagrees with hardware length
2404                 JRST CHXBK2 ]
2405         IORDI T,CAIRBF          ;Read the three hardware header words
2406         IORDI T,CAIRBF
2407         IORDI T,CAIRBF
2408         IORDI T,CAICSR
2409         TRNE T,%CAERR           ;Make sure packet came out of RAM okay
2410          JRST [ AOS CHNCR2      ;Garbage, try again
2411                 JRST CHXBK2 ]
2412         IORDI T,CAIRBC          ;Make sure counter didn't spazz
2413         CAIE T,7777
2414          JRST [ AOS CHNSPZ
2415                 JRST CHXBK2 ]
2416         CONO PI,NETOFF-1        ;Get to network interrupt level
2417         PUSHJ P,CHAPII          ;Process the input
2418         CONO PI,NETON-1
2419 CHXBK1: IORDI T,CAICSR          ;Count lost packets
2420         LDB TT,[$CALOS,,T]
2421         ADDM TT,CHNLOS
2422         MOVE TT,CHXCSR
2423         IORI TT,%CARCL          ;Enable receiver for next packet
2424         IOWRI TT,CAICSR
2425 CHXBK3: TRNN T,%CATDN           ;Transmit done?
2426          JRST CHXBK8            ;No, dismiss
2427         SKIPN TT,CHOSTA         ;Transmit in progress?
2428          JRST CHXBK7            ;No, look for something to transmit
2429         TRNN T,%CATAB           ;Yes, was it aborted?
2430          JRST CHXBK5            ;No, we're done with that packet
2431         AOS CHNABT              ;Meter transmit aborts
2432         CAIGE TT,NCHRTR         ;Aborted too many times?
2433          JRST CHXBK7            ;No, retransmit it
2434 CHXBK5: CONO PI,PIOFF           ;Lock transmit list
2435         HLRZ A,CHXXMQ           ;Get packet probably being transmitted now
2436         JUMPE A,[ CONO PI,PION  ;It vanished?
2437                   JRST CHXBK6 ]
2438         HLRZ B,-2(A)            ;CDR transmit queue
2439         HRLM B,CHXXMQ
2440         SKIPN B
2441          SETZM CHXXMQ           ;Queue empty now
2442         CONO PI,PION
2443         HRROS B,-2(A)           ;Mark it not on transmit list
2444         AOJN B,CHXBK6           ;And unless it is on send list
2445          PUSHJ P,CHABRT         ;Return it to free
2446 CHXBK6: SETZM CHOSTA            ;Transmitter idle, look for next packet
2447 CHXBK7: HLRZ A,CHXXMQ           ;Anything queued for transmission?
2448         JUMPE A,CHXBK9          ;No, leave interrupts disabled
2449         AOS CHOSTA              ;Count retransmissions
2450         MOVE T,CHXCSR           ;Reset transmitter
2451         IORI T,%CATDN
2452         IOWRI T,CAICSR
2453         HRLI A,-%CPKDT          ;Transmit header
2454 CHXXM1: UNPK16 B,(A)
2455         IOWRI B,CAIWBF
2456         IOWRI C,CAIWBF
2457         AOBJN A,CHXXM1
2458         PUSHJ P,CHSHDR          ;Decode the header
2459          JRST CHXXM4            ;No byte swapping
2460         JUMPGE D,CHXXM3
2461 CHXXM2: UNPK8 B,(D)             ;Transmit data with byte swapping
2462         IOWRI B,CAIWBF
2463         IOWRI C,CAIWBF
2464         AOBJN D,CHXXM2
2465 CHXXM3: JUMPGE H,CHXXM7         ;Jump if even packet length
2466         UNPK8 B,(D)             ;Transmit residual bytes
2467         IOWRI B,CAIWBF
2468         JRST CHXXM7
2469
2470 CHXXM4: JUMPGE D,CHXXM6
2471 CHXXM5: UNPK16 B,(D)            ;Transmit data with byte swapping
2472         IOWRI B,CAIWBF
2473         IOWRI C,CAIWBF
2474         AOBJN D,CHXXM5
2475 CHXXM6: JUMPGE H,CHXXM7         ;Jump if even packet length
2476         UNPK16 B,(D)            ;Transmit residual bytes
2477         IOWRI B,CAIWBF
2478 CHXXM7: LDB T,[$CPKDN(A)]       ;Get destination subnet
2479         HRRZ D,SBNRUT(T)        ;Gateway to that subnet
2480         CAIGE T,NSUBNT
2481          CAIN T,MYCHAD_-8       ;If on local cable,
2482           LDB D,[$CPKDA(A)]     ; go direct
2483         IOWRI D,CAIWBF          ;Store hardware destination address
2484         IORDI T,CAIXMT          ;Transmit packet
2485 CHXBK8: MOVEI A,%CATEN          ;Enable transmit-done interrupt if xmitting
2486 CHXBK9: IORI A,%CAREN           ;Enable receive-done interrupt always
2487         IORB A,CHXCSR
2488         IOWRI A,CAICSR
2489         MOVSI 17,CHXACS         ;Dismiss software interrupt
2490         BLT 17,17
2491         JRST 12,@CHXBRK
2492
2493 CHXBK2: PUSHJ P,CHABRT          ;Packet no good, discard it
2494         JRST CHXBK1
2495
2496 ;Examine packet in A, return AOBJN pointer to data in D,
2497 ; H is negative if there is an extra halfword after that.
2498 ; W gets number of full words of data (same as LH D).
2499 ; T,U get clobbered
2500 ; Returns:
2501 ;       +1  16-bit data
2502 ;       +2  8-bit data
2503 CHSHDR: HRRZI A,-%CPKDT(A)      ;Restore packet address
2504         LDB W,[$CPKNB(A)]       ;Get size of packet in bytes
2505         CAILE W,%CPMXC
2506          MOVEI W,%CPMXC         ;Self-defense
2507         ADDI W,1                ;Round up to next word boundary
2508         LSHC W,-2               ;Convert bytes to words, H gets remainder
2509         HRLOI D,-1(W)           ;Make AOBJN pointer
2510         EQVI D,%CPKDT(A)
2511         LDB T,[$CPKOP(A)]       ;Does this packet need byte swapping?
2512         TRNE T,200
2513          JRST [ TRNN T,100
2514                  AOS (P)        ;Character data
2515                 POPJ P, ]       ;Binary data
2516         IDIVI T,40
2517         MOVE T,CHSWBT(T)
2518         LSH T,(T+1)
2519         JUMPL T,CPOPJ           ;Binary control packet
2520         JRST POPJ1              ;Characters
2521
2522 CHSWBT: 1_<35.-%COOPN>+1_<35.-%COSTS>+1_<35.-%CORUT>
2523         0 ? 0 ? 0
2524 ];CH11P
2525 \f
2526 SUBTTL CHAOS NET BUFFER LIST STUFF
2527
2528 OVHMTR CHL
2529
2530 ;BUFFERS ARE PKTBSZ WORDS LONG; 2 HEADER WORDS AND %CPMXW PACKET WORDS.
2531 ;PKTBSZ IS A POWER OF 2 AND LESS THAN 1K (MEMORY PAGE SIZE).
2532 ;NOTE THAT A BUFFER ADDRESS POINTS AT THE FIRST PACKET WORD
2533 ;AND THE HEADER WORDS ARE AT NEGATIVE ADDRESSES.
2534 ;FIRST HEADER WORD:  -2(A)
2535 ;       RH LIST THREAD FOR MOST LISTS, 0=END, -1=NOT ON LIST
2536 ;       LH LIST THREAD FOR TRANSMIT LIST
2537 ;SECOND HEADER WORD: -1(A)
2538 ;       TIME RECEIVED OR TIME PUT ON TRANSMIT LIST
2539 ;       OR VALUE OF I FOR A PACKET ON THE LSN QUEUE
2540 ;       ASCII/LUNCH/ FOR A PACKET ON THE FREE LIST
2541
2542 ;I DO IT THIS WAY (PIOFF) TO AVOID HAVING TO PUSH AND POP PI STATUS,
2543 ;CONO PI,NETOFF CAN LOSE AT INTERRUPT LEVEL (MAINLY THE NETON LOSES)
2544
2545 ;THESE ROUTINES TURN OFF INTERRUPTS MOMENTARILY SO THAT
2546 ;LISTS MAY BE SAFELY MANIPULATED.
2547
2548 ;Q POINTS TO THE HEADER WORD OF A QUEUE, REMOVE THE FIRST
2549 ;THING AND RETURN IN A.  (ZERO IF NONE)  CLOBBERS T
2550 CHAQGF: CONO PI,PIOFF
2551         HLRZ A,(Q)              ;GET FIRST
2552         JUMPE A,PIONJ           ;EMPTY
2553         HRRZ T,-2(A)            ;GET SECOND
2554         HRLM T,(Q)              ;MAKE FIRST
2555 IFN FTRCHK,[
2556         JUMPN T,PIONJ
2557         HRRZ T,(Q)
2558         CAIE T,(A)
2559          BUG PAUSE,[CHAOS LIST TRASHED],OCT,Q
2560         SETZM (Q)               ;IS NOW EMPTY
2561 ];FTRCHK
2562 IFE FTRCHK,[
2563         SKIPN T
2564          SETZM (Q)              ;IS NOW EMPTY
2565 ];FTRCHK
2566         CONO PI,PION
2567         POPJ P,
2568
2569 ;RETURN BUFFER INTO WHICH THE BYTE POINTER IN A POINTS.  CLOBBERS A,T,Q
2570 CHBPFR: SUBI A,1                ;SIOKT LIKES TO MAKE BP POINT AT NEXT BUFFER
2571         ANDI A,-PKTBSZ
2572         ADDI A,2
2573         JRST CHABRT
2574
2575 ;RETURN BUFFER POINTED TO BY A TO FREE UNLESS ON TRANSMIT LIST.
2576 CHABR1: HLLOS T,-2(A)           ;RH GETS -1, NO LONGER ON REGULAR LIST
2577         AOJN T,CPOPJ            ;EXIT IF STILL ON TRANSMIT LIST
2578         ;DROPS THROUGH
2579 ;RETURN BUFFER POINTED BY A TO FREE STORAGE.  CLOBBERS T, Q.
2580 CHABRT: MOVEI Q,CHQFRE
2581 IFN FTRCHK,[
2582         SKIPN A
2583          BUG PAUSE,[FREEING 0]
2584 ];FTRCHK
2585         MOVE T,[ASCII/LUNCH/]   ;TANSTAAFL
2586         MOVEM T,-1(A)
2587         SETOM -2(A)             ;NOT ON TRANSMIT LIST NOW (THIS IS WHAT INITS
2588         AOS CHFRBF              ; LH[-2(A)] WHEN BUFFER FIRST CREATED)
2589         ;JRST CHAQPL            ;DROPS THROUGH
2590
2591 ;A POINTS TO A BUFFER, Q TO A QUEUE.  PUT IT ON AS THE LAST THING.  BASHES T.
2592 CHAQPL: HLLZS -2(A)             ;PUT ENDLIST IN RH
2593         CONO PI,PIOFF
2594         HRRZ T,(Q)              ;GET LAST
2595         HRRM A,(Q)              ;MAKE NEW LAST
2596         JUMPN T,[HRRM A,-2(T)   ;MAKE A COME AFTER IT
2597                  JRST PIONJ ]
2598         HRLM A,(Q)              ;WAS EMPTY, ALSO IS NEW FIRST
2599         CONO PI,PION
2600         POPJ P,
2601
2602 ;A POINTS TO A BUFFER, Q TO A QUEUE.  PUT IT ON AS THE FIRST THING.  SMASHES T.
2603 CHAQPF: CONO PI,PIOFF
2604         HLRZ T,(Q)              ;GET FIRST
2605         HRRM T,-2(A)            ;MAKE SECOND
2606         HRLM A,(Q)              ;MAKE NEW FIRST
2607         SKIPN T
2608          HRRM A,(Q)             ;WAS EMPTY, ALSO MAKE NEW LAST
2609         CONO PI,PION
2610         POPJ P,
2611 \f
2612 ;ALLOCATE A BUFFER AT MAIN PROGRAM LEVEL, TO A, MASHES T, TT, Q, B.
2613 CHABG0: PUSHJ P,UDELAY          ;WAIT FOR MEMORY
2614 CHABGT: PUSHJ P,CHABGI
2615          JRST CHABG0
2616         POPJ P,                 ;WIN
2617         
2618 ;ALLOCATE A BUFFER, RETURN POINTER TO IT IN A, SKIP.  BLOWS AWAY T, TT, Q.
2619 ;NON-SKIP IF NO BUFFERS AVAILABLE.  (DOESN'T MAKE NEW ONES IF FREE LIST EMPTY)
2620 CHABAL: MOVEI Q,CHQFRE
2621         PUSHJ P,CHAQGF
2622         JUMPE A,CPOPJ
2623         SETZM -1(A)             ;NO LUNCH
2624         SOS CHFRBF
2625         JRST POPJ1
2626
2627 ;ALLOCATE A BUFFER TO A, MAKE NEW IF NONE FREE.   OBLITERATES T,Q,B.
2628 ;NON-SKIP IF CAN'T GET MEMORY.  (SUITABLE FOR CALLING FROM INT LEVEL)
2629 CHABGI: PUSHJ P,CHABAL          ;TRY TO ALLOCATE A BUFFER FROM FREE LIST
2630          CAIA
2631           JRST POPJ1            ;WON, RETURN
2632         CONI PI,Q               ;SAVE PI CHANNELS ON STATUS
2633         ANDI Q,177
2634         CONO PI,UTCOFF          ;MAKE THE WORLD SAFE FOR IOMQ
2635         MOVE B,CHTTBF
2636         CAIL B,CHMXBF           ;MAKE SURE NOT TO USE UP ALL CORE
2637          JRST CHABG4
2638         PUSHJ P,IOMQ            ;GET 1K OF MEMORY
2639          JRST CHABG3            ;MEM NOT AVAILABLE, FAIL
2640         CONO PI,PICON(Q)        ;WON, RESTORE PI STATUS
2641         MOVEI B,MUCHA
2642         DPB B,[MUR,,MEMBLT(A)]
2643         LSH A,10.               ;ADDRESS OF 1K OF ALLOCATED MEMORY
2644         ADD A,[-<2000/PKTBSZ>,,2]       ;-BUFFERS PER 1K,,OFFSET TO HEADER
2645 CHABG2: PUSHJ P,CHABRT          ;PUT THEM ALL ON FREE LIST
2646         ADDI A,PKTBSZ-1
2647         AOBJN A,CHABG2
2648         MOVEI B,<2000/PKTBSZ>   ;THIS MANY MORE BUFFERS HAVE BEEN CREATED
2649         ADDM B,CHTTBF
2650         JRST CHABGI             ;NOW GO ALLOCATE ONE
2651
2652 ;HERE IF CHAOS NET TRYING TO USE UP TOO MUCH CORE
2653 CHABG4: MOVE B,CHMXTM   ;DON'T COMPLAIN TOO OFTEN
2654         ADDI B,60.*30.  ;JUST ONCE A MINUTE
2655         CAMLE B,TIME
2656          JRST CHABG3
2657 IFE CH10P, BUG CHECK,[CHAOS NET ATTEMPTING TO USE TOO MUCH CORE]
2658 IFN CH10P,[
2659         CONI CHX,B
2660         BUG CHECK,[CHAOS NET ATTEMPTING TO USE TOO MUCH CORE, CONI=],OCT,B,[CONO=],OCT,CHXCNO,[CHOSTA=],OCT,CHOSTA
2661 ];CH10P
2662         MOVE B,TIME
2663         MOVEM B,CHMXTM
2664 CHABG3: CONO PI,PICON(Q)        ;LOST, RESTORE PI STATUS
2665         POPJ P,                 ;AND TAKE ERROR RETURN
2666
2667 ;FREE A WHOLE LIST OF BUFFERS, Q-> HEAD.  DESTROYS A,T
2668 CHALFR: PUSHJ P,CHAQGF
2669         JUMPE A,CPOPJ
2670         PUSH P,Q
2671         PUSHJ P,CHABR1          ;FREE UNLESS STILL ON TRANSMIT LIST
2672         POP P,Q
2673         JRST CHALFR
2674
2675 ;Q -> A TRANSMIT QUEUE, FLUSH ALL BUFFERS BELONGING TO INDEX I.
2676 ;CLOBBERS A,B,C,T
2677 CFLXMQ: PUSH P,Q
2678         CONO PI,NETOFF          ;DON'T LET TRANSMIT LIST CHANGE (AT ALL)
2679         HLRZ A,(Q)              ;HEAD OF TRANSMIT LIST
2680         JUMPE A,CFLXM3
2681         MOVEI B,2(Q)            ;B PREVIOUS PACKET, A CURRENT, C NEXT
2682 CFLXM1: HLRZ C,-2(A)            ;GET THREAD TO NEXT
2683 IFN FTRCHK,[
2684         CAIN C,-1
2685          JRST 4,.               ;CLAIMS NOT TO BE ON LIST?
2686 ];FTRCHK
2687         LDB T,[$CPKSX(A)]       ;GET THIS PACKET'S INDEX
2688         CAME T,I
2689          JRST CFLXM2
2690         HRLM C,-2(B)            ;THREAD PREVIOUS TO NEXT
2691         HRROS T,-2(A)           ;IF THIS BUFFER IS NOT ALSO ON SEND LIST,
2692         AOJN T,.+2
2693          PUSHJ P,CHABRT         ;RETURN IT
2694         SKIPA Q,(P)
2695 CFLXM2:  MOVE B,A
2696         SKIPE A,C
2697          JRST CFLXM1
2698         HRRM B,(Q)              ;LAST PACKET ON LIST MAY HAVE CHANGED
2699         CAIN B,2(Q)
2700          SETZM (Q)              ;TRANSMIT QUEUE IS NOW EMPTY
2701 CFLXM3: POP P,Q
2702         JRST NETONJ
2703 \f
2704 ;SEARCH LIST IN Q FOR PACKET WHOSE CONTACT NAME MATCHES THAT
2705 ;OF PACKET IN A, RETURN IT IN B, SKIPPING IF WINNING.  CLOBBERS T,TT,C,D,E,H,J.
2706 ;THE PACKET RETURNED IN B IS DE-LINKED FROM THE SEARCHED QUEUE.
2707 ;HAS TO BE CALLED WITH NETOFF OR IN PROGRESS, SO LIST CAN'T GET MUNGED.
2708 ;I HOPE IT'S NOT TOO BLETCHEROUSLY SLOW.
2709 CHAQSR: HLRZ B,(Q)              ;GET START OF LIST TO SEARCH
2710         JUMPE B,CPOPJ           ;EMPTY, LOSE
2711         MOVEI J,0               ;PACKET PREVIOUS TO B
2712 CHAQS1: LDB C,[$CPKNB(A)]       ;SET UP STRING COMPARE LOOP
2713         LDB H,[$CPKNB(B)]       ;THIS ASSUMES NO ZERO-LENGTH STRINGS
2714         MOVEI D,%CPKDT(A)
2715         HRLI D,440800
2716         MOVEI E,%CPKDT(B)
2717         HRLI E,440800
2718 CHAQS2: ILDB T,D
2719         ILDB TT,E               ;DON'T IGNORE CASE, THAT WOULD JUST SLOW THIS
2720         CAME T,TT               ;BAG-BITER DOWN EVEN MORE.  EVERYONE SHOULD
2721          JRST CHAQS4            ;PUT THEIR CONTACT NAMES IN UPPER-CASE.
2722         CAIN T,40               ;TERMINATE ON SPACE
2723          JRST CHAQS5
2724         SOJLE C,CHAQS3
2725         SOJG H,CHAQS2
2726         ILDB T,D
2727         CAIE T,40
2728          JRST CHAQS4
2729 CHAQS5: HRRZ C,-2(B)            ;WON, DELINK PACKET FROM LIST
2730         JUMPE J,[ HRLM C,(Q)
2731                   JUMPN C,POPJ1
2732          IFN FTRCHK,[
2733                   HRRZ C,(Q)    ;CHECK LIST ENDING IN RIGHT PLACE
2734                   CAIE C,(B)
2735                    JRST 4,.
2736                 ];FTRCHK
2737                   SETZM (Q)
2738                   JRST POPJ1 ]
2739         HRRM C,-2(J)
2740         JUMPN C,POPJ1
2741         HRRM J,(Q)              ;TOOK LAST PACKET, STORE NEW LAST
2742         JRST POPJ1
2743
2744 CHAQS3: SOJLE H,CHAQS5
2745         ILDB TT,E
2746         CAIN TT,40
2747          JRST CHAQS5
2748 CHAQS4: MOVE J,B                ;THIS ONE DOESN'T MATCH, TRY NEXT
2749         HRRZ B,-2(B)
2750         JUMPN B,CHAQS1
2751         POPJ P,                 ;NO MATCHES
2752
2753 ;THIS ROUTINE RUNS IN THE CORE JOB AND CLEANS UP MEMORY USED BY CHAOS BUFFERS
2754 ;SMASHES ALL ACS
2755 CHCLN:  SKIPE A,CHTTBF          ;SEE IF 2/3 OR MORE OF BUFFERS FREE
2756          SKIPN B,CHFRBF
2757           POPJ P,               ;NO BUFFERS OR NONE FREE, NOTHING TO DO
2758         SUBM A,B
2759         IDIV A,B                ;GET RATIO OF TOTAL TO USED
2760         CAIGE A,3               ;NOTE IF B IS ZERO A IS UNCHANGED
2761          POPJ P,                ; AND AT LEAST 32.
2762 IFL TSYSM-256., MOVEI D,TSYSM-1 ;SCAN MEMORY FOR CHAOS BUFFER PAGES
2763 .ELSE   MOVEI D,255.
2764 CHCLN0: LDB A,[MUR,,MEMBLT(D)]
2765         CAIE A,MUCHA
2766 CHCLN4:  SOJGE D,CHCLN0
2767         JUMPL D,CPOPJ
2768         MOVE A,D                ;QUICKLY DETERMINE IF ANY NON-FREE BUFFERS
2769         LSH A,10.               ; ON THIS PAGE
2770         HRLI A,-<2000/PKTBSZ>
2771         MOVE T,[ASCII/LUNCH/]
2772 CHCLN5: CAME T,1(A)
2773          JRST CHCLN4            ;NOT FREE, DON'T BOTHER WITH SLOW STUFF
2774         ADDI A,PKTBSZ-1
2775         AOBJN A,CHCLN5
2776         SETZB C,CHCLNQ          ;COLLECT ALL FREE BUFFERS THAT ARE ON THIS PAGE
2777         MOVE E,CHFRBF           ;LOOP ABOUT AS MANY TIMES AS THERE ARE FREE BUFFERS
2778 CHCLN1: PUSHJ P,CHABAL          ;GET NEXT FREE BUFFER
2779         JUMPE A,CHCLN2
2780         LDB B,[121000,,A]
2781         CAMN B,D
2782          JRST [ MOVEI Q,CHCLNQ  ;THIS ONE'S ON THE PAGE, SAVE IT
2783                 PUSHJ P,CHAQPL
2784                 AOJA C,.+2 ]    ;COUNT THEM
2785           PUSHJ P,CHABRT        ;NOT ON THE PAGE, PUT BACK
2786         SOJG E,CHCLN1
2787 CHCLN2: CAIE C,<2000/PKTBSZ>    ;DID WE GET THE WHOLE PAGE?
2788          JRST [ MOVEI Q,CHCLNQ ? PUSHJ P,CHALFR ? JRST CHCLN4 ]
2789         MOVNS C                 ;YES, GET RID OF THESE BUFFERS
2790         ADDM C,CHTTBF
2791         MOVE A,D
2792         PUSHJ P,MEMR
2793         JRST CHCLN
2794
2795 OVHMTR CHZ