PDA

Просмотр полной версии : Оптимизация



Bedazzle
24.08.2018, 18:09
Есть такой код:



ld a, r
and 7

cp 3
jr c, monster_attack

cp 5
jr nc, monster_attack


если А потом не используется, могу ли я заменить на



ld a, r
and 7

cp 6
jr c, monster_attack

shurik-ua
24.08.2018, 18:18
ld a,r
rra
and 3
jr nz, monster_attack


если нужно проверять 2-ой бит (считая от нуля) тогда



ld a,r
rra
rra
and 1
jr nz, monster_attack

Bedazzle
24.08.2018, 18:54
если нужно проверять 2-ой бит (считая от нуля)


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

shurik-ua
24.08.2018, 20:04
триггер на два случая из восьми
на 4.

для двух или одного случая лучше всё таки сравнение юзать.

Spectramine
24.08.2018, 20:09
Есть такой код:



ld a, r
and 7

cp 3
jr c, monster_attack

cp 5
jr nc, monster_attack


если А потом не используется, могу ли я заменить на



ld a, r
and 7

cp 6
jr c, monster_attack


Если A потом не используется, можно сделать так. Но непонятно, что заставило авторов делать две проверки вместо одной. Возможно, А не используется в ветви перехода, но используется далее по коду? Возможно, в ветви перехода проверяется бит CF (или ZF)?

- - - Добавлено - - -


на 4.

для двух или одного случая лучше всё таки сравнение юзать.

Переход на monster_attack делается по значениям 0,1,2,5,6,7 после AND 7, и не делается по значениям 3,4.

Reobne
24.08.2018, 20:35
я так понимаю, триггер на два случая из восьми
Или шесть из восьми?

Надо убедиться, что:
R - истинно случайное.
AF - не используется в обеих ветках.
Нет самомодифицирующегося кода. Например константы 7,3 и 5 не изменяются.

Тогда это 6 из 8. То же что 3 из 4.
LD A,R
AND 3; 5 или 6. два бита нам нужны.
JP NZ,m_a

- - - Добавлено - - -

А R нужно проверить, чтобы не писалось _до_, или читалось _до_ или _после_, за фиксированном количестве тактов.

Shiny
24.08.2018, 20:40
Зачем нужен R? случайное число получится ахтунговое.
Если нужно фиксированное тактов, то задача непонятная - а в ветвлениях будет одно количество тактов?
для перехода удобнее построить таблицу:

dw bra1 ;0
dw bra1 ;1
dw bra1 ;2
dw bra2 ;3
dw bra1 ;4
dw bra2 ;5
dw bra1 ;6
dw bra2 ;7

и получить адрес старым индейским способом.

Bedazzle
24.08.2018, 21:13
А R нужно проверить, чтобы не писалось _до_, или читалось _до_ или _после_, за фиксированном количестве тактов.

Да, там стандартные прерывания, так что будем считать, что всё хорошо.

- - - Добавлено - - -


Зачем нужен R? случайное число получится ахтунговое.

В смысле?



Если нужно фиксированное тактов, то задача непонятная - а в ветвлениях будет одно количество тактов?
для перехода удобнее построить таблицу:


Так понимаю, это клёво и быстро, если много ветвлений.
Тут всего две ветки, и пробую получить минимальный размер.

Spectramine
24.08.2018, 21:29
Сообщение от Шынни
Зачем нужен R? случайное число получится ахтунговое.

В смысле?
Я так понимаю, имеется ввиду, что качество псевдослучайной последовательности на регистре R невысокое. Если в коде нет обработки ввода из портов (либо есть, но из порта идут повторяющиеся данные), она вообще обычно вырождается в повторяющуюся последовательность.

Bedazzle
24.08.2018, 22:18
Я так понимаю, имеется ввиду, что качество псевдослучайной последовательности на регистре R невысокое.

Про это знаю, ага.
Конкретно тут некритично - просто монстр чуть раньше или чуть позже нападёт.

krt17
24.08.2018, 22:31
Если вообще не критично можно cp 0x60, будет 60 из 80.

Bedazzle
24.08.2018, 23:24
Если вообще не критично можно cp 0x60, будет 60 из 80.

ХитрО. По байтам то же самое, и не портит А. :)

Заюзал выше предложенный вариант

LD A,R
AND 3
JP NZ,m_a

Spectramine
25.08.2018, 02:10
Вариант с CP N без AND ещё позволяет более гибко выставлять вероятность - от 1/80 до 79/80.

krt17
25.08.2018, 02:55
79/80
7f/80 ты хотел сказать :)

Spectramine
25.08.2018, 04:13
Упс) точно. От 1/128 до 127/128, то есть.

Reobne
25.08.2018, 07:43
Если вообще не критично можно cp 0x60, будет 60 из 80.
При таком подходе значимы становятся более старшие биты регистра R. Старшие биты меняются реже, и больше вероятность получить не совсем случайность.

Shiny
25.08.2018, 08:52
Из опыта: незачем пытаться сжать код и писать алгоритм. Напиши готовый код, потом покажи. Решения найдутся сразу наверное(:

Bedazzle
25.08.2018, 09:05
Из опыта: незачем пытаться сжать код и писать алгоритм. Напиши готовый код, потом покажи.

Это когда с нуля. :) Я имеющийся ужимаю:
- переделал где возможно JP на JR
- CALL/RET на JP
- одиночные вызовы маленьких функций заменил на инлайн
- ветвления с константами заменил одну ветку на DEC A
- повыкидывал пустоты в данных

Можно пожать часть данных и кода, но элегантного решения как это удобно компилить пока не придумал.

Shiny
25.08.2018, 09:34
Элегантного? (:
это что, 512b game compo?

goodboy
25.08.2018, 09:35
Я имеющийся ужимаю
а зачем ?

Bedazzle
25.08.2018, 09:53
а зачем ?

русский текст длиннее английского?

goodboy
25.08.2018, 10:49
сделай 128k (для теста) и если понравится (в чём я сильно сомневаюсь) думай как впихнуть в 48k

Bedazzle
25.08.2018, 12:20
сделай 128k (для теста) и если понравится (в чём я сильно сомневаюсь) думай как впихнуть в 48k

Точнее "не понравится". :)

Я про медленную память не алё, запутался на каких машинках что.

goodboy
25.08.2018, 12:50
а как русский язык коррелируется с фирменными спеками ?
на них точно ввод слов превратится в ад
...........
если я правильно понял в HoM все сообщения складываются из готовых слов.
явно будут проблемы с падежами/окончаниями и.т.д.
была предварительная проработка этого момента ?

Bedazzle
25.08.2018, 13:18
если я правильно понял в HoM все сообщения складываются из готовых слов.
явно будут проблемы с падежами/окончаниями и.т.д.
была предварительная проработка этого момента ?

Там не английский, а мерфиш (упрощённый английский).
Таким образом и русский будет упрощённый - т.е. "бросить бутылка". Хотя можно переделать процедуру, чтобы обрезать окончания.