1
0
mirror of https://github.com/PDP-10/its.git synced 2026-02-11 18:54:32 +00:00
Files
PDP-10.its/src/sysen2/reatta.18
2016-12-03 15:30:52 -08:00

349 lines
9.0 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.
;-*-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