A netuším, či Ti to pomôže, ale ASM preklad toho môjho C-čka vyzerá nasledovne:
// DATA_READ, DATA_WRITE, DATA_COMPARE
uint8_t fn_int_rd_wr_eeprom(uint8_t prikaz, uint16_t *p_ciel, uint16_t index, uint8_t pocet)
{
2716: fb 01 movw r30, r22
volatile LOCAL uint8_t beh_programu = FALSE;
uint16_t eep_number;
uint8_t *p_pointer_eep_eep, *p_pointer_eep_ram;
if (beh_programu == TRUE) return(FALSE);
2718: 90 91 c4 01 lds r25, 0x01C4 ; 0x8001c4 <beh_programu.2465>
271c: 9f 3f cpi r25, 0xFF ; 255
271e: 09 f4 brne .+2 ; 0x2722 <fn_int_rd_wr_eeprom+0xc>
2720: 5a c0 rjmp .+180 ; 0x27d6 <fn_int_rd_wr_eeprom+0xc0>
if (index >= DATA_EEP_MAX) return(FALSE);
2722: 40 34 cpi r20, 0x40 ; 64
2724: 51 05 cpc r21, r1
2726: 08 f0 brcs .+2 ; 0x272a <fn_int_rd_wr_eeprom+0x14>
2728: 58 c0 rjmp .+176 ; 0x27da <fn_int_rd_wr_eeprom+0xc4>
beh_programu = TRUE;
272a: 9f ef ldi r25, 0xFF ; 255
272c: 90 93 c4 01 sts 0x01C4, r25 ; 0x8001c4 <beh_programu.2465>
// ******************** SPRACOVANIE PAMATOVEJ OBLASTI **************************************
if ((index + pocet) >= DATA_EEP_MAX) {
2730: ba 01 movw r22, r20
2732: 62 0f add r22, r18
2734: 71 1d adc r23, r1
2736: 60 34 cpi r22, 0x40 ; 64
2738: 71 05 cpc r23, r1
273a: 10 f0 brcs .+4 ; 0x2740 <fn_int_rd_wr_eeprom+0x2a>
pocet = (uint8_t)(DATA_EEP_MAX - index);
273c: 20 e4 ldi r18, 0x40 ; 64
273e: 24 1b sub r18, r20
}
eep_number = 2 * pocet;
2740: 30 e0 ldi r19, 0x00 ; 0
2742: 22 0f add r18, r18
2744: 33 1f adc r19, r19
p_pointer_eep_eep = (uint8_t *)&data_eep[index];
2746: 44 0f add r20, r20
2748: 55 1f adc r21, r21
274a: 40 50 subi r20, 0x00 ; 0
274c: 50 40 sbci r21, 0x00 ; 0
p_pointer_eep_ram = (uint8_t *)p_ciel;
// ******************** SPRACOVANIE PRIKAZU **************************************
switch (prikaz) {
274e: 81 30 cpi r24, 0x01 ; 1
2750: 39 f0 breq .+14 ; 0x2760 <fn_int_rd_wr_eeprom+0x4a>
2752: 50 f0 brcs .+20 ; 0x2768 <fn_int_rd_wr_eeprom+0x52>
2754: 82 30 cpi r24, 0x02 ; 2
2756: d9 f5 brne .+118 ; 0x27ce <fn_int_rd_wr_eeprom+0xb8>
eep_number–;
}
break;
}
case DATA_COMPARE : {
while (eep_number) {
2758: 21 15 cp r18, r1
275a: 31 05 cpc r19, r1
275c: b9 f4 brne .+46 ; 0x278c <fn_int_rd_wr_eeprom+0x76>
275e: 37 c0 rjmp .+110 ; 0x27ce <fn_int_rd_wr_eeprom+0xb8>
eep_number–;
}
break;
}
case DATA_WRITE : {
while (eep_number) {
2760: 21 15 cp r18, r1
2762: 31 05 cpc r19, r1
2764: 29 f5 brne .+74 ; 0x27b0 <fn_int_rd_wr_eeprom+0x9a>
2766: 33 c0 rjmp .+102 ; 0x27ce <fn_int_rd_wr_eeprom+0xb8>
// ******************** SPRACOVANIE PRIKAZU **************************************
switch (prikaz) {
case DATA_READ : {
while (eep_number) {
2768: 21 15 cp r18, r1
276a: 31 05 cpc r19, r1
276c: 81 f1 breq .+96 ; 0x27ce <fn_int_rd_wr_eeprom+0xb8>
276e: 24 0f add r18, r20
2770: 35 1f adc r19, r21
// cakaj na pripadne uvolnenie prace s EEPROM
while(EEPROM_BUSY);
2772: f9 99 sbic 0x1f, 1 ; 31
2774: fe cf rjmp .-4 ; 0x2772 <fn_int_rd_wr_eeprom+0x5c>
EEPROM_ADR_REGISTER = (uint16_t)p_pointer_eep_eep;
2776: 52 bd out 0x22, r21 ; 34
2778: 41 bd out 0x21, r20 ; 33
EEPROM_RD_BYTE;
277a: f8 9a sbi 0x1f, 0 ; 31
*p_pointer_eep_ram = EEPROM_DATA_REGISTER;
277c: 80 b5 in r24, 0x20 ; 32
277e: 81 93 st Z+, r24
p_pointer_eep_eep++;
2780: 4f 5f subi r20, 0xFF ; 255
2782: 5f 4f sbci r21, 0xFF ; 255
// ******************** SPRACOVANIE PRIKAZU **************************************
switch (prikaz) {
case DATA_READ : {
while (eep_number) {
2784: 42 17 cp r20, r18
2786: 53 07 cpc r21, r19
2788: a1 f7 brne .-24 ; 0x2772 <fn_int_rd_wr_eeprom+0x5c>
278a: 21 c0 rjmp .+66 ; 0x27ce <fn_int_rd_wr_eeprom+0xb8>
break;
}
case DATA_COMPARE : {
while (eep_number) {
// cakaj na pripadne uvolnenie prace s EEPROM
while(EEPROM_BUSY);
278c: 9f b3 in r25, 0x1f ; 31
278e: 89 2f mov r24, r25
2790: 82 70 andi r24, 0x02 ; 2
2792: 91 fd sbrc r25, 1
2794: fb cf rjmp .-10 ; 0x278c <fn_int_rd_wr_eeprom+0x76>
EEPROM_ADR_REGISTER = (uint16_t)p_pointer_eep_eep;
2796: 52 bd out 0x22, r21 ; 34
2798: 41 bd out 0x21, r20 ; 33
EEPROM_RD_BYTE;
279a: f8 9a sbi 0x1f, 0 ; 31
if (*p_pointer_eep_ram != EEPROM_DATA_REGISTER) return(FALSE);
279c: 61 91 ld r22, Z+
279e: 90 b5 in r25, 0x20 ; 32
27a0: 69 13 cpse r22, r25
27a2: 1c c0 rjmp .+56 ; 0x27dc <fn_int_rd_wr_eeprom+0xc6>
p_pointer_eep_eep++;
27a4: 4f 5f subi r20, 0xFF ; 255
27a6: 5f 4f sbci r21, 0xFF ; 255
p_pointer_eep_ram++;
eep_number--;
27a8: 21 50 subi r18, 0x01 ; 1
27aa: 31 09 sbc r19, r1
eep_number--;
}
break;
}
case DATA_COMPARE : {
while (eep_number) {
27ac: 79 f7 brne .-34 ; 0x278c <fn_int_rd_wr_eeprom+0x76>
27ae: 0f c0 rjmp .+30 ; 0x27ce <fn_int_rd_wr_eeprom+0xb8>
27b0: 24 0f add r18, r20
27b2: 35 1f adc r19, r21
}
break;
}
case DATA_WRITE : {
while (eep_number) {
while(EEPROM_BUSY);
27b4: f9 99 sbic 0x1f, 1 ; 31
27b6: fe cf rjmp .-4 ; 0x27b4 <fn_int_rd_wr_eeprom+0x9e>
EEPROM_ADR_REGISTER = (uint16_t)p_pointer_eep_eep;
27b8: 52 bd out 0x22, r21 ; 34
27ba: 41 bd out 0x21, r20 ; 33
EEPROM_DATA_REGISTER = (uint8_t)*p_pointer_eep_ram;
27bc: 81 91 ld r24, Z+
27be: 80 bd out 0x20, r24 ; 32
EEPROM_WR_BYTE;
27c0: fa 9a sbi 0x1f, 2 ; 31
27c2: f9 9a sbi 0x1f, 1 ; 31
p_pointer_eep_ram++;
p_pointer_eep_eep++;
27c4: 4f 5f subi r20, 0xFF ; 255
27c6: 5f 4f sbci r21, 0xFF ; 255
eep_number--;
}
break;
}
case DATA_WRITE : {
while (eep_number) {
27c8: 24 17 cp r18, r20
27ca: 35 07 cpc r19, r21
27cc: 99 f7 brne .-26 ; 0x27b4 <fn_int_rd_wr_eeprom+0x9e>
eep_number--;
}
break;
}
}
beh_programu = FALSE;
27ce: 10 92 c4 01 sts 0x01C4, r1 ; 0x8001c4 <beh_programu.2465>
return(TRUE);
27d2: 8f ef ldi r24, 0xFF ; 255
27d4: 08 95 ret