From: Ullrich von Bassewitz (uz_at_musoftware.de)
Date: 2003-03-12 22:58:25
On Wed, Mar 12, 2003 at 10:33:51PM +0100, Marc 'BlackJack' Rintsch wrote:
> I'm using 2.9.0 and I'm feeling a bit silly because it wasn't a problem
> with renaming *within* the .proc but when I assign the variables
> *outside* of a .proc block.
This is a generic problem with scoping. With scoping, a programmer may choose
to do this:
.importzp foo
.proc
sta foo
foo = $1234
.endproc
Since assemblers must allow forward references, there an inherent problem: It
may happen that foo gets redefined inside the scope later. It's the same
problem as in the following example (which doesn't use scoping):
lda foo ; Assembler assumes absolute
foo = $01 ; OOPS: foo is zeropage
Since having all variables loose their zero page attribute when opening a new
scope is not acceptable (old versions of ca65 did this), I had added some code
that checks if there is a variable in the enclosing scope, and if so, uses its
zeropage attribute. I've never really liked this solution, but the only better
one is to generate intermediate code and run a second pass over the
intermediate code. It seems that the workaround fails if the global symbol is
itself just a pointer to some other symbol.
I will fix this. In the mean time, you may use another workaround, which is
also ugly but helpful: Use the "global scope override operator":
.importzp tmp1
tmp2 = tmp1
.proc
lda ::tmp2 ; Explicitly reference the global tmp2
.endproc
> Shouldn't both STAs use zp adressing? If I use indirect adressing like
> 'STA (foo),y' the assembler emits the expected code.
Since the latter uses an explicit zeropage addressing mode, the assembler uses
this hint to create the correct forward declaration for the variable. At the
end of the scope (or when the symbol is redefined within the scope), it is
checked and you get an error if the expected symbol does not match the actual
one. So above workaround is only needed if the assembler has a choice to make,
that influences the size of the operand.
Regards
Uz
--
Ullrich von Bassewitz uz_at_musoftware.de
----------------------------------------------------------------------
To unsubscribe from the list send mail to majordomo_at_musoftware.de with
the string "unsubscribe cc65" in the body(!) of the mail.
This archive was generated by hypermail 2.1.3 : 2003-03-12 22:58:35 CET