1
0
mirror of https://github.com/PDP-10/its.git synced 2026-02-06 00:24:41 +00:00
Files
PDP-10.its/src/sysen2/pick.52
Lars Brinkhoff 968360b8f8 PICK - examine Muddle locks.
Uses the file MUDDLE; LOCKS PAGE.
2018-11-20 07:01:19 +01:00

670 lines
11 KiB
Plaintext
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 <optional-lock-file-name>
(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==<BUFFER_-10.>
END START