Dart Alver, если уж делать большой буфер, то есть парочка вариантов поинтереснее:
Код:
rnd:	jp x0		

x0:
	ld a,x1	
	ld (rnd+1),a	
	ld a,(x1_n+1)
x0_n:	sub a,n
	ld (x2_n+1),a
	ret		
....
xn:
	ld a,x1	
	ld (rnd+1),a	
	ld a,(x0_n+1)
xn_n:	sub a,n
	ld (x1_n+1),a
	ret		


rnd:
	push hl
p0:	ld hl,ptr
	inc l
;	jr z, patch1
	mov a,l	
	ld (p0+1),a
	add a,ofs1	
;	jr z,patch2
	ld (p1+1),a
	ld a,(hl)	
p1:	ld l,n
	sub a,(hl)
	ld (hl),a
	pop hl	
	ret
Первый вариант тратит 14 тактов на jp/ret, 20 тактов на правку команды jp, и 33 такта на вычисления. На генерацию одного байта тратится 67 тактов, недостаток только в том, что каждый элемент массива заменён кодом размером 14 байт.
Второй вариант хорошо работает, если сделать 256 элементов в буфере, чтобы записывать новый элемент на место одного из старых, тогда вычисления займут 104 такта. Если нужен буфер конкретного размера, то можно либо добавить условные переходы на подпрограммы, которые будут править указатели и менять ofs1 на ofs2 и обратно при достижении указателями конца буфера, либо добавить только один из них, а подпрограммы чуть усложнить, чтобы они убирали первый условный переход и вставляли второй и наоборот, тогда вместо 14 дополнительных тактов при буфере на 98 элементов в среднем мы будем терять 10.