diff --git a/build/muddle.tcl b/build/muddle.tcl index 5f6fc995..61a9de63 100644 --- a/build/muddle.tcl +++ b/build/muddle.tcl @@ -40,3 +40,6 @@ respond "*" ":link sys3; ts mudfnd, sys3; ts mudcom\r" respond "*" ":midas sys3; ts combat_sysen3; combat\r" respond "(Y OR N)" "Y\r" expect ":KILL" + +respond "*" ":midas sys3; ts pick_sysen2; pick\r" +expect ":KILL" diff --git a/doc/programs.md b/doc/programs.md index 537a320c..fe7d58ed 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -209,6 +209,7 @@ - PFTHMG, Puff the magic dragon. - PHOTO, capture STY session output. - PI, print pi. +- PICK, examine Muddle locks. - PLAN, creates a PLAN file in your home directory from console input. - PORTS, display free network ports. - PR, print out various system documentation. diff --git a/src/sysen2/pick.52 b/src/sysen2/pick.52 new file mode 100755 index 00000000..32f70f48 --- /dev/null +++ b/src/sysen2/pick.52 @@ -0,0 +1,670 @@ +TITLE PICK -- locks page peeker PDL (7/25/76) + +.MLLIT=1 + +; ================================================================ +; ac definitions +; ================================================================ + +A=1 +B=2 +C=3 +D=4 +E=5 +F=6 +G=7 +H=10 +I=11 +J=12 +K=13 +L=14 ; only for super-temp uses under these names +M=15 ; only for super-temp uses +P=17 ; PDL pointer + +; ================================================================ +; channels +; ================================================================ + +TYIC==1 ; tty input +TYOC==2 ; tty output +U==3 +DSKI==4 + +; ================================================================ +; its file system definitions +; ================================================================ + +.INSRT SYSTEM;FSDEFS > + +; ================================================================ +; variables +; ================================================================ + +PDL: BLOCK 101. ; PDL +COMMND: BLOCK 40. + +FILE: +DEV: SIXBIT /DSK / +NM1: SIXBIT /LOCKS / +NM2: SIXBIT /PAGE / +SNM: SIXBIT /MUDDLE/ ; sname default + +USER: SIXBIT / .USR/ +USROPN: 0 + 0 + +; ================================================================ +; start up +; ================================================================ + +START: MOVE P,[-100.,,PDL+1] ; set up pdls + .OPEN TYIC,[SIXBIT / TTYFIND INPUT /] + .VALUE [ASCIZ /:CAN'T OPEN TTY/] + .OPEN TYOC,[SIXBIT / 5TTY/] + .VALUE [ASCIZ /:CAN'T OPEN TTY/] + .SUSET [.SMASK,,[1]] + .SUSET [.RUIND,,INDEX'] + SETZM ALLFLG' ; initially, show only active locks + SETZM INFO' + +; ================================================================ +; read a command line or two +; ================================================================ + +; get command line from superior + .SUSET [.ROPTIO,,A] ; get superiors option word + MOVEM A,OPTION' + +; has jcl for us? +JCLARG: TLNN A,OPTCMD ; OPTCMD has JCL? + JRST PICK + .BREAK 12,[..RJCL,,COMMND] + SKIPE COMMND ; none there? + PUSHJ P,SCNAME + + +PICK: OCTLP "C + .CALL [SETZ ? SIXBIT /OPEN/ ? [6,,DSKI] ? DEV ? NM1 ? NM2 ? SETZ SNM] + JRST LOST + .CALL [SETZ + 'CORBLK + MOVEI %CBRED + MOVEI -1 + MOVEI BUFPAG + MOVEI DSKI + SETZI ] + .LOSE 1000 + .CLOSE DSKI, + +PICKLP: OCTLP "T + OASC [ASCIZ /PICK./] + OSIX [.FNAM2] + OASCR [0] + OASCR [0] + SKIPN INFO + JRST PICKL1 + OASCR [ASCIZ /A program for examining the status of a MUDDLE locks page. +Invoke with + + :PICK + +(which defaults to MUDDLE;LOCKS PAGE) + +Commands are: + + U toggle viewing of used locks (initially off) + Q quit + ? view this + + ... anything else causes a new cycle/] + JRST PICKSL + +PICKL1: OASC [ASCIZ /Locks Page: /] + OSIX DEV + OASCI ": + OSIX SNM + OASCI "; + OSIX NM1 + OASCI " + OSIX NM2 + OASC [ASCIZ / is /] + SKIPGE BUFFER ; page lock + OASCR [ASCIZ /UNLOCKED./] + SKIPLE BUFFER + OASCR [ASCIZ /LOCKED./] + + OASC [ASCIZ /Initialized: /] + MOVE M,BUFFER+2 ; last init date/time + PUSHJ P,DSKPRT + MOVE M,BUFFER+2 + CAME M,BUFFER+3 + OASC [ASCIZ / (Not yet initialized)/] + OASCR [0] + +; here find out who shares this locks page + MOVE A,INDEX + MOVEM A,PAGUSR + MOVEI A,BUFPAG + MOVEM A,PAGPAG + MOVEI B,1 + SETZ C, + JRST CORLU1 +CORLUP: MOVE A,INDEX + SKIPL PAGUSR + CAMN A,PAGUSR + JRST CORDON +CORLU1: MOVE A,PAGUSR + TRO A,400000 ; job spec. for call + MOVEM A,PAGUSR + .CALL [SETZ + 'CORTYP + MOVE PAGUSR' ; user + MOVE PAGPAG' ; user's page + MOVEM PAGRW' ; state of it + MOVEM PAGUSR' ; next sharer + MOVEM PAGPAG' ; mapped as page # + SETZM PAGSHR'] ; number sharers + .LOSE 1000 + + HRRZS PAGSHR + SKIPL PAGRW ; if page is writable, really using it + JRST CORLUP + TRZ A,400000 + TLO A,400000 + MOVEM A,USROPN + .OPEN U,USER + JRST CORLUP + .USET U,[.RUNAM,,UNAME'] + .USET U,[.RJNAM,,JNAME'] + .USET U,[.ROPTI,,A] + SETZM OPTION + TLNN A,OPTLOK + SETOM OPTION' + .CALL [SETZ ? 'ACCESS ? MOVEI U ? SETZI 43 ] + .LOSE 1000 + HRROI A,G + .IOT U,A + JUMPE G,CORUSR + +; get locks used by this user + MOVEI H,USEBUF +CORTBL: .CALL [SETZ ? 'ACCESS ? MOVEI U ? SETZ G ] + .LOSE 1000 + MOVE A,[-2,,F] + .IOT U,A + TLNN G,20 ; indirect bit + JRST CORTNX + ANDI F,1777 + SUBI F,4 + MOVEM F,(H) + MOVE UNAME + MOVEM 1(H) + MOVE JNAME + MOVEM 2(H) + ADDI B,3 +CORTNX: HRRZS G + JUMPN G,CORTBL + SETZM (H) + +CORUSR: .CLOSE U, + JUMPN C,.+3 + OASC [ASCIZ /In use by: /] + SKIPA + OASC [ASCIZ /, /] + OSIX UNAME + OASCI " + OSIX JNAME + SKIPE OPTION + OASC [ASCIZ / (OPTLOK?)/] + SETO C, + JRST CORLUP + +; end of list of sharers +CORDON: JUMPE C,UNUSED + OASCR [ASCIZ /./] + JRST HASH + +; here if page not being used +UNUSED: OASCR [ASCIZ /No-one is using this locks page./] + +; here hack hashing table of locks, looking for ones in use +HASH: OASCR [0] + MOVE L,BUFFER+4 ; hash table pointer + ADDI L,BUFFER + MOVEI K,BUCKET +HASHLP: SKIPN A,(L) + JRST HASHNX + ADDI A,BUFFER + MOVEM A,(K) + ADDI K,1 + SUB K,[1,,0] +HASHNX: AOBJN L,HASHLP + + HRRI K,BUCKET + MOVE J,K + +SORT: SETZ I, +SORTLP: MOVE A,(K) + SKIPN B,1(K) + JRST SORTDN + MOVE C,1(A) + CAML C,1(B) + JRST SORT1 +SORTNX: AOBJN K,SORTLP +SORTDN: JUMPE I,PRTLUP + MOVE K,J + JRST SORT +SORT1: CAMG C,1(B) + JRST SORT2 +SORTX: MOVEM A,1(K) + MOVEM B,(K) + SETO I, + JRST SORTNX +SORT2: MOVE C,2(A) + CAMGE C,2(B) + JRST SORTNX + CAME C,2(B) + JRST SORTX + MOVE C,3(A) + CAMGE C,3(B) + JRST SORTNX + CAME C,3(B) + JRST SORTX + JRST SORTNX + +PRTLUP: MOVE A,(J) + SKIPE ALLFLG ; if 0, don't print used locks + JRST PRTLU1 + SKIPN B,4(A) + JRST PRTNXT ; ignore unlocked locks +PRTLU1: OASC 1(A) + OHPOS 18. + MOVE B,4(A) + SKIPGE B + OASC [ASCIZ /Hard-locked/] + SKIPN B + OASC [ASCIZ /Unlocked/] + JUMPLE B,WHOUSE + OASC [ASCIZ /Soft-locked, /] + ODEC B + +WHOUSE: SETZ C, + MOVEI B,USEBUF + SUBI A,BUFFER + +WHOLUP: SKIPN (B) + JRST WHOEND + CAME A,(B) + JRST WHONXT + JUMPN C,.+3 + OHPOS 35. + SKIPA + OASC [ASCIZ /, /] + OSIX 1(B) + OASCI " + OSIX 2(B) + SETO C, + +WHONXT: ADDI B,3 + JRST WHOLUP + +WHOEND: OASCR [0] + +PRTNXT: AOBJN J,PRTLUP + +PICKSL: OCTLP "E + MOVEI A,10.*30. + .SLEEP A, + JRST PICKLP + +SHORT: OASCR [ASCIZ /File too short?/] + JRST EXIT +LOST: OASCR [ASCIZ /File not found?/] + JRST EXIT + +EXIT: .BREAK 16,160000 + +; =================================================================== +; command line reading and parsing section +; =================================================================== + +; read a file spec +SCNAME: MOVE C,[440700,,COMMND] + MOVEM C,COMPTR' + MOVE D,[-2,,NM1] +SCLOOP: PUSHJ P,GETSYL + CAIN A,'; + MOVEM B,SNM + CAIN A,': + MOVEM B,DEV + JUMPG A,SCLOOP + MOVEM B,(D) + AOBJN D,SCLOOP + POPJ P, + +; get a syllable from command buffer +GETSYL: PUSH P,C + PUSH P,[0] + MOVEI B,(P) + HRLI B,440600 +GETSLP: PUSHJ P,GETCCA + JUMPL A,GETSX + SETO E, +GETSL2: CAIN A,^Q ; ^Q quotes next character + JRST GETQOT + SUBI A,40 + JUMPL A,GETSX ; other controls exit + JUMPE A,GETSP ; space? + CAIE A,': + CAIN A,'; + JRST GETSX +GETSPT: CAIL A,100 + SUBI A,40 + TLNN B,770000 + JRST GETSLP + IDPB A,B + IDPB E,C + JRST GETSLP + +GETQOT: ILDB A,COMPTR + SUBI A,40 + JUMPGE A,GETSPT + JRST GETSX +GETSP: TLNE B,400000 + JRST GETSLP +GETSX: POP P,B ; character word + POP P,C + POPJ P, + +GETCCA: ILDB A,COMPTR + JUMPE A,GETCCX + CAIN A,^I + MOVEI A,40 + CAIN A,^M +GETCCX: SETOM A + POPJ P, + + +DSKPRT: LDB K,[270400,,M] + ODEC K + OASCI "/ + LDB K,[220500,,M] + ODEC K + OASCI "/ + LDB K,[330700,,M] + ODEC K + OASCI " + HRRZ B,M + MOVEI A,3 + SETZI D, + LSH B,-1 +TILOP: IDIVI B,10. + ADDI C,'0 + LSHC C,-6 + IDIVI B,6 + ADDI C,'0 + LSHC C,-6 + SOJG A,TILOP + MOVEI B,2 + MOVEI A,": +TILOP2: SETZI C, + LSHC C,6 + OASCI 40(C) + SETZI C, + LSHC C,6 + OASCI 40(C) + SKIPE B + OASCI (A) + SOJGE B,TILOP2 + POPJ P, + +; ================================================================ +; interrupt handler (tty only) +; ================================================================ + +ZZZ=. + +LOC 42 + JSR TSINT +LOC ZZZ + +TSINT: 0 + 0 + PUSH P,A + PUSH P,B + MOVEI A,TYIC + .ITYIC A, + JRST TSDIS + .RESET TYIC, ; reset channel + .RESET TYOC, + CAIN A,"? + JRST TSINFO + SETZM INFO + CAIGE A,100 + JRST TSCONT + TRZ A,40 + CAIN A,"Q + JRST TSKILL + CAIN A,"U + JRST TSLOCK + JRST TSCONT +TSDISX: MOVEM A,TSINT+1 +TSDIS: POP P,B + POP P,A + .DISMIS TSINT+1 + +TSINFO: SETOM INFO + SKIPA + +TSLOCK: SETCMM ALLFLG ; complement flag to show all locks in page + +; here to do a new cycle +TSCONT: MOVE P,[-100.,,PDL+1] ; set up pdls + MOVEI A,PICKLP + JRST TSDISX + +; here kill job +TSKILL: MOVEI A,EXIT + JRST TSDISX + +; ================================================================ +; uuo handler (typeout uuos) +; ================================================================ + +ZZZ==. + LOC 40 + 0 + JSR UUOH + LOC ZZZ +UUOCT==0 +UUOTAB: JRST ILUUO + IRPS X,,[DEC BPTR OCT CTLP ASCC SIX ASC ASCI ASCR SIXS HPOS ALIGN SIGN] + UUOCT==UUOCT+1 + O!X=UUOCT_27. + JRST UO!X + TERMIN + +IFG UUOCT-37, PRINTC /---TOO MANY UUO'S---/ + +UUOMAX==.-UUOTAB + + +UUOD: 0 ; contents of UUO eff addr. +UUOE: 0 ; UUO effad. + +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 [ASCIZ /:ILLEGAL UUO +/] + +UOBPTR: MOVEI C,0 + MOVE B,UUOD + JRST UOASC1 + +UOASCR: SKIPA C,[^M] ; cr for end of type +UOASC: MOVEI C,0 ; no cr + HRLI B,440700 ; make ascii pointer +UOASC1: ILDB A,B ; get char + JUMPE A,.+3 ; finish? + PUSHJ P,IOTA + JRST .-3 ; and get another + SKIPE A,C ; get saved cr? + PUSHJ P,IOTA + JRST UUORET + +UOASCC: HRLI B,440700 ; make ascii pointer +UOAS1C: ILDB A,B ; get char + CAIN A,^C + JRST UUORET + PUSHJ P,IOTA + JRST UOAS1C ; and get another + +UOCTLP: MOVEI A,^P + PUSHJ P,IOTA1 + +UOASCI: MOVE A,B ; prt ascii immediate + PUSHJ P,IOTA + JRST UUORET + +UOSIX: MOVE B,UUOD +USXOOP: JUMPE B,UUORET + LDB A,[360600,,B] + ADDI A,40 + PUSHJ P,IOTA + LSH B,6 + JRST USXOOP + +UOSIXS: MOVE A,[440600,,UUOD] +USLOOP: ILDB C,A + ADDI C,40 + PUSHJ P,IOTC + TLNE A,770000 + JRST USLOOP + JRST UUORET + +UOHPOS: SUB B,HPOS + SKIPG B + MOVEI B,1 ; always at least one space +UOHPO1: MOVEI A,40 + PUSHJ P,IOTA + SOJG B,UOHPO1 + JRST UUORET + +POWER: 0 ? 1 ? 10. ? 100. ? 1000. ? 10000. ? 100000. ? 1000000. + +UOSIGN: MOVM D,UUOD + ANDI A,7 + MOVE A,POWER-1(A) + MOVEI C,40 +UOSIG1: CAMLE A,D + PUSHJ P,IOTC + IDIVI A,10. + CAIE A,1 + JRST UOSIG1 + MOVEI A,"+ + SKIPGE UUOD + MOVEI A,"- + SKIPN UUOD + MOVEI A," + PUSHJ P,IOTA + SETZ A, + JRST UODEC + +UOALIG: MOVE D,UUOD + ANDI A,7 + MOVE A,POWER(A) + MOVEI C,40 +UOALI1: CAMLE A,D + PUSHJ P,IOTC + IDIVI A,10. + CAIE A,1 + JRST UOALI1 + SETZ A, + +UODEC: SKIPA C,[10.] ; get base for decimal +UOOCT: MOVEI C,8. ; octal base + MOVE B,UUOD ; get actual word to prt + JRST .+3 ; join code +UODECI: SKIPA C,[10.] ; decimal +UOOCTI: MOVEI C,8. + MOVEM C,BASE' + SKIPN A + HRREI A,-1 ; a=digit count + PUSHJ P,UONUM ; print numbr + JRST UUORET + +UONUM: IDIV B,BASE + HRLM C,(P) ; save digit + SOJE A,UONUM1 ; done if 0 + SKIPG A ; + => more + SKIPE B ; - => b=0 => done + PUSHJ P,UONUM ; else more +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: PUSH P,A + MOVE A,C + PUSHJ P,IOTA + POP P,A + POPJ P, + +HPOS: 0 ; line pos + +IOTA: CAIN A,^P + JRST [.IOT TYOC,["^] + ADDI A,100 + JRST IOTA1] + CAIN A,^J + POPJ P, +IOTA1: .IOT TYOC,A + CAIE A,^M + JRST IOTTAB + .IOT TYOC,[^J] + SETZM HPOS + POPJ P, +; update line pos +IOTTAB: CAIN A,^I + JRST [MOVE A,HPOS + ADDI A,10 + ANDI A,7770 + MOVEM A,HPOS + POPJ P,] + AOS HPOS + POPJ P, + +BUCKET: BLOCK 205. + +VARIAB +CONSTA + +USEBUF: + + BUFFER==<<.+1777>&6000> + BUFPAG== + + END START + \ No newline at end of file