mirror of
https://github.com/PDP-10/its.git
synced 2026-02-07 08:57:06 +00:00
446 lines
9.2 KiB
Plaintext
Executable File
446 lines
9.2 KiB
Plaintext
Executable File
; -*- Midas -*-
|
||
|
||
title SENVER - Chaosnet SENd serVER
|
||
|
||
a=1
|
||
b=2
|
||
c=3
|
||
d=4
|
||
e=5
|
||
t=6
|
||
tt=7
|
||
pbp=10
|
||
h=11 ;BP to the ascii message buffer w/header
|
||
hl=12 ;Number of bytes in above buffer
|
||
n=13 ;BP to the chaos-format message text
|
||
nl=14 ;Number of bytes of above
|
||
k=15 ;Kount of #bytes in CLS packet
|
||
l=16
|
||
p=17
|
||
|
||
call=pushj p,
|
||
return=popj p,
|
||
|
||
hosti==1 ;To suck in HOSTS3 with
|
||
usri==2 ;To test for loginedness of local people
|
||
outo==3 ;Outputting the message, either CLI or MAIL:
|
||
chaosi==4 ;The twisted pair.
|
||
chaoso==5
|
||
erri==6 ;For sucking in an error message
|
||
|
||
pdlen==20
|
||
nw%chs==:7 ;Chaosnet host#
|
||
nw%arp==:12 ;Arpanet host#
|
||
hostsp==100 ;Page to map in HOSTS3 at
|
||
length==2000*10 ;Number of bytes to allow for a message
|
||
|
||
.insrt dsk:system;chsdef
|
||
|
||
define syscall op,args
|
||
.call [setz ? .1stwd sixbit /op/ ? args(400000)]
|
||
termin
|
||
|
||
define type &string
|
||
movei t,<.length string>
|
||
move tt,[440700,,[ascii string]]
|
||
syscall siot,[movei outo ? move tt ? move t]
|
||
jfcl
|
||
termin
|
||
|
||
subttl Silly Random Crufty Storage
|
||
|
||
pdlist: -pdlen,,.
|
||
block pdlen
|
||
|
||
debug: 0 ;Non-0 for debugging
|
||
tolate: 0 ;Non-0 if it is too late to refuse connection.
|
||
error: 0 ;Gack! .CALL error code!
|
||
here: 0 ;Our hostname
|
||
|
||
hostn: 0 ;Host number you are sending to
|
||
host6: 0 ;Sixbit abbreviated name of...
|
||
l$host: 0 ;Length of below name.
|
||
phost: 440700,,host
|
||
host: block 20 ;Host name you're sending to.
|
||
|
||
from: block 20
|
||
|
||
pfsite: 440700,,fsite
|
||
fsite: block 20 ;From site.
|
||
msglen: 0 ;Length of incoming message.
|
||
|
||
l$name: 0 ;Length of below name...
|
||
name6: 0 ;Sixbit of name, for ITS messages.
|
||
pname: 440700,,name
|
||
name: block 20 ;Who you're sending to.
|
||
|
||
usr: sixbit /USR/ ;Sometimes clobbered to "AIUSR" or similar
|
||
cli: sixbit /CLI/ ;Likewise
|
||
|
||
packet: block %cpmxw ;One chaotic bundle.
|
||
|
||
tsint: loc 42 ;Interrupt handler
|
||
-tsintl,,tsint
|
||
loc tsint
|
||
p ;need a stack
|
||
%piioc ? 0 ? -1 ? -1 ? iocerr
|
||
tsintl==:.-tsint
|
||
|
||
iocerr: call choke ;sigh
|
||
|
||
$$hst3==1
|
||
$$arpa==1
|
||
$$chaos==1
|
||
$$hstmap==1
|
||
$$hostnm==1
|
||
$$symlook==1
|
||
$$mit==1
|
||
$$hstsix==1
|
||
.insrt dsk:syseng;netwrk
|
||
|
||
|
||
subttl Do It
|
||
|
||
begin: .close 1, ;Might still be open from loading us.
|
||
move p,pdlist
|
||
move tt,[-2,,[
|
||
.soption,,[(%opint\%opopc)] ;We use new-style interrupts.
|
||
.smask,,[%piioc] ;Interrupt in IOC errors
|
||
]]
|
||
.suset tt
|
||
syscall chaoso,[movei chaosi ? movei chaoso ? movei 5]
|
||
call die
|
||
movei t,%colsn
|
||
dpb t,[$cpkop packet] ;LiSteN for...
|
||
movei t,4
|
||
dpb t,[$cpknb packet] ;A name with this many bytes,
|
||
move t,[.byte 8 ? "S ? "E ? "N ? "D]
|
||
movem t,packet+%cpkdt ;Namely that.
|
||
syscall pktiot,[movei chaoso ? movei packet]
|
||
call die
|
||
movei a,5*30. ;Five seconds,
|
||
skipe debug
|
||
movei a,60.*60.*30. ;or 1 hour if debugging.
|
||
syscall netblk,[movei chaosi ? movei %cslsn
|
||
move a ;Wait this long
|
||
movem t] ;Will be new socket state.
|
||
call die
|
||
caie t,%csrfc ;Was there an RFC?
|
||
call die ; Then what are we doing here??
|
||
syscall pktiot,[movei chaosi ? movei packet] ;Yes, so suck it in.
|
||
call die
|
||
syscall sstatu,[repeat 6,[ ? movem here]]
|
||
jfcl
|
||
movei a,hostsp
|
||
movei b,hosti
|
||
call netwrk"hstmap ;Inhale HOSTS3 binary.
|
||
call die
|
||
ldb b,[$cpksa packet]
|
||
hrli b,nw%chs_9
|
||
call netwrk"hstsrc ;Find sender's site.
|
||
caia
|
||
jrst fsitok
|
||
fsituk: move d,pfsite ;Sender's site is unknown.
|
||
ldb b,[$cpksa packet] ;Make a fake name.
|
||
call octdpb ;Looks like octal Chaos addr.
|
||
move a,[440700,,[asciz "/CHAOS"]] ;Followed by net name.
|
||
fsitu1: ildb t,a
|
||
idpb t,d ; * Note that since NETWRK"HSTLOOK
|
||
skipe t ; * can parse addresses like this.
|
||
jrst fsitu1 ; * (Therefore the SENDER program can
|
||
jrst benice ; * actually REPLY to these frobs!)
|
||
|
||
fsitok: hrli a,440700
|
||
move b,pfsite
|
||
weeeee: ildb t,a
|
||
jumpe t,benice
|
||
idpb t,b
|
||
jrst weeeee
|
||
|
||
subttl We are Alive - Be Sociable
|
||
|
||
benice: skipe debug
|
||
jrst parse ;No need to be sociable if bizy
|
||
ldb t,[$cpksa packet] ;Source address.
|
||
move a,[sixbit /000C00/] ;The jname template.
|
||
dpb t,[220300,,a] ;Save low byte: 00xS00
|
||
lsh t,-3
|
||
dpb t,[300300,,a] ;Next highest: 0x0S00
|
||
lsh t,-3
|
||
dpb t,[360300,,a] ;And the last: x00S00
|
||
.suset [.ruind,,t] ;Our user index/job#
|
||
dpb t,[000300,,a] ;Low byte: 000S0x
|
||
lsh t,-3
|
||
dpb t,[060300,,a] ;Finally done: 000Sx0
|
||
move b,a ;B/ xuname, A/ uname
|
||
syscall login,[move a ? [sixbit /CHAOS/] ? move b]
|
||
aoja a,.-1 ; Loss! Try another uname.
|
||
syscall detach,[movsi 3 ? movei %jself] ;Set ourself free.
|
||
call die
|
||
.suset [.sjname,,[sixbit /SENVER/]] ;Don't be shy...
|
||
|
||
subttl See What the Fuck You Want
|
||
|
||
parse: setz hl,
|
||
move h,[440700,,buffer]
|
||
ldb l,[$cpknb packet] ;Length.
|
||
move pbp,[440800,,packet+%cpkdt]
|
||
move n,pbp
|
||
setz k,
|
||
schaff: sojl l,hoo
|
||
ildb t,pbp
|
||
caie t,40
|
||
jrst schaff
|
||
move a,[440700,,name]
|
||
setz b,
|
||
usnarf: sojl l,gotu
|
||
ildb t,pbp
|
||
cain t,40
|
||
jrst gotu
|
||
cain t,"@
|
||
jrst gots
|
||
idpb t,a
|
||
aoja b,usnarf
|
||
|
||
gotu: jumpe b,hoo ;Be nice about too many blanks.
|
||
movem b,l$name ;Save name length.
|
||
gotu1: move a,[440700,,name]
|
||
move c,[440600,,name6]
|
||
move tt,l$name
|
||
caile tt,6
|
||
movei tt,6
|
||
guloop: ildb t,a
|
||
caige t,"a
|
||
subi t,40
|
||
idpb t,c
|
||
sojn tt,guloop
|
||
ucheck: syscall open,[movsi .uii ? movei usri ? move usr
|
||
move name6 ? [sixbit /HACTRN/]]
|
||
jrst nogots
|
||
.close usri,
|
||
syscall open,[movsi .uio ? movei outo ? move cli
|
||
move name6 ? [sixbit /HACTRN/]]
|
||
jrst gagged
|
||
.close outo,
|
||
movei a,[asciz /ÔTY message from chaosnet site /]
|
||
call stuff
|
||
movei a,fsite
|
||
call stuff
|
||
movei a,[asciz /:
|
||
/]
|
||
call stuff
|
||
call accept
|
||
movei t,6 ; Knock 6 times ("twice on the pipe...")
|
||
knock: syscall open,[movsi .uao ? movei outo ? move cli
|
||
move name6 ? [sixbit /HACTRN/]]
|
||
caia ; he was there just moment ago...
|
||
jrst sendit
|
||
sojle t,gone ; I guess he went away
|
||
movei tt,30. ; Knock every 1 second
|
||
.sleep tt,
|
||
jrst knock ; Go knock on his door again
|
||
|
||
subttl Dolt! You specified a site! VERIFICATION!
|
||
|
||
gots: jumpe b,hoo
|
||
movem b,l$name
|
||
move a,phost
|
||
setz b,
|
||
gsloop: sojl l,scheck
|
||
ildb t,pbp
|
||
cain t,40
|
||
jrst scheck
|
||
cail t,"a
|
||
trz t,40
|
||
idpb t,a
|
||
aoja b,gsloop
|
||
|
||
scheck: jumpe b,gotu1 ;Not really a site here.
|
||
movem b,l$host
|
||
movei a,host
|
||
call netwrk"hstlook
|
||
jrst badsite
|
||
movem a,hostn
|
||
hlrz t,1(b)
|
||
add t,netwrk"hstadr
|
||
hlrz tt,1(t)
|
||
add tt,netwrk"hstadr
|
||
move c,(tt)
|
||
camn c,[ascii /ITS/]
|
||
jrst [ call netwrk"hstsix
|
||
jfcl
|
||
lsh a,4*6
|
||
camn a,here
|
||
jrst gotu1
|
||
movem a,host6
|
||
move t,usr
|
||
lsh t,-6*2
|
||
ior t,a
|
||
movem t,usr
|
||
move tt,cli
|
||
lsh tt,-6*2
|
||
ior tt,a
|
||
movem tt,cli
|
||
jrst gotu1 ]
|
||
call accept
|
||
move a,[440700,,from]
|
||
setz b,
|
||
gfrom: sojl l,qsend
|
||
ildb t,pbp
|
||
idpb t,a
|
||
aoja b,gfrom
|
||
|
||
qsend: jumpe b,nofrom
|
||
syscall open,[movsi .uao ? movei outo ? [sixbit /DSK/] ? moves error
|
||
[sixbit /MAIL/] ? [sixbit />/] ? [sixbit /.MAIL./]]
|
||
call losage
|
||
type "FROM-PROGRAM:SENVER
|
||
FROM:"
|
||
move a,[440700,,from]
|
||
syscall siot,[movei outo ? move a ? move b ? moves error]
|
||
call losage
|
||
type "
|
||
RCPT:("
|
||
move t,pname
|
||
move tt,l$name
|
||
syscall siot,[movei outo ? move t ? move tt ? moves error]
|
||
call losage
|
||
.iot outo,["@]
|
||
move t,phost
|
||
move tt,l$host
|
||
syscall siot,[movei outo ? move t ? move tt ? moves error]
|
||
call losage
|
||
type " (R-MODE-SEND 0))
|
||
TEXT;-1
|
||
"
|
||
|
||
subttl Send the Silly Thing and then Quit
|
||
|
||
sendit: move t,[440700,,buffer]
|
||
move tt,hl
|
||
syscall siot,[movei outo ? move t ? move tt ? moves error]
|
||
call losage
|
||
done: .close outo,
|
||
close: .close chaoso,
|
||
.close chaosi,
|
||
call die
|
||
|
||
loss: call gargle
|
||
loss1: dpb k,[$cpknb packet] ;Length
|
||
movei t,%cocls
|
||
dpb t,[$cpkop packet] ;Opcode
|
||
syscall pktiot,[movei chaoso ? movei packet]
|
||
call choke
|
||
call choke
|
||
|
||
choke: skipn tolate
|
||
die: skipe debug
|
||
.value
|
||
.logout 1,
|
||
|
||
subttl Random and Sundry Subroutines
|
||
|
||
;;; OCTDPB - Deposit octal number in B down ASCII Bp in D.
|
||
;;; Smashes B,C; Updates D.
|
||
|
||
octdpb: idivi b,8.
|
||
movm b,b
|
||
movm c,c
|
||
octdp1: addi c,"0
|
||
caile c,"9
|
||
addi c,<"a-10.-"0>
|
||
jumpe b,octdp2
|
||
hrlm c,(p)
|
||
idivi b,8.
|
||
call octdp1
|
||
hlrz c,(p)
|
||
octdp2: idpb c,d
|
||
return
|
||
|
||
accept: movei t,%coopn
|
||
dpb t,[$cpkop packet]
|
||
syscall pktiot,[movei chaoso ? movei packet]
|
||
call die
|
||
setom tolate
|
||
move t,[440800,,netbuf]
|
||
movei tt,length
|
||
syscall siot,[movei chaosi ? move t ? move tt ? moves error]
|
||
call losage
|
||
jumpe tt,toobig
|
||
movei nl,length
|
||
sub nl,tt
|
||
transl: move a,[440800,,netbuf]
|
||
send2: sojl nl,cpopj
|
||
ildb t,a
|
||
cain t,200\^m
|
||
jrst [ idpb t,h
|
||
movei t,^j
|
||
aoja hl,send3 ]
|
||
trnn t,200
|
||
skipa
|
||
caile t,207
|
||
send3: idpb t,h
|
||
aoja hl,send2
|
||
|
||
stuff: hrli a,440700
|
||
sloop: ildb t,a
|
||
jumpe t,cpopj
|
||
idpb t,h
|
||
aoja hl,sloop
|
||
|
||
gargle: hrli a,440700
|
||
garg1: ildb t,a
|
||
jumpe t,cpopj
|
||
idpb t,n
|
||
aoja k,garg1
|
||
|
||
hoo: movei a,[asciz /You must specify a name in the RFC./]
|
||
jrst loss
|
||
|
||
toobig: movei a,[asciz /Message is too big - Can't cope./]
|
||
jrst loss
|
||
|
||
nogots: movei a,[asciz /User "/]
|
||
call gargle
|
||
movei a,name
|
||
call gargle
|
||
movei a,[asciz /" is not logged in./]
|
||
jrst loss
|
||
|
||
gagged: movei a,[asciz "User is not accepting messages."]
|
||
jrst loss
|
||
|
||
gone: movei a,[asciz /User is no longer logged in or accepting messages./]
|
||
jrst loss
|
||
|
||
badsit: movei a,[asciz /Invalid site specified: "/]
|
||
call gargle
|
||
movei a,host
|
||
call gargle
|
||
movei a,[asciz /"./]
|
||
jrst loss
|
||
|
||
nofrom: movei a,[asciz /Senders name not specified in C->A forwarding RFC./]
|
||
jrst loss
|
||
|
||
losage: movei a,[asciz /?ITS LOSSAGE - /]
|
||
call gargle
|
||
syscall open,[movsi .uai ? movei erri ? [sixbit /ERR/]
|
||
movei 4 ? move error]
|
||
jrst [ movei a,[asciz /?!Can't get error message/]
|
||
jrst loss ]
|
||
eloop: .iot erri,t
|
||
caige t,40
|
||
jrst loss1
|
||
idpb t,n
|
||
aoja k,eloop
|
||
|
||
popj1: aos (p)
|
||
cpopj: return
|
||
|
||
netbuf: block <length+3>/4
|
||
|
||
buffer: block <length+4>/5
|
||
|
||
end begin
|