Google
 

Trailing-Edge - PDP-10 Archives - BB-F493Z-DD_1986 - 10,7/dcnmcb/ngnprs.mac
There are 7 other files named ngnprs.mac in the archive. Click here to see a list.
;	TITLE	NGNPRS - NETGEN Parsing Tables and Support Routines
;		======

	SEARCH	NGNMAC

	INIGEN (NGNPRS)			; Initialize GLXLIB assembly options
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
;  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1980,1981,1982,1985,1986.
;ALL RIGHTS RESERVED.
;
;
;MODULE NGNPRS
;
;	SUMMARY OF EDIT HISTORY - FOR FULL DETAILS SEE MODULE NETGEN.MAC
;
;	EDIT #		DATE
;	46.		24Oct82
;
; Version 4.1
;
;	3		06Dec82
;	4		08dec82
;      13               23Feb83
;      15               23Feb83
;      29.		13Jul84
;      30.		26Jul84
;      32.		17Oct84
;      34.		26Nov84
;      35.		06Jan85
;      38.		15Jul85
;
;
;   DEFINE Parse Blocks
;
	EXT	<ENTBLK,PRMBLK,QUABLK,KEYFLG>

DEFSKP==:777777
;
; EVLIST (next-pdb) - Parse event list
;
DEFINE	EVLIST (NEXT,%A,%B,%C,%D,%E,%F,%G), <
	$DIGIT (%A,<^D10>,<Event Class>,<$PREFILL(EVLST1),$ACTION(CHKNUM)>)
%A:	$TOKEN (%B,<.>,<$DEFAULT(<.>)>)
%B:	$DIGIT (%C,<^D10>,<Event Type>,<$PREFILL(EVLST1),$ALTERNATE(%G),$ACTION(CHKNUM)>)
%C:	$TOKEN (%D,<->,<$HELP(<"-" To Specify Type Range>),$ALTERNATE(%E)>)
%D:	$DIGIT (%E,<^D10>,<Ending Type Range>,<$PREFILL(EVLST2),$ACTION(CHKNUM)>)
%E:	$COMMA (%F,<$HELP(<"," To Specify Additional Type>),$ALTERNATE(NEXT)>)
%F:	$DIGIT (%C,<^D10>,<Event Type>,<$PREFILL(EVLST2),$ACTION(CHKNUM)>)
%G:	$TOKEN (NEXT,<*>,<$HELP(<"*" To Specify All Types Of This Class>)>)
	IF2 <PURGE %A,%B,%C,%D,%E,%F,%G>
	>		      ; End of EVLIST Definition

EVLST1:	MOVEI	^D511
	SKIPA
EVLST2:	MOVEI	^D31
	MOVEM	NUMMAX
	MOVEI	^D0
	MOVEM	NUMMIN
	$RETT
;
; Common Break Mask Tables
;
HEXBRK::BRMSK. (-1,-1,-1,-1,0123456789ABCDEFabcdef) ; Hexadecimal field
DECBRK::BRMSK. (-1,-1,-1,-1,0123456789)	; Decimal field
CALBRK::BRMSK. (-1,-1,-1,-1,<*0123456789>) ; Call number field
;
; Mask for all printing characters. NOTE: Special handling is required for
; double quote (") and comma (,) characters. Two bits which were shifted left
; 33 and 23 positions in the second field are set to indicate (") and (,),
; respectively.
; BRMSK. calls UNBRK. with double quote as a delimiter which prevents use of
; that character in the string argument to this macro. Since both sets of
; quoting characters are used in the string comma must be specially handled
; lest it would be interpreted as an argument delimeter.
;
LITBRK::BRMSK. (FLDB0.,<FLDB1.&<^-<1_^D33!1_^D23>>>,FLDB2.,FLDB3.,!#$%&'()*+-./:;<=>?@[\]^_`{|}~)
;
; DEFINE	*	*	*	*	*	*	*
;
DEFPDB::$KEYDSP	(DEFTAB,$ACTION(ENT$BK))
DEFTAB:	$STAB
	DSPTAB	(DL0PDB,ENTCIR##,<Circuit>,KEYFLG)
	DSPTAB	(DF1PDB,ENTEXE##,<Executor>,KEYFLG)
	DSPTAB	(DFHPDB,KNOENT##,<Known>,KEYFLG)
	DSPTAB	(DL1PDB,ENTLIN##,<Line>,KEYFLG)
	DSPTAB	(DG3PDB,ENTLOG##,<Logging>,KEYFLG)
	DSPTAB	(DF5PDB,ENTMOD##,<Module>,KEYFLG)
	DSPTAB	(DG1PDB,ENTNOD##,<Node>,KEYFLG)
	DSPTAB	(DFVPDB,ENTPRO##,<Process>,KEYFLG)
	$ETAB

DL0PDB:	$FIELD	(DC1PDB,<<Circuit Id>>,<$ACTION(CHKFLD)>)

DL1PDB:	$FIELD	(DL2PDB,<<Line Id>>,<$ACTION(CHKFLD)>)

DG1PDB:	$NUMBER	(DG2PDB,^D10,<<Node Number, XXXXX to YYYYY>>,<$PREFILL(NODLIM),$ACTION(CHKNUM),$ERROR(NUMERR)>)

DFHPDB:	$KEYDSP	(DFHTAB,$ACTION(ENT$BK))
DFHTAB:	$STAB
	DSPTAB	(DFIPDB,ENTCIR##,<Circuits>,KEYFLG)
	DSPTAB	(DXIPDB,ENTLIN##,<Lines>,KEYFLG)
;	DSPTAB	(,ENTLOG##,<Logging>,KEYFLG)
;	DSPTAB	(,ENTMOD##,<Modules>,KEYFLG)
;	DSPTAB	(,ENTNOD##,<Nodes>,KEYFLG)
	$ETAB

DG3PDB:	$KEYDSP	(DG3TAB,$ACTION(ENT$BK))
DG3TAB:	$STAB
;	DSPTAB	(,LOGCON##,<Console>,KEYFLG)
	DSPTAB	(DG4PDB,LOGFIL##,<File>,KEYFLG)
;	DSPTAB	(,LOGMON##,<Monitor>,KEYFLG)
	$ETAB

DF5PDB:	$KEYDSP	(DF5TAB,$ACTION(ENT$BK))
DF5TAB:	$STAB
	DSPTAB	(DFJPDB,MODMCB##,<MCB-Executive>,KEYFLG)
	DSPTAB	(DFYPDB,MODRSX##,<RSX-Executive>,KEYFLG)
	DSPTAB	(DXMPDB,MODXPR##,<X25-Protocol>,KEYFLG)
	DSPTAB	(DXSPDB,MODXSR##,<X25-Server>,KEYFLG)
	$ETAB

DG2PDB:	$KEYDSP	(DG2TAB,$ACTION(PRM$BK))
DG2TAB:	$STAB
	DSPTAB	(DFCPDB,DNS14##,<Fence>,KEYFLG)
	$ETAB

DF1PDB:	$KEYDSP	(DF1TAB,$ACTION(PRM$BK))
DF1TAB:	$STAB
	DSPTAB	(DFCPDB,DN502##,<Address>,KEYFLG)
	DSPTAB	(DF9PDB,0,<Buffer>,KEYFLG)
	DSPTAB	(DFOPDB,DNS11##,<Circuit>,KEYFLG)
	DSPTAB	(DFAPDB,DN721##,<Delay>,KEYFLG)
	DSPTAB	(DFCPDB,DNS14##,<Fence>,KEYFLG)
	DSPTAB	(DFDPDB,DN100##,<Identification>,KEYFLG)
	DSPTAB	(DF2PDB,DN722##,<Inactivity>,KEYFLG)
	DSPTAB	(DF2PDB,DN510##,<Incoming>,KEYFLG)
	DSPTAB	(DF8PDB,0,<Management>,KEYFLG)
	DSPTAB	(DF3PDB,0,<Maximum>,KEYFLG)
	DSPTAB	(DFEPDB,DN500##,<Name>,KEYFLG)
	DSPTAB	(DFLPDB,0,<NSP>,KEYFLG)
	DSPTAB	(DFPPDB,DNS7##,<Open>,KEYFLG)
	DSPTAB	(DF2PDB,DN511##,<Outgoing>,KEYFLG)
	DSPTAB	(DFBPDB,DNS5##,<Receive>,KEYFLG)
	DSPTAB	(DF6PDB,DN723##,<Retransmit>,KEYFLG)
	DSPTAB	(DF2PDB,DN910##,<Routing>,KEYFLG)
	DSPTAB	(DFSPDB,DNS8##,<Segment>,KEYFLG)
	DSPTAB	(DFBPDB,DNS1##,<Transmit>,KEYFLG)
	$ETAB
DF2PDB:	$KEYDSP	(DF2TAB,<$ACTION(PRM$BK),$DEFAULT(Timer)>)
DF2TAB:	$STAB
	DSPTAB	(DFGPDB,DEFSKP,<Timer>,KEYFLG)
	$ETAB
DFSPDB:	$KEYDSP	(DFSTAB,<$ACTION(PRM$BK),$DEFAULT(Size)>)
DFSTAB:	$STAB
	DSPTAB	(NUMPDB,DEFSKP,<Size>,KEYFLG)
	$ETAB
DF3PDB:	$KEYDSP	(DF3TAB,$ACTION(PRM$BK))
DF3TAB:	$STAB
	DSPTAB	(DGCPDB,DN920##,<Address>,KEYFLG)
	DSPTAB	(NUMPDB,DN922##,<Cost>,KEYFLG)
	DSPTAB	(NUMPDB,DN923##,<Hops>,KEYFLG)
	DSPTAB	(NUMPDB,DN710##,<Links>,KEYFLG)
	DSPTAB	(DF4PDB,0,<Phase-II>,KEYFLG)
	DSPTAB	(DFPPDB,DNS9##,<Reserved>,KEYFLG)
	DSPTAB	(NUMPDB,DN924##,<Visits>,KEYFLG)
	$ETAB
DF4PDB:	$KEYDSP	(DF4TAB,<$ACTION(PRM$BK),$DEFAULT(Links)>)
DF4TAB:	$STAB
	DSPTAB	(NUMPDB,DNS0##,<Links>,KEYFLG)
	$ETAB
DFPPDB:	$KEYDSP	(DFPTAB,<$ACTION(PRM$BK),$DEFAULT(Ports)>)
DFPTAB:	$STAB
	DSPTAB	(NUMPDB,DEFSKP,<Ports>,KEYFLG)
	$ETAB
DF6PDB:	$KEYDSP	(DF6TAB,<$ACTION(PRM$BK),$DEFAULT(Factor)>)
DF6TAB:	$STAB
	DSPTAB	(NUMPDB,DEFSKP,<Factor>,KEYFLG)
	$ETAB
DF8PDB:	$KEYDSP	(DF8TAB,$ACTION(PRM$BK))
DF8TAB:	$STAB
	DSPTAB	(DFQPDB,DNS3##,<Account>,KEYFLG)
	DSPTAB	(DFNPDB,DNS4##,<Password>,KEYFLG)
	DSPTAB	(DFQPDB,DNS2##,<User>,KEYFLG)
	$ETAB
DF9PDB:	$KEYDSP	(DF9TAB,<$ACTION(PRM$BK),$DEFAULT(Size)>)
DF9TAB:	$STAB
	DSPTAB	(NUMPDB,DN931##,<Size>,KEYFLG)
	$ETAB
DFAPDB:	$KEYDSP	(DFATAB,$ACTION(PRM$BK))
DFATAB:	$STAB
	DSPTAB	(NUMPDB,DEFSKP,<Weight>,KEYFLG)
	$ETAB
DFBPDB:	$KEYDSP	(DFBTAB,<$ACTION(PRM$BK),$DEFAULT(Password)>)
DFBTAB:	$STAB
	DSPTAB	(DFNPDB,DEFSKP,<Password>,KEYFLG)
	$ETAB
DFIPDB:	$KEYDSP	(DFITAB,$ACTION(PRM$BK))
DFITAB:	$STAB
	DSPTAB	(DF2PDB,DKC906##,<Hello>,KEYFLG)
	DSPTAB	(DF2PDB,DKC907##,<Listen>,KEYFLG)
	$ETAB
DXIPDB:	$KEYDSP	(DXITAB,$ACTION(PRM$BK))
DXITAB:	$STAB
	DSPTAB	(DX7PDB,0,<Maximum>,KEYFLG)
	DSPTAB	(DTTPDB,XKL121##,<Retransmission>,KEYFLG)
	$ETAB
DFJPDB:	$KEYDSP	(DFJTAB,$ACTION(PRM$BK))
DFJTAB:	$STAB
	DSPTAB	(DFKPDB,DMS1##,<CCB>,KEYFLG)
	DSPTAB	(DFTPDB,DMS0##,<Process>,KEYFLG)
	DSPTAB	(DFKPDB,DMS2##,<RDB>,KEYFLG)
	$ETAB
DFKPDB:	$KEYDSP	(DFKTAB,$ACTION(PRM$BK))
DFKTAB:	$STAB
	DSPTAB	(NUMPDB,DEFSKP,<Number>,KEYFLG)
	$ETAB
DFLPDB:	$KEYDSP	(DFLTAB,$ACTION(PRM$BK))
DFLTAB:	$STAB
	DSPTAB	(DFOPDB,DNS12##,<Input>,KEYFLG)
	DSPTAB	(DFOPDB,DNS13##,<Output>,KEYFLG)
	$ETAB
DFOPDB:	$KEYDSP	(DFOTAB,$ACTION(PRM$BK))
DFOTAB:	$STAB
	DSPTAB	(DFMPDB,DEFSKP,<Buffer>,KEYFLG)
	$ETAB
DFMPDB:	$KEYDSP	(DFMTAB,$ACTION(PRM$BK))
DFMTAB:	$STAB
	DSPTAB	(NUMPDB,DEFSKP,<Quota>,KEYFLG)
	$ETAB

DG4PDB:	$KEYDSP	(DG4TAB,$ACTION(PRM$BK))
DG4TAB:	$STAB
	DSPTAB	(DG6PDB,LF201##,<Event>,KEYFLG)
;	DSPTAB	(DG5PDB,0,<Known>,KEYFLG)
	$ETAB

DG5PDB:	$KEYDSP	(DG5TAB,$ACTION(PRM$BK))
DG5TAB:	$STAB
	DSPTAB	(CRLF##,LF201##,<Events>,KEYFLG)
	$ETAB

DG6PDB:	EVLIST	(CRLF##)

DFUPDB:	$KEYDSP	(DFUTAB,$ALTERNATE(CRLF##))
DFUTAB:	$STAB
	DSPTAB	(CRLF##,0,<LLC>,KEYFLG)
;	DSPTAB	(,1,<RSX-driver>,KEYFLG)
	$ETAB
DFVPDB:	$KEYDSP	(DFVTAB,$ACTION(PRM$BK))
DFVTAB:	$STAB
	DSPTAB	(DFWPDB,0,<DMC>,KEYFLG)
	$ETAB
DFWPDB:	$KEYDSP	(DFWTAB,$ACTION(PRM$BK))
DFWTAB:	$STAB
	DSPTAB	(DFXPDB,0,<Transmit>,KEYFLG)
	$ETAB
DFXPDB:	$KEYDSP	(DFXTAB,$ACTION(PRM$BK))
DFXTAB:	$STAB
	DSPTAB	(NUMPDB,DPD1##,<Buffers>,KEYFLG)
	$ETAB
DFYPDB:	$KEYDSP	(DFYTAB,$ACTION(PRM$BK))
DFYTAB:	$STAB
	DSPTAB	(DG0PDB,DMS4##,<Driver>,KEYFLG)
	DSPTAB	(DFZPDB,DMS3##,<Task>,KEYFLG)
	$ETAB
DGCPDB:	$NUMBER	(CRLF##,^D10,<<Node Address, XXXXX to YYYYY>>,<$PREFILL(NUMLIM),$ACTION(CHKNUM),$ERROR(NUMERR)>)
DFCPDB:	$NUMBER	(CRLF##,^D10,<<Node Address, XXXXX to YYYYY>>,<$PREFILL(NODLIM),$ACTION(CHKNUM),$ERROR(NUMERR)>)
DFGPDB:	$NUMBER	(CRLF##,^D10,<<Timer value, 1 to 65535 seconds>>,<$ACTION(CHKNUM),$ERRTXT(Specify decimal number in range 1 to 65535)>)
DXCPDB:	$NUMBER	(CRLF##,^D10,<<Timer value, 1 to 255 seconds>>,<$ACTION(CHKNUM),$ERRTXT(Specify decimal number in range 1 to 255)>)
DRTPDB:	$NUMBER	(CRLF##,^D10,<<Timer value in milliseconds, XXXXX to YYYYY>>,<$PREFILL(NUMLIM),$ACTION(CHKNUM),$ERROR(NUMERR)>)
NUMPDB::$NUMBER	(CRLF##,^D10,<<Number, XXXXX to YYYYY>>,<$PREFILL(NUMLIM),$ACTION(CHKNUM),$ERROR(NUMERR)>)
DFNPDB:	$CTEXT	(CRLF##,<<Text, 1 to 8 characters>>,<$FLAGS(CM%BRK),$BREAK(LITBRK),$ACTION(CHKTXT)>)
DFQPDB:	$CTEXT	(CRLF##,<<Text, 1 to 16 characters>>,<$FLAGS(CM%BRK),$BREAK(LITBRK),$ACTION(CHKTXT)>)
DFDPDB:	$CTEXT	(CRLF##,<<Text, 1 to 32 characters>>,<$ACTION(CHKTXT)>)
DFEPDB:	$FIELD	(DFFPDB,<<Node Name, 1 to 6 alphanumeric characters>>,<$PREFILL(NODLIM),$ACTION(CHKNAM)>)
DFFPDB:	$CRLF	($ERRTXT (Specify 1 to 6 alphanumerics for the node name) )
DFRPDB:	$FIELD	(CRLF##,<<Process Name, 1 to 3 alphanumeric characters>>,<$ACTION(CHKNAM)>)
DFTPDB:	$FIELD	(DFUPDB,<<Process Name, 1 to 3 alphanumeric characters>>,<$ACTION(CHKNAM)>)
DFZPDB:	$FIELD	(CRLF##,<<Task Name, 1 to 6 alphanumeric characters>>,<$ACTION(CHKNAM)>)
DG0PDB:	$FIELD	(CRLF##,<<Driver Name, 1 to 2 alphanumeric characters>>,<$ACTION(CHKNAM)>)
DC1PDB:	$KEYDSP	(DC1TAB,$ACTION(PRM$BK))
DC1TAB:	$STAB
	DSPTAB	(NUMPDB,XC1121##,<Channel>,KEYFLG)
	DSPTAB	(NUMPDB,DC900##,<Cost>,KEYFLG)
	DSPTAB	(DC4PDB,XC1120##,<Dte>,KEYFLG)
	DSPTAB	(DC2PDB,0,<Maximum>,KEYFLG)
	DSPTAB	(DC3PDB,XC1112##,<Type>,KEYFLG)
	$ETAB	
DC2PDB:	$KEYDSP	(DC2TAB,$ACTION(PRM$BK))
DC2TAB:	$STAB	
	DSPTAB	(NUMPDB,XC1122##,<Data>,KEYFLG)
	DSPTAB	(NUMPDB,XC1123##,<Window>,KEYFLG)
	$ETAB
DC3PDB:	$KEY	(CRLF##,DC3TAB,<$DEFAULT(X25)>)
DC3TAB:	$STAB
	KEYTAB	(^D5,<X25>)
	$ETAB

DL2PDB:	$KEYDSP	(DL2TAB,$ACTION(PRM$BK))
DL2TAB:	$STAB
	DSPTAB	(DL3PDB,0,<Baud>,KEYFLG)
	DSPTAB	(DL5PDB,DL1111##,<Duplex>,KEYFLG)
	$ETAB
DL3PDB:	$KEYDSP	(DL3TAB,<$DEFAULT(Rate),$ACTION(PRM$BK)>)
DL3TAB:	$STAB
	DSPTAB	(DL4PDB,DLS0##,<Rate>,KEYFLG)
	$ETAB
DL4PDB:	$KEY	(CRLF##,DL4TAB)
DL4TAB:	$STAB
	KEYTAB	(BD.12,<1200>)
	KEYTAB	(BD.18,<1800>)
	KEYTAB	(BD.192,<19200>)
	KEYTAB	(BD.24,<2400>)
	KEYTAB	(BD.36,<3600>)
	KEYTAB	(BD.48,<4800>)
	KEYTAB	(BD.72,<7200>)
	KEYTAB	(BD.96,<9600>)
	$ETAB
DL5PDB:	$KEY	(CRLF##,DL5TAB)
DL5TAB:	$STAB
	KEYTAB	(^D0,<Full>,KEYFLG)
	KEYTAB	(^D1,<Half>,KEYFLG)
	$ETAB

DX4PDB:	$FIELD	(CRLF##,<<Text, Network name>>,<$ACTION(CHKNAM)>)

DXMPDB:	$KEYDSP (DXMTAB,<$ALTERNATE(DXGPDB),$ACTION(PRM$BK)>)
DXMTAB:	$STAB
	DSPTAB	(DX1PDB,XP1160##,<Call>,KEYFLG)
;	DSPTAB	(,XP1130##,<Channels>,KEYFLG)
	DSPTAB	(DX1PDB,XP1161##,<Clear>,KEYFLG)
	DSPTAB	(DX2PDB,0,<Default>,KEYFLG)
;	DSPTAB	(,0,<Line>,KEYFLG)
	DSPTAB	(DX3PDB,0,<Maximum>,KEYFLG)
	DSPTAB	(DX4PDB,XP1110##,<Network>,KEYFLG)
	DSPTAB	(DX1PDB,XP1162##,<Reset>,KEYFLG)
	DSPTAB	(DX1PDB,XP1163##,<Restart>,KEYFLG)
	$ETAB
DX1PDB:	$KEYDSP (DX1TAB,<$DEFAULT(Timer),$ACTION(PRM$BK)>)
DX1TAB:	$STAB
	DSPTAB	(DXCPDB,DEFSKP,<Timer>,KEYFLG)
	$ETAB
DX2PDB:	$KEYDSP	(DX2TAB,$ACTION(PRM$BK))
DX2TAB:	$STAB
	DSPTAB	(NUMPDB,XP1140##,<Data>,KEYFLG)
	DSPTAB	(NUMPDB,XP1141##,<Window>,KEYFLG)
	$ETAB
DX3PDB:	$KEYDSP	(DX3TAB,$ACTION(PRM$BK))
DX3TAB:	$STAB
	DSPTAB	(NUMPDB,XP1131##,<Channels>,KEYFLG)
	DSPTAB	(NUMPDB,XP1152##,<Clears>,KEYFLG)
	DSPTAB	(NUMPDB,XP1150##,<Data>,KEYFLG)
	DSPTAB	(NUMPDB,XPS0##,<Groups>,KEYFLG)
	DSPTAB	(NUMPDB,XP1153##,<Resets>,KEYFLG)
	DSPTAB	(NUMPDB,XP1154##,<Restarts>,KEYFLG)
	DSPTAB	(NUMPDB,XP1151##,<Window>,KEYFLG)
	$ETAB

DXSPDB:	$KEYDSP (DXSTAB,$ACTION(PRM$BK))
DXSTAB: $STAB
	DSPTAB	(DX8PDB,0,<Access>,KEYFLG)
	DSPTAB	(DD9PDB,XS332##,<Account>,KEYFLG)
	DSPTAB	(DD2PDB,0,<Call>,KEYFLG)
	DSPTAB	(DD9PDB,XS353##,<Group>,KEYFLG)
	DSPTAB  (DXDPDB,0,<Maximum>,KEYFLG)
	DSPTAB	(DD3PDB,XS320##,<Node>,KEYFLG)
	DSPTAB	(DD4PDB,XS354##,<Number>,KEYFLG)
	DSPTAB	(DD5PDB,XS340##,<Object>,KEYFLG)
	DSPTAB	(DD9PDB,XS331##,<Password>,KEYFLG)
	DSPTAB	(DD7PDB,XS350##,<Priority>,KEYFLG)
	DSPTAB	(DD8PDB,XS355##,<Subaddresses>,KEYFLG)
	DSPTAB	(DD9PDB,XS330##,<User>,KEYFLG)
	$ETAB

DD9PDB:	$FIELD	(DDNPDB,<<Text, 1 to 16 characters>>,<$ACTION(CHKNAM)>)
DD4PDB:	$FIELD	(DDNPDB,<Full Remote DTE Address>,<$FLAGS(CM%BRK),$BREAK(CALBRK),$ACTION(CHKFLD)>)
DD5PDB:	$NUMBER	(DDNPDB,^d10,<<Number, XXXXX to YYYYY>>,<$PREFILL(OBJLIM),$ALTERNATE(DXXPDB),$ACTION(CHKNUM)>)
DXXPDB:	$FIELD	(DDNPDB,<<Object name >>,<$PREFILL(OBJLIM),$ACTION(CHKNAM)>)
DD3PDB:	$NUMBER	(DDNPDB,^D10,<<Number, XXXXX to YYYYY>>,<$PREFILL(NODLIM),$ACTION(CHKNUM),$ERROR(NUMERR)>)
DZZPDB:	$FIELD	(DDNPDB,<<Node name, 1 to 6 alphanumeric characters>>,<$PREFILL(NODLIM),$ACTION(CHKNAM)>)
DD7PDB:	$NUMBER	(DDNPDB,^D10,<<Number, 0 to 255>>,<$ACTION(CHKNUM)>)
DD8PDB:	$DIGIT	(DDPPDB,^D10,<<Number, XXXXX to YYYYY>>,<$PREFILL(NUMLIM),$ACTION(CHKNUM),$ERROR(NUMERR)>)
DDPPDB:	$TOKEN	(DDQPDB,<->,$ALTERNATE(DDNPDB))
DDQPDB:	$DIGIT	(DDNPDB,^D10,<<Number, XXXXX to YYYYY>>,<$PREFILL(NUMLIM),$ACTION(CHKNUM),$ERROR(NUMERR)>)
DS1PDB: $FIELD	(DDNPDB,<Hexadecimal Mask>,<$FLAGS(CM%BRK),$BREAK(HEXBRK),$ACTION(CHKHEX)>)
DS2PDB: $FIELD	(DDNPDB,<Hexadecimal Data>,<$FLAGS(CM%BRK),$BREAK(HEXBRK),$ACTION(CHKHEX)>)

DD2PDB:	$KEYDSP	(DD2TAB,$ACTION(PRM$BK))
DD2TAB:	$STAB
	DSPTAB	(DS1PDB,XS351##,<Mask>,KEYFLG)
	DSPTAB	(DS2PDB,XS352##,<Value>,KEYFLG)
	$ETAB
DXDPDB: $KEYDSP (DXDTAB,$ACTION(PRM$BK))
DXDTAB: $STAB
	DSPTAB (NUMPDB,XSS1##,<Circuits>,KEYFLG)
        DSPTAB (NUMPDB,XSS0##,<Destinations>,KEYFLG)
	$ETAB
;
;	DESTINATION qualifier
;
DDNPDB:	$KEYDSP	(DDNTAB,<$ALTERNATE(CRLF##),$ACTION(QUA$BK)>)
DDNTAB:	$STAB
	DSPTAB	(DD1PDB,QUADST##,<Destination>,KEYFLG)
	DSPTAB	(DDOPDB,KNOQUA##,<Known>,KEYFLG)
	$ETAB
DDOPDB:	$KEYDSP	(DDOTAB,<$DEFAULT(Destinations),$ACTION(QUA$BK)>)
DDOTAB:	$STAB
	DSPTAB	(CRLF##,QUADST##,<Destinations>,KEYFLG)
	$ETAB
DD1PDB:	$FIELD	(CRLF##,<<Destination Name String>>,<$ACTION(CHKNAM)>)

DX7PDB:	$KEYDSP	(DX7TAB,$ACTION(PRM$BK))
DX7TAB:	$STAB
	DSPTAB	(NUMPDB,XKL131##,<Retransmits>,KEYFLG)
	DSPTAB	(NUMPDB,XKL132##,<Window>,KEYFLG)
	$ETAB	
DX8PDB:	$KEYDSP	(DX8TAB,$ACTION(PRM$BK))
DX8TAB:	$STAB
	DSPTAB	(DFQPDB,DNX3##,<Account>,KEYFLG)
	DSPTAB	(DFQPDB,DNX4##,<Password>,KEYFLG)
	DSPTAB	(DFQPDB,DNX2##,<User>,KEYFLG)
	$ETAB
;
;	DTE qualifier
;***** $ALTERNATE (LSEPDB)
;
DXAPDB:	$KEYDSP	(DXATAB,<$ALTERNATE(CRLF##),$ACTION(QUA$BK)>)
DXATAB:	$STAB
	DSPTAB	(DC4PDB,QUADTE##,<Dte>,KEYFLG)
	DSPTAB	(PXG1PB,QUAGRP##,<Group>,KEYFLG)
	DSPTAB	(DXBPDB,KNOQUA##,<Known>,KEYFLG)
	$ETAB
DXBPDB:	$KEYDSP	(DXBTAB,$ACTION(QUA$BK))
DXBTAB:	$STAB
	DSPTAB	(CRLF##,QUADTE##,<Dtes>,KEYFLG)
	DSPTAB	(CRLF##,QUAGRP##,<Groups>,KEYFLG)
	$ETAB
DC4PDB:	$FIELD	(CRLF##,<<Decimal DTE Address>>,<$FLAGS(CM%BRK),$BREAK(DECBRK),$ACTION(CHKFLD)>)
;
DTTPDB:	$KEYDSP	(DTTTAB,<$DEFAULT(Timer),$ACTION(PRM$BK)>)
DTTTAB:	$STAB
	DSPTAB	(DRTPDB,DEFSKP,<Timer>,KEYFLG)
	$ETAB
DXGPDB: $KEYDSP (DXGTAB, $ACTION(QUA$BK))
DXGTAB: $STAB
	DSPTAB 	(DXG0PB, QUAGRP##,<Group>,KEYFLG)
	$ETAB
DXG0PB:	$FIELD	(DXG1PB,<<Group Name>>,<$ACTION(CHKNAM)>)
DXG1PB:	$KEYDSP (DXG1TB,$ACTION(PRM$BK))
DXG1TB:	$STAB
	DSPTAB	(DXG2PD,XP1170##,<DTE>,KEYFLG)
	$ETAB
DXG2PD:	$FIELD	(DXG3PD,<<Dte Address>>,<$FLAGS(CM%BRK),$BREAK(CALBRK),$ACTION(CHKFLD)>)
DXG3PD:	$KEYDSP	(DXG3TB,$ACTION(PRM$BK))
DXG3TB:	$STAB
	DSPTAB	(DXG4PB,XP1171##,<NUMBER>,KEYFLG)
	$ETAB
DXG4PB: $NUMBER (DXG5PB,^D10,<<Group Number, 1-9999>>,<$ACTION(CHKNUM),$ERRTXT(Specify decimal number in range 1-9999)>)
DXG5PB:	$KEYDSP	(DXG5TB,<$ALTERNATE(CRLF##),$ACTION(PRM$BK)>)
DXG5TB:	$STAB
	DSPTAB	(DXG6PB,XP1172##,<TYPE>,KEYFLG)
	$ETAB
DXG6PB:	$KEY	(CRLF##,DXG6TB,$DEFAULT(BILATERAL))
DXG6TB:	$STAB
	KEYTAB	(^D5,<BILATERAL>)
	$ETAB
;
; PURGE	*	*	*	*	*	*	*
;
PURPDB::$KEYDSP	(PURTAB,$ACTION(ENT$BK))
PURTAB:	$STAB
	DSPTAB	(PXNPDB,ENTCIR##,<Circuit>,KEYFLG)
	DSPTAB	(PU1PDB,ENTEXE##,<Executor>,KEYFLG)
	DSPTAB	(PXLPDB,KNOENT##,<Known>,KEYFLG)
;	DSPTAB	(,ENTLIN##,<Line>,KEYFLG)
	DSPTAB	(PV3PDB,ENTLOG##,<Logging>,KEYFLG)
	DSPTAB	(PU4PDB,ENTMOD##,<Module>,KEYFLG)
	DSPTAB	(PU9PDB,ENTNOD##,<Node>,KEYFLG)
	$ETAB

PV3PDB:	$KEYDSP	(PV3TAB,$ACTION(ENT$BK))
PV3TAB:	$STAB
;	DSPTAB	(,LOGCON##,<Console>,KEYFLG)
	DSPTAB	(DG4PDB,LOGFIL##,<File>,KEYFLG)
;	DSPTAB	(,LOGMON##,<Monitor>,KEYFLG)
	$ETAB

PXLPDB:	$KEYDSP	(PXLTAB,$ACTION(ENT$BK))
PXLTAB:	$STAB
	DSPTAB	(PXIPDB,ENTLIN##,<Lines>,KEYFLG) 
	$ETAB

PXNPDB:	$FIELD	(PC1PDB,<<Circuit Id>>,<$ACTION(CHKFLD)>)
PU4PDB:	$KEYDSP	(PU4TAB,$ACTION(ENT$BK))
PU4TAB:	$STAB
	DSPTAB	(PU7PDB,MODMCB##,<MCB-Executive>,KEYFLG)
	DSPTAB	(PU8PDB,MODRSX##,<RSX-Executive>,KEYFLG)
	DSPTAB	(PXMPDB,MODXPR##,<X25-Protocol>,KEYFLG)
	DSPTAB	(PXSPDB,MODXSR##,<X25-Server>,KEYFLG)
	$ETAB
PU9PDB:	$NUMBER	(PU1PDB,^D10,<<Node Number, XXXXX to YYYYY>>,<$PREFILL(NODLIM),$ACTION(CHKNUM),$ERROR(NUMERR)>)

PU1PDB:	$KEYDSP	(PU1TAB,$ACTION(PRM$BK))
PU1TAB:	$STAB
	DSPTAB	(CRLF##,DNS14##,<Fence>,KEYFLG)
	DSPTAB	(CRLF##,DN100##,<Identification>,KEYFLG)
	DSPTAB	(PU2PDB,DN510##,<Incoming>,KEYFLG)
	DSPTAB	(PU6PDB,0,<Management>,KEYFLG)
	DSPTAB	(PU2PDB,DN511##,<Outgoing>,KEYFLG)
	DSPTAB	(PU5PDB,DNS5##,<Receive>,KEYFLG)
	DSPTAB	(PU5PDB,DNS1##,<Transmit>,KEYFLG)
	$ETAB
PU2PDB:	$KEYDSP	(PU2TAB,<$ACTION(PRM$BK),$DEFAULT(Timer)>)
PU2TAB:	$STAB
	DSPTAB	(CRLF##,DEFSKP,<Timer>,KEYFLG)
	$ETAB
PU5PDB:	$KEYDSP	(PU5TAB,<$DEFAULT(Password),$ACTION(PRM$BK)>)
PU5TAB:	$STAB
	DSPTAB	(CRLF##,DEFSKP,<Password>,KEYFLG)
	$ETAB
PU6PDB:	$KEYDSP	(PU6TAB,$ACTION(PRM$BK))
PU6TAB:	$STAB
	DSPTAB	(CRLF##,DNS3##,<Account>,KEYFLG)
	DSPTAB	(CRLF##,DNS4##,<Password>,KEYFLG)
	DSPTAB	(CRLF##,DNS2##,<User>,KEYFLG)
	$ETAB

PU7PDB:	$KEYDSP	(PU7TAB,$ACTION(PRM$BK))
PU7TAB:	$STAB
	DSPTAB	(DFRPDB,DMS0##,<Process>,KEYFLG)
	$ETAB
PU8PDB:	$KEYDSP	(PU8TAB,$ACTION(PRM$BK))
PU8TAB:	$STAB
	DSPTAB	(DG0PDB,DMS4##,<Driver>,KEYFLG)
	DSPTAB	(DFZPDB,DMS3##,<Task>,KEYFLG)
	$ETAB
PXIPDB:	$KEYDSP	(PXITAB,$ACTION(PRM$BK))
PXITAB:	$STAB
	DSPTAB	(PX7PDB,0,<Maximum>,KEYFLG)
	DSPTAB	(PU2PDB,XKL121##,<Retransmission>,KEYFLG)
	$ETAB

PX7PDB:	$KEYDSP	(PX7TAB,$ACTION(PRM$BK))
PX7TAB:	$STAB
	DSPTAB	(CRLF##,XKL131##,<Retransmits>,KEYFLG)
	DSPTAB	(CRLF##,XKL132##,<Window>,KEYFLG)
	$ETAB	

PXMPDB:	$KEYDSP (PXMTAB,<$ALTERNATE(PXGPDB),$ACTION(PRM$BK)>)
PXMTAB:	$STAB
	DSPTAB	(PU2PDB,XP1160##,<Call>,KEYFLG)
	DSPTAB	(PU2PDB,XP1161##,<Clear>,KEYFLG)
	DSPTAB	(PX3PDB,0,<Maximum>,KEYFLG)
	DSPTAB	(PU2PDB,XP1162##,<Reset>,KEYFLG)
	DSPTAB	(PU2PDB,XP1163##,<Restart>,KEYFLG)
	$ETAB

PX3PDB:	$KEYDSP	(PX3TAB,$ACTION(PRM$BK))
PX3TAB:	$STAB
	DSPTAB	(CRLF##,XP1152##,<Clears>,KEYFLG)
	DSPTAB	(CRLF##,XP1153##,<Resets>,KEYFLG)
	DSPTAB	(CRLF##,XP1154##,<Restarts>,KEYFLG)
	$ETAB

PXSPDB:	$KEYDSP (PXSTAB,<$ALTERNATE(PXTPDB),$ACTION(PRM$BK)>)
PXSTAB: $STAB
	DSPTAB	(DDNPDB,XS300##,<All>,KEYFLG)
	$ETAB

PXTPDB:	$KEYDSP (PXTTAB,$ACTION(PRM$BK))
PXTTAB: $STAB
	DSPTAB	(PX8PDB,0,<Access>,KEYFLG)
	DSPTAB	(DDNPDB,XS332##,<Account>,KEYFLG)
	DSPTAB	(PP2PDB,0,<Call>,KEYFLG)
	DSPTAB	(DDNPDB,XS353##,<Group>,KEYFLG)
	DSPTAB	(DDNPDB,XS354##,<Number>,KEYFLG)
	DSPTAB	(DDNPDB,XS331##,<Password>,KEYFLG)
	DSPTAB	(DDNPDB,XS350##,<Priority>,KEYFLG)
	DSPTAB	(DDNPDB,XS355##,<Subaddresses>,KEYFLG)
	DSPTAB	(DDNPDB,XS330##,<User>,KEYFLG)
	$ETAB

PX8PDB:	$KEYDSP	(PX8TAB,$ACTION(PRM$BK))
PX8TAB:	$STAB
	DSPTAB	(CRLF##,DNX3##,<Account>,KEYFLG)
	DSPTAB	(CRLF##,DNX4##,<Password>,KEYFLG)
	DSPTAB	(CRLF##,DNX2##,<User>,KEYFLG)
	$ETAB	

PP2PDB:	$KEYDSP	(PP2TAB,$ACTION(PRM$BK))
PP2TAB:	$STAB
	DSPTAB	(DDNPDB,XS351##,<Mask>,KEYFLG)
	DSPTAB	(DDNPDB,XS352##,<Value>,KEYFLG)
	$ETAB

PC1PDB:	$KEYDSP	(PC1TAB,$ACTION(PRM$BK))
PC1TAB:	$STAB
	DSPTAB	(CRLF##,XC1121##,<Channel>,KEYFLG)
	DSPTAB	(CRLF##,XC1120##,<Dte>,KEYFLG)
	DSPTAB	(PC2PDB,0,<Maximum>,KEYFLG)
	DSPTAB	(PC3PDB,XC1112##,<Type>,KEYFLG)
	$ETAB	

PC2PDB:	$KEYDSP	(PC2TAB,$ACTION(PRM$BK))
PC2TAB:	$STAB	
	DSPTAB	(CRLF##,XC1122##,<Data>,KEYFLG)
	DSPTAB	(CRLF##,XC1123##,<Window>,KEYFLG)
	$ETAB
PC3PDB:	$KEY	(CRLF##,PC3TAB,$DEFAULT(X25))
PC3TAB:	$STAB
	KEYTAB	(^D5,<X25>)
	$ETAB
PXGPDB: $KEYDSP (PXGTAB,<$ALTERNATE(PXG4PB),$ACTION(PRM$BK)>)
PXGTAB: $STAB
	DSPTAB 	(PXG0PB,XP1101##,<All>,KEYFLG)
	$ETAB
PXG0PB:	$KEYDSP (PXG0TB, $ACTION(QUA$BK))
PXG0TB: $STAB
	DSPTAB	(PXG1PB, QUAGRP##,<Group>,KEYFLG)
	DSPTAB	(PXG2PB, KNOQUA##,<Known>,KEYFLG)
	$ETAB
PXG1PB:	$FIELD	(CRLF##,<<Group Name>>,<$ACTION(CHKNAM)>)
PXG2PB: $KEYDSP (PXG2TB,$ACTION(QUA$BK))
PXG2TB: $STAB
	DSPTAB (CRLF##,QUAGRP##,<Groups>,KEYFLG)
	$ETAB
PXG3PB: $KEYDSP (PXG3TB, $ACTION(PRM$BK))
PXG3TB:	$STAB
	DSPTAB	(CRLF##,XP1170##,<DTE>,KEYFLG)
	DSPTAB	(CRLF##,XP1172##,<Type>,KEYFLG)
	$ETAB
PXG4PB:	$KEYDSP	(PXG4TB,$ACTION(QUA$BK))
PXG4TB:	$STAB
	DSPTAB	(PXG5PD,QUAGRP##,<Group>,KEYFLG)
	$ETAB
PXG5PD:	$FIELD	(PXG6PD,<<Group Name>>,<$ACTION(CHKNAM)>)
PXG6PD:	$KEYDSP	(PXG6TB,$ACTION(PRM$BK))
PXG6TB:	$STAB
	DSPTAB	(CRLF##,XP1172##,<Type>,KEYFLG)
	$ETAB	
;
; LIST	*	*	*	*	*	*	*	*
;
LISPDB::$KEYDSP	(LISTAB,$ACTION(ENT$BK))
LISTAB:	$STAB
;	DSPTAB	(,ENTCIR##,<Circuit>,KEYFLG)
	DSPTAB	(LS3PDB,ENTEXE##,<Executor>,KEYFLG)
	DSPTAB	(LS2PDB,KNOENT##,<Known>,KEYFLG)
;	DSPTAB	(,ENTLIN##,<Line>,KEYFLG)
	DSPTAB	(LS9PDB,ENTLOG##,<Logging>,KEYFLG)
	DSPTAB	(LS4PDB,ENTMOD##,<Module>,KEYFLG)
	DSPTAB	(LS1PDB,ENTNOD##,<Node>,KEYFLG)
	$ETAB

LS1PDB:	$NUMBER	(LS3PDB,^D10,<<Node Number, XXXXX to YYYYY>>,<$PREFILL(NODLIM),$ACTION(CHKNUM),$ERROR(NUMERR)>)

LS2PDB:	$KEYDSP	(LS2TAB,$ACTION(ENT$BK))
LS2TAB:	$STAB
	DSPTAB	(LS3PDB,ENTCIR##,<Circuits>,KEYFLG)
	DSPTAB	(LS3PDB,ENTLIN##,<Lines>,KEYFLG)
;	DSPTAB	(,ENTLOG##,<Logging>,KEYFLG)
	DSPTAB	(LS3PDB,KNOMOD##,<Modules>,KEYFLG)
	DSPTAB	(LS3PDB,ENTNOD##,<Nodes>,KEYFLG)
	$ETAB

LS3PDB:	$KEY	(CRLF##,LS3TAB,<$DEFAULT(Characteristics)>)
LS3TAB:	$STAB
	KEYTAB	(0,<Characteristics>)
	$ETAB

LS4PDB:	$KEYDSP	(LS4TAB,$ACTION(ENT$BK))
LS4TAB:	$STAB
	DSPTAB	(LS5PDB,MODMCB##,<MCB-Executive>,KEYFLG)
	DSPTAB	(LS7PDB,MODRSX##,<RSX-Executive>,KEYFLG)
	DSPTAB	(LSEPDB,MODXPR##,<X25-Protocol>,KEYFLG)
	DSPTAB	(LSDPDB,MODXSR##,<X25-Server>,KEYFLG)
	$ETAB

LS5PDB:	$KEYDSP	(LS5TAB,<$DEFAULT(Characteristics)>)
LS5TAB:	$STAB
	DSPTAB	(CRLF##,0,<Characteristics>,KEYFLG)
	DSPTAB	(LS6PDB,KNOQUA##,<Known>,KEYFLG)
	$ETAB

LS6PDB:	$KEYDSP	(LS6TAB,<$DEFAULT(Processes)>)
LS6TAB:	$STAB
	DSPTAB	(CRLF##,QUAPRO##,<Processes>,KEYFLG)
	$ETAB

LS7PDB:	$KEYDSP	(LS7TAB)
LS7TAB:	$STAB
	DSPTAB	(LS8PDB,KNOQUA##,<Known>,KEYFLG)
	$ETAB

LS8PDB:	$KEYDSP	(LS8TAB,<$DEFAULT(Tasks)>)
LS8TAB:	$STAB
	DSPTAB	(CRLF##,QUATAS##,<Tasks>,KEYFLG)
	$ETAB

LS9PDB:	$KEYDSP	(LS9TAB,$ACTION(ENT$BK))
LS9TAB:	$STAB
;	DSPTAB	(,LOGCON##,<Console>,KEYFLG)
	DSPTAB	(LSAPDB,LOGFIL##,<File>,KEYFLG)
;	DSPTAB	(,LOGMON##,<Monitor>,KEYFLG)
	$ETAB

LSAPDB:	$KEYDSP	(LSATAB,<$DEFAULT(Events)>)
LSATAB:	$STAB
	DSPTAB	(CRLF##,0,<Events>,KEYFLG)
	$ETAB
;***** $ALTERNATE (DDNPDB)
LSDPDB:	$KEYDSP	(LSDTAB,<$DEFAULT(Characteristics)>)
LSDTAB:	$STAB
	DSPTAB	(DDNPDB,0,<Characteristics>,KEYFLG)
	$ETAB
;****** $ALTERNATE (DXAPDB)
LSEPDB:	$KEYDSP	(LSETAB,<$DEFAULT(Characteristics)>)
LSETAB:	$STAB
	DSPTAB	(DXAPDB,0,<Characteristics>,KEYFLG)
	$ETAB
;
;   Parsing utilities
;
NUMMIN::BLOCK	1			;Number Low limit
NUMMAX::BLOCK	1			;Number High limit
;
; $ACTION routine aids
;

A$KEYW::MOVE	S1,CR.COD(S2)		;Keyword.
	CAIE	S1,.CMKEY
	 $RETF
	HRRZ	S1,@CR.RES(S2)		;Get TBLUK block
	HLRZ	S1,0(S1)		;to pick up data.
	$RETT

A$NUM::	MOVE	S1,CR.RES(S2)		;Get number.
	MOVE	CR.COD(S2)		;Number.
	CAIE	.CMNUM
	 CAIN	.CMNUX
	  $RETT
	$RETF

A$FLD::	MOVE	S1,CR.COD(S2)		;Field.
	CAIE	S1,.CMFLD
	 $RETF
	MOVE	S1,CR.FLG(S2)		;Get pointer to text
	MOVE	S1,.CMABP(S1)		;in atom buffer.
	$RETT

A$TEXT::MOVE	S1,CR.COD(S2)		;Text.
	CAIE	S1,.CMTXT
	 $RETF
	MOVE	S1,CR.FLG(S2)		;Get pointer to text
	MOVE	S1,.CMABP(S1)		;in atom buffer.
	$RETT

A$QSTR::MOVE	S1,CR.COD(S2)		;Quoted string.
	CAIE	S1,.CMQST
	 $RETF
	MOVE	S1,CR.FLG(S2)		;Get pointer to text
	MOVE	S1,.CMABP(S1)		;in atom buffer.
	$RETT
;
; Syntax handling $ACTION routines
;

ENT$BK:	$CALL	A$KEYW
	SKIPN	S1
	 $RETT
	MOVEM	S1,ENTBLK
	LOAD	S2,(S1),PRSMIN
	MOVEM	S2,NUMMIN		;Copy minimum
	LOAD	S2,(S1),PRSMAX
	MOVEM	S2,NUMMAX		;and maximum
	$RETT

PRM$BK:	$CALL	A$KEYW			;If
	SKIPE	S1			;there is
	 CAIN	S1,DEFSKP		;a parameter block
	  $RETT				;then
	MOVEM	S1,PRMBLK		;save it.
	LOAD	S2,(S1),PRSMIN
	MOVEM	S2,NUMMIN		;Copy minimum
	LOAD	S2,(S1),PRSMAX
	MOVEM	S2,NUMMAX		;and maximum
	$RETT

QUA$BK:	$CALL	A$KEYW			;If there is
	SKIPN	S1			;a qualifier block
	 $RETT
	MOVEM	S1,QUABLK 		;then save it.
	LOAD	S2,(S1),PRSMIN
	MOVEM	S2,NUMMIN		;Copy minimum
	LOAD	S2,(S1),PRSMAX
	MOVEM	S2,NUMMAX		;and maximum
	$RETT
NODLIM::LOAD	S1,CR.PDB(S2),RHMASK	; Get current PDB
	LOAD	S1,.CMFNP(S1),CM%FNC	;  to pick up function.
	CAIN	S1,.CMNUM		; If not numeric
	 JRST	NODLI1			;  then
	MOVEI	S1,^D1			;  must be
	MOVEM	S1,NUMMIN		; Node name:
	MOVEI	S1,^D6			;  set minimum/maximum
	MOVEM	S1,NUMMAX		;  for node name.
	$RETT
NODLI1:	LOAD	S1,ENTNOD##,PRSMIN 	; Node number:
	MOVEM	S1,NUMMIN		;  set minimum/maximum
	LOAD	S1,ENTNOD##,PRSMAX	;  for node number.
	MOVEM	S1,NUMMAX
	PJRST	NUMLIM			; Fall into NUMLIM.

OBJLIM::LOAD	S1,CR.PDB(S2),RHMASK	; Get current PDB
	LOAD	S1,.CMFNP(S1),CM%FNC	;  to pick up function.
	CAIN	S1,.CMNUM		; If not numeric
	 JRST	OBJLI1			;  then
	MOVEI	S1,^D1			;  must be
	MOVEM	S1,NUMMIN		; Object name:
	MOVEI	S1,^D16			;  set minimum/maximum
	MOVEM	S1,NUMMAX		;  for object name.
	$RETT
OBJLI1:	MOVX	S1,^D1			; Object number:
	MOVEM	S1,NUMMIN		;  set minimum/maximum
	MOVX	S1,^D255		;  for object number.
	MOVEM	S1,NUMMAX		; Fall into NUMLIM.
;
;   Note: uses AC13.
;
NUMLIM::$SAVE	<T1,T2,T3,T4>
	LOAD	T2,CR.PDB(S2),RHMASK
	SKIPN	13,.CMHLP(T2)
	 JRST	NUMLI2
NUMLI1:	ILDB	S1,13
	JUMPE	S1,NUMLI2
	CAIE	S1,","
	 JRST	NUMLI1
	$TEXT	NUMLI4,< ^D/NUMMIN/ to ^D/NUMMAX/^0>
NUMLI2:	LOAD	T1,-1(T2),RHMASK
	ADDI	T1,-1(T2)
	SKIPN	PB%ERR(T1)
	 $RETT
	$TEXT	<-1,,NUMERT>,<Specify decimal number in range ^D/NUMMIN/ to ^D/NUMMAX/^0>
	$RETT
NUMLI4:	IDPB	S1,13
	$RET

NUMERT:	ASCIZ/Specify decimal number in range XXXXX to YYYYY/
NUMERR::MOVE	S2,[POINT 7,NUMERT]
	$RETF
CHKNUM::$CALL	A$NUM			;Get number
	CAML	S1,NUMMIN		;Check the range
	CAMLE	S1,NUMMAX
	 JRST	[$SYNFAIL (<Value is out of range>)]
	$RETT

CHKHEX::$SAVE	<T1,T2,T3,T4>
	$CALL	A$FLD			;Get text pointer.
	SETZM	T4			;Alphabetic character flag
	MOVNI	T2,1			;and string length.
CHKX1:	ADDI	T2,1			;One more good character..
	ILDB	T1,S1			;Get the next.
	CAIL	T1,"0"			;Check numeric
	CAILE	T1,"9"			; (check for terminating null)
	 JUMPN T1,[CAIL	T1,"A"		;Check UPPER CASE
		CAILE	T1,"F"
		 JRST [	CAIL	T1,"a"	;Check lower case
			CAILE	T1,"f"
			 JRST [	$SYNFAIL(<Illegal character in number>)]
			JRST	CHKX2]
		JRST	CHKX2]
CHKX2:	JUMPN	T1,CHKX1		;If non-null, go for more.
	CAMGE	T2,NUMMIN		;Check the range
	 JRST	[$SYNFAIL(<Number too short>)]
	CAMLE	T2,NUMMAX
	 JRST	[$SYNFAIL(<Number too long>)]
	$RETT

CHKNAM::$SAVE	<T1,T2,T3,T4>
	$CALL	A$FLD			;Get text pointer.

	SETZ	T2,			;and string length.
CHKNO1:	ILDB	T1,S1			;Get the next.
	JUMPE	T1,CHKNO2		;Exit loop at end of string
	CAIL	T1,"A"			;Check UPPER CASE
	CAILE	T1,"Z"
	SKIPA				;Not, check for lower case
	 AOJA	T2,CHKNO1		;Yes, bump character count and continue
	CAIL	T1,"a"			;Check lower case
	CAILE	T1,"z"
	SKIPA				;Not, check for digit
	 AOJA	T2,CHKNO1		;Yes, bump character count and continue
	JUMPE	T2,[$SYNFAIL(<Name must start with alphabetic character>)]
	CAIL	T1,"0"			;Check numeric
	CAILE	T1,"9"			; (check for terminating null)
	 JRST	[$SYNFAIL(<Illegal character in name>)]
	AOJA	T2,CHKNO1		;Bump character count and continue
CHKNO2:	CAMGE	T2,NUMMIN		;Check the range
	 JRST	[$SYNFAIL(<Name too short>)]
	CAMLE	T2,NUMMAX
	 JRST	[$SYNFAIL(<Name too long>)]
	$RETT

CHKFLD::$CALL	A$FLD			;Get field pointer.
	JRST	CHKTX1
CHKTXT::$CALL	A$TEXT			;Get text pointer.
CHKTX1:	$SAVE	<T1,T2,T3,T4>
	MOVNI	T2,1			;Set string length.
CHKTX2:	ADDI	T2,1			;One more character..
	ILDB	T1,S1			;Get a byte
	JUMPN	T1,CHKTX2		;and loop if more.
	CAMGE	T2,NUMMIN		;Check the range
	 JRST	[$SYNFAIL(<Text too short>)]
	CAMLE	T2,NUMMAX
	 JRST	[$SYNFAIL(<Text too long>)]
	$RETT

	END