1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-28 21:01:16 +00:00
Files
PDP-10.its/src/sysen3/chatst.56
Eric Swenson eb6da57516 Added CHATST.
Resolves #308.

Source from AI: MOON; CHATST 56.
2016-12-21 10:15:18 +01:00

675 lines
12 KiB
Plaintext
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;;;-*-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