Ach ja, das ist ja schon alles ASM. Ich habe keinen XMEGA aber 4k
EEPROM, also EEARH. Damit sieht es wohl so aus:
1 | #define ret_lo r24
|
2 | #define ret_hi r25
|
3 |
|
4 | ENTRY eeprom_read_byte
|
5 | 1: sbic _SFR_IO_ADDR (EECR), EEWE
|
6 | rjmp 1b
|
7 |
|
8 | # if E2END > 0xFF
|
9 | out _SFR_IO_ADDR (EEARH), addr_hi
|
10 | # else
|
11 | ; This is for chips like ATmega48: the EEAR8 bit must be cleaned.
|
12 | out _SFR_IO_ADDR (EEARH), __zero_reg__
|
13 | # endif
|
14 |
|
15 | out _SFR_IO_ADDR (EEARL), addr_lo
|
16 | sbi _SFR_IO_ADDR (EECR), EERE
|
17 | clr ret_hi
|
18 | in ret_lo, _SFR_IO_ADDR (EEDR)
|
19 | ret
|
20 |
|
21 | ENDFUNC
|
also vermutlich:
sbic
rjmp
out
out
sbi
clr
in
ret
Was macht das?