говорили тебе, а ты не слушал:v2_dizzy_facepalm:
Вид для печати
Мне бы твои проблемы, я после привыкания к современным реалиям (в 99% случаев приходится писать не быстрый код, а расширяемый и легкоподдерживаемый, независимо от сис-требований) вообще почти уже разучился считать такты и байты. Стараюсь по привычке писать "как лучше" и только потом когда ничего не работает, уже вспоминаю что на Z80 нету "стопицот" гигов и гигагерц :)
Sergey, так в среднем ещё быстрей выходит:
26/41 тактовКод:LD A,H ; 4
XOR D ; 4
LD A,H ; 4
RLA ; 4
JP M,CHD ; 10
SBC HL,DE ; 15
CHD
Всё, вилы!
33/37 т.Код:LD A,H ; 4
XOR D ; 4
JP P,CHD ; 10
EX DE,HL ; 4
CHD SBC HL,DE ; 15
P.S. Это надо-же, всю ночь мучатся...
Как работает - разбирайся сам, я спать наконец-то :)
Вставлю и свою версию (для разнообразия).
Оформленна как подпрограмма.
Недостатки: более медленная, большая, сложно переделать в inline.
Достоинства: не портятся HL, DE. Возможно творчески переделать в inline, так что скорость увеличится. (Сейчас, когда она как подпрограмма, то содержит много условных переходов для подготовки флага C. Inline эти переходы можно использовать непосредственно)
Вероятности p посчитаны при равномерном распределении аргументов (-32768..32767). Чем меньше диапазон значений аргументов будет на самом деле, тем выше будет вероятность последнего выхода в 36 тактов.Код:LD A,H ;4
SUB D ;4
JP Z,HiEQ ;10
CCF ;4 (=22)
RET PE ;5 (exit 33 p=0.25)
JP P,Els_ ;10
SCF ;4
RET ;10 (exit 51 p=0.373)
Els_:
XOR A ;4
RET ;10 (exit 51 p=0.373)
HiEQ:
LD A,L ;4
CP E ;4
RET ;10 (exit 36 p=0.004)
[свернуть]
Аттач - тесты
, чтобы убедится, что все процедуры работают одинаково. Все 5 версий, которые я нашёл в этой теме. Файл - ассемблер EMUZWin.
Сам я убедился. :)
(Хм. А вдруг они все работают одинаково неправильно? :) )
Там два режима, 0 - полный перебор значений, сначала меняются старшие байты. 1 - берутся псевдослучайные 256 байт из ПЗУ, и тесты проходят только с ними.[свернуть]