PDA

Просмотр полной версии : Быстро переместить 384b



Aprisobal
20.01.2005, 03:20
Подскажите быструю процедуру "смещения вниз" куска памяти в 384b на несколько байт(от 2 до 40), например из #8000 в #8010. Ничего кроме след. кода на ум не пришло:


;HL - ист., DE - приёмник
LD BC,$19FF
.ldd: DB $ED,$A8,$ED,$A8,$ED,$A8,$ED,$A8 ;LDD
DB $ED,$A8,$ED,$A8,$ED,$A8,$ED,$A8 ;LDD
DB $ED,$A8,$ED,$A8,$ED,$A8,$ED,$A8 ;LDD
DB $ED,$A8,$ED,$A8,$ED,$A8,$ED,$A8 ;LDD
DJNZ .ldd

Спасибо.

MadCat!
20.01.2005, 16:51
Подскажите быструю процедуру "смещения вниз" куска памяти в 384b на несколько байт(от 2 до 40), например из #8000 в #8010. Ничего кроме след. кода на ум не пришло:
...
Спасибо.
быстро - PUSH/POP, но там свои ограничения ;)

Corpsegrinder
20.01.2005, 19:58
Всё зависит от того для чего тебе нужно перемещать.

вообще можно через стэк типа вот этого:

ld sp,откуда+384
pop hl
ld (куда+384-2),hl
pop hl
ld (куда+384-4),hl
...
192 раза

или через LDD
ld hl,otkuda+384
ld de,kuda+384
dup 384
ldd
edup

тогда то, что ты перетаскиваешь не затрётся, порсто, если втупую делать последовательно, тогда оно будет копировать в те места, которые ему ещё предстоит скопировать, но он ещё не скопировал

Looker
21.01.2005, 15:16
Подскажите быструю процедуру "смещения вниз" куска памяти в 384b на несколько байт(от 2 до 40), например из #8000 в #8010. Ничего кроме след. кода на ум не пришло:


;HL - ист., DE - приёмник
LD BC,$19FF

DJNZ .ldd



Только вроде bc,#18ff.
С регистром С действительно лучше перестраховаться.
Вообще, если тебе нужен не полностью развернутый код и полная относительность, то лучше ничего не придумаешь.

Другое дело, если адрес откуда-куда меняется не очень часто.
Тогда можно поизвращаться со стеком.
Можно, как предложил Corpsegrinder, можно еще извратней...
Если такой вариант подойдет, можем поизвращаться...

Aprisobal
22.01.2005, 00:46
Спасибо за все ответы.
Только вроде bc,#18ff.Надо $19FF, т.к. переносится 384 байта => при переполнении регистра C регистр B уменьшится на единицу => в регистре B станет искомое число повторов цикла.

Другое дело, если адрес откуда-куда меняется не очень часто.Да, источник всегда один и тот же. Забыл в первом посте написать.

В аттач засунул исходник, в котором переброска реализована через стек. Надеюсь кому-нибудь пригодится.
Получилось так: 6144 тактов у 384 команд LDD против 5398 тактов при переброске через стек. Не слишком много, но иногда важен каждый такт.
Ещё: в процедурах переброски не использовал IX,IY и AF' - теоретически получается медленнее, хоть и больше данных забираем за раз.

Looker
23.01.2005, 13:43
Мдя, именно это я имел ввиду.

Народ, если кому еще чего надо - спрашивайте, интересно будет подумать.

jtn
23.01.2005, 15:23
надо пригласить McBuster'a. он любил конкурсы кодерские устраивать.