92 of 208
ZBasic Language Reference 84 ZX Microcontroller Family Dim addr as Integer Dim sel as Byte Dim fv as Single Based addr + CInt(sel * 3) This defines a Single variable whose address is given by the value of an expression. Dim addr as Integer Dim bv as Byte Based addr.DataAddress This defines a Byte variable whose address is constant - the same as the address of the variable addr. Except for one important aspect, this has exactly the same effect as the following code. Dim addr as Integer Dim bv as Byte Alias addr The difference between an alias and a based variable is how they are handled by the compiler’s optimizer. Normally, when a variable’s value is referenced, the compiler’s optimizer attempts to deduce the variable’s value at that point and, if it is more efficient to do so, the compiler will generate code using the deduced value instead of the variable’s value in memory. However, if a variable is an Alias or has an Alias that refers to it, the compiler may not attempt to make this optimization. In contrast, the compiler does not attempt to determine if a based variable might be occupying the same space as a normal variable. Consequently, if a variable’s value is changed by assigning to a based variable that occupies the same space, the compiler may generate code that is incorrect. To circumvent this potential problem, you may instruct the compiler not to make any assumptions about the value of a variable by using the Volatile attribute as in the following example. Dim Volatile addr as Integer Dim bv as Byte Based addr.DataAddress When defining an array variable that is Based, you may omit the <dim-list> element. In this case, the compiler will assume that the array is one-dimensional, that its lower bound is 1 and that its upper bound is a large value. Dim addr as UnsignedInteger Dim ba() as Byte Based addr It is also permissible to define a based Persistent Memory or Program Memory variable. This is accomplished by using the normal syntax for defining a persistent/program memory variable and appending the Based keyword together with an address expression. Dim persVar as Persistent Integer Based &H300 Dim progVar as ProgMem Single Based &H1000 BasicX Compatibility Note Based variables are not available in BasicX compatibility mode. 3.22 Based Procedures Like based variables, based procedures are a powerful tool intended to be used by advanced programmers who fully understand their nuances. No actual code space is consumed by a based procedure. Rather, declaring a based procedure simply tells the compiler how to generate an invocation of the procedure once its address is known. The syntax for declaring a based subroutine or based function is shown below.