Cześć. Mam program i nie mogę zrozumieć dlaczego skacze mi do:
291: return pgm_read_byte(&(local_lcdspec[s_index].cAlt));
Popatrzcie na kod C i asemblera. Dlaczego tak jest?
W załączniku cały kod.
291: return pgm_read_byte(&(local_lcdspec[s_index].cAlt));
Popatrzcie na kod C i asemblera. Dlaczego tak jest?
@00000165: lcd_PrepareSpec
309: memset(lcd_spec, 0xff, sizeof(lcd_spec));
+00000165: ED81 LDI R24,0xD1 Load immediate
+00000166: E091 LDI R25,0x01 Load immediate
+00000167: EF6F SER R22 Set Register
+00000168: E070 LDI R23,0x00 Load immediate
+00000169: E048 LDI R20,0x08 Load immediate
+0000016A: E050 LDI R21,0x00 Load immediate
+0000016B: 940E01ED CALL 0x000001ED Call subroutine
+0000016D: EBA0 LDI R26,0xB0 Load immediate
+0000016E: E0B1 LDI R27,0x01 Load immediate
+0000016F: E080 LDI R24,0x00 Load immediate
291: return pgm_read_byte(&(local_lcdspec[s_index].cAlt));
+00000170: E039 LDI R19,0x09 Load immediate
314: znak = *pbuffer++;
+00000171: 912D LD R18,X+ Load indirect and postincrement
264: return (c >= 0x80) && (c <= 0x9f);
+00000172: 5820 SUBI R18,0x80 Subtract immediate
316: if(lcd_IsSpec(znak))
+00000173: 3220 CPI R18,0x20 Compare with immediate
+00000174: F4E0 BRCC PC+0x1D Branch if carry cleared
..........................static uint8_t lcd_GetSpec(uint8_t s_index)
{
uint8_t a;
for(a=0; a<ELEMS(lcd_spec); a++)
{
// 0xff oznacza, że nie ma już dalej wpisów
if(lcd_spec[a] == 0xff)
break;
// Jeśli znaleziono...
else if(lcd_spec[a] == s_index)
return a;
}
// Nic nie znaleziono
return pgm_read_byte(&(local_lcdspec[s_index].cAlt));
}
// Makro pomocnicze
#define LCD_SPECNF(spec) (spec > 7)
// Funkcja przydzielająca znaki specjalne
// Zwraca ilość różnych znaków jaką znaleziono. Jeśli > 8 części znaków nie udało się przydzielić
uint8_t lcd_PrepareSpec(void)
{
// Analizuję cały łańcuch danych i zapisuję kolejno znalezione znaki
char* pbuffer = lcd_buffer;
uint8_t n;
uint8_t cnt=0;
char znak;
// Na początku "zerowanie" tablicy znaków specjalnych
memset(lcd_spec, 0xff, sizeof(lcd_spec));
// dodawanie wpisów
for(n=0; n<ELEMS(lcd_buffer); n++)
{
znak = *pbuffer++;
// Jeśli znaleziony znak jest specjalny
if(lcd_IsSpec(znak))
{
// Przeszukanie tablicy
znak = lcd_Spec2Index(znak);
// Jeśli nie znaleziono - dodawanie
if(LCD_SPECNF(lcd_GetSpec(znak)))
{
// dodaj do tablicy tylko jeśli
// nie wystąpiło przepełnienie
if(cnt < ELEMS(lcd_spec))
lcd_spec[cnt] = znak;
// Licznik zwiększany zawsze
// dla statystyki
++cnt;
}
}
}
return cnt;
}
W załączniku cały kod.
