1
0
mirror of https://github.com/PDP-10/its.git synced 2026-02-27 01:09:49 +00:00

Added ITS support for CHTN and CFTP (Telnet and FTP over Chaosnet).

To actually use these programs, however, the emulator needs to get
updated to support Chaosnet (over UDP, for example).
This commit is contained in:
Eric Swenson
2016-11-26 12:46:32 -08:00
committed by Lars Brinkhoff
parent abdebae8b1
commit 28710a9690
5 changed files with 4469 additions and 3 deletions

View File

@@ -88,6 +88,7 @@ from scratch.
- NAME, Shows logged in users and locations, aka FINGER
- TALK/WHO/WHOJ/WHOM/USERS, list users.
- MLDEV, MLSLV, Allows access to remote systems as devices (e.g. DB:)
- CHTN, CFTP, Chaosnet TELNET and FTP support
6. A brand new host table is built from the host table source and
installed into SYSBIN; HOSTS3 > using H3MAKE.
@@ -102,8 +103,11 @@ host table tools, and binary host table are installed.
Currently, basic TCP network support is in the build, in addition to
both a TELNET/SUPDUP server, and both TELNET and SUPDUP clients.
Additionally, both an FTP server and client are included. Other network
services will appear in a subsequent release.
Additionally, both an FTP server and client are included. Chaosnet TELNET
and FTP (CHTN and CFTP), but this requires support and configuration
in the emulator to actually use.
Other network services will appear in subsequent releases.
The KLH10 dskdmp.ini file has an IP address (192.168.1.100) and gateway IP
address (192.168.0.45) configured for the ITS system. The IP address

View File

@@ -120,7 +120,7 @@ respond "_" "reload "
respond "ARE YOU SURE" "y"
respond "\n" "links crdir sorry\r"
respond "FILE=" "*;* *\r"
expect "E-O-T"
expect -timeout 200 "E-O-T"
respond "_" "quit\r"
expect ":KILL"
@@ -404,6 +404,18 @@ expect ":KILL"
respond "*" ":link device;tcp syn123,device;atsign mlslv\r"
respond "*" ":midas sys1;ts cftp_sysen2; cftp\r"
respond "KLp==" "0\r"
expect ":KILL"
respond "*" ":link device;chaos telnet,sysbin;telser bin\r"
respond "*" ":link device;chaos supdup,sysbin;telser bin\r"
respond "*" ":midas sysbin;chtn_sysnet;chtn\r"
expect ":KILL"
respond "*" ":link sys2;ts chtn,sysbin;supdup bin\r"
respond "*" ":link kshack;good ram,.;ram ram\r"
respond "*" ":link kshack;ddt bin,.;@ ddt\r"
respond "*" $emulator_escape

3490
src/sysen2/cftp.475 Executable file

File diff suppressed because it is too large Load Diff

74
src/syseng/@chaos.17 Executable file
View File

@@ -0,0 +1,74 @@
;;; Primitive ATSIGN CHAOS DLW 1/26/78 -*-Fundamental-*-
TITLE ATSIGN CHAOS
;;; This program is loaded by the system when an RFC is received and nobody
;;; else is listening.
A=1
B=2
C=3
D=4
E=5
DSKI==1 ; Channel for loading server.
.INSRT SYSTEM;CHSDEF >
DEBUG: 0 ; -1 => Debug mode.
DEFNAM: SIXBIT /DFAULT/ ; FN2 of the default server (if CHAOS <foo> is not found).
PBUF: BLOCK %CPMXW ; Packet buffer.
GO: .CALL [ SETZ ; Get a pending RFC.
SIXBIT /CHAOSQ/
SETZI PBUF]
JSR LOGOUT
MOVE A,[440800,,PBUF+%CPKDT] ; First byte in packet.
MOVE B,[440600,,D]
MOVEI D,0
LDB E,[$CPKNB+PBUF] ; The NBYTES field of the packet.
CAILE E,6 ; If > 6, usae 6 instead.
MOVEI E,6
CHLOOP: ILDB C,A ; Convert 8-bit codes from packet into a sixbit word
CAIN C,40 ; in D.
JRST ENDLUP
CAIL C,"a
CAILE C,"z
SUBI C,40
IDPB C,B
SOJG E,CHLOOP
ENDLUP: MOVE 0,D ;Contact name, sixbitified, is passed in in AC0
.SUSET [.SSNAME,,D] ;Also pass it in the sname, for debugging
.CALL [ SETZ ; Open DEVICE;CHAOS <conn>
SIXBIT /OPEN/
[.UII,,DSKI]
[SIXBIT /DSK/]
[SIXBIT /CHAOS/]
D
SETZ [SIXBIT /DEVICE/]]
JRST [ CAMN D,DEFNAM ; Were we trying the default server?
JSR LOGOUT ; Yes, lose big!
MOVE D,DEFNAM ; No, try loading the default server.
JRST .-1]
MOVE 17,[ACBLK,,1] ; Load it in and start it.
BLT 17,ACBLKL
JRST 1
ACBLK: .CORE 0 ;1 - vital to clear core!!
.LOSE ;2
.CALL 7 ;3
.LOGOUT 1, ;4
.IOT DSKI,17 ;5
JRST (17) ;6
SETZ ;7
SIXBIT /LOAD/ ;10
MOVEI %JSELF ;11
SETZI DSKI ;12
ACBLKL=.-ACBLK
LOGOUT: 0
SKIPE DEBUG
.VALUE
.LOGOUT 1,
END GO

886
src/sysnet/chtn.15 Executable file
View File

@@ -0,0 +1,886 @@
;;; -*-MIDAS-*-
TITLE CHTN -- Chaosnet user telnet
;;; simple minded chaosnet user telnet, negotiates as little as possible
F=0
A=1
B=2
C=3
D=4
E=5
S=7
T=10
TT=11
N=12
O=13
BP=15
CH=16
P=17
TTYICH=0
TTYOCH=1
FILECH=7
ICPCH=10 ;for arpanet icp
CHAICH=12
CHAOCH=13
FRCNAM==1 ;have an explicit connection name
FRARPA==2 ;use the ARPA net instead
ICPSKT==27 ;default arpanet socket number
TRNBIN==0 ;transmit binary
ECHO==1 ;echo
SUPRGA==3 ;supress go-ahead
TIMMRK==6 ;timing mark
WILL==373
WONT==374
DO==375
DONT==376
IAC==377
;; flag bit definitions for vt52 escape code handling
ES%CAR==1
ES%ABS==2
ES%ASF==4
ES%EPD==10
ESTATE: 0 ;flags for vt52 escape code handling
EXPOS: 0 ;saved xpos for vt52 hacking
EYPOS: 0 ;saved ypos for vt52 hacking
DEBUG: 0 ;non-zero this is the debugging version
MOREP: 0 ;do **More** processing
TTOMOD: 0 ;doing superimage output
TBINP: 0 ;non-zero if we are sending binary
ECHOP: 0 ;non-zero we are echoing locally
FRNHST: 0 ;36 bit host number
HSTSIX: 0 ;sixbit of host
OLDTLP: -1 ;non-zero until know we are talking new telnet ptcl
STATE: 0 ;deferred iac, deferred will, etc
ESCCHR: ^^ ;default escape character
JCLBUF: BLOCK 10
CONNAM: ASCIZ /TELNET/ ;default connection name
BLOCK 10
NPDL==77
PDL: BLOCK NPDL
BUFSIZ==488.
NETBUF: BLOCK <BUFSIZ+3>/4
TTYBUF: BLOCK <BUFSIZ+4>/5
LOC .\1777+1
TSINT: LOC 42
-TSINTL,,TSINT
LOC TSINT ;interrupt vector
1007,,P ;save ac's 10 thru 16
%PIIOC ? 0 ? -1 ? -1 ? IOCERR
0 ? 1_TTYICH ? 0 ? 1_TTYICH ? TTYINT
0 ? 1_CHAICH ? 0 ? 1_CHAICH ? CHAINT
0 ? 1_TTYOCH ? 0 ? 1_TTYOCH\1_CHAICH\1_TTYICH ? MORINT
TSINTL==.-TSINT
GO: MOVE P,[-NPDL,,PDL-1]
.CALL [ SETZ ;open up tty for output
SIXBIT /OPEN/
MOVSI %TJDIS+.UAO
MOVEI TTYOCH
SETZ [SIXBIT /TTY/]]
.LOSE %LSSYS
.CALL [ SETZ ;open tty for input
SIXBIT /OPEN/
MOVSI %TIINT+%TINWT+%TIFUL+.UAI
MOVEI TTYICH
SETZ [SIXBIT /TTY/]]
.LOSE %LSSYS
pushj p,lsrchk ;see if they're a loser
pushj p,lsrwrn ;yep; warn them off
.iot ttyoch,[^P] ? .iot ttyoch,["A] ;get a fresh line.
.SUSET [.ROPTION,,T]
TLO T,OPTINT ;new style interrupts
.SUSET [.SOPTION,,T]
.SUSET [.SDF1,,[-1]] ;defer all interrupts until things get going
.SUSET [.SDF2,,[-1]]
.SUSET [.SMASK,,[%PIIOC]] ;will want to wtch for ioc errors,
.SUSET [.SMSK2,,[1_TTYICH\1_CHAICH]] ;and tty and network input
MOVE BP,[440700,,JCLBUF]
TLNN T,OPTCMD ;was there jcl?
JRST NOJCL ;no, get it from user then
.BREAK 12,[..RJCL,,JCLBUF] ;yes, read it in
JCLOO1: MOVE A,BP ;save the byte pointer to start
ILDB CH,BP
CAIN CH,<" > ;<">ignore spaces
JRST JCLOO1
JCLOO2: ILDB CH,BP
CAILE CH,40 ;go until get a control char
JRST JCLOO2
MOVEI TT,0
DPB TT,BP ;make this part asciz
CAIE CH,33 ;specifying contact name as well?
JRST JCL2 ;no, use default then
TRO F,FRCNAM ;remember we had a connection name
MOVE T,[440700,,CONNAM]
JCLOO3: ILDB CH,BP
CAIGE CH,40
JRST JCL1
IDPB CH,T
JRST JCLOO3
NOJCL: .SUSET [.RXJNAME,,TT] ;no jcl, try to use jname
SETZM JCLBUF
SETZM JCLBUF+1
NOJCL1: SETZ T,
LSHC T,6
ADDI T,40
IDPB T,BP
JUMPN TT,NOJCL1
JRST JCL2
JCL1: IDPB TT,T ;make this asciz as well
JCL2: MOVEI A,HSTPAG
MOVEI B,FILECH
PUSHJ P,NETWRK"HSTMAP ;load in the hosts2 data base
.VALUE
MOVEI A,JCLBUF
PUSHJ P,NETWRK"HSTLOOK ;get host number into a, network number into tt
JRST [ MOVEI T,[ASCIZ /Unrecognized host name/]
PUSHJ P,OUTSTR
JRST DIE]
MOVEM A,FRNHST ;stash host number
CAIN TT,NETWRK"NW%ARP
JRST ARPCON ;connection over the arpanet
; JRST GETCON ;have the host and contact name, go try to open things up
GETCON: MOVEI A,CHAICH
MOVE B,FRNHST
MOVEI C,CONNAM
MOVEI D,5
PUSHJ P,NETWRK"CHACON ;try to open the connection
JRST NOCONN
JRST GOTCON
ARPCON: TRO F,FRARPA ;using the arpanet
TRNN F,FRCNAM ;specified the socket number?
JRST ARPCN2 ;no, use default then
MOVE BP,[440700,,CONNAM]
SETZ C, ;build number here
ARPCN1: ILDB CH,BP
JUMPE CH,ARPCN3
CAIL CH,"0
CAILE CH,"7
JRST [ MOVEI T,[ASCIZ /Specify arpanet socket number in octal/]
PUSHJ P,OUTSTR
JRST DIE]
LSH C,3
IORI C,-"0(CH)
JRST ARPCN1
ARPCN2: MOVEI C,ICPSKT ;default socket number
ARPCN3: MOVEI A,ICPCH ;first of 4 channels to icp with
MOVE B,FRNHST ;host to icp to
MOVE D,[08040+.UII,,08040+.UIO] ;8 bit image (no crlf hacking)
PUSHJ P,NETWRK"ARPICP ;do it all
JRST NOCONN+1 ;lost
;connection now opened ok
GOTCON: MOVE A,FRNHST
PUSHJ P,NETWRK"HSTSIX ;get sixbit name of host
.VALUE
MOVEM A,HSTSIX ;save for command prompt
.CORE HSTPAG ;we don't need hosts2 any more
.LOSE %LSSYS
SETZM NETWRK"HSTADR
MOVEI T,[ASCIZ /C/]
PUSHJ P,OUTSTR
.SUSET [.SWHO1,,[1,,660000]] ;.who3 as 6 sixbit chars, no space
.SUSET [.SWHO3,,HSTSIX]
.CALL [ SETZ ;get ttyopt variable
SIXBIT /CNSGET/
MOVEI TTYOCH
MOVEM T
MOVEM T
MOVEM T
MOVEM T
SETZM T]
.LOSE %LSSYS
.CALL [ SETZ ;get ttysts variable
SIXBIT /TTYGET/
MOVEI TTYOCH
MOVEM E
MOVEM E
SETZM E]
.LOSE %LSSYS
MOVEI TT,%TXTOP+"B ;escape char is [BREAK] for TVs
TLNN T,%TOFCI
TLOA E,%TSSII ;non-TVs need superimage mode for  to win
MOVEM TT,ESCCHR
.CALL [ SETZ ;set ttysts
SIXBIT /TTYSET/
MOVEI TTYOCH
[030303030303] ;everything activates, but doesnt echo
[030303030303]
SETZ E]
.LOSE %LSSYS
TLNN T,%TOMOR ;want more processing?
JRST GOTCN1 ;no
SETOM MOREP ;initally more processing on
.SUSET [.SIMSK2,,[1_TTYOCH]]
GOTCN1: MOVEI T,%TJDIS ;normal output not in display mode
MOVEM T,TTOMOD
.SUSET [.SDF1,,[0]] ;allow interrupts to take effect now
.SUSET [.SDF2,,[0]]
WAIT: JFCL ;complicated main program level
.HANG
;connection failed
NOCONN: MOVEI A,CHAICH
PUSHJ P,NETWRK"ANALYZ
.VALUE
DIE: SKIPE DEBUG
.VALUE
.LOGOUT 1,
JRST DIE
;escape character typed
DOESC: MOVEI T,[ASCIZ /SZLCMND (/]
PUSHJ P,OUTSTR
.CALL [ SETZ
SIXBIT /SSTATU/
MOVEM TT
MOVEM TT
MOVEM TT
MOVEM TT
MOVEM TT
SETZM TT]
.LOSE %LSSYS
PUSHJ P,OUTSIX
MOVEI T,[ASCIZ / to /]
PUSHJ P,OUTSTR
MOVE TT,HSTSIX
PUSHJ P,OUTSIX
MOVEI T,[ASCIZ /) ->/]
PUSHJ P,OUTSTR
.CALL [ SETZ
SIXBIT /IOT/
MOVSI %TINWT ;do wait for this char
MOVEI TTYICH
SETZM CH]
.LOSE %LSSYS
PUSH P,CH ;save char
MOVEI T,[ASCIZ /ZL/] ;beggining of line, clear to end of line
PUSHJ P,OUTSTR
POP P,CH ;get command char back
TRZ CH,%TXSFT ;flush shift bit
ANDI CH,177 ;only want ascii side of things
CAMN CH,ESCCHR ;quoting the escape character?
JRST TTYINC ;yes, send it
CAIE CH,"? ;don't uppercasify ? please
CAIGE CH,"a ;uppercasify character
SKIPA
TRZ CH,40
MOVSI T,-NESCS
DOESCL: HLRZ TT,ESCTAB(T) ;look to match this command
CAIE TT,(CH)
AOBJN T,DOESCL
JUMPGE T,DOESCX
HRRZ TT,ESCTAB(T)
JRST (TT) ;go do command
ESCTAB: "P,,PROCED
"D,,DDT
"L,,QUIT ;maybe should do IAC DO LOGOUT?
"Q,,QUIT
"M,,MORE
"E,,CHECHO
"?,,GHELP ;GIVE HELP (?)
"G,,SIOU
"V,,VTT ;TOGGLE VT52 SIMULATION
"S,,SHOMOD
^Z,,DDT
177,,DOESCR
NESCS==.-ESCTAB
PROCED: .SUSET [.SAIFPIR,,[1_TTYICH]] ;clear interrupt from this char
.VALUE [ASCIZ /:PROCED 1J/]
JRST TTYINX ;dismiss interrupt
DDT: .SUSET [.SAIFPIR,,[1_TTYICH]]
.SUSET [.SIPIRQC,,[%PIC.Z]]
JRST DOESCR
QUIT: .CLOSE CHAOCH,
.CLOSE CHAICH,
JRST DIE
MORE: SETCMM MOREP
PUSHJ P,SMMORE
JRST DOESCR
CHECHO: SETCMM ECHOP
PUSHJ P,SMECHO
JRST DOESCR
SIOU: MOVEI T,%TJSIO
XORM T,TTOMOD
PUSHJ P,SMSIO
JRST DOESCR
VTT: MOVEI T,%TJDIS ;TOGGLE DISPLAY MODE OUTPUT
XORM T,TTOMOD
MOVEI T,ES%CAR ;TOGGLE TRANSLATIONS
XORM T,ESTATE
PUSHJ P,SMVTT ;show mode: vt52
JRST DOESCR
GHELP: MOVEI T,[ASCIZ /CPossible Commands are:
P => Proceed (Valrets :PROCEED)
D => Go up to DDT
E => Toggle local Echo
L => Quit and logout (doesn't log you out yet!)
Q => Quit (just close connection, don't do a logout)
M => Toggle Local More processing
G => Toggle Super Image output
V => Toggle VT52 Simulation
S => Show state of modes
^Z => Same as "D" (Go to DDT)
? => Type this cruft
/]
PUSHJ P,OUTSTR
JRST DOESCR
SHOMOD: PUSHJ P,SMECHO
PUSHJ P,SMMORE
PUSHJ P,SMSIO
PUSHJ P,SMVTT
JRST DOESCR
SMECHO: SKIPE ECHOP
SKIPA T,[[ASCIZ /Local echo on. /]]
MOVEI T,[ASCIZ /Local echo off. /]
JRST OUTSTR
SMMORE: SKIPE MOREP
SKIPA T,[[ASCIZ /More processing on. /]]
MOVEI T,[ASCIZ /More processing off. /]
JRST OUTSTR
SMSIO: MOVE T,TTOMOD
TRNE T,%TJSIO
SKIPA T,[[ASCIZ /Super image output on. /]]
MOVEI T,[ASCIZ /Super image output off. /]
JRST OUTSTR
SMVTT: MOVE T,ESTATE
TRNE T,ES%CAR
SKIPA T,[[ASCIZ /VT52 mode on. /]]
MOVEI T,[ASCIZ /VT52 mode off. /]
JRST OUTSTR
DOESCX: .IOT TTYOCH,[^G] ;feep if not a known command
DOESCR: MOVEI T,[ASCIZ /R/] ;restore cursor position
PUSHJ P,OUTSTR
; JRST TTYINL
;interrupt handlers
TTYINT: .CALL [ SETZ ;acknowledge interrupt
SIXBIT /WHYINT/
SETZI TTYICH]
JFCL
TTYINL: .IOT TTYICH,CH
JUMPL CH,TTYINX ;no more, dismiss the interrupt
TRZ CH,%TXSFT ;ignore shift
CAMN CH,ESCCHR ;this the escape character?
JRST DOESC ;yes, go handle it
TTYINC: TRZE CH,%TXCTL ;canonicalize the character
ANDI CH,37
ANDI CH,177 ;only send ascii
SKIPE ECHOP ;local echoing?
.IOT TTYOCH,CH ;yes, must do it then
.IOT CHAOCH,CH
CAIN CH,^M
SKIPE TBINP
SKIPA
.IOT CHAOCH,[^J] ;if ^M and not transmitting binary
JRST TTYINL
TTYINX: .NETS CHAOCH,
INTX: .CALL [ SETZ
SIXBIT /DISMIS/
MOVSI 1007
SETZ P]
.LOSE %LSSYS
IOCERR: .SUSET [.RBCHN,,T]
CAIE T,CHAICH
CAIN T,CHAOCH
JRST NOCONN ;ioc error for chaosnet, go analyze and die
.VALUE [ASCIZ /:IOC ERROR FOR NON CHAOSNET CHANNELKILL /]
MORINT: .CALL [ SETZ
SIXBIT /WHYINT/
SETZI TTYOCH]
.LOSE %LSSYS
SKIPN MOREP
JRST INTX
MOVEI T,[ASCIZ /**More**/]
PUSHJ P,OUTSTR
.CALL [ SETZ
SIXBIT /IOT/
MOVSI %TINWT+%TIPEK ;peek it and wait for it
MOVEI TTYICH
SETZM CH]
.LOSE %LSSYS
TRZ CH,%TXSFT
CAIN CH," ;if it is a space,
.IOT TTYICH,CH ;flush it
MOVEI T,[ASCIZ /
/]
PUSHJ P,OUTSTR
JRST INTX
CHAINT: .CALL [ SETZ
SIXBIT /WHYINT/
MOVEI CHAICH
MOVEM T
MOVEM S
SETZM TT]
.LOSE %LSSYS
CAIE T,%WYCHA ;chaosnet?
JRST WHYARP ;no, see what arpanet up to
TRNE F,FRARPA ;just in case
.VALUE
HLRES TT ;get number of packets
JUMPLE TT,INTX ;go away if no input there
CAIN S,%CSOPN ;still open?
JRST CHAIN1 ;yes, go see if input there
CAIE S,%CSCLS ;if closed,
CAIN S,%CSLOS ;or los
SOJG TT,CHAIN1 ;if there are data packets as well, handle them
JRST NOCONN ;else tell user what happened and die
WHYARP: CAIN T,%WYNET
TRNN F,FRARPA
.VALUE
HRRZS S ;get state
CAIN S,%NSOPN ;spurious?
JRST INTX
CAIE S,%NSCLI
CAIN S,%NSINP ;some input waiting?
TLZA TT,-1 ;get number of bytes waiting
JRST NOCONN ;no, bad state, figure out why
JUMPE TT,INTX
SETZ E, ;nothing in from network
SKIPA N,TT ;must count number left though
CHAIN1: SETZB E,N ;no chars in from network yet
MOVEI O,BUFSIZ ;or to be output to tty
MOVE BP,[440700,,TTYBUF]
CHAINL: PUSHJ P,NETI ;get character from network
JRST CHAINX ;none waiting, return
CAIN CH,IAC ;command of some sort?
JRST DOIAC ;yes, handle it
SKIPN TT,STATE ;saw iac or something last time?
JRST CHAINO ;no, ordinary character to be output
JUMPL TT,@WILTAB-WILL(TT) ;saw iac will before, handle this option
CAIL CH,WILL ;character after an iac, start of option?
CAILE CH,DONT
JRST CHAINF ;of range, flush it
HRROM CH,STATE ;yes, remember what was deferred
JRST CHAINL ;and go handle next character
;CHAINO: TRNN CH,200 ;ignore random old telnet characters
; PUSHJ P,TTYO ;type out ordinary character
; JRST CHAINL
CHAINO: TRNE CH,200 ;IGNORE RANDOM OLD TELNET CHARACTERS
JRST CHAINL
MOVE TT,ESTATE
TRNN TT,ES%CAR ;DO WE EVEN CARE ABOUT TRANSLATING ESCAPES
JRST [PUSHJ P,TTYO ;NOPE, JUST OUTPUT STUFF
JRST CHAINL]
TRNN TT,ES%EPD ;ESCAPE PENDING?
JRST [CAIE CH,33 ;DO WE HAVE AN ESCAPE CHARACTER
JRST ENORM ;HANDLE AS NORMAL CHARACTER
MOVE TT,ESTATE
TRO TT,ES%EPD
MOVEM TT,ESTATE
JRST CHAINL] ;ALL DONE FOR NOW
TRNN TT,ES%ABS ;ASB CURSOR POSITIONING IN PROGRESS?
JRST HESC ;NOPE PROCESS OTHER POSSIBLE ESCAPES
TRNN TT,ES%ASF ;ABS POS, RECEIVED YPOS?
JRST [TRO TT,ES%ASF
MOVEM TT,ESTATE ;NOPE, THIS IS IT, SO SET FLAG
SUBI CH,30 ;VT52 HAS 40 ADDED TO POSITION
MOVEM CH,EYPOS ;SAVE IT AWAY
JRST CHAINL] ;AND DONE FOR NOW
SUBI CH,30 ;THIS IS XPOS, SUBTRACE THE 40 ADDED FOR VT52
MOVEM CH,EXPOS ;SAVE IT AWAY
MOVEI TT,ES%CAR ;CLEAR PENDING FLAGS (IE ONLY CARE FLAG REMAINS)
MOVEM TT,ESTATE
MOVEI CH,20 ;DO ^P CODE 20 = ^P
PUSHJ P,TTYO ;OUTPUT IT
MOVEI CH,"H ;HORIZONTAL FIRST
PUSHJ P,TTYO
MOVE CH,EXPOS ;GET REMEMBERED XPOS
PUSHJ P,TTYO ;OUTPUT IT
MOVEI CH,20 ;SECOND ^P CODE FOR VERTICAL POSITION
PUSHJ P,TTYO
MOVEI CH,"V
PUSHJ P,TTYO
MOVE CH,EYPOS ;GET SAVED YPOS
PUSHJ P,TTYO
JRST CHAINL
ENORM: CAIN CH,177 ;IGNORE RUBOUTS (THEY ARE PADS)
JRST CHAINL
CAIN CH,000 ;NULLS ARE ALSO PADS
JRST CHAINL
CAIE CH,40 ;OUTPUTING A SPACE
JRST [ CAIN CH,^P ;IS IT ^P?
PUSHJ P,[
PUSHJ P,TTYO ;OUTPUT THE ^P
MOVEI CH,"P ;"AND ALSO OUTPUT A P TO SEND A ^P
POPJ P,]
PUSHJ P,TTYO
JRST CHAINL]
MOVEI CH,20 ;YEP, CLEAR CHAR POSITION BEFORE ADVANCING CURSOR
PUSHJ P,TTYO
MOVEI CH,"K
PUSHJ P,TTYO
MOVEI CH,40
PUSHJ P,TTYO
JRST CHAINL
HESC: CAIN CH,"Y ;ABSOLUTE CURSOR POS
JRST [MOVE TT,ESTATE
TRO TT,ES%ABS
MOVEM TT,ESTATE
JRST CHAINL]
PUSHJ P,FCHAR ;TRANSLATE TO ^P CODE CHAR
JRST CHAINL ;IGNORE UNKOWN CODES FOR NOW
JRST DHESC ;OUTPUT ^P CODE AND BACK TO MAIN LOOP
;; FCHAR: TRANSLATE TELERAY 1061 ESCAPE CODE TO ^P CODE
;; ACCEPTS INPUT IN CH, PUTS RESULT IN CH OR -1 IF NOT FOUND
;; SKIP RETURN INDICATES SUCCESS ALSO
FCHAR: MOVSI T,-NCTAB
FCHARL: HLRZ TT,CTAB(T)
CAIE TT,(CH)
AOBJN T,FCHARL
JUMPGE T,[SETO CH,
POPJ P,]
HRRZ CH,CTAB(T)
AOS (P)
POPJ P,
CTAB: "A,,"U
"B,,"D
"C,,"F
"H,,"T
"J,,"E
"K,,"L
"L,,"[
"P,,"^
"Q,,"_
"M,,"\
NCTAB==.-CTAB
;; BRANCH HERE WITH ^P CODE LETTER IN CH, HERE WE OUTPUT ^P CODE AND CONTINUE
;; BACK TO MAIN LOOP
;; ALSO CLEARS THE ESCAPE PENDING FLAG
DHESC: MOVE TT,ESTATE
TRZ TT,ES%EPD
MOVEM TT,ESTATE
PUSH P,CH
MOVEI CH,20 ;CONTROL P
PUSHJ P,TTYO
POP P,CH
PUSHJ P,TTYO
JRST CHAINL
CHAINF: SETZM STATE ;flush this char, but reset state
JRST CHAINL
CHAINX: PUSHJ P,TTYS ;send any buffered tty output
JRST INTX
DOIAC: SKIPE STATE ;iac in middle of command
JRST CHAINF ;probably quoted, just flush it since doesnt print
MOVEM CH,STATE ;state now deferred iac
AOSE OLDTLP ;this the first we have heard of new telnet?
JRST CHAINL ;no, go get more
MOVE T,[440800,,[.BYTE 8 ? IAC ? DO ? ECHO ? IAC ? DO ? SUPRGA]]
MOVEI TT,6
SNDOPT: .CALL [ SETZ
SIXBIT /SIOT/
MOVEI CHAOCH
T
SETZ TT]
.LOSE %LSSYS
.NETS CHAOCH, ;request ordinary state
JRST CHAINL
WILTAB: DOWILL
DOWONT
DODO
DODONT
DOWILL: CAIN CH,ECHO ;will echo
JRST WILECO ;yes, fine
CAIN CH,SUPRGA ;will supress go-ahead
JRST CHAINF ;we requested it, so ok
CAIN CH,TRNBIN ;losing tenex?
SNDDO: TROA CH,DO_8 ;yes, just respond do always
SNDDNT: IORI CH,DONT_8
DOOPT: LSH CH,4+8
IOR CH,[.BYTE 8 ? IAC ? 0 ? 0]
MOVE T,[440800,,CH]
MOVEI TT,3
SETZM STATE
JRST SNDOPT
DODO: CAIN CH,ECHO ;do echo
JRST DOECO ;oh well, guess we have to
CAIN CH,TRNBIN
JRST [ SETOM TBINP
JRST SNDWIL]
CAIN CH,TIMMRK
JRST SNDWIL
SNDWIL: TROA CH,WILL_8 ;yes, always say will
SNDWNT: IORI CH,WONT_8
JRST DOOPT
DOWONT: CAIN CH,ECHO ;wont echo?
JRST DOECO ;ok, we will
CAIN CH,TRNBIN ;wont transmit binary
JRST SNDDNT
JRST CHAINF ;flush everything else
DODONT: CAIN CH,ECHO
JRST WILECO
CAIN CH,TRNBIN
JRST [ SETZM TBINP
JRST SNDWNT]
JRST CHAINF
WILECO: SKIPN ECHOP ;is he echoing now?
JRST CHAINF ;yes, not a change of state, ignore it
SETZM ECHOP
JRST SNDDO ;else ok for him to echo now
DOECO: SKIPE ECHOP ;are we echoing now?
JRST CHAINF ;yes, not a change of state, ignore
SETOM ECHOP
JRST SNDWIL ;else we will have to do it
NETI0: TRNE F,FRARPA
JRST NTIARP
JUMPN N,CPOPJ ;didnt get a full bufferful last time, no more input waiting
MOVE T,[440800,,NETBUF]
MOVEI N,BUFSIZ ;try to get whole buffer full
.CALL [ SETZ
SIXBIT /SIOT/
MOVSI 10 ;no hang mode
MOVEI CHAICH
T
SETZ N]
.LOSE %LSSYS
MOVEI E,BUFSIZ
SUBI E,(N) ;get number of bytes we really got
JUMPE E,CPOPJ ;didnt get any
MOVE D,[440800,,NETBUF]
NETI: SOJL E,NETI0
ILDB CH,D
JRST POPJ1
NTIARP: JUMPLE N,CPOPJ ;got it all last time
CAIG N,BUFSIZ ;get as much as possible
SKIPA E,N ;can get all in one bufferful
MOVEI E,BUFSIZ
SUBI N,(E)
MOVE T,[440800,,NETBUF]
MOVEI TT,(E) ;number of bytes to get
.CALL [ SETZ
SIXBIT /SIOT/
MOVEI CHAICH
T
SETZ TT]
.LOSE %LSSYS
MOVE D,[440800,,NETBUF]
JRST NETI
TTYO: IDPB CH,BP ;store away this character
SOJG O,CPOPJ ;still room for more
PUSHJ P,TTYS ;else send it out to tty
MOVEI O,BUFSIZ
MOVE BP,[440700,,TTYBUF]
POPJ P,
TTYS: MOVEI TT,BUFSIZ
SUBI TT,(O) ;get number of character put in buffer
JUMPE TT,CPOPJ ;none put in
MOVE T,[440700,,TTYBUF]
.CALL [ SETZ
SIXBIT /SIOT/
MOVS TTOMOD
MOVEI TTYOCH
T
SETZ TT]
.LOSE %LSSYS
POPJ P,
subttl LSRCHK and LSRWRN -- see if user is loser
;;; This checks to see if the loser is an AI or LCS member or on a
;;; winners list. If not, a warning net-hopping message is printed
;;; and the program offers to kill itself off.
;;; The winner-p check has been extracted so that if at some point in
;;; the future this program is modified to check if it's running from
;;; a CRTSTY, those people may not be warned.
;;; skips unless the luser should be warned.
lsrchk: pushj p,winchk ;are they a winner?
skipa ;nope
jrst popj1 ;yea; so skip
;; check to see if they're in loser table
move t,[-loslen,,lostab]
;; winchk left xuname in tt
lsloop: camn tt,(t)
popj p, ;loser -> don't skip
aobjn t,lsloop
;; check inquir entry
movei a,filech
move b,[-lsrpgs,,hstpag];map lsr where host table will be
pushj p,lsrtns"lsrmap
jrst lsrlos ;something wrong; print loser message
.suset [.rxuname,,b] ;xuname into b
pushj p,lsrtns"lsrunm ;find our entry in database
jrst lsrlos ;no inquir entry; must be loser
.close filech, ;close lsr file
movei a,lsrtns"i$grp ;we want to check group
pushj p,lsrtns"lsritm
popj p, ;none means guest
ildb a,a ;get field
caie a,"A ;"A" means AI lab
cain a,"L ;"L" means LCS
jrst dvwiaa
caie a,"V
cain a,"Z
jrst dvwiaa
caie a,"C
popj p, ;they're not a lab member
dvwiaa: movei a,lsrtns"i$rel ;get relation
pushj p,lsrtns"lsritm
popj p, ;none means loser
ildb a,a ;get field
caie a,"X ;some losers put AX when they mean XA
;; These names are for NETWRK
popj1: aos (p) ;otherwise skip
cpopj: popj p, ;when returning
lsrlos: .close filech, ;close lsr file
popj p, ;don't skip
;;; Skip means these people know what they're doing; don't hassle them
winchk: .suset [.rxuname,,tt]
move t,[-winlen,,wintab]
wnloop: camn tt,(t)
jrst popj1 ;winner; skip
aobjn t,wnloop
popj p,
;;; these people aren't hassled
wintab: irp x,,[gumby,alan,cstacy,cent,dph,oaf,jnc,jtw,sra]
sixbit/x/
termin
winlen==.-wintab
;;; These people are always hassled
lostab: irp x,,[tk,hewitt,rms]
sixbit/x/
termin
loslen==.-lostab
;;; warn loser that net-hopping is a waste of the machine
lsrwrn: movei t,[asciz/
Using this machine to access another will needlessly
drain resources, slowing the system both for you and other users.
You'll probably get better response by connecting directly.
You should not do this unless you have a good reason to do so. If
you have any questions, typing :LUSER to DDT will request a system
programmer to assist you.
Are you sure you want to net-hop?/]
pushj p,outstr
.call [ setz ? sixbit /iot/
movsi %tinwt ;do wait for this char
movei ttyich ? setzm a]
.lose %lssys
caie a,"y
cain a,"Y
popj p, ;it was a Y
caie a,40 ;maybe it was a space?
.logout 1,
popj p,
OUTSTR: HRLI T,440700 ;type asciz string out of T
OUTST1: ILDB CH,T
JUMPE CH,CPOPJ
.IOT TTYOCH,CH
JRST OUTST1
OUTSIX: SETZ T, ;type sixbit out of TT
LSHC T,6
ADDI T,40
.IOT TTYOCH,T
JUMPE TT,CPOPJ
JRST OUTSIX
PUTCHR: .IOT TTYOCH,T
POPJ P,
$$ARPA==1 ;support both arpa and chaos nets
$$CHAOS==1
$$HOSTNM==1
$$SYMLOOK==1
$$ICP==1
$$HSTSIX==1
$$ANALYZE==1
$$HST3==1
.INSRT SYSTEM;CHSDEF >
.INSRT SYSENG;NETWRK >
;;; Inquir database hackery
;;; don't assemble useless gubbage
$$ulnm==0 ;don't care about last name
$$ulnp==0 ;even if abbreviated
$$unam==0 ;no never!
lsrpgs==20 ;number of pages for lsrtab
.insrt syseng;lsrtns >
PAT": PATCH": BLOCK 50
VARIAB ? CONSTA
HSTPAG==<.+1777>/2000 ;place to map in the hosts2 file
END GO