Просмотр полной версии : Быстро переместить 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
Спасибо.
Подскажите быструю процедуру "смещения вниз" куска памяти в 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
тогда то, что ты перетаскиваешь не затрётся, порсто, если втупую делать последовательно, тогда оно будет копировать в те места, которые ему ещё предстоит скопировать, но он ещё не скопировал
Подскажите быструю процедуру "смещения вниз" куска памяти в 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' - теоретически получается медленнее, хоть и больше данных забираем за раз.
Мдя, именно это я имел ввиду.
Народ, если кому еще чего надо - спрашивайте, интересно будет подумать.
надо пригласить McBuster'a. он любил конкурсы кодерские устраивать.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot