Date : Sat, 25 Nov 2006 01:47:36 +0000
From : jgh@... (Jonathan Graham Harston)
Subject: Standard file extension for BASIC 2 style code?
>Message-ID: <198633893135471@...>
"Thomas Harte" <thomasharte@...> wrote:
> As a result, I am wondering if there is an accepted file extension for BBC
> BASIC typed out as ASCII? At the minute I'm just using .txt since the file
is
".bas".
See the Wiki article at http://beebwiki.jonripley.com/Format
BBC BASIC programs are stored in a tokenised format. Most of the
tokens used by different versions of BBC BASIC are the same, but
extended tokens are different, and different versions have
different line headers.
Acorn/Wilson format BASIC is stored as:
{<cr> <linehi> <linelo> <len> <text>} <cr> <ff>
Russell format BASIC is stored as:
{<len> <linelo> <linehi> <text> <cr>} <00> <ff> <ff>
BASIC can also be stored as text, as:
{[<text>] [<cr>|<lf>|<cr><lf>|<lf><cr>]}
It can be useful to be able to determine what format a BASIC file
is stored in. Different file formats have defined RISC OS
filetypes and DOS extensions:
Format RISC OS File
filetype extension
Acorn/Wilson &FFB "BASIC" "."
Russell &1C7 "Basic8" ".bbc"
Text &FFF "Text" ".bas"
However, you should never assume a file's format from its filetype
or extension and you should never forbid input from a file based
on its filename, type or extension. The format can be easily
determined by looking at the *final* few bytes of the file as:
<cr><00><ff><ff> - Russell format (Z80, 80x86)
xx xx <cr><ff> - Wilson/Acorn format (6502, 32000, ARM, PDP11)
xx xx <cr><lf> - text CR/LF terminated
xx xx <lf><cr> - text LF/CR terminated
xx xx xx <lf> - text LF terminated
xx xx xx <cr> - text CR terminated
xx xx xx xx - unrecognised
The following bit of code will examine the last four bytes of an
open file and determine what format it is:
PTR#in%=EXT#in%-4:FOR A%=0 TO 3:buffer%?A%=BGET#in%:NEXT
type%=0 :REM unknown
IFbuffer%?3=&0D :type%=7 :REM text cr
IFbuffer%?3=&0A :type%=6 :REM text lf
IF(!buffer% AND &FFFF0000)=&0D0A0000 :type%=5 :REM text lfcr
IF(!buffer% AND &FFFF0000)=&0A0D0000 :type%=4 :REM text crlf
IF(!buffer% AND &FFFF0000)=&FF0D0000 :type%=2 :REM 6502 format
IF!buffer%=&FFFF000D :type%=1 :REM 80/86 format
This assumes that the BASIC program has not got any extra bytes
appended after the final terminator.
--
J.G.Harston - jgh@... - mdfs.net/User/JGH
BBC BASIC for Windows and Internationalisation
See http://mdfs.net/Software/BBCBasic/Windows/ProgTips