12.8 Creating a Decrementing Modulo Buffer in Y Memory
A decrementing modulo buffer for use in assembly language can be easily defined in C. In this case, the ending address +1 of the array must be aligned. There is not a suitable predefined macro in the processor header files for this purpose, so variable attributes are specified directly. The far attribute is recommended because Y memory does not fall within the near space on all devices, and the compiler uses a small-data memory model by default.
#include "stdio.h"
int __attribute__((space(ymemory), far, reverse(128))) ybuf[50];
void main()
{
printf("Should be zero: %x\n",((int) &ybuf + sizeof(ybuf)) % 128);
}
reverse()
attribute can be used with
constants stored in program memory only if they are located in a PSV section, not the
compiler-managed auto_psv
section.The
reverse()
attribute can be used with constants stored in Data EEPROM
memory.
The equivalent definition in assembly language appears below. Reverse
section alignment can only be specified as an argument to the .section
directive.
.global _ybuf
.section *,ymemory,reverse(128)
_ybuf: .space 100