BAS File Format Description

Conventions

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"
. Back (c) 1998-2004 Jindroush Last modified: Mon Apr 19 11:14:52 1999