Jeśli to ma być pobieranie kolejnych komórek z tablicy, to bez problemu inkrementacja wskaźnika przy odczycie będzie ok - odczyt i inkrementacja są wykonywane równolegle, więc nadal masz 2 cykle dostępu..
ldi XH,(adres_tablicy)>>8
ldi XL,(adres_tablicy)
ldi rcnt, 128 ; liczba przebiegów przez 2
.petla:
ld r0, X+
out PORT, r0 ; wystawienie stanu
nop
dec rcnt ; zmniejszenie licznika liczby przebiegów.. wyżej jest nop, czyli można by zrobić odliczanie nawet na zmiennej 2 bajtowej
ld r0, X+
out PORT, r0 ; wystawienie stanu
brne .petla
W ten sposób aktualizację masz co 5 cyklii. Poniżej tego nie da się zejść: gdyby to były 4 cykle, to 1 jest dla wystawiania, 3 zostają na resztę. w 3 cyklach nie da się zmieścić 2 operacji odczytu, więc każdy blok 3 cyklowy musiał by zawierać jeden odczyt (nie da się przesunąć odczytu do sąsiedniego/nadmiarowego) - wtedy zostaje jeden cykl, a nie ma skoku trwającego 1 cykl.
Co do procedury opóźniającej, która ma być jak najszybsza... hm.. co najmniej zastanawiające stwierdzenie.. chcesz odczekać np 100ms, ale procedura ma być szybka i ma się wykonać w 10ms?? Dość ciężko zrozumieć...
Jakkolwiek jeśli chodziło Ci o pętlę do małych opóźnień, to można zrobić tak:
ldi Rx, liczba_cykli/3
.petla_op:
subi Rx, 1
brne .petla_op
subi pomimo zmniejszania wartości rejestru ustawia też flagi, które można wykorzystać przy skokach.. w tym przypadku pętla wykonuje się w 3*Rx-1, a wczytywanie trwa 1 cykl, czyli lącznie całość trwa dokładnie 3*Rx cykli - bardzo często korzystam z tej formułki.. czasem można zmienić skok typu "brne" na skok typu "brsh" - np jeśli na wartość zero z początku ma reagować przerwaniem pętli zamiast 256 iteracjami..
A co mi się jeszcze wspomniało: subi można zastąpić przez dekrementację - instrukcja "dec" - można wtedy jako licznik korzystać ze wszystkich 32 rejestrów (subi ogranicza możliwość do rejestrów r16-r31). Jedyna uwaga, to "dec" nie zmienia wartości flagi C, a więc nie można go stosować wraz ze skokiem "brsh"