Blame | Last modification | View Log | Download
BAS2TAP v2.6 (Release 20-01-2013)Copyleft (C) 1998-2013 Martijn van der Heide, ThunderWare Research Center.This program converts 'BASIC in an ASCII file' to a TAP tape image file, to beused in a ZX Spectrum emulator. Both 48K and 128K listings are supported.COPYLEFT AND DISCLAIMER-----------------------This program is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public Licenseas published by the Free Software Foundation; either version 2of the License, or (at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.Remember you can always freely obtain the latest version fromthe utilities section of The World of Spectrum, at:http://www.worldofspectrum.org/utilities.htmlREVISION HISTORY----------------1.0 26-03-98: First public release1.1 01-04-98: Changes:- Added banner.- Switch -q does not suppress warnings, but progress indication.- Added switch -w to suppress warnings.- Added switch -e on popular demand.- Empty lines are skipped and only generate a warning.- Lines with only a line number generate an error.- Numbers can also start with a decimal point (eg. '.5').- Lines no longer require an end-of-line terminator.- In-line sequence expansions also remove any trailingspaces unless it was between quotes.- The created TAP is made valid (although incomplete) if an erroroccurs, unless it was a write error.1.2 11-12-98: Changes:- Block graphics were encoded rotated by 1.- Added full syntax checking, and- Added switch -n to disable the syntax checking again.- Added expansion sequences '{CAT}' and '{CODE}' with the solepurpose of being used as channel name in the OPEN # command.- Changed the distribution policy from freeware to Open SourceSoftware.1.3 04-01-99: Changes:- Spaces after strings are now skipped (they are not needed).- The 'CLS #' command does exist on the Interface 1 after all.- Exponential numbers were raised the wrong way around(eg. 25e3 became 0.025 and 25e-3 became 25000). Oooops....1.4 17-05-99: Changes:- UDGs used as 'USR "x"' would result in a crash due to 2bad pointers.- Complex expressions between brackets as parameter to otherexpression types (eg. ATTR or string slicing) would screwup the evaluation.- The 'CLS #' command was flagged as being Interface 1specific in the previous version rather than eitherInterface 1 or Opus Discovery (aaargh!)1.5 19-05-99: Changes:- The 'DIM' command's syntax description was incorrect, so thechecker didn't like the variable name before the openingbracket.1.6 23-06-99: Changes:- Several problems with array indices!- The 'USR' token only accepted a numerical operand. Anexception was made for UDG expressions '"x"' but constructionslike 'USR CHR$ a' didn't work.1.7 02-11-99: Changes:- The DEF FN function requires insertion of evaluation room.1.8 09-11-00: Changes:- The DEF FN function only requires insertion of evaluation roomin the parameter area before the '=' token.Any bracketed argument would upset the parser.1.9 08-12-01: Changes:- Forgot to skip the ';' colour token separator in class 9.- REM statements should be parsed as-is (except for expansionsequences), without taking out multiple spaces or countingquotes.2.0 11-12-02: Changes:- SAVE/LOAD/VERIFY/MERGE DATA didn't work, as the DATA token wasset to be allowed as keyword only.- ERASE ! didn't work, as ERASE was only allowed from the "m"channel.2.1 22-12-02: Changes:- Any alphanumerical expression can be sliced, not onlyvariables and direct strings.- If the output filename provided on the command line had theextension '.TAP', it shouldn't be forced to '.tap'.2.2 13-06-03: Changes:- Expand sequences PAPER and INK had their codes reversed.- Expand sequences BRIGHT and FLASH had their codes reversed.- Expand sequences INVERSE and OVER had their codes reversed.- Expand sequences {XX} didn't work (missing pointer advance).- Expand sequences AT and TAB didn't work and threw awarning instead (missing pointer advance).2.3 05-07-04: Changes:- LET is allowed to write to a substring.2.4 24-07-05: Changes:- BIN is a number format, not an expression token.2.5 06-06-10: Changes:- Functions would take "the rest of the expression" as argumentrather than just the next value.- Stronger enforcement of separator tokens (;,') in a PRINTstatement.- The use of 'TO' in string arrays was not accepted.2.6 20-01-13: Changes:- The PLAY command was not parsed properly.SYNTAX------BAS2TAP [-q] [-w] [-e] [-c] [-aX] [-sX] FileIn [FileOut]-q goes into quiet mode, suppressing banner and progress indication.-w suppress generation of warnings.-e write errors to the stdout in stead of the stderr stream.-c makes token matching case independant. The drawback is that variables thathave the same name as a token (eg. 'print') cannot be used, as they will betreated as (unexpected) tokens.-n disables syntax checking.-aX sets the auto-start line to line X.-sX sets the TAP block name to X (max 10 characters).If no output filename is provided, the same name as the input file will beused, but with extension `.TAP'.THE CONVERTOR-------------The following rules apply:1. One BASIC line must be provided in one ASCII line.2. Keywords must appear in upper case (unless switch -c is used).3. Keywords that consist of multiple words (eg. `GO TO') must have the spacein between the words.4. Spaces between words are not needed, unless this leads to concatenationproblems - eg. `PRINTVAL"10"' must appear as `PRINT VAL"10"', while`PRINT10' is perfectly acceptable.5. Syntax is fully checked according to- the normal Spectrum ROM,- Interface 1/Microdrive extension,- Opus Discovery extension.The following sequences are expanded in-line:Chars Expand totab character 06 ("print '"){XX} XX is 2-digit hex, converts to the Spectrum ASCII value{(C)} character 7F (copyright sign){-X} X is 1-8, characters 80-87 (block graphics without shift){+X} X is 1-8, characters 88-8F (block graphics with shift){X} X is `A'-`U', converts to the UDG Spectrum ASCII value{CODE} character AF ('CODE'){CAT} character CF ('CAT')Special sequences are (case independant) PAPER, INK, BRIGHT, FLASH, OVER,INVERSE, AT and TAB control sequences. They may appear as "{PAPER 3}" to convertto the sequence 0x10,0x03. Note that both AT and TAB take 2 operands, whichshould be seperated by a comma (eg. "{AT 1,10}").Notice that these expansions are identical to what SGD and TAPER create whensaving out BASIC blocks.RECOMPILING THE SOURCE----------------------The source is provided in (almost) fully portable ANSI C, the source text iswritten in 132 columns.If you wish to experiment with different syntax (eg. for a DISCiPLE), you mayfind it useful to set the `__DEBUG__' define.If you make any fundamental change to the source, you are requested - but notobligated - to send the changed source back to me, so that everyone can benefitfrom it. My e-mail address is `mheide@worldofspectrum.org'Enjoy!Martijn van der HeideThunderWare Research Center