Просмотр полной версии : Оптимизация
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.
я так понимаю, триггер на два случая из восьми
Или шесть из восьми?
Надо убедиться, что:
R - истинно случайное.
AF - не используется в обеих ветках.
Нет самомодифицирующегося кода. Например константы 7,3 и 5 не изменяются.
Тогда это 6 из 8. То же что 3 из 4.
LD A,R
AND 3; 5 или 6. два бита нам нужны.
JP NZ,m_a
- - - Добавлено - - -
А R нужно проверить, чтобы не писалось _до_, или читалось _до_ или _после_, за фиксированном количестве тактов.
Зачем нужен 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 невысокое.
Про это знаю, ага.
Конкретно тут некритично - просто монстр чуть раньше или чуть позже нападёт.
Если вообще не критично можно 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.
79/80
7f/80 ты хотел сказать :)
Spectramine
25.08.2018, 04:13
Упс) точно. От 1/128 до 127/128, то есть.
Если вообще не критично можно cp 0x60, будет 60 из 80.
При таком подходе значимы становятся более старшие биты регистра R. Старшие биты меняются реже, и больше вероятность получить не совсем случайность.
Из опыта: незачем пытаться сжать код и писать алгоритм. Напиши готовый код, потом покажи. Решения найдутся сразу наверное(:
Bedazzle
25.08.2018, 09:05
Из опыта: незачем пытаться сжать код и писать алгоритм. Напиши готовый код, потом покажи.
Это когда с нуля. :) Я имеющийся ужимаю:
- переделал где возможно JP на JR
- CALL/RET на JP
- одиночные вызовы маленьких функций заменил на инлайн
- ветвления с константами заменил одну ветку на DEC A
- повыкидывал пустоты в данных
Можно пожать часть данных и кода, но элегантного решения как это удобно компилить пока не придумал.
Элегантного? (:
это что, 512b game compo?
Я имеющийся ужимаю
а зачем ?
Bedazzle
25.08.2018, 09:53
а зачем ?
русский текст длиннее английского?
сделай 128k (для теста) и если понравится (в чём я сильно сомневаюсь) думай как впихнуть в 48k
Bedazzle
25.08.2018, 12:20
сделай 128k (для теста) и если понравится (в чём я сильно сомневаюсь) думай как впихнуть в 48k
Точнее "не понравится". :)
Я про медленную память не алё, запутался на каких машинках что.
а как русский язык коррелируется с фирменными спеками ?
на них точно ввод слов превратится в ад
...........
если я правильно понял в HoM все сообщения складываются из готовых слов.
явно будут проблемы с падежами/окончаниями и.т.д.
была предварительная проработка этого момента ?
Bedazzle
25.08.2018, 13:18
если я правильно понял в HoM все сообщения складываются из готовых слов.
явно будут проблемы с падежами/окончаниями и.т.д.
была предварительная проработка этого момента ?
Там не английский, а мерфиш (упрощённый английский).
Таким образом и русский будет упрощённый - т.е. "бросить бутылка". Хотя можно переделать процедуру, чтобы обрезать окончания.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot