mirror of
https://github.com/PDP-10/stacken.git
synced 2026-02-16 12:42:51 +00:00
1088 lines
36 KiB
Plaintext
1088 lines
36 KiB
Plaintext
TITLE NET Network information program for DECnet-10
|
||
|
||
SEARCH UUOSYM ; Tops-10 definitions
|
||
SEARCH MACTEN ; Handy macros
|
||
SEARCH SCNMAC ; Get SCAN definitions
|
||
|
||
.REQUEST REL:SCAN ; Satisfy Externals
|
||
|
||
TWOSEG 400K ; Give us a high and a low seg
|
||
|
||
SALL ; Suppress macro expansions
|
||
|
||
F=0 ; Flags
|
||
T1=1 ; Define
|
||
T2=2 ; usual
|
||
T3=3 ; junk
|
||
T4=4 ; AC's
|
||
|
||
P1=5 ; Define the usual perm AC's
|
||
P2=6 ; . . .
|
||
P3=7
|
||
P4=<C=10>
|
||
|
||
AP=12 ; Primary string pointer
|
||
AL=13 ; Primary string length
|
||
BP=14 ; Wildcard string pointer
|
||
BL=15 ; Wildcard string length
|
||
|
||
CH=16 ; Character
|
||
|
||
P=17 ; Stack pointer
|
||
|
||
.HELPR==:.POPJ
|
||
SUBTTL Flags and other definitions
|
||
|
||
F.SORT==1B0 ; Sort node names alphabetically
|
||
F.SBKW==1B1 ; Sort node names backwards
|
||
F.LINK==1B2 ; Show links instead of nodes
|
||
; F.NNUM==1B3 ; Print node numbers
|
||
F.ACT==1B4 ; Print out active nodes only
|
||
F.STR==1B5 ; A (possibly) wildcard string was specified
|
||
F.WILD==1B6 ; The constraint string has wildcards in it
|
||
F.DET==1B7 ; Type out node info in detail
|
||
F.ODET==1B8 ; Type out detailed info for a single node
|
||
|
||
F.DEFAULT==F.ACT ; Define symbol for default flags
|
||
|
||
C$NODE==8 ; Print width of nodename
|
||
|
||
TOSIZ==^D2500 ; Size of TTY buffer
|
||
|
||
DEFINE ERROR(PFX,TEXT)<
|
||
JRST [MOVX T1,<SIXBIT |NET'PFX|> ;; Get Prog name, error prefix
|
||
MOVE T2,["?",,[ASCIZ |TEXT|]] ;; Get lead char, error text
|
||
JRST ERRDIE] ;; And go croak
|
||
>
|
||
|
||
DEFINE WARN(PFX,TEXT)<
|
||
PUSHJ P,WRNRTN ;; Call the warning routine
|
||
JUMP [SIXBIT |NET'PFX| ;; Get Prog name, error prefix
|
||
"%",,[ASCIZ |TEXT|]] ;; Get lead char, error text
|
||
>
|
||
SUBTTL NET Start of program
|
||
|
||
NET: JFCL ; Ignore CCL entry
|
||
RESET ; Reset the world
|
||
SETZ F, ; Clear flags
|
||
MOVE P,[IOWD STKLEN,STACK] ; Set up the stack
|
||
|
||
PUSHJ P,REDXTR ; Go read info about this node
|
||
|
||
MOVE T1,THARG ; Get arg for TRMOP.
|
||
TRMOP. T1, ; Read height of terminal
|
||
MOVEI T1,^D24 ; Reasonable default
|
||
SOJ T1, ; Decrement one for tty stop syncronization
|
||
MOVEM T1,TRMHIT ; Save it
|
||
MOVEM T1,SNCTTY+3 ; Save it in TRMOP block
|
||
|
||
MOVE T1,TWARG ; Get arg for TRMOP.
|
||
TRMOP. T1, ; Get width of terminal
|
||
MOVEI T1,^D80 ; Reasonable default
|
||
AOJ T1, ; Account for last node on the line
|
||
IDIVI T1,8 ; Compute number of nodes per line
|
||
MOVEM T1,NODPLN ; Save for later
|
||
|
||
MOVE T1,ISCARG ; Get arg for .ISCAN
|
||
PUSHJ P,.ISCAN## ; Initialize the command scanner
|
||
PUSHJ P,SCNLIN ; Go scan the command line
|
||
|
||
PUSHJ P,TYPINI ; Initialize the typeout routines
|
||
|
||
TXNE F,F.LINK ; Do we want to know about links??
|
||
JRST LSTLNK ; Yes, go do different stuff
|
||
|
||
PUSHJ P,REDLIS ; Read active (or known) nodes that
|
||
; fit constraint string
|
||
JRST FINI.1 ; No nodes match
|
||
DMOVE P1,T1 ; Save list pointer and count in a safe place
|
||
SUBTTL PRTLIS Print out the list of nodes
|
||
|
||
CAIN P2,1 ; Is the node count equal to one?
|
||
TXO F,F.ODET ; Yes, set the print in great detail flag
|
||
|
||
TXNE F,F.SORT ; Are we sorting?
|
||
PUSHJ P,SORTEM ; Sort the node names
|
||
|
||
TXNE F,F.DET ; Type out in detail??
|
||
JRST FINI.6 ; Yes, go print out header
|
||
|
||
MOVE P3,NODPLN ; Get number of nodes per line
|
||
JRST FINI.3 ; And enter the loop at the right point
|
||
|
||
FINI.2: SOJLE P3,FINI.6 ; Go type a <CRLF> and reset line counter
|
||
TXNN F,F.DET ; Detailed format?
|
||
PUSHJ P,.TTABC## ; No, <TAB> will do
|
||
FINI.3: MOVE T1,(P1) ; Get the next entry
|
||
TXNE F,F.DET ; Detailed output??
|
||
PUSHJ P,NODDET ; Yes, print lotsa stuff
|
||
TXNE F,F.DET ; Detailed output?
|
||
JRST FINI.5 ; Yes, finish up this line elegantly
|
||
CAMN T1,NAMXTR ; Is this the Executor Node?
|
||
SKIPA T1,["*"] ; Yes, precede it with a star
|
||
MOVEI T1," " ; No, use a space
|
||
PUSHJ P,.TCHAR## ; Type it out
|
||
MOVE T1,(P1) ; Get the next entry (again)
|
||
PUSHJ P,TYPNNM ; Type the node name
|
||
FINI.5: AOJ P1, ; Increment the pointer
|
||
SOJG P2,FINI.2 ; Loop till done
|
||
|
||
FINI.1: PUSHJ P,TYPOUT ; Flush the tty buffer
|
||
EXIT 1,
|
||
JRST NET
|
||
|
||
FINI.6: TXNE F,F.DET ; Are we printing out in detail???
|
||
JRST FINI.9 ; Yes, go print header
|
||
MOVE P3,NODPLN ; Get number of nodes per line
|
||
PUSHJ P,.TCRLF## ; Get a new line
|
||
JRST FINI.3 ; And jump back into the fray
|
||
|
||
FINI.9: TXNE F,F.ODET ; Is this just for a single node??
|
||
JRST FINI.3 ; Yes, no header then
|
||
MOVEI T1,14
|
||
PUSHJ P,.TCHAR##
|
||
PUSHJ P,TYPOUT ; Flush the tty buffer to synchronize
|
||
MOVE T1,[2,,T2]
|
||
MOVEI T2,.TOSOP
|
||
SETO T3,
|
||
TRMOP. T1,
|
||
SKIPA
|
||
JRST .-2
|
||
MOVE T1,SNCTTY ; Get arg for TRMOP.
|
||
TRMOP. T1, ; Reset stop counter
|
||
HALT . ; ???
|
||
MOVEI T1,HEADER ; Get addr of header text
|
||
PUSHJ P,.TSTRG## ; Type it out
|
||
PUSHJ P,.TCRLF## ; Type a crlf
|
||
MOVE P3,TRMHIT ; Get height of the terminal
|
||
SUBI P3,2 ; Correct for header and blank line
|
||
JRST FINI.3 ; And keep on going
|
||
|
||
HEADER:
|
||
ASCIZ |Node Number Hops Cost Links Delay Phase Circuit
|
||
|
|
||
SUBTTL LSTLNK List links to this node
|
||
|
||
LSTLNK: MOVX T1,DNL.NJ ; Get the link id for listing all links
|
||
LSTL.2: PUSHJ P,LNKDET ; Print out link status in detail
|
||
JRST LSTL.1 ; No more links, punt
|
||
JRST LSTL.2 ; And keep on typing
|
||
|
||
LSTL.1: JRST FINI.1 ; And finish up normally
|
||
SUBTTL NODDET Type out detailed information about a node
|
||
|
||
COMMENT ~
|
||
|
||
KL1026(110) Reachable Hops=1 Cost=1 Links=7 Delay=4382(ms) Phase III DTE-0-3
|
||
|
||
|
||
~
|
||
|
||
FO.SIZ==1B0 ; Suppress field if zero
|
||
|
||
DEFINE XX (BP,STR,RTN,FLAGS<0>)<
|
||
EXP FLAGS+[BP
|
||
XWD [ASCIZ |STR|],RTN ] >
|
||
|
||
NODFMT: XX <POINTR DNARG+.DNBNN,-1>,<>,.TSIXN##
|
||
XX <POINTR DNARG+.DNBNM,-1>,<>,TYPNNM
|
||
XX <POINTR DNARG+.DNBRC,DNB.RC>,< >,NODRCH
|
||
XX <POINTR DNARG+.DNBRC,DNB.HP>,< Hops=>,.TDECW##
|
||
XX <POINTR DNARG+.DNBRC,DNB.CS>,< Cost=>,.TDECW##
|
||
XX <POINTR DNARG+.DNBLD,DNB.DL>,< Links=>,.TDECW##
|
||
XX <POINTR DNARG+.DNBLD,DNB.AL>,< Delay=>,.TDECW##
|
||
XX <POINTR DNARG+.DNBRC,DNB.NT>,<(ms) Phase II>,NODPHA
|
||
XX <POINTR DNARG+.DNBOC+1>,< >,NODCIR
|
||
XX <POINTR 0,44>,<>,.TCRLF##
|
||
NODFLN==.-NODFMT
|
||
|
||
NODFPT: XWD -NODFLN,NODFMT
|
||
|
||
NDQFMT: XX <POINTR DNARG+.DNBNN,-1>,<>,.TSIXN##
|
||
XX <POINTR DNARG+.DNBNM,-1>,< >,.TDECW##
|
||
XX <POINTR DNARG+.DNBRC,DNB.HP>,< >,.TDECW##
|
||
XX <POINTR DNARG+.DNBRC,DNB.CS>,< >,.TDECW##
|
||
XX <POINTR DNARG+.DNBLD,DNB.DL>,< >,.TDECW##,FO.SIZ
|
||
XX <POINTR DNARG+.DNBLD,DNB.AL>,< >,.TDECW##
|
||
XX <POINTR DNARG+.DNBRC,DNB.NT>,< Phase II>,NODPHA
|
||
XX <POINTR DNARG+.DNBOC+1>,< >,NODCIR
|
||
XX <POINTR 0,44>,<>,.TCRLF##
|
||
NDQFLN==.-NDQFMT
|
||
|
||
NDQFPT: XWD -NDQFLN,NDQFMT
|
||
|
||
NODDET: MOVEM T1,DNARG+.DNBNN ; Put node name into arg list
|
||
MOVEI T1,CIRLEN ; Get length of circuit id buffer
|
||
MOVEM T1,DNARG+.DNBOC ; Install it
|
||
MOVEI T1,DNARG ; Get arg for DNET.
|
||
DNET. T1, ; Read detailed info about the node
|
||
ERROR(UDN,Undefined Node Name)
|
||
|
||
PUSHJ P,.SAVE2## ; Save a P
|
||
MOVE P1,NODFPT ; Get AOBJN pointer to format table
|
||
TXNN F,F.ODET ; Are we just doing one node??
|
||
MOVE P1,NDQFPT ; No, use tabs
|
||
FLOP: MOVE P2,(P1) ; Get addr of format block
|
||
HLRZ T1,1(P2) ; Get address of text
|
||
PUSHJ P,.TSTRG## ; Type it out
|
||
LDB T1,0(P2) ; Get data from block
|
||
JUMPN T1,FLOP.1 ; Are we non-zero?
|
||
MOVX T3,FO.SIZ ; No, get flag
|
||
TDNE T3,(P1) ; Should we suppress zeros??
|
||
JRST FLOP.2 ; Yes, skip rest of field
|
||
FLOP.1: HRRZ T2,1(P2) ; Get routine for printing
|
||
PUSHJ P,(T2) ; Print out data
|
||
FLOP.2: AOBJN P1,FLOP ; Loop till we have printed the whole thing
|
||
POPJ P,
|
||
|
||
NODRCH: JUMPE T1,NODR.1 ; Is bit on?
|
||
MOVEI T1,[ASCIZ |Reachable|] ; Bit is on, we are reachable
|
||
PJRST .TSTRG## ; Type it out
|
||
NODR.1: POP P,(P) ; Pop call off of stack
|
||
MOVEI T1,[ASCIZ |Unreachable|] ; Bit is off, we are unreachable
|
||
PJRST .TSTRG## ; Type it out
|
||
|
||
NODPHA: CAIN T1,2 ; Is it a phase II node??
|
||
POPJ P, ; Yes, leave it alone
|
||
MOVEI T1,"I" ; No, gotta print one more I
|
||
PJRST .TCHAR## ; ...
|
||
|
||
NODCIR: PUSHJ P,.SAVE2## ; Save P1 and P2
|
||
MOVE P1,DNARG+.DNBOC ; Get circuit id length back
|
||
MOVE P2,DNARG+.DNBOC+1 ; Get circuit pointer back
|
||
NODC.2: SOJL P1,.POPJ ; Return if no more to type out
|
||
ILDB T1,P2 ; Get a byte from the string
|
||
PUSHJ P,.TCHAR## ; Type it out
|
||
JRST NODC.2 ; And keep on truckin
|
||
|
||
;NODDET: MOVEM T1,DNARG+.DNBNN ; Put node name into arg list
|
||
MOVEI T1,CIRLEN ; Get length of circuit id buffer
|
||
MOVEM T1,DNARG+.DNBOC ; Install it
|
||
MOVEI T1,DNARG ; Get arg for DNET.
|
||
DNET. T1, ; Read detailed info about the node
|
||
ERROR(UDN,Undefined Node Name)
|
||
MOVE T1,DNARG+.DNBNN ; Get node name back
|
||
PUSHJ P,TYPNNM ; Type it out
|
||
TXNN F,F.ODET ; Do we want great detail
|
||
JRST NODD.3 ; No, just print numbers in columns
|
||
MOVE T1,DNARG+.DNBNM ; Get node number back
|
||
PUSHJ P,TYPNNM ; Output it
|
||
MOVE T1,DNARG+.DNBRC ; Get reachability info
|
||
TXNN T1,DNB.RC ; Is the node reachable?
|
||
JRST NOTRCH ; No, skip all this crap
|
||
MOVEI T1,[ASCIZ | Reachable Hops=|] ; Get string
|
||
PUSHJ P,.TSTRG## ; Type it out
|
||
LDB T1,[POINTR DNARG+.DNBRC,DNB.HP] ; Get the hops
|
||
PUSHJ P,.TDECW## ; Type it out
|
||
MOVEI T1,[ASCIZ | Cost=|] ; Get string
|
||
PUSHJ P,.TSTRG## ; Type it out
|
||
LDB T1,[POINTR DNARG+.DNBRC,DNB.CS] ; Get the cost
|
||
PUSHJ P,.TDECW## ; Type it out
|
||
MOVEI T1,[ASCIZ | Links=|] ; Get string
|
||
PUSHJ P,.TSTRG## ; Type it out
|
||
LDB T1,[POINTR DNARG+.DNBLD,DNB.DL] ; Get active links
|
||
PUSHJ P,.TDECW## ; Type it out
|
||
MOVEI T1,[ASCIZ | Delay=|] ; Get string
|
||
PUSHJ P,.TSTRG## ; Type it out
|
||
LDB T1,[POINTR DNARG+.DNBLD,DNB.AL] ; Get delay
|
||
PUSHJ P,.TDECW## ; Type it out
|
||
MOVEI T1,[ASCIZ |(ms) Phase II|]
|
||
PUSHJ P,.TSTRG## ; Type it out
|
||
LDB T1,[POINTR DNARG+.DNBRC,DNB.NT] ; Get node type
|
||
CAIE T1,3 ; Is it a phase III ?
|
||
JRST NODD.1 ; No, skip this
|
||
MOVX T1,"I" ; Get the third I
|
||
PUSHJ P,.TCHAR## ; Type it out
|
||
NODD.1: PUSHJ P,.TSPAC## ; Type a space
|
||
NODD.5:; SKIPE DNARG+.DNBOL ; Is it the executor node??
|
||
; JRST NODD.2 ; No, print circuit id
|
||
; MOVEI T1,[ASCIZ |Local|] ; Get keyword
|
||
; PUSHJ P,.TSTRG## ; Type it out
|
||
; PJRST .TCRLF## ; And return
|
||
PUSHJ P,.SAVE2## ; Save P1 and P2
|
||
MOVE P1,DNARG+.DNBOC ; Get circuit id length back
|
||
MOVE P2,DNARG+.DNBOC+1 ; Get circuit pointer back
|
||
NODD.2: SOJL P1,.TCRLF## ; Jump of no more to type out
|
||
ILDB T1,P2 ; Get a byte from the string
|
||
PUSHJ P,.TCHAR## ; Type it out
|
||
JRST NODD.2 ; And keep on truckin
|
||
|
||
;NODD.2: LDB T1,[POINTR DNARG+.DNBOL,DNB.DV] ; Get device type
|
||
; MOVEI T1,DEVTAB(T1) ; Get address of string
|
||
; PUSHJ P,.TSTRG## ; Type it out
|
||
; LDB T1,[POINTR DNARG+.DNBOL,DNB.CN] ; Get controller number
|
||
; PUSHJ P,.TDECW## ; Type it out
|
||
; MOVX T1,"-" ; Get separator
|
||
; PUSHJ P,.TCHAR## ; Type it out
|
||
; LDB T1,[POINTR DNARG+.DNBOL,DNB.UN] ; Get the unit number
|
||
; PUSHJ P,.TDECW## ; Type it out
|
||
; PUSHJ P,.TCRLF## ; Type a <CRLF>
|
||
; POPJ P, ; And return
|
||
|
||
NOTRCH: MOVEI T1,[ASCIZ | Unreachable|] ; Get nasty message
|
||
PUSHJ P,.TSTRG## ; type it out
|
||
PJRST .TCRLF## ; And finish it up
|
||
; Here when we will be printing a bunch of nodes in detail. Just print a list
|
||
; of numbers.
|
||
|
||
NODD.3: PUSHJ P,.TTABC## ; Type a tab after the node name
|
||
MOVE T1,DNARG+.DNBNM ; Get node number back
|
||
PUSHJ P,.TDECW## ; Output it
|
||
MOVE T1,DNARG+.DNBRC ; Get reachability info
|
||
TXNN T1,DNB.RC ; Is the node reachable?
|
||
JRST NOTRCH ; No, skip all this crap
|
||
PUSHJ P,.TTABC## ; Type a tab
|
||
LDB T1,[POINTR DNARG+.DNBRC,DNB.HP] ; Get the hops
|
||
PUSHJ P,.TDECW## ; Type it out
|
||
PUSHJ P,.TTABC## ; Type a tab
|
||
LDB T1,[POINTR DNARG+.DNBRC,DNB.CS] ; Get the cost
|
||
PUSHJ P,.TDECW## ; Type it out
|
||
PUSHJ P,.TTABC## ; Type a tab
|
||
LDB T1,[POINTR DNARG+.DNBLD,DNB.DL] ; Get active links
|
||
PUSHJ P,.TDECW## ; Type it out
|
||
PUSHJ P,.TTABC## ; Type a tab
|
||
LDB T1,[POINTR DNARG+.DNBLD,DNB.AL] ; Get delay
|
||
PUSHJ P,.TDECW## ; Type it out
|
||
MOVEI T1,[ASCIZ | Phase II|]
|
||
PUSHJ P,.TSTRG## ; Type it out
|
||
LDB T1,[POINTR DNARG+.DNBRC,DNB.NT] ; Get node type
|
||
CAIE T1,3 ; Is it a phase III ?
|
||
JRST NODD.4 ; No, skip this
|
||
MOVX T1,"I" ; Get the third I
|
||
PUSHJ P,.TCHAR## ; Type it out
|
||
NODD.4: PUSHJ P,.TTABC## ; Type a space
|
||
JRST NODD.5 ; Go type out circuit
|
||
SUBTTL LNKDET Type out link info in detail
|
||
|
||
; This routine will type out all the info about a given link id in detail. It
|
||
; takes one argument in T1, which is the link id. If the bit DNL.NJ is set, it
|
||
; will print info about the NEXT link. On return T1 contains the link id that
|
||
; was just printed.
|
||
|
||
LNKDET: MOVEM T1,DNLINK+.DNFLG ; Install link id
|
||
MOVEI T1,DNLINK ; Get arg for uuo
|
||
DNET. T1, ; Read the info
|
||
HALT .
|
||
SKIPN DNLINK+.DNJOB ; Do we have a link??
|
||
POPJ P, ; No, we're done
|
||
HLRE T1,DNLINK+.DNJOB ; Get job number
|
||
JUMPL T1,LNKNRT ; Go type out stuff for a NRTSER link
|
||
LNKD.1: PUSH P,T1 ; Save job number for later
|
||
PUSHJ P,.TDECW## ; Type it out
|
||
PUSHJ P,.TSPAC## ; Type a tab
|
||
HRLZ T1,0(P) ; Get job number in right place
|
||
HRRI T1,.GTNM1 ; Get first part of name
|
||
GETTAB T1, ; Get the upper half of name
|
||
MOVE T1,['SILLY '] ; Get substitute
|
||
PUSHJ P,.TSIXS ; Type out first part of name
|
||
HRLZ T1,0(P) ; Get job number back
|
||
HRRI T1,.GTNM2 ; Get second part of name
|
||
GETTAB T1, ; Get lower half of name
|
||
MOVE T1,['PERSON'] ; Get substitute
|
||
PUSHJ P,.TSIXS ; Type it out
|
||
PUSHJ P,.TTABC## ; Type a tab
|
||
HRLZ T1,0(P) ; Get job number
|
||
HRRI T1,.GTPPN ; Get ppn
|
||
GETTAB T1, ; from monitor
|
||
SETO T1, ; Strange default
|
||
PUSH P,T1
|
||
PUSHJ P,.ALINM ; Print out alignment spaces
|
||
MOVE T1,(P) ; Restore PPN
|
||
PUSHJ P,.TXWDW## ; Type it out as a ppn
|
||
POP P,T1 ; Restore ppn
|
||
PUSHJ P,.TALIN ; Print out trailing spaces
|
||
MOVE T1,0(P) ; Get job number
|
||
TRMNO. T1, ; Get controlling tty number
|
||
SKIPA
|
||
JRST NODET
|
||
MOVEI T1,[ASCIZ |Det|] ; Get this indicator
|
||
PUSHJ P,.TSTRG## ; And type it out
|
||
JRST DETLAB ; Continue later
|
||
|
||
NODET: PUSH P,T1 ; Save tty number
|
||
MOVEI T1,[ASCIZ |TTY|] ; Get default
|
||
SKIPE NRTTTY ; Is this job on a NRTSER tty?
|
||
MOVEI T1,[ASCIZ |NRTSER_|] ; Yes, get label
|
||
SETZM NRTTTY ; Clear this for the next round
|
||
PUSHJ P,.TSTRG## ; Type it out
|
||
POP P,T1 ; Get back tty number
|
||
TXZ T1,.UXTRM ; Get rid of the UDX offset
|
||
PUSHJ P,.TOCTW## ; Type it out
|
||
DETLAB: PUSHJ P,.TTABC## ; Followed by a tab
|
||
HRLZ T1,0(P) ; Get job number
|
||
HRRI T1,.GTPRG ; Get program name
|
||
GETTAB T1, ; Get from monitor
|
||
SETZ T1,
|
||
PUSHJ P,.TSIXS ; Type it out
|
||
PUSHJ P,.TSPAC## ; ...
|
||
|
||
POP P,T1 ; Fix stack
|
||
HRRZ T1,DNLINK+.DNCHN ; Get channel number
|
||
LSH T1,^D30 ; Allow two digit field for alignment
|
||
PUSHJ P,.ALINM ; Type out alignment spaces
|
||
HRRZ T1,DNLINK+.DNCHN ; Get channel number
|
||
PUSHJ P,.TDECW## ; Type it out
|
||
PUSHJ P,.TSPAC## ; Type a space
|
||
MOVE T1,DNLINK+.DNNOD ; Get node name
|
||
PUSHJ P,.TSIXS ; Type it out
|
||
PUSHJ P,.TSPAC## ; Type out a space
|
||
HLRZ T1,DNLINK+.DNOBJ ; Get dest object
|
||
PUSHJ P,.TDECW## ; Type it out
|
||
PUSHJ P,.TTABC## ; Type a tab
|
||
HRRZ T1,DNLINK+.DNOBJ ; Get source object
|
||
PUSHJ P,.TDECW## ; Type it out
|
||
PUSHJ P,.TTABC## ; Type a tab
|
||
HRLZ T1,DNLINK+.DNSTA ; Get link status
|
||
PUSHJ P,.TSIXN## ; Type it out
|
||
PUSHJ P,.TCRLF## ; Type a crlf
|
||
LNKRET: SKIPE T1,DNLINK+.DNFLG
|
||
AOS (P)
|
||
POPJ P,
|
||
|
||
LNKNRT: MOVE T1,DNLINK+.DNJOB ; Get link id
|
||
MOVEM T1,DNTTY+.DNCHL ; Put it in DNET. arg block
|
||
MOVEI T1,DNTTY ; Get arg for DNET.
|
||
DNET. T1, ; Read tty number from monitor
|
||
JRST LNKRET
|
||
MOVE T1,DNTTY+.DNLIN ; Get line number
|
||
TXO T1,.UXTRM ; Make it into a UDX
|
||
DEVTYP T1, ; Get it's controlling job number
|
||
HALT .
|
||
LDB T1,[POINTR T1,TY.JOB] ; Get the job number
|
||
JUMPE T1,LNKRET ; Ignore not logged in TTY's for now
|
||
SETOM NRTTTY ; Set the "job is on a NRTSER tty" flag
|
||
JRST LNKD.1 ; And join the main stream
|
||
SUBTTL TYPNNM Type out a node name or number as appropriate
|
||
|
||
TYPNNM: TLNE T1,770000 ; Left justified??? (Ie: SIXBIT name)
|
||
PJRST .TSIXN## ; Yes, print out the entry in SIXBIT
|
||
|
||
PUSH P,T1 ; Save number for a moment
|
||
MOVEI T1,"(" ; Get left paren
|
||
PUSHJ P,.TCHAR## ; Print it
|
||
POP P,T1 ; Get node number back
|
||
PUSHJ P,.TDECW## ; Yes, print out node number
|
||
MOVEI T1,")" ; Get right paren
|
||
PJRST .TCHAR## ; Output it
|
||
|
||
.TSIXS: PUSHJ P,.SAVE2## ; Save P1 & P2
|
||
MOVE P1,T1 ; Save sixbit thingy in P1
|
||
MOVX P2,6 ; Get count in P2
|
||
TSIX.1: ROT P1,6 ; Put first byte into place
|
||
MOVE T1,P1 ; Get the sixbit word
|
||
ANDI T1,77 ; Just get the char we are interested in
|
||
ADDI T1," " ; Make it ascii
|
||
PUSHJ P,.TCHAR## ; And type it out
|
||
SOJG P2,TSIX.1 ; Loop till done
|
||
POPJ P,
|
||
|
||
.ALINM: PUSHJ P,.SAVE1## ; Save some P's
|
||
MOVE P1,T1 ; Get number into safe place
|
||
ALIOOP: TLNE P1,700000 ; Do we have a digit
|
||
POPJ P, ; Yes, skip no more
|
||
PUSHJ P,.TSPAC## ; No, type a space
|
||
LSH P1,3 ; Shift over by one octal digit
|
||
JRST ALIOOP ; And keep on trying
|
||
|
||
.TALIN: PUSHJ P,.SAVE1## ; Save some P's
|
||
MOVE P1,T1 ; Get number into safe place
|
||
TLIOOP: TRNE P1,700000 ; Do we have a digit
|
||
POPJ P, ; Yes, skip no more
|
||
PUSHJ P,.TSPAC## ; No, type a space
|
||
LSH P1,3 ; Shift over by one octal digit
|
||
JRST TLIOOP ; And keep on trying
|
||
SUBTTL Typeout routines
|
||
|
||
; Typeout initialization routine. Call after calling .ISCAN
|
||
|
||
TYPINI: MOVEI T1,TOSIZ/5+1 ; Get number of words in tty buffer
|
||
PUSHJ P,GETWDS ; Get some memory
|
||
MOVEM T1,TOBUF ; Save the buffer pointer
|
||
PUSHJ P,TYPSET ; Set up the buffer pointers
|
||
MOVEI T1,TYPCHR ; Get routine to buffer characters
|
||
PJRST .TYOCH## ; Tell SCAN about it
|
||
|
||
; Type the character in T1. May destroy T1
|
||
|
||
TYPCHR: IDPB T1,TOPTR ; Install the byte
|
||
SOSLE TOREM ; Do we need to empty the buffer???
|
||
POPJ P, ; No, punt
|
||
|
||
; Flush the output buffer
|
||
|
||
TYPOUT: MOVE T1,TOREM ; Get number of characters left
|
||
SUBI T1,TOSIZ ; Get number of characters to print out
|
||
JUMPE T1,.POPJ ; Return if nothing
|
||
SETZ T1, ; Get a zero
|
||
IDPB T1,TOPTR ; To tie off the buffer
|
||
OUTSTR @TOBUF ; Dump the buffer
|
||
TYPSET: MOVEI T1,TOSIZ ; Get size of buffer
|
||
MOVEM T1,TOREM ; Install it
|
||
MOVX T1,<POINT 7,> ; Get pointer to buffer
|
||
HRR T1,TOBUF ; Get start of buffer
|
||
MOVEM T1,TOPTR ; Install it
|
||
POPJ P, ; And return
|
||
SUBTTL GETBYT Get a byte from the BIGBUF
|
||
|
||
;GETBYT: SOSGE CURBYT ; Got enough bytes???
|
||
; POPJ P, ; Nope, die
|
||
; ILDB CH,CURPOS ; Get the next byte
|
||
.POPJ1: AOS (P) ; Prepare for
|
||
.POPJ: POPJ P, ; A skip return!
|
||
SUBTTL REDXTR Read info about the executor node
|
||
|
||
REDXTR: MOVX T1,%CNST2 ; Go check the
|
||
GETTAB T1, ; DECNET feature test
|
||
SETZ T1, ; No gettab, no DECnet
|
||
TXNN T1,ST%D36 ; DECNET in this monitor?
|
||
ERROR(MND,Monitor does not have DECnet)
|
||
MOVX T2,<.DNRLI,,4> ; Read local node info
|
||
MOVEI T1,T2 ; Get arg for DNET.
|
||
DNET. T1, ; Read info about the executor
|
||
ERROR(CRE,Can't read executor information)
|
||
MOVEM T2+.DNBNN,NAMXTR ; Store the node name
|
||
MOVEM T2+.DNMXN,MAXNOD ; Store the largest node number
|
||
|
||
POPJ P, ; And return
|
||
SUBTTL REDLIS Read a list of nodes (Known or Active)
|
||
|
||
; REDLIS will read either all active nodes or all known nodes based upon the
|
||
; setting of F.ACT. It will return a pointer to a list of SIXBIT node names
|
||
; in T1 and the length of the list in T2. The list will also be compared
|
||
; against the constraint string (if it exists), and only those nodes that
|
||
; match will be returned.
|
||
;
|
||
; Call: PUSHJ P,REDLIS ; Takes no arguments
|
||
; <Return +1> ; No nodes were returned. T2 will be zero
|
||
; <Return +2> ; Some nodes were returned. T2 has the number
|
||
|
||
|
||
REDLIS: TXNE F,F.STR ; Complement constraint string bit
|
||
TXNE F,F.WILD ; An unwildcarded string???
|
||
SKIPA ; No to either
|
||
JRST REDL.4 ; Yes, return list of one item
|
||
|
||
PUSHJ P,.SAVE3## ; Save a P
|
||
MOVE T1,MAXNOD ; Get maximum number of nodes
|
||
ADDI T1,.DNBCT+1 ; Count of nodes and function header
|
||
MOVE P1,T1 ; Save arg block size for later
|
||
PUSHJ P,GETWDS ; Go get the memory
|
||
HRLI P1,.DNLAN ; Get "List Active Nodes" function code
|
||
TXNN F,F.ACT ; Do we want active nodes??
|
||
HRLI P1,.DNLKN ; No, list known nodes
|
||
MOVEM P1,.DNBFL(T1) ; Put func code in the arg block
|
||
DNET. T1, ; Get list of nodes
|
||
ERROR (CRL,Can't read list of nodes)
|
||
MOVE T2,.DNBCT(T1) ; Get number of nodes returned in T2
|
||
ADDI T1,.DNBCT+1 ; Make T1 point to start of nodes
|
||
JUMPE T2,.POPJ ; No nodes, quit now
|
||
; Now we will compare each node against the constraint string, throwing out
|
||
; those entries which don't match.
|
||
|
||
DMOVE P1,T1 ; P1/ list of nodes, P2/ number of nodes
|
||
SKIPN WLDSIZ ; Any wildcard string specified??
|
||
JRST .POPJ1 ; No, give successful return
|
||
PUSH P,P1 ; Save node list pointer
|
||
MOVN T1,P2 ; Get negative number of nodes
|
||
MOVE P2,P1 ; Get copy of node list pointer
|
||
HRL P1,T1 ; Make AOBJN pointer
|
||
|
||
REDL.3: MOVE T1,(P1) ; Get a node from the source list
|
||
PUSHJ P,WLDSIX ; Does this name match???
|
||
JRST REDL.2 ; No, go on to next entry
|
||
MOVE T1,(P1) ; Get name back again
|
||
MOVEM T1,(P2) ; Save name
|
||
AOJ P2, ; Bump destination pointer
|
||
REDL.2: AOBJN P1,REDL.3 ; Jump if there are some nodes left
|
||
|
||
POP P,P1 ; Get back start of list
|
||
SUB P2,P1 ; Compute number of nodes left
|
||
MOVE T1,P1 ; Move pointer to node list into T1
|
||
SKIPE T2,P2 ; Move count of nodes into T2
|
||
AOS (P) ; Skip return if any nodes
|
||
POPJ P, ; Non-skip if no nodes matched
|
||
|
||
; Here if we got a constraint string with no wildcards. We interpret this
|
||
; as meaning that the user wants detailed info about that one node, and we
|
||
; set up the flags accordingly.
|
||
|
||
REDL.4: TXO F,F.DET ; Type out this one node in great detail
|
||
PUSHJ P,.SAVE1## ; Save a P
|
||
MOVEI T1,1 ; Get a word for the node name
|
||
PUSHJ P,GETWDS ; Get the memory
|
||
MOVE P1,T1 ; Save pointer
|
||
MOVE T1,WLDPTR ; Get pointer to constraint string
|
||
MOVE T2,WLDSIZ ; Get size of string
|
||
PUSHJ P,CNVA26 ; Convert it to SIXBIT
|
||
MOVEM T1,(P1) ; Save result
|
||
MOVE T1,P1 ; Get list pointer into T1
|
||
MOVEI T2,1 ; Get number of nodes into T2
|
||
JRST .POPJ1 ; And return happily
|
||
SUBTTL SORTEM Sort routine
|
||
|
||
; SORTEM will sort a list of SIXBIT items. The list pointer should be in T1,
|
||
; and the list length should be in T2. The items will be sorted in ascending
|
||
; or descending order depending upon the setting of F.SBKW.
|
||
|
||
SORTEM: PUSHJ P,.SAVE4## ; Save some P's
|
||
DMOVE P1,T1 ; Get pointer and list length in safe place
|
||
PUSH P,P1 ; Save list pointer for later
|
||
MOVE T1,[CAMLE T1,0(T2)] ; Current item .LE. leaf???
|
||
TXNE F,F.SBKW ; Sort backwards???
|
||
MOVE T1,[CAMG T1,0(T2)] ; Yes, reverse the comparison instruction
|
||
MOVEM T1,SRTCMP ; Save the comparison instruction
|
||
MOVEI T1,2 ; Get number of words per node
|
||
PUSHJ P,GETWDS ; Get some memory
|
||
SETZM 1(T1) ; Zero out pointers
|
||
MOVEM T1,TREPTR ; Save first entry as top of tree
|
||
MOVE T1,0(P1) ; Get first entry
|
||
AOJ P1, ; Bump source pointer to skip first entry
|
||
TLC T1,400000 ; Invert sign bit to force unsigned compares
|
||
MOVEM T1,@TREPTR ; Kludge up the first entry
|
||
|
||
; Here for each item to be sorted
|
||
|
||
INSLOP: SOJLE P2,SRTOUT ; Jump if no more nodes left
|
||
MOVE T3,TREPTR ; Get top of sorting tree
|
||
MOVE T1,(P1) ; Get next node in list
|
||
AOJ P1, ; Increment the pointer
|
||
TLC T1,400000 ; Invert sign bit to force unsigned compares
|
||
|
||
; Here when we have to look at the next leaf pointed to by T3
|
||
|
||
SRTNXT: MOVE T2,T3 ; Make next leaf = current leaf
|
||
SETZ T4, ; Prepare for left hand maneuvers
|
||
XCT SRTCMP ; Current .RELOP. leaf???
|
||
MOVEI T4,1 ; No, - right hand maneuvers
|
||
|
||
; Now its time to see if we reached the end of the branch
|
||
|
||
XCT SRTXC1(T4) ; Get pointer to next leaf
|
||
JUMPN T3,SRTNXT ; In use, keep looking
|
||
|
||
; We reached the end, generate a new leaf
|
||
|
||
PUSH P,T1
|
||
PUSH P,T2
|
||
MOVEI T1,2
|
||
PUSHJ P,GETWDS
|
||
SETZM 1(T1) ; Zero out pointers
|
||
MOVE T3,T1
|
||
POP P,T2
|
||
POP P,T1
|
||
|
||
; MOVE T3,SRTWRD ; Get number of words available
|
||
; SUBI T3,2 ; Correct the count
|
||
; SKIPGE T3 ; Do we have enough???
|
||
; HALT . ; No, barf
|
||
; MOVEM T3,SRTWRD ; Put back the count
|
||
; MOVEI T3,2 ; Get correction factor
|
||
; ADDB T3,SRTPOS ; Get new addr & correct for it
|
||
|
||
XCT SRTXC2(T4) ; Point to new leaf
|
||
MOVEM T1,0(T3) ; Install name in new leaf
|
||
JRST INSLOP ; And go get next item
|
||
|
||
SRTXC1: HLRZ T3,1(T2) ; Get pointer to left hand leaf
|
||
HRRZ T3,1(T2) ; Get pointer to right hand leaf
|
||
|
||
SRTXC2: HRLM T3,1(T2) ; Point to new leaf
|
||
HRRM T3,1(T2) ; Point to new leaf
|
||
SUBTTL SRTOUT Output sorted nodes
|
||
|
||
SRTOUT: MOVE T2,TREPTR ; Get start of tree
|
||
POP P,P1 ; Restore start of node list
|
||
|
||
; Here is where the recursion starts -- watch out
|
||
|
||
SRTRCR: HLRZ T1,1(T2) ; Get the left hand - lesser nodes
|
||
SKIPN T1 ; Did we hit the end of the branch???
|
||
JRST SRTOU1 ; Yes, output this leaf
|
||
HRLM T2,(P) ; Save T2 from recursion
|
||
MOVE T2,T1 ; Get pointer to next branch
|
||
PUSHJ P,SRTRCR ; Recurse away! Stripping the lefties!
|
||
HLR T2,(P) ; Restore the left leaf pointer
|
||
SRTOU1: MOVE T1,0(T2) ; Get the node name
|
||
TLC T1,400000 ; Restore the proper node name
|
||
MOVEM T1,(P1) ; Put item back in node list
|
||
AOJ P1, ; Increment the pointer
|
||
|
||
HRRZ T1,1(T2) ; Get the right hand - lesser nodes
|
||
SKIPN T1 ; Did we hit the end of the branch???
|
||
POPJ P, ; Yes, pop up a level
|
||
|
||
HRLM T2,(P) ; Save T2 from recursion
|
||
MOVE T2,T1 ; Get pointer to next branch
|
||
PUSHJ P,SRTRCR ; Recurse away! Stripping the righties!
|
||
HLR T2,(P) ; Restore the right leaf pointer
|
||
POPJ P, ; And return
|
||
SUBTTL WLDCMP Do a Wildcard string comparison
|
||
|
||
; Call:
|
||
; MOVX AP,<non-wildcarded string pointer>
|
||
; MOVX AL,<non-wildcarded string length>
|
||
; MOVX BP,<wildcarded string pointer>
|
||
; MOVX BL,<wildcarded string length>
|
||
; PUSHJ P,WLDCMP
|
||
; <+1 Strings don't match>
|
||
; <+2 Strings match>
|
||
|
||
WLDCMP: ADJSP P,4 ; Make room for recursive info
|
||
DMOVEM AP,-3(P) ; Save AP & AL
|
||
DMOVEM BP,-1(P) ; Save BP & BL
|
||
WLDLOP: SOJL BL,CHKEND ; Jump if we reached end of wild string
|
||
ILDB T1,BP ; Get a char from the wildcard string
|
||
CAIN T1,"*" ; Is it a wildcard???
|
||
JRST WLDRCR ; Yes, then do our recursive thing
|
||
CAIN T1,"?" ; Is it a place holder???
|
||
JRST WLDSKP ; Yes, skip one in the primary
|
||
SOJL AL,RPOPJ ; If primary just ended, we have no match
|
||
ILDB T2,AP ; Get a char from the non-wildcarded string
|
||
CAMN T1,T2 ; Do the characters match???
|
||
JRST WLDLOP ; Yes, keep looping
|
||
JRST RPOPJ ; No, Give a non-skip return
|
||
RPOPJ1: AOS -4(P) ; Skip return
|
||
RPOPJ: DMOVE AP,-3(P) ; Restore AP & AL
|
||
DMOVE BP,-1(P) ; Restore BP & BL
|
||
ADJSP P,-4 ; Fix the stack
|
||
POPJ P, ; And return
|
||
|
||
; Here when we run out of wilcard string, if no more primary, we are happy
|
||
CHKEND: SOJL AL,RPOPJ1 ; Return happy if primary ended here also
|
||
JRST RPOPJ ; Punt, primary too long
|
||
|
||
; Here when we see a *, call ourself recursively until we run out of primary
|
||
WLDRCR: PUSHJ P,WLDCMP ; Do the comparison
|
||
SKIPA ; Skip if we lost
|
||
JRST RPOPJ1 ; It compared, return happily
|
||
SOJL AL,RPOPJ ; Jump if we ran out of primary
|
||
IBP AP ; Advance the primary (non-wildcarded) pointer
|
||
JRST WLDRCR ; And try again
|
||
|
||
; Here when we see a ?, skip one in the primary and jump back into the loop
|
||
WLDSKP: SOJL AL,RPOPJ ; Decrement the primary by one
|
||
IBP AP ; Increment the pointer
|
||
JRST WLDLOP ; And jump back into the fray
|
||
SUBTTL CNV826 Convert 8 bit ASCII to SIXBIT
|
||
|
||
CNVA26: MOVE T3,[POINT 6,T4] ; Get byte pointer to destination
|
||
SETZ T4, ; Clear destination
|
||
CNVLOP: ILDB CH,T1 ; Get an ASCII byte
|
||
MOVEI CH,-" "(CH) ; Make it SIXBIT
|
||
IDPB CH,T3 ; Deposit it
|
||
SOJG T2,CNVLOP ; Jump till done
|
||
MOVE T1,T4 ; Get it where we want it
|
||
POPJ P,
|
||
|
||
REPEAT 0,<
|
||
CNV826: MOVE T2,T1 ; Get source string pointer
|
||
ILDB T1,T2 ; Get source string length
|
||
MOVEI T4,6 ; Get destination string length
|
||
MOVE P1,[POINT 6,T3] ; Get destination string pointer
|
||
EXTEND T1,[MOVSO -" " ; MOVe String Offset
|
||
0] ; 0 is the fill
|
||
HALT .
|
||
MOVE T1,T3 ; Get it where we want it
|
||
POPJ P,
|
||
>
|
||
|
||
WLDSIX: MOVE T2,[POINT 7,ASCBUF] ; Get pointer to ASCII buffer
|
||
MOVE AP,T2 ; Get pointer to non-wildcarded string
|
||
PUSHJ P,CNV62A ; Convert T1 to ASCIZ
|
||
MOVE AL,T4 ; Get number of chars in string
|
||
MOVE BP,WLDPTR ; Get BP to wildcarded string
|
||
MOVE BL,WLDSIZ ; Get size of wildcarded string
|
||
PJRST WLDCMP ; Go do comparison
|
||
|
||
; Call: PUSHJ P,CNV62A ; Convert SIXBIT to ASCIZ
|
||
; T1/ SIXBIT word
|
||
; T2/ Byte pointer to ASCII buffer
|
||
;
|
||
|
||
CNV62A: DMOVE T2,T1 ; Get pointer to ascii buffer
|
||
SETZB T1,T4 ; Zero out receiving buffer, and char count
|
||
CNV6.1: LSHC T1,6 ; Load a character into T1
|
||
JUMPE T1,.POPJ ; Jump if we are done
|
||
ADDI T1," " ; Convert to ASCII
|
||
IDPB T1,T3 ; Save it
|
||
SETZ T1, ; Zapp T1 so we get a clean LSH
|
||
AOJA T4,CNV6.1 ; Increment number of bytes seen so far
|
||
SUBTTL PRT8I Print out an 8 bit node ID
|
||
|
||
; Call: MOVE T1,[byte pointer] ;Pointer to standard DECnet node ID
|
||
; PUSHJ P,PRT8I ; Print it out
|
||
; <Return +1> ; Always
|
||
|
||
REPEAT 0,<
|
||
PRT8I: PUSH P,P1 ; Preserve this
|
||
MOVE P1,T1 ; Save the byte pointer
|
||
ILDB T2,P1 ; Get the length byte
|
||
PRTLOP: ILDB T1,P1 ; Get the next byte
|
||
OUTCHR T1 ; Output it
|
||
SOJG T2,PRTLOP ; Loop until done
|
||
MOVE T1,P1 ; Get back the byte pointer for later
|
||
POP P,P1 ; ...
|
||
POPJ P,
|
||
> ; END OF REPEAT 0
|
||
SUBTTL GETWDS Allocate words of memory
|
||
|
||
GETWDS: ADD T1,.JBFF ; Compute address of new .JBFF
|
||
MOVEI T2,-1(T1) ; Get address of last loc needed
|
||
CAMLE T2,.JBREL ; Any room left???
|
||
JRST GETCOR ; No, try for more
|
||
EXCH T1,.JBFF ; Swap new with the old
|
||
POPJ P, ; And return happily
|
||
|
||
GETCOR: CORE T2, ; Try to get the memory
|
||
ERROR (NEM,Not enough memory)
|
||
EXCH T1,.JBFF ; Swap new with the old
|
||
POPJ P,
|
||
SUBTTL WRNRTN and ERRDIE Error handling routines
|
||
|
||
WRNRTN: PUSHJ P,.PSH4T## ; Save all the important acs
|
||
MOVE T3,@-4(P) ; Get the instruction after PUSHJ to us
|
||
LDB T4,[POINT 9,T3,8] ; Get the opcode
|
||
CAIE T4,JUMP_-^D27 ; Is it a jump?
|
||
HALT . ; No, die horribly
|
||
MOVE T1,0(T3) ; Get first arg for .ERMSG
|
||
MOVE T2,1(T3) ; Get second arg for .ERMSG
|
||
PUSHJ P,.ERMSG## ; Call the processor
|
||
PUSHJ P,.POP4T## ; Restore the world
|
||
POPJ P,
|
||
|
||
ERRDIE: PUSHJ P,.ERMSG## ; Issue the error message
|
||
PUSHJ P,.CLRBF## ; Clear typeahead
|
||
JRST FINI.1 ; Go flush the buffers
|
||
SUBTTL SCNLIN Scan the command line, looking for switches and such
|
||
|
||
SCNLIN: MOVE T1,[POINT 7,WLDSTR] ; Get pointer to wild card storage
|
||
MOVEM T1,WLDPTR ; Save it
|
||
MOVEI T1,WLDLEN ; Get length of wild string
|
||
MOVEM T1,WLDSIZ ; Store it
|
||
MOVE T1,QSCARG ; Get arg for .QSCAN
|
||
PUSHJ P,.QSCAN## ; Init the scanner
|
||
JRST SCNFIN ; No more to come, punt
|
||
SCNLOP: PUSHJ P,.TIAUC## ; Get one char, handling lower case, etc...
|
||
SCNL.1: JUMPLE C,SCNFIN ; Return if done
|
||
CAIN C,"/" ; Switch coming up???
|
||
JRST SWTLOP ; Yes, go handle it
|
||
CAIN C," " ; Is it a space?
|
||
JRST SCNLOP ; Yes, ignore it
|
||
PUSHJ P,CHKWLD ; Could it be part of the wild string??
|
||
ERROR(ILC,Illegal character in command line)
|
||
|
||
TXOE F,F.STR ; Have we been here before??
|
||
ERROR(MOW,More than one wildcard string specified)
|
||
JRST SCNI.1 ; Jump into the fray
|
||
|
||
SCNI.2: PUSHJ P,.TIAUC## ; Get the next character
|
||
SCNI.1: PUSHJ P,CHKWLD ; Is it legal??
|
||
JRST SCNL.1 ; No, give it back to the main loop
|
||
SCNINP: SOSL WLDSIZ ; Is there any room???
|
||
IDPB C,WLDPTR ; Yes, stuff it in
|
||
JRST SCNI.2 ; And keep on looping
|
||
|
||
CHKWLD: PUSHJ P,.TICAN## ; Is it alphanumeric??
|
||
SKIPA ; No, check for wild stuff
|
||
JRST .POPJ1 ; Yes, return happilt
|
||
CAIE C,"*" ; Is it a * ???
|
||
CAIN C,"?" ; Or a ? ???
|
||
TXOA F,F.WILD ; Yes, skip and flag it
|
||
POPJ P, ; No, no skip
|
||
JRST .POPJ1 ; And return happily
|
||
|
||
SWTLOP: PUSHJ P,.KEYWD## ; Call the scanner
|
||
ERROR(NSS,No switch specified)
|
||
JRST SCNL.1 ; Go back for more
|
||
|
||
SCNFIN: MOVEI T1,WLDLEN ; Get current size of wild buffer
|
||
SUBM T1,WLDSIZ ; Make it into the string size
|
||
MOVE T1,[POINT 7,WLDSTR] ; Get a new byte pointer
|
||
MOVEM T1,WLDPTR ; Install it
|
||
|
||
MOVE T1,OSCARG ; Get arg for .OSCAN
|
||
PUSHJ P,.OSCAN## ; Read BITCH.INI
|
||
|
||
IORX F,F.DEFAULT ; Get the default flag settings
|
||
ANDCM F,M.FLAG ; F now contains flags we should set
|
||
IORB F,V.FLAG ; Or in the flags that were set already
|
||
|
||
; MOVX T1,.NTACT ; Get the default
|
||
; TXNN F,F.ACT ; /ACTIVE specified???
|
||
; MOVX T1,.NTKNO ; No, must be /KNOWN
|
||
; MOVEM T1,NTARG+.NTSEL ; Install the value
|
||
|
||
SKIPL T1,FLSORT ; /SORT specified???
|
||
JRST SCNF.1 ; Yes, go set up flags
|
||
TXO F,F.SORT ; No, heres the default
|
||
JRST .POPJ ; and we're done
|
||
|
||
SCNF.1: CAIN T1,SORTNO ; /NOSORT or /SORT:no???
|
||
POPJ P, ; Yup, we're all done
|
||
CAIN T1,SORTBA ; /SORT:BACKWARDS ???
|
||
TXO F,F.SBKW ; Yes, set the flag
|
||
TXO F,F.SORT ; Turn on the sorting flag in any case
|
||
POPJ P, ; and return
|
||
SUBTTL Tables for SCAN
|
||
|
||
ISCARG: XWD ISCLEN,ISCBLK ; AC for call to .ISCAN
|
||
|
||
ISCBLK: IOWD MONCLN,MONCMD ; Point to CCL names
|
||
XWD 0,'NET' ; Define NETxxx and no CCL entry
|
||
XWD 0,0 ; No special I/O routines
|
||
XWD 0,0 ; No ccl files
|
||
XWD 0,0 ; No special prompt or monret routines
|
||
EXP FS.IFI ; Indirect files illegal
|
||
ISCLEN==.-ISCBLK
|
||
|
||
MONCMD: SIXBIT |NET| ; NET command
|
||
MONCLN==.-MONCMD
|
||
|
||
OSCARG: XWD OSCLEN,OSCBLK ; AC for call to .OSCAN
|
||
|
||
OSCBLK: IOWD SWTABL,SWTABN ; IOWD pointer to switch table
|
||
XWD SWTABD,SWTABM ; Default table, processor
|
||
XWD 0,SWTABP ; Pointers for storing
|
||
EXP 0 ; No help
|
||
SIXBIT |NET| ; Option name is NET
|
||
OSCLEN==.-OSCBLK
|
||
|
||
QSCARG: XWD QSCLEN,QSCBLK ; AC for call to .QSCAN
|
||
|
||
QSCBLK: IOWD SWTABL,SWTABN ; IOWD pointer to switch table
|
||
XWD SWTABD,SWTABM ; Default table, processor
|
||
XWD 0,SWTABP ; Pointers for storing
|
||
EXP 0 ; No help
|
||
QSCLEN==.-QSCBLK
|
||
|
||
DEFINE SWTCHS,< ; Define switch tables
|
||
|
||
; SS LONG,<POINTR (V.FLAG,F.LONG)>,1,FS.OBV
|
||
; SS SHORT,<POINTR (V.FLAG,F.LONG)>,0,FS.OBV
|
||
SS ACTIVE,<POINTR (V.FLAG,F.ACT)>,1
|
||
SS KNOWN,<POINTR (V.FLAG,F.ACT)>,0
|
||
; SS NODNUM,<POINTR (V.FLAG,F.NNUM)>,1,FS.OBV
|
||
SS NOSORT,FLSORT,SORTNO
|
||
SL SORT,FLSORT,SORT,SORTFO
|
||
SN DETAIL,<POINTR (V.FLAG,F.DET)>
|
||
; SS LINES,NTARG+.NTENT,.NTLIN
|
||
; SS CIRCUITS,NTARG+.NTENT,.NTCKT
|
||
SS LINKS,<POINTR (V.FLAG,F.LINK)>,1,FS.OBV
|
||
>
|
||
|
||
KEYS(SORT,<FORWARD,BACKWARD,NOSORT>)
|
||
|
||
DOSCAN (SWTAB) ; Create the switch tables
|
||
SUBTTL LOWSEG Storage for NET
|
||
|
||
RELOC 0 ; Put this in the lowseg
|
||
|
||
; SCAN storage
|
||
|
||
V.FLAG: 0 ; Flag values
|
||
M.FLAG: 0 ; Flag mask
|
||
FLSORT: -1
|
||
|
||
THARG: 2,,.+1 ; AC for TRMOP.
|
||
EXP .TOPSZ ; Height of terminal
|
||
EXP -1 ; For this terminal
|
||
|
||
TWARG: 2,,.+1 ; AC for TRMOP.
|
||
EXP .TOWID ; Get terminal width
|
||
EXP -1 ; For my terminal
|
||
|
||
SNCTTY: 3,,.+1 ; AC for TRMOP.
|
||
EXP .TOSTC+.TOSET ; Set number of lines in which to halt output
|
||
EXP -1 ; For this terminal
|
||
EXP 30 ; ...
|
||
|
||
DNARG: .DNNDI,,7 ; Return detailed node info
|
||
BLOCK 4
|
||
EXP CIRLEN ; Length of circuit string
|
||
POINT 7,CIRBUF ; Pointer to where to put circuit id for node
|
||
|
||
CIRBUF: BLOCK 3 ; Area for circuit id
|
||
CIRLEN==<.-CIRBUF>*5-1 ; Number of chars in CIRBUF
|
||
|
||
DNLINK: .DNLLS,,15
|
||
BLOCK 15
|
||
|
||
DNTTY: .DNLLC,,3
|
||
BLOCK 2
|
||
|
||
NRTTTY: BLOCK 1 ; -1 means we have NRTSER tty in LNKDET
|
||
|
||
REPEAT 0,<
|
||
NTARG: EXP NTLEN ; .NTCNT - # of words in arg block
|
||
EXP .NTNOD ; .NTENT - entity is nodes
|
||
EXP 0 ; .NTEID - no specific node
|
||
EXP .NTRET ; .NTFNC - return list of items
|
||
EXP .NTACT ; .NTSEL - show known nodes
|
||
EXP 0 ; .NTQUA - no X.25 qualifier
|
||
POINT 8,BIGBUF ; .NTBPT - pointer to big buffer
|
||
EXP BIGSIZ ; .NTBYT - size of bugbuf
|
||
EXP 0 ; .NTERR - return code
|
||
NTLEN==.-NTARG
|
||
|
||
BIGSIZ==^D512*3 ; 512 nodes @ 3 bytes apiece
|
||
BIGBUF: BLOCK BIGSIZ/4+1 ; Main data buffer
|
||
CURPOS: BLOCK 1 ; Current position within BIGBUF
|
||
CURBYT: BLOCK 1 ; Number of bytes left within BIGBUF
|
||
|
||
MAPARG: EXP MAPLEN
|
||
EXP .NTNOD ; Mapping nodes
|
||
EXP 0 ; No specific entity ID
|
||
EXP .NTMAP ; Map node number to node name
|
||
EXP 0 ; No class of entities
|
||
EXP 0
|
||
POINT 8,MAPBUF ; Pointer to mapbuffer
|
||
EXP MAPSIZ ; Size of map buffer
|
||
EXP 0
|
||
MAPLEN==.-MAPARG
|
||
|
||
MAPSIZ==9 ; 2 byte node number + 6 byte I field
|
||
MAPBUF: BLOCK MAPSIZ/4+1 ; Holds data for mappings
|
||
|
||
REXARG: EXP REXLEN ; .NTCNT - # of words in arg block
|
||
EXP 0 ; .NTENT
|
||
EXP 0 ; .NTEID
|
||
EXP .NTREX ; .NTFNC - return executor id
|
||
EXP 0 ; .NTSEL
|
||
EXP 0 ; .NTQUA
|
||
POINT 8,BIGBUF ; .NTBPT - pointer to big buffer
|
||
EXP BIGSIZ ; .NTBYT - size of bugbuf
|
||
EXP 0 ; .NTERR - return code
|
||
REXLEN==.-REXARG
|
||
> ; End of REPEAT 0
|
||
|
||
STACK: BLOCK 100 ; Stack
|
||
STKLEN==.-STACK
|
||
|
||
TREPTR: BLOCK 1 ; Pointer to binary sorting tree
|
||
|
||
NAMXTR: BLOCK 1 ; Name of executor node
|
||
NUMXTR: BLOCK 1 ; Number of executor node
|
||
MAXNOD: BLOCK 1 ; Maximum number of nodes in network
|
||
SRTCMP: BLOCK 1 ; Comparison instruction for sorter
|
||
NODPLN: BLOCK 1 ; Number of nodes per line
|
||
TRMHIT: BLOCK 1 ; Terminal height
|
||
|
||
WLDSTR: BLOCK 10 ; Storage for wildcarded string
|
||
WLDPTR: BLOCK 1 ; Bytepointer to wildcarded string
|
||
WLDSIZ: BLOCK 1 ; Number of bytes in wildcarded string
|
||
WLDLEN==20
|
||
|
||
ASCBUF: BLOCK 2 ; Holds ASCIIzed SIXBIT for WLDSIX
|
||
|
||
TOBUF: BLOCK 1
|
||
TOREM: BLOCK 1
|
||
TOPTR: BLOCK 1
|
||
SUBTTL Literals
|
||
|
||
RELOC ; Put literals in the high seg
|
||
XLIST ; Don't list them
|
||
LIT ; Put literals right here
|
||
LIST ; Enable listing
|
||
|
||
END NET ; End of NET
|