mirror of
https://github.com/PDP-10/stacken.git
synced 2026-03-01 09:21:15 +00:00
423 lines
12 KiB
Plaintext
423 lines
12 KiB
Plaintext
TITLE Disconnect dataset terminal or send "POP" interrupt to controlling job.
|
||
SEARCH JOBDAT,UUOSYM,IMP,MACTEN
|
||
|
||
OPDEF IMPUUO[CALL[SIXBIT"IMPUUO"]]
|
||
|
||
T1==1 ;Temporary accumulators.
|
||
T2==2
|
||
T3==3
|
||
T4==4
|
||
T5==5
|
||
T6==6
|
||
T7==7
|
||
BP==10 ;Byte pointer to buffer.
|
||
BC==11 ;Byte counter for "DISCONNECT".
|
||
PR==12 ;Parser routine.
|
||
MA==13 ;Message block address.
|
||
JS==14 ;Job status word 1.
|
||
CJ==15 ;Controlling job number.
|
||
P==17 ;Stack pointer - at last. [16]
|
||
|
||
DEFINE MESSAGE(FIRST,CODE,TEXT,REST),<
|
||
JRST[ OUTSTR[ ASCIZ "FIRST'DSC'CODE' TEXT"]
|
||
REST
|
||
CLRBFI
|
||
HRROI JS,.GTSTS
|
||
GETTAB JS, ;;[12] Get this job's status.
|
||
SETZ JS, ;;[12] Let Steinbach guide us here
|
||
TXNN JS,1B15 ;;[12] Logged in?
|
||
OUTSTR[ASCIZ "
|
||
."] ;;[12] No, monitor won't give the dot.
|
||
MONRT.
|
||
JRST START]
|
||
> ;END DEFINE MESSAGE
|
||
|
||
DSCVER==1 ;Major version.
|
||
DSCMIN==0 ;Minor version.
|
||
DSCEDT==16 ;Edit level.
|
||
DSCWHO==2 ;Last hacker.
|
||
|
||
LOC .JBVER
|
||
VRSN. DSC
|
||
TWOSEG .JBHGH
|
||
|
||
;Revision history.
|
||
;Edit, by, when, what.
|
||
;1 JE 1980-sometime First working version.
|
||
;2 JE 1981-04-28 Fix bug in logout, run SYS:LOGOUT/PHYSICAL.
|
||
;3 JE 1981-05-01 Add attach/detach trap, so that logout starts
|
||
; directly after detach.
|
||
;4 JMR 1981-06-25 Merge dataset terminal disconnect code from
|
||
; and change name to DISCON.MAC.
|
||
;5 JMR 1981-06-26 Remove SEARCH PASMAC and all low segment data.
|
||
;6 JMR 1981-06-26 Add network disconnect.
|
||
;7 JMR 1981-07-14 Correct spelling of "Won't", never on SYS:.
|
||
;10 JMR 1982-02-13 Add rescan of command line.
|
||
;11 JE 1982-02-16 Add cross job function to return me to monitor
|
||
; level, as a complement to typing a <CR> from
|
||
; controlling job.
|
||
;12 JE 1982-08-02 A little cosmetics on message type-out.
|
||
;13 TE 1983-03-13 Dont LOGOUT if we detached another line.
|
||
;14 KPJ 1986-04-04 Handle DECnet disconnect.
|
||
;15 JMR 1988-02-09 Add IP terminal disconnect.
|
||
;16 JMR 1988-02-10 Add job number printout when returning to the
|
||
; controlled job - at last.
|
||
SUBTTL Start of program. Set up interrupts and check if controlled job.
|
||
|
||
START: SKIPA ;No CCL entry.
|
||
MESSAGE(?,CCL,No CCL entry)
|
||
MOVE P,[ ;Set up stack. [16]
|
||
IOWD STKLEN,STKBLK]
|
||
SETZM WAKFLG ;Clear wakeup flag
|
||
MOVEI T1,VECTOR ;Get our interrupt vector.
|
||
PIINI. T1, ;Initialize our PSI.
|
||
MESSAGE(?,PII,Couldn't initialize PSI system)
|
||
MOVSI T1,(PS.FON)
|
||
PISYS. T1,
|
||
MESSAGE(?,PSI,Couldn't turn PSI on)
|
||
MOVEI T1,DEBRK ;Add our time limit exceeded trap.
|
||
MOVEM T1,VECTLE+.PSVNP
|
||
SETZM VECTLE+.PSVFL
|
||
MOVE T1,[
|
||
EXP PS.FAC+[
|
||
EXP .PCTLE
|
||
XWD VECTLE-VECTOR,0
|
||
XWD 3,0]]
|
||
PISYS. T1,
|
||
MESSAGE(?,TLE,Couldn't trap time limit exceeded)
|
||
MOVEI T1,CROSS ;Add our cross job interrupt trap.
|
||
MOVEM T1,VECJBI+.PSVNP
|
||
SETZM VECJBI+.PSVFL
|
||
MOVE T1,[
|
||
EXP PS.FAC+[
|
||
EXP .PCJBI
|
||
XWD VECJBI-VECTOR,0
|
||
XWD 1,0]]
|
||
PISYS. T1,
|
||
MESSAGE(?,JBI,Couldn't trap cross job interrupts)
|
||
MOVEI T1,LGOUT1 ;[13] Add our attach/detach trap.
|
||
MOVEM T1,VECDAT+.PSVNP
|
||
SETZM VECDAT+.PSVFL
|
||
MOVE T1,[
|
||
EXP PS.FAC+[
|
||
EXP .PCDAT
|
||
XWD VECDAT-VECTOR,0
|
||
XWD 2,0]]
|
||
PISYS. T1,
|
||
MESSAGE(?,DAT,Couldn't trap attach/detach)
|
||
HRROI JS,.GTSTS ;Get this job's status.
|
||
GETTAB JS,
|
||
MESSAGE(?,STS,Couldn't get job status)
|
||
SETO CJ, ;Get the controlling job number.
|
||
CTLJOB CJ,
|
||
MESSAGE(?,CTJ,Couldn't get number of controlling job)
|
||
SUBTTL Rescan command line and decode it.
|
||
|
||
RESCAN 1 ;Rescan command line.
|
||
SKIPA
|
||
MESSAGE(?,RSC,Couldn't rescan command line)
|
||
MOVEI BC,0 ;Initialize index into "DISCONNECT".
|
||
MOVE BP,[ ;Load byte pointer to buffer.
|
||
POINT 7,BUFFER]
|
||
MOVE PR,[ ;Initialize parser routine addresses.
|
||
XWD DISCO,BLANK]
|
||
NEXTC: INCHSL T1
|
||
JRST LASTC
|
||
MOVEI T2,1
|
||
LSH T2,(T1)
|
||
TXNE T2,^B10000000000001
|
||
JRST NEXTC ;Ignore NUL and CR.
|
||
TXNE T2,^B1100000101000001110010001000
|
||
JRST LASTC ;^C, ^G, LF, VT, FF, ^R, ^T, ^Z, ESC terminate.
|
||
CAIE T1,"!" ;! and ; start comments.
|
||
CAIN T1,";"
|
||
HRRZI PR,NEXTC
|
||
JRST (PR) ;Jump off to parse routine.
|
||
BLANK: CAIE T1," " ;Just loop if space or tab.
|
||
CAIN T1,.CHTAB
|
||
JRST NEXTC
|
||
MOVSS PR ;Switch to next parse routine otherwise.
|
||
JRST (PR)
|
||
DISCO: CAME T1,[ ;Check for upper or lower case.
|
||
EXP "D","I","S","C","O","N","N","E","C","T",-1](BC)
|
||
CAMN T1,[
|
||
EXP "d","i","s","c","o","n","n","e","c","t",-1](BC)
|
||
AOJA BC,NEXTC
|
||
CAIN T1,":"
|
||
MESSAGE(?,SCN,This program doesn't use SCAN for command decoding)
|
||
CAIL T1,"0" ;Check for alphanumeric character.
|
||
CAILE T1,"9"
|
||
SKIPA
|
||
JRST ALPHA
|
||
CAIL T1,"A"
|
||
CAILE T1,"Z"
|
||
SKIPA
|
||
JRST ALPHA
|
||
CAIL T1,"a"
|
||
CAILE T1,"z"
|
||
SKIPA
|
||
JRST ALPHA
|
||
MOVE PR,[ ;Load addresses of next parse routines.
|
||
XWD STORE,BLANK]
|
||
JRST (PR) ;Decode non alpha numeric.
|
||
ALPHA: CAIL BC,6 ;Shorter than monitor recognizes?
|
||
MESSAGE(?,PUD,Please use the DISCONNECT command)
|
||
MOVE PR,[ ;Load addresses of parsers.
|
||
XWD STORE,MINUS]
|
||
JRST (PR) ;Jump off to parse character.
|
||
MINUS: CAIN T1,"-" ;Just loop if not minus.
|
||
HRRI PR,BLANK ;Select another parse routine.
|
||
JRST NEXTC
|
||
STORE: IDPB T1,BP ;Store character in buffer.
|
||
JRST NEXTC
|
||
LASTC: MOVEI T1,.CHNUL
|
||
IDPB T1,BP
|
||
SUBTTL Parse command line.
|
||
|
||
CAIE BC,5 ;"DISCO ..."?
|
||
JRST NOTJT ;No, not John Travolta.
|
||
MOVE T1,BUFFER
|
||
ANDCM T1,[
|
||
ASCII " "]
|
||
CAMN T1,[ ;"DISCO FREAK"?
|
||
ASCII "FREAK"]
|
||
JRST FREAK
|
||
CAMN T1,[ ;"DISCO FEVER"?
|
||
ASCII "FEVER"]
|
||
JRST FEVER
|
||
CAMN T1,[ ;"DISCO DUCK"?
|
||
ASCII "DUCK"]
|
||
JRST QUACK
|
||
NOTJT: MOVE BP,[ ;Load byte pointer to start of command.
|
||
POINT 7,BUFFER]
|
||
ILDB T1,BP ;Load first command character.
|
||
JUMPE T1,NOARG ;No arguments, easy.
|
||
MOVE T2,[ ;Load byte pointer to sixbit word.
|
||
POINT 6,T3]
|
||
SETZ T3, ;Clear result.
|
||
NEXTS: CAIL T1,"0" ;Check for alpha numeric.
|
||
CAILE T1,"9"
|
||
SKIPA
|
||
JRST SIXBC
|
||
CAIL T1,"A"
|
||
CAILE T1,"Z"
|
||
SKIPA
|
||
JRST SIXBC
|
||
CAIL T1,"a"
|
||
CAILE T1,"z"
|
||
MESSAGE(?,ILC,Illegal character ',
|
||
OUTCHR T1
|
||
OUTSTR[ ASCIZ "' in terminal name"])
|
||
SUBI T1,40
|
||
SIXBC: SUBI T1,40
|
||
TLNN T2,770000
|
||
MESSAGE(?,TLT,Too long terminal name)
|
||
IDPB T1,T2
|
||
ILDB T1,BP
|
||
JUMPE T1,LASTS
|
||
CAIE T1,":"
|
||
JRST NEXTS
|
||
ILDB T1,BP
|
||
SKIPE T1
|
||
MESSAGE(?,ICE,Illegal character ',
|
||
OUTCHR T1
|
||
OUTSTR[ ASCIZ "' after command end"])
|
||
LASTS: MOVE T5,T3 ;Save terminal name.
|
||
IONDX. T3,UU.PHY ;Get universal device index.
|
||
MESSAGE(?,NSD,No such device)
|
||
TXNN T3,.UXTRM ;Terminal?
|
||
MESSAGE(?,NAT,Not a terminal)
|
||
MOVX T4,UU.PHS
|
||
SETZ T6,
|
||
OPEN T4 ;See if terminal available.
|
||
MESSAGE(?,NAD,Not allowed to disconnect terminal)
|
||
MOVE T5,T3 ;Get terminal's physical node number.
|
||
WHERE T5,UU.PHY
|
||
MESSAGE(?,GTN,Couldn't get terminal node number)
|
||
HRRZS T5
|
||
MOVE T1,[ ;Check if command decoder on that node.
|
||
XWD .NDRCI,T4]
|
||
MOVEI T4,4
|
||
SETZ T6,
|
||
MOVEI T7,.TYMCR
|
||
NODE. T1,
|
||
MESSAGE(?,GCD,Couldn't check if command decoder on terminal node)
|
||
MOVX T6,SIXBIT "CTY" ;Get command decoder's node number.
|
||
WHERE T6,UU.PHY
|
||
MESSAGE(?,GCN,Couldn't get command decoder node number)
|
||
MOVE T4,T3
|
||
GETLCH T4
|
||
TXNN T4,GL.DSL ;Data set line?
|
||
JRST ANF10 ;It's not, try ANF-10 disconnect.
|
||
CAME T5,T6 ;Local terminal always succeeds.
|
||
TLNN T7,-1 ;DN line usually succeeds.
|
||
SKIPA
|
||
JRST ANF10
|
||
DMOVE T1,[ ;Disconnect the terminal.
|
||
XWD 2,T2
|
||
EXP .TODSF]
|
||
TRMOP. T1,
|
||
MESSAGE(?,DDT,Couldn't disconnect dataset terminal)
|
||
JRST DONE
|
||
|
||
ANF10: CAMN T5,T6 ;Refuse to disconnect local terminal.
|
||
JRST LOCAL ;Go check what kind of local terminal. [15]
|
||
DMOVE T1,[ ;Disconnect non local terminal.
|
||
XWD .NDTDS,T2
|
||
EXP 2]
|
||
DEVNAM T3,UU.PHY
|
||
MESSAGE(?,GPT,Couldn't get physical terminal name)
|
||
NODE. T1,UU.PHY
|
||
MESSAGE(?,DNT,Couldn't disconnect network non dataset terminal)
|
||
JRST DONE
|
||
|
||
LOCAL: SETZM IMPBLK+.IBDEV ;Check if IP terminal. [15]
|
||
MOVE T1,T3
|
||
ANDI T1,777
|
||
HRROM T1,IMPBLK+.IBSTT
|
||
MOVX T1,INSVL.(.IUITY,IF.FNC)!IMPBLK
|
||
IMPUUO T1,
|
||
SKIPA ;Error, assume not IP terminal.
|
||
JRST IP ;IP terminal.
|
||
DMOVE T1,[ ;Check if DECnet terminal.
|
||
XWD 2,T2
|
||
EXP .TOAPC]
|
||
TRMOP. T1,
|
||
MOVEI T1,.TOUNK ;Error, assume not DECnet.
|
||
CAIE T1,.TONRT ;Check for NRT.
|
||
CAIN T1,.TOCTM ;Check for CTERM.
|
||
JRST DECNET ;DECnet terminal.
|
||
MESSAGE(?,DLT,Couldn't disconnect local node non dataset terminal)
|
||
|
||
IP: MOVX T1,INSVL.(.IUSTT)!IMPBLK
|
||
IMPUUO T1, ;Find out who owns this IMP.
|
||
MESSAGE(?,GIS,Couldn't get IMP status)
|
||
HLRZ T1,IMPBLK+.IBSTT
|
||
PJOB T2,
|
||
CAMN T1,T2
|
||
JRST IPMINE ;It's my IMP.
|
||
MOVX T1,IF.NWT!IF.PRV!INSVL.(.IUCLS,IF.FNC)!IMPBLK
|
||
IMPUUO T1, ;Must be privileged to close someone else's.
|
||
MESSAGE(?,COI,Couldn't close other job's IMP)
|
||
JRST DONE
|
||
|
||
IPMINE: MOVX T1,INSVL.(.IUCLS,IF.FNC)!IMPBLK
|
||
IMPUUO T1, ;Try to close my IMP.
|
||
MESSAGE(?,CMI,Couldn't close my IMP)
|
||
JRST DONE ;End of IP changes. [15]
|
||
|
||
decnet: MOVE t1,[DN.FLS+<.DNSLS,,.DNSLN>]
|
||
MOVEM t1,dnarg+.DNFFL
|
||
MOVSI t1,-1
|
||
MOVEM t1,dnarg+.DNJCN ;set job number -1
|
||
dlupe: MOVEI t1,dnarg
|
||
DNET. t1,
|
||
MESSAGE(?,DNT,DNET. failed)
|
||
HLRZ t1,dnarg+.DNJCN ;get DN.JOB part
|
||
CAIE t1,-1 ;still -1?
|
||
HRRZ t2,t4 ;get UDX
|
||
SUBI t2,.UXTRM ;get line#
|
||
CAME t2,dnarg+.DNMPR ;TTY number for channel?
|
||
JRST dlupe ;no
|
||
MOVEI t1,t2
|
||
MOVE t2,[.NSFAB,,2]
|
||
HRRZ t3,dnarg+.DNJCN
|
||
NSP. t1,
|
||
MESSAGE(?,FOO,Couldn't disconnect DECnet terminal)
|
||
MESSAGE(?,BAR,Disconnected DECnet terminal failed to disconnect)
|
||
|
||
|
||
NOARG: JUMPGE CJ,LEVEL ;Subjob of AMIS or some other program?
|
||
TXNE JS,1B15 ;Don't disconnect logged in terminal.
|
||
MESSAGE(?,DCT,Won't disconnect controlling terminal of logged in job)
|
||
MOVX T3,SIXBIT "TTY"
|
||
JRST LASTS
|
||
|
||
LEVEL: HRRZI T1,'POP' ;Put "POP" code in right halfword,
|
||
HRL T1,CJ ; and job number in left.
|
||
PIJBI. T1, ;Interrupt the controlling job.
|
||
MESSAGE(?,POP,Couldn't pop command level)
|
||
|
||
ZZZZZ: MOVX T1,HB.RTC+HB.RWJ+HB.SWP+^D60*^D1000
|
||
HIBER T1, ;Sleep for one minute or until typein.
|
||
MESSAGE(?,HIB,Couldn't hibernate)
|
||
TXNN JS,1B15 ;Don't check anything and don't loop
|
||
MONRT. ; if not logged in.
|
||
SKPINC ;Terminal activity?
|
||
SKIPE WAKFLG ; ...or recieved a wake up interrupt?
|
||
SKIPA
|
||
JRST ZZZZZ ; No, loop back.
|
||
MESSAGE([,BTJ,Back to job ,<
|
||
PJOB T1,
|
||
PUSHJ P,OUTDEC
|
||
OUTCHR[ EXP "]"]>)
|
||
SUBTTL All the stupid "DISCO ..." commands.
|
||
|
||
FREAK: MESSAGE(?,FRK,Freaks are not allowed)
|
||
|
||
FEVER: MESSAGE(?,39C,39 degrees centigrade)
|
||
|
||
QUACK: MESSAGE(?,QCK,Quack quack)
|
||
SUBTTL Pop command level and interrupt routines.
|
||
|
||
CROSS: HRRZI T1,'BYE'
|
||
HRL T1,CJ
|
||
CAMN T1,VECJBI+.PSVIS;Controlling job and "BYE" code?
|
||
JRST LGOUT
|
||
HRRI T1,'WAK'
|
||
CAMN T1,VECJBI+.PSVIS;Controlling job and "WAK" code?
|
||
SETOM WAKFLG ; Yes, set wake up flag
|
||
JRST DEBRK
|
||
|
||
LGOUT: TXNN JS,1B15 ;Come here to detach and log out.
|
||
MONRT. ;Just log out if not logged in.
|
||
MOVSI T1,-1 ;Detach the job.
|
||
ATTACH T1,
|
||
JFCL ;Ignore error. [15]
|
||
; MESSAGE(?,DET,Couldn't detach)
|
||
HRRZI T1,[ ;Run SYS:LOGOUT/PHYSICAL.
|
||
SIXBIT 'SYS'
|
||
SIXBIT 'LOGOUT'
|
||
EXP 0,0,0,0]
|
||
RUN T1,UU.PHY
|
||
MESSAGE(?,RUN,Couldn't run SYS:LOGOUT)
|
||
|
||
LGOUT1: MOVNI T1,1 ;[13] Come here on a detach/attach interrupt
|
||
TRMNO. T1, ;[13] Get terminal, the only error reason
|
||
JRST LGOUT ;[13] is that I am detached, then run LOGOUT!
|
||
DONE: MOVEI T1,1
|
||
SLEEP T1,
|
||
MONRT.
|
||
JRST START
|
||
|
||
DEBRK: DEBRK.
|
||
JFCL
|
||
MESSAGE(?,DBK,Couldn't debreak from interrupt)
|
||
|
||
OUTDEC: IDIVI T1,^D10 ;Subroutine to output job number. [16]
|
||
JUMPE T1,OUTDIG
|
||
HRLM T2,(P)
|
||
PUSHJ P,OUTDEC
|
||
HLR T2,(P)
|
||
OUTDIG: ADDI T2,"0"
|
||
OUTCHR T2
|
||
POPJ P,
|
||
SUBTTL The not so empty low segment.
|
||
|
||
XLIST
|
||
LIT
|
||
LIST
|
||
RELOC
|
||
|
||
dnarg: BLOCK .DNSLN ;<14> DNET. argument block
|
||
VECTOR:
|
||
VECTLE: BLOCK 4
|
||
VECJBI: BLOCK 4
|
||
VECDAT: BLOCK 4
|
||
WAKFLG: BLOCK 1 ;Wake up flag, what did U think?
|
||
IMPBLK: BLOCK .IBSIZ ;IMPUUO argument block. [15]
|
||
STKBLK: BLOCK <STKLEN==100> ;Stack. [16]
|
||
BUFFER:
|
||
|
||
END START
|