title tt -- tcp: test program. search jobdat, uuosym,macten .text "/symseg:low/locals" opdef tcp. [call [sixbit "tcp."]] define ipaddr(a,b,c,d), define error(msg),< jrst[ outstr[ asciz "msg"] outstr[ byte (7) 15, 12, 0] jrst quit] >;error macro tty==1 tcp==2 t1==1 t2==2 t3==3 t4==4 p==17 dummy: block 1 rport: exp ^D9 ;Discard, default port. raddr: bygg2 ;Default remote address. pc2: ipaddr (192,168,111,58) bygg2: ipaddr (192,168,111,59) topsy: ipaddr (192,168,111,60) paf.se: ipaddr (66,125,125,88) ipaddr (64,168,243,36) spare: exp 0 tib: block 3 ;TCP: input buffer header. tob: block 3 ;TCP: output buffer header. tcb: phase 0 .tcfnc:!block 1 ;Function code. .tcfoa==0 ; Open active. .tcfop==1 ; Open passive. .tcfcl==2 ; Close. .tcfab==3 ; Abort. .tcfgs==4 ; Get status. .tcdev:!block 1 ;Device/channel. .tcflg:!block 1 ;Flags etc. .tclad:!block 1 ;local address. .tcrad:!block 1 ;remote address. .tclpr:!block 1 ;local port. .tcrpr:!block 1 ;remote port. .tcbuf:!block 1 ;status buffer ptr. .tccnt:!block 1 ;status buffer size. dephase dirty: exp 0 ;TCP: buffer has data, needs dumping. ttyflg: exp 0 ;TTY: input done flag. slploc: sleep t1, ;Race condition workaround. vector: vectcp: exp tcpint, 0, 0, 0 vectty: exp ttyint, 0, 0, 0 tt:: jfcl reset movei t1,vector piini. t1, jfcl movx t1,ps.fon pisys. t1, jfcl open tcp,[ exp uu.aio+.iobyt sixbit 'tcp' xwd tob, tib] error(Can't open TCP:) move t1,[ ps.fac+[exp tcp xwd ,ps.rid!ps.rod!ps.rdo!ps.rol!ps.rsw xwd 0,0]] pisys. t1, jfcl open tty,[ exp uu.aio+.ioasl sixbit 'tty' xwd 0, 0] ;Do TTCALLs. error(Can't open TTY:) move t1,[ ps.fac+[exp tty xwd ,ps.rid!ps.rod!ps.ria xwd 0,0]] pisys. t1, jfcl skpinl ;Prime the pump. jfcl ; . . . movei t1,.tcfoa movem t1,tcb+.tcfnc ;Function, open active. movei t1,tcp movem t1,tcb+.tcdev ;Device/channel. setzm tcb+.tcflg ;No flags. setzm tcb+.tclad ;Default the local address. mstime t1, ;Get some random value. andi t1,177776 ;Mask down to 16 bits, - addi t1,1 ; and a non-zero value. movem t1,tcb+.tclpr ;This is our local port. move t1,rport movem t1,tcb+.tcrpr ;Set up our remote port. move t1,@raddr movem t1,tcb+.tcrad ;Set up our remote address. setzm tcb+.tcbuf ;No buffer. movei t1,tcb ;Try to connect. tcp. t1, error(Can't open tcp connection) loop: move t2,[sleep t1,] movem t2,slploc skipe ttyflg jrst ttcopy movei t1,^D60 xct slploc jrst loop ttcopy: setzm ttyflg setzm dirty tloop: inchsl t3 jrst tlo.4 tlo.2: sosge tob+.bfctr jrst[ out tcp, jrst tlo.2 movei t2,1 sleep t2, jrst .] idpb t3,tob+.bfptr setom dirty jrst tloop tlo.4: skipe dirty out tcp, jrst loop movei t2,1 sleep t2, jrst tlo.4 quit: monrt. jrst tt tcpint: jrst handler ;Use old one for now. outstr[ asciz "tcp: interrupt "] jrst dismis ttyint: setom ttyflg dismis: movem t1,slploc movsi t1,(jfcl) exch t1,slploc debrk. jfcl error(DEBRK. returned!) handler: move t1,vectcp+.psvfl trnn t1,ps.rsw jrst hand.2 movei t1,[ exp 4 exp tcp repeat 10,<0>] tcp. t1, halt cail t1,0 caile t1,^D10 movei t1,^D11 outstr[ asciz "state: "] outstr@[exp[ asciz "closed"] exp[ asciz "listen"] exp[ asciz "syn-sent"] exp[ asciz "syn-received"] exp[ asciz "established"] exp[ asciz "fin-wait 1"] exp[ asciz "fin-wait 2"] exp[ asciz "closing"] exp[ asciz "time-wait"] exp[ asciz "close-wait"] exp[ asciz "last-ack"] exp[ asciz "???"]](1) outstr[ byte (7) 15, 12, 0] hand.2: move t1,vectcp+.psvfl trnn t1,ps.rid jrst hand.3 copy: sosge tib+.bfctr jrst nxtbuf ildb t1,tib+.bfptr outchr 1 jrst copy nxtbuf: statz tcp,io.eof jrst hand.4 in tcp, jrst copy hand.3: statz tcp,io.eof hand.4: outstr[asciz "EOF "] movei t1,^D60 debrk. jfcl halt end tt