#include <avr/io.h>
#include <avr/interrupt.h>

typedef uint8_t BYTE;
typedef uint16_t WORD;

BYTE flash_read(WORD address)
{
	BYTE data;

	asm volatile
	(
		"movw r30, %1\n\t"
		"lpm\n\t"
		"mov %0, r0\n\t"
		: "=r" ((BYTE)data)
		: "r" ((WORD)address)
		: "r0", "r30", "r31"
	);

	return data;
}

int main(void)
{
	WORD i;
	BYTE d;

	for(i = 0; i <= FLASHEND; i++)
	{
		d = flash_read(i);
	}

	while(1);

	return 1;
}

