X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=mware%2Fpgm.h;h=ea28043e98587cdf166bffec5c81844cecff752c;hb=9f6832426387c3730bf2c9b6202db9eb8d159f42;hp=dcce64da67732d30fcd1fb5833b9b27f3fd07835;hpb=71f4355523bfcd350befa5d01826f990a90a83df;p=bertos.git diff --git a/mware/pgm.h b/mware/pgm.h index dcce64da..ea28043e 100755 --- a/mware/pgm.h +++ b/mware/pgm.h @@ -1,8 +1,7 @@ /*! * \file * * @@ -23,7 +22,8 @@ #ifndef MWARE_PGM_H #define MWARE_PGM_H -#include +#include +#include /* For intXX_t */ #if CPU_AVR @@ -40,6 +40,41 @@ ); \ __result; \ }) + #if 0 // 128/103 + #define pgm_read_uint16_t(addr) \ + ({ \ + uint32_t __addr32 = (uint32_t)(addr); \ + uint16_t __result; \ + __asm__ \ + ( \ + "out %2, %C1" "\n\t" \ + "movw r30, %1" "\n\t" \ + "elpm %A0, Z+" "\n\t" \ + "elpm %B0, Z" "\n\t" \ + : "=r" (__result) \ + : "r" (__addr32), \ + "I" (_SFR_IO_ADDR(RAMPZ)) \ + : "r30", "r31" \ + ); \ + __result; \ + }) + #endif + + #define pgm_read_uint16_t(addr) \ + ({ \ + uint16_t __addr16 = (uint16_t)(addr); \ + uint16_t __result; \ + __asm__ \ + ( \ + "lpm %A0, Z+" "\n\t" \ + "lpm %B0, Z" "\n\t" \ + : "=r" (__result), "=z" (__addr16) \ + : "1" (__addr16) \ + ); \ + __result; \ + }) + + #else #define pgm_read_char(addr) \ ({ \ @@ -55,10 +90,58 @@ ); \ __result; \ }) + #if 0 // 128/103 + #define pgm_read_uint16_t(addr) \ + ({ \ + uint32_t __addr32 = (uint32_t)(addr); \ + uint16_t __result; \ + __asm__ \ + ( \ + "out %2, %C1" "\n\t" \ + "mov r31, %B1" "\n\t" \ + "mov r30, %A1" "\n\t" \ + "elpm" "\n\t" \ + "mov %A0, r0" "\n\t" \ + "in r0, %2" "\n\t" \ + "adiw r30, 1" "\n\t" \ + "adc r0, __zero_reg__" "\n\t" \ + "out %2, r0" "\n\t" \ + "elpm" "\n\t" \ + "mov %B0, r0" "\n\t" \ + : "=r" (__result) \ + : "r" (__addr32), \ + "I" (_SFR_IO_ADDR(RAMPZ)) \ + : "r0", "r30", "r31" \ + ); \ + __result; \ + }) + #endif + #define pgm_read_uint16_t(addr) \ + ({ \ + uint16_t __addr16 = (uint16_t)(addr); \ + uint16_t __result; \ + __asm__ \ + ( \ + "lpm" "\n\t" \ + "mov %A0, r0" "\n\t" \ + "adiw r30, 1" "\n\t" \ + "lpm" "\n\t" \ + "mov %B0, r0" "\n\t" \ + : "=r" (__result), "=z" (__addr16) \ + : "1" (__addr16) \ + : "r0" \ + ); \ + __result; \ + }) + #endif + #ifndef PROGMEM #define PROGMEM __attribute__((__progmem__)) - #define PSTR(s) ({static const char __c[] PROGMEM = (s); __c;}) + #endif + #ifndef PSTR + #define PSTR(s) ({ static const char __c[] PROGMEM = (s); &__c[0]; }) + #endif #elif CPU_HARVARD #error Missing CPU support @@ -86,9 +169,7 @@ typedef PROGMEM uint32_t pgm_uint32_t; /*\}*/ /*! - * \def PGM_READ_CHAR - * \def PGM_FUNC - * \def PGM_ATTR + * \name PGM support macros. * * These macros enable dual compilation of code for both program * and data memory. @@ -115,16 +196,21 @@ typedef PROGMEM uint32_t pgm_uint32_t; * // To be used when invoking inside other PGM_FUNC functions: * PGM_FUNC(lcd_puts)(some_string); * \endcode + * + * \{ */ #ifdef _PROGMEM #define PGM_READ_CHAR(s) pgm_read_char(s) #define PGM_FUNC(x) x ## _P + #define PGM_STR(x) PSTR(x) #define PGM_ATTR PROGMEM #else #define PGM_READ_CHAR(s) (*(s)) #define PGM_FUNC(x) x + #define PGM_STR(x) x #define PGM_ATTR /* nothing */ #endif +/* \} */ #endif /* MWARE_PGM_H */