From 396f8eecec23ed813fde4fbd91af390ddee85b4e Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Thu, 27 Sep 2018 15:18:25 +0200 Subject: [PATCH] WHOIML - wholine for Imlacs. --- build/misc.tcl | 11 + doc/programs.md | 1 + src/sysen1/whoiml.151 | 1520 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1532 insertions(+) create mode 100755 src/sysen1/whoiml.151 diff --git a/build/misc.tcl b/build/misc.tcl index a0c8b24c..05ceb4f8 100644 --- a/build/misc.tcl +++ b/build/misc.tcl @@ -861,6 +861,17 @@ respond "*" ":link sys3;ts vrfy,sys3;ts expn\r" respond "*" ":midas sys2;ts wholin_sysen2;wholin\r" expect ":KILL" +# WHOIML +respond "*" ":midas sysbin;_sysen1; whoiml\r" +respond "FILE:" "whoiml\r" +respond "FILE:" "sys2\r" +expect ":KILL" +respond "*" ":job whoiml\r" +respond "*" ":load sysbin; whoiml bin\r" +respond "*" "start1\033b\033g" +expect ">>" +respond " " ":kill\r" + # VTTIME respond "*" ":midas sys1;ts vttime_rvb;vttime\r" expect ":KILL" diff --git a/doc/programs.md b/doc/programs.md index 8eb8f075..b7096963 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -274,6 +274,7 @@ - WEBSER, HTTP server. - WHAT, humorous quips to various "what" questions. - WHO%, list index/uname/jname/%time in sorted list. +- WHOIML, wholine for Imlacs. - WHOLIN, mode line for display terminals (with date/time/job/etc info). - WHOSEN, print author of last send. - WL, SUDS wirelister. diff --git a/src/sysen1/whoiml.151 b/src/sysen1/whoiml.151 new file mode 100755 index 00000000..e647b42d --- /dev/null +++ b/src/sysen1/whoiml.151 @@ -0,0 +1,1520 @@ +TITLE NEWIML + +IF1,[PRINTC /2ND NAME OF TS FILE: / +.TTYMAC A +TS2NM=SIXBIT /A/ +TERMIN +PRINTC /SNAME OF TS FILE: / +.TTYMAC A +TSSNM=SIXBIT /A/ +TERMIN +] + +.MLLIT=1 + +F=0 + +A=1 +B=2 +C=3 +D=4 +E=5 + +U=6 +X=7 + +UIND=10 +BUF=11 +CNT=12 +FROBOZ=13 + +RET=15 + +UP=16 +P=17 + +.INSRT SYSENG;FSDEFS > + +TTYI==1 +TTYO==2 +TYOC==0 +DSKI==3 +DSKO==4 + +; DECREMENT BYTE POINTER +DEFINE DBP AC + ADD AC,[70000,,] + TLNE AC,400000 + ADD AC,[347777,,-1] +TERMIN + +DEFINE SYMS LIST + IRPS FOOBAR,,[LIST] +FOOBAR: 0 + ZZZ==. + LOC VARNAM + SQUOZE 0,FOOBAR + VARNAM==VARNAM+1 + LOC ZZZ + TERMIN + TERMIN + +DEFINE MM,B + MOVE A,[SIXBIT B] +TERMIN + +DEFINE OSIX NAME + MOVE NAME + PUSHJ P,UOSIX +TERMIN + +DEFINE OASCI CHR + MOVEI FROBOZ,CHR + JSP RET,IOTA +TERMIN + +DEFINE ODEC NUM + MOVE NUM + PUSHJ P,UODEC +TERMIN + +DEFINE OOCT NUM + MOVE NUM + PUSHJ P,UOOCT +TERMIN + +LINELN==56. + +ZZZ==. + +LOC 41 + JSR UUOH + JSR TSINT +LOC 50 + +PDL: BLOCK 20. + -1 +UPDL: BLOCK 4 + +LOC ZZZ + +BASE: 0 +JCL: BLOCK 3 +JCLINP: 0 + +; SYSTEM MEMORY INST'S + +PSMEMB: MOVE A,@TRUMM + SUB A,@AUSOPG + ODEC A + OASCI "/ + ODEC @TRUMM + OASCI 40 + POPJ P, + + BLOCK 5 + +LINE: BLOCK LINELN +DIRECT: 0 +FNAME1: 0 +FNAME2: 0 + +TTYFLG: 0 ; IF WATCHING A TTY +WHOIND: 0 +GETSW: 0 +INCORE: -1 +FILPRT: -1 +SECPRT: 0 +DATPRT: 0 +INFER: 0 +PRSIST: 0 +FORGET: -1 +TAAMOD: 0 + + +SUBTTL SYSTEM VARIABLES +VARNAM==4000 +FLWDTS=VARNAM +FLWDT: SYMS [LUBLK:NQCHN] + LFWDT==.-FLWDT + +NXTABS=VARNAM +NXTAB: SYMS [AUSOPG:RNABLU:TRUMM:USRHI:NPGSWO:TIME] + LNXTAB==.-NXTAB + +USERTS=VARNAM +USERT: SYMS [JNAME:USTP:UNAME:XUNAME:USYSNM:UTMPTR:UTRNTM:QSNUD:QSNLCN:IDF1: +IDF2:USWST:USWSCD:FLSINS:UPC:JTMU:UUAC:LSCALL:SV40:RPCL:NMPGS:NSWPGS:PICLR +APRC:TTYTBL:SUPPRO] + LUSRT==.-USERT + +CXTABS=VARNAM +CXTAB: SYMS [QUSR:QUDPR:QUDFPR:QSMPRP:QSMDN:QSBYTE:QDSKN:QFBLNO:QSCRW:QSRAC: +AC0S:IOCHNM:CALSXB:IOTTB:DCHSTB:JBDEV:CLSTB:OPRSXB] + LCXTAB==.-CXTAB + +DXTABS=VARNAM +DXTAB: SYMS [TTYSTS:TTITM] + LDXTAB==.-DXTAB + + +SUBTTL INTERRUPT HANDLER + +TSINT: 0 ;HERE TO CATCH INTERRUPTS +TSINTR: 0 + EXCH A,TSINT + TLNN A,400000 ; WORD ONE INTERRUPT? + JRST [MOVE A,TSINTR + TLNE A,%PC1PR + .DISMIS A ; FLUSH IF BEING SINGLE-STEPPED + EXCH A,TSINT + .DISMIS [TSGPAG]] + MOVEI A,TTYI + .ITYIC A, ; GET CHARACTER + JFCL + EXCH A,TSINT + .DISMIS TSINTR + +TSGPAG: SKIPE INCORE + .DISMIS TSINTR + .CALL [SETZ + SIXBIT /OPEN/ + [.BII,,DSKI] + [SIXBIT /DSK/] + [SIXBIT /TS/] + [TS2NM] + SETZ [TSSNM]] + .VALUE + .ACCESS DSKI,[4000] + .CALL [SETZ + SIXBIT /CORBLK/ + MOVEI 104000 + MOVEI %JSELF + MOVEI 2 + MOVEI DSKI + SETZI 2] + .VALUE + SETOM INCORE + .CLOSE DSKI, + JRST INPUTS + + +SUBTTL WHOIML + +INPEND: SETZM INCORE + .CALL [SETZ + SIXBIT /CORBLK/ + MOVEI + MOVEI %JSELF + SETZI 2] + .VALUE + SKIPE FORGET + JRST [.VALUE BYEFOR + JRST CONTIN] + .VALUE BYEBYE + JRST CONTIN + +BYEFOR: ASCIZ \ +:FORGET +:VK \ + +BYEBYE: ASCIZ \ +:VK \ + +; COME HERE IF UFLG IS SET (LOOKING FOR U/JNAME) + +CONTN2: MOVE U,UIND + IMUL U,LUBLK + MOVE A,@UNAME + CAME A,UNM' + JRST JOBGON + MOVE A,@JNAME + CAME A,JNM' + JRST JOBGON + JRST CURTIM + +JOBMSG: OSIX UNM + OASCI 40 + OSIX JNM + MOVE A + PUSHJ P,UOASC + PUSHJ P,OUTPUT + POPJ P, + +; FIRST CHECK IF IT REAPPEARED + +JOBGON: MOVE D,UNM + MOVE E,JNM + PUSHJ P,UJLKP + JRST JOBGN1 + SKIPN JOBLST + JRST CURTIM + MOVE A,[440700,,[ASCIZ / back/]] + PUSHJ P,JOBMSG + SETZM JOBLST + JRST JOBGN2 + +JOBGN1: SKIPE JOBLST' + JRST CONTN3 + MOVE A,[440700,,[ASCIZ / gone/]] + PUSHJ P,JOBMSG + SETOM JOBLST +JOBGN2: MOVEI A,30.*3. + .SLEEP A, + SKIPN PRSIST + SETZM UFLG + JRST CONTIN + +STPCHR: MOVE U,UIND + IMUL U,LUBLK +STPCHK: SKIPE @USTP ; HERE TO SEE IF JOB IS STOPPED/HUNG + POPJ P, ; SKIP RETURN IF RUNNING - ELSE STOP/HUNG + SKIPN @FLSINS ; SKIP IF NOT BLOCKED + JRST POPJ1 + HRRZ C,@SV40 ; GET OPER NUM + MOVE B,CALSXB + SUB B,OPRSXB + CAML C,B + MOVEI C,0 + MOVE B,@OPRSXB ; CHECK SYMBOLIC UUO CALL + CAME B,[SIXBIT /HANG/] ; AND WATCH FOR SLEEP AND HANG + CAMN B,[SIXBIT /SLEEP/] + SOS (P) ; SIGH. +POPJ1: AOS (P) + POPJ P, + +INFCHK: EXCH A,U ; HERE FOR CHECKING INFERIORS + SETZ U, ; LOOK FOR AN INFERIOR +INFLP: HRRZ B,@SUPPRO + CAMN A,B ; IS IT FOR THIS INDEX? + PUSHJ P,STPCHK ; AND IS IT NOT STOPPED/HUNG? + JRST INFCH1 ; LOSE. CONTINUE + CAMN U,WHOIND + JRST INFCH1 + PUSH UP,A + IDIV U,LUBLK + MOVEM U,UIND + POPJ P, ; AND PROCEED WITH INFERIOR + +INFCH1: ADD U,LUBLK ; LOOP THROUGH JOBS + CAMGE U,@USRHI ; IF NONE ARE RUNNING INFERIORS + JRST INFLP + EXCH A,U ; THEN RESTORE U AND RETURN + POPJ P, + +LEDZER: OASCI "0 + JRST (X) + +CONTIN: SKIPE JCLINP + JRST INPUTS + MOVE P,[-20.,,PDL-1] + SKIPGE (UP) + JRST CONTNI + POP UP,UIND + IDIV UIND,LUBLK +CONTNI: MOVE BUF,[440700,,LINE] + SETZM LINE + MOVE A,[LINE,,LINE+1] + BLT A,LINE+LINELN-1 + SETZM INFER + SKIPE UFLG + JRST CONTN2 +CONTN3: SKIPN D,TTYFLG +CONTN4: .SUSET [.RCNSL,,D] + JUMPL D,CURTIM + HRRZ U,@TTYSTS + SKIPN @UNAME + JRST [SETZM TTYFLG + JRST CONTN4] + IDIV U,LUBLK + MOVEM U,UIND + + +CURTIM: PUSHJ P,STPCHR + PUSHJ P,INFCHK + .CALL [SETZ + SIXBIT /RQDATE/ + SETZM A] + .LOSE + SKIPN DATPRT + JRST CURHOR + LDB B,[270400,,A] + ODEC B + OASCI "/ + LDB B,[220500,,A] + ODEC B + OASCI 40 +CURHOR: HRRZS A + IDIVI A,7200. + CAIGE A,10. + JSP X,LEDZER + ODEC A + OASCI ": + IDIVI B,120. + CAIGE B,10. + JSP X,LEDZER + ODEC B + SKIPN SECPRT + JRST PINDEX + OASCI ": + LSH C,-1 + CAIGE C,10. + JSP X,LEDZER + ODEC C + +PINDEX: OASCI 40 + MOVE A,UIND + MOVE U,UIND + IMUL U,LUBLK + OOCT A + OASCI 40 + +PUNAME: OSIX @UNAME + OASCI 40 + +PJNAME: OSIX @JNAME + OASCI 40 + +PSNAME: MOVE A,@USYSNM + MOVEM A,CURUNM' + CAMN A,@XUNAME + JRST PSTATU + OSIX A + OASCI 40 + +PSTATU: SKIPN D,TTYFLG + .SUSET [.RCNSL,,D] + MOVE A,@TIME + SUB A,@TTITM + CAIG A,<30.*60.*10.> + JRST PSTATX + OASCI "& +PSTATX: PUSHJ P,USTATU + SKIPGE @APRC + JRST [OSIX [SIXBIT /DSN/] + JRST .+1] +PTMPCT: MOVE A,@JTMU + ADDI A,9830. + IDIVI A,19661. + PUSH P,A + +PSTIM: PUSH P,U + SETZB U,B + MOVE C,UIND + IMUL C,LUBLK +PSTIML: SKIPN A,@UNAME + JRST PSTIM1 + ADD B,@JTMU + MOVE A,@SUPPRO + CAIN C,(A) + SETOM INFER +PSTIM1: ADD U,LUBLK + CAMGE U,@USRHI + JRST PSTIML + ADDI B,9830. + IDIVI B,19661. + MOVE A,-1(P) + SKIPGE (UP) + JRST PSTIM3 + HLRZ C,UP +PSTIM2: OASCI "^ + SOJN C,PSTIM2 +PSTIM3: SKIPN INFER + JRST PSTIM4 + OASCI "# +PSTIM4: OASCI 40 + ODEC A + OASCI "% + OASCI "/ + ODEC B + POP P,U + OASCI "% + OASCI 40 + POP P,A + + MOVEM BUF,SAVBUF' + MOVEM CNT,SAVCNT' + +PTMUSE: MOVE A,@UTRNTM ;GET TOTAL RUN TIME FOR THIS PROCEDURE + PUSHJ P,TMPTH ;OUTPUT AMOUNT OF TIME USED BY PROCEDURE + +PMEM: MOVE A,@NMPGS + SUB A,@NSWPGS + ODEC A + OASCI "/ + ODEC @NMPGS + OASCI 40 + PUSHJ P,PSMEMB + +PCHAN: SKIPE FILPRT + PUSHJ P,CHAN + PUSHJ P,OUTPUT + +SLEEP: SKIPE INCORE + JRST INPUT + SETZ CNT, + MOVEI A,30.*12. + SKIPE MIDFLG + MOVEI A,30.*4. + .SLEEP A, + SETZM MIDFLG + JRST CONTIN + +MIDDLE: SETOM MIDFLG' + MOVE [440700,,[ASCIZ /.../]] + PUSHJ P,UOASC + PUSH P,A + PUSHJ P,OUTPUT + MOVEI A,30.*8. + SKIPE INCORE + MOVEI A,30. + .SLEEP A, + POP P,A + MOVE BUF,SAVBUF + MOVE CNT,SAVCNT + POPJ P, + +OUTPUT: OASCI ^B + MOVE A,[440700,,LINE] + .CALL [SETZ + SIXBIT /SIOT/ + [%TJSIO,,TYOC] + A + SETZ CNT] + .LOSE 1000 + POPJ P, + +TMPTH: IDIVI A,25000. ; NOW IN UNITS OF .1 SECONDS + IDIVI A,36000. ; HOURS + MOVEI D,0 + MOVE C,B ; SAVE OTHER CRUFT + JUMPE A,UTRNT1 ; DON'T OUTPUT IF THERE AREN'T ANY + ODEC A + MOVNI D,1 + OASCI ": +UTRNT1: MOVE A,C + IDIVI A,600. ; MINUTES + MOVE C,B ; SAVE SECONDS AND TENTHS + JUMPE D,[JUMPE A,UTRNT2 + JRST .+1] + JUMPN D,[CAIL A,10. + JRST .+1 + OASCI "0 + JRST .+1] + MOVNI D,1 + ODEC A + OASCI ": +UTRNT2: MOVE A,B + IDIVI A,10. ; SECONDS + MOVE C,B ; SAVE TENTHS + JUMPN D,[CAIL A,10. + JRST .+1 + OASCI "0 + JRST .+1] + ODEC A + OASCI ". + OASCI (C)"0 + OASCI 40 + POPJ P, + +;OUTPUT THE "STATUS" OF THE JOB IN U. +USTATU: MOVEI A,40 ;LOAD WITH CODE FOR SPACE + SKIPN @PICLR ;SKIP IF PROCEDURE NOT PROCESSING INTERRUPT + MOVEI A,"* ;REPLACE SPACE WITH * IF INTERRUPTED + SKIPN @IDF1 + SKIPE @IDF2 + MOVEI A,"* + SKIPGE B,@USWST + MOVEI A,"_ ;USER DESIRED OUT + SKIPGE @USWSCD + MOVEI A,"> ;SWAP-BLOCKED + CAIE A,40 + JRST [OASCI (A) ;OUTPUT + JRST .+1] + SKIPE A,@USTP ;SKIP IF RUNNING + JRST URUN1 ;NOT RUNNING, OUTPUT STOP WORD + SKIPE @FLSINS ;SKIP IF NOT BLOCKED + JRST HAIR2 ;BLOCKED, OUTPUT MNEMONIC FOR HUNG OPERATION + MOVE B,@UPC ;GET USER PC + TLNN B,10000 ;SKIP IF USER MODE + JRST EHAIR ;EXEC MODE, OUTPUT + AND MNEMONIC + MOVE A,@JTMU + ADDI A,9830. + IDIVI A,19661. + MOVEI B,0 + CAIL A,1 + MOVEI B,1 + CAIL A,2 + MOVEI B,2 + CAIL A,10. + MOVEI B,3 + CAIL A,49. + MOVEI B,4 + CAIL A,79. + MOVEI B,5 + CAIL A,89. + MOVEI B,6 + OSIX RUNTBL(B) + +USTAT2: SKIPN A,@RPCL ;SKIP IF RPCLSR'ING GOING ON + POPJ P, + SKIPL A + OASCI "> ;RPCLSR'ING (STOPPING <'ED PROCEDURE) + SKIPG A + OASCI "< ;BEING RPCLSR'ED (STOPPED BY >'ED PROCEDURE) + ANDI A,-1 ;GET USER INDEX + IDIV A,LUBLK ;GET USER # OF OBJECT OR SOURCE OF RPCLSR'ING + OOCT A ;OUTPUT USER NUM + POPJ P, + + ;NOT RUNNING (.USTP NONZERO). +URUN1: LSHC A,-30. ;RIGHT JUSTIFY LEFT TWO DIGITS OF .USTP. + OOCT A ;OUTPUT LEFT TWO DIGITS + OASCI "! ;OUTPUT "!" + LSH B,-6 ;RIGHT JUSTIFY REMAINDER + OOCT B ;OUTPUT COUNT OF TRANSIENT REASONS TO BE STOPPED + JRST USTAT2 + +HAIR2: TLNN B,200000 + JRST HAIR + MOVE A,[SIXBIT /IPAGE/] + TLNN B,10000 + MOVE A,[SIXBIT /PAGE/] + JRST HAIR1 + +EHAIR: OASCI "+ +HAIR: SKIPGE A,@SV40 ;SKIP IF SIGN BIT ON + JRST IOTUUO + LSH A,-27. ;RIGHT JUSTIFY OP CODE AND AC + CAIG A,47 ;SKIP IF TOO LARGE FOR SYS UUO + CAIGE A,40 ;SKIP IF SYS UUO + SKIPA A,[SIXBIT /UUO/] ;NOT SYS UUO, OUTPUT "UUO" + XCT UUOTB-40(A) ;SYS UUO, DISPATCH +HAIR1: OSIX A ;OUTPUT MNEMONIC + JRST USTAT2 + +IOTUUO: LDB A,[270300,,@SV40] + MOVE A,UIOTAB(A) + JRST HAIR1 + +UIOTAB: IRPS A,,[BLKI DATAI BLKO DATAO CONO CONI CONSZ CONSO] + SIXBIT /A/ + TERMIN + +UUOTB: JRST AIOT + MM /OPEN/ + JRST AOPER + JRST ACALL + MM /USET/ + MM /BREAK/ + MM /STATUS/ + MM /ACCESS/ + +ACALL1: SKIPGE C,@UUAC ;.CALL IOT OR SIOT + MOVE D,@LSCALL + JRST AIOT1 ;DON'T BE CRETINOUS WITH IOT/SIOT! + +AIOT: LDB C,[270400,,@SV40] ;.IOT, GET AC FIELD + MOVEI D,0 ;NOT SIOT +AIOT1: MOVEI A,@IOCHNM + ADD A,U + HRRZ C,(A) ;RIGHT HALF OF IOCHNM IS INDEX TO IOTTB + PUSHJ P,AIOTNM + JRST USTAT2 + +AIOTNM: MOVEI B,(C) + HLL A,@CLSTB + TLNN A,100040 + JRST AIOTN1 + HLRZ C,(A) ;JOB DEVICE + SKIPA A,@JBDEV +AIOTN1: HLLZ A,@DCHSTB + OSIX A + MOVEI C,(B) + MOVE E,@IOTTB + TLNE E,400000 + JRST [OASCI "B + JRST .+1] + CAMN D,[SIXBIT/SIOT/] + JRST [OASCI "S + JRST .+1] + MOVEI C,"I + TLNE E,200000 + MOVEI C,"O + OASCI (C) + POPJ P, + +ACALL: LDB C,[270400,,@SV40] ;GET AC FIELD + JUMPE C,ACALL0 + OSIX @CALSXB ;OUTPUT MNEMONIC + JRST USTAT2 + +ACALL0: MOVE C,@LSCALL + CAME C,[SIXBIT/SIOT/] + CAMN C,[SIXBIT/IOT/] + JRST ACALL1 +ACALL2: OSIX @LSCALL + JRST USTAT2 + +AOPER: HRRZ C,@SV40 ;GET OPER NUM + MOVE A,CALSXB + SUB A,OPRSXB + CAML C,A + MOVEI C,0 ;NOT IN RANGE, DISPLAY AS 'OPER' + OSIX @OPRSXB + JRST USTAT2 + +RUNTBL: SIXBIT /MULTIX/ + SIXBIT /TENEX/ + SIXBIT /WALK/ + SIXBIT /RUN/ + SIXBIT /FLY/ + SIXBIT /ZOOM/ + SIXBIT /WARP/ + +CHAN: MOVE C,NQCHN + MOVE U,UIND + IMUL U,LUBLK + MOVEM U,ULIND' +CHNLP: SKIPGE U,@QUSR + JRST CHNLP1 + CAMN U,ULIND + PUSHJ P,PRCHAN +CHNLP1: SOJGE C,CHNLP + POPJ P, + +PRCHAN: PUSH P,C + MOVE A,@QSMPRP + IBP A + ANDI A,1777 + HRRZ B,@QSBYTE + IMUL A,B ;CONVERT WORDS TO BYTES + SKIPGE @QSMDN + SETZM A + ADD A,@QFBLNO + IDIV A,B ;CONVERT BACK TO WORDS (AT LEAST FOR NOW) + MOVEM A,WDCNT' + MOVE B,A + MOVE U,@QUDPR + MOVE A,@QSNLCN + ADD A,@QUDFPR ;POINTER INTO USER DIRECTORY + SETZM WRTFLG' + SKIPGE @QSCRW ;ONLY HACK READ CHANNELS + SETOM WRTFLG + +PFNAME: SETZ E, + PUSH P,A + HRL A,A + HRRI A,B + .GETLOC A, + JSP RET,NAMLEN + MOVEM B,FNAME1 + ADD A,[1,,] + .GETLOC A, + JSP RET,NAMLEN + MOVEM B,FNAME2 + MOVE B,@QSNUD + MOVEM B,DIRECT + JSP RET,NAMLEN + MOVE C,CNT + IDIVI C,3 + ADDI E,6(C) + SKIPE WRTFLG + ADDI E,4 + CAILE E,88. + PUSHJ P,MIDDLE + MOVE A,CURUNM + CAMN A,DIRECT + JRST ZORNINPLATZ + OSIX DIRECT + OASCI 73 +ZORNINPLATZ: OSIX FNAME1 + OASCI 40 + OSIX FNAME2 + OASCI "= + POP P,A + SKIPE WRTFLG + JRST WRTPRT + +PFPCT: SETOM B + HRLZI C,UNRNDM(A) + HRRI C,C + .GETLOC C, + LDB C,[UNDSCP+C] + IDIVI C,UFDBPW + HLL C,QBTBLI(D) ;MAKE A BP TO DESCRIPTOR AREA + HRLZI X,UNRNDM(A) + HRRI X,X + .GETLOC X, + LDB X,[UNWRDC+X] + ANDCMI A,1777 ;X HAS WORD COUNT IN LAST BLOCK OF FILE + HRRZS A + ADDI A,UDDESC + ADD C,A + PUSHJ P,NFLLN1 ;GET THE BLOCK COUNT OF FILE + IMULI B,2000 + SKIPN X + MOVEI X,2000 + ADD B,X ;FILE LENGTH NOW IN B + MOVE A,WDCNT ;THIS IS WORD COUNT (FROM ABOVE) + IMULI A,100. + IDIV A,B + ODEC A + OASCI "% +POPSCP: OASCI 40 + POP P,C + POPJ P, + +WRTPRT: MOVE A,WDCNT + MOVE B,A + LSH A,-12 + ODEC A + OASCI "+ + ANDI B,1777 + ODEC B + JRST POPSCP + +NAMLEN: MOVE C,[440600,,B] +NAMLP: ILDB D,C + JUMPE D,(RET) + AOJ E, +NAMLN1: TLNN C,760000 + JRST (RET) + JRST NAMLP + +QBTBLI: 440600,, + 360600,, + 300600,, + 220600,, + 140600,, + 060600,, + 000600,, + +NFLLN1: IBP C ;HERE TO GET FILE LENGTH + MOVEI D,D + HRL D,C + .GETLOC D, ;PUT STUFF IN D + HLL A,C + HRRI A,D ;MAKE BP IN A + LDB F,A ;GET THE DESCRIPTOR BYTE + JUMPE F,CPOPJ + CAILE F,UDTKMX + JRST NFLLN2 + ADD B,F + JRST NFLLN1 + +NFLLN2: CAIGE F,UDWPH + AOJA B,NFLLN1 + CAIN F,UDWPH + JRST NFLLN1 + REPEAT NXLBYT, IBP C + AOJA B,NFLLN1 + + +UJLKP: SETZ U, +UJLKPL: CAMN D,@UNAME + CAME E,@JNAME + JRST UJLKP1 + IDIV U,LUBLK + MOVEM U,UIND + SETOM UFLG' + MOVEM D,UNM + MOVEM E,JNM + JRST POPJ1 + +UJLKP1: ADD U,LUBLK + CAMGE U,@USRHI + JRST UJLKPL + POPJ P, + + +SUBTTL IMLAC WHOLINE OUTPUT ROUTINES + + +POWER: 0 ? 1 ? 10. ? 100. ? 1000. ? 10000. ? 100000. ? 1000000. + +UODEC: PUSH P,C + MOVEI C,10. ; GET BASE FOR DECIMAL + JRST UONIN + +UOOCT: PUSH P,C + MOVEI C,8. ; OCTAL BASE + +UONIN: PUSH P,A + PUSH P,B + MOVEM C,BASE + MOVE B, + PUSHJ P,UONUM ; PRINT NUMBR + POP P,B + POP P,A + POP P,C + POPJ P, + +UONUM: IDIV B,BASE + HRLM C,(P) ; SAVE DIGIT + SKIPE B + PUSHJ P,UONUM +UONUM1: HLRZ C,(P) ; RETREIVE DIGITS + ADDI C,"0 ; MAKE TO ASCII + CAILE C,"9 ; IS IT GOOD DIG + ADDI C,"A-"9-1 ; MAKE HEX DIGIT + PUSHJ P,IOTC + POPJ P, ; RET + +IOTC: MOVE FROBOZ,C + JSP RET,IOTA + POPJ P, + +IOTA: MOVEI ^A + IDPB BUF + MOVEI ^Y + IDPB BUF + IDPB FROBOZ,BUF + ADDI CNT,3 + JRST (RET) + +UOASC: PUSH P,A + PUSH P,B + MOVE B, +UOASCL: ILDB FROBOZ,B + JUMPE FROBOZ,POPBAJ + JSP RET,IOTA + JRST UOASCL + +UOSIX: PUSH P,A + PUSH P,B + MOVE B, +USXOOP: JUMPE B,POPBAJ + LDB FROBOZ,[360600,,B] + ADDI FROBOZ,40 + JSP RET,IOTA + LSH B,6 + JRST USXOOP + +POPCJ: POP P,C + POPJ P, + +POPCBA: POP P,C +POPBAJ: POP P,B +POPAJ: POP P,A +CPOPJ: POPJ P, + +VARIAB +CONSTA + + +SUBTTL PAGE 2 - START UP, JCL, COMMAND LEVEL + +LOC VARNAM + +NAME: 0 +UUOD: 0 +UUOE: 0 +UUOSCR: BLOCK 2 +ACTIV: 0 +BPSAV: 0 + +START: .SUSET [.RXJNAME,,A] + .SUSET [.RJNAME,,B] + CAME A,B + .BREAK 16,160000 + .SUSET [.RUIND,,B] + IMUL B,LUBLK + MOVEM B,WHOIND +START0: .SUSET [.RUIND,,UIND] + .SUSET [.SIMASK,,[%PIATY]] + .RSYSI A, + CAME A,SYSVER' + JRST INIT +START1: PUSHJ P,TTYOPN + .BREAK 12,[5,,JCL] + PUSHJ P,GETJCL + JRST INPEND + +EVAL: PUSHJ P,EVALR + -LFWDT,,FLWDT + FLWDTS + JFCL + PUSHJ P,EVALR + -LDXTAB,,DXTAB + DXTABS + IOR A,[400000(D)] + PUSHJ P,EVALR + -LUSRT,,USERT + USERTS + IOR A,[400000(U)] + PUSHJ P,EVALR + -LCXTAB,,CXTAB + CXTABS + IOR A,[400000(C)] + PUSHJ P,EVALR + -LNXTAB,,NXTAB + NXTABS + IOR A,[400000] + POPJ P, + +EVALR: MOVE D,@(P) + AOS (P) + MOVE E,@(P) + AOS (P) + MOVE C,@(P) + AOS (P) +EVALR1: MOVE A,(E) + .EVAL A, + .LOSE 1000 + XCT C + MOVEM A,(D) + AOBJP D,CPOPJ + AOJA E,EVALR1 + POPJ P, + +INIT: SKIPE SYSVER ; IS THIS NEW FILE + JRST NEWSYS ; OR NEW SYSTEM? + .CALL [SETZ + SIXBIT /CORBLK/ + MOVEI + MOVEI %JSELF + SETZ [1]] + .VALUE + MOVE P,[-20.,,PDL-1] + MOVEI UP,UPDL-1 + MOVE A,[-140,,200] + MOVEI B,0 + .CALL [SETZ + SIXBIT /CORBLK/ + MOVEI %CBNDR + MOVEI %JSELF + A + MOVEI %JSABS + SETZ B] ; MAP 0-300000 OF SYS INTO 400000-700000 + .LOSE 1000 +NEWSYS: .RSYSI A, + MOVEM A,SYSVER + PUSHJ P,EVAL + .CALL [SETZ + SIXBIT /OPEN/ + [.BIO,,DSKO] + [SIXBIT /DSK/] + [SIXBIT /TS/] + [TS2NM] + SETZ [TSSNM]] + .VALUE + MOVEI A,0 + .CALL [SETZ + SIXBIT /PDUMP/ + [-1] + MOVEI DSKO + SETZ A] + .VALUE + MOVE A,[-2,,ZORK] + .IOT DSKO,A + .CLOSE DSKO, + JRST START1 + +ZORK: JRST START + JRST START + +GETJCE: SETZM JCLINP + POPJ P, + +GETJCL: SKIPN JCL + POPJ P, + SETOM JCLINP + MOVE X,[440700,,JCL] + +INPUTS: CAIA +INPUT: TASCR [0] + SKIPE JCLINP + JRST [ILDB A,X + JRST INPUTC] + .RESET TTYI, + TASCI "> + .IOT TTYI,A +INPUTC: CAIL A,"a + CAILE A,"z + CAIA + SUBI A,40 + CAIE A,^I + CAIN A,40 + JRST INPUTS + CAIE A,0 + CAIN A,^M + JRST [SKIPE JCLINP + JRST GETJCE + JRST CONTIN] + CAIN A,"W + JRST WCOM + CAIN A,"J + JRST JCOM + CAIN A,"Q + .BREAK 16,140000 + CAIN A,"C + JRST CCOM + CAIN A,"F + JRST FCOM + CAIN A,"R + JRST RCOM + CAIN A,^L + JRST CONTIN + CAIN A,"P + JRST INPEND + CAIN A,"M + JRST MCOM + CAIN A,"S + JRST SCOM + CAIN A,"D + JRST DCOM + CAIN A,"T + JRST TCOM + CAIN A,"? + JRST EXPL +INPILL: TASC [ASCIZ / Command not understood - /] + TASCI (A) + JRST CONTIN + +EXPL: TASC [ASCIZ / +Command Action +C Toggle printing of channels +D Toggle printing of date +F Toggle forgetting of job +J set to watch this job +J Normal mode (job with TTY) +M Print current mode +P Proced +Q Kill job +R to watch this job persistently (and wait when not around) +R Toggle persistence (waiting for job to reappear after it goes) +S Toggle second-printing mode +T Toggle system variable format +W Watch tree attached to this tty +? Print this +/] + JRST CONTIN + +TCOM: SETCMM TAAMOD + SKIPN TAAMOD + JRST [MOVE A,[TNINS,,PSMEMB] + BLT A,PSMEMB+TNINSL + JRST TCOM1] + MOVE A,[TCINS,,PSMEMB] + BLT A,PSMEMB+TCINSL +TCOM1: JSP B,TCOMPT + JRST CONTIN + +TCOMPT: MOVEI A,[ASCIZ / Standard system variables./] + SKIPE TAAMOD + MOVEI A,[ASCIZ / TAA-style system variables./] + JRST PMODER + +TCINS: ODEC @AUSOPG + OASCI "| + ODEC @TRUMM + OASCI "| + ODEC @NPGSWO + OASCI 40 + POPJ P, +TCINSL==.-TCINS + +TNINS: MOVE A,@TRUMM + SUB A,@AUSOPG + ODEC A + OASCI "/ + ODEC @TRUMM + OASCI 40 + POPJ P, +TNINSL==.-TNINS + +MCOM: SKIPE UFLG + JRST MCOM1 + TASC [ASCIZ / Normal mode./] + JRST MCOM2 + +MCOM1: MOVEI A,[ASCIZ / Waiting for /] + SKIPN JOBLST + MOVEI A,[ASCIZ / Watching /] + TASC (A) + TSIX UNM + TASCI 40 + TSIX JNM + TASCI ". + +MCOM2: JSP B,CHNS + JSP B,FORG + JSP B,PERS + JRST CONTIN + +SCOM: SETCMM SECPRT + JSP B,SECS + JRST CONTIN + +SECS: MOVEI A,[ASCIZ / No seconds mode./] + SKIPE SECPRT + MOVEI A,[ASCIZ / Seconds mode./] + JRST PMODER + +DCOM: SETCMM DATPRT + JSP B,DATS + JRST CONTIN + +DATS: MOVEI A,[ASCIZ / No date mode./] + SKIPE DATPRT + MOVEI A,[ASCIZ / Date mode./] + JRST PMODER + +CHNS: MOVEI A,[ASCIZ / Printing channels./] + SKIPN FILPRT + MOVEI A,[ASCIZ / Not printing channels./] + JRST PMODER + +PERS: MOVEI A,[ASCIZ / Persistent. /] + SKIPN PRSIST + MOVEI A,[ASCIZ / Quitter. /] +PMODER: SKIPN JCLINP + TASC (A) + JRST (B) + +FORG: MOVEI A,[ASCIZ / Forgetting./] + SKIPN FORGET + MOVEI A,[ASCIZ / Not forgetting./] + JRST PMODER + +RCOMS: SETCMM PRSIST + JSP B,PERS + JRST CONTIN + +RCOM: SETZM ACTIV + SETZM TTYFLG + SETOM PRSIST + PUSHJ P,GETNAM + JRST RCOMS + MOVEM A,BPSAV + MOVE D,NAME + MOVEI RCOM + MOVEM ACTIV + PUSHJ P,GETNAM + JRST JERR + MOVE E,NAME + SETZ U, +RCOML: CAMN D,@UNAME + CAME E,@JNAME + JRST RCOML1 + IDIV U,LUBLK + MOVEM U,UIND + SETOM UFLG' + MOVEM D,UNM + MOVEM E,JNM + TASC [ASCIZ / Job #/] + TOCT UIND + SETOM PRSIST + JRST CONTIN + +RCOML1: ADD U,LUBLK + CAMGE U,@USRHI + JRST RCOML + TASC [ASCIZ / Waiting for /] + TSIX D + TASCI 40 + TSIX E + TASCI ". + SETOM UFLG + MOVEM D,UNM + MOVEM E,JNM + SETOM JOBLST + JRST CONTIN + +FCOM: SETCMM FORGET + JSP B,FORG + JRST CONTIN + +CCOM: SETCMM FILPRT + JSP B,CHNS + JRST CONTIN + +WCOM: SETZM ACTIV + PUSHJ P,GETNAM + JRST WCOMME + MOVE B,[440600,,NAME] + MOVEI A,0 + ILDB D,B + SUBI D,20 + MOVE A,D + ILDB D,B + JUMPE D,WCEND + SUBI D,20 + IMULI A,10 + ADDI A,(D) +WCEND: MOVEM A,TTYFLG + SETZM UNM + SETZM JNM + JRST CONTIN +WCOMME: SETZM TTYFLG + JRST CONTIN + +JCOM: SETZM ACTIV + SETZM TTYFLG + PUSHJ P,GETNAM + JRST JCOMME + MOVEM A,BPSAV + MOVE D,NAME + MOVEI JCOM + MOVEM ACTIV + PUSHJ P,GETNAM + JRST JERR + MOVE E,NAME + SETZ U, +JCOML: CAMN D,@UNAME + CAME E,@JNAME + JRST JCOML1 + IDIV U,LUBLK + MOVEM U,UIND + SETOM UFLG' + MOVEM D,UNM + MOVEM E,JNM + TASC [ASCIZ / Job #/] + TOCT UIND + JRST CONTIN + +JERR: TASC [ASCIZ / Must be UNAME-JNAME pair./] + JRST CONTIN + +JCOML1: ADD U,LUBLK + CAMGE U,@USRHI + JRST JCOML + TASC [ASCIZ / Job /] + TSIX D + TASCI 40 + TSIX E + TASC [ASCIZ / not found./] + JRST CONTIN + +JCOMME: SETZM UFLG + TASC [ASCIZ /Normal mode./] + JRST CONTIN + +GETNAM: MOVE A,[440600,,NAME] + SETZM GETSW + SETZM NAME +GETNM1: SKIPE JCLINP + JRST [ILDB B,X + JRST .+2] + .IOT TTYI,B + CAIN B,177 + JRST GETRUB + CAIE B,^M + CAIN B,^J + JRST [SKIPN JCLINP + POPJ P, + MOVEI B,40] + CAIN B,40 + JRST [SKIPN GETSW + JRST GETNM1 + JRST POPJ1] + SUBI B,40 + CAIL B,100 + SUBI B,40 + IDPB B,A + SETOM GETSW + TLNN A,760000 + JRST POPJ1 + JRST GETNM1 + +GETRUB: JUMPL A,GETFLS + MOVEI B,0 + DPB B,A + ADD A,[60000,,] + JRST GETNM1 + +GETFLS: SKIPE B,ACTIV + JRST [MOVE A,BPSAV + MOVEM B,(P) + MOVEM D,NAME + SETOM GETSW + JRST GETNM1] + TASC [ASCIZ / XXX? /] + POPJ P, + +TTYOPN: .OPEN TYOC,[%TJSIO\.UAO,,'TTY] ; get a TTY output channel + .LOSE ; failed + .CALL [SETZ + SIXBIT /CNSGET/ + MOVEI TYOC + MOVEM + MOVEM + SETZM A] + .LOSE %LSSYS + CAIE A,%TNSFW + .VALUE [ASCIZ \:Use :WHOLINKILL +\] + .CALL [SETZ + 'TTYVAR + MOVEI TYOC + ['SMARTS] + SETZM B] + .LOSE %LSSYS + TLNN B,%TQIM1 + .VALUE [ASCIZ \:Use :WHOLINKILL +\] + .CALL [SETZ + SIXBIT /OPEN/ + [.UAI,,TTYI] + [SIXBIT /TTY/] + [SIXBIT /TTY/] + SETZ [SIXBIT /TTY/]] + .LOSE 1000 + .CALL [SETZ + SIXBIT /OPEN/ + [%TJDIS+.UAO,,TTYO] + [SIXBIT /TTY/] + [SIXBIT /TTY/] + SETZ [SIXBIT /TTY/]] + .LOSE 1000 + .SUSET [.SIMSK2,,[1_TTYI]] + .CALL TTYSET ; SET UP TTY TO TAKE CONTROL CHARACTERS + .LOSE 1000 + POPJ P, + +TSIOT: SETZ + SIXBIT /SIOT/ + MOVEI TTYO + A + SETZ B + +TTYSET: SETZ + SIXBIT /TTYSET/ + 1000,,TTYI + [232323,,232323] + SETZ [232323,,232323] + + +SUBTTL PAGE 2 -- UUOS + +UUOCT==0 +UUOTAB: JRST ILUUO + IRPS X,,[TOCT TDEC TSIX TASC TASCI TASCR] + UUOCT==UUOCT+1 + X=UUOCT_33 + JRST U!X + TERMIN + +UUOMAX==.-UUOTAB + +UUOH: 0 + PUSH P,A + PUSH P,B + PUSH P,C + PUSH P,D + MOVEI @40 ; GET EFF ADDR. OF UUO + MOVEM UUOE + MOVE @0 + MOVEM UUOD ; CONTENTS OF EFF ADR + MOVE B,UUOE ; EFF ADR + LDB A,[270400,,40] ; GET UUO AC, + LDB C,[330600,,40] ; OP CODE + CAIL C,UUOMAX + MOVEI C,0 ; GRT=>ILLEGAL + JRST @UUOTAB(C) ; GO TO PROPER ROUT + +UUORET: POP P,D + POP P,C + POP P,B + POP P,A ; RESTORE AC'S + JRST 2,@UUOH + +ILUUO: .VALUE + +UOBPTR: MOVEI C,0 + MOVE B,UUOD ; PICK UP BYTE POINTER + JRST UTASC1 ; AND JOIN CODE +UTASCR: SKIPA C,[-1] ; CR FOR END OF TYPE +UTASC: MOVEI C,0 ; NO CR + HRLI B,440700 ; MAKE ASCII POINTER +UTASC1: MOVEI A,0 + PUSH P,B ; SAVE BPTR +UTASCC: ILDB D,B ; GET CHAR + JUMPE D,UTASCD ; FINISH? + AOJA A,UTASCC ; AOS COUNT, GO ON +UTASCD: POP P,B + PUSHJ P,STIOTA ; SPIT IT OUT + JUMPE C,UUORET ; CR NEEDED? + MOVEI A,2 ; YES + MOVE B,[440700,,[ASCIZ / +/]] + PUSHJ P,STIOTA + JRST UUORET + +UOCTLP: MOVEI A,^P + PUSHJ P,TIOTAD + MOVE A,B + PUSHJ P,TIOTAD ; DISPLAY-MODE IOT + JRST UUORET + +UTASCI: MOVE A,B ; PRT ASCII IMMEDIATE + PUSHJ P,TIOTA + JRST UUORET + +UTSIX: SKIPN C,UUOD + JRST UUORET + MOVEI A,0 + MOVE B,[440700,,UUOSCR] +TSXOOP: LDB D,[360600,,C] + ADDI D,40 + IDPB D,B + ADDI A,1 + LSH C,6 + JUMPN C,TSXOOP + MOVE B,[440700,,UUOSCR] + PUSHJ P,STIOTA + JRST UUORET + +UOHPOS: MOVEI A,^P + PUSHJ P,TIOTAD + MOVEI A,"H + PUSHJ P,TIOTAD + MOVEI A,10(B) + PUSHJ P,TIOTAD + JRST UUORET + +UTDEC: SKIPA C,[10.] ; GET BASE FOR DECIMAL +UTOCT: MOVEI C,8. ; OCTAL BASE + MOVE B,UUOD ; GET ACTUAL WORD TO PRT + JRST .+3 ; JOIN CODE +UTDECI: SKIPA C,[10.] ; DECIMAL +UTOCTI: MOVEI C,8. + MOVEM C,BASE + SKIPN A + MOVEI A,0 ; A=DIGIT COUNT + MOVE C,B ; PUT # TO PRT IN C + MOVE B,[010700,,UUOSCR+1] + PUSHJ P,UTNUM ; PRINT NUMBR + JRST UUORET + +UTNUM: IDIV C,BASE + ADDI D,"0 + CAILE D,"9 + ADDI D,"A-"9-1 ; MAKE HEX DIGIT, IF NOT DECIMAL + DPB D,B ; SAVE DIGIT + DBP B + ADDI A,1 + JUMPN C,UTNUM ; IF NON-ZERO, STILL CRAP LEFT + PUSHJ P,STIOTA + POPJ P, + +TIOTA: .IOT TTYO,A + POPJ P, +TIOTAD: .CALL [SETZ + SIXBIT /IOT/ + MOVSI %TJDIS ; TURN ON DISPLAY MODE FOR THIS + MOVEI TTYO + SETZ A] + .LOSE %LSSYS + POPJ P, +STIOTA: .CALL [SETZ + SIXBIT /SIOT/ + MOVEI TTYO + B + SETZ A] + .LOSE %LSSYS + POPJ P, + + + END START \ No newline at end of file