This is a cross-referenced version of openstr.plan, to download the unmodified source try openstr.plan.
#PROGRAM       /GFOPENSTR(15AM,22AM,DBM,EBM)
#PAGE

#INCLUDE       IOHEAD(/DEFS)
#INCLUDE       STACK(/DEFS)

#PROGRAM

#              Open a string for input

#              FD = OPENSTR (SHIFT, STR, POS, LEN)

#              STR must be array element or var
#              SHIFT is -ve if data unshifted, 0 to start in
#              alpha or 1 to start in beta

#SET           ARGS=0

#DEFINE        ARGSHIFT=ARGS
#SET           ARGS=ARGS+1

#DEFINE        ARGBUF=ARGS
#SET           ARGS=ARGS+1

#DEFINE        ARGPOS=ARGS
#SET           ARGS=ARGS+1

#DEFINE        ARGLEN=ARGS
#SET           ARGS=ARGS+1

#              Define stack frame

#SET           STFRAME=SXFRAME

#              Arguments

#DEFINE        STSHIFT=SXPAR1
#SET           STFRAME=STFRAME+1

#DEFINE        STBUF=SXPAR2
#SET           STFRAME=STFRAME+1

#DEFINE        STPOS=SXPAR3
#SET           STFRAME=STFRAME+1

#DEFINE        STLEN=SXPAR4
#SET           STFRAME=STFRAME+1

#              Fortran compatible entry point

      STACK 2
      OBEY     ARGSHIFT(1)
      LDX   0  0(3)             [ get initial shift
      STO   0  STSHIFT(2)

      OBEY     ARGPOS(1)
      LDX   3  0(3)             [ get pos in buf
      STO   3  STPOS(2)

      OBEY     ARGLEN(1)
      LDX   3  0(3)             [ get buffer len
      STO   3  STLEN(2)         [ save across call to FHALLOC

#              This may be a call by name arg:

      OBEY     ARGBUF(1)        [ get buffer
      STACK 2                   [ restore stack top
      SLL   3  2                [ clear top two bits
      SRL   3  2
      STO   3  STBUF(2)         [ save for a tick

      ADN   1  ARGS

#              Pascal entry point

#CUE           GPOPENSTR

      BEGIN 2  3,1,STFRAME

      LDX   4  STSHIFT(2)       [ get initial shift
      BNG   4  *+3
      ANDN  4  1                [ odd or even?
      ADN   4  #74              [ who cares

      NGN   0  1                [ no fixed FD
      STO   0  SXPAR1(3)
      STO   4  SXPAR2(3)        [ Shift flag
      STO   0  SXPAR3(3)        [ no device
      STO   0  SXPAR4(3)        [ no unit
      STOZ     SXPAR5(3)        [ fake read command
      STOZ     SXPAR6(3)        [ fake write command
      STOZ     SXPAR7(3)        [ no buffer
      CALL  1  GPFDALLOC

      BNG   6  BYE

#              FDALLOC returns FDESC in X3        

      LDX   5  STPOS(2)         [ get offset in buf
      SRC   5  2                [ convert to char addr
      ADX   5  STBUF(2)         [ and add to buff addr
      STO   5  FDADDR(3)        [ save in FDESC
      STO   5  FDNEXT(3)        [ and set next char to read
      LDX   5  STLEN(2)         [ get buf len
      STO   5  FDBUFLEN(3)      [ save in FDESC
      STO   5  FDCHARS(3)       [ and set number of chars avail

      LDN   0  FLAGNOCLOSE      [ set no release on close flag
      ORS   0  FDFLAGS(3)

BYE   END   2  1,0

#END
#FINISH