Hi All,
This is a glance at the long-awaited PCB 15.2.
This file details SOME of the many new features, according to the 
beta version v15.2! More new functions, or some changes to these ones,
might still appear in the commercial release (expected before 01 sept 94)

PCB 15.2 Internal New Features:
===============================

 - Added new accounting features 
   After installing the Accounting Support PSA via PCBSM, and after editing
   the PWRD file (via PCBSetup) to enable accounting features, PCBoard then
   begins tracking your caller's activities using a system of credits.
   You deposit the credits into a user's "bank account", for example, then,
   as the caller performs various online activities, PCBoard will deduct
   or add credits from his account.

 - Added a few new @-macros 
   @CREDLEFT@     = Calculated balance of credits left
   @CREDNOW@      = Number of credits used so far this session
   @CREDSTART@    = Starting credit balance (before any charges or credits)
   @CREDUSED@     = Total credits used so far
   @XOFF@   - Turns off @X macro interpretation in msg headers
   @XON@    - Turns on @X macro interpretation in msg headers

 - Added a new QWK/Net Support PSA into PCBoard and PCBSM.  This PSA adds a
   couple of features, useful for both NetMail and Personal QWK Packets,
   such as Net Status, Message Limits, and File Attachments.  

 - Modified the QWK U command so that it now accepts File Attachments from
   inside of a .REP packet.  Also, it now checks the subject line of a
   message before posting in an echoed conference and, if the subject begins
   with "NE:", PCBoard will avoid setting the Echo Flag on.

 - Added a FORWARD message sub-command.  When reading a message, at the End Of
   Message Command prompt, you can type "FORWARD" or type "FORWARD xxx" and
   press enter.  The "xxx" would be the conference number.  If you leave out
   the conference number, you will be prompted for the conference number.
 
 - Added two new command line parameters, /PPE: and /RUNPPE:, which can be
   used to execute a PPE from the DOS prompt.  The only difference between the
   two is that /RUNPPE: loads user information into memory so that a PPE which
   operates on user information can be executed.  The /PPE: switch simply runs
   the PPE without loading any user information.

 - Added a "PPE" command for sysops.  A sysop (or user with sufficient security
   to use sysop function 10) can run any PPE by giving PCBoard the full name
   of the PPE.  For example, you might execute it like this:
   Main Board Command?  PPE C:\PCB\PPE\TEST.PPE
   This allows you to quickly test PPEs without having to install them into
   CMD.LST or other locations in PCBoard's configuration.  Additionally,
   developers could use it as a method of running some kind of INSTALL.PPE.

 - Modified free disk space calculations to utilize an unsigned long integer
   instead of a signed long integer.

 - Modified Group Chat - removing the ability to view keystrokes from other
   callers "as they type" and instead made the system line oriented.  PCBoard
   will now buffer up what you type until you hit ENTER at which point it will
   transmit the information to the chat file.  Understandably, this works well
   for chat systems with many users in chat simultaneously, while the v15.0
   method of displaying characters *as* they were typed was preferable for
   small systems.  For now, PCBoard will support the buffered approach while
   we re-evaluate other methods.

 - Added support for modems which use a "CONNECT 14.4" style of connect
   message.

 - Added an index to the conference names.  PCBoard will now use an indexed
   search when using the "J" and "J S" commands.  Typing "J confname" will jump
   immediately to the requested conference by using a binary search through the
   index.  Typing "J S" will scan the index and list all potential matches in
   alphabetical order.

 - PCBTEXT has been updated with new entries.  Plus some old information, which
   used to be hardcoded in PCBoard, has been moved out of PCBoard and into the
   PCBTEXT file in order to facilitate translation of those text strings.  

 - Modified the keyboard handling so that the UP ARROW is no longer used to
   activate the scrollback buffer.  You should instead use the SCROLL LOCK
   key to activate the scrollback buffer. The UP key remains free for PPE 
   usage!

PCBFILER.EXE
============

 - Incorporated new virtual memory management routines, taking advantage of
   both EMS and XMS memory, in addition to using the hard disk.

 - In addition to making the duplicate/missing analysis work on an unlimited
   number of files, the algorythms used to perform the analysis have been
   rewritten to tremendously speed up the operation, especially if EMS memory
   is available.

 - Added a new capability in the Scan for Duplicate/Missing Files section.  In
   addition to the 4 existing reports (dupes on disk, dupes in DIRs, missing on
   disk, and missing in DIRs), the new report is based on a scan of the DIRs
   to locate "similar" filenames.  These filenames have the same "base"
   filename, with differences usually, but not always, indicating a version
   number change.  Here are some examples:

   ACCNET42.ZIP    24652  03-14-94  Main Board     DIR: 15
   ACCNET43.ZIP    12443  05-16-94  Main Board     DIR: 16

   !RR252U.ZIP    366732  04-23-94  Main Board     DIR: 8
   !RR250U.ZIP    370792  03-24-94  Main Board     DIR: 14
   !RR200.ZIP     302688  02-19-93  Main Board     DIR: 13

 - Added the ability to toggle between viewing all lines versus viewing only
   the primary lines (ALT-Y) in the DIR File Editor.

 - Added the ability to toggle between 25-line and 50-line modes (ALT-5).

 - Expanded the number of lines of help information at the bottom of the
   screen while at the same time, modified the ALT-X (expert mode toggle) so
   that, in expert mode, the help lines do not appear.  Combining the effects
   of Expert Mode and/or 50-line mode and/or Primary-Only mode, you can set
   your own preferences for how many lines are viewable on-screen.  These
   settings can be saved in Defaults Page 1.

 - Added in a new ALT-R (Repeat Line) capability hich can copy, not only a
   single line at a time, but if you point to a primary line which has
   secondaries attached, pressing ALT-R on the primary line will duplicate the
   entire set.

 - Changed ALT-F (Free Disk Space) to ALT-N.

 - Added a new ALT-F command which allows you to select any one of 9 different
   "filters", or "shortened views" of the listing.  These are:
      L - Locate by Filename or by Wildcard
      Z - Locate by Description
      M - Locate Files Marked For Moving or Copying
      D - Locate Files Marked For Deleting
      U - Locate Un-Marked Files
      S - Display Selected Files
      N - Display non-Selected Files
      R - Display Files Found in DIR but Missing from Disk
      S - Display Files Found on Disk but Missing Description

 - The ALT-L and ALT-Z commands have been modified so that now, instead of
   searching for one file at a time, PCBFiler finds all matches at once and
   presents the sysop with a filtered "view" of only those files that match
   the search criteria.

 - Lengthened the ALT-Z search criteria input and changed it over to the method
   of searching used by PCBoard which allows multiple criteria and boolean
   logic to be used.

 - Added a Join Line (ALT-J) command which will join the contents of the next
   line into the current line (or as much of the next line as will fit).

 - Added a point-and-shoot interface for selecting a DIR file to edit, as well
   as when selecting a target DIR file for moving files.

 - Added the ability to read in a FILE_ID.DIZ file by pressing ALT-U.  PCBFiler
   supports the same set of archives (ZIP, ARC, PAK, LHA) that are supported by
   PCBDescribe.  And like PCBDescribe, PCBFiler must shell out to the
   un-archiver to extract the description.

 - Modified the "Set FILE DATE when moving files" setting so that now there are
   five possible settings:
          N = No, don't change the file date
          A = Ask just before processing
          T = Today's Date  (was "Y")
          R = Most Recent Date in Archive  (new)
          O = Oldest Date in Archive       (new)

 - Two additional new settings, on Defaults Page 1, which affect files as they
   are moved are the following:
     Remove `Uploaded By:' lines when files are moved?
     Remove `Files:/Oldest:/Newest:' lines when files are moved?

 - Added a /MOVE command line parameter which will move all scheduled files to
   their respective directories when it is appropriate to move them (i.e. the
   number of days after upload specified has been reached).  Usage:
        PCBFILER /MOVE

 - Added a /AUTO command line parameter which will automate the process of
   loading a DIR file, applying the rules to the directory (ALT-R in the
   editor) and then exiting and saving the requests.  Example:
        PCBFILER /AUTO:0:20:C:\PCB\RULES\MAINUPLD.RLS
        PCBFILER /AUTO:1:1:C:\PCB\RULES\SUPPORT.RLS
        PCBFILER /MOVE


PCBSETUP.EXE
============

 - Added an Accounting Configuration screen.  
   This is the place to setup the new accounting features

 - After you have installed the Accounting Support PSA (via PCBSM) and
   configured the various charges and paybacks for the credit system, you must
   then instruct PCBoard as to which of your callers will be affected by this
   system.  You can affect all of them, or just some of them, at your own
   discretion.  

 - It is important to note that File Debits will NOT be charged, nor will any
   File Credits be given, if the Debit or Credit Multiplier is set to ZERO.

 - The CMD.LST file has two new columns:  Charges Per Minute and Charges Per
   Use.  These two columns allow you to define charges (or paybacks if
   negative) for the use of any PPE, MNU or Keystroke Replacement.

 - Similar to the new columns in CMD.LST, the DOORS.LST has the same two
   additions, plus a minor modification to the "Path to DOOR Files" column.

 - Three new Conference-Specific settings have been added for the purposes of
   customizing your Accounting Configuration to suit your specific needs.
   These charges can be found by going to the conference setup screen and,
   once there, pressing the PGDN key to move to the next screen.  An the bottom
   of the right hand column, you will then see the following three settings:
      Charge Per Minute          :       10
      Charge Per Message Read    :        5
      Charge Per Message Written :      100

 - Incorporated new virtual memory management routines, and utilized C++ object
   oriented programming, resulting in the following changes being made possible
   to the internal editors (BLT.LST, DIR.LST, DOOR.LST, DLPATH.LST, SCRIPT.LST,
   PWRD, FSEC, UPSEC, TCAN, PCBPROT.DAT, PCBML.DAT, CMD.LST, ALLFILES.LST,
   FILETCAN, plus the 4 FIDO editors):

   a) They are no longer restricted to a 64K limit
   b) They all have an ALT-R (repeat line) command (previously only some did)
   c) They show more on screen, plus a 50-line mode (ALT-5) is available

 - Modified the QWK name field so that an extension cannot be placed in the
   name definition.

 - Added the ability to create a CNAMES.IDX file, which is an index of the
   conference names.  This file is created if:  a) you do a full save, or b)
   you do a quick save after having changed one of your conference names.
   PCBoard can then make use of this index for "J name" and "J S" commands.

 - Modified the Modem Configuration screen to allow for a second modem init
   string to be defined.  (if both are defined, then both are sent)  Also added
   a Modem Answer string so that you can change the default of "ATA" to answer
   the modem.

 
PCB Zmodem (send and receive)
=============================

 - Added the ability to scan the DLPATH.LST or ALLFILES.LST files, including
   any %FILESPEC.IDX files included within, to determine if a file exists
   prior to allowing it to be uploaded - similar to the way internal batch
   upload protocols work in PCBoard. (ZMRECV.EXE)

 - Modified the CPS calculations to make them more accurate, especially under
   OS/2.

 
PCBSM.EXE
=========

 - Added a new Accounting Support PSA (PCBoard Supported Allocation) into
   both PCBoard and PCBSM.  Installing the Accounting Support PSA enables the
   accounting features in your system.  

 - Added a new QWK/Net Support PSA (PCBoard Supported Allocation) into
   both PCBoard and PCBSM.  Installing the QWK/Net Support PSA enables the
   features outlined in the PCBoard section of this document for QWK/Net.

 - Enhanced both PCBoard and PCBSM to allow for large user index files.  These
   index files allow the total number of users to go beyond 65,535, which was
   the limit for PCBoard previously.  Also, added new virtual memory management
   routines to PCBSM which allow PCBSM to handle larger files (sorting and
   indexing) much faster by making use of available resources (ems, xms, disk).
   In both programs, the large index files are *only* used when an environment
   setting is used:    SET PCB=/BIGNDX


PPL 3.0 New features:
=====================

- I. User Defined Functions and Procedures

         Using user defined functions and procedures almost eliminates
  the need to use GOTO and completly eliminates the need for GOSUB
  statements. PPL programs can now take advantage of the benefits of
  structured programming. 
      
  Example:

    DECLARE PROCEDURE  hello()
    DECLARE PROCERDURE goodbye()
    DECLARE PROCEDURE  farewell()

    BEGIN
      hello()
      goodbye()
      farewell()
    END
    PROCEDURE hello()
      PRINT "Hello "
    ENDPROC
    PROCEDURE goodbye()
      PRINT "Goodbye "
    ENDPROC
    PROCEDURE farewell()
      PRINT "Farewell "
    ENDPROC


- II. SELECT CASE

          The SELECT CASE construct allows you to organize multiple
  execution paths into a clean, easy to read format. If you are
  unfamiliar with how a BASIC SELECT CASE or C SWITCH construct works
  you can think of it as being similar to a IF-ELSEIF-ELSE construct.
  
  Here is how a SELECT CASE construct looks in PPL
      INTEGER i
      LET i = 3
      SELECT CASE (i)
          CASE 1
                PRINTLN "i = 1"
                proc1(i)
          CASE 2,6,10
                PRINTLN "i is 2,6 or 10"
                proc2(i)
          CASE 3
                PRINTLN "i is 3"
          CASE 11..35
                PRINTLN "i is between 11 and 35"
          CASE 50..60,64,78
                PRINTLN "I is between 50 and 60 or 64 or 78
          DEFAULT
                PRINTLN "i is not a valid value"
      END SELECT

  
- III. DBase III+

     DCREATE    channel,name,exclusive,fieldInfo ; create DBF file
     DOPEN      channel,name,exclusive           ; open DBF file
     DCLOSE     channel                          ; close DBF file
     DSETALIAS  channel,name                     ; set DBF alias
     DPACK      channel                          ; pack DBF file
     DLOCK      channel                          ; lock DBF file
     DLOCKF     channel                          ; lock DBF file (same as DLOCK)
     DLOCKR     channel,recno                    ; lock a record
     DLOCKG     channel,recnos,count             ; lock a group of records
     DUNLOCK    channel                          ; unlock any current locks
     DNCREATE   channel,name,expression          ; create NDX file
     DNOPEN     channel,name                     ; open NDX file
     DNCLOSE    channel,name                     ; close NDX file
     DNCLOSEALL channel                          ; close all NDX files
     DNEW       channel                          ; start a new record
     DADD       channel                          ; add the new record
     DAPPEND    channel                          ; append a blank record
     DTOP       channel                          ; go to top record
     DGO        channel,recno                    ; go to specific record
     DBOTTOM    channel                          ; go to bottom record
     DSKIP      channel,number                   ; skip +/- a number of records
     DBLANK     channel                          ; blank the record
     DDELETE    channel                          ; delete the record
     DRECALL    channel                          ; recall the record
     DTAG       channel,name                     ; select a tag
     DSEEK      channel,expression               ; string or double
     DFBLANK    channel,name                     ; blank a named field
     DGET       channel,name,var                 ; get a value from a named field
     DPUT       channel,name,expression          ; put a value to a named field
     DFCOPY     channel,name,channel,name        ; copy a field to a field
     DCLOSEALL                                   ; close all DBF files

     Functions:
     ~~~~~~~~~~
     DRECCOUNT (channel)        (INTEGER)        ; return the number of records
     DRECNO    (channel)        (INTEGER)        ; return the current record number
     DBOF      (channel)        (BOOLEAN)        ; return the begin of file status
     DEOF      (channel)        (BOOLEAN)        ; return the end of file status
     DDELETED  (channel)        (BOOLEAN)        ; return the deleted flag
     DCHANGED  (channel)        (BOOLEAN)        ; return the changed flag
     DFIELDS   (channel)        (INTEGER)        ; return count of fields
     DNAME     (channel,number) (STRING)         ; return name of numbered field
     DTYPE     (channel,name)   (STRING)         ; return type of named field
     DLENGTH   (channel,name)   (INTEGER)        ; return length of named field
     DDECIMALS (channel,name)   (INTEGER)        ; return decimals of named field
     DSELECT   (alias)          (INTEGER)        ; returns channel assiciated with alias
     DSEEK     (channel,expression) (INTEGER)    ; returns error status ( 0|1 )
                                                ; or seek success (0 = Error
                                                ; 1 = success, 2 = following record
                                                ; 3 = end of file )
     DGETALIAS (channel)        (STRING)                 ; return the current alias
     DCLOSEALL                  (BOOLEAN) error status   ; close all DBF files
     DOPEN     (channel,name,exclusive)(BOOLEAN) error   ; open DBF file
     DCLOSE    (channel)        (BOOLEAN) error status   ; close DBF file
     DSETALIAS (channel,name)   (BOOLEAN) error status   ; set DBF alias
     DPACK     (channel)        (BOOLEAN) error status   ; pack DBF file
     DLOCK     (channel)        (BOOLEAN) error status   ; lock DBF file
     DLOCKR    (channel,recno)  (BOOLEAN) error status   ; lock a record
     DUNLOCK   (channel)        (BOOLEAN) error status   ; unlock any current locks
     DNOPEN    (channel,name)   (BOOLEAN) error status   ; open NDX file
     DNCLOSE   (channel,name)   (BOOLEAN) error status   ; close NDX file
     DNCLOSEALL(channel)        (BOOLEAN) error status   ; close all NDX files
     DNEW      (channel)        (BOOLEAN) error status   ; start a new record
     DADD      (channel)        (BOOLEAN) error status   ; add the new record
     DAPPEND   (channel)        (BOOLEAN) error status   ; append a blank record
     DTOP      (channel)        (BOOLEAN) error status   ; go to top record
     DGO       (channel,recno)  (BOOLEAN) error status   ; go to specific record
     DBOTTOM   (channel)        (BOOLEAN) error status   ; go to bottom record
     DSKIP     (channel,number) (BOOLEAN) error status   ; skip +/- a number of records
     DBLANK    (channel)        (BOOLEAN) error status   ; blank the record
     DDELETE   (channel)        (BOOLEAN) error status   ; delete the record
     DRECALL   (channel)        (BOOLEAN) error status   ; recall the record
     DTAG      (channel,name)   (BOOLEAN) error status   ; select a tag
     DFBLANK   (channel,name)   (BOOLEAN) error status   ; blank a named field
     DGET      (channel,name)   (STRING)                 ; get a value from a named field
     DPUT      (channel,name,expression)(BOOLEAN) error  ; put a value to a named field
     DFCOPY    (channel,name,channel,name)(BOOLEAN) error; copy a field to a field
     DERR      (channel)        (BOOLEAN)        ; return error flag for channel
     DERRMSG   (channel,errcode)(STRING)         ; returns last DBase error text.


- IV. Miscellaneous Functions and Statements

        DRIVESPACE(drivespec)           space left on drive
        SETLMR conf#,msg#
        SETENV env_var=newvalue         set DOS environment variable
        FCLOSEALL                       closes all open file channels
        FNEXT                           next available file channel
        HICONFNUM()                     highest conf number available
        OUTBYTES()                      bytes waiting in modem output buffer
        INBYTES()                       bytes waiting in modem input buffer
        PCBMAC()                        expanded text of a pcb macro!
        CRC32()                         CRC of a file or string
        ACTMSGNUM()                     # of active msg in current conference
        STACKLEFT()                     # bytes left on the system stack
        STACKERR()                      boolean - stack error occured?
        ACCOUNT(INTEGER field)          amount of credits charged for services
                                        corresponding to the field parameter.
        MSGTOFILE(conf,msg_no,filename) copy a message to a file
