Как выгоднее всего получать в 8-ми и 16-ти битных регистрах значения массива(смещение 8 бит)?
Вид для печати
Как выгоднее всего получать в 8-ми и 16-ти битных регистрах значения массива(смещение 8 бит)?
разместить массив по адресу #xx00
для 8-битных данных:Для 16-битных будет 2 таких массива один за другим, в одном - младший байт, в другом - старшийКод:LD H,xx
LD L,index
LD A,(HL)
Код:LD H,xx
LD L,index
LD E,(HL)
INC H
LD D,(HL)
---------- Post added at 21:51 ---------- Previous post was at 21:50 ----------
Опередил...
А ежели массивов много, но по несколько элементов, и памяти на кратное 256 расположение не напасёшься?
Я сейчас делаю так(для 16-бит - inc ix или +1 для второй половинки регистра назначения):
Можно ли как-то ещё более удобно?Код:macro ld_ixa_r label,r
ld ixh,label/256+1*((label%256)/128)
ld ixl,a
ld r,(ix+label%256-256*((label%256)/128))
endm
В твоём варианте 63, в моём для 16-бит - 57 тактов =)
И 12 против 11 байт соответственно.
Ладно, спасибо, видать мой вариант не самый плохой, да и одним регистром меньше задействуется.
NovaStorm, а со стэком не пробовал? популярный EI вариант.
Не пробовал, но так ли сильно он будет отличаться от этих? Да и загружать/восстанавливать SP тоже придётся.
Через HL я тоже пробовал, правда не так эффективно.
Теперь по сравнению с ix, получаются те же 8 байт, но 33 против 38 тактов. Удобный регистр портится, но тут уж придётся выбирать.
>как секретная разработка
Так и есть -_-
Просто я не думал, что в моём гм.. коде, в котором и мне то трудно разбираться, кому-то копаться захочется =)
Надо было всего лишь получать из массивов параметры для ldir'а.
Из номера буфера делать что, куда, сколько. Потому и свободных регистров не было. Но сейчас всё уже работает через макрос с IX.
Проблемы конечно довольно наивные, потому грызу сам, это уж как какой-то вопрос оформился, вот спросил.
Не, их надо хранить. Да и сейчас обсуждать по этому коду что-то бессмысленно, так как он активно до/пере писывается и сильно при этом мутирует =)