BASIC memory usage
BBC BASIC memory space is arranged as shown in this diagram:
+-----------+ HIMEM | BASIC | | stack | +-----------+ STACK ^ | free | | | space | | +-----------+ VARTOP increasing | heap | memory |(variables)| addresses +-----------+ LOMEM +-----------+ TOP | program | +-----------+ PAGE
PAGE
, TOP
, LOMEM
and HIMEM
are pseudo-variables available in all versions of BBC BASIC. The BASIC program expands upwards from PAGE, the variables expand upwards from LOMEM, and the BASIC stack descends downwards from HIMEM. You can write to PAGE, LOMEM and HIMEM to change what memory BASIC uses for the program and the heap (variables). TOP and END cannot be changed as they are the end of a dynamic area.
LOMEM usually defaults to TOP, but it can be moved anywhere. You can even swap around the BASIC program and the heap (variable) space if you are careful (see this article).
Some versions of BASIC also use END
to return VARTOP. However, on all versions of BASIC DIM numvar -1
sets numvar to the top of the heap by allocating zero bytes of space and pointing numvar to it.
There is no universal method of reading STACK, the bottom of the BASIC stack. Some versions of BASIC allow you to reserve space on the stack, and DIM numvar LOCAL -1
sets numvar to the bottom of the stack by allocating zero bytes of space and pointing numvar to it. Otherwise, depending on how deeply the program has recursed into multiple PROCs or FNs, 256 bytes is a usable approximation.
Calculating memory sizes
The size of each area of memory used by BASIC can be calculated as follows:
Program size | size%=TOP-PAGE
|
Total heap size | size%=HIMEM-LOMEM
|
Used heap size | DIM A% -1:size%=A%-LOMEM
|
Free heap size | DIM A% -1:size%=HIMEM-A%-256
|