summaryrefslogtreecommitdiff
path: root/utils/ihx2tzx/zxbasic.pas
diff options
context:
space:
mode:
Diffstat (limited to 'utils/ihx2tzx/zxbasic.pas')
-rw-r--r--utils/ihx2tzx/zxbasic.pas158
1 files changed, 158 insertions, 0 deletions
diff --git a/utils/ihx2tzx/zxbasic.pas b/utils/ihx2tzx/zxbasic.pas
new file mode 100644
index 0000000000..f27d04dfeb
--- /dev/null
+++ b/utils/ihx2tzx/zxbasic.pas
@@ -0,0 +1,158 @@
+{ IHX (Intel Hex format) to TZX (ZX Spectrum tape file format) convertor tool
+
+ This file contains various definitions, constants and utility functions for
+ dealing with BASIC programs on the ZX Spectrum.
+
+ Copyright (C) 2020 Nikolay Nikolov <nickysn@users.sourceforg.net>
+
+ This source is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This code is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ details.
+
+ A copy of the GNU General Public License is available on the World Wide Web
+ at <http://www.gnu.org/copyleft/gpl.html>. You can also obtain it by writing
+ to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
+ Boston, MA 02110-1335, USA.
+}
+
+unit zxbasic;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils;
+
+const
+ { the ZX BASIC special keyword character set }
+ BC_RND = #165; { RND }
+ BC_INKEYS = #166; { INKEY$ }
+ BC_PI = #167; { PI }
+ BC_FN = #168; { FN }
+ BC_POINT = #169; { POINT }
+ BC_SCREENS = #170; { SCREEN$ }
+ BC_ATTR = #171; { ATTR }
+ BC_AT = #172; { AT }
+ BC_TAB = #173; { TAB }
+ BC_VALS = #174; { VAL$ }
+ BC_CODE = #175; { CODE }
+ BC_VAL = #176; { VAL }
+ BC_LEN = #177; { LEN }
+ BC_SIN = #178; { SIN }
+ BC_COS = #179; { COS }
+ BC_TAN = #180; { TAN }
+ BC_ASN = #181; { ASN }
+ BC_ACS = #182; { ACS }
+ BC_ATN = #183; { ATN }
+ BC_LN = #184; { LN }
+ BC_EXP = #185; { EXP }
+ BC_INT = #186; { INT }
+ BC_SOR = #187; { SOR }
+ BC_SGN = #188; { SGN }
+ BC_ABS = #189; { ABS }
+ BC_PEEK = #190; { PEEK }
+ BC_IN = #191; { IN }
+ BC_USR = #192; { USR }
+ BC_STRS = #193; { STR$ }
+ BC_CHRS = #194; { CHR$ }
+ BC_NOT = #195; { NOT }
+ BC_BIN = #196; { BIN }
+ BC_OR = #197; { OR }
+ BC_AND = #198; { AND }
+ BC_LE = #199; { <= }
+ BC_GE = #200; { >= }
+ BC_NEQ = #201; { <> }
+ BC_LINE = #202; { LINE }
+ BC_THEN = #203; { THEN }
+ BC_TO = #204; { TO }
+ BC_STEP = #205; { STEP }
+ BC_DEF_FN = #206; { DEF FN }
+ BC_CAT = #207; { CAT }
+ BC_FORMAT = #208; { FORMAT }
+ BC_MOVE = #209; { MOVE }
+ BC_ERASE = #210; { ERASE }
+ BC_OPEN = #211; { OPEN }
+ BC_CLOSE = #212; { CLOSE }
+ BC_MERGE = #213; { MERGE }
+ BC_VERIFY = #214; { VERIFY }
+ BC_BEEP = #215; { BEEP }
+ BC_CIRCLE = #216; { CIRCLE }
+ BC_INK = #217; { INK }
+ BC_PAPER = #218; { PAPER }
+ BC_FLASH = #219; { FLASH }
+ BC_BRIGHT = #220; { BRIGHT }
+ BC_INVERSE = #221; { INVERSE }
+ BC_OVER = #222; { OVER }
+ BC_OUT = #223; { OUT }
+ BC_LPRINT = #224; { LPRINT }
+ BC_LLIST = #225; { LLIST }
+ BC_STOP = #226; { STOP }
+ BC_READ = #227; { READ }
+ BC_DATA = #228; { DATA }
+ BC_RESTORE = #229; { RESTORE }
+ BC_NEW = #230; { NEW }
+ BC_BORDER = #231; { BORDER }
+ BC_CONTINUE = #232; { CONTINUE }
+ BC_DIM = #233; { DIM }
+ BC_REM = #234; { REM }
+ BC_FOR = #235; { FOR }
+ BC_GO_TO = #236; { GO TO }
+ BC_GO_SUB = #237; { GO SUB }
+ BC_INPUT = #238; { INPUT }
+ BC_LOAD = #239; { LOAD }
+ BC_LIST = #240; { LIST }
+ BC_LET = #241; { LET }
+ BC_PAUSE = #242; { PAUSE }
+ BC_NEXT = #243; { NEXT }
+ BC_POKE = #244; { POKE }
+ BC_PRINT = #245; { PRINT }
+ BC_PLOT = #246; { PLOT }
+ BC_RUN = #247; { RUN }
+ BC_SAVE = #248; { SAVE }
+ BC_RANDOMIZE = #249; { RANDOMIZE }
+ BC_IF = #250; { IF }
+ BC_CLS = #251; { CLS }
+ BC_DRAW = #252; { DRAW }
+ BC_CLEAR = #253; { CLEAR }
+ BC_RETURN = #254; { RETURN }
+ BC_COPY = #255; { COPY }
+
+function BAS_EncodeNumber(N: Integer): ansistring;
+function BAS_EncodeNumber(N: Real): ansistring;
+function BAS_EncodeLine(LineNr: Integer; const Line: string): ansistring;
+
+implementation
+
+function BAS_EncodeNumber(N: Integer): ansistring;
+begin
+ if (N >= -65535) and (N <= 65535) then
+ begin
+ Str(N, Result);
+ N := Abs(N);
+ Result := Result + #14#0#0 + Chr(Byte(N)) + Chr(Byte(N shr 8)) + #0;
+ end
+ else
+ Result := BAS_EncodeNumber(Real(N));
+end;
+
+function BAS_EncodeNumber(N: Real): ansistring;
+begin
+ raise ENotImplemented.Create('Real number support not yet implemented');
+end;
+
+function BAS_EncodeLine(LineNr: Integer; const Line: string): ansistring;
+begin
+ Result := Chr(Byte(LineNr shr 8)) + Chr(Byte(LineNr)) +
+ Chr(Byte((Length(Line) + 1))) + Chr(Byte((Length(Line) + 1) shr 8)) +
+ Line + #13;
+end;
+
+end.
+