Difference between revisions of "Technical information about Locomotive BASIC"

From CPCWiki - THE Amstrad CPC encyclopedia!
Jump to: navigation, search
Line 1: Line 1:
The are two versions of Locomotive BASIC used in the Amstrad CPC and CPC+ computers. v1.0 is used by the CPC464, and v1.1 is used by the CPC664, CPC6128, CPC464+ and CPC6128+.
+
'''''This artikel originally came from Kevin Thackers' archive at [http://www.cpctech.org.uk http://www.cpctech.org.uk].'''''
  
== Passing parameters to a RSX (Resident System Extension) command or binary function ==
+
= Technical information about Locomotive BASIC  =
  
A RSX (Resident System Extension) command is accessed through BASIC with a "|" character prefix. e.g. The "DIR" RSX, is accessed by "|DIR".
+
The are two versions of Locomotive BASIC used in the Amstrad CPC and CPC+ computers. v1.0 is used by the CPC464, and v1.1 is used by the CPC664, CPC6128, CPC464+ and CPC6128+.  
  
A binary function is accessed through BASIC using the "CALL" command.
+
== Passing parameters to a RSX (Resident System Extension) command or binary function ==
  
Passing a string parameter:
+
A RSX (Resident System Extension) command is accessed through BASIC with a "|" character prefix. e.g. The "DIR" RSX, is accessed by "|DIR".
  
BASIC v1.0
+
<br> A binary function is accessed through BASIC using the "CALL" command.
+
a$="A":|DRIVE,@a$
+
  
BASIC v1.1:
+
<br> Passing a string parameter:  
  
|DRIVE,"A"
+
<br> BASIC v1.0
 +
<pre>a$="A":|DRIVE,@a$
 +
</pre>
 +
BASIC v1.1:
 +
<pre>|DRIVE,"A"
 +
</pre>
 +
== Additional keywords and variables in BASIC v1.1  ==
  
== Additional keywords and variables in BASIC v1.1 ==
+
#BASIC v1.1 has the following additional keywords:
 +
#*COPYCHR$
 +
#*CURSOR
 +
#*DEC$
 +
#*FILL
 +
#*FRAME
 +
#*GRAPHICS
 +
#*MASK
 +
#BASIC v1.1 has the following additional predefined variables:
 +
#*DERR
  
* BASIC v1.1 has the following additional keywords:
+
<br> <br>
  
:* COPYCHR$
+
== Entering BASIC programs  ==
:* CURSOR
+
:* DEC$
+
:* FILL
+
:* FRAME
+
:* GRAPHICS
+
:* MASK
+
  
* BASIC v1.1 has the following additional predefined variables:
+
A maximum of 255 characters can be entered for a single BASIC line. This is converted into the tokenised BASIC program which is more compact than the line entered. The BASIC keywords are converted into "tokens", or 1-2 byte sequences which uniquely identify each keyword.
  
:* DERR
+
<br>
  
== Entering BASIC programs ==
+
== Structure of a BASIC program  ==
  
A maximum of 255 characters can be entered for a single BASIC line.
+
A BASIC program is stored in a tokenised format. Here the keywords are represented by 1 or 2 byte unique sequences. Each line of the BASIC program has the form:
  
This is converted into the tokenised BASIC program which is more compact than the line entered. The BASIC keywords are converted into "tokens", or 1-2 byte sequences which uniquely identify each keyword.
+
<br>
  
== Structure of a BASIC program ==
+
{| border="1"
 
+
A BASIC program is stored in a tokenised format. Here the keywords are represented by 1 or 2 byte unique sequences.
+
 
+
Each line of the BASIC program has the form:
+
 
+
{|{{Prettytable|width: 700px; font-size: 2em;}}
+
|''Offset''||''Size''||''Description''
+
 
|-
 
|-
|0||2||Length of line data in bytes (note 1)
+
! Offset
 +
! Size
 +
! Description
 
|-
 
|-
|2||2||16-bit decimal integer line number (note 2)
+
| 0
 +
| 2  
 +
| Length of line data in bytes (note 1)
 
|-
 
|-
|4||n||BASIC line encoded into tokens (note 3)
+
| 2
 +
| 2
 +
| 16-bit decimal integer line number (note 2)
 
|-
 
|-
|n+1||1||"0" the end of line marker (note 4)
+
| 4
 +
| n  
 +
| BASIC line encoded into tokens (note 3)
 
|-
 
|-
 +
| n+1
 +
| 1
 +
| "0" the end of line marker (note 4)
 
|}
 
|}
  
'''Notes:'''
+
<br> Notes:  
  
* This 16-bit value has two functions:
+
#*This 16-bit value has two functions:  
:* if "0" it signals the end of the BASIC program. In this case, there is no furthur BASIC program lines or data.
+
#**if "0" it signals the end of the BASIC program. In this case, there is no furthur BASIC program lines or data.  
:* otherwise, this value defines the length of the tokenised BASIC program line in bytes, and includes the 2 bytes defining this value, the 2 bytes defining the program line number, and the end of line marker. This number is stored in little endian notation with low byte followed by high byte.  
+
#**otherwise, this value defines the length of the tokenised BASIC program line in bytes, and includes the 2 bytes defining this value, the 2 bytes defining the program line number, and the end of line marker. This number is stored in little endian notation with low byte followed by high byte.  
* This 16-bit value defines the line number and exists if the length of line data in bytes is not "0". A line number is a integer number in the range 1-65535. This number is stored in little endian notation with low byte followed by high byte.
+
#*This 16-bit value defines the line number and exists if the length of line data in bytes is not "0". A line number is a integer number in the range 1-65535. This number is stored in little endian notation with low byte followed by high byte.  
* This data defines the tokenised BASIC program line and exists if the length of line data in bytes is not "0". The length is dependant on the BASIC program line contents.
+
#*This data defines the tokenised BASIC program line and exists if the length of line data in bytes is not "0". The length is dependant on the BASIC program line contents.  
* This value defines the end of the tokenised BASIC line data and exists if the length of line data in bytes is not "0". The BASIC interpreter looks for this token during the processing of this line, and if found, will stop execution and continue to the next line.
+
#*This value defines the end of the tokenised BASIC line data and exists if the length of line data in bytes is not "0". The BASIC interpreter looks for this token during the processing of this line, and if found, will stop execution and continue to the next line.
  
== BASIC tokens ==
+
== BASIC tokens ==
  
This table list the BASIC tokens with no prefix byte.
+
This table list the BASIC tokens with no prefix byte.  
  
{|{{Prettytable|width: 700px; font-size: 2em;}}
+
<br>
|''Offset''||''Count''||''Description''
+
 
 +
{| border="1"
 +
|-
 +
! Code<br>(hexidecimal)
 +
! BASIC keyword
 +
|-
 +
| &amp;00
 +
| end of tokenised line marker
 +
|-
 +
| &amp;01
 +
| ":" statement seperator
 +
|-
 +
| &amp;02
 +
| integer variable definition (defined with "%" suffix)
 +
|-
 +
| &amp;03
 +
| string variable definition (defined with "$" suffix)
 +
|-
 +
| &amp;04
 +
| floating point variable definition (defined with "!" suffix)
 +
|-
 +
| &amp;05
 +
| var?
 +
|-
 +
| &amp;06
 +
| var?
 +
|-
 +
| &amp;07
 +
| var?
 +
|-
 +
| &amp;08
 +
| var?
 +
|-
 +
| &amp;09
 +
| var?
 +
|-
 +
| &amp;0a
 +
| var?
 +
|-
 +
| &amp;0b
 +
| variable definition (no suffix)
 +
|-
 +
| &amp;0c
 +
| variable definition (no suffix)
 +
|-
 +
| &amp;0d
 +
| variable definition (no suffix)
 +
|-
 +
| &amp;0e
 +
| number constant "0"
 +
|-
 +
| &amp;0f
 +
| number constant "1"
 +
|-
 +
| &amp;10
 +
| number constant "2"
 +
|-
 +
| &amp;11
 +
| number constant "3"
 +
|-
 +
| &amp;12
 +
| number constant "4"
 +
|-
 +
| &amp;13
 +
| number constant "5"
 +
|-
 +
| &amp;14
 +
| number constant "6"
 +
|-
 +
| &amp;15
 +
| number constant "7"
 +
|-
 +
| &amp;16
 +
| number constant "8"
 +
|-
 +
| &amp;17
 +
| number constant "9"
 +
|-
 +
| &amp;18
 +
| number constant "10"
 +
|-
 +
| &amp;19
 +
| 8-bit integer decimal value
 +
|-
 +
| &amp;1a
 +
| 16-bit integer decimal value
 +
|-
 +
| &amp;1b
 +
| 16-bit integer binary value (with "&amp;X" prefix)
 +
|-
 +
| &amp;1c
 +
| 16-bit integer hexadecimal value (with "&amp;H" or "&amp;" prefix)
 +
|-
 +
| &amp;1d
 +
| 16-bit BASIC program line memory address pointer
 +
|-
 +
| &amp;1e
 +
| 16-bit integer BASIC line number
 +
|-
 +
| &amp;1f
 +
| floating point value
 +
|-
 +
| &amp;20
 +
| " " (space) symbol
 +
|-
 +
| &amp;21
 +
| ASCII "!" symbol
 +
|-
 +
| &amp;22
 +
| quoted string value
 +
|-
 +
| &amp;23-7b
 +
| ASCII printable symbols
 +
|-
 +
| &amp;7c
 +
| "&#124;" symbol; prefix for RSX commands
 +
|-
 +
| &amp;80
 +
| AFTER
 +
|-
 +
| &amp;81
 +
| AUTO
 +
|-
 +
| &amp;82
 +
| BORDER
 +
|-
 +
| &amp;83
 +
| CALL
 +
|-
 +
| &amp;84
 +
| CAT
 +
|-
 +
| &amp;85
 +
| CHAIN
 +
|-
 +
| &amp;86
 +
| CLEAR
 +
|-
 +
| &amp;87
 +
| CLG
 +
|-
 +
| &amp;88
 +
| CLOSEIN
 +
|-
 +
| &amp;89
 +
| CLOSEOUT
 +
|-
 +
| &amp;8a
 +
| CLS
 +
|-
 +
| &amp;8b
 +
| CONT
 +
|-
 +
| &amp;8c
 +
| DATA
 +
|-
 +
| &amp;8d
 +
| DEF
 +
|-
 +
| &amp;8e
 +
| DEFINT
 +
|-
 +
| &amp;8f
 +
| DEFREAL
 +
|-
 +
| &amp;90
 +
| DEFSTR
 +
|-
 +
| &amp;91
 +
| DEG
 +
|-
 +
| &amp;92
 +
| DELETE
 +
|-
 +
| &amp;93
 +
| DIM
 +
|-
 +
| &amp;94
 +
| DRAW
 +
|-
 +
| &amp;95
 +
| DRAWR
 +
|-
 +
| &amp;96
 +
| EDIT
 +
|-
 +
| &amp;97
 +
| ELSE
 +
|-
 +
| &amp;98
 +
| END
 +
|-
 +
| &amp;99
 +
| ENT
 +
|-
 +
| &amp;9a
 +
| ENV
 +
|-
 +
| &amp;9b
 +
| ERASE
 +
|-
 +
| &amp;9c
 +
| ERROR
 +
|-
 +
| &amp;9d
 +
| EVERY
 +
|-
 +
| &amp;9e
 +
| FOR
 +
|-
 +
| &amp;9f
 +
| GOSUB, GO SUB
 +
|-
 +
| &amp;a0
 +
| GOTO, GO TO
 +
|-
 +
| &amp;a1
 +
| IF
 +
|-
 +
| &amp;a2
 +
| INK
 +
|-
 +
| &amp;a3
 +
| INPUT
 +
|-
 +
| &amp;a4
 +
| KEY
 +
|-
 +
| &amp;a5
 +
| LET
 +
|-
 +
| &amp;a6
 +
| LINE
 +
|-
 +
| &amp;a7
 +
| LIST
 +
|-
 +
| &amp;a8
 +
| LOAD
 +
|-
 +
| &amp;a9
 +
| LOCATE
 +
|-
 +
| &amp;aa
 +
| MEMORY
 +
|-
 +
| &amp;ab
 +
| MERGE
 +
|-
 +
| &amp;ac
 +
| MID$
 +
|-
 +
| &amp;ad
 +
| MODE
 +
|-
 +
| &amp;ae
 +
| MOVE
 +
|-
 +
| &amp;af
 +
| MOVER
 +
|-
 +
| &amp;b0
 +
| NEXT
 +
|-
 +
| &amp;b1
 +
| NEW
 +
|-
 +
| &amp;b2
 +
| ON
 +
|-
 +
| &amp;b3
 +
| ON BREAK
 +
|-
 +
| &amp;b4
 +
| ON ERROR GOTO, ON ERROR GO TO
 +
|-
 +
| &amp;b5
 +
| SQ
 +
|-
 +
| &amp;b6
 +
| OPENIN
 +
|-
 +
| &amp;b7
 +
| OPENOUT
 +
|-
 +
| &amp;b8
 +
| ORIGIN
 +
|-
 +
| &amp;b9
 +
| OUT
 +
|-
 +
| &amp;ba
 +
| PAPER
 +
|-
 +
| &amp;bb
 +
| PEN
 +
|-
 +
| &amp;bc
 +
| PLOT
 +
|-
 +
| &amp;bd
 +
| PLOTR
 +
|-
 +
| &amp;be
 +
| POKE
 +
|-
 +
| &amp;bf
 +
| PRINT
 +
|-
 +
| &amp;c0
 +
| "'" symbol (same function as REM keyword)
 +
|-
 +
| &amp;c1
 +
| RAD
 +
|-
 +
| &amp;c2
 +
| RANDOMIZE
 +
|-
 +
| &amp;c3
 +
| READ
 +
|-
 +
| &amp;c4
 +
| RELEASE
 +
|-
 +
| &amp;c5
 +
| REM
 +
|-
 +
| &amp;c6
 +
| RENUM
 +
|-
 +
| &amp;c7
 +
| RESTORE
 +
|-
 +
| &amp;c8
 +
| RESUME
 +
|-
 +
| &amp;c9
 +
| RETURN
 +
|-
 +
| &amp;ca
 +
| RUN
 +
|-
 +
| &amp;cb
 +
| SAVE
 +
|-
 +
| &amp;cc
 +
| SOUND
 +
|-
 +
| &amp;cd
 +
| SPEED
 +
|-
 +
| &amp;ce
 +
| STOP
 +
|-
 +
| &amp;cf
 +
| SYMBOL
 +
|-
 +
| &amp;d0
 +
| TAG
 +
|-
 +
| &amp;d1
 +
| TAGOFF
 +
|-
 +
| &amp;d2
 +
| TROFF
 +
|-
 +
| &amp;d3
 +
| TRON
 +
|-
 +
| &amp;d4
 +
| WAIT
 +
|-
 +
| &amp;d5
 +
| WEND
 +
|-
 +
| &amp;d6
 +
| WHILE
 +
|-
 +
| &amp;d7
 +
| WIDTH
 +
|-
 +
| &amp;d8
 +
| WINDOW
 +
|-
 +
| &amp;d9
 +
| WRITE
 +
|-
 +
| &amp;da
 +
| ZONE
 +
|-
 +
| &amp;db
 +
| DI
 +
|-
 +
| &amp;dc
 +
| EI
 +
|-
 +
| &amp;dd
 +
| FILL (v1.1)
 +
|-
 +
| &amp;de
 +
| GRAPHICS (v1.1)
 +
|-
 +
| &amp;df
 +
| MASK (v1.1)
 +
|-
 +
| &amp;e0
 +
| FRAME (v1.1)
 +
|-
 +
| &amp;e1
 +
| CURSOR (v1.1)
 +
|-
 +
| &amp;e2
 +
| (note 2)
 +
|-
 +
| &amp;e3
 +
| ERL
 +
|-
 +
| &amp;e4
 +
| FN
 +
|-
 +
| &amp;e5
 +
| SPC
 +
|-
 +
| &amp;e6
 +
| STEP
 +
|-
 +
| &amp;e7
 +
| SWAP
 +
|-
 +
| &amp;e8
 +
| (note 2)
 +
|-
 +
| &amp;e9
 +
| (note 2)
 +
|-
 +
| &amp;ea
 +
| TAB
 +
|-
 +
| &amp;eb
 +
| THEN
 +
|-
 +
| &amp;ec
 +
| TO
 +
|-
 +
| &amp;ed
 +
| USING
 +
|-
 +
| &amp;ee
 +
| &gt; (greater than)
 +
|-
 +
| &amp;ef
 +
| = (equal)
 +
|-
 +
| &amp;f0
 +
| &amp;gt=, &gt;&nbsp;=, =&gt; (greater or equal)
 +
|-
 +
| &amp;f1
 +
| &lt; (less than)
 +
|-
 +
| &amp;f2
 +
| &lt;&amp;gt, &lt;&nbsp;&gt; (not equal)
 +
|-
 +
| &amp;f3
 +
| =&lt;, &lt;=, &lt;&nbsp;= (less than or equal)
 +
|-
 +
| &amp;f4
 +
| + (addition)
 +
|-
 +
| &amp;f5
 +
| - (subtraction or unary minus)
 +
|-
 +
| &amp;f6
 +
| * (multiplication)
 +
|-
 +
| &amp;f7
 +
| / (division)
 +
|-
 +
| &amp;f8
 +
| ^ (x to the power of y)
 +
|-
 +
| &amp;f9
 +
| \ (integer division)
 +
|-
 +
| &amp;fa
 +
| AND
 +
|-
 +
| &amp;fb
 +
| MOD
 
|-
 
|-
|0||1||"|" character prefix
+
| &amp;fc
 +
| OR
 
|-
 
|-
|1||1||8-bit byte offset to tokens following RSX name.
+
| &amp;fd
 +
| XOR
 
|-
 
|-
|2||x||RSX name. (Last character of name has bit 7 set to "1", all other characters have bit 7 set to "0")
+
| &amp;fe
 +
| NOT
 
|-
 
|-
 +
| &amp;ff
 +
| (prefix for additional keywords)
 
|}
 
|}
  
* This token identifies a integer (16-bit) number. The two bytes following this token is the number, stored low byte then high byte. e.g. &19,&2d,&00 represents the integer number "&002d"="45".
+
<br> Notes:
* This token (&0B) is changed at run-time to &0D
+
* This token identifies a integer variable. 02,00,00,var name offset to number in program setup when program RUN. The variable name is stored directly, with bit 7 of the last character set.
+
* This token identifies a string variable. offset to string in program string stored AS IS with quotes around it.
+
* This token identifies a floating point number. Immediatly following the token are 5 bytes which define the number.
+
  
      Offset Count Description
+
#*The &amp;ff code is used as a prefix for more keywords. See the table below for the list of keywords using this prefix.  
      0 1 &1f (note 1)
+
#*&amp;e2,&amp;e8 and &amp;e9 are not used
      1 5 Floating point number (note 2)
+
#*&amp;7c ("|") is a character prefix used to identify a RSX command.
        1. This byte is the BASIC token identifying a floating point number
+
        2. These 5 bytes define the floating point number.  
+
    * The space symbol is used as a command seperator
+
    * Variable definitions:
+
          o The variable definition has the following structure:
+
            Offset Count Description
+
            0 1 Token defining variable type
+
            2 2 16-bit Byte offset to variable value within tokenised BASIC program.
+
            4 x Variable name
+
  
            The 16-bit byte offset is initially set to 0, but is setup when the program is RUN. The offset is stored in little-endian format, with low byte followed by high byte.
+
e.g. "|DIR". An RSX is encoded in a BASIC program using the following structure:
          o The token byte defines the variable type (i.e. string, floating point, integer) and the suffix ("$", none and "%").
+
          o The variable name is stored in the program, with bit 7 of the last character set to "1". e.g. The variable named "abc" will be encoded as 'a','b','c'+&80
+
    * String values:
+
          o Each string value is prefixed with &22 token.
+
          o All strings must be enclosed by double quote symbols ("). This symbols define the start and end of the string value.
+
          o The string value can contain any symbol except the quote ("). i.e. 0-&21, and &23-&ff can be used.
+
    * After running a program, Tokens of "1d" with 16-bit BASIC program line pointers are changed to token "1e" with the 16-bit memory address of the BASIC line number in memory.
+
  
This table list the BASIC tokens with a &ff prefix byte.
+
{| border="1"
 +
|-
 +
! Offset
 +
! Count
 +
! Description
 +
|-
 +
| 0
 +
| 1
 +
| "&#124;" character prefix
 +
|-
 +
| 1
 +
| 1
 +
| 8-bit byte offset to tokens following RSX name.
 +
|-
 +
| 2
 +
| x
 +
| RSX name. (Last character of name has bit 7 set to "1", all other characters have bit 7 set to "0")
 +
|}
  
Code
+
#*This token identifies a integer (16-bit) number. The two bytes following this token is the number, stored low byte then high byte. e.g. &amp;19,&amp;2d,&amp;00 represents the integer number "&amp;002d"="45".  
(hexidecimal) BASIC keyword
+
#*This token (&amp;0B) is changed at run-time to &amp;0D
&00 ABS
+
#*This token identifies a integer variable. 02,00,00,var name offset to number in program setup when program RUN. The variable name is stored directly, with bit 7 of the last character set.  
&01 ASC
+
#*This token identifies a string variable. offset to string in program string stored AS IS with quotes around it.
&02 ATN
+
#*This token identifies a floating point number. Immediatly following the token are 5 bytes which define the number.
&03 CHR$
+
&04 CINT
+
&05 COS
+
&06 CREAL
+
&07 EXP
+
&08 FIX
+
&09 FRE
+
&0a INKEY
+
&0b INP
+
&0c INT
+
&0d JOY
+
&0e LEN
+
&0f LOG
+
&10 LOG10
+
&11 LOWER$
+
&12 PEEK
+
&13 REMAIN
+
&14 SGN
+
&15 SIN
+
&16 SPACE$
+
&17 SQ
+
&18 SQR
+
&19 STR$
+
&1a TAN
+
&1b UNT
+
&1c UPPER$
+
&1d VAL
+
(note 2)
+
&40 EOF
+
&41 ERR
+
&42 HIMEM
+
&43 INKEY$
+
&44 PI
+
&45 RND
+
&46 TIME
+
&47 XPOS
+
&48 YPOS
+
&49 DERR (v1.1)
+
(note 3)
+
&71 BIN$
+
&72 DEC$ (v1.1)
+
&73 HEX$
+
&74 INSTR
+
&75 LEFT$
+
&76 MAX
+
&77 MIN
+
&78 POS
+
&79 RIGHT$
+
&7a ROUND
+
&7b STRING$
+
&7c TEST
+
&7d TESTR
+
&7e COPYCHR$ (v1.1)
+
&7f VPOS
+
(note 4)
+
  
NOTES:
+
{| border="1"
 +
|-
 +
! Offset
 +
! Count
 +
! Description
 +
|-
 +
| 0
 +
| 1
 +
| &amp;1f (note 1)
 +
|-
 +
| 1
 +
| 5
 +
| Floating point number (note 2)
 +
|}
  
* These codes are prefixed by &FF. e.g. The keyword "ABS" is stored as the following sequence:
+
#*#This byte is the BASIC token identifying a floating point number
 +
#*#These 5 bytes define the floating point number.  
 +
#*The space symbol is used as a command seperator
 +
#*Variable definitions:
 +
#**The variable definition has the following structure:
  
&FF,&00
+
{| border="1"
 +
|-
 +
! Offset
 +
! Count
 +
! Description
 +
|-
 +
| 0
 +
| 1
 +
| Token defining variable type
 +
|-
 +
| 2
 +
| 2
 +
| 16-bit Byte offset to variable value within tokenised BASIC program.
 +
|-
 +
| 4
 +
| x
 +
| Variable name
 +
|}
  
* Codes &1e...&3f inclusive are not used
+
<br> The 16-bit byte offset is initially set to 0, but is setup when the program is RUN. The offset is stored in little-endian format, with low byte followed by high byte.  
* Codes &4a...&6f inclusive are not used
+
* Codes &80...&ff inclusive are not used
+
  
== Floating Point data definition ==
+
#**The token byte defines the variable type (i.e. string, floating point, integer) and the suffix ("$", none and "%").
 +
#**The variable name is stored in the program, with bit 7 of the last character set to "1". e.g. The variable named "abc" will be encoded as 'a','b','c'+&amp;80
 +
#*String values:
 +
#**Each string value is prefixed with &amp;22 token.
 +
#**All strings must be enclosed by double quote symbols (&amp;quot). This symbols define the start and end of the string value.
 +
#**The string value can contain any symbol except the quote ("). i.e. 0-&amp;21, and &amp;23-&amp;ff can be used.
 +
#*After running a program, Tokens of "1d" with 16-bit BASIC program line pointers are changed to token "1e" with the 16-bit memory address of the BASIC line number in memory.
  
A floating point number represents a number with both an integer and fractional part.
+
<br> This table list the BASIC tokens with a &amp;ff prefix byte.  
  
In Amstrad BASIC, a floating point number is stored in base-2 in a normalized form:
+
<br>
  
1 x 2<exponent>
+
{| border="1"
 +
|-
 +
! Code<br>(hexidecimal)
 +
! BASIC keyword
 +
|-
 +
| &amp;00
 +
| ABS
 +
|-
 +
| &amp;01
 +
| ASC
 +
|-
 +
| &amp;02
 +
| ATN
 +
|-
 +
| &amp;03
 +
| CHR$
 +
|-
 +
| &amp;04
 +
| CINT
 +
|-
 +
| &amp;05
 +
| COS
 +
|-
 +
| &amp;06
 +
| CREAL
 +
|-
 +
| &amp;07
 +
| EXP
 +
|-
 +
| &amp;08
 +
| FIX
 +
|-
 +
| &amp;09
 +
| FRE
 +
|-
 +
| &amp;0a
 +
| INKEY
 +
|-
 +
| &amp;0b
 +
| INP
 +
|-
 +
| &amp;0c
 +
| INT
 +
|-
 +
| &amp;0d
 +
| JOY
 +
|-
 +
| &amp;0e
 +
| LEN
 +
|-
 +
| &amp;0f
 +
| LOG
 +
|-
 +
| &amp;10
 +
| LOG10
 +
|-
 +
| &amp;11
 +
| LOWER$
 +
|-
 +
| &amp;12
 +
| PEEK
 +
|-
 +
| &amp;13
 +
| REMAIN
 +
|-
 +
| &amp;14
 +
| SGN
 +
|-
 +
| &amp;15
 +
| SIN
 +
|-
 +
| &amp;16
 +
| SPACE$
 +
|-
 +
| &amp;17
 +
| SQ
 +
|-
 +
| &amp;18
 +
| SQR
 +
|-
 +
| &amp;19
 +
| STR$
 +
|-
 +
| &amp;1a
 +
| TAN
 +
|-
 +
| &amp;1b
 +
| UNT
 +
|-
 +
| &amp;1c
 +
| UPPER$
 +
|-
 +
| &amp;1d
 +
| VAL
 +
|-
 +
| &nbsp;
 +
| (note 2)
 +
|-
 +
| &amp;40
 +
| EOF
 +
|-
 +
| &amp;41
 +
| ERR
 +
|-
 +
| &amp;42
 +
| HIMEM
 +
|-
 +
| &amp;43
 +
| INKEY$
 +
|-
 +
| &amp;44
 +
| PI
 +
|-
 +
| &amp;45
 +
| RND
 +
|-
 +
| &amp;46
 +
| TIME
 +
|-
 +
| &amp;47
 +
| XPOS
 +
|-
 +
| &amp;48
 +
| YPOS
 +
|-
 +
| &amp;49
 +
| DERR (v1.1)
 +
|-
 +
| &nbsp;
 +
| (note 3)
 +
|-
 +
| &amp;71
 +
| BIN$
 +
|-
 +
| &amp;72
 +
| DEC$ (v1.1)
 +
|-
 +
| &amp;73
 +
| HEX$
 +
|-
 +
| &amp;74
 +
| INSTR
 +
|-
 +
| &amp;75
 +
| LEFT$
 +
|-
 +
| &amp;76
 +
| MAX
 +
|-
 +
| &amp;77
 +
| MIN
 +
|-
 +
| &amp;78
 +
| POS
 +
|-
 +
| &amp;79
 +
| RIGHT$
 +
|-
 +
| &amp;7a
 +
| ROUND
 +
|-
 +
| &amp;7b
 +
| STRING$
 +
|-
 +
| &amp;7c
 +
| TEST
 +
|-
 +
| &amp;7d
 +
| TESTR
 +
|-
 +
| &amp;7e
 +
| COPYCHR$ (v1.1)
 +
|-
 +
| &amp;7f
 +
| VPOS
 +
|-
 +
| &nbsp;
 +
| (note 4)
 +
|}
  
The representation uses 5 bytes and is stored using the following structure:
+
<br> NOTES:  
  
Byte 0 1 2 3 4
+
#*These codes are prefixed by &amp;FF. e.g. The keyword "ABS" is stored as the following sequence: <pre>&amp;FF,&amp;00</pre>
Bit 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
+
#*Codes &amp;1e...&amp;3f inclusive are not used
Function mantissa (bits 23-16) mantissa (bits 15-8) mantissa (bits 7-0) sign mantissa (bits 30-24) exponent
+
#*Codes &amp;4a...&amp;6f inclusive are not used
 +
#*Codes &amp;80...&amp;ff inclusive are not used
  
=== Sign ===
+
== Floating Point data definition  ==
  
The sign is represented by bit 7 of byte 3.
+
A floating point number represents a number with both an integer and fractional part.  
  
The value of the sign bit indicates the sign of the floating point number.
+
<br> In Amstrad BASIC, a floating point number is stored in base-2 in a normalized form: 1 x 2<sup>&lt;exponent&gt;</sup> The representation uses 5 bytes and is stored using the following structure:
  
* If the sign bit is "1", then the number is negative.
+
<br>
* If the sign bit is "0", then the number is positive.
+
  
=== Mantissa ===
+
{| border="1"
 +
|-
 +
! Byte
 +
! colspan="8" | 0
 +
! colspan="8" | 1
 +
! colspan="8" | 2
 +
! colspan="8" | 3
 +
! colspan="8" | 4
 +
|-
 +
! Bit
 +
! 7
 +
! 6
 +
! 5
 +
! 4
 +
! 3
 +
! 2
 +
! 1
 +
! 0
 +
! 7
 +
! 6
 +
! 5
 +
! 4
 +
! 3
 +
! 2
 +
! 1
 +
! 0
 +
! 7
 +
! 6
 +
! 5
 +
! 4
 +
! 3
 +
! 2
 +
! 1
 +
! 0
 +
! 7
 +
! 6
 +
! 5
 +
! 4
 +
! 3
 +
! 2
 +
! 1
 +
! 0
 +
! 7
 +
! 6
 +
! 5
 +
! 4
 +
! 3
 +
! 2
 +
! 1
 +
! 0
 +
|-
 +
| Function
 +
| colspan="8" | mantissa (bits 23-16)
 +
| colspan="8" | mantissa (bits 15-8)
 +
| colspan="8" | mantissa (bits 7-0)
 +
| colspan="1" | sign
 +
| colspan="7" | mantissa (bits 30-24)
 +
| colspan="8" | exponent
 +
|}
  
The mantissa holds the normalized number. The exponent is manipulated so that the most significant bit is always 1. Since it is always 1, it is not stored. It's value is implied by the representation.
+
=== Sign  ===
  
=== Exponent ===
+
The sign is represented by bit 7 of byte 3. The value of the sign bit indicates the sign of the floating point number.
  
The exponent is 8-bit and is stored in byte 4.
+
#*If the sign bit is "1", then the number is negative.
 +
#*If the sign bit is "0", then the number is positive.
  
It is stored with a bias of 128.
+
=== Mantissa  ===
  
* 128-255 are positive exponents,
+
The mantissa holds the normalized number. The exponent is manipulated so that the most significant bit is always 1. Since it is always 1, it is not stored. It's value is implied by the representation.  
* 0-127 are negative exponents.  
+
  
To obtain the signed exponent, you must subtract 128 from the stored exponent.
+
=== Exponent  ===
  
The minimum exponent is 0 and this describes a number of 2^-127.
+
The exponent is 8-bit and is stored in byte 4. It is stored with a bias of 128.  
  
The maximum exponent is 255 and this describes a number of 2^128.
+
#*128-255 are positive exponents,
 +
#*0-127 are negative exponents.
  
== BASIC floating-point/real variables ==
+
To obtain the signed exponent, you must subtract 128 from the stored exponent. The minimum exponent is 0 and this describes a number of 2^-127. The maximum exponent is 255 and this describes a number of 2^128.
  
A floating point (real) variable describes a number with integer and fractional parts.
+
== BASIC floating-point/real variables  ==
  
* A integer variable is defined with a "!" character postfix.
+
A floating point (real) variable describes a number with integer and fractional parts.  
  
e.g.
+
#*A integer variable is defined with a "!" character postfix.
  
a! = 3.141592654
+
e.g.
 +
<pre>a! = 3.141592654
 +
</pre>
 +
#*A real number uses 5 bytes of memory as storage. The format is described above.
 +
#*The address of a real variable can be found in BASIC by: <pre>PRINT @a!
 +
</pre>
  
* A real number uses 5 bytes of memory as storage. The format is described above.
+
Where "a" should be replaced with the name of the variable.  
* The address of a real variable can be found in BASIC by:
+
  
PRINT @a!
+
<br>
  
Where "a" should be replaced with the name of the variable.
+
== BASIC integer variables  ==
  
== BASIC integer variables ==
+
A integer variable describes a whole number. i.e. a number without any fractional part.
  
A integer variable describes a whole number. i.e. a number without any fractional part.
+
<br> NOTES:
  
NOTES:
+
#*A integer variable is defined with a "%" character postfix.
  
* A integer variable is defined with a "%" character postfix.
+
e.g.
 +
<pre>a% = 3
 +
</pre>
 +
#*A integer variable has a range of -32768 to 32767
 +
#*A integer variable always uses two bytes of memory as storage with the following format:
  
e.g.
+
{| border="1"
 +
|-
 +
! Offset
 +
! Length
 +
! Description
 +
|-
 +
| 0
 +
| 2
 +
| Integer number
 +
|}
  
a% = 3
+
#*The address of the integer variable can be found in BASIC by: <pre>PRINT @a%
 +
</pre>
  
* A integer variable has a range of -32768 to 32767
+
where "a" should be replaced with the name of the variable.
* A integer variable always uses two bytes of memory as storage with the following format:
+
  
Offset Length Description
+
== BASIC string variables  ==
0 2 Integer number
+
  
* The address of the integer variable can be found in BASIC by:
+
A string is a variable which contains a group of characters.
  
PRINT @a%
+
<br> NOTES:
  
where "a" should be replaced with the name of the variable.
+
#**A string variable is defined in BASIC with a "$" character postfix.
  
== BASIC string variables ==
+
e.g.
 +
<pre>a$ = "hello"
 +
</pre>
 +
#**A string variable is described internally by a "string descriptor block" which has the following structure:
  
A string is a variable which contains a group of characters.
+
{| border="1"
 
+
|-
NOTES:
+
! Offset
 
+
! Length
* A string variable is defined in BASIC with a "$" character postfix.
+
! Description
 
+
|-
e.g.
+
| 0  
 
+
| 1  
a$ = "hello"
+
| Length of string in bytes/characters
 
+
|-
* A string variable is described internally by a "string descriptor block" which has the following structure:
+
| 1  
 
+
| 2  
      Offset Length Description
+
| Location of start of string
      0 1 Length of string in bytes/characters
+
|}
      1 2 Location of start of string
+
 
+
* The address of the "string descriptor block" for the string variable can be found in BASIC by typing:
+
  
PRINT @a$
+
#**The address of the "string descriptor block" for the string variable can be found in BASIC by typing: <pre>PRINT @a$
 +
</pre>
  
replacing "a$" with the name of the string variable.
+
replacing "a$" with the name of the string variable.  
  
* A string uses a minimum of 3 bytes of storage (a 0 character length string) and a maximum of 258 bytes of storage. 3 bytes are used by the "string descriptor block")
+
#**A string uses a minimum of 3 bytes of storage (a 0 character length string) and a maximum of 258 bytes of storage. 3 bytes are used by the "string descriptor block")  
* A string variable can contain any ASCII character code in the range 0-255.
+
#**A string variable can contain any ASCII character code in the range 0-255.  
* A string variable can store a minimum of 0 characters and a maximum of 255 characters.
+
#**A string variable can store a minimum of 0 characters and a maximum of 255 characters.  
* The length of the string in characters is defined in the string descriptor block. The string does not have a termination character.
+
#**The length of the string in characters is defined in the string descriptor block. The string does not have a termination character.

Revision as of 17:00, 15 January 2009

This artikel originally came from Kevin Thackers' archive at http://www.cpctech.org.uk.

Technical information about Locomotive BASIC

The are two versions of Locomotive BASIC used in the Amstrad CPC and CPC+ computers. v1.0 is used by the CPC464, and v1.1 is used by the CPC664, CPC6128, CPC464+ and CPC6128+.

Passing parameters to a RSX (Resident System Extension) command or binary function

A RSX (Resident System Extension) command is accessed through BASIC with a "|" character prefix. e.g. The "DIR" RSX, is accessed by "|DIR".


A binary function is accessed through BASIC using the "CALL" command.


Passing a string parameter:


BASIC v1.0

a$="A":|DRIVE,@a$

BASIC v1.1:

|DRIVE,"A"

Additional keywords and variables in BASIC v1.1

  1. BASIC v1.1 has the following additional keywords:
    • COPYCHR$
    • CURSOR
    • DEC$
    • FILL
    • FRAME
    • GRAPHICS
    • MASK
  2. BASIC v1.1 has the following additional predefined variables:
    • DERR



Entering BASIC programs

A maximum of 255 characters can be entered for a single BASIC line. This is converted into the tokenised BASIC program which is more compact than the line entered. The BASIC keywords are converted into "tokens", or 1-2 byte sequences which uniquely identify each keyword.


Structure of a BASIC program

A BASIC program is stored in a tokenised format. Here the keywords are represented by 1 or 2 byte unique sequences. Each line of the BASIC program has the form:


Offset Size Description
0 2 Length of line data in bytes (note 1)
2 2 16-bit decimal integer line number (note 2)
4 n BASIC line encoded into tokens (note 3)
n+1 1 "0" the end of line marker (note 4)


Notes:

    • This 16-bit value has two functions:
      • if "0" it signals the end of the BASIC program. In this case, there is no furthur BASIC program lines or data.
      • otherwise, this value defines the length of the tokenised BASIC program line in bytes, and includes the 2 bytes defining this value, the 2 bytes defining the program line number, and the end of line marker. This number is stored in little endian notation with low byte followed by high byte.
    • This 16-bit value defines the line number and exists if the length of line data in bytes is not "0". A line number is a integer number in the range 1-65535. This number is stored in little endian notation with low byte followed by high byte.
    • This data defines the tokenised BASIC program line and exists if the length of line data in bytes is not "0". The length is dependant on the BASIC program line contents.
    • This value defines the end of the tokenised BASIC line data and exists if the length of line data in bytes is not "0". The BASIC interpreter looks for this token during the processing of this line, and if found, will stop execution and continue to the next line.

BASIC tokens

This table list the BASIC tokens with no prefix byte.


Code
(hexidecimal)
BASIC keyword
&00 end of tokenised line marker
&01 ":" statement seperator
&02 integer variable definition (defined with "%" suffix)
&03 string variable definition (defined with "$" suffix)
&04 floating point variable definition (defined with "!" suffix)
&05 var?
&06 var?
&07 var?
&08 var?
&09 var?
&0a var?
&0b variable definition (no suffix)
&0c variable definition (no suffix)
&0d variable definition (no suffix)
&0e number constant "0"
&0f number constant "1"
&10 number constant "2"
&11 number constant "3"
&12 number constant "4"
&13 number constant "5"
&14 number constant "6"
&15 number constant "7"
&16 number constant "8"
&17 number constant "9"
&18 number constant "10"
&19 8-bit integer decimal value
&1a 16-bit integer decimal value
&1b 16-bit integer binary value (with "&X" prefix)
&1c 16-bit integer hexadecimal value (with "&H" or "&" prefix)
&1d 16-bit BASIC program line memory address pointer
&1e 16-bit integer BASIC line number
&1f floating point value
&20 " " (space) symbol
&21 ASCII "!" symbol
&22 quoted string value
&23-7b ASCII printable symbols
&7c "|" symbol; prefix for RSX commands
&80 AFTER
&81 AUTO
&82 BORDER
&83 CALL
&84 CAT
&85 CHAIN
&86 CLEAR
&87 CLG
&88 CLOSEIN
&89 CLOSEOUT
&8a CLS
&8b CONT
&8c DATA
&8d DEF
&8e DEFINT
&8f DEFREAL
&90 DEFSTR
&91 DEG
&92 DELETE
&93 DIM
&94 DRAW
&95 DRAWR
&96 EDIT
&97 ELSE
&98 END
&99 ENT
&9a ENV
&9b ERASE
&9c ERROR
&9d EVERY
&9e FOR
&9f GOSUB, GO SUB
&a0 GOTO, GO TO
&a1 IF
&a2 INK
&a3 INPUT
&a4 KEY
&a5 LET
&a6 LINE
&a7 LIST
&a8 LOAD
&a9 LOCATE
&aa MEMORY
&ab MERGE
&ac MID$
&ad MODE
&ae MOVE
&af MOVER
&b0 NEXT
&b1 NEW
&b2 ON
&b3 ON BREAK
&b4 ON ERROR GOTO, ON ERROR GO TO
&b5 SQ
&b6 OPENIN
&b7 OPENOUT
&b8 ORIGIN
&b9 OUT
&ba PAPER
&bb PEN
&bc PLOT
&bd PLOTR
&be POKE
&bf PRINT
&c0 "'" symbol (same function as REM keyword)
&c1 RAD
&c2 RANDOMIZE
&c3 READ
&c4 RELEASE
&c5 REM
&c6 RENUM
&c7 RESTORE
&c8 RESUME
&c9 RETURN
&ca RUN
&cb SAVE
&cc SOUND
&cd SPEED
&ce STOP
&cf SYMBOL
&d0 TAG
&d1 TAGOFF
&d2 TROFF
&d3 TRON
&d4 WAIT
&d5 WEND
&d6 WHILE
&d7 WIDTH
&d8 WINDOW
&d9 WRITE
&da ZONE
&db DI
&dc EI
&dd FILL (v1.1)
&de GRAPHICS (v1.1)
&df MASK (v1.1)
&e0 FRAME (v1.1)
&e1 CURSOR (v1.1)
&e2 (note 2)
&e3 ERL
&e4 FN
&e5 SPC
&e6 STEP
&e7 SWAP
&e8 (note 2)
&e9 (note 2)
&ea TAB
&eb THEN
&ec TO
&ed USING
&ee > (greater than)
&ef = (equal)
&f0 &gt=, > =, => (greater or equal)
&f1 < (less than)
&f2 <&gt, < > (not equal)
&f3 =<, <=, < = (less than or equal)
&f4 + (addition)
&f5 - (subtraction or unary minus)
&f6 * (multiplication)
&f7 / (division)
&f8 ^ (x to the power of y)
&f9 \ (integer division)
&fa AND
&fb MOD
&fc OR
&fd XOR
&fe NOT
&ff (prefix for additional keywords)


Notes:

    • The &ff code is used as a prefix for more keywords. See the table below for the list of keywords using this prefix.
    • &e2,&e8 and &e9 are not used
    • &7c ("|") is a character prefix used to identify a RSX command.

e.g. "|DIR". An RSX is encoded in a BASIC program using the following structure:

Offset Count Description
0 1 "|" character prefix
1 1 8-bit byte offset to tokens following RSX name.
2 x RSX name. (Last character of name has bit 7 set to "1", all other characters have bit 7 set to "0")
    • This token identifies a integer (16-bit) number. The two bytes following this token is the number, stored low byte then high byte. e.g. &19,&2d,&00 represents the integer number "&002d"="45".
    • This token (&0B) is changed at run-time to &0D
    • This token identifies a integer variable. 02,00,00,var name offset to number in program setup when program RUN. The variable name is stored directly, with bit 7 of the last character set.
    • This token identifies a string variable. offset to string in program string stored AS IS with quotes around it.
    • This token identifies a floating point number. Immediatly following the token are 5 bytes which define the number.
Offset Count Description
0 1 &1f (note 1)
1 5 Floating point number (note 2)
      1. This byte is the BASIC token identifying a floating point number
      2. These 5 bytes define the floating point number.
    • The space symbol is used as a command seperator
    • Variable definitions:
      • The variable definition has the following structure:
Offset Count Description
0 1 Token defining variable type
2 2 16-bit Byte offset to variable value within tokenised BASIC program.
4 x Variable name


The 16-bit byte offset is initially set to 0, but is setup when the program is RUN. The offset is stored in little-endian format, with low byte followed by high byte.

      • The token byte defines the variable type (i.e. string, floating point, integer) and the suffix ("$", none and "%").
      • The variable name is stored in the program, with bit 7 of the last character set to "1". e.g. The variable named "abc" will be encoded as 'a','b','c'+&80
    • String values:
      • Each string value is prefixed with &22 token.
      • All strings must be enclosed by double quote symbols (&quot). This symbols define the start and end of the string value.
      • The string value can contain any symbol except the quote ("). i.e. 0-&21, and &23-&ff can be used.
    • After running a program, Tokens of "1d" with 16-bit BASIC program line pointers are changed to token "1e" with the 16-bit memory address of the BASIC line number in memory.


This table list the BASIC tokens with a &ff prefix byte.


Code
(hexidecimal)
BASIC keyword
&00 ABS
&01 ASC
&02 ATN
&03 CHR$
&04 CINT
&05 COS
&06 CREAL
&07 EXP
&08 FIX
&09 FRE
&0a INKEY
&0b INP
&0c INT
&0d JOY
&0e LEN
&0f LOG
&10 LOG10
&11 LOWER$
&12 PEEK
&13 REMAIN
&14 SGN
&15 SIN
&16 SPACE$
&17 SQ
&18 SQR
&19 STR$
&1a TAN
&1b UNT
&1c UPPER$
&1d VAL
  (note 2)
&40 EOF
&41 ERR
&42 HIMEM
&43 INKEY$
&44 PI
&45 RND
&46 TIME
&47 XPOS
&48 YPOS
&49 DERR (v1.1)
  (note 3)
&71 BIN$
&72 DEC$ (v1.1)
&73 HEX$
&74 INSTR
&75 LEFT$
&76 MAX
&77 MIN
&78 POS
&79 RIGHT$
&7a ROUND
&7b STRING$
&7c TEST
&7d TESTR
&7e COPYCHR$ (v1.1)
&7f VPOS
  (note 4)


NOTES:

    • These codes are prefixed by &FF. e.g. The keyword "ABS" is stored as the following sequence:
      &FF,&00
    • Codes &1e...&3f inclusive are not used
    • Codes &4a...&6f inclusive are not used
    • Codes &80...&ff inclusive are not used

Floating Point data definition

A floating point number represents a number with both an integer and fractional part.


In Amstrad BASIC, a floating point number is stored in base-2 in a normalized form: 1 x 2<exponent> The representation uses 5 bytes and is stored using the following structure:


Byte 0 1 2 3 4
Bit 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
Function mantissa (bits 23-16) mantissa (bits 15-8) mantissa (bits 7-0) sign mantissa (bits 30-24) exponent

Sign

The sign is represented by bit 7 of byte 3. The value of the sign bit indicates the sign of the floating point number.

    • If the sign bit is "1", then the number is negative.
    • If the sign bit is "0", then the number is positive.

Mantissa

The mantissa holds the normalized number. The exponent is manipulated so that the most significant bit is always 1. Since it is always 1, it is not stored. It's value is implied by the representation.

Exponent

The exponent is 8-bit and is stored in byte 4. It is stored with a bias of 128.

    • 128-255 are positive exponents,
    • 0-127 are negative exponents.

To obtain the signed exponent, you must subtract 128 from the stored exponent. The minimum exponent is 0 and this describes a number of 2^-127. The maximum exponent is 255 and this describes a number of 2^128.

BASIC floating-point/real variables

A floating point (real) variable describes a number with integer and fractional parts.

    • A integer variable is defined with a "!" character postfix.

e.g.

a! = 3.141592654
    • A real number uses 5 bytes of memory as storage. The format is described above.
    • The address of a real variable can be found in BASIC by:
      PRINT @a!

Where "a" should be replaced with the name of the variable.


BASIC integer variables

A integer variable describes a whole number. i.e. a number without any fractional part.


NOTES:

    • A integer variable is defined with a "%" character postfix.

e.g.

a% = 3
    • A integer variable has a range of -32768 to 32767
    • A integer variable always uses two bytes of memory as storage with the following format:
Offset Length Description
0 2 Integer number
    • The address of the integer variable can be found in BASIC by:
      PRINT @a%

where "a" should be replaced with the name of the variable.

BASIC string variables

A string is a variable which contains a group of characters.


NOTES:

      • A string variable is defined in BASIC with a "$" character postfix.

e.g.

a$ = "hello"
      • A string variable is described internally by a "string descriptor block" which has the following structure:
Offset Length Description
0 1 Length of string in bytes/characters
1 2 Location of start of string
      • The address of the "string descriptor block" for the string variable can be found in BASIC by typing:
        PRINT @a$

replacing "a$" with the name of the string variable.

      • A string uses a minimum of 3 bytes of storage (a 0 character length string) and a maximum of 258 bytes of storage. 3 bytes are used by the "string descriptor block")
      • A string variable can contain any ASCII character code in the range 0-255.
      • A string variable can store a minimum of 0 characters and a maximum of 255 characters.
      • The length of the string in characters is defined in the string descriptor block. The string does not have a termination character.