359deea0d6124882443b06a3c285088348a5e56d
[its.git] / system / chaos.288
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 2 of the
6 ;;; License, or (at your option) any later version.
7 ;;;
8 ;;; This program is distributed in the hope that it will be useful,
9 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
10 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 ;;; General Public License for more details.
12 ;;;
13 ;;; You should have received a copy of the GNU General Public License
14 ;;; along with this program; if not, write to the Free Software
15 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
16
17 IFE IMPP, IFE CH11P, .ERR NOT EVERYTHING IN CHAOS WILL WORK WITHOUT IMP
18 IFNDEF FTRCHK, FTRCHK==0 ;PROBABLY FOUND ALL THE BUGS THIS WAS GOOD FOR
19                          ; LONG AGO
20 IFN FTRCHK, .ERR REDUNDANT CHECKING ENABLED IN CHAOS ROUTINES
21
22 ;NOTES:
23 ; WINDOW SIZE ADJUSTMENT STUFF
24 ; ROUND TRIP TIME MEASUREMENT & OTHER METERING
25 ; BETTER METERING, SOME METERS ARE CURRENTLY MISSING
26
27 SUBTTL CH-10 HARDWARE DEFINITIONS
28
29 IFN CH10P,[
30 CHX==470        ;I/O DEVICE NUMBER
31
32 ;CONI/CONO BITS
33                 ;1.1-1.3 PIA
34 CHXTEN==10      ;1.4 TRANSMIT INTERRUPT ENABLE
35 CHXREN==20      ;1.5 RECEIVE INTERRUPT ENABLE
36 CHXSPY==40      ;1.6 MATCH ANY DESTINATION
37 CHXLUP==100     ;1.7 LOOP BACK
38 CHXSWB==200     ;1.8 SWAP BYTES
39 CHXHLF==400     ;1.9 HALFWORD DATAO
40 CHXXMT==1000    ;2.1 TRANSMIT DONE (CONI)
41                 ;    TRANSMIT OR RETRANSMIT PACKET (CONO)
42 CHXRCV==2000    ;2.2 RECEIVE DONE (CONI)
43                 ;    ENABLE TO RECEIVE NEXT PACKET (CONO)
44 CHXABT==4000    ;2.3 TRANSMIT ABORTED (CONI)
45                 ;    RESET TRANSMITTER (CONO)
46 $CHXLC==140400  ;2.4-2.7 LOST COUNT (CONI)
47 CHXRST==10000   ;2.4 RESET (CONO)
48 CHXCRC==200000  ;2.8 CRC ERROR (CONI)
49 CHXWLE==400000  ;2.9 WORD LENGTH ERROR (CONI)
50 CHXPLE==1,,     ;3.1 PACKET LENGTH ERROR (CONI)
51 CHXOVR==2,,     ;3.2 OVERRUN (CONI)
52 $CHXAD==242000  ;3.3-4.9 CHAOSNET ADDRESS (CONI)
53 ];CH10P
54
55 IFN CH11P,[
56 $INSRT KSNET
57 ];CH11P
58 \f
59 SUBTTL CHAOS NET VARIABLES
60
61 EBLK
62
63 $CHXRI==001200          ;REAL INDEX PART (LOW TEN BITS) -  IS IN LH(IOCHNM)
64 $CHXUN==120600          ;UNIQUIZATION PART (TOP SIX BITS)
65 CHXMUN==1_6-1           ;MAXIMUM VALUE OF UNIQUIZER
66 MXWIND==100             ;MAXIMUM WINDOW SIZE (8K WORDS)
67 .SEE MYCHAD             ;SUBNET AND HOST OF MYSELF
68 .SEE DLCP               ;1 MEANS USE DL10 TO GET TO CHAOS NET
69 .SEE T11CHP             ;1 MEANS USE TEN-11 INTERFACE TO GET TO CHAOS NET
70 .SEE CH10P              ;1 MEANS USE CH10 HARDWARE TO GET TO CHAOS NET
71 .SEE CH11P              ;1 MEANS USE UNIBUS CHAOSNET HARDWARE ON KS10
72
73 ;Internet address of my Chaosnet Interface
74 IMPUS4==<.BYTE 4 ? 0 ? .BYTE 8 ? 128. ? 31. ? .BYTE 16. ? MYCHAD>
75
76 ;PER-INDEX VARIABLES
77
78 CHSUSR: REPEAT NINDX,-1         ;-1 INDEX NOT IN USE
79                                 ;OTHERWISE RH USER
80  $CHSUO==220600                 ;3.1-3.6 OUTPUT CHANNEL NUMBER (77=IOPUSHED)
81  $CHSUI==300600                 ;3.7-4.3 INPUT CHANNEL NUMBER (77=IOPUSHED)
82                                 ;4.9 ZERO IF IN USE
83
84 CHSSTA: REPEAT NINDX,-1         ;RH STATE, LH FLAGS
85  %CF==525252(1)
86  %CFOFF==400000 ;SIGN BIT MEANS TURNED OFF AT PI LEVEL, NO TALKING TO NETWORK
87  %CFSTS==200000 ;SEND STS PACKET AS SOON AS POSSIBLE (1/2 SECOND CLOCK)
88  %CFCLS==100000 ;HALF-CLOSED FLAG
89  %CFSTY==040000 ;DIRECT-CONNECTED TO STTY FLAG
90  $CFTTN==220600 ;TTY NUMBER OF STTY CONNECTED TO
91
92  %CS==,,-1
93    .SEE %CSCLS  ;FOR SYMBOLS FOR STATES
94
95 CHSNBF: BLOCK NINDX             ;LH LENGTH(CHSPBF), RH LENGTH(CHSIBF)
96 CHSNOS: BLOCK NINDX             ;NUMBER OF FREE OUTPUT SLOTS IN THE WINDOW
97 CHSIBF: BLOCK NINDX             ;RECEIVE BUFFER POINTERS FIRST,,LAST
98 CHSPBF: BLOCK NINDX             ;OUT OF ORDER RECEIVE BUFFER POINTERS FIRST,,LAST
99 CHSOBF: BLOCK NINDX             ;TRANSMIT BUFFER POINTERS FIRST,,LAST
100 CHSITM: BLOCK NINDX             ;TIME OF LAST INPUT FROM NET
101 CHSWIN: BLOCK NINDX             ;WINDOW SIZE RECEIVE,,TRANSMIT
102 CHSPKN: BLOCK NINDX             ;LAST PACKET# GIVEN TO USER,,LAST PACKET# SENT BY USER
103 CHSACK: BLOCK NINDX             ;LAST PACKET# ACKNOWLEDGED RECEIVE,,TRANSMIT (START OF WINDOW)
104 CHSLCL: REPEAT NINDX,<.BYTE 16. ? MYCHAD ? 100000+.RPCNT>
105                                 ;BYTE (16) LOCAL HOST, LOCAL INDEX (4) 0
106                                 ;NOTE THIS SAVES THE UNIQUIZER BITS FOR THIS INDEX
107 CHSFRN: BLOCK NINDX             ;BYTE (16) FOREIGN HOST, FOREIGN INDEX (4) 0
108 ;THESE FOUR ARE FOR BYTE-STREAM I/O
109 CHSOBP: BLOCK NINDX             ;BYTE PNTR TO OUTPUT BUFFER, 0 IF NONE
110 CHSOBC: BLOCK NINDX             ;BYTE COUNT, NUMBER OF BYTE SPACES LEFT IN OUTPUT BUFFER
111 CHSIBP: BLOCK NINDX             ;BYTE PNTR TO INPUT BUFFER, 0 IF NONE
112 CHSIBC: BLOCK NINDX             ;BYTE COUNT, NUMBER OF VALID BYTES REMAINING IN INPUT BUFFER
113
114 CHAOSW: -1 ? 0  ;SWITCH FOR ALLOCATING INDICES
115 CHALCP: 0       ;LAST INDEX ALLOCATED, USED TO CIRCULARIZE ALLOCATION
116
117 CHIRFJ: SIXBIT/CHAOS/ ? 0       ;AGENT OF CHAOS
118 .SEE NETUSW ;NON-ZERO ENABLES RFC'S FROM HOSTS OTHER THAN SELF.
119 \f
120 ;METERS
121
122 CHNPI:  0       ;NUMBER OF PACKETS INPUT (REALLY TO 10)
123 CHNPO:  0       ;NUMBER OF PACKETS OUTPUT (ALL CAUSES)
124 CHNPF:  0       ;NUMBER OF PACKETS FORWARDED 
125 CHNSTS: 0       ;NUMBER OF STS PACKETS OUTPUT
126 CHNSNS: 0       ;NUMBER OF SNS PACKETS OUTPUT
127 CHNRTR: 0       ;NUMBER OF RETRANSMITTED PACKETS OUTPUT
128 CHNPFL: 0       ;NUMBER OF PACKETS DISCARDED (FORWARDING LOOP)
129 CHNPD:  0       ;NUMBER OF PACKETS DISCARDED (DUPLICATES)
130 CHNIPI: 0       ;NUMBER OF INTERNET PACKETS IN FROM CHAOSNET
131 CHNIPO: 0       ;NUMBER OF INTERNET FRAGMENTS OUT TO CHAOSNET
132
133 ;BUFFER QUEUES.  EACH HAS A ONE-WORD HEADER, WHICH IS ZERO
134 ;IF IT IS EMPTY, OR CONTAINS FIRST,,LAST BUFFER ADDRESS.
135
136 CHQFRE: 0       ;FREE LIST
137 CHQRFC: 0       ;PENDING RFCS
138 CHQLSN: 0       ;PENDING LISTENS
139 CHCLNQ: 0 .SEE CHCLN
140
141 CHFRBF: 0       ;NUMBER OF FREE BUFFERS
142 CHTTBF: 0       ;TOTAL NUMBER OF BUFFERS
143 IF2 CHMXBF==50.*<1024./<%CPMXW+2>>      ;MAX CORE FOR CHAOS NET 50K
144 CHMXTM: 0       ;TIME OF LAST COMPLAINT ABOUT USING TOO MUCH CORE
145
146 IFN T11CHP,[
147 ;VARIABLES FOR TEN-11 INTERFACE CONNECTING TO CHAOS NET
148
149 .SEE T11CHS     ;EXEC ADDRESS OF PDP11 COMMUNICATION AREA
150 T11VER=T11CHS   ;VERSION NUMBER
151 T11I10=T11CHS+1 ;INIT 10
152 T11I11=T11CHS+2 ;INIT 11
153 T11PRM=T11CHS+3 ;.WORD BUFFER SIZE, # BUFFERS
154                 ;THEN 4 SPARE DOUBLEWORDS
155 T11IBB: T11CHS+8        ;BEGINNING OF INPUT BUFFERS
156 T11IBE: 0               ;END OF INPUT BUFFERS
157 T11IBP: 0               ;POINTER TO NEXT INPUT BUFFER
158 T11OBB: 0               ;BEGINNING OF OUTPUT BUFFERS
159 T11OBE: 0               ;END OF OUTPUT BUFFERS
160 T11OBP: 0               ;POINTER TO NEXT OUTPUT BUFFER
161 T11BSZ: 0               ;BUFFER SIZE IN PDP10 WORDS
162 T11WIN: 0               ;1 WINNING, -1 HAVE TOLD 11 TO INIT, 0 NOT WINNING
163 T11XMQ: 0               ;QUEUED TRANSMISSION QUEUE
164 T11CKE: 0               ;COUNT OF CHECKSUM ERRORS
165 ;THE FIRST 32-BIT WORD OF A BUFFER IS 0 IF IDLE, OR
166 ;NON-ZERO IF BUFFER IS TO BE SENT TO OTHER MACHINE.
167 ;THE SECOND 32-BIT WORD IS THE CHECKSUM, WHICH IS
168 ;COMPUTED BY ADDING ALL THE 32-BIT WORDS, IGNORING OVERFLOW,
169 ; AND LOGICALLY SHIFTING RIGHT ONE BIT AFTER EACH ADD; BITS SHIFTED
170 ; OUT ON THE RIGHT ARE BROUGHT BACK IN ON THE LEFT.
171 ;IF THE NUMBER OF 16-BIT WORDS IS ODD, THE LEFT-OVER ONE BETTER BE 0.
172 ];T11CHP
173
174 IFN DLCP,[
175 ;VARIABLES FOR INTERFACE TO CHAOS NET ON PDP11 ON DL10
176 ;.SEE INDICATES A VARIABLE SHARED BETWEEN 10 AND 11
177 ;NOTE THAT THE DL10 HARDWARE LIMITS PACKET LENGTH TO 256 WORDS (1K BYTES)
178
179 .SEE DLCINI     ;WHEN THE 11 SEES THIS NON-ZERO, IT KNOWS ITS HAS
180                 ; BEEN RELOADED AND RESETS ITS PACKET POINTER TO 0
181                 ; AND CLEARS DLCINI.
182 DLCSBF: 0       ;CURRENT BUFFER, 10 SEND SIDE (1 OR 0)
183
184 DLCSA1: 0       ;ADDRESS OF PACKET BEING SENT
185 DLCSA2: 0       ;DITTO, SECOND BUFFER
186 .SEE DLCSP1     ;POINTER USED BY PDP11 TO COPY PACKET (16-BIT BYTES)
187 .SEE DLCSP2     ;DITTO, SECOND BUFFER
188 .SEE DLCSS1     ;STATE FOR BUFFER 1, 0 IDLE, 1 SENT TO 11, 2 11 DONE
189 .SEE DLCSS2     ;STATE FOR BUFFER 2
190
191 DLCRA1: 0       ;ADDRESS OF PACKET BUFFER RECEIVING A PACKET
192 DLCRA2: 0       ;DITTO, SECOND BUFFER
193 .SEE DLCRP1     ;POINTER USED BY PDP11 TO COPY PACKET (16-BIT BYTES)
194 .SEE DLCRP2     ;DITTO, SECOND BUFFER
195 .SEE DLCRS1     ;STATE FOR BUFFER 1, 0 IDLE, 1 AWAITING 11, 2 CONTAINS A PACKET
196 .SEE DLCRS2     ;STATE FOR BUFFER 2
197
198 DLCXMQ: 0       ;TRANSMIT BUFFER LIST FOR DL10
199                 ;NOTE THAT THIS IS NOT A REGULAR BUFFER LIST SINCE
200                 ;IT IS THREADED THROUGH LH INSTEAD OF RH.  WE DO MAINTAIN
201                 ;POINTERS TO FIRST,,LAST HOWEVER
202 ];DLCP
203
204 IFN CH10P,[
205 ;VARIABLES FOR CH10 INTERFACE ONLY
206
207 CHXCNO: CHXREN+CHXTEN+CHXCHN    ;CONO BITS CURRENTLY IN EFFECT
208 ];CH10P
209
210 IFN CH11P,[
211 ;VARIABLES FOR CH11 INTERFACE ONLY
212
213 CHXCSR: %CAREN+%CATEN           ;CURRENT BITS WANTED IN CSR
214 ];CH11P
215
216 IFN CH10P+CH11P,[
217 ;VARIABLES THAT WOULD OTHERWISE BE IN THE FRONT-END
218
219 CHXXMQ: 0       ;HEAD,,TAIL OF TRANSMIT QUEUE
220 CHOSTA: 0       ;OUTPUT STATUS: 0 IDLE, ELSE NUMBER OF TRANSMISSIONS
221 NCHRTR==4       ;TRANSMIT UP TO 4 TIMES IN FACE OF COLLISIONS
222
223 ;ROUTING STUFF
224 NSUBNT==122.    ;122 is maximum possible
225 SBNRUT: REPEAT NSUBNT, 1000,,3040       ;COST,,GATEWAY ADDRESS
226
227 ;EXTRA METERS
228 CHNABT: 0       ;NUMBER OF TRANSMIT ABORTS
229 CHNCRC: 0       ;NUMBER OF CRC ERRORS BEFORE READING PACKET
230 CHNCR2: 0       ;NUMBER OF CRC ERRORS AFTER READING PACKET
231 CHNWLE: 0       ;NUMBER OF WORD LENGTH ERRORS (NOT MULTIPLE OF 16 BITS)
232 CHNPLE: 0       ;NUMBER OF PACKET LENGTH ERRORS (DISAGREES WITH LENGTH IN HEADER)
233 CHNLOS: 0       ;NUMBER OF PACKETS LOST DUE TO RECEIVER BUSY
234 ];CH10P+CH11P
235 IFN CH11P,[
236 CHNSPZ: 0       ;NUMBER OF TIMERS BIT COUNTER SPAZZED
237 ];CH11P
238
239 BBLK
240 \f
241 ;Get definitions of packet format
242
243 IF1,[
244 $INSRT CHSDEF
245
246 PKTBSZ==%CPMXW+2        ;PACKET BUFFER IS 2 HEADER WORDS + MAX SIZE PACKET
247 IFN <PKTBSZ&<-PKTBSZ>>-PKTBSZ, .ERR PKTBSZ IS SUPPOSED TO BE A POWER OF 2
248
249 $CPKSX==$CHXRI+40000,,2 ;REAL PART OF SOURCE INDEX
250 $CPKDX==$CHXRI+40000,,1 ;REAL PART OF DESTINATION INDEX
251
252 ];IF1
253
254 ;;; Debugging Info
255
256 ;;; This contains the last N headers received from the network
257 NRECHD==20
258 EBLK
259 RECHDP: RECHDR          ;POINTER TO NEXT
260 RECHDR: BLOCK NRECHD*%CPKDT
261 BBLK
262 \f
263 SUBTTL CHAOS NET OPEN (.CALL CHAOSO)
264
265 ;.CALL CHAOSO,RCVCHN,XMTCHN,<RECEIVE,,TRANSMIT>
266
267 CHASO:  JRST OPNL12             ; Say "mode not avail"
268 CHAOSO: HRRZS A
269         HRRZS B
270         CAIGE A,20
271          CAIL B,20
272           JRST OPNL14           ;BAD CHANNEL NUMBER ARGUMENT
273         CAMN A,B
274          JRST OPNL33            ;BOTH CHANNELS SAME IS ILLEGAL
275         PUSH P,A                ;SAVE ARGS, CLOSE THE SPECIFIED CHANNELS
276         PUSH P,B
277         PUSH P,C
278         MOVE R,A
279         ADDI R,IOCHNM(U)
280         PUSHJ P,CCLOSE
281         MOVE R,-1(P)            ;B
282         ADDI R,IOCHNM(U)
283         PUSHJ P,CCLOSE
284         POP P,C
285         POP P,B
286         POP P,A
287         MOVE U,USER             ;TO SAVE ULCERS
288         HRRZM A,UUAC(U)         ;REMEMBER INPUT CHNL # FOR ERRS
289         PUSHJ P,SWTL            ;LOCK CHAOS INDEX ASSIGNMENT SWITCH
290             CHAOSW
291         MOVE I,CHALCP           ;ALLOCATE AN INDEX
292         SOJL I,CHASO2
293 CHASO1: SKIPL CHSUSR(I)
294          SOJGE I,CHASO1
295         JUMPGE I,CHASO3
296 CHASO2: MOVEI I,NINDX           ;REACHED BEGINNING, WRAP AROUND TO END
297         CAMN I,CHALCP
298          JRST OPNL6             ;ALL INDICES IN USE
299         MOVEM I,CHALCP
300         SOJA I,CHASO1
301
302 CHASO3: MOVEM I,CHALCP          ;SAVE SCAN POINTER FOR NEXT TIME
303         PUSHJ P,CHASO4          ;INIT VARIOUS STUFF
304         CAILE C,MXWIND          ;SET UP WINDOW SIZE
305          MOVEI C,MXWIND         ;DON'T LET USER USE UP TOO MUCH WIRED CORE
306         HRLZM C,CHSWIN(I)
307         HRRZM U,CHSUSR(I)       ;VARIABLES INITIALIZED, MAKE INDEX IN USE.
308         DPB A,[$CHSUI,,CHSUSR(I)]
309         DPB B,[$CHSUO,,CHSUSR(I)]
310         HRLZ T,I                ;SET UP USER'S IOCHNM WORDS
311         HRRI T,CHAIDN
312         ADDI A,IOCHNM(U)
313         MOVEM T,(A)
314         HRRI T,CHAODN
315         ADDI B,IOCHNM(U)
316         MOVEM T,(B)
317         JRST LSWPJ1             ;SUCCESS RETURN
318
319 ;INITIALIZE CONNECTION IN I
320 CHASO4: SETZM CHSNBF(I)
321         SETZM CHSNOS(I)
322         SETZM CHSIBF(I)
323         SETZM CHSPBF(I)
324         SETZM CHSOBF(I)
325         SETZM CHSACK(I)
326         SETZM CHSPKN(I)         ;START PACKET NUMBERING AT ONE
327         SETZM CHSOBP(I)
328         SETZM CHSOBC(I)
329         SETZM CHSIBP(I)
330         SETZM CHSIBC(I)
331         MOVSI T,%CFOFF .SEE %CSCLS
332         MOVEM T,CHSSTA(I)
333         LDB TT,[$CHXUN+40000,,CHSLCL(I)]
334         CAIE TT,CHXMUN          ;INCREMENT THE UNIQUIZER
335          AOSA TT
336           MOVEI TT,1            ;BUT MAKE SURE IT ISN'T ZERO
337         DPB TT,[$CHXUN+40000,,CHSLCL(I)]
338         SETZM CHSFRN(I)
339         POPJ P,
340 \f
341 SUBTTL CHAOS NET CLOSE, FINISH, WHYINT, NETBLK, CHAOSQ
342
343 ;CLOSE A CHAOS CHANNEL.
344 CHACLS: HLRZ I,(R)              ;GET VARIABLES INDEX
345         MOVSI A,%CFCLS
346         TDNN A,CHSSTA(I)        ;ONLY REALLY CLOSE WHEN BOTH CHANNELS CLOSED
347          JRST CHACS7
348         PUSHJ P,CHACS1          ;FLUSH ALL BUFFERS OF THIS CONNECTION
349         HRRZ T,CHSSTA(I)
350         CAIN T,%CSOPN
351          PUSHJ P,CHABGI         ;SEND A CLS IF OPEN AND MEM AVAIL
352           JRST CHACS4
353         MOVE T,CHSFRN(I)
354         MOVEM T,%CPKS(A)
355         MOVE T,CHSLCL(I)
356         MOVEM T,%CPKD(A)
357         MOVEI B,[ASCIZ/Channel closed/]
358         PUSHJ P,CHIRF2
359 CHACS4: CONO PI,NETOFF
360         SETZM (R)               ;CLOSE THIS CHANNEL
361         SETOM CHSUSR(I)         ;RETURN INDEX
362         MOVE W,CHQLSN           ;FLUSH ANY PENDING LSN PACKET
363         SETZM CHQLSN
364 CHACS5: MOVEI Q,W               ;GET NEXT PACKET OFF OLD LIST
365         PUSHJ P,CHAQGF
366         JUMPE A,NETONJ          ;EXHAUSTED
367         LDB B,[$CPKSX(A)]       ;GET OWNER
368         CAME B,I
369          JRST [ MOVEI Q,CHQLSN  ;NOT THIS INDEX, PUT BACK
370                 PUSHJ P,CHAQPL
371                 JRST CHACS5 ]
372         PUSHJ P,CHABRT          ;FREE
373         JRST CHACS5
374
375 CHACS7: IORM A,CHSSTA(I) .SEE %CFCLS
376         HRRZ B,(R)              ;GET DIRECTION
377         CAIN B,CHAIDN           ;AS A BYTE POINTER TO CHANNEL NUMBER
378          SKIPA B,[$CHSUI,,CHSUSR(I)]
379           MOVE B,[$CHSUO,,CHSUSR(I)]
380         MOVEI T,77              ;CLOSE THAT CHANNEL
381         DPB T,B
382         SETZM (R)
383         POPJ P,
384
385 ;THIS FLUSHES ALL BUFFERS FOR CONNECTION IN I
386 CHACS1: MOVSI A,%CFOFF          ;INHIBIT RETRANSMISSIONS
387         IORB A,CHSSTA(I)
388         LDB E,[$CFTTN,,CHSSTA(I)]
389         EXCH E,I
390         TLNE A,%CFSTY
391          PUSHJ P,NSTYN0         ;DISCONNECT FROM STY
392           JFCL
393         EXCH E,I
394 IFN DLCP,[
395         MOVEI Q,DLCXMQ          ;REMOVE THIS INDEX'S BUFFERS FROM DL10 TRANSMIT LIST
396         PUSHJ P,CFLXMQ
397 ];DLCP
398 IFN T11CHP,[
399         MOVEI Q,T11XMQ          ;REMOVE THIS INDEX'S BUFFERS FROM TEN11 TRANSMIT LIST
400         PUSHJ P,CFLXMQ
401 ];T11CHP
402 IFN CH10P+CH11P,[
403         MOVEI Q,CHXXMQ          ;REMOVE THIS INDEX'S BUFFERS FROM CH10 TRANSMIT LIST
404         PUSHJ P,CFLXMQ
405 ];CH10P+CH11P
406         MOVEI Q,CHSIBF(I)       ;RETURN RECEIVE BUFFERS
407         PUSHJ P,CHALFR
408         MOVEI Q,CHSPBF(I)       ;RETURN OUT OF ORDER RECEIVE BUFFERS
409         PUSHJ P,CHALFR
410         MOVEI Q,CHSOBF(I)       ;RETURN TRANSMIT BUFFERS
411         PUSHJ P,CHALFR
412 IFE FTRCHK,[
413         SKIPE A,CHSOBP(I)       ;RETURN STREAM I/O BUFFERS
414          PUSHJ P,CHBPFR
415         SKIPE A,CHSIBP(I)
416          PUSHJ P,CHBPFR
417 ];FTRCHK
418 IFN FTRCHK,[
419         SKIPN A,CHSOBP(I)
420          JRST .+3
421           SETZM CHSOBP(I)
422           PUSHJ P,CHBPFR
423         SKIPN A,CHSIBP(I)
424          JRST .+3
425           SETZM CHSIBP(I)
426           PUSHJ P,CHBPFR
427 ];FTRCHK
428         POPJ P,
429 \f
430 ;.CALL FORCE ON A CHAOS OUTPUT CHANNEL.
431 CHAFRC: HLRZ I,(R)
432         SKIPGE CHSSTA(I) .SEE %CFOFF
433          JRST OPNL7             ;DEVICE NOT READY
434         AOS (P)                 ;WILL TAKE SUCCESS RETURN
435 CHAFC1: SKIPN A,CHSOBP(I)
436          POPJ P,                ;NO BUFFERED OUTPUT TO BE FORCED
437         SUBI A,1                ;SIOKT LIKES TO POINT BP AT NEXT BUFFER
438         ANDI A,-PKTBSZ          ;GET PACKET POINTER
439         ADDI A,2
440         MOVSI T,(SETZ)          ;DATA OPCODE
441         MOVEM T,(A) .SEE $CPKOP
442         MOVEI T,%CPMXC          ;SET BYTE COUNT
443         SUB T,CHSOBC(I)
444         DPB T,[$CPKNB(A)]
445         PUSHJ P,[JUMPN T,CHODT1 ;IF THERE IS ANYTHING IN THE BUFFER, TRANSMIT IT
446                  JRST CHABRT ]  ;OTHERWISE, JUST THROW IT AWAY
447         SETZM CHSOBP(I)         ;NOW THERE IS NO BUFFER
448         SETZM CHSOBC(I)
449         POPJ P,
450
451 ;.CALL FINISH ON A CHAOS OUTPUT CHANNEL.  WAIT FOR ALL BUFFERS
452 ;ON SEND LIST TO GET SENT AND ACKNOWLEDGED.
453 ;HANGS FOREVER IF SOCKET GETS INTO AN IMPROPER STATE, BUT YOU SHOULD GET AN INTERRUPT
454 CHAFIN: HLRZ T,(R)
455         PUSHJ P,[HRRZ A,CHSWIN(T)
456                  CAMG A,CHSNOS(T)
457                   AOS (P)
458                  POPJ P, ]
459          PUSHJ P,UFLS
460         JRST POPJ1
461
462 ;.CALL WHYINT ON A CHAOS CHANNEL.
463 ;RESULTS ARE:   A/ %WYCHA
464 ;               B/ STATE
465 ;               C/ LH NUMBER OF INPUT PACKETS AVAILABLE
466 ;                  RH NUMBER OF OUTPUT SLOTS AVAILABLE
467 ;               D/ WINDOW SIZE (RECEIVE,,TRANSMIT)
468 ;               E/ INPUT CHNL#,,OUTPUT CHNL#
469 CHAWHY: HLRZ I,(R)
470         MOVEI A,%WYCHA
471         HRRZ B,CHSSTA(I)
472         HRLZ C,CHSNBF(I)        ;NUMBER OF PACKETS AVAILABLE
473         SKIPE CHSIBP(I)
474          ADD C,[1,,]            ;ADD 1 IF PARTIALLY-READ INPUT BUFFER EXISTS
475         MOVSI D,%CFSTY
476         TDNE D,CHSSTA(I)
477          MOVEI C,0              ;NO INPUT AVAILABLE IF DIRECT-CONNECTED
478         SKIPLE CHSNOS(I)
479          HRR C,CHSNOS(I)
480         MOVE D,CHSWIN(I)
481         LDB E,[$CHSUO,,CHSUSR(I)]
482         CAIN E,77
483          MOVEI E,-1
484         LDB T,[$CHSUI,,CHSUSR(I)]
485         CAIN T,77
486          TLOA E,-1
487           HRL E,T
488         JRST POPJ1
489
490 ;.CALL RFNAME on a CHAOS channel.  A contains index.
491 ;Returns results analogous to RFNAME on TCP: and (almost) RFNAME on NET:.
492 ;"FN1" is local index, "FN2" is foreign index, "SNAME" is foreign host
493 ;number in HOSTS3 format.
494 CHARCH: LDB B,[042000,,CHSLCL(A)]
495         LDB C,[042000,,CHSFRN(A)]
496         LDB D,[242000,,CHSFRN(A)]
497         TLO D,(NW%CHS)
498         POPJ P,
499
500 ;IOPDL ROUTINES.  I IS 0 FOR IOPUSH, 1 FOR IOPOP.  R POINTS AT IOCHNM WORD.
501 ;C(R) IS SET UP TO THIS DEVICE IN EITHER CASE.
502 CHAIOP: HRRZ T,R                ;DISCOVER CHANNEL NUMBER
503         SUBI T,IOCHNM(U)
504         SKIPN I
505          MOVEI T,77             ;IOPUSH, USE 77
506         HLRZ I,(R)              ;GET CHAOS INDEX
507         HRRZ B,(R)              ;GET DIRECTION
508         CAIN B,CHAIDN           ;AS A BYTE POINTER TO CHANNEL NUMBER
509          SKIPA B,[$CHSUI,,CHSUSR(I)]
510           MOVE B,[$CHSUO,,CHSUSR(I)]
511         DPB T,B                 ;ADJUST SAVED CHANNEL NUMBER
512         POPJ P,
513 \f
514 ;.CALL NETBLK ON A CHAOS CHANNEL.
515 ;ARG 1 - CHANNEL (COMES IN IN R)
516 ;ARG 2 - UNDESIRED STATE
517 ;ARG 3 - OPTIONAL TIMEOUT, WRITTEN BACK UNLESS IMMEDIATE
518 ;VAL 1 - NEW STATE
519 ;VAL 2 - TIME LEFT
520 CHANBK: HRRZ T,(R)
521         CAIL T,CHAIDN
522          CAILE T,CHAODN
523 IFN NCPP,  JRST ANETBL          ;NOT A CHAOS CHANNEL, TRY ARPANET
524 IFE NCPP,  JRST OPNL34
525         HLRZ I,(R)
526         MOVE T,I                ;SAVE INDEX IN T FOR FLSINS
527         CAIGE W,3
528          JRST [ HRLOI D,377777  ;NO TIME GIVEN, USE INFINITY
529                 JRST CHANB4 ]
530         TLNE C,1000             ;SKIP IF POINTER RATHER THAN IMMEDIATE
531          JRST [ HRRZ D,C        ;GET IMMEDIATE TIME
532                 ADD D,TIME
533                 JRST CHANB4 ]
534         XCTR XRW,[MOVES D,(C)]  ;GET TIME, CHECK WRITEABILITY
535         JUMPGE D,[ MOVNS D      ;RELATIVE TIME, MAKE NEGATIVE ABSOLUTE
536                    SUB D,TIME
537                    JRST .+1 ]
538         UMOVEM D,(C)            ;STORE BACK ABSOLUTE TIME
539         MOVNS D                 ;MAKE POSITIVE
540 CHANB4: MOVEM D,AC0S+D(U)       ;SAVE ABSOLUTE TIME TO WAIT UNTIL
541         MOVEM B,AC0S+B(U)       ;SAVE UNDESIRED STATE
542         PUSHJ P,CHANB2          ;SKIP IF STATE CHANGE OR TIMEOUT
543          PUSHJ P,UFLS
544         MOVE B,D
545         SUB B,TIME              ;HOW MUCH USED?
546         HRRZ A,CHSSTA(I)        ;NEW STATE
547         JRST POPJ1
548
549 CHANB2: HRRZ A,CHSSTA(T)        ;CURRENT STATE
550         CAME A,AC0S+B(U)        ;SKIP IF STILL MATCH
551          JRST POPJ1
552         MOVE A,AC0S+D(U)        ;TIMEOUT TIME
553         CAMG A,TIME
554          AOS (P)
555         POPJ P,
556
557 ;.CALL CHAOSQ
558 ;ARG 1 - ADDRESS OF A %CPMXW-WORD PACKET BUFFER
559 ;FINDS THE FIRST PACKET ON THE PENDING-RFC QUEUE, COPIES IT
560 ;INTO THE USER'S BUFFER, AND RETURNS IT TO THE QUEUE.
561 CHAOSQ: MOVE C,A                ;SAVE POINTER TO USER'S BUFFER
562         HRL A,A                 ;MAKE SURE USER'S BUFFER IS SWAPPED IN
563         XCTR XBRW,[BLT A,%CPMXW-1(C)]   ;AND NO MAR BREAK SET
564         MOVEI Q,CHQRFC          ;GET FIRST PACKET ON RFC QUEUE
565         PUSHJ P,CHAQGF
566         JUMPE A,OPNL4           ;QUEUE IS EMPTY
567         PUSHJ P,CHAQPL          ;PUT BACK AT END OF QUEUE
568         HRL C,A                 ;COPY PACKET TO USER
569         MOVE T,C
570         XCTR XBW,[BLT T,%CPMXW-1(C)]
571         JRST POPJ1
572 \f
573 SUBTTL CHAOS NET IOT ROUTINES
574
575 ;.CALL PKTIOT.  ARG1 CHANNEL, ARG2 ADDRESS OF %CPMXW-WORD BUFFER
576 PKTIOT: HRRZ A,(R)
577         CAIN A,CHAODN
578          JRST CHPKO
579         CAIE A,CHAIDN
580          JRST OPNL34            ;WRONG TYPE DEVICE
581 ;CHAOSNET INPUT PKTIOT
582 ;B POINTS TO %CPMXW-WORD PACKET BUFFER
583 CHPKI:  PUSHJ P,CHAIOS          ;SET UP I, E
584         HLRZ A,CHSIBF(I)        ;GET FIRST RECEIVE BUFFER
585         JUMPE A,[PUSHJ P,CHPKI0 ;LIST EMPTY
586                  JRST CHPKI ]
587         HRL B,A                 ;COPY TO USER BEFORE REMOVING FROM LISTS
588         LDB T,[$CPKNB(A)]       ;GET SIZE OF PACKET
589         ADDI T,4*%CPKDT+3       ;HEADER PLUS ROUND-UP TO NEXT WORD BOUNDARY
590         LSH T,-2                ;CONVERT BYTES TO WORDS
591         ADDI T,-1(B)            ;ADDRESS OF LAST DESTINATION WORD
592         XCTR XBW,[BLT B,(T)]
593         LDB TT,[$CPKOP(A)]      ;GET OPCODE
594         CAIGE TT,%CODAT         ;ACKNOWLEDGE IF DATA
595          CAIN TT,%COEOF         ;OR EOF MARK
596           PUSHJ P,CHPKIA
597         SOS CHSNBF(I)           ;NOW REMOVE BUFFER FROM RECEIVE LIST
598         MOVEI Q,CHSIBF(I)
599         PUSHJ P,CHAQGF
600         PUSHJ P,CHABRT          ;AND RETURN TO FREE
601         JRST POPJ1              ;SUCCESS
602
603 ;INPUT WITH INPUT BUFFER EMPTY.  MUSTN'T BASH B,C,E.
604 CHPKI0: SKIPGE CHSSTA(I) .SEE %CFOFF
605          JRST [ HRRZ T,CHSSTA(I)
606                 CAIE T,%CSFRN   ;CHAOSNET OR FOREIGN PROTOCOL?
607                  JRST IOCR10    ;IOT WITH CHANNEL IN IMPROPER STATE
608                 JRST .+1 ]      ;WAIT BUT DON'T TRY TO TOUCH WINDOW SIZE
609         ;HERE CONSIDER INCREASING WINDOW SIZE
610         SKIPN CHSIBF(I)         ;AWAIT INPUT
611          PUSHJ P,UFLS
612         POPJ P,                 ;RETRY
613
614 ;ACKNOWLEDGE DATA PACKET IN A.  ITS OPCODE IN TT.
615 CHPKIA: LDB T,[$CPKPN(A)]       ;GET PACKET #
616         HRLM T,CHSPKN(I)        ;IT NOW NEEDS TO BE ACKNOWLEDGED
617         CAIN TT,%COEOF          ;ALWAYS ACKNOWLEDGE EOF RIGHT AWAY
618          JRST CHASTO
619         HLRZ TT,CHSACK(I)       ;GET LAST ONE REALLY ACKNOWLEDGED
620         SUB T,TT                ;GET NUMBER OF PACKETS AWAITING ACK
621         SKIPGE T
622          ADDI T,200000
623         IMULI T,3               ;MORE THAN ONE THIRD THE WINDOW SIZE?
624 IFN FTRCHK,[
625         MOVE TT,-1(A)
626         CAMN TT,[ASCII/LUNCH/]
627          BUG PAUSE,[CHAOS BUFFER ADDRESS TRASHED],OCT,A
628 ];FTRCHK
629         HLRZ TT,CHSWIN(I)
630         CAML T,TT
631          PUSHJ P,CHASTO         ;YES, SEND ACK (CAN'T PCLSR)
632         POPJ P,
633
634 ;SET UP FOR CHAOS IOT
635 CHAIOS: HLRZ I,(R)              ;GET INDEX
636         MOVE E,CHSSTA(I)
637         TLNE E,%CFSTY+%CFCLS
638          JRST IOCR10            ;CAN'T DO I/O WHILE DIRECT-CONNECTED OR HALF-CLOSED
639         HRRZS E                 ;RETURN STATE IN E
640         POPJ P,
641 \f
642 ;UNIT-MODE INPUT.
643 ;1.4 IN CTLBTS IS DON'T-HANG MODE
644         SKIPA T,[SIOKT]
645 CHAUI:   MOVEI T,CHRKT
646         PUSHJ P,CHAIOS          ;SET UP I, E
647         MOVE E,[440800,,4]
648         JSP B,(T)
649             CHSIBP(I)
650             CHSIBC(I)
651             CHAIBG
652             CHAIBD
653             0
654             TRNA
655
656 ;CHAOS INPUT BUFFER DISCARD
657 CHAIBD: SKIPN A,CHSIBP(I)
658          POPJ P,
659         SETZM CHSIBP(I)
660         SETZM CHSIBC(I)
661         JRST CHBPFR
662
663 ;CHAOS INPUT BUFFER GET
664 CHAIBG: HLRZ A,CHSIBF(I)        ;GET FIRST RECEIVE BUFFER
665         JUMPE A,CHAIB2          ;NONE
666         LDB TT,[$CPKOP(A)]      ;IS IT NORMAL DATA?
667         CAIE TT,%CODAT
668          JRST CHAIB1            ;NO
669         PUSHJ P,CHAIB3          ;YES, ACKNOWLEDGE AND REMOVE FROM LIST
670         LDB J,[$CPKNB(A)]       ;SET UP FOR BYTE STREAM INPUT
671         MOVEI TT,%CPKDT(A)
672         JRST SIOBG1
673
674 CHAIB3: PUSH P,B
675         PUSH P,C
676         PUSH P,E
677         PUSHJ P,CHPKIA          ;SEND ACKNOWLEDGEMENT
678         POP P,E
679         POP P,C
680         POP P,B
681         SOS CHSNBF(I)           ;REMOVE BUFFER FROM RECEIVE LIST
682         MOVEI Q,CHSIBF(I)
683         JRST CHAQGF
684
685 CHAIB1: CAIE TT,%COEOF
686          JRST CHAIB2
687         PUSHJ P,CHAIB3          ;EOF PACKET, ACKNOWLEDGE IT
688         PUSHJ P,CHABRT          ;RETURN IT TO FREE
689         JRST POPJ2              ;AND SIGNAL EOF
690
691 CHAIB2: MOVE TT,CTLBTS(U)       ;CHECK DON'T-HANG MODE
692         TRNE TT,10
693          JRST POPJ2             ;YES, EOF
694         JUMPN A,IOCR10          ;NO, ABNORMAL PACKET, BARF
695         PUSHJ P,CHPKI0          ;AWAIT INPUT
696         JRST CHAIBG             ;RETRY
697 \f
698 ;UNIT-MODE OUTPUT.
699 ;1.4 IN CTLBTS IS DON'T-HANG MODE
700         SKIPA T,[SIOKT]
701 CHAUO:   MOVEI T,CHRKT
702         PUSHJ P,CHAIOS          ;SET UP I, E
703         CAIE E,%CSOPN
704          JRST IOCR10            ;NOT OPEN, ERROR
705         MOVE E,[440800,,4]
706         JSP B,(T)
707             SETZ CHSOBP(I)
708             CHSOBC(I)
709             CHAOBG
710             CHAOBW
711             0
712             TRNA
713
714 ;GET NEW OUTPUT BUFFER
715 CHAOBG: SKIPG CHSNOS(I)         ;WINDOW FULL
716          PUSHJ P,[ MOVE TT,CTLBTS(U)
717                    TRNN TT,10
718                     JRST UFLS
719                    SUB P,[1,,1]
720                    JRST POPJ2 ] ;DON'T HANG MODE, RETURN "EOF"
721         PUSH P,B
722         PUSHJ P,CHABGT          ;SET UP AN OUTPUT BUFFER
723         POP P,B
724
725         MOVEI TT,%CPKDT(A)
726         MOVEI J,%CPMXC
727         JRST SIOBG1
728
729 ;WRITE OUTPUT BUFFER
730 CHAOBW: PUSH P,B
731         PUSH P,C
732         PUSH P,E
733         PUSHJ P,CHAFC1
734         POP P,E
735         JRST POPCBJ
736 \f
737 ;CHAOSNET OUTPUT PKTIOT.
738 ;B POINTS TO %CPMXW-WORD PACKET BUFFER
739 CHPKO:  PUSHJ P,CHAIOS          ;SET UP I, E
740         UMOVE H,(B)             ;GET HEADER WORD OF USER'S PACKET BUFFER
741         LDB D,[$CPKNB H]        ;GET BYTE COUNT
742         CAIG D,%CPMXC
743          TLNE H,(.BM $CPKMV)    ;WE DON'T SUPPORT MUPPETS ANY MORE
744           JRST IOCER3           ;BYTE LENGTH OUT OF BOUNDS
745         ADDI D,4*%CPKDT+3       ;CONVERT BYTES TO WORDS, INCLUDING HEADER WDS
746         LSH D,-2
747         MOVSI J,1(B)            ;SAVE ADDRESS+1 OF USER'S PACKET
748         PUSHJ P,CHABGT          ;GET A BUFFER
749         PUSHJ P,LOSSET          ;RETURN IT IF PCLSR
750             CHPKO2
751         MOVEM H,(A)             ;STORE PACKET HEADER, NOT STORED WITH BLT
752         HRRI J,1(A)             ; BECAUSE MIGHT HAVE CHANGED AFTER ERROR CHECK
753         ADDI D,-1(A)
754         XCTR XBR,[BLT J,(D)]    ;COPY USER'S PACKET INTO SYSTEM
755         AOS (P)                 ;GOING TO SUCCEED
756         SKIPGE (A)              ;SKIP IF CONTROL PACKET
757          JRST CHODAT            ;DATA
758         LDB D,[$CPKOP(A)]       ;GET OPCODE
759         CAIGE D,%COMAX          ;DISPATCH ON IT
760          JRST @.+1(D)
761         OFFSET -.
762         JRST IOCER3             ;OPCODE OUT OF BOUNDS
763 %CORFC::JRST CHORFC
764 %COOPN::JRST CHOOPN
765 %COCLS::JRST CHOCLS
766 %COFWD::JRST CHOFWD
767 %COANS::JRST CHOFWD
768 %COSNS::JRST IOCER3
769 %COSTS::JRST IOCER3
770 %CORUT::JRST IOCER3
771 %COLOS::JRST IOCER3
772 %COLSN::JRST CHOLSN
773 %COMNT::JRST IOCER3
774 %COEOF::JRST CHOEOF
775 %COUNC::JRST CHOUNC
776 %COBRD::JRST IOCER9             ;UNTIL I IMPLEMENT IT
777 %COMAX::OFFSET 0
778
779 ;LOSSET ROUTINE TO RETURN BUFFER A POINTS TO.
780 CHPKO2: MOVE A,AC0S+A(U)
781         PUSH P,Q                ;MAY CLOBBER ONLY A AND T
782         PUSHJ P,CHABRT
783         JRST POPQJ
784
785 ;SENDING %COEOF (END-FILE MARK)
786 CHOEOF: CAIE E,%CSOPN           ;CONNECTION MUST BE OPEN
787          JRST IOCR10
788         SKIPG CHSNOS(I)
789          PUSHJ P,UFLS           ;WINDOW FULL, WAIT
790         JRST CHOOP1             ;SEND RETRANSMITTABLE CONTROL PACKET
791
792 ;SENDING REQUEST FOR CONNECTION
793 CHORFC: PUSHJ P,CHORF1          ;RE-INITIALIZE CONNECTION
794         MOVSI B,777774          ;SAVE DESTINATION HOST, CLEAR OTHER BITS
795         ANDB B,%CPKD(A)
796         MOVEM B,CHSFRN(I)
797         MOVEI E,%CSRFS          ;PUT INTO RFC-SENT STATE
798         JRST CHOOP1             ;GO SEND
799
800 ;RE-INITIALIZE CONNECTION WHEN USER OUTPUTS RFC OR LSN
801 ;FLUSHES ANY OLD PACKET BUFFERS, CHANGES UNIQUIZER IN INDEX#
802 CHORF1: JUMPN E,IOCR10 .SEE %CSCLS      ;CONNECTION MUST BE CLOSED
803         PUSH P,A
804         PUSH P,B
805         PUSHJ P,CHACS1          ;FLUSH BUFFERS FROM CONNECTION
806         PUSHJ P,CHASO4          ;REINITIALIZE VARIABLES
807         JRST POPBAJ
808
809 ;"SENDING" LISTEN
810 CHOLSN: PUSHJ P,CHORF1
811         PUSHJ P,LSWDEL          ;GOING TO USE PACKET
812         MOVEI E,%CSLSN          ;PUT INTO LISTENING STATE
813         HRRM E,CHSSTA(I)
814         MOVEI Q,CHQRFC          ;NOW SEARCH PENDING-RFC QUEUE
815         CONO PI,NETOFF
816         PUSHJ P,CHAQSR
817          JRST [ CONO PI,NETON   ;NO MATCH, PUT ONTO LISTENING QUEUE
818                 MOVEI Q,CHQLSN
819                 MOVE T,CHSLCL(I)
820                 MOVEM T,%CPKS(A)
821                 JRST CHAQPL ]
822         PUSHJ P,CHIRF0          ;MATCH, JOIN INTERRUPT LEVEL CODE
823         JRST NETONJ
824 \f
825 ;SENDING OPEN
826 CHOOPN: CAIE E,%CSRFC           ;CONNECTION MUST BE RFC-RECEIVED
827          JRST IOCR10
828         MOVEI TT,4              ;SET BYTE COUNT TO 4
829         DPB TT,[$CPKNB(A)]
830         PUSHJ P,DPBRCP          ;INCLUDE RECEIPT
831         HLRZ B,CHSWIN(I)        ;INCLUDE WINDOW SIZE
832         DPB B,[042000,,%CPKDT(A)]
833         MOVEI E,%CSOPN          ;MAKE IT OPEN
834 ;HERE TO SEND A RETRANSMITTABLE CONTROL PACKET (RFC OR OPN), NEW STATE IN E
835 ;THIS PACKET WILL GET TAKEN OFF THE CHSOBF LIST BY RECEIPT IN THE NORMAL WAY
836 ;THIS CODE COPIED FROM CHODAT WITH SOME MODIFICATIONS
837 CHOOP1: MOVE T,TIME             ;UPDATE CHSITM SO WON'T THINK HOST IS DOWN
838         MOVEM T,CHSITM(I)
839         MOVEM E,CHSSTA(I)       ;AND CLEAR %CFOFF (NO OTHER LH FLAGS CAN BE ON)
840         PUSHJ P,LSWDEL          ;BUFFER WILL BE USED
841         HRRZ B,CHSPKN(I)        ;ASSIGN PACKET NUMBER
842         CAIL B,177777
843          TDZA B,B
844           ADDI B,1
845         HRRM B,CHSPKN(I)
846         DPB B,[$CPKPN(A)]
847         HLRZ B,CHSPKN(I)        ;GET PACKET NUMBER TO ACKNOWLEDGE
848         HRLM B,CHSACK(I)        ;REMEMBER IT HAS BEEN
849         DPB B,[$CPKAN(A)]       ;PIGGY-BACK THIS ACKNOWLEDGE
850         MOVE B,[<.BM $CPKOP>+<.BM $CPKNB>]
851         ANDM B,(A)              ;CLEAR FORWARDING COUNT AND UNUSED FIELD
852         MOVE B,CHSLCL(I)        ;SET UP SOURCE
853         MOVEM B,%CPKS(A)
854         MOVE D,CHSFRN(I)        ;SET UP DESTINATION
855         MOVEM D,%CPKD(A)
856         SETOM -2(A)             ;NOTE NOT ON TRANSMIT LIST YET
857         CONI PI,E               ;SUPER KLUDGERY REQUIRED HERE!  FOREIGN HOST MIGHT RECEIPT
858         CONO PI,NETOFF          ;THIS PACKET JUST AS WE START TO TRANSMIT IT.  THIS IS A
859                                 ;VIOLATION OF PROTOCOL, BUT SHOULDN'T CRASH I.T.S. BECAUSE THE
860                                 ;PACKET ABOUT TO BE GIVEN TO CHAXMT HAS BEEN FREED ALREADY.
861         MOVEI Q,CHSOBF(I)       ;PUT ON END OF SEND LIST
862         PUSHJ P,CHAQPL
863         JRST CHAXM0             ;GO TRANSMIT
864
865 ;SENDING CLOSE
866 CHOCLS: CAIE E,%CSOPN           ;CONNECTION MUST BE OPEN
867 ;SEND FWD OR ANS
868 CHOFWD:  CAIN E,%CSRFC          ; OR RFC-RECEIVED
869           TLOA E,%CFOFF         ;PUT IT INTO THE CLOSED STATE
870            JRST IOCR10
871         HLLZM E,CHSSTA(I) .SEE %CSCLS
872         PUSHJ P,LSWDEL          ;BUFFER WILL BE USED
873         JRST CHODT2             ;GO TRANSMIT
874
875 ;Here for transmitting an UNC packet.  It could be part of a connection
876 ;or it could be foreign-protocol mode.  In any case transmit it without
877 ;munging the header very much.
878 CHOUNC: CAIN E,%CSFRN
879          JRST CHOUN1            ;Okay to transmit UNC now
880         CAIN E,%CSOPN
881          JRST CHOUN2
882         JUMPN E,IOCR10 .SEE %CSCLS      ;Bad state
883         SKIPE CHSPBF(I)         ;I guess out of order packets would
884          JRST IOCR10            ; cause some confusion in the NCP.
885         MOVE E,[%CFOFF,,%CSFRN] ;Put into foreign-protocol state
886         MOVEM E,CHSSTA(I)
887 CHOUN1: MOVE D,%CPKD(A)         ;Save destination
888         MOVEM D,CHSFRN(I)
889 CHOUN3: MOVE B,CHSLCL(I)        ;Set up source
890         MOVEM B,%CPKS(A)
891         PUSHJ P,LSWDEL
892         SETOM -2(A)
893         JRST CHAXMT
894
895 CHOUN2: MOVE D,CHSFRN(I)        ;Set up destination
896         MOVEM D,%CPKD(A)
897         JRST CHOUN3
898
899 OVHMTR CHX
900
901 ;SENDING REGULAR PACKET
902 CHODAT: CAIE E,%CSOPN           ;CONNECTION MUST BE OPEN
903          JRST IOCR10
904         SKIPG CHSNOS(I)
905          PUSHJ P,UFLS           ;WINDOW FULL, WAIT
906         PUSHJ P,LSWDEL          ;BUFFER WILL BE USED
907 CHODT1: HRRZ B,CHSPKN(I)        ;ASSIGN PACKET NUMBER
908         CAIL B,177777
909          TDZA B,B
910           ADDI B,1
911         HRRM B,CHSPKN(I)
912         DPB B,[$CPKPN(A)]
913 CHODT2: HLRZ B,CHSPKN(I)        ;GET PACKET NUMBER TO ACKNOWLEDGE
914         HRLM B,CHSACK(I)        ;REMEMBER IT HAS BEEN
915         DPB B,[$CPKAN(A)]       ;PIGGY-BACK THIS ACKNOWLEDGE
916         MOVE B,[<.BM $CPKOP>+<.BM $CPKNB>]
917         ANDM B,(A)              ;CLEAR FORWARDING COUNT AND UNUSED FIELD
918         MOVE B,CHSLCL(I)        ;SET UP SOURCE
919         MOVEM B,%CPKS(A)
920         MOVE D,CHSFRN(I)        ;SET UP DESTINATION
921         MOVEM D,%CPKD(A)
922         SETOM -2(A)             ;NOTE NOT ON TRANSMIT LIST YET
923         SKIPL (A)               ;SKIP IF DATA PACKET
924          JRST CHAXMT
925         CONI PI,E               ;SUPER KLUDGERY REQUIRED HERE!  FOREIGN HOST MIGHT RECEIPT
926         CONO PI,NETOFF          ;THIS PACKET JUST AS WE START TO TRANSMIT IT.  THIS IS A
927                                 ;VIOLATION OF PROTOCOL, BUT SHOULDN'T CRASH I.T.S. BECAUSE THE
928                                 ;PACKET ABOUT TO BE GIVEN TO CHAXMT HAS BEEN FREED ALREADY.
929         MOVEI Q,CHSOBF(I)       ;PUT ON END OF SEND LIST
930         PUSHJ P,CHAQPL
931         SOSA CHSNOS(I)          ;USE UP WINDOW, SKIP
932 ;SKIPS THROUGH INTO CHAXMT
933 \f;SKIPS IN
934 SUBTTL CHAOS NET PACKET TRANSMIT ROUTINE
935
936 ;CALL WITH PACKET IN A, SMASHES B, C, D, E, T, TT, Q, J
937 ;USES E TO SAVE THE PI STATUS, NOTHING BETTER CLOBBER THIS, OR, BOY, WILL IT EVER LOSE!
938 ;YOU BETTER SETOM -2(A) BEFORE CALLING THIS, AND IF YOU'RE
939 ;PUTTING IT ON A SEND LIST, DO THAT FIRST ALSO.
940 ;THIS CODE ASSUMES THERE IS ONLY ONE INTERFACE, AND IT IS ON A
941 ;PDP11 WHICH WILL TAKE CARE OF THE ROUTING.
942 ;;THIS ROUTINE IS SKIPPED INTO FROM THE PREVIOUS PAGE!
943 CHAXMT:  CONI PI,E              ;SAVE PI STATUS BEFORE TURNING NETOFF; CALLED FROM MANY LEVELS
944 CHAXM0: ANDI E,177
945         AOS CHNPO
946         MOVE T,TIME
947         MOVEM T,-1(A)           ;SET TIME OF LAST TRANSMISSION
948         CONO PI,NETOFF          ;ONE PROCESS AT A TIME, TO PROTECT INTERFACE VARIABLES
949 IFN FTRCHK,[
950         HLRZ J,-2(A)            ;I TOLD YOU TO SETOM -2(A)
951         CAIE J,-1
952          BUG PAUSE,[CHAOS BUFFER THREAD TRASHED],OCT,A,OCT,-2(A)
953 ];FTRCHK
954 IFN DLCP,[
955 ;FOR NOW, JUST ALWAYS SHIP IT OUT THE DL10
956 IFN FTRCHK,[
957         HLRZ J,DLCXMQ           ;MAKE SURE NOT PUTTING ON LIST TWICE
958         JUMPE J,.+7
959         CAMN J,A
960          BUG PAUSE,[CHAOS BUFFER ALREADY ON DLCXMQ],OCT,A
961         HLRZ J,-2(J)
962         CAIN J,-1
963          BUG PAUSE,[DLCXMQ THREAD TRASHED]
964         JUMPN J,.-5
965         MOVEI J,1               ;MAKE SURE NOT ACTIVE TO 11
966         HRRZ T,DLCSA1(J)
967         CAMN T,A
968          BUG PAUSE,[CHAOS BUFFER ALREADY ACTIVE TO 11],OCT,A
969         SOJGE J,.-3
970 ];FTRCHK
971         HRRZS -2(A)             ;PUT END-LIST INDICATOR IN LH (FLAGS TRANSMIT ACTIVE)
972         MOVE J,DLCSBF           ;SEE IF SEND BUFFER IS FREE
973         SKIPE DLCSS1(J)
974          JRST CHXMD1
975         PUSHJ P,DLCXMT          ;YES, SEND THE PACKET NOW
976         JRST CHXMD2
977
978 CHXMD1: HRRZ B,DLCXMQ           ;NO BUFFERS FREE RIGHT NOW, QUEUE
979         JUMPE B,[ HRLZM A,DLCXMQ ? JRST .+2 ]
980          HRLM A,-2(B)
981         HRRM A,DLCXMQ
982 CHXMD2: CONO PI,PICON(E)        ;RESTORE PI
983         POPJ P,
984 ];DLCP
985 IFN T11CHP,[
986 ;FOR NOW, JUST ALWAYS SHIP IT OUT THE TEN11
987         PUSHJ P,T11CHK          ;SEE IF TEN-11 IS READY
988          JRST CHXME3            ;NO
989         SKIPE @T11OBP           ;SEE IF HAVE AVAILABLE OUTPUT BUFFER
990          JRST CHXME1            ;NO
991         PUSHJ P,T11XMT          ;SEND THE PACKET NOW
992         JRST CHXME2
993
994 CHXME3: HRROS T,-2(A)           ;TEN11 DOWN, DISCARD PACKET
995         AOJN T,CHXME2
996         PUSHJ P,CHABRT
997         JRST CHXME2
998
999 CHXME1: HRRZ B,T11XMQ           ;NO BUFFERS FREE RIGHT NOW, QUEUE
1000         JUMPE B,[ HRLZM A,T11XMQ ? JRST .+2 ]
1001          HRLM A,-2(B)
1002         HRRM A,T11XMQ
1003         HRRZS -2(A)             ;PUT END-LIST INDICATOR IN LH
1004 CHXME2: CONO PI,PICON(E)        ;RESTORE PI
1005         POPJ P,
1006 ];T11CHP
1007 IFN CH10P,[
1008 ;FOR NOW, JUST ALWAYS SHIP IT OUT THE CH10
1009         HRRZ B,CHXXMQ           ;ADD TO END OF TRANSMIT QUEUE
1010         JUMPE B,[ HRLZM A,CHXXMQ ? JRST .+2 ]
1011          HRLM A,-2(B)
1012         HRRM A,CHXXMQ
1013         HRRZS -2(A)             ;PUT END-LIST INDICATOR IN LH
1014         MOVEI B,CHXTEN          ;ENABLE TRANSMIT-DONE INTERRUPT
1015         IORM B,CHXCNO
1016         CONO CHX,@CHXCNO
1017         CONO PI,PICON(E)        ;RESTORE PI
1018         POPJ P,
1019 ];CH10P
1020 IFN CH11P,[
1021 ;FOR NOW, JUST ALWAYS SHIP IT OUT THE CH11
1022         HRRZ B,CHXXMQ           ;ADD TO END OF TRANSMIT QUEUE
1023         JUMPE B,[ HRLZM A,CHXXMQ ? JRST .+2 ]
1024          HRLM A,-2(B)
1025         HRRM A,CHXXMQ
1026         HRRZS -2(A)             ;PUT END-LIST INDICATOR IN LH
1027         MOVEI B,%CATEN          ;ENABLE TRANSMIT-DONE INTERRUPT
1028         IORB B,CHXCSR
1029         IOWRI B,CAICSR
1030         CONO PI,PICON(E)        ;RESTORE PI
1031         POPJ P,
1032 ];CH11P
1033 \f
1034 SUBTTL CHAOS NET DIRECT CONNECT TO STY
1035
1036 OVHMTR CHS
1037
1038 ;CALLED AT CLOCK LEVEL FROM STYNTC WHEN A CHAOS STY IS ENCOUNTERED
1039 ;TTY NUMBER IN I & R
1040 STYCHA: MOVE I,STYNTI-NFSTTY(R) ;GET CHAOS INDEX
1041         MOVE TT,CHSSTA(I)
1042         TLNN TT,%CFSTY
1043          JRST 4,.               ;CHAOS CONNECTION CLAIMS NOT BE CONNECTED?
1044         JUMPL TT,STYCH9 .SEE %CFOFF     ;OK TO USE?  IF NOT, DISCONNECT
1045         SKIPGE TTYOAC(R)        ;ANY OUTPUT?
1046          JRST STYCH1            ;NO, CHECK FOR INPUT
1047         SKIPN D,CHSOBP(I)       ;IF BUFFER ALLOCATED, USE IT
1048          JRST [ SKIPG CHSNOS(I) ;OTHERWISE ALLOCATE ONE
1049                  JRST STYCH1    ;WINDOW FULL, WAIT UNTIL REACTIVATED
1050                 PUSHJ P,CHABGI
1051                  JRST STYCH3    ;NO CORE, WAIT ONE CLOCK TICK
1052                 MOVEI D,%CPKDT(A)
1053                 HRLI D,440800
1054                 MOVEM D,CHSOBP(I)
1055                 MOVEI E,%CPMXC
1056                 MOVEM E,CHSOBC(I)
1057                 JRST .+3 ]
1058           SKIPG E,CHSOBC(I)
1059            JRST STYCH4          ;BUFFER FULL, FORCE IT
1060         EXCH R,I                ;I GETS TTY, R GETS CHAOS
1061         CONO PI,TTYOFF
1062         MOVEM D,DBBBP           ;SET UP BUFFER FOR TTY OUTPUT INTERRUPT LEVEL
1063         MOVEM E,DBBCC
1064         MOVEM E,DBBCC1
1065         PUSH P,R
1066         SETOM TYPNTF
1067         PUSHJ P,TYP             ;GENERATE OUTPUT
1068         SETZM TYPNTF
1069         POP P,R
1070         EXCH R,I                ;I GETS CHAOS, R GETS TTY
1071         MOVE D,DBBBP            ;ADVANCE POINTERS
1072         MOVEM D,CHSOBP(I)
1073         MOVE E,DBBCC
1074         SUB E,DBBCC1            ;MINUS # CHARS OUTPUT GENERATED
1075         CONO PI,TTYON
1076         ADDM E,CHSOBC(I)
1077 STYCH4: PUSHJ P,CHAFC1          ;FORCE THE BUFFER
1078         JRST STYCHA             ;CHECK FOR MORE OUTPUT
1079 \f
1080 STYCH3: PUSHJ P,CHINTI          ;REACTIVATE SO WILL COME BACK ON NEXT CLOCK TICK
1081 STYCH1: SOSGE CHSIBC(I)         ;GET INPUT, IF ANY
1082          JRST [ PUSHJ P,CHAIBD  ;DISCARD EXHAUSTED INPUT BUFFER, IF ANY
1083                 HLRZ A,CHSIBF(I)
1084                 JUMPE A,STYNT8  ;NONE, RETURN TO STYNTC
1085                 LDB TT,[$CPKOP(A)]
1086                 CAIE TT,%CODAT
1087                  JRST STYCH9    ;RANDOM PACKET, DISCONNECT
1088                 PUSHJ P,CHPKIA  ;ACKNOWLEDGE GOBBLING OF THIS PACKET
1089                 SOS CHSNBF(I)   ;REMOVE BUFFER FROM RECEIVE LIST
1090                 MOVEI Q,CHSIBF(I)
1091                 PUSHJ P,CHAQGF
1092                 LDB E,[$CPKNB(A)]       ;SET UP FOR BYTE STREAM INPUT
1093                 MOVEM E,CHSIBC(I)
1094                 MOVEI D,%CPKDT(A)
1095                 HRLI D,440800
1096                 MOVEM D,CHSIBP(I)
1097                 JRST STYCH1 ]
1098         ILDB A,CHSIBP(I)        ;GET CHARACTER OF INPUT
1099         TRNE A,200
1100          JRST [ AOS CHSIBC(I)   ;WOOPS, SPECIAL CHARACTER, NEEDS USER ATTENTION
1101                 MOVSI A,8_14    ;SO PUT IT BACK AND DISCONNECT
1102                 ADDM A,CHSIBP(I)
1103                 JRST STYCH9 ]
1104         EXCH R,I                ;I GETS TTY, R GETS CHAOS
1105         PUSH P,R
1106         PUSH P,I
1107         CONO PI,TTYOFF
1108         PUSHJ P,NTYI5           ;GIVE CHARACTER TO TTY INPUT INTERRUPT LEVEL
1109         CONO PI,TTYON
1110         POP P,R
1111         POP P,I                 ;I GETS CHAOS, R GETS TTY ((POP IN REVERSE ORDER))
1112         JRST STYCH1             ;TRY FOR MORE INPUT
1113
1114 STYCH9: PUSH P,I
1115         MOVE I,R                ;I GETS TTY
1116         PUSHJ P,NSTYN0          ;DISCONNECT THE STY
1117          JRST 4,.
1118         POP P,I                 ;I GETS CHAOS
1119         PUSHJ P,CHINTI          ;WAKE UP THE TELNET SERVER
1120         JRST STYNT8             ;GO HANDLE OTHER STYS
1121 \f
1122 SUBTTL CHAOS NET CLOCK LEVEL STUFF
1123
1124 OVHMTR CHC
1125
1126 ;HERE FROM 1/2 SECOND CLOCK.  DO RETRANSMISSIONS AND DELAYED STS'S
1127 CHACLK:
1128 IFN DLCP,[
1129         CONO PI,NETOFF
1130         PUSHJ P,DLCIBG          ;GET MEMORY FOR INPUT BUFFERS IF NEEDED
1131         CONO PI,NETON
1132 ];DLCP
1133         MOVEI I,NINDX-1         ;SCAN ALL INDICES
1134 CHACL0: SKIPL CHSUSR(I)         ;SKIP THIS ONE IF NOT IN USE
1135          SKIPGE CHSSTA(I) .SEE %CFOFF   ;OR INHIBITED FROM PI LEVEL
1136           SOJGE I,CHACL0
1137         JUMPL I,CPOPJ           ;JUMP IF ALL INDICES DONE
1138         PUSHJ P,CHARTR          ;RETRANSMIT IF NEEDED
1139         MOVSI B,%CFSTS
1140         TDNE B,CHSSTA(I)        ;SEND STS IF NEEDED
1141          PUSHJ P,CHASTO
1142         SOJGE I,CHACL0
1143         POPJ P,
1144
1145 ;HERE EVERY 5 SECONDS, TO DO PROBES
1146 CHA5CL: MOVEI I,NINDX-1         ;SCAN ALL INDICES
1147 CHA5C0: SKIPL CHSUSR(I)         ;SKIP IF THIS ONE NOT IN USE
1148          SKIPGE CHSSTA(I) .SEE %CFOFF ;OR INHIBITED FROM PI LEVEL
1149 CHA5C1:   SOJGE I,CHA5C0
1150         JUMPL I,CHA5C4          ;JUMP IF ALL INDICES DONE
1151         MOVE T,TIME
1152         SUB T,CHSITM(I)         ;TIME SINCE LAST COMMUNICATION FROM OTHER END
1153         CAILE T,90.*30.
1154          JRST [ MOVEI W,%CSINC  ;TOO LONG, CONNECTION BROKEN
1155                 PUSHJ P,CHINT
1156                 JRST CHA5C1 ]
1157         HRRZ B,CHSSTA(I)        ;ONLY PROBE IF OPEN (COULD BE RFC-SENT)
1158         CAIE B,%CSOPN
1159          JRST CHA5C1
1160         HRRZ B,CHSWIN(I)        ;SEE IF NO TRANSMIT WINDOW (LOST STS DURING OPEN)
1161         JUMPE B,CHA5C2
1162         HRRZ B,CHSACK(I)        ;SEE IF AWAITING ACK (WINDOW NOT EMPTY)
1163         HRRZ C,CHSPKN(I)
1164         CAMN B,C
1165          CAIL T,60.*30.
1166 CHA5C2:   PUSHJ P,CHABGI        ;AWAITING ACK OR IDLE FOR 1 MINUTE, PROBE
1167            JRST CHA5C1          ;NO PROBE, OR NO BUFFER AVAILABLE
1168         MOVSI T,(.DPB %COSNS,($CPKOP),0) ;SENSE PACKET, BYTE-COUNT=0
1169         MOVEM T,(A)
1170         AOS CHNSNS
1171         PUSHJ P,CHODT2
1172         JRST CHA5C1
1173
1174 CHA5C4: MOVEI B,[ASCIZ/Timeout/]
1175         MOVEI Q,CHQRFC          ;TIME-OUT FIRST RFC ON LIST
1176         PUSHJ P,CHAQGF
1177         JUMPE A,CHA5C5
1178         MOVE T,-1(A)
1179         ADDI T,60.*30.          ;TIME-OUT IS ONE MINUTE
1180         PUSHJ P,[ CAMG T,TIME
1181                    JRST CHIRF2
1182                   JRST CHAQPF ]
1183 CHA5C5:
1184 IFN CH10P,[
1185         MOVEI T,CHXREN+CHXTEN   ;WAKE UP IN CASE OF TIMING ERROR
1186         IORM T,CHXCNO           ;IN DEALING WITH CHXCNO
1187         CONO CHX,@CHXCNO
1188         MOVSI T,-NSUBNT         ;DECAY ROUTING COSTS
1189         CONO PI,NETOFF          ;PREVENT RUT PACKET FROM COMING IN
1190 CHA5C6: HLRZ TT,SBNRUT(T)
1191         ADDI TT,1
1192         CAIG TT,1000
1193          HRLM TT,SBNRUT(T)
1194         AOBJN T,CHA5C6
1195         CONO PI,NETON
1196 ];CH10P
1197 IFN CH11P,[
1198         MOVEI T,%CAREN+%CATEN   ;WAKE UP IN CASE OF TIMING ERROR
1199         IORB T,CHXCSR           ;IN DEALING WITH CHXCSR
1200         IOWRI T,CAICSR
1201         MOVSI T,-NSUBNT         ;DECAY ROUTING COSTS
1202         CONO PI,NETOFF          ;PREVENT RUT PACKET FROM COMING IN
1203 CHA5C6: HLRZ TT,SBNRUT(T)
1204         ADDI TT,1
1205         CAIG TT,1000
1206          HRLM TT,SBNRUT(T)
1207         AOBJN T,CHA5C6
1208         CONO PI,NETON
1209 ];CH11P
1210         MOVEI T,5*60.
1211         MOVEI C,CHA5CK
1212         JRST CLQREE
1213
1214 OVHMTR CHR
1215
1216 ;RETRANSMIT FOR INDEX IN I
1217 CHARTR: CONI PI,W               ;SAVE PI CHANNELS ACTIVE
1218         ANDI W,177              ;CHAXMT BETTER NOT CLOBBER W!
1219         CONO PI,NETOFF          ;PI BETTER BE OFF THROUGHOUT THIS ZONE
1220                                 ; SO WE DON'T GET INTO CHIACK
1221         HLRZ A,CHSOBF(I)        ;SCAN DOWN OUTPUT BUFFER LIST
1222         JUMPE A,CHART2          ;EMPTY
1223 CHART1: MOVE T,-1(A)            ;DON'T RETRANSMIT IF DONE TOO RECENTLY
1224         HLRZ TT,-2(A)           ;OR IF ALREADY ON ITS WAY OUT (DON'T LINK TWICE ON XMIT LIST)
1225         CAME T,TIME
1226          CAIE TT,-1
1227           JRST CHART2           ;ANYTHING AFTER THIS IS LIKELY TO LOSE ALSO
1228         AOS CHNRTR
1229         PUSHJ P,CHAXMT          ;RETRANSMIT THIS
1230 ;       HRRZ A,-2(A)            ;THREAD TO NEXT
1231 ;       JUMPN A,CHART1
1232 CHART2: CONO PI,PICON(W)
1233         POPJ P,
1234 \f
1235 ;THIS ROUTINE SENDS A STS PACKET, OR TRIES TO.  FAILURE => SLOW CLOCK WILL TRY AGAIN.
1236 ;CANNOT PCLSR NOR WAIT, CALLABLE FROM INTERRUPT LEVEL.
1237 ;INDEX IN I, CLOBBERS A,B,C,D,E,T,TT,Q,J
1238 CHASTO: MOVSI D,%CFSTS
1239         IORM D,CHSSTA(I)
1240         PUSHJ P,CHABGI          ;GET A BUFFER, WITHOUT WAITING
1241          POPJ P,                ;CAN'T GET ONE, WILL RETRY AT CLOCK LEVEL
1242         ANDCAM D,CHSSTA(I)      ;OK, A STS WILL BE SENT, CLEAR NEED-STS FLAG
1243         MOVE T,[.DPB %COSTS,($CPKOP),<.DPB 4,($CPKNB),0>]
1244         MOVEM T,(A)             ;SEND A STS WITH 4 DATA BYTES
1245         PUSHJ P,DPBRCP          ;FIRST PAIR IS RECEIPT
1246         HLRZ B,CHSWIN(I)        ;SECOND PAIR IS WINDOW SIZE
1247         DPB B,[042000,,%CPKDT(A)]
1248         AOS CHNSTS
1249         JRST CHODT2             ;FIRE IT OFF
1250
1251 DPBRCP: HLRZ B,CHSPKN(I)
1252         SKIPE T,CHSIBF(I)
1253          LDB B,[$CPKPN(T)]
1254         DPB B,[242000,,%CPKDT(A)]
1255         POPJ P,
1256 \f
1257 SUBTTL CHAOS NET INTERRUPT-LEVEL INPUT PROCESSING
1258
1259 OVHMTR CHI
1260
1261 ;PROCESS A PACKET RECEIVED AT INTERRUPT LEVEL.  BY THE TIME WE GET HERE
1262 ; A BUFFER HAS BEEN ALLOCATED AND FILLED WITH THE DATA FROM THE DEVICE.
1263 ; ITS ADDRESS IS IN A.  RETURN VIA POPJ P, WITH ALL REGISTERS CLOBBERED.
1264 CHAPII: MOVE B,RECHDP           ;SAVE HEADER FOR DEBUGGING IN RING BUFFER
1265         MOVEI D,%CPKDT(B)
1266         HRL B,A
1267         BLT B,-1(D)
1268         CAIN D,RECHDR+<NRECHD*%CPKDT>
1269          MOVEI D,RECHDR
1270         MOVEM D,RECHDP
1271         ;END OF DEBUGGING CODE
1272         LDB D,[$CPKMV(A)]       ;MUPPET?
1273         JUMPN D,CHABRT          ;FLUSH, NOT SUPPORTED
1274         LDB D,[$CPKOP(A)]       ;GET OPCODE
1275         LDB B,[$CPKDA(A)]       ;CHECK DESTINATION
1276         CAIE B,MYCHAD           ;IF FOR ME,
1277          SKIPN B                ;OR FOR ME BY VIRTUE OF BROADCAST
1278           AOSA CHNPI            ;ACCEPT IT
1279            JRST CHAPFW          ;NOT ME, FORWARD
1280         LDB C,[$CPKNB(A)]       ;PASS LENGTH IN C TO OP ROUTINES
1281         MOVEI B,[ASCIZ/Illegal byte count/]
1282         CAILE C,%CPMXC
1283          JRST CHALOS
1284         SKIPGE (A)              ;TEST OPCODE
1285          JRST CHIDAT            ;DATA PACKET
1286         MOVEI B,[ASCIZ/Illegal opcode/]
1287         CAIGE D,%COMAX
1288          JRST @.+1(D)
1289         OFFSET -.
1290         JRST CHALOS             ;ILLEGAL, FLUSH
1291 %CORFC::JRST CHIRFC
1292 %COOPN::JRST CHIOPN
1293 %COCLS::JRST CHICLS
1294 %COFWD::JRST CHIANS
1295 %COANS::JRST CHIANS
1296 %COSNS::JRST CHISNS
1297 %COSTS::JRST CHISTS
1298 %CORUT::
1299 IFE CH10P+CH11P,JRST CHABRT     ;IGNORE
1300 IFN CH10P+CH11P,JRST CHIRUT
1301 %COLOS::JRST CHILOS
1302 %COLSN::JRST CHALOS             ;ILLEGAL, FLUSH
1303 %COMNT::JRST CHABRT             ;IGNORE
1304 %COEOF::JRST CHIDAT
1305 %COUNC::JRST CHIUNC
1306 %COBRD::JRST CHIBRD
1307 %COMAX::OFFSET 0
1308
1309 ;FORWARDING
1310 CHAPFW: LDB B,[$CPKDA(A)]       ;CHECK DESTINATION HOST
1311         TRNN B,377_8            ;SUBNET 0?
1312          JRST CHABRT            ;FLUSH IT, XX-NETWORK-11 IS TRYING TO MAKE US CRASH
1313         LDB B,[$CPKFC(A)]       ;INCREMENT FORWARDING COUNT
1314         ADDI B,1
1315         CAIL B,20
1316          JRST [ AOS CHNPFL ? JRST CHABRT ]      ;LOOP, DISCARD
1317         DPB B,[$CPKFC(A)]
1318         SETOM -2(A)             ;NOT ON SEND LIST
1319         AOS CHNPF
1320         JRST CHAXMT
1321
1322 IFN CH10P+CH11P,[               ;INCOMING ROUTING INFO
1323 CHIRUT: LSH C,-2                ;NUMBER OF SUBNET ENTRIES
1324         JUMPE C,CHABRT          ;COULD BE ZERO-LENGTH
1325         MOVEI D,%CPKDT(A)
1326         HRLI D,442000
1327         LDB E,[$CPKSA(A)]       ;SOURCE HOST IS GATEWAY
1328 CHIRU1: ILDB T,D                ;SUBNET
1329         ILDB TT,D               ;COST
1330         HLRZ B,SBNRUT(T)        ;COST OF EXISTING ROUTE
1331         CAIGE T,NSUBNT
1332          CAMLE TT,B
1333           JRST CHIRU2
1334         HRLM TT,SBNRUT(T)       ;THIS IS BEST ROUTE NOW
1335         HRRM E,SBNRUT(T)
1336 CHIRU2: SOJG C,CHIRU1
1337         JRST CHABRT
1338 ];CH10P+CH11P
1339
1340 ;INTERRUPT-LEVEL PROCESSING OF SNS PACKET
1341 ;NOTE THAT WE DO NOT BARF AT SNS'S TO EXISTENT NON-OPEN CONNECTIONS.  IF IT
1342 ;WAS AN RFC-SENT CONNECTION, THIS COULD BREAK IT PREMATURELY IF AN OPN WAS
1343 ;LOST AND THEN A SNS WAS NOT.
1344 CHISNS: MOVEI E,%CSOPN
1345         PUSHJ P,CHFNDX
1346          JRST [ CAIE E,%CSOPN
1347                  JRST CHABRT    ;CONNECTION EXISTS AND IS NOT OPEN, IGNORE PACKET
1348                 JRST CHALOS ]   ;CONNECTION DOES NOT EXIST, COMPLAIN
1349         PUSHJ P,CHABRT          ;CONNECTION DOES EXIST
1350         CAIE E,%CSOPN
1351          POPJ P,                ;NOT OPEN, IGNORE
1352         JRST CHASTO             ;REPLY WITH STS
1353
1354 ;INTERRUPT LEVEL PROCESSING OF RECEIVED FWD OR ANS
1355 CHIANS: PUSHJ P,CHFNDX          ;FIND CONNECTION
1356          JRST CHABRT            ;NOBODY AT OTHER END TO RECEIVE A LOS ANYWAY
1357         CAIE E,%CSRFS
1358          JRST CHABRT            ;NOT IN RFC-SENT STATE, LOSS
1359 ;       JRST CHICL1             ;CLOSE THE CONNECTION BUT GIVE TO USER AS INPUT
1360         ;DROPPING THROUGH WILL DO
1361
1362 ;INTERRUPT LEVEL PROCESSING OF RECEIVED CLS PACKET
1363 CHICLS: PUSHJ P,CHFNDX          ;FIND CONNECTION BEING CLOSED
1364          JRST CHALOS            ;NONE, LOSS
1365 CHICL1: MOVEI W,%CSCLS          ;CLOSE THE CONNECTION
1366 CHICL2: PUSHJ P,CHINT           ;SET TO STATE IN W, INTERRUPT
1367         PUSH P,A
1368         MOVEI Q,CHSPBF(I)       ;DISCARD OUT-OF-ORDER PACKETS
1369         PUSHJ P,CHALFR
1370         HRRZS CHSNBF(I)
1371 CHIC2A: MOVEI Q,CHSOBF(I)       ;DISCARD TRANSMIT PACKETS, E.G. RFC WHICH RECEIVED
1372         PUSHJ P,CHAQGF          ;AN ANS OR FWD, DON'T WANT TO TRANSMIT AGAIN
1373         JUMPE A,CHIC2B
1374         PUSHJ P,CHABR1
1375         JRST CHIC2A
1376
1377 CHIC2B: POP P,A
1378         JRST CHIDT1             ;GIVE PACKET TO USER AS DATA
1379 \f;INTERRUPT LEVEL PROCESSING OF RFC PACKET
1380 CHIRFC: MOVE T,%CPKDT(A)        ;CHECK FOR STATUS REQUEST
1381         CAMN T,[.BYTE 8 ? "S ? "T ? "A ? "T]
1382          CAIE C,6
1383           JRST CHIRF7
1384         MOVS TT,%CPKDT+1(A)
1385         XORI TT,(<.BYTE 8 ? "U ? "S>)
1386         TRNN TT,(<.BYTE 8 ? -1 ? -1>)
1387          JRST CHIRF3
1388 CHIRF7: MOVEI Q,CHQLSN          ;SEARCH LISTENING QUEUE
1389         PUSHJ P,CHAQSR
1390          JRST CHIRF1            ;NOT FOUND, LOAD SERVER
1391         EXCH A,B                ;A LSN, B RFC
1392         LDB I,[$CPKSX(A)]       ;GET CORRESPONDING INDEX
1393         HRRZ E,CHSSTA(I)
1394         CAIE E,%CSLSN
1395          JRST 4,.
1396 CHIRF0: PUSHJ P,CHABRT          ;FOUND, DISCARD LISTEN PACKET
1397         MOVE A,B                ;GET OTHER HOST'S RFC
1398         LDB B,[$CPKPN(A)]       ;INITIALIZE RECEIVER'S PACKET NUMBER
1399         HRLM B,CHSPKN(I)
1400         MOVE B,%CPKS(A)
1401         MOVEM B,CHSFRN(I)       ;HOOK 'EM UP
1402         MOVEI W,%CSRFC          ;PUT INTO RFC-RECEIVED STATE
1403         MOVE T,TIME             ;AND ENGAGE PI LEVEL
1404         MOVEM T,CHSITM(I)
1405         JRST CHICL2
1406         
1407 ;RFC RECEIVED AND NOT IMMEDIATELY MATCHED TO A LSN.  QUEUE AND LOAD SERVER JOB.
1408 ;BUT FIRST CHECK WHETHER THIS IS A DUPLICATE WHICH SHOULD BE DISCARDED.
1409 CHIRF1: MOVE C,%CPKS(A)         ;SEARCH PENDING RFC QUEUE FOR RFC FROM
1410         HLRZ T,CHQRFC           ;THE SAME SOURCE AS THIS.
1411         JUMPE T,CHIRD1
1412 CHIRD0: CAMN C,%CPKS(T)
1413          JRST CHABRT            ;THIS RFC IS A DUPLICATE, IGNORE IT
1414         HRRZ T,-2(T)
1415         JUMPN T,CHIRD0
1416 CHIRD1: MOVSI T,-NINDX          ;SEARCH OPEN AND RFC-RECEIVED CONNECTIONS
1417 CHIRD2: SKIPL CHSUSR(T)         ;FOR ONE CONNECTED TO SAME GUY AS SENT RFC
1418          CAME C,CHSFRN(T)
1419           AOBJN T,CHIRD2
1420         JUMPGE T,CHIRD3         ;NO DUPLICATE OF THIS RFC, QUEUE IT
1421         HRRZ TT,CHSSTA(T)
1422         CAIE TT,%CSOPN
1423          CAIN TT,%CSRFC
1424           JRST CHABRT           ;REALLY A DUPLICATE, DISCARD
1425         AOBJN T,CHIRD2
1426 CHIRD3: MOVEI B,[ASCIZ/System not up/]
1427         SKIPL SYSDBG            ;REFUSE INCOMING CONNECTIONS IF LOGINS REFUSED
1428          SKIPE NETUSW           ;ALLOWING INCOMING NET CONNECTIONS?
1429           JRST CHIRF2           ;NO, REFUSE (EVEN IF FROM OURSELVES)
1430         HRROI T,CHIRFJ          ;LOAD JOB
1431         CONI PI,Q               ;MUST TURN UTCOFF TO CALL NUJBST
1432         ANDI Q,177              ;SINCE THIS MAY RUN AT OTHER INT LEVELS
1433         CONO PI,NETOFF
1434         PUSHJ P,NUJBST
1435          JRST [ CONO PI,PICON(Q)
1436                 JRST CHABRT ]   ;RING BUFFER FULL, IGNORE, RETRY WILL CATCH
1437         CONO PI,PICON(Q)
1438         MOVE T,TIME             ;REMEMBER WHEN THIS RFC WAS QUEUED
1439         MOVEM T,-1(A)
1440         MOVEI Q,CHQRFC
1441         JRST CHAQPF             ;PUT ON FRONT OF QUEUE
1442
1443 ;COME HERE TO SEND A LOS PACKET IN RESPONSE TO CRUFTY INPUT IN A
1444 ;B SHOULD POINT TO AN ASCIZ STRING FOR WHY.
1445 CHALOS: SKIPA T,[%COLOS]
1446 ;HERE TO REFUSE AN RFC.  TURN IT INTO A CLS AND SEND IT BACK.
1447 ;B SHOULD POINT TO AN ASCIZ STRING FOR WHY.
1448 CHIRF2:  MOVEI T,%COCLS
1449         HRLI B,440700           ;BP TO MESSAGE
1450         SETZB C,(A) .SEE $CPKFC
1451         DPB T,[$CPKOP(A)]
1452         MOVE T,%CPKS(A)         ;EXCHANGE SOURCE AND DESTINATION
1453         EXCH T,%CPKD(A)
1454         MOVEM T,%CPKS(A)
1455         MOVE D,[440800,,%CPKDT(A)]
1456 CHIRF4: ILDB T,B
1457         JUMPE T,CHIRF5
1458         IDPB T,D
1459         AOJA C,CHIRF4
1460
1461 CHIRF5: DPB C,[$CPKNB(A)]
1462         SETOM -2(A)             ;NOT ON ANY SEND LIST
1463         JRST CHAXMT             ;SEND IT
1464 \f
1465 ;HERE FOR RFC TO "STATUS" 
1466 EXPUNGE FOO,BAR
1467 DEFINE FOO NAME
1468 BAR==0
1469 .BYTE 8
1470 IRPC CH,,NAME
1471 "CH
1472 BAR==BAR+1
1473 TERMIN
1474 IFG BAR-4, .ERR NAME MORE THAN 4 CHARACTERS
1475 REPEAT 4-BAR, 0
1476 .BYTE
1477 TERMIN
1478
1479 CHIRF3: MOVE B,[MNAME FOO ,,]   ;NAME OF MACHINE IN 8-BIT ASCII
1480 EXPUNGE FOO,BAR
1481         MOVEM B,%CPKDT(A)
1482         SETZM %CPKDT+1(A)
1483         MOVSI B,%CPKDT+1(A)
1484         HRRI B,%CPKDT+2(A)
1485         BLT B,%CPKDT+7(A)
1486         MOVE B,[.BYTE 8 ? MYCHAD/400 ? 1 ? 4+IFN CH10P+CH11P,[10.] ? 0 ]
1487         MOVEM B,%CPKDT+10(A)
1488         MOVEI B,%CPKDT+11(A)
1489         HRLI B,441000
1490         MOVE T,CHNPI
1491         PUSHJ P,CHRF3A
1492         MOVE T,CHNPO
1493         PUSHJ P,CHRF3A
1494 IFN CH10P+CH11P,[
1495         MOVE T,CHNABT
1496         PUSHJ P,CHRF3A
1497         MOVE T,CHNLOS
1498         PUSHJ P,CHRF3A
1499         MOVE T,CHNCRC
1500         PUSHJ P,CHRF3A
1501         MOVE T,CHNCR2
1502         PUSHJ P,CHRF3A
1503         MOVE T,CHNPLE
1504         ADD T,CHNWLE
1505         PUSHJ P,CHRF3A
1506 ];CH10P+CH11P
1507         MOVEI T,%COANS
1508         SETZM (A) .SEE $CPKFC
1509         DPB T,[$CPKOP(A)]
1510         MOVE T,%CPKS(A)         ;EXCHANGE SOURCE AND DESTINATION
1511         EXCH T,%CPKD(A)
1512         MOVEM T,%CPKS(A)
1513         MOVEI C,13*4+IFN CH10P+CH11P,[20.]      ;BYTE COUNT
1514         JRST CHIRF5             ;SEND
1515
1516 CHRF3A: MOVEI TT,4
1517         IDPB T,B
1518         LSH T,-8
1519         SOJG TT,.-2
1520         POPJ P,
1521 \f
1522 ;HERE TO CONVERT A BRD INTO AN RFC
1523
1524 CHIBRD: LDB T,[$CPKAN(A)]       ;NUMBER OF BITMAP BYTES
1525         LDB TT,[$CPKNB(A)]      ;NUMBER OF TOTAL DATA BYES (INCLUDES BITMAP)
1526         CAIG T,32.              ;ACK NUMBER NO GREATER THAN 32.
1527          TRNE T,3               ; MUST BE MULTIPLE OF 4
1528           JRST CHABRT           ;  FREE THE PACKET IF NO GOOD
1529         CAMG TT,T               ;MUST BE SOME TEXTUAL RFC DATA AS WELL
1530          JRST CHABRT            ; IF NOT, FREE PACKET
1531         MOVE C,TT               ;GET NUMBER OF BYTES (CHIRFC WANTS COUNT IN C)
1532         SUB C,T                 ;WITHOUT BITMAP
1533         DPB C,[$CPKNB(A)]       ;NEW BYTE COUNT
1534         LSH T,-2                ;CONVERT BITMAP BYTE COUNT TO WORD COUNT
1535         ADDI TT,3               ;CONVERT BYTE COUNT TO...
1536         LSH TT,-2               ;... WORD COUNT
1537         MOVEI D,%CPKDT(A)       ;GET POINTER TO BEGINNING OF DATA
1538         HRL D,D                 ;IN UPPER AND LOWER HALVES (ALMOST BLT POINTER)
1539         HRLZ T,T                ;BITMAP WORD COUNT,,0
1540         ADD D,T                 ;RFC-STRING,,DATA-FIELD
1541         ADDI TT,%CPKDT-1(A)     ;LAST LOCATION FOR BLT
1542         BLT D,(TT)
1543         SETZI TT,
1544         DPB TT,[$CPKAN(A)]      ;ZERO THE ACK FIELD
1545         MOVE TT,MYCHAD
1546         DPB TT,[$CPKDA(A)]      ;PRETEND IT WAS FOR ME
1547         JRST CHIRFC             ;AND HANDLE IT AS AN RFC
1548
1549 \f
1550 ;ROUTINE TO FIND INDEX PACKET CORRESPONDS TO, SKIP IF FOUND, INDEX IN I.
1551 ;ALSO RETURNS STATE IN E SINCE THAT'S OFTEN HANDY.
1552 ;ALSO SETS B FOR CHALOS
1553 CHFNDX: MOVEI B,[ASCIZ/Connection does not exist at this end/]
1554         LDB I,[$CPKDX(A)]       ;GET REAL-INDEX PART OF DESTINATION INDEX
1555         CAIGE I,NINDX
1556          SKIPGE CHSUSR(I)
1557           POPJ P,               ;NO MATCH
1558         SKIPGE CHSSTA(I) .SEE %CFOFF
1559          POPJ P,                ;NOT TALKING TO NETWORK
1560         HRRZ E,CHSSTA(I)
1561         MOVE TT,%CPKD(A)
1562         MOVE T,%CPKS(A)
1563         CAIN E,%CSRFS           ;IF IN RFC-SENT STATE, ONLY
1564          AND T,[.BYTE 16. ? -1 ? 0]     ;THE SOURCE HOST HAS TO MATCH
1565         CAMN TT,CHSLCL(I)       ;COMPARE LOCAL ADDRESS
1566          CAME T,CHSFRN(I)       ; AND FOREIGN ADDRESS
1567           POPJ P,               ;NO MATCH
1568         MOVE T,TIME
1569         MOVEM T,CHSITM(I)
1570         JRST POPJ1              ;SUCCEED, CALLER CHECKS THE STATE
1571
1572 ;INTERRUPT LEVEL PROCESSING OF RECEIVED OPN PACKET
1573 CHIOPN: PUSHJ P,CHFNDX          ;FIND CONNECTION TO BE OPENED
1574          JRST CHALOS
1575         CAIE E,%CSRFS           ;NOT IN RFC-SENT STATE,
1576          JRST CHABRT            ; MUST BE DUPLICATE, DISCARD.
1577         LDB B,[$CPKPN(A)]       ;GET ITS PACKET NUMBER
1578         HRLM B,CHSPKN(I)        ;INITIALIZE PACKET NUMBERING OF RECEIVED MESSAGES
1579         MOVE B,%CPKS(A)
1580         MOVEM B,CHSFRN(I)       ;HOOK 'EM UP
1581         PUSHJ P,CHIST1          ;PROCESS AS A STS, DISCARD
1582         PUSHJ P,CHASTO          ;RESPOND WITH A STS
1583         MOVEI W,%CSOPN
1584         ;DROP INTO CHINT
1585
1586 ;COME HERE WITH INDEX IN I AND NEW STATE IN W, TO CHANGE STATE AND INTERRUPT
1587 CHINT:  HRRM W,CHSSTA(I)
1588         MOVE T,TIME
1589         MOVEM T,CHSITM(I)       ;IN CASE GOT HERE FROM CHOLSN
1590         MOVSI T,%CFOFF
1591         CAIE W,%CSOPN
1592          IORM T,CHSSTA(I)       ;DISENGAGE PI LEVEL
1593         CAIN W,%CSOPN
1594          ANDCAM T,CHSSTA(I)     ;NOW OPEN, ENGAGE PI LEVEL
1595 ;COME HERE TO INTERRUPT ON THE INPUT CHANNEL.  SMASHES T,TT,W
1596 CHINTI: LDB T,[$CHSUI,,CHSUSR(I)]
1597 CHINT2: MOVE TT,CHSSTA(I)       ;SIGNAL USER OR STY?
1598         TLNN TT,%CFSTY
1599          JRST CHINT4            ;USER
1600         LDB T,[$CFTTN,,TT]      ;STY, GET TTY NUMBER
1601         CONO PI,PIOFF           ;PROTECT LIST MODIFICATION
1602         SKIPL STYNTL-NFSTTY(T)  ;DON'T PUT ON LIST TWICE
1603          JRST PIONJ
1604         MOVE TT,STYNTA          ;ADD TO LIST
1605         MOVEM TT,STYNTL-NFSTTY(T)
1606         MOVEM T,STYNTA
1607         JRST PIONJ
1608
1609 CHINT4: SKIPGE TT,CHSUSR(I)
1610          JRST 4,.
1611         MOVSI W,(SETZ)          ;PCLSR THE JOB SO IT GETS AN IOC ERROR IF NEEDFUL
1612         IORM W,PIRQC(TT)        ;EVEN IF NORMAL INTERRUPTS ARE NOT ENABLED
1613         CAIN T,77
1614          POPJ P,                ;IOPUSH'D, NO INTERRUPT
1615         MOVE T,CHNBIT(T)
1616         AND T,MSKST2(TT)
1617         IORM T,IFPIR(TT)
1618         POPJ P,
1619 \f
1620 OVHMTR CHD
1621
1622 ;INTERRUPT LEVEL PROCESSING OF RECEIVED DATA PACKET
1623 CHIDAT: PUSHJ P,CHFNDX          ;FIND ASSOCIATED CONNECTION
1624          JRST CHALOS            ;NONE, LOSS
1625         CAIE E,%CSOPN           ;STATE MUST BE OPEN
1626          JRST CHALOS            ;BAD, LOSS
1627         PUSHJ P,CHIACK          ;PROCESS ACKNOWLEDGEMENT FIELD
1628 ;NOW DECIDE WHETHER IT GOES ON CHSIBF(I), OR ON CHSPBF(I), OR GETS DISCARDED.
1629         HLRZ B,CHSPKN(I)        ;LAST PACKET NUMBER GIVEN TO USER
1630         LDB C,[$CPKPN(A)]       ;GET PACKET NUMBER OF THE NEW PACKET
1631         HLRZ T,CHSWIN(I)        ;RECEIVE WINDOW SIZE
1632         ADDI T,(B)              ;HIGHEST LEGAL PACKET NUMBER
1633         SUB T,C
1634         TRNE T,100000           ;SKIP IF T >= C
1635          JRST CHABRT            ;FOO ON YOU, OVER WINDOW SIZE
1636         HRRZ T,CHSIBF(I)        ;COMPUTE NEXT IN-ORDER PACKET EXPECTED
1637         JUMPE T,CHIDT6          ;BASED ON LAST IN-ORDER PACKET
1638         LDB TT,[$CPKOP(T)]
1639         CAIE TT,%COUNC
1640          JRST [ LDB B,[$CPKPN(T)]
1641                 JRST CHIDT6 ]
1642         HLRZ T,CHSIBF(I)        ;IF IT'S AN UNC, HAVE TO GO FIND CORRECT PACKET
1643 CHIDT5: LDB TT,[$CPKOP(T)]
1644         CAIE TT,%COUNC
1645          LDB B,[$CPKPN(T)]
1646         HRRZ T,-2(T)
1647         JUMPN T,CHIDT5
1648 CHIDT6: ADDI B,1
1649         ANDI B,177777           ;NEXT IN-ORDER PACKET EXPECTED
1650         CAMN B,C
1651          JRST CHIDT1            ;EQUAL, IT GOES ON THE END OF CHSIBF(I) LIST.
1652         SUB B,C                 ;NOT EQUAL, COMPARE THEM MODULO 2^16.
1653         TRNN B,100000
1654          JRST CHIDTD            ;B GREATER, THIS IS AN OLD PACKET, DISCARD IT
1655         ;PUT ON CHSPBF(I) IN PROPER ORDER
1656         ;A IS THIS PACKET, C IS HIS NUMBER, B IS PREDECESSOR, D IS NEXT, E IS HIS #
1657         MOVEI B,0               ;SIGNIFY AT FRONT OF LIST
1658         HLRZ D,CHSPBF(I)        ;GET FIRST PACKET ON OUT-OF-ORDER LIST
1659         JUMPE D,CHIDT4          ;LIST IS EMPTY
1660 CHIDT3: LDB E,[$CPKPN(D)]
1661         SUB E,C                 ;COMPARE PACKET NUMBERS
1662         JUMPE E,CHIDTD          ;DUPLICATE, DISCARD
1663         TRNE E,100000
1664          JRST [ MOVE B,D        ;E IS LESS, KEEP LOOPING
1665                 HRRZ D,-2(B)
1666                 JUMPN D,CHIDT3
1667                 JRST .+1 ]      ;REACHED END PUT IT HERE
1668         SKIPE B
1669          HRRM A,-2(B)           ;THREAD ONTO PREVIOUS PACKET
1670         SKIPN D
1671 CHIDT4:  HRRM A,CHSPBF(I)       ;THREAD ONTO BACK OF LIST
1672         SKIPN B
1673          HRLM A,CHSPBF(I)       ;THREAD ONTO FRONT OF LIST
1674         HRRM D,-2(A)            ;THREAD IN BEFORE PACKET IN D
1675         MOVSI B,1
1676         ADDM B,CHSNBF(I)
1677         POPJ P,
1678
1679 ;HERE IT GOES ON CHSIBF(I).  A HAS PACKET, C HAS ITS PACKET NUMBER.
1680 ;IF GETTING HERE FROM CHICL1, C HAS GARBAGE BUT IT WILL NEVER BE USED.
1681 CHIDT1: SKIPN CHSIBF(I)
1682          PUSHJ P,CHINTI         ;THERE WAS NO INPUT, BUT THERE IS NOW, COME AND GET IT
1683         AOS CHSNBF(I)
1684         MOVEI Q,CHSIBF(I)
1685         PUSHJ P,CHAQPL          ;PUT ON END OF RECEIVE LIST
1686         HLRZ A,CHSPBF(I)        ;GET FIRST OUT-OF-ORDER PACKET
1687         JUMPE A,CPOPJ           ;NONE
1688         LDB B,[$CPKPN(A)]       ;SEE IF THIS PACKET IS NOW IN-ORDER
1689         CAIL C,177777           ;BY COMPARING AGAINST C+1 MODULO 2^16.
1690          TDZA C,C
1691           ADDI C,1
1692         CAME B,C
1693          POPJ P,                ;NO
1694         MOVEI Q,CHSPBF(I)
1695         PUSHJ P,CHAQGF          ;YES, PULL PACKET OF OUT-OF-ORDER LIST
1696         MOVSI B,-1
1697         ADDM B,CHSNBF(I)
1698         JRST CHIDT1             ;AND GO PUT ONTO IN-ORDER LIST
1699
1700 ;HERE IF PACKET IS A DUPLICATE AND IS TO BE DISCARDED.  MUST SEND
1701 ;RECEIPT TO SHUT OFF EXCESS RETRANSMISSION.
1702 CHIDTD: PUSHJ P,CHABRT
1703         AOS CHNPD
1704         JRST CHASTO
1705
1706 ;HERE FOR RECEIVING AN UNC PACKET
1707 CHIUNC: LDB I,[$CPKDI(A)]       ;Destination index zero?
1708         JUMPE I,CHIUN2  
1709         LDB I,[$CPKDX(A)]       ;GET REAL-INDEX PART OF DESTINATION INDEX
1710         CAIGE I,NINDX
1711          SKIPGE CHSUSR(I)
1712           JRST CHALOS           ;NO MATCH
1713         MOVE TT,%CPKD(A)        ;DESTINATION ADDRESS MATCHES?
1714         CAME TT,CHSLCL(I)
1715          JRST CHALOS
1716         HRRZ E,CHSSTA(I)        ;IN FOREIGN PROTOCOL MODE?
1717         CAIN E,%CSFRN
1718          JRST CHIUN1
1719         MOVE TT,%CPKS(A)        ;NORMAL PROTOCOL, SOURCE ADDRESS MUST MATCH
1720         CAMN TT,CHSFRN(I)
1721          CAIE E,%CSOPN          ;AND STATE MUST BE OPEN
1722           JRST CHALOS
1723 CHIUN1: MOVE TT,TIME
1724         MOVEM TT,CHSITM(I)
1725         SKIPE T,CHSIBF(I)       ;DISCARD PACKET IF OVER WINDOW SIZE
1726          JRST [ LDB TT,[$CPKOP(T)]      ; AND ALREADY HAVE AN UNC
1727                 HRRZ T,CHSNBF(I)
1728                 HLRZ Q,CHSWIN(I)
1729                 CAML T,Q
1730                  CAIE TT,%COUNC
1731                   JRST .+2
1732                 JRST CHABRT ]           
1733           PUSHJ P,CHINTI        ;THERE WAS NO INPUT, BUT THERE IS NOW, COME AND GET IT
1734         AOS CHSNBF(I)           ;PUT ON END OF RECEIVE LIST.
1735         MOVEI Q,CHSIBF(I)       ;PACKET NUMBER IS RANDOM, NOTHING LOOKS AT IT
1736         JRST CHAQPL
1737
1738 CHIUN2:
1739 IFE INETP,JRST CHALOS           ;No comprendo internet
1740 IFN INETP,[
1741         LDB I,[$CPKAN(A)]       ;Protocol number
1742         CAIE I,8_8              ;DOD Internet #x0800
1743          JRST CHALOS
1744         AOS CHNIPI              ;Meter Internet packets in from Chaosnet
1745         MOVE J,A                ;Save Chaosnet packet
1746         LDB A,[$CPKNB(A)]       ;Compute size of Internet datagram in words
1747         ADDI A,3
1748         LSH A,-2
1749         MOVE C,A                ;Save word count
1750         CALL IPGIPT             ;Get buffer to copy datagram into
1751          JRST CHIUN3            ;No buffers available, discard packet
1752         MOVSI T,%CPKDT(J)       ;Make BLT pointer
1753         HRRI T,1(B)
1754         ADDI B,(C)              ;Address of last destination word
1755         BLT T,(B)
1756         EXCH A,J                ;Free the Chaosnet packet
1757         CALL CHABRT
1758         MOVE A,J                ;Datagram structure
1759         MOVE B,C                ;Word count
1760         MOVEI C,0               ;Offset to start of IP header
1761         CALRET IPRDGM           ;Dispose of datagram
1762
1763 CHIUN3: MOVE A,J                ;Discard Chaosnet packet
1764         CALRET CHABRT
1765 ];INETP
1766 \f
1767 OVHMTR CHJ
1768
1769 ;INTERRUPT LEVEL PROCESSING OF LOS
1770 CHILOS: PUSHJ P,CHFNDX          ;FIND CONNECTION TO BE BROKEN
1771          JRST CHABRT            ;NONE, IGNORE
1772         MOVEI W,%CSLOS          ;PUT INTO LOST STATE
1773         JRST CHICL2             ;GIVE PACKET TO USER AS DATA, DISENGAGE, AND INTERRUPT
1774
1775 ;INTERRUPT LEVEL PROCESSING OF STS
1776 CHISTS: PUSHJ P,CHFNDX
1777          JRST CHALOS
1778         CAIE E,%CSOPN           ;CONNECTION MUST BE OPEN
1779          JRST CHALOS
1780 CHIST1: LDB B,[042000,,%CPKDT(A)]       ;GET NEW WINDOW SIZE
1781         CAILE B,MXWIND
1782          MOVEI B,MXWIND
1783         HRRM B,CHSWIN(I)
1784         LDB B,[242000,,%CPKDT(A)]       ;PROCESS RECEIPT
1785         PUSHJ P,CHIAK0
1786         PUSHJ P,CHABRT
1787         JRST CHARTR             ;RETRANSMIT
1788
1789 OVHMTR CHA
1790
1791 ;INTERRUPT LEVEL PROCESSING OF RECEIVED ACKNOWLEDGEMENT.
1792 ;REMOVE THE ACKNOWLEDGED PACKETS FROM THE INDEX'S SEND LIST AND UPDATE CHSNOS(I).
1793 ;NOTE THAT THE LIST IS ASSUMED TO BE SORTED SO WE ONLY
1794 ;REMOVE PACKETS FROM THE FRONT.  CLOBBERS B,C,D,T,TT,Q.
1795 CHIACK: LDB B,[$CPKAN(A)]       ;PACKET NUMBER BEING RECEIPTED
1796 CHIAK0: LDB T,[$CPKAN(A)]       ;ENTER HERE FROM CHISTS
1797         HRRZ D,CHSACK(I)        ;GET MAX OF THIS ACKNOWLEDGE AND PREVIOUS
1798         SUB D,T
1799         TRNE D,100000
1800          HRRM T,CHSACK(I)       ;ACKNOWLEDGED PACKET NUMBER IS NEW START OF WINDOW
1801         PUSH P,A
1802         HLRZ A,CHSOBF(I)        ;MAP DOWN SEND LIST
1803         JUMPE A,CHIAK2          ;LIST EMPTY
1804 CHIAK1: LDB D,[$CPKPN(A)]
1805         SUBM B,D
1806         TRNE D,100000
1807          JRST CHIAK2            ;RCP# LESS THAN PKT#
1808         HRRZ C,-2(A)            ;GET NEXT PACKET
1809         HLLOS D,-2(A)           ;MARK NOT ON SEND LIST
1810         AOJE D,CHIAK3           ;AND JUMP IF NOT ON TRANSMIT LIST
1811 IFN DLCP,[
1812         MOVEI Q,DLCXMQ          ;ON TRANSMIT LIST, TRY TO TAKE OFF
1813         PUSHJ P,CHIAKF
1814 ];DLCP
1815 IFN T11CHP,[
1816         MOVEI Q,T11XMQ
1817         PUSHJ P,CHIAKF
1818 ];T11CHP
1819 IFN CH10P+CH11P,[
1820         MOVEI Q,CHXXMQ
1821         PUSHJ P,CHIAKF
1822 ];CH10P+CH11P
1823         CAIA                    ;AND DON'T FREE IT
1824 CHIAK3:  PUSHJ P,CHABRT
1825         HRLM C,CHSOBF(I)
1826         SKIPE A,C
1827          JRST CHIAK1
1828         SETZM CHSOBF(I)         ;SEND LIST NOW EMPTY
1829 CHIAK2: MOVE D,CHSNOS(I)        ;COMPUTE NEW VALUE OF CHSNOS
1830         HRRZ T,CHSACK(I)        ;START OF WINDOW
1831         HRRZ C,CHSPKN(I)        ;LAST PACKET SENT
1832         SUB T,C
1833         SKIPLE T
1834          SUBI T,200000          ;T GETS NEGATIVE AMOUNT OF WINDOW OCCUPIED
1835         ADD T,CHSWIN(I)         ;RH(T) GETS AVAILABLE PORTION OF WINDOW
1836         HRREM T,CHSNOS(I)       ;WHICH IS NUMBER OF OUTPUT SLOTS
1837         JUMPG D,POPAJ           ;IF FORMERLY THERE WERE NO OUTPUT SLOTS,
1838         LDB T,[$CHSUO,,CHSUSR(I)]
1839         SKIPLE CHSNOS(I)        ;AND NOW THERE ARE,
1840          PUSHJ P,CHINT2         ;INTERRUPT ON THE OUTPUT CHANNEL
1841         JRST POPAJ
1842
1843 ;TRY TO TAKE PACKET IN A OFF OF TRANSMIT LIST IN Q.
1844 ;CLOBBER T,Q,D.  CALLED WITH INTERRUPTS OFF.
1845 ;MAY RETURN WITH A POINTING TO FREE BUT THAT IS OK AT THIS TIME.
1846 CHIKF1: SKIPA D,T
1847 CHIAKF:  MOVEI D,2(Q)           ;LH[-2(D)] POINTS TO (T)
1848         HLRZ T,-2(D)
1849         JUMPE T,CPOPJ           ;NOT FOUND
1850         CAIE T,(A)
1851          JRST CHIKF1
1852         HLRZ T,-2(A)            ;LINK OUT
1853         HRLM T,-2(D)
1854         JUMPN T,CHABRT          ;JUMP IF DIDN'T DELETE LAST PACKET IN LIST
1855         HRRM D,(Q)              ;NEW LAST PACKET IN LIST
1856         CAIN D,2(Q)
1857          SETZM (Q)              ;FOO, TRANSMIT LIST NOW EMPTY
1858         JRST CHABRT
1859 \f
1860 SUBTTL CHAOS NET DL10 INTERRUPT ROUTINE
1861
1862 OVHMTR CHH
1863
1864 IFN DLCP,[
1865
1866 ;COME HERE FROM EACH DL10 INTERRUPT AT TTY LEVEL.  SMASH ALL REGISTERS EXCEPT P AND 0.
1867 DLCWAK: CONI PI,E               ;SAVE PI STATUS AND SWITCH TO NETWORK INTERRUPT LEVEL
1868         ANDI E,177
1869         PUSH P,E
1870         CONO PI,NETOFF
1871 DLCWK1: MOVEI J,1               ;ALWAYS CHECK BOTH BUFFERS SO WE CAN'T GET OUT OF PHASE WITH 11
1872         MOVEI R,2               ;CHECK FOR INPUT AVAILABLE
1873         CAME R,DLCRS1(J)
1874          SOJGE J,.-1
1875         JUMPL J,DLCWK2
1876         MOVE A,DLCRA1(J)        ;GOT INPUT, PROCESS IT
1877         SETZM DLCRS1(J)         ;BUFFER SLOT NOT OCCUPIED NOW
1878 IFN KS10P, CLRCSH
1879 IFN KL10P, PUSHJ P,DLCSWP       ;SWEEP CACHE IN CASE ANYONE HAPPENED TO TOUCH BUFFER
1880         SKIPE A                 ;THIS CAN HAPPEN IF PDP11 WAS JUST STUFFED
1881          PUSHJ P,CHAPII         ;PROCESS THE PACKET
1882         PUSHJ P,DLCIBG          ;SUPPLY A NEW INPUT BUFFER TO 11
1883         JRST DLCWK1             ;TRY FOR MORE INPUT
1884
1885 DLCWK2: MOVEI J,1               ;SCAN CHANNELS FOR OUTPUT DONE
1886         CAME R,DLCSS1(J)
1887 DLCWK3:  SOJGE J,.-1
1888         JUMPL J,DLCWK4
1889         MOVE A,DLCSA1(J)        ;FOUND AN OUTPUT DONE BUFFER
1890         HRROS B,-2(A)           ;MARK IT NOT ON TRANSMIT LIST
1891         AOJN B,.+2              ;AND UNLESS IT IS ON SEND LIST
1892          PUSHJ P,CHABRT         ;RETURN IT TO FREE
1893         SETZM DLCSA1(J)         ;IDLE THIS BUFFER
1894         SETZM DLCSS1(J)
1895         JRST DLCWK3
1896
1897 DLCWK4: MOVE J,DLCSBF           ;TRY TO SEND SOME OUTPUT
1898         SKIPE DLCSS1(J)
1899          JRST DLCWK9            ;BUFFER BUSY
1900         HLRZ A,DLCXMQ           ;GET ANOTHER OFF TRANSMIT QUEUE
1901         JUMPE A,DLCWK9          ;QUEUE EMPTY
1902         HLRZ T,-2(A)
1903 IFN FTRCHK,[
1904         CAIN T,-1
1905          BUG PAUSE,[CHAOS LIST THREAD TRASHED],OCT,A,OCT,-2(A)
1906 ];FTRCHK
1907         HRLM T,DLCXMQ
1908 IFN FTRCHK,[
1909         JUMPN T,.+4
1910           CAME A,DLCXMQ         ;REACHED END OF LIST, END IN RIGHT PLACE?
1911            BUG PAUSE,[DCLXMQ THREAD TRASHED]
1912           SETZM DLCXMQ
1913 ];FTRCHK
1914 IFE FTRCHK,[
1915         SKIPN T
1916          SETZM DLCXMQ
1917 ];FTRCHK
1918         PUSHJ P,DLCXMT          ;SEND IT ON THIS BUFFER
1919         JRST DLCWK4             ;GO TRY TO SEND ON OTHER BUFFER
1920
1921 DLCWK9: POP P,E
1922         CONO PI,PICON(E)        ;RESTORE PI
1923         POPJ P,
1924 \f
1925 ;THIS ROUTINE SUPPLIES AN INPUT BUFFER TO THE 11 ON ALL BUFFERS THAT NEED IT
1926 ;CALL WITH INTERRUPTS OFF OR IN PROGRESS
1927 DLCIBG: MOVEI J,1
1928         SKIPE DLCRS1(J)
1929 DLCIB1:  SOJGE J,.-1
1930         JUMPL J,CPOPJ
1931         PUSHJ P,CHABGI          ;GET A BUFFER
1932          JRST [ SETZM DLCRA1(J) ;NO MEMORY, WILL TRY AGAIN AT CLOCK LEVEL
1933                 SETZM DLCRS1(J)
1934                 POPJ P, ]
1935         SETZM (A)               ;CLEAR THE BUFFER SINCE THE DL10 DOESN'T TOUCH LOW 4 BITS
1936         HRLZ T,A
1937         HRRI T,1(A)
1938         BLT T,%CPMXW-1(A)
1939         MOVEM A,DLCRA1(J)       ;MAKE AVAILABLE TO PDP11
1940         HRLI A,120000
1941         MOVEM A,DLCRP1(J)
1942         SOS DLCRP1(J)
1943 IFN KS10P, .ERR CLRCSH not needed here?
1944 IFN KL10P, PUSHJ P,DLCSWP       ;SWEEP CACHE BEFORE SIGNALLING 11
1945         MOVEI T,1
1946         MOVEM T,DLCRS1(J)
1947         CONO DLC,100040+TTYCHN  ;INTERRUPT 11
1948         JRST DLCIB1             ;TRY FOR OTHER BUFFER ALSO
1949
1950 ;THIS ROUTINE SENDS PACKET IN A TO DL10 (CALL WITH NETOFF OR IN PROGRESS)
1951 ;SWITCHES BUFFERS, LEAVES NEW ONE IN J
1952 DLCXMT: MOVE J,DLCSBF
1953         MOVEM A,DLCSA1(J)
1954         HRLI A,120000
1955         MOVEM A,DLCSP1(J)       ;GIVE 11 POINTER TO NEW PACKET
1956         SOS DLCSP1(J)
1957 IFN KS10P, .ERR CLRCSH not needed here?
1958 IFN KL10P, PUSHJ P,DLCSWP       ;SWEEP CACHE, PUTTING PACKET INTO CORE
1959         MOVEI T,1
1960         MOVEM T,DLCSS1(J)       ;ACTIVATE PDP11
1961         CONO DLC,100040+TTYCHN
1962         XORI J,1                ;NEXT BUFFER
1963         MOVEM J,DLCSBF
1964         POPJ P,
1965
1966 IFN KL10P,[
1967 ;THIS ROUTINE SWEEPS PACKET IN A OUT OF THE CACHE,
1968 ;CLOBBERING B, C, AND D.
1969 IFG PKTBSZ-1000, .ERR PKTBSZ BIGGER THAN HARDWARE PAGE SIZE, CACHE SWEEP LOSES
1970 DLCSWP: LDB D,[111100,,A]       ;SWEEP ONE PAGE OF CACHE
1971         SWPUO (D)               ;STORING PACKET INTO CORE
1972         MOVE B,[CONSZ 200000]   ;AWAIT COMPLETION IN ACS
1973         MOVE C,[JRST B]         ;TO MINIMIZE CACHE INTERFERENCE
1974         MOVSI D,(POPJ P,)
1975         JRST B
1976 ];KL10P
1977 ];DLCP
1978 \f
1979 SUBTTL CHAOS NET TEN-11 INTERFACE STUFF
1980
1981 IFN T11CHP,[
1982 ;THIS ROUTINE CHECKS FOR TEN-11 INITIALIZATION, SKIP-RETURNS IF OK TO USE
1983 ;CLOBBERS T,TT
1984 T11CHK: SKIPE TEN11F
1985          JRST T11LUZ            ;NOT SUPPOSED TO USE TEN11
1986         MOVE T,T11VER           ;CHECK VERSION TO MAKE SURE RIGHT PROGRAM, ETC.
1987         CAME T,[.BYTE 8 ? "H ? "C ? 0 ? 1]
1988          JRST T11LUZ            ;PROBABLY TURNED OFF OR WRONG PROGRAM
1989         SKIPE T11I10            ;SHOULD WE REINIT?
1990          JRST T11CK1            ;YES, GO DO SO
1991         SKIPLE T,T11WIN         ;ARE WE WINNING?
1992          JRST POPJ1             ;YES, FINE
1993         JUMPE T,[SETOM T11WIN   ;NOW THAT VERSION IS OK, TELL 11 TO INIT
1994                  MOVSI T,-1
1995                  MOVEM T,T11I11
1996                  JRST T11CK1 ]  ;AND INIT OURSELVES
1997         SKIPE T11I11            ;WAITING FOR 11 TO REINIT?
1998          POPJ P,                ;YES, WAIT
1999 ;HERE TO REINIT.  FIRST, PICK UP PARAMETERS.
2000 T11CK1: LDB TT,[242000,,T11PRM] ;BYTES PER PACKET BUFFER
2001         CAIGE TT,<%CPMXW+1>*4   ;BETTER BE RIGHT SIZE
2002          JRST T11LUZ            ;TOO SMALL (ASSUME IF TOO BIG, PACKETS WON'T BE)
2003         LSH TT,-2
2004         MOVEM TT,T11BSZ         ;SAVE BUFFER SIZE IN PDP10 WORDS
2005         LDB T,[042000,,T11PRM]  ;NUMBER OF BUFFERS IN EACH DIRECTION
2006         IMULB T,TT              ;NUMBER OF PDP10 WORDS IN EACH DIRECTION
2007         ADD TT,T11IBB
2008         MOVEM TT,T11IBE         ;INIT POINTERS
2009         MOVEM TT,T11OBB
2010         MOVEM TT,T11OBP
2011         ADD TT,T
2012         MOVEM TT,T11OBE
2013         HRREI T,-T11CHS-2000(TT)
2014         JUMPG T,T11LUZ          ;COMMUNICATION AREA LONGER THAN 1K
2015         MOVE T,T11IBB
2016         MOVEM T,T11IBP
2017 T11CK2: SETZM (T)               ;CLEAR BUFFER HEADERS
2018         ADD T,T11BSZ
2019         CAMGE T,TT
2020          JRST T11CK2
2021         MOVEM T,T11WIN          ;WE'RE WINNING (MAKE T11WIN POSITIVE NON-ZERO)
2022         SETZM T11I10            ;INIT DONE
2023         JRST POPJ1
2024
2025 ;HERE IF PDP11 PARAMETERS DON'T MATCH WHAT WE EXPECT
2026 T11LUZ: SETZM T11WIN            ;NOT WINNING
2027         POPJ P,
2028 \f
2029 ;HERE FROM CLOCK LEVEL TO CHECK ON TEN-11 CHAOS NET CHANNEL
2030 T11WAK: PUSHJ P,T11CHK          ;IS EVERYTHING OK?
2031          POPJ P,                ;NO.
2032 T11WK0: MOVE C,T11IBP           ;CHECK INPUT
2033         SKIPN (C)
2034          JRST T11WK1            ;NONE AVAILABLE
2035         MOVSI J,2(C)            ;POINT TO PACKET
2036         LDB D,[$CPKNB+2(C)]     ;GET SIZE OF PACKET
2037         ADDI D,4*%CPKDT+3       ;CONVERT BYTES TO WORDS INCLUDING HEADER
2038         LSH D,-2
2039         CAILE D,%CPMXW          ;DON'T GET FAKED OUT BY CLOBBERED COUNT
2040          MOVEI D,%CPMXW
2041         PUSHJ P,CHABGI          ;GET PLACE TO PUT IT
2042          JRST T11WK1            ;NONE AVAILABLE
2043         HRLOI E,-1(D)
2044         EQVI E,(A)              ;AOBJN POINTER TO PACKET BUFFER
2045         HRRI J,(A)              ;BLT POINTER TO COPY PACKET
2046         ADDI D,-1(A)            ;LAST WORD
2047         BLT J,(D)               ;COPY PACKET FROM 11 TO 10
2048         MOVEI H,0               ;COMPUTE CHECKSUM
2049 T11WK4: ADD H,(E)
2050         LSH H,-1
2051         TRZE H,10
2052          TLO H,(SETZ)
2053         AOBJN E,T11WK4
2054         MOVE TT,1(C)            ;GET PDP11'S CHECKSUM
2055         SETZM (C)               ;GIVE THE 11 BACK THE BUFFER
2056         ADD C,T11BSZ            ;ADVANCE THE POINTER
2057         CAML C,T11IBE
2058          MOVE C,T11IBB
2059         MOVEM C,T11IBP
2060         CAME H,TT
2061          JRST [ AOS T11CKE      ;COUNT CHECKSUM ERRORS
2062                 PUSHJ P,CHABRT  ;AND DISCARD PACKET
2063                 JRST T11WK0 ]
2064         CONO PI,NETOFF
2065         PUSHJ P,CHAPII          ;PROCESS THE INPUT
2066         CONO PI,NETON
2067         JRST T11WK0
2068
2069 T11WK1: CONO PI,NETOFF
2070         SKIPE T11XMQ            ;ANY OUTPUT?
2071          SKIPE @T11OBP          ;AND OUTPUT BUFFER SPACE AVAILABLE?
2072           JRST NETONJ           ;NO, RETURN FROM T11WAK
2073         HLRZ A,T11XMQ           ;GET PACKET OFF TRANSMIT QUEUE
2074         HLRZ B,-2(A)            ;GET NEXT AFTER THAT
2075         HRLM B,T11XMQ           ;BECOMES NEW HEAD OF QUEUE
2076         SKIPN B
2077          SETZM T11XMQ
2078         PUSHJ P,T11XMT          ;COPY PACKET INTO 11
2079         CONO PI,NETON
2080         JRST T11WK1             ;LOOK FOR MORE OUTPUT
2081
2082 ;SEND PACKET A-> TO 11.  SMASHES B,C,T,TT,Q.  CALL WITH NETOFF.
2083 T11XMT: LDB C,[$CPKNB(A)]       ;GET BYTE COUNT
2084         MOVE Q,C                ;MUST CLEAR UNUSED BYTES AT END OF LAST WORD
2085         ANDI Q,3                ;TO MAKE THE CHECKSUM COME OUT RIGHT
2086         ADDI C,4*%CPKDT+3
2087         LSH C,-2                ;CONVERT TO WORD COUNT
2088         MOVE Q,(Q)[ -1          ;MASK FOR BYTES TO RETAIN IN LAST WORD
2089                     <.BYTE 8 ? -1>
2090                     <.BYTE 8 ? -1 ? -1>
2091                     <.BYTE 8 ? -1 ? -1 ? -1> ]
2092         MOVEI TT,-1(C)
2093         ADD TT,A
2094         ANDM Q,(TT)             ;MASK OFF LAST WORD
2095         HRLOI C,-1(C)
2096         EQVI C,(A)              ;AOBJN PTR
2097         MOVEI TT,0              ;COMPUTE XOR CHECKSUM IN TT
2098         SKIPA B,T11OBP          ;-> CURRENT OUTPUT BUFFER IN 11
2099 T11XM1:  ADDI B,1
2100         MOVE T,(C)
2101         TRZ T,17                ;CLEAR BITS 10-11 TREATS SPECIALLY
2102         ADD TT,T                ;COMPUTE CHECKSUM
2103         LSH TT,-1
2104         TRZE TT,10
2105          TLO TT,(SETZ)
2106         MOVEM T,2(B)
2107         AOBJN C,T11XM1
2108         MOVE B,T11OBP
2109         MOVEM TT,1(B)           ;GIVE CHECKSUM TO 11
2110         MOVSI TT,-1
2111         MOVEM TT,0(B)           ;GIVE PACKET TO 11
2112         ADD B,T11BSZ            ;ADVANCE BUFFER POINTER
2113         CAML B,T11OBE
2114          MOVE B,T11OBB
2115         MOVEM B,T11OBP
2116         HRROS T,-2(A)           ;TAKE PACKET OFF TRANSMIT LIST
2117         AOJN T,.+2
2118          PUSHJ P,CHABRT         ;NOT ON SEND LIST, FREE IT
2119         POPJ P,
2120 ];T11CHP
2121 \f
2122 SUBTTL CH-10 INTERRUPT ROUTINES
2123
2124 ;THE GENERAL IDEA IS THAT WE INTERRUPT ON A LOW-PRIORITY INTERRUPT LEVEL,
2125 ;AND DO THE TIME-INTENSIVE PACKET COPYING AT THAT LEVEL.  THE GENERAL
2126 ;CHAOS ROUTINES ARE THEN CALLED WITH NETOFF.
2127
2128 IFN CH10P,[
2129
2130 EBLK
2131
2132 CHXACS: BLOCK 20
2133 CHXPDL: -60,,.
2134         BLOCK 60
2135
2136 CHXBRK: 0
2137 BBLK
2138         MOVEM 17,CHXACS+17
2139         MOVEI 17,CHXACS
2140         BLT 17,CHXACS+16
2141         MOVE P,CHXPDL
2142         CONSO CHX,CHXRCV        ;PACKET RECEIVED?
2143          JRST CHXBK5
2144         PUSHJ P,CHABGI          ;GET PLACE TO PUT PACKET
2145          JRST [ MOVEI T,CHXREN  ;NONE AVAILABLE, DISABLE INTR
2146                 ANDCAM T,CHXCNO
2147                 CONO CHX,@CHXCNO
2148                 JRST CHXBK5 ]
2149         CONSZ CHX,CHXCRC+CHXWLE ;CHECK FOR ERRORS
2150          JRST [ CONSZ CHX,CHXCRC
2151                  AOSA CHNCRC
2152                   AOS CHNWLE
2153                 JRST CHXBK4 ]   ;IGNORE PACKET
2154         DATAI CHX,T             ;FIRST DATAI YIELDS GARBAGE
2155         MOVEI T,CHXSWB          ;DISABLE BYTE SWAPPING
2156         ANDCAM T,CHXCNO
2157         CONO CHX,@CHXCNO
2158         HRLI A,-%CPKDT          ;READ HEADER
2159         DATAI CHX,(A)
2160         AOBJN A,.-1
2161         HRRZI A,-%CPKDT(A)
2162         PUSHJ P,CHSWAB          ;ENABLE BYTE SWAPPING IF NEEDED
2163         LDB T,[$CPKNB(A)]       ;GET SIZE OF PACKET
2164         CAILE T,%CPMXC          ;DON'T RUN OFF END OF BUFFER
2165          JRST CHXBK4
2166         ADDI T,3                ;ROUND UP TO NEXT WORD BOUNDARY
2167         LSHC T,-2               ;CONVERT BYTES TO WORDS, TT GETS REMAINDER
2168         HRLOI D,-1(T)           ;MAKE AOBJN POINTER
2169         EQVI D,%CPKDT(A)
2170         JUMPGE D,.+3            ;EMPTY PACKET BOUNDARY CASE
2171          DATAI CHX,(D)
2172          AOBJN D,.-1
2173         DATAI CHX,T             ;NOW READ AND IGNORE HARDWARE HEADER
2174         TLNE T+1,400000
2175          DATAI CHX,T            ;THIRD HALFWORD
2176         CONI CHX,T              ;CHECK FOR ERRORS
2177         TDNE T,[CHXPLE+CHXCRC+CHXOVR]
2178          JRST [ TLNE T,(CHXOVR)
2179                  JRST CHXBKZ    ;OVERRRUN CAN'T HAPPEN UNLESS HARDWARE BROKEN
2180                 TLNE T,(CHXPLE)
2181                  AOSA CHNPLE
2182                   TRNN T,CHXCRC
2183                    JRST CHXBK4
2184                 AOS CHNCR2
2185                 JRST CHXBK4 ]
2186         CONO PI,NETOFF-1
2187         PUSHJ P,CHAPII          ;PROCESS THE INPUT
2188         CONO PI,NETON-1
2189         CAIA
2190 CHXBK4:  PUSHJ P,CHABRT         ;DIDN'T USE BUFFER AFTER ALL
2191         CONI CHX,T              ;COUNT LOST PACKETS
2192         LDB T,[$CHXLC,,T]
2193         ADDM T,CHNLOS
2194         MOVEI T,CHXREN          ;ENABLE RECEIVER FOR NEXT PACKET
2195         IORB T,CHXCNO
2196         CONO CHX,CHXRCV(T)
2197 CHXBK5: CONSO CHX,CHXXMT        ;TRANSMIT DONE?
2198          JRST CHXBK9
2199         SKIPE T,CHOSTA          ;TRANSMIT IN PROGRESS?
2200          CONSO CHX,CHXABT       ;AND WAS ABORTED?
2201           JRST CHXBK7           ;NO TO EITHER, LOOK FOR MORE WORK
2202         AOS CHNABT              ;METER TRANSMIT ABORTS
2203         CAIL T,NCHRTR           ;ABORTED TOO MANY TIMES?
2204          JRST CHXBK7            ;DONE WITH PACKET
2205         AOS CHOSTA              ;COUNT RETRANSMISSIONS
2206         MOVEI T,CHXTEN
2207         IORB T,CHXCNO
2208         CONO CHX,CHXXMT(T)      ;RETRANSMIT PACKET
2209         JRST CHXBK9
2210
2211 CHXBK7: SETZM CHOSTA            ;TRANSMITTER IDLE, LOOK FOR NEXT PACKET
2212         CONO PI,PIOFF
2213         HLRZ A,CHXXMQ           ;ANYTHING QUEUED FOR TRANSMISSION?
2214         JUMPE A,[ MOVEI T,CHXTEN        ;DISABLE INTERRUPTS
2215                   ANDCAM T,CHXCNO
2216                   CONO CHX,@CHXCNO
2217                   CONO PI,PION
2218                   JRST CHXBK9 ]
2219         HLRZ B,-2(A)            ;CDR TRANSMIT QUEUE
2220         HRLM B,CHXXMQ
2221         SKIPN B
2222          SETZM CHXXMQ           ;QUEUE EMPTY NOW
2223         CONO PI,PION
2224         AOS CHOSTA              ;NOW SEND THIS PACKET
2225         MOVEI T,CHXHLF+CHXSWB   ;CLEAR HALFWORD, BYTE-SWAP MODES
2226         ANDCAM T,CHXCNO
2227         CONO CHX,@CHXCNO
2228         HRLI A,-%CPKDT          ;TRANSMIT HEADER
2229         DATAO CHX,(A)
2230         AOBJN A,.-1
2231         HRRZI A,-%CPKDT(A)
2232         PUSHJ P,CHSWAB          ;ENABLE BYTE SWAPPING IF NEEDED
2233         LDB T,[$CPKNB(A)]       ;GET SIZE OF PACKET
2234         ADDI T,1                ;ROUND UP TO NEXT HALF WORD BOUNDARY
2235         LSHC T,-2               ;CONVERT BYTES TO WORDS, T+1 GETS REMAINDER
2236         HRLOI D,-1(T)           ;MAKE AOBJN POINTER
2237         EQVI D,%CPKDT(A)
2238         JUMPGE D,.+3            ;EMPTY PACKET BOUNDARY CASE
2239          DATAO CHX,(D)
2240          AOBJN D,.-1
2241         MOVEI T,CHXHLF+CHXTEN   ;SWITCH TO HALFWORD MODE, ENABLE DONE INTR
2242         IORM T,CHXCNO
2243         CONO CHX,@CHXCNO
2244         TLNE T+1,400000         ;SEND EXTRA HALFWORD IF NEEDED
2245          DATAO CHX,(D)
2246         MOVEI T,CHXSWB          ;DISABLE SWAP BYTES MODE
2247         ANDCAM T,CHXCNO
2248         CONO CHX,@CHXCNO
2249         LDB T,[$CPKDN(A)]       ;GET DESTINATION SUBNET
2250         HRRZ D,SBNRUT(T)        ;GATEWAY TO THAT SUBNET
2251         CAIGE T,NSUBNT
2252          CAIN T,MYCHAD_-8       ;IF ON LOCAL CABLE
2253           LDB D,[$CPKDA(A)]     ;GO DIRECT
2254         LSH D,16.+4
2255         DATAO CHX,D             ;STORE HARDWARE DESTINATION ADDRESS
2256         MOVE T,CHXCNO           ;TRANSMIT PACKET
2257         CONO CHX,CHXXMT(T)
2258         CONI CHX,T
2259         TLNE T,(CHXOVR)         ;CAN'T HAPPEN UNLESS HARDWARE BROKEN
2260 CHXBKZ:  BUG HALT,[CHAOS: I/O BUS OVERRUN]
2261         HRROS B,-2(A)           ;MARK IT NOT ON TRANSMIT LIST
2262         AOJN B,.+2              ;AND UNLESS IT IS ON SEND LIST
2263          PUSHJ P,CHABRT         ;RETURN IT TO FREE
2264 CHXBK9: MOVSI 17,CHXACS         ;DISMISS INTERRUPT
2265         BLT 17,17
2266         JRST 12,@CHXBRK
2267
2268 CHSWAB: LDB T,[$CPKOP(A)]       ;DOES THIS PACKET NEED BYTE SWAPPING?
2269         TRNE T,200
2270          JRST [ TRNE T,100
2271                  POPJ P,        ;BINARY DATA
2272                 JRST CHSWB1 ]   ;CHARACTER DATA
2273         IDIVI T,40
2274         MOVE T,CHSWBT(T)
2275         LSH T,(T+1)
2276         JUMPL T,CPOPJ           ;BINARY CONTROL PACKET
2277 CHSWB1: MOVEI T,CHXSWB          ;CHARACTER, SWAP DEM BYTES
2278         IORM T,CHXCNO
2279         CONO CHX,@CHXCNO
2280         POPJ P,
2281
2282 CHSWBT: 1_<35.-%COOPN>+1_<35.-%COSTS>+1_<35.-%CORUT>
2283         0 ? 0 ? 0
2284 ];CH10P
2285 \f
2286 SUBTTL CH-11 INTERRUPT ROUTINES
2287
2288 ;The Unibus Chaosnet board interrupts on the same level as TTYs,
2289 ;and comes to CHXBKH via vectored interrupt.  We use a programmed
2290 ;interrupt request to drop down to a lower interrupt level for the
2291 ;slow packet-copying operation, so as not to interfere with the TTYs,
2292 ;then turn NETOFF when we call into the Chaosnet NCP.
2293 ;(We actually use NETOFF-1 and NETON-1 so as not to interfere with
2294 ;CLKOFF.  This assumes that interrupt levels between CLKCHN and
2295 ;CHXCHN are never turned off.)
2296
2297 IFN CH11P,[
2298
2299 ;;; Macros that will eventually be instructions
2300
2301 DEFINE PACK16 AC,E              ;AC,AC+1 right-aligned and zero-filled
2302         LSH AC,16.
2303         IOR AC,AC+1
2304         LSH AC,4
2305         MOVEM AC,E
2306 TERMIN
2307
2308 DEFINE PACK8 AC,E               ;AC: ...B2B1  AC+1: ...B4B3 zero-filled!!
2309         ROTC AC,-8              ;B3...B2 B1...B4
2310         ROT AC,-16.             ;B1,B2,B3 in position, B4 right-aligned
2311         ADDI AC+1,(AC+1)        ;Shift RH(AC+1) left 4 bits
2312         ADDI AC+1,(AC+1)
2313         ADDI AC+1,(AC+1)
2314         ADDI AC+1,(AC+1)        ;B1,B4 in position in AC+1
2315         IOR AC,AC+1
2316         MOVEM AC,E
2317 TERMIN
2318
2319 DEFINE UNPK16 AC,E              ;Doesn't bother masking off garbage bits
2320         MOVE AC,E
2321         MOVE AC+1,AC
2322         ROT AC,16.              ;First halfword right-aligned
2323         LSH AC+1,-4             ;Second halfword right-aligned
2324 TERMIN
2325
2326 DEFINE UNPK8 AC,E
2327         MOVE AC,E               ;B1B2B3B4...
2328         ROT AC,8                ;B2B3B4...B1
2329         MOVE AC+1,AC
2330         AND AC,[377_2,,377]     ;...B3...B1 zero-filled
2331         ROT AC+1,16.            ;B4...B1B2B3
2332         AND AC+1,[377_12,,377_8];B4...B2... zero-filled
2333         IORB AC,AC+1            ;B4B3...B2B1
2334         ROT AC+1,16.            ;...B4B3, garbage in high bits
2335 TERMIN
2336
2337 EBLK
2338
2339 CHXACS: BLOCK 20
2340 CHXSVH: 0
2341 CHXPDL: -60,,.
2342         BLOCK 60
2343
2344 CHXBKH: 0                       ;Hardware interrupt on TTYCHN comes here
2345 BBLK
2346         CONO PI,CHXRQ           ;Redirect to lower interrupt level
2347         MOVEM T,CHXSVH          ;Clear hardware interrupt enable
2348         MOVEI T,%CAREN+%CATEN   ; so the Chaos board will stop interrupting
2349         ANDCAB T,CHXCSR
2350         IOWRI T,CAICSR
2351         MOVE T,CHXSVH
2352         JRST 12,@CHXBKH
2353 EBLK
2354
2355 CHXBRK: 0                       ;Software interrupt on CHXCHN comes here
2356 BBLK
2357         CONO PI,020000+200_<-CHXCHN>    ;BAG-BITING DEC LOSERS
2358         MOVEM 17,CHXACS+17
2359         MOVEI 17,CHXACS
2360         BLT 17,CHXACS+16
2361         MOVE P,CHXPDL
2362         IORDI T,CAICSR          ;Check for received packet
2363         TRNN T,%CARDN
2364          JRST CHXBK3            ;No incoming packet yet
2365         TRNE T,%CAERR           ;Check for error in received packet
2366          JRST [ AOS CHNCRC
2367                 JRST CHXBK1 ]   ;Ignore packet
2368         IORDI R,CAIRBC          ;Number of bits in packet - 1
2369         SUBI R,31.              ;Exclude the three extra hardware words
2370         TRNE R,17
2371          JRST [ AOS CHNWLE      ;Length not a multiple of 16
2372                 JRST CHXBK1 ]
2373         ASH R,-5                ;32-bit word count, rounded up
2374         PUSHJ P,CHABGI          ;Get place to put packet
2375          JRST [ AOS CHNLOS      ;No buffers, lose this packet
2376                 JRST CHXBK1 ]
2377         HRLI A,-%CPKDT          ;Copy out the packet header
2378 CHSRC1: IORDI B,CAIRBF
2379         IORDI C,CAIRBF
2380         PACK16 B,(A)
2381         AOBJN A,CHSRC1
2382         PUSHJ P,CHSHDR          ;Decode the header
2383          JRST CHSRC4            ;No byte swapping
2384         JUMPGE D,CHSRC3
2385 CHSRC2: IORDI B,CAIRBF          ;Read out the data, byte-swapped
2386         IORDI C,CAIRBF
2387         PACK8 B,(D)
2388         AOBJN D,CHSRC2
2389 CHSRC3: JUMPGE H,CHSRC7         ;Jump if even packet length
2390         IORDI B,CAIRBF          ;Residual halfword
2391         SETZ C,                 ;Somebody depends on zero here
2392         PACK8 B,(D)
2393         AOJA D,CHSRC7
2394
2395 CHSRC4: JUMPGE D,CHSRC6
2396 CHSRC5: IORDI B,CAIRBF          ;Read out the data, halfwords
2397         IORDI C,CAIRBF
2398         PACK16 B,(D)
2399         AOBJN D,CHSRC5
2400 CHSRC6: JUMPL H,[ IORDI B,CAIRBF        ;Residual halfword
2401                   SETZ C,               ;Somebody depends on zero here
2402                   PACK16 B,(D)
2403                   AOJA D,CHSRC7 ]
2404 CHSRC7: SUB D,R                 ;AOBJN pointer minus number of words in packet
2405         CAIE A,(D)
2406          JRST [ AOS CHNPLE      ;Packet length disagrees with hardware length
2407                 JRST CHXBK2 ]
2408         IORDI T,CAIRBF          ;Read the three hardware header words
2409         IORDI T,CAIRBF
2410         IORDI T,CAIRBF
2411         IORDI T,CAICSR
2412         TRNE T,%CAERR           ;Make sure packet came out of RAM okay
2413          JRST [ AOS CHNCR2      ;Garbage, try again
2414                 JRST CHXBK2 ]
2415         IORDI T,CAIRBC          ;Make sure counter didn't spazz
2416         CAIE T,7777
2417          JRST [ AOS CHNSPZ
2418                 JRST CHXBK2 ]
2419         CONO PI,NETOFF-1        ;Get to network interrupt level
2420         PUSHJ P,CHAPII          ;Process the input
2421         CONO PI,NETON-1
2422 CHXBK1: IORDI T,CAICSR          ;Count lost packets
2423         LDB TT,[$CALOS,,T]
2424         ADDM TT,CHNLOS
2425         MOVE TT,CHXCSR
2426         IORI TT,%CARCL          ;Enable receiver for next packet
2427         IOWRI TT,CAICSR
2428 CHXBK3: TRNN T,%CATDN           ;Transmit done?
2429          JRST CHXBK8            ;No, dismiss
2430         SKIPN TT,CHOSTA         ;Transmit in progress?
2431          JRST CHXBK7            ;No, look for something to transmit
2432         TRNN T,%CATAB           ;Yes, was it aborted?
2433          JRST CHXBK5            ;No, we're done with that packet
2434         AOS CHNABT              ;Meter transmit aborts
2435         CAIGE TT,NCHRTR         ;Aborted too many times?
2436          JRST CHXBK7            ;No, retransmit it
2437 CHXBK5: CONO PI,PIOFF           ;Lock transmit list
2438         HLRZ A,CHXXMQ           ;Get packet probably being transmitted now
2439         JUMPE A,[ CONO PI,PION  ;It vanished?
2440                   JRST CHXBK6 ]
2441         HLRZ B,-2(A)            ;CDR transmit queue
2442         HRLM B,CHXXMQ
2443         SKIPN B
2444          SETZM CHXXMQ           ;Queue empty now
2445         CONO PI,PION
2446         HRROS B,-2(A)           ;Mark it not on transmit list
2447         AOJN B,CHXBK6           ;And unless it is on send list
2448          PUSHJ P,CHABRT         ;Return it to free
2449 CHXBK6: SETZM CHOSTA            ;Transmitter idle, look for next packet
2450 CHXBK7: HLRZ A,CHXXMQ           ;Anything queued for transmission?
2451         JUMPE A,CHXBK9          ;No, leave interrupts disabled
2452         AOS CHOSTA              ;Count retransmissions
2453         MOVE T,CHXCSR           ;Reset transmitter
2454         IORI T,%CATDN
2455         IOWRI T,CAICSR
2456         HRLI A,-%CPKDT          ;Transmit header
2457 CHXXM1: UNPK16 B,(A)
2458         IOWRI B,CAIWBF
2459         IOWRI C,CAIWBF
2460         AOBJN A,CHXXM1
2461         PUSHJ P,CHSHDR          ;Decode the header
2462          JRST CHXXM4            ;No byte swapping
2463         JUMPGE D,CHXXM3
2464 CHXXM2: UNPK8 B,(D)             ;Transmit data with byte swapping
2465         IOWRI B,CAIWBF
2466         IOWRI C,CAIWBF
2467         AOBJN D,CHXXM2
2468 CHXXM3: JUMPGE H,CHXXM7         ;Jump if even packet length
2469         UNPK8 B,(D)             ;Transmit residual bytes
2470         IOWRI B,CAIWBF
2471         JRST CHXXM7
2472
2473 CHXXM4: JUMPGE D,CHXXM6
2474 CHXXM5: UNPK16 B,(D)            ;Transmit data with byte swapping
2475         IOWRI B,CAIWBF
2476         IOWRI C,CAIWBF
2477         AOBJN D,CHXXM5
2478 CHXXM6: JUMPGE H,CHXXM7         ;Jump if even packet length
2479         UNPK16 B,(D)            ;Transmit residual bytes
2480         IOWRI B,CAIWBF
2481 CHXXM7: LDB T,[$CPKDN(A)]       ;Get destination subnet
2482         HRRZ D,SBNRUT(T)        ;Gateway to that subnet
2483         CAIGE T,NSUBNT
2484          CAIN T,MYCHAD_-8       ;If on local cable,
2485           LDB D,[$CPKDA(A)]     ; go direct
2486         IOWRI D,CAIWBF          ;Store hardware destination address
2487         IORDI T,CAIXMT          ;Transmit packet
2488 CHXBK8: MOVEI A,%CATEN          ;Enable transmit-done interrupt if xmitting
2489 CHXBK9: IORI A,%CAREN           ;Enable receive-done interrupt always
2490         IORB A,CHXCSR
2491         IOWRI A,CAICSR
2492         MOVSI 17,CHXACS         ;Dismiss software interrupt
2493         BLT 17,17
2494         JRST 12,@CHXBRK
2495
2496 CHXBK2: PUSHJ P,CHABRT          ;Packet no good, discard it
2497         JRST CHXBK1
2498
2499 ;Examine packet in A, return AOBJN pointer to data in D,
2500 ; H is negative if there is an extra halfword after that.
2501 ; W gets number of full words of data (same as LH D).
2502 ; T,U get clobbered
2503 ; Returns:
2504 ;       +1  16-bit data
2505 ;       +2  8-bit data
2506 CHSHDR: HRRZI A,-%CPKDT(A)      ;Restore packet address
2507         LDB W,[$CPKNB(A)]       ;Get size of packet in bytes
2508         CAILE W,%CPMXC
2509          MOVEI W,%CPMXC         ;Self-defense
2510         ADDI W,1                ;Round up to next word boundary
2511         LSHC W,-2               ;Convert bytes to words, H gets remainder
2512         HRLOI D,-1(W)           ;Make AOBJN pointer
2513         EQVI D,%CPKDT(A)
2514         LDB T,[$CPKOP(A)]       ;Does this packet need byte swapping?
2515         TRNE T,200
2516          JRST [ TRNN T,100
2517                  AOS (P)        ;Character data
2518                 POPJ P, ]       ;Binary data
2519         IDIVI T,40
2520         MOVE T,CHSWBT(T)
2521         LSH T,(T+1)
2522         JUMPL T,CPOPJ           ;Binary control packet
2523         JRST POPJ1              ;Characters
2524
2525 CHSWBT: 1_<35.-%COOPN>+1_<35.-%COSTS>+1_<35.-%CORUT>
2526         0 ? 0 ? 0
2527 ];CH11P
2528 \f
2529 SUBTTL CHAOS NET BUFFER LIST STUFF
2530
2531 OVHMTR CHL
2532
2533 ;BUFFERS ARE PKTBSZ WORDS LONG; 2 HEADER WORDS AND %CPMXW PACKET WORDS.
2534 ;PKTBSZ IS A POWER OF 2 AND LESS THAN 1K (MEMORY PAGE SIZE).
2535 ;NOTE THAT A BUFFER ADDRESS POINTS AT THE FIRST PACKET WORD
2536 ;AND THE HEADER WORDS ARE AT NEGATIVE ADDRESSES.
2537 ;FIRST HEADER WORD:  -2(A)
2538 ;       RH LIST THREAD FOR MOST LISTS, 0=END, -1=NOT ON LIST
2539 ;       LH LIST THREAD FOR TRANSMIT LIST
2540 ;SECOND HEADER WORD: -1(A)
2541 ;       TIME RECEIVED OR TIME PUT ON TRANSMIT LIST
2542 ;       OR VALUE OF I FOR A PACKET ON THE LSN QUEUE
2543 ;       ASCII/LUNCH/ FOR A PACKET ON THE FREE LIST
2544
2545 ;I DO IT THIS WAY (PIOFF) TO AVOID HAVING TO PUSH AND POP PI STATUS,
2546 ;CONO PI,NETOFF CAN LOSE AT INTERRUPT LEVEL (MAINLY THE NETON LOSES)
2547
2548 ;THESE ROUTINES TURN OFF INTERRUPTS MOMENTARILY SO THAT
2549 ;LISTS MAY BE SAFELY MANIPULATED.
2550
2551 ;Q POINTS TO THE HEADER WORD OF A QUEUE, REMOVE THE FIRST
2552 ;THING AND RETURN IN A.  (ZERO IF NONE)  CLOBBERS T
2553 CHAQGF: CONO PI,PIOFF
2554         HLRZ A,(Q)              ;GET FIRST
2555         JUMPE A,PIONJ           ;EMPTY
2556         HRRZ T,-2(A)            ;GET SECOND
2557         HRLM T,(Q)              ;MAKE FIRST
2558 IFN FTRCHK,[
2559         JUMPN T,PIONJ
2560         HRRZ T,(Q)
2561         CAIE T,(A)
2562          BUG PAUSE,[CHAOS LIST TRASHED],OCT,Q
2563         SETZM (Q)               ;IS NOW EMPTY
2564 ];FTRCHK
2565 IFE FTRCHK,[
2566         SKIPN T
2567          SETZM (Q)              ;IS NOW EMPTY
2568 ];FTRCHK
2569         CONO PI,PION
2570         POPJ P,
2571
2572 ;RETURN BUFFER INTO WHICH THE BYTE POINTER IN A POINTS.  CLOBBERS A,T,Q
2573 CHBPFR: SUBI A,1                ;SIOKT LIKES TO MAKE BP POINT AT NEXT BUFFER
2574         ANDI A,-PKTBSZ
2575         ADDI A,2
2576         JRST CHABRT
2577
2578 ;RETURN BUFFER POINTED TO BY A TO FREE UNLESS ON TRANSMIT LIST.
2579 CHABR1: HLLOS T,-2(A)           ;RH GETS -1, NO LONGER ON REGULAR LIST
2580         AOJN T,CPOPJ            ;EXIT IF STILL ON TRANSMIT LIST
2581         ;DROPS THROUGH
2582 ;RETURN BUFFER POINTED BY A TO FREE STORAGE.  CLOBBERS T, Q.
2583 CHABRT: MOVEI Q,CHQFRE
2584 IFN FTRCHK,[
2585         SKIPN A
2586          BUG PAUSE,[FREEING 0]
2587 ];FTRCHK
2588         MOVE T,[ASCII/LUNCH/]   ;TANSTAAFL
2589         MOVEM T,-1(A)
2590         SETOM -2(A)             ;NOT ON TRANSMIT LIST NOW (THIS IS WHAT INITS
2591         AOS CHFRBF              ; LH[-2(A)] WHEN BUFFER FIRST CREATED)
2592         ;JRST CHAQPL            ;DROPS THROUGH
2593
2594 ;A POINTS TO A BUFFER, Q TO A QUEUE.  PUT IT ON AS THE LAST THING.  BASHES T.
2595 CHAQPL: HLLZS -2(A)             ;PUT ENDLIST IN RH
2596         CONO PI,PIOFF
2597         HRRZ T,(Q)              ;GET LAST
2598         HRRM A,(Q)              ;MAKE NEW LAST
2599         JUMPN T,[HRRM A,-2(T)   ;MAKE A COME AFTER IT
2600                  JRST PIONJ ]
2601         HRLM A,(Q)              ;WAS EMPTY, ALSO IS NEW FIRST
2602         CONO PI,PION
2603         POPJ P,
2604
2605 ;A POINTS TO A BUFFER, Q TO A QUEUE.  PUT IT ON AS THE FIRST THING.  SMASHES T.
2606 CHAQPF: CONO PI,PIOFF
2607         HLRZ T,(Q)              ;GET FIRST
2608         HRRM T,-2(A)            ;MAKE SECOND
2609         HRLM A,(Q)              ;MAKE NEW FIRST
2610         SKIPN T
2611          HRRM A,(Q)             ;WAS EMPTY, ALSO MAKE NEW LAST
2612         CONO PI,PION
2613         POPJ P,
2614 \f
2615 ;ALLOCATE A BUFFER AT MAIN PROGRAM LEVEL, TO A, MASHES T, TT, Q, B.
2616 CHABG0: PUSHJ P,UDELAY          ;WAIT FOR MEMORY
2617 CHABGT: PUSHJ P,CHABGI
2618          JRST CHABG0
2619         POPJ P,                 ;WIN
2620         
2621 ;ALLOCATE A BUFFER, RETURN POINTER TO IT IN A, SKIP.  BLOWS AWAY T, TT, Q.
2622 ;NON-SKIP IF NO BUFFERS AVAILABLE.  (DOESN'T MAKE NEW ONES IF FREE LIST EMPTY)
2623 CHABAL: MOVEI Q,CHQFRE
2624         PUSHJ P,CHAQGF
2625         JUMPE A,CPOPJ
2626         SETZM -1(A)             ;NO LUNCH
2627         SOS CHFRBF
2628         JRST POPJ1
2629
2630 ;ALLOCATE A BUFFER TO A, MAKE NEW IF NONE FREE.   OBLITERATES T,Q,B.
2631 ;NON-SKIP IF CAN'T GET MEMORY.  (SUITABLE FOR CALLING FROM INT LEVEL)
2632 CHABGI: PUSHJ P,CHABAL          ;TRY TO ALLOCATE A BUFFER FROM FREE LIST
2633          CAIA
2634           JRST POPJ1            ;WON, RETURN
2635         CONI PI,Q               ;SAVE PI CHANNELS ON STATUS
2636         ANDI Q,177
2637         CONO PI,UTCOFF          ;MAKE THE WORLD SAFE FOR IOMQ
2638         MOVE B,CHTTBF
2639         CAIL B,CHMXBF           ;MAKE SURE NOT TO USE UP ALL CORE
2640          JRST CHABG4
2641         PUSHJ P,IOMQ            ;GET 1K OF MEMORY
2642          JRST CHABG3            ;MEM NOT AVAILABLE, FAIL
2643         CONO PI,PICON(Q)        ;WON, RESTORE PI STATUS
2644         MOVEI B,MUCHA
2645         DPB B,[MUR,,MEMBLT(A)]
2646         LSH A,10.               ;ADDRESS OF 1K OF ALLOCATED MEMORY
2647         ADD A,[-<2000/PKTBSZ>,,2]       ;-BUFFERS PER 1K,,OFFSET TO HEADER
2648 CHABG2: PUSHJ P,CHABRT          ;PUT THEM ALL ON FREE LIST
2649         ADDI A,PKTBSZ-1
2650         AOBJN A,CHABG2
2651         MOVEI B,<2000/PKTBSZ>   ;THIS MANY MORE BUFFERS HAVE BEEN CREATED
2652         ADDM B,CHTTBF
2653         JRST CHABGI             ;NOW GO ALLOCATE ONE
2654
2655 ;HERE IF CHAOS NET TRYING TO USE UP TOO MUCH CORE
2656 CHABG4: MOVE B,CHMXTM   ;DON'T COMPLAIN TOO OFTEN
2657         ADDI B,60.*30.  ;JUST ONCE A MINUTE
2658         CAMLE B,TIME
2659          JRST CHABG3
2660 IFE CH10P, BUG CHECK,[CHAOS NET ATTEMPTING TO USE TOO MUCH CORE]
2661 IFN CH10P,[
2662         CONI CHX,B
2663         BUG CHECK,[CHAOS NET ATTEMPTING TO USE TOO MUCH CORE, CONI=],OCT,B,[CONO=],OCT,CHXCNO,[CHOSTA=],OCT,CHOSTA
2664 ];CH10P
2665         MOVE B,TIME
2666         MOVEM B,CHMXTM
2667 CHABG3: CONO PI,PICON(Q)        ;LOST, RESTORE PI STATUS
2668         POPJ P,                 ;AND TAKE ERROR RETURN
2669
2670 ;FREE A WHOLE LIST OF BUFFERS, Q-> HEAD.  DESTROYS A,T
2671 CHALFR: PUSHJ P,CHAQGF
2672         JUMPE A,CPOPJ
2673         PUSH P,Q
2674         PUSHJ P,CHABR1          ;FREE UNLESS STILL ON TRANSMIT LIST
2675         POP P,Q
2676         JRST CHALFR
2677
2678 ;Q -> A TRANSMIT QUEUE, FLUSH ALL BUFFERS BELONGING TO INDEX I.
2679 ;CLOBBERS A,B,C,T
2680 CFLXMQ: PUSH P,Q
2681         CONO PI,NETOFF          ;DON'T LET TRANSMIT LIST CHANGE (AT ALL)
2682         HLRZ A,(Q)              ;HEAD OF TRANSMIT LIST
2683         JUMPE A,CFLXM3
2684         MOVEI B,2(Q)            ;B PREVIOUS PACKET, A CURRENT, C NEXT
2685 CFLXM1: HLRZ C,-2(A)            ;GET THREAD TO NEXT
2686 IFN FTRCHK,[
2687         CAIN C,-1
2688          JRST 4,.               ;CLAIMS NOT TO BE ON LIST?
2689 ];FTRCHK
2690         LDB T,[$CPKSX(A)]       ;GET THIS PACKET'S INDEX
2691         CAME T,I
2692          JRST CFLXM2
2693         HRLM C,-2(B)            ;THREAD PREVIOUS TO NEXT
2694         HRROS T,-2(A)           ;IF THIS BUFFER IS NOT ALSO ON SEND LIST,
2695         AOJN T,.+2
2696          PUSHJ P,CHABRT         ;RETURN IT
2697         SKIPA Q,(P)
2698 CFLXM2:  MOVE B,A
2699         SKIPE A,C
2700          JRST CFLXM1
2701         HRRM B,(Q)              ;LAST PACKET ON LIST MAY HAVE CHANGED
2702         CAIN B,2(Q)
2703          SETZM (Q)              ;TRANSMIT QUEUE IS NOW EMPTY
2704 CFLXM3: POP P,Q
2705         JRST NETONJ
2706 \f
2707 ;SEARCH LIST IN Q FOR PACKET WHOSE CONTACT NAME MATCHES THAT
2708 ;OF PACKET IN A, RETURN IT IN B, SKIPPING IF WINNING.  CLOBBERS T,TT,C,D,E,H,J.
2709 ;THE PACKET RETURNED IN B IS DE-LINKED FROM THE SEARCHED QUEUE.
2710 ;HAS TO BE CALLED WITH NETOFF OR IN PROGRESS, SO LIST CAN'T GET MUNGED.
2711 ;I HOPE IT'S NOT TOO BLETCHEROUSLY SLOW.
2712 CHAQSR: HLRZ B,(Q)              ;GET START OF LIST TO SEARCH
2713         JUMPE B,CPOPJ           ;EMPTY, LOSE
2714         MOVEI J,0               ;PACKET PREVIOUS TO B
2715 CHAQS1: LDB C,[$CPKNB(A)]       ;SET UP STRING COMPARE LOOP
2716         LDB H,[$CPKNB(B)]       ;THIS ASSUMES NO ZERO-LENGTH STRINGS
2717         MOVEI D,%CPKDT(A)
2718         HRLI D,440800
2719         MOVEI E,%CPKDT(B)
2720         HRLI E,440800
2721 CHAQS2: ILDB T,D
2722         ILDB TT,E               ;DON'T IGNORE CASE, THAT WOULD JUST SLOW THIS
2723         CAME T,TT               ;BAG-BITER DOWN EVEN MORE.  EVERYONE SHOULD
2724          JRST CHAQS4            ;PUT THEIR CONTACT NAMES IN UPPER-CASE.
2725         CAIN T,40               ;TERMINATE ON SPACE
2726          JRST CHAQS5
2727         SOJLE C,CHAQS3
2728         SOJG H,CHAQS2
2729         ILDB T,D
2730         CAIE T,40
2731          JRST CHAQS4
2732 CHAQS5: HRRZ C,-2(B)            ;WON, DELINK PACKET FROM LIST
2733         JUMPE J,[ HRLM C,(Q)
2734                   JUMPN C,POPJ1
2735          IFN FTRCHK,[
2736                   HRRZ C,(Q)    ;CHECK LIST ENDING IN RIGHT PLACE
2737                   CAIE C,(B)
2738                    JRST 4,.
2739                 ];FTRCHK
2740                   SETZM (Q)
2741                   JRST POPJ1 ]
2742         HRRM C,-2(J)
2743         JUMPN C,POPJ1
2744         HRRM J,(Q)              ;TOOK LAST PACKET, STORE NEW LAST
2745         JRST POPJ1
2746
2747 CHAQS3: SOJLE H,CHAQS5
2748         ILDB TT,E
2749         CAIN TT,40
2750          JRST CHAQS5
2751 CHAQS4: MOVE J,B                ;THIS ONE DOESN'T MATCH, TRY NEXT
2752         HRRZ B,-2(B)
2753         JUMPN B,CHAQS1
2754         POPJ P,                 ;NO MATCHES
2755
2756 ;THIS ROUTINE RUNS IN THE CORE JOB AND CLEANS UP MEMORY USED BY CHAOS BUFFERS
2757 ;SMASHES ALL ACS
2758 CHCLN:  SKIPE A,CHTTBF          ;SEE IF 2/3 OR MORE OF BUFFERS FREE
2759          SKIPN B,CHFRBF
2760           POPJ P,               ;NO BUFFERS OR NONE FREE, NOTHING TO DO
2761         SUBM A,B
2762         IDIV A,B                ;GET RATIO OF TOTAL TO USED
2763         CAIGE A,3               ;NOTE IF B IS ZERO A IS UNCHANGED
2764          POPJ P,                ; AND AT LEAST 32.
2765 IFL TSYSM-256., MOVEI D,TSYSM-1 ;SCAN MEMORY FOR CHAOS BUFFER PAGES
2766 .ELSE   MOVEI D,255.
2767 CHCLN0: LDB A,[MUR,,MEMBLT(D)]
2768         CAIE A,MUCHA
2769 CHCLN4:  SOJGE D,CHCLN0
2770         JUMPL D,CPOPJ
2771         MOVE A,D                ;QUICKLY DETERMINE IF ANY NON-FREE BUFFERS
2772         LSH A,10.               ; ON THIS PAGE
2773         HRLI A,-<2000/PKTBSZ>
2774         MOVE T,[ASCII/LUNCH/]
2775 CHCLN5: CAME T,1(A)
2776          JRST CHCLN4            ;NOT FREE, DON'T BOTHER WITH SLOW STUFF
2777         ADDI A,PKTBSZ-1
2778         AOBJN A,CHCLN5
2779         SETZB C,CHCLNQ          ;COLLECT ALL FREE BUFFERS THAT ARE ON THIS PAGE
2780         MOVE E,CHFRBF           ;LOOP ABOUT AS MANY TIMES AS THERE ARE FREE BUFFERS
2781 CHCLN1: PUSHJ P,CHABAL          ;GET NEXT FREE BUFFER
2782         JUMPE A,CHCLN2
2783         LDB B,[121000,,A]
2784         CAMN B,D
2785          JRST [ MOVEI Q,CHCLNQ  ;THIS ONE'S ON THE PAGE, SAVE IT
2786                 PUSHJ P,CHAQPL
2787                 AOJA C,.+2 ]    ;COUNT THEM
2788           PUSHJ P,CHABRT        ;NOT ON THE PAGE, PUT BACK
2789         SOJG E,CHCLN1
2790 CHCLN2: CAIE C,<2000/PKTBSZ>    ;DID WE GET THE WHOLE PAGE?
2791          JRST [ MOVEI Q,CHCLNQ ? PUSHJ P,CHALFR ? JRST CHCLN4 ]
2792         MOVNS C                 ;YES, GET RID OF THESE BUFFERS
2793         ADDM C,CHTTBF
2794         MOVE A,D
2795         PUSHJ P,MEMR
2796         JRST CHCLN
2797
2798 OVHMTR CHZ