1 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
3 ;;; This program is free software; you can redistribute it and/or
4 ;;; modify it under the terms of the GNU General Public License as
5 ;;; published by the Free Software Foundation; either version 2 of the
6 ;;; License, or (at your option) any later version.
8 ;;; This program is distributed in the hope that it will be useful,
9 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
10 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 ;;; General Public License for more details.
13 ;;; You should have received a copy of the GNU General Public License
14 ;;; along with this program; if not, write to the Free Software
15 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 IFE IMPP, IFE CH11P, .ERR NOT EVERYTHING IN CHAOS WILL WORK WITHOUT IMP
18 IFNDEF FTRCHK, FTRCHK==0 ;PROBABLY FOUND ALL THE BUGS THIS WAS GOOD FOR
20 IFN FTRCHK, .ERR REDUNDANT CHECKING ENABLED IN CHAOS ROUTINES
23 ; WINDOW SIZE ADJUSTMENT STUFF
24 ; ROUND TRIP TIME MEASUREMENT & OTHER METERING
25 ; BETTER METERING, SOME METERS ARE CURRENTLY MISSING
27 SUBTTL CH-10 HARDWARE DEFINITIONS
30 CHX==470 ;I/O DEVICE NUMBER
34 CHXTEN==10 ;1.4 TRANSMIT INTERRUPT ENABLE
35 CHXREN==20 ;1.5 RECEIVE INTERRUPT ENABLE
36 CHXSPY==40 ;1.6 MATCH ANY DESTINATION
37 CHXLUP==100 ;1.7 LOOP BACK
38 CHXSWB==200 ;1.8 SWAP BYTES
39 CHXHLF==400 ;1.9 HALFWORD DATAO
40 CHXXMT==1000 ;2.1 TRANSMIT DONE (CONI)
41 ; TRANSMIT OR RETRANSMIT PACKET (CONO)
42 CHXRCV==2000 ;2.2 RECEIVE DONE (CONI)
43 ; ENABLE TO RECEIVE NEXT PACKET (CONO)
44 CHXABT==4000 ;2.3 TRANSMIT ABORTED (CONI)
45 ; RESET TRANSMITTER (CONO)
46 $CHXLC==140400 ;2.4-2.7 LOST COUNT (CONI)
47 CHXRST==10000 ;2.4 RESET (CONO)
48 CHXCRC==200000 ;2.8 CRC ERROR (CONI)
49 CHXWLE==400000 ;2.9 WORD LENGTH ERROR (CONI)
50 CHXPLE==1,, ;3.1 PACKET LENGTH ERROR (CONI)
51 CHXOVR==2,, ;3.2 OVERRUN (CONI)
52 $CHXAD==242000 ;3.3-4.9 CHAOSNET ADDRESS (CONI)
59 SUBTTL CHAOS NET VARIABLES
63 $CHXRI==001200 ;REAL INDEX PART (LOW TEN BITS) - IS IN LH(IOCHNM)
64 $CHXUN==120600 ;UNIQUIZATION PART (TOP SIX BITS)
65 CHXMUN==1_6-1 ;MAXIMUM VALUE OF UNIQUIZER
66 MXWIND==100 ;MAXIMUM WINDOW SIZE (8K WORDS)
67 .SEE MYCHAD ;SUBNET AND HOST OF MYSELF
68 .SEE DLCP ;1 MEANS USE DL10 TO GET TO CHAOS NET
69 .SEE T11CHP ;1 MEANS USE TEN-11 INTERFACE TO GET TO CHAOS NET
70 .SEE CH10P ;1 MEANS USE CH10 HARDWARE TO GET TO CHAOS NET
71 .SEE CH11P ;1 MEANS USE UNIBUS CHAOSNET HARDWARE ON KS10
73 ;Internet address of my Chaosnet Interface
74 IMPUS4==<.BYTE 4 ? 0 ? .BYTE 8 ? 128. ? 31. ? .BYTE 16. ? MYCHAD>
78 CHSUSR: REPEAT NINDX,-1 ;-1 INDEX NOT IN USE
80 $CHSUO==220600 ;3.1-3.6 OUTPUT CHANNEL NUMBER (77=IOPUSHED)
81 $CHSUI==300600 ;3.7-4.3 INPUT CHANNEL NUMBER (77=IOPUSHED)
84 CHSSTA: REPEAT NINDX,-1 ;RH STATE, LH FLAGS
86 %CFOFF==400000 ;SIGN BIT MEANS TURNED OFF AT PI LEVEL, NO TALKING TO NETWORK
87 %CFSTS==200000 ;SEND STS PACKET AS SOON AS POSSIBLE (1/2 SECOND CLOCK)
88 %CFCLS==100000 ;HALF-CLOSED FLAG
89 %CFSTY==040000 ;DIRECT-CONNECTED TO STTY FLAG
90 $CFTTN==220600 ;TTY NUMBER OF STTY CONNECTED TO
93 .SEE %CSCLS ;FOR SYMBOLS FOR STATES
95 CHSNBF: BLOCK NINDX ;LH LENGTH(CHSPBF), RH LENGTH(CHSIBF)
96 CHSNOS: BLOCK NINDX ;NUMBER OF FREE OUTPUT SLOTS IN THE WINDOW
97 CHSIBF: BLOCK NINDX ;RECEIVE BUFFER POINTERS FIRST,,LAST
98 CHSPBF: BLOCK NINDX ;OUT OF ORDER RECEIVE BUFFER POINTERS FIRST,,LAST
99 CHSOBF: BLOCK NINDX ;TRANSMIT BUFFER POINTERS FIRST,,LAST
100 CHSITM: BLOCK NINDX ;TIME OF LAST INPUT FROM NET
101 CHSWIN: BLOCK NINDX ;WINDOW SIZE RECEIVE,,TRANSMIT
102 CHSPKN: BLOCK NINDX ;LAST PACKET# GIVEN TO USER,,LAST PACKET# SENT BY USER
103 CHSACK: BLOCK NINDX ;LAST PACKET# ACKNOWLEDGED RECEIVE,,TRANSMIT (START OF WINDOW)
104 CHSLCL: REPEAT NINDX,<.BYTE 16. ? MYCHAD ? 100000+.RPCNT>
105 ;BYTE (16) LOCAL HOST, LOCAL INDEX (4) 0
106 ;NOTE THIS SAVES THE UNIQUIZER BITS FOR THIS INDEX
107 CHSFRN: BLOCK NINDX ;BYTE (16) FOREIGN HOST, FOREIGN INDEX (4) 0
108 ;THESE FOUR ARE FOR BYTE-STREAM I/O
109 CHSOBP: BLOCK NINDX ;BYTE PNTR TO OUTPUT BUFFER, 0 IF NONE
110 CHSOBC: BLOCK NINDX ;BYTE COUNT, NUMBER OF BYTE SPACES LEFT IN OUTPUT BUFFER
111 CHSIBP: BLOCK NINDX ;BYTE PNTR TO INPUT BUFFER, 0 IF NONE
112 CHSIBC: BLOCK NINDX ;BYTE COUNT, NUMBER OF VALID BYTES REMAINING IN INPUT BUFFER
114 CHAOSW: -1 ? 0 ;SWITCH FOR ALLOCATING INDICES
115 CHALCP: 0 ;LAST INDEX ALLOCATED, USED TO CIRCULARIZE ALLOCATION
117 CHIRFJ: SIXBIT/CHAOS/ ? 0 ;AGENT OF CHAOS
118 .SEE NETUSW ;NON-ZERO ENABLES RFC'S FROM HOSTS OTHER THAN SELF.
122 CHNPI: 0 ;NUMBER OF PACKETS INPUT (REALLY TO 10)
123 CHNPO: 0 ;NUMBER OF PACKETS OUTPUT (ALL CAUSES)
124 CHNPF: 0 ;NUMBER OF PACKETS FORWARDED
125 CHNSTS: 0 ;NUMBER OF STS PACKETS OUTPUT
126 CHNSNS: 0 ;NUMBER OF SNS PACKETS OUTPUT
127 CHNRTR: 0 ;NUMBER OF RETRANSMITTED PACKETS OUTPUT
128 CHNPFL: 0 ;NUMBER OF PACKETS DISCARDED (FORWARDING LOOP)
129 CHNPD: 0 ;NUMBER OF PACKETS DISCARDED (DUPLICATES)
130 CHNIPI: 0 ;NUMBER OF INTERNET PACKETS IN FROM CHAOSNET
131 CHNIPO: 0 ;NUMBER OF INTERNET FRAGMENTS OUT TO CHAOSNET
133 ;BUFFER QUEUES. EACH HAS A ONE-WORD HEADER, WHICH IS ZERO
134 ;IF IT IS EMPTY, OR CONTAINS FIRST,,LAST BUFFER ADDRESS.
137 CHQRFC: 0 ;PENDING RFCS
138 CHQLSN: 0 ;PENDING LISTENS
141 CHFRBF: 0 ;NUMBER OF FREE BUFFERS
142 CHTTBF: 0 ;TOTAL NUMBER OF BUFFERS
143 IF2 CHMXBF==50.*<1024./<%CPMXW+2>> ;MAX CORE FOR CHAOS NET 50K
144 CHMXTM: 0 ;TIME OF LAST COMPLAINT ABOUT USING TOO MUCH CORE
147 ;VARIABLES FOR TEN-11 INTERFACE CONNECTING TO CHAOS NET
149 .SEE T11CHS ;EXEC ADDRESS OF PDP11 COMMUNICATION AREA
150 T11VER=T11CHS ;VERSION NUMBER
151 T11I10=T11CHS+1 ;INIT 10
152 T11I11=T11CHS+2 ;INIT 11
153 T11PRM=T11CHS+3 ;.WORD BUFFER SIZE, # BUFFERS
154 ;THEN 4 SPARE DOUBLEWORDS
155 T11IBB: T11CHS+8 ;BEGINNING OF INPUT BUFFERS
156 T11IBE: 0 ;END OF INPUT BUFFERS
157 T11IBP: 0 ;POINTER TO NEXT INPUT BUFFER
158 T11OBB: 0 ;BEGINNING OF OUTPUT BUFFERS
159 T11OBE: 0 ;END OF OUTPUT BUFFERS
160 T11OBP: 0 ;POINTER TO NEXT OUTPUT BUFFER
161 T11BSZ: 0 ;BUFFER SIZE IN PDP10 WORDS
162 T11WIN: 0 ;1 WINNING, -1 HAVE TOLD 11 TO INIT, 0 NOT WINNING
163 T11XMQ: 0 ;QUEUED TRANSMISSION QUEUE
164 T11CKE: 0 ;COUNT OF CHECKSUM ERRORS
165 ;THE FIRST 32-BIT WORD OF A BUFFER IS 0 IF IDLE, OR
166 ;NON-ZERO IF BUFFER IS TO BE SENT TO OTHER MACHINE.
167 ;THE SECOND 32-BIT WORD IS THE CHECKSUM, WHICH IS
168 ;COMPUTED BY ADDING ALL THE 32-BIT WORDS, IGNORING OVERFLOW,
169 ; AND LOGICALLY SHIFTING RIGHT ONE BIT AFTER EACH ADD; BITS SHIFTED
170 ; OUT ON THE RIGHT ARE BROUGHT BACK IN ON THE LEFT.
171 ;IF THE NUMBER OF 16-BIT WORDS IS ODD, THE LEFT-OVER ONE BETTER BE 0.
175 ;VARIABLES FOR INTERFACE TO CHAOS NET ON PDP11 ON DL10
176 ;.SEE INDICATES A VARIABLE SHARED BETWEEN 10 AND 11
177 ;NOTE THAT THE DL10 HARDWARE LIMITS PACKET LENGTH TO 256 WORDS (1K BYTES)
179 .SEE DLCINI ;WHEN THE 11 SEES THIS NON-ZERO, IT KNOWS ITS HAS
180 ; BEEN RELOADED AND RESETS ITS PACKET POINTER TO 0
182 DLCSBF: 0 ;CURRENT BUFFER, 10 SEND SIDE (1 OR 0)
184 DLCSA1: 0 ;ADDRESS OF PACKET BEING SENT
185 DLCSA2: 0 ;DITTO, SECOND BUFFER
186 .SEE DLCSP1 ;POINTER USED BY PDP11 TO COPY PACKET (16-BIT BYTES)
187 .SEE DLCSP2 ;DITTO, SECOND BUFFER
188 .SEE DLCSS1 ;STATE FOR BUFFER 1, 0 IDLE, 1 SENT TO 11, 2 11 DONE
189 .SEE DLCSS2 ;STATE FOR BUFFER 2
191 DLCRA1: 0 ;ADDRESS OF PACKET BUFFER RECEIVING A PACKET
192 DLCRA2: 0 ;DITTO, SECOND BUFFER
193 .SEE DLCRP1 ;POINTER USED BY PDP11 TO COPY PACKET (16-BIT BYTES)
194 .SEE DLCRP2 ;DITTO, SECOND BUFFER
195 .SEE DLCRS1 ;STATE FOR BUFFER 1, 0 IDLE, 1 AWAITING 11, 2 CONTAINS A PACKET
196 .SEE DLCRS2 ;STATE FOR BUFFER 2
198 DLCXMQ: 0 ;TRANSMIT BUFFER LIST FOR DL10
199 ;NOTE THAT THIS IS NOT A REGULAR BUFFER LIST SINCE
200 ;IT IS THREADED THROUGH LH INSTEAD OF RH. WE DO MAINTAIN
201 ;POINTERS TO FIRST,,LAST HOWEVER
205 ;VARIABLES FOR CH10 INTERFACE ONLY
207 CHXCNO: CHXREN+CHXTEN+CHXCHN ;CONO BITS CURRENTLY IN EFFECT
211 ;VARIABLES FOR CH11 INTERFACE ONLY
213 CHXCSR: %CAREN+%CATEN ;CURRENT BITS WANTED IN CSR
217 ;VARIABLES THAT WOULD OTHERWISE BE IN THE FRONT-END
219 CHXXMQ: 0 ;HEAD,,TAIL OF TRANSMIT QUEUE
220 CHOSTA: 0 ;OUTPUT STATUS: 0 IDLE, ELSE NUMBER OF TRANSMISSIONS
221 NCHRTR==4 ;TRANSMIT UP TO 4 TIMES IN FACE OF COLLISIONS
224 NSUBNT==122. ;122 is maximum possible
225 SBNRUT: REPEAT NSUBNT, 1000,,3040 ;COST,,GATEWAY ADDRESS
228 CHNABT: 0 ;NUMBER OF TRANSMIT ABORTS
229 CHNCRC: 0 ;NUMBER OF CRC ERRORS BEFORE READING PACKET
230 CHNCR2: 0 ;NUMBER OF CRC ERRORS AFTER READING PACKET
231 CHNWLE: 0 ;NUMBER OF WORD LENGTH ERRORS (NOT MULTIPLE OF 16 BITS)
232 CHNPLE: 0 ;NUMBER OF PACKET LENGTH ERRORS (DISAGREES WITH LENGTH IN HEADER)
233 CHNLOS: 0 ;NUMBER OF PACKETS LOST DUE TO RECEIVER BUSY
236 CHNSPZ: 0 ;NUMBER OF TIMERS BIT COUNTER SPAZZED
241 ;Get definitions of packet format
246 PKTBSZ==%CPMXW+2 ;PACKET BUFFER IS 2 HEADER WORDS + MAX SIZE PACKET
247 IFN <PKTBSZ&<-PKTBSZ>>-PKTBSZ, .ERR PKTBSZ IS SUPPOSED TO BE A POWER OF 2
249 $CPKSX==$CHXRI+40000,,2 ;REAL PART OF SOURCE INDEX
250 $CPKDX==$CHXRI+40000,,1 ;REAL PART OF DESTINATION INDEX
256 ;;; This contains the last N headers received from the network
259 RECHDP: RECHDR ;POINTER TO NEXT
260 RECHDR: BLOCK NRECHD*%CPKDT
263 SUBTTL CHAOS NET OPEN (.CALL CHAOSO)
265 ;.CALL CHAOSO,RCVCHN,XMTCHN,<RECEIVE,,TRANSMIT>
267 CHASO: JRST OPNL12 ; Say "mode not avail"
272 JRST OPNL14 ;BAD CHANNEL NUMBER ARGUMENT
274 JRST OPNL33 ;BOTH CHANNELS SAME IS ILLEGAL
275 PUSH P,A ;SAVE ARGS, CLOSE THE SPECIFIED CHANNELS
287 MOVE U,USER ;TO SAVE ULCERS
288 HRRZM A,UUAC(U) ;REMEMBER INPUT CHNL # FOR ERRS
289 PUSHJ P,SWTL ;LOCK CHAOS INDEX ASSIGNMENT SWITCH
291 MOVE I,CHALCP ;ALLOCATE AN INDEX
293 CHASO1: SKIPL CHSUSR(I)
296 CHASO2: MOVEI I,NINDX ;REACHED BEGINNING, WRAP AROUND TO END
298 JRST OPNL6 ;ALL INDICES IN USE
302 CHASO3: MOVEM I,CHALCP ;SAVE SCAN POINTER FOR NEXT TIME
303 PUSHJ P,CHASO4 ;INIT VARIOUS STUFF
304 CAILE C,MXWIND ;SET UP WINDOW SIZE
305 MOVEI C,MXWIND ;DON'T LET USER USE UP TOO MUCH WIRED CORE
307 HRRZM U,CHSUSR(I) ;VARIABLES INITIALIZED, MAKE INDEX IN USE.
308 DPB A,[$CHSUI,,CHSUSR(I)]
309 DPB B,[$CHSUO,,CHSUSR(I)]
310 HRLZ T,I ;SET UP USER'S IOCHNM WORDS
317 JRST LSWPJ1 ;SUCCESS RETURN
319 ;INITIALIZE CONNECTION IN I
320 CHASO4: SETZM CHSNBF(I)
326 SETZM CHSPKN(I) ;START PACKET NUMBERING AT ONE
331 MOVSI T,%CFOFF .SEE %CSCLS
333 LDB TT,[$CHXUN+40000,,CHSLCL(I)]
334 CAIE TT,CHXMUN ;INCREMENT THE UNIQUIZER
336 MOVEI TT,1 ;BUT MAKE SURE IT ISN'T ZERO
337 DPB TT,[$CHXUN+40000,,CHSLCL(I)]
341 SUBTTL CHAOS NET CLOSE, FINISH, WHYINT, NETBLK, CHAOSQ
343 ;CLOSE A CHAOS CHANNEL.
344 CHACLS: HLRZ I,(R) ;GET VARIABLES INDEX
346 TDNN A,CHSSTA(I) ;ONLY REALLY CLOSE WHEN BOTH CHANNELS CLOSED
348 PUSHJ P,CHACS1 ;FLUSH ALL BUFFERS OF THIS CONNECTION
351 PUSHJ P,CHABGI ;SEND A CLS IF OPEN AND MEM AVAIL
357 MOVEI B,[ASCIZ/Channel closed/]
359 CHACS4: CONO PI,NETOFF
360 SETZM (R) ;CLOSE THIS CHANNEL
361 SETOM CHSUSR(I) ;RETURN INDEX
362 MOVE W,CHQLSN ;FLUSH ANY PENDING LSN PACKET
364 CHACS5: MOVEI Q,W ;GET NEXT PACKET OFF OLD LIST
366 JUMPE A,NETONJ ;EXHAUSTED
367 LDB B,[$CPKSX(A)] ;GET OWNER
369 JRST [ MOVEI Q,CHQLSN ;NOT THIS INDEX, PUT BACK
375 CHACS7: IORM A,CHSSTA(I) .SEE %CFCLS
376 HRRZ B,(R) ;GET DIRECTION
377 CAIN B,CHAIDN ;AS A BYTE POINTER TO CHANNEL NUMBER
378 SKIPA B,[$CHSUI,,CHSUSR(I)]
379 MOVE B,[$CHSUO,,CHSUSR(I)]
380 MOVEI T,77 ;CLOSE THAT CHANNEL
385 ;THIS FLUSHES ALL BUFFERS FOR CONNECTION IN I
386 CHACS1: MOVSI A,%CFOFF ;INHIBIT RETRANSMISSIONS
388 LDB E,[$CFTTN,,CHSSTA(I)]
391 PUSHJ P,NSTYN0 ;DISCONNECT FROM STY
395 MOVEI Q,DLCXMQ ;REMOVE THIS INDEX'S BUFFERS FROM DL10 TRANSMIT LIST
399 MOVEI Q,T11XMQ ;REMOVE THIS INDEX'S BUFFERS FROM TEN11 TRANSMIT LIST
403 MOVEI Q,CHXXMQ ;REMOVE THIS INDEX'S BUFFERS FROM CH10 TRANSMIT LIST
406 MOVEI Q,CHSIBF(I) ;RETURN RECEIVE BUFFERS
408 MOVEI Q,CHSPBF(I) ;RETURN OUT OF ORDER RECEIVE BUFFERS
410 MOVEI Q,CHSOBF(I) ;RETURN TRANSMIT BUFFERS
413 SKIPE A,CHSOBP(I) ;RETURN STREAM I/O BUFFERS
430 ;.CALL FORCE ON A CHAOS OUTPUT CHANNEL.
432 SKIPGE CHSSTA(I) .SEE %CFOFF
433 JRST OPNL7 ;DEVICE NOT READY
434 AOS (P) ;WILL TAKE SUCCESS RETURN
435 CHAFC1: SKIPN A,CHSOBP(I)
436 POPJ P, ;NO BUFFERED OUTPUT TO BE FORCED
437 SUBI A,1 ;SIOKT LIKES TO POINT BP AT NEXT BUFFER
438 ANDI A,-PKTBSZ ;GET PACKET POINTER
440 MOVSI T,(SETZ) ;DATA OPCODE
441 MOVEM T,(A) .SEE $CPKOP
442 MOVEI T,%CPMXC ;SET BYTE COUNT
445 PUSHJ P,[JUMPN T,CHODT1 ;IF THERE IS ANYTHING IN THE BUFFER, TRANSMIT IT
446 JRST CHABRT ] ;OTHERWISE, JUST THROW IT AWAY
447 SETZM CHSOBP(I) ;NOW THERE IS NO BUFFER
451 ;.CALL FINISH ON A CHAOS OUTPUT CHANNEL. WAIT FOR ALL BUFFERS
452 ;ON SEND LIST TO GET SENT AND ACKNOWLEDGED.
453 ;HANGS FOREVER IF SOCKET GETS INTO AN IMPROPER STATE, BUT YOU SHOULD GET AN INTERRUPT
455 PUSHJ P,[HRRZ A,CHSWIN(T)
462 ;.CALL WHYINT ON A CHAOS CHANNEL.
463 ;RESULTS ARE: A/ %WYCHA
465 ; C/ LH NUMBER OF INPUT PACKETS AVAILABLE
466 ; RH NUMBER OF OUTPUT SLOTS AVAILABLE
467 ; D/ WINDOW SIZE (RECEIVE,,TRANSMIT)
468 ; E/ INPUT CHNL#,,OUTPUT CHNL#
472 HRLZ C,CHSNBF(I) ;NUMBER OF PACKETS AVAILABLE
474 ADD C,[1,,] ;ADD 1 IF PARTIALLY-READ INPUT BUFFER EXISTS
477 MOVEI C,0 ;NO INPUT AVAILABLE IF DIRECT-CONNECTED
481 LDB E,[$CHSUO,,CHSUSR(I)]
484 LDB T,[$CHSUI,,CHSUSR(I)]
490 ;.CALL RFNAME on a CHAOS channel. A contains index.
491 ;Returns results analogous to RFNAME on TCP: and (almost) RFNAME on NET:.
492 ;"FN1" is local index, "FN2" is foreign index, "SNAME" is foreign host
493 ;number in HOSTS3 format.
494 CHARCH: LDB B,[042000,,CHSLCL(A)]
495 LDB C,[042000,,CHSFRN(A)]
496 LDB D,[242000,,CHSFRN(A)]
500 ;IOPDL ROUTINES. I IS 0 FOR IOPUSH, 1 FOR IOPOP. R POINTS AT IOCHNM WORD.
501 ;C(R) IS SET UP TO THIS DEVICE IN EITHER CASE.
502 CHAIOP: HRRZ T,R ;DISCOVER CHANNEL NUMBER
505 MOVEI T,77 ;IOPUSH, USE 77
506 HLRZ I,(R) ;GET CHAOS INDEX
507 HRRZ B,(R) ;GET DIRECTION
508 CAIN B,CHAIDN ;AS A BYTE POINTER TO CHANNEL NUMBER
509 SKIPA B,[$CHSUI,,CHSUSR(I)]
510 MOVE B,[$CHSUO,,CHSUSR(I)]
511 DPB T,B ;ADJUST SAVED CHANNEL NUMBER
514 ;.CALL NETBLK ON A CHAOS CHANNEL.
515 ;ARG 1 - CHANNEL (COMES IN IN R)
516 ;ARG 2 - UNDESIRED STATE
517 ;ARG 3 - OPTIONAL TIMEOUT, WRITTEN BACK UNLESS IMMEDIATE
523 IFN NCPP, JRST ANETBL ;NOT A CHAOS CHANNEL, TRY ARPANET
524 IFE NCPP, JRST OPNL34
526 MOVE T,I ;SAVE INDEX IN T FOR FLSINS
528 JRST [ HRLOI D,377777 ;NO TIME GIVEN, USE INFINITY
530 TLNE C,1000 ;SKIP IF POINTER RATHER THAN IMMEDIATE
531 JRST [ HRRZ D,C ;GET IMMEDIATE TIME
534 XCTR XRW,[MOVES D,(C)] ;GET TIME, CHECK WRITEABILITY
535 JUMPGE D,[ MOVNS D ;RELATIVE TIME, MAKE NEGATIVE ABSOLUTE
538 UMOVEM D,(C) ;STORE BACK ABSOLUTE TIME
539 MOVNS D ;MAKE POSITIVE
540 CHANB4: MOVEM D,AC0S+D(U) ;SAVE ABSOLUTE TIME TO WAIT UNTIL
541 MOVEM B,AC0S+B(U) ;SAVE UNDESIRED STATE
542 PUSHJ P,CHANB2 ;SKIP IF STATE CHANGE OR TIMEOUT
545 SUB B,TIME ;HOW MUCH USED?
546 HRRZ A,CHSSTA(I) ;NEW STATE
549 CHANB2: HRRZ A,CHSSTA(T) ;CURRENT STATE
550 CAME A,AC0S+B(U) ;SKIP IF STILL MATCH
552 MOVE A,AC0S+D(U) ;TIMEOUT TIME
558 ;ARG 1 - ADDRESS OF A %CPMXW-WORD PACKET BUFFER
559 ;FINDS THE FIRST PACKET ON THE PENDING-RFC QUEUE, COPIES IT
560 ;INTO THE USER'S BUFFER, AND RETURNS IT TO THE QUEUE.
561 CHAOSQ: MOVE C,A ;SAVE POINTER TO USER'S BUFFER
562 HRL A,A ;MAKE SURE USER'S BUFFER IS SWAPPED IN
563 XCTR XBRW,[BLT A,%CPMXW-1(C)] ;AND NO MAR BREAK SET
564 MOVEI Q,CHQRFC ;GET FIRST PACKET ON RFC QUEUE
566 JUMPE A,OPNL4 ;QUEUE IS EMPTY
567 PUSHJ P,CHAQPL ;PUT BACK AT END OF QUEUE
568 HRL C,A ;COPY PACKET TO USER
570 XCTR XBW,[BLT T,%CPMXW-1(C)]
573 SUBTTL CHAOS NET IOT ROUTINES
575 ;.CALL PKTIOT. ARG1 CHANNEL, ARG2 ADDRESS OF %CPMXW-WORD BUFFER
580 JRST OPNL34 ;WRONG TYPE DEVICE
581 ;CHAOSNET INPUT PKTIOT
582 ;B POINTS TO %CPMXW-WORD PACKET BUFFER
583 CHPKI: PUSHJ P,CHAIOS ;SET UP I, E
584 HLRZ A,CHSIBF(I) ;GET FIRST RECEIVE BUFFER
585 JUMPE A,[PUSHJ P,CHPKI0 ;LIST EMPTY
587 HRL B,A ;COPY TO USER BEFORE REMOVING FROM LISTS
588 LDB T,[$CPKNB(A)] ;GET SIZE OF PACKET
589 ADDI T,4*%CPKDT+3 ;HEADER PLUS ROUND-UP TO NEXT WORD BOUNDARY
590 LSH T,-2 ;CONVERT BYTES TO WORDS
591 ADDI T,-1(B) ;ADDRESS OF LAST DESTINATION WORD
593 LDB TT,[$CPKOP(A)] ;GET OPCODE
594 CAIGE TT,%CODAT ;ACKNOWLEDGE IF DATA
595 CAIN TT,%COEOF ;OR EOF MARK
597 SOS CHSNBF(I) ;NOW REMOVE BUFFER FROM RECEIVE LIST
600 PUSHJ P,CHABRT ;AND RETURN TO FREE
603 ;INPUT WITH INPUT BUFFER EMPTY. MUSTN'T BASH B,C,E.
604 CHPKI0: SKIPGE CHSSTA(I) .SEE %CFOFF
605 JRST [ HRRZ T,CHSSTA(I)
606 CAIE T,%CSFRN ;CHAOSNET OR FOREIGN PROTOCOL?
607 JRST IOCR10 ;IOT WITH CHANNEL IN IMPROPER STATE
608 JRST .+1 ] ;WAIT BUT DON'T TRY TO TOUCH WINDOW SIZE
609 ;HERE CONSIDER INCREASING WINDOW SIZE
610 SKIPN CHSIBF(I) ;AWAIT INPUT
614 ;ACKNOWLEDGE DATA PACKET IN A. ITS OPCODE IN TT.
615 CHPKIA: LDB T,[$CPKPN(A)] ;GET PACKET #
616 HRLM T,CHSPKN(I) ;IT NOW NEEDS TO BE ACKNOWLEDGED
617 CAIN TT,%COEOF ;ALWAYS ACKNOWLEDGE EOF RIGHT AWAY
619 HLRZ TT,CHSACK(I) ;GET LAST ONE REALLY ACKNOWLEDGED
620 SUB T,TT ;GET NUMBER OF PACKETS AWAITING ACK
623 IMULI T,3 ;MORE THAN ONE THIRD THE WINDOW SIZE?
626 CAMN TT,[ASCII/LUNCH/]
627 BUG PAUSE,[CHAOS BUFFER ADDRESS TRASHED],OCT,A
631 PUSHJ P,CHASTO ;YES, SEND ACK (CAN'T PCLSR)
634 ;SET UP FOR CHAOS IOT
635 CHAIOS: HLRZ I,(R) ;GET INDEX
638 JRST IOCR10 ;CAN'T DO I/O WHILE DIRECT-CONNECTED OR HALF-CLOSED
639 HRRZS E ;RETURN STATE IN E
643 ;1.4 IN CTLBTS IS DON'T-HANG MODE
646 PUSHJ P,CHAIOS ;SET UP I, E
656 ;CHAOS INPUT BUFFER DISCARD
657 CHAIBD: SKIPN A,CHSIBP(I)
663 ;CHAOS INPUT BUFFER GET
664 CHAIBG: HLRZ A,CHSIBF(I) ;GET FIRST RECEIVE BUFFER
666 LDB TT,[$CPKOP(A)] ;IS IT NORMAL DATA?
669 PUSHJ P,CHAIB3 ;YES, ACKNOWLEDGE AND REMOVE FROM LIST
670 LDB J,[$CPKNB(A)] ;SET UP FOR BYTE STREAM INPUT
677 PUSHJ P,CHPKIA ;SEND ACKNOWLEDGEMENT
681 SOS CHSNBF(I) ;REMOVE BUFFER FROM RECEIVE LIST
685 CHAIB1: CAIE TT,%COEOF
687 PUSHJ P,CHAIB3 ;EOF PACKET, ACKNOWLEDGE IT
688 PUSHJ P,CHABRT ;RETURN IT TO FREE
689 JRST POPJ2 ;AND SIGNAL EOF
691 CHAIB2: MOVE TT,CTLBTS(U) ;CHECK DON'T-HANG MODE
694 JUMPN A,IOCR10 ;NO, ABNORMAL PACKET, BARF
695 PUSHJ P,CHPKI0 ;AWAIT INPUT
699 ;1.4 IN CTLBTS IS DON'T-HANG MODE
702 PUSHJ P,CHAIOS ;SET UP I, E
704 JRST IOCR10 ;NOT OPEN, ERROR
714 ;GET NEW OUTPUT BUFFER
715 CHAOBG: SKIPG CHSNOS(I) ;WINDOW FULL
716 PUSHJ P,[ MOVE TT,CTLBTS(U)
720 JRST POPJ2 ] ;DON'T HANG MODE, RETURN "EOF"
722 PUSHJ P,CHABGT ;SET UP AN OUTPUT BUFFER
737 ;CHAOSNET OUTPUT PKTIOT.
738 ;B POINTS TO %CPMXW-WORD PACKET BUFFER
739 CHPKO: PUSHJ P,CHAIOS ;SET UP I, E
740 UMOVE H,(B) ;GET HEADER WORD OF USER'S PACKET BUFFER
741 LDB D,[$CPKNB H] ;GET BYTE COUNT
743 TLNE H,(.BM $CPKMV) ;WE DON'T SUPPORT MUPPETS ANY MORE
744 JRST IOCER3 ;BYTE LENGTH OUT OF BOUNDS
745 ADDI D,4*%CPKDT+3 ;CONVERT BYTES TO WORDS, INCLUDING HEADER WDS
747 MOVSI J,1(B) ;SAVE ADDRESS+1 OF USER'S PACKET
748 PUSHJ P,CHABGT ;GET A BUFFER
749 PUSHJ P,LOSSET ;RETURN IT IF PCLSR
751 MOVEM H,(A) ;STORE PACKET HEADER, NOT STORED WITH BLT
752 HRRI J,1(A) ; BECAUSE MIGHT HAVE CHANGED AFTER ERROR CHECK
754 XCTR XBR,[BLT J,(D)] ;COPY USER'S PACKET INTO SYSTEM
755 AOS (P) ;GOING TO SUCCEED
756 SKIPGE (A) ;SKIP IF CONTROL PACKET
758 LDB D,[$CPKOP(A)] ;GET OPCODE
759 CAIGE D,%COMAX ;DISPATCH ON IT
762 JRST IOCER3 ;OPCODE OUT OF BOUNDS
776 %COBRD::JRST IOCER9 ;UNTIL I IMPLEMENT IT
779 ;LOSSET ROUTINE TO RETURN BUFFER A POINTS TO.
780 CHPKO2: MOVE A,AC0S+A(U)
781 PUSH P,Q ;MAY CLOBBER ONLY A AND T
785 ;SENDING %COEOF (END-FILE MARK)
786 CHOEOF: CAIE E,%CSOPN ;CONNECTION MUST BE OPEN
789 PUSHJ P,UFLS ;WINDOW FULL, WAIT
790 JRST CHOOP1 ;SEND RETRANSMITTABLE CONTROL PACKET
792 ;SENDING REQUEST FOR CONNECTION
793 CHORFC: PUSHJ P,CHORF1 ;RE-INITIALIZE CONNECTION
794 MOVSI B,777774 ;SAVE DESTINATION HOST, CLEAR OTHER BITS
797 MOVEI E,%CSRFS ;PUT INTO RFC-SENT STATE
800 ;RE-INITIALIZE CONNECTION WHEN USER OUTPUTS RFC OR LSN
801 ;FLUSHES ANY OLD PACKET BUFFERS, CHANGES UNIQUIZER IN INDEX#
802 CHORF1: JUMPN E,IOCR10 .SEE %CSCLS ;CONNECTION MUST BE CLOSED
805 PUSHJ P,CHACS1 ;FLUSH BUFFERS FROM CONNECTION
806 PUSHJ P,CHASO4 ;REINITIALIZE VARIABLES
810 CHOLSN: PUSHJ P,CHORF1
811 PUSHJ P,LSWDEL ;GOING TO USE PACKET
812 MOVEI E,%CSLSN ;PUT INTO LISTENING STATE
814 MOVEI Q,CHQRFC ;NOW SEARCH PENDING-RFC QUEUE
817 JRST [ CONO PI,NETON ;NO MATCH, PUT ONTO LISTENING QUEUE
822 PUSHJ P,CHIRF0 ;MATCH, JOIN INTERRUPT LEVEL CODE
826 CHOOPN: CAIE E,%CSRFC ;CONNECTION MUST BE RFC-RECEIVED
828 MOVEI TT,4 ;SET BYTE COUNT TO 4
830 PUSHJ P,DPBRCP ;INCLUDE RECEIPT
831 HLRZ B,CHSWIN(I) ;INCLUDE WINDOW SIZE
832 DPB B,[042000,,%CPKDT(A)]
833 MOVEI E,%CSOPN ;MAKE IT OPEN
834 ;HERE TO SEND A RETRANSMITTABLE CONTROL PACKET (RFC OR OPN), NEW STATE IN E
835 ;THIS PACKET WILL GET TAKEN OFF THE CHSOBF LIST BY RECEIPT IN THE NORMAL WAY
836 ;THIS CODE COPIED FROM CHODAT WITH SOME MODIFICATIONS
837 CHOOP1: MOVE T,TIME ;UPDATE CHSITM SO WON'T THINK HOST IS DOWN
839 MOVEM E,CHSSTA(I) ;AND CLEAR %CFOFF (NO OTHER LH FLAGS CAN BE ON)
840 PUSHJ P,LSWDEL ;BUFFER WILL BE USED
841 HRRZ B,CHSPKN(I) ;ASSIGN PACKET NUMBER
847 HLRZ B,CHSPKN(I) ;GET PACKET NUMBER TO ACKNOWLEDGE
848 HRLM B,CHSACK(I) ;REMEMBER IT HAS BEEN
849 DPB B,[$CPKAN(A)] ;PIGGY-BACK THIS ACKNOWLEDGE
850 MOVE B,[<.BM $CPKOP>+<.BM $CPKNB>]
851 ANDM B,(A) ;CLEAR FORWARDING COUNT AND UNUSED FIELD
852 MOVE B,CHSLCL(I) ;SET UP SOURCE
854 MOVE D,CHSFRN(I) ;SET UP DESTINATION
856 SETOM -2(A) ;NOTE NOT ON TRANSMIT LIST YET
857 CONI PI,E ;SUPER KLUDGERY REQUIRED HERE! FOREIGN HOST MIGHT RECEIPT
858 CONO PI,NETOFF ;THIS PACKET JUST AS WE START TO TRANSMIT IT. THIS IS A
859 ;VIOLATION OF PROTOCOL, BUT SHOULDN'T CRASH I.T.S. BECAUSE THE
860 ;PACKET ABOUT TO BE GIVEN TO CHAXMT HAS BEEN FREED ALREADY.
861 MOVEI Q,CHSOBF(I) ;PUT ON END OF SEND LIST
863 JRST CHAXM0 ;GO TRANSMIT
866 CHOCLS: CAIE E,%CSOPN ;CONNECTION MUST BE OPEN
868 CHOFWD: CAIN E,%CSRFC ; OR RFC-RECEIVED
869 TLOA E,%CFOFF ;PUT IT INTO THE CLOSED STATE
871 HLLZM E,CHSSTA(I) .SEE %CSCLS
872 PUSHJ P,LSWDEL ;BUFFER WILL BE USED
873 JRST CHODT2 ;GO TRANSMIT
875 ;Here for transmitting an UNC packet. It could be part of a connection
876 ;or it could be foreign-protocol mode. In any case transmit it without
877 ;munging the header very much.
878 CHOUNC: CAIN E,%CSFRN
879 JRST CHOUN1 ;Okay to transmit UNC now
882 JUMPN E,IOCR10 .SEE %CSCLS ;Bad state
883 SKIPE CHSPBF(I) ;I guess out of order packets would
884 JRST IOCR10 ; cause some confusion in the NCP.
885 MOVE E,[%CFOFF,,%CSFRN] ;Put into foreign-protocol state
887 CHOUN1: MOVE D,%CPKD(A) ;Save destination
889 CHOUN3: MOVE B,CHSLCL(I) ;Set up source
895 CHOUN2: MOVE D,CHSFRN(I) ;Set up destination
901 ;SENDING REGULAR PACKET
902 CHODAT: CAIE E,%CSOPN ;CONNECTION MUST BE OPEN
905 PUSHJ P,UFLS ;WINDOW FULL, WAIT
906 PUSHJ P,LSWDEL ;BUFFER WILL BE USED
907 CHODT1: HRRZ B,CHSPKN(I) ;ASSIGN PACKET NUMBER
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
920 MOVE D,CHSFRN(I) ;SET UP DESTINATION
922 SETOM -2(A) ;NOTE NOT ON TRANSMIT LIST YET
923 SKIPL (A) ;SKIP IF DATA PACKET
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
931 SOSA CHSNOS(I) ;USE UP WINDOW, SKIP
932 ;SKIPS THROUGH INTO CHAXMT
934 SUBTTL CHAOS NET PACKET TRANSMIT ROUTINE
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
947 MOVEM T,-1(A) ;SET TIME OF LAST TRANSMISSION
948 CONO PI,NETOFF ;ONE PROCESS AT A TIME, TO PROTECT INTERFACE VARIABLES
950 HLRZ J,-2(A) ;I TOLD YOU TO SETOM -2(A)
952 BUG PAUSE,[CHAOS BUFFER THREAD TRASHED],OCT,A,OCT,-2(A)
955 ;FOR NOW, JUST ALWAYS SHIP IT OUT THE DL10
957 HLRZ J,DLCXMQ ;MAKE SURE NOT PUTTING ON LIST TWICE
960 BUG PAUSE,[CHAOS BUFFER ALREADY ON DLCXMQ],OCT,A
963 BUG PAUSE,[DLCXMQ THREAD TRASHED]
965 MOVEI J,1 ;MAKE SURE NOT ACTIVE TO 11
968 BUG PAUSE,[CHAOS BUFFER ALREADY ACTIVE TO 11],OCT,A
971 HRRZS -2(A) ;PUT END-LIST INDICATOR IN LH (FLAGS TRANSMIT ACTIVE)
972 MOVE J,DLCSBF ;SEE IF SEND BUFFER IS FREE
975 PUSHJ P,DLCXMT ;YES, SEND THE PACKET NOW
978 CHXMD1: HRRZ B,DLCXMQ ;NO BUFFERS FREE RIGHT NOW, QUEUE
979 JUMPE B,[ HRLZM A,DLCXMQ ? JRST .+2 ]
982 CHXMD2: CONO PI,PICON(E) ;RESTORE PI
986 ;FOR NOW, JUST ALWAYS SHIP IT OUT THE TEN11
987 PUSHJ P,T11CHK ;SEE IF TEN-11 IS READY
989 SKIPE @T11OBP ;SEE IF HAVE AVAILABLE OUTPUT BUFFER
991 PUSHJ P,T11XMT ;SEND THE PACKET NOW
994 CHXME3: HRROS T,-2(A) ;TEN11 DOWN, DISCARD PACKET
999 CHXME1: HRRZ B,T11XMQ ;NO BUFFERS FREE RIGHT NOW, QUEUE
1000 JUMPE B,[ HRLZM A,T11XMQ ? JRST .+2 ]
1003 HRRZS -2(A) ;PUT END-LIST INDICATOR IN LH
1004 CHXME2: CONO PI,PICON(E) ;RESTORE PI
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 ]
1013 HRRZS -2(A) ;PUT END-LIST INDICATOR IN LH
1014 MOVEI B,CHXTEN ;ENABLE TRANSMIT-DONE INTERRUPT
1017 CONO PI,PICON(E) ;RESTORE PI
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 ]
1026 HRRZS -2(A) ;PUT END-LIST INDICATOR IN LH
1027 MOVEI B,%CATEN ;ENABLE TRANSMIT-DONE INTERRUPT
1030 CONO PI,PICON(E) ;RESTORE PI
1034 SUBTTL CHAOS NET DIRECT CONNECT TO STY
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
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
1051 JRST STYCH3 ;NO CORE, WAIT ONE CLOCK TICK
1059 JRST STYCH4 ;BUFFER FULL, FORCE IT
1060 EXCH R,I ;I GETS TTY, R GETS CHAOS
1062 MOVEM D,DBBBP ;SET UP BUFFER FOR TTY OUTPUT INTERRUPT LEVEL
1067 PUSHJ P,TYP ;GENERATE OUTPUT
1070 EXCH R,I ;I GETS CHAOS, R GETS TTY
1071 MOVE D,DBBBP ;ADVANCE POINTERS
1074 SUB E,DBBCC1 ;MINUS # CHARS OUTPUT GENERATED
1077 STYCH4: PUSHJ P,CHAFC1 ;FORCE THE BUFFER
1078 JRST STYCHA ;CHECK FOR MORE OUTPUT
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
1084 JUMPE A,STYNT8 ;NONE, RETURN TO STYNTC
1087 JRST STYCH9 ;RANDOM PACKET, DISCONNECT
1088 PUSHJ P,CHPKIA ;ACKNOWLEDGE GOBBLING OF THIS PACKET
1089 SOS CHSNBF(I) ;REMOVE BUFFER FROM RECEIVE LIST
1092 LDB E,[$CPKNB(A)] ;SET UP FOR BYTE STREAM INPUT
1098 ILDB A,CHSIBP(I) ;GET CHARACTER OF INPUT
1100 JRST [ AOS CHSIBC(I) ;WOOPS, SPECIAL CHARACTER, NEEDS USER ATTENTION
1101 MOVSI A,8_14 ;SO PUT IT BACK AND DISCONNECT
1104 EXCH R,I ;I GETS TTY, R GETS CHAOS
1108 PUSHJ P,NTYI5 ;GIVE CHARACTER TO TTY INPUT INTERRUPT LEVEL
1111 POP P,I ;I GETS CHAOS, R GETS TTY ((POP IN REVERSE ORDER))
1112 JRST STYCH1 ;TRY FOR MORE INPUT
1115 MOVE I,R ;I GETS TTY
1116 PUSHJ P,NSTYN0 ;DISCONNECT THE STY
1118 POP P,I ;I GETS CHAOS
1119 PUSHJ P,CHINTI ;WAKE UP THE TELNET SERVER
1120 JRST STYNT8 ;GO HANDLE OTHER STYS
1122 SUBTTL CHAOS NET CLOCK LEVEL STUFF
1126 ;HERE FROM 1/2 SECOND CLOCK. DO RETRANSMISSIONS AND DELAYED STS'S
1130 PUSHJ P,DLCIBG ;GET MEMORY FOR INPUT BUFFERS IF NEEDED
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
1137 JUMPL I,CPOPJ ;JUMP IF ALL INDICES DONE
1138 PUSHJ P,CHARTR ;RETRANSMIT IF NEEDED
1140 TDNE B,CHSSTA(I) ;SEND STS IF NEEDED
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
1152 SUB T,CHSITM(I) ;TIME SINCE LAST COMMUNICATION FROM OTHER END
1154 JRST [ MOVEI W,%CSINC ;TOO LONG, CONNECTION BROKEN
1157 HRRZ B,CHSSTA(I) ;ONLY PROBE IF OPEN (COULD BE RFC-SENT)
1160 HRRZ B,CHSWIN(I) ;SEE IF NO TRANSMIT WINDOW (LOST STS DURING OPEN)
1162 HRRZ B,CHSACK(I) ;SEE IF AWAITING ACK (WINDOW NOT EMPTY)
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
1174 CHA5C4: MOVEI B,[ASCIZ/Timeout/]
1175 MOVEI Q,CHQRFC ;TIME-OUT FIRST RFC ON LIST
1179 ADDI T,60.*30. ;TIME-OUT IS ONE MINUTE
1180 PUSHJ P,[ CAMG T,TIME
1185 MOVEI T,CHXREN+CHXTEN ;WAKE UP IN CASE OF TIMING ERROR
1186 IORM T,CHXCNO ;IN DEALING WITH CHXCNO
1188 MOVSI T,-NSUBNT ;DECAY ROUTING COSTS
1189 CONO PI,NETOFF ;PREVENT RUT PACKET FROM COMING IN
1190 CHA5C6: HLRZ TT,SBNRUT(T)
1198 MOVEI T,%CAREN+%CATEN ;WAKE UP IN CASE OF TIMING ERROR
1199 IORB T,CHXCSR ;IN DEALING WITH CHXCSR
1201 MOVSI T,-NSUBNT ;DECAY ROUTING COSTS
1202 CONO PI,NETOFF ;PREVENT RUT PACKET FROM COMING IN
1203 CHA5C6: HLRZ TT,SBNRUT(T)
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)
1227 JRST CHART2 ;ANYTHING AFTER THIS IS LIKELY TO LOSE ALSO
1229 PUSHJ P,CHAXMT ;RETRANSMIT THIS
1230 ; HRRZ A,-2(A) ;THREAD TO NEXT
1232 CHART2: CONO PI,PICON(W)
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
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)]
1249 JRST CHODT2 ;FIRE IT OFF
1251 DPBRCP: HLRZ B,CHSPKN(I)
1254 DPB B,[242000,,%CPKDT(A)]
1257 SUBTTL CHAOS NET INTERRUPT-LEVEL INPUT PROCESSING
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
1268 CAIN D,RECHDR+<NRECHD*%CPKDT>
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/]
1284 SKIPGE (A) ;TEST OPCODE
1285 JRST CHIDAT ;DATA PACKET
1286 MOVEI B,[ASCIZ/Illegal opcode/]
1290 JRST CHALOS ;ILLEGAL, FLUSH
1299 IFE CH10P+CH11P,JRST CHABRT ;IGNORE
1300 IFN CH10P+CH11P,JRST CHIRUT
1302 %COLSN::JRST CHALOS ;ILLEGAL, FLUSH
1303 %COMNT::JRST CHABRT ;IGNORE
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
1316 JRST [ AOS CHNPFL ? JRST CHABRT ] ;LOOP, DISCARD
1318 SETOM -2(A) ;NOT ON SEND LIST
1322 IFN CH10P+CH11P,[ ;INCOMING ROUTING INFO
1323 CHIRUT: LSH C,-2 ;NUMBER OF SUBNET ENTRIES
1324 JUMPE C,CHABRT ;COULD BE ZERO-LENGTH
1327 LDB E,[$CPKSA(A)] ;SOURCE HOST IS GATEWAY
1328 CHIRU1: ILDB T,D ;SUBNET
1330 HLRZ B,SBNRUT(T) ;COST OF EXISTING ROUTE
1334 HRLM TT,SBNRUT(T) ;THIS IS BEST ROUTE NOW
1336 CHIRU2: SOJG C,CHIRU1
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
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
1351 POPJ P, ;NOT OPEN, IGNORE
1352 JRST CHASTO ;REPLY WITH STS
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
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
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
1368 MOVEI Q,CHSPBF(I) ;DISCARD OUT-OF-ORDER PACKETS
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
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]
1385 XORI TT,(<.BYTE 8 ? "U ? "S>)
1386 TRNN TT,(<.BYTE 8 ? -1 ? -1>)
1388 CHIRF7: MOVEI Q,CHQLSN ;SEARCH LISTENING QUEUE
1390 JRST CHIRF1 ;NOT FOUND, LOAD SERVER
1391 EXCH A,B ;A LSN, B RFC
1392 LDB I,[$CPKSX(A)] ;GET CORRESPONDING INDEX
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
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
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.
1412 CHIRD0: CAMN C,%CPKS(T)
1413 JRST CHABRT ;THIS RFC IS A DUPLICATE, IGNORE IT
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
1420 JUMPGE T,CHIRD3 ;NO DUPLICATE OF THIS RFC, QUEUE IT
1424 JRST CHABRT ;REALLY A DUPLICATE, DISCARD
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
1435 JRST [ CONO PI,PICON(Q)
1436 JRST CHABRT ] ;RING BUFFER FULL, IGNORE, RETRY WILL CATCH
1438 MOVE T,TIME ;REMEMBER WHEN THIS RFC WAS QUEUED
1441 JRST CHAQPF ;PUT ON FRONT OF QUEUE
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
1452 MOVE T,%CPKS(A) ;EXCHANGE SOURCE AND DESTINATION
1455 MOVE D,[440800,,%CPKDT(A)]
1461 CHIRF5: DPB C,[$CPKNB(A)]
1462 SETOM -2(A) ;NOT ON ANY SEND LIST
1463 JRST CHAXMT ;SEND IT
1465 ;HERE FOR RFC TO "STATUS"
1474 IFG BAR-4, .ERR NAME MORE THAN 4 CHARACTERS
1479 CHIRF3: MOVE B,[MNAME FOO ,,] ;NAME OF MACHINE IN 8-BIT ASCII
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)
1508 SETZM (A) .SEE $CPKFC
1510 MOVE T,%CPKS(A) ;EXCHANGE SOURCE AND DESTINATION
1513 MOVEI C,13*4+IFN CH10P+CH11P,[20.] ;BYTE COUNT
1522 ;HERE TO CONVERT A BRD INTO AN RFC
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
1544 DPB TT,[$CPKAN(A)] ;ZERO THE ACK FIELD
1546 DPB TT,[$CPKDA(A)] ;PRETEND IT WAS FOR ME
1547 JRST CHIRFC ;AND HANDLE IT AS AN RFC
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
1558 SKIPGE CHSSTA(I) .SEE %CFOFF
1559 POPJ P, ;NOT TALKING TO NETWORK
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
1570 JRST POPJ1 ;SUCCEED, CALLER CHECKS THE STATE
1572 ;INTERRUPT LEVEL PROCESSING OF RECEIVED OPN PACKET
1573 CHIOPN: PUSHJ P,CHFNDX ;FIND CONNECTION TO BE OPENED
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
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
1586 ;COME HERE WITH INDEX IN I AND NEW STATE IN W, TO CHANGE STATE AND INTERRUPT
1587 CHINT: HRRM W,CHSSTA(I)
1589 MOVEM T,CHSITM(I) ;IN CASE GOT HERE FROM CHOLSN
1592 IORM T,CHSSTA(I) ;DISENGAGE PI LEVEL
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?
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
1604 MOVE TT,STYNTA ;ADD TO LIST
1605 MOVEM TT,STYNTL-NFSTTY(T)
1609 CHINT4: SKIPGE TT,CHSUSR(I)
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
1614 POPJ P, ;IOPUSH'D, NO INTERRUPT
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
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
1640 JRST [ LDB B,[$CPKPN(T)]
1642 HLRZ T,CHSIBF(I) ;IF IT'S AN UNC, HAVE TO GO FIND CORRECT PACKET
1643 CHIDT5: LDB TT,[$CPKOP(T)]
1649 ANDI B,177777 ;NEXT IN-ORDER PACKET EXPECTED
1651 JRST CHIDT1 ;EQUAL, IT GOES ON THE END OF CHSIBF(I) LIST.
1652 SUB B,C ;NOT EQUAL, COMPARE THEM MODULO 2^16.
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
1664 JRST [ MOVE B,D ;E IS LESS, KEEP LOOPING
1667 JRST .+1 ] ;REACHED END PUT IT HERE
1669 HRRM A,-2(B) ;THREAD ONTO PREVIOUS PACKET
1671 CHIDT4: HRRM A,CHSPBF(I) ;THREAD ONTO BACK OF LIST
1673 HRLM A,CHSPBF(I) ;THREAD ONTO FRONT OF LIST
1674 HRRM D,-2(A) ;THREAD IN BEFORE PACKET IN D
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
1685 PUSHJ P,CHAQPL ;PUT ON END OF RECEIVE LIST
1686 HLRZ A,CHSPBF(I) ;GET FIRST OUT-OF-ORDER PACKET
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.
1695 PUSHJ P,CHAQGF ;YES, PULL PACKET OF OUT-OF-ORDER LIST
1698 JRST CHIDT1 ;AND GO PUT ONTO IN-ORDER LIST
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
1706 ;HERE FOR RECEIVING AN UNC PACKET
1707 CHIUNC: LDB I,[$CPKDI(A)] ;Destination index zero?
1709 LDB I,[$CPKDX(A)] ;GET REAL-INDEX PART OF DESTINATION INDEX
1712 JRST CHALOS ;NO MATCH
1713 MOVE TT,%CPKD(A) ;DESTINATION ADDRESS MATCHES?
1716 HRRZ E,CHSSTA(I) ;IN FOREIGN PROTOCOL MODE?
1719 MOVE TT,%CPKS(A) ;NORMAL PROTOCOL, SOURCE ADDRESS MUST MATCH
1721 CAIE E,%CSOPN ;AND STATE MUST BE OPEN
1723 CHIUN1: MOVE TT,TIME
1725 SKIPE T,CHSIBF(I) ;DISCARD PACKET IF OVER WINDOW SIZE
1726 JRST [ LDB TT,[$CPKOP(T)] ; AND ALREADY HAVE AN UNC
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
1739 IFE INETP,JRST CHALOS ;No comprendo internet
1741 LDB I,[$CPKAN(A)] ;Protocol number
1742 CAIE I,8_8 ;DOD Internet #x0800
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
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
1754 ADDI B,(C) ;Address of last destination word
1756 EXCH A,J ;Free the Chaosnet packet
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
1763 CHIUN3: MOVE A,J ;Discard Chaosnet packet
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
1775 ;INTERRUPT LEVEL PROCESSING OF STS
1776 CHISTS: PUSHJ P,CHFNDX
1778 CAIE E,%CSOPN ;CONNECTION MUST BE OPEN
1780 CHIST1: LDB B,[042000,,%CPKDT(A)] ;GET NEW WINDOW SIZE
1784 LDB B,[242000,,%CPKDT(A)] ;PROCESS RECEIPT
1787 JRST CHARTR ;RETRANSMIT
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
1800 HRRM T,CHSACK(I) ;ACKNOWLEDGED PACKET NUMBER IS NEW START OF WINDOW
1802 HLRZ A,CHSOBF(I) ;MAP DOWN SEND LIST
1803 JUMPE A,CHIAK2 ;LIST EMPTY
1804 CHIAK1: LDB D,[$CPKPN(A)]
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
1812 MOVEI Q,DLCXMQ ;ON TRANSMIT LIST, TRY TO TAKE OFF
1823 CAIA ;AND DON'T FREE IT
1824 CHIAK3: PUSHJ P,CHABRT
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
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
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.
1847 CHIAKF: MOVEI D,2(Q) ;LH[-2(D)] POINTS TO (T)
1849 JUMPE T,CPOPJ ;NOT FOUND
1852 HLRZ T,-2(A) ;LINK OUT
1854 JUMPN T,CHABRT ;JUMP IF DIDN'T DELETE LAST PACKET IN LIST
1855 HRRM D,(Q) ;NEW LAST PACKET IN LIST
1857 SETZM (Q) ;FOO, TRANSMIT LIST NOW EMPTY
1860 SUBTTL CHAOS NET DL10 INTERRUPT ROUTINE
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
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
1876 MOVE A,DLCRA1(J) ;GOT INPUT, PROCESS IT
1877 SETZM DLCRS1(J) ;BUFFER SLOT NOT OCCUPIED NOW
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
1885 DLCWK2: MOVEI J,1 ;SCAN CHANNELS FOR OUTPUT DONE
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
1897 DLCWK4: MOVE J,DLCSBF ;TRY TO SEND SOME OUTPUT
1899 JRST DLCWK9 ;BUFFER BUSY
1900 HLRZ A,DLCXMQ ;GET ANOTHER OFF TRANSMIT QUEUE
1901 JUMPE A,DLCWK9 ;QUEUE EMPTY
1905 BUG PAUSE,[CHAOS LIST THREAD TRASHED],OCT,A,OCT,-2(A)
1910 CAME A,DLCXMQ ;REACHED END OF LIST, END IN RIGHT PLACE?
1911 BUG PAUSE,[DCLXMQ THREAD TRASHED]
1918 PUSHJ P,DLCXMT ;SEND IT ON THIS BUFFER
1919 JRST DLCWK4 ;GO TRY TO SEND ON OTHER BUFFER
1922 CONO PI,PICON(E) ;RESTORE PI
1925 ;THIS ROUTINE SUPPLIES AN INPUT BUFFER TO THE 11 ON ALL BUFFERS THAT NEED IT
1926 ;CALL WITH INTERRUPTS OFF OR IN PROGRESS
1931 PUSHJ P,CHABGI ;GET A BUFFER
1932 JRST [ SETZM DLCRA1(J) ;NO MEMORY, WILL TRY AGAIN AT CLOCK LEVEL
1935 SETZM (A) ;CLEAR THE BUFFER SINCE THE DL10 DOESN'T TOUCH LOW 4 BITS
1939 MOVEM A,DLCRA1(J) ;MAKE AVAILABLE TO PDP11
1943 IFN KS10P, .ERR CLRCSH not needed here?
1944 IFN KL10P, PUSHJ P,DLCSWP ;SWEEP CACHE BEFORE SIGNALLING 11
1947 CONO DLC,100040+TTYCHN ;INTERRUPT 11
1948 JRST DLCIB1 ;TRY FOR OTHER BUFFER ALSO
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
1955 MOVEM A,DLCSP1(J) ;GIVE 11 POINTER TO NEW PACKET
1957 IFN KS10P, .ERR CLRCSH not needed here?
1958 IFN KL10P, PUSHJ P,DLCSWP ;SWEEP CACHE, PUTTING PACKET INTO CORE
1960 MOVEM T,DLCSS1(J) ;ACTIVATE PDP11
1961 CONO DLC,100040+TTYCHN
1962 XORI J,1 ;NEXT BUFFER
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
1979 SUBTTL CHAOS NET TEN-11 INTERFACE STUFF
1982 ;THIS ROUTINE CHECKS FOR TEN-11 INITIALIZATION, SKIP-RETURNS IF OK TO USE
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
1996 JRST T11CK1 ] ;AND INIT OURSELVES
1997 SKIPE T11I11 ;WAITING FOR 11 TO REINIT?
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)
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
2008 MOVEM TT,T11IBE ;INIT POINTERS
2013 HRREI T,-T11CHS-2000(TT)
2014 JUMPG T,T11LUZ ;COMMUNICATION AREA LONGER THAN 1K
2017 T11CK2: SETZM (T) ;CLEAR BUFFER HEADERS
2021 MOVEM T,T11WIN ;WE'RE WINNING (MAKE T11WIN POSITIVE NON-ZERO)
2022 SETZM T11I10 ;INIT DONE
2025 ;HERE IF PDP11 PARAMETERS DON'T MATCH WHAT WE EXPECT
2026 T11LUZ: SETZM T11WIN ;NOT WINNING
2029 ;HERE FROM CLOCK LEVEL TO CHECK ON TEN-11 CHAOS NET CHANNEL
2030 T11WAK: PUSHJ P,T11CHK ;IS EVERYTHING OK?
2032 T11WK0: MOVE C,T11IBP ;CHECK INPUT
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
2039 CAILE D,%CPMXW ;DON'T GET FAKED OUT BY CLOBBERED COUNT
2041 PUSHJ P,CHABGI ;GET PLACE TO PUT IT
2042 JRST T11WK1 ;NONE AVAILABLE
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
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
2061 JRST [ AOS T11CKE ;COUNT CHECKSUM ERRORS
2062 PUSHJ P,CHABRT ;AND DISCARD PACKET
2065 PUSHJ P,CHAPII ;PROCESS THE INPUT
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
2078 PUSHJ P,T11XMT ;COPY PACKET INTO 11
2080 JRST T11WK1 ;LOOK FOR MORE OUTPUT
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
2087 LSH C,-2 ;CONVERT TO WORD COUNT
2088 MOVE Q,(Q)[ -1 ;MASK FOR BYTES TO RETAIN IN LAST WORD
2091 <.BYTE 8 ? -1 ? -1 ? -1> ]
2094 ANDM Q,(TT) ;MASK OFF LAST WORD
2096 EQVI C,(A) ;AOBJN PTR
2097 MOVEI TT,0 ;COMPUTE XOR CHECKSUM IN TT
2098 SKIPA B,T11OBP ;-> CURRENT OUTPUT BUFFER IN 11
2101 TRZ T,17 ;CLEAR BITS 10-11 TREATS SPECIALLY
2102 ADD TT,T ;COMPUTE CHECKSUM
2109 MOVEM TT,1(B) ;GIVE CHECKSUM TO 11
2111 MOVEM TT,0(B) ;GIVE PACKET TO 11
2112 ADD B,T11BSZ ;ADVANCE BUFFER POINTER
2116 HRROS T,-2(A) ;TAKE PACKET OFF TRANSMIT LIST
2118 PUSHJ P,CHABRT ;NOT ON SEND LIST, FREE IT
2122 SUBTTL CH-10 INTERRUPT ROUTINES
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.
2142 CONSO CHX,CHXRCV ;PACKET RECEIVED?
2144 PUSHJ P,CHABGI ;GET PLACE TO PUT PACKET
2145 JRST [ MOVEI T,CHXREN ;NONE AVAILABLE, DISABLE INTR
2149 CONSZ CHX,CHXCRC+CHXWLE ;CHECK FOR ERRORS
2150 JRST [ CONSZ CHX,CHXCRC
2153 JRST CHXBK4 ] ;IGNORE PACKET
2154 DATAI CHX,T ;FIRST DATAI YIELDS GARBAGE
2155 MOVEI T,CHXSWB ;DISABLE BYTE SWAPPING
2158 HRLI A,-%CPKDT ;READ HEADER
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
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
2170 JUMPGE D,.+3 ;EMPTY PACKET BOUNDARY CASE
2173 DATAI CHX,T ;NOW READ AND IGNORE HARDWARE HEADER
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
2187 PUSHJ P,CHAPII ;PROCESS THE INPUT
2190 CHXBK4: PUSHJ P,CHABRT ;DIDN'T USE BUFFER AFTER ALL
2191 CONI CHX,T ;COUNT LOST PACKETS
2194 MOVEI T,CHXREN ;ENABLE RECEIVER FOR NEXT PACKET
2197 CHXBK5: CONSO CHX,CHXXMT ;TRANSMIT DONE?
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
2208 CONO CHX,CHXXMT(T) ;RETRANSMIT PACKET
2211 CHXBK7: SETZM CHOSTA ;TRANSMITTER IDLE, LOOK FOR NEXT PACKET
2213 HLRZ A,CHXXMQ ;ANYTHING QUEUED FOR TRANSMISSION?
2214 JUMPE A,[ MOVEI T,CHXTEN ;DISABLE INTERRUPTS
2219 HLRZ B,-2(A) ;CDR TRANSMIT QUEUE
2222 SETZM CHXXMQ ;QUEUE EMPTY NOW
2224 AOS CHOSTA ;NOW SEND THIS PACKET
2225 MOVEI T,CHXHLF+CHXSWB ;CLEAR HALFWORD, BYTE-SWAP MODES
2228 HRLI A,-%CPKDT ;TRANSMIT HEADER
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
2238 JUMPGE D,.+3 ;EMPTY PACKET BOUNDARY CASE
2241 MOVEI T,CHXHLF+CHXTEN ;SWITCH TO HALFWORD MODE, ENABLE DONE INTR
2244 TLNE T+1,400000 ;SEND EXTRA HALFWORD IF NEEDED
2246 MOVEI T,CHXSWB ;DISABLE SWAP BYTES MODE
2249 LDB T,[$CPKDN(A)] ;GET DESTINATION SUBNET
2250 HRRZ D,SBNRUT(T) ;GATEWAY TO THAT SUBNET
2252 CAIN T,MYCHAD_-8 ;IF ON LOCAL CABLE
2253 LDB D,[$CPKDA(A)] ;GO DIRECT
2255 DATAO CHX,D ;STORE HARDWARE DESTINATION ADDRESS
2256 MOVE T,CHXCNO ;TRANSMIT PACKET
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
2268 CHSWAB: LDB T,[$CPKOP(A)] ;DOES THIS PACKET NEED BYTE SWAPPING?
2271 POPJ P, ;BINARY DATA
2272 JRST CHSWB1 ] ;CHARACTER DATA
2276 JUMPL T,CPOPJ ;BINARY CONTROL PACKET
2277 CHSWB1: MOVEI T,CHXSWB ;CHARACTER, SWAP DEM BYTES
2282 CHSWBT: 1_<35.-%COOPN>+1_<35.-%COSTS>+1_<35.-%CORUT>
2286 SUBTTL CH-11 INTERRUPT ROUTINES
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.)
2299 ;;; Macros that will eventually be instructions
2301 DEFINE PACK16 AC,E ;AC,AC+1 right-aligned and zero-filled
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
2314 ADDI AC+1,(AC+1) ;B1,B4 in position in AC+1
2319 DEFINE UNPK16 AC,E ;Doesn't bother masking off garbage bits
2322 ROT AC,16. ;First halfword right-aligned
2323 LSH AC+1,-4 ;Second halfword right-aligned
2327 MOVE AC,E ;B1B2B3B4...
2328 ROT AC,8 ;B2B3B4...B1
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
2344 CHXBKH: 0 ;Hardware interrupt on TTYCHN comes here
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
2355 CHXBRK: 0 ;Software interrupt on CHXCHN comes here
2357 CONO PI,020000+200_<-CHXCHN> ;BAG-BITING DEC LOSERS
2362 IORDI T,CAICSR ;Check for received packet
2364 JRST CHXBK3 ;No incoming packet yet
2365 TRNE T,%CAERR ;Check for error in received packet
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
2371 JRST [ AOS CHNWLE ;Length not a multiple of 16
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
2377 HRLI A,-%CPKDT ;Copy out the packet header
2378 CHSRC1: IORDI B,CAIRBF
2382 PUSHJ P,CHSHDR ;Decode the header
2383 JRST CHSRC4 ;No byte swapping
2385 CHSRC2: IORDI B,CAIRBF ;Read out the data, byte-swapped
2389 CHSRC3: JUMPGE H,CHSRC7 ;Jump if even packet length
2390 IORDI B,CAIRBF ;Residual halfword
2391 SETZ C, ;Somebody depends on zero here
2395 CHSRC4: JUMPGE D,CHSRC6
2396 CHSRC5: IORDI B,CAIRBF ;Read out the data, halfwords
2400 CHSRC6: JUMPL H,[ IORDI B,CAIRBF ;Residual halfword
2401 SETZ C, ;Somebody depends on zero here
2404 CHSRC7: SUB D,R ;AOBJN pointer minus number of words in packet
2406 JRST [ AOS CHNPLE ;Packet length disagrees with hardware length
2408 IORDI T,CAIRBF ;Read the three hardware header words
2412 TRNE T,%CAERR ;Make sure packet came out of RAM okay
2413 JRST [ AOS CHNCR2 ;Garbage, try again
2415 IORDI T,CAIRBC ;Make sure counter didn't spazz
2419 CONO PI,NETOFF-1 ;Get to network interrupt level
2420 PUSHJ P,CHAPII ;Process the input
2422 CHXBK1: IORDI T,CAICSR ;Count lost packets
2426 IORI TT,%CARCL ;Enable receiver for next packet
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?
2441 HLRZ B,-2(A) ;CDR transmit queue
2444 SETZM CHXXMQ ;Queue empty now
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
2456 HRLI A,-%CPKDT ;Transmit header
2457 CHXXM1: UNPK16 B,(A)
2461 PUSHJ P,CHSHDR ;Decode the header
2462 JRST CHXXM4 ;No byte swapping
2464 CHXXM2: UNPK8 B,(D) ;Transmit data with byte swapping
2468 CHXXM3: JUMPGE H,CHXXM7 ;Jump if even packet length
2469 UNPK8 B,(D) ;Transmit residual bytes
2473 CHXXM4: JUMPGE D,CHXXM6
2474 CHXXM5: UNPK16 B,(D) ;Transmit data with byte swapping
2478 CHXXM6: JUMPGE H,CHXXM7 ;Jump if even packet length
2479 UNPK16 B,(D) ;Transmit residual bytes
2481 CHXXM7: LDB T,[$CPKDN(A)] ;Get destination subnet
2482 HRRZ D,SBNRUT(T) ;Gateway to that subnet
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
2492 MOVSI 17,CHXACS ;Dismiss software interrupt
2496 CHXBK2: PUSHJ P,CHABRT ;Packet no good, discard it
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).
2506 CHSHDR: HRRZI A,-%CPKDT(A) ;Restore packet address
2507 LDB W,[$CPKNB(A)] ;Get size of packet in bytes
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
2514 LDB T,[$CPKOP(A)] ;Does this packet need byte swapping?
2517 AOS (P) ;Character data
2518 POPJ P, ] ;Binary data
2522 JUMPL T,CPOPJ ;Binary control packet
2523 JRST POPJ1 ;Characters
2525 CHSWBT: 1_<35.-%COOPN>+1_<35.-%COSTS>+1_<35.-%CORUT>
2529 SUBTTL CHAOS NET BUFFER LIST STUFF
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
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)
2548 ;THESE ROUTINES TURN OFF INTERRUPTS MOMENTARILY SO THAT
2549 ;LISTS MAY BE SAFELY MANIPULATED.
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
2562 BUG PAUSE,[CHAOS LIST TRASHED],OCT,Q
2563 SETZM (Q) ;IS NOW EMPTY
2567 SETZM (Q) ;IS NOW EMPTY
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
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
2582 ;RETURN BUFFER POINTED BY A TO FREE STORAGE. CLOBBERS T, Q.
2583 CHABRT: MOVEI Q,CHQFRE
2586 BUG PAUSE,[FREEING 0]
2588 MOVE T,[ASCII/LUNCH/] ;TANSTAAFL
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
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
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
2601 HRLM A,(Q) ;WAS EMPTY, ALSO IS NEW FIRST
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
2611 HRRM A,(Q) ;WAS EMPTY, ALSO MAKE NEW LAST
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
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
2626 SETZM -1(A) ;NO LUNCH
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
2634 JRST POPJ1 ;WON, RETURN
2635 CONI PI,Q ;SAVE PI CHANNELS ON STATUS
2637 CONO PI,UTCOFF ;MAKE THE WORLD SAFE FOR IOMQ
2639 CAIL B,CHMXBF ;MAKE SURE NOT TO USE UP ALL CORE
2641 PUSHJ P,IOMQ ;GET 1K OF MEMORY
2642 JRST CHABG3 ;MEM NOT AVAILABLE, FAIL
2643 CONO PI,PICON(Q) ;WON, RESTORE PI STATUS
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
2651 MOVEI B,<2000/PKTBSZ> ;THIS MANY MORE BUFFERS HAVE BEEN CREATED
2653 JRST CHABGI ;NOW GO ALLOCATE ONE
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
2660 IFE CH10P, BUG CHECK,[CHAOS NET ATTEMPTING TO USE TOO MUCH CORE]
2663 BUG CHECK,[CHAOS NET ATTEMPTING TO USE TOO MUCH CORE, CONI=],OCT,B,[CONO=],OCT,CHXCNO,[CHOSTA=],OCT,CHOSTA
2667 CHABG3: CONO PI,PICON(Q) ;LOST, RESTORE PI STATUS
2668 POPJ P, ;AND TAKE ERROR RETURN
2670 ;FREE A WHOLE LIST OF BUFFERS, Q-> HEAD. DESTROYS A,T
2671 CHALFR: PUSHJ P,CHAQGF
2674 PUSHJ P,CHABR1 ;FREE UNLESS STILL ON TRANSMIT LIST
2678 ;Q -> A TRANSMIT QUEUE, FLUSH ALL BUFFERS BELONGING TO INDEX I.
2681 CONO PI,NETOFF ;DON'T LET TRANSMIT LIST CHANGE (AT ALL)
2682 HLRZ A,(Q) ;HEAD OF TRANSMIT LIST
2684 MOVEI B,2(Q) ;B PREVIOUS PACKET, A CURRENT, C NEXT
2685 CFLXM1: HLRZ C,-2(A) ;GET THREAD TO NEXT
2688 JRST 4,. ;CLAIMS NOT TO BE ON LIST?
2690 LDB T,[$CPKSX(A)] ;GET THIS PACKET'S INDEX
2693 HRLM C,-2(B) ;THREAD PREVIOUS TO NEXT
2694 HRROS T,-2(A) ;IF THIS BUFFER IS NOT ALSO ON SEND LIST,
2696 PUSHJ P,CHABRT ;RETURN IT
2701 HRRM B,(Q) ;LAST PACKET ON LIST MAY HAVE CHANGED
2703 SETZM (Q) ;TRANSMIT QUEUE IS NOW EMPTY
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
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
2732 CHAQS5: HRRZ C,-2(B) ;WON, DELINK PACKET FROM LIST
2733 JUMPE J,[ HRLM C,(Q)
2736 HRRZ C,(Q) ;CHECK LIST ENDING IN RIGHT PLACE
2744 HRRM J,(Q) ;TOOK LAST PACKET, STORE NEW LAST
2747 CHAQS3: SOJLE H,CHAQS5
2751 CHAQS4: MOVE J,B ;THIS ONE DOESN'T MATCH, TRY NEXT
2756 ;THIS ROUTINE RUNS IN THE CORE JOB AND CLEANS UP MEMORY USED BY CHAOS BUFFERS
2758 CHCLN: SKIPE A,CHTTBF ;SEE IF 2/3 OR MORE OF BUFFERS FREE
2760 POPJ P, ;NO BUFFERS OR NONE FREE, NOTHING TO DO
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
2767 CHCLN0: LDB A,[MUR,,MEMBLT(D)]
2769 CHCLN4: SOJGE D,CHCLN0
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/]
2776 JRST CHCLN4 ;NOT FREE, DON'T BOTHER WITH SLOW STUFF
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
2785 JRST [ MOVEI Q,CHCLNQ ;THIS ONE'S ON THE PAGE, SAVE IT
2787 AOJA C,.+2 ] ;COUNT THEM
2788 PUSHJ P,CHABRT ;NOT ON THE PAGE, PUT BACK
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