PDA

Просмотр полной версии : rr=Array[offset]



NovaStorm
27.09.2012, 21:03
Как выгоднее всего получать в 8-ми и 16-ти битных регистрах значения массива(смещение 8 бит)?

goblinish
27.09.2012, 21:48
Как выгоднее всего получать в 8-ми и 16-ти битных регистрах значения массива(смещение 8 бит)?
зависит от цели.
можешь по 8-битному регистру брать по табличному принципу. например:
array=#6000

ld h,#60
ld l,a;a=индекс
ld a,(hl); тут и значение.

ну и 16-битное аналогично по #61,#60

другие подскажут..

SAM style
27.09.2012, 21:51
разместить массив по адресу #xx00
для 8-битных данных:
LD H,xx
LD L,index
LD A,(HL)
Для 16-битных будет 2 таких массива один за другим, в одном - младший байт, в другом - старший
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 ----------

Опередил...

NovaStorm
28.09.2012, 07:59
А ежели массивов много, но по несколько элементов, и памяти на кратное 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

Можно ли как-то ещё более удобно?

goblinish
28.09.2012, 08:44
Можно ли как-то ещё более удобно?

ld l,index
ld h,0
ld de,array
;теперь двухбитное
add hl,hl
add hl,de
ld r1,(hl)
inc hl;inc l
ld r2,(hl)

не помогает?
IX просто, конечно, но прожорлив в памяти, да и с тактами, наверное.

NovaStorm
28.09.2012, 09:24
В твоём варианте 63, в моём для 16-бит - 57 тактов =)
И 12 против 11 байт соответственно.
Ладно, спасибо, видать мой вариант не самый плохой, да и одним регистром меньше задействуется.

goblinish
28.09.2012, 09:38
NovaStorm, а со стэком не пробовал? популярный EI вариант.

NovaStorm
28.09.2012, 09:52
Не пробовал, но так ли сильно он будет отличаться от этих? Да и загружать/восстанавливать SP тоже придётся.

goblinish
28.09.2012, 10:21
Не пробовал, но так ли сильно он будет отличаться от этих? Да и загружать/восстанавливать SP тоже придётся.

смотря то, что ты мучаешь.

Vitamin
30.09.2012, 00:50
ld a,high addr
adc 0
ld h,a
Обычно меняется на


adc a,high addr
sub l
ld h,a

-1 байт, -3 такта.

NovaStorm
30.09.2012, 10:26
Через HL я тоже пробовал, правда не так эффективно.
Теперь по сравнению с ix, получаются те же 8 байт, но 33 против 38 тактов. Удобный регистр портится, но тут уж придётся выбирать.

goblinish
30.09.2012, 11:11
Теперь по сравнению с ix, получаются те же 8 байт, но 33 против 38 тактов. Удобный регистр портится, но тут уж придётся выбирать.

приведи лучше код, а так звучит, как секретная разработка...

NovaStorm
30.09.2012, 12:19
>как секретная разработка
Так и есть -_-
Просто я не думал, что в моём гм.. коде, в котором и мне то трудно разбираться, кому-то копаться захочется =)
Надо было всего лишь получать из массивов параметры для ldir'а.
Из номера буфера делать что, куда, сколько. Потому и свободных регистров не было. Но сейчас всё уже работает через макрос с IX.
Проблемы конечно довольно наивные, потому грызу сам, это уж как какой-то вопрос оформился, вот спросил.

goblinish
30.09.2012, 13:47
Надо было всего лишь получать из массивов параметры для ldir'а.
на ходу вычислять - уже не вариант?

NovaStorm
30.09.2012, 16:35
Не, их надо хранить. Да и сейчас обсуждать по этому коду что-то бессмысленно, так как он активно до/пере писывается и сильно при этом мутирует =)