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