File formats

Atari BASIC File Format Description

BYTE - 8 bit unsigned char
WORD - 16bit unsigned short (little endian)

Header

WORD LOMEM
    WORD VNT
    WORD VNTE
    WORD VVT
    WORD STMTAB
    WORD STMCUR
    WORD STARP
LOMEM should be always zero - points to page with immediate buffer
VNT - start of variable name table - usually offset $100 from LOMEM
VNTE - end of variable name table
VVT - start of variable values table
STMTAB - start of token area
STMCUR - current line (line 32768)
STARP - end of token area, start of stacks

Variable name table

Variable names are stored in char per char, last is ORed with $80. Sometimes the name area is overwritten with $9B chars (so called unlistable programs).

Variable values table

8 bytes per value:
BYTE    btType
    BYTE    btNumber - offset to variable name table
    BYTE[6]	data - depends on btType
btType could be one of:
$00 SCALAR - data is interpreted as Atari BCD
$40 ARRAY undimed - data is interpreted as follows:
WORD STARP offset
WORD dim1
WORD dim2
$41 ARRAY - same as above
$80 STRING undimed - data is interpreted as follows:
WORD STARP offset
WORD length
WORD dim
$81 STRING - same as above

Token area

Line begins with
WORD line number
    BYTE line length in bytes
Then there is one command:
BYTE token len
    BYTE token byte
    additional data
00 REM 01 DATA 02 INPUT 03 COLOR 04 LIST 05 ENTER 06 LET 07 IF 08 FOR 09 NEXT 0A GOTO 0B GO TO 0C GOSUB 0D TRAP 0E BYE 0F CONT 10 COM 11 CLOSE 12 CLR 13 DEG 14 DIM 15 END 16 NEW 17 OPEN 18 LOAD 19 SAVE 1A STATUS 1B NOTE 1C POINT 1D XIO 1E ON 1F POKE 20 PRINT 21 RAD 22 READ 23 RESTORE 24 RETURN 25 RUN 26 STOP 27 POP 28 ? 29 GET 2A PUT 2B GRAPHICS 2C PLOT 2D POSITION 2E DOS 2F DRAWTO 30 SETCOLOR 31 LOCATE 32 SOUND 33 LPRINT 34 CSAVE 35 CLOAD 36 silent let 37 ERROR -
Tokens 0 & 1 are followed by string ending by $9B.
Then there may be some operands:
0E NCONST
    0F SCONST
    10 NOUSE
    11 NOUSE
    12 ,
    13 $
    14 :
    15 ;
    16 EOL
    17 GOTO
    18 GOSUB
    19 TO
    1A STEP
    1B THEN
    1C #
    1D <=
    1E <>
    1F >=
    20 <
    21 >

    22 =
    23 ^
    24 *
    25 +
    26 -
    27 /
    28 NOT
    29 OR
    2A AND
    2B (
    2C )
    2D =
    2E =
    2F <=
    30 <>
    31 >=
    32 <
    33 >
    34 =
    35 +
    36 -
    37 (
    38 (
    39 (
    3A (
    3B (
    3C ,
    3D STR$
    3E CHR$
    3F USR
    40 ASC
    41 VAL
    42 LEN
    43 ADR
    44 ATN
    45 COS
    46 PEEK
    47 SIN
    48 RND
    49 FRE
    4A EXP
    4B LOG
    4C CLOG
    4D SQR
    4E SGN
    4F ABS
    50 INT
    51 PADDLE
    52 STICK
    53 PTRIG
    54 STRIG
    
NCONST is followed by 6 bytes of Atari BCD number.
SCONST is followed by string data.
If operand has bit 7 set, then it's reference to variable.
000A 0F 0F 36 80 2D 0E 40 10 00 00 00 00 16
    
Line 10 $0F - end of commands $0F - end of this command $36 - silent let $80 - $80 & $7F = $00 - reference to variable 0 (A) $2D - = $0E - number constant $4010000000 - BCD 10 $16 - EOL 0014 08 08 20 80 15 16
Line 20 $08 - end of commands $08 - end of this command $20 - PRINT $80 - ref. to variable 0 $15 - ; $16 - EOL
Output of my ChkBas program:
ChkBas v1.00 (c) 1998-1999 Jindrich Kubec <kubecj@asw.cz>
      Latest version can be found at http://www.asw.cz/~kubecj
      Published under GPL. See GPL.TXT
      Thanks to Russ Gilbert for his SALVAGE programs
    
Input file: h Constants & pointers: Start of Name Table (VNT) : 000E End of Name Table (VNTE) : 000F Lenght of Name Table (VNTL) : 0002 Start of Variable Table (VVT) : 0010 End of Variable Table (VVTE) : 0017 Length of Variable Table (VVTL) : 0008 Number of Variables (NV) : 0001 Start of Code (STMTAB): 0018 Length of Code : 0017 Current command (STMCUR): 002F Length of current command : 000C First byte after program (STARP) : 003B Length of file : 003B File len difference : 00000000 Variable table: 0001 SCALAR (00) 00: 0 A Main code starts here: 10 A=10 20 PRINT A; Immediate code starts here: 32768 SAVE "H1:H"

(c) 1998-2004 Jindroush