diff --git a/Makefile b/Makefile index 727cdcc2..b30d87d9 100644 --- a/Makefile +++ b/Makefile @@ -2,9 +2,9 @@ EMULATOR ?= simh # The directores listed in SRC, DOC, and BIN are put on the sources tape. SRC = system syseng sysen1 sysen2 sysen3 sysnet kshack dragon channa \ - midas _teco_ emacs emacs1 rms klh syshst sra mrc ksc eak cstacy \ - gren bawden _mail_ l lisp liblsp libdoc comlap lspsrc nilcom \ - rwk inquir acount gz sys decsys alan ecc + midas _teco_ emacs emacs1 rms klh syshst sra mrc ksc eak gren \ + bawden _mail_ l lisp liblsp libdoc comlap lspsrc nilcom rwk \ + inquir acount gz sys decsys ecc DOC = info _info_ sysdoc kshack _teco_ emacs emacs1 BIN = sysbin device emacs _teco_ inquir diff --git a/build/build.tcl b/build/build.tcl index 58e241d0..8b39cefd 100644 --- a/build/build.tcl +++ b/build/build.tcl @@ -214,6 +214,8 @@ respond "*" ":print sys2;..new. (udir)\r" type ":vk\r" respond "*" ":print sys3;..new. (udir)\r" type ":vk\r" +respond "*" ":print cstacy;..new. (udir)\r" +type ":vk\r" respond "*" ":midas sysbin;_.teco.;teco\r" expect ":KILL" @@ -350,7 +352,7 @@ respond "*" ":link device;jobdev ar,device;jobdev arc\r" respond "*" ":midas device;jobdev d_syseng;dskdev\r" expect ":KILL" -respond "*" ":midas sysbin;_ar1:cstacy;whoj\r" +respond "*" ":midas sysbin;_sysen3;whoj\r" expect ":KILL" respond "*" ":link sys1;ts talk,sysbin;whoj bin\r" type ":vk\r" @@ -558,7 +560,7 @@ respond "*" ":link sys2;ts chtn,sysbin;chtn bin\r" respond "*" ":midas sys;ts ttloc_sysen1;ttloc\r" expect ":KILL" -respond "*" ":midas device;jobdev dp_ar5:alan;dpdev 19\r" +respond "*" ":midas device;jobdev dp_sysen3;dpdev\r" expect ":KILL" respond "*" ":midas sys1;ts quote_sysen1;limeri\r" @@ -747,19 +749,11 @@ respond "*" ":link sys3;ts sned,sys;ts send\r" # NICNAM -respond "*" ":midas sys2;ts nicnam_ar2:cstacy;nicnam\r" -respond "Use what filename instead?" "dsk:\r" -respond "Use what filename instead?" "dsk:\r" -respond "Use what filename instead?" "dsk:\r" -respond "Use what filename instead?" "dsk:\r" +respond "*" ":midas sys2;ts nicnam_sysen3;nicnam\r" expect ":KILL" # NICWHO -respond "*" ":midas sys2;ts nicwho_ar2:cstacy;nicwho\r" -respond "Use what filename instead?" "dsk:\r" -respond "Use what filename instead?" "dsk:\r" -respond "Use what filename instead?" "dsk:\r" -respond "Use what filename instead?" "dsk:\r" +respond "*" ":midas sys2;ts nicwho_sysen3;nicwho\r" expect ":KILL" # reatta @@ -1006,7 +1000,7 @@ respond "*" ":midas sys2;ts photo_sysen2;photo\r" expect ":KILL" # TYPE8 -respond "*" ":midas sys;ts type8_sra;ar3:type8\r" +respond "*" ":midas sys;ts type8_sysen3;type8\r" expect ":KILL" # HOST diff --git a/src/alan/ar5.midas b/src/alan/ar5.midas deleted file mode 100755 index 2e14eba8..00000000 Binary files a/src/alan/ar5.midas and /dev/null differ diff --git a/src/cstacy/ar1.src1 b/src/cstacy/ar1.src1 deleted file mode 100755 index 44c176ae..00000000 Binary files a/src/cstacy/ar1.src1 and /dev/null differ diff --git a/src/cstacy/ar2.src2 b/src/cstacy/ar2.src2 deleted file mode 100755 index 0b52a632..00000000 Binary files a/src/cstacy/ar2.src2 and /dev/null differ diff --git a/src/sra/ar3.gz_mid b/src/sra/ar3.gz_mid deleted file mode 100755 index 002067a3..00000000 Binary files a/src/sra/ar3.gz_mid and /dev/null differ diff --git a/src/sysen3/dpdev.19 b/src/sysen3/dpdev.19 new file mode 100644 index 00000000..06ba487a --- /dev/null +++ b/src/sysen3/dpdev.19 @@ -0,0 +1,693 @@ +;;;-*-Midas-*- + +TITLE Dissociated Press Device + +a=1 +b=2 +c=3 +d=4 +e=5 +f=6 + +t=10 ;T & TT saved by interrupts +tt=11 + +ct=16 +p=17 + +call=pushj p, +return=popj p, +jcall==jrst +save=push p, +rest=pop p, + +dsk==d +boj==b +tty==t + +%fojb==1_17. ;We have a superior, so act as an OJB handler. +;;Next 4 are the open mode. Must be kept in order! +%fnrf==1_16. ;Don't set the reference date. +%fimg==1_15. ;Image, not ascii. +%fblk==1_14. ;Block, not unit. +%fout==1_13. ;Output, not input. +%fdir==1_12. ;Luser asked for a directory listing. +%fval==1_11. ;BOJ interrupts clear this "valid" bit. +%fiot==1_10. ;Luser last seen in an IOT. +%fsio==1_9 ;Luser last seen in a SIOT. +%fhak==1_8 ;For directory hack. + +define syscall name,args + .call [setz ? sixbit "name" ? args(400000)] +termin + +ifndef reprtp, reprtp==0 + +define report &msg& +ifn reprtp,[ + call [ call $report + .length msg + ascii msg]] +termin + +define error &msg& + call [ call $error + .length msg + ascii msg] +termin + +pdllen==100. +.vector pdl(pdllen) + +go: move p,[-pdllen,,pdl-1] +goinit: setzb ct,0 ;Clear position and flags. + move tt,[-4,,[ .roption,,a + .rsuppr,,b + .runame,,uname + .rxuname,,xuname + ]] + .suset tt + tlo a,%opint\%opopc + jumpl b,goset + tlo a,%opojb + tro %fojb + syscall open,[[%tjdis\.uao,,tty] ? [sixbit "tty"]] + .lose %lssys + tlne a,%opddt + .value [asciz ""] + report "Greetings!" +goset: move tt,[-3,,[ .soption,,a + .s40addr,,[forty] + .smsk2,,[1_boj] + ]] + .suset tt + jrst begin + +.vector args(12.) ;Args returned by JOBCAL go here. + +begin: syscall open,[[10\.bio,,boj] ? [sixbit "boj"]] + done ;he went away? + move tt,[-12.,,args] + syscall jobcal,[movei boj ? tt ? movem t] + done ;he went away? + tlne t,60000 ;close? (Huh?) + done + jrst @.+1(t) + open ;.open + opndie ;.iot + mlink ;mlink + opndie ;.reset + opndie ;.rchst + opndie ;.access + fdele ;.fdele (delete or rename) + opndie ;.fdele (renmwo) + opndie ;.call + +mlink: report "Make link" + syscall mlink,[%clerr,,a ? [sixbit "dsk"] + args+1 ? args+2 ? args+3 + args+0 ? args+5 ? args+6] + jrst opnerr +onesho: .call jbrt + done ;perhaps he gave up + done + +fdele: skipe args+0 + jrst rename + report "Delete" + syscall delete,[%clerr,,a ? [sixbit "dsk"] + args+1 ? args+2 ? args+3] + jrst opnerr + jrst oneshot + +rename: report "Rename" + syscall rename,[%clerr,,a ? [sixbit "dsk"] + args+1 ? args+2 ? args+3 + args+0 ? args+5] + jrst opnerr + jrst oneshot + +opndie: error "Unexpected opcode from initial JOBCAL" + +;;;Come here with error code in A. +opnerr: report "Open error" + hrlz a,a + syscall jobret,[movei boj ? a] + done ;perhaps he punted + done + +.vector fname(4) ;filename +.scalar flen ;It's length in 7-bit bytes, corrected for + ;^C lossage. +.scalar fccct ;Just how many ^C's were there? +.scalar fobyt ;Byte size file was written with. +.scalar folen ;Files length in those bytes. + +open: move tt,args+5 ;get open mode + trne tt,777760 ;don't support other funny bits + jrst [movei a,%ensmd ? jrst opnerr] + dpb tt,[.bp %fnrf\%fblk\%fimg\%fout,0] ;set it in flags + move tt,args+4 ;save filename + movem tt,fname + move tt,[args+1,,fname+1] + blt tt,fname+3 + move a,fname+1 + move b,fname+2 + camn a,[sixbit ".file."] ;Check for magic names. + came b,[sixbit "(dir)"] + skipa + tro %fdir + camn a,[sixbit "m.f.d."] + came b,[sixbit "(file)"] + skipa + tro %fdir + trne %fdir ;We don't support image mode directories + trnn %fimg\%fout ; or output to directories. + skipa + jrst [movei a,%ensmd ? jrst opnerr] + trnn %fout + jrst iopen ;open for input +oopen: movei a,%ensio ;open for output + jrst opnerr ;We don't do output yet. + +iopen: move tt,[.uai,,dsk] + tlne %fnrf ;Respect reference date if so requested. + tlo tt,%donrf + syscall open,[%clerr,,a ? tt ? [sixbit "dsk"] + fname+1 ? fname+2 ? fname+3] + jrst opnerr + syscall rfname,[%clerr,,ercode ? movei dsk ? movem tt + movem fname+1 ? movem fname+2 ? movem fname+3] + call lssys ;I don't know about this... + trne %fdir ;Can't take length of a directory. + jrst noflln + syscall fillen,[%clerr,,ercode ? movei dsk ? movem flen + movem tt ? movem fobyt ? movem folen] + call lssys + setzm fccct + move t,fobyt + cain t,7 ;If it was written in 7-bit bytes, length + jrst noflln ; must be OK. + move t,flen + jumpe t,noflln ;Can't argue with a 0 length file. + move t,flen + subi t,4 ;check out last 4 characters. + .access dsk,t +repeat 4,[ + .iot dsk,t + cain t,3 + aosa fccct + setzm fccct] + movn t,fccct + addm t,flen +noflln: ldb tt,[.bp %fimg\%fblk\%fout,0] + lsh tt,6 + addi tt,22 + syscall jobsts,[%clerr,,ercode ? movei boj ? tt + fname ? fname+1 ? fname+2 ? fname+3] + call lssys + syscall rfname,[movei boj ? movem tt ? movem juname ? movem jjname] + jfcl ;it was only for debugging. + trnn %fimg\%fblk + jrst [ ;;If user is using .UAI mode, then we MUST revert to .UAO + ;;because otherwise there is no place to remember which + ;;character in a word he has read! + syscall open,[[10\.uao,,boj] ? [sixbit "boj"]] + done ;he gave up? + jrst .+1] + .call jbrt + done ;He gave up? + call outinit ;Gotcha! Can't punt as easily now... + trnn %fdir + jrst dp +dirlp: .iot dsk,a ;What a pain directories are! + jumpl a,outeof + cail a,"A + caile a,"Z + jrst [cail a,"a + caile a,"z + trz %fhak + jrst dirupc] + troe %fhak + addi a,"a-"A +dirupc: call out + jrst dirlp + +.scalar corlen ;Length adjusted to fit in our address space. + +dp: skipn t,flen ;Zero length files are a pain. + jrst outeof + movem t,corlen + subi t,1 + idivi t,5*2000 + addi t,1 + caig t,400-fpage ;Grabbing infinite core? + jrst dpnurk ;Nope. + move t,[<1000000-fbase>*5] ;That's fucking big! + movem t,corlen + movei t,400-fpage +dpnurk: imul t,[-1,,0] + hrri t,fpage + .access dsk,[0] + syscall corblk,[%clerr,,ercode ? movei %cbndr + movei %jself ? t + movei dsk] + call lssys + move c,flen + call rndinit ;Initialize random number generator. + call rndpos +dplp: movei tt,20. + call rndnum ;Between 5 and 24. characters in a run. + addi tt,5 + move t,c ;Where will that put us? + sub t,tt + jumple t,dpdone ;Beyond the end? then finish up. + sub c,tt ;New count. + hrrei d,-3(tt) ;Keep count in d. Zap all but three. +charlp: jsp t,inwrap + call out + sojg d,charlp + jsp t,inwrap + move d,a + call out + jsp t,inwrap + move e,a + call out + jsp t,inwrap + move f,a + call out + call rndpos +srchlp: ildb a,inbp + came a,d + sojg b,srchlp + came a,d + jrst [jsp t,wrap ? jrst srchlp] + sosg b + jsp t,wrap + save b + save inbp + jsp t,inwrap + came a,e + jrst nope + jsp t,inwrap + came a,f + jrst nope + rest (p) + rest (p) + jrst dplp + +nope: rest inbp + rest b + jrst srchlp + +dpdone: jumpe c,outeof + jsp t,inwrap + call out + soja c,dpdone + +.scalar inbp + +rndpos: move tt,corlen + call rndnum + move b,corlen + sub b,tt + move t,tt + idivi t,5 + move tt,(tt)[440700,,fbase ? 350700,,fbase ? 260700,,fbase + 170700,,fbase ? 100700,,fbase] + add tt,t + movem tt,inbp + return + +inwrap: ildb a,inbp + sojg b,(t) +wrap: move tt,[440700,,fbase] + movem tt,inbp + move b,corlen + jrst (t) + +rndnum: save tt + call random + tlz t,400000 + rest tt + idiv t,tt + return + +buflen=100. +.vector outbuf(buflen) +.scalar outbp,outct + +;;;Call here to output character in A. +out: idpb a,outbp + sosle outct + return + call stuf +;;;Call here to initialize output. +outini: move tt,[440700,,outbuf] + movem tt,outbp + movei tt,buflen*5 + movem tt,outct + return + +;;;Jump hear at EOF. +outeof: movei a,buflen*5 + sub a,outct + jrst eof + +;;;Call this routine whenever the output buffer is full. +stuf: save a + trnn %fimg\%fblk + jrst stuf7 + report "Stuffing..." + move a,[-buflen,,outbuf] + add ct,[400000,,buflen] ;Sign bit means that A contains a + ;correction to the position. + .iot boj,a + tlz ct,400000 + rest a + return + +stuf7: report "Stuffing in 7 bit mode..." + movei a,buflen*5 + add ct,[400000,,buflen*5] ;Sign bit means that A contains a + ;correction to the position. + move tt,[440700,,outbuf] + syscall siot,[%clerr,,ercode ? movei boj ? tt ? a] + call lssys + tlz ct,400000 + rest a + return + +;;;Jump here at end of file. A should contain the number of characters +;;;left over in the output buffer. +eof: trnn %fimg\%fblk + jrst eof7 + report "EOF" + idivi a,5 + move tt,[ascii ""] + dpb tt,(b)[4400,,outbuf(a) ? 3500,,outbuf(a) ? 2600,,outbuf(a) + 1700,,outbuf(a) ? 1000,,outbuf(a)] + skipe b + aos a + move b,a + hlri b,400000 + imul a,[-1,,0] + hrri a,outbuf + add ct,b + .iot boj,a + tlz ct,400000 + jrst eoflp + +eof7: report "EOF7" + move b,a + hrli b,400000 + add ct,b + move tt,[440700,,outbuf] + syscall siot,[%clerr,,ercode ? movei boj ? tt ? a] + call lssys + tlz ct,400000 +eoflp: trne %fval ;Do we understand the situation? + .hang ;Yep, twiddle thumbs. + tro %fval ;Set valid flag. + trnn %fiot\%fsio ;Luser last seen in IOT or SIOT? + jrst eoflp ;Nope. That was fast! + move a,iot.ct + tlzn a,400000 + jrst gotct + hlre b,iot.a + trnn %fimg\%fblk + movn b,iot.a + add a,b +gotct: subm ct,a ;We have given him C(A) words since then. + hlre b,args+0 + trnn %fblk + movn b,args+0 + add a,b + jumpe a,eoflp ;Which is just what he wanted! + trnn %fsio ;SIOT and block mode just return. + trne %fblk + jrst wakeup + trne %fimg ;.UII gets %piioc if you IOT beyond eof + jrst ioceof + trnn %fval ;Last chance to back out loser! + jrst eoflp + ;;Suppose he pclsrs and does a SIOT? He gets a ^C. + .iot boj,[-1,,3] + jrst eoflp + +ioceof: trnn %fval ;Last chance to back out loser! + jrst eoflp + ;;Suppose he pclsrs and does a SIOT? He gets an error anyway. + syscall jobioc,[%clerr,,ercode ? movei boj ? movei 2] + call lssys ;suppose he goes away? + jrst eoflp + +wakeup: .call jbrt + jrst eoflp + jrst eoflp + +rndlen==71. ;Canonical random number generator. +rndoff==35. +.vector rnd(rndlen) +.scalar rnd1,rnd2 + +;;;Returns a random number in T. This algorithm is a known winner. +random: sosge t,rnd1 + jrst [movei t,rndlen-1 ? movem t,rnd1 ? jrst .+1] + sosge tt,rnd2 + jrst [movei tt,rndlen-1 ? movem tt,rnd2 ? jrst .+1] + move t,rnd(t) + addb t,rnd(tt) + return + +;;;Call here to initialize random number generator. +rndini: save a + movei a,rndoff-1 + movem a,rnd2 + movei a,rndlen-1 + movem a,rnd1 + move tt,[171622221402] +rndilp: move t,tt ;This initialization algorithm is stolen + muli t,3125. ; from MacLisp. There is no reason to + div t,[377777777741] ; believe that IT is particularly good. + tlcn a,400000 + jrst [hrlm tt,rnd(a) ? jrst rndilp] + hrrm tt,rnd(a) + sojge a,rndilp + rest a + return + +intacs==t_6+2 ;T and TT saved + +tsint: intacs,,p + 0 ? 1_boj ? 0 ? 1_boj ? bojint +tsintl==.-tsint + +bojint: move tt,[-12.,,args] + syscall jobcal,[movei boj ? tt ? movem t] + jrst disint + tlne t,60000 ;time to close up shop! + done + trz %fiot\%fsio\%fval + jrst @.+1(t) + caldie ;.open + iot ;.iot + caldie ;mlink + reset ;.reset + rchst ;.rchst + cantdo ;.access + caldie ;.fdele (delete or rename) + cantdo ;.fdele (renmwo) + docall ;.call + +.scalar iot.a,iot.ct ;save position at last IOT + +iot: report "IOT" + tlnn t,%jgsio ;Is this IOT or SIOT? + troa %fiot + tro %fsio + movem a,iot.a ;record position + movem ct,iot.ct +disint: syscall dismis,[%clerr,,ercode ? %clbit,,intacs ? p] + call lssys + +reset: report "RESET" + .call jbrt + jrst disint + jrst disint + +docall: move t,args+0 + camn t,[sixbit "fillen"] + jrst fillen + camn t,[sixbit "rfdate"] + jrst rfdate + camn t,[sixbit "lnkedp"] + jrst lnkedp + report ".CALL" ;stump + move tt,args+0 + trne %fojb + call 6type +cantdo: movei tt,%ebddv + report "Wrong type device" +calerr: hrlz tt,tt + syscal jobret,[movei boj ? tt] + jrst disint + jrst disint + +caldie: error "Unexpected opcode from JOBCAL on open channel" + +.vector vals(12.) ;JOBRET values typically found here + +jbrt: setz ;Common JOBRET call. + sixbit "jobret" ;Skips, returns no values. + movei boj + setzi 1 + +jbrtv: setz ;Another common JOBRET call. + sixbit "jobret" ;Skips, aobjn pointer to values in TT. + movei boj + movei 1 + setz tt + +rchst: report "RCHST" + move tt,[fname,,vals] + blt tt,vals+3 + hrrei tt,-1 + movem tt,vals+4 + move tt,[-5,,vals] + .call jbrtv + jrst disint + jrst disint + +rfdate: report "RFDATE" + trne %fdir ;Guess what doesn't have a reference date... + jrst cantdo + syscall rfdate,[%clerr,,ercode ? movei dsk ? movem vals+0] + call lssys +calrt1: move tt,[-1,,vals] + .call jbrtv + jrst disint + jrst disint + +lnkedp: report "LNKEDP" + setzm vals+0 ;We are never a link. + jrst calrt1 + +fillen: report "FILLEN" + trne %fdir ;Directories don't have a length... + jrst cantdo + move t,flen + trnn %fimg\%fblk + jrst filen7 + idivi t,5 + skipe tt + aos t + skipa tt,[36.] +filen7: movei tt,7 + movem t,vals+0 + movem tt,vals+1 + move t,fobyt + movem t,vals+2 + move t,folen + movem t,vals+3 + move tt,[-4,,vals] + .call jbrtv + jrst disint + jrst disint + +$repor: trne %fojb + jrst repor1 + rest (p) + return + +repor1: exch t,(p) + call msg + rest t + return + +.scalar ercode,losepc + +lssys: exch t,(p) + subi t,2 + movem t,losepc + movei t,%lssys + addm t,ercode + rest t + trnn %fojb + call crash + syscall lose,[ercode ? losepc] + .lose %lssys + +$error: trnn %fojb + call crash + exch t,(p) + call msg + rest t + rest losepc + sos losepc + syscall lose,[movei 0 ? losepc] + .lose %lssys + +msg: save tt + move tt,(t) + movei t,1(t) + hrli t,440700 + .iot tty,[^p] + .iot tty,["A] + syscall siot,[movei tty ? t ? tt] + .lose %lssys + .iot tty,[^p] + .iot tty,["A] + rest tt + return + +6type: jumpe tt,[.iot tty,["*] ? return] + save t +6typel: setzi t, + lshc t,6 + addi t,40 + .iot tty,t + jumpn tt,6typel + rest t + return + +$done: report "Done." + .logout ;Only die if toplevel + .close dsk, + jfcl + .hang + +done==call $done + +.scalar crashx,uname,xuname,jjname,juname + +;;;AAAIIIIEEEEE!!!!!! +crash: save 0 ;PDUMP misses the flags... + syscall open,[[.uio,,dsk] ? [sixbit "dsk"] + [sixbit "dpdev"] ? uname ? [sixbit "crash"]] + .logout 1, ;Well foo! + setz crashx + syscall pdump,[movei %jself ? movei dsk ? crashx] + .logout 1, ;??? + .iot dsk,[jrst crashr] + .iot dsk,[jrst crashr] + .logout 1, + +crashr: rest 0 + syscall open,[[%tjdis\.uao,,tty] ? [sixbit "tty"]] + .lose %lssys + return + +cnstnts: +constants + +variables + +forty: 0 + 0 + -tsintl,,tsint + +fpage==:<<.-1>_-12>+1 +fbase=:fpage_12 + +end go diff --git a/src/sysen3/nicnam.31 b/src/sysen3/nicnam.31 new file mode 100644 index 00000000..1e5d997a --- /dev/null +++ b/src/sysen3/nicnam.31 @@ -0,0 +1,226 @@ +;-*- Mode: Midas -*- + +TITLE NICNAME - Look up someone in the ARPAnet directory + ;CStacy, 2/1/84 + +SUBTTL Basic definitions + +;;; Registers. + +X=0 ;Super temporary register. +A=1 ;General registers. +B=2 +C=3 +D=4 +E=5 +BP=6 ;Byte pointer. +CHAR=7 ;Character being manipulated. +T=10 ;Temporary +TT=11 ;Temporary+1. +OC==12 ;OUT register. +U1==13 ;4 UUO Registers. +U2==14 +U3==15 +U4==16 +P=17 ;Stack pointer. + +;;; I/O Channels + +DSKI==12 ;Disk input for host table. +NETI=13 ;Network input. +NETO=14 ;Network output. +TTYO=15 ;TTY typeout. +TTYI=16 ;TTY typein. + +NICNAM==43. ;NICNAME TCP server port. + +;;; Macros and output routines. + +$$OUT==1 +.INSRT KSC;MACROS > +.INSRT KSC;IVORY > +.INSRT KSC;OUT > + + +SUBTTL Interrupt Handler and various returns + +POPJ1: AOS (P) ;Skip +CPOPJ: RET ;Return + +SYSLOS:: +AUTPSY: 0 ;Fatal error JSR here. + +DEATH: SKIPE DEBUG ;Come here to log out. + .VALUE [0] + .LOGOUT 1, + + +TMPLOC 42,{-TSINTL,,TSINT} ;New style interrupts. + +INTACS==T_6+7 ;T,TT, and OUT registers preserved. + + +TSINT: INTACS,,P + 0 ? 1_TTYI ? 0 ? <1_TTYO>\<1_TTYI> ? CHRINT + 0 ? 1_TTYO ? 0 ? 0 ? MORINT +TSINTL==:.-TSINT + +;;; Interrupt dismissal + +INTRET: SYSCAL DISMIS,[%CLBIT,,INTACS ? P] + JSR SYSLOS + +;;; Console interrupts. + +CHRINT: MOVEI T,TTYI ;INTERRUPT CHAR. + .ITYIC T, + JRST INTRET + CAIE T,^S + CAIN T,^G + JRST [.RESET TTYO, + SYSCAL TTYFLS,[ %CLBIT,,1 ? %CLIMM,,TTYI] + .LOSE %LSSYS + JRST FLSIT1] + JRST INTRET +MORINT: OUT(TTYO,("--More--")) ;MORE BREAK. + SYSCAL IOT,[%CLBIT,,%TIPEK ? %CLIMM,,TTYI ? %CLOUT,,T] + .LOSE %LSFIL + CAIE T,40 + CAIN T,177 + .IOT TTYI,T + CAIE T,40 + JRST FLSIT + OUT(TTYO,("A")) + JRST INTRET +FLSIT: OUT(TTYO,("Flushed")) +FLSIT1: JRST DEATH ;means we are done. + + + +SUBTTL Main program + +GO: MOVE P,[-PDLLEN,,PDL-1] ;Init the stack. + MOVEI A,LSTPAG + MOVEM A,FREPAG ;Remember where unallocated core is. + SYSCAL OPEN,[%CLBIT,,<.UAO\%TJDIS> ? %CLIMM,,TTYO ? [SIXBIT /TTY/]] + .LOSE %LSFIL + SYSCAL RFNAME,[%CLIMM,,TTYO ? %CLOUT,,B] + .LOSE %LSFIL ;Get truename of TTY. + CAMN B,['TTY,,] ;If device not "TTY" + JRST [ SETOM TRITTY ; must have been translated. + SYSCAL OPEN,[%CLBIT,,.UAI ? %CLIMM,,TTYI ? [SIXBIT /TTY/]] + .LOSE %LSFIL + SYSCAL TTYSET,[ %CLIMM,,TTYI + [222222,,222222] + [230222,,220222]] + NOP ; Failure just means no interrupts. + JRST .+1 ] +GO1: .SUSET [.ROPTION,,A] ;Read job option bits. + TLO A,%OPINT\%OPOPC ;Turn on winning-PC and new interrupts. + .SUSET [.SOPTION,,A] ;Set option bits. + .SUSET [.SMASK,,[%PIPDL]] ;PDL overflows are fatal (sure, why not?) + SKIPN TRITTY + .SUSET [.SMSK2,,[<1_TTYI>\<1_TTYO>]] ;Arm TTY interrupts. + OUT(TTYO,OPEN(UC$IOT)) + OUT(,CH(TTYO)) ;Open typeout display as default device. + TLNN A,OPTCMD ;If user forgot JCL + JRST [ OUT(,("AUsage is :NICNAME . +Do :NICNAME ? for help.")) + JRST DEATH ] + + .BREAK 12,[..RJCL,,JCLBUF] ;Slurp JCL into buffer. + SETZ A, ;Count characters of JCL. + MOVE BP,[440700,,JCLBUF] +GETJCL: ILDB CHAR,BP + JUMPE CHAR, ENDJCL ;A ^@ ends JCL. + CAIN CHAR,^M ;So do these... + JRST ENDJCL + CAIN CHAR,^_ + JRST ENDJCL + CAIN CHAR,^C + JRST ENDJCL + AOS A + JRST GETJCL +ENDJCL: MOVEM A,JCLLEN ;Remember how long tiz. + + +LOOKUP: MOVEI B,DSKI ;Find the NIC's Internet host address. + MOVE A,FREPAG ;Find free page to use. + CALL NETWRK"HSTMAP ;Map in the host table. + JSR AUTPSY + HRRZM A,FREPAG + AOS FREPAG ;Remember where next free page is. + MOVE A,[440700,,[ASCIZ /SRI-NIC/]] + CALL NETWRK"HSTLOO ;There's only one NICNAME server... + JSR AUTPSY + MOVEM A,SRINIC ;Remember the address. + +CONECT: MOVEI A,NETI + MOVEI B,NETO + SYSCAL TCPOPN,[ A ? B ? [-1] ? %CLIMM,,NICNAM ? SRINIC ] + JSR NETLUZ + NETHANG 900.,B,%NSRFS,[%NSOPN,%NSRFN] ;Wait until established. + JSR NETLUZ + OUT(NETO,OPEN(UC$IOT)) ;Open network output channel. + +COMAND: HRRZI B,JCLBUF + HRL B,JCLLEN + OUT(NETO,TC(B),EOL) ;Send the JCL to the server. + OUT(NETO,FRC) ; Ensure buffer forced out + SYSCAL FINISH,[%CLIMM,,NETO] ; Wait for transmission ACK + JSR AUTPSY +ANSWR: .IOT NETI,A ;Get character. + JUMPL A,DEATH ;If EOF, channel closed. + .IOT TTYO,A ;Print it on our console. + JRST ANSWR ;Not the most efficient thing... + +;;; JSR here for network errors. +;;; NETLUZ, expects (input) channel number in A. +;;; Network errors are fatal and are handled in the standard fashion. + +NETLUZ: 0 + CALL NETWRK"ANALYZ + JSR AUTPSY + JRST DEATH + +PUTCHR: .IOT TTYO,T + RET + + +SUBTTL Storage + +PDLLEN==64. ;Stack length. +LSRPGS==220. ;Number of pages reserved for LSR1. +JCLBFL==10. ;Number of words for JCL buffer. + +PDL: BLOCK PDLLEN ;The stack. +DEBUG: 0 ;-1 iff debugging. +JCLBUF: BLOCK JCLBFL ;JCL buffer. +JCLLEN: 0 ;Length of JCL. +TRITTY: 0 ;-1 iff TTY input translated +FREPAG: 0 ;Page number of next free page. +SRINIC: 0 ;Host address of SRI-NIC. + +CONSTANTS +VARIABLES + +VARCHK + +;;; Include network hacking routines: + +$$HST3==1 +$$HSTMAP==1 ;HOSTS3 file. +$$ARPA==1 ;Hack the ARPA Internet. +$$TCP==1 ;Use TCP/IP. +$$HOSTNM==1 ;Host name file lookup routines. +$$SYMLOOK==1 ;table lookup routine. +$$ANALYZE==1 ;Network Error Analysis Routine + +.INSRT SYSENG;NETWRK > + +CONSTANTS +VARIABLES + +LSTPAG==<.+1777>/2000 + +END GO diff --git a/src/sysen3/nicwho.30 b/src/sysen3/nicwho.30 new file mode 100644 index 00000000..0a94cf13 --- /dev/null +++ b/src/sysen3/nicwho.30 @@ -0,0 +1,226 @@ +;-*- Mode: Midas -*- + +TITLE NICWHO - Look up someone in the ARPAnet directory + ;CStacy, 2/1/84 + +SUBTTL Basic definitions + +;;; Registers. + +X=0 ;Super temporary register. +A=1 ;General registers. +B=2 +C=3 +D=4 +E=5 +BP=6 ;Byte pointer. +CHAR=7 ;Character being manipulated. +T=10 ;Temporary +TT=11 ;Temporary+1. +OC==12 ;OUT register. +U1==13 ;4 UUO Registers. +U2==14 +U3==15 +U4==16 +P=17 ;Stack pointer. + +;;; I/O Channels + +DSKI==12 ;Disk input for host table. +NETI=13 ;Network input. +NETO=14 ;Network output. +TTYO=15 ;TTY typeout. +TTYI=16 ;TTY typein. + +NICNAM==43. ;NICNAME TCP server port. + +;;; Macros and output routines. + +$$OUT==1 +.INSRT KSC;MACROS > +.INSRT KSC;IVORY > +.INSRT KSC;OUT > + + +SUBTTL Interrupt Handler and various returns + +POPJ1: AOS (P) ;Skip +CPOPJ: RET ;Return + +SYSLOS:: +AUTPSY: 0 ;Fatal error JSR here. + +DEATH: SKIPE DEBUG ;Come here to log out. + .VALUE [0] + .LOGOUT 1, + + +TMPLOC 42,{-TSINTL,,TSINT} ;New style interrupts. + +INTACS==T_6+7 ;T,TT, and OUT registers preserved. + + +TSINT: INTACS,,P + 0 ? 1_TTYI ? 0 ? <1_TTYO>\<1_TTYI> ? CHRINT + 0 ? 1_TTYO ? 0 ? 0 ? MORINT +TSINTL==:.-TSINT + +;;; Interrupt dismissal + +INTRET: SYSCAL DISMIS,[%CLBIT,,INTACS ? P] + JSR SYSLOS + +;;; Console interrupts. + +CHRINT: MOVEI T,TTYI ;INTERRUPT CHAR. + .ITYIC T, + JRST INTRET + CAIE T,^S + CAIN T,^G + JRST [.RESET TTYO, + SYSCAL TTYFLS,[ %CLBIT,,1 ? %CLIMM,,TTYI] + .LOSE %LSSYS + JRST FLSIT1] + JRST INTRET +MORINT: OUT(TTYO,("--More--")) ;MORE BREAK. + SYSCAL IOT,[%CLBIT,,%TIPEK ? %CLIMM,,TTYI ? %CLOUT,,T] + .LOSE %LSFIL + CAIE T,40 + CAIN T,177 + .IOT TTYI,T + CAIE T,40 + JRST FLSIT + OUT(TTYO,("A")) + JRST INTRET +FLSIT: OUT(TTYO,("Flushed")) +FLSIT1: JRST DEATH ;means we are done. + + + +SUBTTL Main program + +GO: MOVE P,[-PDLLEN,,PDL-1] ;Init the stack. + MOVEI A,LSTPAG + MOVEM A,FREPAG ;Remember where unallocated core is. + SYSCAL OPEN,[%CLBIT,,<.UAO\%TJDIS> ? %CLIMM,,TTYO ? [SIXBIT /TTY/]] + .LOSE %LSFIL + SYSCAL RFNAME,[%CLIMM,,TTYO ? %CLOUT,,B] + .LOSE %LSFIL ;Get truename of TTY. + CAMN B,['TTY,,] ;If device not "TTY" + JRST [ SETOM TRITTY ; must have been translated. + SYSCAL OPEN,[%CLBIT,,.UAI ? %CLIMM,,TTYI ? [SIXBIT /TTY/]] + .LOSE %LSFIL + SYSCAL TTYSET,[ %CLIMM,,TTYI + [222222,,222222] + [230222,,220222]] + NOP ; Failure just means no interrupts. + JRST .+1 ] +GO1: .SUSET [.ROPTION,,A] ;Read job option bits. + TLO A,%OPINT\%OPOPC ;Turn on winning-PC and new interrupts. + .SUSET [.SOPTION,,A] ;Set option bits. + .SUSET [.SMASK,,[%PIPDL]] ;PDL overflows are fatal (sure, why not?) + SKIPN TRITTY + .SUSET [.SMSK2,,[<1_TTYI>\<1_TTYO>]] ;Arm TTY interrupts. + OUT(TTYO,OPEN(UC$IOT)) + OUT(,CH(TTYO)) ;Open typeout display as default device. + TLNN A,OPTCMD ;If user forgot JCL + JRST [ OUT(,("AUsage is :NICWHO . +Do :NICWHO ? for help.")) + JRST DEATH ] + + .BREAK 12,[..RJCL,,JCLBUF] ;Slurp JCL into buffer. + SETZ A, ;Count characters of JCL. + MOVE BP,[440700,,JCLBUF] +GETJCL: ILDB CHAR,BP + JUMPE CHAR, ENDJCL ;A ^@ ends JCL. + CAIN CHAR,^M ;So do these... + JRST ENDJCL + CAIN CHAR,^_ + JRST ENDJCL + CAIN CHAR,^C + JRST ENDJCL + AOS A + JRST GETJCL +ENDJCL: MOVEM A,JCLLEN ;Remember how long tiz. + + +LOOKUP: MOVEI B,DSKI ;Find the NIC's Internet host address. + MOVE A,FREPAG ;Find free page to use. + CALL NETWRK"HSTMAP ;Map in the host table. + JSR AUTPSY + HRRZM A,FREPAG + AOS FREPAG ;Remember where next free page is. + MOVE A,[440700,,[ASCIZ /SRI-NIC/]] + CALL NETWRK"HSTLOO ;There's only one NICNAME server... + JSR AUTPSY + MOVEM A,SRINIC ;Remember the address. + +CONECT: MOVEI A,NETI + MOVEI B,NETO + SYSCAL TCPOPN,[ A ? B ? [-1] ? %CLIMM,,NICNAM ? SRINIC ] + JSR NETLUZ + NETHANG 900.,B,%NSRFS,[%NSOPN,%NSRFN] ;Wait until established. + JSR NETLUZ + OUT(NETO,OPEN(UC$IOT)) ;Open network output channel. + +COMAND: HRRZI B,JCLBUF + HRL B,JCLLEN + OUT(NETO,TC(B),EOL) ;Send the JCL to the server. + OUT(NETO,FRC) ; Ensure buffer forced out + SYSCAL FINISH,[%CLIMM,,NETO] ; Wait for transmission ACK + JSR AUTPSY +ANSWR: .IOT NETI,A ;Get character. + JUMPL A,DEATH ;If EOF, channel closed. + .IOT TTYO,A ;Print it on our console. + JRST ANSWR ;Not the most efficient thing... + +;;; JSR here for network errors. +;;; NETLUZ, expects (input) channel number in A. +;;; Network errors are fatal and are handled in the standard fashion. + +NETLUZ: 0 + CALL NETWRK"ANALYZ + JSR AUTPSY + JRST DEATH + +PUTCHR: .IOT TTYO,T + RET + + +SUBTTL Storage + +PDLLEN==64. ;Stack length. +LSRPGS==220. ;Number of pages reserved for LSR1. +JCLBFL==10. ;Number of words for JCL buffer. + +PDL: BLOCK PDLLEN ;The stack. +DEBUG: 0 ;-1 iff debugging. +JCLBUF: BLOCK JCLBFL ;JCL buffer. +JCLLEN: 0 ;Length of JCL. +TRITTY: 0 ;-1 iff TTY input translated +FREPAG: 0 ;Page number of next free page. +SRINIC: 0 ;Host address of SRI-NIC. + +CONSTANTS +VARIABLES + +VARCHK + +;;; Include network hacking routines: + +$$HST3==1 +$$HSTMAP==1 ;HOSTS3 file. +$$ARPA==1 ;Hack the ARPA Internet. +$$TCP==1 ;Use TCP/IP. +$$HOSTNM==1 ;Host name file lookup routines. +$$SYMLOOK==1 ;table lookup routine. +$$ANALYZE==1 ;Network Error Analysis Routine + +.INSRT SYSENG;NETWRK > + +CONSTANTS +VARIABLES + +LSTPAG==<.+1777>/2000 + +END GO diff --git a/src/sysen3/type8.2 b/src/sysen3/type8.2 new file mode 100644 index 00000000..3478dcae --- /dev/null +++ b/src/sysen3/type8.2 @@ -0,0 +1,190 @@ +;-*- Midas -*- GZ@MIT-MC, November, 1983 + TITLE TYPE8 Type an 8-bit file +T1==1 +T2==2 +T3==3 +T4==4 +A=5 +B=6 ;Current input byte +C=7 ;Number of bits left in file. +D=10 +E=11 + +IntAC=16 + +P=17 + +inch==1 +outch==2 +tyoch==3 +tyich==4 + +call= +return= + +pdllen==40 +.vector pdl(pdllen) + +Jclbuf: block 40 + ^C_35 + +IDev: sixbit/DSK/ +IFn1: 0 +IFn2: sixbit/>/ +ISnm: 0 + +define syscal op,args + .call [setz ? sixbit/op/ ? args ((setz))] +termin + +tsiot: setz + sixbit/SIOT/ + %Climm,,tyoch + T2 + T1 ((setz)) + +define type &string + movei T1,<.length string> + move T2,[440700,,[ascii string]] + .call tsiot + .Lose %LsSys +termin + +Tsint: loc 42 + -Tsintl,,Tsint + loc Tsint + P + 0 ? 1_tyich ? 0 ? <1_tyich>\<1_outch> ? Flush + 0 ? 1_outch ? 0 ? 0 ? More +Tsintl==.-Tsint + +Flush: movei IntAC,tyich + .ityic IntAC, + jrst intret + caie IntAC,^G + cain IntAC,^S + jrst flush1 +intret: syscal dismis,[p] + .Lose %LsSys + +flush1: .reset tyoch, + syscal ttyfls,[%clbit,,1 ? %climm,,tyich] + .Lose %LsSys + .iot tyoch,IntAC + Jrst Die + +More: push p,T1 + push p,T2 + type "--More--" + syscal iot,[%clbit,,%tipek ? %climm,,tyich ? %clout,,IntAc] + .Lose %LsFil + caie IntAc,40 + cain IntAc,177 + .iot tyich,IntAc + caie IntAc,40 + jrst [type "Flushed" + jrst Die] + type "A" + pop p,T2 + pop p,T1 + jrst intret + +RSIXTP: return +$$RFN==1 +.insrt dsk:syseng;rfn > + +FType: move T1,IDev + call 6Type + .iot tyoch,[":] + move T1,ISnm + call 6Type + .iot tyoch,[";] + move T1,IFn1 + call 6Type + .iot tyoch,[40] + move T1,IFn2 +6Type: setz T2, + rotc T1,6 + addi T2,40 + .iot tyoch,T2 + jumpn T1,6Type + return + +Begin: move p,[-pdllen,,pdl-1] + syscal open,[%clbit,,.uao\%tjdis ? %climm,,tyoch ? [sixbit/TTY/]] + .Lose %LsFil + .suset [-2,,[.rHsname,,ISnm ? .rXuname,,IFn1]] + .break 12,[..rJCL,,Jclbuf] + skipn Jclbuf + jrst Help + ldb T1,[261600,,Jclbuf] + cain T1,_-26 + jrst Help + movei B,IDev + move D,[440700,,Jclbuf] + call RFN"rfn + syscal open,[%clbit,,.uii ? %climm,,inch ? IDev ? IFn1 ? IFn2 ? ISnm] + jrst [type "A" + call FType + type " - file not found." + jrst Die] + syscal fillen,[%climm,,inch ? %clout,,C] + .Lose %LsFil + jumpe C,Die + .iot inch,T1 ;Flush COM header if any + camn T1,[sixbit/DSK8/] + sosa C + .access inch,[0] +; .suset [.rMemt,,T1] +; movei T2,FBuf(C) +; camg T2,T1 +; jrst Snarf +; movei T1,1777(T2) +; trz T1,1777 +; .suset [.sMemt,,T1] +;Snarf: move T1,[004400,,FBuf] +; move T2,C +; syscal siot,[%climm,,inch ? T1 ? T2] +; .Lose %LsFil +; .close inch, + + syscal open,[%clbit,,.uao ? %climm,,outch ? [sixbit/TTY/]] + .Lose %LsFil + syscal open,[%clbit,,.uai ? %climm,,tyich ? [sixbit /TTY/]] + .Lose %LsFil +; syscal ttyset,[%climm,,tyich ? [424242,,424242] ? [434242,,424242]] + syscal ttyset,[%climm,,tyich ? [222222,,222222] ? [230222,,220222]] + .Lose %LsSys + .suset [-2,,[.sOption,,[optint,,] ? .sMSK2,,[<1_tyich>\<1_outch>]]] + +; move B,[441000,,FBuf] +; imuli C,4 +;outp: sojl C,Die +; ildb T1,B +; cain T1,^Z +; jrst Die +; .iot outch,T1 +; jrst outp + +outp: sojl C,Die + .iot inch,A + move B,[441000,,A] +outp1: ildb T1,B + cain T1,^Z + jrst Die + .iot outch,T1 + tlne B,700000 + jrst outp1 + jrst outp + +Help: type "A:TYPE8 input file +Types an ascii file encoded in 8-bit bytes. Stops at first ^Z." +Die: .break 16,120000 + + VARIAB + +junk: CONSTA + +FBuf: 0 + + end begin \ No newline at end of file diff --git a/src/sysen3/whoj.26 b/src/sysen3/whoj.26 new file mode 100644 index 00000000..53b503ef --- /dev/null +++ b/src/sysen3/whoj.26 @@ -0,0 +1,419 @@ +;-*- Mode: MIDAS -*- + +TITLE Users on ITS (crock, crock) + +;;; This is a little MLDEV crock to keep me less annoyed until the +;;; ITS RSSER stuff gets converted. It takes JCL, which should be +;;; the name of an ITS machine. ---CStacy + +;Registers. +X=0 ;Super temporary register. +A=1 ;General +B=2 ;Purpose. +C=3 +D=4 +E=5 +J=6 ;JNAME. +T=7 ;Temporary. +TT=10 ;Temporary, T+1. +CHAR=11 ;Character being manipulated. +BP=12 ;Byte pointer. +P=17 ;Stack pointer. + +PDLLEN==32. ;Stack length. + +;Channels. +DSKI=14 ;Mldev input. +TTYO=15 ;Typeout. +TTYI=16 ;Typein (for **MORE** and ^G, ^S). + +;Buffer size. +BUFLEN=600. +BUFSIZ=5*BUFLEN + +;System call. +DEFINE SYSCAL OP,ARGS + .CALL [SETZ ? SIXBIT/OP/ ? ARGS ((SETZ))] +TERMIN + +;Type out an ascii string. +DEFINE TYPE CH,&STRING + MOVEI T,<.LENGTH STRING> + MOVE TT,[440700,,[ASCII STRING]] + SYSCAL SIOT,[%CLIMM,,CH ? TT ? T] + .LOSE %LSFIL +TERMIN + + +;;; Uppercase a character +DEFINE UPPER CHR + CAIL CHR,141 + CAILE CHR,172 + CAIA + SUBI CHR,40 +TERMIN + + +;;; Print a column. +DEFINE PRINT COLS + MOVSI A,-COLS + SETO X, + PUSHJ P,PRTCOL +TERMIN + +;;; Skip a column. +DEFINE SKIP COLS + MOVSI A,-COLS + SETZ X, + PUSHJ P,PRTCOL +TERMIN + +;;; Print a line. +DEFINE OUTLIN + SETO X, + PUSHJ P,PRTLIN +TERMIN + +;;; Skip a line. +DEFINE FLUSH + SETZ X, + PUSHJ P,PRTLIN +TERMIN + +;;; Print out or skip a column from BP. +;;; Width as AOBJN in A. + +PRTCOL: ILDB CHAR,BP + CAIN CHAR,^L ;Formfeed ends buffer, + JRST DONE + CAIN CHAR,^C + JRST DONE + CAIN CHAR,^M ;Cariage return ends column. + JRST [ ILDB CHAR,BP + POPJ P, ] + SKIPE X + .IOT TTYO,CHAR + AOBJN A,PRTCOL + POPJ P, + + +;;; Print out or skip a line from BP. + +PRTLIN: ILDB CHAR,BP + CAIN CHAR,^L + JRST DONE + CAIN CHAR,^C + JRST DONE + SKIPE X + .IOT TTYO,CHAR + CAIE CHAR,^J + JRST PRTLIN + POPJ P, + + + +;;;Data + +PDL: BLOCK PDLLEN ;The stack. +TCMXH: 0 ;Horizontal screen size. +NUSERS: 0 ;Unames printed this line in :USERS. +JCL: BLOCK 20 ;(Just need two chars.) +DEVTAB: ASCIZ /MC/,[ASCIZ /MCTTY:.FILE. (DIR)/] + ASCIZ /AI/,[ASCIZ /AITTY:.FILE. (DIR)/] + ASCIZ /MX/,[ASCIZ /MXTTY:.FILE. (DIR)/] + ASCIZ /MD/,[ASCIZ /MDTTY:.FILE. (DIR)/] + ASCIZ /ML/,[ASCIZ /MLTTY:.FILE. (DIR)/] +; ASCIZ /DM/,[ASCIZ /DMTTY:.FILE. (DIR)/] +NDEVS==.-DEVTAB +LCLDEV: [ASCIZ /TTY:.FILE. (DIR)/] +SAVEBP: 0 +TOTRY: BLOCK 4 ;List of files to read. +LOOPER: 0 +MANY: 0 +MACNAM: 0 ;ASCII name of this machine. +LINES: 0 ;Number of lines in buffer. +BUFFER: BLOCK BUFLEN+1 ;The buffer. + + + +FORTY: 0 + 0 + -TSINTL,,TSINT + +INTACS==T_6+2 ;T and TT saved on interrupt. + +TSINT: INTACS,,P + 0 ? 1_TTYI ? 0 ? <1_TTYO>\<1_TTYI> ? CHRINT + 0 ? 1_TTYO ? 0 ? 0 ? MORINT +TSINTL==:.-TSINT + +CHRINT: MOVEI T,TTYI + .ITYIC T, + JRST INTRET + CAIE T,^S + CAIN T,^G + JRST [.RESET TTYO, + SYSCAL TTYFLS,[ %CLBIT,,1 ? %CLIMM,,TTYI] + .LOSE %LSSYS + JRST FLSIT1] +INTRET: SYSCAL DISMIS,[%CLBIT,,INTACS ? P] + .LOSE %LSSYS + +MORINT: TYPE TTYO,/--More--/ + SYSCAL IOT,[%CLBIT,,%TIPEK ? %CLIMM,,TTYI ? %CLOUT,,T] + .LOSE %LSFIL + CAIE T,40 + CAIN T,177 + .IOT TTYI,T + CAIE T,40 + JRST FLSIT + TYPE TTYO,/A/ + JRST INTRET + +FLSIT: TYPE TTYO,/Flushed/ +FLSIT1: .SUSET [.ROPTION,,T] + TLNN T,%OPBRK + JRST DEATH + .BREAK 16,164000 + JRST DEATH + + + +GO: MOVE P,[-PDLLEN,,PDL] + SYSCAL OPEN,[%CLBIT,,<.UAO\%TJDIS> ? %CLIMM,,TTYO ? [SIXBIT /TTY/]] + .LOSE %LSFIL + SYSCAL OPEN,[%CLBIT,,.UAI ? %CLIMM,,TTYI ? [SIXBIT /TTY/]] + .LOSE %LSFIL + SYSCAL CNSGET,[%CLIMM,,TTYO ? %CLOUT,,X ? %CLOUT,,TCMXH] + .LOSE %LSFIL + SYSCAL TTYSET,[%CLIMM,,TTYI ? [222222,,222222] ? [230222,,220222]] + .LOSE %LSFIL + .SUSET [.ROPTION,,A] + .SUSET [.RXJNAME,,J] ;Find out jname. + CAMN J,[SIXBIT /TALK/] + JRST [ TYPE TTYO,/ANetwork comlinks are unimplemented. +To talk to someone on the same machine, use "^_C USER"./ + JRST DEATH ] + TLO A,%OPINT\%OPOPC + .SUSET [.S40ADDR,,[20,,FORTY]] + .SUSET [.SOPTION,,A] + .SUSET [.SMSK2,,[<1_TTYI>\<1_TTYO>]] + SYSCAL SSTATU,[ REPEAT 5, %CLOUT,, X ? + %CLOUT,,A] + .LOSE %LSFIL + MOVE BP,[440700,,MACNAM] + MOVE B,[440600,,A] + ILDB CHAR,B + ADDI CHAR,40 + IDPB CHAR,BP + ILDB CHAR,B + ADDI CHAR,40 + IDPB CHAR,BP ;ITS name now stored in Ascii. +GETJCL: .BREAK 12,[..RJCL,,JCL] ;Read JCL. + SKIPN JCL ;If no JCL given + JRST [ MOVE A,LCLDEV ;Use the local machine. + MOVEM A,TOTRY + JRST DOMAC ] +PARSE: MOVE BP,[440700,,JCL] ;Crockishly parse the JCL. + MOVSI E,-NDEVS ;AOBJN loop for user tokens looked at. +PARSE1: PUSHJ P,PARSE2 ;Parse another TOTRY entry. + JRST PARSE9 ; If no more JCL, quit parsing. + AOBJN E,PARSE1 ;Parse up to 4 hosts. +PARSE9: HRRZ E,E ;See how many entries parsed. + CAILE E,1 ;If more than one + SETOM MANY ; remember we need labeling. + JRST DOMAC ;Now go read tty dirs off machines. + +;;; Parse from BP, putting entry in TOTRY table. +;;; Skip return unless end of JCL + +PARSE2: MOVEM BP,SAVEBP + MOVSI A,-NDEVS ;AOBJN loop for machines. +PARSE3: MOVE BP,SAVEBP ;Use the original BP. + PUSHJ P,JCLHAK ;Get char from input. + POPJ P, + CAIN CHAR,"* ;A "*" MEANS show all four machines. + JRST [ MOVSI A,-NDEVS ; Try all machines... + HRRZ D,DEVTAB(A) + MOVEM D,TOTRY(A) + AOBJN A,.-2 ; Loop for all machines. + SETOM MANY + JRST DOMAC ] ; Dont look at other JCL. + HRLZI B,440700 ;Make Bp to a machine name. + HRR B,DEVTAB(A) + ILDB C,B ;Get char of machine name, + CAME C,CHAR ;Match? + JRST PARSE4 ; No - punt this machine. + PUSHJ P,JCLHAK ;Yes - get second char from input. + POPJ P, + ILDB C,B ;Get char of machine name, + CAMN C,CHAR ;Match? + JRST [ HRRZ D,DEVTAB(A) ; Yes - Have found a machine. + MOVEM D,TOTRY(E) ; Remember its TTY: directory string. + JRST POPJ1] ; And skip-return with modified BP. +PARSE4: AOBJN A,PARSE3 ;Try the next machine. + TYPE TTYO,/AUnknown ITS name specified./ + JRST DEATH + +;;; Get next JCL char from BP. Skip-returns if wins. + +JCLHAK: ILDB CHAR,BP + JUMPE CHAR,CPOPJ ;^@ + CAIN CHAR,40 ;SPACE. + JRST JCLHAK + CAIN CHAR,3 ;^C. + POPJ P, + CAIN CHAR,37 ;^_. + POPJ P, + CAIN CHAR,15 ;^M. + POPJ P, + UPPER CHAR + JFCL +POPJ1: AOS (P) +CPOPJ: POPJ P, + + +DOMAC: MOVSI A,-NDEVS ;AOBJN pointer to filename addresses. +MLOPN: MOVEM A,LOOPER + HRRZ BP,TOTRY(A) + JUMPE BP,DEATH ;Empty address means end of table. + HRLI BP,440700 + SKIPN MANY ;If only one machine + JRST MLOPN1 ; dont bother labeling it. + TYPE TTYO,/A +[MIT-/ + ILDB CHAR,BP + .IOT TTYO,CHAR + ILDB CHAR,BP + .IOT TTYO,CHAR + TYPE TTYO,/]A/ + HRLI BP,440700 +MLOPN1: PUSHJ P, HAKLCL ;Fix up local machine spec if needed. + SETZM BUFFER + MOVE T,[BUFFER,,BUFFER+1] + BLT T,BUFFER+BUFLEN-1 ;Clear out the previous contents. + SYSCAL SOPEN,[%CLBIT,,.UAI ? %CLIMM,,DSKI ? BP] + JRST [ TYPE TTYO,"Unable to reach foreign host with TCP/MLDEV." + JRST DONE ] + MOVE T,[440700,,BUFFER] + MOVEI TT,BUFSIZ + SYSCAL SIOT,[%CLIMM,,DSKI ? T ? TT] ;Slurp in TTY list. + .LOSE %LSFIL + .CLOSE DSKI, +CNTLNS: MOVE BP,[440700,,BUFFER] ;Count number of LINES in buffer. + SETZ A, +CNTLN1: ILDB CHAR,BP + CAIN CHAR,^L + JRST LIST + CAIN CHAR,^J + AOS A + JRST CNTLN1 +LIST: SUBI A,2 ;First, last lines have a ^J too. + MOVEM A,LINES ;Save away count. + MOVE BP,[440700,,BUFFER] ;Get BP to buffer. + ILDB CHAR,BP ;Gobble leading +; .IOT TTYO,CHAR ;Ker + ILDB CHAR,BP +; .IOT TTYO,CHAR ;Chink. + CAMN J,[SIXBIT /WHOM/] ;WHOM prints it all. + JRST WHOM + CAME J,[SIXBIT /WHO/] ;WHO prints one column. + CAMN J,[SIXBIT /W/] + JRST WHO + CAME J,[SIXBIT /WW/] ;WHOJ prints two columns. + CAMN J,[SIXBIT /WHOJ/] + JRST WHOJ + CAME J,[SIXBIT /USERS/] ;U is very brief. + CAMN J,[SIXBIT /U/] ;U is very brief. + JRST USERS + JRST DEATH ;Gee, how did we get invoked? + +WHOM: SETO X, +WHOM1: PUSHJ P,PRTLIN ;Print every single line. + JRST WHOM1 + +WHOJ: FLUSH ;Skip first line. + MOVE B,LINES + SUBI B,1 ;Not printing first or last + JUMPE B,DONE +WHOJ1: PRINT 4. ;Print the Tnn. + PRINT 6. ;Print the UNAME. + PRINT 7. ;Print the JNAME. + .IOT TTYO,[^M] + .IOT TTYO,[^J] + FLUSH ;Skip to the end of the line. + SOJN B,WHOJ1 + JRST DONE + +WHO: FLUSH + MOVE B,LINES + SUBI B,1 ;Not printing first or last + JUMPE B,DONE +WHO1: PRINT 4. ;Print the Tnn. + PRINT 6. ;Print the UNAME. + FLUSH ;Skip to the end of the line. + .IOT TTYO,[^M] + .IOT TTYO,[^J] + SOJN B,WHO1 + JRST DONE + + +USERS: SETZM NUSERS +USERS1: FLUSH ;Next user; skip line. + ILDB CHAR,BP + CAIE CHAR,"T ;If this is not a TTY number + JRST USERS1 ; skip this user, maybe done. + AOS NUSERS ;Count user we're printing. + MOVE T,NUSERS ;Get number of users this line. + IMULI T,9. ;See how wide we are so far. + CAMGE T,TCMXH ;If there is enuf room for uname. + JRST USERS2 ; go print it. + .IOT TTYO,[^M] ;Else go to next line. + .IOT TTYO,[^J] + SETZM NUSERS ;Restart count. +USERS2: ILDB CHAR,BP + ILDB CHAR,BP ;Gobble number and space. + ILDB CHAR,BP +USERS3: ILDB CHAR,BP + CAIN CHAR,^L ;If end of buffer + JRST DONE ; all done. + CAIN CHAR,40 ;If end of uname + JRST [ .IOT TTYO,[^I] + JRST USERS1 ] + .IOT TTYO,CHAR + JRST USERS3 ;Else finish printing uname. + + +DONE: MOVE A,LOOPER ;Recover AOBJN pointer. + AOBJN A,MLOPN + +DEATH: .CLOSE TTYO, + .CLOSE TTYI, + .CLOSE DSKI, + .LOGOUT 1, + + +;;; This is in case luser explicitly specifies his own machine. +;;; BP has pointer to name we want to open on. + +HAKLCL: MOVE B,[440700,,MACNAM] +HAKLC1: ILDB CHAR,BP + ILDB C,B + CAME CHAR,C + JRST HAKLC9 + ILDB CHAR,BP + ILDB C,B + CAME CHAR,C + JRST HAKLC9 + HRRZ BP,LCLDEV +HAKLC9: HRLI BP,440700 + POPJ P, + + + + +CONSTANTLY +VARIABLE + +END GO +