A dlaczego odszedłeś od liczenia pętli rejestrami BC? Dostałeś pięknego gotowca:
time ld bc,2995
petla dec bc
ld a,b
or c
jp nz,petla
ret
Jeśli nie potrzebujesz tak pojemnego licznika (16 bitów), a wystarcza Ci ośmiobitowy, to nie musisz używać rejestru C - wystarczy sam akumulator (wynik - 255 wykonań):
time xor a ; ld a,0
petla inc a
cp 255
jr nz,petla
ret
Możesz też skrócić nieco kod, porównując nie z 255, a z zerem (pętla wykona się o jeden raz więcej, czyli 256 wykonań):
time xor a ; ld a,0
petla inc a
or a ; cp 0
jr nz,petla
ret
Możesz też użyć specjalnej predefiniowanej pętli z użyciem rejestru B (uwaga - zero oznacza 256 wykonań, 255 - to 255, itp.).
time ld b, 0
petla djnz petla ; dec b + jr nz, petla
ret
Jednak ten kod wykona się szybciej od poprzednich, bo jest mniej rozkazów objętych pętlą! Można ją spowolnić, dodając np. rozkazy typu "nic nie rób" -
NOP w środku pętli (dotyczy to każdego rodzaju pętli).
time ld b, 0
petla nop
nop
nop
...
djnz petla ; dec b + jr nz, petla
ret
Jeszcze uwaga:
JP od
JR różni się zasięgiem skoku. Argument JP jest 16-bitowy (więc kod zajmuje więcej pamięci), ale można skoczyć w dolone miejsce pamięci. JR ma argument 8-bitowy, zakodowany w formacie uzupełnień do 2 (U2), czyli w zakresie od -128 do +127. Asembler sam zadba o wyliczenie, jeśli używasz etykiet (a używasz). Jak skok jest za daleki - wyrzuci błąd.
Kolejna uwaga:
XOR a - zeruje akumulator, bo funkcja XOR zeruje te bity, które są jednakowe, a "a XOR a"... chyba logiczne?

I kolejna:
OR a - ustawia flagi, ale nie zmienia zawartości akumulatora (a OR a). Chdzi w głównej mierze o stwierdzenie, czy zawartość jest równa zero, czyli to samo, co "CP 0".