Linards Ticmanis <ticmanis@gmx.de>:
One more thing, on the Apple many hardware funktions are activated by
accessing certain addresses. It's only the access that matters, the data
read or written is irrelevant. But when I use peekpoke.h and say
something like "PEEK(0xC030);" without using the result for anything, it
gets optimized away. I've settled on "*((char *)0xC030) = __AX__;",
which gives a "pure" store, storing whatever is currently in A; but this
is problematic for some addresses, since the 6502 accesses an address
twice during a write. Some of these "softswitches" are toggle switches,
so you need to read them, which produces only one access; writing them
toggles them back and forth instead.
Is there any way to get a "pure" load, i.e. make the compiler emit just
an LDA (or a BIT, or whatever) but to ignore the result? I mean without
resorting to inline assembly. I tried to do it with "volatile" but that
doesn't seem to have any effect.
A volatile type would be great. I have a program that suffers from a
similiar problem, in that I store a value to a memory location to check for
the presence of hardware. If I check for that value in that location right
after the assignment, the optimizer optimizes it away. I got around it by
putting the check far enough down in the code from the assignment that the
optimizer doesn't remember it.