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 CHAD0==3072 ;Change these two around because subnet 1 is dying of old age.
184 CHAD1==426 ;Note that with current code AI-11 can only do DOVER on CHAD0!!
185 TEN11P==0 ;USES TEN-11 INTERFACE FOR CHAOS NET TO AI-10 (NOT ANY MORE!)
186 T11ADR==2026 ;CHAOSNET ADDRESS OF PDP10 CONNECTED VIA TEN-11 INTERFACE (AI)
187 NT11BF==3 ;THREE BUFFERS IN EACH DIRECTION FOR TEN-11 INTERFACE
189 ETHHSN==6 ;MY HOST NUMBER BYTE, JNC SAYS I SHOULD USE 6
190 NDVRBF==6 ;6 DOVER BUFFERS
191 DVRADR==1002 ;PUP ADDRESS OF DOVER
192 FTPULS==0 ;INITIALLY, AI DOES NOT GENERATE TEST PACKETS
193 FTGARB==1 ;DON'T SAVE LAST GARBAGE PACKET RECEIVED (LOW ON CORE) (not that low)
194 MAXBSZ==250. ;MAXIMUM TYPEOUT BUFFER SIZE
195 .MACRO ASPIRP BODY ;DEFINE LINE NUMBERS WITH AUTOSPEED
199 .IIF NDF NDHS, .ERROR MACHINE NAME NOT RECOGNIZED
201 .IIF NZ DL10P, .IIF Z NFTTY, .ERROR TTY # 0 DOESN'T WORK WITH DL10 PROTOCOL
203 ;ASSIGN TTY INDICES, HARDWARE INDICES, ETC.
206 HX==0 ;HARDWARE INDEX
207 NCT==0 ;NUMBER OF TTYS
209 ;SYSTEM CONSOLE (OUT OF ORDER)
220 NLDHHX==HX-2 ;UNITS 0-NLDHHX INCLUSIVE ARE DH11S
222 TX==TX-<2*NDHUN> ;COMPENSATE FOR UNUSED LINES
223 NLDHTY==TX-2 ;LAST DH11 LINE INCLUSIVE
229 TX==TX+<2*NDLS>-<2*CTYP>
241 NLTTY==NFTTY+<2*NCT> ;2 * # OF FIRST TTY NOT THIS 11
242 LASTTY==NLTTY-2 ;LAST VALID TTY INDEX
244 .IFNZ NDMS ;DM11-BB MODEM SCANNER
246 ;1.1-1.4 MODEM CHANNEL #
247 DMBSY==20 ;1.5 SCAN BUSY (R.O.)
248 DMSCN==40 ;1.6 SCANNER ON
249 DMIEN==100 ;1.7 INTERRUPT ENABLE
250 DMDON==200 ;1.8 DONE - SCANNER HAS FOUND SOMETHING
251 DMSTP==400 ;1.9 STEP SCANNER TO NEXT LINE (W.O.) 1.2 USEC.
252 ;2.1 MAINTENANCE MODE
253 DMCLR==2000 ;2.2 CLEAR RTS, DTR, SEC TX, LINE EN FOR ALL LINES (W.O.)
254 DMCSN==4000 ;2.3 CLEAR SCAN - CLEAR CSR AND MODEM STATUS MEMORY (W.O.) 19 USEC
255 DM2RX==10000 ;2.4 SECONDARY RECIEVE CHANGED ON SELECTED MODEM (R.O.)
256 DMCTS==20000 ;2.5 CLEAR TO SEND CHANGED ON SELECTED MODEM (R.O.)
257 DMCAR==40000 ;2.6 CARRIER DETECT CHANGED ON SELECTED MODEM (R.O.)
258 DMRNG==100000 ;2.7 RING CHANGED ON SELECTED MODEM (R.O.)
260 LINENB==1 ;1.1 ENABLE SCANNING OF LINE
261 LINDTR==2 ;1.2 DATA TERMINAL READY
262 LINRQS==4 ;1.3 REQUEST TO SEND (FORCE BUSY ON 103E)
263 LIN2TX==10 ;1.4 SECONDARY TRANSMIT
264 LIN2RX==20 ;1.5 SECONDARY RECEIVE (R.O.)
265 LINCTS==40 ;1.6 CLEAR TO SEND (R.O.)
266 LINCAR==100 ;1.7 CARRIER DETECT (R.O.)
267 LINRNG==200 ;1.8 RING (R.O.)
270 ; KW11-L LINE FREQ CLOCK
272 LKS=177546 ;1.8 CLOCK FLAG
274 HNGDLY==3*60. ;CLEAR TO SEND OFF FOR 3 SECONDS => HANGUP
277 ;DEFINITIONS FOR GOULD LPT
279 GLPCSR=166000 ;COMMAND STATUS REGISTER (NONSTANDARD)
281 %GCFF==0 ;TOP-OF-FORM COMMAND
282 %GCGRF==1 ;GRAPHIC MODE COMMAND
283 %GCCUT==2 ;CUT COMMAND (NO CUTTER ON THIS MACHINE, THOUGH)
284 %GCON==3 ;TURN PRINTER ON
285 %GCOFF==4 ;TURN PRINTER OFF
286 %GCLSL==5 ;LAST LINE (GRAPHIC MODE). => 2 MORE SCAN LINES.
287 %GCION==6 ;INTERRUPT ON
288 %GCIOF==7 ;INTERRUPT OFF
289 %GCADV==201 ;ADVANCE ONE LINE
291 %GSNRD==400 ;NOT READY
292 %GSDON==2000 ;TRANSFER COMPLETE
294 %GSVAC==10000 ;VACUUM FAULT
295 %GSPAP==20000 ;PAPER LOW
296 %GSTIM==40000 ;TIMEOUT
297 %GSERR==50400 ;ALL ERROR BITS
299 GLPWC=166002 ;NEGATIVE WORD COUNT REG
301 GLPCA=166004 ;CURRENT ADDRESS REG
303 GLPBSZ==132. ;BUFFER SIZE (# CHARS PER LINE)
305 NGLPBF==7 ;NUMBER OF BUFFERS
306 GB.STA==0 ;BUFFER STATE - DON'T CHANGE ORDER OF %GB CODES
308 %GBMP==2 ;2 ACTIVE AT M.P. LEVEL
309 %GBWRT==4 ;4 IN WRITE QUEUE
310 %GBPI==6 ;6 ACTIVE AT P.I. LEVEL
311 %GBDMA==8 ;8 ACTIVE AT D.M.A. LEVEL
312 GB.NXT==2 ;CIRC POINTER TO NEXT BUFFER
313 GB.FF==4 ;IF NON-ZERO, FF BEFORE THIS BUFFER
314 GB.NL==6 ;NUMBER OF BLANK LINES BEFORE THIS BUFFER
315 GB.PNT==10 ;-> NEXT BYTE TO INSERT
316 GB.DAT==12 ;DATA BEGINS HERE
317 GB.LEN==GB.DAT+GLPBSZ ;TOTAL NUMBER OF BYTES PER BUFFER
322 ;DEFINITIONS OF CHAOS NET HARDWARE
324 ;USUAL ADDRESS IS 764140 . USUAL INTERRUPT VECTOR IS 270 .
326 CAICSR=164140 ;COMMAND STATUS REG
328 %CABSY==1 ;0 XMT BUSY (RO)
329 %CALUP==2 ;1 LOOP BACK (R/W)
330 %CASPY==4 ;2 RECIEVE MSGS FOR ANY DESTINATION (R/W)
331 %CARCL==10 ;3 CLEAR THE RECEIVER, IT CAN NOW GOBBLE ANOTHER MSG (WO)
332 %CAREN==20 ;4 RCV INT ENB (R/W)
333 %CATEN==40 ;5 XMT INT ENB (R/W)
334 %CATAB==100 ;6 TRANSMIT ABORTED BY ETHER CONFLICT (RO)
335 %CATDN==200 ;7 TRANSMIT DONE. SET WHEN TRANSMITTER IS DONE
336 %CATCL==400 ;8 CLEAR THE TRANSMITTER, MAKING IT READY (WO)
337 ;9-12 LOST COUNT (RO) [# MSGS RCVED WITH RCV BFR FULL]
338 ; WHEN MSG IS WAITING IN BUFFER, THIS COUNTS
339 ; THE MESSAGES THAT MATCHED OUR DESTINATION OR
340 ; WERE BROADCAST, BUT COULDN'T BE RECIEVED.
341 ; WHEN RECEIVER IS RE-ENABLED (WRITE 1 INTO %CARDN)
342 ; THE COUNT IS THEN CLEARED.
343 ; WHEN A MESSAGE IS LOST, RECEIVER ZAPS ETHER
344 ; SO TRANSMITTER WILL ABORT (IF MESSAGE WAS DESTINED
346 %CARST==20000 ;13 I/O RESET (WO)
347 %CAERR==40000 ;14 CRC ERROR (RO)
348 %CARDN==100000 ;15 RCV DONE.
350 CAIMYN=164142 ;MY # (READ ONLY)
351 CH%MYN==2 ;RETURNS THE [SOURCE] HOST# OF THIS INTERFACE.
353 CAIWBF=164142 ;WRITE BUFFER (WRITE ONLY)
354 CH%WBF==2 ;FIRST WAIT FOR TDONE. (OR SET IT VIA CSR)
355 ;FIRST WORD IN RESETS TRANSMITTER AND CLEARS TDONE.
356 ;STORE INTO THIS REGISTER TO WRITE WORDS OF MESSAGE,
357 ;LAST WORD IN IS DESTINATION ADDRESS, THEN READ CAIXMT.
358 ;SOURCE ADDRESS AND CHECK WORD PUT IN BY HARDWARE.
360 CAIRBF=164144 ;READ BUFFER (READ ONLY)
361 CH%RBF==4 ;THE FIRST WORD READ WILL BE FILLED TO THE LEFT
362 ;TO MAKE THE MESSAGE RECIEVED A MULTIPLE OF 16 BITS.
363 ;IF THE NUMBER OF DATA BITS IN THE MESSAGE WAS A
364 ;MULTIPLE OF 16, THIS WORD WILL BE THE FIRST WORD PUT
365 ;INTO THE BUFFER BY THE TRANSMITTING HOST.
366 ;THE LAST 3 WORDS READ ARE DESTINATION, SOURCE, CHECK.
368 CAIRBC=164146 ;RECEIVE BIT COUNTER (READ ONLY)
369 CH%RBC==6 ;WHEN A MESSAGE HAS BEEN RECEIVED THIS IS ONE LESS THAN
370 ;THE NUMBER OF BITS IN THE MESSAGE (16 X THE
371 ;NUMBER OF WORDS INCLUDING THE THREE OVERHEAD WORDS.)
372 ;AFTER THE LAST WORD (THE CRC WORD) HAS BEEN READ, IT IS 7777
373 ;BITS 10 AND 11 ARE THE HIGH ORDER BITS, AND IF THEY ARE ONE,
374 ;THEN THERE WAS A BUFFER OVERFLOW
376 CAIXMT=164152 ;READING THIS INITIATES TRANSMISSION (!!)
377 CH%XMT==12 ;THE VALUE READ IS ONE'S OWN HOST#.
379 ;REFERENCING ADDRESSES IN THE GROUP OF 8 WORDS NOT LISTED HERE, OR
380 ;USING COMBINATIONS OF READ/WRITE NOT LISTED HERE, WILL TYPICALLY CAUSE
381 ;STRANGE AND BIZARRE EFFECTS.
384 ;THESE ARE FOR 4K PACKET BUFFERS AND FOR THE ORIGINAL CHAOSNET PROTOCOL
386 PKMAX==256. ;MAXIMUM LENGTH OF PACKET (INCLUDING ALL HARDWARE WORDS)
387 DATMAX==488. ;MAXIMUM NUMBER OF DATA BYTES
388 PKHDW==8 ;NUMBER OF HEADER WORDS
389 PKTMXW==<DATMAX/2>+PKHDW ;MAX WORDS THROUGH PACKET SWITCH (SEE MOVDH ETC.)
391 PKOP==1 ;BYTE INDEX OF THE OPCODE OF THE PACKET
402 PKNBYT==2 ;WORD INDEX OF NUMBER OF BYTES IN PACKET
403 PKNBMS==170000 ;MASK FOR THE NUMBER OF BYTES
404 PKFC==2 ;WORD INDEX FOR THE FORWARD COUNT
405 PKFCMS==7777 ;IT IS THE TOP 4 BITS
406 PKDHST==4 ;DESTINATION HOST
407 PKDIND==6 ; " " " INDEX
408 PKSHST==10 ;SOURCE HOST
409 PKSIND==12 ;SOURCE INDEX
410 PKPKN==14 ;THE PACKET NUMBER
411 PKACN==16 ;THE ACK PACKET NUMBER
412 PKDAT==20 ;THE START OF THE DATA
438 ZZ===%COMPAT ;DON'T CARE WHETHER .+2 OR .+4 GETS STORED
457 .MACRO T TAG ;usage is T TAG: <crlf> STMNT
463 .MACRO CONC A,B,C,D,E,F,G
467 .MACRO INFORM A,B,C,D,E,F,G
469 .PRINT /A'B'C'D'E'F'G
487 .SBTTL DL10 CONTROL AREA
492 DLXCSR: W ;DL10 11-SIDE CONTROL & STATUS REG
494 DLXIEN==4 ;1.3 ENABLE DLX11I TO INTERRUPT
495 DLXEEN==10 ;1.4 ENABLE ERRORS TO INTERRUPT
497 DLXPRT==40 ;1.6 PORT ENABLE (R.O.)
498 DLXZWC==100 ;1.7 CLEAR DLXWCO (W.O.)
499 DLXWCO==200 ;1.8 WORD COUNT OVERFLOW
500 DLXZPA==400 ;1.9 CLEAR DLXPAR (W.O.)
501 DLXPAR==1000 ;2.1 PAR ERR IN 10 MEM
502 DLXZNX==2000 ;2.2 CLEAR DLXNXM (W.O.)
503 DLXNXM==4000 ;2.3 NXM IN 10 MEM
504 DLXZ10==10000 ;2.4 CLEAR DLX10I (W.O.)
505 DLX10I==20000 ;2.5 INTERRUPT PDP10
506 DLXZ11==40000 ;2.6 CLEAR DLX11I (W.O.)
507 DLX11I==100000 ;2.7 INTERRUPT PDP11
509 VERS: W ;.BYTE FIRST LINE, # OF LINES
510 ;SET BY -10. USED TO CHECK CONSISTENCY.
512 DLXUP: W ;CHECK FOR UP-NESS IN BOTH DIRECTIONS
513 ;INCREMENTED BY 11 EVERY 1/60 SECOND, SETOM'ED BY 10 EVERY 1/2 SEC.
515 TTYST: W ;LINE# TO START OUTPUT ON (I.E. SET OUTPUT DONE)
516 ;SET BY 10, CLEARED BY 11
518 TYILIN: W ;TYPEIN STATUS WORD - LINE NUMBER
519 ;SET BY 11, CLEARED BY 10 - INTERRUPTS 10
520 TYICHR: W ;TYPEIN CHARACTER - GOES WITH PRECEDING WORD
522 TYOSTS: W ;STATUS WORD (OUTPUT DONE LINE #)
523 ;SET BY 11, CLEARED BY 10 - INTERRUPTS 10
524 TYOBSZ: W ;BUFFER SIZE FOR LINE WITH OUTPUT DINE (SET BY 11)
526 TYOPNT: W ;BUFFER POINTER FOR TTY OUTPUT
528 TYOCNT: W ;BUFFER LENGTH FOR TTY OUTPUT
530 TYOLIN: W ;LINE NUMBER FOR TTY OUTPUT
531 ;SET BY 10, CLEARED BY 11
533 HNGLIN: W ;0000NN - LINE # NN HUNG UP
534 ;01RTNN - LINE # NN HAS SPEED RCV=R, XMT=T (SEE TTYTYP FOR CODES)
535 ;SET BY 11, CLEARED BY 10 - INTERRUPTS 10
537 LPRLIN: W ;LINE NUMBER FOR SETTING LINE PARAMETERS
538 ;SET BY 10, CLEARED BY 11
539 LPRLPR: W ;DH11 LPR REGISTER FOR SETTING LINE PARAMETERS
541 LPRBSZ: W ;BUFFER SIZE FOR SETTING LINE PARAMETERS
544 EXDSTS: W ;STATUS WORD (EXAMINE/DEPOSIT 11 CORE)
545 ;1 = EXAMINE, 2 = DEPOSIT
546 ;SET BY 10, CLEARED BY 11
547 EXDADR: W ;ADDRESS FOR ABOVE
549 EXDDAT: W ;DATA WORD FOR ABOVE
550 ;SET BY 10 (DEPOSIT) OR 11 (EXAMINE)
552 GLPPTR: W ;BUFFER POINTER FOR GOULD OUTPUT
553 GLPCTR: W ;NUMBER OF BYTES YET TO BE GOBBLED
554 GLPTER: W ;ERROR STATUS, SET BY 11
555 GLPGRF: W ;GRAPHIC MODE IF NON-ZERO, SET BY 10
557 ;CHAOS NET SHARED VARIABLES
558 DLCINI: W ;WHEN THIS IS NON-ZERO, 11 RESETS ITS POINTERS AND CLEARS IT
559 DLCSP1: W ;SEND PACKET 1 (ILDB POINTER)
560 DLCSP2: W ;SEND PACKET 2
561 DLCSS1: W ;SEND STATE 1 (0 IDLE, 1 TO 11, 2 OUTPUT DONE)
562 DLCSS2: W ;SEND STATE 2
563 DLCRP1: W ;RECEIVE PACKET 1 (ILDB POINTER)
564 DLCRP2: W ;RECEIVE PACKET 2
565 DLCRS1: W ;RECEIVE STATE 1 (0 IDLE, 1 READY FOR INPUT FROM 11, 2 INPUT DONE)
566 DLCRS2: W ;RECEIVE STATE 2
568 ;^ ADD MORE HERE, E.G. IMP
571 ;DISK AREA. 14. WORDS 48. WORDS INTO THE DL-10 AREA.
574 DSCCHK: W ;MUST BE 2561 OCTAL TO MAKE SURE WE HAVE CORRECT PDP-10 PROGRAM
575 DSCREQ: W ;0 MEANS NO REQUEST. NON-ZERO MEANS 10 HAS PENDING REQUEST TO 11.
576 DSCDON: W ;0 MEANS NOT DONE, NON-ZERO MEANS 11 IS TELLING 10 IT'S DONE.
577 ;NEXT 2 WORDS WRITTEN BY 11 TO TELL STATUS OF OPERATION
578 DSCFLT: W ;0 NO FAULT
579 %DFRST==100000 ; BIT 15=POWER CYCLED OR UNIBUS HUNG, SO CONTROLLER WAS RESET
580 ; BIT 12=Q ERROR, BIT 11=CMD NXM, BIT 10=CMD PAR
581 ; IF ONE OF THESE BITS IS ON, BITS 1-0 AND DSCSTS ARE THE ERROR ADDRESS
582 ; BITS 7-0 SYSTEM FAULT CODE IF LEFT BYTE IS ZERO
583 ; SEE THE 2561 OEM MANUAL FOR MEANING OF FAULT CODES
584 DSCSTS: W ;STATUS FROM 2561:
585 %DSRTR==100000 ;COMMAND WAS RETRIED
586 %DSECH==40000 ;UNCORRECTABLE DATA ERROR (ECC HARD)
587 %DSECC==20000 ;CORRECTED DATA ERROR
588 %DSIDE==10000 ;ID ERROR
589 %DSHCE==4000 ;ADDRESS ERROR (HEADER COMPARE ERROR)
590 %DSPRT==2000 ;WRITE-PROTECT STATUS OF SECTOR (ABORTS WRITE COMMAND)
591 %DSALT==1000 ;ALTERNATE-SECTOR STATUS (ABORTS READ, WRITE, AND CHECK)
592 %DSOVR==400 ;FIFO OVER-RUN, NOT CORRECTED BY 1 RETRY
593 %DSSKE==200 ;SEEK ERROR FROM DRIVE
594 %DSOFL==100 ;DRIVE OFF-LINE OR FAULT
595 %DSFLT==20 ;DRIVE FAULT
596 %DSNXM==10 ;NXM ON PDP11 MEMORY
597 %DSPAR==4 ;PARITY ERROR IN PDP11 MEMORY
598 %DSSFL==2 ;SYSTEM FAULT, SEE LOW BYTE OF DSCFLT
599 %DSWLK==1 ;DRIVE WRITE-LOCKED, WRITE ABORTED
601 ;FOLLOWING WORDS ARE WRITTEN BY 10 TO TELL WHAT TO DO
602 DSCCMD: W ;COMMAND OPCODE:
603 ;%DMNOP==0 ;DO NOTHING
604 ;%DMCST==1 ;READ OUT CONTROLLER STATE (NOT USEFUL SINCE NOT RETURNED TO 10)
605 %DMSNS==2 ;SENSE DRIVE STATE. DSCSTS GETS CODE FOR DRIVE TYPE IN
606 ; BITS 14-8 (10 FOR T-300), AND %DSWLK, %DSFLT, %DSOFL, %DSSKE
607 %DMTST==3 ;TEST SPECIFIED DRIVE (RUNS DIAGNOSTICS)
608 %DMREC==4 ;RECALIBRATE
610 %DMWRT==6 ;WRITE DATA
611 ;%DMFMT==7 ;WRITE FORMAT
612 ;%DMPWT==10 ;WRITE AND SET WRITE-PROTECT BIT
613 ;%DMAWT==11 ;WRITE AND SET ALTERNATE-SECTOR BIT
614 ;%DMCHK==12 ;READ AND CHECK ECC BUT DON'T STORE DATA
615 ;%DMLWT==14 ;LONG WRITE, WILL WRITE ECC AS WELL AS DATA
616 %DMRED==20 ;READ DATA. ADD 1-10 FOR VARIOUS RECOVERY FEATURES AS
617 ; DOCUMENTED IN THE 2561 OEM MANUAL.
618 ;%DMRID==40 ;READ IF FIELD, NOT USEFUL SINCE NOT RETURNED TO 10
619 DSCDRV: W ;UNIT NUMBER
620 DSCCYL: W ;CYLINDER ADDRESS (THESE ARE COPIED BACK BY THE 11 IN CASE OF ERROR)
621 DSCHED: W ;HEAD ADDRESS
622 DSCSEC: W ;SECTOR ADDRESS
623 ;WORD COUNT IS ALWAYS 12.*256.
624 ;IF WE PUT IN SEEK-OVERLAP AN ATTENTION FEATURE WILL BE NEEDED
625 ;THAT WOULD ALSO BE USED FOR DISK POWER-UP SIGNALLING
626 ;THESE WORDS ARE SET UP BY THE 10 AS BYTE-POINTERS TO THE DATA
627 ;TO BE TRANSFERRED. EACH BYTE POINTER CAN TRANSFER AT MOST 256 PDP10 WORDS
628 ;DUE TO BRAIN-DAMAGE IN THE DL10, SO THERE ARE 4 OF THEM
636 .SBTTL DTE20 CONTROL AREA
638 ;LOCATIONS 400-437 ARE JUST BETWEEN US AND ITS
639 ;LOCATIONS 440-457 ARE KNOWN ABOUT BY KLDCP ALSO
641 ;EPTDDT==441 ;START ADDRESS OF PDP10 NON TIME SHARING DDT
642 DTEFLG==444 ;NON TIME SHARING TYPEIN/TYPEOUT DONE FLAG (SET BY 11, CLEARED BY 10)
643 DTEF11==450 ;USED BY NON TIMESHARING TYPEIN COMMAND TO RETURN THE CHAR (SET BY 11)
644 DTECMD==451 ;NON TIME SHARING COMMAND (SET BY 10)
645 ;COMMANDS THAT CAN GO IN DTECMD:
646 ;0-377 CHAR TO BE TYPED OUT
647 %DTTYI==3400 ;TYPE IN, CHAR RETURNED IN DTEF11
648 %DTCLN==1001 ;60 CYCLE CLOCK ON
649 %DTCLF==1000 ;60 CYCLE CLOCK OFF
650 ;THERE ARE MILLIONS OF OTHERS, BUT WHO NEEDS 'EM?
651 DTECLK==445 ;60 CYCLE CLOCK FLAG (SET BY 11, CLEARED BY 10)
652 ;DTESWR==457 ;SIMULATED SWITCH REGISTER (SET BY 11)
654 ;THE FOLLOWING LOCATIONS ARE ONLY USED IN TIME SHARING AND NOT KNOWN ABOUT BY KLDCP
656 DTEVER==400 ;I/O VERSION NUMBER. .BYTE FIRST LINE, NUMBER OF LINES.
657 ;SET BY 10, CHECKED BY 11
659 DTECHK==401 ;INCREMENTED BY 11 60 TIMES PER SECOND, SETOMED BY 10 EVERY 1/2 SECOND
660 ;USED TO CHECK THAT 10 IS GETTING INTERRUPTS OK
662 DTEINP==402 ;CONTROLS "BYTE TRANSFERS" FROM 11 TO 10 (INPUT DIRECTION).
663 ;SET BY 10 TO REQUEST A TRANSFER, SETOM'ED BY 11 WHEN XFER COMPLETE.
664 ;10 SHOULD SET UP DTEBPI IN EPT AND DO DATAO DTE, BEFORE SETTING DTEINP.
665 ;SEE COMMENTS BELOW DTEOUT FOR WHAT GOES IN DTEINP.
666 DTEOUT==403 ;CONTROLS "BYTE TRANSFERS" FROM 10 TO 11 (OUTPUT DIRECTION).
667 ;SET BY 10 TO REQUEST A TRANSFER, SETOM'ED BY 11 WHEN TRANSFER STARTS.
668 ;EACH SIDE KNOWS WHEN TRANSFER IS IN PROGRESS, DOESN'T TRY TO START
669 ; ANOTHER UNTIL IT HAS RECEIVED HARDWARE TRANSFER-DONE INTERRUPT.
670 ;10 SHOULD SET UP DTEBPO IN EPT BEFORE SETTING DTEOUT.
671 ;RH IS #BYTES EXPECTED, LH IS COMMAND+LINE#. COMMANDS ARE:
672 %DTTYO==1000 ;TELETYPE OUTPUT
673 ;%DTETI==2000 ;ETHERNET INPUT
674 ;%DTETO==3000 ;ETHERNET OUTPUT
675 ;^ ADD MORE COMMANDS HERE. NOTE: THE 4.1 BIT IS 1 FOR OUTPUT, 0 FOR INPUT.
677 DTELSP==404 ;LINE# TO SET SPEED OF (SET BY 10, SETOMED BY 11)
678 DTELPR==405 ;DH11 LINE-PARAMETER-REGISTER,,BUFFER SIZE
680 DTEOST==406 ;LINE# TO START OUTPUT ON (SET OUTPUT DONE). (SET BY 10, SETOMED BY 11)
684 DTETYI==410 ;TELETYPE INPUT
685 ;LH=LINE#, RH=CHAR RECEIVED. (SET BY 11, SETOM'ED BY 10)
687 DTEODN==411 ;TELETYPE OUTPUT DONE
688 ;LH=LINE#, RH=BUFFER SIZE. (SET BY 11, SETOM'ED BY 10)
690 DTEHNG==412 ;HANGUP/DIALIN WORD (SET BY 11, SETOM'ED BY 10)
691 ;0000NN - LINE # NN HUNG UP
692 ;01RTNN - LINE # NN HAS SPEED RCV=R, XMT=T (SEE TTYTYP FOR CODES)
694 ;^ ADD MORE HERE, NOT TO EXCEED LOCATION 437
697 ;IOELEVEN RESIDES IN THE BOTTOM 14K OF THE CONSOLE PDP11, ALONG WITH 11DDT.
698 ;I.E. LOCATIONS 0-70000. BE SURE TO USE .;11DDT 14K VERSION OF DDT.
699 ;THE UPPER 14K CONTAIN KLDCP. THE FOLLOWING CALLS TO KLDCP ARE USED.
700 ;THEY RETURN WITH C-BIT SET IF THEY LOSE (MICROCODE HUNG).
702 ;NOTE: KLDCP ENJOYS CLOBBERING REGISTER 0 (A). I DON'T
703 ;KNOW IF ALL THESE CALLS DO, BUT WE'LL ASSUME THAT THEY DO.
705 TENSW=EMT!145 ;UPDATE LOCATION DTESWR FROM THE SWITCHES
707 EXAM=EMT!103 ;EXAMINE PDP10 MEMORY
708 ;BEFORE CALL, REGISTER A HAS ADDRESS OF 3 BYTES CONTAINING PDP10 ADDRESS (LOW BITS FIRST)
709 ;AFTER CALL, REGISTER A HAS ADDRESS OF 3 WORDS CONTAINING CONTENTS (LOW BITS FIRST)
711 EXAMT=EMT!104 ;EXAMINE PDP10 MEMORY
713 ;.WORD ADDRESS OF 3-WORD DATA BLOCK
715 DPOS=EMT!105 ;DEPOSIT PDP10 MEMORY
716 ;BEFORE CALL, REGISTER A HAS ADDRESS OF 3 WORDS CONTAINING CONTENTS
717 ;AND REGISTER B HAS ADDRESS OF 3 BYTES CONTAINING ADDRESS
719 DPOST=EMT!106 ;DEPOSIT PDP10 MEMORY
721 ;.WORD ADDRESS OF 3-WORD DATA BLOCK
723 D10MON=EMT!111 ;DEPOSIT PDP10 MEMORY, -1
726 $PMSG=EMT!25 ;PRINT MESSAGE ON TTY
727 ;.WORD ADDRESS OF ASCIZ MESSAGE
729 $CNTLC=100004 ;JUMP HERE TO "CONTROL C" BACK TO KLDCP
731 ;WHEN KLDCP IS IDLE, AND IN "ITS MODE", IT DOES JSR PC,3000
732 ;WHICH CALLS IOELEVEN'S MAIN PROGRAM. RETURN WITH "C" SET
733 ;TO READ AND EXECUTE ONE KLDCP COMMAND LINE. RETURN WITH "C"
734 ;CLEAR TO PRINT KL10 HALTED OR CLOCK ERROR STOP MESSAGE.
735 ;LOCATIONS 3004, 3006 MUST CONTAIN .RAD50/IOELEV/
736 ;IOELEV WILL RUN ON KLDCP'S STACK.
738 ;INFORMATION ABOUT THE DTE20.
739 ;EXCEPT FOR BYTE TRANSFER, WE USE THE TIME-TESTED SUBROUTINES PROVIDED BY KLDCP.
741 ;THE INTERRUPT VECTOR IS AT 774, BUT WE CAN'T USE IT BECAUSE WOULD HAVE
742 ;TO COORDINATE THINGS WITH KLDCP, WHICH IS OBVIOUSLY IMPOSSIBLE.
744 DLYCNT=174400 ;2.6-2.7 UNIBUS ADDRESS EXTENSION FOR BYTE TRANSFER DMA
745 ;1.1-2.5 14-BIT 2'S COMPLEMENT OF NUMBER OF HALF-MICROSECONDS
746 ; TO DELAY BETWEEN PI0 INTERRUPTS IN BYTE TRANSFER
748 TO10AD=174420 ;ADDRESS (WORD OR BYTE) OF TO-10 BYTE TRANSFER DATA
750 TO10BC=174414 ;1.1-2.3 NEGATIVE BYTE COUNT, 2.7 LAST XFER
751 ;NORMALLY SET BY 10 WITH DATAO DTE,
752 ;TO10 XFER STARTS WHEN BOTH TO10AD AND TO10BC HAVE BEEN LOADED
754 TO11AD=174422 ;ADDRESS (WORD OR BYTE) OF TO-11 BYTE TRANSFER DATA
756 TO11BC=174416 ;1.1-2.3 NEGATIVE BYTE COUNT FOR TO-11 BYTE TRANSFER
757 ;2.5=1 => TO-11 TRANSFER IS 8-BIT BYTES, =0 => 16-BIT WORDS
758 ;2.6=1 => "ASCIZ" MODE (WHICH WE DON'T USE, OF COURSE)
759 ;2.7=1 => LAST XFER, UPON COMPLETION INTERRUPT BOTH 10 AND 11
760 ; =0 => ONLY INTERRUPT 11. 11 CAN CHANGE TO11AD, TO11BC, CONTINUE.
761 ;TO11 XFER STARTS WHEN BOTH TO11AD AND TO11BC HAVE BEEN LOADED
762 ;THE TRANSFER HAPPENS USING DMA (NPR) IN 11, PI LEVEL 0 IN 10.
764 STATUS=174434 ;DTE20 STATUS REGISTER
766 %STDNI==100000 ;2.7 TO10 XFER DONE WITHOUT ERROR
767 %STERI==20000 ;2.5 TO10 XFER ABORTED BY ERROR
768 ;2.4 DATA OUT OF DTE RAM IS ALL ZERO (MAINT)
769 %STINV==4000 ;2.3 PDP10 IS INTERRUPTING PDP11
770 ;2.2 DEPOST OR EXAMINE WORD ONE (MAINT)
771 ;2.1 PDP11 MEMORY PARITY ERROR IN TO10 XFER
772 ;1.9 PDP11 IS INTERRUPTING PDP10
773 %STDNO==200 ;1.8 TO11 XFER DONE WITHOUT ERROR
774 ;1.7 E BUFFER SELECT (MAINT)
775 ;1.6 TO11 XFER STOPPED DUE TO ZERO BYTE (IN ASCIZ MODE)
776 ;1.5 TO11 XFER OR PDP10 EXAMINE ENCOUNTERED EBUS PARITY ERROR
777 ;1.4 1 => RESTRICTED MODE
778 ;1.3 0 => EXAMINE/DEPOSIT IN PROGRESS, 1 => DONE
779 %STERO==2 ;1.2 TO11 XFER ABORTED BY ERROR
780 ;1.1 1 => DTE ENABLED TO INTERRUPT PDP11
782 %STCLI==51000 ;2.6+2.4+2.1 CLEAR TO10 XFER DONE AND ERROR FLAGS
783 %STUNV==2000 ;2.2 CLEAR PDP10 INTERRUPTING PDP11
784 %STINX==400 ;1.9 SET PDP11 INTERRUPTING PDP10
785 %STCLO==121 ;1.7+1.5+1.1 CLEAR TO11 XFER DONE AND ERROR FLAGS
786 ;1.6 ENABLE INTERRUPTS
787 ;1.4 DISABLE INTERRUPTS
789 DIAG1=174430 ;DIAGNOSTIC WORD 1, INCLUDES FLAGS
790 %D1ERR==4000 ;2.3 KL10 CLOCK ERROR STOP
791 %D1RUN==2000 ;2.2 KL10 RUN INDICATOR (1 IF 11 WANTS 10 TO RUN)
792 %D1HLT==1000 ;2.1 KL10 HALT INDICATOR (1 IF 10 DOES A JRST 4)
794 DIAG3=174436 ;DIAGNOSTIC WORD 3, INCLUDES FLAGS
795 %D3BYT==1 ;1.1 WRITING 0 SETS TO10 XFER IN WORD MODE, 1 BYTE MODE
796 ;THERE'S NOTHING ELSE OF THE SLIGHTEST USE IN THIS REGISTER,
797 ;SO IT'S OK TO WRITE IT AT ANY TIME.
802 .IFZ DTE20P ;IF USING DTE20, THESE ARE SET UP BY KLDCP
808 ; TRAP14 ;SET UP BY 11DDT
821 ;CHAOS NET INTERRUPT VECTORS ARE UNFORTUNATELY NOT IN A REASONABLE ARRAY
825 ;274 IS INTERVAL TIMER
830 ;234 IS INTERVAL TIMER
835 ;244 IS INTERVAL TIMER
838 .ERROR WHERE DOES THE FOURTH CHAOSNET INTERRUPT VECTOR GO?
858 .REPT NDMS ;DM11s go in floating vectors
859 CONC DM,\.RPCNT+1,BRK
860 240 ;INTERRUPTS ON BR4 BUT WE MASK TO BR5 ANYWAY
865 DL1IBK ;FIRST DL11 LINE IS PDP11'S CONSOLE TTY, DIFFERENT ADDRESS
866 240 ;AGAIN INTERRUPTS ON BR4 BUT MASK TO BR5 SO CAN USE DH11 ROUTINES W/O FEAR
871 .REPT NDLS-1 ;DL11S AFTER THE FIRST ARE IN FLOATING VECTORS
872 CONC DL,\.RPCNT+2,IBK
874 CONC DL,\.RPCNT+2,OBK
878 .=DHIBAS ;DON'T RELY ON RANDOM FLOATING VECTOR TO
879 ;COME OUT RIGHT, E.G. IF THERE IS A DL11
880 ;THERE WHICH WE AREN'T USING.
881 .REPT NDHS ;DH11S ARE IN FLOATING VECTOR AFTER DL11[E]S
882 CONC DH,\.RPCNT+1,IBK ;DH11 #n RECEIVE
884 CONC DH,\.RPCNT+1,OBK ;DH11 #n TRANSMIT & ERROR
888 CLKBRK ;KW11-L 60-CYCLE CLOCK
894 300 ;BR5 BUT NEED TO LOCK OUT CLOCK SO MASK 6
899 MPXENB::0 ;NONZERO TO ENABLE MULTISCHLUNKER
902 .IFZ DTE20P ;IF DTE20, KLDCP SUPPLIES THE STACK
905 JMP INIT ;START AT 1000 IS CONVENTIONAL
909 SADR=.-2 ;ARG OF THE JMP@# IS CHANGED AFTER INITIALIZATION
913 .SBTTL TEN-11 CHAOSNET COMMUNICATION AREA
916 T11BFL==8+<2*PKTMXW> ;BYTE LENGTH OF A PACKET BUFFER
917 ;FIRST 8 BYTES ARE BUFFER-FULL FLAG AND CKSM
918 .IIF NE T11BFL-<<T11BFL/4>*4>, .ERROR T11BFL NOT MULTIPLE OF 4
920 .IIF NE .-1004, .ERROR CHAOSNET TEN-11 COMMUNICATION AREA NOT AT RIGHT ADDRESS
922 ;THIS AREA IS SHARED WITH THE PDP10 VIA TEN-11 INTERFACE.
924 .WORD "CH,1 ;ERROR CHECK AND VERSION NUMBER
925 T11I10: .WORD 0,0 ;SET NON-ZERO BY 11 TO REINITIALIZE 10
926 T11I11: .WORD 0,0 ;SET NON-ZERO BY 10 TO REINITIALIZE 11
927 .WORD T11BFL,NT11BF ;BUFFER SIZE, NUMBER OF BUFFERS
929 T11OBF: .BLKB T11BFL*NT11BF ;TO-10 BUFFERS
930 T11OBE==. ;END OF TO-10 BUFFERS
931 T11IBF: .BLKB T11BFL*NT11BF ;FROM-10 BUFFERS
932 T11IBE==. ;END OF FROM-10 BUFFERS
933 ;THE FIRST 32-BIT WORD OF A BUFFER IS 0 IF IDLE, OR
934 ;NON-ZERO IF BUFFER IS TO BE SENT TO OTHER MACHINE.
935 ;THE SECOND 32-BIT WORD IS THE CHECKSUM, WHICH IS
936 ;COMPUTED BY ADDING ALL THE 32-BIT WORDS, IGNORING OVERFLOW,
937 ; AND LOGICALLY SHIFTING RIGHT ONE BIT AFTER EACH ADD; BITS SHIFTED
938 ; OUT ON THE RIGHT ARE BROUGHT BACK IN ON THE LEFT.
939 ;IF THE NUMBER OF 16-BIT WORDS IS ODD, THE LEFT-OVER ONE BETTER BE 0.
944 ; TABLES INDEXED BY H (PER HARDWARE UNIT)
946 .MACRO DHTE AD ;DH11 REGISTER ADDRESS GENERATOR
952 .MACRO DLTE AD ;DL11 REGISTER ADDRESS GENERATOR, FIRST IS WIERD
961 .MACRO DMTE AD ;DM11 register address generator
963 <AD>+<10*.RPCNT> ;a DM11 eats 8 locations
967 DMCSR: DMTE 170500 ;first DM11 is at 170500
969 DMLSR: DMTE 170502 ;selected line status at 170502
971 DHSCR: DHTE DHCBAS ;SYSTEM CONTROL REGISTER
973 ;1.5-1.6 MEMORY ADDRESS EXTENSION
974 DHRENB==100 ;1.7 RECEIVER INTERRUPT ENABLE
975 ;1.8 RECEIVER INTERRUPT
977 ;2.1 MAINTENANCE MODE
978 DHSNXM==2000 ;2.2 NXM FLAG (GENERATES XMT INTERRUPT)
980 DHSENB==10000 ;2.4 STORAGE SILO FULL INTERRUPT ENABLE
981 DHTENB==20000 ;2.5 TRANSMITTER & NXM INTERRUPT ENABLE
982 ;2.6 STOARGE FULL INTERRUPT
983 DHTDON==100000 ;2.7 TRANSMITTER DONE INTERRUPT
986 DLTE 175610 ;KEYBOARD STATUS REGISTER
987 ;1.1 PAPER TAPE READER ENABLE (WO)
988 ;1.2 DATA TERMINAL READY (RW)
989 ;1.3 REQUEST TO SEND (RW)
990 ;1.4 SECONDARY TRANSMIT DATA [OR MAKE BUSY] (RW)
992 ;1.6 DATASET INTERRUPT ENABLE (RW)
993 ;1.7 RECEIVE INTERRUPT ENABLE (RW)
994 ;1.8 RECEIVE DATA READY (RO)
997 ;2.2 SECONDARY RECEIVE DATA (RO)
998 ;2.3 RECEIVE ACTIVE (RO)
999 ;2.4 CARRIER DETECT (RO)
1000 ;2.5 CLEAR TO SEND (RO)
1001 ;2.6 RING INDICATOR (RO)
1002 ;2.7 DATASET STATUS CHANGE (RO)
1004 DHNRC: DHTE DHCBAS+2 ;NEXT RECEIVED CHARACTER
1005 ;1.1-1.8 THE CHARACTER
1006 ;1.9-2.3 LINE NUMBER
1007 %DXPAR==10000 ;2.4 CHAR HAS WRONG PARITY
1008 %DXBRK==20000 ;2.5 FRAMING ERROR (BREAK)
1009 %DXOVR==40000 ;2.6 OVERRUN, PREVIOUS CHARS LOST
1010 ;2.7 1 => THIS WORD VALID
1012 DLTE 175612 ;KEYBOARD INPUT REGISTER
1013 ;1.1-1.8 RECEIVED DATA
1014 ;2.4 PARITY ERROR (RO)
1015 ;2.5 FRAMING ERROR (RO)
1017 ;2.7 OR OF ERROR BITS (RO)
1019 DHLPR: DHTE DHCBAS+4 ;LINE PARAMETER REGISTER
1020 ;1.1-1.2 CHARACTER LENGTH 0=5, 1=6, 2=7, 3=8 (PARITY BIT EXTRA)
1021 ;1.3 1 => EXTRA STOP BIT
1023 ;1.6 0 -> EVEN PARITY, 1 => ODD
1024 ;1.7-2.1 RECEIVER SPEED
1025 ; 0 OFF, 1 50, 2 75, 3 110, 4 134.5, 5 150, 6 200, 7 300
1026 ; 10 600, 11 1200, 12 1800, 13 2400, 14 4800, 15 9600, 16 A, 17 B
1027 ;2.2-2.5 TRANSMITTER SPEED, SAME CODES AS RECEIVER
1031 DHCA: DHTE DHCBAS+6 ;CURRENT ADDRESS
1035 DHBC: DHTE DHCBAS+10 ;BYTE COUNT (MINUS)
1037 .IREPT NDLS,0 ;POSITIVE FOR DLS
1039 DHBAR: DHTE DHCBAS+12 ;BUFFER ACTIVE REGISTER
1040 ;BIT = 1 IF XMT ACTIVE ON CORRESP LINE, NUMBERED RIGHT TO LEFT
1042 DLTE 175614 ;PRINTER STATUS
1043 ;1.1 SEND BREAK (RW)
1045 ;1.6 INTERRUPT ENABLE (RW)
1046 ;1.7 TRANSMITTER READY (RO)
1048 DHBCR: DHTE DHCBAS+14 ;BREAK CONTROL REGISTER
1049 ;BIT = 1 => SEND BREAK ON CORRESP LINE, NUMBERED RIGHT TO LEFT
1051 DLTE 175616 ;PRINTER BUFFER
1052 ;1.1-1.8 DATA TO TRANSMIT
1054 DHSSR: DHTE DHCBAS+16 ;SILO STATUS REGISTER
1055 ;1.1-1.6 SILO ALARM LEVEL
1056 ;1.7-1.8 READ EXTENDED ADDRESS (R.O.)
1057 ;1.9-2.5 SILO FILL LEVEL (R.O.)
1058 ;2.7 MAINTENANCE PATTERN (W.O.)
1060 DHOAC: .IREPT NDHS,0 ;BIT ON IF SOFTWARE THINKS LINE'S TRANSMITTER IS ACTIVE
1062 .IREPT NDLS,0 ;NON-ZERO IF LINE'S TRANSMITTER IS ACTIVE
1064 DHTYNO: .IREPT NDHS, NFDHTY+<32.*.RPCNT> ;TTY INDEX OF FIRST LINE ON THIS DH11
1066 .IIF NZ CTYP,0 ;TTY INDEX OF LINE ON THIS DL11
1067 .IREPT NDLS-CTYP,NFDLTY+<2*.RPCNT>
1069 STROUT: .IREPT NDHS, STRDH ;OUTPUT-START ROUTINES
1071 .IIF NZ NMPTYS, STRMPK
1073 .BLKB NFTTY ;AVOID LABEL OVERLAPPAGE
1075 ;TABLES INDEXED BY I (PER LINE)
1077 T HDWR: ;HARDWARE UNIT INDEX, GOES IN H
1078 .IIF NZ CTYP, NFDLHX
1082 ZZ ;16 LINES ON EACH DH-11
1086 .IREPT NDLS-CTYP,NFDLHX+<2*.RPCNT>+<2*CTYP>
1087 .IREPT NMPTYS, MPKHWR ;MULTIPLEXOR-KLUDGE TTYS
1089 T DHLSEL: ;DH11 LINE SELECT WORDS
1090 .IIF NZ CTYP, 0 ;NONE FOR CTY
1093 DHTENB+DHRENB+.RPCNT
1097 T DHLBIT: ;BIT CORRESPONDING TO THIS LINE IN DHBAR, ETC.
1098 .IIF NZ CTYP, 0 ;NONE FOR CTY
1105 T BUFPNT: ;BUFFER POINTERS
1106 .IREPT NCT, BUFFRS+<.RPCNT*MAXBSZ>
1108 T BUFSIZ: ;BUFFER SIZES (I.E. AMOUNT TO USE AT CURRENT SPEED)
1110 0 ;SET DURING INITIALIZATION
1113 T NRMIPC: ;NORMAL INPUT CHARACTER PROCESSING ROUTINES
1114 .IIF NZ CTYP, RCV ;CTY NORMAL INPUT
1116 DHNRMI ;DH11 TTY NORMAL INPUT
1119 .IREPT NDLS-CTYP,RCV ;DL11 NORMAL INPUT
1120 .IREPT NMPTYS, RCV ;NORMAL INPUT FOR TTYS ON MULTIPLEXOR-KLUDGE
1121 .IIF NE .-NRMIPC-NLTTY, .ERROR BARF AT NRMIPC
1124 MPXINP ;INPUT FROM THE MULTIPLEXED LINE IS SPECIAL
1128 T TTYIPC: ;CURRENT INPUT CHAR PROCESSING ROUTINES
1129 .BLKW NCT ;SET UP AT INIT TIME
1130 .IIF NE .-TTYIPC-NLTTY, .ERROR BARF AT TTYIPC
1132 T AUTOSP: ;IF NON-ZERO, LINE GOES INTO AUTOSPEED WHEN DIALED UP
1133 .REPT NCT ;IF MINUS ALSO WHEN BREAK SEEN
1136 .IIF EQ .RPCNT+<NFTTY/2>-N,+1 ;THIS LINE AUTOSPEED ON DIALUP
1137 .IIF EQ .RPCNT+<NFTTY/2>+N,-1 ;ALSO ON BREAK
1139 .IIF EQ .-ZZ, 0 ;THIS LINE NOT AUTOSPEED
1141 .IIF NE .-AUTOSP-NLTTY, .ERROR BARF AT AUTOSP
1144 M2LMAP: ;MAP FROM DM11-BB CHANNEL NUMBERS TO TTY INDICES
1179 .IIF NE NDMS, .IIF NE .-M2LMAP-<40*NDMS>, .ERROR Too few M2LMAP entries for DM11s.
1183 T DIALED: ;0 IF LINE NOT DIALED UP (OR NO MODEM CONTROL ON THIS LINE)
1184 .REPT NCT ;+ IF DIALED UP (CLEAR TO SEND IS ON)
1185 0 ;- IF CLEAR TO SEND DROPPED, INC EACH TICK, REACHES 0 => HUNG UP
1190 T TTYHNG: ;DIALUP/HANGUP STATUS WAITING TO BE SENT TO 10 (0 IF NONE)
1195 T TYPING: ;POSITIVE IF LINE IS TYPING OUT FOR 10
1196 .REPT NCT ; WHICH MEANS -10 SHOULD BE INFORMED WHEN TYPEOUT IS FINISHED
1197 0 ;0 FOR NO -10 TYPEOUT, MINUS TO SEND <CALL> AFTER TYPEOUT
1202 DLXOFF: -1 ;NON-ZERO IF DL10 PORT TURNED OFF BY 10
1203 NO.ITS: -1 ;NON-ZERO IF HAVEN'T ESTABLISHED COMMUNICATION WITH ITS YET
1204 VERSN: .BYTE NFTTY/2,NCT ;I/O VERSION NUMBER
1205 DMINI: 0 ;NON-ZERO => MODEM SCANNER JUST TURNED ON, GETTING INITIAL STS
1206 WAKE: 0 ;CLOCK INTERRUPT WAKE UP MAIN PROGRAM FLAG
1207 HNGSIG: 0 ;NUMBER OF NON-ZERO TTYHNG WORDS
1208 10RQ: 0 ;LIGHT HACKS
1211 CLKENB: 0 ;KL10 WANTS 11 TO RELAY CLOCK INTERRUPTS
1212 KLDCPF: 0 ;NON-ZERO => USER WANTS TO GIVE A COMMAND TO KLDCP
1213 DDTMOD: 0 ;NON-ZERO => DDT MODE TTY INPUT
1214 DDTCHR: -1 ;NON-NEGATIVE => CHAR TYPED FOR DDT
1215 CURSWR: 52525 ;LAST SWITCHES SENT TO -10
1216 OUTCMD: 0 ;0 IF OUTPUT TRANSFER IDLE
1217 ;ELSE CURRENT COMMAND / 400
1218 OUTSVI: -1 ;LINE# OF CURRENT OUTPUT TRANSFER
1219 OUTSVC: -1 ;#BYTES OF CURRENT OUTPUT TRANSFER
1220 INPCMD: 0 ;0 IF INPUT TRANSFER IDLE
1221 ;ELSE CURRENT COMMAND / 400
1222 INPSVI: -1 ;LINE# OF CURRENT INPUT TRANSFER
1223 INPSVC: -1 ;#BYTES OF CURRENT INPUT TRANSFER
1226 MPXOAC: 0 ;0 IDLE, -1 SENDING HEADER, 1 SENDING DATA
1227 MPXOLN: 0 ;2 x MPXK# OUTPUTTING FOR
1228 MPXSEL: NFMPTY ;TTY INDEX SELECTED FOR MPX INPUT
1229 MPXPNT: .IREPT NMPTYS,0 ;POINTER TO CRUFT TO SEND TO EACH MPXED LINE
1230 MPXNBT: .IREPT NMPTYS,0 ;# BYTES TO SEND, 0 IF IDLE
1231 MPXHED: .BYTE 0,0 ;MPX OUTPUT HEADER: 200+MPXK#, BYTE COUNT
1234 .SBTTL CHAOSNET VARIABLES & TABLES
1238 NSUBNT==80. ;MAXIMUM CAPACITY 80. SUBNETS
1240 .IFNZ DL10P ;DL10 UNSHARED
1241 DLCRBN: 0 ;CURRENT RECEIVE (11 to 10) BUFFER (0 OR 2)
1242 DLCNXT: .WORD 2,0 ;FOR SWITCHING BUFFERS
1243 DLCIBF: .BLKW PKMAX ;DL10 INPUT BUFFER
1246 .IFNZ TEN11P ;TEN11 UNSHARED
1247 T11OBP: T11OBF ;NEXT BUFFER TO 10
1248 T11IBP: T11IBF ;NEXT BUFFER FROM 10
1249 T11IBA: 0 ;NON-ZERO MEANS INPUT BUFFER ACTIVE, T11IBP NEEDS ADVANCING
1250 ;THIS IS SEPARATE FROM CHISTS+CHXT11 FOR GOOD REASONS
1251 T11CKE: 0 ;COUNT OF TEN-11 CHECKSUM ERRORS
1252 T11TIM: 0 ;TIMEOUT ON TRANSMISSION OF PACKET TO 10
1256 ETHSBN==2 ;SUBNET WHICH IS THE ETHERNET
1257 .SEE ETHHSN ;MY HOST NUMBER BYTE (DEFINED IN MACHINE CONFIGURATION AREA)
1258 ETHMXH==15.-1 ;MAXIMUM NUMBER OF HOPS (-1 => BUG IN XEROX PROGRAMS)
1259 ETHIBF: .BLKW PKTMXW+1 ;INPUT FROM ETHERNET BUFFERED HERE (+1 HARDWARE BUG?)
1260 ETHHDW==PKHDW-2 ;ALLOW FOR OVERLAP OF CHAOSNET HEADER AND 2-WORD ETHERNET HEADER
1261 ;THIS IS THE OFFSET (IN WORDS) WHERE THE ETHERNET PACKET STARTS
1263 ;HERE IS A PACKET USED TO BUILD THE ETHERNET BROADCAST GATEWAY INFO. WHAT A CROCK.
1264 EGTBUF: .BLKW PKHDW ;SPACE FOR CHAOSNET HEADER
1265 EGTPLN: 0 ;PUP LENGTH
1267 EGTPID: .WORD 0,0 ;PUP IDENTIFIER
1268 0 ;DESTINATION (BROADCAST)
1269 .WORD 0,2 ;DEST SOCKET 2
1270 EGTSRC: .BYTE ETHHSN,ETHSBN ;SOURCE (ME)
1271 .WORD 0,2 ;SOURCE SOCKET 2
1272 EGTSBN: ;; FOR EACH SUBNET, .BYTE GATE-NET, TARGET-NET, HOP-COUNT, GATE-HOST
1277 DVRHST: 0 ;ZERO IF IDLE, OR FOREIGN HOST USING
1278 DVRIDX: 0 ;FOREIGN INDEX
1279 DVRLIX: 0 ;LOCAL INDEX (AOS EACH TIME)
1280 DVRTIM: 0 ;COUNTS UP TO IDLE THE FOREIGN HOST
1281 DVRRTR: 0 ;COUNTS UP FOR RETRANSMISSION
1283 DVRBFL==2*<PKHDW+10.+<DATMAX/2>+1> ;NUMBER OF BYTES IN A DOVER BUFFER (HOLDS PUP IN CHAOSNET PACKET)
1284 DVRBUF: .BLKB DVRBFL*NDVRBF ;RING OF BUFFERS HERE
1285 DVRBF2: .BLKW PKHDW+2 ;BUFFER FOR SENDING STS/OPN/CLS BACK (ALSO END OF RING)
1286 DVRBFP: DVRBUF ;POINTER TO NEXT BUFFER TO GO OUT TO DOVER
1287 DVRMSK: 0 ;MASK OF WHICH BUFFERS CONTAIN PACKETS (MSB = DVRBFP PKT)
1288 .IIF GT NDVRBF-16., .ERROR NDVRBF MAXIMUM OF 16. ALLOWED
1289 DVRPKP: 0 ;IF NON-ZERO, POINTER TO SPECIAL PACKET TO SEND
1290 DVRID: 0 ;ID FOR NEXT PACKET EXPECTED BY DOVER, THIS PACKET IS OR
1291 ; WILL BE IN THE BUFFER DVRBFP POINTS AT
1292 DVROFS: 0 ;ID OFFSET, SUBTRACT FROM CHAOS ID TO GET PUP ID
1293 NDVRFK: 0 ;*** TEMPORARY KLUDGE ***
1297 PULSAR: 0 ;COUNTS DOWN TO 0 THEN TRIGGERS TRANSMISSION OF A "TEST MESSAGE"
1298 PULSON: FTPULS ;IF THIS IS NON-ZERO, FEATURE IS ENABLED, VALUE IS TICKS BETWEEN PULSES
1299 USECBL: 0 ;IF NON-ZERO, 10 TALKING TO SELF STILL GOES THROUGH CABLE
1301 NCHX==DL10P+TEN11P+CHAOSP+<2*ETHERP> ;NUMBER OF ENTRIES IN SOURCE AND SINK TABLES
1302 .IIF DF NDVRBF, NCHX==NCHX+1
1306 CHSGBF: .BLKW PKMAX ;HOLDS LAST PACKET THAT CAME IN WITH A CHECKSUM ERROR
1307 CHSGBH: 0 ;UNIBUS ADDRESS OF INTERFACE THAT ABOVE CAME IN ON
1308 CHSGBS: 0 ;STATUS REGISTER THAT GOES WITH ABOVE
1309 CHSGBC: 0 ;BIT COUNT THAT GOES WITH ABOVE
1312 ;FOLLOWING HAVE SEPARATE ENTRIES FOR EACH CABLE
1313 NPKSGB: .IREPT CHAOSP+ETHERP,0 ;COUNTS THE NUMBER OF PACKETS RECEIVED WITH CHECKSUM ERRORS
1314 HPKSGB: .IREPT CHAOSP+ETHERP,0 ;HIGH-ORDER WORD OF COUNTER
1315 NPKSRL: .IREPT CHAOSP+ETHERP,0 ;COUNTS THE NUMBER OF PACKETS RAM LOST,
1316 ; I.E. DIDN'T COME IN WITH A CHECKSUM ERROR BUT AFTER
1317 ; READING IT OUT HAD ONE. EITHER THE PACKET WAS THE
1318 ; WRONG LENGTH, OR THE RAM IS LOSING, OR HARDWARE
1319 ; CLOBBERAGE. FOR ETHERNET IS PUP CKSM ERR COUNT
1320 ;THIS WORD ALSO IS WHERE BIT COUNT ERRORS WOULD END UP
1321 HPKSRL: .IREPT CHAOSP+ETHERP,0 ;HIGH-ORDER WORD OF COUNTER
1322 CHSRLH: 0 ;UNIBUS ADDRESS OF INTERFACE THAT ABOVE LAST HAPPENED ON.
1323 CHSRLC: 0 ;RESIDUAL BIT COUNT FOR ABOVE
1324 NPKSLS: .IREPT CHAOSP,0 ;NUMBER OF PACKETS LOST ACCORDING TO LOSS COUNT IN HARDWARE
1325 HPKSLS: .IREPT CHAOSP,0 ;HIGH-ORDER WORD OF COUNTER
1326 NPKSAB: .IREPT CHAOSP+ETHERP,0 ;NUMBER OF TRANSMISSIONS ABORTED (BY COLLISION OR RECEIVE-BUSY)
1327 HPKSAB: .IREPT CHAOSP+ETHERP,0 ;HIGH-ORDER WORD OF COUNTER
1328 NPKSI: .IREPT NCHX,0 ;TOTAL NUMBER OF PACKETS IN ON EACH SOURCE
1329 HPKSI: .IREPT NCHX,0 ;HIGH-ORDER WORD OF COUNTER
1330 NPKSO: .IREPT NCHX,0 ;TOTAL NUMBER OF PACKETS OUT ON EACH SINK
1331 HPKSO: .IREPT NCHX,0 ;HIGH-ORDER WORD OF COUNTER
1332 NPKSIG: 0 ;NUMBER OF PACKETS IGNORED AT CHIFLS
1333 NPKSBD: .IREPT NCHX,0 ;NUMBER OF PACKETS BAD AT CHSIHB
1334 HPKSBD: .IREPT NCHX,0 ;HIGH-ORDER WORD OF COUNTER
1335 NPKSRF: 0 ;NUMBER OF PACKETS FOR WHICH ROUTING FAILED
1336 RFSBNT: -1 ;2* SUBNET# OF LAST ROUTING FAILURE
1338 ;"INTERFACE ADDRESSES"
1339 ; A NEGATIVE INTERFACE ADDRESS IS THE UNIBUS ADDRESS OF A CHAOS INTERFACE.
1340 ; A ZERO INTERFACE ADDRESS MEANS THE DL10
1341 ; A POSITIVE INTERFACE ADDRESS MEANS THE TEN-11, VALUE BETTER BE OCTAL 1011.
1343 CHSIBF: .BLKW PKMAX*CHAOSP ;INPUT BUFFER FOR PACKETS IN FROM CHAOS HDWR
1345 ;THIS IS WHAT IS SENT BACK IN RESPONSE TO RFC TO "STATUS".
1346 ;FOR NOW, JUST THE NAME OF THE MACHINE.
1348 .ENDC ;CHAOSP ;FUCK A DOG, PALX!
1353 .ASCII \AI-CHAOS-11\
1355 .IFNZ CHAOSP ;FUCK A DOG, PALX!
1356 .IIF GE .-HSTNAM-32., .ERROR HSTNAM TOO LONG
1357 .IREPT 32.-<.-HSTNAM>, .BYTE 0 ;PAD ON THE RIGHT WITH 0'S
1359 ;CHAOSNET INPUT SOURCE AND OUTPUT SINK TABLES
1361 ;NOTE WELL, THE CODE RELIES ON THE ORDER OF THESE INDICES
1362 .IIF NZ DL10P, CHXDLC==0 ;DL10 INDEX
1363 .IIF NZ TEN11P, CHXT11==2*DL10P ;TEN11 INDEX
1364 CHXCHS==2*<DL10P+TEN11P> ;FIRST CHAOS INDEX
1365 .IIF NZ ETHERP, CHXETH==CHXCHS+<2*CHAOSP> ;ETHERNET INDEX
1366 .IIF NZ ETHERP, CHXEGT==CHXETH+2 ;ETHERNET GATEWAY-INFO-BROADCAST KLUDGE INDEX
1367 .IIF DF NDVRBF, CHXDVR==CHXEGT+2 ;DOVER PROTOCOL TRANSLATOR
1369 .IIF NE .-TAG-NCHX-NCHX, .ERROR TAG WRONG LENGTH TABLE
1372 ;CHAOSNET INPUT SOURCE TABLES
1374 CHIBFP: ;BUFFER POINTER
1375 .IIF NZ DL10P, DLCIBF ;DL10 INPUT BUFFER
1376 .IIF NZ TEN11P, 0 ;CURRENT TEN11 INPUT BUFFER (SET FROM T11IBP+8)
1377 .IREPT CHAOSP, CHSIBF+<PKMAX*2*.RPCNT> ;CHAOS INPUT BUFFER
1378 .IIF NZ ETHERP, ETHIBF ;ETHERNET
1380 .IIF DF NDVRBF, 0 ;CURRENT DOVER BUFFER, COULD BE CHAOS OR PUP
1383 CHIHDL: .IREPT NCHX, 0 ;LENGTH OF HEADER IN WORDS, PACKET CURRENTLY IN BFR
1385 CHISTS: .IREPT NCHX, 0 ;STATUS (0 IDLE, +1 HAS INPUT, -1 BEING OUTPUT)
1387 CHILNG: .IREPT NCHX, 0 ;LENGTH OF CONTAINED PACKET IN WORDS
1389 CHIOUX: .IREPT NCHX, 1 ;DESTINATION OUTPUT SINK INDEX (-1 IF DIRECTED TO PDP11 ITSELF)
1391 CHICBA: .IREPT NCHX, 0 ;DESTINATION CABLE ADDRESS
1393 CHIRFL: ;ADDRESS OF REFILL ROUTINE
1394 .IIF NZ DL10P, DLCRFL
1395 .IIF NZ TEN11P, T11RFL
1396 .IREPT CHAOSP, CHSRFL
1397 .IIF NZ ETHERP, ETHRFL ;ETHERNET
1399 .IIF DF NDVRBF, DVRRFL
1402 CHIHWR: ;POINTER TO HARDWARE
1403 .IIF NZ DL10P, 1 ;NOT USED
1404 .IIF NZ TEN11P, 3 ;NOT USED
1405 .IREPT CHAOSP, CAICSR+<400*.RPCNT> ;QUAD-CHAOS INTERFACES HAVE TO BE 200 APART
1406 .IIF NZ ETHERP, 164200 ;AND WE MAKE IT 400 BECAUSE ETHERNET GETS IN WAY
1408 .IIF DF NDVRBF, 7 ;NOT USED
1410 ;CHAOSNET OUTPUT SINK TABLES
1412 CHOHWR==CHIHWR ;POINTER TO HARDWARE
1414 CHOSTS: .IREPT NCHX, 0 ;STATUS (0 IDLE, +1 TRANSMITTING, -1 RETRANSMITTING
1415 ; AFTER TRANS ABORT, +2 DELAYING AFTER TRANSMIT ABORT BEFORE RETRANSM)
1416 CHOINX: .IREPT NCHX, 1 ;CURRENTLY-ACTIVE CHIxxx INDEX
1418 CHOXMT: ;START TRANSMISSION ROUTINE
1419 .IIF NZ DL10P, DLCXMT
1420 .IIF NZ TEN11P, T11XMT
1421 .IREPT CHAOSP, CHSXMT
1422 .IIF NZ ETHERP, ETHXMT ;ETHERNET
1423 .IALSO 1 ;NOT USED (CHXEGT)
1424 .IIF DF NDVRBF, DVRPKT ;DOVER
1427 CHXSBN: ;SUBNET NUMBER +400 FOR STATUS SERVER
1428 .IIF NZ DL10P, DLCADR/400+400
1429 .IIF NZ TEN11P, T11ADR/400+400
1431 CONC CHAD,\.RPCNT,/400+400
1433 .IIF NZ ETHERP, ETHSBN+400 ;ETHERNET
1434 .IALSO 776 ;NOT REAL (ETHERNET GATEWAY)
1435 .IIF DF NDVRBF, 777 ;NOT REAL (DOVER)
1438 CHXRTF: .IREPT NCHX, 0 ;NON-ZERO MEANS BROADCAST ROUTING INFO TO THIS GUY
1441 CHSIDL: .IREPT NCHX, 0 ;NUMBER OF TICKS WAITING FOR TRANSMIT-DONE
1442 CHSRST: .IREPT NCHX, 0 ;NUMBER OF TIMES HAD TO RESET HUNG INTERFACE
1445 ;;; SUBNET/ROUTING TABLES
1447 ;INDEX BY TWICE SUBNET NUMBER
1448 SBNTYP: .IREPT NSUBNT, 0 ;TYPE OF CONNECTION TO THIS SUBNET:
1449 ; 0 VIA GATEWAY, WITH AUTOMATIC ROUTING
1450 ; -1 VIA GATEWAY, PATCHED IN BY HUMAN, DON'T CHANGE
1451 ; 1 HARDWARE CONNECTION
1453 SBNADR: ;ADDRESS OF CONNECTION TO THIS SUBNET
1454 ;NETWORK ADDRESS IF SBNTYP NEGATIVE OR ZERO
1455 ;INDEX IN SOURCE/SINK TABLES IF SBNTYP GREATER THAN ZERO
1456 0 ;0 USED FOR UNKNOWN SUBNETS. WHEN IN DOUBT, BROADCAST.
1457 0 ;1 9TH FLOOR CABLE
1458 0 ;2 (NOT CURRENTLY USED)
1459 440 ;3 MX, ASSUME VIA MX-IO-11
1460 426 ;4 AI, ASSUME VIA AI-CHAOS-11
1461 .IREPT NSUBNT-5, 0 ; WHEN IN DOUBT, BROADCAST
1463 SBNCST: .IREPT NSUBNT, 1000 ;COST OF ROUTING VIA CURRENT GATEWAY, SEE CHAORD
1465 ;NOW FILL IN TABLES FOR HARDWARE CONNECTIONS THAT EXIST ON THIS MACHINE
1466 ;INCLUDING TRANSFINITE HAIR FOR ETHERNET GATEWAY INFO PACKET
1469 DLCSBN==DLCADR/400 ;SUBNET PDP10 ON OTHER END OF DL10 IS ON
1475 10. ;DIRECT 10/11 CONNECTION COSTS 10.
1478 T11SBN==T11ADR/400 ;SUBNET PDP10 ON OTHER END OF TEN11 IS ON
1484 10. ;DIRECT 10/11 CONNECTION COSTS 10.
1489 CBLCST=11. ;CABLE CONNECTION COSTS 11.
1492 CBLCST=22. ;AI COSTS MORE 'CAUSE IT'S SICK
1495 .IFNZ CHAOSP ;sweet fucking jesus, palx
1496 ;HAIR FOR MULTIPLE CABLE INTERFACES
1498 CONC IZZZ==CHAD,\.RPCNT
1505 CBLCST ;THE CABLE COST
1520 4SEC: 0 ;4-SECOND CLOCK COUNTER
1521 15SEC: 0 ;15-SECOND CLOCK COUNTER
1527 PAT: PATCH: .BLKW 100
1534 0 ;NUMBER OF WORDS IN RING
1535 <SIZE> ;MAX NUMBER ALLOWED
1536 <2*<SIZE>>+99$ ;MAX ADDRESS ALLOWED
1537 99$ ;MIN ADDRESS ALLOWED
1538 99$: .BLKW <SIZE> ;BUFFER
1549 ; DEFINE THE RING BUFFERS
1551 TYORNG: RING <NCT*2> ;OUTPUT-DONE RING, CONTENTS = LINE NUMBER PDP10 STYLE
1552 ;HAS TO BE EXTRA BIG BECAUSE THE OUTPUT DONES PUT IN ON
1553 ;STARTUP FILL IT UP, THEN SOMETIMES ITS PUTS ONE IN
1554 ;BEFORE IT TAKES ANY OUT.
1556 TYIRSZ==NCT*20 ;8 CHARS PER TTY (2 WORDS PER CHAR)
1557 TYIRNG: RING TYIRSZ ;TTY INPUT RING, FIRST WORD IS CHARACTER, SECOND LINE NUMBER
1565 PUT: CMP RINGCT(B),RINGSZ(B)
1582 ; IT IS AN ERROR TO CALL THIS IF RING IS EMPTY
1598 CLRING: CLR RINGCT(B) ;CLEAR A RING
1599 MOV RINGBT(B),RINGIN(B)
1600 MOV RINGBT(B),RINGOT(B)
1603 .SBTTL DTE20 SUBROUTINES
1605 ;THE DTE20 MUST NOT BE HACKED AT INTERRUPT LEVEL, BECAUSE KLDCP USES IT TOO.
1606 ;THE FOLLOWING THREE LOCATIONS ARE ARGS TO/FROM THE FOLLOWING TWO SUBROUTINES.
1608 LH: 0 ;LOW 16 BITS OF LEFT HALF
1609 RH: 0 ;LOW 16 BITS OF RIGHT HALF
1610 SNB: 0 ;SIGN BIT (0 IF +, NON-0 IF -)
1614 ;EXAMINE PDP10 LOC, SPLIT INTO HALFWORDS, SET LH, RH, SNB
1615 ;RETURNS WITH "Z" SET IF LOCATION HAS POSITIVE SIGN, "Z" CLEAR IF MINUS SIGN
1617 HWEXAM: PUSH <A,C> ;SAVE REGS
1618 PUSH <#0,(B)+> ;PUT PDP10 ADDRESS ONTO PDL
1619 MOV SP,A ;SET UP POINTER TO ADDRESS
1620 EXAM ;EXAMINE LOCATION, SET A TO POINT TO 3-WORD RESULT BUFFER
1621 BCS UHUNG ;BRANCH IF UCODE HUNG
1622 MOV (A)+,RH ;LOW 16 BITS => RH
1623 MOV (A)+,C ;PICK UP MIDDLE 16 BITS
1624 MOV (A)+,A ;PICK UP HIGH 4 BITS
1625 ROR A ;LSHC <A,C>,-2 TO GET PDP10 LH INTO C
1630 BIC #177775,A ;LEAVE SIGN BIT IN 1.2 OF A
1632 ADD #4,SP ;POP ADDRESS OFF PDL
1633 POP <C,A> ;RESTORE REGS
1635 RTS B ;RETURN SKIPPING IN-LINE PARAMETER
1639 ;ASSEMBLE LH, RH, SNB INTO PDP10 AND DEPOSIT IN ADDR
1651 PUSH <A,C,RH> ;PUSH HIGH, MIDDLE, AND LOW BITS
1652 MOV SP,A ;POINTER TO DATA
1653 PUSH <#0,(B)> ;PUSH HIGH AND LOW ADDRESS
1654 MOV SP,B ;POINTER TO ADDRESS
1655 DPOS ;DO THE DEPOSIT
1656 BCS UHUNG ;BRANCH IF UCODE HUNG
1657 ADD #10.,SP ;POP ADDRESS AND DATA OFF PDL
1659 TST (B)+ ;SKIP TRAILING PARAMETER
1664 SETOM NO.ITS ;GIVING UP
1667 1$: .ASCIZ/?MICROCODE HUNG/
1671 .SBTTL MAIN LOOP FOR DL10
1674 .IIF NZ TEN11P, CALL T11WAK ;CHECK UP ON TEN-11 INTERFACE
1676 TST CHXRTF+CHXETH ;NEED TO BROADCAST ROUTING INFO TO ETHERNET?
1681 BIT #DLXPRT,DLXCSR ;PORT TO 10 ENABLED?
1683 SETOM NO.ITS ;NO, FLAG THERE IS NO ITS
1684 SETOM DLXOFF ;AND THAT WE THINK DL10 PORT IS OFF
1685 BR MAIN ;AND WAIT FOR IT TO TURN ON
1687 1$: TST DLXOFF ;DID DL10 JUST TURN ON?
1688 BEQ 4$ ;NO, IT WAS ON BEFORE
1689 CLR DLXOFF ;YES, SO REMEMBER THAT
1690 MOV VERS,A ;CHECK VERSION SUPPLIED BY -10
1691 BEQ 2$ ;ZERO OK (MUST BE SALVAGER)
1694 BPT ;-10 AND -11 PROGRAMS NOT SAME CONFIG
1697 4$: BIT #DLXPAR+DLXNXM,DLXCSR ;ERROR ACCESSING MEMORY?
1699 BPT ;DON'T GO OFF DESTROYING PEOPLE'S FILES
1701 ;WAIT FOR -10 TO REQUEST SERVICE, OR CLOCK TO TICK
1704 BIT #DLX11I,DLXCSR ;10 REQUESTING SERVICE?
1707 BIS #DLXZ11,DLXCSR ;YES, CLEAR FLAG
1708 BR CHKOST ;AND GO CHECK FOR THINGS TO DO
1710 10$: TST WAKE ;NO, CHECK ANYWAY IF 60 CYCLE CLOCK HAS TICKED
1711 BEQ MAIN ;NEITHER, JUST WAIT
1712 CLR WAKE ;CLOCK HAS TICKED, CLEAR FLAG
1713 INC DLXUP ;AND INCREMENT COUNTER 10 IS SUPPOSED
1714 BEQ 11$ ; TO SETOM EVERY 1/2 SEC
1715 CMP DLXUP,#15.*60. ;IF IT DOESN'T TOUCH IT FOR 15 SECONDS,
1716 BLE 12$ ; CONSIDER IT DOWN. NOTE THAT PARITY SWEEPS
1717 SETOM NO.ITS ; THROUGH LARGE MEMORY CAN TAKE SEVERAL SECONDS
1718 MOV #15.*60.,DLXUP ;DON'T LET COUNTER OVERFLOW
1719 BR 12$ ;BUT CHECK FOR COMMANDS ANYWAY (SALVAGER DISK)
1721 11$: CLR NO.ITS ;-10 HAS SETOMED COUNTER, IT'S UP
1722 12$: ;FALL INTO CHKOST
1724 ; CHECK FOR OUTPUT-START FROM -10
1726 CHKOST: MOV TTYST,A ;LINE# TO START OUTPUT
1728 CLR TTYST ;TELL -10 IT'S BEEN PICKED UP
1730 MASK 5 ;DON'T INTERFERE WITH P.I. LEVEL
1731 CALL PUT ;PUT IN RING, LATER WILL SEND IT BACK TO 10
1734 ; CHECK FOR TTY OUTPUT SENT BY -10
1736 CHKOUT: MOV TYOLIN,I ;OUTPUT TO BE DONE?
1738 MOV TYOCNT,C ;YES, GET NUMBER OF CHARS
1739 CALL TYOSER ;CALL OUTPUT HANDLER
1740 CLR TYOLIN ;TELL 10 WE'VE GOBBLED THE OUTPUT
1741 BIS #DLX10I,DLXCSR ;GIVE TRANSFER-COMPLETE INTERRUPT
1743 ; CHECK FOR TTY INPUT TO BE SENT TO -10
1745 CHKIN: TST TYIRNG+RINGCT
1746 BEQ CHKDON ;NO STATUS TO BE STORED
1748 BNE CHKDON ;PREVIOUS STATUS NOT PICKED UP
1751 MOV A,TYICHR ;GIVE INPUT CHARACTER TO 10
1753 MOV A,TYILIN ;GIVE LINE NUMBER TO 10
1754 BIS #DLX10I,DLXCSR ;SEND INTERRUPT TO 10
1756 ; CHECK FOR OUTPUT-DONE TO BE SENT TO -10
1758 CHKDON: TST TYORNG+RINGCT
1759 BEQ CHKHNG ;NO STATUS TO BE STORED
1761 BNE CHKHNG ;PREVIOUS STATUS NOT PICKED UP
1766 MOV BUFSIZ(I),TYOBSZ ;TELL -10 HOW MANY CHARS TO GIVE
1767 MOV A,TYOSTS ;GIVE OUTPUT DONE TO 10
1768 BIS #DLX10I,DLXCSR ;WITH INTERRUPT
1770 ; CHECK FOR HANGUPS TO BE SENT TO -10
1772 CHKHNG: TST HNGSIG ;ANY HANGUPS TO BE REPORTED?
1775 BNE CHKLPR ;PREVIOUS STATUS NOT PICKED UP
1776 MOV #LASTTY,I ;SCAN OVER ALL LINES
1778 MOV TTYHNG(I),A ;GET HANG-UP STATUS
1779 BNE 2$ ;BRANCH IF FOUND SOMETHING TO REPORT
1784 BPT ;HNGSIG OUT OF PHASE WITH TTYHNG
1786 2$: CLR TTYHNG(I) ;GOT STATUS, CLEAR IT
1787 DEC HNGSIG ;DECREASE COUNT OF FROBS WAITING TO BE SIGNALLED
1788 UNMASK ;NOW IT'S OK TO INTERRUPT AND SET TTYHNG
1789 MOV A,HNGLIN ;GIVE LINE NUMBER AND OTHER DATA TO 10
1790 BIS #DLX10I,DLXCSR ;WITH INTERRUPT
1792 ; CHECK FOR REQUEST FROM -10 TO SET LINE PARAMETERS
1794 CHKLPR: MOV LPRLIN,I ;LINE PARAMETERS TO BE SET?
1796 ASL I ;YES, GET LINE INDEX
1797 MOV LPRLPR,A ;AND DH11 PARAMETER REGISTER VALUE
1798 MOV LPRBSZ,B ;AND BUFFER SIZE
1799 CALL SPARAM ;CALL PARAMETER SETTER
1800 CLR LPRLIN ;TELL 10 IT IS DONE
1802 ; CHECK FOR CHAOS NET ACTIVITY
1806 CALL DLCWAK ;WAKEUP DL10-CHAOSNET STUFF
1809 CALL DSKSTR ;CHECK FOR DISK REQUEST
1812 ; CHECK FOR EXAMINE/DEPOSIT REQUEST FROM -10
1814 CHKEXD: TST EXDSTS ;EXAMINE/DEPOSIT?
1816 MOV EXDADR,A ;GET ADDRESS
1819 MOV EXDDAT,(A) ;DEPOSIT
1820 21$: MOV (A),EXDDAT ;EXAMINE
1821 CLR EXDSTS ;IT IS DONE
1823 ;CHECK FOR GOULD LPT OUTPUT
1827 ; CLR GLPCTR ;IF NO GOULD, FLUSH OUTPUT FOR IT
1828 ; SETOM GLPTER ;AND SAY "NOT READY"
1831 ;10 WANTED US TO DO SOMETHING, PLAY WITH THE LIGHTS
1835 20$: MOV LITHSE,GLPTER
1837 TST GLPCTR ;ANY BYTES IN BUFFER?
1839 CALL GLPTYO ;YES, OUTPUT THEM
1840 1$: MOV GLPERR,GLPTER ;COPY ERROR STATUS FROM P.I. LEVEL TO -10
1841 .ENDC ;DONE HERE SO NO USE OF DL10 AT P.I. LEVEL
1844 MAINX: JMP MAIN ;THAT'S IT
1848 .SBTTL MAIN LOOP FOR DTE20
1850 MAIN: BIT #%D1RUN,DIAG1 ;IS KL10 RUNNING?
1851 BEQ TENDED ;NO, LOSE!
1852 BIT #%D1ERR+%D1HLT,DIAG1 ;HAS KL10 CLOCK STOPPED FOR HARDWARE ERROR? OR JRST 4
1853 BNE TENDED ;YES, LOSE!
1854 TST KLDCPF ;MAYBE USER WANTS TO GIVE A KLDCP COMMAND?
1855 BNE KLDCPR ;YES, RETURN TO KLDCP
1856 TSTB @DLKS+NFDLHX ;CTY INPUT?
1857 BPL 10$ ;TEST KBD BEFORE CLK SINCE MIGHT BE MORE THAN
1858 ; 1/60'TH SECOND PER TRIP AROUND THE LOOP.
1859 MASK 5 ;YES, SIMULATE INTERRUPT
1860 CALL DL1IBK ;CAN'T USE REAL INTS BECAUSE WOULD INTERFERE WITH KLDCP
1861 10$: TSTB LKS ;60 CYCLE CLOCK TICK?
1863 BIT #%STINV,STATUS ;REQUEST FROM 10?
1864 BNE TENSER ;YES, SERVICE IT.
1865 BIT #%STDNI,STATUS ;TO10 XFER COMPLETE?
1866 BNE INPDON ;YES, SERVICE IT.
1867 BIT #%STDNO,STATUS ;TO11 XFER COMPLETE?
1868 BNE OUTDON ;YES, SERVICE IT.
1869 BIT #%STERI+%STERO,STATUS
1870 BNE LOSSAG ;BYTE TRANSFER LOST
1873 ;60-CYCLE CLOCK SERVICE
1875 CLKSER: CLR LKS ;CLEAR CLOCK FLAG
1876 TST CLKENB ;DOES 10 WANT CLOCK INTERRUPTS?
1878 D10MON ;YES, GIVE ONE
1879 DTECLK ;SET CLOCK FLAG IN LOW CORE
1881 MOV #%STINX,STATUS ;AND SEND INTERRUPT
1882 1$: CMP SWR,CURSWR ;MAYBE NEED TO UPDATE 10'S SWITCHES
1885 TENSW ;LET KLDCP DO IT
1887 2$: JSR B,HWEXAM ;INCREMENT COUNTER -10 IS SUPPOSED
1888 DTECHK ; TO SETOM EVERY HALF-SECOND
1893 CMP RH,#15.*60. ;IF IT DOESN'T SETOM IT FOR 15 SECONDS
1894 BLE 4$ ;THEN IT IS DOWN. NOTE THAT PARITY SWEEPS
1895 SETOM NO.ITS ;THROUGH LARGE MEMORY CAN TAKE SEVERAL SECONDS.
1896 MOV #15.*60.,RH ;DON'T LET COUNTER OVERFLOW
1899 3$: CLR NO.ITS ;IT SETOMED COUNTER, IT'S UP.
1900 4$: JSR B,HWDEP ;PUT COUNTER BACK
1902 MASK 6 ;NOW SIMULATE BR6 CLOCK INTERRUPT
1904 BR TENSER ;AND GO SERVICE 10 (IN CASE LOST INTERRUPT)
1906 ; HERE IF KL10 HALTS
1908 TENDED: SETOM NO.ITS
1910 RET ;LET KLDCP PRINT THE MESSAGE
1912 ; BYTE TRANSFER ENCOUNTERED HARDWARE LOSSAGE
1917 ; USER WANTS TO GIVE A KLDCP COMMAND
1925 ; HERE WHEN TO10 BYTE TRANSFER COMPLETE
1927 INPDON: MOV #%STCLI,STATUS ;CLEAR FLAGS IN DTE20
1928 MOV INPCMD,A ;GET COMMAND FOR XFER THAT JUST FINISHED
1930 BPT ;WOOPS, NO XFER IN PROGRESS
1931 1$: CLR INPCMD ;NO XFER IN PROGRESS NOW
1934 CALL @FINAL-2(A) ;CALL APPROPRIATE FINISHER ROUTINE
1937 ; HERE WHEN TO11 BYTE TRANSFER COMPLETE
1939 OUTDON: MOV #%STCLO,STATUS ;CLEAR FLAG
1940 MOV OUTCMD,A ;GET COMMAND FOR XFER THAT JUST FINISHED
1942 BPT ;WHOOPS, NO XFER IN PROGRESS
1943 1$: CLR OUTCMD ;NO XFER IN PROGRESS NOW
1946 CALL @FINAL-2(A) ;CALL APPROPRIATE FINISHER ROUTINE
1949 ; HERE TO START TO10 BYTE TRANSFER. HWEXAM OF DTEINP HAS BEEN DONE.
1951 INPSER: D10MON ;VALUE HAS BEEN PICKED UP, SETOM IT
1953 BIT #1000,LH ;RIGHT GENDER OF COMMAND?
1955 BR MAINJ ;(USED TO BE BPT) NO, IGNORE, MAYBE ITS BEING RELOADED
1957 ; HERE TO START TO11 BYTE TRANSFER. HWEXAM OF DTEOUT HAS BEEN DONE.
1959 OUTSER: D10MON ;VALUE HAS BEEN PICKED UP, SETOM IT
1961 BIT #1000,LH ;RIGHT GENDER OF COMMAND?
1963 BR MAINJ ;(USED TO BE BPT) NO, IGNORE, MAYBE ITS BEING RELOADED
1965 OUTSR1: MOV RH,C ;GET BYTE COUNT
1966 MOVB LH,I ;GET LINE#
1967 MOVB LH+1,A ;GET COMMAND TIMES 2
1968 BEQ MAINJ ;CLEARING CORE? IGNORE ZERO COMMAND
1972 CALL @BEGIN-2(A) ;CALL APPROPRIATE BEGIN-XFER ROUTINE
1975 MOV A,INPCMD ;REMEMBER CRUFT FOR XFER IN PROGRESS
1980 1$: MOV A,OUTCMD ;REMEMBER CRUFT FOR XFER IN PROGRESS
1985 OUTSR2: BR MAINJ ;BAD COMMAND FROM 10 (USED TO BE BPT) JUST IGNORE IT
1987 ;TABLE OF ROUTINES TO PROCESS DATA TRANSFER COMMANDS FROM -10
1989 BEGIN: TYOSER ;%DTTYO
1994 ;TABLE OF ROUTINES TO FINISH UP DATA TRANSFERS
1996 FINAL: TYOFIN ;%DTTYO
2000 ;CHECK FOR COMMANDS FROM 10, STORE STATUS IN ANY STATUS WORDS
2001 ;THAT 10 HAS SET BACK TO -1
2003 TENSR0: MOV #%STUNV,STATUS ;CLEAR 10 INTERRUPTING 11 FLAG
2004 JSR B,HWEXAM ;CHECK FOR A NON-TIMESHARING COMMAND
2006 MOV RH,A ;IS THERE ONE?
2007 BEQ TENSR1 ;NO, GO CHECK FOR TIMESHARING STUFF
2012 1$: TSTB TPS ;CHAR TO BE TYPED, WAIT FOR READY
2014 MOVB A,TPB ;TYPE IT OUT
2015 9$: CLR RH ;CLEAR OUT THE COMMAND
2018 D10MON ;TELL 10 IT'S DONE
2024 CLR RH ;SNB,LH,RH NOW HAS ZERO
2025 SETOM DDTMOD ;KEYBOARD INPUT WANTED
2026 TST DDTCHR ;TEST IF READY
2027 BMI 3$ ;IF NO INPUT, GIVE ZERO
2029 MOV DDTCHR,RH ;GIVE THE CHAR
2030 COM DDTCHR ;MAKE NEGATIVE
2046 7$: BPT ;SOME COMMAND WE DON'T IMPLEMENT
2047 BR 9$ ;IF CONTINUED, IGNORE IT
2049 ;CHECK FOR ITS UP/DOWN
2051 TENSR1: TST NO.ITS ;IF SYSTEM ISN'T UP,
2052 BNE MAINJ ;DON'T TRY TO HACK TS STUFF
2053 INC DLXOFF ;OTHERWISE, FIRST TIME THROUGH HERE
2054 BNE CHKOST ;WE CHECK THE VERSION
2059 DEC DLXOFF ;NO, DON'T LOOK AT IT
2060 BR MAINJ ;PROBABLY CORE BEING CLEARED
2064 BPT ;-10 AND -11 PROGRAMS NOT SAME VERSION
2066 CHKOST: JSR B,HWEXAM ;CHECK FOR 10 WANTING OUTPUT START
2068 BNE CHKTRN ;BRANCH IF LOCATION DTEOST IS -1
2069 D10MON ;HAVING PICKED IT UP, SET BACK TO -1
2073 MASK 5 ;DON'T INTERFERE WITH P.I. LEVEL
2076 CLR DDTMOD ;SYSTEM UP, TURN OFF DDT MODE
2080 BNE 1$ ;INPUT IN PROGRESS, DON'T START AGAIN
2081 JSR B,HWEXAM ;CHECK FOR DATA TRANSFER COMMAND
2083 BNE 1$ ;DTEINP -1, NO REQUEST
2087 BNE CHKLSP ;OUTPUT IN PROGRESS, DON'T START AGAIN
2088 JSR B,HWEXAM ;CHECK FOR DATA TRANSFER COMMAND
2090 BNE CHKLSP ;DTEOUT -1, NO REQUEST
2093 CHKLSP: JSR B,HWEXAM ;CHECK FOR SET LINE SPEED COMMAND
2098 CMP I,#NFTTY ;VALIDATE IT
2099 BLO 1$ ;IGNORE IF BAD
2102 JSR B,HWEXAM ;GET LPR,,BUFFERSIZE
2107 1$: D10MON ;DONE, SETOM
2110 CHKTYI: TST TYIRNG+RINGCT
2111 BEQ CHKODN ;NO TTY INPUT WAITING
2114 BEQ CHKODN ;PREVIOUS CHAR NOT PICKED UP
2121 JSR B,HWDEP ;GIVE 10 LINE#,,CHAR
2123 MOV #%STINX,STATUS ;INTERRUPT THE 10
2125 CHKODN: TST TYORNG+RINGCT
2126 BEQ CHKHNG ;NO OUTPUT DONES WAITING
2129 BEQ CHKHNG ;PREVIOUS STATUS NOT PICKED UP
2131 CALL GET ;GET LINE# WITH OUTPUT DONE
2136 JSR B,HWDEP ;GIVE 10 LINE#,,BUFFERSIZE
2138 MOV #%STINX,STATUS ;INTERRUPT THE 10
2141 BEQ MAINX ;NO HANGUPS/DIALINS WAITING
2144 BEQ MAINX ;PREVIOUS STATUS NOT PICKED UP
2145 MOV #LASTTY,I ;SCAN OVER ALL LINES
2147 MOV TTYHNG(I),A ;GET HANG-UP STATUS
2148 BNE 2$ ;BRANCH IF FOUND SOMETHING TO REPORT
2153 BPT ;HNGSIG OUT OF PHASE WITH TTYHNG
2155 2$: CLR TTYHNG(I) ;GOT STATUS, CLEAR IT
2156 DEC HNGSIG ;DECREASE COUNT OF FROBS WAITING TO BE SIGNALLED
2157 UNMASK ;NOW IT'S OK TO INTERRUPT AND SET TTYHNG
2158 MOV A,RH ;GIVE LINE NUMBER AND OTHER DATA TO 10
2163 MOV #%STINX,STATUS ;INTERRUPT THE 10
2169 .SBTTL MAIN LOOP FOR AI
2172 .IIF NZ TEN11P, CALL T11WAK ;CHECK UP ON TEN-11 INTERFACE
2173 .IIF Z TEN11P, CALL CHSRUN ;DAMNED THING GETS WEDGED
2175 TST CHXRTF+CHXETH ;NEED TO BROADCAST ROUTING INFO TO ETHERNET?
2180 TST WAKE ;CLOCK TICK?
2181 BEQ MAIN ;NO, JUST WAIT
2182 CLR WAKE ;CLOCK HAS TICKED, CLEAR FLAG
2183 BR MAIN ;NOT MUCH TO DO, NO TTYS
2186 .SBTTL OUTPUT HANDLERS
2188 TYOSER: ASL I ;CONVERT -10 LINE# TO -11 TTY INDEX
2193 11$: BPT ;10 GAVE BAD LINE#
2194 12$: MOV HDWR(I),H ;GET HARDWARE INDEX
2195 MOV BUFPNT(I),D ;AND ADDRESS OF TYPEOUT BUFFER
2196 CMP BUFSIZ(I),C ;MAKE SURE THERE IS ROOM IN BUFFER
2199 2$: MOV C,B ;MUSTN'T CLOBBER BYTE COUNT IN C
2201 MOV #TYOPNT,A ;GET CRUFT FROM DL10
2202 3$: MOVB @A,(D)+ ;COPY BUFFER
2206 MOV D,TO11AD ;SET UP BYTE TRANSFER
2208 BIC #050000,B ;SET LAST, BYTE; CLEAR ASCIZ, 2.4
2209 MOV B,TO11BC ;START XFER
2212 TYOFIN: MOV HDWR(I),H ;COMES BACK WHEN XFER COMPLETE
2215 ;BUFFER HAS BEEN LOADED, START DEVICE
2217 MASK 5 ;DON'T LET DEVICE INTERRUPT
2219 CALL @STROUT(H) ;CALL DEVICE-DEPENDENT ROUTINE
2220 MOV #40000,TYPING(I) ;TELL 10 WHEN OUTPUT FINISHES (LARGE POSITIVE NUMBER)
2224 ;GIVE MESSAGE. A -> .WORD LENGTH,MSG. I HAS LINE NUMBER.
2227 MOV (A)+,C ;C HAS BYTE COUNT, A HAS ADDRESS
2228 MOV A,D ;PUT ADDRESS IN D
2231 CALL @STROUT(H) ;START OUTPUT TO LINE
2238 \87Connected to MCHN'.\%
2243 ;DEVICE-DEPENDENT OUTPUT START ROUTINES (CALL AT PI LEVEL 5)
2244 ;H HDWR IDX, I TTY IDX, D BUFFER POINTER, C NUMBER OF BYTES
2246 STRDH: BIC DHLBIT(I),@DHBAR(H) ;IF LINE ALREADY TRANSMITTING, STOP IT
2247 ;IT SHOULDN'T OUGHT TO BE...
2248 MOV DHLSEL(I),@DHSCR(H) ;HARDWARILY SELECT THIS LINE
2249 MOV D,@DHCA(H) ;SET XMT ADDRESS
2250 NEG C ;HARDWARE LIKES NEGATIVE BYTE COUNTS
2251 MOV C,@DHBC(H) ;SET XMT COUNT
2252 BIS DHLBIT(I),@DHBAR(H) ;START TRANSMISSION HARDWARILY
2253 BIS DHLBIT(I),DHOAC(H) ;SOFTWARILY ALSO
2256 STRDL: MOV D,DLCA(H)
2259 MOV #300,@DLPS(H) ;CAUSE INTERRUPT
2266 MOV D,MPXPNT-NFMPTY(I) ;QUEUE OUTPUT
2267 MOV C,MPXNBT-NFMPTY(I)
2269 TST MPXOAC ;START THE MPXR
2270 BNE 10$ ;ALREADY BUSY
2273 2$: MOV MPXNBT(I),C ;FIND MPX KLUDGE LINE WANTS TO OUTPUT
2280 15$: MOV I,MPXOLN ;SAVE LINE# OUTPUT ON
2281 ASR I ;SET UP HEADER
2285 MOV #-1,MPXOAC ;SEND HEADER
2295 .SBTTL GOULD LPT OUTPUT (M.P. LEVEL)
2296 .IIF Z DL10P, .ERROR GOULD LPT ONLY CODED FOR DL10
2297 .ERR BY THE WAY, THESE ROUTINES DON'T WORK WORTH GUBBISH
2299 GLPTYO: MOV GLPOIP,H ;GET NEXT BUFFER
2300 CMP GB.STA(H),#%GBMP
2301 BEQ 2$ ;BRANCH IF M.P. ACTIVE
2302 BLT 1$ ;BRANCH IF IDLE BUFFER AVAIL
2303 RET ;NO FREE BUFFERS
2305 1$: CALL GLPBGB ;GOBBLE A BUFFER
2307 MOV GLPCTR,C ;SET UP BYTE COUNTER
2308 MOV GLPGRF,GLPGF1 ;COPY ARG FROM 0 FOR SPEED
2309 TST GLIMBF ;CHAR SAVED FROM LAST TIME?
2311 CLR GLIMBF ;YES, PRINT IT
2314 MOVB GLIMBO+1,A ;SECOND CHAR?
2319 ;CHARACTER PROCESSING LOOP
2320 ;C HAS # CHARS YET TO GO, D HAS WHERE TO PUT THEM, H -> BUFFER
2323 GLPNCL: MOV GLPPTR,A ;GET NEXT CHAR
2325 BNE GLPNRM ;GRAPHIC MODE, NO CHARACTER PROCESSING
2329 BGE GLPNRM ;NO, NORMAL PRINTING
2330 CMP A,#14 ;CHECK FOR SPECIAL CONTROLS
2332 8$: CLR GLPROW ;START NEW PAGE
2333 TST GLPCOL ;IN MIDDLE OF LINE?
2335 CALL GLPBWW ;OTHERWISE, HAIR
2336 CLR GLPFIL ;HACK HACK MAKE FF NEXT LINE
2346 BHIS 8$ ;SKIP OVER PERFORATION
2348 BNE GLPNBF ;IF NOT A BLANK LINE, FINISH BUFFER
2354 13$: MOV #40,A ;TAB - SPACE OVER
2361 BEQ GLPNXC ;IGNORE CR
2364 MOV #'$,A ;PRINT ALTMODE AS DOLLAR
2367 16$: BIS #100,A ;RANDOM CONTROL AS UPARROW, LETTER
2373 GLPNRM: CALL GLPPUT ;HERE FOR NORMAL CHARACTER
2374 GLPNXC: DEC C ;HERE TO GOBBLE CHARACTER
2375 BGT GLPNCL ;BRANCH IF MORE CHARS TO GO
2376 BR GLPEND ;BUFFER EMPTIED
2378 GLPNBF: CALL GLPBWW ;HERE TO ADVANCE TO NEXT BUFFER
2379 GLPNB1: CMP GB.STA(H),#%GBIDL ;NEXT BUFFER AVAIL?
2380 BNE GLPEN1 ;NO, STOP
2381 CALL GLPBGB ;YES, GOBBLE IT
2384 GLPESC: DEC C ;HERE FOR TWO CHAR ESC SEQ
2385 BEQ GLPEND ;-10 FORGOT 2ND CHAR, FLUSH
2386 MOV GLPPTR,A ;GET & DECODE 2ND CHAR
2389 BR GLPNXC ;OTHER CHARS ARE IGNORED
2393 CALL GLPBWW ;EOF, WRITE LAST BUFFER
2394 GLPEN1: DEC C ;GOBBLE A CHARACTER
2395 GLPEND: MOV C,GLPCTR ;HERE WHEN DONE, RELEASE 10'S BUFFER
2396 CMP GB.STA(H),#%GBMP ;BUFFER ACTIVE AT M.P. LEVEL?
2397 BNE 1$ ;IF NOT, DON'T CLOBBER GB.PNT
2398 MOV D,GB.PNT(H) ;IF SO, REMEMBER AMT OF STUFF IN CURRENT BUFFER
2399 1$: RET ;RETURN TO MAIN LOOP
2401 ;OUTPUT PRINTING CHAR IN A
2403 GLPPUT: CMP D,GLPLIM ;LINE OVERFLOW?
2405 CALL GLPBWW ;YES, DONE WITH THIS BUFFER
2406 INC GLPROW ;OUGHT TO CHECK FOR PERFORATION, BUT...
2407 CMP GB.STA(H),#%GBIDL ;MORE BUFFERS?
2410 5$: MOVB A,(D)+ ;DROP CHAR IN BUFFER
2411 INC GLPCOL ;AND ADVANCE COLUMN
2414 6$: MOVB A,GLIMBO ;NO BUFFERS, SAVE CHAR BEING PRINTED
2415 SETOM GLIMBF ;SET FLAG SO WILL BE PRINTED NEXT TIME
2416 TST (SP)+ ;STOP THE WORLD
2419 ;GOBBLE IDLE BUFFER H -> FOR M.P. RETURNS GB.PNT(H) IN D.
2421 GLPBGB: MOV #%GBMP,GB.STA(H) ;ACTIVATE AT M.P. LEVEL
2422 CLR GB.FF(H) ;INIT THE BUFFER
2424 CLR GLPCOL ;START LINE IN COLUMN 0
2425 MOV H,D ;INIT INSERT POINTER
2428 MOV H,GLPLIM ;SET UP MAX. VALUE OF GB.PNT
2432 ;GIVE BUFFER H -> TO P.I. LEVEL
2434 GLPBWW: BIT #1,D ;MUST BE EVEN NUMBER OF BYTES
2438 1$: PUSH A ;INTERFACE GETS BYTES IN WRONG ORDER
2439 MOV P,A ;COMPUTE NUMBER OF WORDS IN LINE
2444 CLR (D)+ ;CAN'T HAVE ZERO-LENGTH LINE
2446 4$: MOV A,GB.PNT(H) ;SAVE WORD COUNT FOR P.I. LEVEL
2450 TST GLPFIL ;IF STARTING NEW FILE,
2453 SETOM GB.FF(H) ; BE SURE TO GET NEW PAGE
2454 5$: MOV #%GBWRT,GB.STA(H) ;QUEUE TO P.I. LEVEL
2455 MOV GB.NXT(H),H ;ADVANCE TO NEXT BUFFER
2457 MASK 6 ;STOP P.I. LEVEL (HAVE TO LOCK OUT GLPBRK & CLKBRK)
2458 TST GLPOAC ;PRINTER ON?
2460 MOV #%GCOFF,@#GLPCSR ;NO, CLEAR OLD STUFF IN INTERFACE
2461 TST GLPGF1 ;AND PUT IN LOW-SPEED GRAPHIC MODE IF NECC
2463 MOV #%GCGRF,@#GLPCSR
2464 MOV #%GCLSL,@#GLPCSR ;LOW SPEED (COME ON, THIS IS ONLY A KL10!)
2465 6$: MOV #%GCON,@#GLPCSR ;TURN IT ON
2466 MOV #%GCION,@#GLPCSR ;TURN ON INTERRUPTS
2468 ; PUSH @#PS ;FAKE AN INTERRUPT
2469 ; CALL GLPBRK ;IS THIS NECESSARY?
2473 ;GOULD LPT VARIABLES
2475 GLPCOL: 0 ;CURRENT COLUMN NUMBER
2476 GLPROW: 0 ;CURRENT ROW NUMBER
2477 GLPRMX==67. ;NUMBER OF LINES PER PAGE
2478 GLPLIM: 0 ;ADDRESS OF END OF CURRENT BUFFER
2479 GLPOAC: 0 ;NON-ZERO => GOULD LPT P.I. ACTIVE
2480 GLPGF1: 0 ;NON-ZERO => GOULD LPT IN GRAPHIC MODE
2481 GLIMBO: 0 ;SAVE CHAR HERE WHEN RUN OUT OF BUFFERS
2482 GLIMBF: 0 ;NON-ZERO => CHAR IN GLIMBO
2483 GLPFIL: 0 ;NON-ZERO => IN MIDDLE OF A FILE
2484 GLPTIM: 10. ;COUNT DOWN WHEN LOSING
2485 GLPERR: 0 ;NON-ZERO => ERROR STATUS FROM P.I.
2492 ;DISK UNIBUS REGISTERS
2494 DSKCRA=176700 ;COMPLETION REGISTER A
2495 %DAPON==100000 ;SPONTANEOUS COMPLETION DUE TO POWER-ON. DISK NUMBER
2496 ; IN LOW BITS OF COMMAND-COMPLETION REGISTER B
2497 %DACQE==10000 ;CONSISTENCY ERROR IN COMMAND QUEUE
2498 %DANXM==4000 ;NXM ERROR IN COMMAND QUEUE
2499 %DAPAR==2000 ;PARITY ERROR IN COMMAND QUEUE
2500 ;LOW 2 BITS OF COMMAND COMPLETION REGISTER A AND
2501 ;COMMAND COMPLETION REGISTER B CONTAIN THE ADDRESS
2502 ;OF THE PARITY OR NXM ERROR
2503 DSKCRB=176702 ;COMPLETION REGISTER B
2504 DSKCSR=176704 ;COMMAND/STATUS REGISTER
2505 %DCCPL==100000 ;COMMAND IS COMPLETE, RESET BY %DCACK. READ-ONLY
2506 %DCDER==40000 ;"DMA ERROR", RESET ONLY BY SYSTEM RESET.
2508 ;BITS 30004 ALWAYS ON
2509 %DCMNT==4000 ;HOST-ADAPTOR MAINTENANCE MODE
2510 %DCRST==2000 ;RESET. WRITE-ONLY.
2511 %DCACK==1000 ;ACKNOWLEDGE COMMAND COMPLETION. WRITE-ONLY
2512 %DCCMD==400 ;TAKE COMMAND FROM CTRA/CTRB. WRITE-ONLY
2513 %DCRDY==200 ;READY TO TAKE A COMMAND. READ-ONLY
2514 %DCTIE==100 ;COMMAND TRANSMISSION (%DCRDY) INTERRUPT ENABLE
2515 %DCCIE==40 ;COMMAND COMPLETION (%DCCPL) INTERRUPT ENABLE
2516 %DCPCY==20 ;POWER JUST CYCLED ON OR OFF. READ-ONLY
2517 %DCPON==10 ;POWER ON. READ-ONLY
2518 %DCDMA==2 ;DMA IN PROGRESS. READ-ONLY
2519 %DCBOT==1 ;BOOT (READ DRIVE 0 SECTOR 0 INTO MEMORY 0). WRITE-ONLY
2520 DSKCTA=176706 ;COMMAND TRANSMISSION A (ADDRESS OF RQB HIGH BITS)
2521 DSKCTB=176710 ;COMMAND TRANSMISSION B (ADDRESS OF RQB LOW BITS)
2522 ;176714 DUPLICATES DSKCSR FOR UNKNOWN REASONS
2524 ;DISK REQUEST BLOCK. WE ONLY HAVE ONE SINCE NO SEEK OVERLAP.
2526 RQBACT: 0 ;NON-ZERO IF REQUEST ACTIVE AND EXPECTING COMPLETION
2528 RQBID: 0 ;RETURNED IN CCRB WHEN COMMAND COMPLETES
2529 RQBSTS: 0 ;STATUS STORED BY 2561, COPIED INTO DSCSTS
2530 RQBFLT: 0 ;FAULT CODE IN HIGH BYTE, BITS 1-0 HIGH BITS OF LINK ADDRESS
2531 RQBLNK: 0 ;LINK ADDRESS TO NEXT RQB (MUST BE ZERO)
2532 RQBCMD: 0 ;COMMAND CODE, COPIED FROM DSCCMD
2533 RQBDRV: 0 ;UNIT NUMBER, COPIED FROM DSCDRV
2534 RQBCYL: 0 ;CYLINDER NUMBER, COPIED FROM DSCCYL
2535 RQBHED: 0 ;HEAD NUMBER, COPIED FROM DSCHED
2536 RQBSEC: 0 ;SECTOR NUMBER, COPIED FROM DSCSEC
2537 RQBWC: 0 ;POSITIVE WORD COUNT (ALWAYS 12.*256.)
2538 RQBMA: 0 ;MEMORY ADDRESS (ALWAYS DSKBUF)
2539 RQBMAH: 0 ;MEMORY ADDRESS HIGH (ALWAYS 0)
2540 ; BITS 1-0 BITS 17-16 OF ADDRESS. BIT 6 MA INCR INH
2541 RQBID1: 0 ;RETURNS RECORD ID 1
2542 RQBID2: 0 ;RETURNS RECORD ID 2
2543 RQBMNT: .BLKW 27. ;DIAGNOSTIC DATA MAY BE RETURNED
2545 ;DISK BUFFER. HOLDS ENOUGH 12-BIT BYTES IN 16-BIT WORDS TO MAKE 1024. 36-BIT WORDS
2546 DSKBUF: .BLKW 3.*1024.
2548 ;ROUTINE TO START DISK IF IT IS READY AND THERE IS A REQUEST.
2549 DSKSTR: TST DSCREQ ;ANY REQUEST FROM 10?
2552 BNE 99$ ;CHECK WORD WRONG, DON'T TOUCH DISK
2553 TST RQBACT ;PREVIOUS OPERATION FINISHED?
2555 BPT ;NO, MUST BE BUG IN 10?
2556 10$: TSTB DSKCSR ;TEST IF READY FOR COMMAND TRANSMISSION
2558 CLR DSCDON ;YES, CLEAR 10/11 COMMUNICATION FLAGS
2560 CLR RQBLNK ;SET UP RQB FROM 10'S PARAMETERS
2569 CMP RQBCMD,#%DMWRT ;IF A WRITE COMMAND, MUST COPY DATA BUFFER
2572 .REPT 4 ;TAKES 4 BYTE POINTERS TO DO IT
2573 MOV #DSCPNT+<2*.RPCNT>,H
2574 .REPT 3 ;EACH BYTE POINTER HAS 768 12-BIT BYTES
2579 30$: CLR DSKCTA ;GIVE ADDRESS OF RQB TO 2561
2581 SETOM RQBACT ;TELL INTERRUPT LEVEL INTERRUPT EXPECTED
2582 MOV #%DCCMD+%DCCIE,DSKCSR ;GIVE COMMAND, ENABLE COMPLETION INTERRUPT
2585 ;CALL HERE WHEN DISK INTERRUPTS
2586 DSKBRK: PUSH <A,B,C,D,H,I> ;SAVE ALL REGISTERS
2588 BIT #%DCPCY,A ;POWER CYCLED?
2589 BNE 5$ ;YES, RESET CONTROLLER AND IGNORE INTERRUPT
2590 BIT #%DCMNT,A ;NO, MAINTAINENCE MODE
2592 BPT ;BLEAH, MUST BE BROKEN
2595 4$: BIT #%DCDER,A ;WHAT ABOUT UNIBUS ERROR
2598 5$: MOV #%DCRST,DSKCSR ;RESET THE CONTROLLER AND TURN OFF INTERRUPTS
2599 TST RQBACT ;DID THIS LOSE IN THE MIDDLE OF A DISK OPERATION?
2600 BEQ 99$ ;NO, DISMISS
2601 MOV #%DFRST,A ;YES, GIVE ERROR STATUS
2605 10$: BIT #%DCCPL,A ;TEST FOR COMMAND COMPLETION
2606 BPL 99$ ;NO, IGNORE INTERRUPT
2607 MOV DSKCRA,A ;GET COMPLETION STATUS
2609 MOV #%DCACK+%DCCIE,DSKCSR ;ACKNOWLEDGE COMPLETION, ENABLE MORE INTERRUPTS
2610 TST RQBACT ;EXPECTED?
2612 BIT #%DAPON,A ;POWER-UP INDICATION?
2613 BNE 99$ ;FOR NOW, IGNORE IT
2614 BIT #%DACQE+%DANXM+%DAPAR,A
2615 BEQ 30$ ;OK, NO COMMAND-QUEUE ERROR
2616 MOV #%DCRST,DSKCSR ;RESET CONTROLLER (I DON'T KNOW IF IT NEEDS IT)
2617 20$: MOV A,DSCFLT ;COMMAND-QUEUE ERROR, GIVE STATUS TO PDP10
2621 30$: CLR DSCFLT ;CLEAR HIGH BYTE
2622 MOVB RQBFLT+1,DSCFLT ;PICK UP FAULT CODE, PUT IN LOW BYTE
2623 BEQ 35$ ;IF FAULT CODE IS NON-ZERO, THE THING MAY BE FROZEN,
2624 MOV #%DCRST,DSKCSR ;SO RESET IT. OTHERWISE ERROR SEEMS TO HAPPEN OVER AND OVER
2625 35$: MOV RQBSTS,DSCSTS ;GIVE STATUS TO PDP10
2626 MOV RQBCYL,DSCCYL ;STORE BACK DISK ADDRESS, MAY BE USEFUL TO PDP10
2629 BIT #%DMRED,RQBCMD ;IF COMMAND WAS READ, COPY BUFFER BACK
2632 .REPT 4 ;TAKES 4 BYTE POINTERS TO DO IT
2633 MOV #DSCPNT+<2*.RPCNT>,H
2634 .REPT 3 ;EACH BYTE POINTER HAS 768 12-BIT BYTES
2639 80$: SETOM DSCDON ;SIGNAL PDP10 OPERATION IS COMPLETE
2640 BIS #DLX10I,DLXCSR ;AND INTERRUPT THE PDP10
2641 CLR RQBACT ;NO LONGER EXPECTING COMPLETION ON THE RQB
2642 99$: POP <I,H,D,C,B,A> ;RESTORE REGISTERS AND EXIT INTERRUPT
2646 .SBTTL SET LINE PARAMETERS
2649 ;DH11 PARAM REG IN A
2652 SPARAM: CMP I,#NFTTY
2658 2$: CMP B,#1. ;MINIMUM BUFFER SIZE ONE CHARACTER
2661 3$: CMP B,#MAXBSZ ;MAXIMUM BUFFER SIZE <MAXBSZ> CHARACTERS
2664 4$: MOV B,BUFSIZ(I) ;SET AMOUNT OF BUFFER TO BE USED FROM NOW ON
2665 MOV HDWR(I),H ;(BUT NO LONGER DO WE ATTEMPT DYNAMIC BUFFER ALLOCATION)
2668 MASK 5 ;LINE IS A DH11, HAVE TO SET LINE PARAM REG
2669 MOV DHLSEL(I),@DHSCR(H) ;SELECT THE LINE
2670 MOV A,@DHLPR(H) ;GIVE LINE-PARAMETER REG TO DH11
2672 5$: MOV A,LPRVAL(I) ;STORE LPR IN CASE SOMEONE IS CURIOUS
2675 .SBTTL DH11 INPUT INTERRUPT
2678 CONC DH,\.RPCNT+1,<IBK: JSR H,DHIBK>
2682 DHIBK: MOV (H),H ;PICK UP HARDWARE INDEX
2684 1$: MOV @DHNRC(H),A ;RECIEVE A CHARACTER
2685 BPL DHIEX ;EXIT INTERRUPT IF NO MORE CHARS
2686 MOV A,I ;EXTRACT LINE NUMBER
2692 CMP I,#NLDHTY ;IGNORE NON-EXISTENT LINES
2695 CALL @TTYIPC(I) ;CALL LINE HACKER
2696 BR 1$ ;AND CHECK FOR MORE
2698 DHIEX: POP <I,B,A,H>
2703 DHNRMI: BIT #%DXPAR,A
2704 BEQ 1$ ;IGNORE IF PARITY ERROR
2706 1$: BIT #%DXBRK,A ;IF BREAK,
2708 TST AUTOSP(I) ;AND LINE WANTS AUTOSPEED-ON-BREAK FEATURE
2710 ASPMD: MOV #DHASP,TTYIPC(I) ;PUT IT IN AUTOSPEED MODE
2711 MOV DHLSEL(I),@DHSCR(H) ;AND SET HARDWARE TO 1200 BAUD
2712 MOV #023103,@DHLPR(H)
2715 ;CHAR IN A RECEIVED FROM LINE IN I
2716 RCV: BIC #177400,A ;8-BIT CHAR RECEIVE
2717 RCV.FW: TST NO.ITS ;ENTER HERE FOR FULL WORD RECEIVE
2719 21$: MOV #DWNMSG,A ;ITS DOWN, GIVE MESSAGE
2724 CMP RINGCT(B),#TYIRSZ-2
2726 CALL PUT ;FIRST PUT THE CHARACTER
2729 CALL PUT ;THEN THE TENNISH LINE NUMBER
2732 11$: MOV #IBOMSG,A ;INPUT BUFFER OVERFLOW
2735 .IFNZ NMPTYS ;HANDLE INPUT FROM THE MULTIPLEXOR LINE
2738 MOV MPXSEL,I ;CURRENT INPUT LINE
2739 TSTB A ;SPECIAL CHAR?
2741 JMP @TTYIPC(I) ;NO, RECEIVE ON APPROP LINE
2743 1$: MOV A,I ;SPECIAL CHAR, EXTRACT LINE#
2745 ;FOLLOWING FEATURE COMMENTED OUT SINCE IT CAUSES 11 TO LOOP
2746 ; WHEN NEXT INPUT ARRIVES -- NOT OBVIOUS HOW TO FIX.
2747 ; CMP I,#77 ;SELECT NON-MULTIPLEX INPUT?
2748 ; BEQ 3$ ;YES, DO SO
2752 BHI 2$ ;OUT OF RANGE, IGNORE
2753 MOV I,MPXSEL ;INPUT SELECT, SAVE LINE#
2756 3$: MOV #MPXIDX,MPXSEL ;SELECT PASS THROUGH
2760 ;AUTOSPEED MODE COMES HERE WHEN CHAR RECIEVED
2762 DHASP: BIC #177400,A ;CLEAR FRAMING ERR, ETC.
2763 BEQ ASP10 ;11 0'S = 110 BAUD
2764 CMP A,#200 ;7 0'S, 1 = 150 BAUD
2766 CMP A,#170 ;3 0'S, 4 1'S, 0 = 300 BAUD
2768 CMP A,#370 ;300/600 IS NOW RUBOUT, NOT I
2770 CMP A,#146 ;1 0, 2 1'S, 2 0'S, ... = 600
2772 CMP A,#340 ;5 0'S, 3 1'S ? MYSTERY TO ME
2774 CMP A,#015 ;CR = 1200
2776 CMP A,#215 ;CR WITH EITHER PARITY
2778 MOV A,#. ;SAVE GARBAGE FOR DEBUGGING
2779 RET ;SOMETHING ELSE, IGNORE
2781 ASP10: MOV #006307,A ;110 IN, 110 OUT, NO PARITY, 8 BITS, EXTRA STPBT
2786 ASP15: MOV #012503,A ;150 IN, 150 OUT, NO PARITY, 8 BITS
2791 ASP30: MOV #016703,A ;300 IN, 300 OUT, NO PARITY, 8 BITS
2796 ASP36: MOV #020703,A ;300 IN, 600 OUT, NO PARITY, 8 BITS
2801 ASP60: MOV #021003,A ;600 BAUD, NO PARITY, 8 BITS
2806 ASP120: MOV #023103,A ;1200 IN, 1200 OUT, NO PAR, 8 BITS
2811 ASPX: CALL SPARAM ;SET BUFFER SIZE AND HARDWARE SPEED
2812 MOV I,A ;SET UP SET-SPEED COMMAND TO -10
2815 TST TTYHNG(I) ;IF THIS IS NEW STATUS FOR 10,
2817 INC HNGSIG ;INDICATE STATUS WAITING
2818 11$: MOV A,TTYHNG(I) ;SAVE THIS LINE'S LATEST STATUS
2819 MOV #ASPACK,A ;ACKNOWLEDGE TO USER THAT HE WON
2821 DEC TYPING(I) ;IF NO WAKEUP FOR 10, HIT CALL WHEN TYPING DONE
2822 MOV NRMIPC(I),TTYIPC(I) ;AND TAKE LINE OUT OF AUTOSPEED MODE
2825 .SBTTL DH11 OUTPUT INTERRUPTS
2828 CONC DH,\.RPCNT+1,<OBK: JSR H,DHOBK>
2832 DHOBK: MOV (H),H ;GET HARDWARE UNIT NUMBER
2833 BIT #DHSNXM,@DHSCR(H) ;IS THIS INTERRUPT DUE TO NXM?
2836 1$: BIC #DHTDON,@DHSCR(H) ;HARDWARE KLUDGE TO MAKE INTERRUPTS WIN
2838 MOV DHOAC(H),C ;SEE WHICH BAR BITS HAVE TURNED OFF
2852 CMP I,#NLDHTY ;IGNORE NON-EXISTENT LINES
2859 DHOEX: POP <I,C,B,A,H>
2862 XMTDON: TST TYPING(I) ;HERE WHEN OUTPUT FINISHES
2863 BGT 1$ ;BRANCH IF -10 WANTS TO KNOW ABOUT IT
2864 BEQ 3$ ;BRANCH IF NOTHING TO DO
2865 MOV #32,A ;SEND A CALL
2870 ASR A ;PUT TENNISH LINE NUMBER INTO RING
2871 MOV #TYORNG,B ;MAIN PROG LEVEL WILL LATER TELL -10
2876 .IFNZ NMPTYS ;OUTPUT DONE ON MULTIPLEXED LINE
2877 MPXDON: PUSH <C,D,H,I>
2880 NEG MPXOAC ;SENT HEADER, NOW SEND DATA
2888 1$: MOV MPXOLN,I ;OUTPUT IS DONE ON THAT LINE NOW
2891 CLR MPXOAC ;MPX IDLE
2892 CALL STRMPX ;LOOK FOR NEW STUFF TO DO
2897 .SBTTL DL11 INTERRUPTS
2900 CONC DL,\.RPCNT+1,<IBK: JSR H,DLIBK>
2902 CONC DL,\.RPCNT+1,<OBK: JSR H,DLOBK>
2906 DLIBK: MOV (H),H ;GET HARDWARE INDEX OF INTERRUPTING UNIT
2908 MOV @DLKB(H),A ;GET RECEIVED CHARACTER
2909 MOV DLTYNO(H),I ;GET LINE NUMBER RECEIVED ON
2911 BNE 2$ ;ONLY T00 CAN RETURN TO KLDCP
2912 BIT #20000,A ;IF BREAK KEY IS HIT
2914 SETOM KLDCPF ;USER WANTS TO RETURN TO KLDCP
2915 BR DLBKEX ;FOR ONE COMMAND LINE
2917 1$: TST DDTMOD ;IF IN DDT MODE,
2919 BIC #-200,A ; HANDLE INPUT DIFFERENTLY
2926 DLBKEX: POP <I,B,A,H>
2929 DLOBK: MOV (H),H ;GET HARDWARE INDEX OF INTERRUPTING UNIT
2931 BEQ DLBKX1 ;NOT SUPPOSED TO BE TYPING OUT, IGNORE INT
2932 DEC DLBC(H) ;GOT ANY MORE CHARACTERS?
2933 BLT DLBKX2 ;NO, GO GIVE OUTPUT DONE
2934 MOV DLCA(H),-(SP) ;YES, GIVE NEXT CHARACTER
2935 MOVB @(SP)+,@DLPB(H)
2940 DLBKX2: PUSH <A,B,I> ;OUTPUT DONE
2941 MOV DLTYNO(H),I ;GET TTY INDEX OF INTERRUPTING LINE
2942 CLR DLOAC(H) ;OUTPUT NO LONGER ACTIVE ON THIS LINE
2946 .SBTTL CLOCK INTERRUPT
2948 ;NOTE - IT IS IMPORTANT THAT THIS BE AT A HIGHER INTERRUPT LEVEL THAN THE CHAOS NET
2949 CLKBRK: SETOM WAKE ;WAKE UP MAIN LOOP
2951 PUSH @#PS ;CHECK GOULD LPT
2952 CALL GLPBRK ;(LOSES INTERRUPTS)
2953 DEC GLPTIM ;TIME TO CHECK GOULD LPT?
2956 BIT #%GSNRD,@#GLPCSR ;YES, LOSING?
2958 CLR GLPERR ;PROBABLY NOT
2959 BR 13$ ;(CAN'T TELL FOR SURE IF %GCON NOT DONE)
2961 14$: MOV @#GLPCSR,GLPERR ;LPT LOSING, TELL 10
2962 CALL GLPRST ;AND MAKE SURE BUFFERS DON'T CHOKE UP
2965 .IFNZ NDMS ;MODEM SCANNER GETS SHUT OFF SOMEHOW
2966 CLR A ;loop over the DM11s, turning them on
2968 259$: BIT #DMSCN,@DMCSR(A)
2970 BIT #DMIEN,@DMCSR(A)
2972 14$: MOV #DMSCN+DMIEN,@DMCSR(A) ;ENABLE SCANNER INTERRUPTS
2973 15$: TST (A)+ ;next DM11
2974 SOB B,259$ ;until all DM11s done
2977 .IFNZ CHAOSP ;WAKE-UP OUTPUT LINKS IN RE-TRANSMIT DELAY
2979 50$: MOV CHOHWR(I),A ;ADDRESS OF HARDWARE CSR
2980 TST CHOSTS(I) ;IF ZERO, IS IDLE, DON'T WANT INTERRUPT ENABLE
2981 BEQ 51$ ;NOTE THAT THIS RUNS MASKED HIGHER THAN CHAOS INT LVL
2982 BIS #%CATEN,(A) ;RE-ENABLE INTERRUPT IF OFF
2985 BIT #%CATDN,(A) ;TRANSMIT-DONE?
2987 INC CHSIDL(I) ;NO, KEEP TIME-OUT
2988 CMP CHSIDL(I),#60. ;IF TRANSMIT-DONE STUCK OFF FOR 1 SECOND,
2990 MOV #%CARST,(A) ; THEN RESET THE INTERFACE
2991 ; MOV #%CAREN+%CATEN,(A) ;INTERRUPT ENABLES WILL TURN THEMSELVES BACK ON IF NECESSARY!
2992 INC CHSRST(I) ;COUNT NUMBER OF TIMES HAD TO DO THIS
2997 CMP I,#CHXCHS+CHAOSP+CHAOSP
3000 DEC PULSAR ;TIME TO GENERATE TEST PACKET TO CHAOS NET?
3002 MOV PULSON,PULSAR ;RE-INITIALIZE COUNTER
3003 .REPT CHAOSP ;YES, AWAKEN ALL TRANSMIT INTERRUPT SIDES
3004 BIS #%CATEN,@CHOHWR+CHXCHS+<2*.RPCNT>
3007 TST CHOSTS+CHXT11 ;AWAITING BUFFER FROM 10?
3008 BNE 65$ ;YES, COUNT TIMEOUT
3009 CLR T11TIM ;NO, RESET TIMEOUT
3012 66$: DEC 4SEC ;TIME FOR 4-SECOND CLOCK?
3014 MOV #4*60.,4SEC ;YES
3015 MOV #<NSUBNT-1>*2,I ;INCREMENT ROUTING COSTS
3016 71$: TST SBNTYP(I) ;THIS GUY'S COSTS SUPPOSED TO INCREMENT?
3018 CMP SBNCST(I),#1000 ;DON'T INCREMENT TOO HIGH AND OVERFLOW
3023 DEC 15SEC ;TIME FOR 15-SECOND CLOCK? (REALLY 16)
3026 .REPT CHAOSP ;TELL CABLES TO BROADCAST %CORUT PACKETS
3027 SETOM CHXRTF+CHXCHS+<2*.RPCNT>
3028 BIS #%CATEN,@CHOHWR+CHXCHS+<2*.RPCNT>
3030 .IIF NZ ETHERP, SETOM CHXRTF+CHXETH ;TELL ETHERNET TO BROADCAST ROUTING
3031 90$: ;CAN'T DO IT NOW BECAUSE WRONG INTERRUPT LEVEL
3034 INC DVRTIM ;TIME OUT DOVER CONNECTION
3035 CMP DVRTIM,#15.*60. ;IF IDLE FOR 15 SECONDS, FLUSH
3039 15$: INC DVRRTR ;COUNT UP RETRANSMISSION COUNTER
3041 .IFNZ NDMS ;GOT ANY TTYS WITH MODEM CONTROL?
3042 MOV #NFTTY,I ;CHECK FOR HANGUPS
3043 16$: TST DIALED(I) ;HANGUP IN PROGRESS ON THIS LINE?
3045 INC DIALED(I) ;YES, TIMED OUT?
3047 CLR DIALED(I) ;YUP, LINE IS HUNG UP
3048 MOV I,A ;TELL -10 ABOUT IT
3050 TST TTYHNG(I) ;IF THIS IS NEW STATUS FOR 10,
3052 INC HNGSIG ;INDICATE STATUS WAITING
3053 18$: MOV A,TTYHNG(I) ;SAVE THIS LINE'S LATEST STATUS
3060 ROR SWR ;LOW BIT OF SWITCHES => DDT
3065 .SBTTL MODEM CONTROL
3067 ;;; hack multiple DM interrupt vectors
3069 CONC DM,\.RPCNT+1,<BRK: JSR H,DMBRK>
3075 MOV (H),A ;get the device offset in A
3076 MOV @DMCSR(A),I ;GET ASSOCIATED TTY INDEX
3077 BIC #177760,I ;gives us channel (0-17) on this DM11
3078 ;; now add <device # * 16.> to get offset into table for any DM
3079 MOV A,B ;device offset in B, is 2*device number
3082 ASL B ;multiply by 8 for offset in B
3083 ADD B,I ;add to I for offset for this channel
3084 ASL I ;now get word offset in I by shifting
3085 ;; get index into map between DM channels and TTY indices
3087 BEQ 90$ ;EXIT IF THIS LINE NOT UNDER MODEM CONTROL
3088 ; TST @DMCSR(A) .SEE DMRNG
3090 ; TST DIALED(I) ;RINGING. IS LINE DIALED UP ALREADY?
3091 ; BNE 10$ ;YES, NOT SUPPOSED TO BE RINGING
3092 ; MOV #LINENB+LINDTR,@DMLSR(A) ;ANSWER THE PHONE
3094 10$: BIT #LINCTS,@DMLSR(A) ;DO WE HAVE CLEAR-TO-SEND?
3096 TST DIALED(I) ;YES, WHAT WAS PREVIOUS STATE?
3097 BEQ 13$ ;WAS OFF, THIS IS A DIALUP
3098 BPL 90$ ;WAS ON, IGNORE
3099 NEG DIALED(I) ;WAS HANGING UP, ABORT IT
3102 13$: INC DIALED(I) ;LINE IS NOW DIALED UP
3103 TST DMINI ;IF GETTING INITIAL STATE,
3104 BNE 90$ ;DON'T HACK AUTOSPEED
3105 TST AUTOSP(I) ;IF IT HAS AUTOSPEED,
3107 MOV HDWR(I),H ;HACK THAT
3111 20$: TST DIALED(I) ;CTS DROPPED
3112 BMI 90$ ;ALREADY KNOWN ABOUT, IGNORE
3113 MOV #-HNGDLY,DIALED(I) ;OTHERWISE START HANGUP TIMEOUT
3115 90$: BIC #DMDON,@DMCSR(A) ;RESTART SCANNER
3122 .SBTTL GOULD PRINTER P.I. LEVEL
3124 GLPBRK: BIT #%GSBSY,@#GLPCSR
3128 1$: BIT #%GSDON,@#GLPCSR
3130 RTI ;LPT BUSY OTHER FLAVOR
3133 BIT #%GSERR,@#GLPCSR ;LPT LOSING?
3135 CALL GLPRST ;YUP, RESET THE BUFFERS
3136 MOV @#GLPCSR,GLPERR ;AND TELL 10
3138 GLPOFF: CLR GLPOAC ;HERE TO STOP P.I.
3139 MOV #%GCIOF,@#GLPCSR
3140 MOV #5000.,A ;LPT SOMETIMES BUSY FOR A WHILE
3141 1$: BIT #%GSBSY,@#GLPCSR ;HAVE TO WAIT SO TONER PUMPS WILL
3142 BEQ 2$ ;REALLY TURN OFF
3144 2$: MOV #%GCOFF,@#GLPCSR
3148 GLPFIN: MOV #%GBIDL,GB.STA(H) ;DONE WITH THIS BUFFER
3149 MOV GB.NXT(H),H ;CHECK NEXT
3152 GLPBR1: MOV GLPOOP,H ;CHECK ON BUFFERS
3153 CMP GB.STA(H),#%GBDMA ;FINISH DMA XFER?
3155 CMP GB.STA(H),#%GBWRT ;QUEUED OR ALREADY ACTIVE AT P.I.?
3156 BLT GLPOFF ;NO, STOP
3157 MOV #%GBPI,GB.STA(H) ;YES, ACTIVATE IT AT P.I.
3158 TST GB.FF(H) ;NEED FF?
3160 MOV #%GCFF,@#GLPCSR ;YES
3164 1$: TST GB.NL(H) ;NEED BLANK LINES?
3166 DEC GB.NL(H) ;YES, GIVE ONE
3167 MOV #%GCADV,@#GLPCSR
3170 2$: MOV H,B ;SET UP TEXT ADDR
3172 MOV GB.PNT(H),A ;SET UP TEXT WORD COUNT
3175 MOV B,@#GLPCA ;START XFER
3176 MOV #%GBDMA,GB.STA(H) ;FLAG BUFFER ACTIVE AT DMA LEVEL
3180 MOV #GLPBFF,H ;FLUSH ALL BUFFERS
3187 MOV #60.*10.,GLPTIM ;SET TIMEOUT
3195 .SBTTL CHAOSNET ROUTINES
3197 ;ALL ROUTINES ON THIS PAGE CALLED WITH INTERRUPTS MASKED, INDEX IN I.
3199 ;REFILL FROM CHAOS INTERFACE
3200 CHSRFL: BIS #%CAREN,@CHIHWR(I) ;TURN ON RECEIVER INTERRUPTS
3201 RET ;WILL NOTICE INPUT LATER
3204 ;LOOPS BACK TO HERE WHEN DISCARDING A PACKET
3205 DLCRF1: CMP (SP)+,(SP)+ ;POP <D,H>
3207 INC DLCSS1(A) ;2 ;INDICATE BUFFER HAS BEEN COPIED
3208 BIS #DLX10I,DLXCSR ;AND INTERRUPT THE PDP10
3211 DLCRFL: CALL DLCCHK ;SEE IF DL10 IS DISABLED
3212 BNE 99$ ;BRANCH IF YES
3213 MOV #2,A ;CHECK BOTH 10 TO 11 BUFFERS SO CAN'T GET OUT OF PHASE WITH 10
3214 10$: CMP DLCSS1(A),#1 ;10 SAYS BUFFER READY?
3216 SUB #2,A ;NO, TRY NEXT
3220 11$: PUSH A ;SAVE CURRENT 10 TO 11 BUFFER
3221 ADD #DLCSP1,A ;OUTPUT READY, GET IT
3222 MOV #DLCIBF,B ;COPY INTO BUFFER
3223 .REPT PKHDW ;FIRST GET HEADER
3227 CALL CHSIHD ;PROCESS HEADER, GET LENGTH, DEST
3228 BVS DLCRF1 ;BRANCH IF PACKET NO GOOD
3231 SUB CHIHDL(I),C ;GET NUMBER OF DATA WORDS TO FOLLOW
3232 CALL MOVHD ;MOVE THOSE WORDS
3233 POP <C,A> ;RESTORE LENGTH, 10 TO 11 BUFFER NUMBER
3234 INC DLCSS1(A) ;2 ;INDICATE BUFFER HAS BEEN COPIED
3235 BIS #DLX10I,DLXCSR ;AND INTERRUPT THE PDP10
3236 TST B ;SWAB IF NOT TO 10-COMPATIBLE DEST
3238 INC CHISTS(I) ;INDICATE BUFFER READY TO SEND
3241 ;TRANSMIT TO DL10 OUTPUT SINK
3242 ;REQUIRES I TO BE SET UP, SMASHES ALL REGS.
3243 DLCXMT: CALL DLCCHK ;DL10 DISABLED?
3244 BNE 70$ ;YES, DISCARD PACKET
3245 MOV DLCRBN,A ;GET CURRENT 11 TO 10 BUFFER NUMBER
3246 CMP DLCRS1(A),#1 ;BUFFER READY?
3248 MOV CHOINX+CHXDLC,D ;GET ADDRESS OF BUFFER TO BE SENT OVER
3249 MOV CHILNG(D),C ;AND LENGTH
3251 MOV A,H ;GET POINTER TO DL10 MAGIC IDPB WORD
3253 CALL MOVDH ;COPY WORDS INTO PDP10
3254 INC DLCRS1(A) ;SIGNAL DATA AVAILABLE TO PDP10
3255 BIS #DLX10I,DLXCSR ;AND INTERRUPT IT
3256 MOV DLCNXT(A),DLCRBN ;SWITCH BUFFERS
3257 70$: JMP CHSODN ;TRANSMISSION IS DONE ALREADY
3259 80$: MOV #1,CHOSTS+CHXDLC ;TRANSMISSION AWAITING BUFFER FROM 10
3262 ;CALL HERE WHEN DL10 INTERRUPTS, CLOBBERS ALL.
3264 TST CHOSTS+CHXDLC ;DL10 HUNG ON TRANSMIT?
3266 MOV #CHXDLC,I ;YES, WAKE IT UP
3268 10$: TST CHISTS+CHXDLC ;DL10 INPUT ACTIVE?
3270 MOV #CHXDLC,I ;NO, TRY TO GET SOME
3272 TST CHISTS(I) ;GOT SOME?
3274 CALL CHSOUT ;YES, START TRANSMISSION
3275 20$: CALL CHSRUN ;DO ANYTHING ELSE REQUIRED
3279 ;RETURN 'NE' IF DL10 IS DISABLED, BASHES NOTHING.
3284 TST DLCINI ;RE-INITIALIZE?
3285 BEQ 99$ ;NO, EVERYTHING IS OK.
3287 TST CHOSTS+CHXDLC ;WAS OUTPUT HUNG ON DL10?
3289 PUSH <A,B,C,D,I,H> ;YES, SIGNAL OUTPUT DONE ON DL10
3293 90$: CLR DLCINI ;SIGNAL INIT DONE, RETURN 'EQ'
3298 ;THESE CAN MOVE AT MOST 256. WORDS
3302 MOVHD: SUB #256.,C ;GET -#WDS LESS THAN MAXIMUM
3303 ADD C,C ;CONVERT TO BYTES
3304 SUB C,PC ;JUMP INTO MOVE TABLE
3312 MOVDH: SUB #256.,C ;GET -#WDS LESS THAN MAXIMUM
3313 ADD C,C ;CONVERT TO BYTES
3314 SUB C,PC ;JUMP INTO MOVE TABLE
3321 ;REFILL FROM TEN-11 INTERFACE
3322 T11RFL: CALL T11CHK ;CHECK FOR DISABLE
3323 BNE 99$ ;BRANCH IF DISABLED
3325 TST T11IBA ;WAS INPUT BUFFER IN USE?
3327 CLR (A)+ ;YES, INDICATE BUFFER IS NOW EMPTY
3330 ADD #T11BFL-2,A ;ADVANCE POINTER
3335 10$: TST (A) ;INPUT BUFFER CONTAIN A PACKET?
3337 SETOM T11IBA ;YES, INPUT BUFFER NOW ACTIVE
3338 ADD #8,A ;GET INPUT FROM PDP10
3339 MOV A,CHIBFP+CHXT11 ;AS CURRENT INPUT BUFFER
3340 CALL CHSIHD ;PROCESS THE HEADER
3341 BVS T11RFL ;BRANCH IF PACKET NO GOOD
3342 PUSH <A,B,C,H> ;COMPUTE CHECKSUM BEFORE SWABBING
3343 INC C ;C GETS NUMBER OF 32-BIT WORDS
3345 CLR D ;CLEAR LOW WORD OF CHECKSUM
3346 CLR H ;CLEAR HIGH WORD OF CHECKSUM
3347 SUB #PKFCMS+1,PKFC(A) ;DECREMENT FWD COUNT (IS HIGH END OF WORD)
3348 ;FWD COUNT HAS TO BE PUT BACK FOR CHECKSUM COMPUTATION
3349 21$: ADD (A)+,H ;ADD HIGH HALFWORD TO HIGH SUM
3350 ADD (A)+,D ;ADD LOW HALFWORD TO LOW SUM
3351 ADC H ;CARRY INTO HIGH SUM
3352 MOV D,B ;NOW ROTATE RIGHT DOUBLE
3357 MOV T11IBP,A ;NOW COMPARE CHECKSUM
3363 ADD #PKFCMS+1,PKFC(A) ;INCREMENT FWD COUNT (IS HIGH END OF WORD)
3364 TST B ;SWAB IF NOT TO 10-COMPATIBLE DEST
3366 INC CHISTS(I) ;INDICATE BUFFER READY TO SEND
3369 30$: POP <H,C,B,A> ;CHECKSUM ERROR
3370 INC T11CKE ;COUNT CHECKSUM ERRORS
3371 BR T11RFL ;AND IGNORE PACKET
3373 ;TRANSMIT TO TEN11 OUTPUT SINK
3374 ;REQUIRES I TO BE SET UP, SMASHES ALL REGS.
3375 T11XMT: CALL T11CHK ;TEN11 DISABLED?
3376 BNE 70$ ;YES, DISCARD PACKET
3377 TST @T11OBP ;OUTPUT BUFFER EMPTY?
3379 MOV CHOINX+CHXT11,D ;GET ADDRESS OF BUFFER TO BE SENT OVER
3381 MOV CHILNG(D),C ;AND LENGTH
3383 BIT #1,A ;IF ODD NUMBER OF BYTES, CLEAR THE EXTRA ONE
3387 CLRB PKDAT-1(A) ;NOTE, AT THIS POINT BYTES ARE SWAPPED
3388 5$: MOV T11OBP,A ;COPY INTO TEN11 OUTPUT BUFFER
3393 MOV (SP),C ;NOW COMPUTE CHECKSUM
3394 INC C ;C GETS NUMBER OF 32-BIT WORDS
3397 CLR (A)+ ;IF ODD NUMBER OF 16-BIT WORDS, CLEAR THE EXTRA ONE
3398 11$: CLR D ;CLEAR LOW WORD OF CHECKSUM
3399 CLR H ;CLEAR HIGH WORD OF CHECKSUM
3402 21$: ADD (A)+,H ;ADD HIGH HALFWORD TO HIGH SUM
3403 ADD (A)+,D ;ADD LOW HALFWORD TO LOW SUM
3404 ADC H ;CARRY INTO HIGH SUM
3405 MOV D,B ;NOW ROTATE RIGHT DOUBLE
3410 MOV T11OBP,A ;STORE CHECKSUM INTO OUTPUT BUFFER
3414 SETOM (A) ;SIGNAL PRESENCE OF PACKET TO PDP10
3415 ADD #T11BFL,A ;ADVANCE POINTER
3420 70$: CLR T11TIM ;NO TIMEOUT, 10 IS TAKING PACKETS
3421 JMP CHSODN ;TRANSMISSION IS DONE ALREADY
3423 80$: MOV #1,CHOSTS+CHXT11 ;TRANSMISSION AWAITING BUFFER FROM 10
3429 CALL T11CHK ;IS 10 UP?
3430 BNE 30$ ;IT'S DOWN, PUNT IT
3431 TST CHOSTS(I) ;TEN11 HUNG ON TRANSMIT?
3433 CALL T11XMT ;YES, WAKE IT UP
3434 10$: TST CHISTS+CHXT11 ;TEN11 INPUT ACTIVE?
3436 MOV #CHXT11,I ;NO, TRY TO GET SOME
3438 TST CHISTS(I) ;GOT SOME?
3440 CALL CHSOUT ;YES, START TRANSMISSION
3441 20$: CALL CHSRUN ;DO ANYTHING ELSE REQUIRED
3445 30$: TST CHOSTS(I) ;TRANSMITTING TO DEAD TEN-11?
3447 CLR T11TIM ;YES, FLUSH IT
3451 ;CHECK TEN-11 INTERFACE, DO RESET IF NECESSARY, RETURN 'NE' IF DISABLED.
3453 T11CHK: CMP T11TIM,#5*60. ;10 TAKING 5 SECONDS TO RESPOND?
3455 SETOM T11I10 ;YES, DECLARE IT DOWN, REINITIALIZE PROTOCOL
3456 5$: TST T11I10 ;IS 10 DONE INITIALIZING?
3457 BNE 99$ ;NO, DO NOTHING
3458 TST T11I11 ;ARE WE SUPPOSED TO INITIALIZE?
3459 BEQ 99$ ;NO, IT'S OK
3460 MOV #T11OBF,T11OBP ;YES, REINITIALIZE POINTERS
3463 MOV #T11OBF,A ;INITIALIZE INPUT AND OUTPUT BUFFER HEADERS
3464 10$: CLR (A)+ ;CLEAR INTER-MACHINE SIGNAL WORD
3466 ADD #T11BFL-4,A ;SKIP THE REMAINING WORDS
3469 CLR T11IBA ;IDLE THE INPUT
3471 TST CHOSTS+CHXT11 ;WAS OUTPUT HUNG ON TEN11?
3473 PUSH <A,B,C,D,H,I> ;YES, SIGNAL OUTPUT DONE ON TEN11
3477 90$: CLR T11I11 ;SIGNAL INIT DONE, RETURN 'EQ'
3482 ;THIS ROUTINE PROCESSES THE HEADER OF PACKET IN INPUT BUFFER FOR SOURCE I
3483 ;RETURN DESTINATION OUTPUT SINK INDEX IN B (-1 IF THIS IS FOR US (PDP11 ITSELF)),
3484 ;PACKET BUFFER POINTER IN A, AND LENGTH IN WORDS IN C.
3485 ;RETURNS WITH OVERFLOW SET IF PACKET IS DISCARDED BECAUSE OF
3486 ;TOO MUCH FORWARDING, BAD ADDRESS, TOO BIG, CRUFTY, ETC.
3487 ;OTHERWISE RETURNS WITH MINUS INDICATOR SET IF PACKET DIRECTED TO 11.
3488 CHSIHD: ADD #1,NPKSI(I) ;COUNT PACKETS IN FROM THIS SOURCE
3490 MOV CHIBFP(I),A ;POINTER TO PACKET
3491 TSTB (A) ;CHECK FOR MUPPET
3492 BNE CHSIHB ;DISCARD, WE DON'T SUPPORT THEM
3493 MOV #PKHDW,CHIHDL(I) ;SET HEADER LENGTH
3494 ADD #PKFCMS+1,PKFC(A) ;INCREMENT FWD COUNT (IS HIGH END OF WORD)
3495 BCS CHSIHB ;BRANCH IF FORWARDING LOOP
3496 MOV PKNBYT(A),C ;GET BYTE COUNT
3499 BHI CHSIHB ;TOO LONG, LOSES
3500 INC C ;MAKE WORD COUNT
3502 ADD CHIHDL(I),C ;ADD IN LENGTH OF HEADER
3503 MOV C,CHILNG(I) ;SAVE FOR LATER USE
3504 ;; NOW ROUTE THIS PACKET
3505 MOV #-1,B ;MAGIC INDEX MEANING "MYSELF"
3506 MOV PKDHST(A),D ;GET DESTINATION ADDRESS
3507 ;HERE WE HAVE HAIR FOR MULTIPLE CHAOSNETS
3509 CONC <CMP D,#CHAD>,\.RPCNT ;ADDRESSED TO PDP11 ITSELF?
3510 BEQ 50$ ;YES, LET CHSRUN HANDLE IT LATER
3512 CMPB PKOP(A),#%CORUT ;ROUTING INFO PACKET?
3513 BEQ 40$ ;YES, ADDRESS TO PDP11
3514 TST USECBL ;SUPPOSED TO USE CABLE EVEN TO TALK TO SELF?
3516 CMP I,#CHXCHS ;YES, IS THIS COMING FROM CABLE?
3517 BHIS 20$ ;YES, ROUTE REGULAR WAY
3518 MOV #CHXCHS,B ;NO, SEND TO SELF ON FIRST CABLE
3522 20$: MOVB PKDHST+1(A),B ;GET SUBNET ADDRESSED TO
3525 CLR B ;OUT OF RANGE, USE 0
3526 21$: ASL B ;MAKE INDEX INTO SUBNET TABLES
3527 TST SBNTYP(B) ;IS THIS A DIRECT HARDWARE CONNECTION?
3528 BGT 38$ ;YES, SEND TO IT
3529 MOV SBNADR(B),D ;NO, GO VIA GATEWAY
3530 BEQ CHSIRF ;HAVEN'T GOT A GATEWAY, AND BROADCAST CODE NOT WORKING YET
3531 MOVB SBNADR+1(B),B ;GET SUBNET GATEWAY IS ON
3532 ASL B ;MAKE INDEX INTO TABLES
3534 BHIS CHSIRF ;OUT OF RANGE, CAN'T GET THERE FROM HERE
3535 TST SBNTYP(B) ;IS THIS A DIRECT CONNECTION?
3536 BLE CHSIRF ;NO, CAN'T GET THERE FROM HERE (SHOULDN'T HAPPEN!)
3537 38$: MOV SBNADR(B),B ;GET SINK INDEX
3538 39$: MOV D,CHICBA(I) ;STORE CABLE ADDRESS OF IMMEDIATE DEST (GATEWAY)
3539 .IIF NDF NDVRBF, 50$: ;IF NO DOVER, ALL TO-11 PACKETS COME HERE
3540 40$: MOV B,CHIOUX(I) ;STORE SINK INDEX, SET INDICATORS
3541 RET ;NOTE THAT MOV CLEARS OVERFLOW
3544 50$: CMP PKDIND(A),DVRLIX ;DIRECTED TO DOVER?
3546 CMP PKSHST(A),DVRHST
3547 BNE 40$ ;NOT DOVER-CONNECTED HOST
3548 CMP PKSIND(A),DVRIDX
3549 BNE 40$ ;RIGHT HOST, WRONG PROCESS
3550 MOV #CHXDVR,B ;ROUTE PACKET TO DOVER GATEWAY
3554 ;HERE FOR ROUTING FAILURE. METER, RETURN WITH OVERFLOW SET.
3556 MOV B,RFSBNT ;SAVE 2* SUBNET TRYING TO GET TO
3558 ;HERE WHEN CHSIHD SEES A GARBAGE PACKET. RETURN WITH OVERFLOW SET.
3559 CHSIHB: ADD #1,NPKSBD(I) ;GOD-DAMN BRAIN-DAMAGE
3564 ;SWAB PACKET COMING FROM PDP-10 OR ETHERNET (BYTES LEFT TO RIGHT)
3565 ;IF GOING TO INCOMPATIBLE DESTINATION. CALL RIGHT AFTER CHSIHD.
3566 SWAB10: BMI CHSSWB ;SWAB IF TO-11
3567 CMP CHOXMT(B),#CHSXMT ;CHECK DESTINATION TYPE
3568 BEQ CHSSWB ;PDP11 OR CHAOSNET, SWAB IT OUT
3569 5$: RET ;PDP10 OR ETHERNET, LEAVE ALONE
3571 ;SWAB PACKET COMING FROM PDP-11 OR CHAOSNET (BYTES RIGHT TO LEFT)
3572 ;IF GOING TO INCOMPATIBLE DESTINATION. CALL RIGHT AFTER CHSIHD.
3574 BMI 5$ ;RETURN IF TO-11
3575 CMP CHOXMT(B),#CHSXMT ;CHECK DESTINATION TYPE
3576 BEQ 5$ ;PDP11 OR CHAOSNET, LEAVE ALONE
3577 ;PDP10 OR ETHERNET, SWAB IT OUT
3578 ;DROPS THROUGH INTO CHSSWB
3579 ;THIS ROUTINE SWABS THE PACKET FOR THE SOURCE IN I.
3580 ;CALLED WITH NUMBER OF WORDS IN PACKET IN C.
3581 ;CLOBBERS A, C, AND D.
3582 ;SUITABLE FOR CALLING RIGHT AFTER CHSIHD RETURNS.
3583 CHSSWB: MOV CHIBFP(I),A ;ADDRESS OF PACKET
3584 SUB CHIHDL(I),C ;GET LENGTH OF DATA AREA IN WORDS
3586 MOVB PKOP(A),D ;GET OPCODE
3587 BPL 5$ ;BRANCH IF NON-DATA
3588 BIT #100,D ;CHECK FOR BINARY DATA
3589 BEQ 10$ ;NO, GO SWAB
3592 5$: TSTB CHSBIN(D) ;CONTROL, LOOK UP OPCODE
3593 BNE 99$ ;BINARY, NO SWAB
3594 10$: ADD CHIHDL(I),A ;POINT TO DATA AREA OF BUFFER
3595 ADD CHIHDL(I),A ;BYTES, WATSON, BYTES!
3596 SUB #PKTMXW,C ;GET -#WDS LESS THAN MAXIMUM
3597 ADD C,C ;CONVERT TO BYTES
3598 SUB C,PC ;JUMP INTO SWAB TABLE
3604 ;BYTE TABLE INDEXED BY OPCODE, NON-ZERO IF BINARY
3605 ;BINARY OPERATIONS ARE 2 (%COOPN), 7 (%COSTS), 10 (%CORUT)
3606 CHSBIN: .BYTE 0,0,2,0,0,0,0,7,10,0,0,0,0,0
3607 .BYTE 0,0 ;SPARES IN CASE MORE OPCODES ADDED
3610 ;TRANSMIT PACKET FROM INPUT SOURCE I TO OUTPUT SINK, IN B.
3611 ;SMASHES ALL REGISTERS. CHISTS(I), CHIOUX(I), CHICBA(I) MUST BE ALREADY SET UP.
3612 CHSOUT: TST B ;THIS DESTINED TO PDP11?
3613 BMI CHSOUX ;YES, LET CHSRUN PICK IT UP LATER
3614 TST CHOSTS(B) ;IS SINK BUSY?
3615 BNE CHSOUX ;YES, CAN'T SEND NOW, WILL TRY AGAIN LATER
3616 NEG CHISTS(I) ;NO, SET SOURCE STATUS TO CONNECTED
3617 MOV I,CHOINX(B) ;CONNECT SINK TO SOURCE
3618 MOV B,I ;SET UP SINK INDEX
3621 JMP @CHOXMT(I) ;GO START TRANSMISSION TO SINK
3623 ;CALL HERE WHEN OUTPUT IS DONE ON SINK I.
3624 CHSODN: CLR CHOSTS(I) ;IDLE THE SINK
3626 MOV CHOINX(I),I ;GET CORRESPONDING SOURCE
3627 CLR CHISTS(I) ;IDLE IT
3628 CALL @CHIRFL(I) ;TELL SOURCE IT'S DONE, TRY TO GET MORE INPUT
3632 ;CALL HERE AFTER EACH PACKET TRANSFER TO INITIATE AS MANY ADDITIONAL TRANSFERS
3633 ;AS POSSIBLE. BASHES ALL REGISTERS. ON DL10 AND TEN11, WE COULD ACTUALLY DO SEVERAL
3634 ;TRANSFERS BEFORE RETURNING.
3637 CALL DVRRFL ;WAKE UP DOVER, MIGHT BE TIME TO RETRANSMIT
3639 MOV #<NCHX-1>*2,I ;SCAN ALL INPUT SOURCES
3640 CHSRN1: TST WAKE ;GIVE UP IF CLOCK HAS TICKED, LET TTYS RUN
3642 TST CHISTS(I) ;IS THIS SOURCE LOOKING FOR A SINK?
3644 CHSRN2: MOV CHIOUX(I),B ;GET SINK IT WANTS TO SEND TO
3645 BMI FOR11 ;BRANCH IF FOR PDP11
3646 TST CHOSTS(B) ;SINK AVAILABLE?
3647 BNE CHSRN3 ;NO, LET INPUT SIT
3648 CALL CHSOUT ;YES, ATTEMPT TO TRANSMIT
3649 BR CHSRUN ;LOOK FOR MORE WORK
3651 CHSRN3: SUB #2,I ;NEXT INPUT SOURCE
3653 RET ;NOTHING LEFT TO DO
3655 FOR11: MOV CHIBFP(I),A ;PACKET FOR PDP11, CHECK IT OUT
3656 MOVB PKOP(A),B ;GET OPCODE
3657 CMP B,#%CORUT ;IF ROUTING INFO, GOBBLE IT
3659 CMP B,#%CORFC ;ALL WE KNOW IS RFC TO CERTAIN CONTACT NAMES
3660 BNE FOR11J ;BARF AT JUNK PACKETS
3661 CALL SERVE ;RUN THE SERVER
3662 BEQ FOR11X ;IT DIDN'T LIKE IT
3663 FOR11R: PUSH <PKDHST(A),PKDIND(A)> ;INTERCHANGE SOURCE AND DESTINATION
3664 MOV PKSHST(A),PKDHST(A)
3665 MOV PKSIND(A),PKDIND(A)
3666 POP <PKSIND(A),PKSHST(A)>
3668 BVS FOR11X ;NO GOOD, FLUSH (SOURCE IN PACKET WAS WRONG)
3669 CALL SWAB11 ;SWAB IF GOING TO 11-INCOMPATIBLE DEST
3670 BR CHSRN2 ;FIRE IT OFF (CHISTS IS ALREADY 1)
3672 FOR11X: CLR CHISTS(I) ;DISCARD THIS PACKET
3674 BR CHSRUN ;LOOK FOR MORE WORK
3676 ;PACKET FROM RANDOM PLACE DIRECTED TO 11, TELL HIM TO GO AWAY
3677 FOR11J: CMP B,#%COLOS ;DON'T BARF AT LOS PACKETS
3679 MOV #<%COLOS*400>,(A)
3680 MOV #6$-5$-1,PKNBYT(A)
3686 BR FOR11R ;SEND OFF THE LOS
3687 5$: .ASCIZ /Packet unrecognized by gateway-11/
3691 CHARUT: MOV CHILNG(I),C ;GET NUMBER OF DATA WORDS
3693 ASR C ;MAKE NUMBER OF 2 WORD PAIRS
3694 BEQ FOR11X ;MIGHT BE ZERO-LENGTH
3696 ADD #PKDAT,D ;POINT TO START OF PACKET'S DATA
3697 61$: MOV (D)+,B ;GET SUBNET BEING TALKED ABOUT
3698 CMP B,#NSUBNT ;ONE WE KNOW ABOUT?
3699 BHIS 62$ ;NO, FORGET IT
3700 ASL B ;MAKE WORD INDEX
3701 TST SBNTYP(B) ;IS THIS AN AUTO ROUTING TYPE SUBNET?
3702 BNE 62$ ;NO, DON'T MUNG OUR FIXED ROUTING INFO
3703 CMP (D),SBNCST(B) ;COMPARE COSTS
3704 BHI 62$ ;NEW ONE WORSE (IF EQUAL, SWITCH TO EQUALIZE LOAD)
3705 MOV (D),SBNCST(B) ;SAVE BEST COST
3706 MOV PKSHST(A),SBNADR(B) ;AND HOST ADDRESS THIS CAME FROM AS BEST BET
3707 62$: TST (D)+ ;SKIP COST
3709 BR FOR11X ;DONE WITH PACKET
3711 .SBTTL CHAOS NET SERVERS
3713 ;CALLED WITH PACKET IN A.
3715 ;RETURN 'EQ' IF NO GOOD, 'NE' IF MODIFIED PACKET TO BE RETURNED TO SOURCE
3717 ;CURRENTLY WE SERVE THE FOLLOWING CONTACT NAMES:
3718 ; STATUS - RETURNS ANS WITH THE NAME OF THE MACHINE, LATER WILL HAVE OTHER DATA
3719 ; PULSAR - RETURNS ANS WITH DATA OF 1 BYTE, VALUE OF PULSON AS AN ASCII DIGIT,
3720 ; I.E. "0" MEANS OFF, "1" MEANS 60 PER SECOND, ETC.
3721 ; IF CONTACT NAME IN RFC IS FOLLOWED BY A SPACE AND AN ASCII DIGIT,
3722 ; SETS PULSON TO THAT STATUS.
3723 ; DOVER - DOVER PROTOCOL TRANSLATOR
3725 ;NOTE THAT WE DON'T USE THE MOST WINNING STRING COMPARE IN THE WORLD,
3726 ;THIS CODE ASSUMES IT DOESN'T MATTER WHAT HAPPENS IF AN RFC TO
3727 ;AN UNKNOWN CONTACT NAME IS DONE, AS LONG AS THE 11 DOESN'T CRASH.
3729 SERVE: MOV #SRVTBL,B ;ADDRESS OF SERVER TABLE
3730 10$: MOV (B)+,D ;ADDRESS OF CONTACT NAME FOR THAT SERVER
3731 BEQ 99$ ;EXIT IF TABLE EXHAUSTED, 'EQ' IN COND CODE
3733 ADD #PKDAT,C ;ADDRESS OF CONTACT NAME IN THIS RFC
3734 11$: TSTB (D) ;END OF STRING?
3735 BEQ 20$ ;YUP, RUN THIS SERVER
3736 CMPB (C)+,(D)+ ;DO STRING COMPARE
3738 TST (B)+ ;DOESN'T MATCH, TRY NEXT
3743 20$: JMP @(B)+ ;CALL SERVER, IT CAN RETURN EQ OR NE
3745 SRVTBL: .WORD 1$,STSSRV ;STATUS - RETURN HOST NAME AND METERS
3746 .WORD 2$,PLSSRV ;PULSAR - SET AND GET PULSAR RATE
3747 .IIF DF NDVRBF, .WORD 3$,DVROPN ;DOVER - DOVER PROTOCOL TRANSLATOR
3748 .WORD 0 ;END OF TABLE
3751 3$: .IIF DF NDVRBF, .ASCIZ /DOVER/
3754 ;SERVERS MUST PRESERVE A (PACKET), AND I, AND RETURN 'NE' IF TO BE SENT BACK TO SOURCE.
3755 ;NOTE THAT C POINTS AT THE NEXT BYTE AFTER THE CONTACT NAME
3757 STSSRV: MOV A,B ;RFC TO "STATUS", CHANGE INTO ANS CARRYING APPROPRIATE DATA.
3758 MOV #32.+<12.*NCHX>+<24.*CHAOSP>+<12.*ETHERP>,PKNBYT(A) ;SET BYTE LENGTH, CLEAR FORWARDING COUNT
3760 MOV #HSTNAM,D ;SEND NAME OF HOST
3764 CLR D ;NOW STORE METERING INFO FOR EACH SUBNET
3765 50$: MOV CHXSBN(D),(B)+ ;STORE SUBNET NUMBER+400
3766 MOV #4,(B)+ ;ASSUME NOT A CABLE
3772 CMP D,#CHXETH ;ETHERNET HAS SOME OF THESE COUNTERS
3774 MOV #12.,-10.(B) ;THERE ARE 4 MORE DOUBLE-WORDS
3775 MOV NPKSAB-CHXCHS(D),(B)+
3776 MOV HPKSAB-CHXCHS(D),(B)+
3779 MOV NPKSGB-CHXCHS(D),(B)+
3780 MOV HPKSGB-CHXCHS(D),(B)+
3781 MOV NPKSRL-CHXCHS(D),(B)+
3782 MOV HPKSRL-CHXCHS(D),(B)+
3785 55$: CMP CHIRFL(D),#CHSRFL ;CHAOSNET CABLE?
3786 BNE 59$ ;NO, THAT'S ALL
3787 MOV #16.,-10.(B) ;YES, THERE ARE 6 MORE DOUBLE-WORDS
3788 MOV NPKSAB-CHXCHS(D),(B)+
3789 MOV HPKSAB-CHXCHS(D),(B)+
3790 MOV NPKSLS-CHXCHS(D),(B)+
3791 MOV HPKSLS-CHXCHS(D),(B)+
3792 MOV NPKSGB-CHXCHS(D),(B)+
3793 MOV HPKSGB-CHXCHS(D),(B)+
3794 MOV NPKSRL-CHXCHS(D),(B)+
3795 MOV HPKSRL-CHXCHS(D),(B)+
3796 CLR (B)+ ;I DON'T KEEP TRACK OF BIT COUNT ERRS SEPARATELY
3803 RETANS: MOVB #%COANS,PKOP(A) ;RETURN THIS PACKET TO SOURCE AS AN 'ANS'
3804 RET ;NOTE CONDITION CODES HAVE 'NE'
3806 PLSSRV: MOVB PKNBYT(A),C ;GET BYTE COUNT, SHOULD BE SMALL
3807 CMP C,#8 ;6 FOR PULSAR, 1 FOR SPACE, 1 FOR CHARACTER
3808 BLO 20$ ;NOT GIVEN AN ARGUMENT, JUST READ STATUS
3809 MOVB PKDAT+7(A),C ;YES, GET THE ARGUMENT
3810 SUB #'0,C ;CONVERT TO BINARY (CHEAPO!)
3811 MOV C,PULSON ;CHANGE PULSON STATUS
3812 20$: MOV #1,PKNBYT(A) ;SET BYTE LENGTH, CLEAR FORWARDING COUNT
3813 MOV PULSON,C ;RETURN PULSAR STATUS
3818 .SBTTL CHAOSNET INTERRUPT HANDLER
3820 ;INTERRUPT HANDLER ENTRIES
3822 CONC CHS,\.RPCNT,BK:
3827 ;SUBROUTINE TO ENABLE CHAOSNET INTERFACE IN H,I TO RECEIVE NEXT PACKET
3828 CHINXT: MOVB 1(H),A ;GET CSR BITS 9-12 (LOST COUNT)
3831 ADD A,NPKSLS-CHXCHS(I)
3832 ADC HPKSLS-CHXCHS(I)
3833 BIS #%CARCL+%CAREN,(H) ;MAKE READY TO RECEIVE ANOTHER MESSAGE
3836 ;COMMON CHAOS INTERRUPT ROUTINE
3837 CHSBRK: MOV (I),I ;GET SOURCE/SINK INDEX
3838 PUSH <A,B,C,D,H> ;SAVE ALL REGISTERS
3839 MOV CHIHWR(I),H ;GET HARDWARE ADDRESS
3840 MOV (H),A .SEE CH%CSR ;GET CSR
3841 BPL CHSBK1 ;TEST RECEIVE DONE, BRANCH IF NOT
3842 .SEE %CARDN ;PALX SCREWS UP IF THIS IS ON PREVIOUS LINE!
3843 TST CHISTS(I) ;MAKE SURE INPUT BUFFER IS IDLE
3844 BNE CHSBK1 ;BUSY, DON'T LOOK AT RECEIVE DONE NOW
3845 BIT #%CAERR,A ;CRC ERROR?
3846 BNE CHICRC ;JUMP IF YES
3847 MOV CH%RBC(H),C ;BIT COUNT -1
3848 SUB #47.,C ;ADD 1, THEN SUBTRACT 3*16. FOR HARDWARE WORDS
3849 .IREPT 4, ASR C ;CONVERT TO NUMBER OF WORDS
3851 BHI CHIFLS ;THIS CAN ONLY HAPPEN IF HARDWARE BROKEN
3852 ADD #CH%RBF,H ;POINT H TO RECEIVE DATA REG
3853 MOV CHIBFP(I),D ;COPY PACKET INTO BUFFER
3855 TST (H) ;READ OUT THE 3 HARDWARE LEADER WORDS
3857 SUB #CH%RBF,H ;RESTORE H
3858 BIT #%CAERR,(H) ;WAS IT READ CORRECTLY OUT OF RAM?
3859 BNE CHIGBG ;NO, GARBAGE
3860 CMP CH%RBC(H),#7777 ;WAS PACKET CORRECT LENGTH?
3861 BNE CHIGBG ;NO, GARBAGE
3862 CALL CHINXT ;DONE WITH HARDWARE, ENABLE FOR NEXT
3863 CALL CHSIHD ;PROCESS HEADER, GET LENGTH, DEST
3864 BVS CHIFL0 ;BRANCH IF NO GOOD
3865 CALL SWAB11 ;SWAB IF NOT GOING TO 11-COMPATIBLE DEST
3866 INC CHISTS(I) ;INDICATE BUFFER READY TO SEND
3868 CALL CHSOUT ;SEND IT OUT
3870 MOV CHIHWR(I),H ;RESTORE H
3871 TST CHISTS(I) ;INPUT BUFFER STILL BUSY?
3873 BIC #%CAREN,(H) ;YES, CLEAR RECEIVE INTERRUPT ENABLE
3874 BR CHSBK1 ;GO CHECK ON OUTPUT SIDE
3876 ;HERE WHEN A PACKET WAS RECEIVED WITHOUT ERROR, BUT AFTER
3877 ;READING OUT OF THE RAM, CRC ERROR WAS SET. EITHER THE
3878 ;PACKET WAS THE WRONG LENGTH, OR THE RAM FAILED, OR THE
3879 ;HARDWARE RANDOMLY CLOBBERED IT.
3880 ;WE ALSO GET HERE IF THE BIT COUNT WAS NOT -1 AFTER ALL WORDS WERE READ.
3881 CHIGBG: ADD #1,NPKSRL-CHXCHS(I) ;LOG THE ERROR
3882 ADC HPKSRL-CHXCHS(I)
3884 MOV CH%RBC(H),CHSRLC
3885 BR CHIFLS ;GO RESET RECEIVER AND CHECK OUTPUT STATUS
3887 ;HERE WHEN A PACKET IS RECEIVED WITH A CRC ERROR. DISCARD IT,
3888 ;BUT ALSO SAVE IT IN CHSGBF, CHSGBH, CHSGBS, CHSGBC FOR DEBUGGING (IF FTGARB).
3889 CHICRC: ADD #1,NPKSGB-CHXCHS(I)
3890 ADC HPKSGB-CHXCHS(I)
3894 MOV CH%RBC(H),CHSGBC
3899 SUB #CH%RBF,H ;DROP INTO CHIFLS
3901 ;HERE TO IGNORE AN INPUT PACKET AND ENABLE HARDWARE FOR NEXT
3904 ;HERE TO CHECK ON TRANSMIT SIDE
3905 CHSBK1: TSTB (H) .SEE %CATDN ;TRANSMIT DONE?
3906 BPL CHSBKX ;NO, EXIT
3908 CLR CHSIDL(I) ;CLEAR TRANSMIT-DONE TIME-OUT
3910 MOV CHOSTS(I),A ;WAS OUTPUT IN PROGRESS?
3911 BEQ CHSBK6 ;NO, LOOK FOR OUTPUT
3912 CMP A,#2 ;TRANSMIT ABORT DELAY COMPLETED?
3914 BIT #%CATAB,(H) ;NO, TRANSMIT ABORTED?
3916 ADD #1,NPKSAB-CHXCHS(I) ;YES, METER IT, AND SET CHOSTS TO
3917 ADC HPKSAB-CHXCHS(I)
3918 INC CHOSTS(I) ;2 IF THIS IS FIRST TIME, OR 0 IF SECOND TIME
3919 BEQ CHSBK4 ;LOST TWICE IN A ROW, GIVE UP
3920 BR CHSBK5 ;TURN OFF INTERRUPT, DELAY FOR A WHILE
3922 10$: MOV #-1,CHOSTS(I) ;TRANSMIT ABORT DELAY COMPLETED, SET CHOSTS TO -1
3923 CALL CHSXM0 ;INITIATE RE-TRANSMISSION (CHOSTS ALREADY SET)
3926 CHSBK4: CALL CHSODN ;OUTPUT DONE
3928 CALL CHSRUN ;INITIATE MORE TRANSFERS
3930 TST CHOSTS(I) ;DID IT INITIATE TRANSMISSION?
3931 BNE CHSBKX ;YES, LEAVE INTERRUPT ENABLED.
3932 MOV CHOHWR(I),H ;RESTORE H
3933 TST CHXRTF(I) ;TIME TO BROADCAST ROUTING INFO?
3935 TST PULSON ;IS THIS FEATURE TURNED ON?
3936 BEQ CHSBK5 ;NO, FLUSH
3937 CMP PULSAR,PULSON ;NOTHING TO DO. TIME FOR A TEST MESSAGE?
3938 BNE CHSBK5 ;NOPE, GO IDLE
3939 MOV #52525,CH%WBF(H) ;WRITE A PACKET OF 3 HEADER WORDS, 0, 52525
3941 MOV #-1,CH%WBF(H) ;TO HOST -1, WHICH IS NON-EXISTENT
3942 CHSBK7: TST CH%XMT(H) ;INITIATE TRANSMISSION, DON'T ENABLE INTERRUPT
3943 CHSBK5: BIC #%CATEN,(H) ;GO IDLE, CLEAR TRANSMIT INTERRUPT ENABLE
3944 ;HERE TO EXIT FROM CHAOS INTERRUPT. RESTORE REGS AND RETURN FROM INT
3945 CHSBKX: POP <H,D,C,B,A,I>
3948 .IIF NZ CH%WBF-CH%MYN, .ERR FOO CODE ASSUMES CH%WBF = CH%MYN
3950 ;BROADCAST A PACKET FULL OF ROUTING INFO, SINCE WE ARE MORE OR LESS A GATEWAY
3951 CHORUT: MASK 6 ;INHIBIT CLOCK INTERRUPTS SO COSTS DON'T CHANGE
3952 ADD #CH%WBF,H ;ADDRESS WRITE BUFFER
3953 MOV #%CORUT*400,(H) ;OPCODE
3954 MOV #2*<NSUBNT-1>,A ;COUNT SUBNETS WHICH WE KNOW ANYTHING ABOUT (REASONABLE COST)
3956 5$: CMP SBNCST(A),#1000
3958 ADD #4,B ;THIS ONE WILL GENERATE 2 WORDS
3961 MOV B,(H) ;BYTE COUNT
3962 CLR (H) ;DESTINATION
3964 MOV (H),(H) ;SOURCE = CH%MYN
3965 CLR (H) ;SOURCE INDEX
3966 CLR (H) ;PACKET NUMBER
3968 MOV #2*<NSUBNT-1>,A ;GO THROUGH SUBNET TABLES
3969 MOVB 1(H),C ;GET SUBNET THIS IS GOING OUT ON
3971 MOV SBNCST(C),C ;GET COST OF GETTING TO US FROM GUY WHO RECEIVES THIS
3972 10$: CMP SBNCST(A),#1000 ;WAS THIS ONE INCLUDED IN BYTE COUNT?
3973 BHIS 11$ ;NO, DON'T PUT IT IN PACKET
3974 MOV A,B ;FIRST WORD IS SUBNET NUMBER
3977 MOV SBNCST(A),B ;SECOND WORD IS COST
3978 ADD C,B ;WHICH MUST INCLUDE COST OF GETTING TO US
3980 11$: SUB #2,A ;NEXT SUBNET
3982 CLR (H) ;BROADCAST THIS PACKET
3983 SUB #CH%WBF,H ;RESTORE H
3984 CLR CHXRTF(I) ;CLEAR REQUEST FOR ROUTING PACKET
3986 BR CHSBK7 ;FIRE IT OFF, DON'T ENABLE TRANSMIT-DONE INTERRUPT
3988 ;INITIATE TRANSMISSION ON CHAOS INTERFACE
3989 ;CALL WITH SINK NUMBER IN I, AT PI LEVEL OR MASKED. BASHES ALL REGS.
3990 CHSXMT: INC CHOSTS(I) ;SET CHOSTS TO 1, TRANSMIT STARTING
3991 CHSXM0: MOV CHOHWR(I),H ;GET HARDWARE ADDRESS
3992 MOV CHOINX(I),B ;GET SOURCE SUPPLYING THE PACKET
3993 MOV CHIBFP(B),D ;GET PACKET ADDRESS
3994 ADD #CH%WBF,H ;ADDRESS THE WRITE BUFFER
3995 MOV CHILNG(B),C ;GET WORD COUNT
3996 CALL MOVDH ;COPY INTO HARDWARE
3997 MOV CHICBA(B),(H) ;STORE CABLE DESTINATION
3998 SUB #CH%WBF,H ;RESTORE H
3999 TST CH%XMT(H) ;TRIGGER TRANSMISSION
4000 BIS #%CATEN,(H) ;ENABLE DONE INTERRUPT
4001 RET ;PI LEVEL WILL PICK UP OUTPUT
4006 .SBTTL ETHERNET SUPPORT
4008 ;ENABLE NEXT ETHERNET PACKET TO COME IN.
4009 ;SINCE WE ONLY HAVE ONE BUFFER, THIS SETS UP THE TRANSFER RATHER
4010 ;THAN JUST ENABLING THE INTERRUPT AS THE CHAOSNET DOES.
4011 ;THAT WOULDN'T WORK ANYWAY, BECAUSE THE HARDWARE IS SO TOTALLY BRAIN-DAMAGED.
4012 ETHRFL: MOV CHIHWR(I),H
4014 MOV #-<PKTMXW-ETHHDW+1>,(H)+ ;- WORD COUNT, +1 FOR HARDWARE BUG
4015 MOV #ETHIBF+<ETHHDW*2>,(H)+ ;BUFFER ADDRESS
4016 MOV #101,(H) ;START, INTERRUPT-ENABLE
4019 ;INCOMING PUP TOO BIG. WE DON'T HAVE FRAGMENTATION, SO SEND A PUP ERROR REPORT
4020 ETHBIG: MOV #ETHIBF+PKDAT,A ;COPY PUP HEADER INTO DATA FIELD
4022 MOV #ETHIBF+PKDAT+20.,B
4023 .IREPT 10.,< MOV (A)+,(B)+ >
4024 MOV #517.,(B)+ ;PACKET TOO LARGE ERROR
4025 MOV #DATMAX,(B)+ ;MAX NUMBER OF BYTES ALLOWED
4027 5$: MOVB (A)+,(B)+ ;ASCII MESSAGE
4029 INC B ;MESSAGE LENGTH IS EVEN. INCLUDE CHECKSUM IN COUNT.
4030 SUB #ETHIBF+PKDAT,B ;GET PUP LENGTH
4031 MOV B,(C)+ ;BUILD PUP HEADER NOW
4032 MOV #4,(C)+ ;PUP TYPE = ERROR
4033 CMP (C)+,(C)+ ;PUP ID SAME
4034 .IREPT 3,< MOV 6(C),(C)+ > ;DESTINATION = ORIGINAL SOURCE
4035 MOV #<ETHSBN*400+ETHHSN>,(C)+ ;SOURCE = ME
4036 .IREPT 2,< CLR (C)+ > ;SOURCE PORT ZERO
4037 CALL ETHOUT ;TRANSMIT
4040 ;The ascii message. This isn't as destroyed as it looks.
4041 50$: .ASCIZ/UP Pot oalgr eotf tii n ahCoanstep caek.t/
4045 ETHIBK: PUSH <A,B,C,D,H,I>
4048 MOV 14(H),A ;PICK UP STATUS
4049 CLR 14(H) ;CLEAR RECEIVE INTERRUPT ENABLE
4050 CMP ETHIBF+PKDAT-2,#1000 ;TYPE = PUP?
4051 BNE ETHIIX ;NO, IGNORE PACKET
4052 TST 10(H) ;CHECK RESIDUAL WORD COUNT
4053 BEQ ETHBIG ;PACKET TOO BIG, RESPOND WITH PUP ERROR
4054 TST A ;CHECK COMBINED INPUT ERRORS BIT
4055 BMI 70$ ;ERROR, IGNORE PACKET
4056 MOV ETHIBF+PKDAT+10,A ;GET DESTINATION HOST
4057 BEQ 5$ ;AND SEE IF BROADCAST OR SELF
4058 CMP A,#<ETHSBN*400+ETHHSN>
4059 BNE 11$ ;NO, ROUTE AS REGULAR MESSAGE
4060 5$: CMPB ETHIBF+PKDAT+2,#1 ;PUP TYPE = ECHO-ME?
4061 BEQ ETHECO ;YES, ECHO IT (MAYBE TAKE THIS OUT AFTER 11 DEBUGGED)
4062 CMPB ETHIBF+PKDAT+2,#200 ;GATEWAY INFORMATION REQUEST?
4064 TST ETHIBF+PKDAT+12 ;NOT REALLY UNLESS DESTINATION SOCKET IS 2
4066 CMP ETHIBF+PKDAT+14,#2
4068 TST CHISTS+CHXEGT ;PSEUDO DEVICE AVAILABLE?
4070 MOV #ETHIBF+PKDAT+4,A ;YES, SEND HIM SOME INFO
4072 .IREPT 2,< MOV (A)+,(B)+ > ;COPY PUP ID
4073 ADD #6,A ;COPY SOURCE HOST AND SOCKET INTO DESTINATION
4074 .IREPT 3,< MOV (A)+,(B)+ >
4076 MOV #CHXETH,I ;I CLOBBERED BY ETHRT1
4079 10$: TST A ;DON'T HARASS REST OF NET WITH BROADCASTS
4081 11$: MOV #ETHIBF+PKDAT,A ;CHECK THE CHECKSUM
4083 BNE 60$ ;BAD, COUNT AS RAM ERROR
4085 CMP ETHIBF+PKDAT+10,DVRHST ;SEE IF ADDRESSED TO DOVER USER
4087 CMP ETHIBF+PKDAT+14,DVRIDX
4089 CALL DVRPUP ;YES, PROCESS
4094 ;TRANSLATE PUP AND SEND TO CHAOSNET
4095 12$: MOV #ETHIBF,A ;FILL IN CHAOSNET HEADER
4096 MOV #<%COUNC*400>,(A)+ ;PKOP
4097 MOV ETHIBF+PKDAT+0,B ;PKNBYT (TOTAL PUP LENGTH = CHAOS DATA LENGTH)
4098 INC B ;ROUND UP TO AN EVEN NUMBER
4102 MOV ETHIBF+PKDAT+10,(A)+ ;PKDHST
4103 MOV ETHIBF+PKDAT+14,(A)+ ;PKDIND (LOW HALF OF PUP PORT)
4104 MOV ETHIBF+PKDAT+16,(A)+ ;PKSHST
4105 MOV ETHIBF+PKDAT+22,(A)+ ;PKDIND (LOW HALF OF PUP PORT)
4106 MOV ETHIBF+PKDAT+6,(A)+ ;PKPKN (LOW HALF OF PUP ID)
4107 MOV #100001,(A)+ ;PKACN = PROTOCOL NUMBER
4108 CALL CHSIHD ;PROCESS THIS HEADER, GET LENGTH, DEST
4109 BVS ETHIIX ;IGNORE IF NO GOOD
4110 CALL SWAB10 ;SWAB IF NOT GOING TO 10-COMPATIBLE DEST
4111 INC CHISTS(I) ;INDICATE BUFFER READY TO SEND
4112 CALL CHSOUT ;SEND IT OUT
4113 BR ETHINX ;ETHRFL WILL BE CALLED WHEN NECESSARY
4115 60$: ADD #1,NPKSRL-CHXCHS(I) ;COUNT ERRORS (SOFTWARE CHECKSUM)
4116 ADC HPKSRL-CHXCHS(I)
4119 70$: ADD #1,NPKSGB-CHXCHS(I) ;COUNT ERRORS (HARDWARE CHECKSUM)
4120 ADC HPKSGB-CHXCHS(I)
4121 ETHIIX: CALL ETHRFL ;AND READ ANOTHER PACKET
4122 ETHINX: POP <I,H,D,C,B,A>
4125 ;ETHERNET PUP ECHO PROTOCOL
4126 ETHECO: MOV #ETHIBF+PKDAT+10,A ;INTERCHANGE SOURCE AND DESTINATION
4127 MOV A,B ;I DON'T BOTHER CHECKING CHECKSUM, BUT I DO GENERATE IT
4129 .IREPT 3,< MOV (A)+,(B)+ >
4131 MOV #<ETHSBN*400+ETHHSN>,(A) ;FIX SOURCE TO BE ME
4132 INCB ETHIBF+PKDAT+2 ;SET PUP TYPE = 2 (I AM AN ECHO)
4133 CALL ETHOUT ;SEND BACK OUT ON THE ETHERNET
4136 ;GENERAL PURPOSE ROUTINE FOR TRANSMITTING INTERNALLY-GENERATED PUPS TO
4137 ;THE ETHERNET. FIXES THE DESTINATION ADDRESS (THIS IS HOW OTHER
4138 ;HOSTS FIGURE OUT WHAT SUBNET THEY ARE ON!), COMPUTES THE PUP CHECKSUM,
4139 ;AND INTERFACES TO THE PACKET SWITCH. CALLED WITH SOURCE INDEX IN I.
4140 ;CALL THIS WITH A PACKET THAT ALREADY HAS ITS BYTES IN ETHERNET ORDER.
4141 ;BASHES ALL REGISTERS.
4142 ETHOUT: MOV CHIBFP(I),A
4143 ADD #PKDAT,A ;ADDRESS OF PUP
4144 TST 10(A) ;ONLY IF NOT BROADCASTING,
4146 TSTB 11(A) ;DESTINATION ADDRESS HAVE NETWORK NUMBER?
4148 MOVB #ETHSBN,11(A) ;NO, PUT IT IN
4149 10$: CALL PUPCKS ;INSERT CHECKSUM
4155 ;INITIATE TRANSMISSION ON ETHER INTERFACE
4156 ;CALL WITH SINK NUMBER IN I, AT PI LEVEL OR MASKED. BASHES ALL REGS.
4157 ;PACKET IS ALREADY SWABBED INTO ETHERNET BYTE ORDER (REVERSE OF CHAOSNET).
4158 ETHXMT: INC CHOSTS(I) ;SET CHOSTS TO 1, TRANSMIT STARTING
4159 CLR A ;NO OUTPUT START DELAY
4160 ETHXM0: MOV CHOHWR(I),H ;GET HARDWARE ADDRESS
4161 MOV CHOINX(I),B ;GET SOURCE SUPPLYING THE PACKET
4162 MOV CHIBFP(B),D ;GET PACKET ADDRESS
4163 ADD #PKDAT,D ;GET PUP ADDRESS
4164 MOV #1000,-(D) ;SMASH LAST 2 WORDS OF CHAOS HEADER. TYPE=PUP
4165 MOV #ETHHSN,-(D) ;STORE SOURCE ADDRESS
4166 MOVB 14(D),1(D) ;STORE DESTINATION ADDRESS
4167 MOV 4(D),B ;GET PUP SIZE IN BYTES
4168 ADD #5,B ;CONVERT TO WORDS, ALLOW FOR ETHERNET HEADER
4170 NEG B ;HARDWARE WANTS IT NEGATIVE
4171 MOV B,(H)+ ;OUTPUT WORD COUNT
4172 MOV D,(H)+ ;OUTPUT BUFFER ADDRESS
4173 MOV A,2(H) ;OUTPUT START DELAY
4174 MOV #101,(H) ;START OUTPUT, ENABLE INTERRUPT
4175 RET ;PI LEVEL WILL FINISH
4177 ;OUTPUT DONE/ABORTED INTERRUPT
4178 ETHOBK: PUSH <A,B,C,D,H,I>
4181 MOV 4(H),A ;PICK UP STATUS BEFORE WRITING IT
4182 CLR 4(H) ;CLEAR INTERRUPT ENABLE
4183 TST A ;CHECK FOR ERROR
4185 ADD #1,NPKSAB-CHXCHS(I)
4186 ADC HPKSAB-CHXCHS(I)
4187 NEG CHOSTS(I) ;ERROR, ENTER RETRANSMIT MODE
4188 BPL 10$ ;ALREADY RETRANSMITTED ONCE, PUNT
4189 MOV #25.,A ;WAIT 1 MS (DON'T BOTHER BEING RANDOM)
4190 CALL ETHXM0 ;START TRANSMISSION AGAIN
4193 10$: CALL CHSODN ;TRANSMISSION FINISHED
4194 CALL CHSRUN ;FIND MORE WORK TO DO
4197 ;CHECKSUM PUP ADDRESSED BY A. BASHES A,B,C.
4198 PUPCKS: CALL PUPCK1 ;COMPUTE CHECKSUM
4199 MOV B,(A) ;STORE CHECKSUM
4202 ;RETURN 'EQ' IF CHECKSUM MATCHES
4203 PUPCKT: CALL PUPCK1 ;COMPUTE CHECKSUM
4204 CMP (A),#-1 ;PACKET CHECKSUMMED?
4205 BEQ 5$ ;NO, ALWAYS MATCH
4206 CMP B,(A) ;RETURN WITH CC SET FROM NEW AND OLD CKSMS
4209 ;A POINTS AT PACKET, RETURN WITH A -> CHECKSUM AND CHECKSUM IN B. BASH C.
4210 PUPCK1: MOV (A),C ;GET LENGTH
4211 DEC C ;IN WORDS NOT COUNTING CHECKSUM
4213 CLR B ;BUILD CHECKSUM IN B
4214 10$: ADD (A)+,B ;ONE'S COMPLEMENT ADD
4216 BPL 11$ ;TRANSFER SIGN BIT INTO CARRY
4218 11$: ROL B ;AND LEFT CYCLE
4220 INC B ;GRONK MINUS ZERO
4225 ;BROADCAST ETHERNET GATEWAY INFO
4226 ETHRUT: MASK 5 ;ENTER SUITABLE LEVEL FOR HACKING NET
4227 TST CHISTS+CHXEGT ;IS THE PSEUDO SOURCE THAT EMITS THE
4228 BNE 99$ ; PACKET AVAILABLE? IF NOT, PUNT.
4229 CLR CHXRTF+CHXETH ;CLEAR REQUEST FLAG
4231 CLR (A)+ ;PUP ID ZERO
4233 CLR (A)+ ;BROADCAST DESTINATION
4234 CLR (A)+ ;TO SOCKET 2
4236 CALL ETHRT1 ;BUILD AND SEND GATEWAY INFO
4240 BADSBP: .WORD BADSUB ;POINTER INTO BAD SUBNETS
4241 BADSUB: ;SUBNETS THAT SHOULD NOT HAVE INFORMATION SENT
4242 ;ABOUT. THIS LIST MUST BE IN INCREASING ORDER
4243 ;AND MUST END IN 377.
4244 .BYTE 004 ;AI CHAOS 11 pseudo subnet (only AI PDP-10 (RIP) is on this)
4245 .BYTE 010 ;Tech Square LCSnet (unused)
4246 .BYTE 011 ;Tech Square LCS asynchronous line net (IP)
4247 .BYTE 012 ;Tech Square VII LCSnet (IP)
4248 .BYTE 014 ;Symbolics: Los Angeles-Chatsworth land line
4249 .BYTE 020 ;CHAOS MIT IN subnet (ask JNC)
4250 .BYTE 027 ;Experimental asynchronous line net
4251 .BYTE 030 ;Experimental radio broadcast net
4252 .BYTE 040 ;Symbolics: Tech Square-Vassar St. microwave link
4253 .BYTE 041 ;Symbolics: Cambridge-Palo Alto land line
4254 .BYTE 042 ;Symbolics: Palo Alto-Chatsworth land line
4255 .BYTE 047 ;Symbolics: Cambridge-Chatsworth land line
4256 .BYTE 054 ;S-1: 10Mb Ethernet
4257 .BYTE 055 ;S-1: Pronet ring
4258 .BYTE 056 ;S-1: serial line subnet
4259 .BYTE 057 ;S-1: serial line subnet
4260 .BYTE 061 ;Symbolics: Cambridge-Cambridge land line
4261 .BYTE 062 ;Symbolics: Cambridge-Washington land line
4262 .BYTE 064 ;Symbolics: Cambridge-Houston land line
4263 .BYTE 070 ;Symbolics: Chatsworth-Westwood land line
4264 .BYTE 072 ;Atari: Cambridge-MIT land line
4265 .BYTE 073 ;Atari: Cambridge-Sunnyvale land line
4272 ETHRT1: MOV #BADSUB,BADSBP ;INITIAL BAD SUBNET POINTER
4273 MOV #EGTSBN,A ;FILL IN GATEWAY INFORMATION IN THE PUP
4274 CLR I ;I SUBNET*2, A EGTSBN POINTER
4275 10$: ;; FOR EACH SUBNET, .BYTE GATE-NET, TARGET-NET, HOP-COUNT, GATE-HOST
4276 CLR B ;FOR NON-GATEWAY, USE 0 AS GATEWAY ADDRESS
4277 TST SBNTYP(I) ;HARDWARE CONNECTION?
4279 MOV SBNADR(I),B ;NO, GET GATEWAY ADDRESS
4281 bhi 20$ ;dover, as of 1-Dec-83 can't handle more than 60
4282 ;; FILTER OUT KNOWN BAD SUBNETS
4283 CMPB I,@BADSBP ;MAYBE UPDATE POINTER
4284 BHI 115$ ; NO UPDATE NEEDED
4286 115$: CMPB I,@BADSBP ;THIS TIME, CHECK FOR EQUALITY
4289 MOV SBNCST(I),C ;GET COST
4290 CMP C,#1000 ;IF NOT REACHABLE, DON'T PUT IN PACKET
4292 .IREPT 3, ASR C ;DIVIDE BY 8 TO GET APPROXIMATE HOP COUNT
4293 CMP C,#ETHMXH ;DON'T PUT MORE THAN MAXHOPS
4296 12$: MOV I,D ;GET TARGET-NET
4299 MOVB B,(A)+ ;STORE IN WIERD XEROX BYTE ORDER
4303 20$: TST (I)+ ;NEXT SUBNET
4306 SUB #EGTSBN,A ;NUMBER OF DATA BYTES IN PUP
4307 ADD #22.,A ;FOR HEADER AND CHECKSUM
4308 MOV A,EGTPLN ;SET PUP LENGTH
4309 MOV #CHXEGT,I ;SET UP TO TRANSMIT TO ETHERNET
4314 .SBTTL DOVER PROTOCOL TRANSLATOR
4316 ;RFC PACKET IN A. MUST PRESERVE I, AND RETURN 'EQ'.
4317 DVROPN: MOV PKPKN(A),C
4326 ;SET UP DOVER TO TALK TO HOST IN A, INDEX IN B, PKT# IN C, SENDING BACK AN OPN
4327 ;OR SENDING A LOS IF BUSY. MUST WATCH FOR DUPLICATE RFC'S
4328 ;MUST BE CALLED WITH CHAOS AND ETHER INTERRUPTS MASKED
4329 5$: TST DVRHST ;BUSY?
4332 BNE DVRBSY ;YES, TALKING TO ANOTHER HOST
4334 BNE DVRBSY ;YES, TALKING TO ANOTHER GUY SAME HOST
4335 BR 11$ ;DUPLICATE RFC
4337 10$: CLR DVRTIM ;FLUSH TIMEOUT
4340 INC DVRLIX ;ESTABLISH UNIQUE LOCAL INDEX
4342 INC DVRLIX ;DON'T USE 0
4343 11$: CLR DVRMSK ;CLEAR THE BUFFER RING
4344 CLR DVRID ;FIRST PACKET TO SEND TO DOVER IS PACKET 0
4345 INC C ;C := FIRST PACKET ID THAT WILL COME IN FROM CHAOS
4347 MOV #%COOPN*400,B ;SEND AN OPN
4348 BR DVRST1 ;REST IS LIKE STS
4350 DVRBSY: TST DVRPKP ;SPECIAL BUFFER BUSY?
4351 BNE CPOPJ0 ;YES, PUNT
4352 MOV #DVRBF2,C ;SEND A CLS
4353 MOV #%COCLS*400,(C)+
4366 ;HERE TO SEND STS TO GUY CONNECTED TO DOVER
4367 ;MUST BE MASKED AGAINST CHAOS INTERRUPTS
4368 DVRSTS: MOV #%COSTS*400,B
4369 DVRST1: MOV #DVRBF2,A ;USE THIS BUFFER
4370 MOV #4,D ;NUMBER OF BYTES
4373 MOV D,(A)+ ;NUMBER OF BYTES
4374 MOV DVRHST,(A)+ ;DESTINATION HOST
4375 MOV DVRIDX,(A)+ ;DESTINATION INDEX
4376 MOV #CHAD0,(A)+ ;SOURCE HOST
4377 MOV DVRLIX,(A)+ ;SOURCE INDEX
4378 CLR (A)+ ;NO PACKET NUMBER
4379 CMP B,#%COLOS*400 ;IF SENDING LOS, PUNT THE REST
4382 DEC B ;LAST PACKET ACKNOWLEDGED BY DOVER
4383 ADD DVROFS,B ;CONVERT TO CHAOSNET ID
4384 MOV B,(A)+ ;ACKNOWLEDGE PACKET NUMBER
4386 MOV #NDVRBF,(A)+ ;WINDOW SIZE
4387 20$: MOV C,DVRPKP ;CAUSE PACKET TO GET SENT
4390 ;HERE TO GET ANOTHER PACKET FROM THE DOVER. THIS CAN BE EITHER A CHAOSNET
4391 ;PACKET TO BE SENT BACK TO THE APPROPRIATE GUY, OR A PUP TO GO TO THE DOVER
4392 DVRRFL: MOV #CHXDVR,I ;THIS MIGHT NOT BE SET UP WHEN CALLED
4393 TST CHISTS(I) ;PACKET SOURCE ONLY EMANATES ONE AT A TIME
4395 CMP CHIBFP(I),DVRPKP ;FINISHED SENDING SPECIAL PACKET?
4397 CLR DVRPKP ;YES, MAKE READY FOR ANOTHER
4398 10$: CLR CHIBFP(I) ;THIS PACKET NO LONGER BEING SENT
4399 MOV DVRPKP,A ;GOT SPECIAL PACKET TO SEND?
4400 BNE 30$ ;YES, SEND IT
4401 TST DVRMSK ;GOT NEXT BUFFER TO SEND TO DOVER?
4403 CMP DVRRTR,#60. ;1-SECOND RETRANSMISSION INTERVAL ELAPSED?
4404 BLO CPOPJ0 ;NO, DON'T SEND YET
4405 CLR DVRRTR ;SENDING, RESET RETRANSMISSION TIMER
4407 BIC #PKFCMS,PKFC(A) ;CLEAR FORWARDING COUNT SINCE SENDING AGAIN
4408 30$: MOV A,CHIBFP(I) ;SEND THIS PACKET
4409 CALL CHSIHD ;ROUTE HIM
4410 BVS DVRRFL ;BAD, IGNORE
4411 CMP B,#CHXCHS ;SWAB IF SENDING TO 10, BUT NOT ETHERNET
4414 35$: INC CHISTS(I) ;INDICATE BUFFER READY TO SEND
4417 ;CALLED WITH A PUP IN ETHIBF WHICH IS FROM THE DOVER AND ADDRESSED
4418 ;TO THE GUY WHO'S TRYING TO PRINT ON IT. MUST BE MASKED AGAINST ETHER & CHAOS INTERRUPTS.
4419 DVRPUP: MOVB ETHIBF+PKDAT+2,B
4420 CMP B,#31 ;EFTP ACKNOWLEDGE?
4422 CMP ETHIBF+PKDAT+6,DVRID ;ACKNOWLEDGING EXPECTED PACKET?
4423 BNE CPOPJ0 ;NO, IGNORE IT
4424 INC DVRID ;YES, ADVANCE ID, POINTER, AND PACKET-PRESENCE MASK
4432 SETOM DVRRTR ;FAKE RETRANSMIT TIMER TO SEND NEXT PUP RIGHT AWAY
4433 TST CHISTS+CHXDVR ;PACKET SOURCE BUSY?
4434 BEQ DVRSTS ;NO, SEND AN ACKNOWLEDGEMENT TO THE CHAOSNET
4437 DVRPP1: MOV #22.,A ;RELATIVE ADDRESS OF ASCII STRING
4438 CMP B,#33 ;EFTP ABORT?
4440 MOV #44.,A ;RELATIVE ADDRESS OF ASCII STRING
4441 CMP B,#4 ;PUP ERROR?
4442 BNE CPOPJ0 ;IGNORE ANYTHING ELSE
4443 DVRERR: CLR DVRMSK ;DON'T SEND ANYTHING MORE TO THE DOVER
4444 MOV ETHIBF+PKDAT,C ;PUP LENGTH
4446 SUB #2,C ;GET LENGTH OF ASCII STRING
4447 ADD #ETHIBF+PKDAT,A ;GET ADDRESS OF ASCII STRING
4448 MOV #DVRBUF+PKDAT,B ;BUILD A LOS PACKET TO SEND BACK
4449 MOV C,D ;SAVE BYTE LENGTH
4454 SWAB (B)+ ;ALTO HAS BYTES IN THE WRONG ORDER
4456 11$: MOV #%COLOS*400,B ;SEND A LOS
4459 CLR DVRHST ;KILL CONNECTION
4462 ;HERE IS A PACKET DIRECTED TO THE DOVER. DO GOOD THINGS WITH IT.
4463 ;NOTE, IT HAS ALREADY BEEN SWABBED INTO ETHERNET BYTE ORDER.
4464 DVRPKT: MOV CHOINX(I),B ;GET SOURCE SUPPLYING THE PACKET
4465 MOV CHIBFP(B),A ;GET ADDRESS OF PACKET
4466 CLR DVRTIM ;FOREIGN HOST IS NOT IDLE
4467 MOVB PKOP(A),B ;DATA PACKET?
4473 CALL DVRSTS ;SNS => STS
4477 BEQ 12$ ;CLS OR LOS PUNTS THE CONNECTION
4483 13$: CMP B,#%COEOF ;NOTE THAT EOF IS TREATED VERY MUCH LIKE DATA!
4484 BNE 90$ ;IGNORE ANYTHING RANDOM
4485 50$: MOV PKPKN(A),B ;GET ID OF DATA PACKET
4487 MOV DVRBFP,D ;FIND WHERE IN THE BUFFER IT GOES
4488 MOV #100000,C ;AND GET MASK BIT FOR IT
4489 SUB DVRID,B ;B := ID RELATIVE TO NEXT EXPECTED
4492 BHIS 90$ ;IGNORE DUPLICATE OR NOT IN WINDOW
4500 53$: BIT C,DVRMSK ;ALREADY HAVE PACKET?
4501 BNE 90$ ;YES, IGNORE
4502 BIS C,DVRMSK ;NO, STORE IT AWAY
4504 ADD #PKDAT,D ;BUILD PUP
4508 ADD #22.,(D)+ ;PUP LENGTH
4509 MOV #30,(D)+ ;PUP TYPE
4510 TST (A) ;WAS THIS DATA OR EOF?
4512 SUB (PC),-2(D) ;EOF, SET PUP TYPE TO 32
4513 54$: CLR (D)+ ;PUP ID HIGH
4514 MOV PKPKN(A),(D) ;PUP ID LOW
4515 SUB DVROFS,(D)+ ; CORRECTED
4516 MOV #DVRADR,(D)+ ;DESTINATION HOST
4517 CLR (D)+ ;DESTINATION SOCKET HIGH
4518 MOV #20,(D)+ ;DESTINATION SOCKET LOW
4519 MOV DVRHST,(D)+ ;SOURCE HOST
4520 CLR (D)+ ;SOURCE SOCKET HIGH
4521 MOV DVRIDX,(D)+ ;SOURCE SOCKET LOW
4524 ASR B ;NUMBER OF DATA WORDS
4525 ;*** TEMPORARY KLUDGE ***
4526 PUSH <A,D,B> ;PUSH B LAST!!
4527 ;*** END TEMPORARY KLUDGE ***
4529 55$: MOV (A)+,(D)+ ;MOVE THE DATA
4533 MOV #<%COUNC*400>,(C) ;PKOP
4535 MOV (A),PKNBYT(C) ;SHOULD BE ENOUGH TO GET IT ROUTED TO ETHERNET
4536 CALL PUPCKS ;STORE APPROPRIATE CHECKSUM
4537 ;*** TEMPORARY KLUDGE ***
4538 POP <B,D,A> ;LOOK FOR SOME KIND OF MACHINE FAILURE
4547 NOP ;PUT A BPT HERE IF YOU LIKE
4549 CLR DVRMSK ;DO IT ALL OVER AGAIN
4551 ;*** END TEMPORARY KLUDGE ***
4552 CALL DVRRFL ;SEND THIS PACKET MAYBE
4554 JMP CHSODN ;THIS PACKET HANDLED
4557 .SBTTL TRAP HANDLING
4559 TRAP14: HALT ;BPT WITH NO RUG IN CORE
4561 TRAP10: BPT ;ILLEGAL INSTRUCTION
4563 TRAP4: NOP ;PATCH BPT HERE IF YOU WANT
4564 CMP (SP),#MAIN ;IF TRAP4 IN MAIN LOOP...
4568 BIT #DLXPRT,DLXCSR ;AND DL10 PORT TURNED OFF
4570 TST DLXOFF ;AND WE THOUGHT IT WAS ON
4572 RESTRT: MOV #STKBAS,SP ;THEN RESTART MAIN LOOP
4573 CLR -(SP) ;WHICH WILL WAIT FOR DL10 PORT TO TURN ON
4577 CRASH: BPT ;OTHERWISE, CRASH
4579 PWRFAL: RESET ;POWER FAIL OR UP - IF FAIL, HALT DURING RESET
4580 MOV #20,B ;WAIT 2 SECONDS TO
4581 1$: CLR A ; MAKE SURE POWER IS REALLY ON
4584 JMP INIT ;POWER SEEMS UP, RESTART PROGRAM
4587 .IFNZ NODDT ;IF NO DDT OR OTHER "OPERATING SYSTEM", SET UP TRAP HANDLERS
4590 .WORD TRAP4,340,TRAP10,340,TRAP14,340,TRAP10,340,PWRFAL,340,TRAP10,340,TRAP10,340
4593 ;ILLEGAL ADDRESS, UNIBUS NXM, STACK OVERFLOW
4597 ;ILLEGAL INSTRUCTION, IOT, EMT
4601 ;POWER FAILURE OR RESTORE
4606 TRAP14: .REPT 7 ;SAVE REGISTERS WHERE CARPET CAN FIND THEM
4607 MOV %0+.RPCNT,BPTACS+<.RPCNT*2>
4615 MOV BPTACS+<.RPCNT*2>,%0+.RPCNT
4619 BPTFLG: 0 ;NON-ZERO IF GOT A BPT
4620 BPTGO: 0 ;NON-ZERO TO PROCEED
4621 BPTACS: .BLKW 7 ;REGS EXCEPT PC
4625 .SBTTL INITIALIZATION
4632 BNE 1$ ;BPT ALREADY SET UP BY RUG
4637 .IFNZ NODDT ;NO OPERATING SYSTEM
4641 SETOM DLXOFF ;REINITIALIZE VARIOUS VARIABLES
4643 .REPT CHAOSP ;IDLE CHAOS NET INTERFACES
4644 CLR CHISTS+CHXCHS+<2*.RPCNT>
4645 CLR CHOSTS+CHXCHS+<2*.RPCNT>
4647 .IIF NZ T300P, CLR RQBACT
4650 76$: MOV NRMIPC(I),TTYIPC(I)
4654 MOV #TYORNG,B ;CLEAR THE TYPOUT-DONE RING
4656 MOV #<NFTTY/2>,A ;GIVE OUTPUT DONE ON ALL LINES
4659 CMP A,#<NFTTY/2>+NCT
4663 ;;; Turn on DM11-BBs
4664 CLR B ;iterated over DM11 units
4666 5$: MOV #DMCLR+DMCSN,@DMCSR(B) ;CLEAR SCANNER MEMORY
4667 2$: BIT #DMBSY,@DMCSR(B)
4669 CLR I ;iterated over modem channels
4670 ;; turn on connected modem channels for one DM11
4671 CLR A ;counter for channels per unit
4675 MOV #LINENB,@DMLSR(B)
4682 ;; treat first-time interrupts differently
4686 6$: MOV #DMSCN+DMIEN,@DMCSR(B) ;enable scanner interrupts
4688 SOB A,6$ ;on all DMs
4690 SOB A,. ;DELAY 50 MILLISECONDS
4691 CLR DMINI ;WHILE P.I. LEVEL GETS INITIAL STATUS
4697 DHINIL: MOV DHSCR(H),A ;DEVICE ADDRESS
4698 MOV #100000,16(A) ;TURN ON SILO MAINTENANCE MODE, SUSPECTED OF
4700 MOV #4000,(A) ;RESET DH11
4701 MOV 16(A),B ;CHECK SILO STATUS
4702 BIC #300,B ;THESE BITS ARE IN RAM & DON'T CLEAR
4703 BEQ DHSWIN ;SHOULD HAVE CLEARED MAINTENANCE MODE AND OTHER CRUD
4705 DHSWIN: MOV #DHRENB+DHTENB,(A) ;NOW ENABLE INTERRUPTS ON DH11
4715 .IIF NZ DTE20P, BEQ 22$ ;NO KBD INT ON KL10 CTY DUE TO KLDCP LOSSAGE
4716 MOV #103,@DLKS(H) ;ACTIVATE KEYBOARD INTERRUPT, D.T.R., READER
4717 22$: MOV #100,@DLPS(H) ;ACTIVATE PRINTER INTERRUPT
4723 ;SET LINE PARAMETERS AND ALLOCATE BUFFERS
4726 10$: MOV LPRVAL(I),A
4735 .IIF Z DTE20P, MOV #100,@#LKS ;NO CLOCK INTERRUPTS IF KLDCP IS HACKING CLOCK TOO
4739 MOV #37774,DLYCNT ;DMA TO BANK 0, 2 USEC DELAY
4740 MOV #%D3BYT,DIAG3 ;DO TO10 TRANSFERS IN BYTE MODE
4741 MOV #MAIN,SADR ;ONLY DO INIT ONCE
4743 .IIF NZ TEN11P, SETOM T11I10 ;CAUSE 10 TO REINITIALIZE TEN-11 CHAOS
4745 MOV CHIHWR+CHXCHS+<2*.RPCNT>,H ;ADDRESS THE INTERFACE
4746 CONC <CMP CH%MYN(H),#CHAD>,\.RPCNT ;CHECK THE HOST NUMBER SWITCHES AGAINST THE PROGRAM
4749 BIS #%CAREN,(H) ;ENABLE CHAOS NET INPUT INT
4752 MOV CHIHWR+CHXETH,H ;ADDRESS THE INTERFACE
4753 MOV 16(H),A ;GET HOST NUMBER SWITCHES
4754 COMB A ;FIX XEROX MISTAKE
4755 CMPB A,#ETHHSN ;CHECK HOST NUMBER SWITCHES
4758 MOV #CHXETH,I ;ENABLE TO RECEIVE FIRST ETHERNET PACKET
4765 .SBTTL GOULD PRINTER BUFFERS
4767 GLPOIP: GLPBFF ;NEXT BUFFER IN AT M.P. LEVEL
4768 GLPOOP: GLPBFF ;NEXT BUFFER OUT AT P.I. LEVEL
4770 .REPT NGLPBF ;ASSEMBLE THE BUFFERS
4772 GLPBFF ;DUE TO PALX BUG, LEAVE .SEE ON NEXT LINE
4782 .SBTTL "TTYTYP" PARAMETER FILE
4785 .BLKW NCT ;DH11 PARAMETER REG
4787 BUFFRS: ;BEGIN ALLOCATING BUFFERS HERE
4789 .IIF NZ NCT, INFORM <BEGINNING OF BUFFERS = >,\BUFFRS
4790 ZZ===<BUFFRS+<NCT*MAXBSZ>+3777>/4000 ;NUMBER OF K USED
4791 .IRP ZZZZ,<0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16>
4792 .LIF EQ ZZ-.IRPCNT ;THIS IS A CRETINOUS CROCK TO GET IT COME OUT IN DECIMAL
4793 INFORM <HIGHEST LOCATION USED = >,\BUFFRS+<NCT*MAXBSZ>,< (>,ZZZZ,<K)>
4796 .IFNZ NCT ;TTYTYP FILE ONLY IF WE HAVE TTYS
4797 .IF P2 ;SPEED UP THE ASSEMBLY
4798 OFF==69105 ;KLUDGES SO I DON'T HAVE TO PUT KEYWORD PARAMETERS INTO PALX
4804 .IIF EQ BAUD-OFF, ZZ==0
4805 .IIF EQ BAUD-50, ZZ==1
4806 .IIF EQ BAUD-75, ZZ==2
4807 .IIF EQ BAUD-110, ZZ==3
4808 .IIF EQ BAUD-134, ZZ==4
4809 .IIF EQ BAUD-150, ZZ==5
4810 .IIF EQ BAUD-200, ZZ==6
4811 .IIF EQ BAUD-300, ZZ==7
4812 .IIF EQ BAUD-600, ZZ==10
4813 .IIF EQ BAUD-1200, ZZ==11
4814 .IIF EQ BAUD-1800, ZZ==12
4815 .IIF EQ BAUD-2400, ZZ==13
4816 .IIF EQ BAUD-4800, ZZ==14
4817 .IIF EQ BAUD-9600, ZZ==15
4818 .IIF EQ BAUD-80K, ZZ==16
4819 .IIF EQ BAUD-40K, ZZ==17
4820 .IIF LT ZZ, .ERROR UNRECOGNIZED SPEED "BAUD"
4823 .MACRO IPARM N,ODFLT,IDFLT,MUMLST
4832 .IIF GE .IRPCNT-2, .MEXIT
4833 .IIF IDN MUMB,S, .IIF EQ .IRPCNT, ZZ==1
4834 .IIF IDN MUMB,P, .IIF EQ .IRPCNT-1, ZZ==ZZ+1
4835 .IIF IDN MUMB,I, .IIF EQ .IRPCNT, ZZ==1
4836 .IIF IDN MUMB,S, .IIF EQ .IRPCNT-1, ZZ==ZZ+1
4838 .IIF EQ ZZ-2, %%.'MUM
4842 .IIF LT %%.SPEED, %%.ISPEED==IDFLT
4843 .IELSE %%.ISPEED==%%.SPEED
4845 .IIF LT %%.SPEED, %%.SPEED==ODFLT
4849 ; BUFFER SIZE IS 1/2 SECOND'S TYPING
4850 ; BUT WILL BE SUBJECT TO LIMIT OF MAXBSZ
4851 .IIF LT ZZ-7, BZZ==5.
4852 .IIF EQ ZZ-7, BZZ==15.
4853 .IIF EQ ZZ-10, BZZ==30.
4854 .IIF EQ ZZ-11, BZZ==60.
4855 .IIF EQ ZZ-12, BZZ==90.
4856 .IIF EQ ZZ-13, BZZ==120.
4857 .IIF EQ ZZ-14, BZZ==240.
4858 .IIF EQ ZZ-15, BZZ==480.
4859 .IIF GT ZZ-15, BZZ==1000.
4860 .=LPRVAL+<2*N> ;ASSEMBLE LINE PARAMETER WORD
4861 .IIF NE ZZ-3, <ZZ*2000>+<IZZ*100>+3 ;ISPEED, OSPEED, NO PARITY, 8 BITS, FULL DUPLEX
4862 .IELSE <ZZ*2000>+<IZZ*100>+3+4 ;110 BAUD EXTRA STOP BIT
4864 BZZ ;ASSEMBLE BUFFER SIZE
4869 ;MACROS USED IN THE TTYTYP FILE:
4871 .MACRO TTDPRT TN,A,B,C,D,E,F,G,H,I,J
4872 IPARM TN,300,300,<A,B,C,D,E,F,G,H,I,J>
4875 .MACRO TTDMRX TN,A,B,C,D,E,F,G,H,I,J
4876 IPARM TN,600,600,<A,B,C,D,E,F,G,H,I,J>
4879 .MACRO TTDTRM TN,A,B,C,D,E,F,G,H,I,J
4880 IPARM TN,1200,1200,<A,B,C,D,E,F,G,H,I,J>
4883 .MACRO TTDLPT TN,A,B,C,D,E,F,G,H,I,J
4884 IPARM TN,9600,9600,<A,B,C,D,E,F,G,H,I,J>
4887 .MACRO TTDLA36 TN,A,B,C,D,E,F,G,H,I,J
4888 IPARM TN,300,300,<A,B,C,D,E,F,G,H,I,J>
4891 .MACRO TTDIML TN,A,B,C,D,E,F,G,H,I,J
4892 IPARM TN,50K,25K,<A,B,C,D,E,F,G,H,I,J>
4895 .MACRO TTDVT TN,A,B,C,D,E,F,G,H,I,J
4896 IPARM TN,9600,9600,<A,B,C,D,E,F,G,H,I,J>
4899 .MACRO TTDTEK TN,A,B,C,D,E,F,G,H,I,J
4900 IPARM TN,1200,1200,<A,B,C,D,E,F,G,H,I,J>
4903 .MACRO TTDLSR TN,A,B,C,D,E,F,G,H,I,J
4904 IPARM TN,2400,2400,<A,B,C,D,E,F,G,H,I,J>
4907 .MACRO TTDDPT TN,A,B,C,D,E,F,G,H,I,J
4908 IPARM TN,2400,2400,<A,B,C,D,E,F,G,H,I,J>
4911 .MACRO TTDGT40 TN,A,B,C,D,E,F,G,H,I,J
4912 IPARM TN,4800,4800,<A,B,C,D,E,F,G,H,I,J>
4915 .MACRO TTDRAY TN,A,B,C,D,E,F,G,H,I,J
4916 IPARM TN,9600,9600,<A,B,C,D,E,F,G,H,I,J>
4919 .MACRO TTDH19 TN,A,B,C,D,E,F,G,H,I,J
4920 IPARM TN,9600,9600,<A,B,C,D,E,F,G,H,I,J>
4923 .MACRO TTD11 TN,A,B,C,D,E,F,G,H,I,J
4924 IPARM TN,4800,4800,<A,B,C,D,E,F,G,H,I,J>
4927 .MACRO TTDRAN TN,A,B,C,D,E,F,G,H,I,J
4928 IPARM TN,FOO,FOO,<A,B,C,D,E,F,G,H,I,J>
4931 .MACRO TTDTV TN,A,B,C,D,E,F,G,H,I,J
4932 IPARM TN,FOO,FOO,<A,B,C,D,E,F,G,H,I,J>
4935 .MACRO TTDGRN TN,A,B,C,D,E,F,G,H,I,J
4936 IPARM TN,9600,9600,<A,B,C,D,E,F,G,H,I,J>
4939 .MACRO TTDSTY TN,A,B,C,D,E,F,G,H,I,J
4940 IPARM TN,FOO,FOO,<A,B,C,D,E,F,G,H,I,J>
4948 NSTTYS==0 ;WE'RE NOT INTERESTED IN PSEUDO-TTYS
4949 N11TYS==0 ;NOR IN PDP11 TVS
4951 .INSRT SYSTEM;TTYTYP >
4953 .EXPUNGE ZZ,IZZ,IZZZ,BZZ,OFF,40K,80K,%%.ISPEED,%%.SPEED
4954 .EXPUNGE TT,TY,TO,TP,TCT,HOR,VER,ROL,SPEED,ISPEED