;;;-*-Midas-*- TITLE CHAOS TEST & EVENTUAL ROUTINES A=1 B=2 C=3 D=4 E=5 T=6 TT=7 P=17 U1==11 U2==12 U3==13 U4==14 TYIC=10 TYOC=11 CHIC=12 CHOC=13 PRTALL: 1 ;NON-ZERO MEANS PRINT ALL PACKETS BEFORE SENDING THEM ;ALSO YOU CAN PUT A BREAKPOINT AT SEND1 PDL: -60,,. BLOCK 60 .INSRT SYSTEM; CHSDEF > BF: BLOCK %CPMXW $$OUUO==1 ;Include "old" UUOs $$OHST==1 ;Hostname output .INSRT KSC;MACROS > .INSRT KSC;NUUOS > DEFINE %%.CRLF C,ARG IFSN ARG,, .ERR non-null argument "ARG" after CRLF in FWRITE CRLF C, TERMIN GO: MOVE P,PDL .SUSET [.ROPTION,,A] TLO A,%OPOPC .SUSET [.SOPTION,,A] MOVE A,[JSR TSINT] MOVEM A,42 MOVE A,[JSR UUOH] MOVEM A,41 .OPEN TYIC,[.UII,,'TTY] .LOSE %LSFIL .OPEN TYOC,[.UAO,,'TTY] .LOSE %LSFIL ; UARINIT [-100,,300] ; STRINIT OUTOPN TYOC, MOVEI A,200 MOVEI B,CHIC PUSHJ P,NETWRK"HSTMAP .LOSE .CALL [ SETZ 'CHAOSO MOVEI CHIC MOVEI CHOC SETZI 10 ] ;DEFAULT WINDOW SIZE .LOSE 1000 .SUSET [.SMASK,,[%PIIOC]] .SUSET [.SMSK2,,[1_CHIC+1_CHOC]] CMD: FWRITE TYOC,[CRLF,,[>]] .IOT TYIC,A CAIL A,141 CAILE A,172 CAIA SUBI A,40 .IOT TYOC,A MOVSI B,-CMDTL CMD1: HLRZ C,CMDT(B) HRLI C,440700 ILDB D,C CAME D,A AOBJN B,CMD1 JUMPGE B,[ .IOT TYOC,[^G] ? JRST CMD ] FWRITE TYOC,[TPZ,C] HRRZ C,CMDT(B) PUSHJ P,(C) JRST CMD DEFINE CM NAME,LOC [ASCIZ/NAME/],,LOC TERMIN CMDT: CM RFC,ARFC CM OPEN,AOPN CM CLOSE,ACLS CM EOF,AEOF CM LISTEN,ALSN CM INPUT-ONE,AINP CM SOAK,ASOAK CM DATA-OUT,ADAT CM XMIT-ANYTHING,AXMT CM HOSTAT,HOSTAT CM PRINT-ROUTING-TABLE,PRT CM ?,AHELP CM QUIT,AQUIT CMDTL==.-CMDT AHELP: MOVSI B,-CMDTL AHELP1: HLRZ C,CMDT(B) TRNE B,-1 .IOT TYOC,[",] FWRITE TYOC,[TZ,(C)] AOBJN B,AHELP1 CPOPJ: POPJ P, AQUIT: .BREAK 16,40000 ;INPUT ONE PACKET AND PRINT IT AINP: MOVEI C,1 JRST ASOAK1 ;PRINT STATE, SOAK UP AND PRINT PACKETS ASOAK: .CALL [ SETZ 'WHYINT MOVEI CHIC MOVEM A ;%WYCHA MOVEM B ;STATE MOVEM C ;INPUT,,OUTPUT COUNT SETZM D ;INPUT,,OUTPUT WINDOW ] .LOSE 1000 FWRITE TYOC,[[State=],TZ,@STATAB(B),CRLF,,] HLRZS C ASOAK1: SOJL C,CPOPJ .CALL [ SETZ ? 'PKTIOT ? MOVEI CHIC ? SETZI BF ] .LOSE %LSSYS MOVEI A,BF PUSHJ P,PPKT JRST ASOAK1 STATAB: IRP ST,,[Closed,Listening,RFC-Received,RFC-Sent,Open,Lost,Incomplete-Transmission] [ASCIZ/ST/] TERMIN CLBF: SETZM BF MOVE T,[BF,,BF+1] BLT T,BF+37 POPJ P, PBF: PUSH P,A MOVEI A,BF PUSHJ P,PPKT POP P,A POPJ P, ;HOST INPUT TO A, BY NAME OR NUMBER ;SMASHES B,C,D,E, PUTS NETWORK NUMBER IN TT HSTIN: PUSHJ P,NETWRK"HOSTNM CAIA POPJ P, FWRITE TYOC,[CRLF,,[Bad Host Name]] MOVE P,PDL JRST CMD GETCHR: .IOT TYIC,T POPJ1: AOS (P) POPJ P, PUTCHR: .IOT TYOC,T SPCHAN: POPJ P, ;OCTAL INPUT TO A OCTIN: PUSHAE P,[B,C,D,E] MOVEI D,8 MOVEI E,[ASCIZ/Octal/] OCTIN0: SETO B, SETZ A, OCTIN1: .IOT TYIC,C .IOT TYOC,C CAIL C,"0 CAILE C,"9 JRST OCTIN2 IMUL A,D ADDI A,-"0(C) AOJA B,OCTIN1 OCTIN2: JUMPGE B,OCTIN3 FWRITE TYOC,[TZ,(E),[ number please: ]] JRST OCTIN0 OCTIN3: POPAE P,[E,D,C,B] POPJ P, ;DECIMAL NUMBER INPUT TO A DECIN: PUSHAE P,[B,C,D,E] MOVEI D,10. MOVEI E,[ASCIZ/Decimal/] JRST OCTIN0 ;ASCII INPUT TO BYTE POINTER IN B, COUNT COMES BACK IN A. ASZIN: PUSHAE P,[C,D,E,B] ASZIN0: MOVEI A,0 MOVE B,(P) ASZIN1: .IOT TYIC,C CAIE C,177 CAIGE C,40 JRST ASZIN2 .IOT TYOC,C CAIN C,"~ JRST ASZIN4 IDPB C,B AOJA A,ASZIN1 ASZIN2: CAIE C,^M JRST ASZIN3 .IOT TYOC,C POPAE P,[B,E,D,C] POPJ P, ASZIN4: .IOT TYIC,C .IOT TYOC,C IORI C,200 IDPB C,B AOJA A,ASZIN1 ASZIN3: FWRITE TYOC,[CRLF,,[An ascii string terminated by please: ]] JRST ASZIN0 ;SEND LSN ALSN: PUSHJ P,CLBF MOVEI A,%COLSN DPB A,[$CPKOP BF] FWRITE TYOC,[[ Contact name: ]] MOVE B,[440800,,%CPKDT+BF] PUSHJ P,ASZIN DPB A,[$CPKNB BF] PUSHJ P,SEND ;JUST SEND, WILL GET INTERRUPT IF RFC MATCHES POPJ P, ;SEND RFC ARFC: PUSHJ P,CLBF MOVEI A,%CORFC DPB A,[$CPKOP BF] FWRITE TYOC,[[ to ]] PUSHJ P,HSTIN DPB A,[$CPKDA BF] FWRITE TYOC,[[ Contact name: ]] MOVE B,[440800,,%CPKDT+BF] PUSHJ P,ASZIN DPB A,[$CPKNB BF] ARFC0: PUSHJ P,SEND FWRITE TYOC,[[ Sending...],CRLF,,] ARFC1: MOVEI A,30.*30. ;30-SECOND TIME-OUT .CALL [ SETZ 'NETBLK MOVEI CHIC MOVEI %CSRFS MOVE A MOVEM B ;NEW STATE SETZM A ] ;TIME LEFT .LOSE 1000 FWRITE TYOC,[[State now = ],TZ,@STATAB(B),CRLF,,] JUMPN B,CPOPJ ;COULD JRST TO ASOAK (JUMP IF NOT CLOSED) .CALL [ SETZ ? 'PKTIOT ? MOVEI CHIC ? SETZI BF ] .LOSE %LSSYS ;CLOSED, CHECK FOR INPUT LDB A,[$CPKOP BF] ;OF FWD, ANS, OR CLS CAIN A,%COFWD JRST ARFWD CAIN A,%COANS JRST ARANS CAIN A,%COCLS JRST ARCLS POPJ P, ;SOMETHING RANDOM? ;GOT CLS IN RESPONSE TO RFC ARCLS: FWRITE TYOC,[[RFC was refused, received packet:],CRLF,,] JRST PBF ;GOT ANS IN RESPONSE TO RFC ARANS: FWRITE TYOC,[[Got ANS:],CRLF,,] JRST PBF ;GOT FWD IN RESPONSE TO RFC ARFWD: FWRITE TYOC,[[RFC being forwarded, received packet:],CRLF,,] PUSHJ P,PBF MOVEI A,%CORFC ;ISSUE NEW RFC DPB A,[$CPKOP BF] LDB A,[$CPKAN BF] DPB A,[$CPKDA BF] JRST ARFC0 ;SEND AN OPEN AOPN: PUSHJ P,CLBF MOVEI A,%COOPN DPB A,[$CPKOP BF] JRST SEND ;SEND A CLOSE ACLS: PUSHJ P,CLBF MOVEI A,%COCLS DPB A,[$CPKOP BF] FWRITE TYOC,[[ Reason: ]] MOVE B,[440800,,%CPKDT+BF] PUSHJ P,ASZIN DPB A,[$CPKNB BF] JRST SEND ;SEND AN EOF AEOF: PUSHJ P,CLBF MOVEI A,%COEOF DPB A,[$CPKOP BF] PUSHJ P,SEND .CALL [ SETZ SIXBIT /FINISH/ SETZI CHOC] .LOSE %LSSYS POPJ P, ;CONNECT TO HOSTS'S STATUS SERVER AND PRINT OUT RESPONSE IN READABLE FORMAT HOSTAT: PUSHJ P,CLBF MOVEI A,%CORFC DPB A,[$CPKOP BF] FWRITE TYOC,[[ for ]] PUSHJ P,HSTIN DPB A,[$CPKDA BF] MOVE B,[440800,,%CPKDT+BF] MOVE A,[440700,,[ASCIZ/STATUS/]] ILDB C,A IDPB C,B JUMPN C,.-2 MOVEI A,.LENGTH/STATUS/ DPB A,[$CPKNB BF] PUSHJ P,SEND MOVEI A,30.*30. ;30-SECOND TIME-OUT .CALL [ SETZ 'NETBLK MOVEI CHIC MOVEI %CSRFS MOVE A MOVEM B ;NEW STATE SETZM A ] ;TIME LEFT .LOSE 1000 FWRITE TYOC,[[State now = ],TZ,@STATAB(B),CRLF,,] JUMPN B,CPOPJ ;COULD JRST TO ASOAK (JUMP IF NOT CLOSED) .CALL [ SETZ ? 'PKTIOT ? MOVEI CHIC ? SETZI BF ] .LOSE %LSSYS ;CLOSED, CHECK FOR INPUT (WE EXPECT ANS) LDB A,[$CPKOP BF] ;OF FWD, ANS, OR CLS CAIN A,%COFWD JRST ARFWD CAIN A,%COCLS JRST ARCLS CAIE A,%COANS POPJ P, ;SOMETHING RANDOM? ;BF now has the ANS in it. FWRITE TYOC,[CRLF,,[Host name=]] LDB E,[$CPKNB+BF] CAILE E,32. MOVEI E,32. MOVE D,[440800,,%CPKDT+BF] HSTAT1: SOJL E,HSTAT2 ILDB B,D CAIE B,200 ;Accept either 0 or 200 as pad for now CAIN B,0 JRST HSTAT2 .IOT TYOC,B JRST HSTAT1 GWD: ILDB T,D ;Get a 16-bit word in T ILDB TT,D ;With bytes in pdp11 order LSH TT,8 IOR T,TT SOJA E,CPOPJ ;Count words read GWD32: PUSHJ P,GWD ;Get low half of 32-bit word PUSH P,T PUSHJ P,GWD ;Get high half POP P,TT LSH T,16. IOR T,TT POPJ P, HSTAT2: MOVE D,[440800,,%CPKDT+BF+10] ;Start of subnet info LDB E,[$CPKNB+BF] SUBI E,40 ;Number of bytes of such IDIVI E,2 ;Words HSTAT3: JUMPLE E,CPOPJ ;If done CRLF TYOC, PUSHJ P,GWD ;Get info block type MOVE A,T PUSHJ P,GWD ;Get words to follow MOVE C,T CAIGE A,400 JRST HSTAT5 ;Got subnet info CAIGE A,1000 JRST HSTTN5 ;New format subnet info FWRITE TYOC,[[Unknown info block type: ],N8,A,[, length=],N8,C] HSTAT4: JUMPLE C,HSTAT3 ;Eat remainder of info block JUMPLE E,CPOPJ ;Foo, word count in block was garbage PUSHJ P,GWD SOJA C,HSTAT4 HSTAT5: FWRITE TYOC,[[Subnet ],N8,A] SOJL C,HSTAT3 PUSHJ P,GWD FWRITE TYOC,[[, # in ],N9,T] SOJL C,HSTAT3 PUSHJ P,GWD FWRITE TYOC,[[, # out ],N9,T] SOJL C,HSTAT3 PUSHJ P,GWD FWRITE TYOC,[[, xmt abort ],N9,T] SOJL C,HSTAT3 PUSHJ P,GWD FWRITE TYOC,[[,],CRLF,,[ lost ],N9,T] SOJL C,HSTAT3 PUSHJ P,GWD FWRITE TYOC,[[, crc ],N9,T] SOJL C,HSTAT3 PUSHJ P,GWD FWRITE TYOC,[[, ramerr ],N9,T] SOJL C,HSTAT3 PUSHJ P,GWD FWRITE TYOC,[[, bit count err ],N9,T] SOJL C,HSTAT3 PUSHJ P,GWD FWRITE TYOC,[[, other err ],N9,T] JRST HSTAT4 HSTTN5: SUBI A,400 LSH C,-1 FWRITE TYOC,[[Subnet ],N8,A] SOJL C,HSTAT3 PUSHJ P,GWD32 FWRITE TYOC,[[, # in ],N9,T] SOJL C,HSTAT3 PUSHJ P,GWD32 FWRITE TYOC,[[, # out ],N9,T] SOJL C,HSTAT3 PUSHJ P,GWD32 FWRITE TYOC,[[, xmt abort ],N9,T] SOJL C,HSTAT3 PUSHJ P,GWD32 FWRITE TYOC,[[,],CRLF,,[ lost ],N9,T] SOJL C,HSTAT3 PUSHJ P,GWD32 FWRITE TYOC,[[, crc ],N9,T] SOJL C,HSTAT3 PUSHJ P,GWD32 FWRITE TYOC,[[, ramerr ],N9,T] SOJL C,HSTAT3 PUSHJ P,GWD32 FWRITE TYOC,[[, bit count err ],N9,T] SOJL C,HSTAT3 PUSHJ P,GWD32 FWRITE TYOC,[[, other err ],N9,T] JRST HSTAT4 ;PRINT ROUTING TABLE PRT: PUSHJ P,CLBF MOVEI A,%CORFC DPB A,[$CPKOP BF] FWRITE TYOC,[[ for ]] PUSHJ P,HSTIN DPB A,[$CPKDA BF] MOVE B,[440800,,%CPKDT+BF] MOVE A,[440700,,[ASCIZ/DUMP-ROUTING-TABLE/]] ILDB C,A IDPB C,B JUMPN C,.-2 MOVEI A,.LENGTH/DUMP-ROUTING-TABLE/ DPB A,[$CPKNB BF] PUSHJ P,SEND MOVEI A,30.*30. ;30-SECOND TIME-OUT .CALL [ SETZ 'NETBLK MOVEI CHIC MOVEI %CSRFS MOVE A MOVEM B ;NEW STATE SETZM A ] ;TIME LEFT .LOSE 1000 CAIN B,%CSCLS JRST PRT1 FWRITE TYOC,[[State now = ],TZ,@STATAB(B),CRLF,,] POPJ P, PRT1: .CALL [ SETZ ? 'PKTIOT ? MOVEI CHIC ? SETZI BF ] .LOSE %LSSYS ;CLOSED, CHECK FOR INPUT (WE EXPECT ANS) LDB A,[$CPKOP BF] ;OF FWD, ANS, OR CLS CAIN A,%COFWD JRST ARFWD CAIN A,%COCLS JRST ARCLS CAIE A,%COANS POPJ P, ;SOMETHING RANDOM? ;BF now has the ANS in it. LDB B,[$CPKNB BF] IDIVI B,4 ;Number of subnets HRLOI E,-1(B) EQVI E,BF+4 ;Aobjn pointer to routing info PRT2: LDB B,[341000,,(E)] ;Get method LDB C,[241000,,(E)] DPB C,[101000,,B] LDB C,[141000,,(E)] ;Get cost LDB D,[041000,,(E)] DPB D,[101000,,C] JUMPE B,PRT4 ;Method 0: no route MOVEI A,-BF-4(E) ;Subnet FWRITE TYOC,[[Subnet ],OCT,A,[ via ]] CAIL B,1_8 JRST [ TLO B,(NETWRK"NW%CHS) OUT(TYOC,HST(B)) JRST PRT3 ] FWRITE TYOC,[[interface ],OCT,B] PRT3: FWRITE TYOC,[[, cost=],OCT,C,CRLF,,] PRT4: AOBJN E,PRT2 POPJ P, ;SEND A DATA PACKET ADAT: PUSHJ P,CLBF MOVEI A,%CODAT DPB A,[$CPKOP BF] FWRITE TYOC,[[ Contents: ]] MOVE B,[440800,,%CPKDT+BF] PUSHJ P,ASZIN DPB A,[$CPKNB BF] JRST SEND ;SEND ANY PACKET AXMT: PUSHJ P,CLBF FWRITE TYOC,[[ Opcode in octal: ]] PUSHJ P,OCTIN DPB A,[$CPKOP BF] FWRITE TYOC,[[ Dest ]] PUSHJ P,HSTIN DPB A,[$CPKDA BF] FWRITE TYOC,[[ Dest index: ]] PUSHJ P,OCTIN DPB A,[$CPKDI BF] FWRITE TYOC,[CRLF,,[ Source ]] PUSHJ P,HSTIN DPB A,[$CPKSA BF] FWRITE TYOC,[[ Source index: ]] PUSHJ P,OCTIN DPB A,[$CPKSI BF] FWRITE TYOC,[[ Packet #: ]] PUSHJ P,OCTIN DPB A,[$CPKPN BF] FWRITE TYOC,[[ Ack #: ]] PUSHJ P,OCTIN DPB A,[$CPKAN BF] FWRITE TYOC,[CRLF,,[ Data: ]] MOVE B,[440800,,%CPKDT+BF] PUSHJ P,ASZIN DPB A,[$CPKNB BF] JRST SEND SEND: MOVEI A,BF SKIPN PRTALL JRST SEND1 FWRITE TYOC,[[ Now sending: ]] PUSHJ P,PPKT SEND1: .CALL [ SETZ ? 'PKTIOT ? MOVEI CHOC ? SETZI BF ] .LOSE %LSSYS POPJ P, ;PRINT PACKET A -> PPKT: PUSHAE P,[B,C,D,E] LDB B,[$CPKOP(A)] CAIGE B,%CODAT TDZA C,C MOVE C,[SIXBIT/DATA/] CAIGE B,%COMAX MOVE C,COTAB(B) LDB D,[$CPKFC(A)] LDB E,[$CPKNB(A)] FWRITE TYOC,[[OP ],N8,B,[ ],6F,C,[, FC ],N10,D,[, NB ],N10,E,CRLF,,] LDB B,[$CPKDA(A)] LDB C,[$CPKDI(A)] LDB D,[$CPKSA(A)] LDB E,[$CPKSI(A)] FWRITE TYOC,[[From ],N8,D,[-],N8,E,[ to ],N8,B,[-],N8,C,CRLF,,] LDB B,[$CPKPN(A)] LDB C,[$CPKAN(A)] FWRITE TYOC,[[Pkt # ],N8,B,[, ack # ],N8,C,CRLF,,[Data: "]] PPKT0: LDB E,[$CPKNB(A)] MOVE D,[440800,,%CPKDT(A)] PPKT1: SOJL E,PPKT2 ILDB B,D TRZE B,200 .IOT TYOC,["~] .IOT TYOC,B JRST PPKT1 PPKT2: FWRITE TYOC,[["],CRLF,,] POPAE P,[E,D,C,B] POPJ P, COTAB: OFFSET -. 0 IRPS OP,,[RFC OPN CLS FWD ANS SNS STS RUT LOS LSN MNT EOF UNC BRD] %CO!OP::SIXBIT/OP/ TERMIN %COMAX::OFFSET 0 ;INTERRUPT ROUTINE INTACS: BLOCK 20 SV40: 0 SUUOH: 0 TSINT: 0 ? 0 MOVEM 17,INTACS+17 MOVEI 17,INTACS BLT 17,INTACS+16 MOVE A,40 MOVEM A,SV40 MOVE A,@41 MOVEM A,SUUOH MOVE P,INTACS+P SKIPGE A,TSINT JRST TSINT1 .SUSET [.RBCHN,,A] FWRITE TYOC,[CRLF,,[*** IOC ERROR *** Channel=],N8,A] JRST TSINT2 TSINT1: MOVEI B,[ASCIZ/INPUT/] TRNN A,1_CHIC MOVEI B,[ASCIZ/OUTPUT/] FWRITE TYOC,[CRLF,,[*** ],TZ,(B),[ CHANNEL INTERRUPT ***]] MOVEI A,CHIC TSINT2: .CALL [ SETZ 'WHYINT MOVEI (A) MOVEM A ;%WYCHA MOVEM B ;STATE MOVEM C ;INPUT,,OUTPUT COUNT SETZM D ;INPUT,,OUTPUT WINDOW ] .LOSE 1000 FWRITE TYOC,[[, PC=],RHV,TSINT+1,CRLF,,] FWRITE TYOC,[[State is now ],TZ,@STATAB(B),CRLF,,] HLRZ B,C HRRZS C HLRZ E,D HRRZS D FWRITE TYOC,[[Input count=],N10,B,[, Output count=],N10,C,CRLF,,] FWRITE TYOC,[[Input window=],N10,E,[, Output window=],N10,D,CRLF,,] FWRITE TYOC,[[Dismissing...],CRLF,,] SKIPL TSINT AOS TSINT+1 ;Don't retry IOT MOVE A,SUUOH MOVEM A,@41 MOVE A,SV40 MOVEM A,40 MOVSI 17,INTACS BLT 17,17 .DISMISS TSINT+1 .INSRT SYSTEM;CHSDEF $$HOSTNM==1 $$SYMLOOK==1 $$SYMGET==1 $$HSTMAP==1 $$CHAOS==1 $$HST3==1 .INSRT SYSENG;NETWRK CONSTANTS VARIABLES END GO