===== Fast variables ===== //by Richard Russell, June 2020// A 'fast' variable is stored as a token in the range &18 to &1F, followed by two bytes to be interpreted as a 16-bit number (little-endian). This number indexes a 4-byte 'slot' pre-allocated at the start of the heap; some variables use more than one slot. So to find the memory address of a fast variable multiply the 16-bit index by 4 and add it to LOMEM. Some slots are never used and are 'wasted', because their index would include a disallowed byte. The tokens are: *&18 Fast FN/PROC (see below); 2 slots *&19 Fast byte variable, e.g. v& or v&(); 1 slot (2 slots for array) *&1A Fast 32-bit integer, e.g. v% or v%(); 1 slot (2 slots for array) *&1B Fast double, e.g. v# or v#(); 2 slots *&1C Fast numeric variant, e.g. v or v(); 3 slots (2 slots for array) *&1D Fast structure, e.g. v{} or v{()}; 4 slots (2 slots for array) *&1E Fast 64-bit integer, e.g. v%% or v%%(); 2 slots *&1F Fast string, e.g. v$ or v$(); 2 slots The format of a fast FN/PROC is slightly different. It consists of the regular token for FN or PROC followed by &18 and the 16-bit index, so 4 bytes in all rather than 3 for the other fast variables. Everything above applies equally to //BBC BASIC for Windows// and //BBC BASIC for SDL 2.0//. The difference is that the BB4W cruncher creates fast variables only when one or more REM!Fast directives are present in the program; the BBCSDL cruncher will use fast variables whenever it can, irrespective of the presence of a REM!Fast.