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