This is a cross-referenced version of getarg.plan, to download the unmodified
source try getarg.plan.
#PROGRAM /GFGETARG(15AM,22AM,DBM,EBM)
#PAGE
#INCLUDE IOHEAD(/DEFS)
#INCLUDE STACK(/DEFS)
#PROGRAM
# Get a program argument
# LEN = GETARG (ARGNO, BUF, BUFLEN)
# integer procedure getarg (argno, buf, buflen);
# value argno, buflen;
# integer argno, buflen;
# integer array buf [];
# argno is argument to read (1..nargs)
# or < 0 to read sequentialy
# buf is array element or array name
# buflen is buffer length *in chars*
# return in X6 is length of para +ve, or
# -ve for no suc arg
#SET ARGS=0
#DEFINE ARGNO=ARGS
#SET ARGS=ARGS+1
#DEFINE ARGBUF=ARGS
#SET ARGS=ARGS+1
#DEFINE ARGLEN=ARGS
#SET ARGS=ARGS+1
# Define stack frame
#SET STFRAME=SXFRAME
# First arguments:
#DEFINE STARGNO=SXPAR1
#SET STFRAME=STFRAME+1
#DEFINE STARGBUF=SXPAR2
#SET STFRAME=STFRAME+1
#DEFINE STARGLEN=SXPAR2
#SET STFRAME=STFRAME+1
# Then local variables:
#DEFINE STPERI=STFRAME [ PERI command
#SET STFRAME=STFRAME+1
#DEFINE STREPLY=STFRAME [ PERI reply
#SET STFRAME=STFRAME+1
#DEFINE STCOUNT=STFRAME [ PERI count
#SET STFRAME=STFRAME+1
#DEFINE STADDR=STFRAME [ PERI buffer address
#SET STFRAME=STFRAME+1
# First pick up value args
STACK 2
OBEY ARGNO(1)
LDX 0 0(3) [ get arg# wanted
STO 0 STARGNO(2)
OBEY ARGLEN(1)
LDX 0 0(3) [ get buffer size
STO 0 STARGLEN(2)
# Now get call-by-name args
OBEY ARGBUF(1) [ get buffer addr
ARRAY 3
STACK 2 [ restore SP
STO 3 STARGBUF(2)
ADN 1 ARGS
# Pascal callable entry point
#CUE GPGETARG
BEGIN 2 3,1,STFRAME
LDX 3 STARGLEN(2) [ get buffer size
LDN 0 512 [ max size allowed
BXL 3 0,*+2 [ jump if OK
LDN 3 511 [ otherwise shrink
STO 3 STCOUNT(2)
LDX 0 STARGBUF(2) [ get user buffer
STO 0 STADDR(2) [ save in PERI control area
LDN 1 DEVCI [ now calculate command
LDXC 0 STARGNO(2)
BCS *+2
ADN 1 256 [ replaced unit#
LDCT 6 0(1) [ set devtype in count field
ADN 6 2 [ mode 2, read paranm
STO 6 STPERI(2)
PERI 0 STPERI(2) [ get parameter
LDX 6 STREPLY(2) [ assume no need to wait
LDX 5 6 [ get reply
SLA 5 4 [ get no more params flag
BVSR EOF [ jump if no more params
LDX 6 STCOUNT(2) [ get requested count
SBX 6 STREPLY(2) [ subtract unused
BYE END 2 1,0
EOF NGN 6 1
BRN BYE
#END
#FINISH