1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-02-16 12:42:51 +00:00
Files
PDP-10.stacken/files/stacken-tape-backup/dskb:10_7/decnet/net/net.mac
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

1088 lines
36 KiB
Plaintext
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 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