2 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
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.
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.
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.
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
31 .FATAL USE PALX DUMMY!!
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.
40 H=%4 ;USUALLY INDEX IN HARDWARE UNIT TABLES
41 I=%5 ;USUALLY LINE NUMBER TIMES 2
43 PC=%7 ;PROGRAM POINTER
44 PS=177776 ;PROGRAM STATUS
50 RTI=RTT ;11/40 HARDWARE MISFEATURE
53 .PRINT /MACHINE NAME = /
59 .MACRO .IFM MCHN ;REFERS TO PDP11 NAME
62 .MACRO MCONDX MCHN ;REFERS TO ITS SYSTEM NAME, USUALLY THE SAME
69 .MACRO MNAME BODY ;INSERT ITS SYSTEM NAME INTO BODY IN PLACE OF "MCHN"
79 .IFM MX-DL ;MX'S DL-10 PDP11
93 DTE20P==0 ;DOES NOT HAVE DTE20
95 NFTTY==102 ;2 * # OF FIRST TTY THIS 11
96 NDHS==1 ;NUMBER OF DH11'S
97 NDHUN==15 ;NUMBER OF UNUSED DH11 LINES
98 DHIBAS==320 ;DH11 INTERRUPT VECTOR BASE
99 DHCBAS==160020 ;CSR of first DH11
100 NDLS==1 ;NUMBER OF DL11'S
101 CTYP==0 ;FIRST DL11 NOT T00 (CTY)
102 NMPTYS==0 ;NUMBER OF TTYS ON MULTIPLEXED LINE (REST IN PEACE)
103 ;MPXIDX==2*27 ;TTY INDEX OF LINE THAT MULTIPLEXED TTYS RUN OVER
104 NDMS==0 ;HAS DM11BB MODEM SCANNER (BUT IT'S NOT CONNECTED TO ANYTHING)
105 GOULDP==0 ;DOESN'T HAVE GOULD LPT (ANYMORE)
106 T300P==1 ;TRIDENT T-300 AND 2561 CONTROLLER
107 CHAOSP==2 ;HAS TWO CHAOS NET INTERFACES
108 CHSBTB=0 ;CHAOSNET INTERFACE IS NEW, DOESN'T GET HUNG ANY MORE
109 CHAD0==440 ;CHAOSNET ADDRESS OF THIS PDP11 ITSELF
110 DLCADR==1440 ;CHAOSNET ADDRESS OF PDP10 CONNECTED VIA DL10 (MX)
111 CHAD1==3040 ;SECOND INTERFACE
112 TEN11P==0 ;NO TEN-11 INTERFACE
113 ETHERP==0 ;NO ETHERNET
114 FTPULS==0 ;INITIALLY, MX DOES NOT GENERATE TEST PACKETS
115 FTGARB==1 ;SAVE LAST GARBAGE PACKET RECEIVED
116 MAXBSZ==250. ;MAXIMUM TYPEOUT BUFFER SIZE
117 .MACRO ASPIRP BODY ;DEFINE LINE NUMBERS WITH AUTOSPEED
121 .IFM MX ;MX CONSOLE 11
122 DL10P==0 ;DOES NOT HAVE DL10
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
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>
153 .IFM AI ;AI'S CHAOS-ETHER-GATEWAY PDP11
155 ;THIS IS A PDP11/10, WE HAVE TO REDEFINE A FEW THINGS
165 DL10P==0 ;HAS NO DL10
166 DTE20P==0 ;DOES NOT HAVE DTE20
167 NODDT==1 ;DOESN'T HAVE DDT (USE CARPET)
168 NFTTY==0 ;2 * # OF FIRST TTY THIS 11
169 NDHS==0 ;NUMBER OF DH11'S
170 NDHUN==0 ;NUMBER OF UNUSED DH11 LINES
171 DHIBAS==320 ;DH11 INTERRUPT VECTOR BASE
172 DHCBAS==160020 ;CSR of first DH11
173 NDLS==0 ;NUMBER OF DL11'S (ACTUALLY HAS ONE, BUT WE'RE NOT USING IT NOW)
174 CTYP==0 ;FIRST DL11 NOT T00 (CTY)
175 NMPTYS==0 ;NUMBER OF TTYS ON MULTIPLEXED LINE
176 NDMS==0 ;HAS NO DM11BB MODEM SCANNERS
177 GOULDP==0 ;DOESN'T HAVE GOULD LPT
178 T300P==0 ;TRIDENT T-300 AND 2561 CONTROLLER
179 CHAOSP==2 ;HAS TWO CHAOS NET INTERFACES
180 CHSBTB==0 ;CHAOSNET INTERFACE IS NEW-STYLE, DOES NOT GET HUNG
181 CHAD0==426 ;CHAOSNET ADDRESS OF THIS PDP11 ITSELF (AI-MC-CROSS-STREET SUBNET)
182 CHAD1==3072 ;SECOND INTERFACE (9TH FLOOR LISP MACHINE SUBNET)
183 CHADD==426 ;The DOVER protocol translator only works for this address
184 TEN11P==0 ;USES TEN-11 INTERFACE FOR CHAOS NET TO AI-10 (NOT ANY MORE!)
185 T11ADR==2026 ;CHAOSNET ADDRESS OF PDP10 CONNECTED VIA TEN-11 INTERFACE (AI)
186 NT11BF==3 ;THREE BUFFERS IN EACH DIRECTION FOR TEN-11 INTERFACE
188 ETHHSN==6 ;MY HOST NUMBER BYTE, JNC SAYS I SHOULD USE 6
189 NDVRBF==6 ;6 DOVER BUFFERS
190 DVRADR==1002 ;PUP ADDRESS OF DOVER
191 FTPULS==0 ;INITIALLY, AI DOES NOT GENERATE TEST PACKETS
192 FTGARB==1 ;DON'T SAVE LAST GARBAGE PACKET RECEIVED (LOW ON CORE) (not that low)
193 MAXBSZ==250. ;MAXIMUM TYPEOUT BUFFER SIZE
194 .MACRO ASPIRP BODY ;DEFINE LINE NUMBERS WITH AUTOSPEED
198 .IIF NDF NDHS, .ERROR MACHINE NAME NOT RECOGNIZED
200 .IIF NZ DL10P, .IIF Z NFTTY, .ERROR TTY # 0 DOESN'T WORK WITH DL10 PROTOCOL
202 ;ASSIGN TTY INDICES, HARDWARE INDICES, ETC.
205 HX==0 ;HARDWARE INDEX
206 NCT==0 ;NUMBER OF TTYS
208 ;SYSTEM CONSOLE (OUT OF ORDER)
219 NLDHHX==HX-2 ;UNITS 0-NLDHHX INCLUSIVE ARE DH11S
221 TX==TX-<2*NDHUN> ;COMPENSATE FOR UNUSED LINES
222 NLDHTY==TX-2 ;LAST DH11 LINE INCLUSIVE
228 TX==TX+<2*NDLS>-<2*CTYP>
240 NLTTY==NFTTY+<2*NCT> ;2 * # OF FIRST TTY NOT THIS 11
241 LASTTY==NLTTY-2 ;LAST VALID TTY INDEX
243 .IFNZ NDMS ;DM11-BB MODEM SCANNER
245 ;1.1-1.4 MODEM CHANNEL #
246 DMBSY==20 ;1.5 SCAN BUSY (R.O.)
247 DMSCN==40 ;1.6 SCANNER ON
248 DMIEN==100 ;1.7 INTERRUPT ENABLE
249 DMDON==200 ;1.8 DONE - SCANNER HAS FOUND SOMETHING
250 DMSTP==400 ;1.9 STEP SCANNER TO NEXT LINE (W.O.) 1.2 USEC.
251 ;2.1 MAINTENANCE MODE
252 DMCLR==2000 ;2.2 CLEAR RTS, DTR, SEC TX, LINE EN FOR ALL LINES (W.O.)
253 DMCSN==4000 ;2.3 CLEAR SCAN - CLEAR CSR AND MODEM STATUS MEMORY (W.O.) 19 USEC
254 DM2RX==10000 ;2.4 SECONDARY RECIEVE CHANGED ON SELECTED MODEM (R.O.)
255 DMCTS==20000 ;2.5 CLEAR TO SEND CHANGED ON SELECTED MODEM (R.O.)
256 DMCAR==40000 ;2.6 CARRIER DETECT CHANGED ON SELECTED MODEM (R.O.)
257 DMRNG==100000 ;2.7 RING CHANGED ON SELECTED MODEM (R.O.)
259 LINENB==1 ;1.1 ENABLE SCANNING OF LINE
260 LINDTR==2 ;1.2 DATA TERMINAL READY
261 LINRQS==4 ;1.3 REQUEST TO SEND (FORCE BUSY ON 103E)
262 LIN2TX==10 ;1.4 SECONDARY TRANSMIT
263 LIN2RX==20 ;1.5 SECONDARY RECEIVE (R.O.)
264 LINCTS==40 ;1.6 CLEAR TO SEND (R.O.)
265 LINCAR==100 ;1.7 CARRIER DETECT (R.O.)
266 LINRNG==200 ;1.8 RING (R.O.)
269 ; KW11-L LINE FREQ CLOCK
271 LKS=177546 ;1.8 CLOCK FLAG
273 HNGDLY==3*60. ;CLEAR TO SEND OFF FOR 3 SECONDS => HANGUP
276 ;DEFINITIONS FOR GOULD LPT
278 GLPCSR=166000 ;COMMAND STATUS REGISTER (NONSTANDARD)
280 %GCFF==0 ;TOP-OF-FORM COMMAND
281 %GCGRF==1 ;GRAPHIC MODE COMMAND
282 %GCCUT==2 ;CUT COMMAND (NO CUTTER ON THIS MACHINE, THOUGH)
283 %GCON==3 ;TURN PRINTER ON
284 %GCOFF==4 ;TURN PRINTER OFF
285 %GCLSL==5 ;LAST LINE (GRAPHIC MODE). => 2 MORE SCAN LINES.
286 %GCION==6 ;INTERRUPT ON
287 %GCIOF==7 ;INTERRUPT OFF
288 %GCADV==201 ;ADVANCE ONE LINE
290 %GSNRD==400 ;NOT READY
291 %GSDON==2000 ;TRANSFER COMPLETE
293 %GSVAC==10000 ;VACUUM FAULT
294 %GSPAP==20000 ;PAPER LOW
295 %GSTIM==40000 ;TIMEOUT
296 %GSERR==50400 ;ALL ERROR BITS
298 GLPWC=166002 ;NEGATIVE WORD COUNT REG
300 GLPCA=166004 ;CURRENT ADDRESS REG
302 GLPBSZ==132. ;BUFFER SIZE (# CHARS PER LINE)
304 NGLPBF==7 ;NUMBER OF BUFFERS
305 GB.STA==0 ;BUFFER STATE - DON'T CHANGE ORDER OF %GB CODES
307 %GBMP==2 ;2 ACTIVE AT M.P. LEVEL
308 %GBWRT==4 ;4 IN WRITE QUEUE
309 %GBPI==6 ;6 ACTIVE AT P.I. LEVEL
310 %GBDMA==8 ;8 ACTIVE AT D.M.A. LEVEL
311 GB.NXT==2 ;CIRC POINTER TO NEXT BUFFER
312 GB.FF==4 ;IF NON-ZERO, FF BEFORE THIS BUFFER
313 GB.NL==6 ;NUMBER OF BLANK LINES BEFORE THIS BUFFER
314 GB.PNT==10 ;-> NEXT BYTE TO INSERT
315 GB.DAT==12 ;DATA BEGINS HERE
316 GB.LEN==GB.DAT+GLPBSZ ;TOTAL NUMBER OF BYTES PER BUFFER
321 ;DEFINITIONS OF CHAOS NET HARDWARE
323 ;USUAL ADDRESS IS 764140 . USUAL INTERRUPT VECTOR IS 270 .
325 CAICSR=164140 ;COMMAND STATUS REG
327 %CABSY==1 ;0 XMT BUSY (RO)
328 %CALUP==2 ;1 LOOP BACK (R/W)
329 %CASPY==4 ;2 RECIEVE MSGS FOR ANY DESTINATION (R/W)
330 %CARCL==10 ;3 CLEAR THE RECEIVER, IT CAN NOW GOBBLE ANOTHER MSG (WO)
331 %CAREN==20 ;4 RCV INT ENB (R/W)
332 %CATEN==40 ;5 XMT INT ENB (R/W)
333 %CATAB==100 ;6 TRANSMIT ABORTED BY ETHER CONFLICT (RO)
334 %CATDN==200 ;7 TRANSMIT DONE. SET WHEN TRANSMITTER IS DONE
335 %CATCL==400 ;8 CLEAR THE TRANSMITTER, MAKING IT READY (WO)
336 ;9-12 LOST COUNT (RO) [# MSGS RCVED WITH RCV BFR FULL]
337 ; WHEN MSG IS WAITING IN BUFFER, THIS COUNTS
338 ; THE MESSAGES THAT MATCHED OUR DESTINATION OR
339 ; WERE BROADCAST, BUT COULDN'T BE RECIEVED.
340 ; WHEN RECEIVER IS RE-ENABLED (WRITE 1 INTO %CARDN)
341 ; THE COUNT IS THEN CLEARED.
342 ; WHEN A MESSAGE IS LOST, RECEIVER ZAPS ETHER
343 ; SO TRANSMITTER WILL ABORT (IF MESSAGE WAS DESTINED
345 %CARST==20000 ;13 I/O RESET (WO)
346 %CAERR==40000 ;14 CRC ERROR (RO)
347 %CARDN==100000 ;15 RCV DONE.
349 CAIMYN=164142 ;MY # (READ ONLY)
350 CH%MYN==2 ;RETURNS THE [SOURCE] HOST# OF THIS INTERFACE.
352 CAIWBF=164142 ;WRITE BUFFER (WRITE ONLY)
353 CH%WBF==2 ;FIRST WAIT FOR TDONE. (OR SET IT VIA CSR)
354 ;FIRST WORD IN RESETS TRANSMITTER AND CLEARS TDONE.
355 ;STORE INTO THIS REGISTER TO WRITE WORDS OF MESSAGE,
356 ;LAST WORD IN IS DESTINATION ADDRESS, THEN READ CAIXMT.
357 ;SOURCE ADDRESS AND CHECK WORD PUT IN BY HARDWARE.
359 CAIRBF=164144 ;READ BUFFER (READ ONLY)
360 CH%RBF==4 ;THE FIRST WORD READ WILL BE FILLED TO THE LEFT
361 ;TO MAKE THE MESSAGE RECIEVED A MULTIPLE OF 16 BITS.
362 ;IF THE NUMBER OF DATA BITS IN THE MESSAGE WAS A
363 ;MULTIPLE OF 16, THIS WORD WILL BE THE FIRST WORD PUT
364 ;INTO THE BUFFER BY THE TRANSMITTING HOST.
365 ;THE LAST 3 WORDS READ ARE DESTINATION, SOURCE, CHECK.
367 CAIRBC=164146 ;RECEIVE BIT COUNTER (READ ONLY)
368 CH%RBC==6 ;WHEN A MESSAGE HAS BEEN RECEIVED THIS IS ONE LESS THAN
369 ;THE NUMBER OF BITS IN THE MESSAGE (16 X THE
370 ;NUMBER OF WORDS INCLUDING THE THREE OVERHEAD WORDS.)
371 ;AFTER THE LAST WORD (THE CRC WORD) HAS BEEN READ, IT IS 7777
372 ;BITS 10 AND 11 ARE THE HIGH ORDER BITS, AND IF THEY ARE ONE,
373 ;THEN THERE WAS A BUFFER OVERFLOW
375 CAIXMT=164152 ;READING THIS INITIATES TRANSMISSION (!!)
376 CH%XMT==12 ;THE VALUE READ IS ONE'S OWN HOST#.
378 ;REFERENCING ADDRESSES IN THE GROUP OF 8 WORDS NOT LISTED HERE, OR
379 ;USING COMBINATIONS OF READ/WRITE NOT LISTED HERE, WILL TYPICALLY CAUSE
380 ;STRANGE AND BIZARRE EFFECTS.
383 ;THESE ARE FOR 4K PACKET BUFFERS AND FOR THE ORIGINAL CHAOSNET PROTOCOL
385 PKMAX==256. ;MAXIMUM LENGTH OF PACKET (INCLUDING ALL HARDWARE WORDS)
386 DATMAX==488. ;MAXIMUM NUMBER OF DATA BYTES
387 PKHDW==8 ;NUMBER OF HEADER WORDS
388 PKTMXW==<DATMAX/2>+PKHDW ;MAX WORDS THROUGH PACKET SWITCH (SEE MOVDH ETC.)
390 PKOP==1 ;BYTE INDEX OF THE OPCODE OF THE PACKET
401 PKNBYT==2 ;WORD INDEX OF NUMBER OF BYTES IN PACKET
402 PKNBMS==170000 ;MASK FOR THE NUMBER OF BYTES
403 PKFC==2 ;WORD INDEX FOR THE FORWARD COUNT
404 PKFCMS==7777 ;IT IS THE TOP 4 BITS
405 PKDHST==4 ;DESTINATION HOST
406 PKDIND==6 ; " " " INDEX
407 PKSHST==10 ;SOURCE HOST
408 PKSIND==12 ;SOURCE INDEX
409 PKPKN==14 ;THE PACKET NUMBER
410 PKACN==16 ;THE ACK PACKET NUMBER
411 PKDAT==20 ;THE START OF THE DATA
437 ZZ===%COMPAT ;DON'T CARE WHETHER .+2 OR .+4 GETS STORED
456 .MACRO T TAG ;usage is T TAG: <crlf> STMNT
462 .MACRO CONC A,B,C,D,E,F,G
466 .MACRO INFORM A,B,C,D,E,F,G
468 .PRINT /A'B'C'D'E'F'G
486 .SBTTL DL10 CONTROL AREA
491 DLXCSR: W ;DL10 11-SIDE CONTROL & STATUS REG
493 DLXIEN==4 ;1.3 ENABLE DLX11I TO INTERRUPT
494 DLXEEN==10 ;1.4 ENABLE ERRORS TO INTERRUPT
496 DLXPRT==40 ;1.6 PORT ENABLE (R.O.)
497 DLXZWC==100 ;1.7 CLEAR DLXWCO (W.O.)
498 DLXWCO==200 ;1.8 WORD COUNT OVERFLOW
499 DLXZPA==400 ;1.9 CLEAR DLXPAR (W.O.)
500 DLXPAR==1000 ;2.1 PAR ERR IN 10 MEM
501 DLXZNX==2000 ;2.2 CLEAR DLXNXM (W.O.)
502 DLXNXM==4000 ;2.3 NXM IN 10 MEM
503 DLXZ10==10000 ;2.4 CLEAR DLX10I (W.O.)
504 DLX10I==20000 ;2.5 INTERRUPT PDP10
505 DLXZ11==40000 ;2.6 CLEAR DLX11I (W.O.)
506 DLX11I==100000 ;2.7 INTERRUPT PDP11
508 VERS: W ;.BYTE FIRST LINE, # OF LINES
509 ;SET BY -10. USED TO CHECK CONSISTENCY.
511 DLXUP: W ;CHECK FOR UP-NESS IN BOTH DIRECTIONS
512 ;INCREMENTED BY 11 EVERY 1/60 SECOND, SETOM'ED BY 10 EVERY 1/2 SEC.
514 TTYST: W ;LINE# TO START OUTPUT ON (I.E. SET OUTPUT DONE)
515 ;SET BY 10, CLEARED BY 11
517 TYILIN: W ;TYPEIN STATUS WORD - LINE NUMBER
518 ;SET BY 11, CLEARED BY 10 - INTERRUPTS 10
519 TYICHR: W ;TYPEIN CHARACTER - GOES WITH PRECEDING WORD
521 TYOSTS: W ;STATUS WORD (OUTPUT DONE LINE #)
522 ;SET BY 11, CLEARED BY 10 - INTERRUPTS 10
523 TYOBSZ: W ;BUFFER SIZE FOR LINE WITH OUTPUT DINE (SET BY 11)
525 TYOPNT: W ;BUFFER POINTER FOR TTY OUTPUT
527 TYOCNT: W ;BUFFER LENGTH FOR TTY OUTPUT
529 TYOLIN: W ;LINE NUMBER FOR TTY OUTPUT
530 ;SET BY 10, CLEARED BY 11
532 HNGLIN: W ;0000NN - LINE # NN HUNG UP
533 ;01RTNN - LINE # NN HAS SPEED RCV=R, XMT=T (SEE TTYTYP FOR CODES)
534 ;SET BY 11, CLEARED BY 10 - INTERRUPTS 10
536 LPRLIN: W ;LINE NUMBER FOR SETTING LINE PARAMETERS
537 ;SET BY 10, CLEARED BY 11
538 LPRLPR: W ;DH11 LPR REGISTER FOR SETTING LINE PARAMETERS
540 LPRBSZ: W ;BUFFER SIZE FOR SETTING LINE PARAMETERS
543 EXDSTS: W ;STATUS WORD (EXAMINE/DEPOSIT 11 CORE)
544 ;1 = EXAMINE, 2 = DEPOSIT
545 ;SET BY 10, CLEARED BY 11
546 EXDADR: W ;ADDRESS FOR ABOVE
548 EXDDAT: W ;DATA WORD FOR ABOVE
549 ;SET BY 10 (DEPOSIT) OR 11 (EXAMINE)
551 GLPPTR: W ;BUFFER POINTER FOR GOULD OUTPUT
552 GLPCTR: W ;NUMBER OF BYTES YET TO BE GOBBLED
553 GLPTER: W ;ERROR STATUS, SET BY 11
554 GLPGRF: W ;GRAPHIC MODE IF NON-ZERO, SET BY 10
556 ;CHAOS NET SHARED VARIABLES
557 DLCINI: W ;WHEN THIS IS NON-ZERO, 11 RESETS ITS POINTERS AND CLEARS IT
558 DLCSP1: W ;SEND PACKET 1 (ILDB POINTER)
559 DLCSP2: W ;SEND PACKET 2
560 DLCSS1: W ;SEND STATE 1 (0 IDLE, 1 TO 11, 2 OUTPUT DONE)
561 DLCSS2: W ;SEND STATE 2
562 DLCRP1: W ;RECEIVE PACKET 1 (ILDB POINTER)
563 DLCRP2: W ;RECEIVE PACKET 2
564 DLCRS1: W ;RECEIVE STATE 1 (0 IDLE, 1 READY FOR INPUT FROM 11, 2 INPUT DONE)
565 DLCRS2: W ;RECEIVE STATE 2
567 ;^ ADD MORE HERE, E.G. IMP
570 ;DISK AREA. 14. WORDS 48. WORDS INTO THE DL-10 AREA.
573 DSCCHK: W ;MUST BE 2561 OCTAL TO MAKE SURE WE HAVE CORRECT PDP-10 PROGRAM
574 DSCREQ: W ;0 MEANS NO REQUEST. NON-ZERO MEANS 10 HAS PENDING REQUEST TO 11.
575 DSCDON: W ;0 MEANS NOT DONE, NON-ZERO MEANS 11 IS TELLING 10 IT'S DONE.
576 ;NEXT 2 WORDS WRITTEN BY 11 TO TELL STATUS OF OPERATION
577 DSCFLT: W ;0 NO FAULT
578 %DFRST==100000 ; BIT 15=POWER CYCLED OR UNIBUS HUNG, SO CONTROLLER WAS RESET
579 ; BIT 12=Q ERROR, BIT 11=CMD NXM, BIT 10=CMD PAR
580 ; IF ONE OF THESE BITS IS ON, BITS 1-0 AND DSCSTS ARE THE ERROR ADDRESS
581 ; BITS 7-0 SYSTEM FAULT CODE IF LEFT BYTE IS ZERO
582 ; SEE THE 2561 OEM MANUAL FOR MEANING OF FAULT CODES
583 DSCSTS: W ;STATUS FROM 2561:
584 %DSRTR==100000 ;COMMAND WAS RETRIED
585 %DSECH==40000 ;UNCORRECTABLE DATA ERROR (ECC HARD)
586 %DSECC==20000 ;CORRECTED DATA ERROR
587 %DSIDE==10000 ;ID ERROR
588 %DSHCE==4000 ;ADDRESS ERROR (HEADER COMPARE ERROR)
589 %DSPRT==2000 ;WRITE-PROTECT STATUS OF SECTOR (ABORTS WRITE COMMAND)
590 %DSALT==1000 ;ALTERNATE-SECTOR STATUS (ABORTS READ, WRITE, AND CHECK)
591 %DSOVR==400 ;FIFO OVER-RUN, NOT CORRECTED BY 1 RETRY
592 %DSSKE==200 ;SEEK ERROR FROM DRIVE
593 %DSOFL==100 ;DRIVE OFF-LINE OR FAULT
594 %DSFLT==20 ;DRIVE FAULT
595 %DSNXM==10 ;NXM ON PDP11 MEMORY
596 %DSPAR==4 ;PARITY ERROR IN PDP11 MEMORY
597 %DSSFL==2 ;SYSTEM FAULT, SEE LOW BYTE OF DSCFLT
598 %DSWLK==1 ;DRIVE WRITE-LOCKED, WRITE ABORTED
600 ;FOLLOWING WORDS ARE WRITTEN BY 10 TO TELL WHAT TO DO
601 DSCCMD: W ;COMMAND OPCODE:
602 ;%DMNOP==0 ;DO NOTHING
603 ;%DMCST==1 ;READ OUT CONTROLLER STATE (NOT USEFUL SINCE NOT RETURNED TO 10)
604 %DMSNS==2 ;SENSE DRIVE STATE. DSCSTS GETS CODE FOR DRIVE TYPE IN
605 ; BITS 14-8 (10 FOR T-300), AND %DSWLK, %DSFLT, %DSOFL, %DSSKE
606 %DMTST==3 ;TEST SPECIFIED DRIVE (RUNS DIAGNOSTICS)
607 %DMREC==4 ;RECALIBRATE
609 %DMWRT==6 ;WRITE DATA
610 ;%DMFMT==7 ;WRITE FORMAT
611 ;%DMPWT==10 ;WRITE AND SET WRITE-PROTECT BIT
612 ;%DMAWT==11 ;WRITE AND SET ALTERNATE-SECTOR BIT
613 ;%DMCHK==12 ;READ AND CHECK ECC BUT DON'T STORE DATA
614 ;%DMLWT==14 ;LONG WRITE, WILL WRITE ECC AS WELL AS DATA
615 %DMRED==20 ;READ DATA. ADD 1-10 FOR VARIOUS RECOVERY FEATURES AS
616 ; DOCUMENTED IN THE 2561 OEM MANUAL.
617 ;%DMRID==40 ;READ IF FIELD, NOT USEFUL SINCE NOT RETURNED TO 10
618 DSCDRV: W ;UNIT NUMBER
619 DSCCYL: W ;CYLINDER ADDRESS (THESE ARE COPIED BACK BY THE 11 IN CASE OF ERROR)
620 DSCHED: W ;HEAD ADDRESS
621 DSCSEC: W ;SECTOR ADDRESS
622 ;WORD COUNT IS ALWAYS 12.*256.
623 ;IF WE PUT IN SEEK-OVERLAP AN ATTENTION FEATURE WILL BE NEEDED
624 ;THAT WOULD ALSO BE USED FOR DISK POWER-UP SIGNALLING
625 ;THESE WORDS ARE SET UP BY THE 10 AS BYTE-POINTERS TO THE DATA
626 ;TO BE TRANSFERRED. EACH BYTE POINTER CAN TRANSFER AT MOST 256 PDP10 WORDS
627 ;DUE TO BRAIN-DAMAGE IN THE DL10, SO THERE ARE 4 OF THEM
635 .SBTTL DTE20 CONTROL AREA
637 ;LOCATIONS 400-437 ARE JUST BETWEEN US AND ITS
638 ;LOCATIONS 440-457 ARE KNOWN ABOUT BY KLDCP ALSO
640 ;EPTDDT==441 ;START ADDRESS OF PDP10 NON TIME SHARING DDT
641 DTEFLG==444 ;NON TIME SHARING TYPEIN/TYPEOUT DONE FLAG (SET BY 11, CLEARED BY 10)
642 DTEF11==450 ;USED BY NON TIMESHARING TYPEIN COMMAND TO RETURN THE CHAR (SET BY 11)
643 DTECMD==451 ;NON TIME SHARING COMMAND (SET BY 10)
644 ;COMMANDS THAT CAN GO IN DTECMD:
645 ;0-377 CHAR TO BE TYPED OUT
646 %DTTYI==3400 ;TYPE IN, CHAR RETURNED IN DTEF11
647 %DTCLN==1001 ;60 CYCLE CLOCK ON
648 %DTCLF==1000 ;60 CYCLE CLOCK OFF
649 ;THERE ARE MILLIONS OF OTHERS, BUT WHO NEEDS 'EM?
650 DTECLK==445 ;60 CYCLE CLOCK FLAG (SET BY 11, CLEARED BY 10)
651 ;DTESWR==457 ;SIMULATED SWITCH REGISTER (SET BY 11)
653 ;THE FOLLOWING LOCATIONS ARE ONLY USED IN TIME SHARING AND NOT KNOWN ABOUT BY KLDCP
655 DTEVER==400 ;I/O VERSION NUMBER. .BYTE FIRST LINE, NUMBER OF LINES.
656 ;SET BY 10, CHECKED BY 11
658 DTECHK==401 ;INCREMENTED BY 11 60 TIMES PER SECOND, SETOMED BY 10 EVERY 1/2 SECOND
659 ;USED TO CHECK THAT 10 IS GETTING INTERRUPTS OK
661 DTEINP==402 ;CONTROLS "BYTE TRANSFERS" FROM 11 TO 10 (INPUT DIRECTION).
662 ;SET BY 10 TO REQUEST A TRANSFER, SETOM'ED BY 11 WHEN XFER COMPLETE.
663 ;10 SHOULD SET UP DTEBPI IN EPT AND DO DATAO DTE, BEFORE SETTING DTEINP.
664 ;SEE COMMENTS BELOW DTEOUT FOR WHAT GOES IN DTEINP.
665 DTEOUT==403 ;CONTROLS "BYTE TRANSFERS" FROM 10 TO 11 (OUTPUT DIRECTION).
666 ;SET BY 10 TO REQUEST A TRANSFER, SETOM'ED BY 11 WHEN TRANSFER STARTS.
667 ;EACH SIDE KNOWS WHEN TRANSFER IS IN PROGRESS, DOESN'T TRY TO START
668 ; ANOTHER UNTIL IT HAS RECEIVED HARDWARE TRANSFER-DONE INTERRUPT.
669 ;10 SHOULD SET UP DTEBPO IN EPT BEFORE SETTING DTEOUT.
670 ;RH IS #BYTES EXPECTED, LH IS COMMAND+LINE#. COMMANDS ARE:
671 %DTTYO==1000 ;TELETYPE OUTPUT
672 ;%DTETI==2000 ;ETHERNET INPUT
673 ;%DTETO==3000 ;ETHERNET OUTPUT
674 ;^ ADD MORE COMMANDS HERE. NOTE: THE 4.1 BIT IS 1 FOR OUTPUT, 0 FOR INPUT.
676 DTELSP==404 ;LINE# TO SET SPEED OF (SET BY 10, SETOMED BY 11)
677 DTELPR==405 ;DH11 LINE-PARAMETER-REGISTER,,BUFFER SIZE
679 DTEOST==406 ;LINE# TO START OUTPUT ON (SET OUTPUT DONE). (SET BY 10, SETOMED BY 11)
683 DTETYI==410 ;TELETYPE INPUT
684 ;LH=LINE#, RH=CHAR RECEIVED. (SET BY 11, SETOM'ED BY 10)
686 DTEODN==411 ;TELETYPE OUTPUT DONE
687 ;LH=LINE#, RH=BUFFER SIZE. (SET BY 11, SETOM'ED BY 10)
689 DTEHNG==412 ;HANGUP/DIALIN WORD (SET BY 11, SETOM'ED BY 10)
690 ;0000NN - LINE # NN HUNG UP
691 ;01RTNN - LINE # NN HAS SPEED RCV=R, XMT=T (SEE TTYTYP FOR CODES)
693 ;^ ADD MORE HERE, NOT TO EXCEED LOCATION 437
696 ;IOELEVEN RESIDES IN THE BOTTOM 14K OF THE CONSOLE PDP11, ALONG WITH 11DDT.
697 ;I.E. LOCATIONS 0-70000. BE SURE TO USE .;11DDT 14K VERSION OF DDT.
698 ;THE UPPER 14K CONTAIN KLDCP. THE FOLLOWING CALLS TO KLDCP ARE USED.
699 ;THEY RETURN WITH C-BIT SET IF THEY LOSE (MICROCODE HUNG).
701 ;NOTE: KLDCP ENJOYS CLOBBERING REGISTER 0 (A). I DON'T
702 ;KNOW IF ALL THESE CALLS DO, BUT WE'LL ASSUME THAT THEY DO.
704 TENSW=EMT!145 ;UPDATE LOCATION DTESWR FROM THE SWITCHES
706 EXAM=EMT!103 ;EXAMINE PDP10 MEMORY
707 ;BEFORE CALL, REGISTER A HAS ADDRESS OF 3 BYTES CONTAINING PDP10 ADDRESS (LOW BITS FIRST)
708 ;AFTER CALL, REGISTER A HAS ADDRESS OF 3 WORDS CONTAINING CONTENTS (LOW BITS FIRST)
710 EXAMT=EMT!104 ;EXAMINE PDP10 MEMORY
712 ;.WORD ADDRESS OF 3-WORD DATA BLOCK
714 DPOS=EMT!105 ;DEPOSIT PDP10 MEMORY
715 ;BEFORE CALL, REGISTER A HAS ADDRESS OF 3 WORDS CONTAINING CONTENTS
716 ;AND REGISTER B HAS ADDRESS OF 3 BYTES CONTAINING ADDRESS
718 DPOST=EMT!106 ;DEPOSIT PDP10 MEMORY
720 ;.WORD ADDRESS OF 3-WORD DATA BLOCK
722 D10MON=EMT!111 ;DEPOSIT PDP10 MEMORY, -1
725 $PMSG=EMT!25 ;PRINT MESSAGE ON TTY
726 ;.WORD ADDRESS OF ASCIZ MESSAGE
728 $CNTLC=100004 ;JUMP HERE TO "CONTROL C" BACK TO KLDCP
730 ;WHEN KLDCP IS IDLE, AND IN "ITS MODE", IT DOES JSR PC,3000
731 ;WHICH CALLS IOELEVEN'S MAIN PROGRAM. RETURN WITH "C" SET
732 ;TO READ AND EXECUTE ONE KLDCP COMMAND LINE. RETURN WITH "C"
733 ;CLEAR TO PRINT KL10 HALTED OR CLOCK ERROR STOP MESSAGE.
734 ;LOCATIONS 3004, 3006 MUST CONTAIN .RAD50/IOELEV/
735 ;IOELEV WILL RUN ON KLDCP'S STACK.
737 ;INFORMATION ABOUT THE DTE20.
738 ;EXCEPT FOR BYTE TRANSFER, WE USE THE TIME-TESTED SUBROUTINES PROVIDED BY KLDCP.
740 ;THE INTERRUPT VECTOR IS AT 774, BUT WE CAN'T USE IT BECAUSE WOULD HAVE
741 ;TO COORDINATE THINGS WITH KLDCP, WHICH IS OBVIOUSLY IMPOSSIBLE.
743 DLYCNT=174400 ;2.6-2.7 UNIBUS ADDRESS EXTENSION FOR BYTE TRANSFER DMA
744 ;1.1-2.5 14-BIT 2'S COMPLEMENT OF NUMBER OF HALF-MICROSECONDS
745 ; TO DELAY BETWEEN PI0 INTERRUPTS IN BYTE TRANSFER
747 TO10AD=174420 ;ADDRESS (WORD OR BYTE) OF TO-10 BYTE TRANSFER DATA
749 TO10BC=174414 ;1.1-2.3 NEGATIVE BYTE COUNT, 2.7 LAST XFER
750 ;NORMALLY SET BY 10 WITH DATAO DTE,
751 ;TO10 XFER STARTS WHEN BOTH TO10AD AND TO10BC HAVE BEEN LOADED
753 TO11AD=174422 ;ADDRESS (WORD OR BYTE) OF TO-11 BYTE TRANSFER DATA
755 TO11BC=174416 ;1.1-2.3 NEGATIVE BYTE COUNT FOR TO-11 BYTE TRANSFER
756 ;2.5=1 => TO-11 TRANSFER IS 8-BIT BYTES, =0 => 16-BIT WORDS
757 ;2.6=1 => "ASCIZ" MODE (WHICH WE DON'T USE, OF COURSE)
758 ;2.7=1 => LAST XFER, UPON COMPLETION INTERRUPT BOTH 10 AND 11
759 ; =0 => ONLY INTERRUPT 11. 11 CAN CHANGE TO11AD, TO11BC, CONTINUE.
760 ;TO11 XFER STARTS WHEN BOTH TO11AD AND TO11BC HAVE BEEN LOADED
761 ;THE TRANSFER HAPPENS USING DMA (NPR) IN 11, PI LEVEL 0 IN 10.
763 STATUS=174434 ;DTE20 STATUS REGISTER
765 %STDNI==100000 ;2.7 TO10 XFER DONE WITHOUT ERROR
766 %STERI==20000 ;2.5 TO10 XFER ABORTED BY ERROR
767 ;2.4 DATA OUT OF DTE RAM IS ALL ZERO (MAINT)
768 %STINV==4000 ;2.3 PDP10 IS INTERRUPTING PDP11
769 ;2.2 DEPOST OR EXAMINE WORD ONE (MAINT)
770 ;2.1 PDP11 MEMORY PARITY ERROR IN TO10 XFER
771 ;1.9 PDP11 IS INTERRUPTING PDP10
772 %STDNO==200 ;1.8 TO11 XFER DONE WITHOUT ERROR
773 ;1.7 E BUFFER SELECT (MAINT)
774 ;1.6 TO11 XFER STOPPED DUE TO ZERO BYTE (IN ASCIZ MODE)
775 ;1.5 TO11 XFER OR PDP10 EXAMINE ENCOUNTERED EBUS PARITY ERROR
776 ;1.4 1 => RESTRICTED MODE
777 ;1.3 0 => EXAMINE/DEPOSIT IN PROGRESS, 1 => DONE
778 %STERO==2 ;1.2 TO11 XFER ABORTED BY ERROR
779 ;1.1 1 => DTE ENABLED TO INTERRUPT PDP11
781 %STCLI==51000 ;2.6+2.4+2.1 CLEAR TO10 XFER DONE AND ERROR FLAGS
782 %STUNV==2000 ;2.2 CLEAR PDP10 INTERRUPTING PDP11
783 %STINX==400 ;1.9 SET PDP11 INTERRUPTING PDP10
784 %STCLO==121 ;1.7+1.5+1.1 CLEAR TO11 XFER DONE AND ERROR FLAGS
785 ;1.6 ENABLE INTERRUPTS
786 ;1.4 DISABLE INTERRUPTS
788 DIAG1=174430 ;DIAGNOSTIC WORD 1, INCLUDES FLAGS
789 %D1ERR==4000 ;2.3 KL10 CLOCK ERROR STOP
790 %D1RUN==2000 ;2.2 KL10 RUN INDICATOR (1 IF 11 WANTS 10 TO RUN)
791 %D1HLT==1000 ;2.1 KL10 HALT INDICATOR (1 IF 10 DOES A JRST 4)
793 DIAG3=174436 ;DIAGNOSTIC WORD 3, INCLUDES FLAGS
794 %D3BYT==1 ;1.1 WRITING 0 SETS TO10 XFER IN WORD MODE, 1 BYTE MODE
795 ;THERE'S NOTHING ELSE OF THE SLIGHTEST USE IN THIS REGISTER,
796 ;SO IT'S OK TO WRITE IT AT ANY TIME.
801 .IFZ DTE20P ;IF USING DTE20, THESE ARE SET UP BY KLDCP
807 ; TRAP14 ;SET UP BY 11DDT
820 ;CHAOS NET INTERRUPT VECTORS ARE UNFORTUNATELY NOT IN A REASONABLE ARRAY
824 ;274 IS INTERVAL TIMER
829 ;234 IS INTERVAL TIMER
834 ;244 IS INTERVAL TIMER
837 .ERROR WHERE DOES THE FOURTH CHAOSNET INTERRUPT VECTOR GO?
857 .REPT NDMS ;DM11s go in floating vectors
858 CONC DM,\.RPCNT+1,BRK
859 240 ;INTERRUPTS ON BR4 BUT WE MASK TO BR5 ANYWAY
864 DL1IBK ;FIRST DL11 LINE IS PDP11'S CONSOLE TTY, DIFFERENT ADDRESS
865 240 ;AGAIN INTERRUPTS ON BR4 BUT MASK TO BR5 SO CAN USE DH11 ROUTINES W/O FEAR
870 .REPT NDLS-1 ;DL11S AFTER THE FIRST ARE IN FLOATING VECTORS
871 CONC DL,\.RPCNT+2,IBK
873 CONC DL,\.RPCNT+2,OBK
877 .=DHIBAS ;DON'T RELY ON RANDOM FLOATING VECTOR TO
878 ;COME OUT RIGHT, E.G. IF THERE IS A DL11
879 ;THERE WHICH WE AREN'T USING.
880 .REPT NDHS ;DH11S ARE IN FLOATING VECTOR AFTER DL11[E]S
881 CONC DH,\.RPCNT+1,IBK ;DH11 #n RECEIVE
883 CONC DH,\.RPCNT+1,OBK ;DH11 #n TRANSMIT & ERROR
887 CLKBRK ;KW11-L 60-CYCLE CLOCK
893 300 ;BR5 BUT NEED TO LOCK OUT CLOCK SO MASK 6
898 MPXENB::0 ;NONZERO TO ENABLE MULTISCHLUNKER
901 .IFZ DTE20P ;IF DTE20, KLDCP SUPPLIES THE STACK
904 JMP INIT ;START AT 1000 IS CONVENTIONAL
908 SADR=.-2 ;ARG OF THE JMP@# IS CHANGED AFTER INITIALIZATION
912 .SBTTL TEN-11 CHAOSNET COMMUNICATION AREA
915 T11BFL==8+<2*PKTMXW> ;BYTE LENGTH OF A PACKET BUFFER
916 ;FIRST 8 BYTES ARE BUFFER-FULL FLAG AND CKSM
917 .IIF NE T11BFL-<<T11BFL/4>*4>, .ERROR T11BFL NOT MULTIPLE OF 4
919 .IIF NE .-1004, .ERROR CHAOSNET TEN-11 COMMUNICATION AREA NOT AT RIGHT ADDRESS
921 ;THIS AREA IS SHARED WITH THE PDP10 VIA TEN-11 INTERFACE.
923 .WORD "CH,1 ;ERROR CHECK AND VERSION NUMBER
924 T11I10: .WORD 0,0 ;SET NON-ZERO BY 11 TO REINITIALIZE 10
925 T11I11: .WORD 0,0 ;SET NON-ZERO BY 10 TO REINITIALIZE 11
926 .WORD T11BFL,NT11BF ;BUFFER SIZE, NUMBER OF BUFFERS
928 T11OBF: .BLKB T11BFL*NT11BF ;TO-10 BUFFERS
929 T11OBE==. ;END OF TO-10 BUFFERS
930 T11IBF: .BLKB T11BFL*NT11BF ;FROM-10 BUFFERS
931 T11IBE==. ;END OF FROM-10 BUFFERS
932 ;THE FIRST 32-BIT WORD OF A BUFFER IS 0 IF IDLE, OR
933 ;NON-ZERO IF BUFFER IS TO BE SENT TO OTHER MACHINE.
934 ;THE SECOND 32-BIT WORD IS THE CHECKSUM, WHICH IS
935 ;COMPUTED BY ADDING ALL THE 32-BIT WORDS, IGNORING OVERFLOW,
936 ; AND LOGICALLY SHIFTING RIGHT ONE BIT AFTER EACH ADD; BITS SHIFTED
937 ; OUT ON THE RIGHT ARE BROUGHT BACK IN ON THE LEFT.
938 ;IF THE NUMBER OF 16-BIT WORDS IS ODD, THE LEFT-OVER ONE BETTER BE 0.
943 ; TABLES INDEXED BY H (PER HARDWARE UNIT)
945 .MACRO DHTE AD ;DH11 REGISTER ADDRESS GENERATOR
951 .MACRO DLTE AD ;DL11 REGISTER ADDRESS GENERATOR, FIRST IS WIERD
960 .MACRO DMTE AD ;DM11 register address generator
962 <AD>+<10*.RPCNT> ;a DM11 eats 8 locations
966 DMCSR: DMTE 170500 ;first DM11 is at 170500
968 DMLSR: DMTE 170502 ;selected line status at 170502
970 DHSCR: DHTE DHCBAS ;SYSTEM CONTROL REGISTER
972 ;1.5-1.6 MEMORY ADDRESS EXTENSION
973 DHRENB==100 ;1.7 RECEIVER INTERRUPT ENABLE
974 ;1.8 RECEIVER INTERRUPT
976 ;2.1 MAINTENANCE MODE
977 DHSNXM==2000 ;2.2 NXM FLAG (GENERATES XMT INTERRUPT)
979 DHSENB==10000 ;2.4 STORAGE SILO FULL INTERRUPT ENABLE
980 DHTENB==20000 ;2.5 TRANSMITTER & NXM INTERRUPT ENABLE
981 ;2.6 STOARGE FULL INTERRUPT
982 DHTDON==100000 ;2.7 TRANSMITTER DONE INTERRUPT
985 DLTE 175610 ;KEYBOARD STATUS REGISTER
986 ;1.1 PAPER TAPE READER ENABLE (WO)
987 ;1.2 DATA TERMINAL READY (RW)
988 ;1.3 REQUEST TO SEND (RW)
989 ;1.4 SECONDARY TRANSMIT DATA [OR MAKE BUSY] (RW)
991 ;1.6 DATASET INTERRUPT ENABLE (RW)
992 ;1.7 RECEIVE INTERRUPT ENABLE (RW)
993 ;1.8 RECEIVE DATA READY (RO)
996 ;2.2 SECONDARY RECEIVE DATA (RO)
997 ;2.3 RECEIVE ACTIVE (RO)
998 ;2.4 CARRIER DETECT (RO)
999 ;2.5 CLEAR TO SEND (RO)
1000 ;2.6 RING INDICATOR (RO)
1001 ;2.7 DATASET STATUS CHANGE (RO)
1003 DHNRC: DHTE DHCBAS+2 ;NEXT RECEIVED CHARACTER
1004 ;1.1-1.8 THE CHARACTER
1005 ;1.9-2.3 LINE NUMBER
1006 %DXPAR==10000 ;2.4 CHAR HAS WRONG PARITY
1007 %DXBRK==20000 ;2.5 FRAMING ERROR (BREAK)
1008 %DXOVR==40000 ;2.6 OVERRUN, PREVIOUS CHARS LOST
1009 ;2.7 1 => THIS WORD VALID
1011 DLTE 175612 ;KEYBOARD INPUT REGISTER
1012 ;1.1-1.8 RECEIVED DATA
1013 ;2.4 PARITY ERROR (RO)
1014 ;2.5 FRAMING ERROR (RO)
1016 ;2.7 OR OF ERROR BITS (RO)
1018 DHLPR: DHTE DHCBAS+4 ;LINE PARAMETER REGISTER
1019 ;1.1-1.2 CHARACTER LENGTH 0=5, 1=6, 2=7, 3=8 (PARITY BIT EXTRA)
1020 ;1.3 1 => EXTRA STOP BIT
1022 ;1.6 0 -> EVEN PARITY, 1 => ODD
1023 ;1.7-2.1 RECEIVER SPEED
1024 ; 0 OFF, 1 50, 2 75, 3 110, 4 134.5, 5 150, 6 200, 7 300
1025 ; 10 600, 11 1200, 12 1800, 13 2400, 14 4800, 15 9600, 16 A, 17 B
1026 ;2.2-2.5 TRANSMITTER SPEED, SAME CODES AS RECEIVER
1030 DHCA: DHTE DHCBAS+6 ;CURRENT ADDRESS
1034 DHBC: DHTE DHCBAS+10 ;BYTE COUNT (MINUS)
1036 .IREPT NDLS,0 ;POSITIVE FOR DLS
1038 DHBAR: DHTE DHCBAS+12 ;BUFFER ACTIVE REGISTER
1039 ;BIT = 1 IF XMT ACTIVE ON CORRESP LINE, NUMBERED RIGHT TO LEFT
1041 DLTE 175614 ;PRINTER STATUS
1042 ;1.1 SEND BREAK (RW)
1044 ;1.6 INTERRUPT ENABLE (RW)
1045 ;1.7 TRANSMITTER READY (RO)
1047 DHBCR: DHTE DHCBAS+14 ;BREAK CONTROL REGISTER
1048 ;BIT = 1 => SEND BREAK ON CORRESP LINE, NUMBERED RIGHT TO LEFT
1050 DLTE 175616 ;PRINTER BUFFER
1051 ;1.1-1.8 DATA TO TRANSMIT
1053 DHSSR: DHTE DHCBAS+16 ;SILO STATUS REGISTER
1054 ;1.1-1.6 SILO ALARM LEVEL
1055 ;1.7-1.8 READ EXTENDED ADDRESS (R.O.)
1056 ;1.9-2.5 SILO FILL LEVEL (R.O.)
1057 ;2.7 MAINTENANCE PATTERN (W.O.)
1059 DHOAC: .IREPT NDHS,0 ;BIT ON IF SOFTWARE THINKS LINE'S TRANSMITTER IS ACTIVE
1061 .IREPT NDLS,0 ;NON-ZERO IF LINE'S TRANSMITTER IS ACTIVE
1063 DHTYNO: .IREPT NDHS, NFDHTY+<32.*.RPCNT> ;TTY INDEX OF FIRST LINE ON THIS DH11
1065 .IIF NZ CTYP,0 ;TTY INDEX OF LINE ON THIS DL11
1066 .IREPT NDLS-CTYP,NFDLTY+<2*.RPCNT>
1068 STROUT: .IREPT NDHS, STRDH ;OUTPUT-START ROUTINES
1070 .IIF NZ NMPTYS, STRMPK
1072 .BLKB NFTTY ;AVOID LABEL OVERLAPPAGE
1074 ;TABLES INDEXED BY I (PER LINE)
1076 T HDWR: ;HARDWARE UNIT INDEX, GOES IN H
1077 .IIF NZ CTYP, NFDLHX
1081 ZZ ;16 LINES ON EACH DH-11
1085 .IREPT NDLS-CTYP,NFDLHX+<2*.RPCNT>+<2*CTYP>
1086 .IREPT NMPTYS, MPKHWR ;MULTIPLEXOR-KLUDGE TTYS
1088 T DHLSEL: ;DH11 LINE SELECT WORDS
1089 .IIF NZ CTYP, 0 ;NONE FOR CTY
1092 DHTENB+DHRENB+.RPCNT
1096 T DHLBIT: ;BIT CORRESPONDING TO THIS LINE IN DHBAR, ETC.
1097 .IIF NZ CTYP, 0 ;NONE FOR CTY
1104 T BUFPNT: ;BUFFER POINTERS
1105 .IREPT NCT, BUFFRS+<.RPCNT*MAXBSZ>
1107 T BUFSIZ: ;BUFFER SIZES (I.E. AMOUNT TO USE AT CURRENT SPEED)
1109 0 ;SET DURING INITIALIZATION
1112 T NRMIPC: ;NORMAL INPUT CHARACTER PROCESSING ROUTINES
1113 .IIF NZ CTYP, RCV ;CTY NORMAL INPUT
1115 DHNRMI ;DH11 TTY NORMAL INPUT
1118 .IREPT NDLS-CTYP,RCV ;DL11 NORMAL INPUT
1119 .IREPT NMPTYS, RCV ;NORMAL INPUT FOR TTYS ON MULTIPLEXOR-KLUDGE
1120 .IIF NE .-NRMIPC-NLTTY, .ERROR BARF AT NRMIPC
1123 MPXINP ;INPUT FROM THE MULTIPLEXED LINE IS SPECIAL
1127 T TTYIPC: ;CURRENT INPUT CHAR PROCESSING ROUTINES
1128 .BLKW NCT ;SET UP AT INIT TIME
1129 .IIF NE .-TTYIPC-NLTTY, .ERROR BARF AT TTYIPC
1131 T AUTOSP: ;IF NON-ZERO, LINE GOES INTO AUTOSPEED WHEN DIALED UP
1132 .REPT NCT ;IF MINUS ALSO WHEN BREAK SEEN
1135 .IIF EQ .RPCNT+<NFTTY/2>-N,+1 ;THIS LINE AUTOSPEED ON DIALUP
1136 .IIF EQ .RPCNT+<NFTTY/2>+N,-1 ;ALSO ON BREAK
1138 .IIF EQ .-ZZ, 0 ;THIS LINE NOT AUTOSPEED
1140 .IIF NE .-AUTOSP-NLTTY, .ERROR BARF AT AUTOSP
1143 M2LMAP: ;MAP FROM DM11-BB CHANNEL NUMBERS TO TTY INDICES
1178 .IIF NE NDMS, .IIF NE .-M2LMAP-<40*NDMS>, .ERROR Too few M2LMAP entries for DM11s.
1182 T DIALED: ;0 IF LINE NOT DIALED UP (OR NO MODEM CONTROL ON THIS LINE)
1183 .REPT NCT ;+ IF DIALED UP (CLEAR TO SEND IS ON)
1184 0 ;- IF CLEAR TO SEND DROPPED, INC EACH TICK, REACHES 0 => HUNG UP
1189 T TTYHNG: ;DIALUP/HANGUP STATUS WAITING TO BE SENT TO 10 (0 IF NONE)
1194 T TYPING: ;POSITIVE IF LINE IS TYPING OUT FOR 10
1195 .REPT NCT ; WHICH MEANS -10 SHOULD BE INFORMED WHEN TYPEOUT IS FINISHED
1196 0 ;0 FOR NO -10 TYPEOUT, MINUS TO SEND <CALL> AFTER TYPEOUT
1201 DLXOFF: -1 ;NON-ZERO IF DL10 PORT TURNED OFF BY 10
1202 NO.ITS: -1 ;NON-ZERO IF HAVEN'T ESTABLISHED COMMUNICATION WITH ITS YET
1203 VERSN: .BYTE NFTTY/2,NCT ;I/O VERSION NUMBER
1204 DMINI: 0 ;NON-ZERO => MODEM SCANNER JUST TURNED ON, GETTING INITIAL STS
1205 WAKE: 0 ;CLOCK INTERRUPT WAKE UP MAIN PROGRAM FLAG
1206 HNGSIG: 0 ;NUMBER OF NON-ZERO TTYHNG WORDS
1207 10RQ: 0 ;LIGHT HACKS
1210 CLKENB: 0 ;KL10 WANTS 11 TO RELAY CLOCK INTERRUPTS
1211 KLDCPF: 0 ;NON-ZERO => USER WANTS TO GIVE A COMMAND TO KLDCP
1212 DDTMOD: 0 ;NON-ZERO => DDT MODE TTY INPUT
1213 DDTCHR: -1 ;NON-NEGATIVE => CHAR TYPED FOR DDT
1214 CURSWR: 52525 ;LAST SWITCHES SENT TO -10
1215 OUTCMD: 0 ;0 IF OUTPUT TRANSFER IDLE
1216 ;ELSE CURRENT COMMAND / 400
1217 OUTSVI: -1 ;LINE# OF CURRENT OUTPUT TRANSFER
1218 OUTSVC: -1 ;#BYTES OF CURRENT OUTPUT TRANSFER
1219 INPCMD: 0 ;0 IF INPUT TRANSFER IDLE
1220 ;ELSE CURRENT COMMAND / 400
1221 INPSVI: -1 ;LINE# OF CURRENT INPUT TRANSFER
1222 INPSVC: -1 ;#BYTES OF CURRENT INPUT TRANSFER
1225 MPXOAC: 0 ;0 IDLE, -1 SENDING HEADER, 1 SENDING DATA
1226 MPXOLN: 0 ;2 x MPXK# OUTPUTTING FOR
1227 MPXSEL: NFMPTY ;TTY INDEX SELECTED FOR MPX INPUT
1228 MPXPNT: .IREPT NMPTYS,0 ;POINTER TO CRUFT TO SEND TO EACH MPXED LINE
1229 MPXNBT: .IREPT NMPTYS,0 ;# BYTES TO SEND, 0 IF IDLE
1230 MPXHED: .BYTE 0,0 ;MPX OUTPUT HEADER: 200+MPXK#, BYTE COUNT
1233 .SBTTL CHAOSNET VARIABLES & TABLES
1237 NSUBNT==80. ;MAXIMUM CAPACITY 80. SUBNETS
1239 .IFNZ DL10P ;DL10 UNSHARED
1240 DLCRBN: 0 ;CURRENT RECEIVE (11 to 10) BUFFER (0 OR 2)
1241 DLCNXT: .WORD 2,0 ;FOR SWITCHING BUFFERS
1242 DLCIBF: .BLKW PKMAX ;DL10 INPUT BUFFER
1245 .IFNZ TEN11P ;TEN11 UNSHARED
1246 T11OBP: T11OBF ;NEXT BUFFER TO 10
1247 T11IBP: T11IBF ;NEXT BUFFER FROM 10
1248 T11IBA: 0 ;NON-ZERO MEANS INPUT BUFFER ACTIVE, T11IBP NEEDS ADVANCING
1249 ;THIS IS SEPARATE FROM CHISTS+CHXT11 FOR GOOD REASONS
1250 T11CKE: 0 ;COUNT OF TEN-11 CHECKSUM ERRORS
1251 T11TIM: 0 ;TIMEOUT ON TRANSMISSION OF PACKET TO 10
1255 ETHSBN==2 ;SUBNET WHICH IS THE ETHERNET
1256 .SEE ETHHSN ;MY HOST NUMBER BYTE (DEFINED IN MACHINE CONFIGURATION AREA)
1257 ETHMXH==15.-1 ;MAXIMUM NUMBER OF HOPS (-1 => BUG IN XEROX PROGRAMS)
1258 ETHIBF: .BLKW PKTMXW+1 ;INPUT FROM ETHERNET BUFFERED HERE (+1 HARDWARE BUG?)
1259 ETHHDW==PKHDW-2 ;ALLOW FOR OVERLAP OF CHAOSNET HEADER AND 2-WORD ETHERNET HEADER
1260 ;THIS IS THE OFFSET (IN WORDS) WHERE THE ETHERNET PACKET STARTS
1262 ;HERE IS A PACKET USED TO BUILD THE ETHERNET BROADCAST GATEWAY INFO. WHAT A CROCK.
1263 EGTBUF: .BLKW PKHDW ;SPACE FOR CHAOSNET HEADER
1264 EGTPLN: 0 ;PUP LENGTH
1266 EGTPID: .WORD 0,0 ;PUP IDENTIFIER
1267 0 ;DESTINATION (BROADCAST)
1268 .WORD 0,2 ;DEST SOCKET 2
1269 EGTSRC: .BYTE ETHHSN,ETHSBN ;SOURCE (ME)
1270 .WORD 0,2 ;SOURCE SOCKET 2
1271 EGTSBN: ;; FOR EACH SUBNET, .BYTE GATE-NET, TARGET-NET, HOP-COUNT, GATE-HOST
1276 DVRHST: 0 ;ZERO IF IDLE, OR FOREIGN HOST USING
1277 DVRIDX: 0 ;FOREIGN INDEX
1278 DVRLIX: 0 ;LOCAL INDEX (AOS EACH TIME)
1279 DVRTIM: 0 ;COUNTS UP TO IDLE THE FOREIGN HOST
1280 DVRRTR: 0 ;COUNTS UP FOR RETRANSMISSION
1282 DVRBFL==2*<PKHDW+10.+<DATMAX/2>+1> ;NUMBER OF BYTES IN A DOVER BUFFER (HOLDS PUP IN CHAOSNET PACKET)
1283 DVRBUF: .BLKB DVRBFL*NDVRBF ;RING OF BUFFERS HERE
1284 DVRBF2: .BLKW PKHDW+2 ;BUFFER FOR SENDING STS/OPN/CLS BACK (ALSO END OF RING)
1285 DVRBFP: DVRBUF ;POINTER TO NEXT BUFFER TO GO OUT TO DOVER
1286 DVRMSK: 0 ;MASK OF WHICH BUFFERS CONTAIN PACKETS (MSB = DVRBFP PKT)
1287 .IIF GT NDVRBF-16., .ERROR NDVRBF MAXIMUM OF 16. ALLOWED
1288 DVRPKP: 0 ;IF NON-ZERO, POINTER TO SPECIAL PACKET TO SEND
1289 DVRID: 0 ;ID FOR NEXT PACKET EXPECTED BY DOVER, THIS PACKET IS OR
1290 ; WILL BE IN THE BUFFER DVRBFP POINTS AT
1291 DVROFS: 0 ;ID OFFSET, SUBTRACT FROM CHAOS ID TO GET PUP ID
1292 NDVRFK: 0 ;*** TEMPORARY KLUDGE ***
1296 PULSAR: 0 ;COUNTS DOWN TO 0 THEN TRIGGERS TRANSMISSION OF A "TEST MESSAGE"
1297 PULSON: FTPULS ;IF THIS IS NON-ZERO, FEATURE IS ENABLED, VALUE IS TICKS BETWEEN PULSES
1298 USECBL: 0 ;IF NON-ZERO, 10 TALKING TO SELF STILL GOES THROUGH CABLE
1300 NCHX==DL10P+TEN11P+CHAOSP+<2*ETHERP> ;NUMBER OF ENTRIES IN SOURCE AND SINK TABLES
1301 .IIF DF NDVRBF, NCHX==NCHX+1
1305 CHSGBF: .BLKW PKMAX ;HOLDS LAST PACKET THAT CAME IN WITH A CHECKSUM ERROR
1306 CHSGBH: 0 ;UNIBUS ADDRESS OF INTERFACE THAT ABOVE CAME IN ON
1307 CHSGBS: 0 ;STATUS REGISTER THAT GOES WITH ABOVE
1308 CHSGBC: 0 ;BIT COUNT THAT GOES WITH ABOVE
1311 ;FOLLOWING HAVE SEPARATE ENTRIES FOR EACH CABLE
1312 NPKSGB: .IREPT CHAOSP+ETHERP,0 ;COUNTS THE NUMBER OF PACKETS RECEIVED WITH CHECKSUM ERRORS
1313 HPKSGB: .IREPT CHAOSP+ETHERP,0 ;HIGH-ORDER WORD OF COUNTER
1314 NPKSRL: .IREPT CHAOSP+ETHERP,0 ;COUNTS THE NUMBER OF PACKETS RAM LOST,
1315 ; I.E. DIDN'T COME IN WITH A CHECKSUM ERROR BUT AFTER
1316 ; READING IT OUT HAD ONE. EITHER THE PACKET WAS THE
1317 ; WRONG LENGTH, OR THE RAM IS LOSING, OR HARDWARE
1318 ; CLOBBERAGE. FOR ETHERNET IS PUP CKSM ERR COUNT
1319 ;THIS WORD ALSO IS WHERE BIT COUNT ERRORS WOULD END UP
1320 HPKSRL: .IREPT CHAOSP+ETHERP,0 ;HIGH-ORDER WORD OF COUNTER
1321 CHSRLH: 0 ;UNIBUS ADDRESS OF INTERFACE THAT ABOVE LAST HAPPENED ON.
1322 CHSRLC: 0 ;RESIDUAL BIT COUNT FOR ABOVE
1323 NPKSLS: .IREPT CHAOSP,0 ;NUMBER OF PACKETS LOST ACCORDING TO LOSS COUNT IN HARDWARE
1324 HPKSLS: .IREPT CHAOSP,0 ;HIGH-ORDER WORD OF COUNTER
1325 NPKSAB: .IREPT CHAOSP+ETHERP,0 ;NUMBER OF TRANSMISSIONS ABORTED (BY COLLISION OR RECEIVE-BUSY)
1326 HPKSAB: .IREPT CHAOSP+ETHERP,0 ;HIGH-ORDER WORD OF COUNTER
1327 NPKSI: .IREPT NCHX,0 ;TOTAL NUMBER OF PACKETS IN ON EACH SOURCE
1328 HPKSI: .IREPT NCHX,0 ;HIGH-ORDER WORD OF COUNTER
1329 NPKSO: .IREPT NCHX,0 ;TOTAL NUMBER OF PACKETS OUT ON EACH SINK
1330 HPKSO: .IREPT NCHX,0 ;HIGH-ORDER WORD OF COUNTER
1331 NPKSIG: 0 ;NUMBER OF PACKETS IGNORED AT CHIFLS
1332 NPKSBD: .IREPT NCHX,0 ;NUMBER OF PACKETS BAD AT CHSIHB
1333 HPKSBD: .IREPT NCHX,0 ;HIGH-ORDER WORD OF COUNTER
1334 NPKSRF: 0 ;NUMBER OF PACKETS FOR WHICH ROUTING FAILED
1335 RFSBNT: -1 ;2* SUBNET# OF LAST ROUTING FAILURE
1337 ;"INTERFACE ADDRESSES"
1338 ; A NEGATIVE INTERFACE ADDRESS IS THE UNIBUS ADDRESS OF A CHAOS INTERFACE.
1339 ; A ZERO INTERFACE ADDRESS MEANS THE DL10
1340 ; A POSITIVE INTERFACE ADDRESS MEANS THE TEN-11, VALUE BETTER BE OCTAL 1011.
1342 CHSIBF: .BLKW PKMAX*CHAOSP ;INPUT BUFFER FOR PACKETS IN FROM CHAOS HDWR
1344 ;THIS IS WHAT IS SENT BACK IN RESPONSE TO RFC TO "STATUS".
1345 ;FOR NOW, JUST THE NAME OF THE MACHINE.
1347 .ENDC ;CHAOSP ;FUCK A DOG, PALX!
1352 .ASCII \AI-CHAOS-11\
1354 .IFNZ CHAOSP ;FUCK A DOG, PALX!
1355 .IIF GE .-HSTNAM-32., .ERROR HSTNAM TOO LONG
1356 .IREPT 32.-<.-HSTNAM>, .BYTE 0 ;PAD ON THE RIGHT WITH 0'S
1358 ;CHAOSNET INPUT SOURCE AND OUTPUT SINK TABLES
1360 ;NOTE WELL, THE CODE RELIES ON THE ORDER OF THESE INDICES
1361 .IIF NZ DL10P, CHXDLC==0 ;DL10 INDEX
1362 .IIF NZ TEN11P, CHXT11==2*DL10P ;TEN11 INDEX
1363 CHXCHS==2*<DL10P+TEN11P> ;FIRST CHAOS INDEX
1364 .IIF NZ ETHERP, CHXETH==CHXCHS+<2*CHAOSP> ;ETHERNET INDEX
1365 .IIF NZ ETHERP, CHXEGT==CHXETH+2 ;ETHERNET GATEWAY-INFO-BROADCAST KLUDGE INDEX
1366 .IIF DF NDVRBF, CHXDVR==CHXEGT+2 ;DOVER PROTOCOL TRANSLATOR
1368 .IIF NE .-TAG-NCHX-NCHX, .ERROR TAG WRONG LENGTH TABLE
1371 ;CHAOSNET INPUT SOURCE TABLES
1373 CHIBFP: ;BUFFER POINTER
1374 .IIF NZ DL10P, DLCIBF ;DL10 INPUT BUFFER
1375 .IIF NZ TEN11P, 0 ;CURRENT TEN11 INPUT BUFFER (SET FROM T11IBP+8)
1376 .IREPT CHAOSP, CHSIBF+<PKMAX*2*.RPCNT> ;CHAOS INPUT BUFFER
1377 .IIF NZ ETHERP, ETHIBF ;ETHERNET
1379 .IIF DF NDVRBF, 0 ;CURRENT DOVER BUFFER, COULD BE CHAOS OR PUP
1382 CHIHDL: .IREPT NCHX, 0 ;LENGTH OF HEADER IN WORDS, PACKET CURRENTLY IN BFR
1384 CHISTS: .IREPT NCHX, 0 ;STATUS (0 IDLE, +1 HAS INPUT, -1 BEING OUTPUT)
1386 CHILNG: .IREPT NCHX, 0 ;LENGTH OF CONTAINED PACKET IN WORDS
1388 CHIOUX: .IREPT NCHX, 1 ;DESTINATION OUTPUT SINK INDEX (-1 IF DIRECTED TO PDP11 ITSELF)
1390 CHICBA: .IREPT NCHX, 0 ;DESTINATION CABLE ADDRESS
1392 CHIRFL: ;ADDRESS OF REFILL ROUTINE
1393 .IIF NZ DL10P, DLCRFL
1394 .IIF NZ TEN11P, T11RFL
1395 .IREPT CHAOSP, CHSRFL
1396 .IIF NZ ETHERP, ETHRFL ;ETHERNET
1398 .IIF DF NDVRBF, DVRRFL
1401 CHIHWR: ;POINTER TO HARDWARE
1402 .IIF NZ DL10P, 1 ;NOT USED
1403 .IIF NZ TEN11P, 3 ;NOT USED
1404 .IREPT CHAOSP, CAICSR+<400*.RPCNT> ;QUAD-CHAOS INTERFACES HAVE TO BE 200 APART
1405 .IIF NZ ETHERP, 164200 ;AND WE MAKE IT 400 BECAUSE ETHERNET GETS IN WAY
1407 .IIF DF NDVRBF, 7 ;NOT USED
1409 ;CHAOSNET OUTPUT SINK TABLES
1411 CHOHWR==CHIHWR ;POINTER TO HARDWARE
1413 CHOSTS: .IREPT NCHX, 0 ;STATUS (0 IDLE, +1 TRANSMITTING, -1 RETRANSMITTING
1414 ; AFTER TRANS ABORT, +2 DELAYING AFTER TRANSMIT ABORT BEFORE RETRANSM)
1415 CHOINX: .IREPT NCHX, 1 ;CURRENTLY-ACTIVE CHIxxx INDEX
1417 CHOXMT: ;START TRANSMISSION ROUTINE
1418 .IIF NZ DL10P, DLCXMT
1419 .IIF NZ TEN11P, T11XMT
1420 .IREPT CHAOSP, CHSXMT
1421 .IIF NZ ETHERP, ETHXMT ;ETHERNET
1422 .IALSO 1 ;NOT USED (CHXEGT)
1423 .IIF DF NDVRBF, DVRPKT ;DOVER
1426 CHXSBN: ;SUBNET NUMBER +400 FOR STATUS SERVER
1427 .IIF NZ DL10P, DLCADR/400+400
1428 .IIF NZ TEN11P, T11ADR/400+400
1430 CONC CHAD,\.RPCNT,/400+400
1432 .IIF NZ ETHERP, ETHSBN+400 ;ETHERNET
1433 .IALSO 776 ;NOT REAL (ETHERNET GATEWAY)
1434 .IIF DF NDVRBF, 777 ;NOT REAL (DOVER)
1437 CHXRTF: .IREPT NCHX, 0 ;NON-ZERO MEANS BROADCAST ROUTING INFO TO THIS GUY
1440 CHSIDL: .IREPT NCHX, 0 ;NUMBER OF TICKS WAITING FOR TRANSMIT-DONE
1441 CHSRST: .IREPT NCHX, 0 ;NUMBER OF TIMES HAD TO RESET HUNG INTERFACE
1444 ;;; SUBNET/ROUTING TABLES
1446 ;INDEX BY TWICE SUBNET NUMBER
1447 SBNTYP: .IREPT NSUBNT, 0 ;TYPE OF CONNECTION TO THIS SUBNET:
1448 ; 0 VIA GATEWAY, WITH AUTOMATIC ROUTING
1449 ; -1 VIA GATEWAY, PATCHED IN BY HUMAN, DON'T CHANGE
1450 ; 1 HARDWARE CONNECTION
1452 SBNADR: ;ADDRESS OF CONNECTION TO THIS SUBNET
1453 ;NETWORK ADDRESS IF SBNTYP NEGATIVE OR ZERO
1454 ;INDEX IN SOURCE/SINK TABLES IF SBNTYP GREATER THAN ZERO
1455 0 ;0 USED FOR UNKNOWN SUBNETS. WHEN IN DOUBT, BROADCAST.
1456 0 ;1 9TH FLOOR CABLE
1457 0 ;2 (NOT CURRENTLY USED)
1458 440 ;3 MX, ASSUME VIA MX-IO-11
1459 426 ;4 AI, ASSUME VIA AI-CHAOS-11
1460 .IREPT NSUBNT-5, 0 ; WHEN IN DOUBT, BROADCAST
1462 SBNCST: .IREPT NSUBNT, 1000 ;COST OF ROUTING VIA CURRENT GATEWAY, SEE CHAORD
1464 ;NOW FILL IN TABLES FOR HARDWARE CONNECTIONS THAT EXIST ON THIS MACHINE
1465 ;INCLUDING TRANSFINITE HAIR FOR ETHERNET GATEWAY INFO PACKET
1468 DLCSBN==DLCADR/400 ;SUBNET PDP10 ON OTHER END OF DL10 IS ON
1474 10. ;DIRECT 10/11 CONNECTION COSTS 10.
1477 T11SBN==T11ADR/400 ;SUBNET PDP10 ON OTHER END OF TEN11 IS ON
1483 10. ;DIRECT 10/11 CONNECTION COSTS 10.
1488 CBLCST=11. ;CABLE CONNECTION COSTS 11.
1491 CBLCST=22. ;AI COSTS MORE 'CAUSE IT'S SICK
1494 .IFNZ CHAOSP ;sweet fucking jesus, palx
1495 ;HAIR FOR MULTIPLE CABLE INTERFACES
1497 CONC IZZZ==CHAD,\.RPCNT
1504 CBLCST ;THE CABLE COST
1519 4SEC: 0 ;4-SECOND CLOCK COUNTER
1520 15SEC: 0 ;15-SECOND CLOCK COUNTER
1526 PAT: PATCH: .BLKW 100
1533 0 ;NUMBER OF WORDS IN RING
1534 <SIZE> ;MAX NUMBER ALLOWED
1535 <2*<SIZE>>+99$ ;MAX ADDRESS ALLOWED
1536 99$ ;MIN ADDRESS ALLOWED
1537 99$: .BLKW <SIZE> ;BUFFER
1548 ; DEFINE THE RING BUFFERS
1550 TYORNG: RING <NCT*2> ;OUTPUT-DONE RING, CONTENTS = LINE NUMBER PDP10 STYLE
1551 ;HAS TO BE EXTRA BIG BECAUSE THE OUTPUT DONES PUT IN ON
1552 ;STARTUP FILL IT UP, THEN SOMETIMES ITS PUTS ONE IN
1553 ;BEFORE IT TAKES ANY OUT.
1555 TYIRSZ==NCT*20 ;8 CHARS PER TTY (2 WORDS PER CHAR)
1556 TYIRNG: RING TYIRSZ ;TTY INPUT RING, FIRST WORD IS CHARACTER, SECOND LINE NUMBER
1564 PUT: CMP RINGCT(B),RINGSZ(B)
1581 ; IT IS AN ERROR TO CALL THIS IF RING IS EMPTY
1597 CLRING: CLR RINGCT(B) ;CLEAR A RING
1598 MOV RINGBT(B),RINGIN(B)
1599 MOV RINGBT(B),RINGOT(B)
1602 .SBTTL DTE20 SUBROUTINES
1604 ;THE DTE20 MUST NOT BE HACKED AT INTERRUPT LEVEL, BECAUSE KLDCP USES IT TOO.
1605 ;THE FOLLOWING THREE LOCATIONS ARE ARGS TO/FROM THE FOLLOWING TWO SUBROUTINES.
1607 LH: 0 ;LOW 16 BITS OF LEFT HALF
1608 RH: 0 ;LOW 16 BITS OF RIGHT HALF
1609 SNB: 0 ;SIGN BIT (0 IF +, NON-0 IF -)
1613 ;EXAMINE PDP10 LOC, SPLIT INTO HALFWORDS, SET LH, RH, SNB
1614 ;RETURNS WITH "Z" SET IF LOCATION HAS POSITIVE SIGN, "Z" CLEAR IF MINUS SIGN
1616 HWEXAM: PUSH <A,C> ;SAVE REGS
1617 PUSH <#0,(B)+> ;PUT PDP10 ADDRESS ONTO PDL
1618 MOV SP,A ;SET UP POINTER TO ADDRESS
1619 EXAM ;EXAMINE LOCATION, SET A TO POINT TO 3-WORD RESULT BUFFER
1620 BCS UHUNG ;BRANCH IF UCODE HUNG
1621 MOV (A)+,RH ;LOW 16 BITS => RH
1622 MOV (A)+,C ;PICK UP MIDDLE 16 BITS
1623 MOV (A)+,A ;PICK UP HIGH 4 BITS
1624 ROR A ;LSHC <A,C>,-2 TO GET PDP10 LH INTO C
1629 BIC #177775,A ;LEAVE SIGN BIT IN 1.2 OF A
1631 ADD #4,SP ;POP ADDRESS OFF PDL
1632 POP <C,A> ;RESTORE REGS
1634 RTS B ;RETURN SKIPPING IN-LINE PARAMETER
1638 ;ASSEMBLE LH, RH, SNB INTO PDP10 AND DEPOSIT IN ADDR
1650 PUSH <A,C,RH> ;PUSH HIGH, MIDDLE, AND LOW BITS
1651 MOV SP,A ;POINTER TO DATA
1652 PUSH <#0,(B)> ;PUSH HIGH AND LOW ADDRESS
1653 MOV SP,B ;POINTER TO ADDRESS
1654 DPOS ;DO THE DEPOSIT
1655 BCS UHUNG ;BRANCH IF UCODE HUNG
1656 ADD #10.,SP ;POP ADDRESS AND DATA OFF PDL
1658 TST (B)+ ;SKIP TRAILING PARAMETER
1663 SETOM NO.ITS ;GIVING UP
1666 1$: .ASCIZ/?MICROCODE HUNG/
1670 .SBTTL MAIN LOOP FOR DL10
1673 .IIF NZ TEN11P, CALL T11WAK ;CHECK UP ON TEN-11 INTERFACE
1675 TST CHXRTF+CHXETH ;NEED TO BROADCAST ROUTING INFO TO ETHERNET?
1680 BIT #DLXPRT,DLXCSR ;PORT TO 10 ENABLED?
1682 SETOM NO.ITS ;NO, FLAG THERE IS NO ITS
1683 SETOM DLXOFF ;AND THAT WE THINK DL10 PORT IS OFF
1684 BR MAIN ;AND WAIT FOR IT TO TURN ON
1686 1$: TST DLXOFF ;DID DL10 JUST TURN ON?
1687 BEQ 4$ ;NO, IT WAS ON BEFORE
1688 CLR DLXOFF ;YES, SO REMEMBER THAT
1689 MOV VERS,A ;CHECK VERSION SUPPLIED BY -10
1690 BEQ 2$ ;ZERO OK (MUST BE SALVAGER)
1693 BPT ;-10 AND -11 PROGRAMS NOT SAME CONFIG
1696 4$: BIT #DLXPAR+DLXNXM,DLXCSR ;ERROR ACCESSING MEMORY?
1698 BPT ;DON'T GO OFF DESTROYING PEOPLE'S FILES
1700 ;WAIT FOR -10 TO REQUEST SERVICE, OR CLOCK TO TICK
1703 BIT #DLX11I,DLXCSR ;10 REQUESTING SERVICE?
1706 BIS #DLXZ11,DLXCSR ;YES, CLEAR FLAG
1707 BR CHKOST ;AND GO CHECK FOR THINGS TO DO
1709 10$: TST WAKE ;NO, CHECK ANYWAY IF 60 CYCLE CLOCK HAS TICKED
1710 BEQ MAIN ;NEITHER, JUST WAIT
1711 CLR WAKE ;CLOCK HAS TICKED, CLEAR FLAG
1712 INC DLXUP ;AND INCREMENT COUNTER 10 IS SUPPOSED
1713 BEQ 11$ ; TO SETOM EVERY 1/2 SEC
1714 CMP DLXUP,#15.*60. ;IF IT DOESN'T TOUCH IT FOR 15 SECONDS,
1715 BLE 12$ ; CONSIDER IT DOWN. NOTE THAT PARITY SWEEPS
1716 SETOM NO.ITS ; THROUGH LARGE MEMORY CAN TAKE SEVERAL SECONDS
1717 MOV #15.*60.,DLXUP ;DON'T LET COUNTER OVERFLOW
1718 BR 12$ ;BUT CHECK FOR COMMANDS ANYWAY (SALVAGER DISK)
1720 11$: CLR NO.ITS ;-10 HAS SETOMED COUNTER, IT'S UP
1721 12$: ;FALL INTO CHKOST
1723 ; CHECK FOR OUTPUT-START FROM -10
1725 CHKOST: MOV TTYST,A ;LINE# TO START OUTPUT
1727 CLR TTYST ;TELL -10 IT'S BEEN PICKED UP
1729 MASK 5 ;DON'T INTERFERE WITH P.I. LEVEL
1730 CALL PUT ;PUT IN RING, LATER WILL SEND IT BACK TO 10
1733 ; CHECK FOR TTY OUTPUT SENT BY -10
1735 CHKOUT: MOV TYOLIN,I ;OUTPUT TO BE DONE?
1737 MOV TYOCNT,C ;YES, GET NUMBER OF CHARS
1738 CALL TYOSER ;CALL OUTPUT HANDLER
1739 CLR TYOLIN ;TELL 10 WE'VE GOBBLED THE OUTPUT
1740 BIS #DLX10I,DLXCSR ;GIVE TRANSFER-COMPLETE INTERRUPT
1742 ; CHECK FOR TTY INPUT TO BE SENT TO -10
1744 CHKIN: TST TYIRNG+RINGCT
1745 BEQ CHKDON ;NO STATUS TO BE STORED
1747 BNE CHKDON ;PREVIOUS STATUS NOT PICKED UP
1750 MOV A,TYICHR ;GIVE INPUT CHARACTER TO 10
1752 MOV A,TYILIN ;GIVE LINE NUMBER TO 10
1753 BIS #DLX10I,DLXCSR ;SEND INTERRUPT TO 10
1755 ; CHECK FOR OUTPUT-DONE TO BE SENT TO -10
1757 CHKDON: TST TYORNG+RINGCT
1758 BEQ CHKHNG ;NO STATUS TO BE STORED
1760 BNE CHKHNG ;PREVIOUS STATUS NOT PICKED UP
1765 MOV BUFSIZ(I),TYOBSZ ;TELL -10 HOW MANY CHARS TO GIVE
1766 MOV A,TYOSTS ;GIVE OUTPUT DONE TO 10
1767 BIS #DLX10I,DLXCSR ;WITH INTERRUPT
1769 ; CHECK FOR HANGUPS TO BE SENT TO -10
1771 CHKHNG: TST HNGSIG ;ANY HANGUPS TO BE REPORTED?
1774 BNE CHKLPR ;PREVIOUS STATUS NOT PICKED UP
1775 MOV #LASTTY,I ;SCAN OVER ALL LINES
1777 MOV TTYHNG(I),A ;GET HANG-UP STATUS
1778 BNE 2$ ;BRANCH IF FOUND SOMETHING TO REPORT
1783 BPT ;HNGSIG OUT OF PHASE WITH TTYHNG
1785 2$: CLR TTYHNG(I) ;GOT STATUS, CLEAR IT
1786 DEC HNGSIG ;DECREASE COUNT OF FROBS WAITING TO BE SIGNALLED
1787 UNMASK ;NOW IT'S OK TO INTERRUPT AND SET TTYHNG
1788 MOV A,HNGLIN ;GIVE LINE NUMBER AND OTHER DATA TO 10
1789 BIS #DLX10I,DLXCSR ;WITH INTERRUPT
1791 ; CHECK FOR REQUEST FROM -10 TO SET LINE PARAMETERS
1793 CHKLPR: MOV LPRLIN,I ;LINE PARAMETERS TO BE SET?
1795 ASL I ;YES, GET LINE INDEX
1796 MOV LPRLPR,A ;AND DH11 PARAMETER REGISTER VALUE
1797 MOV LPRBSZ,B ;AND BUFFER SIZE
1798 CALL SPARAM ;CALL PARAMETER SETTER
1799 CLR LPRLIN ;TELL 10 IT IS DONE
1801 ; CHECK FOR CHAOS NET ACTIVITY
1805 CALL DLCWAK ;WAKEUP DL10-CHAOSNET STUFF
1808 CALL DSKSTR ;CHECK FOR DISK REQUEST
1811 ; CHECK FOR EXAMINE/DEPOSIT REQUEST FROM -10
1813 CHKEXD: TST EXDSTS ;EXAMINE/DEPOSIT?
1815 MOV EXDADR,A ;GET ADDRESS
1818 MOV EXDDAT,(A) ;DEPOSIT
1819 21$: MOV (A),EXDDAT ;EXAMINE
1820 CLR EXDSTS ;IT IS DONE
1822 ;CHECK FOR GOULD LPT OUTPUT
1826 ; CLR GLPCTR ;IF NO GOULD, FLUSH OUTPUT FOR IT
1827 ; SETOM GLPTER ;AND SAY "NOT READY"
1830 ;10 WANTED US TO DO SOMETHING, PLAY WITH THE LIGHTS
1834 20$: MOV LITHSE,GLPTER
1836 TST GLPCTR ;ANY BYTES IN BUFFER?
1838 CALL GLPTYO ;YES, OUTPUT THEM
1839 1$: MOV GLPERR,GLPTER ;COPY ERROR STATUS FROM P.I. LEVEL TO -10
1840 .ENDC ;DONE HERE SO NO USE OF DL10 AT P.I. LEVEL
1843 MAINX: JMP MAIN ;THAT'S IT
1847 .SBTTL MAIN LOOP FOR DTE20
1849 MAIN: BIT #%D1RUN,DIAG1 ;IS KL10 RUNNING?
1850 BEQ TENDED ;NO, LOSE!
1851 BIT #%D1ERR+%D1HLT,DIAG1 ;HAS KL10 CLOCK STOPPED FOR HARDWARE ERROR? OR JRST 4
1852 BNE TENDED ;YES, LOSE!
1853 TST KLDCPF ;MAYBE USER WANTS TO GIVE A KLDCP COMMAND?
1854 BNE KLDCPR ;YES, RETURN TO KLDCP
1855 TSTB @DLKS+NFDLHX ;CTY INPUT?
1856 BPL 10$ ;TEST KBD BEFORE CLK SINCE MIGHT BE MORE THAN
1857 ; 1/60'TH SECOND PER TRIP AROUND THE LOOP.
1858 MASK 5 ;YES, SIMULATE INTERRUPT
1859 CALL DL1IBK ;CAN'T USE REAL INTS BECAUSE WOULD INTERFERE WITH KLDCP
1860 10$: TSTB LKS ;60 CYCLE CLOCK TICK?
1862 BIT #%STINV,STATUS ;REQUEST FROM 10?
1863 BNE TENSER ;YES, SERVICE IT.
1864 BIT #%STDNI,STATUS ;TO10 XFER COMPLETE?
1865 BNE INPDON ;YES, SERVICE IT.
1866 BIT #%STDNO,STATUS ;TO11 XFER COMPLETE?
1867 BNE OUTDON ;YES, SERVICE IT.
1868 BIT #%STERI+%STERO,STATUS
1869 BNE LOSSAG ;BYTE TRANSFER LOST
1872 ;60-CYCLE CLOCK SERVICE
1874 CLKSER: CLR LKS ;CLEAR CLOCK FLAG
1875 TST CLKENB ;DOES 10 WANT CLOCK INTERRUPTS?
1877 D10MON ;YES, GIVE ONE
1878 DTECLK ;SET CLOCK FLAG IN LOW CORE
1880 MOV #%STINX,STATUS ;AND SEND INTERRUPT
1881 1$: CMP SWR,CURSWR ;MAYBE NEED TO UPDATE 10'S SWITCHES
1884 TENSW ;LET KLDCP DO IT
1886 2$: JSR B,HWEXAM ;INCREMENT COUNTER -10 IS SUPPOSED
1887 DTECHK ; TO SETOM EVERY HALF-SECOND
1892 CMP RH,#15.*60. ;IF IT DOESN'T SETOM IT FOR 15 SECONDS
1893 BLE 4$ ;THEN IT IS DOWN. NOTE THAT PARITY SWEEPS
1894 SETOM NO.ITS ;THROUGH LARGE MEMORY CAN TAKE SEVERAL SECONDS.
1895 MOV #15.*60.,RH ;DON'T LET COUNTER OVERFLOW
1898 3$: CLR NO.ITS ;IT SETOMED COUNTER, IT'S UP.
1899 4$: JSR B,HWDEP ;PUT COUNTER BACK
1901 MASK 6 ;NOW SIMULATE BR6 CLOCK INTERRUPT
1903 BR TENSER ;AND GO SERVICE 10 (IN CASE LOST INTERRUPT)
1905 ; HERE IF KL10 HALTS
1907 TENDED: SETOM NO.ITS
1909 RET ;LET KLDCP PRINT THE MESSAGE
1911 ; BYTE TRANSFER ENCOUNTERED HARDWARE LOSSAGE
1916 ; USER WANTS TO GIVE A KLDCP COMMAND
1924 ; HERE WHEN TO10 BYTE TRANSFER COMPLETE
1926 INPDON: MOV #%STCLI,STATUS ;CLEAR FLAGS IN DTE20
1927 MOV INPCMD,A ;GET COMMAND FOR XFER THAT JUST FINISHED
1929 BPT ;WOOPS, NO XFER IN PROGRESS
1930 1$: CLR INPCMD ;NO XFER IN PROGRESS NOW
1933 CALL @FINAL-2(A) ;CALL APPROPRIATE FINISHER ROUTINE
1936 ; HERE WHEN TO11 BYTE TRANSFER COMPLETE
1938 OUTDON: MOV #%STCLO,STATUS ;CLEAR FLAG
1939 MOV OUTCMD,A ;GET COMMAND FOR XFER THAT JUST FINISHED
1941 BPT ;WHOOPS, NO XFER IN PROGRESS
1942 1$: CLR OUTCMD ;NO XFER IN PROGRESS NOW
1945 CALL @FINAL-2(A) ;CALL APPROPRIATE FINISHER ROUTINE
1948 ; HERE TO START TO10 BYTE TRANSFER. HWEXAM OF DTEINP HAS BEEN DONE.
1950 INPSER: D10MON ;VALUE HAS BEEN PICKED UP, SETOM IT
1952 BIT #1000,LH ;RIGHT GENDER OF COMMAND?
1954 BR MAINJ ;(USED TO BE BPT) NO, IGNORE, MAYBE ITS BEING RELOADED
1956 ; HERE TO START TO11 BYTE TRANSFER. HWEXAM OF DTEOUT HAS BEEN DONE.
1958 OUTSER: D10MON ;VALUE HAS BEEN PICKED UP, SETOM IT
1960 BIT #1000,LH ;RIGHT GENDER OF COMMAND?
1962 BR MAINJ ;(USED TO BE BPT) NO, IGNORE, MAYBE ITS BEING RELOADED
1964 OUTSR1: MOV RH,C ;GET BYTE COUNT
1965 MOVB LH,I ;GET LINE#
1966 MOVB LH+1,A ;GET COMMAND TIMES 2
1967 BEQ MAINJ ;CLEARING CORE? IGNORE ZERO COMMAND
1971 CALL @BEGIN-2(A) ;CALL APPROPRIATE BEGIN-XFER ROUTINE
1974 MOV A,INPCMD ;REMEMBER CRUFT FOR XFER IN PROGRESS
1979 1$: MOV A,OUTCMD ;REMEMBER CRUFT FOR XFER IN PROGRESS
1984 OUTSR2: BR MAINJ ;BAD COMMAND FROM 10 (USED TO BE BPT) JUST IGNORE IT
1986 ;TABLE OF ROUTINES TO PROCESS DATA TRANSFER COMMANDS FROM -10
1988 BEGIN: TYOSER ;%DTTYO
1993 ;TABLE OF ROUTINES TO FINISH UP DATA TRANSFERS
1995 FINAL: TYOFIN ;%DTTYO
1999 ;CHECK FOR COMMANDS FROM 10, STORE STATUS IN ANY STATUS WORDS
2000 ;THAT 10 HAS SET BACK TO -1
2002 TENSR0: MOV #%STUNV,STATUS ;CLEAR 10 INTERRUPTING 11 FLAG
2003 JSR B,HWEXAM ;CHECK FOR A NON-TIMESHARING COMMAND
2005 MOV RH,A ;IS THERE ONE?
2006 BEQ TENSR1 ;NO, GO CHECK FOR TIMESHARING STUFF
2011 1$: TSTB TPS ;CHAR TO BE TYPED, WAIT FOR READY
2013 MOVB A,TPB ;TYPE IT OUT
2014 9$: CLR RH ;CLEAR OUT THE COMMAND
2017 D10MON ;TELL 10 IT'S DONE
2023 CLR RH ;SNB,LH,RH NOW HAS ZERO
2024 SETOM DDTMOD ;KEYBOARD INPUT WANTED
2025 TST DDTCHR ;TEST IF READY
2026 BMI 3$ ;IF NO INPUT, GIVE ZERO
2028 MOV DDTCHR,RH ;GIVE THE CHAR
2029 COM DDTCHR ;MAKE NEGATIVE
2045 7$: BPT ;SOME COMMAND WE DON'T IMPLEMENT
2046 BR 9$ ;IF CONTINUED, IGNORE IT
2048 ;CHECK FOR ITS UP/DOWN
2050 TENSR1: TST NO.ITS ;IF SYSTEM ISN'T UP,
2051 BNE MAINJ ;DON'T TRY TO HACK TS STUFF
2052 INC DLXOFF ;OTHERWISE, FIRST TIME THROUGH HERE
2053 BNE CHKOST ;WE CHECK THE VERSION
2058 DEC DLXOFF ;NO, DON'T LOOK AT IT
2059 BR MAINJ ;PROBABLY CORE BEING CLEARED
2063 BPT ;-10 AND -11 PROGRAMS NOT SAME VERSION
2065 CHKOST: JSR B,HWEXAM ;CHECK FOR 10 WANTING OUTPUT START
2067 BNE CHKTRN ;BRANCH IF LOCATION DTEOST IS -1
2068 D10MON ;HAVING PICKED IT UP, SET BACK TO -1
2072 MASK 5 ;DON'T INTERFERE WITH P.I. LEVEL
2075 CLR DDTMOD ;SYSTEM UP, TURN OFF DDT MODE
2079 BNE 1$ ;INPUT IN PROGRESS, DON'T START AGAIN
2080 JSR B,HWEXAM ;CHECK FOR DATA TRANSFER COMMAND
2082 BNE 1$ ;DTEINP -1, NO REQUEST
2086 BNE CHKLSP ;OUTPUT IN PROGRESS, DON'T START AGAIN
2087 JSR B,HWEXAM ;CHECK FOR DATA TRANSFER COMMAND
2089 BNE CHKLSP ;DTEOUT -1, NO REQUEST
2092 CHKLSP: JSR B,HWEXAM ;CHECK FOR SET LINE SPEED COMMAND
2097 CMP I,#NFTTY ;VALIDATE IT
2098 BLO 1$ ;IGNORE IF BAD
2101 JSR B,HWEXAM ;GET LPR,,BUFFERSIZE
2106 1$: D10MON ;DONE, SETOM
2109 CHKTYI: TST TYIRNG+RINGCT
2110 BEQ CHKODN ;NO TTY INPUT WAITING
2113 BEQ CHKODN ;PREVIOUS CHAR NOT PICKED UP
2120 JSR B,HWDEP ;GIVE 10 LINE#,,CHAR
2122 MOV #%STINX,STATUS ;INTERRUPT THE 10
2124 CHKODN: TST TYORNG+RINGCT
2125 BEQ CHKHNG ;NO OUTPUT DONES WAITING
2128 BEQ CHKHNG ;PREVIOUS STATUS NOT PICKED UP
2130 CALL GET ;GET LINE# WITH OUTPUT DONE
2135 JSR B,HWDEP ;GIVE 10 LINE#,,BUFFERSIZE
2137 MOV #%STINX,STATUS ;INTERRUPT THE 10
2140 BEQ MAINX ;NO HANGUPS/DIALINS WAITING
2143 BEQ MAINX ;PREVIOUS STATUS NOT PICKED UP
2144 MOV #LASTTY,I ;SCAN OVER ALL LINES
2146 MOV TTYHNG(I),A ;GET HANG-UP STATUS
2147 BNE 2$ ;BRANCH IF FOUND SOMETHING TO REPORT
2152 BPT ;HNGSIG OUT OF PHASE WITH TTYHNG
2154 2$: CLR TTYHNG(I) ;GOT STATUS, CLEAR IT
2155 DEC HNGSIG ;DECREASE COUNT OF FROBS WAITING TO BE SIGNALLED
2156 UNMASK ;NOW IT'S OK TO INTERRUPT AND SET TTYHNG
2157 MOV A,RH ;GIVE LINE NUMBER AND OTHER DATA TO 10
2162 MOV #%STINX,STATUS ;INTERRUPT THE 10
2168 .SBTTL MAIN LOOP FOR AI
2171 .IIF NZ TEN11P, CALL T11WAK ;CHECK UP ON TEN-11 INTERFACE
2172 .IIF Z TEN11P, CALL CHSRUN ;DAMNED THING GETS WEDGED
2174 TST CHXRTF+CHXETH ;NEED TO BROADCAST ROUTING INFO TO ETHERNET?
2179 TST WAKE ;CLOCK TICK?
2180 BEQ MAIN ;NO, JUST WAIT
2181 CLR WAKE ;CLOCK HAS TICKED, CLEAR FLAG
2182 BR MAIN ;NOT MUCH TO DO, NO TTYS
2185 .SBTTL OUTPUT HANDLERS
2187 TYOSER: ASL I ;CONVERT -10 LINE# TO -11 TTY INDEX
2192 11$: BPT ;10 GAVE BAD LINE#
2193 12$: MOV HDWR(I),H ;GET HARDWARE INDEX
2194 MOV BUFPNT(I),D ;AND ADDRESS OF TYPEOUT BUFFER
2195 CMP BUFSIZ(I),C ;MAKE SURE THERE IS ROOM IN BUFFER
2198 2$: MOV C,B ;MUSTN'T CLOBBER BYTE COUNT IN C
2200 MOV #TYOPNT,A ;GET CRUFT FROM DL10
2201 3$: MOVB @A,(D)+ ;COPY BUFFER
2205 MOV D,TO11AD ;SET UP BYTE TRANSFER
2207 BIC #050000,B ;SET LAST, BYTE; CLEAR ASCIZ, 2.4
2208 MOV B,TO11BC ;START XFER
2211 TYOFIN: MOV HDWR(I),H ;COMES BACK WHEN XFER COMPLETE
2214 ;BUFFER HAS BEEN LOADED, START DEVICE
2216 MASK 5 ;DON'T LET DEVICE INTERRUPT
2218 CALL @STROUT(H) ;CALL DEVICE-DEPENDENT ROUTINE
2219 MOV #40000,TYPING(I) ;TELL 10 WHEN OUTPUT FINISHES (LARGE POSITIVE NUMBER)
2223 ;GIVE MESSAGE. A -> .WORD LENGTH,MSG. I HAS LINE NUMBER.
2226 MOV (A)+,C ;C HAS BYTE COUNT, A HAS ADDRESS
2227 MOV A,D ;PUT ADDRESS IN D
2230 CALL @STROUT(H) ;START OUTPUT TO LINE
2237 \87Connected to MCHN'.\%
2242 ;DEVICE-DEPENDENT OUTPUT START ROUTINES (CALL AT PI LEVEL 5)
2243 ;H HDWR IDX, I TTY IDX, D BUFFER POINTER, C NUMBER OF BYTES
2245 STRDH: BIC DHLBIT(I),@DHBAR(H) ;IF LINE ALREADY TRANSMITTING, STOP IT
2246 ;IT SHOULDN'T OUGHT TO BE...
2247 MOV DHLSEL(I),@DHSCR(H) ;HARDWARILY SELECT THIS LINE
2248 MOV D,@DHCA(H) ;SET XMT ADDRESS
2249 NEG C ;HARDWARE LIKES NEGATIVE BYTE COUNTS
2250 MOV C,@DHBC(H) ;SET XMT COUNT
2251 BIS DHLBIT(I),@DHBAR(H) ;START TRANSMISSION HARDWARILY
2252 BIS DHLBIT(I),DHOAC(H) ;SOFTWARILY ALSO
2255 STRDL: MOV D,DLCA(H)
2258 MOV #300,@DLPS(H) ;CAUSE INTERRUPT
2265 MOV D,MPXPNT-NFMPTY(I) ;QUEUE OUTPUT
2266 MOV C,MPXNBT-NFMPTY(I)
2268 TST MPXOAC ;START THE MPXR
2269 BNE 10$ ;ALREADY BUSY
2272 2$: MOV MPXNBT(I),C ;FIND MPX KLUDGE LINE WANTS TO OUTPUT
2279 15$: MOV I,MPXOLN ;SAVE LINE# OUTPUT ON
2280 ASR I ;SET UP HEADER
2284 MOV #-1,MPXOAC ;SEND HEADER
2294 .SBTTL GOULD LPT OUTPUT (M.P. LEVEL)
2295 .IIF Z DL10P, .ERROR GOULD LPT ONLY CODED FOR DL10
2296 .ERR BY THE WAY, THESE ROUTINES DON'T WORK WORTH GUBBISH
2298 GLPTYO: MOV GLPOIP,H ;GET NEXT BUFFER
2299 CMP GB.STA(H),#%GBMP
2300 BEQ 2$ ;BRANCH IF M.P. ACTIVE
2301 BLT 1$ ;BRANCH IF IDLE BUFFER AVAIL
2302 RET ;NO FREE BUFFERS
2304 1$: CALL GLPBGB ;GOBBLE A BUFFER
2306 MOV GLPCTR,C ;SET UP BYTE COUNTER
2307 MOV GLPGRF,GLPGF1 ;COPY ARG FROM 0 FOR SPEED
2308 TST GLIMBF ;CHAR SAVED FROM LAST TIME?
2310 CLR GLIMBF ;YES, PRINT IT
2313 MOVB GLIMBO+1,A ;SECOND CHAR?
2318 ;CHARACTER PROCESSING LOOP
2319 ;C HAS # CHARS YET TO GO, D HAS WHERE TO PUT THEM, H -> BUFFER
2322 GLPNCL: MOV GLPPTR,A ;GET NEXT CHAR
2324 BNE GLPNRM ;GRAPHIC MODE, NO CHARACTER PROCESSING
2328 BGE GLPNRM ;NO, NORMAL PRINTING
2329 CMP A,#14 ;CHECK FOR SPECIAL CONTROLS
2331 8$: CLR GLPROW ;START NEW PAGE
2332 TST GLPCOL ;IN MIDDLE OF LINE?
2334 CALL GLPBWW ;OTHERWISE, HAIR
2335 CLR GLPFIL ;HACK HACK MAKE FF NEXT LINE
2345 BHIS 8$ ;SKIP OVER PERFORATION
2347 BNE GLPNBF ;IF NOT A BLANK LINE, FINISH BUFFER
2353 13$: MOV #40,A ;TAB - SPACE OVER
2360 BEQ GLPNXC ;IGNORE CR
2363 MOV #'$,A ;PRINT ALTMODE AS DOLLAR
2366 16$: BIS #100,A ;RANDOM CONTROL AS UPARROW, LETTER
2372 GLPNRM: CALL GLPPUT ;HERE FOR NORMAL CHARACTER
2373 GLPNXC: DEC C ;HERE TO GOBBLE CHARACTER
2374 BGT GLPNCL ;BRANCH IF MORE CHARS TO GO
2375 BR GLPEND ;BUFFER EMPTIED
2377 GLPNBF: CALL GLPBWW ;HERE TO ADVANCE TO NEXT BUFFER
2378 GLPNB1: CMP GB.STA(H),#%GBIDL ;NEXT BUFFER AVAIL?
2379 BNE GLPEN1 ;NO, STOP
2380 CALL GLPBGB ;YES, GOBBLE IT
2383 GLPESC: DEC C ;HERE FOR TWO CHAR ESC SEQ
2384 BEQ GLPEND ;-10 FORGOT 2ND CHAR, FLUSH
2385 MOV GLPPTR,A ;GET & DECODE 2ND CHAR
2388 BR GLPNXC ;OTHER CHARS ARE IGNORED
2392 CALL GLPBWW ;EOF, WRITE LAST BUFFER
2393 GLPEN1: DEC C ;GOBBLE A CHARACTER
2394 GLPEND: MOV C,GLPCTR ;HERE WHEN DONE, RELEASE 10'S BUFFER
2395 CMP GB.STA(H),#%GBMP ;BUFFER ACTIVE AT M.P. LEVEL?
2396 BNE 1$ ;IF NOT, DON'T CLOBBER GB.PNT
2397 MOV D,GB.PNT(H) ;IF SO, REMEMBER AMT OF STUFF IN CURRENT BUFFER
2398 1$: RET ;RETURN TO MAIN LOOP
2400 ;OUTPUT PRINTING CHAR IN A
2402 GLPPUT: CMP D,GLPLIM ;LINE OVERFLOW?
2404 CALL GLPBWW ;YES, DONE WITH THIS BUFFER
2405 INC GLPROW ;OUGHT TO CHECK FOR PERFORATION, BUT...
2406 CMP GB.STA(H),#%GBIDL ;MORE BUFFERS?
2409 5$: MOVB A,(D)+ ;DROP CHAR IN BUFFER
2410 INC GLPCOL ;AND ADVANCE COLUMN
2413 6$: MOVB A,GLIMBO ;NO BUFFERS, SAVE CHAR BEING PRINTED
2414 SETOM GLIMBF ;SET FLAG SO WILL BE PRINTED NEXT TIME
2415 TST (SP)+ ;STOP THE WORLD
2418 ;GOBBLE IDLE BUFFER H -> FOR M.P. RETURNS GB.PNT(H) IN D.
2420 GLPBGB: MOV #%GBMP,GB.STA(H) ;ACTIVATE AT M.P. LEVEL
2421 CLR GB.FF(H) ;INIT THE BUFFER
2423 CLR GLPCOL ;START LINE IN COLUMN 0
2424 MOV H,D ;INIT INSERT POINTER
2427 MOV H,GLPLIM ;SET UP MAX. VALUE OF GB.PNT
2431 ;GIVE BUFFER H -> TO P.I. LEVEL
2433 GLPBWW: BIT #1,D ;MUST BE EVEN NUMBER OF BYTES
2437 1$: PUSH A ;INTERFACE GETS BYTES IN WRONG ORDER
2438 MOV P,A ;COMPUTE NUMBER OF WORDS IN LINE
2443 CLR (D)+ ;CAN'T HAVE ZERO-LENGTH LINE
2445 4$: MOV A,GB.PNT(H) ;SAVE WORD COUNT FOR P.I. LEVEL
2449 TST GLPFIL ;IF STARTING NEW FILE,
2452 SETOM GB.FF(H) ; BE SURE TO GET NEW PAGE
2453 5$: MOV #%GBWRT,GB.STA(H) ;QUEUE TO P.I. LEVEL
2454 MOV GB.NXT(H),H ;ADVANCE TO NEXT BUFFER
2456 MASK 6 ;STOP P.I. LEVEL (HAVE TO LOCK OUT GLPBRK & CLKBRK)
2457 TST GLPOAC ;PRINTER ON?
2459 MOV #%GCOFF,@#GLPCSR ;NO, CLEAR OLD STUFF IN INTERFACE
2460 TST GLPGF1 ;AND PUT IN LOW-SPEED GRAPHIC MODE IF NECC
2462 MOV #%GCGRF,@#GLPCSR
2463 MOV #%GCLSL,@#GLPCSR ;LOW SPEED (COME ON, THIS IS ONLY A KL10!)
2464 6$: MOV #%GCON,@#GLPCSR ;TURN IT ON
2465 MOV #%GCION,@#GLPCSR ;TURN ON INTERRUPTS
2467 ; PUSH @#PS ;FAKE AN INTERRUPT
2468 ; CALL GLPBRK ;IS THIS NECESSARY?
2472 ;GOULD LPT VARIABLES
2474 GLPCOL: 0 ;CURRENT COLUMN NUMBER
2475 GLPROW: 0 ;CURRENT ROW NUMBER
2476 GLPRMX==67. ;NUMBER OF LINES PER PAGE
2477 GLPLIM: 0 ;ADDRESS OF END OF CURRENT BUFFER
2478 GLPOAC: 0 ;NON-ZERO => GOULD LPT P.I. ACTIVE
2479 GLPGF1: 0 ;NON-ZERO => GOULD LPT IN GRAPHIC MODE
2480 GLIMBO: 0 ;SAVE CHAR HERE WHEN RUN OUT OF BUFFERS
2481 GLIMBF: 0 ;NON-ZERO => CHAR IN GLIMBO
2482 GLPFIL: 0 ;NON-ZERO => IN MIDDLE OF A FILE
2483 GLPTIM: 10. ;COUNT DOWN WHEN LOSING
2484 GLPERR: 0 ;NON-ZERO => ERROR STATUS FROM P.I.
2491 ;DISK UNIBUS REGISTERS
2493 DSKCRA=176700 ;COMPLETION REGISTER A
2494 %DAPON==100000 ;SPONTANEOUS COMPLETION DUE TO POWER-ON. DISK NUMBER
2495 ; IN LOW BITS OF COMMAND-COMPLETION REGISTER B
2496 %DACQE==10000 ;CONSISTENCY ERROR IN COMMAND QUEUE
2497 %DANXM==4000 ;NXM ERROR IN COMMAND QUEUE
2498 %DAPAR==2000 ;PARITY ERROR IN COMMAND QUEUE
2499 ;LOW 2 BITS OF COMMAND COMPLETION REGISTER A AND
2500 ;COMMAND COMPLETION REGISTER B CONTAIN THE ADDRESS
2501 ;OF THE PARITY OR NXM ERROR
2502 DSKCRB=176702 ;COMPLETION REGISTER B
2503 DSKCSR=176704 ;COMMAND/STATUS REGISTER
2504 %DCCPL==100000 ;COMMAND IS COMPLETE, RESET BY %DCACK. READ-ONLY
2505 %DCDER==40000 ;"DMA ERROR", RESET ONLY BY SYSTEM RESET.
2507 ;BITS 30004 ALWAYS ON
2508 %DCMNT==4000 ;HOST-ADAPTOR MAINTENANCE MODE
2509 %DCRST==2000 ;RESET. WRITE-ONLY.
2510 %DCACK==1000 ;ACKNOWLEDGE COMMAND COMPLETION. WRITE-ONLY
2511 %DCCMD==400 ;TAKE COMMAND FROM CTRA/CTRB. WRITE-ONLY
2512 %DCRDY==200 ;READY TO TAKE A COMMAND. READ-ONLY
2513 %DCTIE==100 ;COMMAND TRANSMISSION (%DCRDY) INTERRUPT ENABLE
2514 %DCCIE==40 ;COMMAND COMPLETION (%DCCPL) INTERRUPT ENABLE
2515 %DCPCY==20 ;POWER JUST CYCLED ON OR OFF. READ-ONLY
2516 %DCPON==10 ;POWER ON. READ-ONLY
2517 %DCDMA==2 ;DMA IN PROGRESS. READ-ONLY
2518 %DCBOT==1 ;BOOT (READ DRIVE 0 SECTOR 0 INTO MEMORY 0). WRITE-ONLY
2519 DSKCTA=176706 ;COMMAND TRANSMISSION A (ADDRESS OF RQB HIGH BITS)
2520 DSKCTB=176710 ;COMMAND TRANSMISSION B (ADDRESS OF RQB LOW BITS)
2521 ;176714 DUPLICATES DSKCSR FOR UNKNOWN REASONS
2523 ;DISK REQUEST BLOCK. WE ONLY HAVE ONE SINCE NO SEEK OVERLAP.
2525 RQBACT: 0 ;NON-ZERO IF REQUEST ACTIVE AND EXPECTING COMPLETION
2527 RQBID: 0 ;RETURNED IN CCRB WHEN COMMAND COMPLETES
2528 RQBSTS: 0 ;STATUS STORED BY 2561, COPIED INTO DSCSTS
2529 RQBFLT: 0 ;FAULT CODE IN HIGH BYTE, BITS 1-0 HIGH BITS OF LINK ADDRESS
2530 RQBLNK: 0 ;LINK ADDRESS TO NEXT RQB (MUST BE ZERO)
2531 RQBCMD: 0 ;COMMAND CODE, COPIED FROM DSCCMD
2532 RQBDRV: 0 ;UNIT NUMBER, COPIED FROM DSCDRV
2533 RQBCYL: 0 ;CYLINDER NUMBER, COPIED FROM DSCCYL
2534 RQBHED: 0 ;HEAD NUMBER, COPIED FROM DSCHED
2535 RQBSEC: 0 ;SECTOR NUMBER, COPIED FROM DSCSEC
2536 RQBWC: 0 ;POSITIVE WORD COUNT (ALWAYS 12.*256.)
2537 RQBMA: 0 ;MEMORY ADDRESS (ALWAYS DSKBUF)
2538 RQBMAH: 0 ;MEMORY ADDRESS HIGH (ALWAYS 0)
2539 ; BITS 1-0 BITS 17-16 OF ADDRESS. BIT 6 MA INCR INH
2540 RQBID1: 0 ;RETURNS RECORD ID 1
2541 RQBID2: 0 ;RETURNS RECORD ID 2
2542 RQBMNT: .BLKW 27. ;DIAGNOSTIC DATA MAY BE RETURNED
2544 ;DISK BUFFER. HOLDS ENOUGH 12-BIT BYTES IN 16-BIT WORDS TO MAKE 1024. 36-BIT WORDS
2545 DSKBUF: .BLKW 3.*1024.
2547 ;ROUTINE TO START DISK IF IT IS READY AND THERE IS A REQUEST.
2548 DSKSTR: TST DSCREQ ;ANY REQUEST FROM 10?
2551 BNE 99$ ;CHECK WORD WRONG, DON'T TOUCH DISK
2552 TST RQBACT ;PREVIOUS OPERATION FINISHED?
2554 BPT ;NO, MUST BE BUG IN 10?
2555 10$: TSTB DSKCSR ;TEST IF READY FOR COMMAND TRANSMISSION
2557 CLR DSCDON ;YES, CLEAR 10/11 COMMUNICATION FLAGS
2559 CLR RQBLNK ;SET UP RQB FROM 10'S PARAMETERS
2568 CMP RQBCMD,#%DMWRT ;IF A WRITE COMMAND, MUST COPY DATA BUFFER
2571 .REPT 4 ;TAKES 4 BYTE POINTERS TO DO IT
2572 MOV #DSCPNT+<2*.RPCNT>,H
2573 .REPT 3 ;EACH BYTE POINTER HAS 768 12-BIT BYTES
2578 30$: CLR DSKCTA ;GIVE ADDRESS OF RQB TO 2561
2580 SETOM RQBACT ;TELL INTERRUPT LEVEL INTERRUPT EXPECTED
2581 MOV #%DCCMD+%DCCIE,DSKCSR ;GIVE COMMAND, ENABLE COMPLETION INTERRUPT
2584 ;CALL HERE WHEN DISK INTERRUPTS
2585 DSKBRK: PUSH <A,B,C,D,H,I> ;SAVE ALL REGISTERS
2587 BIT #%DCPCY,A ;POWER CYCLED?
2588 BNE 5$ ;YES, RESET CONTROLLER AND IGNORE INTERRUPT
2589 BIT #%DCMNT,A ;NO, MAINTAINENCE MODE
2591 BPT ;BLEAH, MUST BE BROKEN
2594 4$: BIT #%DCDER,A ;WHAT ABOUT UNIBUS ERROR
2597 5$: MOV #%DCRST,DSKCSR ;RESET THE CONTROLLER AND TURN OFF INTERRUPTS
2598 TST RQBACT ;DID THIS LOSE IN THE MIDDLE OF A DISK OPERATION?
2599 BEQ 99$ ;NO, DISMISS
2600 MOV #%DFRST,A ;YES, GIVE ERROR STATUS
2604 10$: BIT #%DCCPL,A ;TEST FOR COMMAND COMPLETION
2605 BPL 99$ ;NO, IGNORE INTERRUPT
2606 MOV DSKCRA,A ;GET COMPLETION STATUS
2608 MOV #%DCACK+%DCCIE,DSKCSR ;ACKNOWLEDGE COMPLETION, ENABLE MORE INTERRUPTS
2609 TST RQBACT ;EXPECTED?
2611 BIT #%DAPON,A ;POWER-UP INDICATION?
2612 BNE 99$ ;FOR NOW, IGNORE IT
2613 BIT #%DACQE+%DANXM+%DAPAR,A
2614 BEQ 30$ ;OK, NO COMMAND-QUEUE ERROR
2615 MOV #%DCRST,DSKCSR ;RESET CONTROLLER (I DON'T KNOW IF IT NEEDS IT)
2616 20$: MOV A,DSCFLT ;COMMAND-QUEUE ERROR, GIVE STATUS TO PDP10
2620 30$: CLR DSCFLT ;CLEAR HIGH BYTE
2621 MOVB RQBFLT+1,DSCFLT ;PICK UP FAULT CODE, PUT IN LOW BYTE
2622 BEQ 35$ ;IF FAULT CODE IS NON-ZERO, THE THING MAY BE FROZEN,
2623 MOV #%DCRST,DSKCSR ;SO RESET IT. OTHERWISE ERROR SEEMS TO HAPPEN OVER AND OVER
2624 35$: MOV RQBSTS,DSCSTS ;GIVE STATUS TO PDP10
2625 MOV RQBCYL,DSCCYL ;STORE BACK DISK ADDRESS, MAY BE USEFUL TO PDP10
2628 BIT #%DMRED,RQBCMD ;IF COMMAND WAS READ, COPY BUFFER BACK
2631 .REPT 4 ;TAKES 4 BYTE POINTERS TO DO IT
2632 MOV #DSCPNT+<2*.RPCNT>,H
2633 .REPT 3 ;EACH BYTE POINTER HAS 768 12-BIT BYTES
2638 80$: SETOM DSCDON ;SIGNAL PDP10 OPERATION IS COMPLETE
2639 BIS #DLX10I,DLXCSR ;AND INTERRUPT THE PDP10
2640 CLR RQBACT ;NO LONGER EXPECTING COMPLETION ON THE RQB
2641 99$: POP <I,H,D,C,B,A> ;RESTORE REGISTERS AND EXIT INTERRUPT
2645 .SBTTL SET LINE PARAMETERS
2648 ;DH11 PARAM REG IN A
2651 SPARAM: CMP I,#NFTTY
2657 2$: CMP B,#1. ;MINIMUM BUFFER SIZE ONE CHARACTER
2660 3$: CMP B,#MAXBSZ ;MAXIMUM BUFFER SIZE <MAXBSZ> CHARACTERS
2663 4$: MOV B,BUFSIZ(I) ;SET AMOUNT OF BUFFER TO BE USED FROM NOW ON
2664 MOV HDWR(I),H ;(BUT NO LONGER DO WE ATTEMPT DYNAMIC BUFFER ALLOCATION)
2667 MASK 5 ;LINE IS A DH11, HAVE TO SET LINE PARAM REG
2668 MOV DHLSEL(I),@DHSCR(H) ;SELECT THE LINE
2669 MOV A,@DHLPR(H) ;GIVE LINE-PARAMETER REG TO DH11
2671 5$: MOV A,LPRVAL(I) ;STORE LPR IN CASE SOMEONE IS CURIOUS
2674 .SBTTL DH11 INPUT INTERRUPT
2677 CONC DH,\.RPCNT+1,<IBK: JSR H,DHIBK>
2681 DHIBK: MOV (H),H ;PICK UP HARDWARE INDEX
2683 1$: MOV @DHNRC(H),A ;RECIEVE A CHARACTER
2684 BPL DHIEX ;EXIT INTERRUPT IF NO MORE CHARS
2685 MOV A,I ;EXTRACT LINE NUMBER
2691 CMP I,#NLDHTY ;IGNORE NON-EXISTENT LINES
2694 CALL @TTYIPC(I) ;CALL LINE HACKER
2695 BR 1$ ;AND CHECK FOR MORE
2697 DHIEX: POP <I,B,A,H>
2702 DHNRMI: BIT #%DXPAR,A
2703 BEQ 1$ ;IGNORE IF PARITY ERROR
2705 1$: BIT #%DXBRK,A ;IF BREAK,
2707 TST AUTOSP(I) ;AND LINE WANTS AUTOSPEED-ON-BREAK FEATURE
2709 ASPMD: MOV #DHASP,TTYIPC(I) ;PUT IT IN AUTOSPEED MODE
2710 MOV DHLSEL(I),@DHSCR(H) ;AND SET HARDWARE TO 1200 BAUD
2711 MOV #023103,@DHLPR(H)
2714 ;CHAR IN A RECEIVED FROM LINE IN I
2715 RCV: BIC #177400,A ;8-BIT CHAR RECEIVE
2716 RCV.FW: TST NO.ITS ;ENTER HERE FOR FULL WORD RECEIVE
2718 21$: MOV #DWNMSG,A ;ITS DOWN, GIVE MESSAGE
2723 CMP RINGCT(B),#TYIRSZ-2
2725 CALL PUT ;FIRST PUT THE CHARACTER
2728 CALL PUT ;THEN THE TENNISH LINE NUMBER
2731 11$: MOV #IBOMSG,A ;INPUT BUFFER OVERFLOW
2734 .IFNZ NMPTYS ;HANDLE INPUT FROM THE MULTIPLEXOR LINE
2737 MOV MPXSEL,I ;CURRENT INPUT LINE
2738 TSTB A ;SPECIAL CHAR?
2740 JMP @TTYIPC(I) ;NO, RECEIVE ON APPROP LINE
2742 1$: MOV A,I ;SPECIAL CHAR, EXTRACT LINE#
2744 ;FOLLOWING FEATURE COMMENTED OUT SINCE IT CAUSES 11 TO LOOP
2745 ; WHEN NEXT INPUT ARRIVES -- NOT OBVIOUS HOW TO FIX.
2746 ; CMP I,#77 ;SELECT NON-MULTIPLEX INPUT?
2747 ; BEQ 3$ ;YES, DO SO
2751 BHI 2$ ;OUT OF RANGE, IGNORE
2752 MOV I,MPXSEL ;INPUT SELECT, SAVE LINE#
2755 3$: MOV #MPXIDX,MPXSEL ;SELECT PASS THROUGH
2759 ;AUTOSPEED MODE COMES HERE WHEN CHAR RECIEVED
2761 DHASP: BIC #177400,A ;CLEAR FRAMING ERR, ETC.
2762 BEQ ASP10 ;11 0'S = 110 BAUD
2763 CMP A,#200 ;7 0'S, 1 = 150 BAUD
2765 CMP A,#170 ;3 0'S, 4 1'S, 0 = 300 BAUD
2767 CMP A,#370 ;300/600 IS NOW RUBOUT, NOT I
2769 CMP A,#146 ;1 0, 2 1'S, 2 0'S, ... = 600
2771 CMP A,#340 ;5 0'S, 3 1'S ? MYSTERY TO ME
2773 CMP A,#015 ;CR = 1200
2775 CMP A,#215 ;CR WITH EITHER PARITY
2777 MOV A,#. ;SAVE GARBAGE FOR DEBUGGING
2778 RET ;SOMETHING ELSE, IGNORE
2780 ASP10: MOV #006307,A ;110 IN, 110 OUT, NO PARITY, 8 BITS, EXTRA STPBT
2785 ASP15: MOV #012503,A ;150 IN, 150 OUT, NO PARITY, 8 BITS
2790 ASP30: MOV #016703,A ;300 IN, 300 OUT, NO PARITY, 8 BITS
2795 ASP36: MOV #020703,A ;300 IN, 600 OUT, NO PARITY, 8 BITS
2800 ASP60: MOV #021003,A ;600 BAUD, NO PARITY, 8 BITS
2805 ASP120: MOV #023103,A ;1200 IN, 1200 OUT, NO PAR, 8 BITS
2810 ASPX: CALL SPARAM ;SET BUFFER SIZE AND HARDWARE SPEED
2811 MOV I,A ;SET UP SET-SPEED COMMAND TO -10
2814 TST TTYHNG(I) ;IF THIS IS NEW STATUS FOR 10,
2816 INC HNGSIG ;INDICATE STATUS WAITING
2817 11$: MOV A,TTYHNG(I) ;SAVE THIS LINE'S LATEST STATUS
2818 MOV #ASPACK,A ;ACKNOWLEDGE TO USER THAT HE WON
2820 DEC TYPING(I) ;IF NO WAKEUP FOR 10, HIT CALL WHEN TYPING DONE
2821 MOV NRMIPC(I),TTYIPC(I) ;AND TAKE LINE OUT OF AUTOSPEED MODE
2824 .SBTTL DH11 OUTPUT INTERRUPTS
2827 CONC DH,\.RPCNT+1,<OBK: JSR H,DHOBK>
2831 DHOBK: MOV (H),H ;GET HARDWARE UNIT NUMBER
2832 BIT #DHSNXM,@DHSCR(H) ;IS THIS INTERRUPT DUE TO NXM?
2835 1$: BIC #DHTDON,@DHSCR(H) ;HARDWARE KLUDGE TO MAKE INTERRUPTS WIN
2837 MOV DHOAC(H),C ;SEE WHICH BAR BITS HAVE TURNED OFF
2851 CMP I,#NLDHTY ;IGNORE NON-EXISTENT LINES
2858 DHOEX: POP <I,C,B,A,H>
2861 XMTDON: TST TYPING(I) ;HERE WHEN OUTPUT FINISHES
2862 BGT 1$ ;BRANCH IF -10 WANTS TO KNOW ABOUT IT
2863 BEQ 3$ ;BRANCH IF NOTHING TO DO
2864 MOV #32,A ;SEND A CALL
2869 ASR A ;PUT TENNISH LINE NUMBER INTO RING
2870 MOV #TYORNG,B ;MAIN PROG LEVEL WILL LATER TELL -10
2875 .IFNZ NMPTYS ;OUTPUT DONE ON MULTIPLEXED LINE
2876 MPXDON: PUSH <C,D,H,I>
2879 NEG MPXOAC ;SENT HEADER, NOW SEND DATA
2887 1$: MOV MPXOLN,I ;OUTPUT IS DONE ON THAT LINE NOW
2890 CLR MPXOAC ;MPX IDLE
2891 CALL STRMPX ;LOOK FOR NEW STUFF TO DO
2896 .SBTTL DL11 INTERRUPTS
2899 CONC DL,\.RPCNT+1,<IBK: JSR H,DLIBK>
2901 CONC DL,\.RPCNT+1,<OBK: JSR H,DLOBK>
2905 DLIBK: MOV (H),H ;GET HARDWARE INDEX OF INTERRUPTING UNIT
2907 MOV @DLKB(H),A ;GET RECEIVED CHARACTER
2908 MOV DLTYNO(H),I ;GET LINE NUMBER RECEIVED ON
2910 BNE 2$ ;ONLY T00 CAN RETURN TO KLDCP
2911 BIT #20000,A ;IF BREAK KEY IS HIT
2913 SETOM KLDCPF ;USER WANTS TO RETURN TO KLDCP
2914 BR DLBKEX ;FOR ONE COMMAND LINE
2916 1$: TST DDTMOD ;IF IN DDT MODE,
2918 BIC #-200,A ; HANDLE INPUT DIFFERENTLY
2925 DLBKEX: POP <I,B,A,H>
2928 DLOBK: MOV (H),H ;GET HARDWARE INDEX OF INTERRUPTING UNIT
2930 BEQ DLBKX1 ;NOT SUPPOSED TO BE TYPING OUT, IGNORE INT
2931 DEC DLBC(H) ;GOT ANY MORE CHARACTERS?
2932 BLT DLBKX2 ;NO, GO GIVE OUTPUT DONE
2933 MOV DLCA(H),-(SP) ;YES, GIVE NEXT CHARACTER
2934 MOVB @(SP)+,@DLPB(H)
2939 DLBKX2: PUSH <A,B,I> ;OUTPUT DONE
2940 MOV DLTYNO(H),I ;GET TTY INDEX OF INTERRUPTING LINE
2941 CLR DLOAC(H) ;OUTPUT NO LONGER ACTIVE ON THIS LINE
2945 .SBTTL CLOCK INTERRUPT
2947 ;NOTE - IT IS IMPORTANT THAT THIS BE AT A HIGHER INTERRUPT LEVEL THAN THE CHAOS NET
2948 CLKBRK: SETOM WAKE ;WAKE UP MAIN LOOP
2950 PUSH @#PS ;CHECK GOULD LPT
2951 CALL GLPBRK ;(LOSES INTERRUPTS)
2952 DEC GLPTIM ;TIME TO CHECK GOULD LPT?
2955 BIT #%GSNRD,@#GLPCSR ;YES, LOSING?
2957 CLR GLPERR ;PROBABLY NOT
2958 BR 13$ ;(CAN'T TELL FOR SURE IF %GCON NOT DONE)
2960 14$: MOV @#GLPCSR,GLPERR ;LPT LOSING, TELL 10
2961 CALL GLPRST ;AND MAKE SURE BUFFERS DON'T CHOKE UP
2964 .IFNZ NDMS ;MODEM SCANNER GETS SHUT OFF SOMEHOW
2965 CLR A ;loop over the DM11s, turning them on
2967 259$: BIT #DMSCN,@DMCSR(A)
2969 BIT #DMIEN,@DMCSR(A)
2971 14$: MOV #DMSCN+DMIEN,@DMCSR(A) ;ENABLE SCANNER INTERRUPTS
2972 15$: TST (A)+ ;next DM11
2973 SOB B,259$ ;until all DM11s done
2976 .IFNZ CHAOSP ;WAKE-UP OUTPUT LINKS IN RE-TRANSMIT DELAY
2978 50$: MOV CHOHWR(I),A ;ADDRESS OF HARDWARE CSR
2979 TST CHOSTS(I) ;IF ZERO, IS IDLE, DON'T WANT INTERRUPT ENABLE
2980 BEQ 51$ ;NOTE THAT THIS RUNS MASKED HIGHER THAN CHAOS INT LVL
2981 BIS #%CATEN,(A) ;RE-ENABLE INTERRUPT IF OFF
2984 BIT #%CATDN,(A) ;TRANSMIT-DONE?
2986 INC CHSIDL(I) ;NO, KEEP TIME-OUT
2987 CMP CHSIDL(I),#60. ;IF TRANSMIT-DONE STUCK OFF FOR 1 SECOND,
2989 MOV #%CARST,(A) ; THEN RESET THE INTERFACE
2990 ; MOV #%CAREN+%CATEN,(A) ;INTERRUPT ENABLES WILL TURN THEMSELVES BACK ON IF NECESSARY!
2991 INC CHSRST(I) ;COUNT NUMBER OF TIMES HAD TO DO THIS
2996 CMP I,#CHXCHS+CHAOSP+CHAOSP
2999 DEC PULSAR ;TIME TO GENERATE TEST PACKET TO CHAOS NET?
3001 MOV PULSON,PULSAR ;RE-INITIALIZE COUNTER
3002 .REPT CHAOSP ;YES, AWAKEN ALL TRANSMIT INTERRUPT SIDES
3003 BIS #%CATEN,@CHOHWR+CHXCHS+<2*.RPCNT>
3006 TST CHOSTS+CHXT11 ;AWAITING BUFFER FROM 10?
3007 BNE 65$ ;YES, COUNT TIMEOUT
3008 CLR T11TIM ;NO, RESET TIMEOUT
3011 66$: DEC 4SEC ;TIME FOR 4-SECOND CLOCK?
3013 MOV #4*60.,4SEC ;YES
3014 MOV #<NSUBNT-1>*2,I ;INCREMENT ROUTING COSTS
3015 71$: TST SBNTYP(I) ;THIS GUY'S COSTS SUPPOSED TO INCREMENT?
3017 CMP SBNCST(I),#1000 ;DON'T INCREMENT TOO HIGH AND OVERFLOW
3022 DEC 15SEC ;TIME FOR 15-SECOND CLOCK? (REALLY 16)
3025 .REPT CHAOSP ;TELL CABLES TO BROADCAST %CORUT PACKETS
3026 SETOM CHXRTF+CHXCHS+<2*.RPCNT>
3027 BIS #%CATEN,@CHOHWR+CHXCHS+<2*.RPCNT>
3029 .IIF NZ ETHERP, SETOM CHXRTF+CHXETH ;TELL ETHERNET TO BROADCAST ROUTING
3030 90$: ;CAN'T DO IT NOW BECAUSE WRONG INTERRUPT LEVEL
3033 INC DVRTIM ;TIME OUT DOVER CONNECTION
3034 CMP DVRTIM,#15.*60. ;IF IDLE FOR 15 SECONDS, FLUSH
3038 15$: INC DVRRTR ;COUNT UP RETRANSMISSION COUNTER
3040 .IFNZ NDMS ;GOT ANY TTYS WITH MODEM CONTROL?
3041 MOV #NFTTY,I ;CHECK FOR HANGUPS
3042 16$: TST DIALED(I) ;HANGUP IN PROGRESS ON THIS LINE?
3044 INC DIALED(I) ;YES, TIMED OUT?
3046 CLR DIALED(I) ;YUP, LINE IS HUNG UP
3047 MOV I,A ;TELL -10 ABOUT IT
3049 TST TTYHNG(I) ;IF THIS IS NEW STATUS FOR 10,
3051 INC HNGSIG ;INDICATE STATUS WAITING
3052 18$: MOV A,TTYHNG(I) ;SAVE THIS LINE'S LATEST STATUS
3059 ROR SWR ;LOW BIT OF SWITCHES => DDT
3064 .SBTTL MODEM CONTROL
3066 ;;; hack multiple DM interrupt vectors
3068 CONC DM,\.RPCNT+1,<BRK: JSR H,DMBRK>
3074 MOV (H),A ;get the device offset in A
3075 MOV @DMCSR(A),I ;GET ASSOCIATED TTY INDEX
3076 BIC #177760,I ;gives us channel (0-17) on this DM11
3077 ;; now add <device # * 16.> to get offset into table for any DM
3078 MOV A,B ;device offset in B, is 2*device number
3081 ASL B ;multiply by 8 for offset in B
3082 ADD B,I ;add to I for offset for this channel
3083 ASL I ;now get word offset in I by shifting
3084 ;; get index into map between DM channels and TTY indices
3086 BEQ 90$ ;EXIT IF THIS LINE NOT UNDER MODEM CONTROL
3087 ; TST @DMCSR(A) .SEE DMRNG
3089 ; TST DIALED(I) ;RINGING. IS LINE DIALED UP ALREADY?
3090 ; BNE 10$ ;YES, NOT SUPPOSED TO BE RINGING
3091 ; MOV #LINENB+LINDTR,@DMLSR(A) ;ANSWER THE PHONE
3093 10$: BIT #LINCTS,@DMLSR(A) ;DO WE HAVE CLEAR-TO-SEND?
3095 TST DIALED(I) ;YES, WHAT WAS PREVIOUS STATE?
3096 BEQ 13$ ;WAS OFF, THIS IS A DIALUP
3097 BPL 90$ ;WAS ON, IGNORE
3098 NEG DIALED(I) ;WAS HANGING UP, ABORT IT
3101 13$: INC DIALED(I) ;LINE IS NOW DIALED UP
3102 TST DMINI ;IF GETTING INITIAL STATE,
3103 BNE 90$ ;DON'T HACK AUTOSPEED
3104 TST AUTOSP(I) ;IF IT HAS AUTOSPEED,
3106 MOV HDWR(I),H ;HACK THAT
3110 20$: TST DIALED(I) ;CTS DROPPED
3111 BMI 90$ ;ALREADY KNOWN ABOUT, IGNORE
3112 MOV #-HNGDLY,DIALED(I) ;OTHERWISE START HANGUP TIMEOUT
3114 90$: BIC #DMDON,@DMCSR(A) ;RESTART SCANNER
3121 .SBTTL GOULD PRINTER P.I. LEVEL
3123 GLPBRK: BIT #%GSBSY,@#GLPCSR
3127 1$: BIT #%GSDON,@#GLPCSR
3129 RTI ;LPT BUSY OTHER FLAVOR
3132 BIT #%GSERR,@#GLPCSR ;LPT LOSING?
3134 CALL GLPRST ;YUP, RESET THE BUFFERS
3135 MOV @#GLPCSR,GLPERR ;AND TELL 10
3137 GLPOFF: CLR GLPOAC ;HERE TO STOP P.I.
3138 MOV #%GCIOF,@#GLPCSR
3139 MOV #5000.,A ;LPT SOMETIMES BUSY FOR A WHILE
3140 1$: BIT #%GSBSY,@#GLPCSR ;HAVE TO WAIT SO TONER PUMPS WILL
3141 BEQ 2$ ;REALLY TURN OFF
3143 2$: MOV #%GCOFF,@#GLPCSR
3147 GLPFIN: MOV #%GBIDL,GB.STA(H) ;DONE WITH THIS BUFFER
3148 MOV GB.NXT(H),H ;CHECK NEXT
3151 GLPBR1: MOV GLPOOP,H ;CHECK ON BUFFERS
3152 CMP GB.STA(H),#%GBDMA ;FINISH DMA XFER?
3154 CMP GB.STA(H),#%GBWRT ;QUEUED OR ALREADY ACTIVE AT P.I.?
3155 BLT GLPOFF ;NO, STOP
3156 MOV #%GBPI,GB.STA(H) ;YES, ACTIVATE IT AT P.I.
3157 TST GB.FF(H) ;NEED FF?
3159 MOV #%GCFF,@#GLPCSR ;YES
3163 1$: TST GB.NL(H) ;NEED BLANK LINES?
3165 DEC GB.NL(H) ;YES, GIVE ONE
3166 MOV #%GCADV,@#GLPCSR
3169 2$: MOV H,B ;SET UP TEXT ADDR
3171 MOV GB.PNT(H),A ;SET UP TEXT WORD COUNT
3174 MOV B,@#GLPCA ;START XFER
3175 MOV #%GBDMA,GB.STA(H) ;FLAG BUFFER ACTIVE AT DMA LEVEL
3179 MOV #GLPBFF,H ;FLUSH ALL BUFFERS
3186 MOV #60.*10.,GLPTIM ;SET TIMEOUT
3194 .SBTTL CHAOSNET ROUTINES
3196 ;ALL ROUTINES ON THIS PAGE CALLED WITH INTERRUPTS MASKED, INDEX IN I.
3198 ;REFILL FROM CHAOS INTERFACE
3199 CHSRFL: BIS #%CAREN,@CHIHWR(I) ;TURN ON RECEIVER INTERRUPTS
3200 RET ;WILL NOTICE INPUT LATER
3203 ;LOOPS BACK TO HERE WHEN DISCARDING A PACKET
3204 DLCRF1: CMP (SP)+,(SP)+ ;POP <D,H>
3206 INC DLCSS1(A) ;2 ;INDICATE BUFFER HAS BEEN COPIED
3207 BIS #DLX10I,DLXCSR ;AND INTERRUPT THE PDP10
3210 DLCRFL: CALL DLCCHK ;SEE IF DL10 IS DISABLED
3211 BNE 99$ ;BRANCH IF YES
3212 MOV #2,A ;CHECK BOTH 10 TO 11 BUFFERS SO CAN'T GET OUT OF PHASE WITH 10
3213 10$: CMP DLCSS1(A),#1 ;10 SAYS BUFFER READY?
3215 SUB #2,A ;NO, TRY NEXT
3219 11$: PUSH A ;SAVE CURRENT 10 TO 11 BUFFER
3220 ADD #DLCSP1,A ;OUTPUT READY, GET IT
3221 MOV #DLCIBF,B ;COPY INTO BUFFER
3222 .REPT PKHDW ;FIRST GET HEADER
3226 CALL CHSIHD ;PROCESS HEADER, GET LENGTH, DEST
3227 BVS DLCRF1 ;BRANCH IF PACKET NO GOOD
3230 SUB CHIHDL(I),C ;GET NUMBER OF DATA WORDS TO FOLLOW
3231 CALL MOVHD ;MOVE THOSE WORDS
3232 POP <C,A> ;RESTORE LENGTH, 10 TO 11 BUFFER NUMBER
3233 INC DLCSS1(A) ;2 ;INDICATE BUFFER HAS BEEN COPIED
3234 BIS #DLX10I,DLXCSR ;AND INTERRUPT THE PDP10
3235 TST B ;SWAB IF NOT TO 10-COMPATIBLE DEST
3237 INC CHISTS(I) ;INDICATE BUFFER READY TO SEND
3240 ;TRANSMIT TO DL10 OUTPUT SINK
3241 ;REQUIRES I TO BE SET UP, SMASHES ALL REGS.
3242 DLCXMT: CALL DLCCHK ;DL10 DISABLED?
3243 BNE 70$ ;YES, DISCARD PACKET
3244 MOV DLCRBN,A ;GET CURRENT 11 TO 10 BUFFER NUMBER
3245 CMP DLCRS1(A),#1 ;BUFFER READY?
3247 MOV CHOINX+CHXDLC,D ;GET ADDRESS OF BUFFER TO BE SENT OVER
3248 MOV CHILNG(D),C ;AND LENGTH
3250 MOV A,H ;GET POINTER TO DL10 MAGIC IDPB WORD
3252 CALL MOVDH ;COPY WORDS INTO PDP10
3253 INC DLCRS1(A) ;SIGNAL DATA AVAILABLE TO PDP10
3254 BIS #DLX10I,DLXCSR ;AND INTERRUPT IT
3255 MOV DLCNXT(A),DLCRBN ;SWITCH BUFFERS
3256 70$: JMP CHSODN ;TRANSMISSION IS DONE ALREADY
3258 80$: MOV #1,CHOSTS+CHXDLC ;TRANSMISSION AWAITING BUFFER FROM 10
3261 ;CALL HERE WHEN DL10 INTERRUPTS, CLOBBERS ALL.
3263 TST CHOSTS+CHXDLC ;DL10 HUNG ON TRANSMIT?
3265 MOV #CHXDLC,I ;YES, WAKE IT UP
3267 10$: TST CHISTS+CHXDLC ;DL10 INPUT ACTIVE?
3269 MOV #CHXDLC,I ;NO, TRY TO GET SOME
3271 TST CHISTS(I) ;GOT SOME?
3273 CALL CHSOUT ;YES, START TRANSMISSION
3274 20$: CALL CHSRUN ;DO ANYTHING ELSE REQUIRED
3278 ;RETURN 'NE' IF DL10 IS DISABLED, BASHES NOTHING.
3283 TST DLCINI ;RE-INITIALIZE?
3284 BEQ 99$ ;NO, EVERYTHING IS OK.
3286 TST CHOSTS+CHXDLC ;WAS OUTPUT HUNG ON DL10?
3288 PUSH <A,B,C,D,I,H> ;YES, SIGNAL OUTPUT DONE ON DL10
3292 90$: CLR DLCINI ;SIGNAL INIT DONE, RETURN 'EQ'
3297 ;THESE CAN MOVE AT MOST 256. WORDS
3301 MOVHD: SUB #256.,C ;GET -#WDS LESS THAN MAXIMUM
3302 ADD C,C ;CONVERT TO BYTES
3303 SUB C,PC ;JUMP INTO MOVE TABLE
3311 MOVDH: SUB #256.,C ;GET -#WDS LESS THAN MAXIMUM
3312 ADD C,C ;CONVERT TO BYTES
3313 SUB C,PC ;JUMP INTO MOVE TABLE
3320 ;REFILL FROM TEN-11 INTERFACE
3321 T11RFL: CALL T11CHK ;CHECK FOR DISABLE
3322 BNE 99$ ;BRANCH IF DISABLED
3324 TST T11IBA ;WAS INPUT BUFFER IN USE?
3326 CLR (A)+ ;YES, INDICATE BUFFER IS NOW EMPTY
3329 ADD #T11BFL-2,A ;ADVANCE POINTER
3334 10$: TST (A) ;INPUT BUFFER CONTAIN A PACKET?
3336 SETOM T11IBA ;YES, INPUT BUFFER NOW ACTIVE
3337 ADD #8,A ;GET INPUT FROM PDP10
3338 MOV A,CHIBFP+CHXT11 ;AS CURRENT INPUT BUFFER
3339 CALL CHSIHD ;PROCESS THE HEADER
3340 BVS T11RFL ;BRANCH IF PACKET NO GOOD
3341 PUSH <A,B,C,H> ;COMPUTE CHECKSUM BEFORE SWABBING
3342 INC C ;C GETS NUMBER OF 32-BIT WORDS
3344 CLR D ;CLEAR LOW WORD OF CHECKSUM
3345 CLR H ;CLEAR HIGH WORD OF CHECKSUM
3346 SUB #PKFCMS+1,PKFC(A) ;DECREMENT FWD COUNT (IS HIGH END OF WORD)
3347 ;FWD COUNT HAS TO BE PUT BACK FOR CHECKSUM COMPUTATION
3348 21$: ADD (A)+,H ;ADD HIGH HALFWORD TO HIGH SUM
3349 ADD (A)+,D ;ADD LOW HALFWORD TO LOW SUM
3350 ADC H ;CARRY INTO HIGH SUM
3351 MOV D,B ;NOW ROTATE RIGHT DOUBLE
3356 MOV T11IBP,A ;NOW COMPARE CHECKSUM
3362 ADD #PKFCMS+1,PKFC(A) ;INCREMENT FWD COUNT (IS HIGH END OF WORD)
3363 TST B ;SWAB IF NOT TO 10-COMPATIBLE DEST
3365 INC CHISTS(I) ;INDICATE BUFFER READY TO SEND
3368 30$: POP <H,C,B,A> ;CHECKSUM ERROR
3369 INC T11CKE ;COUNT CHECKSUM ERRORS
3370 BR T11RFL ;AND IGNORE PACKET
3372 ;TRANSMIT TO TEN11 OUTPUT SINK
3373 ;REQUIRES I TO BE SET UP, SMASHES ALL REGS.
3374 T11XMT: CALL T11CHK ;TEN11 DISABLED?
3375 BNE 70$ ;YES, DISCARD PACKET
3376 TST @T11OBP ;OUTPUT BUFFER EMPTY?
3378 MOV CHOINX+CHXT11,D ;GET ADDRESS OF BUFFER TO BE SENT OVER
3380 MOV CHILNG(D),C ;AND LENGTH
3382 BIT #1,A ;IF ODD NUMBER OF BYTES, CLEAR THE EXTRA ONE
3386 CLRB PKDAT-1(A) ;NOTE, AT THIS POINT BYTES ARE SWAPPED
3387 5$: MOV T11OBP,A ;COPY INTO TEN11 OUTPUT BUFFER
3392 MOV (SP),C ;NOW COMPUTE CHECKSUM
3393 INC C ;C GETS NUMBER OF 32-BIT WORDS
3396 CLR (A)+ ;IF ODD NUMBER OF 16-BIT WORDS, CLEAR THE EXTRA ONE
3397 11$: CLR D ;CLEAR LOW WORD OF CHECKSUM
3398 CLR H ;CLEAR HIGH WORD OF CHECKSUM
3401 21$: ADD (A)+,H ;ADD HIGH HALFWORD TO HIGH SUM
3402 ADD (A)+,D ;ADD LOW HALFWORD TO LOW SUM
3403 ADC H ;CARRY INTO HIGH SUM
3404 MOV D,B ;NOW ROTATE RIGHT DOUBLE
3409 MOV T11OBP,A ;STORE CHECKSUM INTO OUTPUT BUFFER
3413 SETOM (A) ;SIGNAL PRESENCE OF PACKET TO PDP10
3414 ADD #T11BFL,A ;ADVANCE POINTER
3419 70$: CLR T11TIM ;NO TIMEOUT, 10 IS TAKING PACKETS
3420 JMP CHSODN ;TRANSMISSION IS DONE ALREADY
3422 80$: MOV #1,CHOSTS+CHXT11 ;TRANSMISSION AWAITING BUFFER FROM 10
3428 CALL T11CHK ;IS 10 UP?
3429 BNE 30$ ;IT'S DOWN, PUNT IT
3430 TST CHOSTS(I) ;TEN11 HUNG ON TRANSMIT?
3432 CALL T11XMT ;YES, WAKE IT UP
3433 10$: TST CHISTS+CHXT11 ;TEN11 INPUT ACTIVE?
3435 MOV #CHXT11,I ;NO, TRY TO GET SOME
3437 TST CHISTS(I) ;GOT SOME?
3439 CALL CHSOUT ;YES, START TRANSMISSION
3440 20$: CALL CHSRUN ;DO ANYTHING ELSE REQUIRED
3444 30$: TST CHOSTS(I) ;TRANSMITTING TO DEAD TEN-11?
3446 CLR T11TIM ;YES, FLUSH IT
3450 ;CHECK TEN-11 INTERFACE, DO RESET IF NECESSARY, RETURN 'NE' IF DISABLED.
3452 T11CHK: CMP T11TIM,#5*60. ;10 TAKING 5 SECONDS TO RESPOND?
3454 SETOM T11I10 ;YES, DECLARE IT DOWN, REINITIALIZE PROTOCOL
3455 5$: TST T11I10 ;IS 10 DONE INITIALIZING?
3456 BNE 99$ ;NO, DO NOTHING
3457 TST T11I11 ;ARE WE SUPPOSED TO INITIALIZE?
3458 BEQ 99$ ;NO, IT'S OK
3459 MOV #T11OBF,T11OBP ;YES, REINITIALIZE POINTERS
3462 MOV #T11OBF,A ;INITIALIZE INPUT AND OUTPUT BUFFER HEADERS
3463 10$: CLR (A)+ ;CLEAR INTER-MACHINE SIGNAL WORD
3465 ADD #T11BFL-4,A ;SKIP THE REMAINING WORDS
3468 CLR T11IBA ;IDLE THE INPUT
3470 TST CHOSTS+CHXT11 ;WAS OUTPUT HUNG ON TEN11?
3472 PUSH <A,B,C,D,H,I> ;YES, SIGNAL OUTPUT DONE ON TEN11
3476 90$: CLR T11I11 ;SIGNAL INIT DONE, RETURN 'EQ'
3481 ;THIS ROUTINE PROCESSES THE HEADER OF PACKET IN INPUT BUFFER FOR SOURCE I
3482 ;RETURN DESTINATION OUTPUT SINK INDEX IN B (-1 IF THIS IS FOR US (PDP11 ITSELF)),
3483 ;PACKET BUFFER POINTER IN A, AND LENGTH IN WORDS IN C.
3484 ;RETURNS WITH OVERFLOW SET IF PACKET IS DISCARDED BECAUSE OF
3485 ;TOO MUCH FORWARDING, BAD ADDRESS, TOO BIG, CRUFTY, ETC.
3486 ;OTHERWISE RETURNS WITH MINUS INDICATOR SET IF PACKET DIRECTED TO 11.
3487 CHSIHD: ADD #1,NPKSI(I) ;COUNT PACKETS IN FROM THIS SOURCE
3489 MOV CHIBFP(I),A ;POINTER TO PACKET
3490 TSTB (A) ;CHECK FOR MUPPET
3491 BNE CHSIHB ;DISCARD, WE DON'T SUPPORT THEM
3492 MOV #PKHDW,CHIHDL(I) ;SET HEADER LENGTH
3493 ADD #PKFCMS+1,PKFC(A) ;INCREMENT FWD COUNT (IS HIGH END OF WORD)
3494 BCS CHSIHB ;BRANCH IF FORWARDING LOOP
3495 MOV PKNBYT(A),C ;GET BYTE COUNT
3498 BHI CHSIHB ;TOO LONG, LOSES
3499 INC C ;MAKE WORD COUNT
3501 ADD CHIHDL(I),C ;ADD IN LENGTH OF HEADER
3502 MOV C,CHILNG(I) ;SAVE FOR LATER USE
3503 ;; NOW ROUTE THIS PACKET
3504 MOV #-1,B ;MAGIC INDEX MEANING "MYSELF"
3505 MOV PKDHST(A),D ;GET DESTINATION ADDRESS
3506 ;HERE WE HAVE HAIR FOR MULTIPLE CHAOSNETS
3508 CONC <CMP D,#CHAD>,\.RPCNT ;ADDRESSED TO PDP11 ITSELF?
3509 BEQ 50$ ;YES, LET CHSRUN HANDLE IT LATER
3511 CMPB PKOP(A),#%CORUT ;ROUTING INFO PACKET?
3512 BEQ 40$ ;YES, ADDRESS TO PDP11
3513 TST USECBL ;SUPPOSED TO USE CABLE EVEN TO TALK TO SELF?
3515 CMP I,#CHXCHS ;YES, IS THIS COMING FROM CABLE?
3516 BHIS 20$ ;YES, ROUTE REGULAR WAY
3517 MOV #CHXCHS,B ;NO, SEND TO SELF ON FIRST CABLE
3521 20$: MOVB PKDHST+1(A),B ;GET SUBNET ADDRESSED TO
3524 CLR B ;OUT OF RANGE, USE 0
3525 21$: ASL B ;MAKE INDEX INTO SUBNET TABLES
3526 TST SBNTYP(B) ;IS THIS A DIRECT HARDWARE CONNECTION?
3527 BGT 38$ ;YES, SEND TO IT
3528 MOV SBNADR(B),D ;NO, GO VIA GATEWAY
3529 BEQ CHSIRF ;HAVEN'T GOT A GATEWAY, AND BROADCAST CODE NOT WORKING YET
3530 MOVB SBNADR+1(B),B ;GET SUBNET GATEWAY IS ON
3531 ASL B ;MAKE INDEX INTO TABLES
3533 BHIS CHSIRF ;OUT OF RANGE, CAN'T GET THERE FROM HERE
3534 TST SBNTYP(B) ;IS THIS A DIRECT CONNECTION?
3535 BLE CHSIRF ;NO, CAN'T GET THERE FROM HERE (SHOULDN'T HAPPEN!)
3536 38$: MOV SBNADR(B),B ;GET SINK INDEX
3537 39$: MOV D,CHICBA(I) ;STORE CABLE ADDRESS OF IMMEDIATE DEST (GATEWAY)
3538 .IIF NDF NDVRBF, 50$: ;IF NO DOVER, ALL TO-11 PACKETS COME HERE
3539 40$: MOV B,CHIOUX(I) ;STORE SINK INDEX, SET INDICATORS
3540 RET ;NOTE THAT MOV CLEARS OVERFLOW
3543 50$: CMP PKDIND(A),DVRLIX ;DIRECTED TO DOVER?
3545 CMP PKSHST(A),DVRHST
3546 BNE 40$ ;NOT DOVER-CONNECTED HOST
3547 CMP PKSIND(A),DVRIDX
3548 BNE 40$ ;RIGHT HOST, WRONG PROCESS
3549 MOV #CHXDVR,B ;ROUTE PACKET TO DOVER GATEWAY
3553 ;HERE FOR ROUTING FAILURE. METER, RETURN WITH OVERFLOW SET.
3555 MOV B,RFSBNT ;SAVE 2* SUBNET TRYING TO GET TO
3557 ;HERE WHEN CHSIHD SEES A GARBAGE PACKET. RETURN WITH OVERFLOW SET.
3558 CHSIHB: ADD #1,NPKSBD(I) ;GOD-DAMN BRAIN-DAMAGE
3563 ;SWAB PACKET COMING FROM PDP-10 OR ETHERNET (BYTES LEFT TO RIGHT)
3564 ;IF GOING TO INCOMPATIBLE DESTINATION. CALL RIGHT AFTER CHSIHD.
3565 SWAB10: BMI CHSSWB ;SWAB IF TO-11
3566 CMP CHOXMT(B),#CHSXMT ;CHECK DESTINATION TYPE
3567 BEQ CHSSWB ;PDP11 OR CHAOSNET, SWAB IT OUT
3568 5$: RET ;PDP10 OR ETHERNET, LEAVE ALONE
3570 ;SWAB PACKET COMING FROM PDP-11 OR CHAOSNET (BYTES RIGHT TO LEFT)
3571 ;IF GOING TO INCOMPATIBLE DESTINATION. CALL RIGHT AFTER CHSIHD.
3573 BMI 5$ ;RETURN IF TO-11
3574 CMP CHOXMT(B),#CHSXMT ;CHECK DESTINATION TYPE
3575 BEQ 5$ ;PDP11 OR CHAOSNET, LEAVE ALONE
3576 ;PDP10 OR ETHERNET, SWAB IT OUT
3577 ;DROPS THROUGH INTO CHSSWB
3578 ;THIS ROUTINE SWABS THE PACKET FOR THE SOURCE IN I.
3579 ;CALLED WITH NUMBER OF WORDS IN PACKET IN C.
3580 ;CLOBBERS A, C, AND D.
3581 ;SUITABLE FOR CALLING RIGHT AFTER CHSIHD RETURNS.
3582 CHSSWB: MOV CHIBFP(I),A ;ADDRESS OF PACKET
3583 SUB CHIHDL(I),C ;GET LENGTH OF DATA AREA IN WORDS
3585 MOVB PKOP(A),D ;GET OPCODE
3586 BPL 5$ ;BRANCH IF NON-DATA
3587 BIT #100,D ;CHECK FOR BINARY DATA
3588 BEQ 10$ ;NO, GO SWAB
3591 5$: TSTB CHSBIN(D) ;CONTROL, LOOK UP OPCODE
3592 BNE 99$ ;BINARY, NO SWAB
3593 10$: ADD CHIHDL(I),A ;POINT TO DATA AREA OF BUFFER
3594 ADD CHIHDL(I),A ;BYTES, WATSON, BYTES!
3595 SUB #PKTMXW,C ;GET -#WDS LESS THAN MAXIMUM
3596 ADD C,C ;CONVERT TO BYTES
3597 SUB C,PC ;JUMP INTO SWAB TABLE
3603 ;BYTE TABLE INDEXED BY OPCODE, NON-ZERO IF BINARY
3604 ;BINARY OPERATIONS ARE 2 (%COOPN), 7 (%COSTS), 10 (%CORUT)
3605 CHSBIN: .BYTE 0,0,2,0,0,0,0,7,10,0,0,0,0,0
3606 .BYTE 0,0 ;SPARES IN CASE MORE OPCODES ADDED
3609 ;TRANSMIT PACKET FROM INPUT SOURCE I TO OUTPUT SINK, IN B.
3610 ;SMASHES ALL REGISTERS. CHISTS(I), CHIOUX(I), CHICBA(I) MUST BE ALREADY SET UP.
3611 CHSOUT: TST B ;THIS DESTINED TO PDP11?
3612 BMI CHSOUX ;YES, LET CHSRUN PICK IT UP LATER
3613 TST CHOSTS(B) ;IS SINK BUSY?
3614 BNE CHSOUX ;YES, CAN'T SEND NOW, WILL TRY AGAIN LATER
3615 NEG CHISTS(I) ;NO, SET SOURCE STATUS TO CONNECTED
3616 MOV I,CHOINX(B) ;CONNECT SINK TO SOURCE
3617 MOV B,I ;SET UP SINK INDEX
3620 JMP @CHOXMT(I) ;GO START TRANSMISSION TO SINK
3622 ;CALL HERE WHEN OUTPUT IS DONE ON SINK I.
3623 CHSODN: CLR CHOSTS(I) ;IDLE THE SINK
3625 MOV CHOINX(I),I ;GET CORRESPONDING SOURCE
3626 CLR CHISTS(I) ;IDLE IT
3627 CALL @CHIRFL(I) ;TELL SOURCE IT'S DONE, TRY TO GET MORE INPUT
3631 ;CALL HERE AFTER EACH PACKET TRANSFER TO INITIATE AS MANY ADDITIONAL TRANSFERS
3632 ;AS POSSIBLE. BASHES ALL REGISTERS. ON DL10 AND TEN11, WE COULD ACTUALLY DO SEVERAL
3633 ;TRANSFERS BEFORE RETURNING.
3636 CALL DVRRFL ;WAKE UP DOVER, MIGHT BE TIME TO RETRANSMIT
3638 MOV #<NCHX-1>*2,I ;SCAN ALL INPUT SOURCES
3639 CHSRN1: TST WAKE ;GIVE UP IF CLOCK HAS TICKED, LET TTYS RUN
3641 TST CHISTS(I) ;IS THIS SOURCE LOOKING FOR A SINK?
3643 CHSRN2: MOV CHIOUX(I),B ;GET SINK IT WANTS TO SEND TO
3644 BMI FOR11 ;BRANCH IF FOR PDP11
3645 TST CHOSTS(B) ;SINK AVAILABLE?
3646 BNE CHSRN3 ;NO, LET INPUT SIT
3647 CALL CHSOUT ;YES, ATTEMPT TO TRANSMIT
3648 BR CHSRUN ;LOOK FOR MORE WORK
3650 CHSRN3: SUB #2,I ;NEXT INPUT SOURCE
3652 RET ;NOTHING LEFT TO DO
3654 FOR11: MOV CHIBFP(I),A ;PACKET FOR PDP11, CHECK IT OUT
3655 MOVB PKOP(A),B ;GET OPCODE
3656 CMP B,#%CORUT ;IF ROUTING INFO, GOBBLE IT
3658 CMP B,#%CORFC ;ALL WE KNOW IS RFC TO CERTAIN CONTACT NAMES
3659 BNE FOR11J ;BARF AT JUNK PACKETS
3660 CALL SERVE ;RUN THE SERVER
3661 BEQ FOR11X ;IT DIDN'T LIKE IT
3662 FOR11R: PUSH <PKDHST(A),PKDIND(A)> ;INTERCHANGE SOURCE AND DESTINATION
3663 MOV PKSHST(A),PKDHST(A)
3664 MOV PKSIND(A),PKDIND(A)
3665 POP <PKSIND(A),PKSHST(A)>
3667 BVS FOR11X ;NO GOOD, FLUSH (SOURCE IN PACKET WAS WRONG)
3668 CALL SWAB11 ;SWAB IF GOING TO 11-INCOMPATIBLE DEST
3669 BR CHSRN2 ;FIRE IT OFF (CHISTS IS ALREADY 1)
3671 FOR11X: CLR CHISTS(I) ;DISCARD THIS PACKET
3673 BR CHSRUN ;LOOK FOR MORE WORK
3675 ;PACKET FROM RANDOM PLACE DIRECTED TO 11, TELL HIM TO GO AWAY
3676 FOR11J: CMP B,#%COLOS ;DON'T BARF AT LOS PACKETS
3678 MOV #<%COLOS*400>,(A)
3679 MOV #6$-5$-1,PKNBYT(A)
3685 BR FOR11R ;SEND OFF THE LOS
3686 5$: .ASCIZ /Packet unrecognized by gateway-11/
3690 CHARUT: MOV CHILNG(I),C ;GET NUMBER OF DATA WORDS
3692 ASR C ;MAKE NUMBER OF 2 WORD PAIRS
3693 BEQ FOR11X ;MIGHT BE ZERO-LENGTH
3695 ADD #PKDAT,D ;POINT TO START OF PACKET'S DATA
3696 61$: MOV (D)+,B ;GET SUBNET BEING TALKED ABOUT
3697 CMP B,#NSUBNT ;ONE WE KNOW ABOUT?
3698 BHIS 62$ ;NO, FORGET IT
3699 ASL B ;MAKE WORD INDEX
3700 TST SBNTYP(B) ;IS THIS AN AUTO ROUTING TYPE SUBNET?
3701 BNE 62$ ;NO, DON'T MUNG OUR FIXED ROUTING INFO
3702 CMP (D),SBNCST(B) ;COMPARE COSTS
3703 BHI 62$ ;NEW ONE WORSE (IF EQUAL, SWITCH TO EQUALIZE LOAD)
3704 MOV (D),SBNCST(B) ;SAVE BEST COST
3705 MOV PKSHST(A),SBNADR(B) ;AND HOST ADDRESS THIS CAME FROM AS BEST BET
3706 62$: TST (D)+ ;SKIP COST
3708 BR FOR11X ;DONE WITH PACKET
3710 .SBTTL CHAOS NET SERVERS
3712 ;CALLED WITH PACKET IN A.
3714 ;RETURN 'EQ' IF NO GOOD, 'NE' IF MODIFIED PACKET TO BE RETURNED TO SOURCE
3716 ;CURRENTLY WE SERVE THE FOLLOWING CONTACT NAMES:
3717 ; STATUS - RETURNS ANS WITH THE NAME OF THE MACHINE, LATER WILL HAVE OTHER DATA
3718 ; PULSAR - RETURNS ANS WITH DATA OF 1 BYTE, VALUE OF PULSON AS AN ASCII DIGIT,
3719 ; I.E. "0" MEANS OFF, "1" MEANS 60 PER SECOND, ETC.
3720 ; IF CONTACT NAME IN RFC IS FOLLOWED BY A SPACE AND AN ASCII DIGIT,
3721 ; SETS PULSON TO THAT STATUS.
3722 ; DOVER - DOVER PROTOCOL TRANSLATOR
3724 ;NOTE THAT WE DON'T USE THE MOST WINNING STRING COMPARE IN THE WORLD,
3725 ;THIS CODE ASSUMES IT DOESN'T MATTER WHAT HAPPENS IF AN RFC TO
3726 ;AN UNKNOWN CONTACT NAME IS DONE, AS LONG AS THE 11 DOESN'T CRASH.
3728 SERVE: MOV #SRVTBL,B ;ADDRESS OF SERVER TABLE
3729 10$: MOV (B)+,D ;ADDRESS OF CONTACT NAME FOR THAT SERVER
3730 BEQ 99$ ;EXIT IF TABLE EXHAUSTED, 'EQ' IN COND CODE
3732 ADD #PKDAT,C ;ADDRESS OF CONTACT NAME IN THIS RFC
3733 11$: TSTB (D) ;END OF STRING?
3734 BEQ 20$ ;YUP, RUN THIS SERVER
3735 CMPB (C)+,(D)+ ;DO STRING COMPARE
3737 TST (B)+ ;DOESN'T MATCH, TRY NEXT
3742 20$: JMP @(B)+ ;CALL SERVER, IT CAN RETURN EQ OR NE
3744 SRVTBL: .WORD 1$,STSSRV ;STATUS - RETURN HOST NAME AND METERS
3745 .WORD 2$,PLSSRV ;PULSAR - SET AND GET PULSAR RATE
3746 .IIF DF NDVRBF, .WORD 3$,DVROPN ;DOVER - DOVER PROTOCOL TRANSLATOR
3747 .WORD 0 ;END OF TABLE
3750 3$: .IIF DF NDVRBF, .ASCIZ /DOVER/
3753 ;SERVERS MUST PRESERVE A (PACKET), AND I, AND RETURN 'NE' IF TO BE SENT BACK TO SOURCE.
3754 ;NOTE THAT C POINTS AT THE NEXT BYTE AFTER THE CONTACT NAME
3756 STSSRV: MOV A,B ;RFC TO "STATUS", CHANGE INTO ANS CARRYING APPROPRIATE DATA.
3757 MOV #32.+<12.*NCHX>+<24.*CHAOSP>+<12.*ETHERP>,PKNBYT(A) ;SET BYTE LENGTH, CLEAR FORWARDING COUNT
3759 MOV #HSTNAM,D ;SEND NAME OF HOST
3763 CLR D ;NOW STORE METERING INFO FOR EACH SUBNET
3764 50$: MOV CHXSBN(D),(B)+ ;STORE SUBNET NUMBER+400
3765 MOV #4,(B)+ ;ASSUME NOT A CABLE
3771 CMP D,#CHXETH ;ETHERNET HAS SOME OF THESE COUNTERS
3773 MOV #12.,-10.(B) ;THERE ARE 4 MORE DOUBLE-WORDS
3774 MOV NPKSAB-CHXCHS(D),(B)+
3775 MOV HPKSAB-CHXCHS(D),(B)+
3778 MOV NPKSGB-CHXCHS(D),(B)+
3779 MOV HPKSGB-CHXCHS(D),(B)+
3780 MOV NPKSRL-CHXCHS(D),(B)+
3781 MOV HPKSRL-CHXCHS(D),(B)+
3784 55$: CMP CHIRFL(D),#CHSRFL ;CHAOSNET CABLE?
3785 BNE 59$ ;NO, THAT'S ALL
3786 MOV #16.,-10.(B) ;YES, THERE ARE 6 MORE DOUBLE-WORDS
3787 MOV NPKSAB-CHXCHS(D),(B)+
3788 MOV HPKSAB-CHXCHS(D),(B)+
3789 MOV NPKSLS-CHXCHS(D),(B)+
3790 MOV HPKSLS-CHXCHS(D),(B)+
3791 MOV NPKSGB-CHXCHS(D),(B)+
3792 MOV HPKSGB-CHXCHS(D),(B)+
3793 MOV NPKSRL-CHXCHS(D),(B)+
3794 MOV HPKSRL-CHXCHS(D),(B)+
3795 CLR (B)+ ;I DON'T KEEP TRACK OF BIT COUNT ERRS SEPARATELY
3802 RETANS: MOVB #%COANS,PKOP(A) ;RETURN THIS PACKET TO SOURCE AS AN 'ANS'
3803 RET ;NOTE CONDITION CODES HAVE 'NE'
3805 PLSSRV: MOVB PKNBYT(A),C ;GET BYTE COUNT, SHOULD BE SMALL
3806 CMP C,#8 ;6 FOR PULSAR, 1 FOR SPACE, 1 FOR CHARACTER
3807 BLO 20$ ;NOT GIVEN AN ARGUMENT, JUST READ STATUS
3808 MOVB PKDAT+7(A),C ;YES, GET THE ARGUMENT
3809 SUB #'0,C ;CONVERT TO BINARY (CHEAPO!)
3810 MOV C,PULSON ;CHANGE PULSON STATUS
3811 20$: MOV #1,PKNBYT(A) ;SET BYTE LENGTH, CLEAR FORWARDING COUNT
3812 MOV PULSON,C ;RETURN PULSAR STATUS
3817 .SBTTL CHAOSNET INTERRUPT HANDLER
3819 ;INTERRUPT HANDLER ENTRIES
3821 CONC CHS,\.RPCNT,BK:
3826 ;SUBROUTINE TO ENABLE CHAOSNET INTERFACE IN H,I TO RECEIVE NEXT PACKET
3827 CHINXT: MOVB 1(H),A ;GET CSR BITS 9-12 (LOST COUNT)
3830 ADD A,NPKSLS-CHXCHS(I)
3831 ADC HPKSLS-CHXCHS(I)
3832 BIS #%CARCL+%CAREN,(H) ;MAKE READY TO RECEIVE ANOTHER MESSAGE
3835 ;COMMON CHAOS INTERRUPT ROUTINE
3836 CHSBRK: MOV (I),I ;GET SOURCE/SINK INDEX
3837 PUSH <A,B,C,D,H> ;SAVE ALL REGISTERS
3838 MOV CHIHWR(I),H ;GET HARDWARE ADDRESS
3839 MOV (H),A .SEE CH%CSR ;GET CSR
3840 BPL CHSBK1 ;TEST RECEIVE DONE, BRANCH IF NOT
3841 .SEE %CARDN ;PALX SCREWS UP IF THIS IS ON PREVIOUS LINE!
3842 TST CHISTS(I) ;MAKE SURE INPUT BUFFER IS IDLE
3843 BNE CHSBK1 ;BUSY, DON'T LOOK AT RECEIVE DONE NOW
3844 BIT #%CAERR,A ;CRC ERROR?
3845 BNE CHICRC ;JUMP IF YES
3846 MOV CH%RBC(H),C ;BIT COUNT -1
3847 SUB #47.,C ;ADD 1, THEN SUBTRACT 3*16. FOR HARDWARE WORDS
3848 .IREPT 4, ASR C ;CONVERT TO NUMBER OF WORDS
3850 BHI CHIFLS ;THIS CAN ONLY HAPPEN IF HARDWARE BROKEN
3851 ADD #CH%RBF,H ;POINT H TO RECEIVE DATA REG
3852 MOV CHIBFP(I),D ;COPY PACKET INTO BUFFER
3854 TST (H) ;READ OUT THE 3 HARDWARE LEADER WORDS
3856 SUB #CH%RBF,H ;RESTORE H
3857 BIT #%CAERR,(H) ;WAS IT READ CORRECTLY OUT OF RAM?
3858 BNE CHIGBG ;NO, GARBAGE
3859 CMP CH%RBC(H),#7777 ;WAS PACKET CORRECT LENGTH?
3860 BNE CHIGBG ;NO, GARBAGE
3861 CALL CHINXT ;DONE WITH HARDWARE, ENABLE FOR NEXT
3862 CALL CHSIHD ;PROCESS HEADER, GET LENGTH, DEST
3863 BVS CHIFL0 ;BRANCH IF NO GOOD
3864 CALL SWAB11 ;SWAB IF NOT GOING TO 11-COMPATIBLE DEST
3865 INC CHISTS(I) ;INDICATE BUFFER READY TO SEND
3867 CALL CHSOUT ;SEND IT OUT
3869 MOV CHIHWR(I),H ;RESTORE H
3870 TST CHISTS(I) ;INPUT BUFFER STILL BUSY?
3872 BIC #%CAREN,(H) ;YES, CLEAR RECEIVE INTERRUPT ENABLE
3873 BR CHSBK1 ;GO CHECK ON OUTPUT SIDE
3875 ;HERE WHEN A PACKET WAS RECEIVED WITHOUT ERROR, BUT AFTER
3876 ;READING OUT OF THE RAM, CRC ERROR WAS SET. EITHER THE
3877 ;PACKET WAS THE WRONG LENGTH, OR THE RAM FAILED, OR THE
3878 ;HARDWARE RANDOMLY CLOBBERED IT.
3879 ;WE ALSO GET HERE IF THE BIT COUNT WAS NOT -1 AFTER ALL WORDS WERE READ.
3880 CHIGBG: ADD #1,NPKSRL-CHXCHS(I) ;LOG THE ERROR
3881 ADC HPKSRL-CHXCHS(I)
3883 MOV CH%RBC(H),CHSRLC
3884 BR CHIFLS ;GO RESET RECEIVER AND CHECK OUTPUT STATUS
3886 ;HERE WHEN A PACKET IS RECEIVED WITH A CRC ERROR. DISCARD IT,
3887 ;BUT ALSO SAVE IT IN CHSGBF, CHSGBH, CHSGBS, CHSGBC FOR DEBUGGING (IF FTGARB).
3888 CHICRC: ADD #1,NPKSGB-CHXCHS(I)
3889 ADC HPKSGB-CHXCHS(I)
3893 MOV CH%RBC(H),CHSGBC
3898 SUB #CH%RBF,H ;DROP INTO CHIFLS
3900 ;HERE TO IGNORE AN INPUT PACKET AND ENABLE HARDWARE FOR NEXT
3903 ;HERE TO CHECK ON TRANSMIT SIDE
3904 CHSBK1: TSTB (H) .SEE %CATDN ;TRANSMIT DONE?
3905 BPL CHSBKX ;NO, EXIT
3907 CLR CHSIDL(I) ;CLEAR TRANSMIT-DONE TIME-OUT
3909 MOV CHOSTS(I),A ;WAS OUTPUT IN PROGRESS?
3910 BEQ CHSBK6 ;NO, LOOK FOR OUTPUT
3911 CMP A,#2 ;TRANSMIT ABORT DELAY COMPLETED?
3913 BIT #%CATAB,(H) ;NO, TRANSMIT ABORTED?
3915 ADD #1,NPKSAB-CHXCHS(I) ;YES, METER IT, AND SET CHOSTS TO
3916 ADC HPKSAB-CHXCHS(I)
3917 INC CHOSTS(I) ;2 IF THIS IS FIRST TIME, OR 0 IF SECOND TIME
3918 BEQ CHSBK4 ;LOST TWICE IN A ROW, GIVE UP
3919 BR CHSBK5 ;TURN OFF INTERRUPT, DELAY FOR A WHILE
3921 10$: MOV #-1,CHOSTS(I) ;TRANSMIT ABORT DELAY COMPLETED, SET CHOSTS TO -1
3922 CALL CHSXM0 ;INITIATE RE-TRANSMISSION (CHOSTS ALREADY SET)
3925 CHSBK4: CALL CHSODN ;OUTPUT DONE
3927 CALL CHSRUN ;INITIATE MORE TRANSFERS
3929 TST CHOSTS(I) ;DID IT INITIATE TRANSMISSION?
3930 BNE CHSBKX ;YES, LEAVE INTERRUPT ENABLED.
3931 MOV CHOHWR(I),H ;RESTORE H
3932 TST CHXRTF(I) ;TIME TO BROADCAST ROUTING INFO?
3934 TST PULSON ;IS THIS FEATURE TURNED ON?
3935 BEQ CHSBK5 ;NO, FLUSH
3936 CMP PULSAR,PULSON ;NOTHING TO DO. TIME FOR A TEST MESSAGE?
3937 BNE CHSBK5 ;NOPE, GO IDLE
3938 MOV #52525,CH%WBF(H) ;WRITE A PACKET OF 3 HEADER WORDS, 0, 52525
3940 MOV #-1,CH%WBF(H) ;TO HOST -1, WHICH IS NON-EXISTENT
3941 CHSBK7: TST CH%XMT(H) ;INITIATE TRANSMISSION, DON'T ENABLE INTERRUPT
3942 CHSBK5: BIC #%CATEN,(H) ;GO IDLE, CLEAR TRANSMIT INTERRUPT ENABLE
3943 ;HERE TO EXIT FROM CHAOS INTERRUPT. RESTORE REGS AND RETURN FROM INT
3944 CHSBKX: POP <H,D,C,B,A,I>
3947 .IIF NZ CH%WBF-CH%MYN, .ERR FOO CODE ASSUMES CH%WBF = CH%MYN
3949 ;BROADCAST A PACKET FULL OF ROUTING INFO, SINCE WE ARE MORE OR LESS A GATEWAY
3950 CHORUT: MASK 6 ;INHIBIT CLOCK INTERRUPTS SO COSTS DON'T CHANGE
3951 ADD #CH%WBF,H ;ADDRESS WRITE BUFFER
3952 MOV #%CORUT*400,(H) ;OPCODE
3953 MOV #2*<NSUBNT-1>,A ;COUNT SUBNETS WHICH WE KNOW ANYTHING ABOUT (REASONABLE COST)
3955 5$: CMP SBNCST(A),#1000
3957 ADD #4,B ;THIS ONE WILL GENERATE 2 WORDS
3960 MOV B,(H) ;BYTE COUNT
3961 CLR (H) ;DESTINATION
3963 MOV (H),(H) ;SOURCE = CH%MYN
3964 CLR (H) ;SOURCE INDEX
3965 CLR (H) ;PACKET NUMBER
3967 MOV #2*<NSUBNT-1>,A ;GO THROUGH SUBNET TABLES
3968 MOVB 1(H),C ;GET SUBNET THIS IS GOING OUT ON
3970 MOV SBNCST(C),C ;GET COST OF GETTING TO US FROM GUY WHO RECEIVES THIS
3971 10$: CMP SBNCST(A),#1000 ;WAS THIS ONE INCLUDED IN BYTE COUNT?
3972 BHIS 11$ ;NO, DON'T PUT IT IN PACKET
3973 MOV A,B ;FIRST WORD IS SUBNET NUMBER
3976 MOV SBNCST(A),B ;SECOND WORD IS COST
3977 ADD C,B ;WHICH MUST INCLUDE COST OF GETTING TO US
3979 11$: SUB #2,A ;NEXT SUBNET
3981 CLR (H) ;BROADCAST THIS PACKET
3982 SUB #CH%WBF,H ;RESTORE H
3983 CLR CHXRTF(I) ;CLEAR REQUEST FOR ROUTING PACKET
3985 BR CHSBK7 ;FIRE IT OFF, DON'T ENABLE TRANSMIT-DONE INTERRUPT
3987 ;INITIATE TRANSMISSION ON CHAOS INTERFACE
3988 ;CALL WITH SINK NUMBER IN I, AT PI LEVEL OR MASKED. BASHES ALL REGS.
3989 CHSXMT: INC CHOSTS(I) ;SET CHOSTS TO 1, TRANSMIT STARTING
3990 CHSXM0: MOV CHOHWR(I),H ;GET HARDWARE ADDRESS
3991 MOV CHOINX(I),B ;GET SOURCE SUPPLYING THE PACKET
3992 MOV CHIBFP(B),D ;GET PACKET ADDRESS
3993 ADD #CH%WBF,H ;ADDRESS THE WRITE BUFFER
3994 MOV CHILNG(B),C ;GET WORD COUNT
3995 CALL MOVDH ;COPY INTO HARDWARE
3996 MOV CHICBA(B),(H) ;STORE CABLE DESTINATION
3997 SUB #CH%WBF,H ;RESTORE H
3998 TST CH%XMT(H) ;TRIGGER TRANSMISSION
3999 BIS #%CATEN,(H) ;ENABLE DONE INTERRUPT
4000 RET ;PI LEVEL WILL PICK UP OUTPUT
4005 .SBTTL ETHERNET SUPPORT
4007 ;ENABLE NEXT ETHERNET PACKET TO COME IN.
4008 ;SINCE WE ONLY HAVE ONE BUFFER, THIS SETS UP THE TRANSFER RATHER
4009 ;THAN JUST ENABLING THE INTERRUPT AS THE CHAOSNET DOES.
4010 ;THAT WOULDN'T WORK ANYWAY, BECAUSE THE HARDWARE IS SO TOTALLY BRAIN-DAMAGED.
4011 ETHRFL: MOV CHIHWR(I),H
4013 MOV #-<PKTMXW-ETHHDW+1>,(H)+ ;- WORD COUNT, +1 FOR HARDWARE BUG
4014 MOV #ETHIBF+<ETHHDW*2>,(H)+ ;BUFFER ADDRESS
4015 MOV #101,(H) ;START, INTERRUPT-ENABLE
4018 ;INCOMING PUP TOO BIG. WE DON'T HAVE FRAGMENTATION, SO SEND A PUP ERROR REPORT
4019 ETHBIG: MOV #ETHIBF+PKDAT,A ;COPY PUP HEADER INTO DATA FIELD
4021 MOV #ETHIBF+PKDAT+20.,B
4022 .IREPT 10.,< MOV (A)+,(B)+ >
4023 MOV #517.,(B)+ ;PACKET TOO LARGE ERROR
4024 MOV #DATMAX,(B)+ ;MAX NUMBER OF BYTES ALLOWED
4026 5$: MOVB (A)+,(B)+ ;ASCII MESSAGE
4028 INC B ;MESSAGE LENGTH IS EVEN. INCLUDE CHECKSUM IN COUNT.
4029 SUB #ETHIBF+PKDAT,B ;GET PUP LENGTH
4030 MOV B,(C)+ ;BUILD PUP HEADER NOW
4031 MOV #4,(C)+ ;PUP TYPE = ERROR
4032 CMP (C)+,(C)+ ;PUP ID SAME
4033 .IREPT 3,< MOV 6(C),(C)+ > ;DESTINATION = ORIGINAL SOURCE
4034 MOV #<ETHSBN*400+ETHHSN>,(C)+ ;SOURCE = ME
4035 .IREPT 2,< CLR (C)+ > ;SOURCE PORT ZERO
4036 CALL ETHOUT ;TRANSMIT
4039 ;The ascii message. This isn't as destroyed as it looks.
4040 50$: .ASCIZ/UP Pot oalgr eotf tii n ahCoanstep caek.t/
4044 ETHIBK: PUSH <A,B,C,D,H,I>
4047 MOV 14(H),A ;PICK UP STATUS
4048 CLR 14(H) ;CLEAR RECEIVE INTERRUPT ENABLE
4049 CMP ETHIBF+PKDAT-2,#1000 ;TYPE = PUP?
4050 BNE ETHIIX ;NO, IGNORE PACKET
4051 TST 10(H) ;CHECK RESIDUAL WORD COUNT
4052 BEQ ETHBIG ;PACKET TOO BIG, RESPOND WITH PUP ERROR
4053 TST A ;CHECK COMBINED INPUT ERRORS BIT
4054 BMI 70$ ;ERROR, IGNORE PACKET
4055 MOV ETHIBF+PKDAT+10,A ;GET DESTINATION HOST
4056 BEQ 5$ ;AND SEE IF BROADCAST OR SELF
4057 CMP A,#<ETHSBN*400+ETHHSN>
4058 BNE 11$ ;NO, ROUTE AS REGULAR MESSAGE
4059 5$: CMPB ETHIBF+PKDAT+2,#1 ;PUP TYPE = ECHO-ME?
4060 BEQ ETHECO ;YES, ECHO IT (MAYBE TAKE THIS OUT AFTER 11 DEBUGGED)
4061 CMPB ETHIBF+PKDAT+2,#200 ;GATEWAY INFORMATION REQUEST?
4063 TST ETHIBF+PKDAT+12 ;NOT REALLY UNLESS DESTINATION SOCKET IS 2
4065 CMP ETHIBF+PKDAT+14,#2
4067 TST CHISTS+CHXEGT ;PSEUDO DEVICE AVAILABLE?
4069 MOV #ETHIBF+PKDAT+4,A ;YES, SEND HIM SOME INFO
4071 .IREPT 2,< MOV (A)+,(B)+ > ;COPY PUP ID
4072 ADD #6,A ;COPY SOURCE HOST AND SOCKET INTO DESTINATION
4073 .IREPT 3,< MOV (A)+,(B)+ >
4075 MOV #CHXETH,I ;I CLOBBERED BY ETHRT1
4078 10$: TST A ;DON'T HARASS REST OF NET WITH BROADCASTS
4080 11$: MOV #ETHIBF+PKDAT,A ;CHECK THE CHECKSUM
4082 BNE 60$ ;BAD, COUNT AS RAM ERROR
4084 CMP ETHIBF+PKDAT+10,DVRHST ;SEE IF ADDRESSED TO DOVER USER
4086 CMP ETHIBF+PKDAT+14,DVRIDX
4088 CALL DVRPUP ;YES, PROCESS
4093 ;TRANSLATE PUP AND SEND TO CHAOSNET
4094 12$: MOV #ETHIBF,A ;FILL IN CHAOSNET HEADER
4095 MOV #<%COUNC*400>,(A)+ ;PKOP
4096 MOV ETHIBF+PKDAT+0,B ;PKNBYT (TOTAL PUP LENGTH = CHAOS DATA LENGTH)
4097 INC B ;ROUND UP TO AN EVEN NUMBER
4101 MOV ETHIBF+PKDAT+10,(A)+ ;PKDHST
4102 MOV ETHIBF+PKDAT+14,(A)+ ;PKDIND (LOW HALF OF PUP PORT)
4103 MOV ETHIBF+PKDAT+16,(A)+ ;PKSHST
4104 MOV ETHIBF+PKDAT+22,(A)+ ;PKDIND (LOW HALF OF PUP PORT)
4105 MOV ETHIBF+PKDAT+6,(A)+ ;PKPKN (LOW HALF OF PUP ID)
4106 MOV #100001,(A)+ ;PKACN = PROTOCOL NUMBER
4107 CALL CHSIHD ;PROCESS THIS HEADER, GET LENGTH, DEST
4108 BVS ETHIIX ;IGNORE IF NO GOOD
4109 CALL SWAB10 ;SWAB IF NOT GOING TO 10-COMPATIBLE DEST
4110 INC CHISTS(I) ;INDICATE BUFFER READY TO SEND
4111 CALL CHSOUT ;SEND IT OUT
4112 BR ETHINX ;ETHRFL WILL BE CALLED WHEN NECESSARY
4114 60$: ADD #1,NPKSRL-CHXCHS(I) ;COUNT ERRORS (SOFTWARE CHECKSUM)
4115 ADC HPKSRL-CHXCHS(I)
4118 70$: ADD #1,NPKSGB-CHXCHS(I) ;COUNT ERRORS (HARDWARE CHECKSUM)
4119 ADC HPKSGB-CHXCHS(I)
4120 ETHIIX: CALL ETHRFL ;AND READ ANOTHER PACKET
4121 ETHINX: POP <I,H,D,C,B,A>
4124 ;ETHERNET PUP ECHO PROTOCOL
4125 ETHECO: MOV #ETHIBF+PKDAT+10,A ;INTERCHANGE SOURCE AND DESTINATION
4126 MOV A,B ;I DON'T BOTHER CHECKING CHECKSUM, BUT I DO GENERATE IT
4128 .IREPT 3,< MOV (A)+,(B)+ >
4130 MOV #<ETHSBN*400+ETHHSN>,(A) ;FIX SOURCE TO BE ME
4131 INCB ETHIBF+PKDAT+2 ;SET PUP TYPE = 2 (I AM AN ECHO)
4132 CALL ETHOUT ;SEND BACK OUT ON THE ETHERNET
4135 ;GENERAL PURPOSE ROUTINE FOR TRANSMITTING INTERNALLY-GENERATED PUPS TO
4136 ;THE ETHERNET. FIXES THE DESTINATION ADDRESS (THIS IS HOW OTHER
4137 ;HOSTS FIGURE OUT WHAT SUBNET THEY ARE ON!), COMPUTES THE PUP CHECKSUM,
4138 ;AND INTERFACES TO THE PACKET SWITCH. CALLED WITH SOURCE INDEX IN I.
4139 ;CALL THIS WITH A PACKET THAT ALREADY HAS ITS BYTES IN ETHERNET ORDER.
4140 ;BASHES ALL REGISTERS.
4141 ETHOUT: MOV CHIBFP(I),A
4142 ADD #PKDAT,A ;ADDRESS OF PUP
4143 TST 10(A) ;ONLY IF NOT BROADCASTING,
4145 TSTB 11(A) ;DESTINATION ADDRESS HAVE NETWORK NUMBER?
4147 MOVB #ETHSBN,11(A) ;NO, PUT IT IN
4148 10$: CALL PUPCKS ;INSERT CHECKSUM
4154 ;INITIATE TRANSMISSION ON ETHER INTERFACE
4155 ;CALL WITH SINK NUMBER IN I, AT PI LEVEL OR MASKED. BASHES ALL REGS.
4156 ;PACKET IS ALREADY SWABBED INTO ETHERNET BYTE ORDER (REVERSE OF CHAOSNET).
4157 ETHXMT: INC CHOSTS(I) ;SET CHOSTS TO 1, TRANSMIT STARTING
4158 CLR A ;NO OUTPUT START DELAY
4159 ETHXM0: MOV CHOHWR(I),H ;GET HARDWARE ADDRESS
4160 MOV CHOINX(I),B ;GET SOURCE SUPPLYING THE PACKET
4161 MOV CHIBFP(B),D ;GET PACKET ADDRESS
4162 ADD #PKDAT,D ;GET PUP ADDRESS
4163 MOV #1000,-(D) ;SMASH LAST 2 WORDS OF CHAOS HEADER. TYPE=PUP
4164 MOV #ETHHSN,-(D) ;STORE SOURCE ADDRESS
4165 MOVB 14(D),1(D) ;STORE DESTINATION ADDRESS
4166 MOV 4(D),B ;GET PUP SIZE IN BYTES
4167 ADD #5,B ;CONVERT TO WORDS, ALLOW FOR ETHERNET HEADER
4169 NEG B ;HARDWARE WANTS IT NEGATIVE
4170 MOV B,(H)+ ;OUTPUT WORD COUNT
4171 MOV D,(H)+ ;OUTPUT BUFFER ADDRESS
4172 MOV A,2(H) ;OUTPUT START DELAY
4173 MOV #101,(H) ;START OUTPUT, ENABLE INTERRUPT
4174 RET ;PI LEVEL WILL FINISH
4176 ;OUTPUT DONE/ABORTED INTERRUPT
4177 ETHOBK: PUSH <A,B,C,D,H,I>
4180 MOV 4(H),A ;PICK UP STATUS BEFORE WRITING IT
4181 CLR 4(H) ;CLEAR INTERRUPT ENABLE
4182 TST A ;CHECK FOR ERROR
4184 ADD #1,NPKSAB-CHXCHS(I)
4185 ADC HPKSAB-CHXCHS(I)
4186 NEG CHOSTS(I) ;ERROR, ENTER RETRANSMIT MODE
4187 BPL 10$ ;ALREADY RETRANSMITTED ONCE, PUNT
4188 MOV #25.,A ;WAIT 1 MS (DON'T BOTHER BEING RANDOM)
4189 CALL ETHXM0 ;START TRANSMISSION AGAIN
4192 10$: CALL CHSODN ;TRANSMISSION FINISHED
4193 CALL CHSRUN ;FIND MORE WORK TO DO
4196 ;CHECKSUM PUP ADDRESSED BY A. BASHES A,B,C.
4197 PUPCKS: CALL PUPCK1 ;COMPUTE CHECKSUM
4198 MOV B,(A) ;STORE CHECKSUM
4201 ;RETURN 'EQ' IF CHECKSUM MATCHES
4202 PUPCKT: CALL PUPCK1 ;COMPUTE CHECKSUM
4203 CMP (A),#-1 ;PACKET CHECKSUMMED?
4204 BEQ 5$ ;NO, ALWAYS MATCH
4205 CMP B,(A) ;RETURN WITH CC SET FROM NEW AND OLD CKSMS
4208 ;A POINTS AT PACKET, RETURN WITH A -> CHECKSUM AND CHECKSUM IN B. BASH C.
4209 PUPCK1: MOV (A),C ;GET LENGTH
4210 DEC C ;IN WORDS NOT COUNTING CHECKSUM
4212 CLR B ;BUILD CHECKSUM IN B
4213 10$: ADD (A)+,B ;ONE'S COMPLEMENT ADD
4215 BPL 11$ ;TRANSFER SIGN BIT INTO CARRY
4217 11$: ROL B ;AND LEFT CYCLE
4219 INC B ;GRONK MINUS ZERO
4224 ;BROADCAST ETHERNET GATEWAY INFO
4225 ETHRUT: MASK 5 ;ENTER SUITABLE LEVEL FOR HACKING NET
4226 TST CHISTS+CHXEGT ;IS THE PSEUDO SOURCE THAT EMITS THE
4227 BNE 99$ ; PACKET AVAILABLE? IF NOT, PUNT.
4228 CLR CHXRTF+CHXETH ;CLEAR REQUEST FLAG
4230 CLR (A)+ ;PUP ID ZERO
4232 CLR (A)+ ;BROADCAST DESTINATION
4233 CLR (A)+ ;TO SOCKET 2
4235 CALL ETHRT1 ;BUILD AND SEND GATEWAY INFO
4239 BADSBP: .WORD BADSUB ;POINTER INTO BAD SUBNETS
4240 BADSUB: ;SUBNETS THAT SHOULD NOT HAVE INFORMATION SENT
4241 ;ABOUT. THIS LIST MUST BE IN INCREASING ORDER
4242 ;AND MUST END IN 377.
4243 .BYTE 004 ;AI CHAOS 11 pseudo subnet (only AI PDP-10 (RIP) is on this)
4244 .BYTE 010 ;Tech Square LCSnet (unused)
4245 .BYTE 011 ;Tech Square LCS asynchronous line net (IP)
4246 .BYTE 012 ;Tech Square VII LCSnet (IP)
4247 .BYTE 014 ;Symbolics: Los Angeles-Chatsworth land line
4248 .BYTE 020 ;CHAOS MIT IN subnet (ask JNC)
4249 .BYTE 027 ;Experimental asynchronous line net
4250 .BYTE 030 ;Experimental radio broadcast net
4251 .BYTE 040 ;Symbolics: Tech Square-Vassar St. microwave link
4252 .BYTE 041 ;Symbolics: Cambridge-Palo Alto land line
4253 .BYTE 042 ;Symbolics: Palo Alto-Chatsworth land line
4254 .BYTE 047 ;Symbolics: Cambridge-Chatsworth land line
4255 .BYTE 054 ;S-1: 10Mb Ethernet
4256 .BYTE 055 ;S-1: Pronet ring
4257 .BYTE 056 ;S-1: serial line subnet
4258 .BYTE 057 ;S-1: serial line subnet
4259 .BYTE 061 ;Symbolics: Cambridge-Cambridge land line
4260 .BYTE 062 ;Symbolics: Cambridge-Washington land line
4261 .BYTE 064 ;Symbolics: Cambridge-Houston land line
4262 .BYTE 070 ;Symbolics: Chatsworth-Westwood land line
4263 .BYTE 072 ;Atari: Cambridge-MIT land line
4264 .BYTE 073 ;Atari: Cambridge-Sunnyvale land line
4271 ETHRT1: MOV #BADSUB,BADSBP ;INITIAL BAD SUBNET POINTER
4272 MOV #EGTSBN,A ;FILL IN GATEWAY INFORMATION IN THE PUP
4273 CLR I ;I SUBNET*2, A EGTSBN POINTER
4274 10$: ;; FOR EACH SUBNET, .BYTE GATE-NET, TARGET-NET, HOP-COUNT, GATE-HOST
4275 CLR B ;FOR NON-GATEWAY, USE 0 AS GATEWAY ADDRESS
4276 TST SBNTYP(I) ;HARDWARE CONNECTION?
4278 MOV SBNADR(I),B ;NO, GET GATEWAY ADDRESS
4280 bhi 20$ ;dover, as of 1-Dec-83 can't handle more than 60
4281 ;; FILTER OUT KNOWN BAD SUBNETS
4282 CMPB I,@BADSBP ;MAYBE UPDATE POINTER
4283 BHI 115$ ; NO UPDATE NEEDED
4285 115$: CMPB I,@BADSBP ;THIS TIME, CHECK FOR EQUALITY
4288 MOV SBNCST(I),C ;GET COST
4289 CMP C,#1000 ;IF NOT REACHABLE, DON'T PUT IN PACKET
4291 .IREPT 3, ASR C ;DIVIDE BY 8 TO GET APPROXIMATE HOP COUNT
4292 CMP C,#ETHMXH ;DON'T PUT MORE THAN MAXHOPS
4295 12$: MOV I,D ;GET TARGET-NET
4298 MOVB B,(A)+ ;STORE IN WIERD XEROX BYTE ORDER
4302 20$: TST (I)+ ;NEXT SUBNET
4305 SUB #EGTSBN,A ;NUMBER OF DATA BYTES IN PUP
4306 ADD #22.,A ;FOR HEADER AND CHECKSUM
4307 MOV A,EGTPLN ;SET PUP LENGTH
4308 MOV #CHXEGT,I ;SET UP TO TRANSMIT TO ETHERNET
4313 .SBTTL DOVER PROTOCOL TRANSLATOR
4315 ;RFC PACKET IN A. MUST PRESERVE I, AND RETURN 'EQ'.
4316 DVROPN: MOV PKPKN(A),C
4325 ;SET UP DOVER TO TALK TO HOST IN A, INDEX IN B, PKT# IN C, SENDING BACK AN OPN
4326 ;OR SENDING A LOS IF BUSY. MUST WATCH FOR DUPLICATE RFC'S
4327 ;MUST BE CALLED WITH CHAOS AND ETHER INTERRUPTS MASKED
4328 5$: TST DVRHST ;BUSY?
4331 BNE DVRBSY ;YES, TALKING TO ANOTHER HOST
4333 BNE DVRBSY ;YES, TALKING TO ANOTHER GUY SAME HOST
4334 BR 11$ ;DUPLICATE RFC
4336 10$: CLR DVRTIM ;FLUSH TIMEOUT
4339 INC DVRLIX ;ESTABLISH UNIQUE LOCAL INDEX
4341 INC DVRLIX ;DON'T USE 0
4342 11$: CLR DVRMSK ;CLEAR THE BUFFER RING
4343 CLR DVRID ;FIRST PACKET TO SEND TO DOVER IS PACKET 0
4344 INC C ;C := FIRST PACKET ID THAT WILL COME IN FROM CHAOS
4346 MOV #%COOPN*400,B ;SEND AN OPN
4347 BR DVRST1 ;REST IS LIKE STS
4349 DVRBSY: TST DVRPKP ;SPECIAL BUFFER BUSY?
4350 BNE CPOPJ0 ;YES, PUNT
4351 MOV #DVRBF2,C ;SEND A CLS
4352 MOV #%COCLS*400,(C)+
4365 ;HERE TO SEND STS TO GUY CONNECTED TO DOVER
4366 ;MUST BE MASKED AGAINST CHAOS INTERRUPTS
4367 DVRSTS: MOV #%COSTS*400,B
4368 DVRST1: MOV #DVRBF2,A ;USE THIS BUFFER
4369 MOV #4,D ;NUMBER OF BYTES
4372 MOV D,(A)+ ;NUMBER OF BYTES
4373 MOV DVRHST,(A)+ ;DESTINATION HOST
4374 MOV DVRIDX,(A)+ ;DESTINATION INDEX
4375 MOV #CHADD,(A)+ ;SOURCE HOST
4376 MOV DVRLIX,(A)+ ;SOURCE INDEX
4377 CLR (A)+ ;NO PACKET NUMBER
4378 CMP B,#%COLOS*400 ;IF SENDING LOS, PUNT THE REST
4381 DEC B ;LAST PACKET ACKNOWLEDGED BY DOVER
4382 ADD DVROFS,B ;CONVERT TO CHAOSNET ID
4383 MOV B,(A)+ ;ACKNOWLEDGE PACKET NUMBER
4385 MOV #NDVRBF,(A)+ ;WINDOW SIZE
4386 20$: MOV C,DVRPKP ;CAUSE PACKET TO GET SENT
4389 ;HERE TO GET ANOTHER PACKET FROM THE DOVER. THIS CAN BE EITHER A CHAOSNET
4390 ;PACKET TO BE SENT BACK TO THE APPROPRIATE GUY, OR A PUP TO GO TO THE DOVER
4391 DVRRFL: MOV #CHXDVR,I ;THIS MIGHT NOT BE SET UP WHEN CALLED
4392 TST CHISTS(I) ;PACKET SOURCE ONLY EMANATES ONE AT A TIME
4394 CMP CHIBFP(I),DVRPKP ;FINISHED SENDING SPECIAL PACKET?
4396 CLR DVRPKP ;YES, MAKE READY FOR ANOTHER
4397 10$: CLR CHIBFP(I) ;THIS PACKET NO LONGER BEING SENT
4398 MOV DVRPKP,A ;GOT SPECIAL PACKET TO SEND?
4399 BNE 30$ ;YES, SEND IT
4400 TST DVRMSK ;GOT NEXT BUFFER TO SEND TO DOVER?
4402 CMP DVRRTR,#60. ;1-SECOND RETRANSMISSION INTERVAL ELAPSED?
4403 BLO CPOPJ0 ;NO, DON'T SEND YET
4404 CLR DVRRTR ;SENDING, RESET RETRANSMISSION TIMER
4406 BIC #PKFCMS,PKFC(A) ;CLEAR FORWARDING COUNT SINCE SENDING AGAIN
4407 30$: MOV A,CHIBFP(I) ;SEND THIS PACKET
4408 CALL CHSIHD ;ROUTE HIM
4409 BVS DVRRFL ;BAD, IGNORE
4410 CMP B,#CHXCHS ;SWAB IF SENDING TO 10, BUT NOT ETHERNET
4413 35$: INC CHISTS(I) ;INDICATE BUFFER READY TO SEND
4416 ;CALLED WITH A PUP IN ETHIBF WHICH IS FROM THE DOVER AND ADDRESSED
4417 ;TO THE GUY WHO'S TRYING TO PRINT ON IT. MUST BE MASKED AGAINST ETHER & CHAOS INTERRUPTS.
4418 DVRPUP: MOVB ETHIBF+PKDAT+2,B
4419 CMP B,#31 ;EFTP ACKNOWLEDGE?
4421 CMP ETHIBF+PKDAT+6,DVRID ;ACKNOWLEDGING EXPECTED PACKET?
4422 BNE CPOPJ0 ;NO, IGNORE IT
4423 INC DVRID ;YES, ADVANCE ID, POINTER, AND PACKET-PRESENCE MASK
4431 SETOM DVRRTR ;FAKE RETRANSMIT TIMER TO SEND NEXT PUP RIGHT AWAY
4432 TST CHISTS+CHXDVR ;PACKET SOURCE BUSY?
4433 BEQ DVRSTS ;NO, SEND AN ACKNOWLEDGEMENT TO THE CHAOSNET
4436 DVRPP1: MOV #22.,A ;RELATIVE ADDRESS OF ASCII STRING
4437 CMP B,#33 ;EFTP ABORT?
4439 MOV #44.,A ;RELATIVE ADDRESS OF ASCII STRING
4440 CMP B,#4 ;PUP ERROR?
4441 BNE CPOPJ0 ;IGNORE ANYTHING ELSE
4442 DVRERR: CLR DVRMSK ;DON'T SEND ANYTHING MORE TO THE DOVER
4443 MOV ETHIBF+PKDAT,C ;PUP LENGTH
4445 SUB #2,C ;GET LENGTH OF ASCII STRING
4446 ADD #ETHIBF+PKDAT,A ;GET ADDRESS OF ASCII STRING
4447 MOV #DVRBUF+PKDAT,B ;BUILD A LOS PACKET TO SEND BACK
4448 MOV C,D ;SAVE BYTE LENGTH
4453 SWAB (B)+ ;ALTO HAS BYTES IN THE WRONG ORDER
4455 11$: MOV #%COLOS*400,B ;SEND A LOS
4458 CLR DVRHST ;KILL CONNECTION
4461 ;HERE IS A PACKET DIRECTED TO THE DOVER. DO GOOD THINGS WITH IT.
4462 ;NOTE, IT HAS ALREADY BEEN SWABBED INTO ETHERNET BYTE ORDER.
4463 DVRPKT: MOV CHOINX(I),B ;GET SOURCE SUPPLYING THE PACKET
4464 MOV CHIBFP(B),A ;GET ADDRESS OF PACKET
4465 CLR DVRTIM ;FOREIGN HOST IS NOT IDLE
4466 MOVB PKOP(A),B ;DATA PACKET?
4472 CALL DVRSTS ;SNS => STS
4476 BEQ 12$ ;CLS OR LOS PUNTS THE CONNECTION
4482 13$: CMP B,#%COEOF ;NOTE THAT EOF IS TREATED VERY MUCH LIKE DATA!
4483 BNE 90$ ;IGNORE ANYTHING RANDOM
4484 50$: MOV PKPKN(A),B ;GET ID OF DATA PACKET
4486 MOV DVRBFP,D ;FIND WHERE IN THE BUFFER IT GOES
4487 MOV #100000,C ;AND GET MASK BIT FOR IT
4488 SUB DVRID,B ;B := ID RELATIVE TO NEXT EXPECTED
4491 BHIS 90$ ;IGNORE DUPLICATE OR NOT IN WINDOW
4499 53$: BIT C,DVRMSK ;ALREADY HAVE PACKET?
4500 BNE 90$ ;YES, IGNORE
4501 BIS C,DVRMSK ;NO, STORE IT AWAY
4503 ADD #PKDAT,D ;BUILD PUP
4507 ADD #22.,(D)+ ;PUP LENGTH
4508 MOV #30,(D)+ ;PUP TYPE
4509 TST (A) ;WAS THIS DATA OR EOF?
4511 SUB (PC),-2(D) ;EOF, SET PUP TYPE TO 32
4512 54$: CLR (D)+ ;PUP ID HIGH
4513 MOV PKPKN(A),(D) ;PUP ID LOW
4514 SUB DVROFS,(D)+ ; CORRECTED
4515 MOV #DVRADR,(D)+ ;DESTINATION HOST
4516 CLR (D)+ ;DESTINATION SOCKET HIGH
4517 MOV #20,(D)+ ;DESTINATION SOCKET LOW
4518 MOV DVRHST,(D)+ ;SOURCE HOST
4519 CLR (D)+ ;SOURCE SOCKET HIGH
4520 MOV DVRIDX,(D)+ ;SOURCE SOCKET LOW
4523 ASR B ;NUMBER OF DATA WORDS
4524 ;*** TEMPORARY KLUDGE ***
4525 PUSH <A,D,B> ;PUSH B LAST!!
4526 ;*** END TEMPORARY KLUDGE ***
4528 55$: MOV (A)+,(D)+ ;MOVE THE DATA
4532 MOV #<%COUNC*400>,(C) ;PKOP
4534 MOV (A),PKNBYT(C) ;SHOULD BE ENOUGH TO GET IT ROUTED TO ETHERNET
4535 CALL PUPCKS ;STORE APPROPRIATE CHECKSUM
4536 ;*** TEMPORARY KLUDGE ***
4537 POP <B,D,A> ;LOOK FOR SOME KIND OF MACHINE FAILURE
4546 NOP ;PUT A BPT HERE IF YOU LIKE
4548 CLR DVRMSK ;DO IT ALL OVER AGAIN
4550 ;*** END TEMPORARY KLUDGE ***
4551 CALL DVRRFL ;SEND THIS PACKET MAYBE
4553 JMP CHSODN ;THIS PACKET HANDLED
4556 .SBTTL TRAP HANDLING
4558 TRAP14: HALT ;BPT WITH NO RUG IN CORE
4560 TRAP10: BPT ;ILLEGAL INSTRUCTION
4562 TRAP4: NOP ;PATCH BPT HERE IF YOU WANT
4563 CMP (SP),#MAIN ;IF TRAP4 IN MAIN LOOP...
4567 BIT #DLXPRT,DLXCSR ;AND DL10 PORT TURNED OFF
4569 TST DLXOFF ;AND WE THOUGHT IT WAS ON
4571 RESTRT: MOV #STKBAS,SP ;THEN RESTART MAIN LOOP
4572 CLR -(SP) ;WHICH WILL WAIT FOR DL10 PORT TO TURN ON
4576 CRASH: BPT ;OTHERWISE, CRASH
4578 PWRFAL: RESET ;POWER FAIL OR UP - IF FAIL, HALT DURING RESET
4579 MOV #20,B ;WAIT 2 SECONDS TO
4580 1$: CLR A ; MAKE SURE POWER IS REALLY ON
4583 JMP INIT ;POWER SEEMS UP, RESTART PROGRAM
4586 .IFNZ NODDT ;IF NO DDT OR OTHER "OPERATING SYSTEM", SET UP TRAP HANDLERS
4589 .WORD TRAP4,340,TRAP10,340,TRAP14,340,TRAP10,340,PWRFAL,340,TRAP10,340,TRAP10,340
4592 ;ILLEGAL ADDRESS, UNIBUS NXM, STACK OVERFLOW
4596 ;ILLEGAL INSTRUCTION, IOT, EMT
4600 ;POWER FAILURE OR RESTORE
4605 TRAP14: .REPT 7 ;SAVE REGISTERS WHERE CARPET CAN FIND THEM
4606 MOV %0+.RPCNT,BPTACS+<.RPCNT*2>
4614 MOV BPTACS+<.RPCNT*2>,%0+.RPCNT
4618 BPTFLG: 0 ;NON-ZERO IF GOT A BPT
4619 BPTGO: 0 ;NON-ZERO TO PROCEED
4620 BPTACS: .BLKW 7 ;REGS EXCEPT PC
4624 .SBTTL INITIALIZATION
4631 BNE 1$ ;BPT ALREADY SET UP BY RUG
4636 .IFNZ NODDT ;NO OPERATING SYSTEM
4640 SETOM DLXOFF ;REINITIALIZE VARIOUS VARIABLES
4642 .REPT CHAOSP ;IDLE CHAOS NET INTERFACES
4643 CLR CHISTS+CHXCHS+<2*.RPCNT>
4644 CLR CHOSTS+CHXCHS+<2*.RPCNT>
4646 .IIF NZ T300P, CLR RQBACT
4649 76$: MOV NRMIPC(I),TTYIPC(I)
4653 MOV #TYORNG,B ;CLEAR THE TYPOUT-DONE RING
4655 MOV #<NFTTY/2>,A ;GIVE OUTPUT DONE ON ALL LINES
4658 CMP A,#<NFTTY/2>+NCT
4662 ;;; Turn on DM11-BBs
4663 CLR B ;iterated over DM11 units
4665 5$: MOV #DMCLR+DMCSN,@DMCSR(B) ;CLEAR SCANNER MEMORY
4666 2$: BIT #DMBSY,@DMCSR(B)
4668 CLR I ;iterated over modem channels
4669 ;; turn on connected modem channels for one DM11
4670 CLR A ;counter for channels per unit
4674 MOV #LINENB,@DMLSR(B)
4681 ;; treat first-time interrupts differently
4685 6$: MOV #DMSCN+DMIEN,@DMCSR(B) ;enable scanner interrupts
4687 SOB A,6$ ;on all DMs
4689 SOB A,. ;DELAY 50 MILLISECONDS
4690 CLR DMINI ;WHILE P.I. LEVEL GETS INITIAL STATUS
4696 DHINIL: MOV DHSCR(H),A ;DEVICE ADDRESS
4697 MOV #100000,16(A) ;TURN ON SILO MAINTENANCE MODE, SUSPECTED OF
4699 MOV #4000,(A) ;RESET DH11
4700 MOV 16(A),B ;CHECK SILO STATUS
4701 BIC #300,B ;THESE BITS ARE IN RAM & DON'T CLEAR
4702 BEQ DHSWIN ;SHOULD HAVE CLEARED MAINTENANCE MODE AND OTHER CRUD
4704 DHSWIN: MOV #DHRENB+DHTENB,(A) ;NOW ENABLE INTERRUPTS ON DH11
4714 .IIF NZ DTE20P, BEQ 22$ ;NO KBD INT ON KL10 CTY DUE TO KLDCP LOSSAGE
4715 MOV #103,@DLKS(H) ;ACTIVATE KEYBOARD INTERRUPT, D.T.R., READER
4716 22$: MOV #100,@DLPS(H) ;ACTIVATE PRINTER INTERRUPT
4722 ;SET LINE PARAMETERS AND ALLOCATE BUFFERS
4725 10$: MOV LPRVAL(I),A
4734 .IIF Z DTE20P, MOV #100,@#LKS ;NO CLOCK INTERRUPTS IF KLDCP IS HACKING CLOCK TOO
4738 MOV #37774,DLYCNT ;DMA TO BANK 0, 2 USEC DELAY
4739 MOV #%D3BYT,DIAG3 ;DO TO10 TRANSFERS IN BYTE MODE
4740 MOV #MAIN,SADR ;ONLY DO INIT ONCE
4742 .IIF NZ TEN11P, SETOM T11I10 ;CAUSE 10 TO REINITIALIZE TEN-11 CHAOS
4744 MOV CHIHWR+CHXCHS+<2*.RPCNT>,H ;ADDRESS THE INTERFACE
4745 CONC <CMP CH%MYN(H),#CHAD>,\.RPCNT ;CHECK THE HOST NUMBER SWITCHES AGAINST THE PROGRAM
4748 BIS #%CAREN,(H) ;ENABLE CHAOS NET INPUT INT
4751 MOV CHIHWR+CHXETH,H ;ADDRESS THE INTERFACE
4752 MOV 16(H),A ;GET HOST NUMBER SWITCHES
4753 COMB A ;FIX XEROX MISTAKE
4754 CMPB A,#ETHHSN ;CHECK HOST NUMBER SWITCHES
4757 MOV #CHXETH,I ;ENABLE TO RECEIVE FIRST ETHERNET PACKET
4764 .SBTTL GOULD PRINTER BUFFERS
4766 GLPOIP: GLPBFF ;NEXT BUFFER IN AT M.P. LEVEL
4767 GLPOOP: GLPBFF ;NEXT BUFFER OUT AT P.I. LEVEL
4769 .REPT NGLPBF ;ASSEMBLE THE BUFFERS
4771 GLPBFF ;DUE TO PALX BUG, LEAVE .SEE ON NEXT LINE
4781 .SBTTL "TTYTYP" PARAMETER FILE
4784 .BLKW NCT ;DH11 PARAMETER REG
4786 BUFFRS: ;BEGIN ALLOCATING BUFFERS HERE
4788 .IIF NZ NCT, INFORM <BEGINNING OF BUFFERS = >,\BUFFRS
4789 ZZ===<BUFFRS+<NCT*MAXBSZ>+3777>/4000 ;NUMBER OF K USED
4790 .IRP ZZZZ,<0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16>
4791 .LIF EQ ZZ-.IRPCNT ;THIS IS A CRETINOUS CROCK TO GET IT COME OUT IN DECIMAL
4792 INFORM <HIGHEST LOCATION USED = >,\BUFFRS+<NCT*MAXBSZ>,< (>,ZZZZ,<K)>
4795 .IFNZ NCT ;TTYTYP FILE ONLY IF WE HAVE TTYS
4796 .IF P2 ;SPEED UP THE ASSEMBLY
4797 OFF==69105 ;KLUDGES SO I DON'T HAVE TO PUT KEYWORD PARAMETERS INTO PALX
4803 .IIF EQ BAUD-OFF, ZZ==0
4804 .IIF EQ BAUD-50, ZZ==1
4805 .IIF EQ BAUD-75, ZZ==2
4806 .IIF EQ BAUD-110, ZZ==3
4807 .IIF EQ BAUD-134, ZZ==4
4808 .IIF EQ BAUD-150, ZZ==5
4809 .IIF EQ BAUD-200, ZZ==6
4810 .IIF EQ BAUD-300, ZZ==7
4811 .IIF EQ BAUD-600, ZZ==10
4812 .IIF EQ BAUD-1200, ZZ==11
4813 .IIF EQ BAUD-1800, ZZ==12
4814 .IIF EQ BAUD-2400, ZZ==13
4815 .IIF EQ BAUD-4800, ZZ==14
4816 .IIF EQ BAUD-9600, ZZ==15
4817 .IIF EQ BAUD-80K, ZZ==16
4818 .IIF EQ BAUD-40K, ZZ==17
4819 .IIF LT ZZ, .ERROR UNRECOGNIZED SPEED "BAUD"
4822 .MACRO IPARM N,ODFLT,IDFLT,MUMLST
4831 .IIF GE .IRPCNT-2, .MEXIT
4832 .IIF IDN MUMB,S, .IIF EQ .IRPCNT, ZZ==1
4833 .IIF IDN MUMB,P, .IIF EQ .IRPCNT-1, ZZ==ZZ+1
4834 .IIF IDN MUMB,I, .IIF EQ .IRPCNT, ZZ==1
4835 .IIF IDN MUMB,S, .IIF EQ .IRPCNT-1, ZZ==ZZ+1
4837 .IIF EQ ZZ-2, %%.'MUM
4841 .IIF LT %%.SPEED, %%.ISPEED==IDFLT
4842 .IELSE %%.ISPEED==%%.SPEED
4844 .IIF LT %%.SPEED, %%.SPEED==ODFLT
4848 ; BUFFER SIZE IS 1/2 SECOND'S TYPING
4849 ; BUT WILL BE SUBJECT TO LIMIT OF MAXBSZ
4850 .IIF LT ZZ-7, BZZ==5.
4851 .IIF EQ ZZ-7, BZZ==15.
4852 .IIF EQ ZZ-10, BZZ==30.
4853 .IIF EQ ZZ-11, BZZ==60.
4854 .IIF EQ ZZ-12, BZZ==90.
4855 .IIF EQ ZZ-13, BZZ==120.
4856 .IIF EQ ZZ-14, BZZ==240.
4857 .IIF EQ ZZ-15, BZZ==480.
4858 .IIF GT ZZ-15, BZZ==1000.
4859 .=LPRVAL+<2*N> ;ASSEMBLE LINE PARAMETER WORD
4860 .IIF NE ZZ-3, <ZZ*2000>+<IZZ*100>+3 ;ISPEED, OSPEED, NO PARITY, 8 BITS, FULL DUPLEX
4861 .IELSE <ZZ*2000>+<IZZ*100>+3+4 ;110 BAUD EXTRA STOP BIT
4863 BZZ ;ASSEMBLE BUFFER SIZE
4868 ;MACROS USED IN THE TTYTYP FILE:
4870 .MACRO TTDPRT TN,A,B,C,D,E,F,G,H,I,J
4871 IPARM TN,300,300,<A,B,C,D,E,F,G,H,I,J>
4874 .MACRO TTDMRX TN,A,B,C,D,E,F,G,H,I,J
4875 IPARM TN,600,600,<A,B,C,D,E,F,G,H,I,J>
4878 .MACRO TTDTRM TN,A,B,C,D,E,F,G,H,I,J
4879 IPARM TN,1200,1200,<A,B,C,D,E,F,G,H,I,J>
4882 .MACRO TTDLPT TN,A,B,C,D,E,F,G,H,I,J
4883 IPARM TN,9600,9600,<A,B,C,D,E,F,G,H,I,J>
4886 .MACRO TTDLA36 TN,A,B,C,D,E,F,G,H,I,J
4887 IPARM TN,300,300,<A,B,C,D,E,F,G,H,I,J>
4890 .MACRO TTDIML TN,A,B,C,D,E,F,G,H,I,J
4891 IPARM TN,50K,25K,<A,B,C,D,E,F,G,H,I,J>
4894 .MACRO TTDVT TN,A,B,C,D,E,F,G,H,I,J
4895 IPARM TN,9600,9600,<A,B,C,D,E,F,G,H,I,J>
4898 .MACRO TTDTEK TN,A,B,C,D,E,F,G,H,I,J
4899 IPARM TN,1200,1200,<A,B,C,D,E,F,G,H,I,J>
4902 .MACRO TTDLSR TN,A,B,C,D,E,F,G,H,I,J
4903 IPARM TN,2400,2400,<A,B,C,D,E,F,G,H,I,J>
4906 .MACRO TTDDPT TN,A,B,C,D,E,F,G,H,I,J
4907 IPARM TN,2400,2400,<A,B,C,D,E,F,G,H,I,J>
4910 .MACRO TTDGT40 TN,A,B,C,D,E,F,G,H,I,J
4911 IPARM TN,4800,4800,<A,B,C,D,E,F,G,H,I,J>
4914 .MACRO TTDRAY TN,A,B,C,D,E,F,G,H,I,J
4915 IPARM TN,9600,9600,<A,B,C,D,E,F,G,H,I,J>
4918 .MACRO TTDH19 TN,A,B,C,D,E,F,G,H,I,J
4919 IPARM TN,9600,9600,<A,B,C,D,E,F,G,H,I,J>
4922 .MACRO TTD11 TN,A,B,C,D,E,F,G,H,I,J
4923 IPARM TN,4800,4800,<A,B,C,D,E,F,G,H,I,J>
4926 .MACRO TTDRAN TN,A,B,C,D,E,F,G,H,I,J
4927 IPARM TN,FOO,FOO,<A,B,C,D,E,F,G,H,I,J>
4930 .MACRO TTDTV TN,A,B,C,D,E,F,G,H,I,J
4931 IPARM TN,FOO,FOO,<A,B,C,D,E,F,G,H,I,J>
4934 .MACRO TTDGRN TN,A,B,C,D,E,F,G,H,I,J
4935 IPARM TN,9600,9600,<A,B,C,D,E,F,G,H,I,J>
4938 .MACRO TTDSTY TN,A,B,C,D,E,F,G,H,I,J
4939 IPARM TN,FOO,FOO,<A,B,C,D,E,F,G,H,I,J>
4947 NSTTYS==0 ;WE'RE NOT INTERESTED IN PSEUDO-TTYS
4948 N11TYS==0 ;NOR IN PDP11 TVS
4950 .INSRT SYSTEM;TTYTYP >
4952 .EXPUNGE ZZ,IZZ,IZZZ,BZZ,OFF,40K,80K,%%.ISPEED,%%.SPEED
4953 .EXPUNGE TT,TY,TO,TP,TCT,HOR,VER,ROL,SPEED,ISPEED