1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-28 12:59:20 +00:00

Added CHATST.

Resolves #308.

Source from AI: MOON; CHATST 56.
This commit is contained in:
Eric Swenson
2016-12-20 16:06:53 -08:00
committed by Lars Brinkhoff
parent b178808807
commit eb6da57516
3 changed files with 679 additions and 0 deletions

674
src/sysen3/chatst.56 Executable file
View File

@@ -0,0 +1,674 @@
;;;-*-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 <RETURN> 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