home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / portfoli / pbas45.lzh / pbasic.txt < prev    next >
Text File  |  1991-08-21  |  58KB  |  1,875 lines

  1. Portfolio BASIC, version 4.5  (c) 1991 BJ Gleason
  2.  
  3. by BJ Gleason,  The American University
  4.  
  5.  
  6. INTRODUCTION
  7.  
  8.      PBASIC is a simple BASIC interpreter.  It only requires 39k
  9.      of disk space and about 60k of memory to run.  PBASIC is a
  10.      batch oriented interpreter.  It will also interact with the
  11.      built-in editor for program development.
  12.  
  13.      PBASIC was one of the winners in the Compuserve/Portfolio
  14.      Conference Programming Contest, 1990.
  15.  
  16.  
  17. A NOTE FROM THE AUTHOR
  18.  
  19.      A number of considerate users have offered their help.  If
  20.      you have an interesting application that you have developed
  21.      in PBASIC, I will be more than happy to distribute your code
  22.      in future releases.  Please make sure to place your name and
  23.      other information as REMarks in the program.  You can
  24.      include a documentation file as well.  The only thing that I
  25.      ask is that you do not charge for the use of your program,
  26.      as I am not charging for the use of this interpreter.  Send
  27.      me a note, and tell me where the code is and I will include
  28.      it in the package.
  29.  
  30.      Thanks to all you have helped and are going to help!
  31.  
  32.      Now that files and such have been added, I am going to take
  33.      a bit of a break.  I will release upgrades as bugs dictate,
  34.      and will, as always, listen to you, the user.  But quite
  35.      frankly, except for a few minor functions, I don't think
  36.      there is much else to add.  PBASIC has grown about as large
  37.      as I would like it to. If it grows any larger, there will be
  38.      little room left for your code.
  39.  
  40.  
  41. MANUAL AVAILABLE
  42.  
  43.      A 250 page manual on PBASIC is now available.  The manual is
  44.      8.5 x 11, and has comb binding so it can lay flat.  Each
  45.      instruction is explained in detail, with examples.  The
  46.      manual costs 35 dollars, including postage.  If you are
  47.      interested in obtaining the manual, send a check or money
  48.      order to "BJ Gleason" at the address on the last page of
  49.      this document.
  50.  
  51.  
  52.  
  53. WHAT THE CRITICS SAY:
  54.  
  55.      PBASIC 2.1 was reviewed by John Jainschigg in Atari
  56.      Explorer, January 1991.  Here is some of he said:
  57.  
  58.      "...PBASIC is a terrific little job of programming... Though
  59.      freeware, PBASIC has been professionally and completely
  60.      documented... even those who are waiting on tenterhooks for
  61.      Atari's own Portfolio BASIC may find PBASIC very useful in
  62.      the interim.  The program is reasonably reliable, complete,
  63.      and professionally executed - and at the present time,
  64.      stands as the best alternative for casual programming on the
  65.      Portfolio system."
  66.  
  67.      Ron Luks, Sysop of the APORTFOLIO forum on Compuserve says:
  68.      "...I was blown away!!!  Its FAR, FAR more complete and
  69.      polished that I ever would have expected for a freeware
  70.      product.  The PBASIC manual is equal to the best I've seen
  71.      for any commercial program, and superior to 90% or the
  72.      rest."
  73.  
  74.  
  75. DESIGN CONSIDERATION
  76.  
  77.      When I was laying out the initial design of PBASIC, here are
  78.      some of the topics I took into consideration:
  79.  
  80.           - Microsoft BASIC compatible.
  81.           - Size of Interpreter (as small as possible).
  82.           - Unique features of the Portfolio.
  83.           - Using the Built-in editor for Program Editing.
  84.           - Reasonable size BASIC programs.
  85.  
  86.  
  87. NEW FEATURES FOR VERSION 4.5
  88.  
  89.      New Statements: COMOUT, COMSET, LPCHR$
  90.      New Functions: COMIN, COMSTAT
  91.      Added Functions.
  92.      Added program encoding for security.  Use PBCODE to encode. 
  93.           PBASIC will decode and execute.
  94.      Much faster .PGC graphics support, thanks to Don Messerli. 
  95.           Graphic screens can now be displayed at about 4 frames
  96.           per second.
  97.      Added COM port support.
  98.      Line numbers must be between 1 and 65535.
  99.      GOTO and GOSUB now support variables: GOTO X.
  100.      Function PORT has been modified to return a -1 instead of 1. 
  101.           This change allows the use of IF NOT PORT THEN...
  102.      Fixed two dimensional array addressing.
  103.      Fixed ON...GOSUB error.
  104.      Fixed -0 error on multiplication.
  105.      Fixed (') Remark problem.
  106.      Fixed MID$ for values greater than length of string.
  107.      Fixed RAND(x) for x <= 0.
  108.      Added LPCHR$(x) to print unfiltered characters.
  109.      Modified INPUT# to accept EOF as end of string/number.
  110.      Fixed LPRINT newline.
  111.  
  112.  
  113. INTERFACING WITH THE EDITOR
  114.  
  115.      Instead of trying to create an editor, PBASIC makes full use
  116.      of the built in editor.
  117.  
  118.      If you run BASIC without any parameters, it will load the
  119.      last file you used in the editor.  To speed up the process,
  120.      you might want to rename PBASIC.EXE to P.EXE, so you only
  121.      need to type P<RETURN> at the prompt.  You can also specify
  122.      a file to execute on the command line.
  123.  
  124.      Whenever an error is detected, an error message is
  125.      displayed, along with the line number.  Press any key and
  126.      PBASIC will invoke the built-in editor and point to the
  127.      error position.  This will only happen if the file you are
  128.      executing is the same as the one you are editing.  On other
  129.      systems, you will be returned to the DOS prompt.
  130.  
  131.      On a PC compatible machine, the error message will include
  132.      the line number, character position and offset from the
  133.      front of the file.  This is so that the PBASIC EDITOR, for
  134.      the PC, can determine where the error is and point to it.
  135.  
  136.      ALTR.COM is a small TSR program that will, only from inside
  137.      the editor, save the current file and invoke PBASIC. 
  138.      PBASIC.EXE should be rename P.EXE for the <ALT-R> command to
  139.      work.  ALTR takes up about 450 bytes.  It can be removed by
  140.      rebooting the machine.  It can only be loaded into memory
  141.      once.  The <ALT-R> command will only work inside the editor.
  142.  
  143.      When the program is finished, PBASIC will wait for a
  144.      keypress and then return you to the editor.
  145.  
  146.  
  147. RUNNING PBASIC
  148.  
  149.           There are two forms to execute PBASIC:
  150.  
  151.                PBASIC [-T]
  152.  
  153.                PBASIC filename.ext [-T]
  154.  
  155.      In the first form, the default file is the last one edited
  156.      in the built-in editor on the Portfolio.  The second form
  157.      loads and executes the specified file.  If you leave off the
  158.      extension, the default ".BAS" is added.
  159.  
  160.      If you have run the ALTR program before editing your code,
  161.      you can execute PBASIC by pressing <ALT-R>.
  162.  
  163.      The command line switch -T will turn on the trace feature. 
  164.      This is the same as putting TRON at the beginning of you
  165.      program.
  166.  
  167.  
  168. GENERAL
  169.  
  170.      Source code is standard ASCII format.
  171.  
  172.      Source code can be in upper or lower case.
  173.  
  174.      200 floating point variables.  Variable names can not exceed
  175.      8 characters in length.
  176.  
  177.      Strings are always allocated 256 bytes.
  178.  
  179.      FOR/NEXT loops may be nested 10 deep.
  180.  
  181.      GOSUBs may be nested 10 deep.
  182.  
  183.      WHILE / WEND may be nested 10 deep.
  184.  
  185.      REPEAT / UNTIL may be nested 10 deep.
  186.  
  187.      Line numbers are not required for each statement.  Only 100
  188.      line numbers are allowed.  They do not have to be in
  189.      sequence.  Line numbers can range from 1 to 65535.
  190.  
  191.      Multiple statements per line (:) is supported.
  192.  
  193.      Up to 10 Files can be open at the same time.
  194.  
  195.  
  196. DEVELOPING PROGRAMS WITH GWBASIC
  197.  
  198.      You can develop your programs on the PC with Microsoft BASIC
  199.      or QuickBASIC.  If using Microsoft BASIC, be sure to save
  200.      the file in ASCII format [ SAVE "myfile",A ] so that it can
  201.      be read by PBASIC.  
  202.  
  203.      For easier development on a PC, PBE, the PBASIC Editor is
  204.      now available.  PBE operates similar to Turbo Pascal, and
  205.      allows you to execute programs from inside the editor.  IT
  206.      will also let you transfer files back and forth to the
  207.      Portfolio.
  208.  
  209. MATH EXPRESSIONS
  210.  
  211.           Single precision math.  Parentheses supported. 
  212.      Standard operator evaluation.  Hexadecimal and Octal
  213.      constants are supported.
  214.  
  215.           - negation
  216.           ^ exponent
  217.           * multiply
  218.           / divide
  219.           % remainder (MOD)
  220.           \ integer division
  221.           + addition
  222.           - subtraction
  223.           AND, OR, NOT, XOR, EQV, IMP
  224.           <, >, <=, >=, =, <>
  225.      
  226.  
  227. NOTES ON CONVENTIONS USED
  228.  
  229.      An expression (exp) can contain variables, constants.  When
  230.      a dummy exp is indicated, it is suggested that you use a
  231.      constant, i.e. POS(0).
  232.  
  233.      A variable name (varname) must be used when indicated.
  234.  
  235.      Unless otherwise noted, all parameters can be constants,
  236.      variables or equations.
  237.  
  238.      
  239. BASIC STATEMENTS
  240.  
  241.           I have tried to keep the syntax and semantics for the
  242.      statements as close to Microsoft BASIC as possible.  The
  243.      notes presented indicate exceptions.  There are some
  244.      statements included that are not from Microsoft.  They will
  245.      not run on GWBASIC.
  246.  
  247.  
  248.      BLOAD     filename, offset
  249.  
  250.                Load a file to location SEG:offset.
  251.  
  252.  
  253.      BSAVE     filename, offset, length
  254.  
  255.                Copies memory to file, starting from SEG:offset
  256.                for length bytes.
  257.  
  258.  
  259.  
  260.      CALL      address
  261.                Transfer control to SEG:address.  Data is passed
  262.                via the registers with the REG statement/function.
  263.  
  264.  
  265.      CALL INTERRUPT intno
  266.  
  267.                Invoke DOS interrupt intno.  Data is passed via
  268.                the registers with the REG statement/function.
  269.  
  270.  
  271.      CHAIN     filename
  272.  
  273.                Load and execute the indicated file.  All
  274.                variables are retained.
  275.  
  276.  
  277.      CHDIR     path
  278.  
  279.                Change the current directory to path.
  280.  
  281.  
  282.      CLOSE#    fileno
  283.  
  284.                Close the file.
  285.  
  286.  
  287.      CLS
  288.  
  289.                Clears the screen.
  290.  
  291.  
  292.      COMOUT    = val
  293.  
  294.                Send val to serial port.
  295.  
  296.  
  297.      COMSET    = config
  298.  
  299.                Set the serial port to the config byte, bits
  300.                defined as follows:
  301.  
  302.           7 6 5          4 3        2             1 0 
  303.           Baud Rate      Parity     Stop Bits     Word Length
  304.           0 0 0 = 110    x 0 = none 0 = 1 bits    1 0 = 7 bits
  305.           0 0 1 = 150    0 1 = odd  1 = 2 bits    1 1 = 8 bits
  306.           0 1 0 = 300    1 1 = even
  307.           0 1 1 = 600
  308.           1 0 0 = 1200
  309.           1 0 1 = 2400
  310.           1 1 0 = 4800
  311.           1 1 1 = 9600
  312.  
  313.      DATA      list of numbers/strings
  314.  
  315.                Allows for numbers to be stored inline.  Data
  316.                statements MUST have a line number.  Numbers are
  317.                separated by commas.  Data statements may be
  318.                located on any line of the program.  Strings must
  319.                be enclosed in quotes.
  320.  
  321.                     12 DATA 1,2,3,4,5,6
  322.  
  323.  
  324.      DECR(var)
  325.  
  326.                Decrement the variable by 1.
  327.  
  328.  
  329.      DEF funname(params) = expresion
  330.  
  331.                Creates a functions called funname.  All variables
  332.                are global.  Function names do not have to begin
  333.                with FN.  Only numerical functions are allowed.
  334.  
  335.  
  336.      DEF SEG   = exp
  337.  
  338.                Assigns a segment address for direct memory
  339.                accessing via PEEK, POKE and CALL.
  340.  
  341.  
  342.      DIM       varname(size,[size])[,varname(size,[size])....]
  343.  
  344.                Creates a one or two dimensional array of single
  345.                precision floating point variables.  Arrays start
  346.                at 0.  Arrays are not initialized to a value. 
  347.                Arrays must be defined before they are used. 
  348.                Upper array bounds are not checked, arrays are not
  349.                allowed to go below 0.
  350.  
  351.  
  352.      END
  353.  
  354.                SYSTEM and END have the same effect.
  355.  
  356.  
  357.      ERROR     errnum
  358.  
  359.                Simulate Error for testing ON ERROR GOTO.
  360.  
  361.  
  362.      EVAL      var$
  363.  
  364.                Evaluates the contents of var$ as if it was part
  365.                of a BASIC program.
  366.  
  367.  
  368.      FOR       varname = exp TO exp [STEP exp]
  369.  
  370.  
  371.      FORMFEED
  372.  
  373.                Send a formfeed to the printer.
  374.  
  375.  
  376.      GOSUB     line number
  377.  
  378.  
  379.      GOTO      line number
  380.  
  381.  
  382.      IF        exp THEN statement [ ELSE statement ]
  383.  
  384.  
  385.      INCR(var)
  386.  
  387.                Increment var by 1.
  388.  
  389.  
  390.      INPUT     ["prompt" (,|;)] varname
  391.  
  392.                Reads input from the keyboard.  Only one variable
  393.                is allowed per input.  If a comma (,) separates
  394.                the prompt string and the varname, no question
  395.                mark (?) will be printed.  If a semi-colon (;) is
  396.                used, the question mark will appear. 
  397.  
  398.      INPUT#    fileno, varname
  399.  
  400.                This will read a variable from a disk file.
  401.  
  402.  
  403.      KILL      filename
  404.  
  405.                Delete filename from disk.
  406.  
  407.  
  408.      LOCATE    row,col[,cursor]
  409.  
  410.                Move the cursor to row, col.  The optional
  411.                parameter cursor can be used to turn the cursor on
  412.                or off.  On the Portfolio: 0=off, 1=underline,
  413.                2=block.  On the PC: 0=off, 1=block, 2=block.
  414.  
  415.  
  416.      LPCHR$(x)
  417.                Send the ASCII character of value x to the
  418.                printer.  This was done to allow the printing of
  419.                characters 0 and 9, where are filtered by the
  420.                LPRINT statement.
  421.  
  422.  
  423.      LPRINT    list of expressions
  424.  
  425.                Send output to printer.  See PRINT.
  426.  
  427.  
  428.      MKDIR     path
  429.  
  430.                Create a directory named path.
  431.  
  432.  
  433.      NEXT      [varname]
  434.  
  435.                If no variable name is given, last FOR statement
  436.                is used.  If variable name is given, matching FOR
  437.                is searched for and used, if found.  This process
  438.                allows for exiting early from inner loops.
  439.  
  440.  
  441.      NUMFMT    = "format"
  442.  
  443.                In PBASIC numbers are not displayed in classic
  444.                GWBASIC format.  GWBASIC always prints numbers
  445.                with a leading space or -, and a trailing space. 
  446.                To make the porting of GWBASIC programs easier,
  447.                you can specify the format that numbers are to
  448.                print with the NUMFMT statement.  The default is
  449.                "%g", and GWBASIC format would be "% g ".  This
  450.                can also be used if you want all numbers in
  451.                scientific or other format.  See the PRINT USING
  452.                description for the format.
  453.  
  454.  
  455.      ON ERROR GOTO line number
  456.  
  457.                Error trapping.  When an error occurs, user will
  458.                be transferred to line number.  A line number of 0
  459.                will disable error trapping.
  460.  
  461.  
  462.      ON        exp  GOTO  list of line numbers
  463.  
  464.  
  465.      ON        exp  GOSUB list of line numbers
  466.  
  467.  
  468.      OPEN      "mode",fileno,filename
  469.                Open a file.  Mode can be:
  470.  
  471.                     I    Input
  472.                     O    Output
  473.                     A    Append
  474.  
  475.                Fileno can be between 1 and 10.  Only ten files
  476.                may be open at any one time.  Filename is any
  477.                standard MS/DOS filename.
  478.  
  479.  
  480.      OUT       port, exp
  481.  
  482.                Send value to the indicated port.
  483.  
  484.  
  485.      PGLOAD    filename
  486.  
  487.                Load a .PGC file into screen memory.
  488.  
  489.  
  490.      PGSAVE    filename
  491.  
  492.                Save video memory to .PGC file.
  493.  
  494.  
  495.      PGSHOW    filename, delay
  496.  
  497.                Display a .PGC file, and wait delay seconds.  If
  498.                delay is 0, wait for keypress.
  499.  
  500.                
  501.      POKE      addr, exp
  502.  
  503.                Places value at SEG:addr.  SEG is set via the DEF
  504.                SEG statement.  NOTE: Due to the design of the
  505.                Portfolio, if you poke screen memory (DEF
  506.                SEG=&HB000), the value may not appear.  After you
  507.                poke, you should use the REFRESH statement to
  508.                update the screen.
  509.  
  510.  
  511.      PRINT[@l,] list of expressions
  512.  
  513.                List of expressions can consist of strings,
  514.                variables, constants or expressions, separated by
  515.                the comma (,) or semi-colon (;) or a space ( ). 
  516.                Starting with version 4.0, the ? can be used as an
  517.                abbreviation for PRINT.  @l indicate screen
  518.                position 0-319, 40 columns by 8 rows.  For Model
  519.                100 compatibility.
  520.  
  521.      PRINT#    fileno, list of expressions
  522.  
  523.                Same as PRINT, but send output to file.
  524.  
  525.  
  526.      PRINT[@l,] USING format; list of variables
  527.  
  528.                This is not GWBASIC compatible.  To implement the
  529.                full version of the PRINT USING would take up too
  530.                much room.  This version is like C's printf. 
  531.                Format is a string, indicating the format to print
  532.                a single variable.  Each variable in the list is
  533.                printed with that format.  For more details, refer
  534.                to Turbo C's reference manual.  @l indicate screen
  535.                position 0-319, 40 columns by 8 rows.  For Model
  536.                100 compatibility.
  537.  
  538.                Format Specifiers:
  539.  
  540.                     %s        String
  541.                     %f        Real [-]dddd.dddd
  542.                     %e        Real [-]d.ddde[+/-]ddd
  543.                     %E        Real [-]d.dddE[+/-]ddd
  544.                     %g        Real, general format, e or f
  545.                     %G        Real, general format, E or f
  546.                     %%        Print % character in format string
  547.                     % g       Print numbers in GWBASIC format
  548.                     
  549.                Widths/Precisions:
  550.  
  551.                     n         n characters are printed
  552.                     0n        n characters with leading 0's
  553.                     .0        no decimal point
  554.                     .n        n digits after the decimal point
  555.  
  556.                Examples                      Output
  557.      
  558.                     "|%10.2f|";123.123       |    123.12|
  559.                     "|%10.0f|";123.123       |       123|
  560.                     "|%5.0f%%|";10;15        |   10%||   15%|
  561.                     "|%010.2f|";123.456      |0000123.46|
  562.                     "|%e|";456.789           |4.56789e+02|
  563.                     "|%E|";567.901           |5.67901E+02|
  564.  
  565.  
  566.      PRINT#    fileno, USING format; list of variables
  567.  
  568.                Same as PRINT USING, but send output to file.
  569.  
  570.  
  571.  
  572.      PRINTER   
  573.                This is a toggle to start copying all PRINT
  574.                statements to the printer.  Issue it again and it
  575.                will toggle off.  It can be used instead of
  576.                converting all PRINTs to LPRINTs.  Information
  577.                will still be displayed on the screen.  This will
  578.                not wrap the output lines like the screen will.
  579.  
  580.  
  581.      PRTSC
  582.  
  583.                This invokes the PRINT SCREEN function to copy the
  584.                screen out to the printer.  If you are using a
  585.                laser printer, you might want to use a FORMFEED
  586.                after this to do a page eject.
  587.  
  588.  
  589.      PSET      (row, col) [, exp]
  590.  
  591.                Set the pixel at row, col to exp.  The Portfolio,
  592.                regardless of the screen mode, has a maximum
  593.                64x240 for row, col.  Exp can evaluate to 0 or 1.
  594.  
  595.  
  596.      RANDOMIZE
  597.  
  598.                Initialize the random number generator.
  599.  
  600.  
  601.      READ      list of variables
  602.  
  603.                Read the values of the variables from the DATA
  604.                statements.  Variables can be simple or array.
  605.  
  606.  
  607.      REG       rn, val
  608.  
  609.                Set rn to val.  Allows for access to the 8086's
  610.                register set.  Values for rn are:
  611.  
  612.                     0 - Flags
  613.                     1 - AX
  614.                     2 - BX
  615.                     3 - CX
  616.                     4 - DX
  617.                     5 - SI
  618.                     6 - DI
  619.      
  620.  
  621.      REM
  622.  
  623.                Remark.  The rest of the line is ignored.  You can
  624.                also use the quote (') mark as a REM statement.
  625.  
  626.      REPEAT / UNTIL exp
  627.  
  628.                Statements between the REPEAT and UNTIL statements
  629.                are executed until exp becomes TRUE.
  630.  
  631.  
  632.      RESTORE   [line number]
  633.  
  634.                Sets the internal data pointer to the specified
  635.                line number.  Line number specified must be a data
  636.                statement.  If no line number is given, the data
  637.                pointer will point back to the first data
  638.                location.
  639.  
  640.  
  641.      RESUME    line number
  642.  
  643.                After an error is trapped via ON ERROR GOTO,
  644.                resume will allow a program to continue at the
  645.                indicated line number.
  646.  
  647.  
  648.      RETURN
  649.  
  650.                Return from a subroutine invoked via a GOSUB.
  651.  
  652.  
  653.      RMDIR
  654.  
  655.                Remove a directory from the disk.  Directory must
  656.                be empty.
  657.  
  658.  
  659.      RUN       filename
  660.  
  661.                Load and execute the indicated program.  All the
  662.                variables are reset.
  663.  
  664.  
  665.      SCREEN    exp
  666.  
  667.                Set the screen mode.  There is no testing for
  668.                validity.  Some of the values that work on the
  669.                Portfolio are:
  670.  
  671.                      4   graphics  320x200
  672.                      5   graphics  320x200
  673.                      6   graphics  640x200
  674.                      7   text      80x25
  675.                      8   graphics  160x200
  676.                     10   graphics  640x200
  677.                These are standard PC modes, but remember that the
  678.                Portfolio Screen is only 240x64.
  679.  
  680.                If you use the screen function of the portfolio,
  681.                it is highly recommended that you set the screen
  682.                back to mode 7 before you exit.  Many portfolio
  683.                utilities only work in mode 7.
  684.  
  685.                At present, text will not be displayed properly on
  686.                a graphics screen.
  687.  
  688.  
  689.      STOP
  690.  
  691.                To allow for "breakpoints", STOP will terminate
  692.                the program and display the line number.  It will
  693.                point the built-in editor to the last position
  694.                executed if the editor file is the same as the
  695.                file being executed.
  696.  
  697.  
  698.      SWAP      varname, varname
  699.  
  700.                Exchange the contents of two variables.  They must
  701.                be of the same type.
  702.  
  703.  
  704.      SYSTEM
  705.  
  706.                END and SYSTEM have the same effect.
  707.  
  708.  
  709.      TROFF
  710.  
  711.                Disable line tracing.
  712.  
  713.  
  714.      TRON
  715.  
  716.                Enable line tracing.  Will display the line number
  717.                in brackets ([x]).  Using this statement will slow
  718.                down the program execution.  Can be placed
  719.                anywhere in program.
  720.  
  721.  
  722.      WAIT
  723.  
  724.                Unlike the GWBASIC version, this only waits for a
  725.                key press.  It gives no prompt and returns no
  726.                value.
  727.  
  728.  
  729.      WHILE exp / WEND
  730.  
  731.                All the statements between the WHILE and WEND
  732.                statements are executed while exp is TRUE.  If exp
  733.                is FALSE, the loop is not executed.
  734.  
  735.  
  736.      WRITE     list of expressions
  737.  
  738.                Similar to PRINT, but each element is separated by
  739.                a command (,), and strings are enclosed in quotes
  740.                (").
  741.  
  742.      WRITE#    fileno, list of expressions
  743.  
  744.                Same as WRITE, but send output to file.
  745.  
  746.  
  747.  
  748. BASIC FUNCTIONS
  749.  
  750.           I have tried to keep the syntax and semantics for the
  751.      functions as close to Microsoft BASIC as possible.  The
  752.      notes presented indicate exceptions.
  753.  
  754.  
  755.      ABS(exp)
  756.  
  757.                Returns the absolute value of exp.
  758.  
  759.  
  760.      ACOS(exp)
  761.  
  762.                Returns the arc cosine of exp.
  763.  
  764.  
  765.      ASC(x$)
  766.  
  767.                Returns ASCII value of the first character in x$.
  768.  
  769.  
  770.      ASIN(exp)
  771.  
  772.                Returns the arc sine of exp.
  773.  
  774.  
  775.      ATN(exp)
  776.  
  777.                Returns the arc tangent of exp.
  778.  
  779.  
  780.      BIN$(n)
  781.                Convert n to a Binary string.
  782.  
  783.  
  784.      CHR$(n)
  785.  
  786.                Returns the ASCII character of the value n.
  787.  
  788.  
  789.      COMMAND$
  790.  
  791.                Returns the command line tail.
  792.  
  793.  
  794.      COMIN
  795.  
  796.                Returns the ASCII value from the serial port.
  797.  
  798.  
  799.      COMSTAT
  800.  
  801.                Returns the status of the serial port:
  802.  
  803.                     Bit  Significance (if set)
  804.                               Port Status
  805.                     15   timed-out
  806.                     14   transmit shift register empty
  807.                     13   transmit holding register empty
  808.                     12   break detected
  809.                     11   framing error detected
  810.                     10   parity error detected
  811.                     9    overrun error detected
  812.                     8    receive data ready
  813.                               Modem Status
  814.                     7    receive line signal detect
  815.                     6    ring indicator
  816.                     5    data-set-ready
  817.                     4    clear-to-send
  818.                     3    change in receive line signal detect
  819.                     2    trailing edge ring indicator
  820.                     1    change in data-set-ready status
  821.                     0    change in clear-to-send status
  822.  
  823.  
  824.      COS(exp)
  825.  
  826.                Returns the Cosine of exp.
  827.  
  828.  
  829.      COSH(exp)
  830.  
  831.                Returns the Hyperbolic cosine of exp.
  832.  
  833.      CSRLIN
  834.  
  835.                Returns the current cursor line.
  836.  
  837.  
  838.      DATE$     
  839.  
  840.                Returns the system date.
  841.  
  842.  
  843.      DEG(exp)
  844.  
  845.                Converts radians to degrees.
  846.  
  847.  
  848.      DMS(exp)
  849.  
  850.                Convert degrees into degrees/minutes/seconds, in
  851.                the form ddd.mmss.
  852.  
  853.  
  854.      EOF(fileno)
  855.  
  856.                Returns TRUE if fileno is at End-of-File.
  857.  
  858.  
  859.      ERL
  860.  
  861.                Return the line number the error occurred on.
  862.  
  863.  
  864.      ERR
  865.  
  866.                Returns the error number of the last error.
  867.  
  868.  
  869.      EXP(exp)
  870.  
  871.                Returns e to the power of exp.
  872.  
  873.  
  874.      FALSE
  875.  
  876.                Returns 0.
  877.  
  878.  
  879.      FIX(exp)
  880.  
  881.                Returns the integer portion of exp.
  882.  
  883.  
  884.      FRE(exp)
  885.                Returns the free amount of memory.  The parameter
  886.                exp is a dummy expression.
  887.  
  888.  
  889.      HEX$(n)
  890.  
  891.                Converts n to a hexadecimal string.
  892.  
  893.  
  894.      INKEY$
  895.  
  896.                If a key is pressed, the character is returned,
  897.                otherwise, the empty string ("") is returned.
  898.  
  899.  
  900.      INP(port)
  901.  
  902.                Returns the byte value from port.
  903.  
  904.  
  905.      INPUT$(n,#f)
  906.  
  907.                Returns the next n characters from file #f.
  908.  
  909.  
  910.      INSTR(x$,y$)
  911.  
  912.                Returns the position of y$ in x$.
  913.  
  914.  
  915.      INT(exp)
  916.  
  917.                Returns the integer portion of exp.
  918.  
  919.  
  920.      LCASE$(x$)
  921.  
  922.                Return the lowercase version of x$.
  923.  
  924.  
  925.      LEFT$(x$,n)
  926.  
  927.                Returns the leftmost n characters of x$.
  928.  
  929.  
  930.      LEN(x$)
  931.  
  932.                Returns the length of x$.
  933.  
  934.  
  935.      LOG(exp)
  936.  
  937.                Returns the natural logarithm of exp.
  938.  
  939.  
  940.      LPOS(exp)
  941.  
  942.                Returns the current position of the line printer
  943.                head.  Exp is a dummy expression.
  944.  
  945.  
  946.      LTRIM$(n$)
  947.  
  948.                Strips off any leading spaces.
  949.  
  950.  
  951.      MID$(x$,n,m)
  952.  
  953.                Returns a string from x$, starting at position n
  954.                for m characters.
  955.  
  956.  
  957.      MSD(exp)
  958.  
  959.                Converts degrees/minutes/seconds in the form
  960.                ddd.mmss to degrees.
  961.  
  962.  
  963.      OCT$(n)
  964.  
  965.                Converts n to an Octal string.
  966.  
  967.  
  968.      PBVER
  969.  
  970.                Returns the version number of PBASIC.
  971.  
  972.  
  973.      PEEK(address)
  974.  
  975.                Returns the byte from memory location SEG:address. 
  976.                SEG is set via the DEF SEG instruction.
  977.  
  978.  
  979.      PI
  980.  
  981.                Returns the value of PI = 3.14159
  982.  
  983.  
  984.      POINT(row,col)
  985.  
  986.                Returns the value of the pixel at row,col.  If
  987.                this function does not appear to work, try running
  988.                FIX0D, to fix the ROM pixel read function.
  989.  
  990.      POS(exp)
  991.  
  992.                Returns the current cursor column.  Exp is a dummy
  993.                expression.
  994.  
  995.  
  996.      RAD(exp)
  997.  
  998.                Convert degrees to radians.
  999.  
  1000.  
  1001.      RAND(exp)
  1002.  
  1003.                This will return a number between 0 and exp-1. 
  1004.  
  1005.  
  1006.      REG(rn)
  1007.  
  1008.                Returns rn's value.  Allows for access to the
  1009.                8086's register set.  Values for rn are:
  1010.  
  1011.                     0 - Flags
  1012.                     1 - AX
  1013.                     2 - BX
  1014.                     3 - CX
  1015.                     4 - DX
  1016.                     5 - SI
  1017.                     6 - DI
  1018.  
  1019.  
  1020.      RIGHT$(x$,n)
  1021.  
  1022.                Returns the rightmost n characters from x$.
  1023.  
  1024.  
  1025.      RND
  1026.  
  1027.                This will return a number between 0 and 1.
  1028.  
  1029.  
  1030.      RTRIM$(n$)
  1031.  
  1032.                Strips any trailing spaces from the string.
  1033.  
  1034.  
  1035.      SGN(exp)
  1036.  
  1037.                Returns the sign of exp.
  1038.  
  1039.                     -1   exp < 0
  1040.                      0   exp = 0
  1041.                      1   exp > 0
  1042.  
  1043.  
  1044.      SIN(exp)
  1045.  
  1046.                Returns the sine of exp.
  1047.  
  1048.  
  1049.      SINH(exp)
  1050.  
  1051.                Returns the hyperbolic sine of exp.
  1052.  
  1053.  
  1054.      SPACE$(n)
  1055.  
  1056.                Returns a string of n spaces.
  1057.  
  1058.  
  1059.      SPC(n)
  1060.  
  1061.                Returns a string of n spaces.
  1062.  
  1063.  
  1064.      SQR(exp)
  1065.  
  1066.                Returns the Square Root of exp.
  1067.  
  1068.  
  1069.      STR$(n)
  1070.  
  1071.                Returns the string representation of n.
  1072.  
  1073.  
  1074.      STRING$(n,m)
  1075.  
  1076.                Returns a string composed of n characters.  m is
  1077.                the ASCII value of the characters. 
  1078.  
  1079.  
  1080.      TAB(n)
  1081.  
  1082.                Moves the cursor to the nth column.
  1083.  
  1084.  
  1085.      TAN(exp)
  1086.  
  1087.                Returns the tangent of exp.
  1088.  
  1089.  
  1090.      TANH(exp)
  1091.  
  1092.                Returns the hyperbolic tangent of exp.
  1093.  
  1094.      TIME$
  1095.  
  1096.                Returns the system time.
  1097.  
  1098.  
  1099.      TIMER
  1100.  
  1101.                Returns the number of seconds since midnight.
  1102.  
  1103.  
  1104.      TRUE
  1105.  
  1106.                Returns -1.
  1107.  
  1108.  
  1109.      UCASE$(x$)
  1110.  
  1111.                Returns the uppercase version of x$.
  1112.  
  1113.  
  1114.      VAL(x$)
  1115.  
  1116.                Returns the numeric value of x$.
  1117.  
  1118.  
  1119.      VARSEG(var)
  1120.  
  1121.                Returns the segment of the variable.
  1122.  
  1123.  
  1124.      VARPTR(var)
  1125.  
  1126.                Returns the offset of the variable.
  1127.  
  1128.  
  1129.      WKSREAD(filename, row, col)
  1130.  
  1131.                Returns the numeric contents of the cell at row,
  1132.                col from a worksheet file.  Default Extension is
  1133.                .WKS.  Row/Col start at 0,0.  Example B5 would be
  1134.                4,1.
  1135.  
  1136.  
  1137.      WKSREAD$(filename, row, col)
  1138.  
  1139.                Returns the string contents of the cell at row,
  1140.                col from a worksheet file.  Default Extension is
  1141.                .WKS.  Row/Col start at 0,0.  Example D10 would be
  1142.                9,3.
  1143.   
  1144.  
  1145.      WKSTYPE(filename, row, col)
  1146.  
  1147.                Returns the type of the cell at row, col from a
  1148.                worksheet file.  Default Extension is .WKS. 
  1149.                Row/Col start at 0,0.  Example AB2 would be 1,27.
  1150.  
  1151.                Values returned:
  1152.                     1    EOF       12   Blank
  1153.                     13   Integer   14   Real
  1154.                     15   Label     16   Formula Result (Real)
  1155.  
  1156.  
  1157. PORTFOLIO ONLY STATEMENTS
  1158.  
  1159.      The statements in this section are specific to the Atari
  1160.      Portfolio and will not run on a regular PC.  YOU CAN LOCK UP
  1161.      YOUR REGULAR PC IF YOU ATTEMPT TO USE THESE.  Starting with
  1162.      version 4.0, using these statements on a standard PC will
  1163.      generate an error message.
  1164.  
  1165.  
  1166.      ALARM
  1167.  
  1168.                This will beep the speaker, about once a second
  1169.                until the user presses a key.  The program will
  1170.                then continue with the next statement.
  1171.  
  1172.  
  1173.      BEEP
  1174.  
  1175.                This will cause a single beep from the speaker.
  1176.  
  1177.  
  1178.      BOX       row1, col1, row2, col2, type
  1179.  
  1180.                This will draw a box.  Row1 and Col1 specify the
  1181.                upper left corner position of the box, while Row2
  1182.                and Col2 specify the lower right corner.  Type is
  1183.                0 for single line box, and 1 for a double line
  1184.                box.
  1185.  
  1186.                Trying to draw a box larger than the screen (8x40)
  1187.                has unpredictable results.
  1188.  
  1189.  
  1190.      CLICK
  1191.  
  1192.                Make the key click sound.
  1193.  
  1194.  
  1195.      DIAL      string
  1196.  
  1197.                This will dial the "number" through the speaker. 
  1198.                Valid characters for tones are: 0 1 2 3 4 5 6 7 8
  1199.                9 A B C D * #.  The letters must be in uppercase.
  1200.  
  1201.  
  1202.      DISPLAY   exp
  1203.  
  1204.                Set the Portfolio screen to Normal, Static or
  1205.                Tracked.  0=Static, 1=Normal, 2=Tracked.  The mode
  1206.                is only effective while in PBASIC.  Using this
  1207.                statement might clear the screen depending on the
  1208.                position of the cursor.
  1209.  
  1210.  
  1211.      ERRWIN    row, col, "message"
  1212.  
  1213.                This will draw a box around the message and
  1214.                display it at the specified row, col.  It will
  1215.                then beep and wait for a keypress.  The text
  1216.                underneath the message is left untouched.
  1217.  
  1218.                Trying to place the message outside the screen
  1219.                (8x40) has unpredictable results.
  1220.  
  1221.  
  1222.      GETDISPLAY
  1223.  
  1224.                This function will return the current display
  1225.                mode.  See DISPLAY for details.
  1226.  
  1227.  
  1228.      MENU(row, col, display, top line, selected, elements,
  1229.           "Title", entries....)
  1230.  
  1231.                This will display a menu, allow a selection, and
  1232.                will return the item selected.  If value returned
  1233.                is -1, then the escape has been pressed.  If the
  1234.                value returned is > 255 then (value % 256) is the
  1235.                selected element, and (value \ 256) is the top
  1236.                line.  Elements are numbered from 0.
  1237.  
  1238.                Row and Col indicate the location of the menu. 
  1239.                Display is the number of elements to display at
  1240.                one time.  The maximum is 6.  Top Line is element
  1241.                at the top of the menu, and selected is the
  1242.                element that the cursor is placed on.  Elements is
  1243.                the number of menu entries plus the Title.  The
  1244.                title string is first, followed by each entry. 
  1245.                Each element can be a string or a string variable.
  1246.  
  1247.                Example:
  1248.  
  1249.                     mc = MENU(2,2,4,0,0,7,"Demo","A", "B", "C",
  1250.                     "D", "E", "F")
  1251.  
  1252.                If the user picks A, mc = 0, for B, mc = 1.  If
  1253.                the user picks F, mc = 517, which means the entry
  1254.                is 5, and the top line was 2.  This will allow
  1255.                selection from the menu from the same position the
  1256.                second time it is invoked.
  1257.  
  1258.  
  1259.  
  1260.      OFF
  1261.  
  1262.                This will turn the Portfolio off until the user
  1263.                presses a key.  The program will continue
  1264.                execution with the next statement.
  1265.  
  1266.  
  1267.      PORT
  1268.  
  1269.                This function will return a -1 if running on a
  1270.                Portfolio, a 0 if not.  Handy if you want to run
  1271.                program on both machines without locking up the
  1272.                PC.  WARNING: There is no positive way to identify
  1273.                the Portfolio.  This functions checks to see if
  1274.                the Interrupt 61h vector is pointing to 0000:0000. 
  1275.                This is not normally used on the PC, but is on the
  1276.                Portfolio.  If you are running a TSR that takes
  1277.                over this vector, PORT will return 1.
  1278.  
  1279.  
  1280.      REFRESH
  1281.  
  1282.                Copy video memory to the LCD controller.  Needed
  1283.                for when you are doing direct write to screen
  1284.                memory.
  1285.  
  1286.  
  1287.      ROMVER
  1288.  
  1289.                This function will return the version number of
  1290.                the Portfolio rom's.
  1291.  
  1292.  
  1293.  
  1294.      SCRLOAD n$(x)
  1295.  
  1296.                Copy the contents from n$(x) back to the screen.
  1297.  
  1298.  
  1299.      SCRSAVE n$(x)
  1300.  
  1301.                Save the contents of the screen to n$(x).  n$ must
  1302.                be DIMension to be at least two strings, since the
  1303.                screen requires 320 bytes to be saved.  No check
  1304.                is made to see if enough memory is available.
  1305.  
  1306.                Example:
  1307.  
  1308.                     DIM s$(1) : rem s$(0), s$(1) will hold screen
  1309.                     SCRSAVE s$(0) : rem save it
  1310.                     ....
  1311.                     SCRLOAD s$(0) : rem restore it
  1312.  
  1313.  
  1314.      SOUND     code, duration
  1315.  
  1316.                This will activate the tone generator.  Duration
  1317.                is the length of tone in 10 msec intervals.  Tone
  1318.                codes are displayed below.  These codes are taken
  1319.                from the Atari Portfolio Technical Reference
  1320.                Manual, copyrighted by the Atari Corporation.
  1321.  
  1322.                CODE      NOTE      Frequency (Hz)
  1323.  
  1324.                48        D#5       622.3
  1325.                49        E5        659.3
  1326.                50        F5        698.5
  1327.                51        F#5       740.0
  1328.                52        G5        784.0
  1329.                53        G#5       830.6
  1330.                54        A5        880.0
  1331.                55        A#5       932.3
  1332.                56        B5        987.8
  1333.                57        C6        1046.5
  1334.                58        C#6       1108.7
  1335.                41        D6        1174.7
  1336.                59        D#6       1244.5
  1337.                60        E6        1318.5
  1338.                61        F6        1396.9
  1339.                14        F#6       1480.0
  1340.                62        G6        1568.0
  1341.                44        G#6       1661.2
  1342.                63        A6        1760.0
  1343.                 4        A#6       1864.7
  1344.                 5        B6        1975.5
  1345.                37        C7        2093.0
  1346.                47        C#7       2217.5
  1347.                 6        D7        2349.3
  1348.                 7        D#7       2489.0
  1349.  
  1350.                Aside from these codes, other values will produce
  1351.                sounds as well.
  1352.  
  1353.      STATUS    exp
  1354.  
  1355.                This will enable or disable the Status line.  This
  1356.                is the line that you see when you use the <LOCK>
  1357.                key on the Portfolio.  0 for off, 1 for on.
  1358.  
  1359.  
  1360.      TICK      exp
  1361.  
  1362.                Sets the Clock tick speed.  0 is Normal, 1 tick
  1363.                every 128 seconds.  1 is Fast, 1 tick every
  1364.                second.  1 uses much more power.
  1365.  
  1366.  
  1367.      VCSRLIN
  1368.  
  1369.                Returns the current virtual cursor line.
  1370.  
  1371.  
  1372.      VLOCATE   row,col
  1373.  
  1374.                Move the virtual cursor to row, col.  This
  1375.                location will be at position 1,1 on the physical
  1376.                screen.
  1377.  
  1378.  
  1379.      VMOVE     dir, dis
  1380.  
  1381.                Move the screen in direction dir for dis number of
  1382.                lines.  Works only in Static and Tracked modes. 
  1383.                Same as using the ALT arrow keys.  Values for dir
  1384.                are 1=Up,2=Down,3=Left,4=Right.
  1385.  
  1386.  
  1387.      VPOS(exp)
  1388.  
  1389.                Returns the current virtual cursor column.  Exp is
  1390.                a dummy expression.
  1391.  
  1392.  
  1393.  
  1394. BREAKING OUT OF PROGRAMS
  1395.  
  1396.      It appears that if you use the CONTROL-C key to break out of
  1397.      a PBASIC program, it will lock up a few minutes later.  I
  1398.      have tried to trace this, but to no avail.  Chalk it up a
  1399.      difference between the PC and Portfolio.  To eliminate this
  1400.      problem, you can now use the ATARI key, ( /|\ ) by itself,
  1401.      to exit from a PBASIC program.  Press the key at any point. 
  1402.      As long as you hold down the key, the error message "BREAK
  1403.      in xx" will remain on the screen.  Release the key and you
  1404.      are returned to the MD/DOS prompt.  If you execute the
  1405.      program from the editor, you will be returned to the editor,
  1406.      with the cursor pointing to the last executed statement.
  1407.  
  1408.  
  1409. UPGRADE HISTORY
  1410.  
  1411.      Version 4.5    May 17, 1991
  1412.  
  1413.           Added program encoding for security.  Use PBCODE to
  1414.                encode.  PBASIC will decode and execute.
  1415.           Much faster .PGC graphics support, thanks to Don
  1416.                Messerli.  Graphic screens can now be displayed at
  1417.                about 4 frames per second.
  1418.           Added Functions.
  1419.           Added COM port support.
  1420.           Line numbers must be between 1 and 65535.
  1421.           GOTO and GOSUB now support variables: GOTO X.
  1422.           Function PORT has been modified to return a -1 instead
  1423.                of 1.  This change allows the use of IF NOT PORT
  1424.                THEN...
  1425.           New Statements: COMOUT, COMSET
  1426.           New Functions: COMIN, COMSTAT
  1427.  
  1428.           Disk Size      - 38914 bytes
  1429.           SPEED.BAS      - 21.9 seconds
  1430.           SIEVE.BAS      - 52.4 seconds
  1431.           TEST45.BAS     - 16.4 seconds
  1432.  
  1433.  
  1434.      Version 4.12   April 19, 1991 (School Only)
  1435.  
  1436.           Fixed two dimensional array addressing.
  1437.           Fixed ON...GOSUB error.
  1438.           Fixed -0 error on multiplication.
  1439.           Fixed (') Remark problem.
  1440.           Fixed MID$ for values greater than length of string.
  1441.           Fixed RAND(x) for x <= 0.
  1442.  
  1443.  
  1444.      Version 4.11   March 3, 1991 (Atari Only)
  1445.  
  1446.           Added LPCHR$(x) to print unfiltered characters.
  1447.           Modified INPUT# to accept EOF as end of string/number.
  1448.           Fixed LPRINT newline.
  1449.  
  1450.  
  1451.      Version 4.1    February 13, 1991
  1452.  
  1453.           Now using PKLITE for compressions, saves about 1k.
  1454.           Added parameter to LOCATE statement to turn off cursor.
  1455.           Increased range of HEX$/OCT$/BIN$.
  1456.           Fixed ASC for characters greater than 127.
  1457.           Fixed FOR loop parameters: K=5:FOR K=1 to K+5 is now 1
  1458.                to 10 instead of 1 to 6.
  1459.           Fixed DMS and MSD for negative numbers.
  1460.           Fixed Error messages in EVAL function.
  1461.           Fixed DIM out of memory for strings.
  1462.  
  1463.  
  1464.      Version 4.01   February 7, 1991 (School Only)
  1465.  
  1466.           Added @location, to PRINT statements for Model 100
  1467.                compatibility.
  1468.           Reorganized command table to save about 1k.
  1469.           Fixed negative numbers in DATA statements problem.
  1470.           Modified the NEXT statement:  If no variable, top of
  1471.                stack is used.  If variable is given, stack is
  1472.                searched for match.  Allows for aborting FOR loops
  1473.                early.
  1474.           Fixed relational operators.  Return -1 instead of 1.
  1475.           Fixed symbol table overflow.  Fixed documentation - 130
  1476.                variables.
  1477.           Add additional error checking on file handling.
  1478.           Add range checking to the string operations.
  1479.           Fixed INPUT: long numbers entered as strings caused
  1480.                overflow errors.
  1481.           Fixed String Initialization problem.
  1482.  
  1483.  
  1484.      Version 4.0    February 1, 1991
  1485.  
  1486.           New Statements: USING, CLOSE, EOF, INPUT$, NUMFMT,
  1487.                OPEN, PRINT#, REPEAT, UNTIL,  WEND, WHILE, WRITE#
  1488.           New Functions: ACOS, AND, ASIN, COSH, DEG, DMS, EOF,
  1489.                EQV, IMP, LTRIM$, MSD, OR, RAD, RTRIM$, SINH, SPC,
  1490.                TAB, TANH, WKSREAD, WKSREAD$, WKSTYPE, XOR
  1491.           New Portfolio Only: MENU, SCRLOAD, SCRSAVE
  1492.           Sequential Files.
  1493.           Menus.
  1494.           Worksheet Importing Functions.
  1495.           Reorganized GetToken to increase speed.
  1496.           Reserved word lookup is now indexed binary search.
  1497.           Code was tighten and refined.
  1498.           Arrays can be used with FOR statements.
  1499.           Fixed error in .PGC compression routines.  To convert
  1500.                any old .PGC files to the correct format, use the
  1501.                following program:
  1502.  
  1503.                     10 INPUT "Filename? ";f$:IF f$ = "" THEN END
  1504.                     SCREEN 6:PGLOAD f$:PGSAVE f$:SCREEN 7:GOTO 10
  1505.  
  1506.           Changed PC error messages to interface with PBE.
  1507.           IF statements modified to allow for single expression
  1508.                evaluation.  Allows for IF EOF(1) THEN etc...  If
  1509.                the result is 0, it is false, anything else is
  1510.                true.
  1511.           Modified the FOR statement to work more like GWBASIC. 
  1512.                If the starting value to beyond the ending value,
  1513.                the loop is not executed.  This includes nested
  1514.                loops.
  1515.           The Atari key ( /|\ ) will now act as a break key.
  1516.           Reorganized the IF statement to handle strings better.
  1517.           Installed option to output numbers in GWBASIC style: 
  1518.                leading space or -, followed by space.  Can be set
  1519.                by NUMFMT="% g " at the beginning of the program.
  1520.           Eliminated recursive ON ERROR trapping.
  1521.           Fixed DIM problem with multiple/mixed arrays.
  1522.           Fixed TAN error.
  1523.           Added looping - WHILE/WEND, REPEAT/UNTIL.
  1524.           Added LEN to the documentation.
  1525.           Fixed CHAIN variable loss.
  1526.           Added additional math error traps.
  1527.           Fixed -0 problem.
  1528.           Fixed negative numbers in print statements.
  1529.  
  1530.           Disk Size      - 38539 bytes
  1531.           SPEED.BAS      - 19.4 seconds
  1532.           SIEVE.BAS      - 51.4 seconds
  1533.           TEST40.BAS     - 17.0 seconds
  1534.           TEST31.BAS     - 16.5 seconds
  1535.           TEST30.BAS     - 15.9 seconds
  1536.           TEST21.BAS     - 10.0 seconds
  1537.  
  1538.  
  1539.      Version 3.1a   January 12, 1991
  1540.  
  1541.           Minor bug : A$ = A$ + ...  A$ is lost.  Fixed.
  1542.  
  1543.  
  1544.      Version 3.1    January 5, 1991
  1545.  
  1546.           New Statements: BLOAD, BSAVE, CALL, CALL INTERRUPT,
  1547.                CHAIN, CHDIR, DECR, ERROR, EVAL, INCR, KILL,
  1548.                MKDIR, ON ERROR GOTO, PGLOAD, PGSAVE, PGSHOW,
  1549.                RESUME, RMDIR, RUN
  1550.           New Functions: BIN$, COMMAND$, ERL, ERR, FALSE, LCASE$,
  1551.                PI, TRUE, UPCASE$, VARSEG, VARPTR
  1552.           Corrected the spelling of Walter Daniel's name. :-}
  1553.           Added support for .PGC files.
  1554.           Fixed DATA wrap around problem.
  1555.           Fixed DIAL problem.
  1556.           Error message for Portfolio Only Statements on PC.
  1557.           Disk Size      - 35186 bytes
  1558.           SPEED.BAS      - 25.9 seconds
  1559.           SIEVE.BAS      - 79.5 seconds
  1560.           TEST31.BAS     - 21.0 seconds
  1561.           TEST30.BAS     - 20.5 seconds
  1562.           TEST21.BAS     - 13.0 seconds
  1563.  
  1564.  
  1565.      Version 3.0    November 25, 1990.
  1566.  
  1567.           Added sample programs.
  1568.           Complied with Turbo C, version 2.0.
  1569.           Added Help file for Portfolio Address Function.
  1570.           Two Dimensional Arrays.
  1571.           Expanded TEST.BAS to TEST30.BAS with strings.
  1572.           Disk Size      - 33123 bytes
  1573.           SPEED.BAS      - 27.4 seconds
  1574.           TEST30.BAS     - 21.5 seconds (corrected)
  1575.           TEST21.BAS     - 13.0 seconds (corrected)
  1576.           New Functions: PBVER
  1577.  
  1578.  
  1579.      Version 2.9    Beta Release - September 30, 1990.
  1580.  
  1581.           Added Strings.
  1582.           Modified READ, SWAP and DIAL to handle strings.
  1583.           Added STRING arrays.
  1584.           Modified IF and PRINT to work with string expressions.
  1585.           Fixed PRINT" problem. 
  1586.           Allow line numbers directly after THEN or ELSE.
  1587.           Now allows two dimensional arrays of any type.
  1588.           Converted to Turbo C++, Version 1.0.
  1589.           New Functions : ASC, DATE$, INSTR, INKEY$, VAL, LEFT$,
  1590.                MID$, RIGHT$, CHR$, HEX$, OCT$, SPACE$, STR$,
  1591.                STRING$, TIME$
  1592.  
  1593.  
  1594.      Version 2.2    Not Released.
  1595.  
  1596.           Added hashing feature to symbol table to speed up
  1597.                variable table access.  10% increase in TEST.
  1598.           Added automatic default extension of ".BAS"
  1599.  
  1600.  
  1601.      Version 2.1    August 4, 1990
  1602.  
  1603.           New Statements: DATA, READ, RESTORE
  1604.           New Functions : LOG
  1605.           TRON invoked from command line switch -T
  1606.           Adjusted the screen coordinates from 0,0 to 1,1 to
  1607.                match GWBASIC.  While this will cause some
  1608.                incompatibilities with previous versions of
  1609.                PBASIC, it will make it more compatible with
  1610.                GWBASIC.
  1611.           Added INP to the documentation.
  1612.           Added FRE to the documentation.
  1613.           Installed Binary search for command checking.  Speed
  1614.                increase about 40%.
  1615.           One letter variable names are not checked in command
  1616.                table.
  1617.           Fixed the load routine to allow for no CR/LF at the end
  1618.                of the file.
  1619.           Fixed FIX function.
  1620.           Fixed scientific constants.
  1621.           Fixed power (^) function.
  1622.           Disk Size      - 29649 bytes
  1623.           SPEED.BAS      - 30.9 seconds
  1624.           TEST21.BAS     - 12.9 seconds
  1625.  
  1626.  
  1627.      Version 2.0    July 27, 1990
  1628.  
  1629.           New Statements: LPRINT, PRINTER, FORMFEED, PRTSC, WAIT,
  1630.                OUT, DIM
  1631.           New Functions : LPOS, ATN, EXP, FIX, INT, COS, SIN,
  1632.                SQR, TAN, TIMER, \, INP, FRE
  1633.           New Portfolio Only : GETDISPLAY, DISPLAY, VLOCATE,
  1634.                VMOVE, VPOS, VCSRLIN, ROMVER, PORT
  1635.           200 variables, 8 significant characters.
  1636.           <ALT-R> TSR to invoke BASIC from inside editor.
  1637.           Program size limited to available memory.
  1638.           All variables are now SINGLE PRECISION FLOATING POINT.
  1639.           One Dimensional Floating Point Arrays.
  1640.           Fixed FOR/NEXT looping with a negative step.
  1641.           Fixed the use of FUNCTIONS in PRINT statements.
  1642.           Fixed EOF error on Portfolio: Lockup if no END
  1643.                statement.
  1644.           Added extensive printer support.
  1645.           DEFINT will now cause a syntax error.
  1646.           RND was changed to make it MS compatible.
  1647.           SWAP was make array compatible.
  1648.           Fixed ... else "string" problem.
  1649.           Added NEXT to the documentation.
  1650.  
  1651.  
  1652.      Version 1.1    July 21, 1990
  1653.  
  1654.           New Statements: DEF SEG, POKE
  1655.           New Functions : PEEK
  1656.           New Portfolio Only : REFRESH, TICK, CLICK, STATUS
  1657.           Automatically invoke Editor on Error.
  1658.           Fixed ALARM problem: keystroke was going into buffer.
  1659.           Fixed ON x GOTO/GOSUB problem: Offset line count by 1.
  1660.           Improved Error Detection.
  1661.           Allow REM in PRINT with preceding colon (:).
  1662.           Implement the quote (') as a substitute for REM.
  1663.           Fix PSET documentation to indicate ()'s.
  1664.           Screen mode changes, return to original on error.
  1665.           Allow for spaces as separator in PRINT.
  1666.  
  1667.      Version 1.0    July 14, 1990
  1668.  
  1669.           Initial release.
  1670.  
  1671.  
  1672. TECHNICAL NOTES
  1673.  
  1674.      PBASIC is about 3300 lines of code was written in Turbo C,
  1675.      version 2.0, compiled to an executable file just under 61k
  1676.      in size.  PBASIC was then compressed with PKLITE, version
  1677.      1.01, to further reduce the size to about 38k.
  1678.  
  1679.      PBASIC will run on a regular PC, providing you do not use
  1680.      any Portfolio specific statements.  If you have the
  1681.      Portfolio Emulation software (I60, I61), you can use all the
  1682.      features.  PBASIC will now generate an error if you try to
  1683.      use a Portfolio only instruction on a PC.
  1684.  
  1685.      PBASIC was developed on a Gateway 2000, 33Mhz 386 PC with 4
  1686.      megabytes of memory.  It was tested on the Atari Portfolio,
  1687.      ROM version 1.052.
  1688.  
  1689.  
  1690. BATCH CONSIDERATIONS
  1691.  
  1692.      If you are running PBASIC as a batch file, you can access
  1693.      the ERRORLEVEL code generated upon exit.
  1694.  
  1695.                0 - Successful exit
  1696.                1 - Program aborted
  1697.                2 - STOP encountered
  1698.  
  1699.  
  1700.  
  1701. ERROR NUMBER AND MESSAGES
  1702.  
  1703.       1   NEXT without FOR
  1704.       2   Syntax Error
  1705.       3   RETURN without GOSUB
  1706.       4   Out of DATA
  1707.       5   Illegal Function Call
  1708.       6   Overflow
  1709.       7   Out of Memory
  1710.       8   Undefined Line Number
  1711.       9   Subscript Out of Range
  1712.      10   Duplicate Definition
  1713.      11   Division by Zero
  1714.      13   Type Mismatch
  1715.      14   Out of String Space
  1716.      15   String Too Long
  1717.      18   Undefined User Function
  1718.      19   No RESUME
  1719.      20   RESUME without Error
  1720.      22   Missing Operand
  1721.      30   WEND without WHILE
  1722.      31   Array Undefined
  1723.      32   Not A Variable
  1724.      33   Too Many Line Numbers
  1725.      34   Duplicate Line Number
  1726.      35   Too Many Nested FORs
  1727.      36   Too Many Nested GOSUBs
  1728.      37   Name/Line Number Too Long
  1729.      38   BREAK
  1730.      39   Portfolio Only
  1731.      51   Internal Error
  1732.      52   Bad File Number
  1733.      53   File Not Found
  1734.      54   Bad File Mode
  1735.      61   Disk Full
  1736.      73   Advanced Feature
  1737.      76   Path Not Found
  1738.  
  1739.  
  1740. FUTURE ENHANCEMENTS
  1741.  
  1742.      - Increase compatibility with Microsoft BASIC
  1743.      - Faster
  1744.  
  1745.  
  1746. PBCODE
  1747.  
  1748.      PBCODE was designed to encrypt PBASIC files.  The encryption
  1749.      method will not encrypt the same file the same way twice,
  1750.      and only expands the file by 2 bytes in size.  Once a file
  1751.      in encrypted, there is no way to decrypt it.  The output
  1752.      file is always ENCODE.BAS.  This file can be renamed with
  1753.      the REN command in MS/DOS.  There is no difference in
  1754.      running the file.  PBASIC will automatically detect and
  1755.      decrypt an encrypted file.
  1756.  
  1757.      This program is supplied to allow developers to write
  1758.      programs in PBASIC and distribute them without releasing the
  1759.      source code to the program.
  1760.  
  1761.  
  1762. THE FILES
  1763.  
  1764.      PBASIC.EXE     The Interpreter.
  1765.      PBASIC.TXT     This file.
  1766.      PBASIC.ADR     Help file to be loaded into the Address book
  1767.                          on the Portfolio.
  1768.      PBCODE.EXE     Encrypt PBASIC files for distribution.
  1769.      ALTR.COM       TSR to execute PBASIC from editor.
  1770.      TEST45.BAS     A program to exercise the interpreter. 
  1771.                          Should not generate any errors.  It will
  1772.                          run on a PC or Portfolio.  Take a look
  1773.                          at it, it demos many of the features of
  1774.                          the Portfolio Only routines.
  1775.      C.BAT          Calculate Expression from DOS.  Invokes
  1776.                          PBASIC.EXE to display answer.
  1777.                     Example: C 123*(567+9845)/18
  1778.  
  1779.  
  1780.      Sample PBASIC programs
  1781.      100DAYS.BAS    Calculate 100 days after a date.
  1782.      2CURVE.BAS     Graph Plot program.  Written by Rob Kunstadt.
  1783.      ADDTIME.BAS    Program to add up time in Minutes and
  1784.                          Seconds.  Written by Louis Shapiro.
  1785.      BAR.BAS        Bar Chart program.  Written by Rob Kunstadt.
  1786.      CHART.BAS      Chart hours worked.  Written by Rob Kunstadt.
  1787.      CIRCLE.BAS     Demo of Circle Drawing Subroutine.
  1788.      DAYS.BAS       Calc the number of days between two dates.
  1789.      ETCH.BAS       Simple Drawing Program now with PGC support.
  1790.      REV.BAS        Game of Reverse.
  1791.      VADERS.BAS     Space Invaders program from Model 100 forum.
  1792.      QCHESS.BAS     Chess Program from the Model 100 forum.
  1793.  
  1794.      The MUSIC Files by John Fraser
  1795.      BACH1.BAS      BACH2.BAS      BETH2.BAS
  1796.      BDAY.BAS       KRIEGER.BAS    PETER1.BAS
  1797.      MUSIC.TXT      Notes from the author.
  1798.  
  1799.      Portfolio Graphic Files (Compressed) by Don Messerli
  1800.      BOMB.PGC       FUJI.PGC       PORTF.PGC
  1801.      USA.PGC        SPRIAL.PGC     GORBY.PGC
  1802.      PGDEMO.BAS     Sample program to demo PGC files.
  1803.  
  1804.      Utilities
  1805.      FIX0D.COM           TSR fix for Portfolio graphics rom.
  1806.      FIX0D.TXT 
  1807.  
  1808.  
  1809. ALSO AVAILABLE
  1810.  
  1811.      PBE.EXE        PBASIC Editor for PC's
  1812.      PBE.DOC        Full screen editor designed for PBASIC
  1813.                     development for the Portfolio.  Invoke PBASIC
  1814.                     from inside the editor.  Access FT to
  1815.                     transmit/receive files to/from the Portfolio.
  1816.  
  1817.  
  1818. ABOUT THE AUTHOR
  1819.  
  1820.      Mr. BJ Gleason is an Instructor at The American University
  1821.      in the Computer Science and Information Systems Department. 
  1822.      He has been programming for over a decade now.
  1823.  
  1824.  
  1825. COMMENTS, BUGS AND IDEAS
  1826.  
  1827.      What features do you really need in PBASIC to make it more
  1828.      useful on the Portfolio?  If you would like to see some new
  1829.      features, contact me and I will try to accommodate you and
  1830.      release a new version.
  1831.  
  1832.  
  1833. ACKNOWLEDGEMENTS
  1834.  
  1835.      Thanks to all those Compuserve for their bug reports,
  1836.      suggestions and words of encouragement.  Without their
  1837.      feedback, version 4.5 would have never seen the light of
  1838.      day.  Keep those cards and letters coming!
  1839.  
  1840.      The author would also like to extend his thanks to Walter
  1841.      Daniel, for helping me track down the ever-elusive bugs, and
  1842.      putting up with a flaky copy of version 2.9.  Thanks also to
  1843.      Don Messerli, for his help implementing the graphic routines
  1844.      to support the .PGC graphics standard.  Finally, many thanks
  1845.      to Ron Luks, the sysop of the APORTFOLIO conference on
  1846.      Compuserve.
  1847.  
  1848.      Thanks also to all the students (Those bug stomping fools!)
  1849.      in my Programming Languages Course, Spring 1991, at the
  1850.      American University.
  1851.  
  1852.  
  1853. ADDRESS
  1854.  
  1855.      If you have an comments, suggestions or bug reports, you can
  1856.      write to the author at:
  1857.  
  1858.           BJ Gleason
  1859.           The American University
  1860.           CSIS  (Thin Air Labs)
  1861.           4400 Massachusetts Avenue, N.W.
  1862.           Washington, DC  20016
  1863.  
  1864.           Compuserve : 73337,2011
  1865.  
  1866.      
  1867.      This program and documentation can be copied and distributed
  1868.      freely.  It can not be sold or used for commercial purposes
  1869.      without permission.
  1870.  
  1871.      PBASIC version 4.5, Copyright 1991 by BJ Gleason.
  1872.  
  1873.      Portfolio, Atari, Microsoft, GWBASIC are trademarks of their
  1874.      respective companies.
  1875. ə