IMP SYSTEM .VERS.=3050 DCA=0 PRINTX /NETWORK VERSION / PNTNUM .VERS. PRINTX / / REPEAT 1IF VZ DCA,[ PRINTX /ARPA NET SYSTEM / ] REPEAT 0IF VZ DCA,[ PRINTX /DCA NET SYSTEM / ] ACA=141216 ADD=14000 /516 OPCODES ANA=6000 AOA=141206 CAL=141050 CAR=141044 CAS=22000 CHS=140024 CMA=140401 CRA=140040 CSA=140320 DXA=11 .ENB=401 ERA=12000 EXA=13 HLT=0 IAB=201 ICA=141340 ICL=141140 ICR=141240 IMA=26000 .INH=1001 INK=43 IRS=24000 JMP=2000 JST=20000 LDA=4000 LDX=72000 NOP=101000 OTK=171020 RCB=140200 SCB=140600 SKP=100000 SLN=101100 SLZ=100100 SMI=101400 SNZ=101040 SPL=100400 SRC=100001 SR1=100020 SR2=100010 SR3=100004 SR4=100002 SSC=101001 SSM=140500 SSP=140100 SS1=101020 SS2=101010 SS3=101004 SS4=101002 STA=10000 STX=32000 SUB=16000 SZE=100040 TCA=140407 IRP [I,,ALS,ARS,ALR,ARR,LGL,LGR,LLS,LRS,LLR,LRR,LLL,LRL], [N,, 415,405,416,406,414,404,411,401,412,402,410,400] DEFINE I C 0 0 N'00+100-C"A"77 TERMINATE ENDIRP IRP [I,,INA,OCP,OTA,SKS,SMK],[N,,13,3,17,7,17] DEFINE I C 0 0 N'0000 C TERMINATE ENDIRP X=40000 I=100000 XI=140000 DEFINE BSS N 200000 0 0 . N-1/ TERMINATE /SKS'S, OCP'S, ETC FOR PRODUCTION MACHINES IRP [NUM,,1,2,3,4,5] M'NUM'OUT=OCP 7'NUM M'NUM'UNXP=OCP 17'NUM M'NUM'LXP=OCP 27'NUM M'NUM'IXP=OCP 37'NUM M'NUM'IN=OCP 47'NUM M'NUM'ERR=SKS 47'NUM M'NUM'INIL=63 NUM M'NUM'OTIL=70 NUM M'NUM'INBP=16 NUM NUM M'NUM'OTBP=30 NUM NUM ENDIRP IRP [NUM,,1,2,3] H'NUM'ROUT=OCP 100-[10"T"NUM] H'NUM'IN=OCP 200-[10"T"NUM] H'NUM'FOUT=OCP 300-[10"T"NUM] H'NUM'XP=OCP 400-[10"T"NUM] H'NUM'UNXP=OCP 500-[10"T"NUM] H'NUM'ENAB=OCP 600-[10"T"NUM] H'NUM'ERR=SKS 100-[10"T"NUM] H'NUM'RDY=SKS 200-[10"T"NUM] H'NUM'EOM=SKS 300-[10"T"NUM] H'NUM'FULL=SKS 500-[10"T"NUM] H'NUM'OTIL=75 NUM H'NUM'INIL=77 NUM H'NUM'OTBP=42 NUM NUM H'NUM'INBP=46 NUM NUM ENDIRP H3OTIL=M5INIL /HOST 3 IS A LITTLE STRANGE H3INIL=M5OTIL H3OTBP=54 H3INBP=56 H4OTIL=M4INIL /HOST 4 IS YET STRANGER H4INIL=M4OTIL H4OTBP=M5INBP H4INBP=M5OTBP H4ROUT=OCP 51 H4IN=OCP 151 H4FOUT=OCP 251 H4XP=OCP 351 H4UNXP=OCP 451 H4ENAB=OCP 551 H4ERR=SKS 51 H4RDY=SKS 151 H4EOM=SKS 251 H4FULL=SKS 451 CLKON=OCP 40 CLKOFF=OCP 1040 RDCLOK=INA 1040 CLOKIL=102 TASK=OCP 41 TASKIL=103 WDT=OCP 26 WDTIL=62 PFIL=60 SWDTIL=61 LITES=OTA 26 RDIMPN=INA 1041 AMIMLC=SKS 42 AMI516=SKS 26 /SKS'S AND OCP'S NATIVE TO THE 516 STDIL=63 /STANDARD INTERRUPT LOCATION TTSIM=OCP 4 /SELECT INPUT MODE TTSOM=OCP 104 /SELECT OUTPUT MODE TTSRDY=SKS 4 TTSNBZ=SKS 104 TTSNSC=SKS 504 TTINA=INA 4 TTINB=INA 204 TTINAC=INA 1004 TTINBC=INA 1204 TTOTA=OTA 4 TTOTB=OTA 204 INTM=120 /SMK TO SET THE PRIORITY INTERRUPT 1 JUNK=1 EQUALS R,REPEAT EQUALS D,DEFINE EQUALS T,TERMINATE EQUALS P,PRINTX EQUALS PR,PRINT /MACROS TO TYPE OUT INTERESTING LOCATIONS D DEFPLC TX .TA.=. 100201/ .TA. .ASCII /TX'"Z"/ .TA./ T DEFPLC D RELOAD TX .TA.=. 100301/ .TA.+1 .ASCII /TX'"Z"/ .TA./ T RELOAD D DEFHLT TX .TA.=. 100101/ .TA.+1 .ASCII /TX'"Z"/ .TA./ T DEFHLT /TITLES FOR DUMPED TEXTS 100200/ .ASCII /USEFUL LOCATIONS "Z"/ 100100/ .ASCII /HALT LOCATIONS "Z"/ 100000/ .ASCII / PATCH BEG END BUFS"Z"/ 100300/ .ASCII /CRASH-RELOAD LOCATIONS "Z"/ 100400/ .ASCII / IMP BUFFERS ASSIGNED PAGE "Z"/ /MACROS TO SET UP STATISIICS TABLES NSTATS=0 MAXSTAT=22. /CALL DEFSTAT , D DEFSTAT A,B .TA.=. .TB.=A A R 1IF P,[ SW1+NSTATS/ B SB1+NSTATS/ .TA. SC1+NSTATS/ .TB. .TA.+1/ ] NSTATS=NSTATS+1 R 1IF VP NSTATS-MAXSTAT,[ PR "TOO MANY STATISTICS" NSTATS=NSTATS-1 ] T DEFSTAT /MACROS FOR IMP/TIP INITIALIZATION NITB=0 MAXITB=20.+4 /SATDEF USES 4 /CALL TIPDEF , D TIPDEF A,B .TA.=. .TB.=A BSS 1 .TC.=B R 1IF P,[ ITBLOC+NITB/ .TA. ITBIMP+NITB/ .TB. ITBTIP+NITB/ .TC. .TA.+1/ ] NITB=NITB+1 R 0IF VP MAXITB-NITB,[ PR "TOO MANY IMP/TIP INSTRS" NITB=NITB-1 ] T TIPDEF R 1IF P,[ ITBLOC/ R MAXITB,[ 1 ] ] / VDH/IMP DEF MACRO D VDHD LOC,VDH,IMP .TA.=. LOC/ .TC.=VDH .TB.=IMP BSS 1 ITBVDH+ITBVP/ .TC. ITBNVD+ITBVP/ .TB. ITBVDL+ITBVP/ LOC ITBVP=ITBVP+1 R 0IF VP MAXVDH-ITBVP,[ PR "TOO MANY IMP/VDH INSTRS" ITBVP=ITBVP-1 ] 0+0+.TA./ T /SAT/IMP DEF (RESTORE) MACRO D SATDEF A TIPDEF A,A T SATDEF /MACRO TO COMPUTE 16 BIT ADD CHECKSUM /FOR ROUTING CODE, USED BY I2MLT AND RTGO D K ARG .TA.=ARG CHK=0 0 177777"A"[CHK+0+.TA.] ARG T K /THE STANDARD IMP INTERRUPT LEVELS M2I=0 /MODEM-TO-IMP RUNS LOCKED I2M=M2I+2 /IMP-TO-MODEM - SKIP VDI I2H=I2M+1 /IMP-TO-HOST H2I=I2H+1 /HOST-TO-IMP T.O=H2I+1 /TIMEOUT TSK=T.O+1 /TASK BCK=TSK+1 /BACKGROUND /SOME OTHER LEVEL 0 TYPES INI=0 /INITIALIZATION TTY=0 /TELETYPE INTERRUPT WDI=0 /WATCH DOG TIMER INTERRUPT RSI=0 /POWER FAIL INTERRUPT SIN=0 /SOFTWARE INTERRUPT CALLS ALL=0 /UNINTERRUPTABLE CODE LIKE DXA JMP SEQUENCE FRE=0 /REFERENCES TO FREE LIST AND COUNT MSK=0 /REFERENCES TO INTERRUPT MASK /VDH LEVELS VDI=M2I+1 /INPUT INTERRUPT VDO=I2M /OUTPUT INTERRUPT VDB=I2H /BACKGROUND RUNS AT IMP-TO-HOST LEVEL /TIP LEVELS TPO=0 /OUTPUT INTERRUPT TPC=H2I /CLOCK INTERRUPT TPB=BCK /BACKGROUND /MISCELLANEOUS VAR=75 /VARIABLES CON=76 /CONSTANTS UND=77 /UNDEFINED /MACROS TO ESTABLISH INTERRUPT LEVELS FOR CODE AND DATA /XLEV IS HARDWARE LEVEL ESTABLISHED BY SMK INSTRUCTIONS /YLEV IS SOFTWARE LEVEL ESTABLISHED BY INH INSTRUCTIONS XLEV=0 YLEV=0 /MACROS WHICH ASSEMBLE CODE - INT,INH,ENB /DECLARE HARDWARE INTERRUPT ENTRANCE ON LEVEL N D INT N XLEV=N YLEV=0 WORD 0 0 300000+XLEV"T"100+YLEV 0 T INT /INHIBIT INTERRUPTS FROM LEVELS IN LIST D INH LIST R 0IF P,[ IRP [Q,,LIST] R 1IF VP 0 0 Q-YLEV, [ PRINTX /REDUNDANT INH AT / PNTNUM . PRINTX / / ] ENDIRP ] YLEV=100 IRP [Q,,LIST] R 1IF VP 0 0 YLEV-Q,YLEV=Q ENDIRP .INH WORD 0 0 300000+XLEV"T"100+YLEV T INH /ENABLE HIGHER INTERRUPTS FROM LEVEL N D ENB N R 0IF P,[ R 0IF VZ 0 0 XLEV-N, [ PRINTX /INCORRECT ENB AT / PNTNUM . PRINTX / / ] ] YLEV=N .ENB WORD 0 0 300000+XLEV"T"100+YLEV T ENB /MORE INTERRUPT LEVEL MACROS /MACROS WHICH DO NOT ASSEMBLE CODE - LEV,LCK,RET /DECLARE CODE OR DATA TO BE AT LOGICAL LEVELS IN LIST D LEV LIST XLEV=100 IRP [Q,,LIST] R 1IF VP 0 0 XLEV-Q,XLEV=Q ENDIRP YLEV=XLEV WORD 0 0 300000+XLEV"T"100+YLEV T LEV /DECLARE AN IMPLICIT INH IN CODE D LCK LIST R 0IF P,[ IRP [Q,,LIST] R 1IF VP 0 0 Q-YLEV, [ PRINTX /REDUNDANT LCK AT / PNTNUM . PRINTX / / ] ENDIRP ] YLEV=100 IRP [Q,,LIST] R 1IF VP 0 0 YLEV-Q,YLEV=Q ENDIRP WORD 0 0 300000+XLEV"T"100+YLEV T LCK /DECLARE AN IMPLICIT ENB IN CODE D RET N R 0IF P,[ R 0IF VZ 0 0 XLEV-N, [ PRINTX /INCORRECT RET AT / PNTNUM . PRINTX / / ] ] YLEV=N WORD 0 0 300000+XLEV"T"100+YLEV T RET /SOME SYSTEM PARAMETERS NH=4 /NO OF REAL HOSTS FH=4 /NO OF FAKE HOSTS TH=NH+FH BH=6 /NO OF BACK HOSTS CH=5 /NO OF PHONE LINES NIMP=64. /NO OF IMPS NACH=8 /NO OF ACK CHANNELS PER LINE R 0IF VZ DCA, BBNIMP=1 /DCA NCC IMP R 1IF VZ DCA, BBNIMP=5 /ARPA NCC IMP BBNTIP=30. /IMP NO OF BBN TIP PDP1D=305 /HOST PDP-1D AT BBN IMP DIAGTT=47. /DESTINATION FOR DIAG MESSAGES H.N=1 /NUMBER OF VDH HOST M.N=2 /NUMBER OF VDH MODEM (UCSB) PTCK=60. /NUMBER OF TICKS TO PROP ROUTING 30SEC=47. /NUMBER OF TICKS IN 30 SECS MAXH=22. /MAX NO OF HOPS IN NET NSPD=4 /= OF DIFFFRENT LINE SPDS WE HANDLE /WORDS IN BUFFER IT=1 /INPUT TIME ST=1 /SENT TIME PTRT=2 /PNTR TO TRACE BLOCK INCH=3 /INPUT CHANNEL ACKH=4 /ACKNOWLEDGE HEADER HEAD=5 /HEADER - 4 WORDS HEAD1=6 CNTL=7 HEAD2=7 HEAD3=8 MINPL=HEAD3 DATA=9 /BEGINNING OF DATA STORAGE BUFE=73. /PNTR TO END OF DATA /WORDS IN TRACE BLOCK TIT=1 /TRACE INPUT TIME TTT=2 /TRACE TASK TIME TST=3 /TRACE OUTPUT TIME TAT=4 /TRACE ACKNOWLEDGE TIME THED=5 /TRACE HEADER (4 WORDS) TQUE=9 /TRACE QUEUE TDONE=10. /TRACE DONE (100000=DONE) /WORDS IN REASSEMBLY BLOCK RID=1 /ID # MESS NO + IMP NO RMAX=2 /NO OF PCKTS MAX REAS=3 /BLOCK OF 8 PCKT PNTRS RSF=11. /NO OF PCKTS SO FAR - USED AS 9TH P /BITS IN INCH HSTMOD=100000 /1 IF FROM HOST, 0 IF FROM MODEM INPCHN=17 /INPUT CHANNEL /BITS IN ACKH ODEVEN=100000 QUADAC=60000 /WHICH QUADRANT WE ARE ACKING CHANUM=17400 /CHANNEL NO FOR THIS PKT ACKBTS=377 /MAX OF 8 ACKS /BITS IN HEAD (REG MESSAGE) MESSNO=177400 ONEOR8=200 /1= ONE-PACKET REQALL=100 /TRANSMIT ONLY RFNM=100 /REPLY ONLY ORDNO=60 INCTRN=10 /1= INC (ALSO SET ON RFNM FOR GVB) TRNREP=4 /1=TRANS, 0=REPLY GVBALL=2 /TRANSMIT ONLY ALLOC=2 /REPLY ONLY LINETS=1 /BITS IN RUTHED (ROUTING MESSAGE) SNDCOR=100000 RUTIMP=37400 /IMPNO TO IDENTIFY LOOPED LINES IHERDU=20 RUTDMP=10 /1=CORE DUMP ON FIRST HOP FROM DEAD GETCOR=4 /1=DEMAND THE IMP TO RELOAD NULPKT=2 /1=NULL PKT WITH ACKS ONLY LINETS=1 /1=ROUTING MESSAGE /BITS IN HEAD1 PRIBIT=100000 FORIMP=40000 TRACE=20000 FOROCT=10000 PKTNO=3400 /TRANSMIT ONLY PKTN1=400 /LOW ORDER BIT OF PACKET NUMBER REPDED=400 /REPLY ONLY - DEST DEAD DESTH=300 DESTI=77 DESTHI=377 /BITS IN HEAD2 LSTPKT=100000 FRMIMP=40000 FRMOCT=10000 IHCODE=7400 HICODE=7400 ENDBIT=1000 /1=PKT FROM HI NO IMP ON LINE SRCEH=300 SRCEI=77 SRCEHI=377 /BITS IN HEAD3 LINKNO=177760 SUBCOD=7 /IMP-TO-HOST SUB-CODES /BITS IN BUFE TWOQ=100000 /1 = ON TWO QUEUES (IN PPT) /BITS IN TMESS MESSNO=177400 /LAST MESS NO TRANSMITTED MESS1=400 /LOW ORDER BIT MSTO2=200 MSTO1=100 /2 TIMEOUT BITS ORDNO=60 /LAST ORDER NO TRANSMITTED MESBTS=17 /1= MESS ANSWERED /BITS IN RMESS MESSNO=177400 /OLDEST INCOMPLETE MESS NO + 3 ORDNO=60 /NEXT ORDER NO WE WANT MESBTS=17 /1= MESS COMPLETE /BITS IN AMESS MESSNO=177400 /NEXT MESS NO TO REPLY TO /BITS IN TALLY SRCEI=77 /FOREIGN IMP WHO ALLOCATED US 8 /BITS IN RALLY ONEOR8=200 RFNM=100 /WORDS IN PPT PPT0=0 PPT1=PPTL /HOST STAT TIME SENT /BITS IN PPT0 RETRAN=100000 /1= GOT AN ALLOCATE FOR HIM, MUST R /WORDS IN PLT PLT0=0 PLT1=PLTL PLT2=PLTL+PLTL PLT3=PLTL+PLTL+PLTL /HOST STAT TIME SENT /BITS IN PLT0 MESSNO=177400 PLTUSE=200 /1 = THIS PLT ENTRY IN USE REQALL=100 /USEFUL FOR INC TRN PLTHST=7 /LOCAL HOST NO /BITS IN PLT1 PRIBIT=100000 FORIMP=40000 TRACE=20000 FOROCT=10000 DESTHI=377 /BITS IN RLT2 LINKNO=177760 SUBCOD=7 /IMP-TO-HOST SUB-CODES /BITS IN TSEX ACKTAB=377 /BITS IN RSEX ACKTAB=377 /IH CODES CREG=0 /REG CERRLD=400 /ERROR IN HI LEADER CERR32=0 /ERROR IN FIRST 32 BITS CSHORT=1 /LESS THAN 32 BITS IN MESSAGE CILLGL=2 /ILLEGAL HI CODE CIMPDN=1000 /IMP GOING DOWN /BLOCKED LINK CNOP=2000 /NOP CRFNM=2400 /RFNM /LINK TABLE FULL CDESTD=3400 /DESTINATION DEAD CIMPD=0 /DEST IMP DEAD CHSTD=1 /DEST HOST DEAD CERRDT=4000 /ERROR IN HI DATA CINCTR=4400 /INCOMPLETE TRANS CSLOWD=0 /DEST HOST TOOK >30 SECS CLONG=1 /MORE THAN 8095 BITS CSLOWS=2 /SOURCE HOST TOOK >15 SECS CLOST=3 /LOST IN SUBNET CBLOCK=4 /SOURCE IMP TOOK > 15 SECS CERROR=4 /ERROR BIT SET (BECOMES CERRDT) CRESET=5000 /IMP-TO-HOST RESET - READY LINE FLA /MACROS TO COLLECT FREE SPACE AND PRINT TABLES PAGES=32. BUFL=BUFE+1 NBUFS=-1 D PAGEND A,U,E P /PAGE / PNTNUM A P / / FB=0 0 .+0'E NB=0 R 1IF VZ A+0-FB"Q"1000, [ NB=1+0+[0 0 1000"T"[A+1]+0-FB]"Q"BUFL NBUFS=NBUFS+NB] 0 0 SPAR+A-2/ FB"A"777-[NB+1]"T"1000 .TA.=FB+0+NB"T"BUFL 100004/ U FB .TA. NB .ASCII /"Z"/ 100400+NB+1/ .TB.=FB A R NB, .TB. .TB.=.TB.+0+BUFL .ASCII /"Z"/ .TA./ T PAGEND /FB IS THE ADDRESS OF THE FIRST BUFFER ON THE PAGE /NB IS THE NUMBER OF BUFFERS BETWEEN THIS PAGE AND THE NEXT /FORMAT OF SPAR: /HI 7 BITS = -(NB+1) /LO 9 BITS = LO 9 BITS OF FB 104/ / CONSTANTS - THESE FIRST FEW MUST NOT MOVE LEV CON DDSAI: DDSA /DDT S.A. START ADDRESS VERS: .VERS. /VERSION NUMBER MINE: BSS 1 /MY IMP NUMBER /TIME CONSTANTS IN TERMS OF 640 MS TICKS M30SEC: -30SEC /30 SECONDS PTICKS: -PTCK /ROUTING PROPAGATION TIME ADDRET: BSS 1 /CHKSM ADDER RETURN SIGN: 100000 ZERO: 0 ONE: 1 TWO: 2 THREE: 3 FOUR: 4 SEVEN: 7 MINUS1: -1 MINUS2: -2 MINUS3: -3 MINUS4: -4 MINUS5: -5 MINUS6: -6 MICH: -CH PLNH: NH MITH: -TH MIN100: MINIMP: -NIMP RSFLAG: 0 /FLAG TO DETECT WDT AND RELOADS /0=NONE, 1=RESTART, 2=RELOAD, 3=WDT, 4=POWER FAIL LEV VAR PRIM: BSS 1 /PRIORITY INTERRUPT MASK /NCC OPERATIONS LOCATIONS 135-157 MUST NOT MOVE! LEV CON DEFPLC [DDT STAND ALONE ENTRY] DDT: JMP DDSAI I TIPRSF: 0 /ASSEMBLE IN A ZERO DEFPLC [NICE-STOP AND RELOAD FLAG] SW3FG: BSS 1 /ZERO=NICE STOP, THEN RELOAD />0=SPECIFIC LINE DEFPLC [NICE-STOP AND RESTART FLAG] NRSTF: BSS 1 /ZERO=NICE STOP, THEN RESTART /ONE=VDH RESTART DEFPLC [HOST & MODEM INTERFACE CONTROL] HTPAR: BSS 1 /MODEM TEST FLAG DEFPLC [HOST INTERFACE TEST ENABLE AND TEST WORD] HLNM: BSS 1 /# OF INTERFACE BEING TESTED HL2WD: 177400 /SECOND WORD OF DATA - ONLY LEFT HA DEFPLC [VDH RESTART FLAG] VDHRSF: 0 /SET NON-ZERO TO RESTART VDH DEFPLC [SAT RESTART FLAG] SATRSF: 0 PG0FIX=160 /START OF 2ND INVARIANT AREA .TA.=. 100002/ .TA. PG0FIX .ASCII /"Z"/ PG0FIX/ LEV VAR ZEROB: /START ZEROING HERE DEFPLC [NEIGHB] /USED BY [M2I,TSK,BCK] NEIGHB: BSS CH /IMP NUMBER OF ADJACENT IMP DEFPLC [RUT] /USED BY [H2I,T.O,TSK,BCK] RUT: BSS NIMP /ROUTE USE TABLE DEFPLC [SLT] /USED BY [M2I,I2M,T.O,BCK] SLT: BSS CH /SEND LINE TEST (USED FOR RELOAD [ QUEUEB: /QUEUE START POINTERS /MUST PRECEDE COUNTA /USED BY [I2H,TSK] SHQ: BSS TH /REG HOST SHPQ: BSS TH /PRI HOST /USED BY [I2M,T.O,TSK] SMQ: BSS CH /REG MODEM SMPQ: BSS CH /PRI MODEM /USED BY FRE FREE: BSS 1 /FREE BUFFERS /USED BY [TSK,BCK] TTF: BSS 1 /FREE TRACE BLOCKS /USED BY [T.O,TSK] RASF: BSS 1 /FREE REASSEMBLY BLOCKS MESSTK: BSS 1 /STACK OF COMPLETE REG MESSAGES /USED BY [M2I,H2I,TSK,BCK] STQ: BSS 1 /TASK /USED BY [T.O,TSK,BCK] SRQ: BSS 1 /REPLY,REROUTE,DEST DEAD /USED BY [I2H,H2I,T.O.TSK,BCK] SHWQ: BSS NH+1 /HOST WORD SHBQ: BSS 1 /HOST ONE WORD BUFFERS /USED BY [T.O,TSK] SHRQ: BSS 1 /REASSEMBLY BLOCKS /USED BY [TSK,BCK] STRQ: BSS 1 /TRACE BLOCKS /USED BY [ALL] DIAGQ: BSS 1 /DIAG PACKET QUEUE QUEUEE: /QUEUE END POINTERS /USED BY [I2H,TSK] EHQ: BSS TH EHPQ: BSS TH /USED BY [I2M,T.O,TSK] EMQ: BSS CH EMPQ: BSS CH BSS 4 /SPARE /USED BY [M2I,H2I,TSK,BCK] ETQ: BSS 1 /USED BY [T.O,TSK,BCK] ERQ: BSS 1 /USED BY [I2H,H2I,T.O,TSK,BCK] EHWQ: BSS NH+1 BSS 4 /SPARE QUEUEL=QUEUEE-QUEUEB /USED BY [TSK,BCK] TTO: BSS 1 /TRACE TABLE OVERFLOW /USED BY ALL TIME: BSS 1 /TIME IN FAST T1CKS /USED BY [I2H,T.O,TSK] TIMES: BSS 1 /TIME IN SLOW TICKS /USED BY [T.D,BCK] SYNC: BSS 1 /TIME FOR STAT ROUTINES /USED BY [M2I,T.O] THD: BSS 1 /CHANNEL TO MAX NO IMP /USED BY [I2M,TSK] SIHY: BSS CH /SEND I HEARD YOU IF NOT ZERO /USED BY [T.O,TSK] LAC: BSS CH /LINE ALIVE COUNT /USED BY [M2I,T.O,TSK] LINE: BSS CH /LINE ALIVE-DEAD STATUS /USED BY [I2M,T.O,TSK] NONE: BSS CH /MODEM IDLE IF ZERO /NEGATIVE= -(M30SEC-NO OF SLOW TICKS SINCE LAST OUTPUT) SNULL: BSS CH /SEND NULL PKT IF NON-ZERO /USED 5Y [M2I,T.O,TSK] LUUP: BSS 1 /NON-ZERO=SOME MODEM IS LOOPED /USED BY [H2I,TSK,BCK] TSKFLG: /TASK-HOST COMMUNICATION DEFPLC [HILO] HILO: BSS TH /RETURN ADDRESSES WHERE HI LEFT OFF BSS BH /0=NO ACTION, 1=NACK, 2=ACK /USED BY BCK BSS 1 /TO PRESERVE P0 LOCATIONS DDTI: BSS 1 /DDT INTERRUPT FLAG OVRDF: BSS 1 /SS4 IS OVERRIDDEN IF THIS IS NON, /USED BY [TTY,BCK] TTFG: BSS 1 /TTY COMMUNICATION SWITCH /USED BY VD5 VD.OT: BSS 1 /VDH TYPE OF OUTPUT FLAG /USED BY T.O VD.RDY: BSS 1 /NON-ZERO=VDH READY LINE FLAPPED /USED BY [I2H,T.O,TSK,BCK] RALLCF: BSS 1 /RALLY COMMUNICATION FLAG FOR PUT-G /USED BY MSK IHM: BSS 1 /IH MASK HIM: BSS 1 /HI MASK MOM: BSS 1 /MODEM OUT MASK /USED BY [T.O,I2H(OWP)] WDTIME: BSS 1 /SOFTWARE W.D.T. /USED BY [H2I,I2H.T.O,TSK,BCK] HIHD: BSS TH /HOST STATUS HSTUP=0 /HOST IS UP HSTGDN=1 /GOT A HOST-GOING-DOWN MESSAGE HSTTRD=2 /HOST WAS TARDY IN ACCEPTING AN IMP MESSAGE HSTOFF=3 /HOST READY LINE IS DOWN HSTIDN=4 /IMP IS COMING UP OR GOING DOWN /USED BY TSK THIS: BSS 1 /CURRENT TASK BUFFER /USED BY FRE TWDP: BSS 1 /SECOND WORD IN TWO WORD PUT /USED BY I2H TWDG: BSS 1 /SECOND WORD IN TWO WORD GET COUNTA: /ADDITIVE COUNTS - KEEP IN ORDER /USED BY [I2H,TSK] NHA: BSS TH /REG HOST QUEUE BSS TH /PRI HOST QUEUE /USED BY FRE NFA: BSS 1 /FREE LIST /USED BY [M2I,I2M,T.O,TSK] NSFA: BSS 1 /STORE-AND-FORWARD COUNT /USED BY [I2H,T.O,TSK] NREA: BSS 1 /REASSEMBLY COUNT /USED BY [T.O,TSK,5CK] NALA: BSS 1 /ALLOCATE COUNT COUNTS: /SUBTRACTIVE COUNTS /USED BY [I2H,TSK] NHS: BSS TH BSS TH /USED BY FRE NFS: BSS 1 /USED BY [M2I,I2M,T.O,TSK] NSFS: BSS 1 /USED BY [I2H,T.O,TSK] NRES: BSS 1 /USED BY [T.O,TSK,BCK] NALS: BSS 1 COUNTL=COUNTS-COUNTA /USED BY [BCK] VDHUPF: BSS 1 /VDH UP/DOWN FLAG ZEROE: ZEROL=ZEROE-ZEROB LEV CON MINF: CH-1 /MIN NUMBER OF FREE BUFFERS MAXS: BSS 1 /MAX NUMBER OF S/F PACKETS MAXR: BSS 1 /MAX NUMBER OF REASSEMBLY PACKETS MAXSI: BSS 1 /S&F LIMIT USED BY MODEM TASK SW1: BSS MAXSTAT /ADDRES OF STAT GATHERING SUBRS I2MTAB: I2MB0 /START ADDR OF BLOCK OF CHANNEL PNT I2MB1 I2MB2 I2MB3 I2MB4 LEV VAR I2MEND: BSS CH /END ADDRESS OF EACH BLOCK I2MNXT: BSS CH /PKT PNTR FOR LATEST OUTPUT /0=ROUTE,NULL,OR NO OUTPUT, SIGN ON=ACK RECEIVED WHILE PKT O DEFPLC [TSEX - TRANSMIT ODD-EVEN BITS] TSEX: BSS CH /ODD-EVEN BIT TO USE FOR NEXT OUTF DEFPLC [RSEX - RECEIVE ODD-EVEN BITS] RSEX: BSS CH /COMP OF ODD-EVEN BIT WE EXPECT NEX /USED BY [M2I,TSK] CHFREE: BSS CH RST.O: BSS 1 /PTR TO RM OUTPUT AREA RST.F: BSS 1 / " " " FREE " RST.N: BSS 1 / " " " NEW " RST.C: BSS 1 / " " " COMPARE " LEV CON /ADDRESS CONSTANTS JAM: GAM /GIVE A WORD FROM FAKE HOST TO IMP DOZE: BKX /JAM WAIT SUCK: SUC /GET A WORD FOR FAKE HOST FROM IMP WAIT: BKW /SUCK WAIT OWP: OWPE /ENTRY INTO ONE WORD PUT FLUSHI: FLUSH /PNTR TO SUBR TO FREE BUFFER DODXA: .DODXA /ENTRY INTO DO DXA SUBROUTINE DEFPLC [HOST SIMULATOR FLAG] HSFG: 0 /NON-ZERO = START UP HOST SIMULATOR LEV VAR MP: BSS 1 /MODEM-TO-IMP CURRENT MODEM NO HIP: BSS 1 /HOST-TO-IMP CURRENT HOST NO IHP: BSS 1 /IMP-TO-HOST CURRENT HOST NO LEV CON HIXX: HISP 0 X /HOST-TO-IMP INDEXED SAVE PNTR IHXX: IHSP 0 X /IMP-TO-HOST INDEXED SAVE PNTR TIPCON=745 .TA.=. 100002/ .TA. TIPCON .ASCII /"Z"/ /LINKS TO TIP PROGRAM TIPHST=2 /THE TIP TAKES THE HOST 2 SLOT TIPBKG=40001 TIPVER=40000 TIPCON/ HLTNCC: HLTWRD /PNTR TO HALT REPORTING SUBR HLTLOC: 0 /PC OF LAST HALT HLTA: BSS 1 /A REG AT LAST HALT HLTX: BSS 1 /X REG AT LAST HALT 8PKTS: /NO OF PKTS PER MESSAGE CMINPL: /MIN PKT LENGTH TEN: 10 0"A"MINPL C77: 77 C100: 100 BSS 9. /SOME ROOM FOR TIP CONSTANTS TPOPEN: 0 /COUNT OF NO OF OPEN CONNECTIONS ON IHLSTP+TIPHST /MINUS IF LAST IMP-TO-TIP PKT TIPSKP /SKP IF TIP UP, NOP IF TIP DOWN TIPLNK: BSS 1 /IMP-TO-TIP DMC DUTPUT PNTR BSS 1 /IMP-IO-TIP OMC OUTPUT END PNTR BSS 1 /TIP-TO-IMP DMC INPUT PNTR BSS 1 /TIP-TO-IMP DMC INPUT END PNTR 0 /(IMP-TO-TIP PKT RNTR) EMFH+TIPHST /SKP IF LAST TIP-TO-IMP PKT, ELSE HITT+TIPHST /TIP-TO-IMP INTERFACE TIMER BSS 1 /LOC 777 USED BY RELOAD CODE /WATCHDOG TIMER AND POWER FAIL ROUTINES /THESE 2 INSTRS FOLLOW A COMPUTED SKS MODEM ERROR IN PAGE 0 LEV WDI JMP LD10 JMP WDLUP WDC4: WDT1 JMP WDTM2 /START HERE TO LOAD FROM THE NET JMP WDLOD /START HERE TO LOAD FROM A LINE DEFPLC [HOST34 SWITCH] HOST34: BSS 1 /MEANING OF BITS 1&2 FOLLOWS /0 FOR 5 MODEMS />0 FOR 4 MODEMS, 3 HOSTS /<0 FOR 3 MODEMS, 4 HOSTS /USE >0 FOR TIP/MLC /BIT 16 ZERO MEANS PAGE 27 IS BUFFERS /BIT 16 NON-ZERO MEANS PAGE 27 IS NOT TO BE OVERLAID WITH BU] /VDHF INDICATES WHETHER VDH CODE IS ACTUALLY PRESENT BSS 3 /FOR COMPATIBILITY WITH IMPLOD 2513 /** THIS IS THE CRITICAL CODE WHICH MUST NOT CHANGE ** /** BOTH LOCATION AND CONTENTS MUST STAY CONSTANT ** /** IN ORDER THAT ONE IMP VERSION MAY RELOAD ANOTHER ** LWAIT: STA 45 /**THIS IS WHERE THE IMP WAITS IRS 45 /**AFTER SENDING A REQUEST FOR CORE JMP .-1 /**THIS CODE IS OVERLAID WITH THE IRS 44 /**NEW CORE IMAGE WHILE IT IS RUN: JMP LWAIT /**SO IT MUST BE INVARIANT ITSELF JMP LD7 CORELO=60 COREHI=33000 /CORE IMAGE IS LOADED STARTING AT CORELO /AND ENDING AT COREHI-1 WDTM: WDTIL/ WDTM WDTM/ INT WDI IRS RSFLAG WDTM2: CRA /ENTER HERE FOR RANDOM RELOAD LEV BCK /COME HERE FROM NICE STOP CODE WDLOD: INH ALL /ENTER HERE WITH LINE # (1-4) IN AC CLKON SUB (1) ALS 1 STA 47 LDA HOST34 /SAVE HOST CONFIGURATION STA 46 /SHOULD BE 51 /LDA RSFLAG /SAVE RESTART-RELOAD FLAG /STA 43 WDLUP: LDA LD8 NOP /FOR FILLER IAB LDA (-23) /DON'T LET CLOCK INTS IN DXA JMP CLEA LD8: .+1 LDA 47 SMI /RANDOM RELOAD? JMP LD11 /NO RDCLOK /YES JMP .-1 ANA (6) /GET TWO BIT NUMBER LD11: STA 0 LDA (SENDC) /SET UP REQUEST FOR CORE STA M1OTBP X ADD (4) STA M1OTBP+1 X LDA (CORELO 0 I) /SET UP CORE IMAGE BOUNDS STA M1INBP X LDA (COREHI 0 I) STA M1INBP+1 X JMP LDT XI LD1: M1OUT /SEND OUT REQUEST FOR CORE JMP LD12 JMP LD5 LD2: M2OUT JMP LD12 JMP LD5 LD3: M3OUT JMP LD12 JMP LD5 LD4: M4OUT JMP LD12 LD5: LDA (-3000.) STA 44 /JMP LWAIT /NOP /TO KEEP LOC OF LD6 CONSTANT /THE NEXT 5 REGS CAN COME OUT AFTER COMPATIBILITY WITH 2634 LD6: STA 45 IRS 45 JMP .-1 IRS 44 JMP LD6 LD7: LDA M1INBP X ERA (COREHI 0 I) SZE JMP WDLUP LDA LDERR X STA 777 JMP 777 LD10: CLKOFF LDA 46 /SHOULD BE 51 /RESTORE HOST C STA HOST34 /LDA 43 /RESTORE RESTART-RELOAD FLAG /STA RSFLAG LDX (56-104) /SAVE INTERRUPT ENTRANCES LDA 104 X STA (30000 0 X) I IRS 0 JMP .-3 LDA LD9 IAB LDA (-21) AMIMLC LDA (-1) JMP CLEA LD9: .+1 LDX (56-104) /RESTORE INTERRUPT ENTRANCES LDA (30000 0 X) I STA 104 X IRS 0 JMP .-3 IRS RSFLAG JMP (INIT) I LDT: LD1 LDERR: M1ERR LD2 M2ERR LD3 M3ERR LD4 M4ERR SENDC: 40001 SNDCOR 0 LINETS 0 0 -[40001 0 SNDCOR LINETS -3] CLEA: SMK 120 LEV BCK LCK ALL LDX (STDIL-0-TASKIL) LDA WDC4 STA TASKIL+1 X /RESET ALL INTERRUPT ENTRANCES IRS 0 JMP .-2 LDX (-2) /MUST UNPATCH TWICE 1? WDT2: M1UNXP M2UNXP M3UNXP M4UNXP M5UNXP HUNXPT: H1UNXP /THESE MUST BE IN ORDER11 H2UNXP H3UNXP H4UNXP IRS 0 JMP WDT2 JST WDT1 /AND WAIT WDT1: 0 /NULL INTERRUPT ENTRY DXA /ALL INTERRUPTS COME HERE TO DIE JMP . 1 ENB BCK LDX (0) IRS 0 JMP .-1 /WAIT 600 MS IAB /5=>X IMA 0 /0=>A SMK 120 /NOW WE BLOCK ALL FUTURE INTERRUPTS LEV WDI INH ALL JMP 0 X /GO TO LD8+1 LD12: LDA (-533.) STA 44 LD13: STA 45 IRS 45 JMP .-1 IRS 44 JMP LD13 JMP .+1 X M1IN JMP LD5 M2IN JMP LD5 M3IN JMP LD5 M4IN JMP LD5 LEV CON BITTAB: 1 /BITS FOR ACK AND MESSAGE STUFF 2 4 10 20 40 100 SWCHB: 200 400 1000 2000 MBITS: 10 4 2 1 SWDT: SWDTIL/ SWDT /SOFTWARE W-D-T INTERRUPT CALL SWDT/ INT WDI INH ALL STA (37775) I /SAVED A STX (37776) I /SAVED X LDA SWDT /IF NOT MEM PROTECT (MAY NEED TO BE STA (37774) I /SAVED P/Y JST WDTIL I RSTR: /POWER FAIL COMES HERE PFIL/ RSTR RSTR/ INT RSI WDT /POKE WATCHDOG TIMER SO WE DON'T ( CRA STA FREE /COPY SOME PROGRAM INTO PAGE 0 LDA (3) STA RSFLAG /SO THAT RESTART WILL INDICATE POWE LDA RST2A /THESE ARE FOR WHEN THE POWER COMES STA NHA LDX RST3 JMP FREE /GO LOCK UP THE MACHINE RST2A: 2000 RST3: JMP NHA I /CORE DUMP TO PDP-1D AT BBN /COPY EACH 100-WORD BLOCK OF CORE INTO CORBUF=>CORBUF+77 /SEND BLOCK 1 FROM ITSELF, THEN 2-277 (OR HIGHER), THEN BLOC. /USE CORBUF-4=>CORBUF-1 AS HEADER AND TEMP STORE CORBUF=100 CORCNT=CORBUF-4 /ACKH - USE AS TEMP CORHED=CORBUF-3 /HEAD - FIXED HEADER, GOES AS ROUTI1 CORPUT=CORBUF-2 /HEAD1 - USE AS TEMP CORGET=CORBUF-1 /HEAD2 - FIRST LOCATION OF BLOCK BE /HEAD3 THRU BUFE-1 ARE 100 DATA WOR] LEV BCK DEFPLC [CORE DUMP] CORE: INH ALL EXA H4UNXP H4ENAB H4FOUT IAB /ENTER WITH LINE NO 1-5 IN AC LDX (-104) LDA CORCNT+104 X STA CORSAV+104 X /SAVE CORBUF-4=>CORBUF+77 IRS 0 JMP .-3 IRS 0 JMP .-1 /WAIT FOR READY LINE IAB ALS 1 STA 0 /SAVE 2*MODEM NO RDIMPN JMP .-1 ERA (BBNIMP) SNZ /ARE WE THE BBN IMP? STA 0 /YES, THEN WE SEND CORE OUT TO HOST LDA (RUTDMP 0 LINETS) STA CORHED /SET UP FIXED HEADER LDA (CORBUF) STA CORGET /SET UP BLOCK TO COPY FROM CORNXT: LDA 0 SZE /ARE WE SENDING TO A HOST? LDA (CORPUT-CORCNT) /NO, NEED FULL HEADER FC ADD (CORCNT) /NEED ONLY LEADER TO HOST STA H4OTBP X /SET UP DMC PNTRS LDA (CORBUF+77) STA H4OTBP+1 X LDA (CORBUF) STA CORPUT /SET UP BLOCK TO COPY INTO TCA STA CORCNT /SET UP COPY COUNT LDA CORGET SZE /ARE WE DOING BLOCK 0? JMP CORCOP /NO IRS CORGET /YES, START WITH REG 1 IRS CORPUT /SINCE CORBUF HAS HIGHEST CORE BLOC1 IRS CORCNT CORCOP: LDA CORGET I /DO THE COPY STA CORPUT I IRS CORGET IRS CORPUT IRS CORCNT JMP CORCOP JMP COROCP X /DO OCP OUTPUT COROCP: H4FOUT JMP CORWAT M1OUT JMP CORWAT M2OUT JMP CORWAT M3OUT JMP CORWAT M4OUT JMP CORWAT M5OUT CORWAT: LDA CORGET ERA (CORBUF) SNZ /DID WE JUST SEND BLOCK 0? JMP COREND /YES LDA (100000) STA CORCNT IRS CORCNT JMP .-1 /WAIT WDT /JUST IN CASE LDA CORGET SUB (30000) SPL /HAVE WE DONE FIRST 12K YET? JMP CORNXT /NO, KEEP GOING LDA CORGET I /YES, NOW WE MUST CHECK FOR PRESENC1 CMA /ABOVE 12K MINIMUM IMA CORGET I CAS CORGET I SKP JMP .+3 /NO TRANSITION, NO MORE MEMORY STA CORGET I /RESTORE TEST CELL JMP CORNXT /AND KEEP GOING CRA IMA CORGET /RESET PTR TO BLOCK 0 STA CORBUF /SAVE HIGHEST CORE BLOCK IN CORBUF RDIMPN JMP .-1 ERA CORBUF /PUT IMP NO IN RIGHT PART OF REG C STA CORBUF JMP CORNXT /GO BACK AND SEND BLOCK 0 COREND: LDX (-4) LDA CORSAV+4 X STA CORCNT+CORBUF+4 X IRS 0 /RESTORE CORBUF-4=>CORBUF-1 IN THE JMP .-3 IRS 0 JMP .-1 /WAIT LDX (-104) LDA CORSAV+104 X STA CORCNT+104 X /RESTORE CORBUF-4=>CORBUF IRS 0 JMP .-3 WDT HLT /DONE JMP .-2 CORSAV: /SAVE SPACE FOR CORBUF-4=>CORBUF+77 /NEXT 104 LOCS USED BY COR DMP /THIS CODE IS THE ADD CHAIN WHICH COMPUTES PACKET CHECKSUMS /IT IS RE-ENTRANT AND IS CALLED BY DIFFERENT INTERRUPTS LEV ALL ADDTOP: ADD BUFE+4 X ADD BUFE+3 X ADD BUFE+2 X ADD BUFE+1 X ADD BUFE X ADD BUFE-1 X ADD DATA+76 X ADD DATA+75 X ADD DATA+74 X ADD DATA+73 X ADD DATA+72 X ADD DATA+71 X ADD DATA+70 X ADD DATA+67 X ADD DATA+66 X ADD DATA+65 X ADD DATA+64 X ADD DATA+63 X ADD DATA+62 X ADD DATA+61 X ADD DATA+60 X ADD DATA+57 X ADD DATA+56 X ADD DATA+55 X ADD DATA+54 X ADD DATA+53 X ADD DATA+52 X ADD DATA+51 X ADD DATA+50 X ADD DATA+47 X ADD DATA+46 X ADD DATA+45 X ADD DATA+44 X ADD DATA+43 X ADD DATA+42 X ADD DATA+41 X ADD DATA+40 X ADD DATA+37 X ADD DATA+36 X ADD DATA+35 X ADD DATA+34 X ADD DATA+33 X ADD DATA+32 X ADD DATA+31 X ADD DATA+30 X ADD DATA+27 X ADD DATA+26 X ADD DATA+25 X ADD DATA+24 X ADD DATA+23 X ADD DATA+22 X ADD DATA+21 X ADD DATA+20 X ADD DATA+17 X ADD DATA+16 X ADD DATA+15 X ADD DATA+14 X ADD DATA+13 X ADD DATA+12 X ADD DATA+11 X ADD DATA+10 X ADD DATA+7 X ADD DATA+6 X ADD DATA+5 X ADD DATA+4 X ADD DATA+3 X ADD DATA+2 X ADD DATA+1 X ADD DATA X ADD HEAD3 X ADD HEAD2 X ADD HEAD1 X ADD HEAD X ADDBOT: ADD ACKH X JMP ADDRET I /RETURN TO CALLING INTERRUPT ROUTIN LEV CON CONSTANTS 1777/ 0 /LOC 1777 USED IN SWCH CODE /FOR MEM PROTECT TEST /INITIALIZATION LEV BCK INIT: JST DODXA I RET BCK INH INI CRA SMK INTM /LOCK OUT INTERRUPTS FOR INIT STA PRIM IMA RSFLAG AOA STA (RSFNCC) I /SET UP RSTART INDICATOR FOR NCC CAS ONE /RESTART CAS THREE /OR POWERFAIL (4) JMP INIVDH /==>SEE IF VDH GETS RESTARTED NOP / (MUST COME BEFORE ZEROING 0-AF CRA STA SATRSF INIVDR: STA TIPRSF STA TPOPEN LDX (-MAXITB) /MUST PRECEDE ZEROING INIT1: LDA ITBTIP+MAXITB X /SO THAT APPROPRIATE INT'I AMIMLC /ENTRIES ARE CLEARED LDA ITBIMP+MAXITB X STA ITBLOC+MAXITB XI /INIT TIP-HOST3 LOCS IRS 0 JMP INIT1 LDX (-MAXVDH) LDA ITBNVD+MAXVDH X STA ITBVDL MAXVDH XI IRS 0 JMP .-3 LDX (-INITZN) /INIT THE ZERO STORAGE AREAS INIT0: LDA INITZB+INITZN X STA IT1 LDA INITZL+INITZN X STA IT2 CRA /MUST PRECED QUEUE INIT STA IT1 I IRS IT1 IRS IT2 JMP .-3 IRS 0 JMP INIT0 STA VDHRSF /VDH WILL NOT RESTART RDIMPN JMP .-1 STA MINE /INIT MINE LDA (NS1) STA (NSRR) I LDX (-QUEUEL) LDA (QUEUEB) /INIT QUEUE PNTRS INIT3: STA QUEUEE+QUEUEL X AOA IRS 0 JMP INIT3 LDA (ZERO) STA FREE LDA (HOST34) I ANA TWO SZE LDA THREE STA (SATNO) I LDA (HOST34) I ANA ONE STA 0 SNZ STA VDHRSF /JUST IN CASE SZE LDA (-CH 0 M.N) /SET VDHNO FOR VDH IMPS.. STA (VDHNO) I /...0 FOR NON-VDH LDA P36END X STA SPAR+36-2 /SET UP END OF P36 FOR VDH OR NOT LDA P37END X STA SPAR+37-2 /SET UP END OF P37 AND BEYOND LDA TWO /START COLLECTING BUFFERS ON P2 STA IT1 LDX (-PAGES+2) INIT4: LDA SPAR+PAGES-2 X LRS 9. /PICK UP NUMBER OF BUFFERS ON THI[ /NOTE THAT NO MORE THAN 64 8UFFERS CAN BE CLAIMED PER ENTRY STA IT2 LDA IT1 /PICK UP PAGE NUMBER IRS IT1 LLS 9. /PICK UP START OF BUFFER STORAGE JMP INIT6 INIT5: IRS NFA /COUNT ANOTHER FREE BUFFER IMA FREE STA FREE I /ADD TO FREE LIST LDA FREE ADD (BUFL) INIT6: IRS IT2 /HAVE WE TAKEN ALL THE BUFFERS JMP INIT5 /NO, MORE ON THIS PAGE IRS 0 /YES, GO ON TO NEXT PAGE JMP INIT4 LDA (4"T"CH) STA MAXS STA MAXSI TCA ADD NFA ADD 8PKTS ARS 3 ALS 3 ADD TWO STA MAXR LDX MINUS2 /INIT THE FREE REAS+TRACE LISTS INIT7: LDA INIBLK+2 X STA IT1 LDA INIQUE+2 X STA INISTR+2 XI STA IT2 INIT8: ADD INILNG+2 X STA IT2 I STA IT2 IRS IT1 JMP INIT8 CRA STA IT2 I IRS 0 JMP INIT7 LDA MINIMP STA IT1 LDX ZERO INIT9: JST MESINI /INIT TMESS,RMESS IRS 0 IRS IT1 JMP INIT9 LDA (TALLY) STA (TALLYI) I LDX (0 0-2"T"FH-BH) INIT13: LDA TTOI+FH+FH+BH X STA (DZTB+FH+FH+BH 0 X) I IRS 0 JMP INIT13 JMP (INITNP) I INIVDH: LDA VDHUPF /PWR FAIL OR PLAIN RESTART STA VDHRSF /THEN RESTART VDH IF IT WAS UP LDA SATRSF SSP STA SATRSF LDA TIPRSF SSP /0=>0, -=>+ JMP INIVDR LEV VAR IT1: BSS 1 IT2: BSS 1 LEV CON INITZB: ZEROB I2MB0 TABZB PARAMT STDIL 0 I /IN CASE NON-EXA IMP RELOADS FROM INITZL: -ZEROL -[CH"T"NACH] -TABZL -PARAML STDIL-0-TASKIL INITZN=INITZL-0-INITZB INIBLK: -NREAB+0+1 -NTRCB+0+1 INIQUE: REASQ TRACEQ INISTR: RASF TTF INILNG: REASL TRACEL ITBLOC: BSS MAXITB ITBIMP: BSS MAXITB ITBTIP: BSS MAXITB MAXVDH=11. ITBNVD: BSS MAXVDH ITBVDL: REPEAT MAXVDH,JUNK LEV [INI,T.O] MESINI: 0 LDA (0 0 177777"X"MSTO1"X"MSTO2) STA (TMESS 0 X) I LDA (0 0 3"T"400) 0"A"MESSNO STA (RMESS 0 X) I CRA STA (AMESS 0 X) I STA (RALLY 0 X) I JMP MESINI I LEV CON P36END: P36FB"A"777-[P36NB+1]"T"1000 P36FB"A"777-[P36NB]"T"1000 P37END: P37FB"A"777-[P37NB]"T"1000 VDHEND"A"777-[0+1]"T"1000 SPAR: BSS PAGES-2 /TABLE OF ENDS-OF-PAGES /FORMAT IS HI 7 BITS = -(NUMBER OF BUFFS ON PAGE+1) /LO 9 BITS = STARTING ADDRESS OF FIRST BUFFER /FAKE HOST OUTPUT (JAM) SLOTS IN DZTB TTOI: TTYI /FH0 (TTY) OUTPUT FROM IMP TO FH DOTI /FH1 (DDT) OUTPUT FROM IMP TO FH BTRE /FH2 (TRACE) OUTPUT FROM IMP TO FH STTI /FH3 (STAT) OUTPUT FROM IMP TO FH /FAKE HOST INPUT (SUCK) SLOTS IN WTTB TTO0 /FH0 (TTY) INPUT TO IMP FROM FH DIN4 /FH1 (DDT) INPUT TO IMP FROM FH BEST /FH2 (PARAM CHANGE) INPUT TO IMP E STXY /FH3 (DISCARD) INPUT TO IMP FROM FH /BACK HOST SLOTS IN SLTB BACK0 /BH0 (SEND RFNMS+ALLOCATES) BACK1 /BH1 (SEND INCOMPLETE TRANSMISSIONS BACK2 /BH2 (SEND GIVE BACKS) BACK3 /BH3 (RETRANSMIT FROM PPT) BACK4 /BH4 (SEND OUT-OF-RANGE REPLIES) / (REROUTE DEAD LINE STUFF) / (RETURN DESTINATION DEADS) BACK5 LEV CON CONSTANTS PAGEND 2,UNCON,4 /CONSTANTS, VARIABLE FOR NEW INIT PAGE LEV VAR IT3: BSS 1 LEV CON M2IIT: M2I1A M2I2A M2I3A M2I4A M2I5A HIM.I: TIPDEF 177660,177664 HIM.I4: TIPDEF 177460,177464 IHM.I: TIPDEF 173600,173624 IHM.I4: TIPDEF 163400,163424 LEV BCK LCK INI INITNP: LDA (HOST34) I /THIS IS <>0 IF 3 OR 4 HOSTS ANA MINUS4 /=0 FOR 5 MODEMS, 2 HOSTS />0 FOR 4 MODEMS, 3 HOSTS /<0 FOR 3 MODEMS, 4 HOSTS LDX MIN100 /5M,2H SZE LDX IHM.I /4M,3H SPL LDX IHM.I4 /3M,4H STX IHM /* LDX (-20) /5M,2H SZE LDX HIM.I /4M,3H SPL LDX HIM.I4 /3M,4H STX HIM /* LDX (-4000) /5M,2H SZE LDX (-10000) /4M,3H SPL LDX (-20000) /3M,4H STX MOM /* LDX ZERO /5M,2H SZE LDX MINUS1 /4M,3H SPL LDX MINUS2 /3M,4H STX (MODNO) I /* LDX (M2I5) /5M SZE LDX (IH2E) /4M OR 3M STX M5INIL /* LDX (M2I4) /5M OR 4M SPL LDX (IH3E) /3M STX M4INIL /* LDX (I2M5) /5M SZE LDX (HI2E) /4M OR 3M STX M5OTIL /* LDX (I2M4) /5M OR 4M SPL LDX (HI3E) /3M STX M4OTIL /* JST (RUTINI) I /INIT ROUTING TABLES JST (TOI) I /INITIALIZE TIMEOUT RDCLOK JMP .-1 /WAIT 3 SECONDS SMI JMP .-3 /BEFORE STARTING INTERRUPT PROGRAF' JST (SWCH) I /FIRE OFF A TRBL REPT NOW - FOLLOWS /START MODEM INPUT - MUST FOLLOW TOI LDX (-[2"T"CH]) LDA (I 0 1) INIT17: STA M1INBP+2"T"CH X IRS 0 JMP INIT17 LDA (M1IN) STA INIT19 LDX MICH INIT18: LDA (JMP+0+1000+M2II"A"777) STA M2IIT+CH XI /FIRST IN WILL BE DISCAF LDA (VDHNO) I /SKIP FOR VDH'S MODEM SUB 0 SZE SUB (SATNO) I /ENTERING AC IS -C(0) SZE INIT19: BSS 1 /STARTUP MODEM INS IRS INIT19 IRS 0 JMP INIT18 /START THE HOST/IMP AND IMP/HOST ROUTINES LDA MITH STA IT3 /COUNTING ON X=0 AT THIS POINT INIT15: LDA FOUR 0"A"HSTIDN /HOSTS ARE DOWN WHILE IMP STA HIHD X JST (IHIN) I /** MUST BE IN THIS ORDER JST (HIST) I /** IRS 0 IRS IT3 JMP INIT15 LDA MINUS1 STA SW3FG STA NRSTF STA PRIM SMK INTM ENB BCK RDCLOK /ALLOW ALL T/O PROGRAMS TO RUN JMP .-1 SPL JMP .-3 /BEFORE BACK BEGINS /FALL INTO BACKST ----- /BACKGROUND LOOP LEV BCK BACKST: LDA (BBNIMP) /1ST REPORT MUST GO TO NCC BACK: STA (TRBD) I LDA (-FH) STA BT1 BKV: LDA BT1 SUB (-FH) STA 0 STA FAKENO /FOR DEBUG JMP DZTB XI /RESUME WHERE JAM LEFT OFF BKX: 0 /JAM WAIT (DOZE) LDA BKX STA DZTB X JMP WTTB XI /RESUME WHERE SUCK LEFT OFF BKW: 0 /SUCK WAIT (WAIT) LDA BKW STA WTTB X ENB BCK IRS BT1 JMP BKV LDA (-BH) STA BT1 LDX ZERO BKY: STX (BACKNO) I LDX ONE INH ALL DXATS1: JMP DXATST XI /ARE WE EXA OR DXA? DEFHLT [BACKGROUND IN EXA MODE (BACK0)!] JST DXABUG /DXA DXATS2: LDX (BACKNO) I /EXA JMP SLTB XI /RESUME WHERE BACK HOSTS LEFT OFF LEV CON DXATST: DXATS1 DXATS2 LEV BCK LCK ALL DXABUG: 0 JST HLTNCC I DXA JMP DXABUG I RET BCK BKZ: 0 /BACK HOST WAIT (SLEEP) ENB BCK LDX (BACKNO) I LDA BKZ STA SLTB X B5Z: IRS 0 IRS BT1 JMP BKY CRA SR3 STA SW3FG /DO NICE STOP IF SS3 LDA SW3FG /REMOTE NICE-STOP+RELOAD SPL LDA NRSTF SMI JST NSRT /NICE-STOP IF SW3FG>=0 OR NRSTF>=0 LDA TIME IMA WDTOLD /IS T.O RUNNING? ERA WDTOLD SZE JMP BKT /TIME CHANGED...YES IRS WDTBAK JMP BKU /DON'T GIVE UP YET RELOAD [BACKGROUND SAW TIMEOUT STOP] JST SWDTIL I BKT: LDA (-10000.) /GIVE T.O A LONG TIME TO RUN STA WDTBAK /AND RESET BACK-WDT BKU: ENB BCK TIPDEF [JMP BKS],[LDA TIPRSF] SNZ JMP BKR EXA JST (TIPBKG) I INH ALL JST DODXA I RET BCK JMP BKS BKR: LDA STDIL STA H2INIL STA H2OTIL BKS: LDX (-LITN) /LIGHTS DISPLAY LIT2: LDA LITT+LITN XI SZE SSM LLR 1 IRS 0 JMP LIT2 CRA LRR LITN ERA LUUP STA LITS INH ALL EXA LDA LITP I JST DODXA I RET BCK SR1 LDA MINUS1 /LAMP TEST LITES NOP IAB IRS BACKX /KEEP COUNT OF BACK LOOPS NOP CRA IMA VDHRSF /CHECK AND RESET VDH RESTART FLAG SZE JST (VD.I) I /YES, RESTART VDH2: NOP /VDH BACKGROUND CALL LDA RUT+BBNIMP SMI 0"A"RUTDED /IS NCC IMP UP? JMP BACKST /YES LDX MINIMP /MUST FIND RANDOM IMP UP BKWD1: LDA RUT+NIMP X SMI 0"A"RUTDED /DEAD? SNZ 0"A"RUTUS JMP BKWD2 /DON'T USE OURSELVES EXCEPT AS A LA1 LDA 0 /GOT ONE SUB MINIMP BKWD3: ERA (DESTH 0 FORIMP) /TO DISCARD JMP BACK BKWD2: IRS 0 JMP BKWD1 LDA MINE /EVERYONE IS DEAD, USE OURSELVES JMP BKWD3 VDH2.: VD.B LEV VAR BT1: BSS 1 BACKX: BSS 1 /NO OF BACK LOOPS FAKENO: BSS 1 WDTOLD: BSS 1 /OLD TIME READING WDTBAK: BSS 1 /BACK WDT TIMER /THESE 3 TABLES MUST STAY IN ORDER11 DEFPLC [DZTB - GOES WITH JAM] DZTB: BSS FH DEFPLC [WTTB - GOES WITH SUCK] WTTB: BSS FH DEFPLC [SLTB - GOES WITH SLEEP (BACK HOSTS)] SLTB: BSS BH DEFPLC [LIGHT DISPLAY POINTER AND NOMINAL DISPLAY WORD] LITP: LITS LITS: BSS 1 /LIGHTS TABLE AND CONDITION INDICATED BY LIT LIGHT LEV CON LITT: LINE /1 - 100000 1ST CHANNEL DEAD LINE+1 /2 - 40000 2ND CHANNEL DEAD LINE+2 /3 - 20000 3RD CHANNEL DEAD LINE+3 /4 - 10000 4TH CHANNEL DEAD HIHD /5 - 4000 HOST 1 DEAD HIHD+1 /6 - 2000 HOST 2 DEAD HIHD+2 /7 - 1000 HOST 3 DEAD HIHD+3 /8 - 400 HOST 4 DEAD TPOPEN /9 - 200 TIP HAS OPEN CONNECTION LITN=0 0 .-LITT / NICE STOP ROUTINE LEV BCK NSRT: 0 JMP NSRR I NSRR: 0 JMP NSRT I NS1: LDA SW3FG /SET UP RSFNCC WORD FOR NICE STOP ANA SEVEN ALR 3 ERA NRSTF ANA (177770) ERA NRSTF ERA C77 ALR 3 SS3 /DO NOT SET RSFNCC FOR SS3 STA RSFNCC CRA /SEND IMP GOING DOWN IN 30 SEC JST IHDOWN LCK FRE ENB BCK JST NSWT /WAIT 5 SECONDS LDA FOUR 0"A"HSTIDN STA HIHD /STOP NET TRAFFIC TO AND FROM HOSTS STA HIHD+1 /MARK HOSTS DEAD, IMP NOT UP STA HIHD+2 STA HIHD+3 JST NSWT /WAIT 5 SECONDS LDA MINUS1 /STOP STORE-AND-FORWARD TRAFFIC BI STA MAXSI /MAKING MAXS COPY SMALL JST NSWT /WAIT 5 SECONDS LDA MICH STA BT2 /STOP EXCHANGE OF ROUTING AND ACKNO LDX ZERO /TURNING OFF ALL LINES INH [M2I,T.O,TSK] NS3: JST (KILLIN) I /KILL LINE AT ONCE IRS 0 IRS BT2 JMP NS3 ENB BCK JST NSWT /WAIT 5 SECONDS JST NSWT /WAIT UNTIL SLT DELAY OVER LDA NRSTF SMI /RESTART? JMP (INIT) I /GO TO 2000 LDA SW3FG /FOR VDH OR NON-VDH SS3 /STOP OR RELOAD? JMP (WDLOD) I WDT HLT JMP .-2 IHDOWN: 0 /NOTIFY ALL HOSTS OF IMP DOWN INH FRE STA TWDP LDA MITH STA BT2 NS2: LDA BT2 SUB MITH STA 0 LDA (CIMPDN) /IMP GOING DOWN MESSAGE JST OWP I NOP IRS BT2 JMP NS2 JMP IHDOWN I NSWT: 0 /WAIT 5 SECONDS WDT LDA TIME STA NSTM NS5: JST NSRR LDA TIME SUB NSTM CAR /WAIT FIVE SECONDS SNZ JMP NS5 JMP NSWT I LEV VAR BT2: BSS 1 /TEMP NSTM: BSS 1 /FOR STOP RSFNCC: BSS 1 /RESTART PLACE FOR NCC -FORMAT FOLL /RSFNCC HAS THE FORM 000XYZ WHERE X,Y,Z ARE OCTAL DIGITS /X IS RELOAD REQUEST INDICATOR, X=0 NO REQUEST /X=7 RANDOM RELOAD, X=6 RELOAD FOR LINE 1, X=5 LINE 2, X=4 L /X=3 LINE 4, X=2 LINE 5 /Y IS RESTART REQUEST INDICATOR, Y=0 NO REQUEST /Y=7 RESTART AT 2000 - NON-VDH, X=6 RESTART AT 2001 - VDH /Z IS PROGRAM INITIALIZATION INDICATOR, Z=0 NO INIT /Z=1 RESTARTED, Z=2 RELOADED, Z=3 WATCH DOG TIMER RELOADED /Z=4 POWER FAIL RESTARTED LEV CON CONSTANTS PAGEND 3,UNCON,4 /SEND OFF ALLOCATED RFNMS AND ALLOCATES AND RFNMS LEV BCK B0AA: CRA STA BALLOC B0A: JST SLEEP I B0B: JST GETFRE LCK FRE /GET A BUFFER FOR OUR AL 1 JMP B0A /NOT NOW, WAIT LDA BRALLY 0"A"DESTI /GET OUR RALLY ANA (DESTI) STA HEAD1 X /SAVE IN HEADER ERA BRALLY 0"A"[MESSNO 0 ONEOR8 RFNM] ERA BALLOC 0"A"TRNREP /SET ALLOC BIT OR NOT ERA BREPIN 0"A"INCTRN STA HEAD X JST GIVTSK RET BCK /GIVE RALLY TO TASK B0C: JST SLEEP I BACK0: JST RALLYG /GET NEXT RALLY TO GO JMP B0C SKP /GOOD RETURN JMP B0C /GOT A DESTINATION DEAD, SENT ALREA STA BRALLY /SAVE RALLY ANA (ONEOR8 0 RFNM) ERA (ONEOR8 0 RFNM) SNZ /IS THIS JUST A 1-PKT RFNM? JMP B0AA /YES, NO ALLOC NECESSARY LDA BRALLY ANA (ONEOR8) SZE LDA (-7) 0"A"8PKTS ADD 8PKTS STA BALLOC LDA TIME STA BALLTO B0D: JST SLEEP I LDA TIME SUB BALLTO SUB (40.) SPL /HAVE WE BEEN WAITING 1 SEC? JMP B0F /NOT YET LDA BRALLY ANA (RFNM) SZE /ARE WE SENDING AN ALLOCATED RFNMT JMP B0AA /YES, SEND IT OFF WITHOUT ALLOC B0F: INH [T.O,TSK] LDA NALA SUB NALS ADD NREA SUB NRES ADD BALLOC CAS MAXR /CAN WE HAVE THE ROOM? JMP B0D /NOT YET JMP B0D LDA (ALLOC) IMA BALLOC /SET ALLOC BIT IN OUR REPLY ADD NALA STA NALA /YES, SO TAKE IT LDA M30SEC /2 MINUTES BEFORE WE ARE IDLE ALS 2 STA SNTALL JMP B0B LEV VAR BRALLY: BSS 1 /OUR ALLOCATE TO MAKE BALLTO: BSS 1 /TIME WE STARTED TO TRY FOR ALLOC BALLOC: BSS 1 /NO OF BUFFERS WE NEED TO ALLOC BREPIN: BSS 1 /BIT ON IF INC TRN REPLY SNTALL: BSS 1 /TIMER FOR GARBAGE COLLECTION OF 1 1 LEV BCK /SEND OFF INCOMPLETE TRASMISSIONS IF ANY TMESS NO OVERDUE LCK [H2I,T.O,TSK] B1A: JST (PPTGET) I /GET THE PPT ENTRY JMP B1F /NOT IN PPT OR PLT, SO ITS A GVB LDA BUFE X SSP 0"A"TWOQ STA BACK1T /SAVE PTR TO PKT CKSUM LDA HEAD3 X ANA (0 0 177777"X"SUBCOD) ERA (CLOST) /MARK MESS AS LOST IN NET IMA HEAD3 X SUB HEAD3 X ADD BACK1T I /ADJUST CKSUM STA BACK1T I LDA (ONEOR8) /MARK AS INC TRN FOR ONE-PKT B1B: LDX HOLD+1 /GET OUR PKT ERA HEAD X STA HEAD X JST GIVTSK RET BCK /AND GIVE TO TASK B1C: LDA BACK1P /LOOK AT NEXT TMESS ENTRY AOA CAS (TMESS 0 NIMP) BACK1: LDA (TMESS 0 NIMP) /SHOULDNT HAPPEN ADD MINIMP /WRAPAROUND TMESS TABLE STA BACK1P /SAVE PNTR TO TMESS B1D: JST SLEEP I INH [H2I,T.O,TSK] LDA BACK1P I ANA (MSTO1 0 MSTO2) ERA (MSTO1 0 MSTO2) SZE /HAS THIS MESS NO TIMED OUT? JMP B1C /NO STA BACK1T /INIT TEMP COUNTER. USED LATER JST GETFRE /YES, GET A BUFFER FOR OUR INC TRN JMP B1D /NOT NOW, TRY AGAIN STX HOLD+1 LDA BACK1P SUB (TMESS) /SET UP OUR DEST STA HEAD1 X 0"A"DESTI LDA BACK1P I ANA (0 0 177777"X"MSTO1"X"MSTO2) STA BACK1P I /CLEAR TIMEOUT BITS B1E: IRS BACK1T /1 MEANS OLDEST, 2 NEXT OLDEST ... ARR 1 SPL /IS THE OLDEST POSSIBLE MESS INC? JMP B1E /NO, COUNT ONE MORE BACKWARDS LDA BACK1T ICR /GET NO OF MESS NOS TO ROLL BACK ADD BACK1P I CAR 0"A"MESSNO ADD (INCTRN 0 -2000 TRNREP 0"A"LINETS) STA HEAD X /SET UP INC TRN WITH RIGHT MESS N( CAR 0"A"MESSNO ERA HEAD1 X /SET UP MESS NO + IMP NO JST (PLTGET) I /GET THE PLT ENTRY JMP B1A /NOT IN PLT, TRY PPT LDA PLT2 X ANA (0 0 177777"X"SUBCOD) ERA (CLOST) /MARK MESS AS LOST IN NET STA PLT2 X LDA PLT0 X ANA (REQALL) JMP B1B B1F: LDA (GVBALL 0 ONEOR8) JMP B1B /MAKE UP AN INC GVB LEV VAR BACK1P: BSS 1 /PNTR TO TMESS ENTRY BACK1T: BSS 1 /COUNT OF NO OF MESS NOS TO GO BACK /SEND OFF GIVE BACKS WHEN ALLOCATES TIME OUT LEV BCK B2A: JST SLEEP I B2B: JST GETFRE LCK FRE /GET A BUFFER FOR OUR GIV JMP B2A /NOT NOW, WAIT STX HOLD+2 B2C: JST SLEEP I RET BCK LDX HOLD+2 LDA BACK2D 0"A"PRIBIT /GET OUR DEST STA HEAD1 X /PUT IN PKT (NOT PRI) INH H2I JST (MESGET) I JMP B2C /CANT HAVE MESS NO ERA (GVBALL 0 ONEOR8 0"A"LINETS"A"INCTRN) STA HEAD X /SET UP GVB JST GIVTSK RET BCK /GIVE THE GVB TO TASK B2D: JST SLEEP I BACK2: INH [H2I,T.O] LDA MINUS6 /ALLOCATES TIME OUT IN 125 MS ADD (TALLYC) I SPL /IS ALLOC TOO OLD? JMP B2D /NOT USED UP YET LDA (TALLY) I /GET TOP TALLY ENTRY JST (TALLYG) I /PULL IT OFF JMP B2D /NOT THERE? STA BACK2D /SAVE OUR DEST JMP B2B LEV VAR BACK2D: BSS 1 /DEST OF GIVE BACK /DO RETRANSMISSSIONS OF REQ1 IN PPT THAT HAS GOT ALL1 IN RET1 LEV BCK B3B: JST SLEEP I LDX BACK3P I LDA BUFE X SPL 0"A"TWOQ /IS THIS PKT STILL ON 2 QUEUES? JMP B3B /YES, NEED TO DELAY WHILE ACK IS PR1 STA B3T1 /TEMP CKSUM POINTER SSM 0"A"TWOQ STA BUFE X /PPT ENTRY GOES ON 2 QUEUES AGAIN LDA HEAD X ANA (0 0 177777"X"REQALL) STA HEAD X /TURN OFF REQ BIT, KEEP SAME MESS N1 LDA BACK3P I SSP 0"A"RETRAN STA BACK3P I LDA B3T1 I ADD (REQALL) /NOW ADJUST CHECKSUM STA B3T1 I CRA /GIVTSK WON'T MAKE CHECKSUM JST GIVTSK /GIVE TO TASK B3C: JST SLEEP I LDA BACK3P I /LOOK AT NEXT PPT ENTRY SPL 0"A"RETRAN /MUST WE RETRANSMIT IT? JMP B3B /YES LDA BACK3P AOA /GET NEXT PPT SLOT CAS (PPT+0+PPTL) BACK3: LDA (PPT+0+PPTL) /SHOULDNT HAPPEN SUB (PPTL) /WRAPAROUND PPT STA BACK3P /SAVE PPT SLOT JMP B3C LEV VAR BACK3P: BSS 1 /PNTR TO PPT ENTRY B3T1: BSS 1 /PNTR TO CHKSM IN PKT /SEND OFF PACKETS FROM A LINE WHICH JUST DIED - REROUTE /SEND OFF DESTINATION DEAD MESSAGES TO SOURCE LEV BCK B4A: JST SLEEP I BACK4: LDX (SRQ) /GET NEXT REPLY INH [I2H,T.O] JST (GETQ) I JMP B4A /NONE, SO SLEEP CRA /TELL GIVTSK NOT TO CKSUM JST GIVTSK RET BCK /GIVE THE REPLY TO TASK JMP B4A /SATELLITE BACK HOST LEV BCK BACK5: LDA SATRSF B5A: SATDEF SZE JST (SATBCK) I JST SLEEP I JMP BACK5 SATBCK=37700 LEV [VDB,BCK] GETFRE: 0 /GET A FREE BUFFER FOR A BACK HOSI INH FRE LDA NFA SUB NFS SUB MINF SPL JMP GETFRE I /NOT ENOUGH BUFFERS FOR MODEM INP1 LDA FREE I SNZ JMP GETFRE I IMA FREE STA 0 IRS NFS ADD CMINPL 0"A"TWOQ STA BUFE X LDA MINE STA HEAD2 X /SET UP SOURCE IMP CRA STA 0 X IRS GETFRE /SKIP=SUCCESS JMP GETFRE I LEV CON SLEEP: BKZ /BACK HOST WAIT LEV VAR BACKNO: BSS 1 /NO OF BACK HOST CURRENTLY ACTIVE GIVTST: BSS BH /RETURN ADDRS FOR BACK HOSTS GIVING HOLD: BSS BH /PKT PNTRS FOR BACK HOSTS GIVING -' LEV BCK GIVTSK: 0 SNZ JMP GIVT0 /NOT GENERATING A CHECKSUM LDA FOUR 0"A"[MINPL-ACKH] SUB ACKH X SUB HEAD X SUB HEAD1 X SUB HEAD2 X STA HEAD3 X /THERE'S THE CHECKSUM GIVT0: LDA BACKNO 0"A"INPCHN ADD (HSTMOD 0 TH) STA INCH X /SET UP INPUT CHANNEL LDA 0 LDX BACKNO SSP 0"A"RETRAN /NEC FOR BACK3 STA HOLD X /SAVE PKT PNTR LDA GIVTSK STA GIVTST X /SAVE RETURN ADDR GIVT1: LDA HOLD X INH M2I STA ETQ I STA ETQ /PUT ON TASK QUEUE TASK /POKE TASK JST SLEEP I RET BCK CRA IMA TSKFLG+TH X SLN /TASK REFUSED IT JMP GIVTST XI /TASK TOOK IT JST SLEEP I /WAIT ONE BACKGROUND LOOP JMP GIVT1 /THEN TRY AGAIN LEV BCK RALLYG: 0 /GET AN ENTRY IN RALLY TABLE CRA IMA RALLCF SNZ /ANY ALLOCATES TO GO? JMP RALLYG I /NO CRA STA RALLYX LDA (MESS1) STA RALADD /PRESET TABLE INCREMENTER LDX RALTRY RALLG: LDA (RALLY+NIMP 0 X) I SNZ /ANY RALLY ENTRIES TO GO? JMP RALLG0 /NO IRS RALLYX /COUNT SOMETHING THERE LDA (AMESS+NIMP 0 X) I ICL ANA THREE /GET NEXT MESS NO TO USE ALS 2 TCA ADD (ALR 0 STA RALGS1 ERA (1000) STA RALGS2 LDA (17) RALGS1: BSS 1 /SHIFT MASK OVER INH [I2H,TSK] ANA (RALLY+NIMP 0 X) I SNZ /ANYTHING IN NEXT SLOT TO GO? JMP RALLG0 /NO ERA (RALLY+NIMP 0 X) I IMA (RALLY+NIMP 0 X) I /TURN OFF BITS ERA (RALLY+NIMP 0 X) I ENB BCK RALGS2: BSS 1 /SHIFT BACK THE BITS IN QUESTION CAS (13) IRS RALLYG /DEST DEAD, DOUBLE SKIP NOP STA BREPIN ANA (INCTRN) IMA BREPIN /GET INCTRN BIT AND SAVE IT ANA THREE /EXTRACT THEM ERA TWO 0"A"[ONEOR8 0 RFNM] SNZ /IS THIS A REQ FOR 1 STA RALADD /YES, DO NOT BUMP MESSAGE NO ERA TWO /RESTORE A ALR 6 0"A"[ONEOR8 0 RFNM] ERA (AMESS+NIMP 0 X) I ADD 0 SUB MINIMP /OR IN MESS NO AND IMP NO IMA (AMESS+NIMP 0 X) I ADD RALADD /BUMP NEXT MESS TO REPLY TO IMA (AMESS+NIMP 0 X) I IRS 0 SKP LDX MINIMP STX RALTRY IRS RALLYG JMP RALLEX RALLG0: ENB BCK IRS 0 JMP RALLG LDA MINIMP IMA RALTRY ERA RALTRY SNZ /DID WE MAKE A COMPLETE PASS? LDA RALLYX SZE /AND DID WE FIND NOTHING AT ALL? RALLEX: STA RALLCF /IF NO FOR EITHER, MUST COME BACK AT JMP RALLYG I /IF YES FOR BOTH, LEAVE RALLCF AL( 1 /IF ENTRIES WERE PUT DURING OUR PASS, RALLCF WILL HAVE BEEN 1 LEV VAR RALLYX: BSS 1 /NON-ZERO = SOMETHING IN RALLY RALTRY: BSS 1 RALADD: BSS 1 /INCREMENT TO AMESS = 0 OR MESS1 LEV CON CONSTANTS PAGEND 4,UNCON,4 TSKI: LEV TSK /TASK INTERRUPT TASKIL/ TSKI TSKI/ INT TSK /TASK INTERRUPT COMES HERE DXA JMP .+1 STA TA1 STX TX1 INK STA TK1 TSKMSK: LDA MINUS2 SMK INTM STA PRIM TSKL: ENB TSK /ALL TASKS RETURN HERE LDA STQ INH MSK SZE /IS TASK QUEUE EMPTY? JMP TSKM /GOT A TASK CMA /YES, TURN ON ALL BITS IN PRTY INT T STA PRIM SMK INTM /RESTORE REGISTERS AND KEYS LDX TX1 EXA LDA TK1 OTK LDA TA1 ENB TSK JMP TSKI I LEV VAR TA1: BSS 1 /TEMP A TX1: BSS 1 /TEMP X TK1: BSS 1 /TEMP KEYS TASKIN: BSS 1 /INPUT CHAN - SIGN ON=FROM HOST ACKBIT: BSS 1 /BIT PNTR FOR OUR ACK OURR: BSS 1 /OUR OUTPUT MODEM CHANNEL I2MSLT: BSS 1 /THE CHANNEL PNTR WE NEED I2MBIT: BSS 1 /ODD-EVEN BIT POSITION FOR THIS PKT ACKCH: BSS 1 /TRANSMIT ACK CHANNEL FOR THIS PK- ACKP: BSS 1 /PNTR TO RELEVANT RSEX ENTRY SWPCHT: BSS 1 /TEMP FOP SWPCHK SATNO: BSS 1 /0 IF NONE, CH#+1 ELSE LEV TSK LCK MSK TSKM2: LDA (STQ) /CLEAN UP Q PNTRS STA ETQ JMP TSKM1 LEV TSK TSKM3: LDA ACKP I JMP TSKM4 LEV TSK LCK MSK TSKM: STA 0 /TASK STA THIS /STORE BUFF ADDR IN X AND THIS CRA STA PTRT X /CLEAR TRACE PTR IMA 0 X /CLEAR BUFF CHAIN PNTR AND LOAD IN STA STQ /STORE NEW ADDR IN HEAD OF Q SNZ /WAS THIS LAST ENTRY IN Q? JMP TSKM2 /YES TSKM1: ENB TSK /X HAS BUFF ADDR LDA INCH X STA TASKIN /SAVE INPUT CHANNEL SPL 0"A"HSTMOD /FROM HOST? JMP TSKFOR /YES ADD (RSEX) /NO,FROM MODEM, MUST DUPLICATE-DETF STA ACKP LDA HEAD X SLZ 0"A"LINETS /IS THIS A ROUTING MESSAGE? JMP TSKRUT /YES LDA ACKH X ICA ANA SEVEN 0"A"CHANUM /GET CHANNEL NO ADD (BITTAB) STA ACKBIT /CONVERT TO BIT PNTR TABLE ADDR LDA ACKH X SPL 0"A"ODEVEN /GET ODD-EVEN BIT FROM PKT JMP TSKM3 /JUMP IF BIT IS ONE LDA ACKP I /COMPARE WITH WHAT WE WANT CMA TSKM4: ANA ACKBIT I /MASK WITH CONTENTS OF BITTAB SZE JMP FQMOD /IF DUPLICATE --FREE AND QUIT MODEM TSKFOR: LDA HEAD1 X ANA (DESTI) STA 0 /STOR DEST NO FROM HEADER IN X LDA RUT X /GET ROUTE SNZ 0"A"RUTUS /IS IT FOR US? JMP (FORUS) I /YES SPL 0"A"RUTDED JMP FQOK /FOR DEAD GUY, RUT WD WAS MINUS ANA (RUTDLC) SUB ONE /TASK STORE-AND-FORWARD STA 0 /STOPE SHIFTED ROUTE IN X (0 TO C1 LDA LINE X /TEST FOR LINE TEST STATUS SZE /IS LINE DEAD? JMP FQNG /YES, WAIT TILL ROUTING STABLE INH [M2I,I2M,H2I] LDA NSFA /COMPUTE NO SF BUFFS IN USE SUB NSFS AOA /WE NEED ONE MORE CAS MAXSI /ENOUGH S-F ROOM? JMP FQNG /NO JMP FQNG /NO LDA NFA SUB NFS /COMPUTE NO OF FREE BUFFS AVAIL, SUB NALA /CONSIDERING ALLOCATED AND USED ADD NALS SUB MINF SPL /DO WE HAVE MIN FREE BUFFS? JMP FQNG /NO LDA CHFREE X /FREE SLOT BITS TCA ANA CHFREE X /SINGLE LEAST SIGNIFICANT BIT SET SNZ JMP FQNG /ALL CHANNELS ARE IN USE STA I2MBIT /FOR MARKING CHANNEL LATER ERA CHFREE X /NOW MARK IT ASSIGNED STA CHFREE X ENB TSK /YES STX OURR /SAVE OUR ROUTE (0 TO CH-1) LDA I2MBIT CAS THREE ARS 3 /CH 2-7 SKP /CAS IS NEVER EQUAL JMP GOTCHN /CH 0-1 CAS THREE ARS 3 /CH 5-7 ADD THREE /CAS IS NEVER EQUAL ADD THREE GOTCHN: SUB ONE /GOT CHANNEL 0-7 STA ACKCH ADD I2MTAB X /GET PTR TO SLOT STA I2MSLT LDA I2MBIT STA I2MSLT I /MARK SLOT IN USE ANA TSEX X /GET O/E BIT IN TSEX SZE /WAS IT ZERO? LDA (200) 0"A"ODEVEN /NO, SET O/E BIT ERA ACKCH /PUT SLOT NO IN A ICR /PUT IN LEFT HALF LDX THIS /BUFF ADDR TO X STA I2MBIT /USED AS A TEMP WORD LDA BUFE X SSP 0"A"TWOQ IMA I2MBIT /NOW HAS PTR TO CHECKSUM IMA ACKH X /SAVE BIT, CHANNEL IN ACKHEADER SUB ACKH X ADD I2MBIT I /AND ADJUST CHECKSUM STA I2MBIT I LDA HEAD2 X /NOW PUT IN BIT FOR LO-HI LINE EN[ ANA (0 0 177777"X"ENDBIT) LDX OURR /THIS BIT DETECTS LOOPED LINES ERA (LEND 0 X) I LDX THIS IMA HEAD2 X SUB HEAD2 X /ADJUST CHECKSUM AGAIN ADD I2MBIT I STA I2MBIT I LDA HEAD1 X ANA (TRACE) SZE /MUST WE TRACE HIM? JST TSUB /TRACE HIM IF NECESSARY LDA I2MSLT /PUT OUR SLOT IN PKT STA INCH X /AND I2M WILL SET IT UP AT OUTPUT * LDA HEAD X ANA (TRNREP) /GET TRNREP BIT INH SIN SNZ /IS THIS A REPLY? JMP SFPRI /YES LDA HEAD1 X SPL 0"A"PRIBIT /IS THIS A PRI TRN? JMP SFPRI /YES LDA THIS /NO, SO PUT ON REG MODEM QUEUE LDX OURR STA EMQ XI /LINK BUFF TO END OF REG CHL Q STA EMQ X JMP SFALL SFPRI: LDA THIS /YES, SO PUT ON PRI MODEM QUEUE LDX OURR STA EMPQ XI /LINK BUFF TO END OF PRI CHL Q STA EMPQ X SFALL: IRS NSFA /COUNT A S-F PKT LDA NONE X SZE /POKE MODEM OUTPUT IF IDLE JMP GOODM /NO NEED JST (I2MSB) I RET TSK INH ALL DXA JMP GOODM /RETURN GOOD ACK LEV FRE /CALL WITH INTERRUPTS LOCKED FLUSH: 0 /RETURN BUFFER TO FREE LIST LDA BUFE X SPL 0"A"TWOQ /IS PACKET ON 2 QUEUES? JMP FLUSH1 /YES LDA FREE /NO, SO FREE IT STA 0 X /STORE PNTR TO FREE LIST STX FREE /STORE PNTR TO PACKET IRS NFA /INCREASE NO OF FREE PKTS JMP FLUSH I FLUSH1: SSP 0"A"TWOQ /MARK PACKET AS ON ONE QUEUE STA BUFE X JMP FLUSH I LEV TSK TSKRUT: LDX TASKIN /INPUT CHL NO ARR 1 0"A"NULPKT SLZ /THIS A NULL PACKET? JMP TSKNUL /YES ALR 1 ICL /GET OTHER GUYS IMPNO IMA NEIGHB X /SAVE IT SZE /DO NOT KILL LINE IF WE JUST DID ERA NEIGHB X SZE /DO KILL LINE IF NEIGHBOR HAS CHANG1 JMP NEIKIL IRS E123 X /INCREMENT NUMBER OF RECD RUT MSGS NOP LDA NEIGHB X /COMPUTE AND SET HI-LO BIT SUB MINE SZE JMP TSKCPY /COPY IN ROUTING INFO LDA ONE STA LUUP /BLINK LUUPED LITE JMP FQMOD TSKCPY: INH MSK LDA MINUS4 /LOCK OUT SLOW T.O SMK INTM /SHARED CODE & TABLES STA PRIM LEV T.O LCK MSK CRA /MARK AS REAL INPUT ENB T.O JST (RSTINP) I LDX THIS INH [MSK,FRE] JST FLUSH JMP TSKMSK LEV TSK TSKNUL: ARR 3 0"A"IHERDU TSKNU2: SLZ /DID WE GET AN IHEARD YOU? TSKNU3: DEFSTAT IRS LAC X, TSKIH /YES TSKNU4: JMP FQMOD NEIKIL: INH ALL STA NEIT JST (KILLIN) I LDA NEIT DEFHLT [NEIGHBOR IMP CHANGED] JST THLTNG LEV TSK LCK [H2I,T.O] SWPCHK: 0 STA SWPCHT /BITS TO PUT INTO HEAD1 LDA HEAD1 X ANA (FORIMP 0 FOROCT DESTHI) IMA HEAD2 X /SWITCH SRC FOR DEST AND V.V. ANA (FRMIMP 0 FRMOCT SRCEHI) ERA SWPCHT STA HEAD1 X LDA BUFE X ANA SIGN 0"A"TWOQ ADD 0 ADD (MINPL+1) /FIX LENGTH OF REPLY STA BUFE X LDA (MINPL-ACKH+1) SUB ACKH X SUB HEAD X SUB HEAD1 X /BUILD CHECKSUM SUB HEAD2 X SUB HEAD3 X STA DATA X /NOW STORE IT JMP SWPCHK I LEV TSK /TSUB DOES THE TASK PART OF TRACING TSUB: 0 LDA TIMES /GET TIME IN SLOW TICKS SUB M30SEC STA INCH X /GIVE PKT 30 SEC. TO LIVE LDA HEAD1 X ANA (TRACE) SZE /MUST WE TRACE HIM? TSUB2: LDA (TRON) I SNZ JMP TSUB I LDA TTF /FREE TRACE BLOCK PNTR SZE JMP TS2 /JUMP IF THERE ARE FREE TRACE BLOCK AOA STA TTO /MARK TRACE TABLE OVERFLOW JMP TSUB I TS2: STX SPB /SAVE BUFFER PNTR STA STB /FREE TRC BLK BUFF PNTR STA PTRT X /SET UP TRACE POINTER IMA STRQ /GET STRT OF ACTIVE TRC Q IMA STB I /LINK TO TOP OF TRACE Q STA TTF /STORE ADDR OF NEXT FREE BLK LDA STRQ /ADDR OF NEW TOP OF Q ADD (THED+4 X) /SET UP LAST TRC BUFF ADDR STA ITB LDA SPB /ADDR OF PKT BUFF ADD (HEAD+4 X) /SET UP LAST PKT BUFF ADDR STA IMB LDX MINUS4 /TRANSFER PKT BUFF TO TRC BUFF LDA IMB I STA ITB I IRS 0 /FINISHED? JMP .-3 /NO LDX SPB /YES LDA IT X /SAVE INPUT TIME IN TRACE TABLE LDX STB STA TIT X LDX SPB LDA BUFE X SSP 0"A"TWOQ SUB 0 SUB FOUR 0"A"ACKH /CALCULATE PACKET LENGTH LDX STB STA TDONE X RDCLOK JMP .-1 /SAVE TASK TIME IN TRACE TABLE STA TTT X LDX SPB /RESTORE BUFFER PNTR IN X JMP TSUB I LEV VAR E123: BSS CH /NUMBER OF RUT MSGS RECD FROM CHL( SPB: BSS 1 /SAVE PACKET BUFFER STB: BSS 1 /SAVE TRACE BUFFER ITB: BSS 1 /INDIRECT TO TRACE BUFFER IMB: BSS 1 /INDIRECT TO PACKET BUFFER NEIT: BSS 1 /TEMP /END-OF-TASK ROUTINES /RETURN A NACK OR ACK TO THE SENDING MODEM, HOST, OR BACK LEV TSK LCK ALL THLTOK: 0 /REPORT BUG AND GIVE GOOD RETURN JST HLTNCC I LEV TSK FQOK: LDX THIS /FREE+QUIT, GOOD RETURN INH [FRE,SIN] JST FLUSH /FREE THE BUFFER GOODM: LDA TASKIN /GOOD RETURN SPL 0"A"HSTMOD /FROM HOST? JMP GOODH /YES STA 0 0"A"INPCHN LDA ACKBIT I /FROM MODEM, GIVE ACK STA SNULL X /SEND A NULL PKT IF NECESSARY TO E'1 ERA RSEX X /REVERSE PROPER BIT IN RSEX STA RSEX X LDA NONE X /CHECK ACTIVITY ON MODEM SNZ /RESTART I2M IF NECESSARY FOR MY AC JST (I2MSB) I RET TSK INH ALL DXA JMP TSKL GOODH: SSP 0"A"HSTMOD /NEED TO CLEAR SIGN FOR HISB STA 0 0"A"INPCHN IRS TSKFLG X /DOUBLE SKIP = GOOD RETURN IRS TSKFLG X ADD MITH EXA SPL /FROM BACK HOST? JST (HISB) I RET TSK /NO, POKE HOST WAITING FO INH ALL DXA JMP TSKL LEV TSK LCK ALL THLTNG: 0 /REPORT BUG AND GIVE BAD RETURN JST HLTNCC I LEV TSK FQNG: LDA TASKIN /FREE+QUIT, BAD RETURN SPL 0"A"HSTMOD /FROM HOST? JMP BADH FQMOD: LDX THIS /FROM MODEM, DO NOT ACK INH FRE JST FLUSH JMP TSKL LEV TSK BADH: STA 0 0"A"INPCHN /YES, RETURN A NACK TO HO IRS TSKFLG X /SINGLE SKIP = BAD RETURN JMP TSKL /DO NOT POKE HOST (ALLOW BACK TO RU LEV TSK LCK FRE NEWMES: LDA RASF /NEW MULTI-PACKET MESSAGE FOR US SNZ /GET REAS BLOCK DEFHLT [NO REAS BLOCK FOR MULTI-PKT MESS] JST (THLTNG) I LDA 8PKTS ADD NREA /CHECK REAS ROOM SUB NRES CAS MAXR NOP /NO ROOM, FOUL-UP DEFHLT [MAXR EXCEEDED BY NON-REQUEST MULTI-PKT MESS] JST (THLTNG) I LDA NFA SUB NFS SUB 8PKTS SUB MINF SPL DEFHLT [MINF VIOLATED BY NON-REQUEST MULTI-PKT MESS] JST (THLTNG) I LDA RASF I IMA RASF STA 0 IMA SHRQ /PUT ON REAS QUEUE STA 0 X LDA 8PKTS ADD NREA /NOW TAKE ROOM STA NREA LDA 8PKTS ADD NALS STA NALS LDA SIGN /INIT RMAX STA RMAX X LDA (MESSID) I /ESTABLISH RID STA RID X /RSF IS SET UP AT INIT AND AFTER USE TO BE ZERO /THE SAME IS TRUE OF REAS PNTRS JMP (OLDMES) I LEV CON CONSTANTS PAGEND 5,UNCON,4 /TASK REASSEMBLY LEV TSK FORUS: LDX THIS /PNTR TO PKT BUFF LDA HEAD2 X /TASK FOR US ANA (SRCEI) /SOURCE IMP MASK STA SOURCE /PREPARE MESS TABLE ENTRY LDA HEAD X CAR 0"A"MESSNO STA MESNUM /SAVE OUR MESS NO ERA SOURCE STA MESSID /PREPARE MESSAGE ID LDA HEAD X ANA (TRNREP) SZE LDA (0 0 RMESS"X"TMESS) ERA (TMESS) /PICK TRANSMIT OR REPLY TABLE ADD SOURCE STA MESTAB INH [H2I,T.O] LDA MESTAB I /GET OLDEST MSG NO WE ARE EXPECTING CAR 0"A"MESSNO /GET MESS NO WE WANT SUB MESNUM /COMPARE WITH MESS NO WE GOT SPL /IS MESS NO WE GOT TOO HIGH? JMP MESOUT /YES ICL CAS THREE /IS MESS NO WE GOT TOO LOW? JMP MESOUT /YES NOP /GOOD MESS NO ADD (MBITS) /NOW CONVERT DIFF BETWEEN MESSNOS STA MESBIT /INTO A BIT - 1,2,4, OR 10 LDA HEAD X ANA (INCTRN 0 TRNREP) ERA (INCTRN 0 TRNREP) SNZ /IS IT AN INCOMPLETE TRANS? JMP INCGOT /YES LDA MESBIT I /NO, LOAD DIFFERENCE BIT ANA MESTAB I /CHECK AGAINST MSG NO ENB TSK SZE /IS MESS NO A DUPLICATE? JMP (FQOK) I /YES, DISCARD PKT LDA HEAD X /GOOD MESSAGE FOR US ANA (TRNREP) SNZ /IS IT A REPLY? JMP (REPGOT) I /YES LDX SOURCE INH [FRE,H2I,T.O] LDA RUT X SPL DEFHLT [RECVD TRANSMISSION FROM DEAD IMP] JST (THLTOK) I ANA (0 0 177777"X"RUTCMU) STA RUT X LDX THIS LDA HEAD X ANA (GVBALL) SZE /IS IT A REGULAR TRANSMIT? JMP GUDGVB /NO, WE MUST RETURN A REPLY LDA HEAD1 X JST (HOSTNO) I ENB TSK STA 0 LDA HIHD X 0"A"HSTUP LDX THIS SZE /IS THIS TRANS FOR A DEAD HOST? LDA (0 0 TRNDED"X"TRNDIS) ERA (JMP TRNDIS) /PICK REGULAR OR DEAD DIS[ STA TRNJMP LDA HEAD X /GOOD TRANSMISSION FOR US CAL ARS 6 0"A"ONEOR8"A"REQALL ADD TRNJMP STA TRNJMP INH FRE TRNJMP: BSS 1 /DISPATCH ON 1 OR 8 PKT, REQ OR RE' TRNDIS: JMP TRNGT8 /NON-REQ S PKT JMP GUDRQ8 /REQ 8 PKT JMP TRNGT1 /NON-REQ 1 PKT LDA MESBIT I /REQ 1 PKT ERA ONE SNZ /IS THIS REQ THE NEXT TO GO? JMP TRNDS1 /YES LDA HEAD1 X /NO SMI 0"A"PRIBIT /IS IT A PRI REQ? JMP GUDRQ1 /NOT PRI, SO WE CAN GO NO FURTHER LDA MESTAB I ERA HEAD X ANA (ORDNO) SZE /IS HIS PRI ORD NO UP YET? JMP GUDRQ1 /NO, SO HE MUST WAIT TRNDS1: LDA NALA SUB NALS ADD NREA SUB NRES AOA CAS MAXR JMP GUDRQ1 /NO ROOM FOR 1 PKT MESS, TREAT AS R JMP GUDRQ1 /NO ROOM FOR 1 PKT MESS, TREAT AS R LDA NFS SUB NFA AOA ADD MINF SPL JMP GUDTR1 /NOTE THAT NO DUPLICATE DETECTION IS DONE HERE GUDRQ1: LDA MESSID /ENTER HIS REQUEST ERA (ONEOR8) /FOR ONE BUFFER JST (RALLYP) I DEFHLT [RALLY ENTRY ALREADY PRESENT FOR REQ 1 PKT] JST (THLTOK) I JMP (FQOK) I /DO NOT MARK MESS NO COMPLETE TRNGT1: LDA NREA /CHECK REAS ROOM SUB NRES AOA /ROOM FOR ONE MORE? CAS MAXR DEFHLT [MAXR EXCEEDED BY A NON-REQUEST 1 PKT MESS] NOP JST (THLTNG) I /NO, A FOUL-UP LDA NFS SUB NFA AOA ADD MINF SMI /DO WE HAVE ENOUGH FREE? DEFHLT [MINF VIOLATED BY A NON-REQUEST 1 PKT MESS] JST (THLTNG) I /NO, A FOUL-UP IRS NALS GUDTR1: IRS NREA /YES, SO TAKE IT ENB TSK STX READY /SAVE PACKET POINTER JMP GUDTRN /NOW TRY TO GIVE TO HOST LCK FRE TRNDED: JMP TRNDD8 /NON-REQ 8 PKT JMP GUDRQ8 /REQ 8 PKT IRS NALS /NON-REQ 1 PKT - ONLY HAPPENS IF [' TRNDD1: IRS HEAD3 X 0"A"CHSTD /REQ 1 PKT LDA HEAD X ANA (0 0 177777"X"INCTRN"X"TRNREP"X"ALLOC) STA HEAD X LDA (REPDED) /SWAP SRC&DEST JST (SWPCHK) I /AND CHECKSUM IT LDA MESSID LDX SIGN /MARK ENTRY FOR DEST DEAD JST (RALLYP) I /PUT IN A DUMMY ENTRY DEFHLT [RALLY ENTRY ALREADY PRESENT FOR DESTINATION DEAD] JST (THLTOK) I LDX THIS STX ERQ I /HAND TO BAK STX ERQ JST REASGT JMP NXMES1 /NO PKTS CAME IN SO FAR LDA 0 X STA TEND I /SPLICE UP REAS Q JST (REASF) I /AND FREE UP THIS BLK JMP NXMES1 TRNDD8: LDA 8PKTS ADD NALS STA NALS /MUST TAKE BACK ROOM WE ALLOCATED JMP TRNDD1 TRNGT8: ENB TSK LDA HEAD1 X /MULTI-PACKET TRANS FOR US ICA ANA SEVEN 0"A"PKTNO /GET PACKET NO STA PKTN ADD (REAS 0 X) STA ORS /SAVE POST-INDEXED PNTR TO OUR REAS JST REASGT LCK T.O /FIND OUR GUY IN REAS JMP (NEWMES) I /NOT THERE, SO START A NEW MESS OLDMES: STX ORB /SAVE PNTR TO OUR REAS BLOCK LDA ORS I SZE /IS IT EMPTY? JMP (FQOK) I /NO, A DUPLICATE PACKET LDA THIS STA ORS I /PUT PACKET IN OUR REAS SLOT STA 0 LDA HEAD2 X LDX ORB SMI 0"A"LSTPKT /IS THIS THE LAST PACKET? JMP NOTL /NO LDA PKTN /GET PACKET NO STA RMAX X /SAVE IN REAS BLOCK SUB SEVEN 0"A"8PKTS TCA ADD NRES STA NRES /ADJUST REAS COUNT FOR SURPLUS NOTL: LDA RSF X CAS RMAX X /IS REAS DONE? SKP /NO JMP DONE /YES IRS RSF X JMP (GOODM) I DONE: LDA 0 X /REAS COMPLETE STA TEND I /REMOVE BLOCK FROM QUEUE ENB TSK LDA ORB SSM /MARK AS MULTI-PACKET STA READY GUDTRN: JST MESSOK LCK [H2I,T.O] SLZ /IS MESS NO THE ONE WE WANT? JMP T2H /YES, GIVE TO HOST LDA READY /NO, PUT BUFFER OR BLOCK IMA MESSTK /ON COMPLETED MESSAGE STACK LDX MESSTK /DO THIS SINCE SIGN BIT MAY BE SET STA 0 X JMP SMSTK /AND SEARCH FOR NEXT MESS LEV TSK MESSOK: 0 /MARK MESS NO TO PREVENT DUPLICATES INH [H2I,T.O] LDA MESTAB I CAR 0"A"MESSNO SUB MESNUM ICL ADD (MBITS) STA MESBIT LDA MESBIT I ERA MESTAB I /TURN ON GOT-IT BIT ANA (0 0 177777"X"MSTO1"X"MSTO2) STA MESTAB I /TURN OFF TIME OUT BITS JMP MESSOK I LEV TSK LCK [H2I,T.O] MESOUT: LDA HEAD X ANA (INCTRN 0 TRNREP) ERA (INCTRN 0 TRNREP) SZE /IS THIS AN INC TRN? JMP (FQOK) I /NO, OUT OF RANGE, DISCARD PKT INCREP: LDA HEAD X /THIS CODE IS FOR OUT-OF-RANGE MESS ANA (0 0 177777"X"INCTRN"X"TRNREP"X"GVBALL"X"RFNM) ERA (RFNM) /RFNM ON IN ALL RPLYS XCPT REQ8 IMA HEAD X ANA (ONEOR8 0 REQALL) ERA (REQALL) SZE /REQ FOR 8? JMP PUTREP /NO, MAKE A REPLY LDA (ALLOC 0 RFNM) /Y, TURN OFF RFNM, TURN 'T ERA HEAD X STA HEAD X PUTREP: CRA /SWAP DEST FOR SRC JST (SWPCHK) I /AND CHECKSUM IT STX ERQ I /ADD TO REPLY QUEUE STX ERQ JMP (GOODM) I /AND GIVE GOOD RETURN INCGT8: JST REASGT /FIND THIS INC TRN IN REAS JMP SNDRP8 /NOT THERE, WE NEVER SAW HIM LDA 0 X STA TEND I /REMOVE FROM REAS QUEUE JST (REASF) I /FREE REAS BLOCK AND PKTS SNDRP8: LDA (RFNM) /CREATE A REPLY TO 8-PKT INC TRN JMP SNDRP1 INCGOT: LDA MESBIT I /GOT AN INC TRANS ANA MESTAB I /EXPLICITLY PERMIT DUPLICATES SZE /HAVE WE SEEN HIM COMPLETED YET? JMP INCREP /YES, SEND BACK DUPLICATE REPLY LDA HEAD X ANA (ONEOR8 0 REQALL) SNZ /8 PKT INC TPN? JMP INCGT8 /YES ANA (ONEOR8) SNZ /8 PKT REQ FOR ALL? JMP GUDRQ8 /YES, IT IS INSIDE WINDOW LDA HEAD X /NEVER SAW THIS 1 PKT GUY ANA (GVBALL) SZE /IS THIS A GVB? GUDGVB: LDA 8PKTS /YES ADD NALS /REMOVE BUFFER FROM ALLOCATE COUNT STA NALS LDA (ONEOR8 0 RFNM) SNDRP1: LDX MINUS1 /MAKE A REPLY TO 1-PKT INC TRN JMP GUDRAL /SINCE IT MAY HAVE BEEN A REPLY TO AN INC TRN THAT WAS LOST /WE SHOULD KEEP A RECORD OF THE HOST QUEUE LAST FLUSHED /THIS WAY WE COULD SEND THE CORRECT DUPLICATE REPLY GUDRQ8: CRA GUDRAL: ERA MESSID JST (RALLYP) I /SET UP ENTRY TO REPLY DEFHLT [RALLY ENTRY ALREADY PRESENT FOR INC OR REQ8] JST (THLTOK) I LDX THIS JST FLUSHI I NXMES1: JST MESSOK /MARK MESS NO AS COMPLETED NXTMES: LDA MESTAB I SLN /IS THIS THE MESS NO WE WANT? JMP (GOODM) I /NO LDX MESTAB JST (UPMESS) I RET TSK SMSTK: LDA (MESSTK) /SEARCH THE MESSAGE STACK STA TEND /FOR MESSAGES WHOSE NUMBERS ARE UP INH T.O LDA MESSTK /GET CONTENTS OF STACK ENTRY SRCSTK: SNZ /IS STACK EMPTY? JMP NXTMES /YES STA READY STA 0 SPL /IS THIS A REAS BLOCK? LDA REAS X /YES, SO GET A PACKET STA 0 LDA HEAD2 X /GET SOURCE OF THIS PACKET ERA SOURCE /COMPARE WITH OURS ANA (SRCEI) SZE /MATCH? JMP SRCSTL /NO LDA HEAD1 X SMI 0"A"PRIBIT /IS IT PRIORITY? JMP SRCST2 /NO LDA MESTAB I /GET ORD NO WE WANT ERA HEAD X /COMPARE WITH THIS PACKET ANA (ORDNO) JMP SRCST3 SRCST2: LDA MESTAB I /GET MESS NO WE WANT SUB (0 0 3"T"400) ERA HEAD X /COMPARE WITH THIS PACKET CAR 0"A"MESSNO SRCST3: SZE /IS THIS THE NEXT TO GO? JMP SRCSTL /NO LDX READY IMA 0 X /YES STA TEND I /REMOVE FROM MESS STACK JMP T2H /AND GIVE TO HOST SRCSTL: LDA READY /LOOP BACK FOR MORE SSP STA TEND LDA TEND I JMP SRCSTK LEV TSK REASGT: 0 /FIND A MATCH ON MESSID IN REAS STO+ LDX (SHRQ) INH T.O /LOOK FOR THIS MESSAGE IN REAS RELOOK: LDA 0 X /NEXT REAS BLOCK SNZ /NO MORE REAS BLOCKS? JMP REASGT I /YES, SO RETURN NO SKIP STX TEND /SAVE END PNTR STA 0 LDA RID X /GET THIS MESS ID ERA MESSID /COMPARE WITH OURS SZE /IS THIS OUR MESSAGE? JMP RELOOK /NO IRS REASGT /SKIP=SUCCESS JMP REASGT I T2H: ENB TSK LDA ONE STA NPKTS LDX READY /LOAD THE PACKET PNTR LDA READY /REGULAR MESSAGE READY FOR HOST SPL /IS THIS A SINGLE PACKET? JMP T2H8 /NO STA READYE /SAVE END PNTR T2HL1: JST (TSUB) I LDA HEAD1 X INH [I2H,H2I,T.O] JST (HOSTNO) I /GET HOST NUMBER LDA HEAD1 X ANA SIGN 0"A"PRIBIT SZE /PICK PRI OR REG QUEUE LDA (EHPQ+0-EHQ) ADD (LOCHST) I /AOD OFFSET GENERATED IN HOSTNO IMA 0 /PUT IN X AND GET PKT PNTR STA EHQ XI /PUT ON HOST QUEUE LDA READYE STA EHQ X LDA NPKTS /NUM PKTS IN MSG ADD NHA X /NUM PKTS FOR HOST STA NHA X /ADJUST COUNTS LDX READY LDA HEAD1 X LDX MESTAB SMI 0"A"PRIBIT /PRIORITY? JMP T2HL2 /NO JST (UPORD) I /YES, SO BUMP ORD NO LDX READY LDA MESTAB I /GET MESS NO WE WANT SUB (0 0 3"T"400) ERA HEAD X /COMPARE WITH WHAT WE GOT CAR 0"A"MESSNO LDX MESTAB SNZ /MATCH? T2HL2: JST (UPMESS) I /BUMP MESS NO JST (TASK2H) I RET TSK /POKE HOST IF NECESSARY JMP SMSTK /GO BACK FOR MORE /THE FIRST PKT IS COUNTED FIRST, IN T2H /AND TRACED LAST, IN T2HL1 /SUBSEQUENT PKTS ARE COUNTED AND TRACED IN T2HS1 LEV TSK T2H8: SSP /MULTI-PACKET MESSAGE READY STA ORB /OUR REASSY BLOCK LDA REAS X /LOAD PKT PNTR STA READY CRA STA REAS+8 X 0"A"RSF /A TRICK TO INIT RSF AND MAKE IT LOOK LIKE PKT 9 T2H81: LDA REAS+1 X /LOAD ADDR OF NEXT PACKET STA REAS XI /CHAIN PACKETS TOGETHER SNZ /IS THIS THE LAST PKT? JMP T2H82 /YES STX READYE /NO, STORE THE PKT PNTR STA 0 JST (TSUB) I /TRACE PKT IF NECESSARY LDX READYE CRA /CLEAR REAS PNTR STA REAS X IRS 0 /INCREMENT ADDRESS IRS NPKTS /INCREMENT PKT COUNT JMP T2H81 /CHAIN NEXT PACKET T2H82: IMA REAS X /CLEAR REAS PNTR STA READYE /AND SAVE LAST PKT PNTR LDX READY /LOAD FIRST PKT PNTR LDA ORB /LOAD REASSY BLOCK PNTR INH T.O IMA RASF /FREE REAS BLOCK AND LINK TO TOP STA RASF I /OF FREE LIST JMP T2HL1 LEV VAR MESTAB: BSS 1 /PNTR TO MESS TAB ENTRY MESNUM: BSS 1 /MESSNO OF THIS PKT MESBIT: BSS 1 /BIT CORRESPONDING TO OUR MESSAGE PKTN: BSS 1 /NUMBER OF THIS PACKET MESSID: BSS 1 /MESSAGE ID (MESS NO+SRCE IMP) ORB: BSS 1 /OUR REAS BLOCK ORS: BSS 1 /OUR REAS SLOT TEND: BSS 1 /TEMP END PNTR READY: BSS 1 /PNTR TO PACKET TO GIVE TO HOST READYE: BSS 1 /END PNTR FOR READY NPKTS: BSS 1 /PKT COUNTER SOURCE: BSS 1 /SOURCE IMP FOR THIS PACKET LEV CON CONSTANTS PAGEND 6,UNCON,1 LEV TSK REPGOT: LDA HEAD X /REPLY TO A TRANSMISSION OF OURS ANA (ONEOR8) SNZ /IS IT A REPLY TO A MULTI-PACKET? JMP REPGT8 /YES LDA (MESSID) I INH [H2I,T.O] JST (PPTGET) I /FIND OUR TRANS IN RPT JMP GOTGVB /NOT THERE, MUST BE A GVB STA PPTASK /SAVE PPT PNTR ENB TSK LDX THIS LDA HEAD X ANA (ALLOC) SNZ /IS THIS REPLY AN ALLOCATE OF 1? JMP NOALL1 /NO LDX PPTASK I /YES, CHECK FOR DUPLICATE ALLOC LDA HEAD X ANA (REQALL) SNZ /WAS REQUEST BIT SET? JMP (FQOK) I /NO, SO ALLOC IS A DUPLICATE LDA PPTASK I /YES, SO WE MARK PPT SSM 0"A"RETRAN /FOR RETRANSMISSION FROM BACK STA PPTASK I JMP (FQOK) I /MESS NO NOT REPLIED TO YET NOALL1: JST RFNM1 /SET UP TWDPA FOR RFNM OR INC LCK FRE JMP DDEAD1 /GIVE HOST A DESTINATION DEAD LEV TSK LDX PPTASK I LDA HEAD3 X /PICK UP LINK WORD JST RFNM2 LCK FRE LDA HEAD2 X JST HOSTNO LDA HEAD1 X /GFT SOURCE OF MESS ANA (0 0 177777"X"LSTPKT"X"HICODE) ERA TWDPA /PUT IN IH MESS TYPE DDEAD1: LDX LOCHST JST OWP I /DO A 2 WRD PUT DEFSTAT JMP PPTFRE, HS6 JMP (FQNG) I /NO ROOM FOR 2 WRD MESS LEV VAR PPTASK: BSS 1 /POINTER TO OUR PPT OR PLT SLOT TWDPA: BSS 1 /FIRST WORD OF 2 WRD PUT LOCHNO: BSS 1 LEV TSK REPGT8: LDA (MESSID) I /REPLY TO A MULTI-PCKT TRANS INH [H2I,T.O] JST (PLTGET) I /FIND OUR TRANS IN PLT DEFHLT [CANT FIND MULTI-PKT MESS FOR THIS REPLY] JST (THLTOK) I /NOT THERE, FOUL-UP STX PPTASK /SAVE PLT PNTR LDA PLT0 X ANA SEVEN 0"A"PLTHST STA LOCHNO /GET LOCAL HOST NO LDX THIS LDA HEAD X ANA (ALLOC) ENB TSK SNZ /IS THIS REPLY AN ALLOCATE OF 8? JMP NOALL8 /NO INH [SIN,H2I,T.O] LDA (TALLYI) I /GET IN PNTR ERA (TALLY+TALLYL) /COMPARE WITH END PNTR SNZ /AT END? JMP (FQNG) I /YES, NO ROOM FOR ALLOCATE SO NACF LDA (SOURCE) I /GET SOURCE OF ALLOC STA (TALLYI 0 I) I /STUFF THRU IN PNTR IRS (TALLYI) I /BUMP IN PNTR LDA HEAD X ANA (RFNM) SNZ /IS THIS REPLY AN ALLOCATED RFNM? JMP GUDAL8 /NO, JUST AN ALLOCATE OF 8, POKE HO RET TSK NOALL8: JST RFNM1 /SET UP TWDPA FOR RFNM OR INC LCK FRE JMP DDEAD8 /GIVE HOST A DESTINATION DEAD LEV TSK LDX PPTASK LDA PLT2 X /PICK UP LINK WORD JST RFNM2 LCK FRE LDA PLT1 X /GET SOURCE OF MESS ANA (0 0 177777"X"LSTPKT"X"HICODE) ERA TWDPA /PUT IN IH MESS TYPE DDEAD8: LDX LOCHNO STX LOCHST JST OWP I /DO A 2 WRD PUT DEFSTAT JMP GUDRP0, HS7 /AND POKE HOST LDX THIS /NO ROOM FOR 2 WRD MESS LDA HEAD X ANA (ALLOC) SNZ /WAS REPLY AN ALLOCATE OF 8? JMP (FQNG) I /NO, SO QUIT LDA (SOURCE) I /YES, GET SOURCE JST (TALLYG) I /AND GET TALLY ENTRY BACK AGAIN JMP (FQNG) I /NOT THERE, FOUL-UP JMP (FQNG) I /AND QUIT PPTFRE: LDX PPTASK I JST FLUSHI I /FREE PPT ENTRY NOW THAT RFNM IS IN GUDRP0: JST TASK2H /POKE HOST IF NECESSARY LEV TSK GUDRP1: CRA STA PPTASK I /CLEAR PPT OR PLT ENTRY GOTGVB: JST (MESSOK) I /MARK MESS NO AS REPLIED LCK [H2I,T.O] JMP (FQOK) I LCK SIN TASK2H: 0 /GOT SOMETHING FOR HOST OUTPUT LDX LOCHST LDA IHXX I EXA SNZ /IS HOST IDLE? JST (IHSB) I RET TSK /YES, SO POKE IT INH ALL JST DODXA I RET TSK JMP TASK2H I LCK SIN GUDAL8: LDX LOCHNO /GOT AN ALLOCATE OF 8 FOR HOST INPU LDA HILO X SUB (HIALL) EXA SNZ /IS HOST HUNG ON ALLOCATE? JST (HISB) I RET TSK /POKE HIM SINCE HE IS WAI INH ALL JST DODXA I RET TSK JMP GUDRP1 LEV [T.O,TSK] HOSTNO: 0 /COMPUTE HOST NO STA LOCHST ANA (DESTH) ARR 6 IMA LOCHST /SAVE DEST HOST ANA (FORIMP) SZE /FAKE HOST? LDA PLNH /YES ADD LOCHST STA LOCHST JMP HOSTNO I LEV VAR LOCHST: BSS 1 /WHICH HOST WE ARE FEEDING LEV TSK RFNM1: 0 /DISTINGUISH BETWEEN RFNM AND INC T: LDA HEAD1 X ANA (REPDED) SZE /IS THIS A DESTINATION DEAD? JMP RFNMD /YES LDA HEAD X ANA (INCTRN) SZE /IS THIS REPLY MARKED INCOMFLETE? LDA (0 0 CRFNM"X"CINCTR) /YES ERA (CRFNM) /NO STA TWDPA /SAVE IH MESS TYPE IRS RFNM1 JMP RFNM1 I RFNMD: LDA HEAD3 X 0"A"CHSTD INH FRE STA TWDP /SAVE LINK WORD ANO CODE LDA HEAD1 X JST HOSTNO LDA HEAD2 X ANA (0 0 177777"X"LSTPKT"X"HICODE) ERA (CDESTD) /PUT IN DEST DEAD CODE JMP RFNM1 I LEV TSK RFNM2: 0 /TRANSLATE SOME INCOMPLETES INTO INH FRE /ERROR IN DATA MESS STA TWDP /SAVE LINK WORD ANA (SUBCOD) ERA (CERROR) SZE /WAS THIS MARKED AS AN ERROR AT SOU JMP .+3 /NO LDA (CERRDT) /YES, SO CHANGE IH MESS TYPE STA TWDPA LDA TWDPA ERA (CINCTR) SNZ /IS THE IH MESS TYPE INC TRN? JMP RFNM2 I /YES, KEEP SUB CODE LDA TWDP /NO, A RFNM OR ERROR IN DATA ANA (LINKNO) STA TWDP /WE MAY HAVE PUT IN AT INC? TIME JMP RFNM2 I LEV CON CONSTANTS PAGEND 7,UNCON,4 PAGM2I: LEV M2I / MODEM TO IMP (M2I) M1INIL/ M2I1 M2INIL/ M2I2 M3INIL/ M2I3 M4INIL/ M2I4 M5INIL/ M2I5 PAGM2I/ M2I1: INT M2I /MODEM 1 ENTPANCE DXA STX TX /SAVE X REG LDX ZERO /SET UP ACTIVE MODEM NO M2I1A: BSS 1 /INITIALLY A JMP M2II UNTIL AN INPL INK STA TK /SAVE KEYS DEFSTAT M1ERR,MI1 M1OK: JMP M2I0 /THIS IS A NOP WHEN THE LINE GOES DI DIS1: LDA M1INBP+1 SUB (BUFE-ACKH) M2I1B: STA M1INBP M1IN /ERROR- NEW "IN" INTO SAME BUFFER DPP1: LDA TK EXA OTK LDA TA LDX TX ENB M2I JMP M2I1 I M2I2: INT M2I /MODEM 2 ENTRANCE DXA STX TX LDX ONE M2I2A: BSS 1 INK STA TK DEFSTAT M2ERR,MI1A M2OK: JMP M2I0 DIS2: LDA M2INBP+1 SUB (BUFE-ACKH) STA M2INBP M2IN DPP2: LDA TK EXA OTK LDA TA LDX TX ENB M2I JMP M2I2 I M2I3: INT M2I /MODEM 3 ENTRANCE DXA STX TX LDX TWO M2I3A: BSS 1 INK STA TK DEFSTAT M3ERR,MI1B M3OK: JMP M2I0 DIS3: LDA M3INBP+1 SUB (BUFE-ACKH) STA M3INBP M3IN DPP3: LDA TK EXA OTK LDA TA LDX TX ENB M2I JMP M2I3 I M2I4: INT M2I /MODEM 4 ENTRANCE DXA STX TX LDX THREE M2I4A: BSS 1 INK STA TK DEFSTAT M4ERR,MI1C M4OK: JMP M2I0 DIS4: LDA M4INBP+1 SUB (BUFE-ACKH) STA M4INBP M4IN DPP4: LDA TK EXA OTK LDA TA LDX TX ENB M2I JMP M2I4 I M2I5: INT M2I /MODEM 5 ENTRANCE DXA STX TX LDX FOUR M2I5A: BSS 1 INK STA TK DEFSTAT M5ERR,MI1D M5OK: JMP M2I0 DIS5: LDA M5INBP+1 SUB (BUFE-ACKH) STA M5INBP M5IN DPP5: LDA TK EXA OTK LDA TA LDX TX ENB M2I JMP M2I5 I /SOME OFFSETS WE NEED FOR THE FIRST MODEM INPUT TO GRAB A BU DIS1O=DIS1-0-M2I1 M2I1AO=M2I1A-0-M2I1 M2I1BO=M2I1B-0-M2I1 M2II: STA TA LDA M1INIL X STA 0 /BASE REG FOR OUR INSTR MODIFICATIO LDA DIS1O X ADD (STA-0-LDA) STA M2II1 LDA FREE I SNZ JMP M2II2 IMA FREE IRS NFS ADD (BUFE 0 I) M2II1: BSS 1 /SET UP FIRST REAL INPUT BUFFER LDA M2II STA M2I1AO X JMP DIS1O X M2II2: LDA (I 0 1) JMP M2I1BO X M2I0: STX MP /SAVE ACTIVE MODEM NO LDA LEND X /PICK UP END-OF-LINE BIT FOR THIS MI STA LENDT LDA FREE I /GET PKT FOR FREE LIST DEFSTAT SNZ, MI3 JMP DIS XI /FREE LIST EMPTY - INPUT LOST IRS NFS IMA FREE ADD (ACKH 0 I) /SET UP DMC START INPUT PNTR JMP DIP XI /DISPATCH TO SEPARATE CODE FOR EACH LEV VAR TA: BSS 1 /SAVE A REG TX: BSS 1 /SAVE X REG TK: BSS 1 /SAVE KEYS TAR: BSS 1 /SAVE ADDRET M2IOK: M1OK M2OK M3OK M4OK M5OK LEND: BSS CH /ENDBIT ON=HIGH NO IMP /SIGN BIT ON= DEAD LINE LENDT: BSS 1 /TEMP BECAUSE OF ONLY ONE X REG LEV CON DIP: DP1 DP2 SATDEF DP3 DP4 DP5 LEV M2I DP5: LDX M5INBP STA M5INBP ADD (BUFE-ACKH) IMA M5INBP+1 M5IN JMP DIPE DP4: LDX M4INBP STA M4INBP ADD (BUFE-ACKH) IMA M4INBP+1 M4IN JMP DIPE DP3: LDX M3INBP STA M3INBP ADD (BUFE-ACKH) IMA M3INBP+1 M3IN JMP DIPE DP2: LDX M2INBP STA M2INBP ADD (BUFE-ACKH) IMA M2INBP+1 M2IN JMP DIPE DP1: LDX M1INBP /PICK UP OUR DMC INPUT PNTR STA M1INBP /STORE NEW DMC INPUT PNTR ADD (BUFE-ACKH) /COMPUTE NEW DMC END PN+' IMA M1INBP+1 /SWAP FOR CURRENT END PNTR M1IN /DO NEW INPUT OCP DIPE: SUB (BUFE 0 I) /GET OLD PKT PNTR + SAVE IN X STA M2ISP /SAVE FOR TASK-ING OR FLUSHING IMA 0 /SWAP IT FOR END PNTR SUB (1 0 I) /ADJUST IT FOR ONE OFF STA BUFE X 0"A"TWOQ /SAVE IT IN PKT END PNTR CRA STA 0 X /CLEAR CHAIN PNTR LDA HEAD X SPL 0"A"SNDCOR SLN 0"A"LINETS SKP /ALLOW SNDCOR W/O CHKSUM JMP (M2IRQC) I /SEND CORE REQUEST LDA (M2IADR) IMA ADDRET /SET UP ADD CHAIN RETURN FOR M2I STA TAR /AND SAVE CURRENT OWNER OF ADDER LDA 0 SUB BUFE X /COMPUTE BUFFER LENGTH ADD (ADDBOT+ACKH) /ADD IN TABLE OFFSET STA M2IADJ /AND SAVE AS ADD DISPATCH SUB (ADDBOT) /GET -(NO OF WORDS) IN A JMP M2IADJ I /AND JMP INTO ADD CHAIN M2IADJ: BSS 1 M2IADR: SZE /IS THE CHECKSUM GOOD? DEFPLC [NOP HERE TO ACCEPT BAD CHECKSUM PACKETS] JMP PKTCH1 /NO, REPORT AS AN ERROR LDA TAR STA ADDRET /AND RESTORE PREVIOUS OWNER OF ADC RDCLOK JMP .-1 STA IT X /SAVE INPUT TIME- 100 MS CLOCK LDA MP 0"A"INPCHN"A"HSTMOD STA INCH X /SAVE INPUT MODEM NO LDA HEAD X SLN 0"A"LINETS /LT OR ROUTE? JMP M2IPKT /NO ARR 1 SLZ 0"A"NULPKT /IS THIS A NULL PKT OF ACKS ONLY? JMP M2INUL /YES ARR 1 SLZ 0"A"GETCOR /A RELOAD DEMAND? JMP (M2IDMC) I /YES M2T0: LDX M2ISP M2T: STX ETQ I /PUT ON TASK QUEUE STX ETQ TASK /POKE TASK INTERRUPT LDX MP JMP DIPP XI /DISMISS INTERRUPT PKTCH1: LDX MP DEFHLT [SOFTWARE CHECKSUM ERROR IN PACKET] JST (PKTCHK) I M2INUL: LDA HEAD X /GOT A NULL PACKET OF ACKS ICL /PICK UP IMP NO ERA MINE /COMPARE WITH MINE SNZ /IS THIS LINE LOOPED? JMP M2T /YES, GIVE NULL TO TASK, IGNORE ACK1 LDA THD /PICK UP CHAN TO HIGH NO IMP ERA MP /COMPARE WITH THIS LINE NO SZE /IS IT THIS LINE? JMP M2IACK /NO LDA HEAD1 X /YES, SO COPY IN HIS VALUE FOR SYNC STA SYNC /KEEPING GLOBAL TIME THROUGHOUT NET JMP M2IACK /NO, PROCESS ACKS, THEN GIVE TO TA 1 M2IPKT: LDA HEAD2 X ANA (ENDBIT) ERA LENDT SMI /IS THIS LINE DOWN? SNZ /IS THIS PKT FROM US? JMP (M2IFRE) I /YES. THROW AWAY PKT M2IACK: LDA ACKH X CMA CAL 0"A"ACKTAB STA ACKT /ACKS FROM PACKET LDX MP ERA TSEX X ANA CHFREE X /SHOULD BE NO ACKS ON FREE SLOTS SZE DEFHLT [SPURIOUS ACK] JST (PKTCH2) I LDA ACKT IMA TSEX X /COMPARE WITH WHAT WE GOT ERA TSEX X SNZ JMP M2T0 /NO ACKS, SO QUIT STA ACKT /SAVE ACKS TO PROCESS ERA CHFREE X /FREE UR ACKED CHANNELS STA CHFREE X LDA ACKT ACKLOP: LDX (I2MTAB 0 X) I TCA ANA ACKT /GET LOWEST BIT THAT TRANSITIONED ERA ACKT /TURN IT OFF IMA ACKT /UPDATE SET OF ACKS TO PROCESS ERA ACKT /AND GO PROCESS THIS ONE CAS (20) JMP ACK567 JMP ACK4 CAS FOUR JMP ACK3 JMP ACK2 SLN JMP ACK1 CRA IMA 0 X ACKS: LDX MP CAS (1777) /IS THIS A TRUE PKT PNTR? JMP ACKGUD /YES NOP DEFHLT [QUASI-IMPOSSIBLE SPURIOUS ACK] JST (PKTCH2) I /DEBUG SPURIOUS ACK ACKGUD: CAS I2MNXT X /IS THIS THE PKT CURRENTLY ON THE L SKP /NO JMP ACKSYN /YES, WE CANT FREE IT YET STA 0 LDA BUFE X SPL 0"A"TWOQ JMP FREE1 /ON TWO QUEUES LDA FREE /ON ONE ONLY, SO FREE STA 0 X STX FREE IRS NFA JMP FREE2 FREE1: SSP 0"A"TWOQ STA BUFE X /MARK AS ON ONE QUEUE NOW FREE2: IRS NSFS ACKS1: LDA PTRT X /TRACING? SZE JMP ACTR2 /GO DO IT ACTR1: LDA BUFE X /GET PACKET LENGTH SSP 0"A"TWOQ SUB 0 SUB THREE 0"A"[ACKH-1] LDX MP ADD THRUPW X SPL LDA SIGN /MARK OFLO STA THRUPW X IRS THRUPT X NOP LDA ACKT SNZ /HAVE WE PROCESSED ALL THE ACKS? JMP M2T0 /YES, SO QUIT JMP ACKLOP ACKSYN: SSM STA I2MNXT X SSP STA 0 JMP ACKS1 /MARK THE BUFFER AS ACKED ACTR2: JST (TRCDUN) I /TRACING PACKET LDX MP /NEEDED FOR TRCDUN LDX M2ISP JMP ACTR1 ACK567: CAS C100 JMP ACK7 JMP ACK6 ACK5: CRA IMA 5 X JMP ACKS ACK6: CRA IMA 6 X JMP ACKS ACK7: CRA IMA 7 X JMP ACKS ACK4: CRA IMA 4 X JMP ACKS ACK3: CRA IMA 3 X JMP ACKS ACK2: CRA IMA 2 X JMP ACKS ACK1: CRA IMA 1 X JMP ACKS LEV CON DIPP: DPP1 DPP2 DPP3 DPP4 DPP5 DIS: DIS1 DIS2 DIS3 DIS4 DIS5 LEV VAR M2ISP: BSS 1 /SAVED PACKET POINTER ACKT: BSS 1 THRUPW: BSS CH THRUPT: BSS CH LEV CON CONSTANTS PAGEND 10,UNCON,5 /MODEM TO IMP PACKET-ERROR STUFF LEV M2I PKTCHK: 0 /ADDRESS OF PKT ERROR JST HLTNCC I /REPORT TRAP TO NCC PKTCHC: LDA (TAR) I STA ADDRET /RESTORE PREVIOUS OWNER OF ADDER LDA NFA SUB NFS SUB TEN /LEAVE MORE THAN MINF SPL /ROOM TO SEND PKT TO DIAG? JMP NODIAG /NO LDA (M2ISP) I /PICK UP PKT PNTR IMA DIAGQ /PUT ON DIAG QUEUE STA (M2ISP 0 I) I /AND SET UP CHAIN PNTR JMP (DIPP 0 XI) I /DISMISS M2IRQC: LDX MP LDA MINUS4 STA SLT X LDA SIGN 0"A"SNDCOR STA SIHY X /MARK TO SEND CORE NODIAG: LDX (M2ISP) I /AND FREE BAD PKT M2IFRE: JST FLUSHI I LDX MP JMP (DIPP 0 XI) I PKTCH2: 0 JST HLTNCC I JST KILLIN /KILL LINES FOR SPURIOUS ACKS JMP PKTCHC /CONTINUE KILTIM=10. /LINE HELD DEAD TIME LEV [M2I,T.O,TSK,BCK] KILLIN: 0 /SUBR TO STOP INPUT AND OUTPUT ON LDA (NOP) /KILL THE LINE INSTANTLY STA (M2IOK 0 XI) I LDA (-KILTIM) /OTHER IMP WILL SEE THE LINE GO D[ STA SLT X STA LINE X /FOR NCC AND RTGO KILL2: CRA KILL3: STA NEIGHB X KILL4: JMP KILLIN I LEV [M2I,I2H] TRCDUN: 0 /FINISH TRACE BLOCK STA TRCD LDA ST X LDX TRCD STA TST X RDCLOK JMP .-1 STA TAT X LDA SIGN ERA TDONE X STA TDONE X LDA TRCD ADD (TQUE) STA TRCD LDA TRCDUN I STA .+1 BSS 1 /LDX FROM PAGE 0 STX TRCD I JMP TRCDUN I LEV VAR TRCD: BSS 1 /TRCDUN PTR LEV M2I M2IDMC: LDA HEAD2 X /RELOAD DEMAND ERA PASWRD /CHECK PASSWORD SZE /KOSHER? JMP M2IDM1 /NO LDA ACKH X /LOOK AT DEMAND SMI /PANIC DEMAND? JMP (1004) I /YES. INSTANT RELOAD, A=MODEM NUMBE LDA MP /NO, USE OUR MODEM NO. AOA /(COUNTING 1-4) STA SW3FG /AND NICE-STOP/RELOAD JMP M2IFRE M2IDM1: LDX MP DEFHLT [RELOAD DEMAND WITH BAD PASSWORD] JST PKTCHK DEFPLC [DEMAND RELOAD PASSWORD] PASWRD: 175461 /KEEP NEXT LOCATIONS IN ORDER DMNDCR: -1 /ACKH. USED FOR RELOAD CODE GETCOR 0 LINETS /HEADER 0 /SYNC 0 /PASSWORD PUT HERE MANUALLY BSS 1 /CHECKSUM /LINE SPEED COMPUTATIONS LEV I2M LCK ALL I2MRM: ERA ONE 0"A"RM /THIS IS RM CLEAR FLAG STA (RMFLG 0 X) I /NOW CHK TO SEE IF TIME I: SPL /SIGN MINUS IF FIRST TIME THROUGH JMP I2MRMI /INITIALIZATION ICL /SPD TYPE FROM L. HALF INTD RT. STA 0 /USED AS INDEX INTO MARGIN TABLE LDA DELSPD X /GET PERMISSABLE VARIANCE STA DELTA LDX (OCHN) I /RESTORE CHAN # IN X ADD RMLAST X /MAXIMUM ACCEPTABLE TIME FOR THIS M: CAS (THIST) I /COMP W/ACTUAL TIME FOR THIS MSG JMP I2MRMA /MAX>THIS, SO FAR SO GOOD JMP I2MRMB /MAX=THIS, ALL OK, IN SPEC DEFHLT [LINE SPEED DECREASED] I2MRMD: JST I2MSCG I2MSCG: 0 JST HLTNCC I /SEND MSG TO NCC LDA (RMFLG 0 X) I /DO HOLD DOWN ANA (0 0 177777"X"SHD) ERA (SHD) /(6) SPEED HOLD DOWN STA (RMFLG 0 X) I /STORED IN RMFLG JMP I2MRMC /PUT THIST INTO LAST AND QUIT /TIME WAS MIN? I2MRMA: SUB DELTA SUB DELTA /MIN ACCEPTABLE TIME CAS (THIST) I /COMP W/ACTUAL TIME DEFHLT [LINE SPEED INCREASED] JST I2MSCG /MIN>THIS, TOO SLOW NOP /MIN=THIS, ALL OK I2MRMB: LDA (RMFLG 0 X) I /MINTHIS) JMP I2MRMH / " " " " = " IRS 0 /NOPE, TRY NEXT SLOWER TYPE JMP I2MRMG I2MRMH: LDA LINDTT+NSPD-1 X /GET LINE DEAD TIME FOR T1 STA DELTA /AND SAVE IN TEMP LDA 0 /INDEX= -TYPE TCA /COMPLIMENT ICA /INTO LEFT HALF LDX (OCHN) I /RESTORE CHAN IN X STA (RMFLG 0 X) I 0"A"SHD"A"RM /BACK INTO RMFLT ICA /GET SPEED TYPE ADD (RMCLKS) /ADD TABLE ADDRESS STA RMCLKP X /SAVE FOR USE IN RSTOUT LDA DELTA /PICK UP TEMP STA LINDT X /AND SAVE AS THIS LINE'S DEAD TIME LDA LINE X SZE /IS LINE UP? JST KILLIN /NO, RESET TIME IN CASE JUST RELO7 LDA (THIST) I /PUT (THIS+LAST)/2 INTO ACTUAL ADD RMLAST X LGR 1 JMP I2MRMF I2MRMI: SSP /INITIALIZE FIRST TIME THROUGH STA (RMFLG 0 X) I /CLEAR INIT BIT TOO, JMP I2MRMC /PUT THIS INTO LAST AND QUIT LEV CON /NSPD-1 ENTRIES TIMSPC: 161 /(125K)MAX TIME A RM TAKES IN TYP1 ] 1066 /(25K) TYPE 2 4202 /(6.5K) TYPE 1 (ALL SLOWER TYPE 0) /NSPD ENTRIES DELSPD: 377 /00 10X OF EXPECTED TIME FOR RM (+8I 177 /01 60 /10 60 /11 /NSPD ENTRIES LINDTT: 0 0-PTCK"T"5 /FOR 250KBS 0 0-PTCK /FOR 50KBS 0 0-PTCK"Q"5 /FOR 10KBS 0 0-PTCK"Q"10 /LINE DEAD TIME FOR 5KBS LEV VAR RMTACT: BSS CH /ACTUAL TIME FOR RM (AVERAGED) RMLAST: BSS CH /TIME FOR LAST RM IN 100 MU SEC'S RMCLKP: BSS CH /PTR TO ENTRY IN RMCLKS DELTA: BSS 1 /DELSPD ENTRY FOR THIS LINE LINDT: BSS CH /LINE HELD DEAD TIMES LEV CON CONSTANTS PAGEND 11,UNCON,4 /IMP TO MODEM (I2M) PAGI2M: LEV I2M M1OTIL/ I2M1 M2OTIL/ I2M2 M3OTIL/ I2M3 M4OTIL/ I2M4 M5OTIL/ I2M5 PAGI2M/ LEV VAR TATA: BSS 1 /I2M TEMPS TXTX: BSS 1 TCTC: BSS 1 IRET: BSS 1 /IMP TO MODEM INTERRUPTS COME TO THIS PAGE. I2M5: INT I2M STX TXTX LDX FOUR JMP I2M0 I2M4: INT I2M STX TXTX LDX THREE JMP I2M0 I2M3: INT I2M STX TXTX LDX TWO JMP I2M0 I2M2: INT I2M STX TXTX LDX ONE JMP I2M0 I2M1: INT I2M STX TXTX LDX ZERO I2M0: STX OCHN /SAVE MODEM NUMBER STA TATA DXA JMP .+1 INK STA TCTC LDA TIMES /CURRENT 640 MS CLOCK SUB TIM640 X /INITIAL READING FOR THIS MSG SUB (10.) /10.24 TICKS/WRAP OF 100 MUS CLK SMI /<10 TICKS? JMP RAPT /NO, MSG TOOK TOO LONG, CLOCK WRAPPI RDCLOK /100 MU SEC CLOCK JMP .-1 SUB TIM100 X /MINUS START TIMER STA THIST /TIME FOR THIS MESSAGE ADD CUMTIM X /ADD TO TOTAL STA CUMTIM X /AND SAVE LDA RMFLG X /ROUTING MSG FLAGS SLZ /WAS THIS A ROUTING MESSAGE? JMP (I2MRM) I /YES, GO DO LINE SPEED COMPUTNS I2MS: LDA MOM /LOAD MODEM OUTPUT MASK SMK INTM /SET PRI INTERRUPT IMA PRIM STA TMTM CRA IMA I2MNXT X /PKT PNTR FOR NEXT OUTPUT FOR CHL SMI /WAS THERE AN ACK FOR THE PKT WE L 1 JMP I2MALL /NO, DO NOT RELEASE PKT SSP STA 0 JST FLUSHI I /YES, SO WE CAN FREE IT NOW IRS NSFS LDX OCHN I2MALL: ENB I2M LDA SLT X SZE /TIME TO SEND A ROUTING MESSAGE? JMP I2MLT /YES LDA I2MLST X /PICK UP RING PNTR AOA /ADVANCE IT CAS I2MEND X NOP LDA I2MTAB X /WRAP AROUND STA I2MLST X INH M2I /PREVENT M2I FROM ACKING LDA I2MLST XI /WHILE WE LOOK AT THIS SLOT CAS (1777) /IS THERE A PKT HERE? JMP I2MRET /YES, SEE IF IT IS TOO OLD I2MNEW: LDX OCHN /NO, NOTHING TO RETRANSMIT ENB I2M LDA SMPQ X SZE /A NEW PRIORITY PACKET TO SEND? JMP I2MPRI /YES LDA SMQ X SZE /A NEW REGULAR PACKET TO SEND? JMP I2MREG /YES LDA SNULL X SNZ /SHOULD WE SEND A NULL PKT? JMP I2MQUT /NO, SO QUIT I2MNUL: CRA /SEND A NULL PKT WITH IHY IMA SIHY X SPL 0"A"SNDCOR /DID WE GET A REQUEST TO SEND CORE JMP I2MCOR /YES. SO SERVICE IT SZE /DID WE GET IN ANY ROUTING MESSAGES1 LDA (IHERDU) /YES. SEND AN I HEARD YOU ERA (LINETS 0 NULPKT) /IN A NULL PKT ICA ERA MINE ICA STA NULPTR XI /SET UP HEADER OF NULL PKT LDA NULPTR X /PICK UP PNTR TO NULL AREA SUB ONE STA MOPX XI /SET UP OUR OUTPUT AREA STA ACKWRD ADD FOUR 0"A"[MINPL-ACKH] /MIN PACKET LENT STA MOP1 XI LDA RSEX X /PUT IN ACKS LDX ACKWRD STA ACKH-ACKH X LDA SYNC /PUTTING SYNC TIME INTO NULLS STA HEAD1-ACKH X I2MNLC: LDA FOUR 0"A"[MINPL-ACKH] SUB ACKH-ACKH X /BUILD CKSUM SUB HEAD-ACKH X SUB HEAD1-ACKH X SUB HEAD2-ACKH X STA HEAD3-ACKH X /AND STORE IT LDX OCHN JMP I2MDN1 I2MCOR: LDA (CORELO) STA MOPX XI LDA (COREHI-1) STA MOP1 XI JMP I2MDUN /RETURN TO DO OUTPUT, NO ACKS I2MDMC: LDA (DMNDCR) /SEND 'DEMAND CORE' STA MOPX XI ADD FOUR 0"A"[MINPL-ACKH] STA MOP1 XI SUB FOUR 0"A"[MINPL-ACKH] STA 0 JMP I2MNLC /GET CHECKSUM AND SEND IT I2MLT: SPL /ARE WE HOLDING LINE DEAD? JMP I2MQUT /YES, GO NO FURTHER I2ML2: SUB ONE I2ML3: STA SLT X I2ML4: CAS ONE /RELOAD DEMAND TO SEND? JMP I2MDMC /YES JMP I2MNUL /NULL TO SEND /---FALL THROUGH TO SEND ROUTING /THE WORDS FROM I2MCK1 TO I2MCK2 ARE CHECKSUMMED CHK=0 I2MCK1: K LDX I2MCKX /PICK UP -[# OF WDS IN CODE TO CK[ 1 K ADD I2MCK2+1 X /ADD THEM (NOTE 0 IN AN I1 K IRS 0 K JMP .-2 K SZE /DIFFERENT? RELOAD [I2M ROUTING CODE BROKEN] K JST SWDTIL I /SOFTWARE WDT, DO A RELOAD K LDX OCHN K IRS IMHSI I /KEEP STAT COUNTER K NOP K LDA RST.O /GET OUTPUT PTR K ADD I2MRC1 K STA MOPX XI /BEG POINTER K SUB I2MRC2 K STA MOP1 XI K ADD I2MRC3 K STA 0 K LDA I2MRAP /(RUTADR) K IMA ADDRET /SAVE CURRENT OWNER OF ADDER K STA TARTAR K LDA I2MRC2 /(-NIMP - HEAD1 + ACKH) K JMP .+1 I /JUMP INTO RIGHT PLACE IN ADD CHAI K ADDBOT+0-NIMP-HEAD1+ACKH RUTADR: K TCA K LDX ZERO /USE TO FIND CKSUM POST INDEXED K ERA RST.O I /COMPARE CKSUM W/ THAT GENERATED BY K IMA TARTAR K STA ADDRET K LDA TARTAR K LDX OCHN K .INH LCK ALL K SZE /DIFFERENT? DEFHLT [ROUTING MESSAGE CHECKSUM ERROR - INTRA IMP] K JST I2MHLT K AOA /1 K ERA RMFLG X /SAYS ROUTING MSG GOING OUT K STA RMFLG X K LDA I2MRP I /(RSTSN) K STA RSTSNO X /SAVE SER # OF LAST OUTPUT K JMP I2MDUN LEV CON IMHSI: K IMHS 0 X I2MRAP: K RUTADR I2MRC1: K -X 0-NIMP-HEAD1+ACKH-1 I2MRC2: K -NIMP-HEAD1+ACKH-1 I2MRC3: K -NIMP-HEAD1-1 I2MRP: K RSTSN I2MCKX: K I2MCK1-0-I2MCK2-1 /CHECKSUM COUNTER I2MCK2: -CHK /CHECKSUM ON CODE GOES HERE LEV I2M I2MPRI: STA I2MNXT X CRA IMA I2MNXT XI STA SMPQ X SZE JMP I2MGNU LDA (SMPQ) ADD OCHN STA EMPQ X JMP I2MGNU I2MREG: STA I2MNXT X /LOAD WITH TOP OF Q ADDR CRA IMA I2MNXT XI /GET CHAIN PNTR OF NEW REQ STA SMQ X /LINK TO TOP OF Q SZE /WAS THIS LAST? JMP I2MGNU /NO LDA (SMQ) /YES, FIX UP Q PNTRS ADD OCHN STA EMQ X I2MGNU: LDX (I2MNXT 0 X) I /GOT A NEW PKT STX (INCH 0 XI) I /SET UP SLOT PNTR LDA (-200.) /GIVE A PKT 200 TRIES STA INCH X /TO BE ACCEPTED STA I2MREF /MARK AS NEW PKT, DON'T CHECKSUM LDX OCHN LDA I2MNXT X I2MGOT: SSP ADD (ACKH) STA MOPX XI DEFSTAT STA ACKWRD, IM1 LDX (I2MNXT 0 X) I RDCLOK JMP .-1 STA ST X LDA BUFE X SSP 0"A"TWOQ LDX OCHN STA MOP1 XI STA ENDWRD LDA I2MREF /RETRANSMISSION OR NEW? DEFPLC [NOP HERE TO STOP CHECKSUM VERIFY IN I2M] SZE JMP I2MCHF /NO CKSUM LDA (I2MADR) /CAPTURE ADDER IMA ADDRET STA TARTAR LDA ACKWRD SUB FOUR 0"A"ACKH STA 0 /PACKET POINTER SUB ENDWRD /LENGTH OF PACKET ADD (ADDBOT+ACKH) STA I2MADJ SUB (ADDBOT) JMP I2MADJ I I2MADJ: BSS 1 I2MADR: SZE JMP I2MCHE /CHECKSUM ERROR! LDA TARTAR STA ADDRET /RESTORE ADDER OWNER LDX OCHN I2MCHF: LDA ACKWRD I CAR 0"A"ACKBTS /PUT IN ACKS ERA RSEX X IMA ACKWRD I /AND CORRECT CHECKSUM SUB ACKWRD I ADD ENDWRD I STA ENDWRD I I2MDN1: CRA STA SNULL X /ACKS MARKED AS SENT I2MDUN: LDA TIMES /640 MS COUNTER STA TIM640 X /TABLE OF MODEM OUT START TIMES RDCLOK /100 MICRO SEC CLOCK JMP .-1 STA TIM100 X /SAVE THIS CLOCK TOO LDA MXOUT X STA . 1 BSS 1 LDA M30SCF /SET TO WAIT FOR HARDWARE COMPLETE I2MQUT: STA NONE X /OR SET FLAG TO INDICATE IDLE INH MSK LDA TMTM STA PRIM SMK INTM LDA M1OTIL XI STA IRET EXA LDA TCTC OTK LDA TATA LDX TXTX ENB I2M JMP IRET I LEV I2M LCK ALL RAPT: LDA (14400) /6400MS, 1 SLOW T.O IN 100MUS UNITS STA CUMTIM X /RM TOOK TOO LONG, MAX+TIMER LDA RMFLG X /CLEAR RM FLAG BIT ANA MINUS2 0"A"RM /177776 STA RMFLG X JMP I2MS /AND RETURN LEV I2M I2MCHE: INH ALL DEFHLT [MODEM OUT DETECTED INTRA-IMP CHECKSUM ERROR] JST .+1 0 JST HLTNCC I /RERORT IT LDA 0 IMA DIAGQ /AND TO DIAG TTY STA 0 X ENB I2M LDA TARTAR STA ADDRET IRS NSFS LDA ACKH X /FREE UP UN-ACKED CHANNEL ANA (CHANUM) ICL LDX OCHN ADD I2MTAB X /GET SLOT POINTER STA TARTAR /(TEMP) CRA STA TARTAR I /CLEAR SLOT PTR JMP I2MQUT /LEAVE MODEM OUTPUT IDLE FOR A BI- LCK M2I I2MRET: STA 0 /SAVE PKT PNTR RDCLOK JMP .-1 SUB ST X /COMPARE TIME NOW WITH SENT TIME SPL TCA /MAKE DIFF A POSITIVE NUMBER SUB (1250.) /COMPARE WITH 125 MS /THIS CONSTANT VARIES WITH LINE LENGTH AND SPEED /IT SHOULD BE TABLED WHEN WE GET FAST LINES+SATELLITES SPL /TOO OLD? JMP I2MNEW /NOT YET IRS INCH X /COUNT ANOTHER RETRANSMIT JMP I2MRTR /NOT OVER THE LIMIT JST FLUSHI I /KILL PKT AFTER 200 TRIES IRS NSFS /AND COUNT IT OUT LDX OCHN CRA STA I2MLST XI /SO IT WON'T BE FLUSHED TWICE DEFHLT [200 RETRANSMISSIONS - SERIOUS MALFUNCTION] JST I2MHLT I2MHLT: 0 JST HLTNCC I /REPORT TROUBLE TO NCC JST (KILLIN) I /KILL LINE INSTANTLY JMP I2MQUT /DISMISS INTERRUPT I2MRTR: LDX OCHN CRA /MARK PACKET AS A RETRANSMISSION STA I2MREF /SO CHECKSUM IS VERIFIED LDA I2MLST XI /PACKET SENT >125MS AGO STA I2MNXT X /SO RETRANSMIT IT ENB I2M JMP I2MGOT LEV [T.O,TSK] LCK SIN I2MSB: 0 /SOFTWARE WAKELP OF MODEM OUTPUT STX TXTX /ALWAYS CALLED FROM LOW CORE AND DX STA TATA STX OCHN LDA I2MSB STA M1OTIL XI JMP I2MSBT XI /CLEAR X BIT IN ADDR AND LEAP IN F LEV VAR I2MSBT: I2MS I2MS SATDEF I2MS I2MS I2MS /BITS IN RMFLG RMINIT=100000 /SET IF FIRST TIME THROUGH (IN INI SPDTYP=77400 /TYPE 0 = 5KBS /TYPE 1 = 10KBS /TYPE 2 = 50KBS /TYPE 3 = 250 KBS SHD=6 /SPEED HOLD-DOWN COUNTER SHD1=2 /BOTTOM BIT OF SHD RM=1 /IF SET, SAYS ROUTING MESSAGE PENDING LEV VAR RMFLG: BSS CH /INIT TO 1006(HD ON 50KB LINE) CUMTIM: BSS CH /CUMULATIVE BUSY TIME OVER INTERVAL TIM640: BSS CH /'TIMES' AT START OF OUTPUT TIM100: BSS CH /100 MUS CLOCK AT START OF OUTPUT THIST: BSS 1 /ELAPSED TIME FOR THIS TRANSMISSION RSTSNO: BSS CH /SERIAL NO. OF LAST RM OUTPUT LEV VAR TMTM: BSS 1 /TEMP M TARTAR: BSS 1 /TEMP ADDER RETURN OCHN: BSS 1 /ACTIVE MODEM NUMBER ACKWRD: BSS 1 /PNTR TO WORD IN PKT WHERE ACKS GO ENDWRD: BSS 1 /PNTR TO LAST WORD IN PKT I2MREF: BSS 1 /RETRANSMIT FLAG: CHECKSUM IF FLAG I I2MLST: BSS CH /PNTR TO LAST SLOT SENT LEV CON MOPX: M1OTBP /DMC OUTPUT PNTRS M2OTBP M3OTBP M4OTBP M5OTBP MOP1: M1OTBP+1 /DMC OUTPUT END PNTRS M2OTBP+1 M3OTBP+1 M4OTBP+1 M5OTBP+1 MXOUT: M1OUT /OUTPUT INSTRUCTIONS M2OUT M3OUT M4OUT M5OUT NULPTR: NULS1+1 /PNTRS TO NULL PKT AREAS NULS2+1 NULS3+1 NULS4+1 NULS5+1 M30SCF: -[0 0 30SEC"T"25.] LEV CON CONSTANTS PAGEND 12,UNCON,5 /HOST TO IMP (HI) PAGH2I: LEV H2I H1INIL/ HI0E H2INIL/ TIPDEF HI1E, TINT H3INIL/ HI2E H4INIL/ HI3E PAGH2I/ /HOST 3 INTERRUPT ROUTINE HI3E: INT H2I STX HIX LDX HI3E STX HISB LDX THREE JMP HISB2 /HOST 2 INTERRUPT ROUTINE HI2E: INT H2I STX HIX LDX HI2E STX HISB LDX TWO JMP HISB2 /HOST 1 INTERRUPT ROUTINE HI1E: INT H2I STX HIX LDX HI1E STX HISB LDX ONE JMP HISB2 /HOST 0 INTERRUPT ROUTINE HI0E: INT H2I STX HIX /SAVE INDEX REGISTER LDX HI0E STX HISB /SET UP RETURN ADDRESS LDX ZERO /INTERRUPT FROM HOST 0 JMP HISB2 / FROM HERE ON IS COMMON TO ALL HOST INTERRUPT ROUTINES HISB: 0 STX HIX HISB2: DXA JMP . 1 STX HIP /SAVE CURRENT HOST STA HIA /SAVE AC INK STA HIK LDA HIM /SET UP NEW INTERRUPT MASK (177760) SMK INTM /OUTPUT IT IMA PRIM /SAVE IT IN PRIM STA HIMS /SAVE OLD PRIM ENB H2I JMP HILO XI /RESTART WHERE LAST LEFT OFF HIWM: 0 /DEBREAK AND WAKE UP 25MS LATER LDX HIP LDA HIWM HIWM1: STA HILO X LDA MINUS1 STA HITT X /SET TIMEOUT TO WAIT 1 PERIOD JMP HIDONE LEV VAR HIA: BSS 1 /AC SAVE HIK: BSS 1 /K SAVE HIX: BSS 1 /IR SAVE HIMS: BSS 1 /PRIM SAVE HITT: BSS TH /HOST-TO-IMP INTERFACE TIMER LEV CON HIB1: H1INBP /DMC INPUT PNTRS TIPDEF H2INBP,JUNK TIPDEF H3INBP,TIPLNK+2 H4INBP HIBB HIBB+1 HIBB+2 HIBB+3 HIB2: H1INBP+1 /DMC INPUT END PNTRS TIPDEF H2INBP+1,JUNK TIPDEF H3INBP+1,TIPLNK+3 H4INBP+1 HIBC HIBC+1 HIBC+2 HIBC+3 HER0: JMP 0 1000 777"A"HITEST /NEEDED FOR HOST TEST /MUST PRECEDE HER! HER: H1ERR /SKIP ON ERROR FROM HOST H2ERR TIPDEF H3ERR,NOP H4ERR NOP NOP NOP NOP HIN: H1IN /INPUT INSTRUCTIONS H2IN TIPDEF H3IN,JMP+0+1000+HIFAKE"A"777 H4IN JMP HIFAKE JMP HIFAKE JMP HIFAKE JMP HIFAKE /FAKE HOST TO IMP (JAM) /SIMULATE HOST-TO-IMP INTERFACE HARDWARE FOR FAKE HOSTS: /1- RECEIVE A WORD FROM HOST /2- STORE THE WORD THROUGH THE DMC INPUT POINTER /3- INCREMENT THE DMC INPUT POINTER /4- IF LAST BIT INDICATOR IS SET, OR / IF THE DMC INPUT AND INPUT END POINTERS CROSS / GIVE INPUT COMPLETED INTERRUPT /5- GO TO 1 /HIBB SERVES AS THE DMC INPUT POINTER /HIBC SERVES AS THE DMC INPUT END POINTER /CALLING SEQUENCE /FAKE HOST NUMBER IN X REG - 0=TTY,1=DDT,2=TRACE,3=STATISTIC1 /SIGN BIT OF X REG IS LAST BIT INDICATOR - BIT ON=LAST BIT /THE WORD TO GIVE TO THE IMP IN A REG /JST JAM - SEND THIS WORD TO IMP FROM THIS FAKE HOST / - IMPLICIT BACKGROUND WAIT UNTIL THIS WORD IS TAKEN / - AND ANOTHER WORD MAY BE SENT LEV BCK GAM: 0 STA HIBB XI /STORE NEXT WORD THROUGH INPUT PNI IRS HIBB X /INCREMENT INPUT PNTR LDA 0 SPL /IS LAST BIT FLAG SET? JMP GAM2 /YES LDA HIBC X SUB HIBB X SMI /HAVE PNTRS CROSSED? JMP GAM I /NO, RETURN LDA HER+NH+3 /(NOP) GAM1: STA EMFH+NH X /SET UP LAST BIT INSTRUCTION FOR HO LDA GAM STA GAMT X /SAVE RETURN ADDRESS LDA 0 SSP STA GAMX ADD PLNH STA 0 /SET UP X REG FOR THIS FAKE HOST INH SIN /SOFTWARE INTERRUPT HOST-TO-IMP EXA JST HISB RET BCK INH ALL JST DODXA I RET BCK LDX GAMX GAM3: LDA HITT+NH X /TIMER HAS THREE POSSIBLE STATES CMA /0 - WAITING FOR LEADER INPUT SZE /-1 - WAITING FOR SOFTWARE INTERRU JMP GAMT XI /IF NOT -1, INPUT CAN GO, SO RETUF JST DOZE I /-N - WAITING FOR DATA INPUT DEFPLC [JAM CALL TO DOZE] JMP GAM3 /WAIT UNTIL INPUT IS ALLOWED GAM2: LDA SIGN /(SKP) JMP GAM1 LEV VAR DEFPLC [GAMT] GAMT: BSS FH /TABLE OF RETURN ADDRESSES GAMX: BSS 1 LEV BCK LCK INI HIST: 0 /RESTART HOST TO IMP CRA STA HISP X STA HISB /IN CASE NON-DXA IMP RELOADED FROM ] STA (HIDEST 0 X) I LDA HISTAB X STA HILO X /SET UP INITIAL ADDRESS TO GO TO LDA EMIT X STA EMFH X /SET UP FOM INSTRUCTION EXA JST HISB /CALL HOST JST DODXA I JMP HIST I LEV CON HISTAB: HISTRH /INITIAL COROUTINE ENTRANCES HISTRH TIPDEF HISTRH, HISTFH HISTRH HISTFH HISTFH HISTFH HISTFH EMIT: H1EOM /SKIP ON LAST BIT INSTRUCTIONS H2EOM TIPDEF H3EOM, SKP H4EOM SKP SKP SKP SKP LEV VAR EMFH: BSS TH /SKIP ON END OF MESSAGE FROM HOST HIBB: BSS FH /DMC INPUT PNTRS FOR FAKE HOSTS HIBC: BSS FH /DMC INPUT END PNTRS FOR FAKE HOSTS HISP: BSS TH /POINTER TO CURRENT BUFFER HINWAT: BSS TH /HOLD UP HOST INPUT LEV H2I HISTRH: LDA (HIFRST) /DISCARD FIRST INPUT OF REAL HOST JMP HISTLO HIDOWN: LDA ONE 0"A"HSTGDN STA HIHD X /MARK HOST GOING DOWN DEFPLC [HI - WAITING FOR A PKT TO THROW AWAY] HIDISC: CRA IMA (HIDEST 0 X) I SMI /DID THIS GUY JUST TAKE TOO LONG? JMP HIDSC1 /NO LDA (HIDISC) STA HILO X CRA /DONT'T SET ALARM CLOCK AGAIN JMP HINLO1 HIDSC1: LDA HISP X /FLUSH HISP SNZ JMP HIFRST STA 0 STA BUFE X 0"A"TWOQ INH FRE JST FLUSHI I ENB H2I LDX HIP DEFPLC [HI - WAITING FOR INITIAL INPUT] HIFRST: LDA EMFH X /IS EOM SET? STA .+2 LDA (HIDISC) BSS 1 JMP HINLO /NO HIDB: CRA STA HISP X LDA EMFH X /IS EOM SET? STA .+1 BSS 1 JMP HINBUF /NO HIWAIT: LDA HINWAT X /INPUT TO BE BLOCKED? SZE JMP HIBLKD /YES HISTFH: LDA (HILEAD) HISTLO: STA HILO X CRA STA HITT X /GIVE HIM FOREVER TO INPUT NEXT ME' LDA 0 ALS 1 ADD (I 0 HICWS) STA HIB1 XI AOA JMP HINB2 HIBLKD: JST HIWM DEFPLC [HI - INPUT BEING BLOCKED BY OUTPUT] JMP HIWAIT LEV CON DEFPLC [HI - 2 WORD INPUT AREA] HICWS: BSS TH+TH LEV H2I HIWBUF: LDA HILO X STA HISP X /SAVE RETURN ADDRESS JST HIWM DEFPLC [HI - NO FREE SPACE] LDA HISP X JMP HINLO /RESTORE RETURN ADDRESS HINBUF: LDA (PKTN1) ADD (HIH1 0 X) I STA (HIH1 0 X) I ANA (PKTNO) SNZ /WILL NEXT PKT BE NO 10? JMP HIDISC /YES LDA (HI25) HINLO: STA HILO X LDA (0 0 -15000."Q"25.) HINLO1: STA HITT X /GIVE HOST 15 SECS TO INPUT PKT INH FRE LDA NFA SUB NFS SUB MINF SPL JMP HIWBUF /NOT ENOUGH BUFFERS FOR MODEM INPUT LDA FREE I SNZ JMP HIWBUF IMA FREE IRS NFS ENB H2I STA HISP X /SAVE POINTER TO BUFFER ADD (I 0 DATA) STA HIB1 XI /THIS CONSTANT DETERMINES PACKET LENGTH FOR THE WHOLE IMPSY' ADD (BUFE-2-DATA) /ALLOW FOR CHKSM HINB2: SSP /FOR FAKE HOSTS STA HIB2 XI LDA HIN X STA .+1 BSS 1 HIDONE: LDA HIMS /RESTORE INTERRUPT MASK INH MSK SMK INTM STA PRIM EXA LDA HIK OTK LDX HIX /RESTORE IR LDA HIA /RESTORE AC ENB H2I JMP HISB I HIFAKE: LDA HIB1 XI SSP STA HIB1 XI JMP HIDONE LEV CON CONSTANTS PAGEND 13,UNCON,4 LEV VAR HICW1: 0 /TEMP USED TO RETRIEVE CONTROL WORD1 LEV H2I HILOOP: 0 LDA HBTS X ERA MINE STA HIH1 X LDA HL2WD STA HIH3 X JMP HILOOP I HIEXER: JST HILOOP HITEST: LDA HIH1 X /MSG A NOP? ANA (HICODE) ERA (CNOP) SZE JMP (HIDISC) I /NO. FLUSH MESSAGE LDA HIH3 X /DATA WORD MATCH? ERA HL2WD SNZ IRS (HLRCVD) I /YES, COUNT A GOOD ONE JMP (HIDISC) I /AND FLUSH MSG /USE TO CLEAN UP UNTIL IMPDIE LOGIC TAKES OVER HIWMD: 0 /HIWM WITH DEAD TEST LDX HIP LDX (HIDEST 0 X) I LDA RUT X LDX HIP SPL 0"A"RUTDED /IS DEST IMP DEAD? JMP HI19 /YES LDA HIHD X 0"A"HSTUP SZE /IS SOURCE HOST DEAD? JMP HIERR /YES LDA HIWMD JMP (HIWM1) I /NO, WAIT ONE TICK LEV CON HBTS: 0 /FROM IMP AND HOST BITS 100 200 300 40000 40100 40200 40300 LEV H2I HIHDN: JST (HIWM) I DEFPLC [HI - WAITING FOR LEADER] VD.1P: HILEAD: LDA HIHD X 0"A"HSTIDN CAS THREE JMP HIHDN 0"A"HSTIDN NOP LDA 0 /SET UP HIH1, HIH3 FROM CONTROL INP1 ALS 1 STA 0 LDA (HICWS 0 X) I STA HICW1 LDA (HICWS+1 X) I LDX HIP ANA (LINKNO) STA HIH3 X LDA HICW1 0"A"[PRIBIT 0 FORIMP TRACE FOROCT DESTHI] STA HIH1 X 0"A"PKTNO ANA (HICODE) ICL ADD (HI2 0 I) STA HIH0 X SUB HIDE SMI JMP HI2+7 I /ASSUMES NO TYPE 7 MESSAGE LDA (HER 0 X) I STA .+1 BSS 1 /ERROR?, LOOP JST, OR EXER OR TEST SKP /NO JMP HIERR /ERROR BIT SET IN LEADER CRA 0"A"HSTUP IMA HIHD X SZE /WAS HOST DOWN? LDA IHXX I /YES, IS OUTPUT IN PROGRESS? SNZ JMP .+3 /NOT BOTH LDA M30SEC /WAS DOWN, GIVE OUTPUT FULL 30 SE(' STA (IHTT 0 X) I LDA (EMFH 0 X) I /YES STA .+1 BSS 1 /EOM? DEFSTAT JMP HIH0 XI, HS2 /N0,DISPATCH ON TYPE JMP HISHRT /YES, LESS THAN 32 BIT MESSAGE LEV CON HI2: HI20 /0 - REG HIDISC /1 - IMP FORMAT ERROR HIDOWN /2 - HOST GOING DOWN HIBADC /3 HIDISC /4 - NOP HIBADC /5 HIBADC /6 HIBADC /7 - USED IN CODE FOR HIBADC REFEF ' HIDISC /8 - IMP FORMAT ERROR WITH ID HIDE: . 0 I LEV VAR /MORE OF HOST-TO-IMP, INCLUDING PACKET PROCESSING HIT1: BSS 1 /TEMP HITF: -1 HIH0: BSS TH /SAVED HEAD,HEAD1,HEAD2,HEAD3 HIH1: BSS TH HIH2: BSS TH HIH3: BSS TH HIDEST: BSS TH /DESTINATION OF CURRENT MESS /SIGN BIT ON MEANS HOST TOOK TOO LO1 HILINK: BSS TH /PNTR TO SAVED LINK+SUB-CODE WORD HIBLKT: BSS TH /TIME TO WAIT FOR MESS NO HIAR: BSS 1 /TEMP ADDER RETURN LEV H2I HIBADC: IRS HIH3 X 0"A"CILLGL HISHRT: IRS HIH3 X 0"A"CSHORT HIERR: CRA 0"A"CERR32 STA HIH1 X LDA (CERRLD) JMP HI16 HIBLK: LDA (CBLOCK) ERA HIH3 X STA HIH3 X LDA (CINCTR) JMP HI16 HI20: LDA HIP /FIGURE OUT HOW LONG TO WAIT FOR ME: ERA PLNH /IS THIS FROM TTY? SZE /GIVE IT 150 MS OR 15 SECS IF NOT LDA (0 0 -6"X"-450.) ERA MINUS6 /15 SECS FOR ALL OTHER HOST STA HIBLKT X LDA HIH1 X ANA (DESTI) STA HIDEST X STA 0 LDA RUT X LDX HIP SMI 0"A"CIMPD 0"A"RUTDED ANA (RUTCMU) /HOSTS AT DEAD IMPS ARE DEAD SZE /IS THERE A DELAY IN BRINGING THI1 JMP HI19 /YES, IMP IS STILL DEAD LDA HIH1 X ANA (FORIMP 0 DESTH) ERA (FORIMP 0 200) SS2 /ALL HOSTS ARE UP IF SS2 IS UP SZE /PARAM CHANGE IS DOWN IF IT'S NOT JMP HI23 /HOST IS UP HI18: IRS HIH3 X 0"A"CHSTD HI19: LDA (CDESTD) HI16: STA HIH0 X HI17: INH FRE LDA HIH3 X STA TWDP LDA HIH1 X ERA HIH0 X JST OWP I JMP (HIDISC) I JST (HIWM) I RET H2I DEFPLC [HI - WAITING FOR TWO-WORD STORE] JMP HI17 HI22: IRS HIBLKT X /HAVE WE WAITED TOO LDNG? SKP /NO JMP HIBLK /YES, SEND BACK BLOCKED JST HIWMD DEFPLC [HI - WAITING FOR MESS NO] HI23: LDA HIH1 X ANA (PRIBIT 0 DESTI) JST (MESGET) I JMP HI22 /MESSNO IN USE, WAIT STA HIH0 X /SET UP HIH0, HIH2 LDA HIH1 X ANA (FOROCT) 0"A"LSTPKT ERA MINE /CONSTRUCT SOURCE ERA HBTS X 0"A"SRCEH STA HIH2 X LDA HIP ERA (NH+2) SZE /DO NOT AUTO-TRACE TRACE LDA (TF) I SZE /IS AUTO TRACE ON? IRS HITF /YES, IS IT TIME TO TRACE? JMP HI24 /NO LDA HIH1 X /YES ANA (0 0 177777"X"TRACE) ERA (TRACE) /TURN ON TRACE BIT STA HIH1 X LDA (TF) I TCA STA HITF /RESET AUTO TRACE INTERVAL HI24: LDA (HIPKT1) JMP (HINLO) I DEFPLC [HI - WAITING FOR FIRST PKT] HIPKT1: LDA (HITT 0 X) I SNZ /DID ALARM CLOCK GO OFF? JMP HIPK1S /YES LDA (EMFH 0 X) I STA .+1 BSS 1 JMP HIPLT /MULTI-PACKET INPUT JMP HIPK1A HIPK1S: SSM STA HIDEST X /MARK AS TOO SLOW LDA HIH1 X ANA (0 0 177777"X"PKTNO) ERA (PKTNO) /MARK AS LAST PKT - FOR HIDISC STA HIH1 X HIPK1A: LDA (ONEOR8 0 REQALL) /MARK AS REQ FOR 1 ERA HIH0 X STA HIH0 X JST HIPKT JMP HIPPT HIPPT0: JST HIWMD DEFPLC [HI - WAITING FOR PPT SLOT FOR REQ1] LDX HIXX I HIPPT: JST (PPTPUT) I JMP HIPPT0 /NO ROOM IN PPT, WAIT HIMESS: STA HILINK X /SAVE PNTR INTO RPT OR PLT LDA HIDEST X SPL /DID THIS GUY TAKE TOO LONG JMP HIPSLO /YES, GO TO TASK JST (HTPMT) I /COUNT A MESSAGE OF THROUGHPUT JMP HI26 HIPLT: LDA HIDEST X JST (TALLYG) I /ANY ALLOC FROM OUR DEST? JMP HIPLT2 /NO HIPLTA: JST HIPKT LDX HIP JMP HIPLT1 JST HIWMD DEFPLC [HI - WAITING FOR PLT SLOT FOR MESS8] HIPLT1: JST (PLTPUT) I JMP .-2 /NO PLT ROOM, WAIT JMP HIMESS HIPLT2: LDA (REQALL) /MARK AS REQUEST FOR 8 ERA HIH0 X STA HIH0 X JST HIPKT /COPY HEADER LDA 0 ADD (TWOQ MINPL) /MARK AS ON TWO QUEUES, STA BUFE X /FROM SAME BUFFER LDX HIP SKP JST HIWMD DEFPLC [HI - WAITING FOR PLT SLOT FOR REQ8] JST (PLTPUT) I JMP .-2 /NO PLT ROOM, WAIT STA HILINK X /SAVE PNTR INTO PLT HIPLT3: LDX HIXX I JST HICKSM /MAKE A CHECKSUM INH M2I STX ETQ I STX ETQ TASK HIPLT4: JST (HIWM) I RET H2I DEFPLC [HI - WAITING FOR TASK TO TAKE A REQ8] JMP HIPLT4 JMP HIPLT3 /TASK REFUSED IT HIPLT5: LDA HIDEST X JST (TALLYG) I /ANY ALLOC FROM OUR DEST? JMP HIPLT6 /NO JMP HIPLT8 HIPLT6: JST HIWMD DEFPLC [HI - WAITING FOR ALL8] HIALL: JMP HIPLT5 HIPLT7: JST (HIWM) I HIPLT8: LDX HIXX I LDA BUFE X SPL 0"A"TWOQ /HAS THE ACK FOR THIS PKT BEEN PRC*] JMP HIPLT7 /NOT YET, PKT STILL ON LINE, SO WAI LDX HIP JMP HIPLT0 HIPLT9: JST HIWMD DEFPLC [HI - WAITING FOR MESS NO FOR MESS8] HIPLT0: LDA HIDEST X /KEEP SAME ORDNO AS REQS JST (MESGET) I /GET NEW MESS NO FOR MESS8 JMP HIPLT9 /MESS NO IN USE, WAIT STA HIH0 X 0"A"REQALL /SAVE IN HEADER STA (HITT 0 X) I /DEFEAT INC TRN LOGIC JMP HIPLTA HIPKT: 0 LDA HIXX I /COPY HEADER ADD (HEAD) STA HIT1 LDA HIH0 X STA HIT1 I IRS HIT1 LDA HIH1 X STA HIT1 I IRS HIT1 LDA HIH2 X STA HIT1 I IRS HIT1 LDA HIH3 X STA HIT1 I LDA (HIB1 0 XI) I /SAVE LENGTH SSP 0"A"TWOQ LDX HIXX I /LEAVE ROOM FOR CKSUM WRD STA BUFE X /SET UP TWOQ BIT AFTER CALL TO HIPK RDCLOK /SAVE TIME JMP .-1 STA IT X LDA HIP 0"A"INPCHN SSM 0"A"HSTMOD STA INCH X CRA STA 0 X /CLEAR CHAIN POINTER JMP HIPKT I HICKSM: 0 LDA (HICKAD) /GRAB ADDER IMA ADDRET /AND SAVE OLD OWNER STA HIAR LDA BUFE X SSP 0"A"TWOQ STA HICKT TCA ADD 0 ADD (ADDBOT+ACKH+1) STA HICKAJ SUB (ADDBOT+1) /-NO DF WORDS JMP HICKAJ I HICKAJ: BSS 1 HICKAD: TCA DEFPLC [NOP HERE TO TURN OFF H2I CHECKSUM GENERATION] STA HICKT I /STORE CHECKSUM LDA HIAR /PUT BACK OLD OWNER STA ADDRET JMP HICKSM I LEV VAR HICKT: BSS 1 /TEMP BUFE PTR /TOP OF PACKET LOOP LEV H2I DEFPLC [HI - WAITING FOR MIDDLE PACKET] HI25: JST HIPKT /SET UP HEADER AND BUFFER CONTROL W[ LDX HIP LDA (HITT 0 X) I SNZ /DID ALARM CLOCK GO OFF? JMP HIPSLO /YES HI26: LDA (HER 0 X) I STA .+1 BSS 1 /ERROR? JMP HI84 /NO LDA (CERROR) /YES, MARK MESS AS ERROR IN DATA HISUBC: ERA HILINK XI /PUT IN NEW SUB CODE ANA SEVEN 0"A"SUBCOD ERA HILINK XI /INTO PNTR TO LINK AND SUB CODE WOR[ STA HILINK XI LDX HIXX I LDA HEAD X ANA (0 0 177777"X"INCTRN) ERA (INCTRN) /SET INC TRN BIT STA HEAD X JMP H2TASK HI84: LDA HIDEST X /COUNT A PACKET OF THROUGHPUT JST (HTPPT) I LDA (EMFH 0 X) I STA HIEM1 HIEM1: BSS 1 /IS FOM SET? JMP .+2 /NO JMP HI87 /YES LDA HIH1 X /GET PACKET # ANA (PKTNO) ERA (PKTNO) SNZ /IS PKT NO=7 ? JMP HIPLNG /YES HI85: LDX HIXX I JMP H2TASK /NO HIPLNG: LDA ONE 0"A"CLONG JMP HISUBC /MARK MESS AS TOO LONG HIPSLO: LDA TWO 0"A"CSLOWS JMP HISUBC /MARK MESS AS TOO SLOW HI87: LDX HIXX I DEFSTAT LDA HEAD2 X, HS0 SSM 0"A"LSTPKT STA HEAD2 X H2TASK: JST HICKSM /CHECKSUM PACKET INH M2I STX ETQ I /PUT PACKET ON MIDDLE TASK QUEUE STX ETQ TASK /POKE TASK INTERRUPT H2TSKS: JST (HIWM) I RET H2I DEFPLC [HI - WAITING FOR TASK TO TAKE A PKT] JMP H2TSKS /NO ACTION YET JMP HI85 /TASK REFUSED IT JMP (HIDB) I /TASK TOOK IT LEV CON CONSTANTS PAGEND 14,UNCON,4 LEV [T.O,TSK,BCK] LCK H2I /PENDING PACKET TABLE SUBROUTINES - LOCK INTERRUPTS PPTGET: 0 /GET AN ENTRY FROM PPT STA PPWANT /MATCH ON MESSNO AND IMPNO IN A LDA (-PPTL) STA PPTRY LDA (PPT) STA PPSLT PPTL1: LDA PPSLT I /LOOK AT NEXT SLOT SNZ /IS THIS SLOT OCCUPIED? JMP PPTN1 /NO STA 0 /YES, SO LOOK FOR MATCH LDA HEAD X CAR 0"A"MESSNO ERA HEAD1 X ANA (0 0 177777"X"DESTI) ERA HEAD1 X ERA PPWANT SZE /MATCH ON MESSNO+IMPNO? JMP PPTN1 /NO LDA PPSLT /RETURN PNTR TO PPT PNTR IN AC IRS PPTGET /SKIP=SUCCESS JMP PPTGET I PPTN1: IRS PPSLT /GET NEXT SLOT IRS PPTRY JMP PPTL1 /LOOP BACK JMP PPTGET I /NO MATCH, NO SKIP LEV H2I PPTPUT: 0 /PUT AN ENTRY INTO PPT - PNTR IN X LDA HIP /TABLE IS PPTL DEEP FOR FAKE HOSTS ARS 2 TCA 0"A"NH /AND PPTL-1 DEEP FOR REAL HOSTS ADD (0 1-PPTL) STA PPTRY LDA (PPT) STA PPSLT PPTL2: LDA PPSLT I SZE /IS THIS SLOT FREE? JMP PPTN2 /NO STX PPSLT I /YES, SO PUT IN OUR PNTR LDA BUFE X SSM 0"A"TWOQ /MARK PACKET AS ON 2 QUEUES DEFSTAT STA BUFE X, HS4 LDA 0 ADD (HEAD3) LDX HIP IRS PPTPUT /SKIP=SUCCESS JMP PPTPUT I PPTN2: IRS PPSLT /GET NEXT SLOT IRS PPTRY JMP PPTL2 /LOOP BACK JMP PPTPUT I /NO ROOM, NO SKIP LEV [H2I,T.O,BCK] /TALLY TABLE SUBROUTINES - LOCK INTERRUPTS /ARG PASSED IN A, AND X PRESERVED TALLYG: 0 /GET AN ENTRY FROM TALLY STA TALLYT /IMPNO TO MATCH IN A STX TALLYX LDX (TALLY-1) TALLYK: IRS 0 LDA 0 CAS TALLYI /COMPARE WITH IN PNTR JMP TALLYR JMP TALLYR /NO MATCH, NO SKIP LDA 0 X ERA TALLYT SZE /IS THIS ENTRY ONE WE WANT? JMP TALLYK /NO, LOOP BACK LDA 0 ERA (TALLY) SNZ /DID WE JUST GRAB THE OLDEST ALLOCA STA (TALLYC) I /YES, SO RESET TALLY CLOCK TALLYM: LDA 1 X STA 0 X /MOVE REST OF TABLE UP BY ONE SLOT IRS 0 LDA 0 ERA TALLYI SZE /DONE YET? JMP TALLYM /NO, LOOP BACK LDA TALLYI /YES, NOW ADJUST IN PNTR SUB ONE STA TALLYI IRS TALLYG /SKIP=SUCCFSS TALLYR: LDX TALLYX /RESTORE X LDA TALLYT /RESTORE A JMP TALLYG I LEV VAR TALLYT: BSS 1 /TEMP A TALLYX: BSS 1 /TEMP X TALLYI: BSS 1 /IN PNTR PPSLT: BSS 1 /PNTR TO PPT ENTRY PPTRY: BSS 1 /NO OF TIMES TO LOOK PPWANT: BSS 1 /MESSNO + IMPNO WE WANT LEV [H2I,BCK] MESGET: 0 /GFT MESSNO, DEST IMP IN A STX MESGX STA MESGT SSP 0"A"PRIBIT ADD (TMESS) STA 0 LDA 0 X SLN 0"A"MESBTS JMP MESGND /MESS NO IN USE LDA MESGT SPL 0"A"PRIBIT /NEED A NEW ORD NO? JST UPORD /YES JST UPMESS ANA (MESSNO 0 ORDNO) ERA (TRNREP) /MARK AS TRANSMISSION IRS MESGET /SKIP=SUCCESS MESGND: LDX MESGX JMP MESGET I LEV VAR MESGT: BSS 1 MESGX: BSS 1 LEV [T.O,TSK,BCK] LCK H2I /PENDING LEADER TABLE SUBROUTINES - LOCK INTERRUPTS PLTGET: 0 /GET AN ENTRY FROM PLT STA PLWANT /MATCH ON MESSNO AND IMPNO IN A LDA (-PLTL) STA PLTRY LDX (PLT) PLTL1: LDA PLT0 X SNZ /IS THIS ENTRY EMPTY? JMP PLTN1 /YES CAR 0"A"MESSNO ERA PLT1 X ANA (0 0 177777"X"DESTI) ERA PLT1 X ERA PLWANT SZE /MATCH ON MESSNO+IMPNO? JMP PLTN1 /NO IRS PLTGET /SKIP=SUCCESS JMP PLTGET I /RETURN PNTR TO PLT ENTRY IN X PLTN1: IRS 0 /GET NEXT ENTRY IRS PLTRY JMP PLTL1 /LOOP BACK LDA PLWANT /RESTORE A JMP PLTGET I /NO MATCH, NO SKIP LEV H2I PLTPUT: 0 /PUT AN ENTRY INTD PLT LDA 0 /HOST NO IN A ERA (HIH0 0 X) I ANA (0 0 177777"X"MESSNO"X"REQALL) ERA (HIH0 0 X) I ERA (PLTUSE) /MARK PLT0 ENTRY IN USE STA PLTH /SAVE PLT0 ENTRY LDA (HIH1 0 X) I STA PLTH1 /SAVE PLT1 ENTRY LDA (HIH3 0 X) I STA PLTH3 /SAVE PLT2 ENTRY LDA (-PLTL) STA PLTRY LDX (PLT) PLTL2: LDA PLT0 X SZE /IS THIS ENTRY FREE? JMP PLTN2 /NO LDA PLTH /YES, SO PLANT PLT0,1,2 STA PLT0 X LDA PLTH1 STA PLT1 X LDA PLTH3 DEFSTAT STA PLT2 X, HS5 IRS PLTPUT /SKIP=SUCCESS PLTPX: LDA 0 ADD (PLT2) LDX HIP JMP PLTPUT I PLTN2: IRS 0 /GET NEXT ENTRY IRS PLTRY JMP PLTL2 /LOOP BACK JMP PLTPX /NO ROOM, NO SKIP LEV VAR PLTRY: BSS 1 PLWANT: BSS 1 PLTH: BSS 1 PLTH1: BSS 1 PLTH3: BSS 1 RALLYA: BSS 1 RALLYI: BSS 1 RALMRK: BSS 1 /RALLY TABLE SUBROUTINES LEV [I2H,TSK] RALLYP: 0 /PUT AN ENTRY IN RALLY TABLE STA RALLYA /A = MESSNO, ONEOR8, RFNM, SRCEI ANA (SRCEI) ADD (RALLY) STA RALLYI /SET UP INPUT PNTR LDA MINUS1 CAS 0 /X = REGULAR. INCOMPLETE, OR DEAD AOA /X=SIGN, DEAD AOA /X=MINUS1, INCOMPLETE AOA /X=0 OR X>0, REGULAR AOA /MAKE INTO 11, 10, OR 01 ALS 2 /SHIFT INTO POSITION STA RALMRK /AND SAVE AS MARK BITS LDA RALLYA ICL 0"A"MESSNO ANA THREE ALS 2 TCA ADD (ALR 0 STA RALPS1 /SET UP SHIFT STA RALPS2 LDA (17) RALPS1: BSS 1 ANA RALLYI I SZE /SOMETHING ALREADY THERE? JMP RALPX /YES, A BUG LDA RALLYA ARR 6 0"A"[ONEOR8 0 RFNM] ANA THREE /GET BITS ERA RALMRK /MARK GOT-IT BIT RALPS2: BSS 1 /SHIFT THEM OVER ERA RALLYI I /OR THE BITS IN STA RALLYI I STA RALLCF /COUNT AN ALLOCATE PENDING IRS RALLYP /SKIP=SUCCESS RALPX: JMP RALLYP I /FORMAT OF EACH RALLY WORD IS 4 4-BIT BYTES: A,B,C,D /THIS TABLE RUNS IN PARALLEL WITH AMESS, THE NEXT MESSAGE /NUMBER FOR WHICH A REPLY SHOULD BE RETURNED /BYTE A IS FOR AMESS=3 MOD 4, B FOR AMESS=2 MOD 4 /C= 1 MOD 4, D= 0 MOD 4 /FORMAT OF EACH 4 -BIT BYTE IS TTMM: /TT=00 NO ENTRY /TT=01 RFNM OR RFNM/ALLOCATE /TT=10 INCOMPLETE TRANSMISSION /TT=11 DESTINATION DEAD /FOR TT=10 OR TT=01: /MM=00 8 PKT ALLOCATE /MM=01 8 PKT RFNM/ALLOCATE /MM=10 1 PKT ALLOCATE /MM=11 1 PKT RFNM LEV [H2I,T.O,TSK,BCK] UPMESS: 0 /ADD ONE TO MESS NO LDA 0 X /PNTR TO MESS TAB IN X ANA (MESBTS) LGR 1 /SHIFT BITS ERA 0 X ANA (MESBTS) ERA 0 X ADD (MESS1) 0"A"MESSNO STA 0 X /INCREMENT MESS NO JMP UPMESS I UPORD: 0 /ADD ONE TO ORDER NO LDA 0 X /PNTR TO MESS TAB IN X ADD (20) 0"A"ORDNO ERA 0 X /INCREMENT ORDER NO ANA (ORDNO) ERA 0 X STA 0 X JMP UPORD I LEV FRE /PUT A TWO-WORD MESSAGE - LOCK INTERRUPTS /CALLED BY I2H,H2I,T.O,TSK,BCK OWPE: 0 STX HNUM STA ONEW LDA HNUM CAS PLNH /REAL HOST? JMP OWPF /NO NOP /TTY LIKE REAL HOST LDX (SHBQ) LDA MINUS4 STA TPEE JMP OWP4 OWP0: STA 0 IRS 3 X JMP OWP3 LDA MINUS1 STA 3 X OWP4: IRS TPEE /ALLOWED TO HAVE ANOTHER BUFFER? JMP OWP8 /YES OWP7: IRS OWPE /NO JMP OWP5 OWP8: LDA 0 X SZE JMP OWP0 LDA FREE I SNZ JMP OWP7 IMA FREE IRS NFS STA 0 X STA TPEE IMA 0 STA 1 X LDA (-17.) /(DECIMAL) STA OWT3 STA 3 X CRA STA 0 X LDA TPEE ADD FOUR STA 2 X JMP OWP1 OWPF: ERA SEVEN /DISCARD? SZE JMP OWPE I /NO. LDA (-300.) /YES, RESET SOFTWARE WDT. TO 3 MIN. STA WDTIME WDT /AND POKE THE HARDWARE JMP OWPE I OWP2: LDA 0 X OWP1: STA 0 ADD FOUR STA 0 X LDA TPEE STA 3 X IRS OWT3 JMP OWP2 LDX TPEE OWP3: LDA 2 XI IMA 2 X LDX HNUM STA EHWQ XI STA EHWQ X STA 0 CRA STA 0 X LDA ONEW STA 1 X LDA TWDP STA 2 X OWP5: LDX HNUM JMP OWPE I LEV VAR TPEE: BSS 1 HNUM: BSS 1 ONEW: BSS 1 OWT3: BSS 1 /SUBROUTINE TO GET FROM A QUEUE - LOCK INTEPRUPTS LEV [I2H,T.O,BCK] GETQ: 0 LDA 0 X SNZ JMP GETQ I /NOTHING ON QUEUE LDA 0 XI SNZ /IS THIS THE ONLY THING ON QUEUE? STX (QUEUEE-QUEUEB X) I /YES, MAKE END POINT TO IMA 0 X /REMOVE FROM QUEUE STA 0 CRA STA 0 X /CLEAR CHAIN POINTER IRS GETQ JMP GETQ I LEV CON CONSTANTS PAGEND 15,UNCON,4 /IMP TO HOST (IH) PAGI2H: LEV I2H H1OTIL/ IH0E H2OTIL/ TIPDEF IH1E,TINT H3OTIL/ IH2E H4OTIL/ IH3E PAGI2H/ /HOST 3 INTERRUPT ROUTINE IH3E: INT I2H STX IHX LDX IH3E STX IHSB LDX THREE JMP IHSB2 /HOST 2 INTERRUPT ROUTINE IH2E: INT I2H STX IHX LDX IH2E STX IHSB LDX TWO JMP IHSB2 /HOST 1 INTERRUPT ROUTINE IH1E: INT I2H STX IHX LDX IH1E STX IHSB LDX ONE JMP IHSB2 /HOST 0 INTERRUPT ROUTINE IH0E: INT I2H STX IHX /SAVE INDEX REGISTER LDX IH0E STX IHSB LDX ZERO /NOTE HOST WHICH CAUSED INTERRUPT JMP IHSB2 /FROM HERE ON IS COMMON TO ALL IMP-HOST INTERRUPT ROUTINES IHSB: 0 STX IHX IHSB2: DXA JMP . 1 STA IHA /SAVE AC INK STA IHK /SAVE EX-MODE STX IHP /SAVE CURRENT HOST LDA IHM /SET UP NEW INTERRUPT MASK (177700) SMK INTM /OUTPUT IT IMA PRIM /SAVE IT IN PRIM STA IHMS /SAVE OLD PRIM ENB I2H JMP IHLO XI /RESTART WHERE LAST LEFT OFF IHDB: 0 /DEBREAK LDA 0 SUB PLNH SPL JMP IHDO /REAL HOST - DO THE OCP LDA M30SEC /FAKE HOSTS ALWAYS GET 2 MINUTES ALS 2 STA IHTT X SKP /DON'T DO OCP FOR FAKE GUYS IHDO: BSS 1 LDA IHDB IHDONE: STA IHLO X LDA IHMS /RESTORE INTERPUPT MASK INH MSK SMK INTM STA PRIM EXA LDA IHK OTK /RESTORE EX-MODE LDX IHX /RESTORE IR LDA IHA /RESTORE AC ENB I2H JMP IHSB I LEV VAR / IHLO INDICATES WHAT ROUTINES DID LAST DEFPLC [IHLO] IHLO: BSS TH /RETURN ADDRESSES WHERE IH LEFT OFF IHA: BSS 1 /AC SAVE IHK: BSS 1 /K SAVE IHX: BSS 1 /IR SAVE IHMS: BSS 1 /OLD PRIM SAVE IHAR: BSS 1 /ADD RET SAVE /IMP-TO-HOST ROUTINES LOCAL STORAGE LEV CON IHED: H1FOUT /FINAL OUTPUT INSTRUCTIONS H2FOUT TIPDEF H3FOUT, NOP H4FOUT OWOP: OWO /PNTRS TO TWO WORD OUTPUT AREAS OWO+2 OWO+4 OWO+6 OWO+10 IHB1: H1OTBP /DMC OUTPUT PNTRS H2OTBP TIPDEF H3OTBP, TIPLNK H4OTBP IHBB IHBB+1 IHBB+2 IHBB+3 IHB2: H1OTBP+1 /DMC OUTPUT END PNTRS H2OTBP+1 TIPDEF H3OTBP+1, TIPLNK+1 H4OTBP+1 IHBC IHBC+1 IHBC+2 IHBC+3 LEV VAR /IN IHSP: /0 ==> NOTHING IS GOING OUT /100000 ==> LEADER ONLY (2-WRD MSG) GOING /2000-37777 ==> PACKET 1S GOING OUT /102000-137777 ==> PACKET WITH BAD CKSUM IS GOING OUT IHSP: BSS TH /SAVED BUFFER POINTERS IHWQ: BSS TH /SAVED QUEUE POINTERS IHLSTP: BSS TH /MINUS IF LAST PKT DEFPLC [IH - 2 WORD OUTPUT AREA] OWO: BSS [[NH+1]"T"2] /TWO WORD OUTPUT AREA LEV BCK LCK INI /INITIALIZATION ROUTINE IHIN: 0 CRA STA IHSP X STA IHB1 XI /FOR FAKE HOSTS STA IHSB /IN CASE NON-DXA IMP RELOADS FROM 1 SSM /BLOCK INPUT! STA (HINWAT 0 X) I LDA (IHBEG) JST IHST JMP IHIN I LEV I2H IHS1: 0 /DISCARD BUFFERS FROM QUEUE ADD IHP STA IHT2 ADD (NHS+0-SHQ) STA IHT3 LDA IHP ERA SEVEN SNZ /DISCARD? JMP IHS1 I /YES, DO NOT DISCARD DISCARD IHS1A: LDA IHT2 I SNZ /ANYTHING ON THIS QUEUE? JMP IHS1 I /NO, QUIT STA 0 LDA IHS1F /=0, FLUSH ALL, ELSE, FLUSH TIMEOL' SNZ /DISCARD ALL? JMP IHS1B /YES LDA TIMES /GFT TIME IN SLOW TICKS SUB INCH X /NO, CHECK TIME SPL /TOO OLD? JMP IHS1C /NO, SO SAVE TIME LEFT LDA IHP SUB PLNH SMI /FAKE HOST? JMP IHS1 I /YES, HAVE MERCY IHS1B: LDX IHT2 JST (GETQ) I JMP IHS1 I /SHOULDNT HAPPEN JST (IHS5) I IRS IHT3 I JMP IHS1A IHS1C: CAS IHS1F /PICK MIN TIME LEFT STA IHS1F /FOR OLDEST PKT ON PRI OR REG QUEUE NOP /IF NOTHING THERE, USE 30 SECS JMP IHS1 I LEV T.O /RESTART ROUTINE IHST: 0 /HERE AT INIT AND WHEN HOST READY DT STA IHLO X /THROW AWAY ALL MESSAGES INH SIN EXA /BUT DO NOT FLAP IMP'S READY LINE JST IHSB RET T.O INH ALL JST DODXA I RET T.O JMP IHST I LEV VAR IHT2: BSS 1 /TEMP IHT3: BSS 1 /TEMP IHS1F: BSS 1 /0=FLUSH ALL, ELSE=FLUSH TIMEOUTS /ALSO KEEPS ALARM CLOCK TIME FOR [ 1 IHTT: BSS TH /TIME OUT CHECK FLAGS LEV CON HENABT: H1ENAB H2ENAB H3ENAB H4ENAB LEV I2H IHW640: 0 /SUBR TO WAIT 640 MS STA .+1 /SET UP READY LINE OCP BSS 1 /DO IT LDA MINUS1 /AND WAIT 640 MS FOR RELAY TO SETTL1 STA IHTT X LDA IHW640 JMP IHDONE IHBEG: LDA PTICKS /A LITTLE MORE THAN TWICE PTICKS SUB SEVEN ALS 1 /WAIT FOR LINES TO COME UP AND ROUT STA IHTT X LDA (IHWAIT) JMP IHDONE IHWT1: LDA (NOP) JST IHW640 DEFPLC [IH - WAITING FOR INITIALIZATION DELAY] IHWAIT: LDA RUT+BBNIMP SPL 0"A"RUTDED /IS NCC UP YET? JMP IHWT2 /NEVER COMING UP...GO AHEAD ANA (RUTCMU) /COMING UP? SZE JMP IHWT1 /YES, WAIT SOME MORE IHWT2: LDA THREE 0"A"HSTOFF /OK, START UP HOSTS JMP IHR11 /HOLD DOWN RDY FOR 60 SECS AT INIT IHR2: LDA 0 /HERE TO FLUSH ALL/FLAP READY LINE SUB SEVEN /DON'T FLUSH STUFF ON DISCARD QUEUE SNZ JMP (IH62) I STA (HINWAT 0 X) I /DISCARD STUFF ON OTHER O1 LDA TWO 0"A"HSTTRD IHR11: STA HIHD X /MARK HOST AS TARDY (DEAD) IHR1: JST (OWGE) I /HERE TO FLUSH ALL/NO READY LINE FL SKP /THROW AWAY ALL 2 WORD MESSAGES JMP IHR1 CRA /FLUSH BUFFER CURRENTLY IN INTERFACI STA IHB2 XI STA IHB1 XI IMA IHSP X SSP /IF 0, NOTHING GOING SNZ /IF SIGN BIT ONLY, TWO WORD GOING JMP IS40 /IN EITHER CASE, NOTHING TO FLUSH IRS NREA STA IHS1F /SAVE PKT PNTR IN TEMP LDA IHLSTP X /PICK UP LST PKT BIT LDX IHS1F /GET PKT PNTR STA HEAD2 X /AND RESTORE LST PKT BIT TO PKT JST (IHS5) I IS40: CRA /SET TO DISCARD ALL BUFFERS ON QU[ STA IHS1F LDA (SHQ) /GET REGULAR QUEUE JST IHS1 LDA (SHPQ) /GET PRIORITY QUEUE JST IHS1 LDX IHP LDA 0 SUB PLNH SMI /FAKE HOST? JMP IS30 /YES, DO NOT DROP READY LINE LDA (HINWAT 0 X) I /WE BLOCKING INPUT? SNZ JMP IS30 /NO, DON'T DROP READY LINE LDA (HUNXPT 0 X) I JST IHW640 /WAIT FOR 640 MS DEFPLC [IH - WAITING FOR READY LINE TO DROP] LDA HENABT X JST IHW640 /WAIT FOR 640 MS DEFPLC [IH - WAITING FOR READY LINE TO GO UP] IS30: LDA MINUS3 STA IHT2 IS10: ENB I2H LDA (CNOP) INH FRE JST OWP I /PUT 3 NOPS ON HOST TWO WORD QUEUE NOP IRS IHT2 JMP IS10 LDA (CRESET) JST OWP I /PUT AN IMP-TO-HOST RESET MESS ON ' NOP ENB I2H CRA /RELEASE INPUT STA (HINWAT 0 X) I IH00: LDA (NOP) JST IHW640 RET I2H DEFPLC [IH - NOTHING TO DO] IH1: LDA M30SEC /SET TO DISCARD TIMED-OUT BUFFERS STA IHS1F /AND SAVE TIME LEFT ON OLDEST LDA (SHQ) JST IHS1 /CHECK REG QUEUE FOR OLD MESS LDA (SHPQ) JST IHS1 /AND PRI QUEUE ALSO LDX IHP JST (OWGE) I /IS THERE ENTRY ON ONE WORD QUEUE JMP IH2 /NO STA OWOP XI /(OWO+2*IR) PUT WORD IN OUTPUT ARE LDA OWOP X /GET POINTER TO FRONT OF AREA STA IHB1 XI /BUILD FIRST BUFFER CONTROL WORD DEFSTAT AOA,HS3 STA IHB2 XI /BUILD SECOND BUFFER CONTROL WORD STA IHSP X LDA TWDG STA IHSP XI /PUT OUT SECOND WORD LDA IHED X STA IHDO /DO OUTPUT + END LDA SIGN STA IHSP X STA IHLSTP X /SO SUCK AND TIP WILL WORK PROPER1 LDA IHS1F /USE MIN TIME LEFT FOR PKTS ON QUEU STA IHTT X /OR 30 SECS IF BOTH QUEUES EMPTY JST IHDB / WAITING FOR INTERRUPT AFTER OUTPUT OF 2 WORD MESSAGE DEFPLC [IH - SENDING 2 WORD MSG] CRA STA IHB1 XI STA IHSP X LDA IHTT X SNZ /DID HARDWARE INTERRUPT? JMP IHR2 /NO, ALARM CLOCK WENT OFF- HOST TAR JMP IH1 /YES, NORMAL OUTPUT COMPLETE IH2: LDA SHPQ X /IS THERE SOMETHING IN THE PRIORITY SNZ JMP .+3 /NO LDA (SHPQ) JMP IH19 LDA SHQ X /IS THERE SOMETHING IN THE REGULAR SNZ JMP IH00 LDA (SHQ) IH19: ADD 0 STA IHWQ X /SAVE POINTER TO QUEUE LDA TWO 0"A"[DATA-HEAD2] STA (FPSW 0 X) I IH21: LDA IHWQ XI STA IHSP X /SAVE POINTER TO BUFFER LDA IHWQ X STA 0 LDA 0 XI /UPDATE QUEUE START POINTER STA 0 X SNZ /IS THIS LAST ENTRY ON QUEUE STX (EHQ-SHQ X) I /MAKE START PTR POINTED TT IRS NHS-SHQ X LDX IHP LDX IHXX I LDA (IHCKAD) IMA ADDRET STA IHAR LDA 0 SUB BUFE X ADD (ADDBOT+ACKH) SSP 0"A"TWOQ STA IHCKAJ SUB (ADDBOT) /-NO OF WORDS JMP IHCKAJ I IHCKAJ: BSS 1 IHCKAD: SZE JMP IHBAD LDA IHAR STA ADDRET JMP (IHNOCK) I IHBAD: IMA IHAR /TEMP FOR CKSUM ERROR STA ADDRET /AND RESTORE OWNER LDA IHP ERA SEVEN DEFPLC [NOP HERE TO TURN OFF I2H CHECKSUM CHECK] SNZ JMP (IHNOCK) I /DON'T REPORT DISCARD ERRORS LDA IHAR INH ALL DEFHLT [HOST OUTPUT DETECTED INTRA-IMP CKSUM ERROR] JST .+1 /NOW TRAP TO NCC 0 JST HLTNCC I ENB I2H LDX IHP LDA IHSP X SSM /FLAG PACKET TO GO TO DIAGTT STA IHSP X SSP JMP (IHNOC2) I /AND CONTINUE ANYWAY LEV CON CONSTANTS PAGEND 16,UNCON,4 LEV CON IHOT: H1ROUT /REGULAR OUTPUT INSTRUCTIONS H2ROUT TIPDEF H3ROUT, NOP H4ROUT LEV I2H /MORE IMP-TO-HOST CODE IHNOCK: LDX IHP LDA (IHSP 0 X) I IHNOC2: ADD (DATA) SUB FPSW X /BUILD FIRST BUFFER CONTROL WORD STA (IHB1 0 XI) I LDX IHXX I RDCLOK JMP .-1 STA ST X CRA STA 0 X /CLEAR CHAIN PNTR LDA BUFE X SSP 0"A"TWOQ SUB ONE /STRIP CHECKSUM/DUMMY WRD LDX IHP STA (IHB2 0 XI) I /MAKE SECOND BUFFER CONTR IRS NRES /UPDATE REASSEMBLY COUNT LDX IHXX I LDA HEAD2 X /TURN OFF BITS FOR HOSTS ANA (FRMIMP 0 FRMOCT SRCEHI) IMA HEAD2 X 0"A"[LSTPKT 0 ENDBIT] LDX IHP STA (IHLSTP 0 X) I /SAVE LAST PKT FLAG SPL 0"A"LSTPKT /IS THIS LAST PACKET OF M JMP IH4 /YES LDA IHOT X SKP IH4: DEFSTAT LDA (IHED 0 X) I, HS1 STA (IHDO) I /DO OUTPUT JST IH6 LDA (IHLSTP 0 X) I JST (HTPPF) I /COUNT A PACKET OF THROUGHPUT LDA (IHLSTP 0 X) I SMI /DID WE JUST PUT OUT LAST PKT? JMP (IH21) I /NO JST (HTPMF) I /COUNT A MESSAGE OF THROUGHPUT JMP (IH1) I /YES LEV I2H /MORE DF IMP-TO-HOST IH6: 0 /SEND OUT A PKT LDX IHXX I LDA TIMES /GET TIME IN SLOW TICKS SUB INCH X LDX IHP STA (IHTT 0 X) I SPL JMP IH62 /SOME TIME LEFT - GO USE IT LDA 0 /RUN OUT - FAKE HOST? SUB PLNH SPL JMP (IHR2) I /NO - HAVE NO MERCY IH62: JST (IHDB) I DEFPLC [IH - SENDING OUT A PKT] CRA STA (IHB1 0 XI) I LDA (IHTT 0 X) I SNZ /DID HARDWARE INTERRUPT? JMP (IHR2) I /NO, ALARM CLOCK WENT OFF - HOST TA LDX IHXX I /YES, NORMAL OUTPUT COMPLETE LDA PTRT X INH M2I SZE /MUST WE TRACE HIM? JST (TRCDUN) I /YES LDX IHP /MUST FOLLOW TRCDUN CALL ENB I2H CRA IMA FPSW X /RESET FIRST PKT SWITCH LDX IHXX I SZE /IS THIS THE FIRST PKT? JMP IH63 /YES IH6F: LDX IHP CRA IMA IHXX I /CLEAR OUT IHSP STA 0 INH FRE SPL JMP IH6B /WAS BAD PACKET. PUT ON DIAG Q JST FLUSHI I /FLUSH PACKET IH6F1: LDX IHP JMP IH6 I IH6B: SSP IMA DIAGQ /PUT ON DIAG Q STA 0 X JMP IH6F1 LEV VAR FPSW: BSS TH /FIRST PACKET SWITCH IH6INC: BSS 1 /MINUS IF RFNM IS FOR INC TRN LEV I2H IH63: LDA HEAD1 X /THIS CODE IS FOR MULTI-PKT MESS FO: ANA (PKTNO) /THAT WAS ON IH Q TOO LONG IN MID. ] SZE /IS THIS FIRST PACKET? JMP IH6F /NO, THE RFNM HAS BEEN SENT ALREADY LDA HEAD X /NORMAL CASE, SEND BACK RFNM-ALLOC ANA (INCTRN) SZE LDA MINUS1 STA IH6INC LDA HEAD X ANA (MESSNO 0 ONEOR8) ERA (RFNM) ERA HEAD2 X ANA (0 0 177777"X"SRCEI) ERA HEAD2 X LDX IH6INC /SET UP AS INCTRN OR NOT JST (RALLYP) I /PUT IN RALLY TABLE NOP /ENTRY ALREADY THERE - BAD JMP IH6F LEV I2H IHS5: 0 LDA HEAD X ANA (0 0 177777"X"INCTRN) ERA (INCTRN) STA HEAD X STX EHQ+NH+3 I STX EHQ+NH+3 IRS NHA+NH+3 JMP IHS5 I /ROUTINE TO GET WORD OFF ONE WORD MESSAGE QUEUE TO HOST /CALLING SEQUENCE /INDEX REGISTER CONTAINS HOST NUMBER / JST OWG I / / LEV I2H OWGE: 0 STX OWGY LDA SHWQ X /GET START OF HOST ONE WORD QUEUE SZE JMP OWGL /RETURN IF NOTHING ON QUEUE OWGX: LDX OWGY LDA OWGA /GET DATA IN AC JMP OWGE I /RETURN OWGL: STA OWGS /SAVE START OF QUEUE FOR LATER USE LDA 0 CAS PLNH /REAL HOST? JMP OWGX /NO NOP /TTY LIKE REAL HOST IRS OWGE /PREPARE TO TAKE SECOND RETURN LDX OWGS /PUT START OF QUEUE IN INDEX REGI[*1 LDA 1 X STA OWGA LDA 2 X STA TWDG LDA 3 X /GET POINTER TO POINTER TO HEAD OF STA OWGT /SAVE FOP LATER USE LDX OWGY /GET HOST NUMBER LDA SHWQ XI STA SHWQ X /UPDATE QUEUE POINTER SZE JMP OWG1 LDA (SHWQ) ADD 0 STA EHWQ X /IF QUEUE NOW EMPTY FIX THINGS OWG1: LDX OWGT /GET POINTER TO HEAD OF BUFFER LDA 2 X /GET FREE STORAGE POINTER FOR THIS I STA OWGS I LDA OWGS /PUT THREE WORD BLOCK ON FREE STORA1 STA 2 X LDA 3 X /GET FREE BLOCK COUNT SUB ONE STA 3 X /UPDATE FREE BLOCK COUNT CAS (-18.) /IS BUFFER EMPTY JMP OWGX /IF NO, RETURN LDA 1 X /IF YES, PUT IT ON FREE LIST ADD 0 X SUB (SHBQ) /CHECK FOR LAST BUFFER ON QUEUE SNZ JMP OWGX /IF YES, RETURN LDA 0 X /TAKE BUFFER OUT OF USE FOR ONE WORI STA 1 XI LDA 1 X IRS 0 X STA 0 XI CRA 0"A"TWOQ STA BUFE X INH FRE JST FLUSHI I ENB I2H JMP OWGX LEV VAR OWGY: BSS 1 OWGA: BSS 1 OWGS: BSS 1 OWGT: BSS 1 LEV ALL /CALLED BY VDI,T.O,TSK,PCK .DODXA: 0 /DISABLE EXTENDED ADDRESSING DXA /CALLED WITH INTERRUPTS LOCKED ENB ALL /RETURNS WITH INTERRUPTS ENABLED JMP .DODXA I /IMP TO FAKE HOST (SUCK) /SIMULATE IMP-TO-HOST INTERFACE HARDWARE FOR FAKE HOSTS: /1- IF THE DMC OUTPUT AND OUTPUT END POINTERS CROSS, / GIVE OUTPUT COMPLETED INTERRUPT /2- FETCH NEXT WORD THROUGH THE DMC OUTPUT POINTER /3- INCREMENT THE DMC OUTPUT POINTER, AND IF THE POINTERS C'1 / AND IF THIS IS A FINAL OUTPUT, SET THE LAST BIT INDICATOI /4- SEND THE WORD TO THE HOST /5- GO TO 1 /IHBB SERVES AS THE DMC OUTPUT POINTER /IHBC SERVES AS THE DMC OUTPUT END POINTER /CALLING SEQUENCE /FAKE HOST NUMBER IN X REG - 0=TTY,1=DDT.2=PARAM CHANGE,3=DI1 /JST SUCK - GET NEXT WORD FROM IMP FOR THIS FAKE HOST / - IMPLICIT BACKGROUND WAIT UNTIL WORD IS READY /R1 - WORD IN A REG /R2 - WORD IN A REG IS LAST WORD OF CURRENT MESSAGE LEV BCK SUC: 0 SUC1: LDA IHBB X /IS THERE ANY OUTPUT TO GO? SNZ JMP SUC2 /NO, WAIT ONE BACKGROUND LOOP SUB IHBC X CAS ZERO /HAVE PNTRS CROSSED? JMP SUC4 /YES JMP SUC3 /ALMOST, THIS IS LAST WORD IN BUFFE1 SUC5: LDA IHBB XI /FETCH NEXT WORD FROM OUTPUT PNTR IRS IHBB X /INCREMENT OUTPUT PNTR JMP SUC I /NOW RETURN WITH DATA SUC3: LDA (IHLSTP+NH X) I /YES SPL 0"A"LSTPKT /IS THIS THE LAST PKT? IRS SUC /YES, SO GIVE SKIP RETURN=LAST BIT JMP SUC5 SUC2: LDA SUC STA SUCT X /SAVE RETURN ADDRESS JST WAIT I /COROUTINE RETURN TO BACKGROUND DEFPLC [SUCK CALL TO WAIT] LDA SUCT X STA SUC /RESTORE RETURN ADDRESS JMP SUC1 SUC4: STX SUCX /YES, SO INTERRUPT ON OUTPUT COMPLE LDA 0 ADD PLNH STA 0 /SET UP X REG FOR THIS FAKE HOST INH SIN /SOFTWARE INTERRUPT IMP-TO-HOST EXA JST (IHSB) I RET BCK INH ALL JST DODXA I RET BCK LDX SUCX JMP SUC1 /NOW GO BACK FOR MORE OUTPUT LEV VAR IHBB: BSS FH /DMC OUTPUT PNTRS FOR FAKE HOSTS IHBC: BSS FH /DMC OUTPUT END PNTRS FOR FAKE HOE : SUCX: BSS 1 DEFPLC [SUCT] SUCT: BSS FH /TABLE OF RETURN ADDRESSES LEV CON CONSTANTS PAGEND 17,UNCON,4 TO: LEV T.O CLOKIL/ TO TO/ INT T.O /TIMEOUT INTERRUPT ENTRANCE DXA JMP . 1 STX TOT IRS TOSLOW /IS THIS REALLY A SLOW TICK? JMP TO1 /NO LDX (-25.) /YES, RESET CLOCK STX TOSLOW /EVERY 25TH TICK LDX ONE SKP TO1: LDX ZERO /CHOOSE APPROPRIATE X STA TOA X /SAVE AC LDA TOM X SMK INTM IMA PRIM STA TOMK X INK STA TOCK X LDA TOT STA TOX X LDA TO /SAVE RETURN STA TOC X IRS TIME /COUNT LOCAL TIME NOP IRS SYNC /COUNT GLOBAL TIME NOP WDT /** TAKE THIS AWAY WHEN ALGORITHM ' JMP TOS XI LEV T.O TOR: INH MSK LDA TOC X STA TO LDA TOX X STA TOT LDA TOMK X SMK INTM STA PRIM EXA LDA TOCK X OTK LDA TOA X LDX TOT ENB T.O JMP TO I LEV BCK LCK INI TOI: 0 /TIMEOUT INITIALIZATION LDA MICH STA HTPAR LDX ZERO TOIL: CRA STA (E123 0 X) I /CLEAR LINE ERROR LDA TWO STA RMBIT X /TIMER BIT FOR VAR FRQ RM'S LDA (1000 SHD RMINIT) /101006, 50 KB LINE FULL 1 STA (RMFLG 0 X) I /AND INIT FLAG IN EACH RM] LDA (RMCLKS+2) /POINT ALL LINES AT 50KB TIME STA (RMCLKP 0 X) I LDA PTICKS STA (LINDT 0 X) I LDA MINUS1 STA LTR X TOIL2: JST DEDL /SET SLT MINUS, KILL LINE IRS 0 IRS HTPAR /ENDS UF BY SETTING HTPAR TO 0 JMP TOIL LDA MINUS1 STA TOSLOW /START WITH SLOW TICK STA HLNM /CLEAR HOST INTERFACE TEST STA (HLNMS) I STA (RTSSNT) I STA TALLYC /DO THIS OR BACK2 WONT WORK RIGHT STA (RALTRY) I STA (GODWNC) I STA (COMUPC) I STA (MESST) I /THIS CODE IS TO START ALL LINES W/ROUTING MSG SYNC-ED W/SLO STA RMCLKS+NSPD-1 LDA MINUS2 LDX (-NSPD+1) TOIL1: STA RMCLKS+NSPD-1 X IRS 0 JMP TOIL1 CLKON JMP TOI I LEV VAR TOSLOW: BSS 1 TOK: BSS 1 TOT: BSS 1 TOA: BSS 2 TOCK: BSS 2 TOX: BSS 2 TOC: BSS 2 TOMK: BSS 2 LEV CON TOM: -4 /LOCK OUT T.O IN JOBF -4 /ENB T.O IN JOBS **TEMP NOT** TOS: JOBF JOBS LEV T.O JOBF1: LDA TOM /DONE WITH SLOW TICK SMK INTM STA PRIM /LOCK OUT T.O LDX ONE /REMEMBER IT IS A SLOW TICK /FAST TIMEOUT JOBS - RESTART EVERYBODY JOBF: STX TOK /SAVE TYPE OF TICK JST RSTOUT /MUST PRECEDE IMTC JST IMTC RET T.O /ATTEMPT TO RESTART MODEI JST HITC /ATTEMPT TO RESTART HOST INS JST (SWCH) I /MONITOR THINGS JST TALLYB /TIME OUT OLDEST ALLOCATE WE HAVE LDX TOK JMP TOR TALLYB: 0 /BUMP TALLY CLOCK EVERY 25 MS LDA (TALLY) ERA (TALLYI) I SNZ /IS THE TALLY TABLE EMPTY? STA TALLYC /YES, HOLD TALLYC AT 1 WHILE QUIESC IRS TALLYC /BUMP TALLY CLOCK NOP /IN CASE BACK ISNT GOING JMP TALLYB I LEV VAR TALLYC: BSS 1 /TALLY CLOCK - COUNTS FROM 0 TO 5 LEV T.O RSTOUT: 0 IRS RMCLKS /CHECK TO SEND ROUTING MSGS SKP /...RUN CLKS FOR EACH POSS LINE SPD JMP RSTR50 /2 SLOW TICKS IRS RMCLKS+1 SKP JMP RSTR25 /RESET (1 SLOW TICK) IRS RMCLKS+2 SKP JMP RSTR5 /5 FAST TICKS [RMCLKS+3 IS FAST T.O RSTR0: LDX MICH LDA MINUS1 RSTO2: CAS (RMCLKP+CH XI) I /TIME UP TEST SKP JMP RSTO4 /YES, DO ROUTING CHECK RSTO3: IRS 0 /NO, GO TO NEXT LINE JMP RSTO2 JMP RSTOUT I /DONE RSTO4: LDA RMBIT+CH X /ADVANCE BIT POINTER ARR 1 SPL /TIME TO WRAP? LDA (20) /YES, RESET TO 5TH BIT STA RMBIT+CH X ANA (RUTFRQ+CH XI) I /GET RIGHT BIT OUT OF RI 1 SNZ /TIME TO SEND ROUTING? JMP RSTO5 /NO, GO TO NEXT LINE SLZ JMP RSTDL RSTO6: INH I2M /SEND ROUTING LDA SLT+CH X SNZ /NO ROUTING IF HELD DEAD OR BUSY LDA TWO /ALWAYS SEND NULL W/ROUTING STA SLT+CH X ENB T.O RSTO5: LDA MINUS1 /ON TO NEXT LINE JMP RSTO3 RSTR50: LDA (-50.) STA RMCLKS RSTR25: LDA (-25.) STA RMCLKS+1 RSTR5: LDA MINUS5 STA RMCLKS+2 JMP RSTR0 RSTDL: STX RSTDT /SAVE X LDA 0 SUB MICH /CONVERT NEG X TO POS X STA 0 JST DEDL /CALL DEDL FOR HELLO-IHY AT BASIC * LDX RSTDT /RESTORE X JMP RSTO6 LEV VAR RSTDT: BSS 1 /TEMP X RMCLKS: BSS NSPD /1 CLOCK/SPD RMBIT: BSS CH /5 BIT ROTATE BIT 1/LINE LEV T.O IMTC: 0 /WAKE UP IDLE MODEMS LDX ZERO LDA MICH /DO FOR ALL MODEMS STA IMTK IMTCL: INH SIN LDA NONE X /CHECK STATUS OF MODEM SZE /WAITING FOR HARDWARE INTERRUPT? JMP I2MTC2 I2MTC0: JST (I2MSB) I RET T.O /NO, SO GIVE SOFTWARE INT] INH ALL JST DODXA I RET T.O I2MTC1: IRS 0 IRS IMTK JMP IMTCL JMP IMTC I LEV T.O LCK SIN I2MTC2: IRS NONE X JMP I2MTC1 JMP I2MTC0 LEV T.O HITC: 0 /TIMEOUT CHECK ROUTINE LDA MITH STA HITK /ATTEMPT TO WAKE UP ALL HOST-TO-IMP HITZ: LDA HITK ERA TIME /USE A RANDOM WAKEUP ORDER ANA SEVEN /TO FACILITATE RESOURCE SHARING STA 0 INH [SIN,H2I,TPC] LDA (HITT 0 X) I SZE /IS THIS HOST WAITING TO WAKE UP? IRS (HITT 0 X) I /YES, TIME TO WAKE HIM YF JMP HITZL /NO EXA /YES. SOFTWARE INTERRUPT HOST-TO-I' JST (HISB) I RET T.O INH ALL HITZL: JST DODXA I RET T.O IRS HITK JMP HITZ JMP HITC I LEV VAR HITK: BSS 1 IMTK: BSS 1 /TEMP COUNTER LEV T.O DEDL: 0 /INVESTIGATE FOR LINE STATUS LDA SLT X SPL /IS THIS LINE IN DEAD STATE? JMP HEL4 /YES, GO NO FURTHER CRA IMA (E123 0 X) I SNZ /DID WE GET ANY ROUTING MSGS? JMP DED1 /NO IRS SIHY X /YES, COUNT ONE AS AN HELLO IRS RTRCVD X /AND RETURN AN I-HEARD-YOU NOP DED1: IRS (RTSSNT 0 X) I /COUNT HELLO SENT NOP LDA LAC X /CHECK LINE ALIVE COUNT SNZ /DID WE GET AN I-HEARD-YOU? JMP NOC /NO INPUT ON THIS CHANNEL SUB ONE /YES, CAN ONLY GET ONE (TWO IN CAI' SZE /PER BASIC INTERVAL LDA ONE STA LAC X LDA LINE X SNZ JMP DED3 /LINE WAS ALREADY ALIVE IRS LTR X JMP DEDL I /NOT TIME TO BRING LINE UP YET CRA STA LINE X LDA NEIGHB X /FOR DETECTING PACKETS ON LOOPED LI SUB MINE ANA SIGN /1=I AM THE HIGHER NUMBER IMP ARR 6 0"A"ENDBIT STA (LEND 0 X) I /SAVE FOR USE IN PACKET DED3: LDA MINUS5 JMP HEL1 NOC: LDA LINE X SZE /WAS LINE ALIVE? JMP DED4 /LINE STILL IS DEAD IRS LTR X /CURRENTLY UP, SHOULD IT BE? JMP HEL3 /NOT TIME TO KILL LINE YET INH M2I JST (KILLIN) I ENB T.O HELD: LDA (LINDT 0 X) I STA (LEND 0 X) I /MARK LINE DOWN HEL0: STA LINE X HEL1: STA LTR X JMP DEDL I DED4: LDA LTR X /LINE IS DEAD CAS (LINDT 0 X) I /IS IT AT MAX DEAD COUNT? SUB ONE /NOT YET. COUNT DOWN JMP HEL0 /AND RETURN JMP HELD /PAST MAX!? RESET HEL3: LDA LTR X /LINE IS DYING CAS MINUS3 /IS IT TIME TO GIVE FAKE ROUTING? SKP /NO JST (RSTINP) I /YES,CALL ROUTING INPUT W/ DUMMY F JMP DEDL I HEL4: CAS (-KILTIM+1) /LINE HAS BEEN KILLED SKP /IS IT TIME TO GIVE FAKE ROUTING? JST (RSTINP) I /YES, CALL ROUT INPUT W/ DUMMY MSG JST JSRT JMP HELD LEV VAR LTR: BSS CH RTRCVD: BSS CH /COUNT OF HELLO'S RCVD LEV T.O JSRT: 0 LDA SIGN /TURN OFF I2MTC CLOCK WAKEUP STA NONE X /FOR DEAD OR NON-EXISTENT LINES LDA 0 ADD MICH CAS VDHNO SKP /IS THIS MODEM STOLEN BY VDH? JMP JSRT I /YES CAS MODNO JMP JSRT I /IS THIS MODEM STOLEN BY HOST? JMP JSRT I ADD (SATNO) I SNZ JMP SATGCI I IRS SLT X /YES, TIME TO START BRINGING IT UP? JMP JSRT I /NO INH I2M STX SENR JSRT2: LDA (SMPQ) JSRT3: JST JSRTS JSRT4: LDA (SMQ) JST JSRTS LDX SENR LDA (ACKTAB) STA RSEX X STA CHFREE X LDA I2MTAB X STA (I2MLST 0 X) I STA I2MEND X LDA (-NACH) STA I2MNXT X NACKL: CRA STA TSEX X /ZERO THIS - LOOP UNNECESSARY STA NONE X /ZERO THIS - LOOP UNNECESSARY IMA I2MEND XI STA 0 CAS (1777) JST RQSUB NOP /NOTHING THERE OR JUST A DUMMY LDX SENR IRS I2MEND X IRS I2MNXT X JMP NACKL LDA (JMP+0+1000+M2I0"A"777) STA (M2IOK 0 XI) I ENB T.O JMP JSRT I LEV VAR SATGCI: SATDEF [0 0 JSRT I] VDHNO: BSS 1 /0 FOR NO VDH, ELSE M.N-5 MODNO: BSS 1 /0=5 MODS, -1=4 MODS, -2=3 MODS SENR: BSS 1 LEV T.O LCK I2M JSRTS: 0 ADD SENR STA JSRTQ JSRTS1: LDX JSRTQ JST (GETQ) I JMP JSRTS I JST RQSUB JMP JSRTS1 RQSUB: 0 STX ERQ I STX ERQ IRS NSFS /TASK WILL FLUSH IF DEST WENT DEAD LDA PTRT X SNZ JMP RQSUB I STA 0 LDA (140000) ERA TDONE X STA TDONE X JMP RQSUB I LEV VAR JSRTQ: BSS 1 LEV CON CONSTANTS PAGEND 20,UNCON,4 LEV T.O LCK ALL /SLOW TIMEOUT JOBS JOBS: JST IHTC RET T.O /ATTEMPT TO RESTART HOST T JST DEDH /ESTABLISH HOST UP/DOWN STATUS JST JED /COMPUTE EFFECTIVE DELAY JST (RUTCLK) I /THESE FIRST FOUR SHOULD PRECEDE THE ROUTING COMPUTATION JST (RUTOUT) I /COMPUTE ROUTING JST HTEST /OCP INTERFACES IF NECESSARY JST HPOKE /TEST HOST INTERFACE JST DEDI /DEAD IMP CLEANUP - AFTER ROUTING C JST JUQC /ADJUST QUEUE COUNTERS ENB T.O JST MESSTO /TIMEOUT INCOMPLETE MESSAGE NUMBERS LDX (0 0 -ADDBOT-1+ADDTOP) /CHECK ADD CH: LDA (ADD BUFE+4 X) /BASIC INSTRUCTION ADDCH1: CAS (ADDBOT+1 X) I SKP /BAD SKP /GOOD RELOAD [ADD CHAIN BROKEN] JST SWDTIL I /BAD, GO RELOAD SUB ONE /MODIFY INSTR IN A IRS 0 JMP ADDCH1 LDA (JMP ADDRET I) /CHECK RETURN INSTR ERA (ADDBOT+1 X) I SZE RELOAD [ADD CHAIN RETURN BROKEN] JST SWDTIL I /BAD, GO RELOAD STA LUUP /BLINK LOOPED LIGHT VDH3: NOP /VDH TIMEOUT CALL INH ALL IRS TIMES /COUNT TIME IN SLOW TICKS IRS WDTIME /CHECK SOFTWARE W.D.T. JMP (JOBF1) I /NOW DO FAST STUFF. RELOAD [SOFTWARE WDT FIRED] JST SWDTIL I LEV T.O DEDI: 0 /TIMEOUT COMES HERE TO CLEAN UP LDA (TMESS) STA DMSTAB LDX ZERO IMPD: STX DEDIMP /NO OF IMP WHICH DIED LDA RUT X SMI 0"A"RUTDED /IS THIS IMP DEAD? JMP IMPD7 /NO, GO ON TO NEXT ONE LDX DMSTAB /FIRST CLEAN UP TRANSMIT SIDE INH ALL LDA 0 X ANA (MESBTS) ERA (MESBTS) SNZ /ARE THERE ANY OUTSTANDING MESSAGE JMP IMPD2A /NO, GO ON TO CLEAN UP OTHER THINGS LDA MINUS4 STA DEDTRY /LOOK AT 4 POSSIBLE MESS FOR DEAD 1 LDA 0 X SUB (0 0 3"T"400) 0"A"MESSNO STA 0 X /ROLL BACK 4 MESS NOS IMPD0: SLZ /IS THIS MESS NO WAITING FOR REPLY? JMP IMPD2 /NO CAR 0"A"MESSNO /YES, SO LOOK FOR IT ERA DEDIMP JST (PPTGET) I JMP IMPD1 /NOT IN PPT STA 0 /GOT IT IN PPT CRA IMA PPT0 X SSP 0"A"RETRAN STA 0 JST FLUSHI I /IF ON 2 QUEUES, RQSUB WILL FLUSH LDA HEAD3 X CAR 0"A"CIMPD STA TWDP LDA HEAD2 X JST (HOSTNO) I LDA HEAD1 X JMP IMPDP IMPD1: LDA DMSTAB I CAR 0"A"MESSNO ERA DEDIMP JST (PLTGET) I JMP IMPD2 /MUST HAVE BEEN A GIVE BACK STA 0 CRA IMA PLT0 X /CLEAR PLT ENTRY ANA SEVEN STA IMPDLH LDA PLT2 X CAR 0"A"CIMPD STA TWDP LDA PLT1 X IMPDP: ANA (0 0 177777"X"LSTPKT"X"HICODE) ERA (CDESTD) /RETURN A DEST IMP DEAD LDX IMPDLH JST OWP I NOP IMPD2: LDX DMSTAB JST (UPMESS) I IRS DEDTRY JMP IMPD0 IMPD2A: LDA DEDIMP JST (TALLYG) I /FLUSH ALL ALLOCATES FROM HIM SKP JMP IMPD2A LDX (SHRQ) /NOW CLEAN UP RECEIVE SIDE IMPD3: LDA 0 X /GET ALL REAS BLOCKS BACK SNZ JMP IMPD3A JST DREAS JMP IMPD3 IMPD3A: LDX (MESSTK) /GET ALL MESSTK ENTRIES BACK IMPD4: LDA 0 X SNZ JMP IMPD6 /END OF MESSTK SPL /REAS BLOCK? JMP IMPD5 /YES STX DTEND STA 0 LDA HEAD2 X ERA DEDIMP ANA (SRCEI) SZE /FROM DEAD IMP? JMP IMPD4 /NO LDA 0 X /YES, REMOVE FROM MESSTK STA DTEND I JST FLUSHI I /AND FREE BUFFER IRS NRES /ADJUST REAS COUNT LDX DTEND JMP IMPD4 IMPD5: JST DREAS JMP IMPD4 IMPD6: LDX DEDIMP JST (MESINI) I ENB T.O IMPD7: IRS 0 IRS DMSTAB LDA 0 ADD MINIMP SPL /HAVE WE DONE ALL IMPS YET? JMP IMPD /NOT YET, CYCLE BACK JMP DEDI I LCK ALL DREAS: 0 /TRY TO FREE A REAS BLOCK SSP STX DTEND STA 0 LDA RID X ERA DEDIMP ANA (SRCEI) SZE /FROM DEAD IMP? JMP DREAS I /NO LDA 0 X /YES, REMOVE FROM MESSTK OR SHRQ STA DTEND I JST REASF /FREE REAS BLOCK AND PKTS LDX DTEND JMP DREAS I REASF: 0 /FREE REAS BLOCK AND ANY PKTS LDA 0 IMA RASF STA RASF I /RETURN REAS BLOCK TO REAS FREE LIS LDA (-8) 0"A"8PKTS STA INCN CRA STA RSF X LDA RMAX X SPL /DID WE GET LAST PKT? LDA SEVEN 0"A"8PKTS /NO AOA ADD NRES STA NRES /ADJUST REAS COUNT INCFRE: CRA IMA REAS X SNZ /DID WE GET THIS PKT? JMP INCNXT /NO STX INCX STA 0 /YES, SO FREE IT JST FLUSHI I LDX INCX INCNXT: IRS 0 IRS INCN JMP INCFRE JMP REASF I LEV VAR INCN: BSS 1 INCX: BSS 1 DEDIMP: BSS 1 /NO OF A DEAD IMP DMSTAB: BSS 1 /PNTR TO HIS TMESS TABLE DEDTRY: BSS 1 DTEND: BSS 1 /TEMP Q PNTR IMPDLH: BSS 1 LEV T.O DEDH: 0 /TEST FOR DEAD HOSTS LDA MITH STA DHC LDX ZERO TDH1: LDA SKST X STA TDH4 INH [I2H,H2I] LDA HIHD X TDH4: BSS 1 ADD (TDHDN-0-TDHUP) /READY LINE DOWN ADD (JMP TDHUP 0 I) /READY LINE DOWN STA .+1 BSS 1 TDHUP: TDH5 /STEADY-STATE UP TDH5 /READY LINE UP, HOST GOING DOWN TDH5 /READY LINE UP, HOST TARDY TDH3 /READY LINE JUST WENT UP, WAS DOWN TDH5 /IGNORE HOST IF IMP NOT UP TDHDN: TDH2 /READY LINE JUST WENT DOWN, WAS UP TDH5 /READY LINE DOWN, HOST GOING DOWN TDH2 /READY LINE JUST WENT DOWN, WAS T: TDH5 /STEADY-STATE DOWN TDH5 /IGNORE HOST IF IMP NOT UR TDH3: CRA STA HIHD X LDA IHXX I /NOW TRULY UP SNZ /IS THERE AN OUTPUT IN PROGESS? JMP TDH5 /NO LDA M30SEC /YES - MOST LIKELY A NOP STA (IHTT 0 X) I /GIVE FULL 30 SECS JMP TDH5 TDH2: LDA (IHWAIT) /HOST WENT DOWN, DO NOT DROP IMP RE JST (IHST) I RET T.O / CLEAR OUT HIS QUEUES TDH5: ENB T.O IRS 0 IRS DHC JMP TDH1 JMP DEDH I LEV VAR DHC: BSS 1 LEV VAR HLRCVD: 0 /= OF CORRECT RESPONSES /* COMPUTE OUR EFFECTIVE CHANNEL DELAY / S= 20L + (100+S) E/T WHERE T=20 /S' = [(L+5)(256/(20-E))-64] LEV T.O JED: 0 LDX MICH ED1: INH I2M LDA THREE STA PCED I LDA (-NACH) STA JEDC LDA I2MTAB+CH X STA JEDP JEDL: LDA JEDP I SZE IRS PCED I IRS JEDP IRS JEDC JMP JEDL ENB T.O IRS 0 JMP ED1 JMP JED I LEV CON PCED: CED+CH X LEV VAR JEDP: BSS 1 JEDC: BSS 1 LEV T.O IHTC: 0 /TIME OUT CHECK ROUTINE LDA MITH STA IHTK LDX ZERO /ATTEMPT TO WAKE UP ALL IMP-TO-HOST IHTY: IRS (IHTT 0 X) I /TIME TO WAKE HIM YET? JMP IHTZ /NO INH SIN /YES, SOFTWARE INTERRUPT IMP-TO-HOS EXA JST (IHSB) I RET T.O INH ALL JST DODXA I RET T.O IHTZ: IRS 0 IRS IHTK JMP IHTY JMP IHTC I LEV VAR IHTK: BSS 1 LEV T.O JUQC: 0 LDX (-COUNTL) QC1: INH ALL LDA COUNTA+COUNTL X SUB COUNTS+COUNTL X SMI /NEGATIVE JMP QC2 /NO DEFHLT [QUEUE COUNTER WENT NEGATIVE] JST CNTHLT CNTHLT: 0 JST HLTNCC I CRA /RESET COUNT TOT ZERO QC2: STA COUNTA+COUNTL X CRA STA COUNTS+COUNTL X ENB T.O IRS 0 JMP QC1 INH ALL IRS (SNTALL) I /ARE WE ALLOCATE-IDLE? JMP JUQC I /NO STA NALA /YES, FREE UP ALLOCATE STORE JMP JUQC I LEV T.O MESSTO: 0 /TIMEOUT MESS NO IN 34-51 SECS IRS MESST /TIME TO LOOK YET? JMP MESSTO I /NO LDX MINIMP MESST1: INH H2I LDA (TMESS+NIMP 0 X) I ANA (MESBTS) ERA (MESBTS) SNZ /ANY MESSAGES OUTSTANDING? JMP MESST2 /NOTHING TO TIME OUT LDA (TMESS+NIMP 0 X) I ANA (MSTO1 0 MSTO2) ERA (MSTO1 0 MSTO2) SNZ JMP MESST2 /ALREADY TIMED OUT LDA (MSTO1) ADD (TMESS+NIMP 0 X) I STA (TMESS+NIMP 0 X) I MESST2: ENB T.O IRS 0 JMP MESST1 LDA M30SEC /17 SECS ARS 3 ADD M30SEC ARS 1 STA MESST /BETWEEN LOOKS JMP MESSTO I LEV VAR MESST: BSS 1 HTOLD: BSS 1 HTINTF: BSS 1 LEV T.O HTEST: 0 HTMIN: NOP LDA (NOP) /RESET MXIN/NOP INSTRUCTION STA HTMIN LDA HTPAR ERA HTOLD SNZ JMP HTEST I /NO CHANGE, NOTHING TO DO LDA HTPAR ANA SEVEN /GET FUNCTION SNZ JMP HTX /FUNCTION ZERO?! STA 0 LDA HTPAR ARS 3 /GET INTERFACE ANA C77 STA HTINTF ADD HTTAB-1 X STA HT5 /CORRECT OCP LDA 0 CAS THREE JMP HT5 /HOST FUNCTION...DO IT SKP /MODEM UNPATCH...MORE TO DO JMP HT1 /MODEM OTHER...SET UP IN LDX HTINTF INH I2M LDA NONE-1 X /MODEM BUSY? SZE JMP HTEST I /YES, COME AGAIN HT1: LDA HTINTF /SET UP IN FOR NEXT T.O. TO DO ADD (M1IN-1) STA HTMIN HT5: BSS 1 ENB T.O HTX: LDA HTPAR /RESET HTOLD STA HTOLD JMP HTEST I LEV CON /HTPAR HAS VALUE DDF - DEVICE IS DD AND FUNCTION IS F /D=1,2,3,4,5 FOR MODEMS 1,2,3,4,5 (F=1,2,OR 3) /D=70,60,50,51 FOR HOSTS 1,2,3,4 (F=4,5,OR 6) HTTAB: M1LXP-1 /1 - LINE CROSSPATCH M1IXP-1 /2 - INTERFACE CROSSPATCH M1UNXP-1 /3 - UNPATCH (RESTORE) H1XP-70 /4 - CROSSPATCH HOST INTERFACE H1ENAB-70 /5 - ENABLE NORMAL HOST TRAFFIC H1UNXP-70 /6 - UNPATCH (CLEAR) HOST INTERFACE NOP /7 LEV T.O HPOKE: 0 /TEST HOST INTERFACE INH FRE LDA HLNM /TESTER TURNED ON? SPL JMP HPOKE2 /OFF STA 0 LDA SHWQ X /ROOM FOR ANOTHER TEST PROD? SZE JMP HPOKE2 /NO LDA HL2WD STA TWDP LDA (CNOP) JST OWP I IRS HLSNT /COUNT ANOTHER POKE HPOKE2: ENB T.O JMP HPOKE I LEV VAR HLSNT: BSS 1 LEV CON VDH3.: VD.TO SKST: H1RDY H2RDY TIPSKP: TIPDEF H3RDY, NOP H4RDY SKP SKP SKP SKP LEV CON CONSTANTS PAGEND 21,UNCON,4 LEV BCK /TROUBLE REPORTS TO NCC AT HOST 0 AT BBN TRBL: LDA (301) /*SEND TRBL REPT CODE STA NTRCKS /INIT THE CHECKSUM COUNTER JST (GIVE) I LDX (-NH) INH ALL /USING B REG - MUST LOCK INTERRUPT' NTR6: LDA HIHD+NH X SZE LDA SIGN CHS LLR 1 IRS 0 JMP NTR6 LRR NH ERA SWS /*SEND ANOMALY WORD - HOSTS + SWIT ] JST NTGIVE RET BCK IMA (RSFNCC) I /*SEND RESTART-RELOAD INDICATOR JST NTGIVE IMA HLTLOC /*SEND HALT PC REG JST NTGIVE LDA HLTA /*SEND HALT A REG JST NTGIVE LDA HLTX /*SEND HALT X REG JST NTGIVE LDX MINUS4 /*SEND COUNTS FOR NTR7: INH ALL /FREE, REAS, S+F, AND ALLOCATE LDA NFA+4 X SUB NFS+4 X JST NTGIVE RET BCK IRS 0 JMP NTR7 LDA VERS /*SEND IMP VERSION NO JST NTGIVE LDA (HOST34) I /*SEND HOST34 CONFIGURATOR WORD JST NTGIVE EXA LDA (TIPVER) I /*SEND TIP VERSION NO INH [ALL] JST DODXA I RET BCK JST NTGIVE LDA HLNM /*SEND NO OF HOST INTERFACE BEING T JST NTGIVE IMA (HLSNT) I /*SEND TEST MESS SENT COUNT JST NTGIVE IMA (HLRCVD) I /*SEND TEST MESS RECVD COUNT JST NTGIVE STA NTRTM1 /ZERO LINE-SPEEDS WORD LDX MICH /TAKE A SNAPSHOT OF LINE ERRORS NTR1: INH [T.O,TSK] /A=0 NOW CRA IMA (RTRCVD+CH 0 X) I SUB RTSSNT+CH X /SUBTRACT ROUTING MESS E , TCA /COMPUTE NO OF ROUTING MESS MISSED SPL CRA /MUST BE A POSITIVE NUMBER CAS (377) LDA (377) NOP STA E321 /SAVE AS ERROR COUNT FOR THIS LINE LDA MINUS1 IMA RTSSNT+CH X /*SEND NO OF ROUTING MEI CAS (377) LDA (377) NOP JST NTGIVE RET BCK LDA LINE+CH X /NOW ERROR+THROUGHPUT COUNTS FOR EAT SZE LDA (200) ERA NEIGHB+CH X /PICK UP NEIGHBOR IMP NUMT CAS MINE /IS LINE LOOPED? SKP /NO ERA C100 /YES, PUT IN LOOPED BIT ICA ERA E321 /*SEND NO OF ROUTING MESS MISSED JST NTGIVE LDA (RMFLG+CH X) I /GET LINE SPEED BITS ICA ANA THREE 0"A"SPDTYP ERA NTRTM1 ALR 2 STA NTRTM1 IRS 0 JMP NTR1 ALR 4 /LEFT ADJUST JST NTGIVE /*SEND LINE SPEEDS LDX MINUS3 LDA (37777 0 X) I /*SEND TRAP INFO (P, A, X JST NTGIVE IRS 0 JMP .-3 IMA NTRCKS /A=0 NOW TCA JST (GIVE) I /*SEND CHECKSUM CRA IMA TRBSTF /FIRED BY SYNC OR SWCH? SZE JMP (GIVLST) I /*SEND PADDING--FIRED BY SWCH LDX (100003) /END OUR OWN MESSAGE LDA SIGN JST JAM I /*PADDING AND END OF MESSAGE LDA (TRBD) I /*NCC DEST JST (GIVE) I LDA (TRBD+0+TLNK-TDST) I /*NCC LINK JST (GIVE) I LDA (302) /*STAT MESSAGE CODE JST NTGIVE LDX MICH /SEND LINE STATS NTR8: IMA (THRUPT+CH X) I JST NTGIVE /*PACKET THRUPUT IMA (THRUPW+CH X) I JST NTGIVE /*WORD THRUPUT IRS 0 JMP NTR8 LDX (-NH) /NOW HOST THROUGHPUTS FOR EACH HO1' NTR5: LDA (-10.) /AND FOR EACH OF 10 FLAVORS STA NTRTM1 LDA (NTRTAB 0 I) STA NTRTM2 NTR4: CRA IMA NTRTM2 I /*SEND HOST THROUGHPUT COUNT JST NTGIVE IRS NTRTM2 IRS NTRTM1 JMP NTR4 IRS 0 JMP NTR5 IMA NTRCKS /A=0 NOW TCA JST (GIVE) I /*SEND CKSUM JMP (GIVLST) I /*SEND PADDING LEV CON NTRTAB: HTPMTN+NH X HTPMFN+NH X HTPPTN+NH X HTPPFN+NH X NTRT1: HTPMTL+NH X NTRT3: HTPMFL+NH X NTRT2: HTPPTL+NH X NTRT4: HTPPFL+NH X HTPWTI+NH X HTPWFI+NH X LEV VAR SWS: BSS 1 /ANOMALIES HLNMS: BSS 1 SWCHTM: BSS 1 HERSAV: JMP 0 1000 777"A"HITEST TRBSTF: BSS 1 NTRTM1: BSS 1 NTRTM2: BSS 1 NTRCKS: BSS 1 /CHECKSUM FOR TROUBLE REPT E321: BSS 1 /NO OF ERRORS ON EACH LINE RTSSNT: BSS CH /NO OF HELLO'S SENT LEV BCK NTGIVE: 0 /BUILD CHECKSUM ENB BCK IMA NTRCKS ADD NTRCKS IMA NTRCKS JST (GIVE) I /AND GIVE A WORD TO IMP VIA JAM CRA JMP NTGIVE I /BITS IN SWS (TROUBLE REPORT ANOMALIES): / 100000 - HOST 0 UP (NOT KEPT IN SWS) / 40000 - HOST 1 UP (NOT KEPT IN SWS) / 20000 - HOST 2 UP (NOT KEPT IN SWS) / 10000 - HOST 3 UP (NOT KEPT IN SWS) / 4000 - VDH SOFTWARE IS UP / 2000 - M.GENERATOR IS ON / 1000 - STATISTICS IS ON / 400 - SNAPSHOT IS ON / 200 - TRACE IS ON / 100 - MEM PROTECT IS OFF / 40 - SPARE / 20 - OVERRIDE IS ON / 10 - SS 1 IS ON / 4 - SS 2 IS ON / 2 - SS 3 IS ON / 1 - SS 4 IS ON LEV T.O SWCH: 0 /SET UP SWITCH SETTINGS FOR TROUBLE LDA (4000) /SET UP FREQ FOR NCC TRBL REPTS STA (TRBF) I /DEST IS SET IN BACK LDX MINUS1 LDA (RSFNCC) I SNZ LDA (HLTLOC) I SZE /IF RSFLAG OR HLTLOC NON-ZERO STX SWS /FIRE OFF A TRBL REPT NOW LDA HLNM IMA HLNMS CAS HLNMS SKP /CHANGE IN HOST TEST STATUS? JMP SWCH0 /NO STX SWS STA 0 /RICK HOST NO GOING OFF LDA HERSAV IMA (HER 0 X) I /INTERCHANGE PATCH REGIST LDX HLNM /PICK HOST NO COMING ON IMA (HER 0 X) I STA HERSAV 0"A"HER0 SWCH0: LDA C100 STA (1777) I /ATTEMPT TO CHANGE WORD ON PROT P: CRA IMA (1777) I /IF SUCCESSFUL, PUT IN MP OFF BIT ERA OVRDF /OVRDF=20 IF ON, =0 IF OFF SR1 ERA TEN SR2 ERA FOUR SR3 ERA TWO SR4 ERA ONE LDX MINUS4 SWCH4: STA SWCHTM LDA (PARAMT+4 X) I SZE LDA (SWCHB+4 X) I /SET THE BIT ERA SWCHTM IRS 0 JMP SWCH4 ERA VDHUPF /=4000 IF VDH IS UP IMA SWS ERA SWS SNZ JMP SWCH I STA TRBSTF /TELL TRBL RPTS THAT SWS FIRED IT LDA SYNC SUB (TRBF) I STA (TRBOLD) I JMP SWCH I LEV [M2I,VDI,I2H,T.O,TSK] HLTWRD: 0 STA HLTA STX HLTX LDA MINUS2 ADD HLTWRD STA HLTLOC LDA HLTLOC I STA HLTLOC /SAVE LOC OF HLT JMP HLTWRD I LEV H2I /8-WAY BREAKDOWN OF HOST THROUGHPUT HTPMT: 0 /COUNT MESSAGES TO NET ERA MINE SZE /INTER- OR INTRA-NODE? LDA (HTPMTN+0-HTPMTL) ADD NTRT1 INH I2H JST HTPIRS RET H2I NOP JMP HTPMT I HTPPT: 0 /COUNT PACKETS TO NET ERA MINE SZE /INTER- OR INTRA-NODE? LDA (HTPPTN+0-HTPPTL) ADD NTRT2 INH I2H JST HTPIRS RET H2I JMP HTPPT I /R1==>FH - DON'T GET LENGTH LDX HIXX I LDA BUFE X SUB 0 SSP 0"A"TWOQ SUB (DATA) /GOT PACKET LENGTH, NOT COUNTING LE LDX HIP ADD (HTPWTI 0 X) I SPL LDA SIGN /MARK OFLO STA (HTPWTI 0 X) I JMP HTPPT I LEV I2H HTPMF: 0 /COUNT MESSAGES FROM NET ERA MINE ANA (SRCEI) SZE /INTER- OR INTRA-NODE? LDA (HTPMFN+0-HTPMFL) ADD NTRT3 JST HTPIRS NOP JMP HTPMF I HTPPF: 0 /COUNT PACKETS FROM NET ERA MINE ANA (SRCEI) SZE /INTER- OR INTRA-NODE? LDA (HTPPFN+0-HTPPFL) ADD NTRT4 JST HTPIRS JMP HTPPF I /R1==>FH LDX IHXX I LDA BUFE X SUB 0 SSP 0"A"TWOQ SUB (DATA) /GOT PKT LENGTH LDX IHP ADD (HTPWFI 0 X) I SPL LDA SIGN /MARKING OVERFLOW STA (HTPWFI 0 X) I JMP HTPPF I /HOST THROOGHPUT TABLES AND COUNT ROUTINE HTPIRS: 0 /TBL IN A, HOST NUM IN X SUB PLNH STA HTPIR1 LDA 0 SUB PLNH SMI /FAKE HOST? JMP HTPIR2 /YES, DO NOT COUNT TRAFFIC TO OR FR LDA HTPIR1 I SMI /OVERFLOWED--LEAVE AT 100000 AOA /ADD ONE TO COUNTER STA HTPIR1 I IRS HTPIRS /R2==>REAL (NOT FAKE) HOST HTPIR2: ENB I2H JMP HTPIRS I LEV VAR HTPIR1: BSS 1 /PNTR INTO HTPTBL LEV CON CONSTANTS PAGEND 22,UNCON,4 /DDT CONTROL LANGUAGE INFORMATION / /************CURRENTLY IMPLEMENTED COMMANDS*****************, / /SHIFT-CONTROL-P (OR THE BREAK KEY) HAS THE FOLLOWING EFFE( : /1- ANY DDT OUTPUT IS STOPPED /2- THE CURRENTLY OPENED REGISTER IS CLOSED WITH NO NEW CONT1 /3- DDT FORGETS WHATEVER NUMBER WAS BEING TYPED IN /4- DDT TYPES A CARRAIGE RETURN-LINE FEED /5- DDT IS UN-CROSSPATCHED - THAT IS YOU ARE NOW TYPING / TO THE LOCAL DDT IF YOU WERE CROSSPATCHED BEFORE / / HAS THE FOLLOWING EFFECTS: /1- DDT FORGETS WHATEVER NUMBER WAS BEING TYPED IN /2- DDT TYPES "= " / /. HAS THE VALUE OF THE CURRENT REGISTER'S ADDRESS (14-BITI / / HAS THE VALUE OF THE LAST THING TYPED BY DDT / /* HAS THE VALUE OF THE CONTENTS OF THE REGISTER ADDRESSED B /HAS BEEN ASSEMBLED AS THE CURRENT SYLLABLE. IT ALWAYS USES /THE CURRENT SYLLABLE AS A 14 BIT ADDRESS AND CAN BE APPLI[ /ITSELF OR TO ANY SYLLABLE / /T HAS THE VALUE OF THE IMP NUMBER OF THE LAST FOREIGN IMP /TO SEND A TTY MESSAGE TO THIS IMP. USED IN T= OR TC. / /, SEPARATES ARGUMENTS TO MULTIPLE ARGUMENT COMMANDS / /A1/ OPENS REGISTER AT LOCATION A1 (14-BIT ADDRESS) / /A1 OPEN REGISTER AT LOCATION A1 (USED AS /A 9 BIT RELATIVE ADDRESS TO THE PAGE . IS ON. / /A1 CLOSES THE CURRENTLY OPEN REGISTER (IF ANY) /INSERTS A1 AS ITS NEW CONTENTS (IF SUPPLIED) / /A1- CLOSES THE CURRENTLY OPEN REGISTER (AS LINEFEED) AND /THE PREVIOUS REGISTER /A1 CLOSES THE CURRENTLY OPEN REGISTER (AS LINEFEE /OPENS THE NEXT REGISTER / / AND + BOTH MEAN ADDITION / /- MEANS SUBTRACTION / /D MEANS THE NUMBER FOLLOWING IS DECIMAL / /" MEANS THAT THE TWO CHARACTERS FOLLOWING ARE TO BE TAKEN /AS LITERAL ASCII VALUES AND PACKED INTO A WORD LEFT HALF, R / /= TYPES OUT THE OCTAL VALUE OF THE LAST INPUT /EG: 3=3, 3+6=11, D11=13, "AB=40502, "AB+D10=40514, .=3033 / /> TYPES OUT THE ASCII VALUE OF THE LAST OUTPUT (IE AB / / /A1.A2,A3Z CLEARS ["ZEROES"] CORE BETWEEN LIMITS - A1 IS T1 /CONSTANT CORE WILL BE CLEARED TO. A2 AND A3 ARE THE (INCLL' /LOWER AND UPPER LIMITS, REPECTIVELY. / /A1,A2W DUMPS OUT ["WRITES"] CORE BETWEEN LIMITS - A1 AN( /ARE THE (INCLUSIVE) LOWER AND UPPER LIMITS. RESPECTIVELY. / /A1,A2,A3S STARTS UP A PROGRAM (I.E. CAUSE A TRANSFER TO /LOCATION). A3 IS THE (14 BIT) ADDRESS AT WHICH THE PROGRAM /IS TO BE STARTED. A2 SPECIFIES THE CONTENTS OF THE A REGIST1 /WHEN THE PROGRAM IS STARTED UP. A1 SPECIFIES THE /X REGISTER WHEN THE PROGRAM IS STARTED UP. / /A1C CROSSPATCHES DDT TO IMP A1. /MESSAGES ARE THEN TRANSMITTED TO IMP A1 /FOR EVERY CHARACTER THAT IS TYPED IN / /A1,A2H SETS UP THE HEADER FOR MESSAGE /TRANSMISSION - MESSAGES ARE TRANSMITTED BY /TYPING A SEMICOLON, THEN ALL THE CHARACTERS UP TO THE /NEXT SEMICOLON ARE SENT OFF AS A MESSAGE TO /DESTINATION AS DETERMINED BY THIS HEADER. /A1 GIVES LEADER WORD 1 (DESTINATION) /A2 GIVES LEADER WORD 2 (LINK =). / /A1$ SENDS AN IMP GOING DOWN MESSAGE TO ALL THE HOSTS /AT THE SITE TO WHICH DDT IS CROSSPATCHED. /A1 IS THE LINK DR SUB-CODE WORD AND MUST BE SUPPLIED / /Q TURNS DDT OUTPUT OFF AND ON - REVERSES THE CURRENT STAT /IF DDT TYPES NOTHING BACK IT IS OFF ["QUIET"] /OTHERWISE DDT WILL TYPE A CARRIAGE RETURN-LINE FEED / /I PRODUCES AN INTERRUPT PRINT /A DUMP OF SOME INTERESTING INTERRUPT LOCATIONS / /1 PRODUCES A QUEUE PRINT /A DUMP DF SOME INTERESTING QUEUE AND TABLE LOCATIONS / /A1,A2,A3,A4[E N] WORD SEARCHES: UNDER A MASK OF A1, DOT /SEARCH FOR WORDS EQUAL (NOTEQUAL) TO A2 BETWEEN THE /LIMITS A3 TO A4. / / /*****************SENSE SWITCH FOUR********************* / / HAVING SENSE SWITCH 4 DOWN INHIBITS ALL OF /DDT'S COMMANDS WHICH COULD DESTROY THE PROGRAM BEING /LSOKED AT. IF YOU ATTEMPT TO CHANGE CORE WITH SS4 DOWN, ( ' /WILL TYPE "= " AT YOU AND COMPLETELY IGNORE THE COMMAND. /THE COMMANDS AFFECTED ARE: S, Q, Z,S, AND LINEFEED, UPARRO' /CARRIAGE RETURN IF TRYING TO SUPPLY NEW CONTENTS. /*****************NULL ARGUMENT CONVENTIONS*****************, / /FOR =,CR,LF,-, AND IF /THE ARGUMENT A1 IS LEFT OUT, THE LAST NUMBER TYPED BY DDT W /BE USED AS THE ARGUMENT. / /FOR E, N, Z AND W, IF EITHER (OR BOTH) OF THE LIMITS ARE LET /DDT WILL USE THE LAST LIMITS SPECIFIED FOR EITHER A Z OR : 1 /OR AN E OR AN N. /IF THE VALUE IS LEFT OUT IN AN E, N OR Z COMMAND, THE LAST /SPECIFIED IN ANY E, N, OR Z COMMAND WILL BE USED. IF THE /IS LEFT OUT OF AN E OR N COMMAND IT WILL BE SUPPLIED FROM /THE LAST E OR N DONE. OR -1 IF NO MASK HAS EVER /BEEN SPECIFIED. / /FOR S, ANY ARGUMENTS LEFT OUT WILL BE SUPPLIED FROM THE LAS /THOSE ARGUMENTS WERE SPECIFIED. / /*********************************************************** LEV BCK /DDT - STAND ALONE AND BACKGROUND /THE SAME PROGRAM IS USED FOR STAND ALONE USE /AND AS A BACKGROUND PROGRAM RUNNING WITH THE IMP SYSTEM /THE ONLY DIFFERENCE IS IN THE INPUT AND OUTPUT PORTS /CALLS TO INPUT A CHARACTER AND TO OUTPUT A CHARACTER /ARE MADE INDIRECT THROUGH LDIN AND LDOT RESPECTIVELY /STAND ALONE THESE POINT TO SIMPLE TTY I/O HANDLERS /UNDER IMPSYS THESE POINT TO COMPLEX COROUTINES IN BACKGRO1 ] DDSA: LDA (DDA3) /ENTRY TO STAND ALONE DDT STA LDIN /SET UP STAND ALONE INPUT LDA (DDA4) STA LDOT /SET UP STAND ALONE OUTPUT LDA (QNUL) STA QPTR /TURN OFF QUIET MODE STA BBNF /SET DEST TO NON-BBN CRA STA OVRDF /TURN OFF SOFTWARE SS4 EXA JMP DCLR /GO TO RESTART ENTRY DDA3: 0 /STAND ALONE DDT INPUT TTINAC /GET INPUT CHAR JMP .-1 ANA (177) ERA (200) /ALWAYS PUT IN PARITY BIT JMP DDA3 I DDA4: 0 /STAND ALONE DDT OUTPUT TTSNBZ JMP DDA5 /BUSY, SO GET THE INPUT CHAR TTSOM /GO INTO OUTPUT MODE TTOTA /DO OUTPUT JMP .-1 TTSRDY JMP .-1 TTSIM /GO BACK TO INPUT MODE JMP DDA4 I /START BACKGROUND DDT OUTPUT DOTI: LDA (DOUT) STA LDOT LDA (DIN) STA LDIN LDA (QNUL) STA QPTR JMP (DOTI1) I /DDT /NOTE THAT DDT RUNS WITH INTERRUPTS LOCKED - PI OFF /IT ALSO RUNS WITH EXTENDED ADDRESSING ENABLED - EA ON /MAIN LISTEN LOOP DDA5: JST DDA3 LCK ALL DCLR: JST CRLF /RESTART ENTRY CRA STA PRS LF: JST CLS LDA (215) /TYPE A CR JST LDOT I CLSE: JST CSL CRA STA PRS STA PAR1 LSE: JST LDIN I ANA C77 STA CHARIN ADD (DTAB) /DISPATCH TABLE STA 0 LDA 0 X SPL JMP DDTDIS /SIGN BIT MEANS ALWAYS DO IT LDA BBNF /ELSE ONLY IF OVERRIDDEN OR BBN JST SS4ON DDTDIS: LDA 0 X STA 0 LDA CHARIN JMP 0 X SS4ON: 0 SNZ /A IS 0 IF OK (E.G. BBNF) JMP SS4ON I LDA OVRDF /ELSE REQUIRE OVERRIDE ON SNZ SR4 /OR SS4 ON JMP SS4ON I /ELSE FALL INTO RUB RUB: LDA (243) /TYPE A # RUB1: JST LDOT I RUB2: JST TAB /AND THREE SPACES JMP CLSE LEV VAR BSS 1 /PARAMETERS STORAGE BLOCK BSS 1 BSS 1 PAR1: BSS 1 PRS: BSS 1 /PARAMETER SUPPLIED - 1=> YES (R I' SYL: BSS 1 /LAST SYLLABLE TYPED IN LAST: 0 /LAST WORD TYPED (CURRENT VALUE OF PT: 0 /CURRENT VALUE OF . OPEN: 0 /ADDRESS OF OPEN REG (<0 IF NONE) DLO: 0 /LOW LIMIT DHI: 0 /HI LIMIT VAL: 0 /VALUE FOR CLEAR AND SEARCHES CNT: 0 /COUNT FOR LOOPING SMSK: -1 /MASK FOR SEARCHES SP: 0 /LAST DDT START ADDRESS SX: 0 /LAST DDT START X REG CHARIN: BSS 1 /TEMP INPUT CHARACTER BBNF: BSS 1 /0 IF DDT MESS FROM BBN LEV CON LDIN: DIN /DDT INPUT CHAR ROUTINE LDOT: DOUT /DDT OUTPUT CHAR ROUTINE /UTILITY SUBROUTINES AND STUFF LEV BCK LCK ALL CRLF: 0 LDA (215) /TYPE A CARRIAGE RETURN JST LDOT I LDA (212) /AND A LINE FEED JST LDOT I JMP CRLF I TAB: 0 LDA (240) /TYPE THREE SPACES JST LDOT I JST LDOT I JST LDOT I JMP TAB I GP: 0 /GET A PARAMETER ANA PRS DSNZ: SNZ /WAS PARAM SUPPLIED? IRS GP /NO, SKIP LDA PAR1 X /YES, RETURN VALUE JMP GP I GP1: 0 /GET PARAMETER 1 LDX ZERO LDA ONE JST GP IRS GP1 /GOT VALUE, GIVE SKIP RETURN JMP GP1 I CSL: 0 /COMBINE IN A SYLLABLE CRA IMA SYL CSLX: SKP /SKP (DEFAULT) MEANS DO ADDITION TCA /ELSE DO SUBTRACTION ADD PAR1 /COMBINE WITH PARAM 1 STA PAR1 /ACCUMULATE IN PARAM 1 LDA SIGN STA CSLX /RESET +/- FLAG JMP CSL I PAC: 0 /PRINT ADDRESS AND CONTENTS SSP STA OPN /SAVE ADDRESS OF REG TO BE PRINTE[ JST CRLF /TYPE A CR - LF LDA OPN JST OPT /TYPE THE ADDRESS IN OCTAL LDA (257) /TYPE A / JST LDOT I JST GP1 IRS PRS LDA OPN JST OPN /OPEN REG AND TYPE CONTENTS JMP PAC I OPN: 0 /OPEN A REGISTER AND TYPE ITS CONT 1 SSP STA OPEN JST GP1 JMP OPN1 /NO ARG, DON'T RESET . LDA OPEN STA PT OPN1: JST TAB LDX OPEN LDA 0 X JST OPT JST TAB JMP OPN I CLS: 0 /CLOSE A REGISTER LDA (JMP DIG1) STA DIG JST CSL LDA OPEN SMI JST GP1 JMP CLS1 /NO NEW CONTENTS FOR THE REG STA LAST LDA ONE /REAL OVERRIDE NEEDED JST SS4ON LDA LAST LDX OPEN STA 0 X CLS1: SSM STA OPEN JMP CLS I OPT: 0 STA LAST IAB LDX MINUS5 LDA MINUS1 STA OPTT LDA (130) LLL 1 OPT1: CAS (260) /ZERO? SKP JMP OPT4 /SEE IF WE SHOULD SUPRESS IT IRS OPTT DNOP: NOP OPT3: JST LDOT I OPT2: LDA (26) LLL 3 IRS 0 JMP OPT1 JST LDOT I /ALWAYS PRINT LOWEST ORDER DIGIT JMP OPT I OPT4: IRS OPTT JMP OPT3 LDA MINUS1 /SUPRESS A ZERO STA OPTT JMP OPT2 OPTT: BSS 1 ASCOUT: JST TAB LDA LAST ICL JST LDOT I LDA LAST CAL JMP RUB1 COM: JST CSL /, DISPATCH CRA IMA PAR1 IMA PAR1-1 IMA PAR1-2 IMA PAR1-3 LDA PRS LGL 1 STA PRS JMP LSE /DISPATCHER ROUTINES DIG: BSS 1 /JMP DIG1 OR NOP ADD SYL ADD SYL DIG1: LRS 3 /DIGITS DISPATCH ADD SYL LLS 3 SUB (60) DIG2: STA SYL JST GP1 IRS PRS JMP LSE DECIN: LDA DNOP STA DIG JMP LSE EQS: JST CSL /EQUALS DISPATCH LDA PAR1 JST OPT JMP RUB2 PLUS: JST CSL /ADDITION DISPATCH JMP LSE MIN: JST CSL /MINUS DISPATCH LDA DNOP STA CSLX JMP LSE PTOP: LDA PT /. DISPATCH JMP DIG2 STAR: LDX SYL /* DISPATCH LDA 0 X JMP DIG2 BARR: LDA LAST / DISPATCH JMP DIG2 BOP: LDA (IHTT) /HOST OUTPUT TIMER JMP DIG2 /FOR WBB - HOST INTERFACE DEBUG TOP: LDA (WHOTTY) I /TTY OUTPUT SOURCE JMP DIG2 /FOR NCC OPS- WHO IS TYPING ON TTY SLH: JST CSL // DISPATCH JST GP1 LDA LAST SLH2: JST OPN JMP CLSE BS: JST CSL /BACKSLASH DISPATCH JST GP1 LDA LAST STA LAST ANA (1000) /GET PAGE BIT SZE /PAGE 0? LDA PT /NO, THIS PAGE ERA LAST ANA (77000) ERA LAST JMP SLH2 UA: JST CLS /- DISPATCH LDA MINUS1 JMP CR1 CR: JST CLS /CARRIAGE RETURN DISPATCH LDA ONE CR1: ADD PT STA PT JST PAC JMP CLSE ASCIN: JST LDIN I ICR STA LAST JST LDIN I ERA LAST STA LAST JMP DIG2 S: JST CSL /S DISPATCH JST GP1 SKP STA SP LDA ONE /REAL OVERRIDE, NOT JUST BBNF JST SS4ON LDX MINUS2 LDA FOUR JST GP STA SX LDX MINUS1 LDA TWO JST GP NOP LDX SX JMP SP I Z: JST SS4ON /A NOT ZERO - REAL OVERRIDE LDA (JMP Z1) JMP SCH1 Z1: LDA VAL STA 0 X JMP SCH2 W: LDA DSKP JMP SCH1 /W DISPATCH EQ: LDA DSZE JMP SCH1 /E DISPATCH NEQ: LDA DSNZ /N DISPATCH SCH1: STA SXEC /SET UP TEST LDX MINUS3 LDA TEN JST GP STA SMSK /FIRST PARAM - MASK LDX MINUS2 LDA FOUR JST GP STA VAL /SECOND PARAM - VALUE JST CSL JST GP1 DSKP: SKP STA DHI /FOURTH PARAM - HI BOUND LDX MINUS1 LDA TWO JST GP STA DLO /THIRD PARAM - LO BOUND LDA DLO SUB DHI SUB ONE STA CNT /LEAVE COUNT IN CNT SMI JMP RUB /INVERTED BLOCK LDX DLO SCH3: LDA 0 X ERA VAL /COMPARE ANA SMSK /MASK OFF BITS TO BE IGNORED SXEC: BSS 1 /TEST - SET UP BY CALLS JMP SCH2 /FAILURE LDA 0 JST PAC LDX OPEN SCH2: IRS 0 IRS CNT JMP SCH3 JMP DCLR DOWNM: JST SS4ON /A NOT ZERO JST CSL /S DISPATCH JST GP1 JMP RUB /MUST HAVE SS4 ON AND GIVE A PARAM JST DODXA I RET BCK JST (IHDOWN) I /TELL ALL HOSTS IMP GOING DOWN EXA JMP DCLR LCK ALL OVRD: LDA OVRDF /O DISPATCH DSZE: SZE JMP OVRD1 /LEAVING OVERRIDE MODE LDA BBNF /FROM BBN JST SS4ON CRA /THEN YOU CAN ENTER OVERRIDE OVRD1: ERA (20) STA OVRDF ARR 1 ERA (306) /MAKE AN N OR AN F JST LDOT I /TYPE ON OR OFF JMP DCLR C: JST CSL JST GP1 /CROSSPATCH JMP RUB ANA (0 0 177777"X"HICODE) ERA (PRIBIT 0 FORIMP) STA (HED0) I /SET "FOP IMP" BIT JMP DCLR H: JST CSL /SET UP A HEADER LDX MINUS1 LDA TWO JST GP STA (MHD0) I JST GP1 SKP STA (MHD1) I JMP DCLR QDSP: JST SS4ON LDA QPTR /QUIET MODE CONTROL IMA LDOT STA QPTR JMP DCLR QNUL: 0 /NULL SUBROUTINE JMP .-1 I LEV VAR QPTR: BSS 1 LEV CON CONSTANTS PAGEND 23,UNCON,4 LEV BCK DIN4: JST SUCK I SSM 0"A"PRIBIT STA DSRC ANA (FRMIMP 0 SRCEHI) ERA (FRMIMP 0 BBNIMP) SZE /SET FLAG IF MESS FROM BBN IMP TTY ERA (0 0 BBNIMP"X"BBNTIP) SZE /SET FLAG IF MESS FROM BBN TIP TTY ERA (FRMIMP 0 BBNTIP"X"PDP1D) STA (BBNF) I /SET FLAG IF MESS FROM BBN IMP HOST JST SUCK I STA DSRC+1 DIN1: JST SUCK I JMP DIN2 STA DINW CAL SNZ JMP DIN3 /NOTHING AT ALL IN THIS WORD LDA DINW JST DINR DIN3: IRS DEND /HAVE OUTPUT CLOSE OFF THEIR MESSAG1 JMP DIN4 /GO BACK FOR NEXT MESSAGE DIN2: STA DINW /FEED DDT A WORD JST DINR LDA DINW ICA JST DINR JMP DIN1 LEV VAR DINC: BSS 1 DINW: BSS 1 DSRC: BSS 2 /DDT DEST/SOURCE LEV BCK DIN: 0 /DDT CALLS HERE TO GET A CHARACTER DIN7: LDX ONE INH ALL JST DODXA I RET BCK SKP DIN8: JST DOZE I CRA IMA DEND /TIME TO END A MESSAGE? SNZ JMP DIN9 /NO LDA (DIN7) /CLOSE A MESSAGE STA DOUT JMP DOT2 DEND: BSS 1 DIN9: IMA DINC /INPUT CHAR READY? SNZ JMP DIN8 INH ALL EXA JMP DIN I LEV BCK DINR: 0 /ROUTINE CALLS HERE TO FEED A CHAR SMI JMP DINR I SSP ICL SZE JMP DINA STA DDTI /WE ARE GIVING DDT A "BREAK" LDA LRET STA DIN DINA: STA DINC JST WAIT I /LET DDT GRAB THE CHAR LDA DINC SZE JMP .-3 JMP DINR I DOT2: LDA DOTW /START HERE TO CLOSE OFF LAST MESSA[ DOT5: LDX (100001) JST JAM I DOT6: LDA SIGN /START HERE WITH EMPTY WORLD JST DOTR LDX ONE LDA DSRC /*SEND DEST HOST JST JAM I /(=SOURCE OF LAST MESS RECVD) LDA DSRC+1 /*SEND DEST LINK JST JAM I /(=LINK OF LAST MESS RECVD) LDA (-500.) /NUMBER OF WORDS PER MESSAGE STA DCNT LDA DOTA ANA (177) IAB DOT3: LLL 24. ERA (100200) JST DOTR LDA DDTI /DDT BEING INTERRUPTED? SZE JMP DOT4 /YES, SUPRESS OUTPUT IAB LDX ONE JST JAM I /*SEND TWO CHARS PER WORD IRS DCNT JMP DOT7 LDA SIGN JMP DOT5 DOT4: LDA (LSE) STA DOUT DOT7: LDA SIGN JST DOTR JMP DOT3 DOTI1: LDA LRET STA DOUT STA DEND JMP DOT6 DOUT: 0 /DDT CALLS HERE WITH A CHAR TO TYPE STA DOTA ANA (177) ERA DOTW IAB STA DOTB STX DOTX INH ALL JST DODXA I RET BCK LDX ONE JMP DOTR I DOTR: 0 /ROUTINES CALL HERE TO RETURN TO DD STA DOTW LDA DOTB IAB LDA DOTA LDX DOTX INH ALL EXA JMP DOUT I LEV VAR DOTW: BSS 1 DOTA: BSS 1 DOTB: BSS 1 DOTX: BSS 1 DCNT: BSS 1 /NUMBER OF WORDS LEFT IN OUTPUT PAC LEV BCK LCK ALL QP: LDA QPC1 /QUEUE PRINT STA QT1 QPQ1: LDA QPC2 ADD QT1 STA QT2 STA 0 LDA 0 X SNZ JMP QPQ3 JST QPCR I LDA 0 JST QPOP I JST QPTB I LDA (-10) STA QT3 QPQ2: LDX QT2 LDA 0 X SNZ JMP QPQ3 STA QT2 JST QPOP I JST QPTB I IRS QT3 JMP QPQ2 QPQ3: IRS QT1 JMP QPQ1 LDA QTB3 STA QT1 QPB1: LDX QT1 LDA QTB1+QTBL X STA QT2 LDA QTB2+QTBL X STA QT3 QPB2: LDX QT3 LDA 0 X SNZ JMP QPB4 STA QT4 LDA QT3 STA 0 SMI JMP QPB3 IRS QT3 LDA 1 X CAS (100001) SKP JMP QPB4 SUB (BUFE 0 I) STA QT4 QPB3: JST QPCR I LDA QT3 SSP JST QPOP I JST QPTB I LDA QT4 JST QPOP I JST QPTB I QPB4: IRS QT3 IRS QT2 JMP QPB2 IRS QT1 JMP QPB1 JMP QPND I IP: LDX (-IPL) /INTERRUPT PRINT IP1: LDA IPT+IPL X STX QT1 JST QPAC I /PRINT SOME KEY PARAMETERS LDX QT1 IRS 0 JMP IP1 LDX (STDIL-0-TASKIL) IP2: LDA TASKIL+1 X STX QT1 JST QPAC I /PRINT ALL INTERRUPT ENTRANCES LDX QT1 IRS 0 JMP IP2 JMP QPND I QPCR: CRLF /QUEUE PRINT CONSTANTS AND VARIABLE: QPOP: OPT QPTB: TAB LRET: /SAME AS QPND QPND: DCLR QPAC: PAC QPC1: -QUEUEL QPC2: QUEUEB+QUEUEL QTB1: -PPTL -TH -TH -[CH"T"NACH] -CH+0+1 0 0 -2"T"COUNTL -PLTNUM QTB2: PPT HISP IHSP I2MB0 100020 COUNTA PLT QTBL=QTB2-0-QTB1 QTB3: -QTBL LEV VAR QT1: BSS 1 QT2: BSS 1 QT3: BSS 1 QT4: BSS 1 LEV CON IPT: PRIM /INTERRUPT PRINT LOCS MP OCHN I2MSB HIP HISB IHP IHSB TOK FAKENO BACKNO ADDRET IPL=.-0-IPT DDOK=100000 /SIGNBIT ON (DDOK) ==> NON-PRIVELEGED DISPATCH LEV CON DTAB: DCLR+0+DDOK /@ LSE+0+DDOK /A BOP /B C+0+DDOK /C DECIN /D EQ /E LSE+0+DDOK /F LSE+0+DDOK /G H+0+DDOK /H IP /I LF /J - 12 - LINEFEED LSE+0+DDOK /K H+0+DDOK /L CR /M - 15 - CR NEQ /N OVRD+0+DDOK /O LSE+0+DDOK /P QDSP /Q LSE+0+DDOK /R S /S TOP+0+DDOK /T LSE+0+DDOK /U LSE+0+DDOK /V W /W LSE+0+DDOK /X LSE+0+DDOK /Y Z /Z LSE+0+DDOK /[ BS / LSE+0+DDOK /] UA /~ BARR / PLUS+0+DDOK / QP /! ASCIN /" LSE+0+DDOK /# DOWNM /$ LSE+0+DDOK /% LSE+0+DDOK /& LSE+0+DDOK /' LSE+0+DDOK /( LSE+0+DDOK /) STAR /* PLUS+0+DDOK /+ COM+0+DDOK /, MIN+0+DDOK /- PTOP /. SLH // DIG+0+DDOK /0 DIG+0+DDOK /1 DIG+0+DDOK /2 DIG+0+DDOK /3 DIG+0+DDOK /4 DIG+0+DDOK /5 DIG+0+DDOK /6 DIG+0+DDOK /7 DIG+0+DDOK /8 DIG+0+DDOK /9 LSE+0+DDOK /: LSE+0+DDOK /; LSE+0+DDOK /< EQS+0+DDOK /= ASCOUT /> RUB /? - 177 - RUBOUT LEV CON CONSTANTS PAGEND 24,UNCON,4 TINT: LEV TTY /TTY INTERRUPT STDIL/ TINT TINT/ INT TTY STA TINA /SAVE A REG TTSRDY JMP TTRT /NOT REALLY A TTY INTERRUPT CRA CAS TTFG /IS TTFG = -1,0,1? JMP TIN1 /-1 WE JUST TYPED A BACKSLASH JMP TIN2 / 0 NORMAL INTERRUPT TTSOM / 1 WE MUST TYPE A BACKSLASH LDA (334) TTOTA JMP TIN1 LDA MINUS1 /SET TTFG TO -1 TIN3: STA TTFG TTRT: INK OTK LDA TINA /RESTORE A REG ENB TTY JMP TINT I TIN2: LDA OTGO /CHECK HALF-DUPLEX FLAG SZE /ARE WE IN INPUT MODE? JMP TIN1 /NO, THIS IS AN OUTPUT INTERRUPT TTINAC /YES, GET INPUT CHAR JMP .-1 STA TTCR /SAVE IT TIN1: TTSIM LDA ONE /SET TTFG TO 1 JMP TIN3 LEV VAR TINA: BSS 1 /TTY INT SAVED A REG TTCR: BSS 1 /RAW TTY INPUT CHAR /OTGO IS THE STATE OF THE HALF-DUPLEX INTERFACE /0=EXPECTING INPUT, 1=HAVE DONE OUTPUT /TTFG IS THE COMMUNICATION FLAG BETWEEN /THE TTY INTERRUPT HANDLER AND THE BACKGROUND TTY PROCESSING /AT INTERRUPT TIME: /-1= LAST ACTION WAS TO TYPE A BACKSLASH, NOW 1=>TTFG / 0= NORMAL - BACKGROUND IS READY FOR TTY INT, NOW 1=>TTFG / 1= A SECOND TTY INT CAME IN BEFORE BACKGROUND CAUGHT UP / SO TYPE A BACKSLASH, NOW -1=>TTFG /AT BACKGROUND LEVEL: /USE A CRA, IMA TTFG SEQUENCE TO INTERROGATE TTY /0=>TTFG, USE CHAR IF TTFG WAS = 1 LEV BCK TTYI: CRA /TELETYPE INPUT STARTS HERE STA OTGO STA HSFG STA HSGO STA TTCH STA (DINC) I LDA MINE ERA (PRIBIT 0 FORIMP) STA (DSRC) I ERA C100 STA HED0 LDA (40) SMK 20 /ENABLE TTY INTERRUPTS ONLY JMP TTI3 /GO FIRE OFF A DUMMY MSG TO DDT IND1: LDA TTI2 STA INDB TTI1: ENB BCK LDX ZERO JST DOZE I /WAIT FOR NEXT INPUT CHAR LDA OTGO /OUTPUT ACTIVE? SZE JMP TTI1 /YES INH TTY IMA TTFG /TTY HAVE SOMETHING FOR US?? SMI /IF TTFG= -1, NO SNZ /IF TTFG= 0, NO JMP TTI1 /NO LDA TTCR /IF TTFG= 1, YES ANA (177) /PUT IN PARITY BIT ERA (200) STA TTCH ENB BCK JMP INDB I /GO PROCESS THE CHAR INDB: 0 /COME HERE TO GET NEXT CHAR FROM TT STA TTIW /SAVE THE INPUT WORD SO FAR JMP TTI1 LEV VAR TTCH: BSS 1 /RAW TTY INPUT CHAR+PARITY BIT TTIW: BSS 1 HED0: BSS 1 /CROSSPATCH HEADER MHD0: BSS 1 /MESSAGE HEADER MHD1: BSS 1 MSGT=273 /SEMI NUMB=272 /COLON LEV BCK TTI2: .+1 /PLACE TO START BUILDING NEW MESSAGI CAS (MSGT) /IS IT A MESSAGE INITIATOR? SKP JMP MSG /YES /SEND A SINGLE CHAR MESSAGE TTI3: LDA HED0 /*SEND CROSSPATCH HEADER JST JAM I CRA /*SEND ON LINK ZERO JST JAM I LDA TTCH ERA (200) SZE /IS THE CHAR TO SEND A BREAK? JMP TTI5 /NO LDA MINE /YES, RESET CROSSPATCH HEADER TO [ 1 ERA (PRIBIT 0 FORIMP 100) STA HED0 /DDT AT SELF - PRIORITY TTI5: LDA TTCH SSM ICA STA TTIW CRA STA HSGO MSG2: LDA TTIW /*SEND 1 CHAR MESSAGE LDX SIGN /CLOSE OFF THE MESSAGE JST JAM I JMP IND1 /SEND A SEMICOLON MESSAGE - MULTI-CHARACTER MSG: LDA HSFG /SEND A MESSAGE STA HSGO LDA MHD0 /*SEND MESSAGE HOST JST JAM I LDA MHD1 /*SEND MESSAGE LINK JST JAM I MSG0: LDA SIGN JST MSG1 /GET ONE CHAR SSM /PUT IN PARITY ICA /SAVE JST MSG1 /GET OTHER CHAR ERA (200) /PUT IN PARITY ERA TTIW JST JAM I /*SEND NEXT TWO CHARS JMP MSG0 /GO BACK FOR MORE MSG3: CRA /BUILD A NUMBER MSG4: JST MSG1 /GET NEXT CHAR CAS (215) /CR? SKP /NO JMP MSG5 /YES, END OF THE NUMBER INH ALL /USING B REG - MUST LOCK INTS LRL 3 LDA TTIW LLL 3 ENB BCK JMP MSG4 MSG5: TTSNBZ /ECHO CR WITH A LF JMP MSG6 /FORGET IT TTSOM LDA (212) TTOTA JMP .-1 IRS OTGO MSG7: JST DOZE I /WAIT FOR CHAR TO TYPE OUT CRA IMA TTFG SNZ /HAS TTY INTERRUPTED? JMP MSG7 /NOT YET, WAIT LDA OTGO /NOW UNSTEP OUTPUT FLAG SUB ONE SPL CRA STA OTGO MSG6: LDA TTIW /ADD NUMBER TO MESSAGE JST JAM I JMP MSG0 MSG1: 0 /SUBR TO GET NEXT CHAR FOR MESSAGE JST INDB /GET THE CHAR CAS (MSGT) /IS IT MESSAGE TERMINATOR? SKP /NO JMP MSG2 /YES, DONE - LEAP INTO INDB CODE CAS (NUMB) /IS IT NUMBER INDICATOR? JMP MSG1 I /NO, RETURN WITH CHAR JMP MSG3 /YES, PUT AN OCTAL NUMBER IN THE ME JMP MSG1 I /NO, RETURN WITH CHAR TTO0: LDX ZERO /TELETYPE OUTPUT ROUTINES STX TTNM /CLEAR FLAG JST SUCK I /WAIT FOR SOME OUTPUT TO HAPPEN IRS OTGO /GRAB THE TTY STA TTOW ANA (SRCEHI) CAS MINE /NOT IF FROM US CAS C77 /NOT IF NON-TTY JMP TTO01 NOP STA WHOTTY /LAST FOREIGN IMP TTY TO SEND TO TT' TTO01: JST WAIT I LDA TTOW LGL 3 0"A"FOROCT STA OCTL SMI LDA HSGO /MAKE A SKP TO SEE ALL I2H MESSAGES - RFNMS FOR SINGLE CHA[ SNZ JMP TTO2 LDA (215) JST SEND LDA (212) JST SEND LDA (212) JST SEND LDA TTOW JST OCTO JST SUCK I SKP JMP TTO7 JST OCTO JMP TTO3 TTO7: IRS TTNM /SET END FLAG JST OCTO JMP TTO5 TTO2: JST SUCK I /FROM DDT: SKIP OVER REST OF LEAD[ SKP JMP TTO8 TTO3: JST SUCK I JMP TTO4 /MORE MESSAGE IRS TTNM STA TTOW /DONE CAL SNZ JMP TTO5 LDA TTOW /GET LAST CHAR ICL JST SEND TTO5: CRA STA OTGO STA OCTL JMP TTO0 LEV BCK TTO4: STA TTOW /SEND ANOTHER WORD OF THE MESSAGE LDA OCTL SPL JMP TTO6 LDA TTOW ICL JST SEND LDA TTOW CAL JST SEND JMP TTO3 TTO6: LDA TTOW JST OCTO JMP TTO3 OCTO: 0 /OCTAL OUTPUT IAB LDA MINUS6 STA OCO1 LDA (130) LLL 1 OCO2: IAB STA OCO3 IAB JST SEND LDA OCO3 IAB LDA (26) LLL 3 IRS OCO1 JMP OCO2 LDA (215) JST SEND LDA (212) JST SEND JMP OCTO I TTO8: IRS TTNM LDA TTOW ANA (IHCODE) ERA (CINCTR) SZE /BLOCKED OR LOST? JMP TTO5 /NO LDA (334) /YES, TYPE A BACKSLASH SINCE OUR ME JST SEND JMP TTO5 SEND: 0 /SUBR TO TYPE OUT A CHAR CAS (200) /'200 BIT SET? NOP SKP JMP SEND I /NO, IGNORE THE CALL LDX ZERO TTSNBZ JMP SND2 /INTERRUPTING OUTPUT! TTSOM TTOTA JMP SND2 SND3: JST WAIT I /WAIT FOR CHAR TO GO OUT CRA IMA TTFG SMI SNZ JMP SND3 JMP SEND I SND2: LDA TTNM /AT END OF MSG? SZE JMP TTO5 /YES, NO MSG TO SKIP JST SUCK I /SKIP REST OF MESSAGE JMP SND2 STA DDTI JMP TTO5 /AND CONTINUE LOOKING FOR A NEW MES LEV VAR TTOW: BSS 1 OCTL: BSS 1 OTGO: BSS 1 HSGO: BSS 1 TTNM: BSS 1 /END OF MSG IF NON ZERO WHOTTY: 0 /LAST FOREIGN TYPIST ON THIS TTY OCO1: BSS 1 OCO3: BSS 1 LEV CON CONSTANTS PAGEND 25,UNCON /NEW ROUTING /THESE ROUTINES BUILD TWO MAIN TABLES /RUT - ROUTE USE TABLE, THE BEST LINE DIRECTORY /RST - ROUTE SEND TABLE, THE HOPS/DELAY INFORMATION UPDATE M[ /THE NEW VALUE OF HOPS AND DELAY ON THE BEST LINES FOR EAC1 , /RSTN - THE RST NEW TABLE / THE IDENTITY OF THE BEST LINE FOR EACH IS KEPT IN /RUTW - THE RUT WORKING TABLE /A NAMING CONVENTION -- TAGS LIKE RST.N AND RST.W ARE INDIRET /POINTERS [FOR '.' READ "POINT"], POST-INDEXED BY NEGATIVE 1 /RST.N IS THUS THE RST POINTER TO THE NEW TABLE /BITS IN RUT RUTDED=100000 /THIS IMP IS DOWN,UNREACHABLE OR NO1 RUTGOD=60000 /GOING-DOWN DELAY CNTR - EVERY 4TH ] RUTGD1=20000 /LOW ORDER BIT OF RUTGOD RUTHPC=17400 /LINE # +1 OF SHORTEST HOP PATH RUTCMU=340 /COMING-UP DELAY COUNTER - EVERY 8T1 RUTCM1=40 /LOW ORDER BIT OF RUTCMU RUTDLC=37 /LINE # +1 OF BEST DELAY PATH RUTUS=0 /BITS IN RUTW RUTHPH=60000 /HOLD-DOWN TIMER FOR MIN HOP PATH RTHPH1=20000 /LOW ORDER BIT OF RUTHPH RUTDLH=140 /HOLD-DOWN TIMER FOR MIN DELAY PATH RTDLH1=40 /LOW ORDER BIT OF RUTDLH /BITS IN RST, RSTN HOPS=174000 /5 BITS OF HOP COUNT HOPS1=4000 /LOW ORDER BIT OF HOPS DELS=3777 /11 BITS OF DELAY COUNT /BITS IN ROUTING MSG /IN HEAD1 RMSN=177400 /RM SERIAL # RMSN1=400 /LOW-ORDER BIT IF SER # /RUTINI IS AN INITIALIZATION ROUTINE TO SET UP /THE ROUTING TABLES LEV BCK LCK INI RUTINI: 0 LDA (RST 0 NIMP X) STA RST.O LDA (RST1 0 NIMP X) STA RST.F LDA (RST2 0 NIMP X) STA RST.N LDX NEGIMP /LOOP OVER ALL IMPS RUTINL: LDA CDEAD /(100000) STA RUT+NIMP X 0"A"RUTDED CRA STA RUTW+NIMP X LDA CMAXHD /(177777) STA RST.O I STA RST.F I STA RST.N I IRS 0 JMP RUTINL LDX MINE CRA 0"A"RUTUS STA RSTSN /START SER # AT 0 STA RUT X /CLEAR RUT STA (RST2 0 X) I /AND RSTN JMP RUTINI I /RSTINP IS A ROUTINE TO COPY A RECIEVED ROUTING MESSAGE INTO /RSTN, RSTW AND RUTW TABLES. CHK=0 LEV T.O RSTINP: 0 RSTCK1: K STX LINEX /SAVE LINE# K STA RST.I /SAVE AC FLAG K LDX RSTCKX /(RSTCK1-0-RSTCK2-1) K CRA /CALCULATE CHECKSUM FOR THIS CODE K ADD RSTCK2+1 X K IRS 0 K JMP .-2 K SZE /DIFFERENT? RELOAD [RUTINP CODE BROKEN] K JST SWDTIL I /YES, RELOAD K LDX LINEX /RESTORE LINE # IN X K LDA CED X /PICK UP COMPUTED EFFECTIVE DELAY K AOA K STA DELOUR /AND SAVE IT K LDA 0 K AOA K STA CHANR /SAVE CHAN=+1 IN RT HALF K ICA K STA CHANL /ALSO IN LEFT HALF K ERA CHANR K STA CHANB /SAVE CHAN=+1 IN BOTH HALVES K LDA RST.I /PICK UP FLAG K SNZ /WERE WE CALLED BY TASK? K JMP RSTI1 /YES, TRUE INPUT K LDA DUMYIN /NO, MAKE UP DUMMY INPUT OF ALL 1: K JMP RSTI2 RSTI1: K LDA LINE X K SZE /IS LINE DOWN? K JMP RSTINP I /YES, IGNORE ROUTING K LDX THIS /GET PKT PTR K LDA HEAD1 X /TO RM K CAR 0"A"RMSN /EXTRACT SERIAL # K LDX LINEX K IMA RSTSNI X /SAVE AS LATEST INPUT # K ERA RSTSNI X /COMPARE W/ PREV # K SNZ /NEW? K JMP RSTINP I /NO, WE SAW IT BEFORE***NOP ON REI' K LDA THIS /BUILD POST INDEXED PTR TO PKT K ADD RSTCP1 /(HEAD2 0 NIMP X) RSTI2: K STA RST.I K LDX NEGIMP /LOOP OVER ALL IMPS COPYL: K LDA RST.I I /GET ENTRY FROM RECEIVED ROUTING K ANA HOPM /(174000) K ADD HOPM1 /(4000) ADD IN OUR HOP K SNZ /MAX VALUE? K LDA HOPM /YES K STA HOPIN /SAVE RECEIVED HOP COUNT K ICA K STA HOPINS K LDA RST.I I /EXTRACT RECEIVED DELAY K ANA DELM K ADD DELOUR /ADD IN LOCAL DELAY K CAS DELM /(3777) K LDA DELM /TRUNCATE AT MAX DELAY K NOP K STA DELIN /SAVE TOTAL DELAY K LDA CHANB /COMPARE THIS LINE # K ERA RUT+NIMP X /...WITH PREVIOUS BEST FO1 K ANA CHANM /(17437)EXTRACT LINE FIELDS ONLY K CAS BSTDEL /(37)THIS MIN HOP LINE? K JMP COPY11 /NO, SEE IF IT HAS GOOD DATA K NOP K STA CHANS /SAVE /THIS LINE IS PREVIOUS BEST FOR HOPS COPY1: K LDA RST.N I K ANA DELM /EXTRACT OLD DELAY K ERA HOPIN /PUT IN NEW HOPS K IMA RST.N I /SAVE IN RSTN K ANA HOPM K ICA K SUB HOPINS /COMPARE K SPL /CHANGED? K JMP HOLD1 /YES, IF HOPS WORSE DO HOLD-DOWN COPY2: K LDA CHANS /LOOK AI OUR CHAN K SZE /IS IT THE BEST DELAY? K JMP COPY21 /NO /THIS LINE PREVIOUS BEST FOR DELAY K LDA RST.N I /YES K ANA HOPM /EXTRACT OLD HOPS K ERA DELIN /PUT IN NEW DELAY K IMA RST.N I /SAVE IN RSTN K ANA DELM K SUB DELIN /COMPARE K ADD DELCLP /ALLOW FOR SMALL CHANGE W/O HLDDWN K SPL /DELAY GET MUCH WORSE? K JMP HOLD2 /Y, DO HOLD-DOWN COPYI: K IRS 0 /LOOP OVFR ALL IMPS K JMP COPYL K IRS RSTINC /COUNT ANOTHER INPUT COPY COMPLETE K NOP K LDX LINEX /RESTORE X K JMP RSTINP I /RETURN TO TASK /THIS LINE WAS PREVIOUS BEST FOR HOPS, HOPS CHANGED HOLD1: K LDA RUTW+NIMP X /HOPS GOT WORSE K ANA HLDH /GET HOLD-DOWN TIMER K SZE /ON? K JMP COPY2 /Y, GO ON TO DELAY K LDA HLDH /N, TURN IT ON K ERA RUTW+NIMP X /...AND SAVE IN RUTW K STA RUTW+NIMP X K JMP COPY2 /THIS LINE WAS NOT PREVIOUS BEST FOR HOPS COPY11: K ANA BSTDEL /TURN OFF HOP CHAN BITS K STA CHANS /SAVE IN CHANS K LDA RUTW+NIMP X K ANA HLDH /GET HOLD-DOWN TIMER FOR HOPS K SZE K JMP COPY2 /NOT 0, GO DO DELAY NEXT /NOT PREVIOUS BEST HOPS, NOT HOLDING K LDA RST.N I K ANA HOPM /EXTRACT CURRENT HOPS ON BEST K ICA K CAS HOPINS /COMPARE W/ RCVD HOPS K JMP COPY13 /RCVD HOPS BETTER K JMP COPY2 /NO BETTER, DO DELAY NEXT K JMP COPY2 /DITTO /NOT PREVIOUS BEST HOPS, NOT HOLDING, BETTER THAN PREVIOUS COPY13: K ICA K ERA RST.N I /EXTRACT OLD BEST DELAY K ERA HOPIN /PUT IN NEW HOPS K STA RST.N I /SAVE IN RSTN K LDA RUT+NIMP X K ANA CHANML /(160377)EXTRACT CHAN OF MIN DELA1 K ERA CHANL /UPDATE CHAN OF MIN HOPS K STA RUT+NIMP X /SAVE IN RUT K JMP COPY2 /THIS LINE WAS PREVIOUS BEST FOR DELAY, DELAY GOT WORSE HOLD2: K LDA RUTW+NIMP X /DELAY GOT WORSE K ANA HLDD /GET DELAY HOLD-DOWN TIMER K SZE /IS IT ON? K JMP COPYI /YES, GO ON TO NEXT IMP K LDA HLDD /NO, TURN IT ON K ERA RUTW+NIMP X /SAVE IN RUTW K STA RUTW+NIMP X K JMP COPYI /THIS LINE WAS NOT PREVIOUS BEST FOR DELAY COPY21: K LDA RUTW+NIMP X K ANA HLDD /GET DELAY HOLD-DOWN TIMER K SZE K JMP COPYI /NOT 0, GO TO NEXT IMP /NOT PREVIOUS BEST DELAY, NOT HOLDING K LDA RST.N I K ANA DELM /EXTRACT CURRENT DELAY ON BEST K CAS DELIN /COMP W/ RCVD DELAY K JMP COPY23 /RCVD DELAY BETTER K JMP COPYI /NO BETTER. GO ON TO NEXT IMP K JMP COPYI /DITTO /NOT PREV BEST DELAY, NOT HOLDING, BETTER THAN PREVIOUS COPY23: K ERA RST.N I /EXTRACT OLD BEST HOP COUNT K ERA DELIN /PUT IN NEW DELAY K STA RST.N I /SAVE IN RSTN K LDA RUT+NIMP X K ANA CHANMR /(177740)EXTRACT CHAN OF MIN HOP K ERA CHANR /UPDATE CHAN OF BEST DELAY K STA RUT+NIMP X /SAVE IN RUT K JMP COPYI /GO ON TO NEXT IMP LEV CON RSTCKX: K RSTCK1-0-RSTCK2-1 RSTCP1: K HEAD2 0 NIMP X DUMYIN: K .+1 /PTR TO DUMMY MAX INPUT K HOPS+0+DELS NEGIMP: K -NIMP HOPM: K HOPS DELM: K DELS DELCLP: K 10 /SMALL CHANGE TO DELAY IS OK BSTDEL: K RUTDLC HOPM1: K HOPS1 /4000 HLDH1: K RTHPH1 /20000 HLDD1: K RTDLH1 /40 HLDH: K RUTHPH /60000 HLDD: K RUTDLH /140 CHANMR: K 0 0 177777"X"RUTDLC CHANML: K 0 0 177777"X"RUTHPC CHANMB: K 0 0 177777"X"RUTDLC"X"RUTHPC CHANM: K 0 0 RUTDLC"X"RUTHPC RSTCK2: -CHK LEV VAR LINEX: BSS 1 /INPUT LINE= (0 TO CH-1) DELOUR: BSS 1 /OUR LOCAL DELAY OUT OF THIS LINE CHANR: BSS 1 /THIS LINE # +1, IN RIGHT HALF CHANL: BSS 1 / LEFT CHANB: BSS 1 / BOTH HALVES RST.I: BSS 1 /RST POINTER TO INPUT MESSAGE HOPIN: BSS 1 /RCVD HOP COUNT TO THIS IMP HOPINS: BSS 1 /HOPIN WITH HALVES SWAPPED DELIN: BSS 1 /RCVD DELAY TO THIS IMP PLUS LOCAL CHANS: BSS 1 /TEMP = XOR(INPUT LINE, RUT ENTRY) RSTINC: BSS 1 /COUNTER OF CALLS OF RSTIN FOR AL1 RUTW: BSS NIMP CED: BSS CH /COMPUTED EFFECTIVE DELAY RSTSNI: BSS CH /SERIAL # OF LAST RM INPUT CHK=0 LEV T.O RUTOUT: 0 RUTCK1: K LDX RUTCKX /(RUTCK1-0-RUTCK2-1) K CRA K ADD RUTCK2+1 X K IRS 0 /CHECKSUM THIS CODE K JMP .-2 K SZE /DIFFERENT? RELOAD [RUTOUT CODE BROKEN] K JST SWDTIL I /YES, RELOAD K LDX CRSTC /(-NIMP-HEAD2-ACKH) K STX RSTC /INIT CKSUM=-# OF WORDS K STA RST.O I /INIT ACK HEADER AT ZERO K IRS 0 K ADD RSTC /ADD INTO MSG CKSUM K STA RSTC K LDA MINE /THIS IMP # K ICA K AOA 0"A"LINETS /PUT IN ROUTING MSG BIT K STA RST.O I /INIT HEADER K IRS 0 K ADD RSTC /ADD INTO MSG CKSUM K STA RSTC K LDA RSTSN K ADD CRMSN1 /INCREMENT SER # K STA RSTSN K STA RST.O I K IRS 0 K ADD RSTC /ADD INTO MSG CKSUM K STA RSTC COMPL: K LDA RUT+NIMP X K SPL 0"A"RUTDED /THIS IMP DEAD? K JMP RTDEAD /YES K LDA RST.N I K ANA HOPM /GET HOP COUNT K ICA K CAS CMAXH /COMPARE W/ MAX VALUE K JMP RTDIED /TOO BIG, THIS IMP HAS DIED K JMP RTDIED /DITTO K LDA RUT+NIMP X K ANA NOGODN /THIS IMP UP, CLEAR GOING DOWN K STA RUT+NIMP X K STX THDTMP /THIS IMP UP, SAVE AS HIGHEST # SO T NWRST1: K LDA RST.N I NEWRST: K STA RST.O I /SAVE IN RST K ADD RSTC /ADD IN ROUTING MSG CKSUM K STA RSTC /AND PUT IT BACK K IRS 0 /LOOP OVER ALL IMPS K JMP COMPL K TCA /PICK UP FINAL CKSUM ANDCOMPLEMENT K STA RST.O I /STORE AS LAST WRD OF MSG K LDX THDTMP /PICK UP HIGHEST # IMP K LDA RUT+NIMP X K ANA HOPCHM /EXTRACT OUR MIN HOP PATH TO IT K ICA K SUB ONE K STA THD /SAVE IN THD, FOR SYNC ACQUISITIO: K JMP RUTOUT I /AND RETURN RTDEAD: K LDA RST.N I /THIS IMP WAS DEAD K ANA HOPM /EXTRACT BEST HOPS THIS TIME K ICA K CAS CMAXH /COMPARE WITH MAX K JMP RTDOWN /STILL TOO MANY. DEAD K JMP RTDOWN /DITTO RTNOTD: K LDA RUT+NIMP X /GET BEST LINES K ANA CHANM 0"A"RUTDED /TURN OFF RUTDED BIT K ERA COMUPM /PUT IN INITIAL COME-UP DELAY K JMP NWRST2 /PUT IN RUT, THEN SET UF RST RTDIED: K LDA RUT+NIMP X K ANA GODWNM /IMP WAS UP K SZE /IS IT MARKED AS GOING DOWN? K JMP NWRST1 /YES K LDA GODWNM /NO, MARK IT NOW K ERA RUT+NIMP X NWRST2: K STA RUT+NIMP X K JMP NWRST1 RTDOWN: K LDA CMAXHD /REPORT AS DOWN TO NEIGHBORS K STA RST.N I /AND KEEP MAX VAL FOR US K JMP NEWRST /...BY SETTING RST TO MAX VALUE LEV CON RUTCKX: K RUTCK1-0-RUTCK2-1 CRSTC: K -NIMP-HEAD2+ACKH CRMSN1: K RMSN1 /400 HOPCHM: K RUTHPC /17400 CMAXH: K 0 0 MAXH"T"8. /260 COMUPM: K RUTCMU /340 GODWNM: K RUTGOD /60000 NOGODN: K 0 0 177777"X"RUTGOD /117777 CDEAD: K RUTDED /100000 CMAXHD: K 0 0 HOPS"X"DELS /177777 RUTCK2: -CHK LEV VAR RSTC: BSS 1 /ROUTING MESSAGE CHECKSUM THDTMP: BSS 1 /TEMP FOR THD RSTSN: BSS 1 /SERIAL # OF LAST RM COMPUTATION LEV CON CONSTANTS PAGEND 26,UNCON,15 LEV T.O CHK=0 RUTCLK: 0 RTCLK1: K LDX RTCLKX K CRA K ADD RTCLK2+1 X K IRS 0 K JMP .-2 K SZE RELOAD [RUTCLK CODE BROKEN] K JST SWDTIL I K LDX NIMPMI /LOOP OVER ALL IMPS FOR HOLD-DOWN HLDC1: K LDA RUT.W I K ANA HOLDH K SNZ /ARE WE HOLDING DOWN MIN HOP PATH? K JMP HLDC2 /NO K LDA RUT.W I K SUB HOLDH1 /DECREMENT TIMER K STA RUT.W I HLDC2: K LDA RUT.W I /NO K ANA HOLDD K SNZ /HOLDING DOWN MIN DELAY PATH? K JMP HLDC3 /NC K LDA RUT.W I K SUB HOLDD1 /DECREMENT TIMER K STA RUT.W I HLDC3: K IRS 0 K JMP HLDC1 /NEXT K IRS GODWNC /IS IT TIME TO DO GOING DOWN DELA' K JMP CMUC0 /NO K LDA GODWNK /YES, EVERY 4TH TICK K STA GODWNC K LDX NIMPMI /LOOP OVER ALL IMPS FOR GOING DOWNS GODC1: K LDA RUT+NIMP X K ANA MGODWN K SNZ /THIS IMP GOING DOWN? K JMP GODC2 /NO K LDA RUT+NIMP X /YES K SUB MGODW1 /DECREMENT TIMER K STA RUT+NIMP X K ANA MGODWN K SZE /IS IT COMPLETELY DOWN? K JMP GODC2 /NO K LDA MAXRST /YES. HE IS REALLY DEAD K STA RST.N2 I /SET UP RSTN K LDA MAXRUT K STA RUT+NIMP X /AND RUT GODC2: K IRS 0 K JMP GODC1 CMUC0: K IRS COMUPC /IS IT TIME TO DO COMING-UP DELAYS K JMP RMVFRQ /NO, DO VBL FRQ CMPTNS K LDA COMUPK /YES, EVERY TENTH TICK K STA COMUPC K LDX NIMPMI /LOOP OVER ALL IMPS FOR COMING UP CMUC1: K LDA RUT+NIMP X K ANA MCOMUP K SNZ /IS THIS IMP COMING UP? K JMP CMUC2 /NO K LDA RUT+NIMP X /YES K SUB MCOMU1 /DECREMENT TIMER K STA RUT+NIMP X /SAVE IN RUT(IF HE CAME [ CMUC2: K IRS 0 K JMP CMUC1 RMVFRQ: K LDX RMMICH /-CH RMVFRC: K CRA K STA RMVT K IMA CTIMK I /CLEAR CUMTIM AND COMPUTE EXTRAS RMVFRA: K SUB MS132K K SPL K JMP RMVFRB K IRS RMVT K JMP RMVFRA RMVFRB: K LDA RMFOUR K SUB RMVT K SPL K CRA K ADD CRMVTB K STA RUTFRQ+CH X K IRS 0 K JMP RMVFRC /LOOP OVER ALL LINES K JMP RUTCLK I LEV CON NIMPMI: K -NIMP RMMICH: K -CH CTIMK: K CUMTIM CH X RMFOUR: K 4 MS132K: K 2450 MAXRST: K HOPS+0+DELS MAXRUT: K RUTDED GODWNK: K -6 COMUPK: K -9. RUT.W: K RUTW+NIMP X RST.N2: K RST2+NIMP X HOLDH: K RUTHPH HOLDD: K RUTDLH MGODWN: K RUTGOD MGODW1: K RUTGD1 MCOMUP: K RUTCMU MCOMU1: K RUTCM1 HOLDH1: K RTHPH1 HOLDD1: K RTDLH1 /RMVTAB USED BY RSTOUT RMVTAB: K 1 /1BIT IN 5 (# OF EXTRA +1 RM'S TO S1 K 5 /2 IN 5 (I.E. 1 EXTRA) K 15 K 33 K 37 CRMVTB: K RMVTAB RTCLKX: K RTCLK1-0-RTCLK2-1 RTCLK2: -CHK LEV VAR GODWNC: BSS 1 /COUNTER - EVERY 4TH TICK COMUPC: BSS 1 /COUNTER - EVERY 10TH TICK HOLDT: BSS 1 /TEMP RMVT: BSS 1 /TEMP RUTFRQ: BSS CH /# OF EXTRA RM'S PERMITTED AS PER LEV CON CONSTANTS PAGEND 27,UNCON LEV BCK /STATISTICS PROGRAMS /ALL CALLS TO DEFSTAT MUST PRECEDE THIS PAGE STTI: LDA ONE STA SOFO /BEGIN BY SAVING COPY OF SON BKST: LDA SON /PICK UP 10-SEC STAT ON-OFF FLAG IMA SOFO /KEEP A COPY CAS SON /ANY CHANGE IN STATUS? SKP /YES, MUST CHANGE STATISTICS LOCATI1 JMP SP2 /NO SNZ /WAS 10-SEC STAT JUST TURNED ON? JMP SP1 /YES LDX (-NSTATS) /NO, JUST TURNED OFF LDA (SC1+NSTATS 0 X) I /PICK UP STANDARD CONTE:'1 STA (SB1+NSTATS 0 XI) I /AND PLANT IN DESIGNATED ] IRS 0 /THIS RESTORES PROGRAM TO ITS DEFAUT JMP .-3 JMP SP2 SP1: JST CLST /CLEAR OUT 10-SEC STAT TABLES LDX (-NSTATS) LDA (JST SW1 I) /PLANT JST'S TO STATISTIC STA (SB1+NSTATS 0 XI) I AOA /THIS PUTS BREAKPOINT-LIKE CODE IRS 0 /IN KEY PLACES THROUGHOUT THE PROGR JMP .-3 SP2: LDA (50000+0+DIAGTT) STA DIAGD LDA (DIAGQ 0 I) STA DIAGON /DIAG IS ALWAYS ON LDA (TRON 0 I) STA SP81 /INDIRECT POINTER FOR ON FLAGS LDX MINUS5 /SO THAT NCC TRBL REPTS ALWAYS GO[ STX TPON /TURN ON NCC TRBL REPTS SP3: STX SP8 /LOOP HERE FOR EACH STAT PROGRAM LDA SP81 I SNZ /IS THIS STAT PROGRAM TURNED ON? JMP SP91 /NO LDA SYNC /PICK UP CURRENT TIME SUB OLDS+5 X /COMPARE WITH THE LAST TIME THIS PR SPL /CORRECT FOR TIMER OVERFLOW TCA /EVERY 30 MINUTES SUB STATF+5 X /LOOK AT INTERVAL BETWEEN PROGRAM R SPL /IS IT TIME TO ACTIVATE THIS PROG? JMP SP91 /NO CRA /YES STA SKEWT /INIT A TIME-SKEWING TEMP LDA 0 ERA MINUS4 SZE /ARE WE DOING 10-SEC STAT? JMP STAT6 /NO LDA STATF+5 X /YES, SKEW REPORTS BY IMP NUMBER ARS 6 0"A"NIMP /DIV BY 100 = IMPNO SNZ JMP STAT6 /TOO SMALL AN INTERVAL TO SKEW TCA STA COUNT1 /BUILD MULTIPLY LOOP STAT4: LDA MINE TCA STA COUNT2 STAT5: IRS SKEWT /COMPUTE SKEWT=(MINE/100)*STATF IRS COUNT2 JMP STAT5 IRS COUNT1 JMP STAT4 STAT6: LDA STATF+5 X TCA ANA SYNC ADD SKEWT STA OLDS+5 X LDA STATD+5 X /*SEND STAT DEST JST GIVE LDA STATL+5 X /*SEND STAT LINK JST GIVE JMP CAWL+5 XI /CALL STAT PROGRAM GIVLST: LDX (100003) /TERMINATE STAT MESSAGE LDA SIGN /*SEND PADDING JST JAM I SP91: LDX SP8 /LOOP BACK OVER EACH STAT PROG IRS SP81 IRS 0 JMP SP3 LDX THREE JST DOZE I JMP BKST LEV CON CAWL: SNAP /SNAPSHOT STATISTICS PROGRAM SEST /CUMULATIVE STATISTICS PROGRAM GENM /MESSAGE GENERATOR DIAG /DIAGNOSTIC SENDER TRBL /NCC TROUBLE REPORT PROGRAM LEV VAR OLDS: 0 0 0 0 TRBOLD: 0 SP8: BSS 1 /COUNTER FOR WHICH STAT PROG TO RUN SP81: BSS 1 /STAT FLAGS INDIRECT PTR SOFO: BSS 1 /SAVED COPY OF SON SKEWT: BSS 1 /AMOUNT OF TIME TO SKEW STAT REPTS COUNT1: BSS 1 COUNT2: BSS 1 /SEND SNAPSHOT STATISTICS LEV BCK SNAP: LDA (5) /*SEND SNAPSHOT CODE JST GIVE LDA TIME /*SEND LOCAL TIME JST GIVE LDX (-COUNTL) SNP2: INH ALL LDA COUNTA+COUNTL X /*SEND QUEUE LENGTHS SUB COUNTS+COUNTL X ENB BCK JST GIVE IRS 0 JMP SNP2 LDX MINIMP SNP3: LDA RUT+NIMP X /*SEND ROUTE USE TABLE JST GIVE LDA (RST+NIMP 0 X) I /*SEND ROUTE SEND TABLE JST GIVE IRS 0 JMP SNP3 JMP GIVLST /*SEND PADDING AND END MESSAGE /SEND 10 SECOND (CUMULATIVE) STATISTICS SEST: LDA TWO /*SEND 10-SEC STAT CODE JST GIVE LDA SYNC /*SEND NETWORK-WIDE TIME JST GIVE LDX (-NST) LDA (STTB+NST X) I /*SEND 10-SEC STAT TABLE JST GIVE IRS 0 JMP .-3 JST CLST /CLEAR THE 10-SEC STAT TABLES JMP GIVLST /*SEND PADDING AND END MESSAGE LEV BCK /CLEAR ALL ENTRIES IN 10-SEC STAT TABLES CLST: 0 LDX (-NST) CRA INH ALL STA (STTB+NST X) I IRS 0 JMP .-2 ENB BCK JMP CLST I /MESSAGE GENERATOR GENM: LDX THREE /FAKE HOST 3 - STATISTICS LDA MGNL /PICK UP LENGTH OF MESSAGE ANA (777) SNZ JMP GENM1 TCA /GIVES RIGHT NUMBER, EXCLUDING PADD STA MGCNT JST JAM I /*SEND MGNL WORDS IRS MGCNT JMP .-2 GENM1: RDCLOK JMP .-1 /CRA FOR ALL REG, LDA ONE FOR ALL PRI, ANA ONE FOR RANDOM MI CRA SZE LDA SIGN ERA MGD STA MGD LDA MGLK NOP /"SKP" TO RUN LINK CYCLER JMP GIVLST /*SEND PADDING AND END MESSAGE SNZ JMP LC1 LC3: ADD (400) STA MGLK SZE JMP GIVLST /*SEND PADDING AND END MESSAGE LDA TIME SUB OTIM STA PLAC I IRS PLAC LDA MGNL ADD IGTH STA MGNL SUB LIMT SMI JMP LC44 LC1: LDA TIME STA OTIM LDA MGLK JMP LC3 LC44: CRA /WHEN DONE, SHUT MGEN OFF STA MGON JMP GIVLST /*SEND PADDING AND END MESSAGE LEV VAR IGTH: 10 /LENGTH INCREMENT PLAC: 30000 /CORE POINTER FOR TABLE BUILDING LIMT: 760 /LONGEST MESSAGE TO SEND OTIM: BSS 1 /TEMP TO SAVE STARTING TIME OF BLOC MGCNT: BSS 1 /TEMP COUNTER FOR MESS LENGTH LEV BCK DIAG: INH ALL /SEND BROKEN PACKETS TO NCC FOR DIAT LDA DIAGQ I IMA DIAGQ /GET PKT OFF DIAG QUEUE ENB BCK STA DIAGP /SAVE PNTR LDA HLTLOC /*SEND HLT PC JST GIVE LDA HLTA /*SEND HLT A REG JST GIVE LDA HLTX /*SEND HLT X REG JST GIVE LDA DIAGP /*SEND PKT PNTR STA 0 JST GIVE LDA (-BUFL) STA DIAGC /SET UP SEND COUNTER DIAG1: LDA 0 X /*SEND CONTENTS OF BAD PACKET JST GIVE IRS 0 IRS DIAGC JMP DIAG1 INH ALL LDX DIAGP JST FLUSHI I ENB BCK JMP GIVLST LEV VAR DIAGP: BSS 1 /PKT PNTR DIAGC: BSS 1 /LOOP COUNTER LEV BCK GIVE: 0 /STAT CALLS TO JAM STX STT8 /SAVE X-REG LDX THREE JST JAM I LDX STT8 JMP GIVE I LEV VAR STT8: BSS 1 LEV BCK /FAKE IMP-TO-HOST 2 - PARAMETER CHANGE BTR1: JST SUCK I /SKIP OVER REST OF MESSAGE JMP BTR1 BEST: JST SUCK I /BEGIN TO ACCEPT MESSAGE HERE JST SUCK I /IGNORE LEADER BTR4: JST SUCK I /GET NUMBER OF PARAM TO CHANGE SKP /END OF MESSAGE? JMP BEST /YES, GO BACK SPL /IS NO OF PARAM ROSTIVE? JMP BTR1 /NO, IGNORE REST OF MESSAGE ANA (37) /YES, MASK DOWN TO 5 BITS ADD (PARAMT) /BUILD PNTR TO PARAM TABLE STA BTR2 JST SUCK I /GET NEW VALUE FOR PARAMETER SKP /END OF MESSAGE? JMP BEST /YES, NO CHANGE TO THIS PARAM STA BTR2 I /NO, PUT NEW VALUE IN PARAM JMP BTR4 /AND GO BACK FOR MORE LEV VAR BTR2: 0 DEFPLC [PARAMETERS TABLE] PARAMT: PARAML=32. TRON: BSS 1 /0-TRACE ON SNON: BSS 1 /1-SNAP ON SON: BSS 1 /2-10-SEC STAT ON MGON: BSS 1 /3-MESS GEN ON DIAGON: BSS 1 /4-DIAG ON TPON: BSS 1 /5-TRBL REPT ON BSS 1 /6 TLNK: BSS 1 /7-TRACE LINK STATL: BSS 1 /10-SNAP LINK BSS 1 /11-10-SEC LINK MGLK: BSS 1 /12-MESS GEN LINK BSS 1 /13-DIAG LINK BSS 1 /14-TRBL REPT LINK TDST: BSS 1 /15-TRACE DEST STATD: BSS 1 /16-SNAP DEST BSS 1 /17-10-SEC DEST MGD: BSS 1 /20-MESS GEN DEST DIAGD: BSS 1 /21-DIAG DEST TRBD: BSS 1 /22-TRBL REPT DEST TF: BSS 1 /23-AUTO TRACE FREQ STATF: BSS 1 /24-SNAP FREQ BSS 1 /25-10-SEC FREQ BSS 1 /26-MESS GEN FREQ BSS 1 /27-DIAG FREQ TRBF: BSS 1 /30-TRBL REPT FREQ MGNL: BSS 1 /31-MESS GEN LENGTH BSS PARAMT+1+PARAML-. LEV BCK /FAKE IMP-TO-HOST 3 - DISCARD STXY: JST SUCK I /GET EACH WORD AS IT IS READY JMP .-1 /AND RETURN IMMEDIATELY FOR MORE JMP .-2 /EVEN ON END OF MESSAGE /FAKE HOST-TO-IMP 2 - TRACE BTRE: SSM /START HERE JMP BTRF LCK TSK BTD: ENB BCK LDA T3BX SNZ JMP BTRD LDA SIGN LDX (100002) JST JAM I BTRC: JST DOZE I /WAIT ONE BACKGROUND LOOP LDA STRQ /START HERE SNZ /ANYTHING TO SEND? JMP BTRC /QUIT IF TRACE QUEUE EMPTY CRA BTRF: STA T3BX LDA TDST /*SEND TRACE DEST JST JAM I LDA TLNK /*SEND TRACE LINK JST JAM I LDA ONE /*SEND TRACE CODE JST JAM I CRA /RESET OVERFLOW FLAG IMA TTO /*SEND STATE OF OVERFLOW FLAG JST JAM I BTRD: LDX TWO JST DOZE I BRL2: LDA ((STRQ)) STA OLD2 INH TSK BTRL: LDA OLD2 I /SEARCH TRACE QUEUE STA OLD2 LDA OLD2 I STA OLD1 SNZ JMP BTD /JUMP IF DONE WITH TRACE QUEUE STA 0 LDA TDONE X SMI /IS THIS TRACE BLOCK COMPLETE? JMP BTRL /NO LDA 0 X /YES, PICK UP ITS CHAIN PNTR STA OLD2 I /REMOVE FROM TRACE QUEUE ENB BCK IRS T3BX LDA (-TDONE) STA T2BX LDX TWO IRS OLD1 LDA OLD1 I JST JAM I /*SEND TRACE BLOCK IRS T2BX JMP .-4 LDA OLD1 ADD (-TDONE) INH TSK IMA TTF /PUT DN FREE TRACE QUEUE STA TTF I ENB BCK JMP BRL2 /LOOP SEARCHING TRACE QUEUE LEV VAR T2BX: BSS 1 /COPY LOOP COUNTER T3BX: BSS 1 /COUNT OF NUMBER OF BLOCKS COPIED OLD2: BSS 1 /QUEUE PNTR - USED IN SEARCH OLD1: BSS 1 /PACKET PNTR - USED IN COPY LEV CON CONSTANTS PAGEND 30,UNCON,3 LEV H2I /HOST TO IMP STATISTICS HS0: 0 LDA (STTB) INH [I2M,I2H] STA WHER LDA HIP JST SUB1 ADD TOT1 STA TOT1 ENB H2I LDX HIP LDX HIXX I LDA HEAD2 X JMP HS0 I / HOST TO IMP ALL MESSAGES HS2: 0 IRS CNT2 X NOP JMP (HIH0 0 XI) I LEV I2H / IMP TO HOST STATISTICS HS1: 0 LDA (XGP) INH I2M STA WHER LDA IHP LDX IHXX I JST SUB1 ADD TOT2 STA TOT2 ENB I2H LDX IHP LDA (IHED 0 X) I JMP HS1 I / IMP TO HOST CONTROL MESSAGES HS3: 0 AOA IRS CNT3 X NOP JMP HS3 I LEV VAR WHERL: BSS 1 WHER: BSS 1 SUBL: BSS 1 LEV I2M SUB1: 0 SUB PLNH SMI JMP SP6 LDA BUFE X SUB 0 SUB (DATA) SSP 0"A"TWOQ STA SUBL JST LOG ADD SEVEN /POINTS TO LAST-PACKET LENGTH COUNT] ADD WHER /...IN CORRECT TABLE STA WHERL IRS WHERL I /AND GOOSE COUNTER NOP LDA HEAD1 X ICA 0"A"PKTNO ANA SEVEN SNZ JMP SP4 /NO SEPARATE COUNTER FOR 1PKT MSGS SUB ONE /BACK OFF 1 ADD WHER STA WHER IRS WHER I NOP SP4: LDA SUBL JMP SUB1 I SP6: LDX SUB1 JMP 2 X / IMP TO MODEM MESSAGES IM1: 0 STA (ACKWRD) I STA 0 LDA BUFE-ACKH X SUB 0 SUB THREE 0"A"[HEAD2-ACKH] SSP 0"A"TWOQ STA IMT1 JST LOG LDX (OCHN) I ADD TUB1 X STA IMT2 IRS IMT2 I NOP LDA IMT1 ADD ANS4 X STA ANS4 X JMP IM1 I LEV M2I / MODEM TO INP DISCARD MI1: 0 IRS MTOT M1ERR JMP MI1 I IRS CKSM IRS MI1 NOP JMP MI1 I /TASK I HEARD YOU MESSAGES RECEIVED TSKIH: 0 IRS LAC X IRS TSKIHY X NOP JMP TSKIH I / MODEM TO IMP BUFFER TROUBLE MI3: 0 SZE IRS MI3 SNZ IRS BUFT X NOP JMP MI3 I /MORE OF MODEM TO IMP DISCARD MI1A: 0 IRS MTOT+1 M2ERR JMP MI1A I IRS CKSM+1 IRS MI1A NOP JMP MI1A I MI1B: 0 IRS MTOT+2 M3ERR JMP MI1B I IRS CKSM+2 IRS MI1B NOP JMP MI1B I MI1C: 0 IRS MTOT+3 M4ERR JMP MI1C I IRS CKSM+3 IRS MI1C NOP JMP MI1C I MI1D: 0 IRS MTOT+4 M5ERR JMP MI1D I IRS CKSM+4 IRS MI1D NOP JMP MI1D I LEV H2I HS4: 0 STA BUFE X LDX (PPSLT) I RDCLOK JMP .-1 STA PPT1 X /SAVE SENT TIME FOR 1 PKT MESS LDX (PPSLT 0 I) I JMP HS4 I HS5: 0 /SHOULD ONLY DO THIS ONCE, NEED A C+ STA PLT2 X RDCLOK JMP .-1 STA PLT3 X /SAVE SENT TIME FOR 8 PKT MESS JMP HS5 I LEV TSK LCK FRE HS6: 0 RDCLOK JMP .-1 LDX (PPTASK) I SUB PPT1 X JST HSTIME /GET ROUND-TRIP TIME FOR 1 PKT ME1 JMP (PPTFRE) I HS7: 0 RDCLOK JMP .-1 LDX (PPTASK) I SUB PLT3 X JST HSTIME /GET ROUND-TRIP TIME FOR 8 PKT MESS JMP (GUDRP0) I HSTIME: 0 LGR 3 LDX (SOURCE) I ADD HS4R X STA HS4R X IRS HS4S X JMP HSTIME I LEV CON TUB1: XGP1+0 XGP1+6 XGP1+12. XGP1+18. XGP1+24. XGP1+30. LEV VAR IMT1: BSS 1 IMT2: BSS 1 /CUMULATIVE STATS SENT IN THIS ORDER /STATISTICS GATHERED BY H2I STTB: BSS 13. /HISTOGRAM OF H2I MESS LENGTH - A1 TOT1: BSS 1 /TOTAL # OF H2I WORDS /STATISTICS GATHERED BY I2H XGP: BSS 13. /HISTOGRAM OF I2H MESS LENGTH - A1 TOT2: BSS 1 /TOTAL # OF I2H WORDS /STATISTICS GATHERED BY H2I CNT2: BSS TH /# OF H2I ALL MESSAGES PER HOST /STATISTICS GATHERED BY I2H CNT3: BSS TH /# OF I2H CONTROL MESSAGES PER HOST /STATISTICS GATHERED BY TSK HS4R: BSS NIMP /TOTAL ROUND TRIP TIME IN 800 MS PE1 HS4S: BSS NIMP /# OF ROUND TRIPS MEASURED ABOVE /STATISTICS GATHERED BY I2M IMHS: BSS CH /# OF HELLOS SENT PER LINE ANS4: BSS CH /# OF DATA WOSDS SENT PER LINE /STATISTICS GATHERED BY M2I MTOT: BSS CH /# OF INPUTS RECVD PER LINE CKSM: BSS CH /# OF CHECKSUM ERRORS PER LINE /STATISTICS GATHERED BY TSK TSKIHY: BSS CH /# OF I HEARD YOUS RECVD PER LINE /STATISTICS GATHERED BY M2I BUFT: BSS CH /# OF INPUTS LOST DUE TO LACK OF [ SLOW: BSS CH /UNUSED /STATISTICS GATHERED BY I2M XGP1: BSS CH+CH+CH+CH+CH+CH /HISTOGRAM OF I2M MESSA[ EP20: BSS 1 /BEGINNING OF PATCH AREA NST=0+0+EP20-STTB LEV I2M / LOG SUBROUTINE LOG: 0 STX LOGX CAS SEVEN JMP LOG1 NOP SPL JMP LOG3 STA 0 LDA LOGT X JMP LOG2 LOG1: ARS 3 CAS SEVEN LOG3: LDA SEVEN NOP STA 0 LDA LOGT X ADD THREE LOG2: LDX LOGX JMP LOG I LEV VAR LOGX: BSS 1 LEV CON LOGT: 0 0 1 1 2 2 2 2 LEV CON CONSTANTS SB1: BSS NSTATS /ADDRESSES FOR STAT INSTR SC1: BSS NSTATS /NOMINAL CONTENTS PAGEND 31,SC1+NSTATS LEV VAR TABZB: /THIS ENTIRE PAGE IS ZEROED AT INIT /TABLES OF BUFFER PNTRS, NACH FOR EACH LINE I2MB0: BSS NACH I2MB1: BSS NACH I2MB2: BSS NACH I2MB3: BSS NACH I2MB4: BSS NACH /NULL AREAS NULS1: BSS HEAD3-ACKH+1 /ACKS GO HERE NULS2: BSS HEAD3-ACKH+1 /ACKS GO HERE NULS3: BSS HEAD3-ACKH+1 /ACKS GO HERE NULS4: BSS HEAD3-ACKH+1 /ACKS GO HERE NULS5: BSS HEAD3-ACKH+1 /ACKS GO HERE NTRCB=8 TRACEL=TDONE+1 TRACEQ: BSS NTRCB"T"TRACEL /TRACE STORE TALLYL=8. TALLY: BSS TALLYL /STACK OF TRANSMIT ALLOCATES WE HAVT DEFPLC [TRANSMIT, RECEIVE, AND ALLOCATE MESSAGE TABLES] TMESS: BSS NIMP RMESS: BSS NIMP AMESS: BSS NIMP DEFPLC [RALLY TABLE - ALLOCATES TO SEND] RALLY: BSS NIMP LEV CON PAGEND 32,-0 LEV VAR /ROUTE SEND TABLES /SEND ROUTING MESSAGE FROM HERE RSTX: BSS 1 /ACKS BSS 1 /HEADER BSS 1 /SERIAL NO. (LH) RST: BSS NIMP /ROUTE SEND TABLE RSTCKS: BSS 1 /CHECKSUM /END OF ROUTING MESSAGE /ALTERNATE ROUTING MESSAGE BUFFER 1 RSTX1: BSS 1 /ACKS BSS 1 /HEADER BSS 1 /SERAIL NO. (LH) RST1: BSS NIMP /ROUTE SEND TABLE BSS 1 /CHECKSUM /ALTERNATE ROUTING MESSAGE BUFFER 2 RSTX2: BSS 1 /ACKS BSS 1 /HEADER BSS 1 /SERIAL NO. (LH) RST2: BSS NIMP /ROUTE SEND TABLE BSS 1 /CHECKSUM LEV VAR NREAB=8 /8 - NEED MANY FOR <8 PKT MESSAGES REASL=RSF+1 REASQ: BSS NREAB"T"REASL /REASSEMBLY STORE PPTL=8. /NUMBER OF ENTRIES IN PPT PPTN=2 /NUMBER OF WORDS PER ENTRY IN PPT PPTNUM=PPTL"T"PPTN DEFPLC [PPT - PENDING PACKET TABLE] PPT: BSS PPTNUM /TABLE OF PNTRS TO PENDING PACKET1 PLTL=12. /NUMBER OF ENTRIES IN PLT PLTN=4 /NUMBER OF WORDS PER ENTRY IN PLT PLTNUM=PLTL"T"PLTN DEFPLC [PLT - PENDING LEADER TABLE] PLT: BSS PLTNUM /TABLE OF COPIED PENDING LEADERS HTPTBL: /TABLE OF HOST THROUGHPUTS HTPMTN: BSS NH /MESSAGES FROM HOST TO NET HTPMFN: BSS NH /MESSAGES TO HOST FROM NET HTPPTN: BSS NH /PACKETS FROM HOST TO NET HTPPFN: BSS NH /PACKETS TO HOST FROM NET HTPMTL: BSS NH /MESSAGES FROM HOST TO LOCAL HOST HTPMFL: BSS NH /MESSAGES TO HOST FROM LOCAL HO1 HTPPTL: BSS NH /PACKETS FROM HOST TO LOCAL HOST HTPPFL: BSS NH /PACKETS TO HOST FROM LOCAL HOST HTPWTI: BSS NH /WORDS FROM HOST TO IMP HTPWFI: BSS NH /WORDS TO HOST FROM IMP TABZE: TABZL=TABZE+0-TABZB LEV CON IRP [PAGEN,,33,34,35,36] PAGEND PAGEN,-0 ENDIRP P36FB=FB P36NB=NB PAGEND 37,-0 P37NB=NB-1 /ALLOW FOR SAT CODE P37FB=FB 100003/ -0 VDHSTART VDHEND .ASCII / VDH "Z"/ NMAXS=4"T"CH 100001/ NBUFS-2 .ASCII / TOTAL BUFFERS"Z"/ 100001/ P37NB .ASCII / FEWER BUFFERS IF VDH PRESENT"Z"/ 100001/ NMAXS .ASCII / STORE AND FORWARD LIMIT"Z"/ 100001/ 0 0 [0 0 [NBUFS-NMAXS+10]"Q"10]"T"10+2 .ASCII / REASSEMBLY LIMIT"Z"/ 100001/ NITB .ASCII / IMP-TIP CONVERSION REGISTERS"Z"/ 100001/ NSTATS .ASCII / STATISTICS GATHERING PLACES"Z"/ START /VERY DISTANT HOST 37000/ VDHSTART: ITBVP=0 /FILL IN THE VDH/IMP INITIALIZATION TABLE LEV CON VDHD VDH2,JST VDH2. I,NOP VDHD VDH3,JST VDH3. I,NOP /BUILD INSTRUCTIONS DEPENDENT ON M.N & H.N AND FINISH TABLE IRPC [L,,1234] REPEAT 1IF VZ L-1-H.N,[ VD.HOI=H'L'OTIL VD.HII=H'L'INIL VD.HIB=H'L'INBP VD.IHB=H'L'OTBP VDHD SKST H.N,NOP,H'L'RDY VDHD IHED H.N,IRS VD.OT,H'L'FOUT VDHD IHOT H.N,NOP,H'L'ROUT VDHD HER H.N,NOP,H'L'ERR VDHD HIN H.N,JMP HIFAKE,H'L'IN VDHD EMIT H.N,SKP,H'L'EOM VDHD HENABT H.N, IRS VD.RDY, H'L'ENAB ] /END THE REPEAT ENDIRP /HOST34=0 V.1=74000 V.2=134000 V.3=154000 V.4=164000 V.5=170000 /HOST34>0 V..1=70000 V..2=130000 V..3=150000 V..4=160000 V..5=170000 /HOST34<0 V...1=60000 V...2=120000 V...3=140000 V...4=160000 V...5=160000 IRPC [L,,12345] REPEAT 1IF VZ L-1-M.N,[ VD.IIM=V.'L VD..IM=V..'L VD...M=V...'L VD.OIP=M'L'OTBP VDHD 64 M.N,VD.II,M2I'L VDHD 71 M.N,VD.OI,I2M'L ] /END OF REPEAT ENDIRP /PACKET CONTROL WORD FORMAT /BITS MEANINGS /1 LAST PACKET BIT /2 PACKET'S ODD/EVEN BIT /3-8 PACKET'S WORD COUNT / 0 = ACKS ALONE / 1-63 = NUMBER OF WORDS (INCLUDING LEADER) /9 HOST/IMP BIT -- ONE FROM HOST /10 UNUSED /11-12 UNUSED (CHANNEL 3 < CHANNEL 2 ACKS) /13 CHANNEL 1 ACK /14 CHANNEL 0 ACK /15 UNUSED (EXTENDED CHANNEL NUMBER) /16 CHANNEL NUMBER /VERY DISTANT HOST VARIABLES VDHNC=2 /NUMBER OF CHANNELS LEV VAR VD.TB: BSS VDHNC /TRANSMIT BUFFER POINTERS /ZERO MEANS UNUSED VD.RB: BSS VDHNC /RECEIVE BUFFER POINTERS /ZERO MEANS UNUSED VD.ZVB: /BEGINNING OF VARIABLES TO BE ZEROEI VD.TFP: 0 /TRANSMIT FILL POINTER -- MUST "SEQ1 VD.TEP: 0 /TRANSMIT EMPTY POINTER VD.REP: 0 /RECEIVE EMPTY POINTER -- MUST "SEQ1 VD.TOE: BSS VDHNC /TRANSMIT ODD/EVEN BITS VD.ROE: BSS VDHNC /RECEIVE ODD/EVEN BITS VD.T: 0 /COUNTS IF TOO LONG WITHOUT ACK /POSITIVE MEANS TOO LONG VD.R: 0 /COUNTS IF IT IS TIME TO SEND DUPL T /POSITIVE MEANS SEND ON VD.D: 0 /COUNTS IF LINE HAS BEEN HELD DEAD T /NEG MEANS NOT LONG ENOUGH VD.TE: BSS VDHNC /TRANSMIT LAST PACKET BIT VD.RE: BSS VDHNC /RECEIVE LAST PACKET BIT VD.ZVE: /END OF VARIABLES TO BE ZEROED VD.HOL: 0 /EXPECTING OUTPUT OF LEADER FLAG VD.RCN: 0 /RECEIVE CHANNEL NUMBER VD.EXP: 0 /200 IF EXPECTING PKTS FROM HOST /0 IF EXPECTING FROM SELF (LOOPED) 15SECS=30 5SECS=10 2.5SECS=4 /VERY DISTANT HOST INITIALIZATION LEV BCK VD.I: 0 LDA (4000) IMA VDHUPF /MARK VDH AS UP SZE /WAS ALREADY UP? JMP VD.I I /YES, JUST GO AWAY QUIETLY STA VD.TB /ZERO RECEIVE AND TRANSMIT BUFFER ': STA VD.TB 1 STA VD.RB STA VD.RB 1 LDA (200) /BEGIN EXPECTING LINE UNLOOPED STA VD.EXP INH ALL JST (GETFRE) I JMP VD.I9 /NO BUFFERS FREE LDA 0 ADD (100000+CNTL+1) STA M1INBP+2"T"M.N ADD (BUFE-CNTL-1) STA M1INBP+2"T"M.N+1 LDX (-MAXVDH) LDA ITBVDH+MAXVDH X /VDHDEFS STA (ITBVDL+MAXVDH XI) I IRS 0 JMP .-3 M1IN+M.N JST VD.REI JMP VD.I I LEV [VDI,T.O] LCK ALL VD.REI: 0 /REINITIALIZE LDX (VD.ZVB 0-VD.ZVE CRA /ZERO VARIABLES WHICH NEED IT STA VD.ZVE X IRS 0 JMP .-2 STA VD.OIP /CLEAR OUTPUT INTERRUPT PENDING F1 LDX MINUS4 /FREE ANY BUFFERS STX VD.HOL /INITIALIZE TO NON-ZERO STX VD.OT /FIX OUTPUT TYPE FLAG *TEMP* VD.REK: CRA IMA VD.TB 4 X SNZ JMP VD.REJ STX VD.REX SSP STA 0 JST FLUSHI I LDX VD.REX VD.REJ: IRS 0 JMP VD.REK LDA (-15SECS STA VD.D /MARK TO HOLD LINE DEAD LDA (NOP /DROP READY LINE STA (SKST H.N) I JMP VD.REI I /DONE, SO RETURN VD.I9: IRS VDHRSF /TRY AGAIN LATER JMP VD.I LEV VAR VD.REX: 0 /VERY DISTANT HOST INPUT INTERRUPT ROUTINE LEV VAR VD.IK: 0 /SAVED KEYS VD.IIB: 0 /BUFFER POINTER VD.IA: 0 /SAVED A VD.IX: 0 /SAVED X VD.IM: 0 /SAVED MASK VD.RBL: 0 /RECEIVE BUFFER LENGTH VD.CWP: 0 /POINTER TO PACKET CONTROL WORD VD.II: INT VDI STA VD.IA /SAVE MASK AND REGISTERS STX VD.IX LDA (HOST34) I LDX (VD.IIM) /HOST34=0 SZE LDX (VD..IM) /HOST34>0 SPL LDX (VD...M) /HOST34<0 LDA 0 SMK INTM IMA PRIM STA VD.IM INK STA VD.IK JST DODXA I RET VDI LDA M1INBP+1 2"T"M.N /GET BUFFER POINTER SSP SUB (BUFE /SAVE BUFFER POINTER STA VD.IIB ADD (CNTL 1 STA VD.CWP LDA VD.D /IS LINE BEING HELD DEAD SPL JMP VD.II2 /YES M1ERR M.N /ERROR? SKP JMP VD.II2 /YES LDA VD.CWP I ANA (200) ERA VD.EXP /IS PACKET FROM WHOM EXPECTED? SNZ JMP VD.II1 /YES, GO PROCESS IT ERA VD.EXP /NO, CHANGE STATE OF VD.EXP STA VD.EXP INH ALL DEFHLT [VDH LOOP STATE CHANGED] JST VD.APH LEV VDI VD.II2: LDA VD.IIB /DO INPUT VD.II8: ADD (100000 CNTL 1 STA M1INBP 2"T"M.N ADD (BUFE-CNTL-1 STA M1INBP+1 2"T"M.N M1IN M.N LDX VD.IX /RESTORE MASK AND REGISTERS INH MSK LDA VD.IM SMK INTM STA PRIM EXA LDA VD.IK OTK LDA VD.IA ENB VDI JMP VD.II I /RETURN VD.II1: LDA VD.CWP I /PROCESS ACKS LDX ZERO /CHANNEL ZERO ACK ARS 2 JST VD.AP LDX ONE /CHANNEL ONE ACK LDA VD.CWP I ARS 3 JST VD.AP LDA VD.CWP I /IS PACKET A DUPLICATE ANA ONE STA VD.RCN /SAVE CHANNEL # FOR LATER USE STA 0 LDA VD.CWP I /GET PACKET O/E BIT ALR 2 ERA VD.ROE X /MATCH AGAINST RECEIVE O/E BIT SLZ JMP VD.II2 /DUPLICATE LDA VD.CWP I /IS THERE ANY DATA ICA ANA C77 SNZ JMP VD.II2 /NO STA VD.RBL LDX VD.RCN /IS THERE ROOM FOR THIS BUFFER LDA VD.RB X SZE JMP VD.II2 /NO LDA VD.CWP I /SAVE LAST PACKET BIT FOR BACKGROUN ANA SIGN STA VD.RE X INH FRE /IS THERE A FREE BUFFER LDA FREE I SNZ /POSITIVE NO IN A REG JMP VD.II2 /NO STA VD.R /MARK THAT THERE IS ACK TO SEND LDA VD.ROE X /COMPLEMENT O/E BIT ERA ONE STA VD.ROE X LDA VD.IIB /USE NEW BUFFER FOR INPUT STA VD.RB X /PASS RECEIVED BUFFER TO BACKGROUND STA 0 /GET BUFFER LENGTH LDA VD.RBL /PUT COUNT IN BUFE STA BUFE X LEV VDI VD.II7: INH FRE IRS NFS /GET A FREE BUFFER NFS LDA FREE I IMA FREE ENB VDI JMP VD.II8 /VERY DISTANT HOST ACKNOWLEDGE PROCESSOR /CALL WITH ACK BIT IN AC VD.AP: 0 ERA VD.TOE X /IS THIS A DUPLICATE ACK SLN JMP VD.AP1 /YES LDA VD.TOE X /COMPLEMENT TRANSMIT O/E BIT ERA ONE STA VD.TOE X LDA VD.TB X INH ALL SZE /SPURIOUS ACK? JMP VD.AP2 /NO DEFHLT [VDH SPURIOUS ACK] JST VD.APH /YES VD.AP2: ENB VDI SSM /MARK CHANNEL UNUSED STA VD.TB X VD.AP1: LDA (-5SECS /RESET T STA VD.T LDA SIGN /BRING READY LINE UP STA (SKST H.N) I JMP VD.AP I LCK M2I VD.APH: 0 JST HLTNCC I JST VD.REI JMP VD.II2 /VERY DISTANT HOST OUTPUT INTERRUPT LEV VAR VD.OK: 0 /SAVED KEYS VD.OA: 0 /SAVED A VD.OX: 0 /SAVED X VD.OM: 0 /SAVED MASK VD.OB: 0 /SAVED POINTER VD.CW: 0 /CONTROL WORD VD.OI: INT VDO STA VD.OA /SAVE MASK AND REGISTERS LDA MOM SMK INTM IMA PRIM STA VD.OM INK STA VD.OK JST DODXA I RET VDO STX VD.OX CRA STA VD.OIP /CLEAR OUTPUT INT PENDING FLAG LDA VD.D /LINE BEING HELD DEAD? SPL JMP VD.OI2 /YES JST VD.OIS /SERVICE ONE CHANNEL JST VD.OIS /SERVICE ANOTHER CHANNEL LDA VD.R /ACK WAITING TO GO BACK? SPL JMP VD.OI2 /NO JST VD.OIT LDA (VD.CW /SETUP OUTPUT POINTER TO SEND CW STA M1OTBP 2"T"M.N VD.OI3: STA M1OTBP+1 2"T"M.N LDA (-2.5SECS /RESET R STA VD.R M1OUT M.N /DO OUTPUT VD.OI2: LDX VD.OX /RESTORE MASK AND REGISTERS INH MSK LDA VD.OM SMK INTM STA PRIM EXA LDA VD.OK OTK LDA VD.OA ENB VDO JMP VD.OI I /RETURN VD.OIT: 0 /BUILD ACKS INH VDI LDA VD.ROE 1 ALS 1 ERA VD.ROE ALS 2 STA VD.CW JMP VD.OIT I RET VDO VD.OIS: 0 LDA VD.TEP /TRY OTHER CHANNEL ERA ONE STA VD.TEP INH VDI LDX VD.TEP LDA VD.TB X SNZ JMP VD.OIS I /NOTHING TO DO WITH CHANNEL SPL JMP VD.OI1 STA VD.OB JST VD.OIT LDA VD.TOE X /SET UP MORE OF CONTROL WORD ARR 2 ERA VD.CW /O/E BIT ERA VD.TEP /CHANNEL NUMBER ERA VD.TE X /LAST PACKET BIT STA VD.CW LDX VD.OB /SET UP CONTROL WORD IN OUTPUT BUF*] LDA BUFE X /PUT COUNT IN CW ICR ADD VD.CW STA CNTL 1 X LDA 0 /SET UP OUTPUT POINTERS ADD (CNTL 1 STA M1OTBP 2"T"M.N ADD BUFE X SSP 0"A"TWOQ JMP VD.OI3 VD.OI1: CRA IMA VD.TB X SSP /FREE BUFFER STA 0 INH FRE JST FLUSHI I JMP VD.OIS I /VERY DISTANT HOST TIMEOUT ROUTINE LEV T.O VD.TO: 0 CRA IMA VD.RDY /DID IH FLAP READY LINE? SZE JMP VD.TO3 /YES LDA VD.D /IS D COUNTING SMI JMP VD.TO1 /NO IRS VD.D /WAITED LONG ENOUGH ? JMP VD.TO I /NO LDA (-2.5SECS /RESET R STA VD.R JMP VD.TO I VD.TO1: LDA VD.T SMI JMP VD.TO I IRS VD.T /HAS LINE GONE DEAD JMP VD.TO2 /NO VD.TO3: INH VDI JST VD.REI /REINITIALIZE JMP VD.TO I VD.TO2: IRS VD.R /TIME TO SEND HELLO? NOP JMP VD.TO I /VERY DISTANT HOST BACKGROUND ROUTINE LEV VAR VD.BM: 0 /SAVED MASK VD.IB: 0 VD.BB: 0 VD.BBT: 0 VD.BBF: 0 LEV VDB VD.B: 0 INH MSK LDA IHM SMK INTM IMA PRIM STA VD.BM ENB VDB LDA (HITT H.N) I /IS HOST WAITING FOR INPU CAS MINUS1 SKP JMP VD.B1 /ND LDA (NOP STA (EMFH H.N) I LDX VD.REP /HAS THE NEXT SEQUENTIAL PACKET ARR LDA VD.RB X SNZ JMP VD.B1 /NO STA VD.IB /SAVE BUFFER POINTER FOR LATER USF LDA HILO H.N ERA (HIFRST /INITIAL INPUT EXPECTED BY HI SNZ JMP VD.B4 /YES ERA (0 0 HIFRST"X"VD.1P /HI EXPECTING LEADER SZE JMP VD.B3 /NO LDX VD.IB /SAVE LEADER IN HOST BUFFER LDA DATA X STA VD.HIB I LDA DATA 1 X IRS VD.HIB STA VD.HIB I LDX VD.REP /LAST PACKET IN MESSAGE LDA VD.RE X SPL JMP VD.B4 /YES VD.B53: INH FRE /FLUSH THE BUFFER THE LEADER CAME ' LDX VD.IB JST FLUSHI I JMP VD.B13 LEV VDB VD.B3: LDA VD.IB /SWAP RECEIVED BUFFER WITH HOST BUF[ IMA (HISP H.N) I STA 0 STA BUFE X INH FRE /RETURN HOST BUFFER TO FREE LIST JST FLUSHI I LDX VD.IB /SET UP HARDWARE BUFFER POINTER LDA BUFE X ADD VD.IB ADD (DATA STA VD.HIB LDX VD.REP LDA VD.RE X SPL STA (EMFH H.N) I VD.B13: LDX VD.REP CRA STA VD.RB X /CLEAR CHANNEL LDA VD.REP /SEQUENCE REP ERA ONE STA VD.REP LEV VDB VD.B4: INH SIN EXA JST VD.HII I RET VDB INH ALL JST DODXA I RET VDB VD.B1: LDX VD.TFP /IS NEXT SEQUENTIAL OUTPUT CHANNEL , LDA VD.TB X SZE JMP VD.B2 /NO STA VD.TE X /CLEAR LAST PACKET INDICATOR LDA VD.IHB /IS THERE SOMETHING TO SEND FROM F'1 SNZ JMP VD.B2 /NO JST (GETFRE) I LCK FRE /CAN WE HAVE A FREE BUFF T JMP VD.B2 /NO ENB VDB STX VD.BB /PUT BUFFER IN OUTPUT CHANNEL IMA VD.HOL /LEADER? SZE JMP VD.B6 /YES LDA VD.IHB+1 /SAVE LENGTH SUB VD.IHB AOA STA BUFE X VD.B6N: LDA VD.IHB I /COPY A WORD STA DATA X IRS 0 IRS VD.IHB LDA VD.IHB+1 /DONE? SUB VD.IHB SMI JMP VD.B6N /NO JMP VD.B6D VD.B6: LDA VD.IHB I /COPY LEADER STA DATA X IRS VD.IHB LDA VD.IHB I STA DATA 1 X LDA TWO /SET UP WORD COUNT STA BUFE X LDA VD.IHB IRS VD.IHB SUB VD.IHB 1 /ONLY LEADER IN MESSAGE? SZE JMP VD.B6K /NO VD.B6D: CRA IMA VD.OT /CLEAR FINAL OUT FLAG STA VD.HOL /SET EXPECTING LEADER OR NOT SZE LDA SIGN /PASS LAST PACKET BIT TO OUTPUT LDX VD.TFP STA VD.TE X INH SIN EXA JST VD.HOI I RET VDB /FAKE HOST INTERRUPT INH SIN JST DODXA I RET VDB VD.B6K: LDX VD.TFP /FILL OUTPUT CHANNEL LDA VD.BB STA VD.TB X LDA VD.TFP /SEQUENCE TFP ERA ONE STA VD.TFP VD.B2: LDA VD.OIP /OUTPUT INTERRUPT PENDING? INH SIN EXA SNZ JST VD.OI RET VDB /NO -- WAKE UP OUTPUT IT* INH MSK LDA VD.BM SMK INTM STA PRIM JST DODXA I RET VDB JMP VD.B I LEV CON ITBVDH: BSS MAXVDH CONSTANTS VDHEND=37777 START