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: CAIE E,%CSOPN
880 JRST CHOUN1 ;Okay to transmit UNC now
881 JUMPN E,IOCR10 .SEE %CSCLS ;Bad state
882 SKIPE CHSPBF(I) ;I guess out of order packets would
883 JRST IOCR10 ; cause some confusion in the NCP.
884 MOVE E,[%CFOFF,,%CSFRN] ;Put into foreign-protocol state
886 MOVE D,%CPKD(A) ;Save destination
888 CHOUN1: MOVE B,CHSLCL(I) ;Set up source
890 MOVE D,CHSFRN(I) ;Set up destination
898 ;SENDING REGULAR PACKET
899 CHODAT: CAIE E,%CSOPN ;CONNECTION MUST BE OPEN
902 PUSHJ P,UFLS ;WINDOW FULL, WAIT
903 PUSHJ P,LSWDEL ;BUFFER WILL BE USED
904 CHODT1: HRRZ B,CHSPKN(I) ;ASSIGN PACKET NUMBER
910 CHODT2: HLRZ B,CHSPKN(I) ;GET PACKET NUMBER TO ACKNOWLEDGE
911 HRLM B,CHSACK(I) ;REMEMBER IT HAS BEEN
912 DPB B,[$CPKAN(A)] ;PIGGY-BACK THIS ACKNOWLEDGE
913 MOVE B,[<.BM $CPKOP>+<.BM $CPKNB>]
914 ANDM B,(A) ;CLEAR FORWARDING COUNT AND UNUSED FIELD
915 MOVE B,CHSLCL(I) ;SET UP SOURCE
917 MOVE D,CHSFRN(I) ;SET UP DESTINATION
919 SETOM -2(A) ;NOTE NOT ON TRANSMIT LIST YET
920 SKIPL (A) ;SKIP IF DATA PACKET
922 CONI PI,E ;SUPER KLUDGERY REQUIRED HERE! FOREIGN HOST MIGHT RECEIPT
923 CONO PI,NETOFF ;THIS PACKET JUST AS WE START TO TRANSMIT IT. THIS IS A
924 ;VIOLATION OF PROTOCOL, BUT SHOULDN'T CRASH I.T.S. BECAUSE THE
925 ;PACKET ABOUT TO BE GIVEN TO CHAXMT HAS BEEN FREED ALREADY.
926 MOVEI Q,CHSOBF(I) ;PUT ON END OF SEND LIST
928 SOSA CHSNOS(I) ;USE UP WINDOW, SKIP
929 ;SKIPS THROUGH INTO CHAXMT
931 SUBTTL CHAOS NET PACKET TRANSMIT ROUTINE
933 ;CALL WITH PACKET IN A, SMASHES B, C, D, E, T, TT, Q, J
934 ;USES E TO SAVE THE PI STATUS, NOTHING BETTER CLOBBER THIS, OR, BOY, WILL IT EVER LOSE!
935 ;YOU BETTER SETOM -2(A) BEFORE CALLING THIS, AND IF YOU'RE
936 ;PUTTING IT ON A SEND LIST, DO THAT FIRST ALSO.
937 ;THIS CODE ASSUMES THERE IS ONLY ONE INTERFACE, AND IT IS ON A
938 ;PDP11 WHICH WILL TAKE CARE OF THE ROUTING.
939 ;;THIS ROUTINE IS SKIPPED INTO FROM THE PREVIOUS PAGE!
940 CHAXMT: CONI PI,E ;SAVE PI STATUS BEFORE TURNING NETOFF; CALLED FROM MANY LEVELS
944 MOVEM T,-1(A) ;SET TIME OF LAST TRANSMISSION
945 CONO PI,NETOFF ;ONE PROCESS AT A TIME, TO PROTECT INTERFACE VARIABLES
947 HLRZ J,-2(A) ;I TOLD YOU TO SETOM -2(A)
949 BUG PAUSE,[CHAOS BUFFER THREAD TRASHED],OCT,A,OCT,-2(A)
952 ;FOR NOW, JUST ALWAYS SHIP IT OUT THE DL10
954 HLRZ J,DLCXMQ ;MAKE SURE NOT PUTTING ON LIST TWICE
957 BUG PAUSE,[CHAOS BUFFER ALREADY ON DLCXMQ],OCT,A
960 BUG PAUSE,[DLCXMQ THREAD TRASHED]
962 MOVEI J,1 ;MAKE SURE NOT ACTIVE TO 11
965 BUG PAUSE,[CHAOS BUFFER ALREADY ACTIVE TO 11],OCT,A
968 HRRZS -2(A) ;PUT END-LIST INDICATOR IN LH (FLAGS TRANSMIT ACTIVE)
969 MOVE J,DLCSBF ;SEE IF SEND BUFFER IS FREE
972 PUSHJ P,DLCXMT ;YES, SEND THE PACKET NOW
975 CHXMD1: HRRZ B,DLCXMQ ;NO BUFFERS FREE RIGHT NOW, QUEUE
976 JUMPE B,[ HRLZM A,DLCXMQ ? JRST .+2 ]
979 CHXMD2: CONO PI,PICON(E) ;RESTORE PI
983 ;FOR NOW, JUST ALWAYS SHIP IT OUT THE TEN11
984 PUSHJ P,T11CHK ;SEE IF TEN-11 IS READY
986 SKIPE @T11OBP ;SEE IF HAVE AVAILABLE OUTPUT BUFFER
988 PUSHJ P,T11XMT ;SEND THE PACKET NOW
991 CHXME3: HRROS T,-2(A) ;TEN11 DOWN, DISCARD PACKET
996 CHXME1: HRRZ B,T11XMQ ;NO BUFFERS FREE RIGHT NOW, QUEUE
997 JUMPE B,[ HRLZM A,T11XMQ ? JRST .+2 ]
1000 HRRZS -2(A) ;PUT END-LIST INDICATOR IN LH
1001 CHXME2: CONO PI,PICON(E) ;RESTORE PI
1005 ;FOR NOW, JUST ALWAYS SHIP IT OUT THE CH10
1006 HRRZ B,CHXXMQ ;ADD TO END OF TRANSMIT QUEUE
1007 JUMPE B,[ HRLZM A,CHXXMQ ? JRST .+2 ]
1010 HRRZS -2(A) ;PUT END-LIST INDICATOR IN LH
1011 MOVEI B,CHXTEN ;ENABLE TRANSMIT-DONE INTERRUPT
1014 CONO PI,PICON(E) ;RESTORE PI
1018 ;FOR NOW, JUST ALWAYS SHIP IT OUT THE CH11
1019 HRRZ B,CHXXMQ ;ADD TO END OF TRANSMIT QUEUE
1020 JUMPE B,[ HRLZM A,CHXXMQ ? JRST .+2 ]
1023 HRRZS -2(A) ;PUT END-LIST INDICATOR IN LH
1024 MOVEI B,%CATEN ;ENABLE TRANSMIT-DONE INTERRUPT
1027 CONO PI,PICON(E) ;RESTORE PI
1031 SUBTTL CHAOS NET DIRECT CONNECT TO STY
1035 ;CALLED AT CLOCK LEVEL FROM STYNTC WHEN A CHAOS STY IS ENCOUNTERED
1036 ;TTY NUMBER IN I & R
1037 STYCHA: MOVE I,STYNTI-NFSTTY(R) ;GET CHAOS INDEX
1040 JRST 4,. ;CHAOS CONNECTION CLAIMS NOT BE CONNECTED?
1041 JUMPL TT,STYCH9 .SEE %CFOFF ;OK TO USE? IF NOT, DISCONNECT
1042 SKIPGE TTYOAC(R) ;ANY OUTPUT?
1043 JRST STYCH1 ;NO, CHECK FOR INPUT
1044 SKIPN D,CHSOBP(I) ;IF BUFFER ALLOCATED, USE IT
1045 JRST [ SKIPG CHSNOS(I) ;OTHERWISE ALLOCATE ONE
1046 JRST STYCH1 ;WINDOW FULL, WAIT UNTIL REACTIVATED
1048 JRST STYCH3 ;NO CORE, WAIT ONE CLOCK TICK
1056 JRST STYCH4 ;BUFFER FULL, FORCE IT
1057 EXCH R,I ;I GETS TTY, R GETS CHAOS
1059 MOVEM D,DBBBP ;SET UP BUFFER FOR TTY OUTPUT INTERRUPT LEVEL
1064 PUSHJ P,TYP ;GENERATE OUTPUT
1067 EXCH R,I ;I GETS CHAOS, R GETS TTY
1068 MOVE D,DBBBP ;ADVANCE POINTERS
1071 SUB E,DBBCC1 ;MINUS # CHARS OUTPUT GENERATED
1074 STYCH4: PUSHJ P,CHAFC1 ;FORCE THE BUFFER
1075 JRST STYCHA ;CHECK FOR MORE OUTPUT
1077 STYCH3: PUSHJ P,CHINTI ;REACTIVATE SO WILL COME BACK ON NEXT CLOCK TICK
1078 STYCH1: SOSGE CHSIBC(I) ;GET INPUT, IF ANY
1079 JRST [ PUSHJ P,CHAIBD ;DISCARD EXHAUSTED INPUT BUFFER, IF ANY
1081 JUMPE A,STYNT8 ;NONE, RETURN TO STYNTC
1084 JRST STYCH9 ;RANDOM PACKET, DISCONNECT
1085 PUSHJ P,CHPKIA ;ACKNOWLEDGE GOBBLING OF THIS PACKET
1086 SOS CHSNBF(I) ;REMOVE BUFFER FROM RECEIVE LIST
1089 LDB E,[$CPKNB(A)] ;SET UP FOR BYTE STREAM INPUT
1095 ILDB A,CHSIBP(I) ;GET CHARACTER OF INPUT
1097 JRST [ AOS CHSIBC(I) ;WOOPS, SPECIAL CHARACTER, NEEDS USER ATTENTION
1098 MOVSI A,8_14 ;SO PUT IT BACK AND DISCONNECT
1101 EXCH R,I ;I GETS TTY, R GETS CHAOS
1105 PUSHJ P,NTYI5 ;GIVE CHARACTER TO TTY INPUT INTERRUPT LEVEL
1108 POP P,I ;I GETS CHAOS, R GETS TTY ((POP IN REVERSE ORDER))
1109 JRST STYCH1 ;TRY FOR MORE INPUT
1112 MOVE I,R ;I GETS TTY
1113 PUSHJ P,NSTYN0 ;DISCONNECT THE STY
1115 POP P,I ;I GETS CHAOS
1116 PUSHJ P,CHINTI ;WAKE UP THE TELNET SERVER
1117 JRST STYNT8 ;GO HANDLE OTHER STYS
1119 SUBTTL CHAOS NET CLOCK LEVEL STUFF
1123 ;HERE FROM 1/2 SECOND CLOCK. DO RETRANSMISSIONS AND DELAYED STS'S
1127 PUSHJ P,DLCIBG ;GET MEMORY FOR INPUT BUFFERS IF NEEDED
1130 MOVEI I,NINDX-1 ;SCAN ALL INDICES
1131 CHACL0: SKIPL CHSUSR(I) ;SKIP THIS ONE IF NOT IN USE
1132 SKIPGE CHSSTA(I) .SEE %CFOFF ;OR INHIBITED FROM PI LEVEL
1134 JUMPL I,CPOPJ ;JUMP IF ALL INDICES DONE
1135 PUSHJ P,CHARTR ;RETRANSMIT IF NEEDED
1137 TDNE B,CHSSTA(I) ;SEND STS IF NEEDED
1142 ;HERE EVERY 5 SECONDS, TO DO PROBES
1143 CHA5CL: MOVEI I,NINDX-1 ;SCAN ALL INDICES
1144 CHA5C0: SKIPL CHSUSR(I) ;SKIP IF THIS ONE NOT IN USE
1145 SKIPGE CHSSTA(I) .SEE %CFOFF ;OR INHIBITED FROM PI LEVEL
1146 CHA5C1: SOJGE I,CHA5C0
1147 JUMPL I,CHA5C4 ;JUMP IF ALL INDICES DONE
1149 SUB T,CHSITM(I) ;TIME SINCE LAST COMMUNICATION FROM OTHER END
1151 JRST [ MOVEI W,%CSINC ;TOO LONG, CONNECTION BROKEN
1154 HRRZ B,CHSSTA(I) ;ONLY PROBE IF OPEN (COULD BE RFC-SENT)
1157 HRRZ B,CHSWIN(I) ;SEE IF NO TRANSMIT WINDOW (LOST STS DURING OPEN)
1159 HRRZ B,CHSACK(I) ;SEE IF AWAITING ACK (WINDOW NOT EMPTY)
1163 CHA5C2: PUSHJ P,CHABGI ;AWAITING ACK OR IDLE FOR 1 MINUTE, PROBE
1164 JRST CHA5C1 ;NO PROBE, OR NO BUFFER AVAILABLE
1165 MOVSI T,(.DPB %COSNS,($CPKOP),0) ;SENSE PACKET, BYTE-COUNT=0
1171 CHA5C4: MOVEI B,[ASCIZ/Timeout/]
1172 MOVEI Q,CHQRFC ;TIME-OUT FIRST RFC ON LIST
1176 ADDI T,60.*30. ;TIME-OUT IS ONE MINUTE
1177 PUSHJ P,[ CAMG T,TIME
1182 MOVEI T,CHXREN+CHXTEN ;WAKE UP IN CASE OF TIMING ERROR
1183 IORM T,CHXCNO ;IN DEALING WITH CHXCNO
1185 MOVSI T,-NSUBNT ;DECAY ROUTING COSTS
1186 CONO PI,NETOFF ;PREVENT RUT PACKET FROM COMING IN
1187 CHA5C6: HLRZ TT,SBNRUT(T)
1195 MOVEI T,%CAREN+%CATEN ;WAKE UP IN CASE OF TIMING ERROR
1196 IORB T,CHXCSR ;IN DEALING WITH CHXCSR
1198 MOVSI T,-NSUBNT ;DECAY ROUTING COSTS
1199 CONO PI,NETOFF ;PREVENT RUT PACKET FROM COMING IN
1200 CHA5C6: HLRZ TT,SBNRUT(T)
1213 ;RETRANSMIT FOR INDEX IN I
1214 CHARTR: CONI PI,W ;SAVE PI CHANNELS ACTIVE
1215 ANDI W,177 ;CHAXMT BETTER NOT CLOBBER W!
1216 CONO PI,NETOFF ;PI BETTER BE OFF THROUGHOUT THIS ZONE
1217 ; SO WE DON'T GET INTO CHIACK
1218 HLRZ A,CHSOBF(I) ;SCAN DOWN OUTPUT BUFFER LIST
1219 JUMPE A,CHART2 ;EMPTY
1220 CHART1: MOVE T,-1(A) ;DON'T RETRANSMIT IF DONE TOO RECENTLY
1221 HLRZ TT,-2(A) ;OR IF ALREADY ON ITS WAY OUT (DON'T LINK TWICE ON XMIT LIST)
1224 JRST CHART2 ;ANYTHING AFTER THIS IS LIKELY TO LOSE ALSO
1226 PUSHJ P,CHAXMT ;RETRANSMIT THIS
1227 ; HRRZ A,-2(A) ;THREAD TO NEXT
1229 CHART2: CONO PI,PICON(W)
1232 ;THIS ROUTINE SENDS A STS PACKET, OR TRIES TO. FAILURE => SLOW CLOCK WILL TRY AGAIN.
1233 ;CANNOT PCLSR NOR WAIT, CALLABLE FROM INTERRUPT LEVEL.
1234 ;INDEX IN I, CLOBBERS A,B,C,D,E,T,TT,Q,J
1235 CHASTO: MOVSI D,%CFSTS
1237 PUSHJ P,CHABGI ;GET A BUFFER, WITHOUT WAITING
1238 POPJ P, ;CAN'T GET ONE, WILL RETRY AT CLOCK LEVEL
1239 ANDCAM D,CHSSTA(I) ;OK, A STS WILL BE SENT, CLEAR NEED-STS FLAG
1240 MOVE T,[.DPB %COSTS,($CPKOP),<.DPB 4,($CPKNB),0>]
1241 MOVEM T,(A) ;SEND A STS WITH 4 DATA BYTES
1242 PUSHJ P,DPBRCP ;FIRST PAIR IS RECEIPT
1243 HLRZ B,CHSWIN(I) ;SECOND PAIR IS WINDOW SIZE
1244 DPB B,[042000,,%CPKDT(A)]
1246 JRST CHODT2 ;FIRE IT OFF
1248 DPBRCP: HLRZ B,CHSPKN(I)
1251 DPB B,[242000,,%CPKDT(A)]
1254 SUBTTL CHAOS NET INTERRUPT-LEVEL INPUT PROCESSING
1258 ;PROCESS A PACKET RECEIVED AT INTERRUPT LEVEL. BY THE TIME WE GET HERE
1259 ; A BUFFER HAS BEEN ALLOCATED AND FILLED WITH THE DATA FROM THE DEVICE.
1260 ; ITS ADDRESS IS IN A. RETURN VIA POPJ P, WITH ALL REGISTERS CLOBBERED.
1261 CHAPII: MOVE B,RECHDP ;SAVE HEADER FOR DEBUGGING IN RING BUFFER
1265 CAIN D,RECHDR+<NRECHD*%CPKDT>
1268 ;END OF DEBUGGING CODE
1269 LDB D,[$CPKMV(A)] ;MUPPET?
1270 JUMPN D,CHABRT ;FLUSH, NOT SUPPORTED
1271 LDB D,[$CPKOP(A)] ;GET OPCODE
1272 LDB B,[$CPKDA(A)] ;CHECK DESTINATION
1273 CAIE B,MYCHAD ;IF FOR ME,
1274 SKIPN B ;OR FOR ME BY VIRTUE OF BROADCAST
1275 AOSA CHNPI ;ACCEPT IT
1276 JRST CHAPFW ;NOT ME, FORWARD
1277 LDB C,[$CPKNB(A)] ;PASS LENGTH IN C TO OP ROUTINES
1278 MOVEI B,[ASCIZ/Illegal byte count/]
1281 SKIPGE (A) ;TEST OPCODE
1282 JRST CHIDAT ;DATA PACKET
1283 MOVEI B,[ASCIZ/Illegal opcode/]
1287 JRST CHALOS ;ILLEGAL, FLUSH
1296 IFE CH10P+CH11P,JRST CHABRT ;IGNORE
1297 IFN CH10P+CH11P,JRST CHIRUT
1299 %COLSN::JRST CHALOS ;ILLEGAL, FLUSH
1300 %COMNT::JRST CHABRT ;IGNORE
1307 CHAPFW: LDB B,[$CPKDA(A)] ;CHECK DESTINATION HOST
1308 TRNN B,377_8 ;SUBNET 0?
1309 JRST CHABRT ;FLUSH IT, XX-NETWORK-11 IS TRYING TO MAKE US CRASH
1310 LDB B,[$CPKFC(A)] ;INCREMENT FORWARDING COUNT
1313 JRST [ AOS CHNPFL ? JRST CHABRT ] ;LOOP, DISCARD
1315 SETOM -2(A) ;NOT ON SEND LIST
1319 IFN CH10P+CH11P,[ ;INCOMING ROUTING INFO
1320 CHIRUT: LSH C,-2 ;NUMBER OF SUBNET ENTRIES
1321 JUMPE C,CHABRT ;COULD BE ZERO-LENGTH
1324 LDB E,[$CPKSA(A)] ;SOURCE HOST IS GATEWAY
1325 CHIRU1: ILDB T,D ;SUBNET
1327 HLRZ B,SBNRUT(T) ;COST OF EXISTING ROUTE
1331 HRLM TT,SBNRUT(T) ;THIS IS BEST ROUTE NOW
1333 CHIRU2: SOJG C,CHIRU1
1337 ;INTERRUPT-LEVEL PROCESSING OF SNS PACKET
1338 ;NOTE THAT WE DO NOT BARF AT SNS'S TO EXISTENT NON-OPEN CONNECTIONS. IF IT
1339 ;WAS AN RFC-SENT CONNECTION, THIS COULD BREAK IT PREMATURELY IF AN OPN WAS
1340 ;LOST AND THEN A SNS WAS NOT.
1341 CHISNS: MOVEI E,%CSOPN
1343 JRST [ CAIE E,%CSOPN
1344 JRST CHABRT ;CONNECTION EXISTS AND IS NOT OPEN, IGNORE PACKET
1345 JRST CHALOS ] ;CONNECTION DOES NOT EXIST, COMPLAIN
1346 PUSHJ P,CHABRT ;CONNECTION DOES EXIST
1348 POPJ P, ;NOT OPEN, IGNORE
1349 JRST CHASTO ;REPLY WITH STS
1351 ;INTERRUPT LEVEL PROCESSING OF RECEIVED FWD OR ANS
1352 CHIANS: PUSHJ P,CHFNDX ;FIND CONNECTION
1353 JRST CHABRT ;NOBODY AT OTHER END TO RECEIVE A LOS ANYWAY
1355 JRST CHABRT ;NOT IN RFC-SENT STATE, LOSS
1356 ; JRST CHICL1 ;CLOSE THE CONNECTION BUT GIVE TO USER AS INPUT
1357 ;DROPPING THROUGH WILL DO
1359 ;INTERRUPT LEVEL PROCESSING OF RECEIVED CLS PACKET
1360 CHICLS: PUSHJ P,CHFNDX ;FIND CONNECTION BEING CLOSED
1361 JRST CHALOS ;NONE, LOSS
1362 CHICL1: MOVEI W,%CSCLS ;CLOSE THE CONNECTION
1363 CHICL2: PUSHJ P,CHINT ;SET TO STATE IN W, INTERRUPT
1365 MOVEI Q,CHSPBF(I) ;DISCARD OUT-OF-ORDER PACKETS
1368 CHIC2A: MOVEI Q,CHSOBF(I) ;DISCARD TRANSMIT PACKETS, E.G. RFC WHICH RECEIVED
1369 PUSHJ P,CHAQGF ;AN ANS OR FWD, DON'T WANT TO TRANSMIT AGAIN
1375 JRST CHIDT1 ;GIVE PACKET TO USER AS DATA
1376 \f;INTERRUPT LEVEL PROCESSING OF RFC PACKET
1377 CHIRFC: MOVE T,%CPKDT(A) ;CHECK FOR STATUS REQUEST
1378 CAMN T,[.BYTE 8 ? "S ? "T ? "A ? "T]
1382 XORI TT,(<.BYTE 8 ? "U ? "S>)
1383 TRNN TT,(<.BYTE 8 ? -1 ? -1>)
1385 CHIRF7: MOVEI Q,CHQLSN ;SEARCH LISTENING QUEUE
1387 JRST CHIRF1 ;NOT FOUND, LOAD SERVER
1388 EXCH A,B ;A LSN, B RFC
1389 LDB I,[$CPKSX(A)] ;GET CORRESPONDING INDEX
1393 CHIRF0: PUSHJ P,CHABRT ;FOUND, DISCARD LISTEN PACKET
1394 MOVE A,B ;GET OTHER HOST'S RFC
1395 LDB B,[$CPKPN(A)] ;INITIALIZE RECEIVER'S PACKET NUMBER
1398 MOVEM B,CHSFRN(I) ;HOOK 'EM UP
1399 MOVEI W,%CSRFC ;PUT INTO RFC-RECEIVED STATE
1400 MOVE T,TIME ;AND ENGAGE PI LEVEL
1404 ;RFC RECEIVED AND NOT IMMEDIATELY MATCHED TO A LSN. QUEUE AND LOAD SERVER JOB.
1405 ;BUT FIRST CHECK WHETHER THIS IS A DUPLICATE WHICH SHOULD BE DISCARDED.
1406 CHIRF1: MOVE C,%CPKS(A) ;SEARCH PENDING RFC QUEUE FOR RFC FROM
1407 HLRZ T,CHQRFC ;THE SAME SOURCE AS THIS.
1409 CHIRD0: CAMN C,%CPKS(T)
1410 JRST CHABRT ;THIS RFC IS A DUPLICATE, IGNORE IT
1413 CHIRD1: MOVSI T,-NINDX ;SEARCH OPEN AND RFC-RECEIVED CONNECTIONS
1414 CHIRD2: SKIPL CHSUSR(T) ;FOR ONE CONNECTED TO SAME GUY AS SENT RFC
1417 JUMPGE T,CHIRD3 ;NO DUPLICATE OF THIS RFC, QUEUE IT
1421 JRST CHABRT ;REALLY A DUPLICATE, DISCARD
1423 CHIRD3: MOVEI B,[ASCIZ/System not up/]
1424 SKIPL SYSDBG ;REFUSE INCOMING CONNECTIONS IF LOGINS REFUSED
1425 SKIPE NETUSW ;ALLOWING INCOMING NET CONNECTIONS?
1426 JRST CHIRF2 ;NO, REFUSE (EVEN IF FROM OURSELVES)
1427 HRROI T,CHIRFJ ;LOAD JOB
1428 CONI PI,Q ;MUST TURN UTCOFF TO CALL NUJBST
1429 ANDI Q,177 ;SINCE THIS MAY RUN AT OTHER INT LEVELS
1432 JRST [ CONO PI,PICON(Q)
1433 JRST CHABRT ] ;RING BUFFER FULL, IGNORE, RETRY WILL CATCH
1435 MOVE T,TIME ;REMEMBER WHEN THIS RFC WAS QUEUED
1438 JRST CHAQPF ;PUT ON FRONT OF QUEUE
1440 ;COME HERE TO SEND A LOS PACKET IN RESPONSE TO CRUFTY INPUT IN A
1441 ;B SHOULD POINT TO AN ASCIZ STRING FOR WHY.
1442 CHALOS: SKIPA T,[%COLOS]
1443 ;HERE TO REFUSE AN RFC. TURN IT INTO A CLS AND SEND IT BACK.
1444 ;B SHOULD POINT TO AN ASCIZ STRING FOR WHY.
1445 CHIRF2: MOVEI T,%COCLS
1446 HRLI B,440700 ;BP TO MESSAGE
1447 SETZB C,(A) .SEE $CPKFC
1449 MOVE T,%CPKS(A) ;EXCHANGE SOURCE AND DESTINATION
1452 MOVE D,[440800,,%CPKDT(A)]
1458 CHIRF5: DPB C,[$CPKNB(A)]
1459 SETOM -2(A) ;NOT ON ANY SEND LIST
1460 JRST CHAXMT ;SEND IT
1462 ;HERE FOR RFC TO "STATUS"
1471 IFG BAR-4, .ERR NAME MORE THAN 4 CHARACTERS
1476 CHIRF3: MOVE B,[MNAME FOO ,,] ;NAME OF MACHINE IN 8-BIT ASCII
1483 MOVE B,[.BYTE 8 ? MYCHAD/400 ? 1 ? 4+IFN CH10P+CH11P,[10.] ? 0 ]
1484 MOVEM B,%CPKDT+10(A)
1485 MOVEI B,%CPKDT+11(A)
1505 SETZM (A) .SEE $CPKFC
1507 MOVE T,%CPKS(A) ;EXCHANGE SOURCE AND DESTINATION
1510 MOVEI C,13*4+IFN CH10P+CH11P,[20.] ;BYTE COUNT
1519 ;HERE TO CONVERT A BRD INTO AN RFC
1521 CHIBRD: LDB T,[$CPKAN(A)] ;NUMBER OF BITMAP BYTES
1522 LDB TT,[$CPKNB(A)] ;NUMBER OF TOTAL DATA BYES (INCLUDES BITMAP)
1523 CAIG T,32. ;ACK NUMBER NO GREATER THAN 32.
1524 TRNE T,3 ; MUST BE MULTIPLE OF 4
1525 JRST CHABRT ; FREE THE PACKET IF NO GOOD
1526 CAMG TT,T ;MUST BE SOME TEXTUAL RFC DATA AS WELL
1527 JRST CHABRT ; IF NOT, FREE PACKET
1528 MOVE C,TT ;GET NUMBER OF BYTES (CHIRFC WANTS COUNT IN C)
1529 SUB C,T ;WITHOUT BITMAP
1530 DPB C,[$CPKNB(A)] ;NEW BYTE COUNT
1531 LSH T,-2 ;CONVERT BITMAP BYTE COUNT TO WORD COUNT
1532 ADDI TT,3 ;CONVERT BYTE COUNT TO...
1533 LSH TT,-2 ;... WORD COUNT
1534 MOVEI D,%CPKDT(A) ;GET POINTER TO BEGINNING OF DATA
1535 HRL D,D ;IN UPPER AND LOWER HALVES (ALMOST BLT POINTER)
1536 HRLZ T,T ;BITMAP WORD COUNT,,0
1537 ADD D,T ;RFC-STRING,,DATA-FIELD
1538 ADDI TT,%CPKDT-1(A) ;LAST LOCATION FOR BLT
1541 DPB TT,[$CPKAN(A)] ;ZERO THE ACK FIELD
1543 DPB TT,[$CPKDA(A)] ;PRETEND IT WAS FOR ME
1544 JRST CHIRFC ;AND HANDLE IT AS AN RFC
1547 ;ROUTINE TO FIND INDEX PACKET CORRESPONDS TO, SKIP IF FOUND, INDEX IN I.
1548 ;ALSO RETURNS STATE IN E SINCE THAT'S OFTEN HANDY.
1549 ;ALSO SETS B FOR CHALOS
1550 CHFNDX: MOVEI B,[ASCIZ/Connection does not exist at this end/]
1551 LDB I,[$CPKDX(A)] ;GET REAL-INDEX PART OF DESTINATION INDEX
1555 SKIPGE CHSSTA(I) .SEE %CFOFF
1556 POPJ P, ;NOT TALKING TO NETWORK
1560 CAIN E,%CSRFS ;IF IN RFC-SENT STATE, ONLY
1561 AND T,[.BYTE 16. ? -1 ? 0] ;THE SOURCE HOST HAS TO MATCH
1562 CAMN TT,CHSLCL(I) ;COMPARE LOCAL ADDRESS
1563 CAME T,CHSFRN(I) ; AND FOREIGN ADDRESS
1567 JRST POPJ1 ;SUCCEED, CALLER CHECKS THE STATE
1569 ;INTERRUPT LEVEL PROCESSING OF RECEIVED OPN PACKET
1570 CHIOPN: PUSHJ P,CHFNDX ;FIND CONNECTION TO BE OPENED
1572 CAIE E,%CSRFS ;NOT IN RFC-SENT STATE,
1573 JRST CHABRT ; MUST BE DUPLICATE, DISCARD.
1574 LDB B,[$CPKPN(A)] ;GET ITS PACKET NUMBER
1575 HRLM B,CHSPKN(I) ;INITIALIZE PACKET NUMBERING OF RECEIVED MESSAGES
1577 MOVEM B,CHSFRN(I) ;HOOK 'EM UP
1578 PUSHJ P,CHIST1 ;PROCESS AS A STS, DISCARD
1579 PUSHJ P,CHASTO ;RESPOND WITH A STS
1583 ;COME HERE WITH INDEX IN I AND NEW STATE IN W, TO CHANGE STATE AND INTERRUPT
1584 CHINT: HRRM W,CHSSTA(I)
1586 MOVEM T,CHSITM(I) ;IN CASE GOT HERE FROM CHOLSN
1589 IORM T,CHSSTA(I) ;DISENGAGE PI LEVEL
1591 ANDCAM T,CHSSTA(I) ;NOW OPEN, ENGAGE PI LEVEL
1592 ;COME HERE TO INTERRUPT ON THE INPUT CHANNEL. SMASHES T,TT,W
1593 CHINTI: LDB T,[$CHSUI,,CHSUSR(I)]
1594 CHINT2: MOVE TT,CHSSTA(I) ;SIGNAL USER OR STY?
1597 LDB T,[$CFTTN,,TT] ;STY, GET TTY NUMBER
1598 CONO PI,PIOFF ;PROTECT LIST MODIFICATION
1599 SKIPL STYNTL-NFSTTY(T) ;DON'T PUT ON LIST TWICE
1601 MOVE TT,STYNTA ;ADD TO LIST
1602 MOVEM TT,STYNTL-NFSTTY(T)
1606 CHINT4: SKIPGE TT,CHSUSR(I)
1608 MOVSI W,(SETZ) ;PCLSR THE JOB SO IT GETS AN IOC ERROR IF NEEDFUL
1609 IORM W,PIRQC(TT) ;EVEN IF NORMAL INTERRUPTS ARE NOT ENABLED
1611 POPJ P, ;IOPUSH'D, NO INTERRUPT
1619 ;INTERRUPT LEVEL PROCESSING OF RECEIVED DATA PACKET
1620 CHIDAT: PUSHJ P,CHFNDX ;FIND ASSOCIATED CONNECTION
1621 JRST CHALOS ;NONE, LOSS
1622 CAIE E,%CSOPN ;STATE MUST BE OPEN
1623 JRST CHALOS ;BAD, LOSS
1624 PUSHJ P,CHIACK ;PROCESS ACKNOWLEDGEMENT FIELD
1625 ;NOW DECIDE WHETHER IT GOES ON CHSIBF(I), OR ON CHSPBF(I), OR GETS DISCARDED.
1626 HLRZ B,CHSPKN(I) ;LAST PACKET NUMBER GIVEN TO USER
1627 LDB C,[$CPKPN(A)] ;GET PACKET NUMBER OF THE NEW PACKET
1628 HLRZ T,CHSWIN(I) ;RECEIVE WINDOW SIZE
1629 ADDI T,(B) ;HIGHEST LEGAL PACKET NUMBER
1631 TRNE T,100000 ;SKIP IF T >= C
1632 JRST CHABRT ;FOO ON YOU, OVER WINDOW SIZE
1633 HRRZ T,CHSIBF(I) ;COMPUTE NEXT IN-ORDER PACKET EXPECTED
1634 JUMPE T,CHIDT6 ;BASED ON LAST IN-ORDER PACKET
1637 JRST [ LDB B,[$CPKPN(T)]
1639 HLRZ T,CHSIBF(I) ;IF IT'S AN UNC, HAVE TO GO FIND CORRECT PACKET
1640 CHIDT5: LDB TT,[$CPKOP(T)]
1646 ANDI B,177777 ;NEXT IN-ORDER PACKET EXPECTED
1648 JRST CHIDT1 ;EQUAL, IT GOES ON THE END OF CHSIBF(I) LIST.
1649 SUB B,C ;NOT EQUAL, COMPARE THEM MODULO 2^16.
1651 JRST CHIDTD ;B GREATER, THIS IS AN OLD PACKET, DISCARD IT
1652 ;PUT ON CHSPBF(I) IN PROPER ORDER
1653 ;A IS THIS PACKET, C IS HIS NUMBER, B IS PREDECESSOR, D IS NEXT, E IS HIS #
1654 MOVEI B,0 ;SIGNIFY AT FRONT OF LIST
1655 HLRZ D,CHSPBF(I) ;GET FIRST PACKET ON OUT-OF-ORDER LIST
1656 JUMPE D,CHIDT4 ;LIST IS EMPTY
1657 CHIDT3: LDB E,[$CPKPN(D)]
1658 SUB E,C ;COMPARE PACKET NUMBERS
1659 JUMPE E,CHIDTD ;DUPLICATE, DISCARD
1661 JRST [ MOVE B,D ;E IS LESS, KEEP LOOPING
1664 JRST .+1 ] ;REACHED END PUT IT HERE
1666 HRRM A,-2(B) ;THREAD ONTO PREVIOUS PACKET
1668 CHIDT4: HRRM A,CHSPBF(I) ;THREAD ONTO BACK OF LIST
1670 HRLM A,CHSPBF(I) ;THREAD ONTO FRONT OF LIST
1671 HRRM D,-2(A) ;THREAD IN BEFORE PACKET IN D
1676 ;HERE IT GOES ON CHSIBF(I). A HAS PACKET, C HAS ITS PACKET NUMBER.
1677 ;IF GETTING HERE FROM CHICL1, C HAS GARBAGE BUT IT WILL NEVER BE USED.
1678 CHIDT1: SKIPN CHSIBF(I)
1679 PUSHJ P,CHINTI ;THERE WAS NO INPUT, BUT THERE IS NOW, COME AND GET IT
1682 PUSHJ P,CHAQPL ;PUT ON END OF RECEIVE LIST
1683 HLRZ A,CHSPBF(I) ;GET FIRST OUT-OF-ORDER PACKET
1685 LDB B,[$CPKPN(A)] ;SEE IF THIS PACKET IS NOW IN-ORDER
1686 CAIL C,177777 ;BY COMPARING AGAINST C+1 MODULO 2^16.
1692 PUSHJ P,CHAQGF ;YES, PULL PACKET OF OUT-OF-ORDER LIST
1695 JRST CHIDT1 ;AND GO PUT ONTO IN-ORDER LIST
1697 ;HERE IF PACKET IS A DUPLICATE AND IS TO BE DISCARDED. MUST SEND
1698 ;RECEIPT TO SHUT OFF EXCESS RETRANSMISSION.
1699 CHIDTD: PUSHJ P,CHABRT
1703 ;HERE FOR RECEIVING AN UNC PACKET
1704 CHIUNC: LDB I,[$CPKDI(A)] ;Destination index zero?
1706 LDB I,[$CPKDX(A)] ;GET REAL-INDEX PART OF DESTINATION INDEX
1709 JRST CHALOS ;NO MATCH
1710 MOVE TT,%CPKD(A) ;DESTINATION ADDRESS MATCHES?
1713 HRRZ E,CHSSTA(I) ;IN FOREIGN PROTOCOL MODE?
1716 MOVE TT,%CPKS(A) ;NORMAL PROTOCOL, SOURCE ADDRESS MUST MATCH
1718 CAIE E,%CSOPN ;AND STATE MUST BE OPEN
1720 CHIUN1: MOVE TT,TIME
1722 SKIPE T,CHSIBF(I) ;DISCARD PACKET IF OVER WINDOW SIZE
1723 JRST [ LDB TT,[$CPKOP(T)] ; AND ALREADY HAVE AN UNC
1730 PUSHJ P,CHINTI ;THERE WAS NO INPUT, BUT THERE IS NOW, COME AND GET IT
1731 AOS CHSNBF(I) ;PUT ON END OF RECEIVE LIST.
1732 MOVEI Q,CHSIBF(I) ;PACKET NUMBER IS RANDOM, NOTHING LOOKS AT IT
1736 IFE INETP,JRST CHALOS ;No comprendo internet
1738 LDB I,[$CPKAN(A)] ;Protocol number
1739 CAIE I,8_8 ;DOD Internet #x0800
1741 AOS CHNIPI ;Meter Internet packets in from Chaosnet
1742 MOVE J,A ;Save Chaosnet packet
1743 LDB A,[$CPKNB(A)] ;Compute size of Internet datagram in words
1746 MOVE C,A ;Save word count
1747 CALL IPGIPT ;Get buffer to copy datagram into
1748 JRST CHIUN3 ;No buffers available, discard packet
1749 MOVSI T,%CPKDT(J) ;Make BLT pointer
1751 ADDI B,(C) ;Address of last destination word
1753 EXCH A,J ;Free the Chaosnet packet
1755 MOVE A,J ;Datagram structure
1756 MOVE B,C ;Word count
1757 MOVEI C,0 ;Offset to start of IP header
1758 CALRET IPRDGM ;Dispose of datagram
1760 CHIUN3: MOVE A,J ;Discard Chaosnet packet
1766 ;INTERRUPT LEVEL PROCESSING OF LOS
1767 CHILOS: PUSHJ P,CHFNDX ;FIND CONNECTION TO BE BROKEN
1768 JRST CHABRT ;NONE, IGNORE
1769 MOVEI W,%CSLOS ;PUT INTO LOST STATE
1770 JRST CHICL2 ;GIVE PACKET TO USER AS DATA, DISENGAGE, AND INTERRUPT
1772 ;INTERRUPT LEVEL PROCESSING OF STS
1773 CHISTS: PUSHJ P,CHFNDX
1775 CAIE E,%CSOPN ;CONNECTION MUST BE OPEN
1777 CHIST1: LDB B,[042000,,%CPKDT(A)] ;GET NEW WINDOW SIZE
1781 LDB B,[242000,,%CPKDT(A)] ;PROCESS RECEIPT
1784 JRST CHARTR ;RETRANSMIT
1788 ;INTERRUPT LEVEL PROCESSING OF RECEIVED ACKNOWLEDGEMENT.
1789 ;REMOVE THE ACKNOWLEDGED PACKETS FROM THE INDEX'S SEND LIST AND UPDATE CHSNOS(I).
1790 ;NOTE THAT THE LIST IS ASSUMED TO BE SORTED SO WE ONLY
1791 ;REMOVE PACKETS FROM THE FRONT. CLOBBERS B,C,D,T,TT,Q.
1792 CHIACK: LDB B,[$CPKAN(A)] ;PACKET NUMBER BEING RECEIPTED
1793 CHIAK0: LDB T,[$CPKAN(A)] ;ENTER HERE FROM CHISTS
1794 HRRZ D,CHSACK(I) ;GET MAX OF THIS ACKNOWLEDGE AND PREVIOUS
1797 HRRM T,CHSACK(I) ;ACKNOWLEDGED PACKET NUMBER IS NEW START OF WINDOW
1799 HLRZ A,CHSOBF(I) ;MAP DOWN SEND LIST
1800 JUMPE A,CHIAK2 ;LIST EMPTY
1801 CHIAK1: LDB D,[$CPKPN(A)]
1804 JRST CHIAK2 ;RCP# LESS THAN PKT#
1805 HRRZ C,-2(A) ;GET NEXT PACKET
1806 HLLOS D,-2(A) ;MARK NOT ON SEND LIST
1807 AOJE D,CHIAK3 ;AND JUMP IF NOT ON TRANSMIT LIST
1809 MOVEI Q,DLCXMQ ;ON TRANSMIT LIST, TRY TO TAKE OFF
1820 CAIA ;AND DON'T FREE IT
1821 CHIAK3: PUSHJ P,CHABRT
1825 SETZM CHSOBF(I) ;SEND LIST NOW EMPTY
1826 CHIAK2: MOVE D,CHSNOS(I) ;COMPUTE NEW VALUE OF CHSNOS
1827 HRRZ T,CHSACK(I) ;START OF WINDOW
1828 HRRZ C,CHSPKN(I) ;LAST PACKET SENT
1831 SUBI T,200000 ;T GETS NEGATIVE AMOUNT OF WINDOW OCCUPIED
1832 ADD T,CHSWIN(I) ;RH(T) GETS AVAILABLE PORTION OF WINDOW
1833 HRREM T,CHSNOS(I) ;WHICH IS NUMBER OF OUTPUT SLOTS
1834 JUMPG D,POPAJ ;IF FORMERLY THERE WERE NO OUTPUT SLOTS,
1835 LDB T,[$CHSUO,,CHSUSR(I)]
1836 SKIPLE CHSNOS(I) ;AND NOW THERE ARE,
1837 PUSHJ P,CHINT2 ;INTERRUPT ON THE OUTPUT CHANNEL
1840 ;TRY TO TAKE PACKET IN A OFF OF TRANSMIT LIST IN Q.
1841 ;CLOBBER T,Q,D. CALLED WITH INTERRUPTS OFF.
1842 ;MAY RETURN WITH A POINTING TO FREE BUT THAT IS OK AT THIS TIME.
1844 CHIAKF: MOVEI D,2(Q) ;LH[-2(D)] POINTS TO (T)
1846 JUMPE T,CPOPJ ;NOT FOUND
1849 HLRZ T,-2(A) ;LINK OUT
1851 JUMPN T,CHABRT ;JUMP IF DIDN'T DELETE LAST PACKET IN LIST
1852 HRRM D,(Q) ;NEW LAST PACKET IN LIST
1854 SETZM (Q) ;FOO, TRANSMIT LIST NOW EMPTY
1857 SUBTTL CHAOS NET DL10 INTERRUPT ROUTINE
1863 ;COME HERE FROM EACH DL10 INTERRUPT AT TTY LEVEL. SMASH ALL REGISTERS EXCEPT P AND 0.
1864 DLCWAK: CONI PI,E ;SAVE PI STATUS AND SWITCH TO NETWORK INTERRUPT LEVEL
1868 DLCWK1: MOVEI J,1 ;ALWAYS CHECK BOTH BUFFERS SO WE CAN'T GET OUT OF PHASE WITH 11
1869 MOVEI R,2 ;CHECK FOR INPUT AVAILABLE
1873 MOVE A,DLCRA1(J) ;GOT INPUT, PROCESS IT
1874 SETZM DLCRS1(J) ;BUFFER SLOT NOT OCCUPIED NOW
1876 IFN KL10P, PUSHJ P,DLCSWP ;SWEEP CACHE IN CASE ANYONE HAPPENED TO TOUCH BUFFER
1877 SKIPE A ;THIS CAN HAPPEN IF PDP11 WAS JUST STUFFED
1878 PUSHJ P,CHAPII ;PROCESS THE PACKET
1879 PUSHJ P,DLCIBG ;SUPPLY A NEW INPUT BUFFER TO 11
1880 JRST DLCWK1 ;TRY FOR MORE INPUT
1882 DLCWK2: MOVEI J,1 ;SCAN CHANNELS FOR OUTPUT DONE
1886 MOVE A,DLCSA1(J) ;FOUND AN OUTPUT DONE BUFFER
1887 HRROS B,-2(A) ;MARK IT NOT ON TRANSMIT LIST
1888 AOJN B,.+2 ;AND UNLESS IT IS ON SEND LIST
1889 PUSHJ P,CHABRT ;RETURN IT TO FREE
1890 SETZM DLCSA1(J) ;IDLE THIS BUFFER
1894 DLCWK4: MOVE J,DLCSBF ;TRY TO SEND SOME OUTPUT
1896 JRST DLCWK9 ;BUFFER BUSY
1897 HLRZ A,DLCXMQ ;GET ANOTHER OFF TRANSMIT QUEUE
1898 JUMPE A,DLCWK9 ;QUEUE EMPTY
1902 BUG PAUSE,[CHAOS LIST THREAD TRASHED],OCT,A,OCT,-2(A)
1907 CAME A,DLCXMQ ;REACHED END OF LIST, END IN RIGHT PLACE?
1908 BUG PAUSE,[DCLXMQ THREAD TRASHED]
1915 PUSHJ P,DLCXMT ;SEND IT ON THIS BUFFER
1916 JRST DLCWK4 ;GO TRY TO SEND ON OTHER BUFFER
1919 CONO PI,PICON(E) ;RESTORE PI
1922 ;THIS ROUTINE SUPPLIES AN INPUT BUFFER TO THE 11 ON ALL BUFFERS THAT NEED IT
1923 ;CALL WITH INTERRUPTS OFF OR IN PROGRESS
1928 PUSHJ P,CHABGI ;GET A BUFFER
1929 JRST [ SETZM DLCRA1(J) ;NO MEMORY, WILL TRY AGAIN AT CLOCK LEVEL
1932 SETZM (A) ;CLEAR THE BUFFER SINCE THE DL10 DOESN'T TOUCH LOW 4 BITS
1936 MOVEM A,DLCRA1(J) ;MAKE AVAILABLE TO PDP11
1940 IFN KS10P, .ERR CLRCSH not needed here?
1941 IFN KL10P, PUSHJ P,DLCSWP ;SWEEP CACHE BEFORE SIGNALLING 11
1944 CONO DLC,100040+TTYCHN ;INTERRUPT 11
1945 JRST DLCIB1 ;TRY FOR OTHER BUFFER ALSO
1947 ;THIS ROUTINE SENDS PACKET IN A TO DL10 (CALL WITH NETOFF OR IN PROGRESS)
1948 ;SWITCHES BUFFERS, LEAVES NEW ONE IN J
1949 DLCXMT: MOVE J,DLCSBF
1952 MOVEM A,DLCSP1(J) ;GIVE 11 POINTER TO NEW PACKET
1954 IFN KS10P, .ERR CLRCSH not needed here?
1955 IFN KL10P, PUSHJ P,DLCSWP ;SWEEP CACHE, PUTTING PACKET INTO CORE
1957 MOVEM T,DLCSS1(J) ;ACTIVATE PDP11
1958 CONO DLC,100040+TTYCHN
1959 XORI J,1 ;NEXT BUFFER
1964 ;THIS ROUTINE SWEEPS PACKET IN A OUT OF THE CACHE,
1965 ;CLOBBERING B, C, AND D.
1966 IFG PKTBSZ-1000, .ERR PKTBSZ BIGGER THAN HARDWARE PAGE SIZE, CACHE SWEEP LOSES
1967 DLCSWP: LDB D,[111100,,A] ;SWEEP ONE PAGE OF CACHE
1968 SWPUO (D) ;STORING PACKET INTO CORE
1969 MOVE B,[CONSZ 200000] ;AWAIT COMPLETION IN ACS
1970 MOVE C,[JRST B] ;TO MINIMIZE CACHE INTERFERENCE
1976 SUBTTL CHAOS NET TEN-11 INTERFACE STUFF
1979 ;THIS ROUTINE CHECKS FOR TEN-11 INITIALIZATION, SKIP-RETURNS IF OK TO USE
1981 T11CHK: SKIPE TEN11F
1982 JRST T11LUZ ;NOT SUPPOSED TO USE TEN11
1983 MOVE T,T11VER ;CHECK VERSION TO MAKE SURE RIGHT PROGRAM, ETC.
1984 CAME T,[.BYTE 8 ? "H ? "C ? 0 ? 1]
1985 JRST T11LUZ ;PROBABLY TURNED OFF OR WRONG PROGRAM
1986 SKIPE T11I10 ;SHOULD WE REINIT?
1987 JRST T11CK1 ;YES, GO DO SO
1988 SKIPLE T,T11WIN ;ARE WE WINNING?
1989 JRST POPJ1 ;YES, FINE
1990 JUMPE T,[SETOM T11WIN ;NOW THAT VERSION IS OK, TELL 11 TO INIT
1993 JRST T11CK1 ] ;AND INIT OURSELVES
1994 SKIPE T11I11 ;WAITING FOR 11 TO REINIT?
1996 ;HERE TO REINIT. FIRST, PICK UP PARAMETERS.
1997 T11CK1: LDB TT,[242000,,T11PRM] ;BYTES PER PACKET BUFFER
1998 CAIGE TT,<%CPMXW+1>*4 ;BETTER BE RIGHT SIZE
1999 JRST T11LUZ ;TOO SMALL (ASSUME IF TOO BIG, PACKETS WON'T BE)
2001 MOVEM TT,T11BSZ ;SAVE BUFFER SIZE IN PDP10 WORDS
2002 LDB T,[042000,,T11PRM] ;NUMBER OF BUFFERS IN EACH DIRECTION
2003 IMULB T,TT ;NUMBER OF PDP10 WORDS IN EACH DIRECTION
2005 MOVEM TT,T11IBE ;INIT POINTERS
2010 HRREI T,-T11CHS-2000(TT)
2011 JUMPG T,T11LUZ ;COMMUNICATION AREA LONGER THAN 1K
2014 T11CK2: SETZM (T) ;CLEAR BUFFER HEADERS
2018 MOVEM T,T11WIN ;WE'RE WINNING (MAKE T11WIN POSITIVE NON-ZERO)
2019 SETZM T11I10 ;INIT DONE
2022 ;HERE IF PDP11 PARAMETERS DON'T MATCH WHAT WE EXPECT
2023 T11LUZ: SETZM T11WIN ;NOT WINNING
2026 ;HERE FROM CLOCK LEVEL TO CHECK ON TEN-11 CHAOS NET CHANNEL
2027 T11WAK: PUSHJ P,T11CHK ;IS EVERYTHING OK?
2029 T11WK0: MOVE C,T11IBP ;CHECK INPUT
2031 JRST T11WK1 ;NONE AVAILABLE
2032 MOVSI J,2(C) ;POINT TO PACKET
2033 LDB D,[$CPKNB+2(C)] ;GET SIZE OF PACKET
2034 ADDI D,4*%CPKDT+3 ;CONVERT BYTES TO WORDS INCLUDING HEADER
2036 CAILE D,%CPMXW ;DON'T GET FAKED OUT BY CLOBBERED COUNT
2038 PUSHJ P,CHABGI ;GET PLACE TO PUT IT
2039 JRST T11WK1 ;NONE AVAILABLE
2041 EQVI E,(A) ;AOBJN POINTER TO PACKET BUFFER
2042 HRRI J,(A) ;BLT POINTER TO COPY PACKET
2043 ADDI D,-1(A) ;LAST WORD
2044 BLT J,(D) ;COPY PACKET FROM 11 TO 10
2045 MOVEI H,0 ;COMPUTE CHECKSUM
2051 MOVE TT,1(C) ;GET PDP11'S CHECKSUM
2052 SETZM (C) ;GIVE THE 11 BACK THE BUFFER
2053 ADD C,T11BSZ ;ADVANCE THE POINTER
2058 JRST [ AOS T11CKE ;COUNT CHECKSUM ERRORS
2059 PUSHJ P,CHABRT ;AND DISCARD PACKET
2062 PUSHJ P,CHAPII ;PROCESS THE INPUT
2066 T11WK1: CONO PI,NETOFF
2067 SKIPE T11XMQ ;ANY OUTPUT?
2068 SKIPE @T11OBP ;AND OUTPUT BUFFER SPACE AVAILABLE?
2069 JRST NETONJ ;NO, RETURN FROM T11WAK
2070 HLRZ A,T11XMQ ;GET PACKET OFF TRANSMIT QUEUE
2071 HLRZ B,-2(A) ;GET NEXT AFTER THAT
2072 HRLM B,T11XMQ ;BECOMES NEW HEAD OF QUEUE
2075 PUSHJ P,T11XMT ;COPY PACKET INTO 11
2077 JRST T11WK1 ;LOOK FOR MORE OUTPUT
2079 ;SEND PACKET A-> TO 11. SMASHES B,C,T,TT,Q. CALL WITH NETOFF.
2080 T11XMT: LDB C,[$CPKNB(A)] ;GET BYTE COUNT
2081 MOVE Q,C ;MUST CLEAR UNUSED BYTES AT END OF LAST WORD
2082 ANDI Q,3 ;TO MAKE THE CHECKSUM COME OUT RIGHT
2084 LSH C,-2 ;CONVERT TO WORD COUNT
2085 MOVE Q,(Q)[ -1 ;MASK FOR BYTES TO RETAIN IN LAST WORD
2088 <.BYTE 8 ? -1 ? -1 ? -1> ]
2091 ANDM Q,(TT) ;MASK OFF LAST WORD
2093 EQVI C,(A) ;AOBJN PTR
2094 MOVEI TT,0 ;COMPUTE XOR CHECKSUM IN TT
2095 SKIPA B,T11OBP ;-> CURRENT OUTPUT BUFFER IN 11
2098 TRZ T,17 ;CLEAR BITS 10-11 TREATS SPECIALLY
2099 ADD TT,T ;COMPUTE CHECKSUM
2106 MOVEM TT,1(B) ;GIVE CHECKSUM TO 11
2108 MOVEM TT,0(B) ;GIVE PACKET TO 11
2109 ADD B,T11BSZ ;ADVANCE BUFFER POINTER
2113 HRROS T,-2(A) ;TAKE PACKET OFF TRANSMIT LIST
2115 PUSHJ P,CHABRT ;NOT ON SEND LIST, FREE IT
2119 SUBTTL CH-10 INTERRUPT ROUTINES
2121 ;THE GENERAL IDEA IS THAT WE INTERRUPT ON A LOW-PRIORITY INTERRUPT LEVEL,
2122 ;AND DO THE TIME-INTENSIVE PACKET COPYING AT THAT LEVEL. THE GENERAL
2123 ;CHAOS ROUTINES ARE THEN CALLED WITH NETOFF.
2139 CONSO CHX,CHXRCV ;PACKET RECEIVED?
2141 PUSHJ P,CHABGI ;GET PLACE TO PUT PACKET
2142 JRST [ MOVEI T,CHXREN ;NONE AVAILABLE, DISABLE INTR
2146 CONSZ CHX,CHXCRC+CHXWLE ;CHECK FOR ERRORS
2147 JRST [ CONSZ CHX,CHXCRC
2150 JRST CHXBK4 ] ;IGNORE PACKET
2151 DATAI CHX,T ;FIRST DATAI YIELDS GARBAGE
2152 MOVEI T,CHXSWB ;DISABLE BYTE SWAPPING
2155 HRLI A,-%CPKDT ;READ HEADER
2159 PUSHJ P,CHSWAB ;ENABLE BYTE SWAPPING IF NEEDED
2160 LDB T,[$CPKNB(A)] ;GET SIZE OF PACKET
2161 CAILE T,%CPMXC ;DON'T RUN OFF END OF BUFFER
2163 ADDI T,3 ;ROUND UP TO NEXT WORD BOUNDARY
2164 LSHC T,-2 ;CONVERT BYTES TO WORDS, TT GETS REMAINDER
2165 HRLOI D,-1(T) ;MAKE AOBJN POINTER
2167 JUMPGE D,.+3 ;EMPTY PACKET BOUNDARY CASE
2170 DATAI CHX,T ;NOW READ AND IGNORE HARDWARE HEADER
2172 DATAI CHX,T ;THIRD HALFWORD
2173 CONI CHX,T ;CHECK FOR ERRORS
2174 TDNE T,[CHXPLE+CHXCRC+CHXOVR]
2175 JRST [ TLNE T,(CHXOVR)
2176 JRST CHXBKZ ;OVERRRUN CAN'T HAPPEN UNLESS HARDWARE BROKEN
2184 PUSHJ P,CHAPII ;PROCESS THE INPUT
2187 CHXBK4: PUSHJ P,CHABRT ;DIDN'T USE BUFFER AFTER ALL
2188 CONI CHX,T ;COUNT LOST PACKETS
2191 MOVEI T,CHXREN ;ENABLE RECEIVER FOR NEXT PACKET
2194 CHXBK5: CONSO CHX,CHXXMT ;TRANSMIT DONE?
2196 SKIPE T,CHOSTA ;TRANSMIT IN PROGRESS?
2197 CONSO CHX,CHXABT ;AND WAS ABORTED?
2198 JRST CHXBK7 ;NO TO EITHER, LOOK FOR MORE WORK
2199 AOS CHNABT ;METER TRANSMIT ABORTS
2200 CAIL T,NCHRTR ;ABORTED TOO MANY TIMES?
2201 JRST CHXBK7 ;DONE WITH PACKET
2202 AOS CHOSTA ;COUNT RETRANSMISSIONS
2205 CONO CHX,CHXXMT(T) ;RETRANSMIT PACKET
2208 CHXBK7: SETZM CHOSTA ;TRANSMITTER IDLE, LOOK FOR NEXT PACKET
2210 HLRZ A,CHXXMQ ;ANYTHING QUEUED FOR TRANSMISSION?
2211 JUMPE A,[ MOVEI T,CHXTEN ;DISABLE INTERRUPTS
2216 HLRZ B,-2(A) ;CDR TRANSMIT QUEUE
2219 SETZM CHXXMQ ;QUEUE EMPTY NOW
2221 AOS CHOSTA ;NOW SEND THIS PACKET
2222 MOVEI T,CHXHLF+CHXSWB ;CLEAR HALFWORD, BYTE-SWAP MODES
2225 HRLI A,-%CPKDT ;TRANSMIT HEADER
2229 PUSHJ P,CHSWAB ;ENABLE BYTE SWAPPING IF NEEDED
2230 LDB T,[$CPKNB(A)] ;GET SIZE OF PACKET
2231 ADDI T,1 ;ROUND UP TO NEXT HALF WORD BOUNDARY
2232 LSHC T,-2 ;CONVERT BYTES TO WORDS, T+1 GETS REMAINDER
2233 HRLOI D,-1(T) ;MAKE AOBJN POINTER
2235 JUMPGE D,.+3 ;EMPTY PACKET BOUNDARY CASE
2238 MOVEI T,CHXHLF+CHXTEN ;SWITCH TO HALFWORD MODE, ENABLE DONE INTR
2241 TLNE T+1,400000 ;SEND EXTRA HALFWORD IF NEEDED
2243 MOVEI T,CHXSWB ;DISABLE SWAP BYTES MODE
2246 LDB T,[$CPKDN(A)] ;GET DESTINATION SUBNET
2247 HRRZ D,SBNRUT(T) ;GATEWAY TO THAT SUBNET
2249 CAIN T,MYCHAD_-8 ;IF ON LOCAL CABLE
2250 LDB D,[$CPKDA(A)] ;GO DIRECT
2252 DATAO CHX,D ;STORE HARDWARE DESTINATION ADDRESS
2253 MOVE T,CHXCNO ;TRANSMIT PACKET
2256 TLNE T,(CHXOVR) ;CAN'T HAPPEN UNLESS HARDWARE BROKEN
2257 CHXBKZ: BUG HALT,[CHAOS: I/O BUS OVERRUN]
2258 HRROS B,-2(A) ;MARK IT NOT ON TRANSMIT LIST
2259 AOJN B,.+2 ;AND UNLESS IT IS ON SEND LIST
2260 PUSHJ P,CHABRT ;RETURN IT TO FREE
2261 CHXBK9: MOVSI 17,CHXACS ;DISMISS INTERRUPT
2265 CHSWAB: LDB T,[$CPKOP(A)] ;DOES THIS PACKET NEED BYTE SWAPPING?
2268 POPJ P, ;BINARY DATA
2269 JRST CHSWB1 ] ;CHARACTER DATA
2273 JUMPL T,CPOPJ ;BINARY CONTROL PACKET
2274 CHSWB1: MOVEI T,CHXSWB ;CHARACTER, SWAP DEM BYTES
2279 CHSWBT: 1_<35.-%COOPN>+1_<35.-%COSTS>+1_<35.-%CORUT>
2283 SUBTTL CH-11 INTERRUPT ROUTINES
2285 ;The Unibus Chaosnet board interrupts on the same level as TTYs,
2286 ;and comes to CHXBKH via vectored interrupt. We use a programmed
2287 ;interrupt request to drop down to a lower interrupt level for the
2288 ;slow packet-copying operation, so as not to interfere with the TTYs,
2289 ;then turn NETOFF when we call into the Chaosnet NCP.
2290 ;(We actually use NETOFF-1 and NETON-1 so as not to interfere with
2291 ;CLKOFF. This assumes that interrupt levels between CLKCHN and
2292 ;CHXCHN are never turned off.)
2296 ;;; Macros that will eventually be instructions
2298 DEFINE PACK16 AC,E ;AC,AC+1 right-aligned and zero-filled
2305 DEFINE PACK8 AC,E ;AC: ...B2B1 AC+1: ...B4B3 zero-filled!!
2306 ROTC AC,-8 ;B3...B2 B1...B4
2307 ROT AC,-16. ;B1,B2,B3 in position, B4 right-aligned
2308 ADDI AC+1,(AC+1) ;Shift RH(AC+1) left 4 bits
2311 ADDI AC+1,(AC+1) ;B1,B4 in position in AC+1
2316 DEFINE UNPK16 AC,E ;Doesn't bother masking off garbage bits
2319 ROT AC,16. ;First halfword right-aligned
2320 LSH AC+1,-4 ;Second halfword right-aligned
2324 MOVE AC,E ;B1B2B3B4...
2325 ROT AC,8 ;B2B3B4...B1
2327 AND AC,[377_2,,377] ;...B3...B1 zero-filled
2328 ROT AC+1,16. ;B4...B1B2B3
2329 AND AC+1,[377_12,,377_8];B4...B2... zero-filled
2330 IORB AC,AC+1 ;B4B3...B2B1
2331 ROT AC+1,16. ;...B4B3, garbage in high bits
2341 CHXBKH: 0 ;Hardware interrupt on TTYCHN comes here
2343 CONO PI,CHXRQ ;Redirect to lower interrupt level
2344 MOVEM T,CHXSVH ;Clear hardware interrupt enable
2345 MOVEI T,%CAREN+%CATEN ; so the Chaos board will stop interrupting
2352 CHXBRK: 0 ;Software interrupt on CHXCHN comes here
2354 CONO PI,020000+200_<-CHXCHN> ;BAG-BITING DEC LOSERS
2359 IORDI T,CAICSR ;Check for received packet
2361 JRST CHXBK3 ;No incoming packet yet
2362 TRNE T,%CAERR ;Check for error in received packet
2364 JRST CHXBK1 ] ;Ignore packet
2365 IORDI R,CAIRBC ;Number of bits in packet - 1
2366 SUBI R,31. ;Exclude the three extra hardware words
2368 JRST [ AOS CHNWLE ;Length not a multiple of 16
2370 ASH R,-5 ;32-bit word count, rounded up
2371 PUSHJ P,CHABGI ;Get place to put packet
2372 JRST [ AOS CHNLOS ;No buffers, lose this packet
2374 HRLI A,-%CPKDT ;Copy out the packet header
2375 CHSRC1: IORDI B,CAIRBF
2379 PUSHJ P,CHSHDR ;Decode the header
2380 JRST CHSRC4 ;No byte swapping
2382 CHSRC2: IORDI B,CAIRBF ;Read out the data, byte-swapped
2386 CHSRC3: JUMPGE H,CHSRC7 ;Jump if even packet length
2387 IORDI B,CAIRBF ;Residual halfword
2388 SETZ C, ;Somebody depends on zero here
2392 CHSRC4: JUMPGE D,CHSRC6
2393 CHSRC5: IORDI B,CAIRBF ;Read out the data, halfwords
2397 CHSRC6: JUMPL H,[ IORDI B,CAIRBF ;Residual halfword
2398 SETZ C, ;Somebody depends on zero here
2401 CHSRC7: SUB D,R ;AOBJN pointer minus number of words in packet
2403 JRST [ AOS CHNPLE ;Packet length disagrees with hardware length
2405 IORDI T,CAIRBF ;Read the three hardware header words
2409 TRNE T,%CAERR ;Make sure packet came out of RAM okay
2410 JRST [ AOS CHNCR2 ;Garbage, try again
2412 IORDI T,CAIRBC ;Make sure counter didn't spazz
2416 CONO PI,NETOFF-1 ;Get to network interrupt level
2417 PUSHJ P,CHAPII ;Process the input
2419 CHXBK1: IORDI T,CAICSR ;Count lost packets
2423 IORI TT,%CARCL ;Enable receiver for next packet
2425 CHXBK3: TRNN T,%CATDN ;Transmit done?
2426 JRST CHXBK8 ;No, dismiss
2427 SKIPN TT,CHOSTA ;Transmit in progress?
2428 JRST CHXBK7 ;No, look for something to transmit
2429 TRNN T,%CATAB ;Yes, was it aborted?
2430 JRST CHXBK5 ;No, we're done with that packet
2431 AOS CHNABT ;Meter transmit aborts
2432 CAIGE TT,NCHRTR ;Aborted too many times?
2433 JRST CHXBK7 ;No, retransmit it
2434 CHXBK5: CONO PI,PIOFF ;Lock transmit list
2435 HLRZ A,CHXXMQ ;Get packet probably being transmitted now
2436 JUMPE A,[ CONO PI,PION ;It vanished?
2438 HLRZ B,-2(A) ;CDR transmit queue
2441 SETZM CHXXMQ ;Queue empty now
2443 HRROS B,-2(A) ;Mark it not on transmit list
2444 AOJN B,CHXBK6 ;And unless it is on send list
2445 PUSHJ P,CHABRT ;Return it to free
2446 CHXBK6: SETZM CHOSTA ;Transmitter idle, look for next packet
2447 CHXBK7: HLRZ A,CHXXMQ ;Anything queued for transmission?
2448 JUMPE A,CHXBK9 ;No, leave interrupts disabled
2449 AOS CHOSTA ;Count retransmissions
2450 MOVE T,CHXCSR ;Reset transmitter
2453 HRLI A,-%CPKDT ;Transmit header
2454 CHXXM1: UNPK16 B,(A)
2458 PUSHJ P,CHSHDR ;Decode the header
2459 JRST CHXXM4 ;No byte swapping
2461 CHXXM2: UNPK8 B,(D) ;Transmit data with byte swapping
2465 CHXXM3: JUMPGE H,CHXXM7 ;Jump if even packet length
2466 UNPK8 B,(D) ;Transmit residual bytes
2470 CHXXM4: JUMPGE D,CHXXM6
2471 CHXXM5: UNPK16 B,(D) ;Transmit data with byte swapping
2475 CHXXM6: JUMPGE H,CHXXM7 ;Jump if even packet length
2476 UNPK16 B,(D) ;Transmit residual bytes
2478 CHXXM7: LDB T,[$CPKDN(A)] ;Get destination subnet
2479 HRRZ D,SBNRUT(T) ;Gateway to that subnet
2481 CAIN T,MYCHAD_-8 ;If on local cable,
2482 LDB D,[$CPKDA(A)] ; go direct
2483 IOWRI D,CAIWBF ;Store hardware destination address
2484 IORDI T,CAIXMT ;Transmit packet
2485 CHXBK8: MOVEI A,%CATEN ;Enable transmit-done interrupt if xmitting
2486 CHXBK9: IORI A,%CAREN ;Enable receive-done interrupt always
2489 MOVSI 17,CHXACS ;Dismiss software interrupt
2493 CHXBK2: PUSHJ P,CHABRT ;Packet no good, discard it
2496 ;Examine packet in A, return AOBJN pointer to data in D,
2497 ; H is negative if there is an extra halfword after that.
2498 ; W gets number of full words of data (same as LH D).
2503 CHSHDR: HRRZI A,-%CPKDT(A) ;Restore packet address
2504 LDB W,[$CPKNB(A)] ;Get size of packet in bytes
2506 MOVEI W,%CPMXC ;Self-defense
2507 ADDI W,1 ;Round up to next word boundary
2508 LSHC W,-2 ;Convert bytes to words, H gets remainder
2509 HRLOI D,-1(W) ;Make AOBJN pointer
2511 LDB T,[$CPKOP(A)] ;Does this packet need byte swapping?
2514 AOS (P) ;Character data
2515 POPJ P, ] ;Binary data
2519 JUMPL T,CPOPJ ;Binary control packet
2520 JRST POPJ1 ;Characters
2522 CHSWBT: 1_<35.-%COOPN>+1_<35.-%COSTS>+1_<35.-%CORUT>
2526 SUBTTL CHAOS NET BUFFER LIST STUFF
2530 ;BUFFERS ARE PKTBSZ WORDS LONG; 2 HEADER WORDS AND %CPMXW PACKET WORDS.
2531 ;PKTBSZ IS A POWER OF 2 AND LESS THAN 1K (MEMORY PAGE SIZE).
2532 ;NOTE THAT A BUFFER ADDRESS POINTS AT THE FIRST PACKET WORD
2533 ;AND THE HEADER WORDS ARE AT NEGATIVE ADDRESSES.
2534 ;FIRST HEADER WORD: -2(A)
2535 ; RH LIST THREAD FOR MOST LISTS, 0=END, -1=NOT ON LIST
2536 ; LH LIST THREAD FOR TRANSMIT LIST
2537 ;SECOND HEADER WORD: -1(A)
2538 ; TIME RECEIVED OR TIME PUT ON TRANSMIT LIST
2539 ; OR VALUE OF I FOR A PACKET ON THE LSN QUEUE
2540 ; ASCII/LUNCH/ FOR A PACKET ON THE FREE LIST
2542 ;I DO IT THIS WAY (PIOFF) TO AVOID HAVING TO PUSH AND POP PI STATUS,
2543 ;CONO PI,NETOFF CAN LOSE AT INTERRUPT LEVEL (MAINLY THE NETON LOSES)
2545 ;THESE ROUTINES TURN OFF INTERRUPTS MOMENTARILY SO THAT
2546 ;LISTS MAY BE SAFELY MANIPULATED.
2548 ;Q POINTS TO THE HEADER WORD OF A QUEUE, REMOVE THE FIRST
2549 ;THING AND RETURN IN A. (ZERO IF NONE) CLOBBERS T
2550 CHAQGF: CONO PI,PIOFF
2551 HLRZ A,(Q) ;GET FIRST
2552 JUMPE A,PIONJ ;EMPTY
2553 HRRZ T,-2(A) ;GET SECOND
2554 HRLM T,(Q) ;MAKE FIRST
2559 BUG PAUSE,[CHAOS LIST TRASHED],OCT,Q
2560 SETZM (Q) ;IS NOW EMPTY
2564 SETZM (Q) ;IS NOW EMPTY
2569 ;RETURN BUFFER INTO WHICH THE BYTE POINTER IN A POINTS. CLOBBERS A,T,Q
2570 CHBPFR: SUBI A,1 ;SIOKT LIKES TO MAKE BP POINT AT NEXT BUFFER
2575 ;RETURN BUFFER POINTED TO BY A TO FREE UNLESS ON TRANSMIT LIST.
2576 CHABR1: HLLOS T,-2(A) ;RH GETS -1, NO LONGER ON REGULAR LIST
2577 AOJN T,CPOPJ ;EXIT IF STILL ON TRANSMIT LIST
2579 ;RETURN BUFFER POINTED BY A TO FREE STORAGE. CLOBBERS T, Q.
2580 CHABRT: MOVEI Q,CHQFRE
2583 BUG PAUSE,[FREEING 0]
2585 MOVE T,[ASCII/LUNCH/] ;TANSTAAFL
2587 SETOM -2(A) ;NOT ON TRANSMIT LIST NOW (THIS IS WHAT INITS
2588 AOS CHFRBF ; LH[-2(A)] WHEN BUFFER FIRST CREATED)
2589 ;JRST CHAQPL ;DROPS THROUGH
2591 ;A POINTS TO A BUFFER, Q TO A QUEUE. PUT IT ON AS THE LAST THING. BASHES T.
2592 CHAQPL: HLLZS -2(A) ;PUT ENDLIST IN RH
2594 HRRZ T,(Q) ;GET LAST
2595 HRRM A,(Q) ;MAKE NEW LAST
2596 JUMPN T,[HRRM A,-2(T) ;MAKE A COME AFTER IT
2598 HRLM A,(Q) ;WAS EMPTY, ALSO IS NEW FIRST
2602 ;A POINTS TO A BUFFER, Q TO A QUEUE. PUT IT ON AS THE FIRST THING. SMASHES T.
2603 CHAQPF: CONO PI,PIOFF
2604 HLRZ T,(Q) ;GET FIRST
2605 HRRM T,-2(A) ;MAKE SECOND
2606 HRLM A,(Q) ;MAKE NEW FIRST
2608 HRRM A,(Q) ;WAS EMPTY, ALSO MAKE NEW LAST
2612 ;ALLOCATE A BUFFER AT MAIN PROGRAM LEVEL, TO A, MASHES T, TT, Q, B.
2613 CHABG0: PUSHJ P,UDELAY ;WAIT FOR MEMORY
2614 CHABGT: PUSHJ P,CHABGI
2618 ;ALLOCATE A BUFFER, RETURN POINTER TO IT IN A, SKIP. BLOWS AWAY T, TT, Q.
2619 ;NON-SKIP IF NO BUFFERS AVAILABLE. (DOESN'T MAKE NEW ONES IF FREE LIST EMPTY)
2620 CHABAL: MOVEI Q,CHQFRE
2623 SETZM -1(A) ;NO LUNCH
2627 ;ALLOCATE A BUFFER TO A, MAKE NEW IF NONE FREE. OBLITERATES T,Q,B.
2628 ;NON-SKIP IF CAN'T GET MEMORY. (SUITABLE FOR CALLING FROM INT LEVEL)
2629 CHABGI: PUSHJ P,CHABAL ;TRY TO ALLOCATE A BUFFER FROM FREE LIST
2631 JRST POPJ1 ;WON, RETURN
2632 CONI PI,Q ;SAVE PI CHANNELS ON STATUS
2634 CONO PI,UTCOFF ;MAKE THE WORLD SAFE FOR IOMQ
2636 CAIL B,CHMXBF ;MAKE SURE NOT TO USE UP ALL CORE
2638 PUSHJ P,IOMQ ;GET 1K OF MEMORY
2639 JRST CHABG3 ;MEM NOT AVAILABLE, FAIL
2640 CONO PI,PICON(Q) ;WON, RESTORE PI STATUS
2642 DPB B,[MUR,,MEMBLT(A)]
2643 LSH A,10. ;ADDRESS OF 1K OF ALLOCATED MEMORY
2644 ADD A,[-<2000/PKTBSZ>,,2] ;-BUFFERS PER 1K,,OFFSET TO HEADER
2645 CHABG2: PUSHJ P,CHABRT ;PUT THEM ALL ON FREE LIST
2648 MOVEI B,<2000/PKTBSZ> ;THIS MANY MORE BUFFERS HAVE BEEN CREATED
2650 JRST CHABGI ;NOW GO ALLOCATE ONE
2652 ;HERE IF CHAOS NET TRYING TO USE UP TOO MUCH CORE
2653 CHABG4: MOVE B,CHMXTM ;DON'T COMPLAIN TOO OFTEN
2654 ADDI B,60.*30. ;JUST ONCE A MINUTE
2657 IFE CH10P, BUG CHECK,[CHAOS NET ATTEMPTING TO USE TOO MUCH CORE]
2660 BUG CHECK,[CHAOS NET ATTEMPTING TO USE TOO MUCH CORE, CONI=],OCT,B,[CONO=],OCT,CHXCNO,[CHOSTA=],OCT,CHOSTA
2664 CHABG3: CONO PI,PICON(Q) ;LOST, RESTORE PI STATUS
2665 POPJ P, ;AND TAKE ERROR RETURN
2667 ;FREE A WHOLE LIST OF BUFFERS, Q-> HEAD. DESTROYS A,T
2668 CHALFR: PUSHJ P,CHAQGF
2671 PUSHJ P,CHABR1 ;FREE UNLESS STILL ON TRANSMIT LIST
2675 ;Q -> A TRANSMIT QUEUE, FLUSH ALL BUFFERS BELONGING TO INDEX I.
2678 CONO PI,NETOFF ;DON'T LET TRANSMIT LIST CHANGE (AT ALL)
2679 HLRZ A,(Q) ;HEAD OF TRANSMIT LIST
2681 MOVEI B,2(Q) ;B PREVIOUS PACKET, A CURRENT, C NEXT
2682 CFLXM1: HLRZ C,-2(A) ;GET THREAD TO NEXT
2685 JRST 4,. ;CLAIMS NOT TO BE ON LIST?
2687 LDB T,[$CPKSX(A)] ;GET THIS PACKET'S INDEX
2690 HRLM C,-2(B) ;THREAD PREVIOUS TO NEXT
2691 HRROS T,-2(A) ;IF THIS BUFFER IS NOT ALSO ON SEND LIST,
2693 PUSHJ P,CHABRT ;RETURN IT
2698 HRRM B,(Q) ;LAST PACKET ON LIST MAY HAVE CHANGED
2700 SETZM (Q) ;TRANSMIT QUEUE IS NOW EMPTY
2704 ;SEARCH LIST IN Q FOR PACKET WHOSE CONTACT NAME MATCHES THAT
2705 ;OF PACKET IN A, RETURN IT IN B, SKIPPING IF WINNING. CLOBBERS T,TT,C,D,E,H,J.
2706 ;THE PACKET RETURNED IN B IS DE-LINKED FROM THE SEARCHED QUEUE.
2707 ;HAS TO BE CALLED WITH NETOFF OR IN PROGRESS, SO LIST CAN'T GET MUNGED.
2708 ;I HOPE IT'S NOT TOO BLETCHEROUSLY SLOW.
2709 CHAQSR: HLRZ B,(Q) ;GET START OF LIST TO SEARCH
2710 JUMPE B,CPOPJ ;EMPTY, LOSE
2711 MOVEI J,0 ;PACKET PREVIOUS TO B
2712 CHAQS1: LDB C,[$CPKNB(A)] ;SET UP STRING COMPARE LOOP
2713 LDB H,[$CPKNB(B)] ;THIS ASSUMES NO ZERO-LENGTH STRINGS
2719 ILDB TT,E ;DON'T IGNORE CASE, THAT WOULD JUST SLOW THIS
2720 CAME T,TT ;BAG-BITER DOWN EVEN MORE. EVERYONE SHOULD
2721 JRST CHAQS4 ;PUT THEIR CONTACT NAMES IN UPPER-CASE.
2722 CAIN T,40 ;TERMINATE ON SPACE
2729 CHAQS5: HRRZ C,-2(B) ;WON, DELINK PACKET FROM LIST
2730 JUMPE J,[ HRLM C,(Q)
2733 HRRZ C,(Q) ;CHECK LIST ENDING IN RIGHT PLACE
2741 HRRM J,(Q) ;TOOK LAST PACKET, STORE NEW LAST
2744 CHAQS3: SOJLE H,CHAQS5
2748 CHAQS4: MOVE J,B ;THIS ONE DOESN'T MATCH, TRY NEXT
2753 ;THIS ROUTINE RUNS IN THE CORE JOB AND CLEANS UP MEMORY USED BY CHAOS BUFFERS
2755 CHCLN: SKIPE A,CHTTBF ;SEE IF 2/3 OR MORE OF BUFFERS FREE
2757 POPJ P, ;NO BUFFERS OR NONE FREE, NOTHING TO DO
2759 IDIV A,B ;GET RATIO OF TOTAL TO USED
2760 CAIGE A,3 ;NOTE IF B IS ZERO A IS UNCHANGED
2761 POPJ P, ; AND AT LEAST 32.
2762 IFL TSYSM-256., MOVEI D,TSYSM-1 ;SCAN MEMORY FOR CHAOS BUFFER PAGES
2764 CHCLN0: LDB A,[MUR,,MEMBLT(D)]
2766 CHCLN4: SOJGE D,CHCLN0
2768 MOVE A,D ;QUICKLY DETERMINE IF ANY NON-FREE BUFFERS
2769 LSH A,10. ; ON THIS PAGE
2770 HRLI A,-<2000/PKTBSZ>
2771 MOVE T,[ASCII/LUNCH/]
2773 JRST CHCLN4 ;NOT FREE, DON'T BOTHER WITH SLOW STUFF
2776 SETZB C,CHCLNQ ;COLLECT ALL FREE BUFFERS THAT ARE ON THIS PAGE
2777 MOVE E,CHFRBF ;LOOP ABOUT AS MANY TIMES AS THERE ARE FREE BUFFERS
2778 CHCLN1: PUSHJ P,CHABAL ;GET NEXT FREE BUFFER
2782 JRST [ MOVEI Q,CHCLNQ ;THIS ONE'S ON THE PAGE, SAVE IT
2784 AOJA C,.+2 ] ;COUNT THEM
2785 PUSHJ P,CHABRT ;NOT ON THE PAGE, PUT BACK
2787 CHCLN2: CAIE C,<2000/PKTBSZ> ;DID WE GET THE WHOLE PAGE?
2788 JRST [ MOVEI Q,CHCLNQ ? PUSHJ P,CHALFR ? JRST CHCLN4 ]
2789 MOVNS C ;YES, GET RID OF THESE BUFFERS