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

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

#PERMANENT     GFWRITEECMA

#PROGRAM

#              Write a line to the file.

#              For *TP we have to write a CRLF then do a WRITEBUF

#              For *FW/*FH we do a WRITEBUF, and if the buffer
#              was full and we are not writing to a AMORPHOUS 
#              file we do another WRITEBUF

#              ERR = WRITELN(FD)

#              CALL  1  WRITELN
#              LDN   3  FD             

#SET           ARGS=0

#DEFINE        ARGFD=ARGS
#SET           ARGS=ARGS+1

#              Define the stack frame

#SET           STFRAME=SXFRAME

#              First arguments

#DEFINE        STFD=SXPAR1           [ FD
#SET           STFRAME=STFRAME+1

#              Then local variables

#DEFINE        STDESC=STFRAME        [ saveed FDESC
#SET           STFRAME=STFRAME+1

#DEFINE        LENCRLF=2
#DEFINE        STCRLF=STFRAME         [ 2 word buf for writeecma
#SET           STFRAME=STFRAME+LENCRLF

#              Fortran compatible entrypoint, save args to stack

      STACK 2

      OBEY     ARGFD(1)
      LDX   0  0(3)                  [ get FD
      STO   0  STFD(2)

      ADN   1  ARGS

#              Pascal style entrypoint

#CUE           GPWRITELN

      BEGIN 2  3,1,STFRAME

#              Check if FD is open

      LDX   5  STFD(2)
      STO   5  SXPAR1(3)
      LDN   4  1                     [ in write mode
      STO   4  SXPAR2(3)
      CALL  1  GPIOCHECK

      BNG   6  OUT                   [ fd is not open
      STO   6  STDESC(2)

      STO   6  3

      LDN   0  DEVTP                [ is this a *TP?
      BXU   0  FDTYPE(3),FH         [ get device type

      LDN   1  STCRLF(2)
      LDN   0  ECMACR               [ store CR
      STO   0  0(1)
      LDN   0  ECMANL               [ and LF (NL in ECMA speak)
      STO   0  1(1)    

      STACK 3
      LDX   0  STFD(2)
      STO   0  SXPAR1(3)
      STO   1  SXPAR2(3)
      LDN   0  LENCRLF
      STO   0  SXPAR3(3)

      CALL  1  GPWRITEECMA

CONT  BNG   6  OUT

WB    STACK 3
      LDX   0  STFD(2)
      STO   0  SXPAR1(3)
      CALL  1  GPWRITEBUF

OUT   END   2  1,0

FH    LDXC  0  FDSHIFT(3)           [ AMORPHOUS?
      BCS      WB                   [ if is, just do simple write

      LDN   0  2004                 [ Record full?
      BXU   0  FDCHARS(3),WB        [ if not just do a write

      STACK 3
      LDX   0  STFD(2)              [ write 1st 2000 chars
      STO   0  SXPAR1(3)
      CALL  1  GPWRITEBUF

      BRN      CONT                 [ loop to write null record

#END
#FINISH