*============================================================================*
|                                                                            |
|                         PCBoard Version 15.4                               |
|                                                                            |
*============================================================================*

We are pleased to announce the Beta release of PCBoard v15.4!  This release of
PCBoard brings many new enhancements to you.  Here is the brief list.  Full
descriptions follow:

  PCBoard
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  - CHAT has been enhanced to support @x color codes, and action  commands.

  - The new PPL compiler now produces code which is slightly smaller and
    executes faster than previous versions.

  - File flagging now allows flagging by number and viewing of full
    descriptions when viewing short descriptions only.

  - The user record now stores the user's birthday, gender, email address,
    and personal web page.

  - UUIN can now reject both email or newsgroup messages  by name to
    avoid pesky abusers to the system.


  PPL
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  GetBankBal()  Function (3.40)
  GetMsgHdr()  Function (3.40)
  MoveMsg  Statement (3.40)
  SetBankBal  Statement (3.40)
  SetMsgHdr()  Function (3.40)
  ShortDesc()  Function (3.40)
  ShortDesc  Statement (3.40)
  U_BIRTHDATE VARIABLE (3.40)
  U_EMAIL VARIABLE (3.40)
  U_GENDER VARIABLE (3.40)
  U_SHORTDESC VARIABLE (3.40)
  U_WEB VARIABLE (3.40)

  PCB/IC
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  - FTP now support MGET (multiple gets)


Detailed Description of New Features
==============================================================================

There are a number of enhancements to the new code, including:

  1.  A ListServ PPE (coming soon) which allows your users to subscribe
      to e-mail lists over the Internet.  Along with the new PPE for
      v15.4, there are several new PPL functions to support the new
      code, including:

        A. GetMsgHdr(conference #, message #, field #)
           (field #'s are the same as those used for the SCANMSGHDR function.
            This function allows you to get specific message header info.)

        B. SetMsgHdr(conference #, message #, field #, string value)
           (Five field numbers are available, including:)
              1 = 'To' field
              2 = 'From' field
              3 = 'Subject' field
              4 = 'Password' field
              5 = 'Echo' Flag
           (This function allows you to modify the above fields in a message)

        C. MoveMsg (conf #, message #)
           (This function moves a message from its current location in the
            message base to the very end of that message base.)

  2.  New 'Time Bank' functions have been added to the PPL compiler and
      PCBSysMgr has been updated to support installing the new functions as a
      PSA.  The new functions available are:

        GetBankBal(field #)
        SetBankBal(field #, value)

        (There are 12 fields available as indicated below:)

          Time Fields (in minutes)
          ------------------------
           0 = Last Deposit Date
           1 = Last Withdrawal Date
           2 = Last Transaction Amount (in minutes)
           3 = Amount Saved (their time balance in their account)
           4 = Max Withdrawal (the max a user can withdraw in a day)
           5 = Max Stored Amount (Maximum time allowed to be stored)

          Byte Fields (in K bytes)
          ------------------------
           6 = Last Deposit Date
           7 = Last Withdrawal Date
           8 = Last Transaction Amount (in K bytes)
           9 = Amount Saved (their K byte balance in their account)
          10 = Max Withdrawal (the max a user can withdraw in a day)
          11 = Max Stored Amount (Maximum K bytes allowed to be stored)

      By using these new functions, you can easily write a time bank PPE for
      your system where your users can be charged for functions used, or they
      can add to their account balance based on their activity.

  3.  PCBoard's CHAT has been enhanced to support @x color codes, and action
      commands.  The SysOp can now define their own set of action commands to
      implement on their system -- tailoring them to the needs of their users.

      Users in chat can now also include @x color codes in their text to
      enhance the look of the text they are sending others in group chat.  A
      new command has been added for color support.

      COLOR  Change foreground color.  The color command allows a user
      to change the color of the text he types.  The color command can accept
      the following options:

         B (blue)
         G (green)
         C (cyan)
         R (red)
         M (magenta)
         Y (yellow)
         W (white)
         + (brighten)
         - (darken)

      "W+" would give a bright white.  Likewise, "R-" would produce a
      dark red. A '+' (plus) or a '-' (minus) by itself will brighten or
      darken the current color, it also will set the default intensity
      to bright or dark.

  4.  PCBIC has been enhanced to now supports the standard ftp command "MGET".
      This will allow users to use wildcards when retrieving files from a ftp
      site.

  5.  The new PPL compiler now produces code which is slightly smaller and
      executes faster than previous versions. Additionally, all 15.4 compiled
      PPE's use a new enhanced security algorithm to help thwart PPE busters.

  6.  Our FLAG PPE now supports flagging by file screen display number rather
      than just by name.  This makes it easier for callers to select the file
      they wish to flag for download.

  7.  A new PPL function is available for getting the short filename
      description status.

  8.  A new PCBModem program is available which now supports many more modem
      configurations.

  9.  Additional user information is now able to be stored using a 15.4 PSA.
      The additional info includes the users Birthday, Gender, E-Mail Address
      and Personal Web Address (if they have their own personal Web site.)

 10.  UUIN reject by name.  It is common for a business or BBS to want to be
      able to filter out unwanted mail.  For example, if mail was comming from
      annoying@bad.stor then these messages could be bounced or disregarded.
      To setup a address to reject, a file named REJECTS must be created and
      stored in the UUCP base path.  The format of the file is ASCII text.
      On each line is the incoming from name to reject followed by a comma,
      and then if a percent sign is the first charactor in the second field
      the message will be bounced otherwise it will be disregarded. NOTE: only
      email can be bounced news articles can only be disregarded.

      Example rejects file:

        annoying@bad.stor, % (this message will be bounced)
        dah@news.bad,        (this message will be disregarded)

      NOTE:  THe maximum number of entries that can be in this file is 16.


NEW PPL FUNCTIONS AND VARIABLES
==============================================================================

GETBANKBAL()  Function (3.40)

   Function
   ~~~~~~~~~~~~~~~~
      Returns the value of a specified field.

   Syntax
   ~~~~~~~~~~~~~~~~
      GETBANKBAL(field)
      	field			An interger expression stating the field to get.

   Fields
   ~~~~~~~~~~~~~~~~

        Time Fields (in minutes)
        ------------------------
         0 = Last Deposit Date
         1 = Last Withdrawal Date
         2 = Last Transaction Amount (in minutes)
         3 = Amount Saved (their time balance in their account)
         4 = Max Withdrawal (the max a user can withdraw in a day)
         5 = Max Stored Amount (Maximum time allowed to be stored)

        Byte Fields (in K bytes)
        ------------------------
         6 = Last Deposit Date
         7 = Last Withdrawal Date
         8 = Last Transaction Amount (in K bytes)
         9 = Amount Saved (their K byte balance in their account)
         10 = Max Withdrawal (the max a user can withdraw in a day)
         11 = Max Stored Amount (Maximum K bytes allowed to be stored)

   Returns
   ~~~~~~~~~~~~~~~~
      STRING   Returns the value of the specified field.

   Example
   ~~~~~~~~~~~~~~~~
      INTEGER amt_saved
      amt_saved=GetBankBal(3)
      PRINTLN "The user has the following amount of time saved: ", amt_saved

   See Also
   ~~~~~~~~~~~~~~~~
      SetBankBal()  Function (3.40)

--------------------------------------------------------------------------
GETMSGHDR()  Function (3.40)

   Function
   ~~~~~~~~~~~~~~~~
      Returns the value of the specified header field.

   Syntax
   ~~~~~~~~~~~~~~~~
      GETMSGHDR(conf, message, field)
      	conf		An interger expression stating the conference number of the
         			message base.
         message  A double expression stating the message number of the message
         			to get the message header value.
         field		An integer expression between 0 and 15 representing the field
         			to get. The fields are defined under SCANMSGHDR().

   Returns
   ~~~~~~~~~~~~~~~~
      STRING   Returns the value of the specified field.

   Example
   ~~~~~~~~~~~~~~~~
		STRING MsgToName        'STRING CONTAINING THE TO: FIELD OF A MESSAGE
   	msgToName = GETMSGHDR(0, HIMSGNUM(), HDR_TO)
      PRINTLN "The last message is addressed to ", msgToName

   See Also
   ~~~~~~~~~~~~~~~~
      SCANMSGHDR() Function (3.00)
		SetMsgHdr()  Function (3.40)
		MoveMsg  Statement (3.40)

--------------------------------------------------------------------------
MOVEMSG  Statement (3.40)

	Function
   ~~~~~~~~~~~~~~~~
      Moves the message from its current location to the end of the message
      base.

	Syntax
   ~~~~~~~~~~~~~~~~
      MOVEMSG conf, message, movetype
      	conf			An interger expression stating the conference number of
         				the message base.
         message  	A double expression stating the message number of the
         				message to get the message header value.
         movetype    A Boolean expression stating where the message should be
                     move or not.  TRUE if it will be moved, FALSE if the
                     message is to be copied.

   Example
   ~~~~~~~~~~~~~~~~
      INTEGER LowMessage
      LowMessage=LOMSGNUM()
      MoveMsg 0, LowMessage, FALSE

   See Also
   ~~~~~~~~~~~~~~~~
      SCANMSGHDR() Function (3.00)
		SetMsgHdr()  Function (3.40)
		GetMsgHdr()  Function (3.40)

--------------------------------------------------------------------------
SETBANKBAL  Statement (3.40)

	Function
   ~~~~~~~~~~~~~~~~
      Sets the value of a specified field.

	Syntax
   ~~~~~~~~~~~~~~~~
      SETBANKBAL field, value
      	field	 	An interger expression stating the field to get.
      	value	 	An interger expression stating the value that the specifeid
         			field is to set to.

   Fields
   ~~~~~~~~~~~~~~~~

        Time Fields (in minutes)
        ------------------------
         0 = Last Deposit Date
         1 = Last Withdrawal Date
         2 = Last Transaction Amount (in minutes)
         3 = Amount Saved (their time balance in their account)
         4 = Max Withdrawal (the max a user can withdraw in a day)
         5 = Max Stored Amount (Maximum time allowed to be stored)

        Byte Fields (in K bytes)
        ------------------------
         6 = Last Deposit Date
         7 = Last Withdrawal Date
         8 = Last Transaction Amount (in K bytes)
         9 = Amount Saved (their K byte balance in their account)
         10 = Max Withdrawal (the max a user can withdraw in a day)
         11 = Max Stored Amount (Maximum K bytes allowed to be stored)

   Example
   ~~~~~~~~~~~~~~~~
      SetBankBal
      INTEGER amt_saved
      SetBankBal 10,10
      amt_saved=GetBankBal(10)
      PRINTLN "The user now can download the following (MAX): ", amt_saved

   See Also
   ~~~~~~~~~~~~~~~~
      GetBankBal()  Function (3.40)

--------------------------------------------------------------------------
SETMSGHDR()  Function (3.40)

	Function
   ~~~~~~~~~~~~~~~~
      Set the specified message header to a specified value of a specified
      message.

	Syntax
   ~~~~~~~~~~~~~~~~
      SETMSGHDR(conf, message, field, fieldinfo)
      	conf			An interger expression stating the conference number of
         				the message base.
         message  	A double expression stating the message number of the
         				message to get the message header value.
         field			An integer expression between 0 and 15 representing the
         				field	to get.
         fieldinfo   A string expression containing the data to insert into the
         				specified field.

   Fields
   ~~~~~~~~~~~~~~~~
              1 = 'To' field
              2 = 'From' field
              3 = 'Subject' field
              4 = 'Password' field
              5 = 'Echo' Flag

   Returns
   ~~~~~~~~~~~~~~~~
      INTEGER  Returns the value of the message number.  If the message will
      			fit in the same place as the original then it will be the same.
      			If modefied header change will not fit in the original message
               header then it will insert the message to the end of the message
               base.

   Example
   ~~~~~~~~~~~~~~~~

		STRING MsgToName        'STRING CONTAINING THE TO: FIELD OF A MESSAGE
      INTEGER HighMessage
      INTEGER NewMessage
      HighMessage = HIMSGNUM()
   	NewMessage = SETMSGHDR(0, HighMessage, 1, "SYSOP")
   	msgToName = GETMSGHDR(0,NewMessage , HDR_TO)
      PRINTLN "The high message is now addressed to ", msgToName

   See Also
   ~~~~~~~~~~~~~~~~
      SCANMSGHDR() Function (3.00)
		SetMsgHdr()  Function (3.40)
		MoveMsg  Statement (3.40)

--------------------------------------------------------------------------
SHORTDESC()  Function (3.40)

	Function
   ~~~~~~~~~~~~~~~~
      Returns the status of the file description setting.

	Syntax
   ~~~~~~~~~~~~~~~~
      SHORTDESC()

   Returns
   ~~~~~~~~~~~~~~~~
      BOOLEAN  Returns TRUE if the user has short file descriptions set to on
               else it returns FALSE.

   Example
   ~~~~~~~~~~~~~~~~

      if (ShortDesc())
	      PRINTLN "The user will only see the short description of the file"
      else
	      PRINTLN "The user will can see the long description of the file"

	See Also
   ~~~~~~~~~~~~~~~~
      ShortDesc  Statement (3.40)
		U_SHORTDESC VARIABLE (3.40)

--------------------------------------------------------------------------
SHORTDESC  Statement (3.40)

	Function
   ~~~~~~~~~~~~~~~~
     Sets the current user's status for viewing short (one line) or full
     file descriptions.

	Syntax
   ~~~~~~~~~~~~~~~~
      SHORTDESC value
      	value		A boolean expression stating if the short description set on
                  (TRUE) or off (FALSE).

   Example
   ~~~~~~~~~~~~~~~~
      ShortDesc TRUE
      if (ShortDesc())
	      PRINTLN "The current user will see the short description of the file"

   See Also
   ~~~~~~~~~~~~~~~~
      ShortDesc  Function (3.40)
		U_SHORTDESC VARIABLE (3.40)

--------------------------------------------------------------------------
U_BIRTHDATE VARIABLE (3.40)

	Function
   ~~~~~~~~~~~~~~~~
      Allow reading and writing of the current users birthdate.

	Type & Value
   ~~~~~~~~~~~~~~~~
      DATE  The current users birthdate.

	Remarks
   ~~~~~~~~~~~~~~~~
      For this array to have meaningful information, the notes PSA must be
      installed. The existence of the notes PSA may be checked with the PSA()
      function.

   Example
   ~~~~~~~~~~~~~~~~
   	GETUSER
		U_BIRTHDATE="02-13-77"
		PUTUSER()

	See Also
   ~~~~~~~~~~~~~~~~
      GETUSER STATEMENT (1.00)
      GETALTUSER STATEMENT (2.00)
      U_EMAIL VARIABLE (3.40)
		U_GENDER VARIABLE (3.40)
		U_WEB VARIABLE (3.40)

--------------------------------------------------------------------------
U_EMAIL VARIABLE (3.40)

	Function
   ~~~~~~~~~~~~~~~~
      Allow reading and writing of the current users email address.

   Type & Value
   ~~~~~~~~~~~~~~~~
      STRING  The current users email address.

   Remarks
   ~~~~~~~~~~~~~~~~
      For this array to have meaningful information, the notes PSA must be
      installed. The existence of the notes PSA may be checked with the PSA()
      function.

   Example
   ~~~~~~~~~~~~~~~~
   	GETUSER
      U_EMAIL="user@yourdomain.com"
      PUTUSER()

	See Also
   ~~~~~~~~~~~~~~~~
      GETUSER STATEMENT (1.00)
      GETALTUSER STATEMENT (2.00)
      U_BIRTHDATE VARIABLE (3.40)
		U_GENDER VARIABLE (3.40)
		U_WEB VARIABLE (3.40)

--------------------------------------------------------------------------
U_GENDER VARIABLE (3.40)

	Function
   ~~~~~~~~~~~~~~~~
      Allow reading and writing of the current users gender information.

   Type & Value
   ~~~~~~~~~~~~~~~~
      STRING  The current users gender.

   Remarks
   ~~~~~~~~~~~~~~~~
      For this array to have meaningful information, the notes PSA must be
      installed. The existence of the notes PSA may be checked with the PSA()
      function.

   Example
   ~~~~~~~~~~~~~~~~
	  	GETUSER
		PRINTLN "Your gender is ", U_GENDER

	See Also
   ~~~~~~~~~~~~~~~~
      GETUSER STATEMENT (1.00)
      GETALTUSER STATEMENT (2.00)
   	U_BIRTHDATE VARIABLE (3.40)
		U_EMAIL VARIABLE (3.40)
		U_WEB VARIABLE (3.40)

--------------------------------------------------------------------------
U_SHORTDESC VARIABLE (3.40)

	Function
   ~~~~~~~~~~~~~~~~
      Allow reading and writing of the current users short file description
      status.

	Type & Value
   ~~~~~~~~~~~~~~~~~
      BOOLEAN  The status of the user's short description flag.  TRUE if
               viewing descriptions in one-line mode, FALSE if defaulting
               to full description viewing.

	Remarks
   ~~~~~~~~~~~~~~~~~
      For this array to have meaningful information, the notes PSA must be
      installed. The existence of the notes PSA may be checked with the PSA()
      function.

   Example
   ~~~~~~~~~~~~~~~~~
   	GETUSER
      if (U_SHORTDESC)
			PRINTLN "Your short desciption option is set on."
		else
			PRINTLN "Your short desciption option is set off."

	See Also
   ~~~~~~~~~~~~~~~~
      ShortDesc  Statement (3.40)
		U_SHORTDESC VARIABLE (3.40)

--------------------------------------------------------------------------
U_WEB VARIABLE (3.40)

	Function
   ~~~~~~~~~~~~~~~~
      Allow reading and writing of the current users personal web address.

   Type & Value
   ~~~~~~~~~~~~~~~~
      STRING  The current users personal web address.

   Remarks
   ~~~~~~~~~~~~~~~~
      For this array to have meaningful information, the notes PSA must be
      installed. The existence of the notes PSA may be checked with the PSA()
      function.

   Example
   ~~~~~~~~~~~~~~~~
      GETUSER
      PRINTLN "Your personal web address is ", U_WEB

	See Also
   ~~~~~~~~~~~~~~~~
      GETUSER STATEMENT (1.00)
      GETALTUSER STATEMENT (2.00)
   	U_BIRTHDATE VARIABLE (3.40)
		U_EMAIL VARIABLE (3.40)
		U_GENDER VARIABLE (3.40)

--------------------------------------------------------------------------

All customers whose download support is current on the Salt Air
system is welcome to download the new code.  Please note that the
new PCBIC code is now only available from inside the PCBoard DOOR.

If your support has expired, now is the time to renew!  Give us a
call at 800.356.1686 or 801.261.1686 to renew.  You can also do
so on-line using our order DOOR.  Just type 'ORDER' at the main
command line prompt to place your order.
