1
0
mirror of https://github.com/PDP-10/rsh.git synced 2026-01-12 00:02:45 +00:00
PDP-10.rsh/rsh.mid
2018-10-20 10:34:00 +00:00

344 lines
4.6 KiB
Plaintext
Raw Permalink 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.

Title RSH - Speak Un*x rshell protocol
.DecSave
DBG==0
Ifndef TCPX31,TCPX31=603436 ;Connection error or connection rejected
Ifndef TCPX19,TCPX19=603422 ;TCP connection allready exists
Define Error &s
Jrst [ Hrroi 1,[Asciz s]
Jrst .Error ]
Termin
Define JError &s
Jrst [ Hrroi 1,[Asciz s]
Jrst .Jerror ]
Termin
Define EJError &s
Erjmp [ Hrroi 1,[Asciz s]
Jrst .Jerror ]
Termin
x==10 ;Loop var
bp==11 ;BP in to InBuf
up==12 ;BP to 4n user
cp==13 ;BP to command text
p==17
Stack: Block <Stklen==20>
String: Block <Strlen==20>
Me: Block Strlen ;local user (lower case)
InBuf: Block Strlen ;RSCAN JCL
Host: Block 1 ;4n host number
Jfn: Block 1 ;Net JFN
Prompt: Block 1 ;BP to prompt in GStr
Chntab: 1,,TTYINT
Block 34.
Levtab: PC1 ? PC2 ? PC3
PC1: Block 1
PC2: Block 1
PC3: Block 1
Crlf: .BYTE 7 ? ^m ? ^j ? .BYTE
S: Jfcl
RESET
Movei 1,.FHSLF
Seto 3,
EPCAP
Move p,[-StkLen,,Stack-1]
Movei 1,.RSINI
RSCAN
JError 'RSCAN failed'
Jumpe 1,.Usage
Movn 3,1
Movei 1,.PRIIN
Hrroi 2,InBuf
SIN
Erjmp .Usage
Move bp,[440700,,InBuf]
Call SkipNs
.Usage: Error 'Usage: rsh host [-u 4nuser] command'
Call SkipSp
Jrst .Usage
IFN DBG,[
Move 1,bp
PSOUT
Movei 1,"/
PBOUT
] ;DBG
Movei 1,.GTHSN ; translate name to number
Move 2,bp
GTHST%
Erjmp [Hrroi 1,[Asciz 'Bad Host']
Jrst .Jerror ]
Move bp,2
Movem 3,Host
Call SkipSp
Jrst .Usage
Call GetMe
Move cp,bp ;Save bp (might be command)
Hrroi up,Me ;Make 4n user be me
Ildb 1,bp ;Get next char
Jumpe 1,.Usage
Caie 1,"- ;'-'?
Jrst go4it
Ildb 1,bp
Jumpe 1,.Usage
Caie 1,"u
Cain 1,"U
Trna
Error 'Bad flag'
Call SkipSp
Error 'No user'
Move up,bp ;Save user pointer
Call SkipNs ;Skip non-spaces
Error 'No command'
Setz 1,
Idpb 1,bp ;Tie off user
Move cp,bp
go4it: Call DoOpen
IFN DBG,[
Move 1,up
PSOUT
Movei 1,"/
PBOUT
Move 1,cp
PSOUT
Hrroi 1,CrLf
PSOUT
] ;DBG
Call DoSend
HALTF
Jrst .-1
GetMe: GJINF
Move 2,1 ;Get user number
Hrroi 1,Me
DIRST ;Stringify
Trn
Move 1,[440700,,Me]
LcLop: Ildb 2,1 ;Make lc
Jumpe 2,R
Cail 2,"A
Caile 2,"Z
Jrst LcLop
Addi 2,"a-"A
Dpb 2,1
Jrst LcLop
R: Ret
DoOpen: Movei x,1023. ;higest prived port
Srclop: Hrroi 1,String
Hrroi 2,[Asciz /TCP:/]
Setz 3,
SOUT
Movei 2,(x)
Movei 3,10.
NOUT
Jfcl
Hrroi 2,[Asciz /#./]
Setz 3,
SOUT
Move 2,Host
Movei 3,10
NOUT
jfcl
Hrroi 2,[asciz /-514;PERSIST:30;CONNECT:ACTIVE/]
Setz 3,
SOUT
Idpb 3,2
Movsi 1,(GJ%SHT\GJ%ACC)
Hrroi 2,String
GTJFN
JError 'Could not get jfn'
Movem 1,Jfn
Move 2,[100000,,OF%RD+OF%WR] ;8 bit bytes
tryopn: OPENF
Skipa 3,1 ;Save error code
Jrst Won
Move 1,Jfn
RLJFN
trn
Caie 3,TCPX19 ;Usual error?
Cain 3,TCPX31 ; or this one?
Sojg x,Srclop ; Yes, search..
JError 'Could not open' ;out of luck
Won: Ret
DoSend: Hrroi 2,[Asciz '0'] ;Stderr port number
Call SndStr
Move 2,up ;Send 4n user
Call Sndstr
Hrroi 2,Me ;Send local user
Call Sndstr
Move 2,cp ;Send command
Call Sndstr
Call Flush
GetSts: Move 1,Jfn
BIN
EJerror 'Could not get status byte'
Jumpe 2,PiIni ;AOK, start input PIs
Hrroi 1,[Asciz '4n Error: ']
ESOUT
Jrst OK
PiIni: Hrroi 1, [Asciz 'Open...
'] ? PSOUT
Movei 1,.FHSLF
Move 2,[Levtab,,Chntab]
SIR
EIR
Movsi 2,(Setz) ;Channel 0
AIC
Movsi 1,.TICTI ;input, channel 0
ATI
Movei 1,.PRIOU
RFMOD
Tlz 2,TT%DAM
SFMOD
OK: Move 1,Jfn
BIN
Erjmp Done
Movei 1,.PRIOU
BOUT
Jrst OK
Done: Move 1,Jfn
CLOSF
Jerror 'Close failed'
HALTF
Jrst .-1
TTYINT: Push P,1
Push P,2
Push P,3
TTYLOP: Movei 1,.PRIIN
SIBE
Trna
Jrst TTYEND
BIN
Erjmp TTYEND
Cain 2,^M
Jrst TTYLOP
Cain 2,^Z
Jrst ContZ
Move 1, JFN
BOUT
Erjmp TTYLOP
Jrst TTYLOP
TTYEND: Call Flush
Pop P,3
Pop P,2
Pop P,1
DEBRK
ContZ: Move 1,JFN
CLOSF
trn
HRROI 1,[ASCIZ '
EOF']
PSOUT
HALTF
Jrst .-1
Flush: Move 1,Jfn
Hrroi 2,[0]
Setz 3,
SOUTR
EJError 'Flush failed'
Ret
; Send string + nul
; 2/ bp
Sndstr: Move 1,Jfn
Setz 3,
SOUT
EJError 'Sndstr failed'
Setz 2,
BOUT
EJError 'Sndstr failed(2)'
Ret
IOerr: Jerror 'I/O error'
; 1/ bp to prompt
Gstr: Movem 1,Prompt
Gstr2: Move 3,Prompt
Move 1,3
PSOUT
Hrroi 1, String
Move 2, [<Strlen*5-1>\RD%CRF]
RDTTY
ErJmp gstr2
Setz 2,
Dpb 2,1
Ret
.Jerror:
ESOUT
Hrroi 1,[Asciz ': ']
PSOUT
Movei 1,.PRIOU
Hrloi 2,.FHSLF
Setz 3,
ERSTR
Skipa
Jfcl
HALTF
Jrst .-1
.Error: ESOUT
HALTF
Jrst .-1
Skips0: Skipa bp,2
SkipSp: Move 2,bp
Ildb 1,2
Jumpe 1,R
Caie 1," ;Space?
Cain 1,^I ; or Tab?
Jrst SkipS0
Rskp: Aos (p)
Ret
SkipN0: Skipa bp,2
SkipNs: Move 2,bp
Ildb 1,2
Jumpe 1,R
Caie 1," ;Space?
Cain 1,^I ; or Tab?
AosA (p)
Jrst SkipN0
Ret
End S