mirror of
https://github.com/PDP-10/its.git
synced 2026-02-11 18:54:32 +00:00
349 lines
9.0 KiB
Plaintext
Executable File
349 lines
9.0 KiB
Plaintext
Executable File
|
||
;-*-MIDAS-*-
|
||
|
||
TITLE REATTACH
|
||
|
||
.INSRT RMS;MACROS >
|
||
|
||
TYIC==1
|
||
TYOC==2
|
||
USRI==3
|
||
DSKIC==4
|
||
|
||
BUSRC==100000 ;USER-CONTROLLED BIT IN .USTP WORD.
|
||
|
||
IFNDEF LPDL,LPDL==40
|
||
IFNDEF JCLBSZ,JCLBSZ==10
|
||
|
||
BEG: MOVE P,[-LPDL,,PDL]
|
||
MOVEI A,ITEMTB ;INIT ALL VARIABLES
|
||
MOVEM A,ITEMTP
|
||
.SUSET [.RUNAM,,UNAME]
|
||
SETZM JNAME
|
||
SETOM TTYNUM
|
||
.SUSET [.ROPTIO,,A]
|
||
TLNN A,OPTCMD ;NO COMMAND STRING => REATTACH OUR OWN DETACHED TREE.
|
||
JRST OLDTREE
|
||
SETZM JCLBUF ;NOW GET THE COMMAND STRING
|
||
MOVE A,[JCLBUF,,JCLBUF+1]
|
||
BLT A,JCLBUF+JCLBSZ-1
|
||
.BREAK 12,[5,,JCLBUF]
|
||
SKIPN JCLBUF
|
||
JRST OLDTREE
|
||
MOVE D,[440700,,JCLBUF] ;NOW PROCESS THE COMMAND STRING.
|
||
ITEMLP: SAVE D
|
||
CALL RNUMO ;TRY TO READ A TTY NUMBER.
|
||
JRST ITEMWD ;FAILED; READ A WORD INSTEAD.
|
||
SUB P,[1,,1]
|
||
MOVEM A,TTYNUM ;GOT A TTY NUMBER; LOOK FOR NEXT THING.
|
||
JRST ITEMX
|
||
|
||
ITEMWD: REST D ;START OVER (MAYBE RNUMO SKIPPED SOME CHARS)
|
||
CALL RDSIX ;READ A WORD.
|
||
JUMPE B,ITEMW1
|
||
XCT @ITEMTP ;STORE IT AS UNAME OR JNAME.
|
||
AOS ITEMTP
|
||
ITEMW1: CAIN C,"* ;"*" MEANS "DON'T SPECIFY THIS ITEM".
|
||
AOS ITEMTP
|
||
ITEMX: CAIE C,^C ;^C AND ^M END THE COMMAND STRING.
|
||
CAIN C,^M
|
||
JRST CHECK
|
||
CAIE C,"/ ;SLASH STARTS A SWITCH.
|
||
JRST ITEMLP
|
||
ILDB C,D
|
||
CAIL C,140 ;CONVER THE SWITCH NAME TO UPPER CASE
|
||
SUBI C,40
|
||
SETZ B,
|
||
CAIN C,"F ;/F => IF TTY IS IN USE, FREE IT BY DETACH.
|
||
SETOB B,FORCE
|
||
CAIN C,"K ;/K => KILL THE TREE DETACHED FROM THE SPEC'D TTY,
|
||
SETOB B,KILL ;IF THERE WAS ONE.
|
||
CAIN C,"X ;/X => EXCHANGE SPECIFIED JOB WITH THAT ON SPECIFIED TTY.
|
||
SETOB B,EXCHNG
|
||
JUMPN B,ITEMLP
|
||
JRST NOSWIT ;ANYTHING ELSE AFTER SLASH IS ILLEGAL.
|
||
|
||
ITEMTB: MOVEM B,UNAME
|
||
MOVEM B,JNAME
|
||
SOS ITEMTP
|
||
|
||
;READ AN OCTAL NUMBER, OPTIONALLY PRECEDED BY "T", INTO A.
|
||
;THE "T" MAKES NO DIFFERENCE. A COLON MAY ALSO APPEAR AS A NOISE CHARACTER
|
||
;AT THE END.
|
||
;CLOBBERS B,C. SKIPS IF SUCCESSFUL (NUMBER IS NON-NULL AND
|
||
;HAS A PROPER TERMINATING CHARACTER).
|
||
RNUMO: SETZB A,B ;A ACCUMULATES NUMBER, B COUNTS DIGITS.
|
||
ILDB C,D
|
||
CAIE C,"T
|
||
CAIN C,"T+40
|
||
RNUMO1: ILDB C,D
|
||
CAIL C,"0
|
||
CAILE C,"9
|
||
JRST RNUMOX ;NON-DIGIT => IS THIS A LEGITIMATE TERMINATOR?
|
||
LSH A,3
|
||
ADDI A,-"0(C) ;DIGIT => MERGE IT IN.
|
||
AOJA B,RNUMO1
|
||
|
||
RNUMOX: JUMPE B,CPOPJ ;FAIL IF # OF DIGITS IS 0.
|
||
CAIN C,":
|
||
ILDB C,D
|
||
RDTEST: CAIE C,", ;SKIP IF CHAR IN C IS A LEGITIMATE TERMINATOR.
|
||
CAIG C,40
|
||
JRST POPJ1
|
||
CAIE C,"*
|
||
CAIN C,"/
|
||
JRST POPJ1
|
||
CAIN C,"?
|
||
JRST HELP
|
||
CPOPJ: RET
|
||
|
||
POPJ1: AOS (P)
|
||
RET
|
||
|
||
;READ A WORD, AS A SIXBIT WORD IN B. CLOBBERS A, C.
|
||
;ENDS WITH FIRST LEGITIMATE TERMINATOR (BUT ^Q CAN QUOTE).
|
||
RDSIX: SETZ B,
|
||
MOVE A,[440600,,B]
|
||
RDSIXL: ILDB C,D
|
||
CALL RDTEST ;IS CHAR A TERMINATOR?
|
||
JRST RDSIX1 ;NO.
|
||
CAIE C,^Q ;YES, BUT ^Q ISN'T LIKE OTHER TERMINATORS.
|
||
RET
|
||
ILDB C,D
|
||
CAIGE C,40
|
||
RET ;DON'T LET ^M, ^C BE QUOTED AT ALL.
|
||
RDSIX1: CAIL C,140
|
||
SUBI C,40 ;CONVERT CHAR TO UPPER CASE.
|
||
SUBI C,40
|
||
TLNE A,770000
|
||
IDPB C,A
|
||
JRST RDSIXL
|
||
|
||
;ASK THE USER FOR CONFIRMATION ON REATTACHING HIS DETACHED TREE.
|
||
CONFRM:.OPEN TYOC,TTYOF
|
||
.LOSE %LSSYS
|
||
.OPEN TYIC,TTYIF
|
||
.LOSE %LSSYS
|
||
MOVEI A,[ASCIZ /This will kill any jobs you have in this tree.
|
||
/]
|
||
CALL NO3
|
||
CONFR1: MOVEI A,[ASCIZ /Should I go ahead (Y or N)? /]
|
||
CALL NO3
|
||
.IOT TYIC,C
|
||
CAIL C,140
|
||
SUBI C,40
|
||
MOVEI A,[ASCIZ /
|
||
/]
|
||
CALL NO3
|
||
CAIN C,"N
|
||
JRST NO2
|
||
CAIE C,"Y
|
||
JRST CONFR1
|
||
SETOM KILL ;KILL THE USER'S NEW TREE.
|
||
POPJ P,
|
||
|
||
;HERE IF NO ARGUMENTS. ATTACH OUR OWN OLD DETACHED TREE, ASKING FOR CONFIRMATION.
|
||
OLDTREE:SETOM SELF
|
||
|
||
;COME HERE AFTER PROCESSING THE COMMAND STRING.
|
||
;DEFAULT THE JNAME IF NECESSARY, AND CHECK ARGS FOR LEGALITY.
|
||
CHECK: SKIPE A,JNAME ;IF JNAME IS UNSPECIFIED, TRY DETACHED TREES, THEN HACTRN.
|
||
JRST CHECK1
|
||
MOVE B,[SIXBIT/HELP/]
|
||
CAMN B,UNAME ;IF UNAME IS "HELP" AND NO JNAME, COMMAND STRING WAS
|
||
JRST HELP ;JUST "HELP", SO GIVE USER HELP.
|
||
MOVE A,['HACTRR] ;USE HACTRR IF IT EXISTS,
|
||
.CALL TRYOPN
|
||
SKIPA A,['HACTRQ] ;ELSE USE HACTRQ IF IT EXISTS,
|
||
JRST CHECK1
|
||
.CALL TRYOPN
|
||
SKIPA A,['HACTRP] ;ELSE USE HACTRP IF IT EXISTS,
|
||
JRST CHECK1
|
||
.CALL TRYOPN
|
||
SKIPA A,['HACTRO] ;ELSE USE HACTRO IF IT EXISTS,
|
||
JRST CHECK1
|
||
.CALL TRYOPN
|
||
SKIPA A,['HACTRN] ;IT DOESN'T; TRY HACTRN.
|
||
JRST CHECK1
|
||
SKIPE SELF ;DON'T TRY HACTRN IN CASE OF :REATTA<CR>
|
||
JRST NODET
|
||
CHECK1: .CALL TRYOPN ;DOES SPEC'D JOB EXIST?
|
||
JRST NOJOB ;NO; ERROR.
|
||
.USET USRI,[.RUSTP,,B]
|
||
TLNE B,BUSRC ;IT IS AN ERROR TO TRY TO ATTACH A STOPPED JOB.
|
||
JRST NORUN
|
||
SKIPE SELF ;IF :REATTA<CR>, ASK USER FOR CONFIRMATION.
|
||
CALL CONFRM
|
||
MOVEM A,JNAME
|
||
MOVE B,TTYNUM
|
||
JUMPGE B,CHECK2 ;IF USING OUR OWN TTY,
|
||
.SUSET [.RCNSL,,B] ;FIND OUT ITS NUMBER.
|
||
.SUSET [.RUNAME,,C] ;ALSO, IF WE ARE NOT LOGGED IN YET, ASSUME /K
|
||
HLLES C ;SO THAT SOMEONE DOING :REATTA <SELF> WITHOUT
|
||
AOJN C,CHECK2 ;LOGGING IN DOESN'T LEAVE A NON-LOGGED-IN DETACHED TREE.
|
||
SETOM KILL
|
||
SKIPE EXCHNG ;/X ISN'T ALLOWED IF YOU AREN'T LOGGED IN.
|
||
JRST NOLOGX
|
||
CHECK2: SKIPE KILL
|
||
SKIPN EXCHNG ;/X AND /K ARE INCONSISTENT.
|
||
CAIA
|
||
JRST NOXK
|
||
TRO B,400000 ;MAKE A TTY SPEC OUT OF THE TTY NUMBER.
|
||
MOVEM B,RTTYNM
|
||
SYSCAL STYGET,[B ? MOVEM C ? MOVEM A ? MOVEM C]
|
||
.LOSE %LSFIL
|
||
HRRES C ;C HAS -1, OR IDX OF TOP OF TREE OF SPEC'D TTY.
|
||
.USET USRI,[.RUIND,,D]
|
||
CAIN D,(C) ;SPEC'D TREE IS ALREADY ON THAT TTY =>
|
||
JRST NOOP ;WE HAVE NOTHING TO DO.
|
||
.USET USRI,[.RSUPPR,,D]
|
||
JUMPGE D,NOTTOP ;SPEC'D JOB MUST BE TOP LEVEL
|
||
JUMPL C,CHECK3 ;NOW, IF TTY IS IN USE,
|
||
SKIPE EXCHNG
|
||
SETOM FORCE
|
||
SKIPL TTYNUM ;AND IT'S OUR OWN, DETACH US.
|
||
SKIPE FORCE ;ELSE GIVE UP UNLESS /F OR /X WAS SPEC'D.
|
||
SYSCAL DETACH,[%CLIMM,,400000(C) ? %CLBIT,,30]
|
||
JRST NOTFREE ;THIS DETACH OMITS CNSL FREE MSG, AND MAKES JOB
|
||
JRST ACT ;DIE AFTER AN HOUR IF NOT ATTACHED.
|
||
|
||
CHECK3: HRRES A
|
||
JUMPGE A,NOTFREE ;CAN'T DO ANYTHING WITH TTY IN USE AS DEVICE.
|
||
|
||
;NOW THAT ALL IS CHECKED, DO THE DIRTY WORK.
|
||
ACT: .USET USRI,[.RCNSL,,A] ;REMEMBER TTY THAT SPEC'D JOB CAME FROM IN A.
|
||
.USET USRI,[.RAPRC,,D]
|
||
JUMPL D,ACT1 ;IF SPEC'D TREE IS DISOWNED, ALL IS WELL.
|
||
JUMPL A,ACT2 ;ELSE IF THE SPEC'D TREE HAD A TTY AND THE SPEC'D TTY
|
||
JUMPL C,ACT2 ;HAD A TREE, MAYBE (IF /X, "EXCHANGE", SPECIFIED)
|
||
SKIPN EXCHNG
|
||
JRST ACT2
|
||
SYSCAL DETACH,[1000,,USRI ? 5000,,30] ;KILL IN 1 HOUR, NO CONSOLE FREE MESSAGE.
|
||
.LOSE %LSSYS ;FREE THE SPEC'D TREE FROM ITS TTY
|
||
SYSCAL ATTACH,[%CLIMM,,400000(C) ? %CLIMM,,400000(A) ? %CLBIT,,400000]
|
||
.LOSE %LSSYS ;AND PUT THE SPEC'D TTY'S TREE THERE INSTEAD.
|
||
JRST ACT1
|
||
|
||
;HERE TO DETACH SPECIFIED TREE IF WE ARE NOT EXCHANGING IT. IN THAT CASE,
|
||
;WE SHOULD ALLOW A CONSOLE-FREE MESSAGE ON ITS TERMINAL.
|
||
ACT2: DPAUSE
|
||
SYSCAL DETACH,[1000,,USRI ? 5000,,10] ;CTL BIT 10 INHIBITS CNSL FREE MSG
|
||
.LOSE %LSSYS
|
||
ACT1: DPAUSE
|
||
SYSCAL ATTACH,[%CLIMM,,USRI ? RTTYNM ? %CLBIT,,400000]
|
||
.LOSE %LSSYS
|
||
SKIPN KILL ;AND MAYBE KILL THE TREE WE DETACHED FROM THE TTY.
|
||
JRST RETURN
|
||
SKIPL C
|
||
.GUN C,
|
||
RETURN: DPAUSE
|
||
.LOGOUT
|
||
.SUSET [.RTTY,,A]
|
||
ANDI A,-1
|
||
SKIPL TTYNUM
|
||
CAMN A,TTYNUM ;IF WE JUST REATTACHED OUR OWN TREE TO NEW TTY,
|
||
.VALUE [ASCIZ /:KILL :NEWTTY :VERSIO /] ;TELL DDT TO LOOK AGAIN AT TTY CHARACTERISTICS
|
||
.BREAK 16,340000
|
||
|
||
;ERROR MESSAGE HANDLERS.
|
||
|
||
NOTFREE:JSP A,NO
|
||
ASCIZ /Specified TTY not free/
|
||
|
||
NOTTOP: JSP A,NO
|
||
ASCIZ /Specified job not top level/
|
||
|
||
NOLOGX: JSP A,NO
|
||
ASCIZ */X is not allowed unless you are logged in*
|
||
|
||
NOXK: JSP A,NO
|
||
ASCIZ */X and /K together make no sense*
|
||
|
||
NOJOB: JSP A,NO
|
||
ASCIZ /No such job/
|
||
|
||
NORUN: JSP A,NO
|
||
ASCIZ /Specified job not running/
|
||
|
||
NOOP: JSP A,NO
|
||
ASCIZ /Specified job and TTY already connected/
|
||
|
||
NODET: JSP A,NO
|
||
ASCIZ /You have no detached tree/
|
||
|
||
NOSWIT: JSP A,NO
|
||
ASCIZ /Unrecognized switch. Legal ones are K, F, and X/
|
||
|
||
NO: .OPEN TYOC,TTYOF
|
||
.VALUE
|
||
CALL NO3 ;PRINT THE STRING A POINTS TO,
|
||
MOVEI A,[ASCIZ /.
|
||
For help, do :REATTA ?<cr> or print .INFO.;REATTA ORDER./]
|
||
CALL NO3 ;AND SOME GENERAL ADVICE.
|
||
NO2: DPAUSE ;.VALUE IF DEBUGGING.
|
||
.LOGOUT
|
||
.BREAK 16,140000
|
||
|
||
NO3: HRLI A,440700
|
||
NO1: ILDB B,A
|
||
JUMPE B,CPOPJ
|
||
.IOT TYOC,B
|
||
JRST NO1
|
||
|
||
;COME HERE IF COMMAND STRING IS "HELP" OR CONTAINS A "?".
|
||
HELP: .OPEN TYOC,TTYOF
|
||
.LOSE %LSSYS
|
||
SYSCAL OPEN,[1000,,DSKIC ;OPEN THE HELP FILE.
|
||
['DSK,,] ? ['REATTA] ? [SIXBIT/ORDER/] ? ['.INFO.]]
|
||
.LOSE %LSFIL
|
||
SETOM TTYNUM ;PREVENT VALRETTING :NEWTTY AT RETURN:.
|
||
HELP1: .IOT DSKIC,A
|
||
ANDI A,-1
|
||
CAIE A,^L
|
||
CAIN A,^C
|
||
JRST RETURN
|
||
.IOT TYOC,A
|
||
JRST HELP1
|
||
|
||
;CONSTANTS
|
||
TRYOPN: SETZ ? SIXBIT/OPEN/
|
||
[10,,USRI]
|
||
['USR,,]
|
||
UNAME
|
||
SETZ A
|
||
|
||
TTYIF: 'TTY
|
||
0
|
||
|
||
TTYOF: 1,,'TTY
|
||
0
|
||
|
||
;VARIABLES
|
||
FORCE: 0 ;-1 => EVEN IF SPEC'D TTY IS IN USE AND NOT OURS,
|
||
;GO AHEAD BY DETACHING WHOEVER IS ON IT.
|
||
KILL: 0 ;-1 => IF MUST DETACH A TREE FROM THE TTY TO FREE IT,
|
||
;GUN THE TREE AFTER ATTACHING THE TTY.
|
||
EXCHNG: 0 ;-1 => TAKE THE TREE WE DETACH FROM THE SPECIFIED TTY
|
||
;AND ATTACH IT TO THE TTY THE SPECIFIED JOB CAME FROM,
|
||
;THUS EXCHANGING THE TWO TREES.
|
||
SELF: 0 ;-1 => :REATTA<CR>, ATTACH OWN DETACHED TREE.
|
||
;IN THIS CASE, WE LOOK ONLY FOR DETACHED TREES, NOT FOR HACTRN.
|
||
UNAME: 0 ;UNAME OF JOB TO ATTACH
|
||
JNAME: 0 ;JNAME OF JOB TO ATTACH
|
||
;0 => TRY HACTRO, THEN TRY HACTRN IF HACTRO DOESN'T EXIST.
|
||
TTYNUM: -1 ;-1 => USE OUR TTY; ELSE, # OF TTY TO USE.
|
||
RTTYNM: 0 ;A TTY SPEC, GOOD FOR SPECIFYING THE TTY TO BE USED.
|
||
ITEMTP: ITEMTB ;FILENAME-READER COUNTER FOR SELECTING UNAME OR JNAME.
|
||
|
||
PDL: BLOCK LPDL
|
||
|
||
JCLBUF: BLOCK JCLBSZ
|
||
-1
|
||
|
||
DEBUG: 0 ;-1 => DEBUGGING.
|
||
PAT:
|
||
PATCH: BLOCK 100
|
||
-1
|
||
|
||
END BEG
|