Как вариант:
Код:xor a
sbc hl,de
jr z,exit
rlc h
sbc a,a
or 1
exit:
Вид для печати
Как вариант:
Код:xor a
sbc hl,de
jr z,exit
rlc h
sbc a,a
or 1
exit:
rlc h -> ld a,h:rla
Ещё тогда (05.09.2015) насторожило.
И жило где-то внутри, грызло - чёрт, где-то я это видел...
И вот на днях штудируя и упорядочивая прессу - наткнулся:
" Работая на ассемблере уже несколько лет, я долгое время так и не знал
принципа работы (стыдобушка!) команды DAA (#27). Но вот недавно, загрузив
непревзойденный STS, я наконец детально разобрался в алгоритме работы этой
операции, чем и делюсь с теми, кто по каким-то причинам до сих пор этого не
сделал.
На работу команды влияют флаги C,H,N, а также содержимое регистра A.
Алгоритм:
1. Если флаг N выключен (равен 0), то в последующих шагах выполняется операция
сложения. Если же включен (равен 1), то операция вычитания.
2. Если аккумулятор больше #90 или флаг C включен, то к аккумулятору
прибавляется (вычитается) #60. Здесь не случайно написано "или". Если и
A>#90, и CF=1, то сложение (вычитание) #60 происходит всего лишь один раз.
3. Если младший полубайт больше #9 или флаг H включен, то аналогично п.2 к
аккумулятору прибавляется (вычитается) #06. Здесь также работает принцип
OR."
Пруф: http://zxpress.ru/book_articles.php?id=671
От себя могу добавить следующее:
1. Уже в те времена не знать как работает DAA считалось неприличным ("стыдобушка")
2. Уже сейчас только krt17, "Никогда не использовал daa, заставило разобраться как именно она работает.
3. Я лично так и не прочувствовал все тонкости работы этой команды.
Вывод неутешителен (для меня), надеюсь я один такой тормоз.
За сим откланиваюсь, до новых встреч други, надеюсь скоро снова будем грызть-оптимизировать какой-нибудь интересный этюд.
Но они видимо предвидели (читай "предполагали") будущее.
Когда преобразования встанут ребром.
Я счаз работаю с ПЛК, там порой нужно привести сигнал из аналогового уровня к процентному (например. или к примеру дольному)
Ну и как этот IEEE (скажем 4.0073+e004) превратить в вид для человеков?
Вот и вспомнил DAA (не помогло сразу, но ведь есть TRUNC) !
:)
ладно, уговорил :D
"старший полубайт" значит.
Я как закоренелый читер частенько натыкаюсь на DAA когда выцепляю всякие вывод жизней и прочее на экран. Так что для ассемблера DAA тоже не редкость. Даже в своей проге как-то юзал. Но не прочухал до конца, как она работает. Вот-бы схему увидеть (логическую) как оно устроено...
Есть у нас умельцы нарисовать? (или готовая у кого завалялась?)
Вложение 53939
Вложение 53940
Пример:
вызывается после операций сложения/вычитания чисел в BCD формате, для коррекции результатаКод:ld a,%00010101 ;(15)
ld c,%00111001 ;(39)
add a,c ;a=%01001110 (4E)
daa ;a=%01010100 (54)