Dart Alver, если уж делать большой буфер, то есть парочка вариантов поинтереснее:
Первый вариант тратит 14 тактов на jp/ret, 20 тактов на правку команды jp, и 33 такта на вычисления. На генерацию одного байта тратится 67 тактов, недостаток только в том, что каждый элемент массива заменён кодом размером 14 байт.Код: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
Второй вариант хорошо работает, если сделать 256 элементов в буфере, чтобы записывать новый элемент на место одного из старых, тогда вычисления займут 104 такта. Если нужен буфер конкретного размера, то можно либо добавить условные переходы на подпрограммы, которые будут править указатели и менять ofs1 на ofs2 и обратно при достижении указателями конца буфера, либо добавить только один из них, а подпрограммы чуть усложнить, чтобы они убирали первый условный переход и вставляли второй и наоборот, тогда вместо 14 дополнительных тактов при буфере на 98 элементов в среднем мы будем терять 10.




Ответить с цитированием
