Consolidate license copies
[its.git] / system / ioelev.432
1 ;;; -*-PALX-*-
2 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
3 ;;;
4 ;;; This program is free software; you can redistribute it and/or
5 ;;; modify it under the terms of the GNU General Public License as
6 ;;; published by the Free Software Foundation; either version 3 of the
7 ;;; License, or (at your option) any later version.
8 ;;;
9 ;;; This program is distributed in the hope that it will be useful,
10 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 ;;; General Public License for more details.
13 ;;;
14 ;;; You should have received a copy of the GNU General Public License
15 ;;; along with this program; if not, write to the Free Software
16 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18                 .TITLE IOELEVEN
19
20         .SBTTL DEFINITIONS
21
22 ;;; note that the .IFM macro must be used only at toplevel
23 ;;; (non-conditionalized) in PALX because it doesn't do the expansion of .IFM
24 ;;; when conditionalized out, therefore it doesn't match it with the
25 ;;; following .ENDC and the .ENDC will be seen at toplevel and end the
26 ;;; conditionalization one is in.  This will screw the code running on
27 ;;; another one of the machines even if it doesn't signal an error in your
28 ;;; assembly.  --PGS 
29
30 .LIF NZ 0
31  .FATAL USE PALX DUMMY!!
32
33 ;NOTE THAT THIS PROGRAM IS DESIGNED FOR 11/40'S.  TO RUN ON AN
34 ;11/10, MACRO OUT THE SOB INSTRUCTIONS.  DOES NOT USE EIS NOR FIS.
35
36 A=%0            ;TEMP/ARG/CHAR
37 B=%1            ;TEMP/ARG
38 C=%2            ;TEMP/ARG
39 D=%3            ;TEMP/ARG
40 H=%4            ;USUALLY INDEX IN HARDWARE UNIT TABLES
41 I=%5            ;USUALLY LINE NUMBER TIMES 2
42 SP=%6           ;STACK POINTER
43 PC=%7           ;PROGRAM POINTER
44 PS=177776       ;PROGRAM STATUS
45 SWR=177570      ;SWITCHES
46
47 .MACRO RTI
48 .ENDM ;FUCKING PALX!
49
50 RTI=RTT         ;11/40 HARDWARE MISFEATURE
51
52 .IF P1
53 .PRINT /MACHINE NAME = /
54 .TTYMAC MNAM
55 %TTYFLG==%TTYFLG+1
56 .PRINT /MNAM
57 /
58 %TTYFLG==%TTYFLG-1
59 .MACRO .IFM MCHN                ;REFERS TO PDP11 NAME
60 .IF IDN MCHN,MNAM
61 .ENDM .IFM
62 .MACRO MCONDX MCHN              ;REFERS TO ITS SYSTEM NAME, USUALLY THE SAME
63 .IF IDN MCHN,MNAM
64 .ENDM MCONDX
65 .MACRO FUBAR
66 .ENDC
67 .ENDC
68 .ENDM FUBAR
69 .MACRO MNAME BODY               ;INSERT ITS SYSTEM NAME INTO BODY IN PLACE OF "MCHN"
70 .IRP MCHN,<MNAM>
71 BODY
72 .ENDM
73 .ENDM MNAME
74 .ENDM ;TTYMAC
75 .ENDC ;P1
76
77 VERSION==%FNAM2
78 \f
79 .IFM MX-DL                      ;MX'S DL-10 PDP11
80 .MACRO MCONDX MCHN
81 .IF IDN MCHN,MX
82 .ENDM MCONDX
83 .MACRO FUBAR
84 .ENDC
85 .ENDM FUBAR
86 .MACRO MNAME BODY
87 .IRP MCHN,<MX>
88 BODY
89 .ENDM
90 .ENDM MNAME
91
92 DL10P==1        ;HAS DL10
93 DTE20P==0       ;DOES NOT HAVE DTE20
94 NODDT==0        ;HAS DDT
95 NFTTY==102      ;2 * # OF FIRST TTY THIS 11
96 NDHS==1         ;NUMBER OF DH11'S
97 NDHUN==15       ;NUMBER OF UNUSED DH11 LINES
98 DHIBAS==320     ;DH11 INTERRUPT VECTOR BASE
99 DHCBAS==160020  ;CSR of first DH11 
100 NDLS==1         ;NUMBER OF DL11'S
101 CTYP==0         ;FIRST DL11 NOT T00 (CTY)
102 NMPTYS==0       ;NUMBER OF TTYS ON MULTIPLEXED LINE (REST IN PEACE)
103 ;MPXIDX==2*27   ;TTY INDEX OF LINE THAT MULTIPLEXED TTYS RUN OVER
104 NDMS==0         ;HAS DM11BB MODEM SCANNER (BUT IT'S NOT CONNECTED TO ANYTHING)
105 GOULDP==0       ;DOESN'T HAVE GOULD LPT (ANYMORE)
106 T300P==1        ;TRIDENT T-300 AND 2561 CONTROLLER
107 CHAOSP==2       ;HAS TWO CHAOS NET INTERFACES
108 CHSBTB=0        ;CHAOSNET INTERFACE IS NEW, DOESN'T GET HUNG ANY MORE
109 CHAD0==440      ;CHAOSNET ADDRESS OF THIS PDP11 ITSELF
110 DLCADR==1440    ;CHAOSNET ADDRESS OF PDP10 CONNECTED VIA DL10 (MX)
111 CHAD1==3040     ;SECOND INTERFACE
112 TEN11P==0       ;NO TEN-11 INTERFACE
113 ETHERP==0       ;NO ETHERNET
114 FTPULS==0       ;INITIALLY, MX DOES NOT GENERATE TEST PACKETS
115 FTGARB==1       ;SAVE LAST GARBAGE PACKET RECEIVED
116 MAXBSZ==250.    ;MAXIMUM TYPEOUT BUFFER SIZE
117 .MACRO ASPIRP BODY      ;DEFINE LINE NUMBERS WITH AUTOSPEED
118 .ENDM ASPIRP
119 .ENDC ;MX-DL
120
121 .IFM MX         ;MX CONSOLE 11
122 DL10P==0        ;DOES NOT HAVE DL10
123 DTE20P==1       ;HAS DTE20
124 NODDT==0        ;HAS DDT AND KLDCP
125 NFTTY==0        ;2 * # OF FIRST TTY THIS 11
126 NDHS==2         ;NUMBER OF DH11'S
127 NDHUN==0        ;NUMBER OF UNUSED DH11 LINES
128 DHIBAS==310     ;DH11 INTERRUPT VECTOR BASE
129 DHCBAS==160020  ;CSR of first DH11 
130 NDLS==1         ;NUMBER OF DL11'S
131 CTYP==1         ;FIRST DL11 IS T00 (CTY)
132 NMPTYS==0       ;NUMBER OF TTYS THAT GO THROUGH MULTIPLEXED LINE (NONE)
133 NDMS==2         ;has 2 DM11BB modem scanners (really DH11AD)
134 GOULDP==0       ;DOESN'T HAVE GOULD LPT
135 T300P==0        ;TRIDENT T-300 AND 2561 CONTROLLER
136 CHAOSP==0       ;NO CHAOS NET INTERFACE
137 TEN11P==0       ;NO TEN-11 CHAOS INTERFACE
138 ETHERP==0       ;NO ETHERNET
139 MAXBSZ==250.    ;MAXIMUM TYPEOUT BUFFER SIZE
140
141 .MACRO ASPIRP BODY      ;DEFINE LINE #S WITH AUTOSPEED
142 .IRP N,<1,3,4,5,6,7,10,11,12,13,14,15,16,17>
143         BODY
144 .ENDM
145 .ENDM ASPIRP
146
147 TKS==177560
148 TKB==177562
149 TPS==177564
150 TPB==177566
151 .ENDC ;MX
152
153 .IFM AI         ;AI'S CHAOS-ETHER-GATEWAY PDP11
154
155 ;THIS IS A PDP11/10, WE HAVE TO REDEFINE A FEW THINGS
156 .MACRO RTT
157 .ENDM
158 RTI==2
159 RTT==2
160 .MACRO SOB REG,TAG
161         DEC REG
162         BNE TAG
163 .ENDM SOB
164
165 DL10P==0        ;HAS NO DL10
166 DTE20P==0       ;DOES NOT HAVE DTE20
167 NODDT==1        ;DOESN'T HAVE DDT (USE CARPET)
168 NFTTY==0        ;2 * # OF FIRST TTY THIS 11
169 NDHS==0         ;NUMBER OF DH11'S
170 NDHUN==0        ;NUMBER OF UNUSED DH11 LINES
171 DHIBAS==320     ;DH11 INTERRUPT VECTOR BASE
172 DHCBAS==160020  ;CSR of first DH11 
173 NDLS==0         ;NUMBER OF DL11'S  (ACTUALLY HAS ONE, BUT WE'RE NOT USING IT NOW)
174 CTYP==0         ;FIRST DL11 NOT T00 (CTY)
175 NMPTYS==0       ;NUMBER OF TTYS ON MULTIPLEXED LINE
176 NDMS==0         ;HAS NO DM11BB MODEM SCANNERS
177 GOULDP==0       ;DOESN'T HAVE GOULD LPT
178 T300P==0        ;TRIDENT T-300 AND 2561 CONTROLLER
179 CHAOSP==2       ;HAS TWO CHAOS NET INTERFACES
180 CHSBTB==0       ;CHAOSNET INTERFACE IS NEW-STYLE, DOES NOT GET HUNG
181 CHAD0==426      ;CHAOSNET ADDRESS OF THIS PDP11 ITSELF (AI-MC-CROSS-STREET SUBNET)
182 CHAD1==3072     ;SECOND INTERFACE (9TH FLOOR LISP MACHINE SUBNET)
183 CHADD==426      ;The DOVER protocol translator only works for this address
184 TEN11P==0       ;USES TEN-11 INTERFACE FOR CHAOS NET TO AI-10  (NOT ANY MORE!)
185 T11ADR==2026    ;CHAOSNET ADDRESS OF PDP10 CONNECTED VIA TEN-11 INTERFACE (AI)
186 NT11BF==3       ;THREE BUFFERS IN EACH DIRECTION FOR TEN-11 INTERFACE
187 ETHERP==1       ;ETHERNET
188 ETHHSN==6       ;MY HOST NUMBER BYTE, JNC SAYS I SHOULD USE 6
189 NDVRBF==6       ;6 DOVER BUFFERS
190 DVRADR==1002    ;PUP ADDRESS OF DOVER
191 FTPULS==0       ;INITIALLY, AI DOES NOT GENERATE TEST PACKETS
192 FTGARB==1       ;DON'T SAVE LAST GARBAGE PACKET RECEIVED (LOW ON CORE) (not that low)
193 MAXBSZ==250.    ;MAXIMUM TYPEOUT BUFFER SIZE
194 .MACRO ASPIRP BODY      ;DEFINE LINE NUMBERS WITH AUTOSPEED
195 .ENDM ASPIRP
196 .ENDC ;AI
197
198 .IIF NDF NDHS, .ERROR MACHINE NAME NOT RECOGNIZED
199
200 .IIF NZ DL10P, .IIF Z NFTTY, .ERROR TTY # 0 DOESN'T WORK WITH DL10 PROTOCOL
201 \f
202 ;ASSIGN TTY INDICES, HARDWARE INDICES, ETC.
203
204 TX==NFTTY       ;TTY INDEX
205 HX==0           ;HARDWARE INDEX
206 NCT==0          ;NUMBER OF TTYS
207
208 ;SYSTEM CONSOLE (OUT OF ORDER)
209 .IFNZ CTYP
210         TX==TX+2
211         NCT==NCT+1
212 .ENDC
213
214 ;DH11 LINES
215         NFDHTY==TX
216         TX==TX+<32.*NDHS>
217         NCT==NCT+<16.*NDHS>
218         HX==HX+<2*NDHS>
219         NLDHHX==HX-2            ;UNITS 0-NLDHHX INCLUSIVE ARE DH11S
220
221         TX==TX-<2*NDHUN>        ;COMPENSATE FOR UNUSED LINES
222         NLDHTY==TX-2            ;LAST DH11 LINE INCLUSIVE
223         NCT==NCT-NDHUN
224
225 ;DL11 LINES
226         NFDLTY==TX
227         NFDLHX==HX
228         TX==TX+<2*NDLS>-<2*CTYP>
229         HX==HX+<2*NDLS>
230         NLDLHX==HX-2
231         NCT==NCT+NDLS-CTYP
232
233 ;MULTIPLEXOR LINES
234         NFMPTY==TX
235         MPKHWR==HX
236         TX==TX+<2*NMPTYS>
237         HX==HX+2
238         NCT==NCT+NMPTYS
239
240 NLTTY==NFTTY+<2*NCT>    ;2 * # OF FIRST TTY NOT THIS 11
241 LASTTY==NLTTY-2         ;LAST VALID TTY INDEX
242
243 .IFNZ NDMS      ;DM11-BB MODEM SCANNER
244
245                 ;1.1-1.4 MODEM CHANNEL #
246  DMBSY==20      ;1.5 SCAN BUSY (R.O.)
247  DMSCN==40      ;1.6 SCANNER ON
248  DMIEN==100     ;1.7 INTERRUPT ENABLE
249  DMDON==200     ;1.8 DONE - SCANNER HAS FOUND SOMETHING
250  DMSTP==400     ;1.9 STEP SCANNER TO NEXT LINE (W.O.) 1.2 USEC.
251                 ;2.1 MAINTENANCE MODE
252  DMCLR==2000    ;2.2 CLEAR RTS, DTR, SEC TX, LINE EN FOR ALL LINES (W.O.)
253  DMCSN==4000    ;2.3 CLEAR SCAN - CLEAR CSR AND MODEM STATUS MEMORY (W.O.) 19 USEC
254  DM2RX==10000   ;2.4 SECONDARY RECIEVE CHANGED ON SELECTED MODEM (R.O.)
255  DMCTS==20000   ;2.5 CLEAR TO SEND CHANGED ON SELECTED MODEM (R.O.)
256  DMCAR==40000   ;2.6 CARRIER DETECT CHANGED ON SELECTED MODEM (R.O.)
257  DMRNG==100000  ;2.7 RING CHANGED ON SELECTED MODEM (R.O.)
258
259  LINENB==1      ;1.1 ENABLE SCANNING OF LINE
260  LINDTR==2      ;1.2 DATA TERMINAL READY
261  LINRQS==4      ;1.3 REQUEST TO SEND (FORCE BUSY ON 103E)
262  LIN2TX==10     ;1.4 SECONDARY TRANSMIT
263  LIN2RX==20     ;1.5 SECONDARY RECEIVE (R.O.)
264  LINCTS==40     ;1.6 CLEAR TO SEND (R.O.)
265  LINCAR==100    ;1.7 CARRIER DETECT (R.O.)
266  LINRNG==200    ;1.8 RING (R.O.)
267 .ENDC ;NDMS
268
269 ; KW11-L LINE FREQ CLOCK
270
271 LKS=177546      ;1.8 CLOCK FLAG
272                 ;1.7 INTER ENB
273 HNGDLY==3*60.   ;CLEAR TO SEND OFF FOR 3 SECONDS => HANGUP
274 \f
275 .IFNZ GOULDP
276 ;DEFINITIONS FOR GOULD LPT
277
278 GLPCSR=166000   ;COMMAND STATUS REGISTER (NONSTANDARD)
279  ;COMMAND CODES
280  %GCFF==0       ;TOP-OF-FORM COMMAND
281  %GCGRF==1      ;GRAPHIC MODE COMMAND
282  %GCCUT==2      ;CUT COMMAND (NO CUTTER ON THIS MACHINE, THOUGH)
283  %GCON==3       ;TURN PRINTER ON
284  %GCOFF==4      ;TURN PRINTER OFF
285  %GCLSL==5      ;LAST LINE (GRAPHIC MODE).  => 2 MORE SCAN LINES.
286  %GCION==6      ;INTERRUPT ON
287  %GCIOF==7      ;INTERRUPT OFF
288  %GCADV==201    ;ADVANCE ONE LINE
289  ;STATUS BITS
290  %GSNRD==400    ;NOT READY
291  %GSDON==2000   ;TRANSFER COMPLETE
292  %GSBSY==4000   ;BUSY
293  %GSVAC==10000  ;VACUUM FAULT
294  %GSPAP==20000  ;PAPER LOW
295  %GSTIM==40000  ;TIMEOUT
296  %GSERR==50400  ;ALL ERROR BITS
297
298 GLPWC=166002    ;NEGATIVE WORD COUNT REG
299
300 GLPCA=166004    ;CURRENT ADDRESS REG
301
302 GLPBSZ==132.    ;BUFFER SIZE (# CHARS PER LINE)
303
304 NGLPBF==7       ;NUMBER OF BUFFERS
305  GB.STA==0      ;BUFFER STATE - DON'T CHANGE ORDER OF %GB CODES
306   %GBIDL==0     ;0 IDLE
307   %GBMP==2      ;2 ACTIVE AT M.P. LEVEL
308   %GBWRT==4     ;4 IN WRITE QUEUE
309   %GBPI==6      ;6 ACTIVE AT P.I. LEVEL
310   %GBDMA==8     ;8 ACTIVE AT D.M.A. LEVEL
311  GB.NXT==2      ;CIRC POINTER TO NEXT BUFFER
312  GB.FF==4       ;IF NON-ZERO, FF BEFORE THIS BUFFER
313  GB.NL==6       ;NUMBER OF BLANK LINES BEFORE THIS BUFFER
314  GB.PNT==10     ;-> NEXT BYTE TO INSERT
315  GB.DAT==12     ;DATA BEGINS HERE
316  GB.LEN==GB.DAT+GLPBSZ  ;TOTAL NUMBER OF BYTES PER BUFFER
317
318 .ENDC ;GOULDP
319 \f
320 .IFNZ CHAOSP
321 ;DEFINITIONS OF CHAOS NET HARDWARE
322
323 ;USUAL ADDRESS IS 764140 .  USUAL INTERRUPT VECTOR IS 270 .
324
325 CAICSR=164140           ;COMMAND STATUS REG
326 CH%CSR==0
327  %CABSY==1              ;0 XMT BUSY (RO)
328  %CALUP==2              ;1 LOOP BACK (R/W)
329  %CASPY==4              ;2 RECIEVE MSGS FOR ANY DESTINATION (R/W)
330  %CARCL==10             ;3 CLEAR THE RECEIVER, IT CAN NOW GOBBLE ANOTHER MSG (WO)
331  %CAREN==20             ;4 RCV INT ENB (R/W)
332  %CATEN==40             ;5 XMT INT ENB (R/W)
333  %CATAB==100            ;6 TRANSMIT ABORTED BY ETHER CONFLICT (RO)
334  %CATDN==200            ;7 TRANSMIT DONE. SET WHEN TRANSMITTER IS DONE
335  %CATCL==400            ;8 CLEAR THE TRANSMITTER, MAKING IT READY (WO)
336                         ;9-12    LOST COUNT (RO) [# MSGS RCVED WITH RCV BFR FULL]
337                         ;        WHEN MSG IS WAITING IN BUFFER, THIS COUNTS
338                         ;        THE MESSAGES THAT MATCHED OUR DESTINATION OR
339                         ;        WERE BROADCAST, BUT COULDN'T BE RECIEVED.
340                         ;        WHEN RECEIVER IS RE-ENABLED (WRITE 1 INTO %CARDN)
341                         ;        THE COUNT IS THEN CLEARED.
342                         ;        WHEN A MESSAGE IS LOST, RECEIVER ZAPS ETHER
343                         ;        SO TRANSMITTER WILL ABORT (IF MESSAGE WAS DESTINED
344                         ;        TO US.)
345  %CARST==20000          ;13 I/O RESET (WO)
346  %CAERR==40000          ;14 CRC ERROR (RO)
347  %CARDN==100000         ;15  RCV DONE.  
348
349 CAIMYN=164142           ;MY # (READ ONLY)
350 CH%MYN==2               ;RETURNS THE [SOURCE] HOST# OF THIS INTERFACE.          
351
352 CAIWBF=164142           ;WRITE BUFFER (WRITE ONLY)
353 CH%WBF==2               ;FIRST WAIT FOR TDONE. (OR SET IT VIA CSR)
354                         ;FIRST WORD IN RESETS TRANSMITTER AND CLEARS TDONE.
355                         ;STORE INTO THIS REGISTER TO WRITE WORDS OF MESSAGE,
356                         ;LAST WORD IN IS DESTINATION ADDRESS, THEN READ CAIXMT.
357                         ;SOURCE ADDRESS AND CHECK WORD PUT IN BY HARDWARE.
358
359 CAIRBF=164144           ;READ BUFFER (READ ONLY)
360 CH%RBF==4               ;THE FIRST WORD READ WILL BE FILLED TO THE LEFT
361                         ;TO MAKE THE MESSAGE RECIEVED A MULTIPLE OF 16 BITS.
362                         ;IF THE NUMBER OF DATA BITS IN THE MESSAGE WAS A
363                         ;MULTIPLE OF 16, THIS WORD WILL BE THE FIRST WORD PUT
364                         ;INTO THE BUFFER BY THE TRANSMITTING HOST.
365                         ;THE LAST 3 WORDS READ ARE DESTINATION, SOURCE, CHECK.
366
367 CAIRBC=164146           ;RECEIVE BIT COUNTER  (READ ONLY)
368 CH%RBC==6               ;WHEN A MESSAGE HAS BEEN RECEIVED THIS IS ONE LESS THAN
369                         ;THE NUMBER OF BITS IN THE MESSAGE (16 X THE
370                         ;NUMBER OF WORDS INCLUDING THE THREE OVERHEAD WORDS.)
371                         ;AFTER THE LAST WORD (THE CRC WORD) HAS BEEN READ, IT IS 7777
372                         ;BITS 10 AND 11 ARE THE HIGH ORDER BITS, AND IF THEY ARE ONE,
373                         ;THEN THERE WAS A BUFFER OVERFLOW
374
375 CAIXMT=164152           ;READING THIS INITIATES TRANSMISSION (!!)
376 CH%XMT==12              ;THE VALUE READ IS ONE'S OWN HOST#.
377
378 ;REFERENCING ADDRESSES IN THE GROUP OF 8 WORDS NOT LISTED HERE, OR
379 ;USING COMBINATIONS OF READ/WRITE NOT LISTED HERE, WILL TYPICALLY CAUSE
380 ;STRANGE AND BIZARRE EFFECTS.
381 \f
382 ;PACKET DEFINITIONS
383 ;THESE ARE FOR 4K PACKET BUFFERS AND FOR THE ORIGINAL CHAOSNET PROTOCOL
384
385 PKMAX==256.                     ;MAXIMUM LENGTH OF PACKET (INCLUDING ALL HARDWARE WORDS)
386 DATMAX==488.                    ;MAXIMUM NUMBER OF DATA BYTES
387 PKHDW==8                        ;NUMBER OF HEADER WORDS
388 PKTMXW==<DATMAX/2>+PKHDW        ;MAX WORDS THROUGH PACKET SWITCH (SEE MOVDH ETC.)
389
390 PKOP==1                         ;BYTE INDEX OF THE OPCODE OF THE PACKET
391  %CORFC==1
392  %COOPN==2
393  %COCLS==3
394  %COANS==5
395  %COSNS==6
396  %COSTS==7
397  %CORUT==10
398  %COLOS==11
399  %COEOF==14
400  %COUNC==15
401 PKNBYT==2                       ;WORD INDEX OF NUMBER OF BYTES IN PACKET
402 PKNBMS==170000                  ;MASK FOR THE NUMBER OF BYTES
403 PKFC==2                         ;WORD INDEX FOR THE FORWARD COUNT
404 PKFCMS==7777                    ;IT IS THE TOP 4 BITS
405 PKDHST==4                       ;DESTINATION HOST
406 PKDIND==6                       ; "   "   "  INDEX
407 PKSHST==10                      ;SOURCE HOST
408 PKSIND==12                      ;SOURCE INDEX
409 PKPKN==14                       ;THE PACKET NUMBER
410 PKACN==16                       ;THE ACK PACKET NUMBER
411 PKDAT==20                       ;THE START OF THE DATA
412 .ENDC ;CHAOSP
413 \f
414 ;STANDARD MACROS
415
416 .MACRO PUSH X
417 .IRP Y,<X>
418         MOV Y,-(SP)
419 .ENDM
420 .ENDM
421
422 .MACRO POP X
423 .IRP Y,<X>
424         MOV (SP)+,Y
425 .ENDM
426 .ENDM
427
428 .MACRO CALL X
429         JSR PC,X
430 .ENDM
431
432 .MACRO RET
433         RTS PC
434 .ENDM
435
436 .MACRO SETOM LOC
437  ZZ===%COMPAT           ;DON'T CARE WHETHER .+2 OR .+4 GETS STORED
438  %COMPAT===0
439         MOV PC,LOC
440  %COMPAT===ZZ
441 .ENDM
442
443 .MACRO MASK LEVEL
444         PUSH PS
445         MOV #<LEVEL>_5,PS
446 .ENDM
447
448 .MACRO UNMASK
449         POP PS
450 .ENDM
451
452 .MACRO W
453 .=.+2
454 .ENDM
455
456 .MACRO T TAG    ;usage is T TAG: <crlf> STMNT
457 .=.-NFTTY
458 TAG
459 .=.+NFTTY
460 .ENDM
461
462 .MACRO CONC A,B,C,D,E,F,G
463 A'B'C'D'E'F'G
464 .ENDM
465
466 .MACRO INFORM A,B,C,D,E,F,G
467 .IF P1
468 .PRINT /A'B'C'D'E'F'G
469 /
470 .ENDC
471 .ENDM
472
473 .MACRO MSG X
474 .NCHR ZZ,^\X\
475         .WORD ZZ
476         .ASCII \X\
477         .EVEN
478 .ENDM
479
480 .MACRO .IREPT N,BOD
481 .REPT N
482 BOD
483 .ENDR
484 .ENDM
485 \f.IFNZ DL10P
486         .SBTTL DL10 CONTROL AREA
487
488 ZZ==.
489 .=100000
490
491 DLXCSR: W       ;DL10 11-SIDE CONTROL & STATUS REG
492                 ;1.1-1.2 PIA
493  DLXIEN==4      ;1.3 ENABLE DLX11I TO INTERRUPT
494  DLXEEN==10     ;1.4 ENABLE ERRORS TO INTERRUPT
495                 ;1.5 UNUSED
496  DLXPRT==40     ;1.6 PORT ENABLE (R.O.)
497  DLXZWC==100    ;1.7 CLEAR DLXWCO (W.O.)
498  DLXWCO==200    ;1.8 WORD COUNT OVERFLOW
499  DLXZPA==400    ;1.9 CLEAR DLXPAR (W.O.)
500  DLXPAR==1000   ;2.1 PAR ERR IN 10 MEM
501  DLXZNX==2000   ;2.2 CLEAR DLXNXM (W.O.)
502  DLXNXM==4000   ;2.3 NXM IN 10 MEM
503  DLXZ10==10000  ;2.4 CLEAR DLX10I (W.O.)
504  DLX10I==20000  ;2.5 INTERRUPT PDP10
505  DLXZ11==40000  ;2.6 CLEAR DLX11I (W.O.)
506  DLX11I==100000 ;2.7 INTERRUPT PDP11
507
508 VERS:   W       ;.BYTE FIRST LINE, # OF LINES
509                 ;SET BY -10.  USED TO CHECK CONSISTENCY.
510
511 DLXUP:  W       ;CHECK FOR UP-NESS IN BOTH DIRECTIONS
512                 ;INCREMENTED BY 11 EVERY 1/60 SECOND, SETOM'ED BY 10 EVERY 1/2 SEC.
513
514 TTYST:  W       ;LINE# TO START OUTPUT ON (I.E. SET OUTPUT DONE)
515                 ;SET BY 10, CLEARED BY 11
516
517 TYILIN: W       ;TYPEIN STATUS WORD - LINE NUMBER
518                 ;SET BY 11, CLEARED BY 10 - INTERRUPTS 10
519 TYICHR: W       ;TYPEIN CHARACTER - GOES WITH PRECEDING WORD
520
521 TYOSTS: W       ;STATUS WORD (OUTPUT DONE LINE #)
522                 ;SET BY 11, CLEARED BY 10 - INTERRUPTS 10
523 TYOBSZ: W       ;BUFFER SIZE FOR LINE WITH OUTPUT DINE (SET BY 11)
524
525 TYOPNT: W       ;BUFFER POINTER FOR TTY OUTPUT
526                 ;SET BY 10
527 TYOCNT: W       ;BUFFER LENGTH FOR TTY OUTPUT
528                 ;SET BY 10
529 TYOLIN: W       ;LINE NUMBER FOR TTY OUTPUT
530                 ;SET BY 10, CLEARED BY 11
531
532 HNGLIN: W       ;0000NN - LINE # NN HUNG UP
533                 ;01RTNN - LINE # NN HAS SPEED RCV=R, XMT=T (SEE TTYTYP FOR CODES)
534                 ;SET BY 11, CLEARED BY 10 - INTERRUPTS 10
535
536 LPRLIN: W       ;LINE NUMBER FOR SETTING LINE PARAMETERS
537                 ;SET BY 10, CLEARED BY 11
538 LPRLPR: W       ;DH11 LPR REGISTER FOR SETTING LINE PARAMETERS
539                 ;SET BY 10
540 LPRBSZ: W       ;BUFFER SIZE FOR SETTING LINE PARAMETERS
541                 ;SET BY 10
542
543 EXDSTS: W       ;STATUS WORD (EXAMINE/DEPOSIT 11 CORE)
544                 ;1 = EXAMINE, 2 = DEPOSIT
545                 ;SET BY 10, CLEARED BY 11
546 EXDADR: W       ;ADDRESS FOR ABOVE
547                 ;SET BY 10
548 EXDDAT: W       ;DATA WORD FOR ABOVE
549                 ;SET BY 10 (DEPOSIT) OR 11 (EXAMINE)
550
551 GLPPTR: W       ;BUFFER POINTER FOR GOULD OUTPUT
552 GLPCTR: W       ;NUMBER OF BYTES YET TO BE GOBBLED
553 GLPTER: W       ;ERROR STATUS, SET BY 11
554 GLPGRF: W       ;GRAPHIC MODE IF NON-ZERO, SET BY 10
555
556 ;CHAOS NET SHARED VARIABLES
557 DLCINI: W       ;WHEN THIS IS NON-ZERO, 11 RESETS ITS POINTERS AND CLEARS IT
558 DLCSP1: W       ;SEND PACKET 1 (ILDB POINTER)
559 DLCSP2: W       ;SEND PACKET 2
560 DLCSS1: W       ;SEND STATE 1 (0 IDLE, 1 TO 11, 2 OUTPUT DONE)
561 DLCSS2: W       ;SEND STATE 2
562 DLCRP1: W       ;RECEIVE PACKET 1 (ILDB POINTER)
563 DLCRP2: W       ;RECEIVE PACKET 2
564 DLCRS1: W       ;RECEIVE STATE 1 (0 IDLE, 1 READY FOR INPUT FROM 11, 2 INPUT DONE)
565 DLCRS2: W       ;RECEIVE STATE 2
566
567 ;^ ADD MORE HERE, E.G. IMP
568
569 .IFNZ T300P
570 ;DISK AREA.  14. WORDS 48. WORDS INTO THE DL-10 AREA.
571 .=100000+<60*2>
572
573 DSCCHK: W       ;MUST BE 2561 OCTAL TO MAKE SURE WE HAVE CORRECT PDP-10 PROGRAM
574 DSCREQ: W       ;0 MEANS NO REQUEST.  NON-ZERO MEANS 10 HAS PENDING REQUEST TO 11.
575 DSCDON: W       ;0 MEANS NOT DONE, NON-ZERO MEANS 11 IS TELLING 10 IT'S DONE.
576 ;NEXT 2 WORDS WRITTEN BY 11 TO TELL STATUS OF OPERATION
577 DSCFLT: W       ;0 NO FAULT
578  %DFRST==100000 ; BIT 15=POWER CYCLED OR UNIBUS HUNG, SO CONTROLLER WAS RESET
579                 ; BIT 12=Q ERROR, BIT 11=CMD NXM, BIT 10=CMD PAR
580                 ; IF ONE OF THESE BITS IS ON, BITS 1-0 AND DSCSTS ARE THE ERROR ADDRESS
581                 ; BITS 7-0 SYSTEM FAULT CODE IF LEFT BYTE IS ZERO
582                 ; SEE THE 2561 OEM MANUAL FOR MEANING OF FAULT CODES
583 DSCSTS: W       ;STATUS FROM 2561:
584  %DSRTR==100000 ;COMMAND WAS RETRIED
585  %DSECH==40000  ;UNCORRECTABLE DATA ERROR (ECC HARD)
586  %DSECC==20000  ;CORRECTED DATA ERROR
587  %DSIDE==10000  ;ID ERROR
588  %DSHCE==4000   ;ADDRESS ERROR (HEADER COMPARE ERROR)
589  %DSPRT==2000   ;WRITE-PROTECT STATUS OF SECTOR (ABORTS WRITE COMMAND)
590  %DSALT==1000   ;ALTERNATE-SECTOR STATUS (ABORTS READ, WRITE, AND CHECK)
591  %DSOVR==400    ;FIFO OVER-RUN, NOT CORRECTED BY 1 RETRY
592  %DSSKE==200    ;SEEK ERROR FROM DRIVE
593  %DSOFL==100    ;DRIVE OFF-LINE OR FAULT
594  %DSFLT==20     ;DRIVE FAULT
595  %DSNXM==10     ;NXM ON PDP11 MEMORY
596  %DSPAR==4      ;PARITY ERROR IN PDP11 MEMORY
597  %DSSFL==2      ;SYSTEM FAULT, SEE LOW BYTE OF DSCFLT
598  %DSWLK==1      ;DRIVE WRITE-LOCKED, WRITE ABORTED
599
600 ;FOLLOWING WORDS ARE WRITTEN BY 10 TO TELL WHAT TO DO
601 DSCCMD: W       ;COMMAND OPCODE:
602  ;%DMNOP==0     ;DO NOTHING
603  ;%DMCST==1     ;READ OUT CONTROLLER STATE (NOT USEFUL SINCE NOT RETURNED TO 10)
604  %DMSNS==2      ;SENSE DRIVE STATE.  DSCSTS GETS CODE FOR DRIVE TYPE IN
605                 ; BITS 14-8 (10 FOR T-300), AND %DSWLK, %DSFLT, %DSOFL, %DSSKE
606  %DMTST==3      ;TEST SPECIFIED DRIVE (RUNS DIAGNOSTICS)
607  %DMREC==4      ;RECALIBRATE
608  %DMSEK==5      ;SEEK
609  %DMWRT==6      ;WRITE DATA
610  ;%DMFMT==7     ;WRITE FORMAT
611  ;%DMPWT==10    ;WRITE AND SET WRITE-PROTECT BIT
612  ;%DMAWT==11    ;WRITE AND SET ALTERNATE-SECTOR BIT
613  ;%DMCHK==12    ;READ AND CHECK ECC BUT DON'T STORE DATA
614  ;%DMLWT==14    ;LONG WRITE, WILL WRITE ECC AS WELL AS DATA
615  %DMRED==20     ;READ DATA.  ADD 1-10 FOR VARIOUS RECOVERY FEATURES AS
616                 ; DOCUMENTED IN THE 2561 OEM MANUAL.
617  ;%DMRID==40    ;READ IF FIELD, NOT USEFUL SINCE NOT RETURNED TO 10
618 DSCDRV: W       ;UNIT NUMBER
619 DSCCYL: W       ;CYLINDER ADDRESS (THESE ARE COPIED BACK BY THE 11 IN CASE OF ERROR)
620 DSCHED: W       ;HEAD ADDRESS
621 DSCSEC: W       ;SECTOR ADDRESS
622 ;WORD COUNT IS ALWAYS 12.*256.
623 ;IF WE PUT IN SEEK-OVERLAP AN ATTENTION FEATURE WILL BE NEEDED
624 ;THAT WOULD ALSO BE USED FOR DISK POWER-UP SIGNALLING
625 ;THESE WORDS ARE SET UP BY THE 10 AS BYTE-POINTERS TO THE DATA
626 ;TO BE TRANSFERRED.  EACH BYTE POINTER CAN TRANSFER AT MOST 256 PDP10 WORDS
627 ;DUE TO BRAIN-DAMAGE IN THE DL10, SO THERE ARE 4 OF THEM
628 DSCPNT: .BLKW 4
629 .ENDC ;T300P
630
631 DLXHGH::
632 .=ZZ
633 .ENDC ;DL10P
634 \f.IFNZ DTE20P
635         .SBTTL DTE20 CONTROL AREA
636
637 ;LOCATIONS 400-437 ARE JUST BETWEEN US AND ITS
638 ;LOCATIONS 440-457 ARE KNOWN ABOUT BY KLDCP ALSO
639
640 ;EPTDDT==441    ;START ADDRESS OF PDP10 NON TIME SHARING DDT
641 DTEFLG==444     ;NON TIME SHARING TYPEIN/TYPEOUT DONE FLAG (SET BY 11, CLEARED BY 10)
642 DTEF11==450     ;USED BY NON TIMESHARING TYPEIN COMMAND TO RETURN THE CHAR (SET BY 11)
643 DTECMD==451     ;NON TIME SHARING COMMAND (SET BY 10)
644 ;COMMANDS THAT CAN GO IN DTECMD:
645  ;0-377 CHAR TO BE TYPED OUT
646  %DTTYI==3400   ;TYPE IN, CHAR RETURNED IN DTEF11
647  %DTCLN==1001   ;60 CYCLE CLOCK ON
648  %DTCLF==1000   ;60 CYCLE CLOCK OFF
649  ;THERE ARE MILLIONS OF OTHERS, BUT WHO NEEDS 'EM?
650 DTECLK==445     ;60 CYCLE CLOCK FLAG (SET BY 11, CLEARED BY 10)
651 ;DTESWR==457    ;SIMULATED SWITCH REGISTER (SET BY 11)
652
653 ;THE FOLLOWING LOCATIONS ARE ONLY USED IN TIME SHARING AND NOT KNOWN ABOUT BY KLDCP
654
655 DTEVER==400     ;I/O VERSION NUMBER.  .BYTE FIRST LINE, NUMBER OF LINES.
656                 ;SET BY 10, CHECKED BY 11
657
658 DTECHK==401     ;INCREMENTED BY 11 60 TIMES PER SECOND, SETOMED BY 10 EVERY 1/2 SECOND
659                 ;USED TO CHECK THAT 10 IS GETTING INTERRUPTS OK
660
661 DTEINP==402     ;CONTROLS "BYTE TRANSFERS" FROM 11 TO 10 (INPUT DIRECTION).
662                 ;SET BY 10 TO REQUEST A TRANSFER, SETOM'ED BY 11 WHEN XFER COMPLETE.
663                 ;10 SHOULD SET UP DTEBPI IN EPT AND DO DATAO DTE, BEFORE SETTING DTEINP.
664                 ;SEE COMMENTS BELOW DTEOUT FOR WHAT GOES IN DTEINP.
665 DTEOUT==403     ;CONTROLS "BYTE TRANSFERS" FROM 10 TO 11 (OUTPUT DIRECTION).
666                 ;SET BY 10 TO REQUEST A TRANSFER, SETOM'ED BY 11 WHEN TRANSFER STARTS.
667                 ;EACH SIDE KNOWS WHEN TRANSFER IS IN PROGRESS, DOESN'T TRY TO START
668                 ; ANOTHER UNTIL IT HAS RECEIVED HARDWARE TRANSFER-DONE INTERRUPT.
669                 ;10 SHOULD SET UP DTEBPO IN EPT BEFORE SETTING DTEOUT.
670                 ;RH IS #BYTES EXPECTED, LH IS COMMAND+LINE#.  COMMANDS ARE:
671  %DTTYO==1000   ;TELETYPE OUTPUT
672  ;%DTETI==2000  ;ETHERNET INPUT
673  ;%DTETO==3000  ;ETHERNET OUTPUT
674  ;^ ADD MORE COMMANDS HERE.   NOTE: THE 4.1 BIT IS 1 FOR OUTPUT, 0 FOR INPUT.
675
676 DTELSP==404     ;LINE# TO SET SPEED OF (SET BY 10, SETOMED BY 11)
677 DTELPR==405     ;DH11 LINE-PARAMETER-REGISTER,,BUFFER SIZE
678
679 DTEOST==406     ;LINE# TO START OUTPUT ON (SET OUTPUT DONE).  (SET BY 10, SETOMED BY 11)
680
681         ;407 NOT USED
682
683 DTETYI==410     ;TELETYPE INPUT
684                 ;LH=LINE#, RH=CHAR RECEIVED.  (SET BY 11, SETOM'ED BY 10)
685
686 DTEODN==411     ;TELETYPE OUTPUT DONE
687                 ;LH=LINE#, RH=BUFFER SIZE.  (SET BY 11, SETOM'ED BY 10)
688
689 DTEHNG==412     ;HANGUP/DIALIN WORD  (SET BY 11, SETOM'ED BY 10)
690                 ;0000NN - LINE # NN HUNG UP
691                 ;01RTNN - LINE # NN HAS SPEED RCV=R, XMT=T (SEE TTYTYP FOR CODES)
692
693 ;^ ADD MORE HERE, NOT TO EXCEED LOCATION 437
694 \f;.IFNZ DTE20P
695
696 ;IOELEVEN RESIDES IN THE BOTTOM 14K OF THE CONSOLE PDP11, ALONG WITH 11DDT.
697 ;I.E. LOCATIONS 0-70000.  BE SURE TO USE .;11DDT 14K VERSION OF DDT.
698 ;THE UPPER 14K CONTAIN KLDCP.  THE FOLLOWING CALLS TO KLDCP ARE USED.
699 ;THEY RETURN WITH C-BIT SET IF THEY LOSE (MICROCODE HUNG).
700
701 ;NOTE: KLDCP ENJOYS CLOBBERING REGISTER 0 (A).  I DON'T
702 ;KNOW IF ALL THESE CALLS DO, BUT WE'LL ASSUME THAT THEY DO.
703
704 TENSW=EMT!145   ;UPDATE LOCATION DTESWR FROM THE SWITCHES
705
706 EXAM=EMT!103    ;EXAMINE PDP10 MEMORY
707  ;BEFORE CALL, REGISTER A HAS ADDRESS OF 3 BYTES CONTAINING PDP10 ADDRESS (LOW BITS FIRST)
708  ;AFTER CALL, REGISTER A HAS ADDRESS OF 3 WORDS CONTAINING CONTENTS (LOW BITS FIRST)
709
710 EXAMT=EMT!104   ;EXAMINE PDP10 MEMORY
711  ;.WORD PDP10-ADDRESS
712  ;.WORD ADDRESS OF 3-WORD DATA BLOCK
713
714 DPOS=EMT!105    ;DEPOSIT PDP10 MEMORY
715  ;BEFORE CALL, REGISTER A HAS ADDRESS OF 3 WORDS CONTAINING CONTENTS
716  ;AND REGISTER B HAS ADDRESS OF 3 BYTES CONTAINING ADDRESS
717
718 DPOST=EMT!106   ;DEPOSIT PDP10 MEMORY
719  ;.WORD PDP10-ADDRESS
720  ;.WORD ADDRESS OF 3-WORD DATA BLOCK
721
722 D10MON=EMT!111  ;DEPOSIT PDP10 MEMORY, -1
723  ;.WORD PDP10-ADDRESS
724
725 $PMSG=EMT!25    ;PRINT MESSAGE ON TTY
726  ;.WORD ADDRESS OF ASCIZ MESSAGE
727
728 $CNTLC=100004   ;JUMP HERE TO "CONTROL C" BACK TO KLDCP
729
730 ;WHEN KLDCP IS IDLE, AND IN "ITS MODE", IT DOES JSR PC,3000
731 ;WHICH CALLS IOELEVEN'S MAIN PROGRAM.  RETURN WITH "C" SET
732 ;TO READ AND EXECUTE ONE KLDCP COMMAND LINE.  RETURN WITH "C"
733 ;CLEAR TO PRINT KL10 HALTED OR CLOCK ERROR STOP MESSAGE.
734 ;LOCATIONS 3004, 3006 MUST CONTAIN .RAD50/IOELEV/
735 ;IOELEV WILL RUN ON KLDCP'S STACK.
736 \f;.IFNZ DTE20P
737 ;INFORMATION ABOUT THE DTE20.
738 ;EXCEPT FOR BYTE TRANSFER, WE USE THE TIME-TESTED SUBROUTINES PROVIDED BY KLDCP.
739
740 ;THE INTERRUPT VECTOR IS AT 774, BUT WE CAN'T USE IT BECAUSE WOULD HAVE
741 ;TO COORDINATE THINGS WITH KLDCP, WHICH IS OBVIOUSLY IMPOSSIBLE.
742
743 DLYCNT=174400   ;2.6-2.7 UNIBUS ADDRESS EXTENSION FOR BYTE TRANSFER DMA
744                 ;1.1-2.5 14-BIT 2'S COMPLEMENT OF NUMBER OF HALF-MICROSECONDS
745                 ;        TO DELAY BETWEEN PI0 INTERRUPTS IN BYTE TRANSFER
746
747 TO10AD=174420   ;ADDRESS (WORD OR BYTE) OF TO-10 BYTE TRANSFER DATA
748
749 TO10BC=174414   ;1.1-2.3 NEGATIVE BYTE COUNT, 2.7 LAST XFER
750                 ;NORMALLY SET BY 10 WITH DATAO DTE,
751                 ;TO10 XFER STARTS WHEN BOTH TO10AD AND TO10BC HAVE BEEN LOADED
752
753 TO11AD=174422   ;ADDRESS (WORD OR BYTE) OF TO-11 BYTE TRANSFER DATA
754
755 TO11BC=174416   ;1.1-2.3 NEGATIVE BYTE COUNT FOR TO-11 BYTE TRANSFER
756                 ;2.5=1 => TO-11 TRANSFER IS 8-BIT BYTES, =0 => 16-BIT WORDS
757                 ;2.6=1 => "ASCIZ" MODE (WHICH WE DON'T USE, OF COURSE)
758                 ;2.7=1 => LAST XFER, UPON COMPLETION INTERRUPT BOTH 10 AND 11
759                 ;   =0 => ONLY INTERRUPT 11.  11 CAN CHANGE TO11AD, TO11BC, CONTINUE.
760                 ;TO11 XFER STARTS WHEN BOTH TO11AD AND TO11BC HAVE BEEN LOADED
761                 ;THE TRANSFER HAPPENS USING DMA (NPR) IN 11, PI LEVEL 0 IN 10.
762
763 STATUS=174434   ;DTE20 STATUS REGISTER
764   ;READS:
765  %STDNI==100000 ;2.7 TO10 XFER DONE WITHOUT ERROR
766  %STERI==20000  ;2.5 TO10 XFER ABORTED BY ERROR
767                 ;2.4 DATA OUT OF DTE RAM IS ALL ZERO (MAINT)
768  %STINV==4000   ;2.3 PDP10 IS INTERRUPTING PDP11
769                 ;2.2 DEPOST OR EXAMINE WORD ONE (MAINT)
770                 ;2.1 PDP11 MEMORY PARITY ERROR IN TO10 XFER
771                 ;1.9 PDP11 IS INTERRUPTING PDP10
772  %STDNO==200    ;1.8 TO11 XFER DONE WITHOUT ERROR
773                 ;1.7 E BUFFER SELECT (MAINT)
774                 ;1.6 TO11 XFER STOPPED DUE TO ZERO BYTE (IN ASCIZ MODE)
775                 ;1.5 TO11 XFER OR PDP10 EXAMINE ENCOUNTERED EBUS PARITY ERROR
776                 ;1.4 1 => RESTRICTED MODE
777                 ;1.3 0 => EXAMINE/DEPOSIT IN PROGRESS, 1 => DONE
778  %STERO==2      ;1.2 TO11 XFER ABORTED BY ERROR
779                 ;1.1 1 => DTE ENABLED TO INTERRUPT PDP11
780   ;WRITES:
781  %STCLI==51000  ;2.6+2.4+2.1 CLEAR TO10 XFER DONE AND ERROR FLAGS
782  %STUNV==2000   ;2.2 CLEAR PDP10 INTERRUPTING PDP11
783  %STINX==400    ;1.9 SET PDP11 INTERRUPTING PDP10
784  %STCLO==121    ;1.7+1.5+1.1 CLEAR TO11 XFER DONE AND ERROR FLAGS
785                 ;1.6 ENABLE INTERRUPTS
786                 ;1.4 DISABLE INTERRUPTS
787
788 DIAG1=174430    ;DIAGNOSTIC WORD 1, INCLUDES FLAGS
789  %D1ERR==4000   ;2.3 KL10 CLOCK ERROR STOP
790  %D1RUN==2000   ;2.2 KL10 RUN INDICATOR (1 IF 11 WANTS 10 TO RUN)
791  %D1HLT==1000   ;2.1 KL10 HALT INDICATOR (1 IF 10 DOES A JRST 4)
792
793 DIAG3=174436    ;DIAGNOSTIC WORD 3, INCLUDES FLAGS
794  %D3BYT==1      ;1.1 WRITING 0 SETS TO10 XFER IN WORD MODE, 1 BYTE MODE
795                 ;THERE'S NOTHING ELSE OF THE SLIGHTEST USE IN THIS REGISTER,
796                 ;SO IT'S OK TO WRITE IT AT ANY TIME.
797 .ENDC ;DTE20P
798 \f
799         .SBTTL LOW CORE
800
801 .IFZ DTE20P             ;IF USING DTE20, THESE ARE SET UP BY KLDCP
802 .=4
803         TRAP4
804         340
805         TRAP10
806         340
807 ;       TRAP14          ;SET UP BY 11DDT
808 ;       340
809 .=20
810         TRAP10  ;IOT
811         340
812         PWRFAL
813         340
814         TRAP10  ;EMT
815         340
816         TRAP10  ;TRAP
817         340
818 .ENDC ;DTE20P
819
820 ;CHAOS NET INTERRUPT VECTORS ARE UNFORTUNATELY NOT IN A REASONABLE ARRAY
821 .IFGE CHAOSP-1
822 .=270
823         .WORD CHS0BK,5_5
824         ;274 IS INTERVAL TIMER
825 .ENDC ;CHAOSP-1
826 .IFGE CHAOSP-2
827 .=230
828         .WORD CHS1BK,5_5
829         ;234 IS INTERVAL TIMER
830 .ENDC ;CHAOSP-2
831 .IFGE CHAOSP-3
832 .=240
833         .WORD CHS2BK,5_5
834         ;244 IS INTERVAL TIMER  
835 .ENDC ;CHAOSP-3
836 .IFGE CHAOSP-4
837         .ERROR WHERE DOES THE FOURTH CHAOSNET INTERRUPT VECTOR GO?
838 .ENDC ;CHAOSP-4
839
840 .IFNZ ETHERP
841 .=400
842         ETHOBK
843         5_5
844         ETHIBK
845         5_5
846         ETHOBK  ;COLLISION
847         5_5
848 .ENDC ;ETHERP
849
850 .IFNZ T300P
851 .=254
852         DSKBRK
853         240     ;BR5
854 .ENDC ;T300P
855
856 .=300
857 .REPT NDMS      ;DM11s go in floating vectors
858 CONC DM,\.RPCNT+1,BRK
859         240     ;INTERRUPTS ON BR4 BUT WE MASK TO BR5 ANYWAY
860 .ENDR ;NDMS
861
862 .IFNZ NDLS
863 .=60
864         DL1IBK  ;FIRST DL11 LINE IS PDP11'S CONSOLE TTY, DIFFERENT ADDRESS
865         240     ;AGAIN INTERRUPTS ON BR4 BUT MASK TO BR5 SO CAN USE DH11 ROUTINES W/O FEAR
866         DL1OBK
867         240
868 .ENDC ;NDLS
869 .=310   
870 .REPT NDLS-1    ;DL11S AFTER THE FIRST ARE IN FLOATING VECTORS
871 CONC DL,\.RPCNT+2,IBK
872         240
873 CONC DL,\.RPCNT+2,OBK
874         240
875 .ENDR
876
877 .=DHIBAS        ;DON'T RELY ON RANDOM FLOATING VECTOR TO
878                 ;COME OUT RIGHT, E.G. IF THERE IS A DL11
879                 ;THERE WHICH WE AREN'T USING.
880 .REPT NDHS              ;DH11S ARE IN FLOATING VECTOR AFTER DL11[E]S
881 CONC DH,\.RPCNT+1,IBK   ;DH11 #n RECEIVE
882         240
883 CONC DH,\.RPCNT+1,OBK   ;DH11 #n TRANSMIT & ERROR
884         240
885 .ENDR ;NDHS
886 .=100
887         CLKBRK  ;KW11-L 60-CYCLE CLOCK
888         300     ;ON BR6
889
890 .IFNZ GOULDP
891 .=174
892         GLPBRK
893         300     ;BR5 BUT NEED TO LOCK OUT CLOCK SO MASK 6
894 .ENDC ;GOULDP
895
896 .IFG NMPTYS
897 .=56
898 MPXENB::0       ;NONZERO TO ENABLE MULTISCHLUNKER
899 .ENDC
900
901 .IFZ DTE20P     ;IF DTE20, KLDCP SUPPLIES THE STACK
902 .=1000
903 STKBAS::
904         JMP INIT                ;START AT 1000 IS CONVENTIONAL
905 .IFF ;DTE20P
906 .=3000          ;ENTRY VECTOR
907         JMP @#INIT
908 SADR=.-2                ;ARG OF THE JMP@# IS CHANGED AFTER INITIALIZATION
909         .RAD50 /IOELEV/
910 .ENDC ;DTE20P
911 \f
912         .SBTTL TEN-11 CHAOSNET COMMUNICATION AREA
913
914 .IFNZ TEN11P
915 T11BFL==8+<2*PKTMXW>            ;BYTE LENGTH OF A PACKET BUFFER
916                                 ;FIRST 8 BYTES ARE BUFFER-FULL FLAG AND CKSM
917 .IIF NE T11BFL-<<T11BFL/4>*4>, .ERROR T11BFL NOT MULTIPLE OF 4
918
919 .IIF NE .-1004, .ERROR CHAOSNET TEN-11 COMMUNICATION AREA NOT AT RIGHT ADDRESS
920
921 ;THIS AREA IS SHARED WITH THE PDP10 VIA TEN-11 INTERFACE.
922
923         .WORD "CH,1     ;ERROR CHECK AND VERSION NUMBER
924 T11I10: .WORD 0,0       ;SET NON-ZERO BY 11 TO REINITIALIZE 10
925 T11I11: .WORD 0,0       ;SET NON-ZERO BY 10 TO REINITIALIZE 11
926         .WORD T11BFL,NT11BF     ;BUFFER SIZE, NUMBER OF BUFFERS
927         .BLKW 8         ;SPARE WORDS
928 T11OBF: .BLKB T11BFL*NT11BF     ;TO-10 BUFFERS
929  T11OBE==.      ;END OF TO-10 BUFFERS
930 T11IBF: .BLKB T11BFL*NT11BF     ;FROM-10 BUFFERS
931  T11IBE==.      ;END OF FROM-10 BUFFERS
932 ;THE FIRST 32-BIT WORD OF A BUFFER IS 0 IF IDLE, OR
933 ;NON-ZERO IF BUFFER IS TO BE SENT TO OTHER MACHINE.
934 ;THE SECOND 32-BIT WORD IS THE CHECKSUM, WHICH IS
935 ;COMPUTED BY ADDING ALL THE 32-BIT WORDS, IGNORING OVERFLOW,
936 ; AND LOGICALLY SHIFTING RIGHT ONE BIT AFTER EACH ADD; BITS SHIFTED
937 ; OUT ON THE RIGHT ARE BROUGHT BACK IN ON THE LEFT.
938 ;IF THE NUMBER OF 16-BIT WORDS IS ODD, THE LEFT-OVER ONE BETTER BE 0.
939 .ENDC ;TEN11P
940 \f
941         .SBTTL CONFIGURATION
942
943 ; TABLES INDEXED BY H (PER HARDWARE UNIT)
944
945 .MACRO DHTE AD          ;DH11 REGISTER ADDRESS GENERATOR
946 .REPT NDHS
947  <AD>+<20*.RPCNT>
948 .ENDR
949 .ENDM
950
951 .MACRO DLTE AD          ;DL11 REGISTER ADDRESS GENERATOR, FIRST IS WIERD
952 .IFNZ NDLS
953         177560+<<AD>&7>
954 .REPT NDLS-1
955         <AD>+<10*.RPCNT>
956 .ENDR
957 .ENDC ;NDLS
958 .ENDM
959
960 .MACRO DMTE AD  ;DM11 register address generator
961   .REPT NDMS
962     <AD>+<10*.RPCNT>    ;a DM11 eats 8 locations
963   .ENDR
964 .ENDM
965
966 DMCSR:  DMTE 170500     ;first DM11 is at 170500
967
968 DMLSR:  DMTE 170502     ;selected line status at 170502
969
970 DHSCR:  DHTE DHCBAS     ;SYSTEM CONTROL REGISTER
971                         ;1.1-1.4 LINE NUMBER
972                         ;1.5-1.6 MEMORY ADDRESS EXTENSION
973  DHRENB==100            ;1.7 RECEIVER INTERRUPT ENABLE
974                         ;1.8 RECEIVER INTERRUPT
975                         ;1.9 CLEAR NXM FLAG
976                         ;2.1 MAINTENANCE MODE
977  DHSNXM==2000           ;2.2 NXM FLAG (GENERATES XMT INTERRUPT)
978                         ;2.3 MASTER CLEAR
979  DHSENB==10000          ;2.4 STORAGE SILO FULL INTERRUPT ENABLE
980  DHTENB==20000          ;2.5 TRANSMITTER & NXM INTERRUPT ENABLE
981                         ;2.6 STOARGE FULL INTERRUPT
982  DHTDON==100000         ;2.7 TRANSMITTER DONE INTERRUPT
983
984 DLKS==DHSCR
985         DLTE 175610     ;KEYBOARD STATUS REGISTER
986                         ;1.1 PAPER TAPE READER ENABLE (WO)
987                         ;1.2 DATA TERMINAL READY (RW)
988                         ;1.3 REQUEST TO SEND (RW)
989                         ;1.4 SECONDARY TRANSMIT DATA [OR MAKE BUSY] (RW)
990                         ;1.5 UNUSED
991                         ;1.6 DATASET INTERRUPT ENABLE (RW)
992                         ;1.7 RECEIVE INTERRUPT ENABLE (RW)
993                         ;1.8 RECEIVE DATA READY (RO)
994                         ;1.9 UNUSED
995                         ;2.1 UNUSED
996                         ;2.2 SECONDARY RECEIVE DATA (RO)
997                         ;2.3 RECEIVE ACTIVE (RO)
998                         ;2.4 CARRIER DETECT (RO)
999                         ;2.5 CLEAR TO SEND (RO)
1000                         ;2.6 RING INDICATOR (RO)
1001                         ;2.7 DATASET STATUS CHANGE (RO)
1002
1003 DHNRC:  DHTE DHCBAS+2   ;NEXT RECEIVED CHARACTER
1004                         ;1.1-1.8 THE CHARACTER
1005                         ;1.9-2.3 LINE NUMBER
1006  %DXPAR==10000          ;2.4 CHAR HAS WRONG PARITY
1007  %DXBRK==20000          ;2.5 FRAMING ERROR (BREAK)
1008  %DXOVR==40000          ;2.6 OVERRUN, PREVIOUS CHARS LOST
1009                         ;2.7 1 => THIS WORD VALID
1010 DLKB==DHNRC
1011         DLTE 175612     ;KEYBOARD INPUT REGISTER
1012                         ;1.1-1.8 RECEIVED DATA
1013                         ;2.4 PARITY ERROR (RO)
1014                         ;2.5 FRAMING ERROR (RO)
1015                         ;2.6 OVERRUN (RO)
1016                         ;2.7 OR OF ERROR BITS (RO)
1017 \f
1018 DHLPR:  DHTE DHCBAS+4   ;LINE PARAMETER REGISTER
1019                         ;1.1-1.2 CHARACTER LENGTH 0=5, 1=6, 2=7, 3=8 (PARITY BIT EXTRA)
1020                         ;1.3 1 => EXTRA STOP BIT
1021                         ;1.5 ENABLE PARITY
1022                         ;1.6 0 -> EVEN PARITY, 1 => ODD
1023                         ;1.7-2.1 RECEIVER SPEED
1024                         ; 0 OFF, 1 50, 2 75, 3 110, 4 134.5, 5 150, 6 200, 7 300
1025                         ; 10 600, 11 1200, 12 1800, 13 2400, 14 4800, 15 9600, 16 A, 17 B
1026                         ;2.2-2.5 TRANSMITTER SPEED, SAME CODES AS RECEIVER
1027                         ;2.6 HALF DUPLEX
1028                         ;2.7 ECHOPLEX
1029
1030 DHCA:   DHTE DHCBAS+6   ;CURRENT ADDRESS
1031 DLCA==DHCA
1032         .IREPT NDLS,0
1033
1034 DHBC:   DHTE DHCBAS+10  ;BYTE COUNT (MINUS)
1035 DLBC==DHBC
1036         .IREPT NDLS,0   ;POSITIVE FOR DLS
1037
1038 DHBAR:  DHTE DHCBAS+12  ;BUFFER ACTIVE REGISTER
1039                         ;BIT = 1 IF XMT ACTIVE ON CORRESP LINE, NUMBERED RIGHT TO LEFT
1040 DLPS==DHBAR
1041         DLTE 175614     ;PRINTER STATUS
1042                         ;1.1 SEND BREAK (RW)
1043                         ;1.3 LOOP BACK (RW)
1044                         ;1.6 INTERRUPT ENABLE (RW)
1045                         ;1.7 TRANSMITTER READY (RO)
1046
1047 DHBCR:  DHTE DHCBAS+14  ;BREAK CONTROL REGISTER
1048                         ;BIT = 1 => SEND BREAK ON CORRESP LINE, NUMBERED RIGHT TO LEFT
1049 DLPB==DHBCR
1050         DLTE 175616     ;PRINTER BUFFER
1051                         ;1.1-1.8 DATA TO TRANSMIT
1052
1053 DHSSR:  DHTE DHCBAS+16  ;SILO STATUS REGISTER
1054                         ;1.1-1.6 SILO ALARM LEVEL
1055                         ;1.7-1.8 READ EXTENDED ADDRESS (R.O.)
1056                         ;1.9-2.5 SILO FILL LEVEL (R.O.)
1057                         ;2.7 MAINTENANCE PATTERN (W.O.)
1058
1059 DHOAC:  .IREPT NDHS,0   ;BIT ON IF SOFTWARE THINKS LINE'S TRANSMITTER IS ACTIVE
1060 DLOAC==DHOAC
1061         .IREPT NDLS,0   ;NON-ZERO IF LINE'S TRANSMITTER IS ACTIVE
1062
1063 DHTYNO: .IREPT NDHS, NFDHTY+<32.*.RPCNT>        ;TTY INDEX OF FIRST LINE ON THIS DH11
1064 DLTYNO==DHTYNO
1065 .IIF NZ CTYP,0          ;TTY INDEX OF LINE ON THIS DL11
1066 .IREPT NDLS-CTYP,NFDLTY+<2*.RPCNT>
1067
1068 STROUT: .IREPT NDHS, STRDH      ;OUTPUT-START ROUTINES
1069         .IREPT NDLS, STRDL
1070 .IIF NZ NMPTYS, STRMPK
1071 \f
1072         .BLKB NFTTY     ;AVOID LABEL OVERLAPPAGE
1073
1074 ;TABLES INDEXED BY I (PER LINE)
1075
1076 T HDWR:                 ;HARDWARE UNIT INDEX, GOES IN H
1077 .IIF NZ CTYP, NFDLHX
1078         .REPT NDHS
1079          ZZ==.RPCNT*2
1080          .REPT 16.
1081           ZZ            ;16 LINES ON EACH DH-11
1082          .ENDR
1083         .ENDR
1084         .=.-<2*NDHUN>
1085 .IREPT NDLS-CTYP,NFDLHX+<2*.RPCNT>+<2*CTYP>
1086 .IREPT NMPTYS,  MPKHWR          ;MULTIPLEXOR-KLUDGE TTYS
1087
1088 T DHLSEL:               ;DH11 LINE SELECT WORDS
1089 .IIF NZ CTYP,   0               ;NONE FOR CTY
1090         .REPT NDHS
1091          .REPT 16.
1092           DHTENB+DHRENB+.RPCNT
1093          .ENDR
1094         .ENDR
1095
1096 T DHLBIT:               ;BIT CORRESPONDING TO THIS LINE IN DHBAR, ETC.
1097 .IIF NZ CTYP,   0               ;NONE FOR CTY
1098         .REPT NDHS
1099          .REPT 16.
1100           1_.RPCNT
1101          .ENDR
1102         .ENDR
1103
1104 T BUFPNT:               ;BUFFER POINTERS
1105         .IREPT NCT, BUFFRS+<.RPCNT*MAXBSZ>
1106
1107 T BUFSIZ:               ;BUFFER SIZES (I.E. AMOUNT TO USE AT CURRENT SPEED)
1108         .REPT NCT
1109          0              ;SET DURING INITIALIZATION
1110         .ENDR
1111
1112 T NRMIPC:               ;NORMAL INPUT CHARACTER PROCESSING ROUTINES
1113 .IIF NZ CTYP, RCV       ;CTY NORMAL INPUT
1114         .REPT 16.*NDHS
1115          DHNRMI         ;DH11 TTY NORMAL INPUT
1116         .ENDR
1117         .=.-<2*NDHUN>
1118 .IREPT NDLS-CTYP,RCV    ;DL11 NORMAL INPUT
1119 .IREPT NMPTYS,  RCV     ;NORMAL INPUT FOR TTYS ON MULTIPLEXOR-KLUDGE
1120 .IIF NE .-NRMIPC-NLTTY, .ERROR BARF AT NRMIPC
1121 .IFNZ NMPTYS
1122         .=NRMIPC+MPXIDX
1123         MPXINP          ;INPUT FROM THE MULTIPLEXED LINE IS SPECIAL
1124         .=NRMIPC+NLTTY
1125 .ENDC
1126
1127 T TTYIPC:               ;CURRENT INPUT CHAR PROCESSING ROUTINES
1128         .BLKW NCT       ;SET UP AT INIT TIME
1129 .IIF NE .-TTYIPC-NLTTY, .ERROR BARF AT TTYIPC
1130
1131 T AUTOSP:               ;IF NON-ZERO, LINE GOES INTO AUTOSPEED WHEN DIALED UP
1132         .REPT NCT       ;IF MINUS ALSO WHEN BREAK SEEN
1133          ZZ===.
1134          ASPIRP ^\
1135           .IIF EQ .RPCNT+<NFTTY/2>-N,+1 ;THIS LINE AUTOSPEED ON DIALUP
1136           .IIF EQ .RPCNT+<NFTTY/2>+N,-1 ;ALSO ON BREAK
1137           \
1138          .IIF EQ .-ZZ, 0        ;THIS LINE NOT AUTOSPEED
1139         .ENDR
1140 .IIF NE .-AUTOSP-NLTTY, .ERROR BARF AT AUTOSP
1141 \f
1142 .IFM MX
1143 M2LMAP:                 ;MAP FROM DM11-BB CHANNEL NUMBERS TO TTY INDICES
1144         2*1             ;0 T01
1145         0               ;1 NONE
1146         0               ;2 NONE
1147         2*4             ;3 T04
1148         2*5             ;4 T05
1149         2*6             ;5 T06
1150         2*7             ;6 T07
1151         2*10            ;7 T10
1152         2*11            ;10 T11
1153         2*12            ;11 T12
1154         2*13            ;12 T13
1155         2*14            ;13 T14
1156         2*15            ;14 T15
1157         2*16            ;15 T16
1158         2*17            ;16 T17
1159         0               ;17 NONE
1160         2*21            ;20 T21
1161         2*22            ;21 T22
1162         2*23            ;22 T23
1163         2*24            ;23 T24
1164         2*25            ;24 T25
1165         2*26            ;25 T26
1166         2*27            ;26 T27
1167         2*30            ;27 T30
1168         2*31            ;30 T31
1169         2*32            ;31 T32
1170         2*33            ;32 T33
1171         2*34            ;33 T34
1172         2*35            ;34 T35
1173         2*36            ;35 T36
1174         2*37            ;36 T37
1175         2*40            ;37 T40
1176 .ENDC ;MX
1177
1178 .IIF NE NDMS, .IIF NE .-M2LMAP-<40*NDMS>, .ERROR Too few M2LMAP entries for DM11s.
1179
1180 .IFNZ NDMS
1181
1182 T DIALED:               ;0 IF LINE NOT DIALED UP (OR NO MODEM CONTROL ON THIS LINE)
1183         .REPT NCT       ;+ IF DIALED UP (CLEAR TO SEND IS ON)
1184          0              ;- IF CLEAR TO SEND DROPPED, INC EACH TICK, REACHES 0 => HUNG UP
1185         .ENDR
1186
1187 .ENDC ;NDMS
1188
1189 T TTYHNG:               ;DIALUP/HANGUP STATUS WAITING TO BE SENT TO 10 (0 IF NONE)
1190         .REPT NCT
1191         0
1192         .ENDR
1193
1194 T TYPING:               ;POSITIVE IF LINE IS TYPING OUT FOR 10
1195         .REPT NCT       ; WHICH MEANS -10 SHOULD BE INFORMED WHEN TYPEOUT IS FINISHED
1196          0              ;0 FOR NO -10 TYPEOUT, MINUS TO SEND <CALL> AFTER TYPEOUT
1197         .ENDR
1198
1199 ;MISC VARIABLES
1200
1201 DLXOFF: -1              ;NON-ZERO IF DL10 PORT TURNED OFF BY 10
1202 NO.ITS: -1              ;NON-ZERO IF HAVEN'T ESTABLISHED COMMUNICATION WITH ITS YET
1203 VERSN:  .BYTE NFTTY/2,NCT       ;I/O VERSION NUMBER
1204 DMINI:  0               ;NON-ZERO => MODEM SCANNER JUST TURNED ON, GETTING INITIAL STS
1205 WAKE:   0               ;CLOCK INTERRUPT WAKE UP MAIN PROGRAM FLAG
1206 HNGSIG: 0               ;NUMBER OF NON-ZERO TTYHNG WORDS
1207 10RQ:   0               ;LIGHT HACKS
1208 LITHSE: 7
1209 .IFNZ DTE20P
1210 CLKENB: 0               ;KL10 WANTS 11 TO RELAY CLOCK INTERRUPTS
1211 KLDCPF: 0               ;NON-ZERO => USER WANTS TO GIVE A COMMAND TO KLDCP
1212 DDTMOD: 0               ;NON-ZERO => DDT MODE TTY INPUT
1213 DDTCHR: -1              ;NON-NEGATIVE => CHAR TYPED FOR DDT
1214 CURSWR: 52525           ;LAST SWITCHES SENT TO -10
1215 OUTCMD: 0               ;0 IF OUTPUT TRANSFER IDLE
1216                         ;ELSE CURRENT COMMAND / 400
1217 OUTSVI: -1              ;LINE# OF CURRENT OUTPUT TRANSFER
1218 OUTSVC: -1              ;#BYTES OF CURRENT OUTPUT TRANSFER
1219 INPCMD: 0               ;0 IF INPUT TRANSFER IDLE
1220                         ;ELSE CURRENT COMMAND / 400
1221 INPSVI: -1              ;LINE# OF CURRENT INPUT TRANSFER
1222 INPSVC: -1              ;#BYTES OF CURRENT INPUT TRANSFER
1223 .ENDC ;DTE20P
1224 .IFNZ NMPTYS
1225 MPXOAC: 0               ;0 IDLE, -1 SENDING HEADER, 1 SENDING DATA
1226 MPXOLN: 0               ;2 x MPXK# OUTPUTTING FOR
1227 MPXSEL: NFMPTY          ;TTY INDEX SELECTED FOR MPX INPUT
1228 MPXPNT: .IREPT NMPTYS,0 ;POINTER TO CRUFT TO SEND TO EACH MPXED LINE
1229 MPXNBT: .IREPT NMPTYS,0 ;# BYTES TO SEND, 0 IF IDLE
1230 MPXHED: .BYTE 0,0       ;MPX OUTPUT HEADER: 200+MPXK#, BYTE COUNT
1231 .ENDC ;NMPTYS
1232 \f
1233         .SBTTL CHAOSNET VARIABLES & TABLES
1234
1235 .IFNZ CHAOSP
1236
1237 NSUBNT==80.     ;MAXIMUM CAPACITY 80. SUBNETS
1238
1239 .IFNZ DL10P     ;DL10 UNSHARED
1240 DLCRBN: 0       ;CURRENT RECEIVE (11 to 10) BUFFER (0 OR 2)
1241 DLCNXT: .WORD 2,0       ;FOR SWITCHING BUFFERS
1242 DLCIBF: .BLKW PKMAX     ;DL10 INPUT BUFFER
1243 .ENDC ;DL10P
1244
1245 .IFNZ TEN11P    ;TEN11 UNSHARED
1246 T11OBP: T11OBF  ;NEXT BUFFER TO 10
1247 T11IBP: T11IBF  ;NEXT BUFFER FROM 10
1248 T11IBA: 0       ;NON-ZERO MEANS INPUT BUFFER ACTIVE, T11IBP NEEDS ADVANCING
1249                 ;THIS IS SEPARATE FROM CHISTS+CHXT11 FOR GOOD REASONS
1250 T11CKE: 0       ;COUNT OF TEN-11 CHECKSUM ERRORS
1251 T11TIM: 0       ;TIMEOUT ON TRANSMISSION OF PACKET TO 10
1252 .ENDC ;TEN11P
1253
1254 .IFNZ ETHERP
1255 ETHSBN==2       ;SUBNET WHICH IS THE ETHERNET
1256 .SEE ETHHSN     ;MY HOST NUMBER BYTE (DEFINED IN MACHINE CONFIGURATION AREA)
1257 ETHMXH==15.-1   ;MAXIMUM NUMBER OF HOPS (-1 => BUG IN XEROX PROGRAMS)
1258 ETHIBF: .BLKW PKTMXW+1  ;INPUT FROM ETHERNET BUFFERED HERE (+1 HARDWARE BUG?)
1259 ETHHDW==PKHDW-2 ;ALLOW FOR OVERLAP OF CHAOSNET HEADER AND 2-WORD ETHERNET HEADER
1260                 ;THIS IS THE OFFSET (IN WORDS) WHERE THE ETHERNET PACKET STARTS
1261
1262 ;HERE IS A PACKET USED TO BUILD THE ETHERNET BROADCAST GATEWAY INFO.  WHAT A CROCK.
1263 EGTBUF: .BLKW PKHDW     ;SPACE FOR CHAOSNET HEADER
1264 EGTPLN: 0               ;PUP LENGTH
1265         201             ;PUP TYPE 201
1266 EGTPID: .WORD 0,0       ;PUP IDENTIFIER
1267         0               ;DESTINATION (BROADCAST)
1268         .WORD 0,2       ;DEST SOCKET 2
1269 EGTSRC: .BYTE ETHHSN,ETHSBN     ;SOURCE (ME)
1270         .WORD 0,2       ;SOURCE SOCKET 2
1271 EGTSBN: ;; FOR EACH SUBNET, .BYTE GATE-NET, TARGET-NET, HOP-COUNT, GATE-HOST
1272         .BLKW 2*NSUBNT
1273         0               ;PUP CHECKSUM
1274
1275 .IF DF NDVRBF
1276 DVRHST: 0                       ;ZERO IF IDLE, OR FOREIGN HOST USING
1277 DVRIDX: 0                       ;FOREIGN INDEX
1278 DVRLIX: 0                       ;LOCAL INDEX (AOS EACH TIME)
1279 DVRTIM: 0                       ;COUNTS UP TO IDLE THE FOREIGN HOST
1280 DVRRTR: 0                       ;COUNTS UP FOR RETRANSMISSION
1281
1282 DVRBFL==2*<PKHDW+10.+<DATMAX/2>+1> ;NUMBER OF BYTES IN A DOVER BUFFER (HOLDS PUP IN CHAOSNET PACKET)
1283 DVRBUF: .BLKB DVRBFL*NDVRBF     ;RING OF BUFFERS HERE
1284 DVRBF2: .BLKW PKHDW+2           ;BUFFER FOR SENDING STS/OPN/CLS BACK (ALSO END OF RING)
1285 DVRBFP: DVRBUF                  ;POINTER TO NEXT BUFFER TO GO OUT TO DOVER
1286 DVRMSK: 0                       ;MASK OF WHICH BUFFERS CONTAIN PACKETS (MSB = DVRBFP PKT)
1287  .IIF GT NDVRBF-16., .ERROR NDVRBF MAXIMUM OF 16. ALLOWED
1288 DVRPKP: 0                       ;IF NON-ZERO, POINTER TO SPECIAL PACKET TO SEND
1289 DVRID:  0                       ;ID FOR NEXT PACKET EXPECTED BY DOVER, THIS PACKET IS OR
1290                                 ; WILL BE IN THE BUFFER DVRBFP POINTS AT
1291 DVROFS: 0                       ;ID OFFSET, SUBTRACT FROM CHAOS ID TO GET PUP ID
1292 NDVRFK: 0       ;*** TEMPORARY KLUDGE ***
1293 .ENDC ;NDVRBF
1294 .ENDC ;ETHERP
1295
1296 PULSAR: 0       ;COUNTS DOWN TO 0 THEN TRIGGERS TRANSMISSION OF A "TEST MESSAGE"
1297 PULSON: FTPULS  ;IF THIS IS NON-ZERO, FEATURE IS ENABLED, VALUE IS TICKS BETWEEN PULSES
1298 USECBL: 0       ;IF NON-ZERO, 10 TALKING TO SELF STILL GOES THROUGH CABLE
1299
1300 NCHX==DL10P+TEN11P+CHAOSP+<2*ETHERP> ;NUMBER OF ENTRIES IN SOURCE AND SINK TABLES
1301 .IIF DF NDVRBF, NCHX==NCHX+1
1302
1303 ;METERS ETC.
1304 .IFNZ FTGARB
1305 CHSGBF: .BLKW PKMAX     ;HOLDS LAST PACKET THAT CAME IN WITH A CHECKSUM ERROR
1306 CHSGBH: 0               ;UNIBUS ADDRESS OF INTERFACE THAT ABOVE CAME IN ON
1307 CHSGBS: 0               ;STATUS REGISTER THAT GOES WITH ABOVE
1308 CHSGBC: 0               ;BIT COUNT THAT GOES WITH ABOVE
1309 .ENDC ;FTGARB
1310
1311 ;FOLLOWING HAVE SEPARATE ENTRIES FOR EACH CABLE
1312 NPKSGB: .IREPT CHAOSP+ETHERP,0  ;COUNTS THE NUMBER OF PACKETS RECEIVED WITH CHECKSUM ERRORS
1313 HPKSGB: .IREPT CHAOSP+ETHERP,0  ;HIGH-ORDER WORD OF COUNTER
1314 NPKSRL: .IREPT CHAOSP+ETHERP,0  ;COUNTS THE NUMBER OF PACKETS RAM LOST,
1315                         ; I.E. DIDN'T COME IN WITH A CHECKSUM ERROR BUT AFTER
1316                         ; READING IT OUT HAD ONE.  EITHER THE PACKET WAS THE
1317                         ; WRONG LENGTH, OR THE RAM IS LOSING, OR HARDWARE
1318                         ; CLOBBERAGE.  FOR ETHERNET IS PUP CKSM ERR COUNT
1319                         ;THIS WORD ALSO IS WHERE BIT COUNT ERRORS WOULD END UP
1320 HPKSRL: .IREPT CHAOSP+ETHERP,0  ;HIGH-ORDER WORD OF COUNTER
1321 CHSRLH: 0               ;UNIBUS ADDRESS OF INTERFACE THAT ABOVE LAST HAPPENED ON.
1322 CHSRLC: 0               ;RESIDUAL BIT COUNT FOR ABOVE
1323 NPKSLS: .IREPT CHAOSP,0 ;NUMBER OF PACKETS LOST ACCORDING TO LOSS COUNT IN HARDWARE
1324 HPKSLS: .IREPT CHAOSP,0 ;HIGH-ORDER WORD OF COUNTER
1325 NPKSAB: .IREPT CHAOSP+ETHERP,0  ;NUMBER OF TRANSMISSIONS ABORTED (BY COLLISION OR RECEIVE-BUSY)
1326 HPKSAB: .IREPT CHAOSP+ETHERP,0  ;HIGH-ORDER WORD OF COUNTER
1327 NPKSI:  .IREPT NCHX,0   ;TOTAL NUMBER OF PACKETS IN ON EACH SOURCE
1328 HPKSI:  .IREPT NCHX,0   ;HIGH-ORDER WORD OF COUNTER
1329 NPKSO:  .IREPT NCHX,0   ;TOTAL NUMBER OF PACKETS OUT ON EACH SINK
1330 HPKSO:  .IREPT NCHX,0   ;HIGH-ORDER WORD OF COUNTER
1331 NPKSIG: 0               ;NUMBER OF PACKETS IGNORED AT CHIFLS
1332 NPKSBD: .IREPT NCHX,0   ;NUMBER OF PACKETS BAD AT CHSIHB
1333 HPKSBD: .IREPT NCHX,0   ;HIGH-ORDER WORD OF COUNTER
1334 NPKSRF: 0               ;NUMBER OF PACKETS FOR WHICH ROUTING FAILED
1335 RFSBNT: -1              ;2* SUBNET# OF LAST ROUTING FAILURE
1336
1337 ;"INTERFACE ADDRESSES"
1338 ; A NEGATIVE INTERFACE ADDRESS IS THE UNIBUS ADDRESS OF A CHAOS INTERFACE.
1339 ; A ZERO INTERFACE ADDRESS MEANS THE DL10
1340 ; A POSITIVE INTERFACE ADDRESS MEANS THE TEN-11, VALUE BETTER BE OCTAL 1011.
1341
1342 CHSIBF: .BLKW PKMAX*CHAOSP      ;INPUT BUFFER FOR PACKETS IN FROM CHAOS HDWR
1343
1344 ;THIS IS WHAT IS SENT BACK IN RESPONSE TO RFC TO "STATUS".
1345 ;FOR NOW, JUST THE NAME OF THE MACHINE.
1346 HSTNAM:
1347 .ENDC ;CHAOSP    ;FUCK A DOG, PALX!
1348 .IFM MX-DL
1349         .ASCII \MX-IO/11\
1350 .ENDC
1351 .IFM AI
1352         .ASCII \AI-CHAOS-11\
1353 .ENDC
1354 .IFNZ CHAOSP     ;FUCK A DOG, PALX!
1355 .IIF GE .-HSTNAM-32., .ERROR HSTNAM TOO LONG
1356 .IREPT 32.-<.-HSTNAM>, .BYTE 0  ;PAD ON THE RIGHT WITH 0'S
1357 \f
1358 ;CHAOSNET INPUT SOURCE AND OUTPUT SINK TABLES
1359
1360         ;NOTE WELL, THE CODE RELIES ON THE ORDER OF THESE INDICES
1361 .IIF NZ DL10P, CHXDLC==0        ;DL10 INDEX
1362 .IIF NZ TEN11P, CHXT11==2*DL10P ;TEN11 INDEX
1363 CHXCHS==2*<DL10P+TEN11P> ;FIRST CHAOS INDEX
1364 .IIF NZ ETHERP, CHXETH==CHXCHS+<2*CHAOSP> ;ETHERNET INDEX
1365 .IIF NZ ETHERP, CHXEGT==CHXETH+2        ;ETHERNET GATEWAY-INFO-BROADCAST KLUDGE INDEX
1366 .IIF DF NDVRBF, CHXDVR==CHXEGT+2        ;DOVER PROTOCOL TRANSLATOR
1367 .MACRO CHXCHK TAG
1368 .IIF NE .-TAG-NCHX-NCHX, .ERROR TAG WRONG LENGTH TABLE
1369 .ENDM CHXCHK
1370
1371 ;CHAOSNET INPUT SOURCE TABLES
1372
1373 CHIBFP:         ;BUFFER POINTER
1374 .IIF NZ DL10P,  DLCIBF  ;DL10 INPUT BUFFER
1375 .IIF NZ TEN11P, 0       ;CURRENT TEN11 INPUT BUFFER (SET FROM T11IBP+8)
1376 .IREPT CHAOSP,  CHSIBF+<PKMAX*2*.RPCNT> ;CHAOS INPUT BUFFER
1377 .IIF NZ ETHERP, ETHIBF  ;ETHERNET
1378 .IALSO          EGTBUF  ;..
1379 .IIF DF NDVRBF, 0       ;CURRENT DOVER BUFFER, COULD BE CHAOS OR PUP
1380 CHXCHK CHIBFP
1381
1382 CHIHDL: .IREPT NCHX, 0  ;LENGTH OF HEADER IN WORDS, PACKET CURRENTLY IN BFR
1383
1384 CHISTS: .IREPT NCHX, 0  ;STATUS (0 IDLE, +1 HAS INPUT, -1 BEING OUTPUT)
1385
1386 CHILNG: .IREPT NCHX, 0  ;LENGTH OF CONTAINED PACKET IN WORDS
1387
1388 CHIOUX: .IREPT NCHX, 1  ;DESTINATION OUTPUT SINK INDEX  (-1 IF DIRECTED TO PDP11 ITSELF)
1389
1390 CHICBA: .IREPT NCHX, 0  ;DESTINATION CABLE ADDRESS
1391
1392 CHIRFL:         ;ADDRESS OF REFILL ROUTINE
1393 .IIF NZ DL10P,  DLCRFL
1394 .IIF NZ TEN11P, T11RFL
1395 .IREPT CHAOSP,  CHSRFL
1396 .IIF NZ ETHERP, ETHRFL  ;ETHERNET
1397 .IALSO          CPOPJ   ;..
1398 .IIF DF NDVRBF, DVRRFL
1399 CHXCHK CHIRFL
1400
1401 CHIHWR:         ;POINTER TO HARDWARE
1402 .IIF NZ DL10P,  1       ;NOT USED
1403 .IIF NZ TEN11P, 3       ;NOT USED
1404 .IREPT CHAOSP,  CAICSR+<400*.RPCNT>     ;QUAD-CHAOS INTERFACES HAVE TO BE 200 APART
1405 .IIF NZ ETHERP, 164200                  ;AND WE MAKE IT 400 BECAUSE ETHERNET GETS IN WAY
1406 .IALSO          5       ;NOT USED
1407 .IIF DF NDVRBF, 7       ;NOT USED
1408
1409 ;CHAOSNET OUTPUT SINK TABLES
1410
1411 CHOHWR==CHIHWR  ;POINTER TO HARDWARE
1412
1413 CHOSTS: .IREPT NCHX, 0  ;STATUS (0 IDLE, +1 TRANSMITTING, -1 RETRANSMITTING
1414                         ; AFTER TRANS ABORT, +2 DELAYING AFTER TRANSMIT ABORT BEFORE RETRANSM)
1415 CHOINX: .IREPT NCHX, 1  ;CURRENTLY-ACTIVE CHIxxx INDEX
1416
1417 CHOXMT:         ;START TRANSMISSION ROUTINE
1418 .IIF NZ DL10P,  DLCXMT
1419 .IIF NZ TEN11P, T11XMT
1420 .IREPT CHAOSP,  CHSXMT
1421 .IIF NZ ETHERP, ETHXMT  ;ETHERNET
1422 .IALSO          1       ;NOT USED (CHXEGT)
1423 .IIF DF NDVRBF, DVRPKT  ;DOVER
1424 CHXCHK CHOXMT
1425
1426 CHXSBN:         ;SUBNET NUMBER +400 FOR STATUS SERVER
1427 .IIF NZ DL10P, DLCADR/400+400
1428 .IIF NZ TEN11P, T11ADR/400+400
1429 .REPT CHAOSP
1430  CONC CHAD,\.RPCNT,/400+400
1431 .ENDR ;CHAOSP
1432 .IIF NZ ETHERP, ETHSBN+400      ;ETHERNET
1433 .IALSO          776     ;NOT REAL (ETHERNET GATEWAY)
1434 .IIF DF NDVRBF, 777     ;NOT REAL (DOVER)
1435 CHXCHK CHXSBN
1436
1437 CHXRTF: .IREPT NCHX, 0          ;NON-ZERO MEANS BROADCAST ROUTING INFO TO THIS GUY
1438
1439 .IFNZ CHSBTB
1440 CHSIDL: .IREPT NCHX, 0          ;NUMBER OF TICKS WAITING FOR TRANSMIT-DONE
1441 CHSRST: .IREPT NCHX, 0          ;NUMBER OF TIMES HAD TO RESET HUNG INTERFACE
1442 .ENDC ;CHSBTB
1443 \f
1444 ;;; SUBNET/ROUTING TABLES
1445
1446 ;INDEX BY TWICE SUBNET NUMBER
1447 SBNTYP: .IREPT NSUBNT, 0        ;TYPE OF CONNECTION TO THIS SUBNET:
1448                                 ; 0 VIA GATEWAY, WITH AUTOMATIC ROUTING
1449                                 ; -1 VIA GATEWAY, PATCHED IN BY HUMAN, DON'T CHANGE
1450                                 ; 1 HARDWARE CONNECTION
1451
1452 SBNADR:                         ;ADDRESS OF CONNECTION TO THIS SUBNET
1453                                 ;NETWORK ADDRESS IF SBNTYP NEGATIVE OR ZERO
1454                                 ;INDEX IN SOURCE/SINK TABLES IF SBNTYP GREATER THAN ZERO
1455         0       ;0  USED FOR UNKNOWN SUBNETS.  WHEN IN DOUBT, BROADCAST.
1456         0       ;1  9TH FLOOR CABLE
1457         0       ;2  (NOT CURRENTLY USED)
1458         440     ;3  MX, ASSUME VIA MX-IO-11
1459         426     ;4  AI, ASSUME VIA AI-CHAOS-11
1460         .IREPT NSUBNT-5, 0      ; WHEN IN DOUBT, BROADCAST
1461
1462 SBNCST: .IREPT NSUBNT, 1000     ;COST OF ROUTING VIA CURRENT GATEWAY, SEE CHAORD
1463
1464 ;NOW FILL IN TABLES FOR HARDWARE CONNECTIONS THAT EXIST ON THIS MACHINE
1465 ;INCLUDING TRANSFINITE HAIR FOR ETHERNET GATEWAY INFO PACKET
1466 ZZ==.
1467 .IFNZ DL10P
1468 DLCSBN==DLCADR/400      ;SUBNET PDP10 ON OTHER END OF DL10 IS ON
1469 .=SBNTYP+<DLCSBN*2>
1470         1
1471 .=SBNADR+<DLCSBN*2>
1472         CHXDLC
1473 .=SBNCST+<DLCSBN*2>
1474         10.             ;DIRECT 10/11 CONNECTION COSTS 10.
1475 .ENDC ;DL10P
1476 .IFNZ TEN11P
1477 T11SBN==T11ADR/400      ;SUBNET PDP10 ON OTHER END OF TEN11 IS ON
1478 .=SBNTYP+<T11SBN*2>
1479         1
1480 .=SBNADR+<T11SBN*2>
1481         CHXT11
1482 .=SBNCST+<T11SBN*2>
1483         10.             ;DIRECT 10/11 CONNECTION COSTS 10.
1484 .ENDC ;TEN11P
1485 .ENDC ;CHAOSP
1486
1487 .IFM MX-DL
1488           CBLCST=11.            ;CABLE CONNECTION COSTS 11.
1489 .ENDC
1490 .IFM AI
1491           CBLCST=22.            ;AI COSTS MORE 'CAUSE IT'S SICK
1492 .ENDC
1493
1494 .IFNZ CHAOSP            ;sweet fucking jesus, palx
1495 ;HAIR FOR MULTIPLE CABLE INTERFACES
1496 .REPT CHAOSP
1497   CONC IZZZ==CHAD,\.RPCNT
1498   IZZ==<IZZZ/400>*2
1499   .=SBNTYP+IZZ
1500           1
1501   .=SBNADR+IZZ
1502           CHXCHS+<.RPCNT*2>
1503   .=SBNCST+IZZ
1504           CBLCST                ;THE CABLE COST
1505 .ENDR ;CHAOSP
1506
1507 .IFNZ ETHERP
1508 .=SBNTYP+<ETHSBN*2>
1509         1
1510 .=SBNADR+<ETHSBN*2>
1511         CHXETH
1512 .=SBNCST+<ETHSBN*2>
1513         11.
1514 .ENDC ;ETHERP
1515
1516 .=ZZ
1517
1518 ;;; CLOCKS
1519 4SEC:   0               ;4-SECOND CLOCK COUNTER
1520 15SEC:  0               ;15-SECOND CLOCK COUNTER
1521
1522 .ENDC ;CHAOSP
1523
1524 ;PATCH AREA
1525
1526 PAT: PATCH: .BLKW 100
1527 \f
1528         .SBTTL RING BUFFERS
1529
1530 .MACRO RING SIZE
1531         99$             ;IN-POINTER
1532         99$             ;OUT-POINTER
1533         0               ;NUMBER OF WORDS IN RING
1534         <SIZE>          ;MAX NUMBER ALLOWED
1535         <2*<SIZE>>+99$  ;MAX ADDRESS ALLOWED
1536         99$             ;MIN ADDRESS ALLOWED
1537 99$:    .BLKW <SIZE>    ;BUFFER
1538 .ENDM
1539
1540 RINGIN==0
1541 RINGOT==2
1542 RINGCT==4
1543 RINGSZ==6
1544 RINGTP==10
1545 RINGBT==12
1546 RINGBF==14
1547
1548 ; DEFINE THE RING BUFFERS
1549
1550 TYORNG: RING <NCT*2>    ;OUTPUT-DONE RING, CONTENTS = LINE NUMBER PDP10 STYLE
1551                         ;HAS TO BE EXTRA BIG BECAUSE THE OUTPUT DONES PUT IN ON
1552                         ;STARTUP FILL IT UP, THEN SOMETIMES ITS PUTS ONE IN
1553                         ;BEFORE IT TAKES ANY OUT.
1554
1555 TYIRSZ==NCT*20          ;8 CHARS PER TTY (2 WORDS PER CHAR)
1556 TYIRNG: RING TYIRSZ     ;TTY INPUT RING, FIRST WORD IS CHARACTER, SECOND LINE NUMBER
1557
1558
1559
1560 ;MOV #RING,B
1561 ;MOV WORD,A
1562 ;CALL PUT
1563
1564 PUT:    CMP RINGCT(B),RINGSZ(B)
1565         BLT 1$
1566          BPT            ;BLOATED
1567 1$:     PUSH C
1568         MOV RINGIN(B),C
1569         MOV A,(C)+
1570         CMP C,RINGTP(B)
1571         BLO 2$
1572          MOV RINGBT(B),C
1573 2$:     MOV C,RINGIN(B)
1574         POP C
1575         INC RINGCT(B)
1576         RET
1577
1578 ;MOV #RING,B
1579 ;CALL GET
1580 ;WORD RETURNED IN A
1581 ; IT IS AN ERROR TO CALL THIS IF RING IS EMPTY
1582
1583 GET:    TST RINGCT(B)
1584         BGT 1$
1585          BPT            ;EMPTY
1586 1$:     PUSH C
1587         MOV RINGOT(B),C
1588         MOV (C)+,A
1589         CMP C,RINGTP(B)
1590         BLO 2$
1591          MOV RINGBT(B),C
1592 2$:     MOV C,RINGOT(B)
1593         POP C
1594         DEC RINGCT(B)
1595         RET
1596
1597 CLRING: CLR RINGCT(B)           ;CLEAR A RING
1598         MOV RINGBT(B),RINGIN(B)
1599         MOV RINGBT(B),RINGOT(B)
1600         RET
1601 \f.IFNZ DTE20P
1602         .SBTTL DTE20 SUBROUTINES
1603
1604 ;THE DTE20 MUST NOT BE HACKED AT INTERRUPT LEVEL, BECAUSE KLDCP USES IT TOO.
1605 ;THE FOLLOWING THREE LOCATIONS ARE ARGS TO/FROM THE FOLLOWING TWO SUBROUTINES.
1606
1607 LH:     0       ;LOW 16 BITS OF LEFT HALF
1608 RH:     0       ;LOW 16 BITS OF RIGHT HALF
1609 SNB:    0       ;SIGN BIT (0 IF +, NON-0 IF -)
1610
1611 ;JSR B,HWEXAM
1612 ; .WORD ADDR
1613 ;EXAMINE PDP10 LOC, SPLIT INTO HALFWORDS, SET LH, RH, SNB
1614 ;RETURNS WITH "Z" SET IF LOCATION HAS POSITIVE SIGN, "Z" CLEAR IF MINUS SIGN
1615
1616 HWEXAM: PUSH <A,C>      ;SAVE REGS
1617         PUSH <#0,(B)+>  ;PUT PDP10 ADDRESS ONTO PDL
1618         MOV SP,A        ;SET UP POINTER TO ADDRESS
1619         EXAM            ;EXAMINE LOCATION, SET A TO POINT TO 3-WORD RESULT BUFFER
1620          BCS UHUNG      ;BRANCH IF UCODE HUNG
1621         MOV (A)+,RH     ;LOW 16 BITS => RH
1622         MOV (A)+,C      ;PICK UP MIDDLE 16 BITS
1623         MOV (A)+,A      ;PICK UP HIGH 4 BITS
1624         ROR A           ;LSHC <A,C>,-2 TO GET PDP10 LH INTO C
1625         ROR C
1626         ROR A
1627         ROR C   
1628         MOV C,LH
1629         BIC #177775,A   ;LEAVE SIGN BIT IN 1.2 OF A
1630         MOV A,SNB
1631         ADD #4,SP       ;POP ADDRESS OFF PDL
1632         POP <C,A>       ;RESTORE REGS
1633         TST SNB
1634         RTS B           ;RETURN SKIPPING IN-LINE PARAMETER
1635
1636 ;JSR B,HWDEP
1637 ; .WORD ADDR
1638 ;ASSEMBLE LH, RH, SNB INTO PDP10 AND DEPOSIT IN ADDR
1639
1640 HWDEP:  PUSH <A,B,C>
1641         MOV LH,C
1642         CLR A
1643         TST SNB
1644         BEQ 1$
1645         MOV #2,A
1646 1$:     ASL C
1647         ROL A
1648         ASL C
1649         ROL A
1650         PUSH <A,C,RH>   ;PUSH HIGH, MIDDLE, AND LOW BITS
1651         MOV SP,A        ;POINTER TO DATA
1652         PUSH <#0,(B)>   ;PUSH HIGH AND LOW ADDRESS
1653         MOV SP,B        ;POINTER TO ADDRESS
1654         DPOS            ;DO THE DEPOSIT
1655          BCS UHUNG      ;BRANCH IF UCODE HUNG
1656         ADD #10.,SP     ;POP ADDRESS AND DATA OFF PDL
1657         POP <C,B,A>
1658         TST (B)+        ;SKIP TRAILING PARAMETER
1659         RTS B
1660
1661 UHUNG:  $PMSG
1662          .WORD 1$
1663         SETOM NO.ITS    ;GIVING UP      
1664         JMP $CNTLC
1665
1666 1$:     .ASCIZ/?MICROCODE HUNG/
1667
1668 .ENDC ;DTE20P
1669 \f.IFNZ DL10P
1670         .SBTTL MAIN LOOP FOR DL10
1671
1672 MAIN:
1673 .IIF NZ TEN11P, CALL T11WAK     ;CHECK UP ON TEN-11 INTERFACE
1674 .IFNZ ETHERP
1675         TST CHXRTF+CHXETH       ;NEED TO BROADCAST ROUTING INFO TO ETHERNET?
1676         BEQ 666$
1677         CALL ETHRUT
1678 666$:
1679 .ENDC ;ETHERP
1680         BIT #DLXPRT,DLXCSR      ;PORT TO 10 ENABLED?
1681         BNE 1$                  ;YES
1682         SETOM NO.ITS            ;NO, FLAG THERE IS NO ITS
1683         SETOM DLXOFF            ;AND THAT WE THINK DL10 PORT IS OFF
1684         BR MAIN                 ;AND WAIT FOR IT TO TURN ON
1685
1686 1$:     TST DLXOFF              ;DID DL10 JUST TURN ON?
1687         BEQ 4$                  ;NO, IT WAS ON BEFORE
1688         CLR DLXOFF              ;YES, SO REMEMBER THAT
1689         MOV VERS,A              ;CHECK VERSION SUPPLIED BY -10
1690         BEQ 2$                  ;ZERO OK (MUST BE SALVAGER)
1691         CMP A,VERSN
1692         BEQ 2$
1693          BPT                    ;-10 AND -11 PROGRAMS NOT SAME CONFIG
1694 2$:
1695
1696 4$:     BIT #DLXPAR+DLXNXM,DLXCSR       ;ERROR ACCESSING MEMORY?
1697         BEQ 5$                  ;NO
1698         BPT                     ;DON'T GO OFF DESTROYING PEOPLE'S FILES
1699
1700 ;WAIT FOR -10 TO REQUEST SERVICE, OR CLOCK TO TICK
1701
1702 5$:     CLR 10RQ
1703         BIT #DLX11I,DLXCSR      ;10 REQUESTING SERVICE?
1704         BEQ 10$
1705         SETOM 10RQ
1706         BIS #DLXZ11,DLXCSR      ;YES, CLEAR FLAG
1707         BR CHKOST               ;AND GO CHECK FOR THINGS TO DO
1708
1709 10$:    TST WAKE                ;NO, CHECK ANYWAY IF 60 CYCLE CLOCK HAS TICKED
1710         BEQ MAIN                ;NEITHER, JUST WAIT
1711         CLR WAKE                ;CLOCK HAS TICKED, CLEAR FLAG
1712         INC DLXUP               ;AND INCREMENT COUNTER 10 IS SUPPOSED
1713         BEQ 11$                 ; TO SETOM EVERY 1/2 SEC
1714         CMP DLXUP,#15.*60.      ;IF IT DOESN'T TOUCH IT FOR 15 SECONDS,
1715         BLE 12$                 ; CONSIDER IT DOWN.  NOTE THAT PARITY SWEEPS
1716         SETOM NO.ITS            ; THROUGH LARGE MEMORY CAN TAKE SEVERAL SECONDS
1717         MOV #15.*60.,DLXUP      ;DON'T LET COUNTER OVERFLOW
1718         BR 12$                  ;BUT CHECK FOR COMMANDS ANYWAY (SALVAGER DISK)
1719
1720 11$:    CLR NO.ITS              ;-10 HAS SETOMED COUNTER, IT'S UP
1721 12$:    ;FALL INTO CHKOST
1722 \f
1723 ; CHECK FOR OUTPUT-START FROM -10
1724
1725 CHKOST: MOV TTYST,A             ;LINE# TO START OUTPUT
1726         BEQ CHKOUT              ;NONE.
1727         CLR TTYST               ;TELL -10 IT'S BEEN PICKED UP
1728         MOV #TYORNG,B   
1729         MASK 5                  ;DON'T INTERFERE WITH P.I. LEVEL
1730         CALL PUT                ;PUT IN RING, LATER WILL SEND IT BACK TO 10
1731         UNMASK
1732
1733 ; CHECK FOR TTY OUTPUT SENT BY -10
1734
1735 CHKOUT: MOV TYOLIN,I            ;OUTPUT TO BE DONE?
1736         BEQ CHKIN               ;NO.
1737         MOV TYOCNT,C            ;YES, GET NUMBER OF CHARS
1738         CALL TYOSER             ;CALL OUTPUT HANDLER
1739         CLR TYOLIN              ;TELL 10 WE'VE GOBBLED THE OUTPUT
1740         BIS #DLX10I,DLXCSR      ;GIVE TRANSFER-COMPLETE INTERRUPT
1741
1742 ; CHECK FOR TTY INPUT TO BE SENT TO -10
1743
1744 CHKIN:  TST TYIRNG+RINGCT
1745         BEQ CHKDON              ;NO STATUS TO BE STORED
1746         TST TYILIN
1747         BNE CHKDON              ;PREVIOUS STATUS NOT PICKED UP
1748         MOV #TYIRNG,B
1749         CALL GET
1750         MOV A,TYICHR            ;GIVE INPUT CHARACTER TO 10
1751         CALL GET
1752         MOV A,TYILIN            ;GIVE LINE NUMBER TO 10
1753         BIS #DLX10I,DLXCSR      ;SEND INTERRUPT TO 10
1754
1755 ; CHECK FOR OUTPUT-DONE TO BE SENT TO -10
1756
1757 CHKDON: TST TYORNG+RINGCT
1758         BEQ CHKHNG              ;NO STATUS TO BE STORED
1759         TST TYOSTS
1760         BNE CHKHNG              ;PREVIOUS STATUS NOT PICKED UP
1761         MOV #TYORNG,B
1762         CALL GET
1763         MOV A,I
1764         ASL I
1765         MOV BUFSIZ(I),TYOBSZ    ;TELL -10 HOW MANY CHARS TO GIVE
1766         MOV A,TYOSTS            ;GIVE OUTPUT DONE TO 10
1767         BIS #DLX10I,DLXCSR      ;WITH INTERRUPT
1768 \f
1769 ; CHECK FOR HANGUPS TO BE SENT TO -10
1770
1771 CHKHNG: TST HNGSIG              ;ANY HANGUPS TO BE REPORTED?
1772         BEQ CHKLPR              ;NO
1773         TST HNGLIN
1774         BNE CHKLPR              ;PREVIOUS STATUS NOT PICKED UP
1775         MOV #LASTTY,I           ;SCAN OVER ALL LINES
1776 1$:     MASK 5
1777         MOV TTYHNG(I),A         ;GET HANG-UP STATUS
1778         BNE 2$                  ;BRANCH IF FOUND SOMETHING TO REPORT
1779         UNMASK
1780         TST -(I)
1781         CMP I,#NFTTY
1782         BHIS 1$
1783         BPT                     ;HNGSIG OUT OF PHASE WITH TTYHNG
1784
1785 2$:     CLR TTYHNG(I)           ;GOT STATUS, CLEAR IT
1786         DEC HNGSIG              ;DECREASE COUNT OF FROBS WAITING TO BE SIGNALLED
1787         UNMASK                  ;NOW IT'S OK TO INTERRUPT AND SET TTYHNG
1788         MOV A,HNGLIN            ;GIVE LINE NUMBER AND OTHER DATA TO 10
1789         BIS #DLX10I,DLXCSR      ;WITH INTERRUPT
1790
1791 ; CHECK FOR REQUEST FROM -10 TO SET LINE PARAMETERS
1792
1793 CHKLPR: MOV LPRLIN,I            ;LINE PARAMETERS TO BE SET?
1794         BEQ CHKCHS              ;NO.
1795         ASL I                   ;YES, GET LINE INDEX
1796         MOV LPRLPR,A            ;AND DH11 PARAMETER REGISTER VALUE
1797         MOV LPRBSZ,B            ;AND BUFFER SIZE
1798         CALL SPARAM             ;CALL PARAMETER SETTER
1799         CLR LPRLIN              ;TELL 10 IT IS DONE
1800
1801 ; CHECK FOR CHAOS NET ACTIVITY
1802
1803 CHKCHS:
1804 .IFNZ CHAOSP
1805         CALL DLCWAK             ;WAKEUP DL10-CHAOSNET STUFF
1806 .ENDC ;CHAOSP
1807 .IFNZ T300P
1808         CALL DSKSTR             ;CHECK FOR DISK REQUEST
1809 .ENDC ;T300P
1810
1811 ; CHECK FOR EXAMINE/DEPOSIT REQUEST FROM -10
1812
1813 CHKEXD: TST EXDSTS              ;EXAMINE/DEPOSIT?
1814         BEQ CHKGLD              ;NO.
1815         MOV EXDADR,A            ;GET ADDRESS
1816         CMP EXDSTS,#2
1817         BNE 21$
1818         MOV EXDDAT,(A)          ;DEPOSIT
1819 21$:    MOV (A),EXDDAT          ;EXAMINE
1820         CLR EXDSTS              ;IT IS DONE
1821
1822 ;CHECK FOR GOULD LPT OUTPUT
1823
1824 CHKGLD:
1825 .IF EQ GOULDP
1826 ;       CLR GLPCTR              ;IF NO GOULD, FLUSH OUTPUT FOR IT
1827 ;       SETOM GLPTER            ;AND SAY "NOT READY"
1828         TST 10RQ
1829         BEQ 20$
1830         ;10 WANTED US TO DO SOMETHING, PLAY WITH THE LIGHTS
1831         MOV LITHSE,A
1832         ROL A
1833         ROL LITHSE
1834 20$:    MOV LITHSE,GLPTER
1835 .IFF
1836         TST GLPCTR              ;ANY BYTES IN BUFFER?
1837         BEQ 1$
1838         CALL GLPTYO             ;YES, OUTPUT THEM
1839 1$:     MOV GLPERR,GLPTER       ;COPY ERROR STATUS FROM P.I. LEVEL TO -10
1840 .ENDC                           ;DONE HERE SO NO USE OF DL10 AT P.I. LEVEL
1841 ;       BR MAINX
1842
1843 MAINX:  JMP MAIN                ;THAT'S IT
1844 MAINE::
1845 .ENDC ;DL10P
1846 \f.IFNZ DTE20P
1847         .SBTTL MAIN LOOP FOR DTE20
1848
1849 MAIN:   BIT #%D1RUN,DIAG1       ;IS KL10 RUNNING?
1850         BEQ TENDED              ;NO, LOSE!
1851         BIT #%D1ERR+%D1HLT,DIAG1        ;HAS KL10 CLOCK STOPPED FOR HARDWARE ERROR? OR JRST 4
1852         BNE TENDED              ;YES, LOSE!
1853         TST KLDCPF              ;MAYBE USER WANTS TO GIVE A KLDCP COMMAND?
1854         BNE KLDCPR              ;YES, RETURN TO KLDCP
1855         TSTB @DLKS+NFDLHX       ;CTY INPUT?
1856         BPL 10$                 ;TEST KBD BEFORE CLK SINCE MIGHT BE MORE THAN
1857                                 ; 1/60'TH SECOND PER TRIP AROUND THE LOOP.
1858         MASK 5                  ;YES, SIMULATE INTERRUPT
1859         CALL DL1IBK             ;CAN'T USE REAL INTS BECAUSE WOULD INTERFERE WITH KLDCP
1860 10$:    TSTB LKS                ;60 CYCLE CLOCK TICK?
1861         BMI CLKSER              ;YES
1862         BIT #%STINV,STATUS      ;REQUEST FROM 10?
1863         BNE TENSER              ;YES, SERVICE IT.
1864         BIT #%STDNI,STATUS      ;TO10 XFER COMPLETE?
1865         BNE INPDON              ;YES, SERVICE IT.
1866         BIT #%STDNO,STATUS      ;TO11 XFER COMPLETE?
1867         BNE OUTDON              ;YES, SERVICE IT.
1868         BIT #%STERI+%STERO,STATUS
1869         BNE LOSSAG              ;BYTE TRANSFER LOST
1870         BR MAIN                 ;CLOSE LOOP
1871
1872 ;60-CYCLE CLOCK SERVICE
1873
1874 CLKSER: CLR LKS                 ;CLEAR CLOCK FLAG
1875         TST CLKENB              ;DOES 10 WANT CLOCK INTERRUPTS?
1876         BEQ 1$
1877         D10MON                  ;YES, GIVE ONE
1878             DTECLK              ;SET CLOCK FLAG IN LOW CORE
1879          BCS UHUNG
1880         MOV #%STINX,STATUS      ;AND SEND INTERRUPT
1881 1$:     CMP SWR,CURSWR          ;MAYBE NEED TO UPDATE 10'S SWITCHES
1882         BEQ 2$
1883         MOV SWR,CURSWR
1884         TENSW                   ;LET KLDCP DO IT
1885          BCS UHUNG
1886 2$:     JSR B,HWEXAM            ;INCREMENT COUNTER -10 IS SUPPOSED
1887             DTECHK              ; TO SETOM EVERY HALF-SECOND
1888         CLR LH
1889         CLR SNB
1890         INC RH
1891         BEQ 3$
1892         CMP RH,#15.*60.         ;IF IT DOESN'T SETOM IT FOR 15 SECONDS
1893         BLE 4$                  ;THEN IT IS DOWN.  NOTE THAT PARITY SWEEPS
1894         SETOM NO.ITS            ;THROUGH LARGE MEMORY CAN TAKE SEVERAL SECONDS.
1895         MOV #15.*60.,RH         ;DON'T LET COUNTER OVERFLOW
1896         BR 4$
1897
1898 3$:     CLR NO.ITS              ;IT SETOMED COUNTER, IT'S UP.
1899 4$:     JSR B,HWDEP             ;PUT COUNTER BACK
1900             DTECHK
1901         MASK 6                  ;NOW SIMULATE BR6 CLOCK INTERRUPT
1902         CALL CLKBRK
1903         BR TENSER               ;AND GO SERVICE 10 (IN CASE LOST INTERRUPT)
1904
1905 ; HERE IF KL10 HALTS
1906
1907 TENDED: SETOM NO.ITS
1908         CLC
1909         RET                     ;LET KLDCP PRINT THE MESSAGE
1910
1911 ; BYTE TRANSFER ENCOUNTERED HARDWARE LOSSAGE
1912
1913 LOSSAG: BPT
1914         BR LOSSAG
1915
1916 ; USER WANTS TO GIVE A KLDCP COMMAND
1917
1918 KLDCPR: CLR KLDCPF
1919         SEC
1920         RET
1921
1922 TENSER: JMP TENSR0
1923 \f
1924 ; HERE WHEN TO10 BYTE TRANSFER COMPLETE
1925
1926 INPDON: MOV #%STCLI,STATUS      ;CLEAR FLAGS IN DTE20
1927         MOV INPCMD,A            ;GET COMMAND FOR XFER THAT JUST FINISHED
1928         BNE 1$
1929          BPT                    ;WOOPS, NO XFER IN PROGRESS
1930 1$:     CLR INPCMD              ;NO XFER IN PROGRESS NOW
1931         MOV INPSVI,I
1932         MOV INPSVC,C
1933         CALL @FINAL-2(A)        ;CALL APPROPRIATE FINISHER ROUTINE
1934         BR MAIN
1935
1936 ; HERE WHEN TO11 BYTE TRANSFER COMPLETE
1937
1938 OUTDON: MOV #%STCLO,STATUS      ;CLEAR FLAG
1939         MOV OUTCMD,A            ;GET COMMAND FOR XFER THAT JUST FINISHED
1940         BNE 1$
1941          BPT                    ;WHOOPS, NO XFER IN PROGRESS
1942 1$:     CLR OUTCMD              ;NO XFER IN PROGRESS NOW
1943         MOV OUTSVI,I
1944         MOV OUTSVC,C
1945         CALL @FINAL-2(A)        ;CALL APPROPRIATE FINISHER ROUTINE
1946         BR MAINJ
1947
1948 ; HERE TO START TO10 BYTE TRANSFER.  HWEXAM OF DTEINP HAS BEEN DONE.
1949
1950 INPSER: D10MON                  ;VALUE HAS BEEN PICKED UP, SETOM IT
1951             DTEINP
1952         BIT #1000,LH            ;RIGHT GENDER OF COMMAND?
1953         BEQ OUTSR1              ;YES
1954         BR MAINJ                ;(USED TO BE BPT) NO, IGNORE, MAYBE ITS BEING RELOADED
1955
1956 ; HERE TO START TO11 BYTE TRANSFER.  HWEXAM OF DTEOUT HAS BEEN DONE.
1957
1958 OUTSER: D10MON                  ;VALUE HAS BEEN PICKED UP, SETOM IT
1959             DTEOUT
1960         BIT #1000,LH            ;RIGHT GENDER OF COMMAND?
1961         BNE OUTSR1              ;YES
1962         BR MAINJ                ;(USED TO BE BPT) NO, IGNORE, MAYBE ITS BEING RELOADED
1963
1964 OUTSR1: MOV RH,C                ;GET BYTE COUNT
1965         MOVB LH,I               ;GET LINE#
1966         MOVB LH+1,A             ;GET COMMAND TIMES 2
1967         BEQ MAINJ               ;CLEARING CORE?  IGNORE ZERO COMMAND
1968         BLE OUTSR2
1969         CMP A,#LBEGIN
1970         BGT OUTSR2
1971         CALL @BEGIN-2(A)        ;CALL APPROPRIATE BEGIN-XFER ROUTINE
1972         BIT #2,A
1973         BNE 1$
1974         MOV A,INPCMD            ;REMEMBER CRUFT FOR XFER IN PROGRESS
1975         MOV I,INPSVI
1976         MOV C,INPSVC
1977         BR MAINJ
1978
1979 1$:     MOV A,OUTCMD            ;REMEMBER CRUFT FOR XFER IN PROGRESS
1980         MOV I,OUTSVI
1981         MOV C,OUTSVC
1982 MAINJ:  JMP MAIN
1983
1984 OUTSR2: BR MAINJ                ;BAD COMMAND FROM 10 (USED TO BE BPT) JUST IGNORE IT
1985
1986 ;TABLE OF ROUTINES TO PROCESS DATA TRANSFER COMMANDS FROM -10
1987
1988 BEGIN:  TYOSER                  ;%DTTYO
1989         ;ETHISR                 ;%DTETI
1990         ;ETHOSR                 ;%DTETO
1991 LBEGIN==.-BEGIN
1992
1993 ;TABLE OF ROUTINES TO FINISH UP DATA TRANSFERS
1994
1995 FINAL:  TYOFIN                  ;%DTTYO
1996         ;ETHIFN                 ;%DTETI
1997         ;ETHOFN                 ;%DTETO
1998 \f
1999 ;CHECK FOR COMMANDS FROM 10, STORE STATUS IN ANY STATUS WORDS
2000 ;THAT 10 HAS SET BACK TO -1
2001
2002 TENSR0: MOV #%STUNV,STATUS      ;CLEAR 10 INTERRUPTING 11 FLAG
2003         JSR B,HWEXAM            ;CHECK FOR A NON-TIMESHARING COMMAND
2004             DTECMD
2005         MOV RH,A                ;IS THERE ONE?
2006         BEQ TENSR1              ;NO, GO CHECK FOR TIMESHARING STUFF
2007         CLR LH
2008         CLR SNB
2009         CMP A,#377
2010         BHI 2$
2011 1$:     TSTB TPS                ;CHAR TO BE TYPED, WAIT FOR READY
2012         BPL 1$
2013         MOVB A,TPB              ;TYPE IT OUT
2014 9$:     CLR RH                  ;CLEAR OUT THE COMMAND
2015         JSR B,HWDEP
2016             DTECMD
2017         D10MON                  ;TELL 10 IT'S DONE
2018             DTEFLG
2019         JMP MAIN
2020
2021 2$:     CMP A,#%DTTYI
2022         BNE 5$
2023         CLR RH                  ;SNB,LH,RH NOW HAS ZERO
2024         SETOM DDTMOD            ;KEYBOARD INPUT WANTED
2025         TST DDTCHR              ;TEST IF READY
2026         BMI 3$                  ;IF NO INPUT, GIVE ZERO
2027         MASK 5
2028         MOV DDTCHR,RH           ;GIVE THE CHAR
2029         COM DDTCHR              ;MAKE NEGATIVE
2030         UNMASK
2031 3$:     JSR B,HWDEP
2032             DTEF11
2033         BR 9$
2034
2035 5$:     CMP A,#%DTCLN
2036         BNE 6$
2037         SETOM CLKENB
2038         BR 9$
2039
2040 6$:     CMP A,#%DTCLF
2041         BNE 7$
2042         CLR CLKENB
2043         BR 9$
2044
2045 7$:     BPT                     ;SOME COMMAND WE DON'T IMPLEMENT
2046         BR 9$                   ;IF CONTINUED, IGNORE IT
2047
2048 ;CHECK FOR ITS UP/DOWN
2049
2050 TENSR1: TST NO.ITS              ;IF SYSTEM ISN'T UP,
2051         BNE MAINJ               ;DON'T TRY TO HACK TS STUFF
2052         INC DLXOFF              ;OTHERWISE, FIRST TIME THROUGH HERE
2053         BNE CHKOST              ;WE CHECK THE VERSION
2054         JSR B,HWEXAM
2055             DTEVER
2056         TST RH                  ;STORED?
2057         BNE 1$
2058         DEC DLXOFF              ;NO, DON'T LOOK AT IT
2059         BR MAINJ                ;PROBABLY CORE BEING CLEARED
2060
2061 1$:     CMP RH,VERSN
2062         BEQ CHKOST
2063          BPT                    ;-10 AND -11 PROGRAMS NOT SAME VERSION
2064 \f
2065 CHKOST: JSR B,HWEXAM            ;CHECK FOR 10 WANTING OUTPUT START
2066             DTEOST
2067         BNE CHKTRN              ;BRANCH IF LOCATION DTEOST IS -1
2068         D10MON                  ;HAVING PICKED IT UP, SET BACK TO -1
2069             DTEOST
2070         MOV RH,A
2071         MOV #TYORNG,B
2072         MASK 5                  ;DON'T INTERFERE WITH P.I. LEVEL
2073         CALL PUT
2074         UNMASK
2075         CLR DDTMOD              ;SYSTEM UP, TURN OFF DDT MODE
2076         MOV #-1,DDTCHR          ;..
2077
2078 CHKTRN: TST INPCMD
2079         BNE 1$                  ;INPUT IN PROGRESS, DON'T START AGAIN
2080         JSR B,HWEXAM            ;CHECK FOR DATA TRANSFER COMMAND
2081             DTEINP
2082         BNE 1$                  ;DTEINP -1, NO REQUEST
2083         JMP INPSER
2084
2085 1$:     TST OUTCMD
2086         BNE CHKLSP              ;OUTPUT IN PROGRESS, DON'T START AGAIN
2087         JSR B,HWEXAM            ;CHECK FOR DATA TRANSFER COMMAND
2088             DTEOUT
2089         BNE CHKLSP              ;DTEOUT -1, NO REQUEST
2090         JMP OUTSER
2091
2092 CHKLSP: JSR B,HWEXAM            ;CHECK FOR SET LINE SPEED COMMAND
2093             DTELSP
2094         BNE CHKTYI
2095         MOV RH,I                ;GET LINE#
2096         ASL I
2097         CMP I,#NFTTY            ;VALIDATE IT
2098         BLO 1$                  ;IGNORE IF BAD
2099         CMP I,#LASTTY
2100         BHI 1$
2101         JSR B,HWEXAM            ;GET LPR,,BUFFERSIZE
2102             DTELPR
2103         MOV LH,A
2104         MOV RH,B
2105         CALL SPARAM             ;DO IT
2106 1$:     D10MON                  ;DONE, SETOM
2107             DTELSP
2108
2109 CHKTYI: TST TYIRNG+RINGCT
2110         BEQ CHKODN              ;NO TTY INPUT WAITING
2111         JSR B,HWEXAM
2112             DTETYI
2113         BEQ CHKODN              ;PREVIOUS CHAR NOT PICKED UP
2114         MOV #TYIRNG,B
2115         CALL GET
2116         MOV A,RH                ;CHAR
2117         CALL GET
2118         MOV A,LH                ;LINE#
2119         CLR SNB
2120         JSR B,HWDEP             ;GIVE 10 LINE#,,CHAR
2121             DTETYI
2122         MOV #%STINX,STATUS      ;INTERRUPT THE 10
2123
2124 CHKODN: TST TYORNG+RINGCT
2125         BEQ CHKHNG              ;NO OUTPUT DONES WAITING
2126         JSR B,HWEXAM
2127             DTEODN
2128         BEQ CHKHNG              ;PREVIOUS STATUS NOT PICKED UP
2129         MOV #TYORNG,B
2130         CALL GET                ;GET LINE# WITH OUTPUT DONE
2131         MOV A,LH
2132         ASL A
2133         MOV BUFSIZ(A),RH
2134         CLR SNB
2135         JSR B,HWDEP             ;GIVE 10 LINE#,,BUFFERSIZE
2136             DTEODN
2137         MOV #%STINX,STATUS      ;INTERRUPT THE 10
2138 \f
2139 CHKHNG: TST HNGSIG
2140         BEQ MAINX               ;NO HANGUPS/DIALINS WAITING
2141         JSR B,HWEXAM
2142             DTEHNG
2143         BEQ MAINX               ;PREVIOUS STATUS NOT PICKED UP
2144         MOV #LASTTY,I           ;SCAN OVER ALL LINES
2145 1$:     MASK 5
2146         MOV TTYHNG(I),A         ;GET HANG-UP STATUS
2147         BNE 2$                  ;BRANCH IF FOUND SOMETHING TO REPORT
2148         UNMASK
2149         TST -(I)
2150         CMP I,#NFTTY
2151         BHIS 1$
2152         BPT                     ;HNGSIG OUT OF PHASE WITH TTYHNG
2153
2154 2$:     CLR TTYHNG(I)           ;GOT STATUS, CLEAR IT
2155         DEC HNGSIG              ;DECREASE COUNT OF FROBS WAITING TO BE SIGNALLED
2156         UNMASK                  ;NOW IT'S OK TO INTERRUPT AND SET TTYHNG
2157         MOV A,RH                ;GIVE LINE NUMBER AND OTHER DATA TO 10
2158         CLR LH
2159         CLR SNB
2160         JSR B,HWDEP
2161             DTEHNG
2162         MOV #%STINX,STATUS      ;INTERRUPT THE 10
2163
2164 MAINX:  JMP MAIN
2165 .ENDC ;DTE20P
2166 \f
2167 .IFZ DL10P+DTE20P
2168         .SBTTL MAIN LOOP FOR AI
2169
2170 MAIN:
2171 .IIF NZ TEN11P, CALL T11WAK     ;CHECK UP ON TEN-11 INTERFACE
2172 .IIF Z TEN11P, CALL CHSRUN      ;DAMNED THING GETS WEDGED
2173 .IFNZ ETHERP
2174         TST CHXRTF+CHXETH       ;NEED TO BROADCAST ROUTING INFO TO ETHERNET?
2175         BEQ 666$
2176         CALL ETHRUT
2177 666$:
2178 .ENDC ;ETHERP
2179         TST WAKE                ;CLOCK TICK?
2180         BEQ MAIN                ;NO, JUST WAIT
2181         CLR WAKE                ;CLOCK HAS TICKED, CLEAR FLAG
2182         BR MAIN                 ;NOT MUCH TO DO, NO TTYS
2183 .ENDC ;DL10P+DTE20P
2184 \f
2185         .SBTTL OUTPUT HANDLERS
2186
2187 TYOSER: ASL I                           ;CONVERT -10 LINE# TO -11 TTY INDEX
2188         CMP I,#NFTTY
2189         BLO 11$
2190         CMP I,#LASTTY
2191         BLOS 12$
2192 11$:    BPT                             ;10 GAVE BAD LINE#
2193 12$:    MOV HDWR(I),H                   ;GET HARDWARE INDEX
2194         MOV BUFPNT(I),D                 ;AND ADDRESS OF TYPEOUT BUFFER
2195         CMP BUFSIZ(I),C                 ;MAKE SURE THERE IS ROOM IN BUFFER
2196         BHIS 2$
2197          BPT                            ;THERE ISN'T
2198 2$:     MOV C,B                         ;MUSTN'T CLOBBER BYTE COUNT IN C
2199 .IFNZ DL10P
2200         MOV #TYOPNT,A                   ;GET CRUFT FROM DL10
2201 3$:     MOVB @A,(D)+                    ;COPY BUFFER
2202         SOB B,3$
2203 .ENDC ;DL10P
2204 .IFNZ DTE20P
2205         MOV D,TO11AD                    ;SET UP BYTE TRANSFER
2206         NEG B
2207         BIC #050000,B                   ;SET LAST, BYTE; CLEAR ASCIZ, 2.4
2208         MOV B,TO11BC                    ;START XFER
2209         RET
2210
2211 TYOFIN: MOV HDWR(I),H                   ;COMES BACK WHEN XFER COMPLETE
2212 .ENDC ;DTE20P
2213
2214 ;BUFFER HAS BEEN LOADED, START DEVICE
2215
2216         MASK 5                          ;DON'T LET DEVICE INTERRUPT
2217         MOV BUFPNT(I),D
2218         CALL @STROUT(H)                 ;CALL DEVICE-DEPENDENT ROUTINE
2219         MOV #40000,TYPING(I)            ;TELL 10 WHEN OUTPUT FINISHES (LARGE POSITIVE NUMBER)
2220         UNMASK
2221         RET
2222
2223 ;GIVE MESSAGE.  A -> .WORD LENGTH,MSG.  I HAS LINE NUMBER.
2224
2225 GIVMSG: PUSH <C,D>
2226         MOV (A)+,C              ;C HAS BYTE COUNT, A HAS ADDRESS
2227         MOV A,D                 ;PUT ADDRESS IN D
2228         MOV HDWR(I),H
2229         MASK 5
2230         CALL @STROUT(H)         ;START OUTPUT TO LINE
2231         UNMASK
2232         POP <D,C>
2233         RET
2234
2235 ASPACK: MNAME ^%
2236         MSG ^\
2237 \87Connected to MCHN'.\%
2238 DWNMSG: MSG ^\
2239 \87ITS is down.\
2240 IBOMSG: MSG ^\IBO\
2241 \f
2242 ;DEVICE-DEPENDENT OUTPUT START ROUTINES  (CALL AT PI LEVEL 5)
2243 ;H HDWR IDX, I TTY IDX, D BUFFER POINTER, C NUMBER OF BYTES
2244
2245 STRDH:  BIC DHLBIT(I),@DHBAR(H)         ;IF LINE ALREADY TRANSMITTING, STOP IT
2246                                         ;IT SHOULDN'T OUGHT TO BE...
2247         MOV DHLSEL(I),@DHSCR(H)         ;HARDWARILY SELECT THIS LINE
2248         MOV D,@DHCA(H)                  ;SET XMT ADDRESS
2249         NEG C                           ;HARDWARE LIKES NEGATIVE BYTE COUNTS
2250         MOV C,@DHBC(H)                  ;SET XMT COUNT
2251         BIS DHLBIT(I),@DHBAR(H)         ;START TRANSMISSION HARDWARILY
2252         BIS DHLBIT(I),DHOAC(H)          ;SOFTWARILY ALSO
2253         RET
2254
2255 STRDL:  MOV D,DLCA(H)
2256         MOV C,DLBC(H)
2257         CLR @DLPS(H)
2258         MOV #300,@DLPS(H)               ;CAUSE INTERRUPT
2259         SETOM DLOAC(H)
2260 CPOPJ:  RET
2261
2262 .IFNZ NMPTYS
2263 STRMPK: TST MPXENB
2264         BEQ CPOPJ
2265         MOV D,MPXPNT-NFMPTY(I)          ;QUEUE OUTPUT
2266         MOV C,MPXNBT-NFMPTY(I)
2267 STRMPX: PUSH I
2268         TST MPXOAC                      ;START THE MPXR
2269         BNE 10$                         ;ALREADY BUSY
2270         CLR I
2271         MOV #NMPTYS,D
2272 2$:     MOV MPXNBT(I),C                 ;FIND MPX KLUDGE LINE WANTS TO OUTPUT
2273         BNE 15$
2274         TST (I)+
2275         SOB D,2$
2276 10$:    POP I
2277         RET
2278
2279 15$:    MOV I,MPXOLN                    ;SAVE LINE# OUTPUT ON
2280         ASR I                           ;SET UP HEADER
2281         ADD #200,I
2282         MOVB I,MPXHED
2283         MOVB C,MPXHED+1
2284         MOV #-1,MPXOAC                  ;SEND HEADER
2285         MOV #MPXIDX,I
2286         MOV HDWR(I),H
2287         MOV #MPXHED,D
2288         MOV #2,C
2289         CALL @STROUT(H)
2290         BR 10$
2291 .ENDC ;NMPTYS
2292 \f
2293 .IFNZ GOULDP
2294 .SBTTL GOULD LPT OUTPUT (M.P. LEVEL)
2295 .IIF Z DL10P, .ERROR GOULD LPT ONLY CODED FOR DL10
2296 .ERR BY THE WAY, THESE ROUTINES DON'T WORK WORTH GUBBISH
2297
2298 GLPTYO: MOV GLPOIP,H            ;GET NEXT BUFFER
2299         CMP GB.STA(H),#%GBMP
2300         BEQ 2$                  ;BRANCH IF M.P. ACTIVE
2301         BLT 1$                  ;BRANCH IF IDLE BUFFER AVAIL
2302         RET                     ;NO FREE BUFFERS
2303
2304 1$:     CALL GLPBGB             ;GOBBLE A BUFFER
2305 2$:     MOV GB.PNT(H),D
2306         MOV GLPCTR,C            ;SET UP BYTE COUNTER
2307         MOV GLPGRF,GLPGF1       ;COPY ARG FROM 0 FOR SPEED
2308         TST GLIMBF              ;CHAR SAVED FROM LAST TIME?
2309         BEQ GLPNCL
2310         CLR GLIMBF              ;YES, PRINT IT
2311         MOVB GLIMBO,A
2312         CALL GLPPUT
2313         MOVB GLIMBO+1,A         ;SECOND CHAR?
2314         BEQ GLPNCL
2315         CLR GLIMBO
2316         CALL GLPPUT
2317
2318 ;CHARACTER PROCESSING LOOP
2319 ;C HAS # CHARS YET TO GO, D HAS WHERE TO PUT THEM, H -> BUFFER
2320 ;A WILL HAVE CHAR
2321
2322 GLPNCL: MOV GLPPTR,A            ;GET NEXT CHAR
2323         TST GLPGF1
2324         BNE GLPNRM              ;GRAPHIC MODE, NO CHARACTER PROCESSING
2325         CMP A,#177              ;ESCAPE?
2326         BEQ GLPESC
2327         CMP A,#40               ;CONTROL?
2328         BGE GLPNRM              ;NO, NORMAL PRINTING
2329         CMP A,#14               ;CHECK FOR SPECIAL CONTROLS
2330         BNE 10$
2331 8$:     CLR GLPROW              ;START NEW PAGE
2332         TST GLPCOL              ;IN MIDDLE OF LINE?
2333         BEQ 9$                  ;NO, OK
2334         CALL GLPBWW             ;OTHERWISE, HAIR
2335         CLR GLPFIL              ;HACK HACK MAKE FF NEXT LINE
2336         BR GLPNB1
2337
2338 9$:     SETOM GB.FF(H)
2339         BR GLPNXC
2340
2341 10$:    CMP A,#12
2342         BNE 12$
2343         INC GLPROW
2344         CMP GLPROW,#GLPRMX
2345         BHIS 8$                 ;SKIP OVER PERFORATION
2346         TST GLPCOL
2347         BNE GLPNBF              ;IF NOT A BLANK LINE, FINISH BUFFER
2348         INC GB.NL(H)
2349         BR GLPNXC
2350
2351 12$:    CMP A,#11
2352         BNE 15$
2353 13$:    MOV #40,A               ;TAB - SPACE OVER
2354         CALL GLPPUT
2355         BIT #7,GLPCOL
2356         BNE 13$
2357         BR GLPNXC
2358
2359 15$:    CMP A,#15
2360         BEQ GLPNXC              ;IGNORE CR
2361         CMP A,#33
2362         BNE 16$
2363         MOV #'$,A               ;PRINT ALTMODE AS DOLLAR
2364         BR GLPNRM
2365
2366 16$:    BIS #100,A              ;RANDOM CONTROL AS UPARROW, LETTER
2367         MOVB A,GLIMBO+1
2368         MOV #'^,A
2369         CALL GLPPUT
2370         MOVB GLIMBO+1,A
2371         CLR GLIMBO      
2372 GLPNRM: CALL GLPPUT             ;HERE FOR NORMAL CHARACTER
2373 GLPNXC: DEC C                   ;HERE TO GOBBLE CHARACTER
2374         BGT GLPNCL              ;BRANCH IF MORE CHARS TO GO
2375         BR GLPEND               ;BUFFER EMPTIED
2376 \f
2377 GLPNBF: CALL GLPBWW             ;HERE TO ADVANCE TO NEXT BUFFER
2378 GLPNB1: CMP GB.STA(H),#%GBIDL   ;NEXT BUFFER AVAIL?
2379         BNE GLPEN1              ;NO, STOP
2380         CALL GLPBGB             ;YES, GOBBLE IT
2381         BR GLPNXC
2382
2383 GLPESC: DEC C                   ;HERE FOR TWO CHAR ESC SEQ
2384         BEQ GLPEND              ;-10 FORGOT 2ND CHAR, FLUSH
2385         MOV GLPPTR,A            ;GET & DECODE 2ND CHAR
2386         CMP A,#105              ;EOF
2387         BEQ GLPEOF
2388         BR GLPNXC               ;OTHER CHARS ARE IGNORED
2389
2390 GLPEOF: CLR GLPFIL
2391         CLR GLPROW
2392         CALL GLPBWW             ;EOF, WRITE LAST BUFFER
2393 GLPEN1: DEC C                   ;GOBBLE A CHARACTER
2394 GLPEND: MOV C,GLPCTR            ;HERE WHEN DONE, RELEASE 10'S BUFFER
2395         CMP GB.STA(H),#%GBMP    ;BUFFER ACTIVE AT M.P. LEVEL?
2396         BNE 1$                  ;IF NOT, DON'T CLOBBER GB.PNT
2397         MOV D,GB.PNT(H)         ;IF SO, REMEMBER AMT OF STUFF IN CURRENT BUFFER
2398 1$:     RET                     ;RETURN TO MAIN LOOP
2399
2400 ;OUTPUT PRINTING CHAR IN A
2401
2402 GLPPUT: CMP D,GLPLIM            ;LINE OVERFLOW?
2403         BLO 5$                  ;NO
2404         CALL GLPBWW             ;YES, DONE WITH THIS BUFFER
2405         INC GLPROW              ;OUGHT TO CHECK FOR PERFORATION, BUT...
2406         CMP GB.STA(H),#%GBIDL   ;MORE BUFFERS?
2407         BNE 6$                  ;NO
2408         CALL GLPBGB
2409 5$:     MOVB A,(D)+             ;DROP CHAR IN BUFFER
2410         INC GLPCOL              ;AND ADVANCE COLUMN
2411         RET
2412
2413 6$:     MOVB A,GLIMBO           ;NO BUFFERS, SAVE CHAR BEING PRINTED
2414         SETOM GLIMBF            ;SET FLAG SO WILL BE PRINTED NEXT TIME
2415         TST (SP)+               ;STOP THE WORLD
2416         BR GLPEN1
2417 \f
2418 ;GOBBLE IDLE BUFFER H -> FOR M.P.  RETURNS GB.PNT(H) IN D.
2419
2420 GLPBGB: MOV #%GBMP,GB.STA(H)    ;ACTIVATE AT M.P. LEVEL
2421         CLR GB.FF(H)            ;INIT THE BUFFER
2422         CLR GB.NL(H)
2423         CLR GLPCOL              ;START LINE IN COLUMN 0
2424         MOV H,D                 ;INIT INSERT POINTER
2425         ADD #GB.DAT,D
2426         MOV D,GB.PNT(H)
2427         MOV H,GLPLIM            ;SET UP MAX. VALUE OF GB.PNT
2428         ADD #GB.LEN,GLPLIM
2429         RET
2430
2431 ;GIVE BUFFER H -> TO P.I. LEVEL
2432
2433 GLPBWW: BIT #1,D                ;MUST BE EVEN NUMBER OF BYTES
2434         BEQ 1$
2435         CLRB (D)+
2436
2437 1$:     PUSH A                  ;INTERFACE GETS BYTES IN WRONG ORDER
2438         MOV P,A                 ;COMPUTE NUMBER OF WORDS IN LINE
2439         SUB H,A
2440         SUB #GB.DAT,A
2441         ASR A
2442         BNE 4$
2443         CLR (D)+                ;CAN'T HAVE ZERO-LENGTH LINE
2444         INC A
2445 4$:     MOV A,GB.PNT(H)         ;SAVE WORD COUNT FOR P.I. LEVEL
2446 2$:     SWAB -(D)
2447         SOB A,2$
2448         POP A
2449         TST GLPFIL              ;IF STARTING NEW FILE,
2450         BNE 5$
2451         SETOM GLPFIL
2452         SETOM GB.FF(H)          ; BE SURE TO GET NEW PAGE
2453 5$:     MOV #%GBWRT,GB.STA(H)   ;QUEUE TO P.I. LEVEL
2454         MOV GB.NXT(H),H         ;ADVANCE TO NEXT BUFFER
2455         MOV H,GLPOIP
2456         MASK 6                  ;STOP P.I. LEVEL (HAVE TO LOCK OUT GLPBRK & CLKBRK)
2457         TST GLPOAC              ;PRINTER ON?
2458         BNE 3$                  ;YUP
2459         MOV #%GCOFF,@#GLPCSR    ;NO, CLEAR OLD STUFF IN INTERFACE
2460         TST GLPGF1              ;AND PUT IN LOW-SPEED GRAPHIC MODE IF NECC      
2461         BEQ 6$
2462         MOV #%GCGRF,@#GLPCSR
2463         MOV #%GCLSL,@#GLPCSR    ;LOW SPEED (COME ON, THIS IS ONLY A KL10!)
2464 6$:     MOV #%GCON,@#GLPCSR     ;TURN IT ON
2465         MOV #%GCION,@#GLPCSR    ;TURN ON INTERRUPTS
2466         SETOM GLPOAC
2467 ;       PUSH @#PS               ;FAKE AN INTERRUPT
2468 ;       CALL GLPBRK             ;IS THIS NECESSARY?
2469 3$:     UNMASK
2470         RET
2471
2472 ;GOULD LPT VARIABLES
2473
2474 GLPCOL: 0               ;CURRENT COLUMN NUMBER
2475 GLPROW: 0               ;CURRENT ROW NUMBER
2476  GLPRMX==67.            ;NUMBER OF LINES PER PAGE
2477 GLPLIM: 0               ;ADDRESS OF END OF CURRENT BUFFER
2478 GLPOAC: 0               ;NON-ZERO => GOULD LPT P.I. ACTIVE
2479 GLPGF1: 0               ;NON-ZERO => GOULD LPT IN GRAPHIC MODE
2480 GLIMBO: 0               ;SAVE CHAR HERE WHEN RUN OUT OF BUFFERS
2481 GLIMBF: 0               ;NON-ZERO => CHAR IN GLIMBO
2482 GLPFIL: 0               ;NON-ZERO => IN MIDDLE OF A FILE
2483 GLPTIM: 10.             ;COUNT DOWN WHEN LOSING
2484 GLPERR: 0               ;NON-ZERO => ERROR STATUS FROM P.I.
2485 .ENDC   ;GOULDP
2486 \f
2487         .SBTTL T-300 DISK
2488
2489 .IFNZ T300P
2490
2491 ;DISK UNIBUS REGISTERS
2492
2493 DSKCRA=176700                   ;COMPLETION REGISTER A
2494  %DAPON==100000                 ;SPONTANEOUS COMPLETION DUE TO POWER-ON.  DISK NUMBER
2495                                 ; IN LOW BITS OF COMMAND-COMPLETION REGISTER B
2496  %DACQE==10000                  ;CONSISTENCY ERROR IN COMMAND QUEUE
2497  %DANXM==4000                   ;NXM ERROR IN COMMAND QUEUE
2498  %DAPAR==2000                   ;PARITY ERROR IN COMMAND QUEUE
2499                                 ;LOW 2 BITS OF COMMAND COMPLETION REGISTER A AND
2500                                 ;COMMAND COMPLETION REGISTER B CONTAIN THE ADDRESS
2501                                 ;OF THE PARITY OR NXM ERROR
2502 DSKCRB=176702                   ;COMPLETION REGISTER B
2503 DSKCSR=176704                   ;COMMAND/STATUS REGISTER
2504  %DCCPL==100000                 ;COMMAND IS COMPLETE, RESET BY %DCACK.  READ-ONLY
2505  %DCDER==40000                  ;"DMA ERROR", RESET ONLY BY SYSTEM RESET.
2506                                 ;1=NORMAL, 0=ERROR
2507                                 ;BITS 30004 ALWAYS ON
2508  %DCMNT==4000                   ;HOST-ADAPTOR MAINTENANCE MODE
2509  %DCRST==2000                   ;RESET.  WRITE-ONLY.
2510  %DCACK==1000                   ;ACKNOWLEDGE COMMAND COMPLETION.  WRITE-ONLY
2511  %DCCMD==400                    ;TAKE COMMAND FROM CTRA/CTRB.  WRITE-ONLY
2512  %DCRDY==200                    ;READY TO TAKE A COMMAND.  READ-ONLY
2513  %DCTIE==100                    ;COMMAND TRANSMISSION (%DCRDY) INTERRUPT ENABLE
2514  %DCCIE==40                     ;COMMAND COMPLETION (%DCCPL) INTERRUPT ENABLE
2515  %DCPCY==20                     ;POWER JUST CYCLED ON OR OFF.  READ-ONLY
2516  %DCPON==10                     ;POWER ON.  READ-ONLY
2517  %DCDMA==2                      ;DMA IN PROGRESS.  READ-ONLY
2518  %DCBOT==1                      ;BOOT (READ DRIVE 0 SECTOR 0 INTO MEMORY 0).  WRITE-ONLY
2519 DSKCTA=176706                   ;COMMAND TRANSMISSION A (ADDRESS OF RQB HIGH BITS)
2520 DSKCTB=176710                   ;COMMAND TRANSMISSION B (ADDRESS OF RQB LOW BITS)
2521 ;176714 DUPLICATES DSKCSR FOR UNKNOWN REASONS
2522 \f
2523 ;DISK REQUEST BLOCK.  WE ONLY HAVE ONE SINCE NO SEEK OVERLAP.
2524
2525 RQBACT: 0               ;NON-ZERO IF REQUEST ACTIVE AND EXPECTING COMPLETION
2526
2527 RQBID:  0               ;RETURNED IN CCRB WHEN COMMAND COMPLETES
2528 RQBSTS: 0               ;STATUS STORED BY 2561, COPIED INTO DSCSTS
2529 RQBFLT: 0               ;FAULT CODE IN HIGH BYTE, BITS 1-0 HIGH BITS OF LINK ADDRESS
2530 RQBLNK: 0               ;LINK ADDRESS TO NEXT RQB (MUST BE ZERO)
2531 RQBCMD: 0               ;COMMAND CODE, COPIED FROM DSCCMD
2532 RQBDRV: 0               ;UNIT NUMBER, COPIED FROM DSCDRV
2533 RQBCYL: 0               ;CYLINDER NUMBER, COPIED FROM DSCCYL
2534 RQBHED: 0               ;HEAD NUMBER, COPIED FROM DSCHED
2535 RQBSEC: 0               ;SECTOR NUMBER, COPIED FROM DSCSEC
2536 RQBWC:  0               ;POSITIVE WORD COUNT (ALWAYS 12.*256.)
2537 RQBMA:  0               ;MEMORY ADDRESS (ALWAYS DSKBUF)
2538 RQBMAH: 0               ;MEMORY ADDRESS HIGH (ALWAYS 0)
2539                         ; BITS 1-0 BITS 17-16 OF ADDRESS.  BIT 6 MA INCR INH
2540 RQBID1: 0               ;RETURNS RECORD ID 1
2541 RQBID2: 0               ;RETURNS RECORD ID 2
2542 RQBMNT: .BLKW 27.       ;DIAGNOSTIC DATA MAY BE RETURNED
2543
2544 ;DISK BUFFER.  HOLDS ENOUGH 12-BIT BYTES IN 16-BIT WORDS TO MAKE 1024. 36-BIT WORDS
2545 DSKBUF: .BLKW 3.*1024.
2546 \f
2547 ;ROUTINE TO START DISK IF IT IS READY AND THERE IS A REQUEST.
2548 DSKSTR: TST DSCREQ              ;ANY REQUEST FROM 10?
2549         BEQ 99$                 ;NO, EXIT
2550         CMP DSCCHK,#2561
2551         BNE 99$                 ;CHECK WORD WRONG, DON'T TOUCH DISK
2552         TST RQBACT              ;PREVIOUS OPERATION FINISHED?
2553         BEQ 10$
2554         BPT                     ;NO, MUST BE BUG IN 10?
2555 10$:    TSTB DSKCSR             ;TEST IF READY FOR COMMAND TRANSMISSION
2556         BPL 99$                 ;NO, WAIT
2557         CLR DSCDON              ;YES, CLEAR 10/11 COMMUNICATION FLAGS
2558         CLR DSCREQ
2559         CLR RQBLNK              ;SET UP RQB FROM 10'S PARAMETERS
2560         MOV DSCCMD,RQBCMD
2561         MOV DSCDRV,RQBDRV
2562         MOV DSCCYL,RQBCYL
2563         MOV DSCHED,RQBHED
2564         MOV DSCSEC,RQBSEC
2565         MOV #12.*256.,RQBWC
2566         MOV #DSKBUF,RQBMA
2567         CLR RQBMAH
2568         CMP RQBCMD,#%DMWRT      ;IF A WRITE COMMAND, MUST COPY DATA BUFFER
2569         BNE 30$
2570         MOV #DSKBUF,D
2571         .REPT 4                 ;TAKES 4 BYTE POINTERS TO DO IT
2572         MOV #DSCPNT+<2*.RPCNT>,H
2573         .REPT 3                 ;EACH BYTE POINTER HAS 768 12-BIT BYTES
2574         MOV #256.,C
2575         CALL MOVHD
2576         .ENDR   
2577         .ENDR
2578 30$:    CLR DSKCTA              ;GIVE ADDRESS OF RQB TO 2561
2579         MOV #RQBID,DSKCTB
2580         SETOM RQBACT            ;TELL INTERRUPT LEVEL INTERRUPT EXPECTED
2581         MOV #%DCCMD+%DCCIE,DSKCSR       ;GIVE COMMAND, ENABLE COMPLETION INTERRUPT
2582 99$:    RET                     ;DONE
2583
2584 ;CALL HERE WHEN DISK INTERRUPTS
2585 DSKBRK: PUSH <A,B,C,D,H,I>      ;SAVE ALL REGISTERS
2586         MOV DSKCSR,A
2587         BIT #%DCPCY,A           ;POWER CYCLED?
2588         BNE 5$                  ;YES, RESET CONTROLLER AND IGNORE INTERRUPT
2589         BIT #%DCMNT,A           ;NO, MAINTAINENCE MODE
2590         BEQ 4$                  ;OK
2591         BPT                     ;BLEAH, MUST BE BROKEN
2592         BR 5$
2593
2594 4$:     BIT #%DCDER,A           ;WHAT ABOUT UNIBUS ERROR
2595         BNE 10$
2596         BPT
2597 5$:     MOV #%DCRST,DSKCSR      ;RESET THE CONTROLLER AND TURN OFF INTERRUPTS
2598         TST RQBACT              ;DID THIS LOSE IN THE MIDDLE OF A DISK OPERATION?
2599         BEQ 99$                 ;NO, DISMISS
2600         MOV #%DFRST,A           ;YES, GIVE ERROR STATUS
2601         CLR B
2602         BR 20$
2603
2604 10$:    BIT #%DCCPL,A           ;TEST FOR COMMAND COMPLETION
2605         BPL 99$                 ;NO, IGNORE INTERRUPT
2606         MOV DSKCRA,A            ;GET COMPLETION STATUS
2607         MOV DSKCRB,B
2608         MOV #%DCACK+%DCCIE,DSKCSR       ;ACKNOWLEDGE COMPLETION, ENABLE MORE INTERRUPTS
2609         TST RQBACT              ;EXPECTED?
2610         BEQ 99$                 ;NO, IGNORE
2611         BIT #%DAPON,A           ;POWER-UP INDICATION?
2612         BNE 99$                 ;FOR NOW, IGNORE IT
2613         BIT #%DACQE+%DANXM+%DAPAR,A
2614         BEQ 30$                 ;OK, NO COMMAND-QUEUE ERROR
2615         MOV #%DCRST,DSKCSR      ;RESET CONTROLLER (I DON'T KNOW IF IT NEEDS IT)
2616 20$:    MOV A,DSCFLT            ;COMMAND-QUEUE ERROR, GIVE STATUS TO PDP10
2617         MOV B,DSCSTS
2618         BR 80$
2619
2620 30$:    CLR DSCFLT              ;CLEAR HIGH BYTE
2621         MOVB RQBFLT+1,DSCFLT    ;PICK UP FAULT CODE, PUT IN LOW BYTE
2622         BEQ 35$                 ;IF FAULT CODE IS NON-ZERO, THE THING MAY BE FROZEN,
2623         MOV #%DCRST,DSKCSR      ;SO RESET IT.  OTHERWISE ERROR SEEMS TO HAPPEN OVER AND OVER
2624 35$:    MOV RQBSTS,DSCSTS       ;GIVE STATUS TO PDP10
2625         MOV RQBCYL,DSCCYL       ;STORE BACK DISK ADDRESS, MAY BE USEFUL TO PDP10
2626         MOV RQBHED,DSCHED
2627         MOV RQBSEC,DSCSEC
2628         BIT #%DMRED,RQBCMD      ;IF COMMAND WAS READ, COPY BUFFER BACK
2629         BEQ 80$
2630         MOV #DSKBUF,D
2631         .REPT 4                 ;TAKES 4 BYTE POINTERS TO DO IT
2632         MOV #DSCPNT+<2*.RPCNT>,H
2633         .REPT 3                 ;EACH BYTE POINTER HAS 768 12-BIT BYTES
2634         MOV #256.,C
2635         CALL MOVDH
2636         .ENDR
2637         .ENDR
2638 80$:    SETOM DSCDON            ;SIGNAL PDP10 OPERATION IS COMPLETE
2639         BIS #DLX10I,DLXCSR      ;AND INTERRUPT THE PDP10
2640         CLR RQBACT              ;NO LONGER EXPECTING COMPLETION ON THE RQB
2641 99$:    POP <I,H,D,C,B,A>       ;RESTORE REGISTERS AND EXIT INTERRUPT
2642         RTI
2643 .ENDC ;T300P
2644 \f
2645         .SBTTL SET LINE PARAMETERS
2646
2647 ;LINE INDEX IN I
2648 ;DH11 PARAM REG IN A
2649 ;BUFFER SIZE IN B
2650
2651 SPARAM: CMP I,#NFTTY
2652         BGE 1$
2653          BPT
2654 1$:     CMP I,#LASTTY
2655         BLE 2$
2656          BPT
2657 2$:     CMP B,#1.               ;MINIMUM BUFFER SIZE ONE CHARACTER
2658         BGE 3$
2659          MOV #1.,B
2660 3$:     CMP B,#MAXBSZ           ;MAXIMUM BUFFER SIZE <MAXBSZ> CHARACTERS
2661         BLE 4$
2662          MOV #MAXBSZ,B
2663 4$:     MOV B,BUFSIZ(I)         ;SET AMOUNT OF BUFFER TO BE USED FROM NOW ON
2664         MOV HDWR(I),H           ;(BUT NO LONGER DO WE ATTEMPT DYNAMIC BUFFER ALLOCATION)
2665         CMP H,#NLDHHX
2666         BHI 5$
2667         MASK 5                  ;LINE IS A DH11, HAVE TO SET LINE PARAM REG
2668         MOV DHLSEL(I),@DHSCR(H) ;SELECT THE LINE
2669         MOV A,@DHLPR(H)         ;GIVE LINE-PARAMETER REG TO DH11
2670         UNMASK
2671 5$:     MOV A,LPRVAL(I)         ;STORE LPR IN CASE SOMEONE IS CURIOUS
2672         RET
2673 \f
2674         .SBTTL DH11 INPUT INTERRUPT
2675
2676 .REPT NDHS
2677 CONC DH,\.RPCNT+1,<IBK: JSR H,DHIBK>
2678           2*.RPCNT
2679 .ENDR
2680
2681 DHIBK:  MOV (H),H                       ;PICK UP HARDWARE INDEX
2682         PUSH <A,B,I>
2683 1$:     MOV @DHNRC(H),A                 ;RECIEVE A CHARACTER
2684         BPL DHIEX                       ;EXIT INTERRUPT IF NO MORE CHARS
2685         MOV A,I                         ;EXTRACT LINE NUMBER
2686         SWAB I
2687         BIC #177760,I
2688         ASL I
2689         ADD DHTYNO(H),I
2690 .IFNZ NDHUN
2691         CMP I,#NLDHTY                   ;IGNORE NON-EXISTENT LINES
2692         BHI 1$
2693 .ENDC
2694         CALL @TTYIPC(I)                 ;CALL LINE HACKER
2695         BR 1$                           ;AND CHECK FOR MORE
2696
2697 DHIEX:  POP <I,B,A,H>
2698         RTI
2699
2700 ;NORMAL DH11 INPUT
2701
2702 DHNRMI: BIT #%DXPAR,A
2703         BEQ 1$                          ;IGNORE IF PARITY ERROR
2704 10$:     RET
2705 1$:     BIT #%DXBRK,A                   ;IF BREAK,
2706         BEQ RCV
2707         TST AUTOSP(I)                   ;AND LINE WANTS AUTOSPEED-ON-BREAK FEATURE
2708         BPL 10$
2709 ASPMD:  MOV #DHASP,TTYIPC(I)            ;PUT IT IN AUTOSPEED MODE
2710         MOV DHLSEL(I),@DHSCR(H)         ;AND SET HARDWARE TO 1200 BAUD
2711         MOV #023103,@DHLPR(H)
2712         RET
2713
2714 ;CHAR IN A RECEIVED FROM LINE IN I
2715 RCV:    BIC #177400,A                   ;8-BIT CHAR RECEIVE
2716 RCV.FW: TST NO.ITS                      ;ENTER HERE FOR FULL WORD RECEIVE
2717         BEQ 10$
2718 21$:    MOV #DWNMSG,A                   ;ITS DOWN, GIVE MESSAGE
2719 12$:    CALL GIVMSG
2720         RET
2721
2722 10$:    MOV #TYIRNG,B
2723         CMP RINGCT(B),#TYIRSZ-2
2724         BGT 11$
2725         CALL PUT                        ;FIRST PUT THE CHARACTER
2726         MOV I,A
2727         ASR A
2728         CALL PUT                        ;THEN THE TENNISH LINE NUMBER
2729         RET
2730
2731 11$:    MOV #IBOMSG,A                   ;INPUT BUFFER OVERFLOW
2732         BR 12$
2733
2734 .IFNZ NMPTYS            ;HANDLE INPUT FROM THE MULTIPLEXOR LINE
2735 MPXINP: TST MPXENB
2736         BEQ RCV
2737         MOV MPXSEL,I                    ;CURRENT INPUT LINE
2738         TSTB A                          ;SPECIAL CHAR?
2739         BMI 1$
2740         JMP @TTYIPC(I)                  ;NO, RECEIVE ON APPROP LINE
2741
2742 1$:     MOV A,I                         ;SPECIAL CHAR, EXTRACT LINE#
2743         BIC #177700,I
2744 ;FOLLOWING FEATURE COMMENTED OUT SINCE IT CAUSES 11 TO LOOP
2745 ; WHEN NEXT INPUT ARRIVES -- NOT OBVIOUS HOW TO FIX.
2746 ;       CMP I,#77                       ;SELECT NON-MULTIPLEX INPUT?
2747 ;       BEQ 3$                          ;YES, DO SO
2748         ASL I
2749         ADD #NFMPTY,I
2750         CMP I,#LASTTY
2751         BHI 2$                          ;OUT OF RANGE, IGNORE
2752         MOV I,MPXSEL                    ;INPUT SELECT, SAVE LINE#
2753 2$:     RET
2754
2755 3$:     MOV #MPXIDX,MPXSEL              ;SELECT PASS THROUGH
2756         RET
2757 .ENDC ;NMPTYS
2758 \f
2759 ;AUTOSPEED MODE COMES HERE WHEN CHAR RECIEVED
2760
2761 DHASP:  BIC #177400,A                   ;CLEAR FRAMING ERR, ETC.
2762         BEQ ASP10                       ;11 0'S = 110 BAUD
2763         CMP A,#200                      ;7 0'S, 1 = 150 BAUD
2764         BEQ ASP15
2765         CMP A,#170                      ;3 0'S, 4 1'S, 0 = 300 BAUD
2766         BEQ ASP30
2767         CMP A,#370                      ;300/600 IS NOW RUBOUT, NOT I
2768         BEQ ASP36
2769         CMP A,#146                      ;1 0, 2 1'S, 2 0'S, ... = 600
2770         BEQ ASP60
2771         CMP A,#340                      ;5 0'S, 3 1'S ? MYSTERY TO ME
2772         BEQ ASP60
2773         CMP A,#015                      ;CR = 1200
2774         BEQ ASP120
2775         CMP A,#215                      ;CR WITH EITHER PARITY
2776         BEQ ASP120
2777         MOV A,#.                        ;SAVE GARBAGE FOR DEBUGGING
2778         RET                             ;SOMETHING ELSE, IGNORE
2779
2780 ASP10:  MOV #006307,A                   ;110 IN, 110 OUT, NO PARITY, 8 BITS, EXTRA STPBT
2781         MOV #5,B
2782         MOV #12200,-(SP)
2783         BR ASPX
2784
2785 ASP15:  MOV #012503,A                   ;150 IN, 150 OUT, NO PARITY, 8 BITS
2786         MOV #7,B
2787         MOV #13300,-(SP)
2788         BR ASPX
2789
2790 ASP30:  MOV #016703,A                   ;300 IN, 300 OUT, NO PARITY, 8 BITS
2791         MOV #15.,B
2792         MOV #14400,-(SP)
2793         BR ASPX
2794
2795 ASP36:  MOV #020703,A                   ;300 IN, 600 OUT, NO PARITY, 8 BITS
2796         MOV #30.,B
2797         MOV #14100,-(SP)
2798         BR ASPX
2799
2800 ASP60:  MOV #021003,A                   ;600 BAUD, NO PARITY, 8 BITS
2801         MOV #30.,B
2802         MOV #11100,-(SP)
2803         BR ASPX
2804
2805 ASP120: MOV #023103,A                   ;1200 IN, 1200 OUT, NO PAR, 8 BITS
2806         MOV #60.,B
2807         MOV #15500,-(SP)
2808         BR ASPX
2809
2810 ASPX:   CALL SPARAM                     ;SET BUFFER SIZE AND HARDWARE SPEED
2811         MOV I,A                         ;SET UP SET-SPEED COMMAND TO -10
2812         ASR A
2813         BIS (SP)+,A
2814         TST TTYHNG(I)                   ;IF THIS IS NEW STATUS FOR 10,
2815         BNE 11$
2816         INC HNGSIG                      ;INDICATE STATUS WAITING
2817 11$:    MOV A,TTYHNG(I)                 ;SAVE THIS LINE'S LATEST STATUS
2818         MOV #ASPACK,A                   ;ACKNOWLEDGE TO USER THAT HE WON
2819         CALL GIVMSG
2820         DEC TYPING(I)                   ;IF NO WAKEUP FOR 10, HIT CALL WHEN TYPING DONE
2821         MOV NRMIPC(I),TTYIPC(I)         ;AND TAKE LINE OUT OF AUTOSPEED MODE
2822         RET
2823 \f
2824         .SBTTL DH11 OUTPUT INTERRUPTS
2825
2826 .REPT NDHS
2827 CONC DH,\.RPCNT+1,<OBK: JSR H,DHOBK>
2828           2*.RPCNT
2829 .ENDR
2830
2831 DHOBK:  MOV (H),H                       ;GET HARDWARE UNIT NUMBER
2832         BIT #DHSNXM,@DHSCR(H)           ;IS THIS INTERRUPT DUE TO NXM?
2833         BEQ 1$
2834          BPT                            ;YES
2835 1$:     BIC #DHTDON,@DHSCR(H)           ;HARDWARE KLUDGE TO MAKE INTERRUPTS WIN
2836         PUSH <A,B,C,I>
2837         MOV DHOAC(H),C                  ;SEE WHICH BAR BITS HAVE TURNED OFF
2838         BIC @DHBAR(H),C
2839         BIC C,DHOAC(H)
2840         MOV DHTYNO(H),I
2841         ADD #15.*2,I
2842 2$:     BIT DHLBIT(I),C
2843         BEQ 4$
2844 .IFNZ NMPTYS
2845         CMP I,#MPXIDX
2846         BNE 3$
2847         CALL MPXDON
2848 .ENDC ;NMPTYS
2849 3$:
2850 .IFNZ NDHUN
2851         CMP I,#NLDHTY                   ;IGNORE NON-EXISTENT LINES
2852         BHI 4$
2853 .ENDC
2854         CALL XMTDON
2855 4$:     SUB #2,I
2856         CMP I,DHTYNO(H)
2857         BGE 2$
2858 DHOEX:  POP <I,C,B,A,H>
2859         RTI
2860
2861 XMTDON: TST TYPING(I)           ;HERE WHEN OUTPUT FINISHES
2862         BGT 1$                  ;BRANCH IF -10 WANTS TO KNOW ABOUT IT
2863         BEQ 3$                  ;BRANCH IF NOTHING TO DO
2864         MOV #32,A               ;SEND A CALL
2865         CALL RCV
2866         BR 3$
2867
2868 1$:     MOV I,A
2869         ASR A                   ;PUT TENNISH LINE NUMBER INTO RING
2870         MOV #TYORNG,B           ;MAIN PROG LEVEL WILL LATER TELL -10
2871         CALL PUT
2872 3$:     CLR TYPING(I)
2873         RET
2874
2875 .IFNZ NMPTYS    ;OUTPUT DONE ON MULTIPLEXED LINE
2876 MPXDON: PUSH <C,D,H,I>
2877         TST MPXOAC
2878         BGE 1$
2879         NEG MPXOAC      ;SENT HEADER, NOW SEND DATA
2880         MOV MPXOLN,A
2881         MOV MPXPNT(A),D
2882         MOV MPXNBT(A),C
2883         CLR MPXNBT(A)
2884         CALL @STROUT(H) 
2885         BR 9$
2886
2887 1$:     MOV MPXOLN,I    ;OUTPUT IS DONE ON THAT LINE NOW
2888         ADD #NFMPTY,I
2889         CALL XMTDON
2890         CLR MPXOAC      ;MPX IDLE
2891         CALL STRMPX     ;LOOK FOR NEW STUFF TO DO
2892 9$:     POP <I,H,D,C>
2893         RET
2894 .ENDC ;NMPTYS
2895 \f
2896         .SBTTL DL11 INTERRUPTS
2897
2898 .REPT NDLS
2899 CONC DL,\.RPCNT+1,<IBK: JSR H,DLIBK>
2900         NFDLHX+<2*.RPCNT>
2901 CONC DL,\.RPCNT+1,<OBK: JSR H,DLOBK>
2902         NFDLHX+<2*.RPCNT>
2903 .ENDR
2904
2905 DLIBK:  MOV (H),H               ;GET HARDWARE INDEX OF INTERRUPTING UNIT
2906         PUSH <A,B,I>
2907         MOV @DLKB(H),A          ;GET RECEIVED CHARACTER
2908         MOV DLTYNO(H),I         ;GET LINE NUMBER RECEIVED ON
2909 .IFNZ DTE20P
2910         BNE 2$                  ;ONLY T00 CAN RETURN TO KLDCP
2911         BIT #20000,A            ;IF BREAK KEY IS HIT
2912         BEQ 1$
2913         SETOM KLDCPF            ;USER WANTS TO RETURN TO KLDCP
2914         BR DLBKEX               ;FOR ONE COMMAND LINE
2915
2916 1$:     TST DDTMOD              ;IF IN DDT MODE,
2917         BEQ 2$
2918         BIC #-200,A             ; HANDLE INPUT DIFFERENTLY
2919         MOV A,DDTCHR
2920         BR DLBKEX
2921
2922 2$:
2923 .ENDC ;DTE20P
2924         CALL @TTYIPC(I)
2925 DLBKEX: POP <I,B,A,H>
2926         RTI
2927
2928 DLOBK:  MOV (H),H               ;GET HARDWARE INDEX OF INTERRUPTING UNIT
2929         TST DLOAC(H)
2930         BEQ DLBKX1              ;NOT SUPPOSED TO BE TYPING OUT, IGNORE INT
2931         DEC DLBC(H)             ;GOT ANY MORE CHARACTERS?
2932         BLT DLBKX2              ;NO, GO GIVE OUTPUT DONE
2933         MOV DLCA(H),-(SP)       ;YES, GIVE NEXT CHARACTER
2934         MOVB @(SP)+,@DLPB(H)
2935         INC DLCA(H)
2936 DLBKX1: POP H
2937         RTI
2938
2939 DLBKX2: PUSH <A,B,I>            ;OUTPUT DONE
2940         MOV DLTYNO(H),I         ;GET TTY INDEX OF INTERRUPTING LINE
2941         CLR DLOAC(H)            ;OUTPUT NO LONGER ACTIVE ON THIS LINE
2942         CALL XMTDON
2943         BR DLBKEX
2944 \f
2945         .SBTTL CLOCK INTERRUPT
2946
2947 ;NOTE - IT IS IMPORTANT THAT THIS BE AT A HIGHER INTERRUPT LEVEL THAN THE CHAOS NET
2948 CLKBRK: SETOM WAKE              ;WAKE UP MAIN LOOP
2949 .IFNZ GOULDP
2950         PUSH @#PS               ;CHECK GOULD LPT
2951         CALL GLPBRK             ;(LOSES INTERRUPTS)
2952         DEC GLPTIM              ;TIME TO CHECK GOULD LPT?
2953         BGT 13$                 ;NOT YET
2954         MOV #10.*60.,GLPTIM
2955         BIT #%GSNRD,@#GLPCSR    ;YES, LOSING?
2956         BNE 14$                 ;PROBABLY
2957         CLR GLPERR              ;PROBABLY NOT
2958         BR 13$                  ;(CAN'T TELL FOR SURE IF %GCON NOT DONE)
2959
2960 14$:    MOV @#GLPCSR,GLPERR     ;LPT LOSING, TELL 10
2961         CALL GLPRST             ;AND MAKE SURE BUFFERS DON'T CHOKE UP
2962 .ENDC ;GOULDP
2963 13$:    PUSH <A,B,I>
2964 .IFNZ NDMS      ;MODEM SCANNER GETS SHUT OFF SOMEHOW
2965         CLR A   ;loop over the DM11s, turning them on
2966         MOV #NDMS,B
2967 259$:   BIT #DMSCN,@DMCSR(A)
2968         BEQ 14$
2969         BIT #DMIEN,@DMCSR(A)
2970         BNE 15$ 
2971 14$:    MOV #DMSCN+DMIEN,@DMCSR(A)      ;ENABLE SCANNER INTERRUPTS
2972 15$:    TST (A)+                        ;next DM11
2973         SOB B,259$              ;until all DM11s done
2974
2975 .ENDC ;NDMS
2976 .IFNZ CHAOSP    ;WAKE-UP OUTPUT LINKS IN RE-TRANSMIT DELAY
2977         MOV #CHXCHS,I
2978 50$:    MOV CHOHWR(I),A         ;ADDRESS OF HARDWARE CSR
2979         TST CHOSTS(I)           ;IF ZERO, IS IDLE, DON'T WANT INTERRUPT ENABLE
2980         BEQ 51$                 ;NOTE THAT THIS RUNS MASKED HIGHER THAN CHAOS INT LVL
2981         BIS #%CATEN,(A)         ;RE-ENABLE INTERRUPT IF OFF
2982 51$:
2983 .IFNZ CHSBTB
2984         BIT #%CATDN,(A)         ;TRANSMIT-DONE?
2985         BNE 59$
2986         INC CHSIDL(I)           ;NO, KEEP TIME-OUT
2987         CMP CHSIDL(I),#60.      ;IF TRANSMIT-DONE STUCK OFF FOR 1 SECOND,
2988         BLO 59$
2989         MOV #%CARST,(A)         ; THEN RESET THE INTERFACE
2990 ;       MOV #%CAREN+%CATEN,(A)  ;INTERRUPT ENABLES WILL TURN THEMSELVES BACK ON IF NECESSARY!
2991         INC CHSRST(I)           ;COUNT NUMBER OF TIMES HAD TO DO THIS
2992 59$:
2993 .ENDC ;CHSBTB
2994 .IFG CHAOSP-1
2995         TST (I)+
2996         CMP I,#CHXCHS+CHAOSP+CHAOSP
2997         BLO 50$
2998 .ENDC ;CHAOSP-1
2999         DEC PULSAR              ;TIME TO GENERATE TEST PACKET TO CHAOS NET?
3000         BGT 66$                 ;NOT YET
3001         MOV PULSON,PULSAR       ;RE-INITIALIZE COUNTER
3002 .REPT CHAOSP                    ;YES, AWAKEN ALL TRANSMIT INTERRUPT SIDES
3003         BIS #%CATEN,@CHOHWR+CHXCHS+<2*.RPCNT>
3004 .ENDR
3005 .IFNZ TEN11P
3006         TST CHOSTS+CHXT11       ;AWAITING BUFFER FROM 10?
3007         BNE 65$                 ;YES, COUNT TIMEOUT
3008         CLR T11TIM              ;NO, RESET TIMEOUT
3009 65$:    INC T11TIM
3010 .ENDC ;TEN11P
3011 66$:    DEC 4SEC                ;TIME FOR 4-SECOND CLOCK?
3012         BGT 90$
3013         MOV #4*60.,4SEC         ;YES
3014         MOV #<NSUBNT-1>*2,I     ;INCREMENT ROUTING COSTS
3015 71$:    TST SBNTYP(I)           ;THIS GUY'S COSTS SUPPOSED TO INCREMENT?
3016         BNE 72$                 ;NOPE
3017         CMP SBNCST(I),#1000     ;DON'T INCREMENT TOO HIGH AND OVERFLOW
3018         BHIS 72$
3019         INC SBNCST(I)           ;YEP
3020 72$:    SUB #2,I
3021         BPL 71$
3022         DEC 15SEC               ;TIME FOR 15-SECOND CLOCK? (REALLY 16)
3023         BGT 90$
3024         MOV #4,15SEC            ;YES
3025 .REPT CHAOSP                    ;TELL CABLES TO BROADCAST %CORUT PACKETS
3026         SETOM CHXRTF+CHXCHS+<2*.RPCNT>
3027         BIS #%CATEN,@CHOHWR+CHXCHS+<2*.RPCNT>
3028 .ENDR
3029 .IIF NZ ETHERP, SETOM CHXRTF+CHXETH     ;TELL ETHERNET TO BROADCAST ROUTING
3030 90$:                            ;CAN'T DO IT NOW BECAUSE WRONG INTERRUPT LEVEL
3031 .ENDC ;CHAOSP
3032 .IF DF NDVRBF
3033         INC DVRTIM              ;TIME OUT DOVER CONNECTION
3034         CMP DVRTIM,#15.*60.     ;IF IDLE FOR 15 SECONDS, FLUSH
3035         BLO 15$
3036         CLR DVRHST
3037         CLR DVRMSK
3038 15$:    INC DVRRTR              ;COUNT UP RETRANSMISSION COUNTER
3039 .ENDC ;NDVRBF
3040 .IFNZ NDMS                      ;GOT ANY TTYS WITH MODEM CONTROL?
3041         MOV #NFTTY,I            ;CHECK FOR HANGUPS
3042 16$:    TST DIALED(I)           ;HANGUP IN PROGRESS ON THIS LINE?
3043         BPL 17$                 ;NO
3044         INC DIALED(I)           ;YES, TIMED OUT?
3045         BMI 17$
3046         CLR DIALED(I)           ;YUP, LINE IS HUNG UP
3047         MOV I,A                 ;TELL -10 ABOUT IT
3048         ASR A
3049         TST TTYHNG(I)           ;IF THIS IS NEW STATUS FOR 10,
3050         BNE 18$
3051         INC HNGSIG              ;INDICATE STATUS WAITING
3052 18$:    MOV A,TTYHNG(I)         ;SAVE THIS LINE'S LATEST STATUS
3053 17$:    ADD #2,I
3054         CMP I,#LASTTY
3055         BLO 16$
3056 .ENDC ;NDMS
3057         POP <I,B,A>
3058
3059         ROR SWR                 ;LOW BIT OF SWITCHES => DDT
3060         BCC CLKEX
3061         BPT
3062 CLKEX:  RTI
3063 \f.IFNZ NDMS
3064         .SBTTL MODEM CONTROL
3065
3066 ;;; hack multiple DM interrupt vectors
3067 .REPT NDMS
3068 CONC DM,\.RPCNT+1,<BRK: JSR H,DMBRK>
3069         2*.RPCNT
3070 .ENDR ;NDMS
3071
3072
3073 DMBRK:  PUSH <A,B,I>
3074         MOV (H),A                       ;get the device offset in A
3075         MOV @DMCSR(A),I                 ;GET ASSOCIATED TTY INDEX
3076         BIC #177760,I                   ;gives us channel (0-17) on this DM11
3077         ;; now add <device # * 16.> to get offset into table for any DM
3078         MOV A,B                         ;device offset in B, is 2*device number
3079         ASL B
3080         ASL B
3081         ASL B                           ;multiply by 8 for offset in B
3082         ADD B,I                         ;add to I for offset for this channel
3083         ASL I                           ;now get word offset in I by shifting
3084         ;; get index into map between DM channels and TTY indices
3085         MOV M2LMAP(I),I
3086         BEQ 90$                         ;EXIT IF THIS LINE NOT UNDER MODEM CONTROL
3087 ;       TST @DMCSR(A)   .SEE DMRNG
3088 ;       BPL 10$
3089 ;       TST DIALED(I)                   ;RINGING.  IS LINE DIALED UP ALREADY?
3090 ;       BNE 10$                         ;YES, NOT SUPPOSED TO BE RINGING
3091 ;       MOV #LINENB+LINDTR,@DMLSR(A)    ;ANSWER THE PHONE
3092
3093 10$:    BIT #LINCTS,@DMLSR(A)           ;DO WE HAVE CLEAR-TO-SEND?
3094         BEQ 20$                         ;NO
3095         TST DIALED(I)                   ;YES, WHAT WAS PREVIOUS STATE?
3096         BEQ 13$                         ;WAS OFF, THIS IS A DIALUP
3097         BPL 90$                         ;WAS ON, IGNORE
3098         NEG DIALED(I)                   ;WAS HANGING UP, ABORT IT
3099         BR 90$
3100
3101 13$:    INC DIALED(I)                   ;LINE IS NOW DIALED UP
3102         TST DMINI                       ;IF GETTING INITIAL STATE,
3103         BNE 90$                         ;DON'T HACK AUTOSPEED
3104         TST AUTOSP(I)                   ;IF IT HAS AUTOSPEED,
3105         BEQ 90$
3106         MOV HDWR(I),H                   ;HACK THAT
3107         CALL ASPMD
3108         BR 90$
3109
3110 20$:    TST DIALED(I)                   ;CTS DROPPED
3111         BMI 90$                         ;ALREADY KNOWN ABOUT, IGNORE
3112         MOV #-HNGDLY,DIALED(I)          ;OTHERWISE START HANGUP TIMEOUT
3113
3114 90$:    BIC #DMDON,@DMCSR(A)            ;RESTART SCANNER
3115         POP <I,B,A>
3116         POP H
3117         RTI
3118 .ENDC ;NDMS
3119 \f
3120 .IFNZ GOULDP
3121 .SBTTL GOULD PRINTER P.I. LEVEL
3122
3123 GLPBRK: BIT #%GSBSY,@#GLPCSR
3124         BEQ 1$
3125         RTI                             ;LPT BUSY, WAIT
3126
3127 1$:     BIT #%GSDON,@#GLPCSR
3128         BNE 2$
3129         RTI                             ;LPT BUSY OTHER FLAVOR
3130
3131 2$:     PUSH <A,B,H>
3132         BIT #%GSERR,@#GLPCSR            ;LPT LOSING?
3133         BEQ GLPBR1
3134         CALL GLPRST                     ;YUP, RESET THE BUFFERS
3135         MOV @#GLPCSR,GLPERR             ;AND TELL 10
3136
3137 GLPOFF: CLR GLPOAC                      ;HERE TO STOP P.I.
3138         MOV #%GCIOF,@#GLPCSR
3139         MOV #5000.,A                    ;LPT SOMETIMES BUSY FOR A WHILE
3140 1$:     BIT #%GSBSY,@#GLPCSR            ;HAVE TO WAIT SO TONER PUMPS WILL
3141         BEQ 2$                          ;REALLY TURN OFF
3142         SOB A,1$
3143 2$:     MOV #%GCOFF,@#GLPCSR
3144 GLPEX:  POP <H,B,A>
3145         RTI
3146
3147 GLPFIN: MOV #%GBIDL,GB.STA(H)           ;DONE WITH THIS BUFFER
3148         MOV GB.NXT(H),H                 ;CHECK NEXT
3149         MOV H,GLPOOP
3150
3151 GLPBR1: MOV GLPOOP,H                    ;CHECK ON BUFFERS
3152         CMP GB.STA(H),#%GBDMA           ;FINISH DMA XFER?
3153         BEQ GLPFIN                      ;YES
3154         CMP GB.STA(H),#%GBWRT           ;QUEUED OR ALREADY ACTIVE AT P.I.?
3155         BLT GLPOFF                      ;NO, STOP
3156         MOV #%GBPI,GB.STA(H)            ;YES, ACTIVATE IT AT P.I.
3157         TST GB.FF(H)                    ;NEED FF?
3158         BEQ 1$
3159         MOV #%GCFF,@#GLPCSR             ;YES
3160         CLR GB.FF(H)
3161         BR GLPEX
3162
3163 1$:     TST GB.NL(H)                    ;NEED BLANK LINES?
3164         BEQ 2$
3165         DEC GB.NL(H)                    ;YES, GIVE ONE
3166         MOV #%GCADV,@#GLPCSR
3167         BR GLPEX
3168
3169 2$:     MOV H,B                         ;SET UP TEXT ADDR
3170         ADD #GB.DAT,B
3171         MOV GB.PNT(H),A                 ;SET UP TEXT WORD COUNT
3172         NEG A
3173         MOV A,@#GLPWC
3174         MOV B,@#GLPCA                   ;START XFER
3175         MOV #%GBDMA,GB.STA(H)           ;FLAG BUFFER ACTIVE AT DMA LEVEL
3176         BR GLPEX
3177
3178 GLPRST: PUSH H
3179         MOV #GLPBFF,H                   ;FLUSH ALL BUFFERS
3180         MOV H,GLPOOP
3181         MOV H,GLPOIP
3182 3$:     CLR (H)+
3183         MOV (H),H
3184         CMP H,#GLPBFF
3185         BNE 3$
3186         MOV #60.*10.,GLPTIM             ;SET TIMEOUT
3187         POP H
3188         RET
3189
3190 .ENDC ;GOULDP
3191 \f
3192 .IFNZ CHAOSP
3193
3194         .SBTTL CHAOSNET ROUTINES
3195
3196 ;ALL ROUTINES ON THIS PAGE CALLED WITH INTERRUPTS MASKED, INDEX IN I.
3197
3198 ;REFILL FROM CHAOS INTERFACE
3199 CHSRFL: BIS #%CAREN,@CHIHWR(I)  ;TURN ON RECEIVER INTERRUPTS
3200         RET                     ;WILL NOTICE INPUT LATER
3201
3202 .IFNZ DL10P
3203 ;LOOPS BACK TO HERE WHEN DISCARDING A PACKET
3204 DLCRF1: CMP (SP)+,(SP)+         ;POP <D,H>
3205         POP A
3206         INC DLCSS1(A)           ;2 ;INDICATE BUFFER HAS BEEN COPIED
3207         BIS #DLX10I,DLXCSR      ;AND INTERRUPT THE PDP10
3208                                 ;DROP INTO DLCRFL
3209 ;REFILL FROM DL10
3210 DLCRFL: CALL DLCCHK             ;SEE IF DL10 IS DISABLED
3211         BNE 99$                 ;BRANCH IF YES
3212         MOV #2,A                ;CHECK BOTH 10 TO 11 BUFFERS SO CAN'T GET OUT OF PHASE WITH 10
3213 10$:    CMP DLCSS1(A),#1        ;10 SAYS BUFFER READY?
3214         BEQ 11$                 ;YES
3215         SUB #2,A                ;NO, TRY NEXT
3216         BPL 10$
3217         BR 99$                  ;NONE READY
3218
3219 11$:    PUSH A                  ;SAVE CURRENT 10 TO 11 BUFFER
3220         ADD #DLCSP1,A           ;OUTPUT READY, GET IT
3221         MOV #DLCIBF,B           ;COPY INTO BUFFER
3222 .REPT PKHDW                     ;FIRST GET HEADER
3223         MOV (A),(B)+
3224 .ENDR
3225         PUSH <A,B>
3226         CALL CHSIHD             ;PROCESS HEADER, GET LENGTH, DEST
3227         BVS DLCRF1              ;BRANCH IF PACKET NO GOOD
3228         POP <D,H>
3229         PUSH C
3230         SUB CHIHDL(I),C         ;GET NUMBER OF DATA WORDS TO FOLLOW
3231         CALL MOVHD              ;MOVE THOSE WORDS
3232         POP <C,A>               ;RESTORE LENGTH, 10 TO 11 BUFFER NUMBER
3233         INC DLCSS1(A)           ;2 ;INDICATE BUFFER HAS BEEN COPIED
3234         BIS #DLX10I,DLXCSR      ;AND INTERRUPT THE PDP10
3235         TST B                   ;SWAB IF NOT TO 10-COMPATIBLE DEST
3236         CALL SWAB10
3237         INC CHISTS(I)           ;INDICATE BUFFER READY TO SEND
3238 99$:    RET
3239
3240 ;TRANSMIT TO DL10 OUTPUT SINK
3241 ;REQUIRES I TO BE SET UP, SMASHES ALL REGS.
3242 DLCXMT: CALL DLCCHK             ;DL10 DISABLED?
3243         BNE 70$                 ;YES, DISCARD PACKET
3244         MOV DLCRBN,A            ;GET CURRENT 11 TO 10 BUFFER NUMBER
3245         CMP DLCRS1(A),#1        ;BUFFER READY?
3246         BNE 80$                 ;NO, WAIT
3247         MOV CHOINX+CHXDLC,D     ;GET ADDRESS OF BUFFER TO BE SENT OVER
3248         MOV CHILNG(D),C         ;AND LENGTH
3249         MOV CHIBFP(D),D
3250         MOV A,H                 ;GET POINTER TO DL10 MAGIC IDPB WORD
3251         ADD #DLCRP1,H
3252         CALL MOVDH              ;COPY WORDS INTO PDP10
3253         INC DLCRS1(A)           ;SIGNAL DATA AVAILABLE TO PDP10
3254         BIS #DLX10I,DLXCSR      ;AND INTERRUPT IT
3255         MOV DLCNXT(A),DLCRBN    ;SWITCH BUFFERS
3256 70$:    JMP CHSODN              ;TRANSMISSION IS DONE ALREADY
3257
3258 80$:    MOV #1,CHOSTS+CHXDLC    ;TRANSMISSION AWAITING BUFFER FROM 10
3259         RET
3260 \f
3261 ;CALL HERE WHEN DL10 INTERRUPTS, CLOBBERS ALL.
3262 DLCWAK: MASK 5
3263         TST CHOSTS+CHXDLC       ;DL10 HUNG ON TRANSMIT?
3264         BEQ 10$
3265         MOV #CHXDLC,I           ;YES, WAKE IT UP
3266         CALL DLCXMT
3267 10$:    TST CHISTS+CHXDLC       ;DL10 INPUT ACTIVE?
3268         BNE 20$
3269         MOV #CHXDLC,I           ;NO, TRY TO GET SOME
3270         CALL DLCRFL
3271         TST CHISTS(I)           ;GOT SOME?
3272         BLE 20$
3273         CALL CHSOUT             ;YES, START TRANSMISSION
3274 20$:    CALL CHSRUN             ;DO ANYTHING ELSE REQUIRED
3275         UNMASK
3276         RET
3277
3278 ;RETURN 'NE' IF DL10 IS DISABLED, BASHES NOTHING.
3279 DLCCHK: TST DLXOFF
3280         BNE 99$
3281         TST NO.ITS
3282         BNE 99$
3283         TST DLCINI              ;RE-INITIALIZE?
3284         BEQ 99$                 ;NO, EVERYTHING IS OK.
3285         CLR DLCRBN              ;YES
3286         TST CHOSTS+CHXDLC       ;WAS OUTPUT HUNG ON DL10?
3287         BEQ 90$
3288         PUSH <A,B,C,D,I,H>      ;YES, SIGNAL OUTPUT DONE ON DL10
3289         MOV #CHXDLC,I
3290         CALL CHSODN
3291         POP <H,I,D,C,B,A>
3292 90$:    CLR DLCINI              ;SIGNAL INIT DONE, RETURN 'EQ'
3293 99$:    RET
3294 .ENDC ;DL10P
3295 \f
3296 ;FAST BLOCK MOVE
3297 ;THESE CAN MOVE AT MOST 256. WORDS
3298
3299 ;MOV (H),(D)+
3300 ;SOB C,.-2
3301 MOVHD:  SUB #256.,C             ;GET -#WDS LESS THAN MAXIMUM
3302         ADD C,C                 ;CONVERT TO BYTES
3303         SUB C,PC                ;JUMP INTO MOVE TABLE
3304         .REPT 256.
3305         MOV (H),(D)+
3306         .ENDR
3307         RET
3308
3309 ;MOV (D)+,(H)
3310 ;SOB C,.-2
3311 MOVDH:  SUB #256.,C             ;GET -#WDS LESS THAN MAXIMUM
3312         ADD C,C                 ;CONVERT TO BYTES
3313         SUB C,PC                ;JUMP INTO MOVE TABLE
3314         .REPT 256.
3315         MOV (D)+,(H)
3316         .ENDR
3317         RET
3318 \f
3319 .IFNZ TEN11P
3320 ;REFILL FROM TEN-11 INTERFACE
3321 T11RFL: CALL T11CHK             ;CHECK FOR DISABLE
3322         BNE 99$                 ;BRANCH IF DISABLED
3323         MOV T11IBP,A
3324         TST T11IBA              ;WAS INPUT BUFFER IN USE?
3325         BEQ 10$
3326         CLR (A)+                ;YES, INDICATE BUFFER IS NOW EMPTY
3327         CLR (A)
3328         CLR T11IBA
3329         ADD #T11BFL-2,A         ;ADVANCE POINTER
3330         CMP A,#T11IBE
3331         BLO 7$
3332         MOV #T11IBF,A
3333 7$:     MOV A,T11IBP
3334 10$:    TST (A)                 ;INPUT BUFFER CONTAIN A PACKET?
3335         BEQ 99$                 ;NO
3336         SETOM T11IBA            ;YES, INPUT BUFFER NOW ACTIVE
3337         ADD #8,A                ;GET INPUT FROM PDP10
3338         MOV A,CHIBFP+CHXT11     ;AS CURRENT INPUT BUFFER
3339         CALL CHSIHD             ;PROCESS THE HEADER
3340         BVS T11RFL              ;BRANCH IF PACKET NO GOOD
3341         PUSH <A,B,C,H>          ;COMPUTE CHECKSUM BEFORE SWABBING
3342         INC C                   ;C GETS NUMBER OF 32-BIT WORDS
3343         ASR C
3344         CLR D                   ;CLEAR LOW WORD OF CHECKSUM
3345         CLR H                   ;CLEAR HIGH WORD OF CHECKSUM
3346         SUB #PKFCMS+1,PKFC(A)   ;DECREMENT FWD COUNT (IS HIGH END OF WORD)
3347                                 ;FWD COUNT HAS TO BE PUT BACK FOR CHECKSUM COMPUTATION
3348 21$:    ADD (A)+,H              ;ADD HIGH HALFWORD TO HIGH SUM
3349         ADD (A)+,D              ;ADD LOW HALFWORD TO LOW SUM
3350         ADC H                   ;CARRY INTO HIGH SUM
3351         MOV D,B                 ;NOW ROTATE RIGHT DOUBLE
3352         ROR B
3353         ROR H
3354         ROR D
3355         SOB C,21$
3356         MOV T11IBP,A            ;NOW COMPARE CHECKSUM
3357         CMP H,4(A)
3358         BNE 30$
3359         CMP D,6(A)
3360         BNE 30$ 
3361         POP <H,C,B,A>
3362         ADD #PKFCMS+1,PKFC(A)   ;INCREMENT FWD COUNT (IS HIGH END OF WORD)
3363         TST B                   ;SWAB IF NOT TO 10-COMPATIBLE DEST
3364         CALL SWAB10
3365         INC CHISTS(I)           ;INDICATE BUFFER READY TO SEND
3366 99$:    RET
3367
3368 30$:    POP <H,C,B,A>           ;CHECKSUM ERROR
3369         INC T11CKE              ;COUNT CHECKSUM ERRORS
3370         BR T11RFL               ;AND IGNORE PACKET
3371
3372 ;TRANSMIT TO TEN11 OUTPUT SINK
3373 ;REQUIRES I TO BE SET UP, SMASHES ALL REGS.
3374 T11XMT: CALL T11CHK             ;TEN11 DISABLED?
3375         BNE 70$                 ;YES, DISCARD PACKET
3376         TST @T11OBP             ;OUTPUT BUFFER EMPTY?
3377         BNE 80$                 ;NO, WAIT
3378         MOV CHOINX+CHXT11,D     ;GET ADDRESS OF BUFFER TO BE SENT OVER
3379         MOV CHIBFP(D),B
3380         MOV CHILNG(D),C         ;AND LENGTH
3381         MOV PKNBYT(B),A
3382         BIT #1,A                ;IF ODD NUMBER OF BYTES, CLEAR THE EXTRA ONE
3383         BEQ 5$
3384         BIC #PKNBMS,A
3385         ADD B,A
3386         CLRB PKDAT-1(A)         ;NOTE, AT THIS POINT BYTES ARE SWAPPED
3387 5$:     MOV T11OBP,A            ;COPY INTO TEN11 OUTPUT BUFFER
3388         ADD #8,A
3389         PUSH <H,C>
3390 10$:    MOV (B)+,(A)+
3391         SOB C,10$
3392         MOV (SP),C              ;NOW COMPUTE CHECKSUM
3393         INC C                   ;C GETS NUMBER OF 32-BIT WORDS
3394         ASR C
3395         BCS 11$
3396         CLR (A)+                ;IF ODD NUMBER OF 16-BIT WORDS, CLEAR THE EXTRA ONE
3397 11$:    CLR D                   ;CLEAR LOW WORD OF CHECKSUM
3398         CLR H                   ;CLEAR HIGH WORD OF CHECKSUM
3399         MOV T11OBP,A
3400         ADD #8,A
3401 21$:    ADD (A)+,H              ;ADD HIGH HALFWORD TO HIGH SUM
3402         ADD (A)+,D              ;ADD LOW HALFWORD TO LOW SUM
3403         ADC H                   ;CARRY INTO HIGH SUM
3404         MOV D,B                 ;NOW ROTATE RIGHT DOUBLE
3405         ROR B
3406         ROR H
3407         ROR D
3408         SOB C,21$
3409         MOV T11OBP,A            ;STORE CHECKSUM INTO OUTPUT BUFFER
3410         MOV H,4(A)
3411         MOV D,6(A)
3412         POP <C,H>
3413         SETOM (A)               ;SIGNAL PRESENCE OF PACKET TO PDP10
3414         ADD #T11BFL,A           ;ADVANCE POINTER
3415         CMP A,#T11OBE
3416         BLO 30$
3417         MOV #T11OBF,A
3418 30$:    MOV A,T11OBP
3419 70$:    CLR T11TIM              ;NO TIMEOUT, 10 IS TAKING PACKETS
3420         JMP CHSODN              ;TRANSMISSION IS DONE ALREADY
3421
3422 80$:    MOV #1,CHOSTS+CHXT11    ;TRANSMISSION AWAITING BUFFER FROM 10
3423         RET
3424 \f
3425 ;WHACK YOUR TEN11
3426 T11WAK: MASK 5
3427         MOV #CHXT11,I
3428         CALL T11CHK             ;IS 10 UP?
3429         BNE 30$                 ;IT'S DOWN, PUNT IT
3430         TST CHOSTS(I)           ;TEN11 HUNG ON TRANSMIT?
3431         BEQ 10$
3432         CALL T11XMT             ;YES, WAKE IT UP
3433 10$:    TST CHISTS+CHXT11       ;TEN11 INPUT ACTIVE?
3434         BNE 20$
3435         MOV #CHXT11,I           ;NO, TRY TO GET SOME
3436         CALL T11RFL
3437         TST CHISTS(I)           ;GOT SOME?
3438         BLE 20$
3439         CALL CHSOUT             ;YES, START TRANSMISSION
3440 20$:    CALL CHSRUN             ;DO ANYTHING ELSE REQUIRED
3441         UNMASK
3442         RET
3443
3444 30$:    TST CHOSTS(I)           ;TRANSMITTING TO DEAD TEN-11?
3445         BEQ 20$
3446         CLR T11TIM              ;YES, FLUSH IT
3447         CALL CHSODN
3448         BR 20$
3449
3450 ;CHECK TEN-11 INTERFACE, DO RESET IF NECESSARY, RETURN 'NE' IF DISABLED.
3451 ;SMASHES NOTHING.
3452 T11CHK: CMP T11TIM,#5*60.       ;10 TAKING 5 SECONDS TO RESPOND?
3453         BLO 5$
3454         SETOM T11I10            ;YES, DECLARE IT DOWN, REINITIALIZE PROTOCOL
3455 5$:     TST T11I10              ;IS 10 DONE INITIALIZING?
3456         BNE 99$                 ;NO, DO NOTHING
3457         TST T11I11              ;ARE WE SUPPOSED TO INITIALIZE?
3458         BEQ 99$                 ;NO, IT'S OK
3459         MOV #T11OBF,T11OBP      ;YES, REINITIALIZE POINTERS
3460         MOV #T11IBF,T11IBP
3461         PUSH A
3462         MOV #T11OBF,A           ;INITIALIZE INPUT AND OUTPUT BUFFER HEADERS
3463 10$:    CLR (A)+                ;CLEAR INTER-MACHINE SIGNAL WORD
3464         CLR (A)+
3465         ADD #T11BFL-4,A         ;SKIP THE REMAINING WORDS
3466         CMP A,#T11IBE
3467         BLO 10$
3468         CLR T11IBA              ;IDLE THE INPUT
3469         POP A
3470         TST CHOSTS+CHXT11       ;WAS OUTPUT HUNG ON TEN11?
3471         BEQ 90$
3472         PUSH <A,B,C,D,H,I>      ;YES, SIGNAL OUTPUT DONE ON TEN11
3473         MOV #CHXT11,I
3474         CALL CHSODN
3475         POP <I,H,D,C,B,A>
3476 90$:    CLR T11I11              ;SIGNAL INIT DONE, RETURN 'EQ'
3477         CLR T11I11+2
3478 99$:    RET
3479 .ENDC ;TEN11P
3480 \f
3481 ;THIS ROUTINE PROCESSES THE HEADER OF PACKET IN INPUT BUFFER FOR SOURCE I
3482 ;RETURN DESTINATION OUTPUT SINK INDEX IN B (-1 IF THIS IS FOR US (PDP11 ITSELF)),
3483 ;PACKET BUFFER POINTER IN A, AND LENGTH IN WORDS IN C.
3484 ;RETURNS WITH OVERFLOW SET IF PACKET IS DISCARDED BECAUSE OF
3485 ;TOO MUCH FORWARDING, BAD ADDRESS, TOO BIG, CRUFTY, ETC.
3486 ;OTHERWISE RETURNS WITH MINUS INDICATOR SET IF PACKET DIRECTED TO 11.
3487 CHSIHD: ADD #1,NPKSI(I)         ;COUNT PACKETS IN FROM THIS SOURCE
3488         ADC HPKSI(I)
3489         MOV CHIBFP(I),A         ;POINTER TO PACKET
3490         TSTB (A)                ;CHECK FOR MUPPET
3491         BNE CHSIHB              ;DISCARD, WE DON'T SUPPORT THEM
3492         MOV #PKHDW,CHIHDL(I)    ;SET HEADER LENGTH
3493         ADD #PKFCMS+1,PKFC(A)   ;INCREMENT FWD COUNT (IS HIGH END OF WORD)
3494         BCS CHSIHB              ;BRANCH IF FORWARDING LOOP
3495         MOV PKNBYT(A),C         ;GET BYTE COUNT
3496         BIC #PKNBMS,C
3497         CMP C,#DATMAX
3498         BHI CHSIHB              ;TOO LONG, LOSES
3499         INC C                   ;MAKE WORD COUNT
3500         ASR C
3501         ADD CHIHDL(I),C         ;ADD IN LENGTH OF HEADER
3502         MOV C,CHILNG(I)         ;SAVE FOR LATER USE
3503         ;; NOW ROUTE THIS PACKET
3504         MOV #-1,B               ;MAGIC INDEX MEANING "MYSELF"
3505         MOV PKDHST(A),D         ;GET DESTINATION ADDRESS
3506         ;HERE WE HAVE HAIR FOR MULTIPLE CHAOSNETS
3507 .REPT CHAOSP
3508    CONC <CMP D,#CHAD>,\.RPCNT   ;ADDRESSED TO PDP11 ITSELF?
3509         BEQ 50$                 ;YES, LET CHSRUN HANDLE IT LATER
3510 .ENDR ;CHAOSP
3511         CMPB PKOP(A),#%CORUT    ;ROUTING INFO PACKET?
3512         BEQ 40$                 ;YES, ADDRESS TO PDP11
3513         TST USECBL              ;SUPPOSED TO USE CABLE EVEN TO TALK TO SELF?
3514         BEQ 20$
3515         CMP I,#CHXCHS           ;YES, IS THIS COMING FROM CABLE?
3516         BHIS 20$                ;YES, ROUTE REGULAR WAY
3517         MOV #CHXCHS,B           ;NO, SEND TO SELF ON FIRST CABLE
3518         MOV #CHADD,D
3519         BR 39$
3520
3521 20$:    MOVB PKDHST+1(A),B      ;GET SUBNET ADDRESSED TO
3522         CMP B,#NSUBNT
3523         BLO 21$
3524         CLR B                   ;OUT OF RANGE, USE 0
3525 21$:    ASL B                   ;MAKE INDEX INTO SUBNET TABLES
3526         TST SBNTYP(B)           ;IS THIS A DIRECT HARDWARE CONNECTION?
3527         BGT 38$                 ;YES, SEND TO IT
3528         MOV SBNADR(B),D         ;NO, GO VIA GATEWAY
3529         BEQ CHSIRF              ;HAVEN'T GOT A GATEWAY, AND BROADCAST CODE NOT WORKING YET
3530         MOVB SBNADR+1(B),B      ;GET SUBNET GATEWAY IS ON
3531         ASL B                   ;MAKE INDEX INTO TABLES
3532         CMP B,#NSUBNT*2
3533         BHIS CHSIRF             ;OUT OF RANGE, CAN'T GET THERE FROM HERE
3534         TST SBNTYP(B)           ;IS THIS A DIRECT CONNECTION?
3535         BLE CHSIRF              ;NO, CAN'T GET THERE FROM HERE (SHOULDN'T HAPPEN!)
3536 38$:    MOV SBNADR(B),B         ;GET SINK INDEX
3537 39$:    MOV D,CHICBA(I)         ;STORE CABLE ADDRESS OF IMMEDIATE DEST (GATEWAY)
3538 .IIF NDF NDVRBF, 50$:           ;IF NO DOVER, ALL TO-11 PACKETS COME HERE
3539 40$:    MOV B,CHIOUX(I)         ;STORE SINK INDEX, SET INDICATORS
3540         RET                     ;NOTE THAT MOV CLEARS OVERFLOW
3541
3542 .IF DF NDVRBF
3543 50$:    CMP PKDIND(A),DVRLIX    ;DIRECTED TO DOVER?
3544         BNE 40$                 ;NO, TO 11
3545         CMP PKSHST(A),DVRHST
3546         BNE 40$                 ;NOT DOVER-CONNECTED HOST
3547         CMP PKSIND(A),DVRIDX
3548         BNE 40$                 ;RIGHT HOST, WRONG PROCESS
3549         MOV #CHXDVR,B           ;ROUTE PACKET TO DOVER GATEWAY
3550         BR 40$
3551 .ENDC ;NDVRBF
3552
3553 ;HERE FOR ROUTING FAILURE.  METER, RETURN WITH OVERFLOW SET.
3554 CHSIRF: INC NPKSRF
3555         MOV B,RFSBNT            ;SAVE 2* SUBNET TRYING TO GET TO
3556         ;FALL INTO CHSIHB
3557 ;HERE WHEN CHSIHD SEES A GARBAGE PACKET.  RETURN WITH OVERFLOW SET.
3558 CHSIHB: ADD #1,NPKSBD(I)        ;GOD-DAMN BRAIN-DAMAGE
3559         ADC HPKSBD(I)
3560         SEV
3561         RET
3562
3563 ;SWAB PACKET COMING FROM PDP-10 OR ETHERNET (BYTES LEFT TO RIGHT)
3564 ;IF GOING TO INCOMPATIBLE DESTINATION.  CALL RIGHT AFTER CHSIHD.
3565 SWAB10: BMI CHSSWB              ;SWAB IF TO-11
3566         CMP CHOXMT(B),#CHSXMT   ;CHECK DESTINATION TYPE
3567         BEQ CHSSWB              ;PDP11 OR CHAOSNET, SWAB IT OUT
3568 5$:     RET                     ;PDP10 OR ETHERNET, LEAVE ALONE
3569
3570 ;SWAB PACKET COMING FROM PDP-11 OR CHAOSNET (BYTES RIGHT TO LEFT)
3571 ;IF GOING TO INCOMPATIBLE DESTINATION.  CALL RIGHT AFTER CHSIHD.
3572 SWAB11=.
3573         BMI 5$                  ;RETURN IF TO-11
3574         CMP CHOXMT(B),#CHSXMT   ;CHECK DESTINATION TYPE
3575         BEQ 5$                  ;PDP11 OR CHAOSNET, LEAVE ALONE
3576                                 ;PDP10 OR ETHERNET, SWAB IT OUT
3577                                 ;DROPS THROUGH INTO CHSSWB
3578 ;THIS ROUTINE SWABS THE PACKET FOR THE SOURCE IN I.
3579 ;CALLED WITH NUMBER OF WORDS IN PACKET IN C.
3580 ;CLOBBERS A, C, AND D.
3581 ;SUITABLE FOR CALLING RIGHT AFTER CHSIHD RETURNS.
3582 CHSSWB: MOV CHIBFP(I),A         ;ADDRESS OF PACKET
3583         SUB CHIHDL(I),C         ;GET LENGTH OF DATA AREA IN WORDS
3584         BLE 99$                 ;EMPTY
3585         MOVB PKOP(A),D          ;GET OPCODE
3586         BPL 5$                  ;BRANCH IF NON-DATA
3587         BIT #100,D              ;CHECK FOR BINARY DATA
3588         BEQ 10$                 ;NO, GO SWAB
3589 99$:    RET
3590
3591 5$:     TSTB CHSBIN(D)          ;CONTROL, LOOK UP OPCODE
3592         BNE 99$                 ;BINARY, NO SWAB
3593 10$:    ADD CHIHDL(I),A         ;POINT TO DATA AREA OF BUFFER
3594         ADD CHIHDL(I),A         ;BYTES, WATSON, BYTES!
3595         SUB #PKTMXW,C           ;GET -#WDS LESS THAN MAXIMUM
3596         ADD C,C                 ;CONVERT TO BYTES
3597         SUB C,PC                ;JUMP INTO SWAB TABLE
3598         .REPT PKTMXW
3599         SWAB (A)+
3600         .ENDR
3601         RET
3602
3603 ;BYTE TABLE INDEXED BY OPCODE, NON-ZERO IF BINARY
3604 ;BINARY OPERATIONS ARE 2 (%COOPN), 7 (%COSTS), 10 (%CORUT)
3605 CHSBIN: .BYTE 0,0,2,0,0,0,0,7,10,0,0,0,0,0
3606         .BYTE 0,0               ;SPARES IN CASE MORE OPCODES ADDED
3607         .EVEN
3608 \f
3609 ;TRANSMIT PACKET FROM INPUT SOURCE I TO OUTPUT SINK, IN B.
3610 ;SMASHES ALL REGISTERS.  CHISTS(I), CHIOUX(I), CHICBA(I) MUST BE ALREADY SET UP.
3611 CHSOUT: TST B                   ;THIS DESTINED TO PDP11?
3612         BMI CHSOUX              ;YES, LET CHSRUN PICK IT UP LATER
3613         TST CHOSTS(B)           ;IS SINK BUSY?
3614         BNE CHSOUX              ;YES, CAN'T SEND NOW, WILL TRY AGAIN LATER
3615         NEG CHISTS(I)           ;NO, SET SOURCE STATUS TO CONNECTED
3616         MOV I,CHOINX(B)         ;CONNECT SINK TO SOURCE
3617         MOV B,I                 ;SET UP SINK INDEX
3618         ADD #1,NPKSO(I)
3619         ADC HPKSO(I)
3620         JMP @CHOXMT(I)          ;GO START TRANSMISSION TO SINK
3621
3622 ;CALL HERE WHEN OUTPUT IS DONE ON SINK I.
3623 CHSODN: CLR CHOSTS(I)           ;IDLE THE SINK
3624         PUSH I
3625         MOV CHOINX(I),I         ;GET CORRESPONDING SOURCE
3626         CLR CHISTS(I)           ;IDLE IT
3627         CALL @CHIRFL(I)         ;TELL SOURCE IT'S DONE, TRY TO GET MORE INPUT
3628         POP I
3629 CHSOUX: RET
3630
3631 ;CALL HERE AFTER EACH PACKET TRANSFER TO INITIATE AS MANY ADDITIONAL TRANSFERS
3632 ;AS POSSIBLE.  BASHES ALL REGISTERS.  ON DL10 AND TEN11, WE COULD ACTUALLY DO SEVERAL
3633 ;TRANSFERS BEFORE RETURNING.
3634 CHSRUN:
3635 .IF DF NDVRBF
3636         CALL DVRRFL             ;WAKE UP DOVER, MIGHT BE TIME TO RETRANSMIT
3637 .ENDC ;NDVRBF
3638         MOV #<NCHX-1>*2,I       ;SCAN ALL INPUT SOURCES
3639 CHSRN1: TST WAKE                ;GIVE UP IF CLOCK HAS TICKED, LET TTYS RUN
3640         BNE CHSOUX
3641         TST CHISTS(I)           ;IS THIS SOURCE LOOKING FOR A SINK?
3642         BLE CHSRN3
3643 CHSRN2: MOV CHIOUX(I),B         ;GET SINK IT WANTS TO SEND TO
3644         BMI FOR11               ;BRANCH IF FOR PDP11
3645         TST CHOSTS(B)           ;SINK AVAILABLE?
3646         BNE CHSRN3              ;NO, LET INPUT SIT
3647         CALL CHSOUT             ;YES, ATTEMPT TO TRANSMIT
3648         BR CHSRUN               ;LOOK FOR MORE WORK
3649
3650 CHSRN3: SUB #2,I                ;NEXT INPUT SOURCE
3651         BGE CHSRN1
3652         RET                     ;NOTHING LEFT TO DO
3653
3654 FOR11:  MOV CHIBFP(I),A         ;PACKET FOR PDP11, CHECK IT OUT
3655         MOVB PKOP(A),B          ;GET OPCODE
3656         CMP B,#%CORUT           ;IF ROUTING INFO, GOBBLE IT
3657         BEQ CHARUT
3658         CMP B,#%CORFC           ;ALL WE KNOW IS RFC TO CERTAIN CONTACT NAMES
3659         BNE FOR11J              ;BARF AT JUNK PACKETS
3660         CALL SERVE              ;RUN THE SERVER
3661         BEQ FOR11X              ;IT DIDN'T LIKE IT
3662 FOR11R: PUSH <PKDHST(A),PKDIND(A)>      ;INTERCHANGE SOURCE AND DESTINATION
3663         MOV PKSHST(A),PKDHST(A)
3664         MOV PKSIND(A),PKDIND(A)
3665         POP <PKSIND(A),PKSHST(A)>
3666         CALL CHSIHD             ;ROUTE
3667         BVS FOR11X              ;NO GOOD, FLUSH (SOURCE IN PACKET WAS WRONG)
3668         CALL SWAB11             ;SWAB IF GOING TO 11-INCOMPATIBLE DEST
3669         BR CHSRN2               ;FIRE IT OFF (CHISTS IS ALREADY 1)
3670
3671 FOR11X: CLR CHISTS(I)           ;DISCARD THIS PACKET
3672         CALL @CHIRFL(I)
3673         BR CHSRUN               ;LOOK FOR MORE WORK
3674
3675 ;PACKET FROM RANDOM PLACE DIRECTED TO 11, TELL HIM TO GO AWAY
3676 FOR11J: CMP B,#%COLOS           ;DON'T BARF AT LOS PACKETS
3677         BEQ FOR11X
3678         MOV #<%COLOS*400>,(A)
3679         MOV #6$-5$-1,PKNBYT(A)
3680         MOV #5$,B
3681         MOV A,C
3682         ADD #PKDAT,C
3683 1$:     MOVB (B)+,(C)+
3684         BNE 1$
3685         BR FOR11R               ;SEND OFF THE LOS
3686 5$:     .ASCIZ /Packet unrecognized by gateway-11/
3687 6$:     .EVEN
3688
3689 ;ROUTING PACKET
3690 CHARUT: MOV CHILNG(I),C         ;GET NUMBER OF DATA WORDS
3691         SUB #PKHDW,C
3692         ASR C                   ;MAKE NUMBER OF 2 WORD PAIRS
3693         BEQ FOR11X              ;MIGHT BE ZERO-LENGTH
3694         MOV A,D
3695         ADD #PKDAT,D            ;POINT TO START OF PACKET'S DATA
3696 61$:    MOV (D)+,B              ;GET SUBNET BEING TALKED ABOUT
3697         CMP B,#NSUBNT           ;ONE WE KNOW ABOUT?
3698         BHIS 62$                ;NO, FORGET IT
3699         ASL B                   ;MAKE WORD INDEX
3700         TST SBNTYP(B)           ;IS THIS AN AUTO ROUTING TYPE SUBNET?
3701         BNE 62$                 ;NO, DON'T MUNG OUR FIXED ROUTING INFO
3702         CMP (D),SBNCST(B)       ;COMPARE COSTS
3703         BHI 62$                 ;NEW ONE WORSE (IF EQUAL, SWITCH TO EQUALIZE LOAD)
3704         MOV (D),SBNCST(B)       ;SAVE BEST COST
3705         MOV PKSHST(A),SBNADR(B) ;AND HOST ADDRESS THIS CAME FROM AS BEST BET
3706 62$:    TST (D)+                ;SKIP COST
3707         SOB C,61$
3708         BR FOR11X               ;DONE WITH PACKET
3709 \f
3710         .SBTTL CHAOS NET SERVERS
3711
3712 ;CALLED WITH PACKET IN A.
3713 ;MUST PRESERVE A,I.
3714 ;RETURN 'EQ' IF NO GOOD, 'NE' IF MODIFIED PACKET TO BE RETURNED TO SOURCE
3715
3716 ;CURRENTLY WE SERVE THE FOLLOWING CONTACT NAMES:
3717 ; STATUS - RETURNS ANS WITH THE NAME OF THE MACHINE, LATER WILL HAVE OTHER DATA
3718 ; PULSAR - RETURNS ANS WITH DATA OF 1 BYTE, VALUE OF PULSON AS AN ASCII DIGIT,
3719 ;          I.E. "0" MEANS OFF, "1" MEANS 60 PER SECOND, ETC.
3720 ;          IF CONTACT NAME IN RFC IS FOLLOWED BY A SPACE AND AN ASCII DIGIT,
3721 ;          SETS PULSON TO THAT STATUS.
3722 ; DOVER - DOVER PROTOCOL TRANSLATOR
3723
3724 ;NOTE THAT WE DON'T USE THE MOST WINNING STRING COMPARE IN THE WORLD,
3725 ;THIS CODE ASSUMES IT DOESN'T MATTER WHAT HAPPENS IF AN RFC TO
3726 ;AN UNKNOWN CONTACT NAME IS DONE, AS LONG AS THE 11 DOESN'T CRASH.
3727
3728 SERVE:  MOV #SRVTBL,B           ;ADDRESS OF SERVER TABLE
3729 10$:    MOV (B)+,D              ;ADDRESS OF CONTACT NAME FOR THAT SERVER
3730         BEQ 99$                 ;EXIT IF TABLE EXHAUSTED, 'EQ' IN COND CODE
3731         MOV A,C
3732         ADD #PKDAT,C            ;ADDRESS OF CONTACT NAME IN THIS RFC
3733 11$:    TSTB (D)                ;END OF STRING?
3734         BEQ 20$                 ;YUP, RUN THIS SERVER
3735         CMPB (C)+,(D)+          ;DO STRING COMPARE
3736         BEQ 11$                 ;MATCHES
3737         TST (B)+                ;DOESN'T MATCH, TRY NEXT
3738         BR 10$
3739
3740 99$:    RET
3741
3742 20$:    JMP @(B)+               ;CALL SERVER, IT CAN RETURN EQ OR NE
3743
3744 SRVTBL: .WORD 1$,STSSRV         ;STATUS - RETURN HOST NAME AND METERS
3745         .WORD 2$,PLSSRV         ;PULSAR - SET AND GET PULSAR RATE
3746 .IIF DF NDVRBF, .WORD 3$,DVROPN ;DOVER - DOVER PROTOCOL TRANSLATOR
3747         .WORD 0                 ;END OF TABLE
3748 1$:     .ASCIZ /STATUS/
3749 2$:     .ASCIZ /PULSAR/
3750 3$:     .IIF DF NDVRBF, .ASCIZ /DOVER/
3751         .EVEN
3752
3753 ;SERVERS MUST PRESERVE A (PACKET), AND I, AND RETURN 'NE' IF TO BE SENT BACK TO SOURCE.
3754 ;NOTE THAT C POINTS AT THE NEXT BYTE AFTER THE CONTACT NAME
3755
3756 STSSRV: MOV A,B         ;RFC TO "STATUS", CHANGE INTO ANS CARRYING APPROPRIATE DATA.
3757         MOV #32.+<12.*NCHX>+<24.*CHAOSP>+<12.*ETHERP>,PKNBYT(A) ;SET BYTE LENGTH, CLEAR FORWARDING COUNT
3758         ADD #PKDAT,B
3759         MOV #HSTNAM,D           ;SEND NAME OF HOST
3760         MOV #32.,C
3761 45$:    MOVB (D)+,(B)+
3762         SOB C,45$
3763         CLR D                   ;NOW STORE METERING INFO FOR EACH SUBNET
3764 50$:    MOV CHXSBN(D),(B)+      ;STORE SUBNET NUMBER+400
3765         MOV #4,(B)+             ;ASSUME NOT A CABLE
3766         MOV NPKSI(D),(B)+
3767         MOV HPKSI(D),(B)+
3768         MOV NPKSO(D),(B)+
3769         MOV HPKSO(D),(B)+
3770 .IFNZ ETHERP
3771         CMP D,#CHXETH           ;ETHERNET HAS SOME OF THESE COUNTERS
3772         BNE 55$
3773         MOV #12.,-10.(B)        ;THERE ARE 4 MORE DOUBLE-WORDS
3774         MOV NPKSAB-CHXCHS(D),(B)+
3775         MOV HPKSAB-CHXCHS(D),(B)+
3776         CLR (B)+
3777         CLR (B)+
3778         MOV NPKSGB-CHXCHS(D),(B)+
3779         MOV HPKSGB-CHXCHS(D),(B)+
3780         MOV NPKSRL-CHXCHS(D),(B)+
3781         MOV HPKSRL-CHXCHS(D),(B)+
3782         BR 59$
3783 .ENDC ;ETHERP
3784 55$:    CMP CHIRFL(D),#CHSRFL   ;CHAOSNET CABLE?
3785         BNE 59$                 ;NO, THAT'S ALL
3786         MOV #16.,-10.(B)        ;YES, THERE ARE 6 MORE DOUBLE-WORDS
3787         MOV NPKSAB-CHXCHS(D),(B)+
3788         MOV HPKSAB-CHXCHS(D),(B)+
3789         MOV NPKSLS-CHXCHS(D),(B)+
3790         MOV HPKSLS-CHXCHS(D),(B)+
3791         MOV NPKSGB-CHXCHS(D),(B)+
3792         MOV HPKSGB-CHXCHS(D),(B)+
3793         MOV NPKSRL-CHXCHS(D),(B)+
3794         MOV HPKSRL-CHXCHS(D),(B)+
3795         CLR (B)+                ;I DON'T KEEP TRACK OF BIT COUNT ERRS SEPARATELY
3796         CLR (B)+
3797         MOV NPKSBD(D),(B)+
3798         MOV HPKSBD(D),(B)+
3799 59$:    TST (D)+
3800         CMP D,#2*NCHX
3801         BLO 50$
3802 RETANS: MOVB #%COANS,PKOP(A)    ;RETURN THIS PACKET TO SOURCE AS AN 'ANS'
3803         RET                     ;NOTE CONDITION CODES HAVE 'NE'
3804
3805 PLSSRV: MOVB PKNBYT(A),C        ;GET BYTE COUNT, SHOULD BE SMALL
3806         CMP C,#8                ;6 FOR PULSAR, 1 FOR SPACE, 1 FOR CHARACTER
3807         BLO 20$                 ;NOT GIVEN AN ARGUMENT, JUST READ STATUS
3808         MOVB PKDAT+7(A),C       ;YES, GET THE ARGUMENT
3809         SUB #'0,C               ;CONVERT TO BINARY (CHEAPO!)
3810         MOV C,PULSON            ;CHANGE PULSON STATUS
3811 20$:    MOV #1,PKNBYT(A)        ;SET BYTE LENGTH, CLEAR FORWARDING COUNT
3812         MOV PULSON,C            ;RETURN PULSAR STATUS
3813         ADD #'0,C               ;IN ASCII
3814         MOVB C,PKDAT(A)
3815         BR RETANS
3816 \f
3817         .SBTTL CHAOSNET INTERRUPT HANDLER
3818
3819 ;INTERRUPT HANDLER ENTRIES
3820 .REPT CHAOSP
3821 CONC CHS,\.RPCNT,BK:
3822         JSR I,CHSBRK
3823         CHXCHS+<.RPCNT*2>
3824 .ENDR
3825
3826 ;SUBROUTINE TO ENABLE CHAOSNET INTERFACE IN H,I TO RECEIVE NEXT PACKET
3827 CHINXT: MOVB 1(H),A             ;GET CSR BITS 9-12 (LOST COUNT)
3828         ASR A
3829         BIC #-20,A
3830         ADD A,NPKSLS-CHXCHS(I)
3831         ADC HPKSLS-CHXCHS(I)
3832         BIS #%CARCL+%CAREN,(H)  ;MAKE READY TO RECEIVE ANOTHER MESSAGE
3833         RET
3834
3835 ;COMMON CHAOS INTERRUPT ROUTINE
3836 CHSBRK: MOV (I),I               ;GET SOURCE/SINK INDEX
3837         PUSH <A,B,C,D,H>        ;SAVE ALL REGISTERS
3838         MOV CHIHWR(I),H         ;GET HARDWARE ADDRESS
3839         MOV (H),A .SEE CH%CSR   ;GET CSR
3840         BPL CHSBK1              ;TEST RECEIVE DONE, BRANCH IF NOT
3841                 .SEE %CARDN     ;PALX SCREWS UP IF THIS IS ON PREVIOUS LINE!
3842         TST CHISTS(I)           ;MAKE SURE INPUT BUFFER IS IDLE
3843         BNE CHSBK1              ;BUSY, DON'T LOOK AT RECEIVE DONE NOW
3844         BIT #%CAERR,A           ;CRC ERROR?
3845         BNE CHICRC              ;JUMP IF YES
3846         MOV CH%RBC(H),C         ;BIT COUNT -1
3847         SUB #47.,C              ;ADD 1, THEN SUBTRACT 3*16. FOR HARDWARE WORDS
3848         .IREPT 4, ASR C         ;CONVERT TO NUMBER OF WORDS
3849         CMP C,#256.
3850         BHI CHIFLS              ;THIS CAN ONLY HAPPEN IF HARDWARE BROKEN
3851         ADD #CH%RBF,H           ;POINT H TO RECEIVE DATA REG
3852         MOV CHIBFP(I),D         ;COPY PACKET INTO BUFFER
3853         CALL MOVHD
3854         TST (H)                 ;READ OUT THE 3 HARDWARE LEADER WORDS
3855         CMP (H),(H)
3856         SUB #CH%RBF,H           ;RESTORE H
3857         BIT #%CAERR,(H)         ;WAS IT READ CORRECTLY OUT OF RAM?
3858         BNE CHIGBG              ;NO, GARBAGE
3859         CMP CH%RBC(H),#7777     ;WAS PACKET CORRECT LENGTH?
3860         BNE CHIGBG              ;NO, GARBAGE
3861         CALL CHINXT             ;DONE WITH HARDWARE, ENABLE FOR NEXT
3862         CALL CHSIHD             ;PROCESS HEADER, GET LENGTH, DEST
3863         BVS CHIFL0              ;BRANCH IF NO GOOD
3864         CALL SWAB11             ;SWAB IF NOT GOING TO 11-COMPATIBLE DEST
3865         INC CHISTS(I)           ;INDICATE BUFFER READY TO SEND
3866         PUSH I
3867         CALL CHSOUT             ;SEND IT OUT
3868         POP I
3869         MOV CHIHWR(I),H         ;RESTORE H
3870         TST CHISTS(I)           ;INPUT BUFFER STILL BUSY?
3871         BEQ CHSBK1
3872         BIC #%CAREN,(H)         ;YES, CLEAR RECEIVE INTERRUPT ENABLE
3873         BR CHSBK1               ;GO CHECK ON OUTPUT SIDE
3874 \f
3875 ;HERE WHEN A PACKET WAS RECEIVED WITHOUT ERROR, BUT AFTER
3876 ;READING OUT OF THE RAM, CRC ERROR WAS SET.  EITHER THE
3877 ;PACKET WAS THE WRONG LENGTH, OR THE RAM FAILED, OR THE
3878 ;HARDWARE RANDOMLY CLOBBERED IT.
3879 ;WE ALSO GET HERE IF THE BIT COUNT WAS NOT -1 AFTER ALL WORDS WERE READ.
3880 CHIGBG: ADD #1,NPKSRL-CHXCHS(I) ;LOG THE ERROR
3881         ADC HPKSRL-CHXCHS(I)
3882         MOV H,CHSRLH
3883         MOV CH%RBC(H),CHSRLC
3884         BR CHIFLS               ;GO RESET RECEIVER AND CHECK OUTPUT STATUS
3885
3886 ;HERE WHEN A PACKET IS RECEIVED WITH A CRC ERROR.  DISCARD IT,
3887 ;BUT ALSO SAVE IT IN CHSGBF, CHSGBH, CHSGBS, CHSGBC FOR DEBUGGING (IF FTGARB).
3888 CHICRC: ADD #1,NPKSGB-CHXCHS(I)
3889         ADC HPKSGB-CHXCHS(I)
3890 .IFNZ FTGARB
3891         MOV H,CHSGBH
3892         MOV (H),CHSGBS
3893         MOV CH%RBC(H),CHSGBC
3894         ADD #CH%RBF,H
3895         MOV #CHSGBF,D
3896         MOV #PKMAX,C
3897         CALL MOVHD
3898         SUB #CH%RBF,H           ;DROP INTO CHIFLS
3899 .ENDC ;FTGARB
3900 ;HERE TO IGNORE AN INPUT PACKET AND ENABLE HARDWARE FOR NEXT
3901 CHIFLS: CALL CHINXT
3902 CHIFL0: INC NPKSIG
3903 ;HERE TO CHECK ON TRANSMIT SIDE
3904 CHSBK1: TSTB (H) .SEE %CATDN    ;TRANSMIT DONE?
3905         BPL CHSBKX              ;NO, EXIT
3906 .IFNZ CHSBTB
3907         CLR CHSIDL(I)           ;CLEAR TRANSMIT-DONE TIME-OUT
3908 .ENDC ;CHSBTB
3909         MOV CHOSTS(I),A         ;WAS OUTPUT IN PROGRESS?
3910         BEQ CHSBK6              ;NO, LOOK FOR OUTPUT
3911         CMP A,#2                ;TRANSMIT ABORT DELAY COMPLETED?
3912         BEQ 10$
3913         BIT #%CATAB,(H)         ;NO, TRANSMIT ABORTED?
3914         BEQ CHSBK4              ;NO
3915         ADD #1,NPKSAB-CHXCHS(I) ;YES, METER IT, AND SET CHOSTS TO
3916         ADC HPKSAB-CHXCHS(I)
3917         INC CHOSTS(I)           ;2 IF THIS IS FIRST TIME, OR 0 IF SECOND TIME
3918         BEQ CHSBK4              ;LOST TWICE IN A ROW, GIVE UP
3919         BR CHSBK5               ;TURN OFF INTERRUPT, DELAY FOR A WHILE
3920
3921 10$:    MOV #-1,CHOSTS(I)       ;TRANSMIT ABORT DELAY COMPLETED, SET CHOSTS TO -1
3922         CALL CHSXM0             ;INITIATE RE-TRANSMISSION (CHOSTS ALREADY SET)
3923         BR CHSBKX               ;DISMISS
3924
3925 CHSBK4: CALL CHSODN             ;OUTPUT DONE
3926 CHSBK6: PUSH I
3927         CALL CHSRUN             ;INITIATE MORE TRANSFERS
3928         POP I
3929         TST CHOSTS(I)           ;DID IT INITIATE TRANSMISSION?
3930         BNE CHSBKX              ;YES, LEAVE INTERRUPT ENABLED.
3931         MOV CHOHWR(I),H         ;RESTORE H
3932         TST CHXRTF(I)           ;TIME TO BROADCAST ROUTING INFO?
3933         BNE CHORUT              ;YES
3934         TST PULSON              ;IS THIS FEATURE TURNED ON?
3935         BEQ CHSBK5              ;NO, FLUSH
3936         CMP PULSAR,PULSON       ;NOTHING TO DO.  TIME FOR A TEST MESSAGE?
3937         BNE CHSBK5              ;NOPE, GO IDLE
3938         MOV #52525,CH%WBF(H)    ;WRITE A PACKET OF 3 HEADER WORDS, 0, 52525
3939         CLR CH%WBF(H)
3940         MOV #-1,CH%WBF(H)       ;TO HOST -1, WHICH IS NON-EXISTENT
3941 CHSBK7: TST CH%XMT(H)           ;INITIATE TRANSMISSION, DON'T ENABLE INTERRUPT
3942 CHSBK5: BIC #%CATEN,(H)         ;GO IDLE, CLEAR TRANSMIT INTERRUPT ENABLE
3943 ;HERE TO EXIT FROM CHAOS INTERRUPT.  RESTORE REGS AND RETURN FROM INT
3944 CHSBKX: POP <H,D,C,B,A,I>
3945         RTI
3946 \f
3947 .IIF NZ CH%WBF-CH%MYN, .ERR FOO CODE ASSUMES CH%WBF = CH%MYN
3948
3949 ;BROADCAST A PACKET FULL OF ROUTING INFO, SINCE WE ARE MORE OR LESS A GATEWAY
3950 CHORUT: MASK 6                  ;INHIBIT CLOCK INTERRUPTS SO COSTS DON'T CHANGE
3951         ADD #CH%WBF,H           ;ADDRESS WRITE BUFFER
3952         MOV #%CORUT*400,(H)     ;OPCODE
3953         MOV #2*<NSUBNT-1>,A     ;COUNT SUBNETS WHICH WE KNOW ANYTHING ABOUT (REASONABLE COST)
3954         CLR B
3955 5$:     CMP SBNCST(A),#1000
3956         BHIS 6$
3957         ADD #4,B                ;THIS ONE WILL GENERATE 2 WORDS
3958 6$:     SUB #2,A
3959         BPL 5$
3960         MOV B,(H)               ;BYTE COUNT
3961         CLR (H)                 ;DESTINATION
3962         CLR (H)                 ;..
3963         MOV (H),(H)             ;SOURCE = CH%MYN
3964         CLR (H)                 ;SOURCE INDEX
3965         CLR (H)                 ;PACKET NUMBER
3966         CLR (H)                 ;ACK NUMBER
3967         MOV #2*<NSUBNT-1>,A     ;GO THROUGH SUBNET TABLES
3968         MOVB 1(H),C             ;GET SUBNET THIS IS GOING OUT ON
3969         ASL C
3970         MOV SBNCST(C),C         ;GET COST OF GETTING TO US FROM GUY WHO RECEIVES THIS
3971 10$:    CMP SBNCST(A),#1000     ;WAS THIS ONE INCLUDED IN BYTE COUNT?
3972         BHIS 11$                ;NO, DON'T PUT IT IN PACKET
3973         MOV A,B                 ;FIRST WORD IS SUBNET NUMBER
3974         ASR B
3975         MOV B,(H)
3976         MOV SBNCST(A),B         ;SECOND WORD IS COST
3977         ADD C,B                 ;WHICH MUST INCLUDE COST OF GETTING TO US
3978         MOV B,(H)
3979 11$:    SUB #2,A                ;NEXT SUBNET
3980         BPL 10$
3981         CLR (H)                 ;BROADCAST THIS PACKET
3982         SUB #CH%WBF,H           ;RESTORE H
3983         CLR CHXRTF(I)           ;CLEAR REQUEST FOR ROUTING PACKET
3984         UNMASK
3985         BR CHSBK7               ;FIRE IT OFF, DON'T ENABLE TRANSMIT-DONE INTERRUPT
3986
3987 ;INITIATE TRANSMISSION ON CHAOS INTERFACE
3988 ;CALL WITH SINK NUMBER IN I, AT PI LEVEL OR MASKED.  BASHES ALL REGS.
3989 CHSXMT: INC CHOSTS(I)           ;SET CHOSTS TO 1, TRANSMIT STARTING
3990 CHSXM0: MOV CHOHWR(I),H         ;GET HARDWARE ADDRESS
3991         MOV CHOINX(I),B         ;GET SOURCE SUPPLYING THE PACKET
3992         MOV CHIBFP(B),D         ;GET PACKET ADDRESS
3993         ADD #CH%WBF,H           ;ADDRESS THE WRITE BUFFER
3994         MOV CHILNG(B),C         ;GET WORD COUNT
3995         CALL MOVDH              ;COPY INTO HARDWARE
3996         MOV CHICBA(B),(H)       ;STORE CABLE DESTINATION
3997         SUB #CH%WBF,H           ;RESTORE H
3998         TST CH%XMT(H)           ;TRIGGER TRANSMISSION
3999         BIS #%CATEN,(H)         ;ENABLE DONE INTERRUPT
4000         RET                     ;PI LEVEL WILL PICK UP OUTPUT
4001
4002 .ENDC ;CHAOSP
4003 \f
4004 .IFNZ ETHERP
4005         .SBTTL ETHERNET SUPPORT
4006
4007 ;ENABLE NEXT ETHERNET PACKET TO COME IN.
4008 ;SINCE WE ONLY HAVE ONE BUFFER, THIS SETS UP THE TRANSFER RATHER
4009 ;THAN JUST ENABLING THE INTERRUPT AS THE CHAOSNET DOES.
4010 ;THAT WOULDN'T WORK ANYWAY, BECAUSE THE HARDWARE IS SO TOTALLY BRAIN-DAMAGED.
4011 ETHRFL: MOV CHIHWR(I),H
4012         ADD #10,H
4013         MOV #-<PKTMXW-ETHHDW+1>,(H)+    ;- WORD COUNT, +1 FOR HARDWARE BUG
4014         MOV #ETHIBF+<ETHHDW*2>,(H)+     ;BUFFER ADDRESS
4015         MOV #101,(H)            ;START, INTERRUPT-ENABLE
4016         RET
4017
4018 ;INCOMING PUP TOO BIG.  WE DON'T HAVE FRAGMENTATION, SO SEND A PUP ERROR REPORT
4019 ETHBIG: MOV #ETHIBF+PKDAT,A     ;COPY PUP HEADER INTO DATA FIELD
4020         MOV A,C
4021         MOV #ETHIBF+PKDAT+20.,B
4022         .IREPT 10.,< MOV (A)+,(B)+ >
4023         MOV #517.,(B)+          ;PACKET TOO LARGE ERROR
4024         MOV #DATMAX,(B)+        ;MAX NUMBER OF BYTES ALLOWED
4025         MOV #50$,A
4026 5$:     MOVB (A)+,(B)+          ;ASCII MESSAGE
4027         BNE 5$
4028         INC B                   ;MESSAGE LENGTH IS EVEN.  INCLUDE CHECKSUM IN COUNT.
4029         SUB #ETHIBF+PKDAT,B     ;GET PUP LENGTH
4030         MOV B,(C)+              ;BUILD PUP HEADER NOW
4031         MOV #4,(C)+             ;PUP TYPE = ERROR
4032         CMP (C)+,(C)+           ;PUP ID SAME
4033         .IREPT 3,< MOV 6(C),(C)+ >      ;DESTINATION = ORIGINAL SOURCE
4034         MOV #<ETHSBN*400+ETHHSN>,(C)+   ;SOURCE = ME
4035         .IREPT 2,< CLR (C)+ >   ;SOURCE PORT ZERO
4036         CALL ETHOUT             ;TRANSMIT
4037         JMP ETHINX              ;DISMISS
4038
4039 ;The ascii message.  This isn't as destroyed as it looks.
4040 50$:    .ASCIZ/UP Pot oalgr eotf tii  n ahCoanstep caek.t/
4041         .EVEN
4042
4043 ;INPUT INTERRUPT
4044 ETHIBK: PUSH <A,B,C,D,H,I>
4045         MOV #CHXETH,I
4046         MOV CHIHWR(I),H
4047         MOV 14(H),A             ;PICK UP STATUS
4048         CLR 14(H)               ;CLEAR RECEIVE INTERRUPT ENABLE
4049         CMP ETHIBF+PKDAT-2,#1000        ;TYPE = PUP?
4050         BNE ETHIIX                      ;NO, IGNORE PACKET
4051         TST 10(H)               ;CHECK RESIDUAL WORD COUNT
4052         BEQ ETHBIG              ;PACKET TOO BIG, RESPOND WITH PUP ERROR
4053         TST A                   ;CHECK COMBINED INPUT ERRORS BIT
4054         BMI 70$                 ;ERROR, IGNORE PACKET
4055         MOV ETHIBF+PKDAT+10,A   ;GET DESTINATION HOST
4056         BEQ 5$                  ;AND SEE IF BROADCAST OR SELF
4057         CMP A,#<ETHSBN*400+ETHHSN>
4058         BNE 11$                 ;NO, ROUTE AS REGULAR MESSAGE
4059 5$:     CMPB ETHIBF+PKDAT+2,#1  ;PUP TYPE = ECHO-ME?
4060         BEQ ETHECO              ;YES, ECHO IT (MAYBE TAKE THIS OUT AFTER 11 DEBUGGED)
4061         CMPB ETHIBF+PKDAT+2,#200        ;GATEWAY INFORMATION REQUEST?
4062         BNE 10$
4063         TST ETHIBF+PKDAT+12     ;NOT REALLY UNLESS DESTINATION SOCKET IS 2
4064         BNE 10$
4065         CMP ETHIBF+PKDAT+14,#2
4066         BNE 10$
4067         TST CHISTS+CHXEGT       ;PSEUDO DEVICE AVAILABLE?
4068         BNE ETHIIX
4069         MOV #ETHIBF+PKDAT+4,A   ;YES, SEND HIM SOME INFO
4070         MOV #EGTPID,B
4071         .IREPT 2,< MOV (A)+,(B)+ >      ;COPY PUP ID
4072         ADD #6,A                ;COPY SOURCE HOST AND SOCKET INTO DESTINATION
4073         .IREPT 3,< MOV (A)+,(B)+ >
4074         CALL ETHRT1
4075         MOV #CHXETH,I           ;I CLOBBERED BY ETHRT1
4076         BR ETHIIX
4077 \f
4078 10$:    TST A                   ;DON'T HARASS REST OF NET WITH BROADCASTS
4079         BEQ ETHIIX
4080 11$:    MOV #ETHIBF+PKDAT,A     ;CHECK THE CHECKSUM
4081         CALL PUPCKT
4082         BNE 60$                 ;BAD, COUNT AS RAM ERROR
4083 .IF DF NDVRBF
4084         CMP ETHIBF+PKDAT+10,DVRHST      ;SEE IF ADDRESSED TO DOVER USER
4085         BNE 12$
4086         CMP ETHIBF+PKDAT+14,DVRIDX
4087         BNE 12$
4088         CALL DVRPUP             ;YES, PROCESS
4089         MOV #CHXETH,I
4090         BR ETHIIX
4091
4092 .ENDC ;NDVRBF
4093 ;TRANSLATE PUP AND SEND TO CHAOSNET
4094 12$:    MOV #ETHIBF,A           ;FILL IN CHAOSNET HEADER
4095         MOV #<%COUNC*400>,(A)+  ;PKOP
4096         MOV ETHIBF+PKDAT+0,B    ;PKNBYT (TOTAL PUP LENGTH = CHAOS DATA LENGTH)
4097         INC B                   ;ROUND UP TO AN EVEN NUMBER
4098         ASR B
4099         ASL B
4100         MOV B,(A)+
4101         MOV ETHIBF+PKDAT+10,(A)+        ;PKDHST
4102         MOV ETHIBF+PKDAT+14,(A)+        ;PKDIND (LOW HALF OF PUP PORT)
4103         MOV ETHIBF+PKDAT+16,(A)+        ;PKSHST
4104         MOV ETHIBF+PKDAT+22,(A)+        ;PKDIND (LOW HALF OF PUP PORT)
4105         MOV ETHIBF+PKDAT+6,(A)+         ;PKPKN (LOW HALF OF PUP ID)
4106         MOV #100001,(A)+        ;PKACN = PROTOCOL NUMBER
4107         CALL CHSIHD             ;PROCESS THIS HEADER, GET LENGTH, DEST
4108         BVS ETHIIX              ;IGNORE IF NO GOOD
4109         CALL SWAB10             ;SWAB IF NOT GOING TO 10-COMPATIBLE DEST
4110         INC CHISTS(I)           ;INDICATE BUFFER READY TO SEND
4111         CALL CHSOUT             ;SEND IT OUT
4112         BR ETHINX               ;ETHRFL WILL BE CALLED WHEN NECESSARY
4113
4114 60$:    ADD #1,NPKSRL-CHXCHS(I) ;COUNT ERRORS (SOFTWARE CHECKSUM)
4115         ADC HPKSRL-CHXCHS(I)
4116         BR ETHIIX
4117
4118 70$:    ADD #1,NPKSGB-CHXCHS(I) ;COUNT ERRORS (HARDWARE CHECKSUM)
4119         ADC HPKSGB-CHXCHS(I)
4120 ETHIIX: CALL ETHRFL             ;AND READ ANOTHER PACKET
4121 ETHINX: POP <I,H,D,C,B,A>
4122         RTI
4123
4124 ;ETHERNET PUP ECHO PROTOCOL
4125 ETHECO: MOV #ETHIBF+PKDAT+10,A  ;INTERCHANGE SOURCE AND DESTINATION
4126         MOV A,B                 ;I DON'T BOTHER CHECKING CHECKSUM, BUT I DO GENERATE IT
4127         .IREPT 3, PUSH (A)+
4128         .IREPT 3,< MOV (A)+,(B)+ >
4129         .IREPT 3, POP -(A)
4130         MOV #<ETHSBN*400+ETHHSN>,(A)    ;FIX SOURCE TO BE ME
4131         INCB ETHIBF+PKDAT+2     ;SET PUP TYPE = 2 (I AM AN ECHO)
4132         CALL ETHOUT             ;SEND BACK OUT ON THE ETHERNET
4133         BR ETHINX
4134
4135 ;GENERAL PURPOSE ROUTINE FOR TRANSMITTING INTERNALLY-GENERATED PUPS TO
4136 ;THE ETHERNET.  FIXES THE DESTINATION ADDRESS (THIS IS HOW OTHER
4137 ;HOSTS FIGURE OUT WHAT SUBNET THEY ARE ON!), COMPUTES THE PUP CHECKSUM,
4138 ;AND INTERFACES TO THE PACKET SWITCH.  CALLED WITH SOURCE INDEX IN I.
4139 ;CALL THIS WITH A PACKET THAT ALREADY HAS ITS BYTES IN ETHERNET ORDER.
4140 ;BASHES ALL REGISTERS.
4141 ETHOUT: MOV CHIBFP(I),A
4142         ADD #PKDAT,A            ;ADDRESS OF PUP
4143         TST 10(A)               ;ONLY IF NOT BROADCASTING,
4144         BEQ 10$
4145         TSTB 11(A)              ;DESTINATION ADDRESS HAVE NETWORK NUMBER?
4146         BNE 10$
4147         MOVB #ETHSBN,11(A)      ;NO, PUT IT IN  
4148 10$:    CALL PUPCKS             ;INSERT CHECKSUM
4149         MOV #CHXETH,B
4150         MOV B,CHIOUX(I)
4151         INC CHISTS(I)
4152         JMP CHSOUT
4153 \f
4154 ;INITIATE TRANSMISSION ON ETHER INTERFACE
4155 ;CALL WITH SINK NUMBER IN I, AT PI LEVEL OR MASKED.  BASHES ALL REGS.
4156 ;PACKET IS ALREADY SWABBED INTO ETHERNET BYTE ORDER (REVERSE OF CHAOSNET).
4157 ETHXMT: INC CHOSTS(I)           ;SET CHOSTS TO 1, TRANSMIT STARTING
4158         CLR A                   ;NO OUTPUT START DELAY
4159 ETHXM0: MOV CHOHWR(I),H         ;GET HARDWARE ADDRESS
4160         MOV CHOINX(I),B         ;GET SOURCE SUPPLYING THE PACKET
4161         MOV CHIBFP(B),D         ;GET PACKET ADDRESS
4162         ADD #PKDAT,D            ;GET PUP ADDRESS
4163         MOV #1000,-(D)          ;SMASH LAST 2 WORDS OF CHAOS HEADER.  TYPE=PUP
4164         MOV #ETHHSN,-(D)        ;STORE SOURCE ADDRESS
4165         MOVB 14(D),1(D)         ;STORE DESTINATION ADDRESS
4166         MOV 4(D),B              ;GET PUP SIZE IN BYTES
4167         ADD #5,B                ;CONVERT TO WORDS, ALLOW FOR ETHERNET HEADER
4168         ASR B
4169         NEG B                   ;HARDWARE WANTS IT NEGATIVE
4170         MOV B,(H)+              ;OUTPUT WORD COUNT
4171         MOV D,(H)+              ;OUTPUT BUFFER ADDRESS
4172         MOV A,2(H)              ;OUTPUT START DELAY
4173         MOV #101,(H)            ;START OUTPUT, ENABLE INTERRUPT
4174         RET                     ;PI LEVEL WILL FINISH
4175
4176 ;OUTPUT DONE/ABORTED INTERRUPT
4177 ETHOBK: PUSH <A,B,C,D,H,I>
4178         MOV #CHXETH,I
4179         MOV CHOHWR(I),H
4180         MOV 4(H),A              ;PICK UP STATUS BEFORE WRITING IT
4181         CLR 4(H)                ;CLEAR INTERRUPT ENABLE
4182         TST A                   ;CHECK FOR ERROR
4183         BPL 10$
4184         ADD #1,NPKSAB-CHXCHS(I)
4185         ADC HPKSAB-CHXCHS(I)
4186         NEG CHOSTS(I)           ;ERROR, ENTER RETRANSMIT MODE
4187         BPL 10$                 ;ALREADY RETRANSMITTED ONCE, PUNT
4188         MOV #25.,A              ;WAIT 1 MS (DON'T BOTHER BEING RANDOM)
4189         CALL ETHXM0             ;START TRANSMISSION AGAIN
4190         BR ETHINX               ;AND EXIT
4191
4192 10$:    CALL CHSODN             ;TRANSMISSION FINISHED
4193         CALL CHSRUN             ;FIND MORE WORK TO DO
4194         BR ETHINX               ;DISMISS
4195 \f
4196 ;CHECKSUM PUP ADDRESSED BY A.  BASHES A,B,C.
4197 PUPCKS: CALL PUPCK1             ;COMPUTE CHECKSUM
4198         MOV B,(A)               ;STORE CHECKSUM
4199         RET
4200
4201 ;RETURN 'EQ' IF CHECKSUM MATCHES
4202 PUPCKT: CALL PUPCK1             ;COMPUTE CHECKSUM
4203         CMP (A),#-1             ;PACKET CHECKSUMMED?
4204         BEQ 5$                  ;NO, ALWAYS MATCH
4205         CMP B,(A)               ;RETURN WITH CC SET FROM NEW AND OLD CKSMS
4206 5$:     RET
4207
4208 ;A POINTS AT PACKET, RETURN WITH A -> CHECKSUM AND CHECKSUM IN B.  BASH C.
4209 PUPCK1: MOV (A),C               ;GET LENGTH
4210         DEC C                   ;IN WORDS NOT COUNTING CHECKSUM
4211         ASR C
4212         CLR B                   ;BUILD CHECKSUM IN B
4213 10$:    ADD (A)+,B              ;ONE'S COMPLEMENT ADD
4214         ADC B
4215         BPL 11$                 ;TRANSFER SIGN BIT INTO CARRY
4216         SEC
4217 11$:    ROL B                   ;AND LEFT CYCLE
4218         SOB C,10$
4219         INC B                   ;GRONK MINUS ZERO
4220         BEQ 15$
4221         DEC B
4222 15$:    RET
4223
4224 ;BROADCAST ETHERNET GATEWAY INFO
4225 ETHRUT: MASK 5                  ;ENTER SUITABLE LEVEL FOR HACKING NET
4226         TST CHISTS+CHXEGT       ;IS THE PSEUDO SOURCE THAT EMITS THE 
4227         BNE 99$                 ; PACKET AVAILABLE?  IF NOT, PUNT.
4228         CLR CHXRTF+CHXETH       ;CLEAR REQUEST FLAG
4229         MOV #EGTPID,A
4230         CLR (A)+                ;PUP ID ZERO
4231         CLR (A)+
4232         CLR (A)+                ;BROADCAST DESTINATION
4233         CLR (A)+                ;TO SOCKET 2
4234         MOV #2,(A)+
4235         CALL ETHRT1             ;BUILD AND SEND GATEWAY INFO
4236 99$:    UNMASK
4237         RET
4238
4239 BADSBP: .WORD BADSUB                    ;POINTER INTO BAD SUBNETS
4240 BADSUB:         ;SUBNETS THAT SHOULD NOT HAVE INFORMATION SENT
4241                 ;ABOUT.  THIS LIST MUST BE IN INCREASING ORDER
4242                 ;AND MUST END IN 377.  
4243         .BYTE 004               ;AI CHAOS 11 pseudo subnet (only AI PDP-10 (RIP) is on this)
4244         .BYTE 010               ;Tech Square LCSnet (unused)
4245         .BYTE 011               ;Tech Square LCS asynchronous line net (IP)
4246         .BYTE 012               ;Tech Square VII LCSnet (IP)
4247         .BYTE 014               ;Symbolics: Los Angeles-Chatsworth  land line
4248         .BYTE 020               ;CHAOS MIT IN subnet (ask JNC)
4249         .BYTE 027               ;Experimental asynchronous line net
4250         .BYTE 030               ;Experimental radio broadcast net
4251         .BYTE 040               ;Symbolics: Tech Square-Vassar St. microwave link
4252         .BYTE 041               ;Symbolics: Cambridge-Palo Alto  land line
4253         .BYTE 042               ;Symbolics: Palo Alto-Chatsworth land line
4254         .BYTE 047               ;Symbolics: Cambridge-Chatsworth land line
4255         .BYTE 054               ;S-1: 10Mb Ethernet
4256         .BYTE 055               ;S-1: Pronet ring
4257         .BYTE 056               ;S-1: serial line subnet
4258         .BYTE 057               ;S-1: serial line subnet
4259         .BYTE 061               ;Symbolics: Cambridge-Cambridge  land line
4260         .BYTE 062               ;Symbolics: Cambridge-Washington land line
4261         .BYTE 064               ;Symbolics: Cambridge-Houston   land line
4262         .BYTE 070               ;Symbolics: Chatsworth-Westwood  land line
4263         .BYTE 072               ;Atari: Cambridge-MIT           land line
4264         .BYTE 073               ;Atari: Cambridge-Sunnyvale     land line
4265         .REPT 8
4266         .BYTE 377               ;SPARES
4267         .ENDR
4268         .BYTE 377
4269 .EVEN
4270
4271 ETHRT1: MOV #BADSUB,BADSBP      ;INITIAL BAD SUBNET POINTER
4272         MOV #EGTSBN,A           ;FILL IN GATEWAY INFORMATION IN THE PUP
4273         CLR I                   ;I SUBNET*2, A EGTSBN POINTER
4274 10$:    ;; FOR EACH SUBNET, .BYTE GATE-NET, TARGET-NET, HOP-COUNT, GATE-HOST
4275         CLR B                   ;FOR NON-GATEWAY, USE 0 AS GATEWAY ADDRESS
4276         TST SBNTYP(I)           ;HARDWARE CONNECTION?
4277         BGT 11$
4278         MOV SBNADR(I),B         ;NO, GET GATEWAY ADDRESS
4279 11$:    cmpb i,#60
4280         bhi 20$                 ;dover, as of 1-Dec-83 can't handle more than 60
4281         ;; FILTER OUT KNOWN BAD SUBNETS
4282         CMPB I,@BADSBP          ;MAYBE UPDATE POINTER
4283         BHI 115$                ; NO UPDATE NEEDED
4284           INC BADSBP
4285 115$:   CMPB I,@BADSBP          ;THIS TIME, CHECK FOR EQUALITY
4286         BEQ 20$                 ;PUNT
4287         ;; END FILTER
4288         MOV SBNCST(I),C         ;GET COST
4289         CMP C,#1000             ;IF NOT REACHABLE, DON'T PUT IN PACKET
4290         BHIS 20$
4291         .IREPT 3, ASR C         ;DIVIDE BY 8 TO GET APPROXIMATE HOP COUNT
4292         CMP C,#ETHMXH           ;DON'T PUT MORE THAN MAXHOPS
4293         BLOS 12$
4294         MOV #ETHMXH,C
4295 12$:    MOV I,D                 ;GET TARGET-NET
4296         ASR D
4297         SWAB B
4298         MOVB B,(A)+             ;STORE IN WIERD XEROX BYTE ORDER
4299         MOVB D,(A)+
4300         MOV B,(A)+
4301         MOVB C,-2(A)
4302 20$:    TST (I)+                ;NEXT SUBNET
4303         CMP I,#NSUBNT*2
4304         BLO 10$
4305         SUB #EGTSBN,A           ;NUMBER OF DATA BYTES IN PUP
4306         ADD #22.,A              ;FOR HEADER AND CHECKSUM
4307         MOV A,EGTPLN            ;SET PUP LENGTH
4308         MOV #CHXEGT,I           ;SET UP TO TRANSMIT TO ETHERNET
4309         JMP ETHOUT
4310 .ENDC ;ETHERP
4311 \f
4312 .IF DF NDVRBF
4313         .SBTTL DOVER PROTOCOL TRANSLATOR
4314
4315 ;RFC PACKET IN A.  MUST PRESERVE I, AND RETURN 'EQ'.
4316 DVROPN: MOV PKPKN(A),C
4317         MOV PKSIND(A),B
4318         MOV PKSHST(A),A
4319         PUSH I
4320         CALL 5$
4321         POP I
4322         SEZ
4323         RET
4324
4325 ;SET UP DOVER TO TALK TO HOST IN A, INDEX IN B, PKT# IN C, SENDING BACK AN OPN
4326 ;OR SENDING A LOS IF BUSY.  MUST WATCH FOR DUPLICATE RFC'S
4327 ;MUST BE CALLED WITH CHAOS AND ETHER INTERRUPTS MASKED
4328 5$:     TST DVRHST              ;BUSY?
4329         BEQ 10$                 ;NO
4330         CMP A,DVRHST
4331         BNE DVRBSY              ;YES, TALKING TO ANOTHER HOST
4332         CMP B,DVRIDX
4333         BNE DVRBSY              ;YES, TALKING TO ANOTHER GUY SAME HOST
4334         BR 11$                  ;DUPLICATE RFC
4335
4336 10$:    CLR DVRTIM              ;FLUSH TIMEOUT
4337         MOV A,DVRHST
4338         MOV B,DVRIDX
4339         INC DVRLIX              ;ESTABLISH UNIQUE LOCAL INDEX
4340         BNE 11$
4341         INC DVRLIX              ;DON'T USE 0
4342 11$:    CLR DVRMSK              ;CLEAR THE BUFFER RING
4343         CLR DVRID               ;FIRST PACKET TO SEND TO DOVER IS PACKET 0
4344         INC C                   ;C := FIRST PACKET ID THAT WILL COME IN FROM CHAOS
4345         MOV C,DVROFS
4346         MOV #%COOPN*400,B       ;SEND AN OPN
4347         BR DVRST1               ;REST IS LIKE STS
4348
4349 DVRBSY: TST DVRPKP              ;SPECIAL BUFFER BUSY?
4350         BNE CPOPJ0              ;YES, PUNT
4351         MOV #DVRBF2,C           ;SEND A CLS
4352         MOV #%COCLS*400,(C)+
4353         MOV #4,(C)+
4354         MOV A,(C)+
4355         MOV B,(C)+
4356         MOV #CHADD,(C)+
4357         CLR (C)+
4358         CLR (C)+
4359         CLR (C)+
4360         MOV #"BU,(C)+
4361         MOV #"SY,(C)+
4362         MOV #DVRBF2,DVRPKP
4363         BR DVRRFL
4364 \f
4365 ;HERE TO SEND STS TO GUY CONNECTED TO DOVER
4366 ;MUST BE MASKED AGAINST CHAOS INTERRUPTS
4367 DVRSTS: MOV #%COSTS*400,B
4368 DVRST1: MOV #DVRBF2,A           ;USE THIS BUFFER
4369         MOV #4,D                ;NUMBER OF BYTES
4370 DVRST2: MOV A,C
4371         MOV B,(A)+              ;OPCODE
4372         MOV D,(A)+              ;NUMBER OF BYTES
4373         MOV DVRHST,(A)+         ;DESTINATION HOST
4374         MOV DVRIDX,(A)+         ;DESTINATION INDEX
4375         MOV #CHADD,(A)+         ;SOURCE HOST
4376         MOV DVRLIX,(A)+         ;SOURCE INDEX
4377         CLR (A)+                ;NO PACKET NUMBER
4378         CMP B,#%COLOS*400       ;IF SENDING LOS, PUNT THE REST
4379         BEQ 20$
4380         MOV DVRID,B
4381         DEC B                   ;LAST PACKET ACKNOWLEDGED BY DOVER
4382         ADD DVROFS,B            ;CONVERT TO CHAOSNET ID
4383         MOV B,(A)+              ;ACKNOWLEDGE PACKET NUMBER
4384         MOV B,(A)+              ;RECEIPT
4385         MOV #NDVRBF,(A)+        ;WINDOW SIZE
4386 20$:    MOV C,DVRPKP            ;CAUSE PACKET TO GET SENT
4387         ;DROP INTO DVRRFL
4388
4389 ;HERE TO GET ANOTHER PACKET FROM THE DOVER.  THIS CAN BE EITHER A CHAOSNET
4390 ;PACKET TO BE SENT BACK TO THE APPROPRIATE GUY, OR A PUP TO GO TO THE DOVER
4391 DVRRFL: MOV #CHXDVR,I           ;THIS MIGHT NOT BE SET UP WHEN CALLED
4392         TST CHISTS(I)           ;PACKET SOURCE ONLY EMANATES ONE AT A TIME
4393         BNE CPOPJ0
4394         CMP CHIBFP(I),DVRPKP    ;FINISHED SENDING SPECIAL PACKET?
4395         BNE 10$
4396         CLR DVRPKP              ;YES, MAKE READY FOR ANOTHER
4397 10$:    CLR CHIBFP(I)           ;THIS PACKET NO LONGER BEING SENT
4398         MOV DVRPKP,A            ;GOT SPECIAL PACKET TO SEND?
4399         BNE 30$                 ;YES, SEND IT
4400         TST DVRMSK              ;GOT NEXT BUFFER TO SEND TO DOVER?
4401         BPL CPOPJ0              ;NO
4402         CMP DVRRTR,#60.         ;1-SECOND RETRANSMISSION INTERVAL ELAPSED?
4403         BLO CPOPJ0              ;NO, DON'T SEND YET
4404         CLR DVRRTR              ;SENDING, RESET RETRANSMISSION TIMER
4405         MOV DVRBFP,A
4406         BIC #PKFCMS,PKFC(A)     ;CLEAR FORWARDING COUNT SINCE SENDING AGAIN
4407 30$:    MOV A,CHIBFP(I)         ;SEND THIS PACKET
4408         CALL CHSIHD             ;ROUTE HIM
4409         BVS DVRRFL              ;BAD, IGNORE
4410         CMP B,#CHXCHS           ;SWAB IF SENDING TO 10, BUT NOT ETHERNET
4411         BHIS 35$
4412         CALL CHSSWB
4413 35$:    INC CHISTS(I)           ;INDICATE BUFFER READY TO SEND
4414         RET
4415 \f
4416 ;CALLED WITH A PUP IN ETHIBF WHICH IS FROM THE DOVER AND ADDRESSED
4417 ;TO THE GUY WHO'S TRYING TO PRINT ON IT.  MUST BE MASKED AGAINST ETHER & CHAOS INTERRUPTS.
4418 DVRPUP: MOVB ETHIBF+PKDAT+2,B
4419         CMP B,#31               ;EFTP ACKNOWLEDGE?
4420         BNE DVRPP1
4421         CMP ETHIBF+PKDAT+6,DVRID        ;ACKNOWLEDGING EXPECTED PACKET?
4422         BNE CPOPJ0              ;NO, IGNORE IT
4423         INC DVRID               ;YES, ADVANCE ID, POINTER, AND PACKET-PRESENCE MASK
4424         MOV DVRBFP,A
4425         ADD #DVRBFL,A
4426         CMP A,#DVRBF2
4427         BLO 11$
4428         MOV #DVRBUF,A
4429 11$:    MOV A,DVRBFP
4430         ASL DVRMSK
4431         SETOM DVRRTR            ;FAKE RETRANSMIT TIMER TO SEND NEXT PUP RIGHT AWAY
4432         TST CHISTS+CHXDVR       ;PACKET SOURCE BUSY?
4433         BEQ DVRSTS              ;NO, SEND AN ACKNOWLEDGEMENT TO THE CHAOSNET
4434 CPOPJ0: RET
4435
4436 DVRPP1: MOV #22.,A              ;RELATIVE ADDRESS OF ASCII STRING
4437         CMP B,#33               ;EFTP ABORT?
4438         BEQ DVRERR
4439         MOV #44.,A              ;RELATIVE ADDRESS OF ASCII STRING
4440         CMP B,#4                ;PUP ERROR?
4441         BNE CPOPJ0              ;IGNORE ANYTHING ELSE
4442 DVRERR: CLR DVRMSK              ;DON'T SEND ANYTHING MORE TO THE DOVER
4443         MOV ETHIBF+PKDAT,C      ;PUP LENGTH
4444         SUB A,C
4445         SUB #2,C                ;GET LENGTH OF ASCII STRING
4446         ADD #ETHIBF+PKDAT,A     ;GET ADDRESS OF ASCII STRING
4447         MOV #DVRBUF+PKDAT,B     ;BUILD A LOS PACKET TO SEND BACK
4448         MOV C,D                 ;SAVE BYTE LENGTH
4449         INC C
4450         ASR C                   ;WORD COUNT
4451         BEQ 11$
4452 10$:    MOV (A)+,(B)
4453         SWAB (B)+               ;ALTO HAS BYTES IN THE WRONG ORDER
4454         SOB C,10$
4455 11$:    MOV #%COLOS*400,B       ;SEND A LOS
4456         MOV #DVRBUF,A
4457         CALL DVRST2
4458         CLR DVRHST              ;KILL CONNECTION
4459         RET
4460 \f
4461 ;HERE IS A PACKET DIRECTED TO THE DOVER.  DO GOOD THINGS WITH IT.
4462 ;NOTE, IT HAS ALREADY BEEN SWABBED INTO ETHERNET BYTE ORDER.
4463 DVRPKT: MOV CHOINX(I),B         ;GET SOURCE SUPPLYING THE PACKET
4464         MOV CHIBFP(B),A         ;GET ADDRESS OF PACKET
4465         CLR DVRTIM              ;FOREIGN HOST IS NOT IDLE
4466         MOVB PKOP(A),B          ;DATA PACKET?
4467         BMI 50$                 ;YES
4468         CMP B,#%COSNS
4469         BNE 11$
4470         TST CHISTS+CHXDVR
4471         BNE 90$
4472         CALL DVRSTS             ;SNS => STS
4473         BR 90$
4474
4475 11$:    CMP B,#%COCLS
4476         BEQ 12$                 ;CLS OR LOS PUNTS THE CONNECTION
4477         CMP B,#%COLOS
4478         BNE 13$
4479 12$:    CLR DVRHST
4480         BR 90$
4481
4482 13$:    CMP B,#%COEOF           ;NOTE THAT EOF IS TREATED VERY MUCH LIKE DATA!
4483         BNE 90$                 ;IGNORE ANYTHING RANDOM
4484 50$:    MOV PKPKN(A),B          ;GET ID OF DATA PACKET
4485         SUB DVROFS,B
4486         MOV DVRBFP,D            ;FIND WHERE IN THE BUFFER IT GOES
4487         MOV #100000,C           ;AND GET MASK BIT FOR IT
4488         SUB DVRID,B             ;B := ID RELATIVE TO NEXT EXPECTED
4489         BEQ 53$
4490         CMP B,#NDVRBF
4491         BHIS 90$                ;IGNORE DUPLICATE OR NOT IN WINDOW
4492 51$:    ADD #DVRBFL,D
4493         CMP D,#DVRBF2
4494         BLO 52$
4495         MOV #DVRBUF,D
4496 52$:    CLC
4497         ROR C
4498         SOB B,51$
4499 53$:    BIT C,DVRMSK            ;ALREADY HAVE PACKET?
4500         BNE 90$                 ;YES, IGNORE
4501         BIS C,DVRMSK            ;NO, STORE IT AWAY
4502         MOV D,C
4503         ADD #PKDAT,D            ;BUILD PUP
4504         MOV PKNBYT(A),B
4505         BIC #PKNBMS,B
4506         MOV B,(D)
4507         ADD #22.,(D)+           ;PUP LENGTH
4508         MOV #30,(D)+            ;PUP TYPE
4509         TST (A)                 ;WAS THIS DATA OR EOF?
4510         BMI 54$                 ;DATA
4511         SUB (PC),-2(D)          ;EOF, SET PUP TYPE TO 32
4512 54$:    CLR (D)+                ;PUP ID HIGH
4513         MOV PKPKN(A),(D)        ;PUP ID LOW
4514         SUB DVROFS,(D)+         ; CORRECTED
4515         MOV #DVRADR,(D)+        ;DESTINATION HOST
4516         CLR (D)+                ;DESTINATION SOCKET HIGH
4517         MOV #20,(D)+            ;DESTINATION SOCKET LOW
4518         MOV DVRHST,(D)+         ;SOURCE HOST
4519         CLR (D)+                ;SOURCE SOCKET HIGH
4520         MOV DVRIDX,(D)+         ;SOURCE SOCKET LOW
4521         ADD #PKDAT,A
4522         INC B
4523         ASR B                   ;NUMBER OF DATA WORDS
4524 ;*** TEMPORARY KLUDGE ***
4525         PUSH <A,D,B>            ;PUSH B LAST!!
4526 ;*** END TEMPORARY KLUDGE ***
4527         BEQ 56$
4528 55$:    MOV (A)+,(D)+           ;MOVE THE DATA
4529         SOB B,55$
4530 56$:    MOV C,A
4531         ADD #PKDAT,A
4532         MOV #<%COUNC*400>,(C)   ;PKOP
4533         MOV 10(A),PKDHST(C)
4534         MOV (A),PKNBYT(C)       ;SHOULD BE ENOUGH TO GET IT ROUTED TO ETHERNET
4535         CALL PUPCKS             ;STORE APPROPRIATE CHECKSUM
4536 ;*** TEMPORARY KLUDGE ***
4537         POP <B,D,A>             ;LOOK FOR SOME KIND OF MACHINE FAILURE
4538         TST B
4539         BEQ 79$
4540 70$:    CMP (D)+,(A)+
4541         BNE 75$
4542         SOB B,70$
4543         BR 79$
4544
4545 75$:    DVRFKT=.
4546         NOP                     ;PUT A BPT HERE IF YOU LIKE
4547         INC NDVRFK
4548         CLR DVRMSK              ;DO IT ALL OVER AGAIN
4549 79$:
4550 ;*** END TEMPORARY KLUDGE ***
4551         CALL DVRRFL             ;SEND THIS PACKET MAYBE
4552 90$:    MOV #CHXDVR,I
4553         JMP CHSODN              ;THIS PACKET HANDLED
4554 .ENDC ;NDVRBF
4555 \f.IFNZ DL10P
4556         .SBTTL TRAP HANDLING
4557
4558 TRAP14: HALT                    ;BPT WITH NO RUG IN CORE
4559
4560 TRAP10: BPT                     ;ILLEGAL INSTRUCTION
4561
4562 TRAP4:  NOP                     ;PATCH BPT HERE IF YOU WANT
4563         CMP (SP),#MAIN          ;IF TRAP4 IN MAIN LOOP...
4564         BLO CRASH
4565         CMP (SP),#MAINE
4566         BHIS CRASH
4567         BIT #DLXPRT,DLXCSR      ;AND DL10 PORT TURNED OFF
4568         BNE CRASH
4569         TST DLXOFF              ;AND WE THOUGHT IT WAS ON
4570         BNE CRASH
4571 RESTRT: MOV #STKBAS,SP          ;THEN RESTART MAIN LOOP
4572         CLR -(SP)               ;WHICH WILL WAIT FOR DL10 PORT TO TURN ON
4573         MOV #MAIN,-(SP)
4574         RTI
4575
4576 CRASH:  BPT                     ;OTHERWISE, CRASH
4577
4578 PWRFAL: RESET                   ;POWER FAIL OR UP - IF FAIL, HALT DURING RESET
4579         MOV #20,B               ;WAIT 2 SECONDS TO
4580 1$:     CLR A                   ; MAKE SURE POWER IS REALLY ON
4581         SOB A,.
4582         SOB B,1$
4583         JMP INIT                ;POWER SEEMS UP, RESTART PROGRAM
4584 .ENDC ;DL10P
4585
4586 .IFNZ NODDT     ;IF NO DDT OR OTHER "OPERATING SYSTEM", SET UP TRAP HANDLERS
4587 TRAP4:  
4588         .=4
4589         .WORD TRAP4,340,TRAP10,340,TRAP14,340,TRAP10,340,PWRFAL,340,TRAP10,340,TRAP10,340
4590         .=TRAP4
4591
4592 ;ILLEGAL ADDRESS, UNIBUS NXM, STACK OVERFLOW
4593 TRAP4:  BPT
4594         0
4595
4596 ;ILLEGAL INSTRUCTION, IOT, EMT
4597 TRAP10: BPT
4598         0
4599
4600 ;POWER FAILURE OR RESTORE
4601 PWRFAL: HALT
4602         0
4603
4604 ;BPT (OR TRACE)
4605 TRAP14: .REPT 7         ;SAVE REGISTERS WHERE CARPET CAN FIND THEM
4606         MOV %0+.RPCNT,BPTACS+<.RPCNT*2>
4607         .ENDR
4608         CLR BPTGO
4609         SETOM BPTFLG
4610 5$:     TST BPTGO
4611         BEQ 5$
4612         CLR BPTFLG
4613         .REPT 7
4614         MOV BPTACS+<.RPCNT*2>,%0+.RPCNT
4615         .ENDR
4616         RTI     
4617
4618 BPTFLG: 0       ;NON-ZERO IF GOT A BPT
4619 BPTGO:  0       ;NON-ZERO TO PROCEED
4620 BPTACS: .BLKW 7 ;REGS EXCEPT PC
4621
4622 .ENDC ;NODDT
4623 \f
4624         .SBTTL INITIALIZATION
4625 GO::
4626 INIT:   CLR PS
4627 .IFNZ DL10P
4628         RESET
4629         MOV #STKBAS,SP
4630         TST 14
4631         BNE 1$                  ;BPT ALREADY SET UP BY RUG
4632         MOV #TRAP14,14
4633         MOV #340,16
4634 1$:
4635 .ENDC ;DL10P
4636 .IFNZ NODDT                     ;NO OPERATING SYSTEM
4637         RESET
4638         MOV #STKBAS,SP
4639 .ENDC ;NODDT
4640         SETOM DLXOFF            ;REINITIALIZE VARIOUS VARIABLES
4641         SETOM NO.ITS
4642 .REPT CHAOSP                    ;IDLE CHAOS NET INTERFACES
4643         CLR CHISTS+CHXCHS+<2*.RPCNT>
4644         CLR CHOSTS+CHXCHS+<2*.RPCNT>
4645 .ENDR
4646 .IIF NZ T300P, CLR RQBACT
4647 .IFNZ NCT
4648         MOV #NFTTY,I
4649 76$:    MOV NRMIPC(I),TTYIPC(I)
4650         ADD #2,I
4651         CMP I,#LASTTY
4652         BLE 76$
4653         MOV #TYORNG,B           ;CLEAR THE TYPOUT-DONE RING
4654         CALL CLRING
4655         MOV #<NFTTY/2>,A        ;GIVE OUTPUT DONE ON ALL LINES
4656 78$:    CALL PUT
4657         INC A
4658         CMP A,#<NFTTY/2>+NCT
4659         BLO 78$
4660 .ENDC ;NCT
4661 .IFNZ NDMS
4662 ;;; Turn on DM11-BBs
4663         CLR B                   ;iterated over DM11 units
4664         MOV #NDMS,H
4665 5$:     MOV #DMCLR+DMCSN,@DMCSR(B)      ;CLEAR SCANNER MEMORY
4666 2$:     BIT #DMBSY,@DMCSR(B)
4667         BNE 2$
4668         CLR I                   ;iterated over modem channels
4669         ;; turn on connected modem channels for one DM11
4670         CLR A                   ;counter for channels per unit
4671 3$:     TST M2LMAP(I)
4672         BEQ 4$
4673         MOV A,@DMCSR(B)
4674         MOV #LINENB,@DMLSR(B)
4675 4$:     TST (I)+
4676         INC A
4677         CMP A,#16.
4678         BLT 3$
4679         TST (B)+
4680         SOB H,5$                ;next DM11
4681         ;; treat first-time interrupts differently
4682         SETOM DMINI
4683         CLR B
4684         MOV #NDMS,A
4685 6$:     MOV #DMSCN+DMIEN,@DMCSR(B)      ;enable scanner interrupts
4686         TST (B)+
4687         SOB A,6$                ;on all DMs
4688         MOV #20000.,A
4689         SOB A,.                 ;DELAY 50 MILLISECONDS
4690         CLR DMINI               ;WHILE P.I. LEVEL GETS INITIAL STATUS
4691 .ENDC ;NDMS
4692 \f
4693 .IFG NDHS
4694 ;TURN ON DH11'S
4695         MOV #NLDHHX,H
4696 DHINIL: MOV DHSCR(H),A          ;DEVICE ADDRESS
4697         MOV #100000,16(A)       ;TURN ON SILO MAINTENANCE MODE, SUSPECTED OF
4698                                 ;LOSING
4699         MOV #4000,(A)                   ;RESET DH11
4700         MOV 16(A),B                     ;CHECK SILO STATUS
4701         BIC #300,B                      ;THESE BITS ARE IN RAM & DON'T CLEAR
4702         BEQ DHSWIN                      ;SHOULD HAVE CLEARED MAINTENANCE MODE AND OTHER CRUD
4703 DHSLUZ: BPT                             ;LOSE
4704 DHSWIN: MOV #DHRENB+DHTENB,(A)          ;NOW ENABLE INTERRUPTS ON DH11
4705         SUB #2,H
4706         BGE DHINIL
4707 .ENDC ;NDHS
4708
4709 ;TURN ON DL11S
4710 .IFG NDLS
4711         MOV #NLDLHX,H
4712         MOV #NDLS-1,A
4713 21$:
4714 .IIF NZ DTE20P, BEQ 22$         ;NO KBD INT ON KL10 CTY DUE TO KLDCP LOSSAGE
4715         MOV #103,@DLKS(H)       ;ACTIVATE KEYBOARD INTERRUPT, D.T.R., READER
4716 22$:    MOV #100,@DLPS(H)       ;ACTIVATE PRINTER INTERRUPT
4717         SUB #2,H
4718         DEC A
4719         BPL 21$
4720 .ENDC ;NDLS
4721
4722 ;SET LINE PARAMETERS AND ALLOCATE BUFFERS
4723 .IFNZ NCT
4724         MOV #NFTTY,I
4725 10$:    MOV LPRVAL(I),A
4726         MOV BUFSIZ(I),B
4727         CALL SPARAM
4728         ADD #2,I
4729         CMP I,#LASTTY
4730         BLE 10$
4731 .ENDC ;NCT
4732
4733 ;TURN ON CLOCK
4734 .IIF Z DTE20P,  MOV #100,@#LKS  ;NO CLOCK INTERRUPTS IF KLDCP IS HACKING CLOCK TOO
4735
4736 .IFNZ DTE20P
4737 ;INITIALIZE DTE20
4738         MOV #37774,DLYCNT       ;DMA TO BANK 0, 2 USEC DELAY
4739         MOV #%D3BYT,DIAG3       ;DO TO10 TRANSFERS IN BYTE MODE
4740         MOV #MAIN,SADR          ;ONLY DO INIT ONCE
4741 .ENDC ;DTE20P
4742 .IIF NZ TEN11P, SETOM T11I10    ;CAUSE 10 TO REINITIALIZE TEN-11 CHAOS
4743 .REPT CHAOSP
4744         MOV CHIHWR+CHXCHS+<2*.RPCNT>,H  ;ADDRESS THE INTERFACE
4745    CONC <CMP CH%MYN(H),#CHAD>,\.RPCNT   ;CHECK THE HOST NUMBER SWITCHES AGAINST THE PROGRAM
4746         BEQ .+4
4747          BPT
4748         BIS #%CAREN,(H) ;ENABLE CHAOS NET INPUT INT
4749 .ENDR ;CHAOSP
4750 .IFNZ ETHERP
4751         MOV CHIHWR+CHXETH,H     ;ADDRESS THE INTERFACE
4752         MOV 16(H),A             ;GET HOST NUMBER SWITCHES
4753         COMB A                  ;FIX XEROX MISTAKE
4754         CMPB A,#ETHHSN          ;CHECK HOST NUMBER SWITCHES
4755         BEQ .+4
4756          BPT
4757         MOV #CHXETH,I           ;ENABLE TO RECEIVE FIRST ETHERNET PACKET
4758         CALL ETHRFL
4759 .ENDC ;ETHERP
4760 ;GO
4761         JMP MAIN
4762 \f
4763 .IFNZ GOULDP
4764 .SBTTL GOULD PRINTER BUFFERS
4765
4766 GLPOIP: GLPBFF          ;NEXT BUFFER IN AT M.P. LEVEL
4767 GLPOOP: GLPBFF          ;NEXT BUFFER OUT AT P.I. LEVEL
4768
4769         .REPT NGLPBF    ;ASSEMBLE THE BUFFERS
4770         0               .SEE GB.STA
4771         GLPBFF          ;DUE TO PALX BUG, LEAVE .SEE ON NEXT LINE
4772                         .SEE GB.NXT
4773 GLPBFF==.-4
4774         0               .SEE GB.FF
4775         0               .SEE GB.NL
4776         0               .SEE GB.PNT
4777         .BLKB GLPBSZ
4778         .ENDR
4779 .ENDC   ;GOULDP
4780 \f
4781         .SBTTL "TTYTYP" PARAMETER FILE
4782
4783 T LPRVAL:
4784         .BLKW NCT               ;DH11 PARAMETER REG
4785
4786 BUFFRS: ;BEGIN ALLOCATING BUFFERS HERE
4787
4788 .IIF NZ NCT, INFORM <BEGINNING OF BUFFERS = >,\BUFFRS
4789 ZZ===<BUFFRS+<NCT*MAXBSZ>+3777>/4000  ;NUMBER OF K USED
4790 .IRP ZZZZ,<0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16>
4791 .LIF EQ ZZ-.IRPCNT      ;THIS IS A CRETINOUS CROCK TO GET IT COME OUT IN DECIMAL
4792 INFORM <HIGHEST LOCATION USED = >,\BUFFRS+<NCT*MAXBSZ>,< (>,ZZZZ,<K)>
4793 .ENDR
4794         
4795 .IFNZ NCT               ;TTYTYP FILE ONLY IF WE HAVE TTYS
4796 .IF P2                  ;SPEED UP THE ASSEMBLY
4797 OFF==69105      ;KLUDGES SO I DON'T HAVE TO PUT KEYWORD PARAMETERS INTO PALX
4798 40K==40000
4799 80K==80000
4800
4801 .MACRO SPEED BAUD
4802 ZZ==-1
4803 .IIF EQ BAUD-OFF,  ZZ==0
4804 .IIF EQ BAUD-50,   ZZ==1
4805 .IIF EQ BAUD-75,   ZZ==2
4806 .IIF EQ BAUD-110,  ZZ==3
4807 .IIF EQ BAUD-134,  ZZ==4
4808 .IIF EQ BAUD-150,  ZZ==5
4809 .IIF EQ BAUD-200,  ZZ==6
4810 .IIF EQ BAUD-300,  ZZ==7
4811 .IIF EQ BAUD-600,  ZZ==10
4812 .IIF EQ BAUD-1200, ZZ==11
4813 .IIF EQ BAUD-1800, ZZ==12
4814 .IIF EQ BAUD-2400, ZZ==13
4815 .IIF EQ BAUD-4800, ZZ==14
4816 .IIF EQ BAUD-9600, ZZ==15
4817 .IIF EQ BAUD-80K, ZZ==16
4818 .IIF EQ BAUD-40K, ZZ==17
4819 .IIF LT ZZ, .ERROR UNRECOGNIZED SPEED "BAUD"
4820 .ENDM SPEED
4821
4822 .MACRO IPARM N,ODFLT,IDFLT,MUMLST
4823 .IF GE <2*N>-NFTTY
4824 .IF LE <2*N>-LASTTY
4825 %%.ISPEED==-1
4826 %%.SPEED==-1
4827 .IRP MUM,<MUMLST>
4828 .IF NB <MUM>
4829  ZZ==0
4830  .IRPC MUMB,<MUM>
4831   .IIF GE .IRPCNT-2, .MEXIT
4832   .IIF IDN MUMB,S, .IIF EQ .IRPCNT, ZZ==1
4833   .IIF IDN MUMB,P, .IIF EQ .IRPCNT-1, ZZ==ZZ+1
4834   .IIF IDN MUMB,I, .IIF EQ .IRPCNT, ZZ==1
4835   .IIF IDN MUMB,S, .IIF EQ .IRPCNT-1, ZZ==ZZ+1
4836   .ENDM
4837  .IIF EQ ZZ-2, %%.'MUM
4838  .ENDC
4839 .ENDM
4840 .IF LT %%.ISPEED
4841  .IIF LT %%.SPEED, %%.ISPEED==IDFLT
4842  .IELSE %%.ISPEED==%%.SPEED
4843 .ENDC
4844 .IIF LT %%.SPEED, %%.SPEED==ODFLT
4845 SPEED %%.ISPEED
4846 IZZ==ZZ
4847 SPEED %%.SPEED
4848 ; BUFFER SIZE IS 1/2 SECOND'S TYPING
4849 ; BUT WILL BE SUBJECT TO LIMIT OF MAXBSZ
4850 .IIF LT ZZ-7, BZZ==5.
4851 .IIF EQ ZZ-7, BZZ==15.
4852 .IIF EQ ZZ-10, BZZ==30.
4853 .IIF EQ ZZ-11, BZZ==60.
4854 .IIF EQ ZZ-12, BZZ==90.
4855 .IIF EQ ZZ-13, BZZ==120.
4856 .IIF EQ ZZ-14, BZZ==240.
4857 .IIF EQ ZZ-15, BZZ==480.
4858 .IIF GT ZZ-15, BZZ==1000.
4859 .=LPRVAL+<2*N>          ;ASSEMBLE LINE PARAMETER WORD
4860 .IIF NE ZZ-3, <ZZ*2000>+<IZZ*100>+3     ;ISPEED, OSPEED, NO PARITY, 8 BITS, FULL DUPLEX
4861 .IELSE <ZZ*2000>+<IZZ*100>+3+4          ;110 BAUD EXTRA STOP BIT
4862 .=BUFSIZ+<2*N>
4863 BZZ                     ;ASSEMBLE BUFFER SIZE
4864 .ENDC
4865 .ENDC
4866 .ENDM IPARM
4867
4868 ;MACROS USED IN THE TTYTYP FILE:
4869
4870 .MACRO TTDPRT TN,A,B,C,D,E,F,G,H,I,J
4871 IPARM TN,300,300,<A,B,C,D,E,F,G,H,I,J>
4872 .ENDM TTDPRT
4873
4874 .MACRO TTDMRX TN,A,B,C,D,E,F,G,H,I,J
4875 IPARM TN,600,600,<A,B,C,D,E,F,G,H,I,J>
4876 .ENDM TTDMRX
4877
4878 .MACRO TTDTRM TN,A,B,C,D,E,F,G,H,I,J
4879 IPARM TN,1200,1200,<A,B,C,D,E,F,G,H,I,J>
4880 .ENDM TTDTRM
4881
4882 .MACRO TTDLPT TN,A,B,C,D,E,F,G,H,I,J
4883 IPARM TN,9600,9600,<A,B,C,D,E,F,G,H,I,J>
4884 .ENDM TTDLPT
4885
4886 .MACRO TTDLA36 TN,A,B,C,D,E,F,G,H,I,J
4887 IPARM TN,300,300,<A,B,C,D,E,F,G,H,I,J>
4888 .ENDM TTDLA36
4889
4890 .MACRO TTDIML TN,A,B,C,D,E,F,G,H,I,J
4891 IPARM TN,50K,25K,<A,B,C,D,E,F,G,H,I,J>
4892 .ENDM TTDIML
4893
4894 .MACRO TTDVT TN,A,B,C,D,E,F,G,H,I,J
4895 IPARM TN,9600,9600,<A,B,C,D,E,F,G,H,I,J>
4896 .ENDM TTDVT
4897
4898 .MACRO TTDTEK TN,A,B,C,D,E,F,G,H,I,J
4899 IPARM TN,1200,1200,<A,B,C,D,E,F,G,H,I,J>
4900 .ENDM TTDTEK
4901
4902 .MACRO TTDLSR TN,A,B,C,D,E,F,G,H,I,J
4903 IPARM TN,2400,2400,<A,B,C,D,E,F,G,H,I,J>
4904 .ENDM TTDLSR
4905
4906 .MACRO TTDDPT TN,A,B,C,D,E,F,G,H,I,J
4907 IPARM TN,2400,2400,<A,B,C,D,E,F,G,H,I,J>
4908 .ENDM TTDDPT
4909
4910 .MACRO TTDGT40 TN,A,B,C,D,E,F,G,H,I,J
4911 IPARM TN,4800,4800,<A,B,C,D,E,F,G,H,I,J>
4912 .ENDM TTDGT40
4913
4914 .MACRO TTDRAY TN,A,B,C,D,E,F,G,H,I,J
4915 IPARM TN,9600,9600,<A,B,C,D,E,F,G,H,I,J>
4916 .ENDM TTDRAY
4917
4918 .MACRO TTDH19 TN,A,B,C,D,E,F,G,H,I,J
4919 IPARM TN,9600,9600,<A,B,C,D,E,F,G,H,I,J>
4920 .ENDM TTDRAY
4921
4922 .MACRO TTD11 TN,A,B,C,D,E,F,G,H,I,J
4923 IPARM TN,4800,4800,<A,B,C,D,E,F,G,H,I,J>
4924 .ENDM TTD11
4925
4926 .MACRO TTDRAN TN,A,B,C,D,E,F,G,H,I,J
4927 IPARM TN,FOO,FOO,<A,B,C,D,E,F,G,H,I,J>
4928 .ENDM TTDRAN
4929
4930 .MACRO TTDTV TN,A,B,C,D,E,F,G,H,I,J
4931 IPARM TN,FOO,FOO,<A,B,C,D,E,F,G,H,I,J>
4932 .ENDM TTDTV
4933
4934 .MACRO TTDGRN TN,A,B,C,D,E,F,G,H,I,J
4935 IPARM TN,9600,9600,<A,B,C,D,E,F,G,H,I,J>
4936 .ENDM TTDGRN
4937
4938 .MACRO TTDSTY TN,A,B,C,D,E,F,G,H,I,J
4939 IPARM TN,FOO,FOO,<A,B,C,D,E,F,G,H,I,J>
4940 .ENDM TTDSTY
4941
4942 .MACRO REPEAT N,FOO
4943 FAKOUT: .REPT N
4944 FAKOUT===0
4945 .ENDM
4946
4947 NSTTYS==0                       ;WE'RE NOT INTERESTED IN PSEUDO-TTYS
4948 N11TYS==0                       ;NOR IN PDP11 TVS
4949
4950 .INSRT SYSTEM;TTYTYP >
4951
4952 .EXPUNGE ZZ,IZZ,IZZZ,BZZ,OFF,40K,80K,%%.ISPEED,%%.SPEED
4953 .EXPUNGE TT,TY,TO,TP,TCT,HOR,VER,ROL,SPEED,ISPEED
4954
4955 .ENDC ;P2
4956
4957 .ENDC ;NCT
4958
4959 .END INIT
4960 \0\0\0\0