Допустим нам надо перебросить данные (несколько кб) из одной области памяти(их несколько) в другую(а вот назначение постоянно или,если уж совсем идеально, пара-тройка адресов) и сделать это побыстрее, а памяти потратить на процедуру поменьше(килов до 4х отсилы).
Какие у нас пути?..
1) Если хранить данные внутри блоков ld rr,NN : push rr, получим наибыстрейшую загрузку(так ли это?) в 10.5 тактов на байт и эпический жор памяти. Врядли применимо в реальных проектах.
2) портянка из
Код:
ld sp,#src
pop af
pop bc
pop de
pop hl
exx
pop bc
pop de
pop hl
ld sp,#dest
push hl
push de
push bc
exx
push hl
push de
push bc
push af
даст 12.5 тактов на байт, но сожрёт много памяти, а источник выбрать не получится. =\
3) портянка из pop hl:ld hl,(NN). Удовлетворяет и скоростью и выбором источника, но память жрёт тоже неприемлемо.
4) красивая макра - хорошая замена LDIR'у, стек не трогает - почти 16t/b и немного памяти, но я хочу быстрее =(
Код:
macro ldirf
xor a
sub c
and 128-1
add a,a
ld ($+4),a
jp 1f
align 256
1
dup 128
ldi
edup
jp pe,1b
endm
На основе варианта №2 накодил самомодифицирующийся цикл с ~15t/b размером даже меньше варианта №4, можно ли ЕЩЁ быстрее? (Да, пока есть память, можно часть переслать по №3, часть ещё как-то, но вопрос не в этом =))