Подскажите, кому не лень, как перевести число из HEX в DEC. Переклинило меня не могу сообразить. Все что приходит в голову так это или составить таблицу или тупо отнимать по 10 и проверять на заём. Нужна компактная процедура перевода однобайтного числа в диапазоне #00-#63 в десятичные 0-99. Ну пожалуйста!![]()
Последний раз редактировалось valeron; 15.09.2008 в 20:52.
Можно использовать "средний" вариант - держать таблицу из семи BCD-чисел (0,16,32,48,64,80,96), а потом корректировать. Т.е получается выборка из таблицы и одно или два вычитания (на 10 для младших разрядов) с инкрементами (для старших).
А.. ну и еще 1-3 сдвига на 4 бита (в зависимости от того, хранить в таблице упакованные числа или нет, и должно ли число на выходе быть упакованным). По-моему есть какая-то команда BCD-корректировки после сложения, с ее помощью можно немного соптимизировать.
Последний раз редактировалось Shwartz; 15.09.2008 в 22:08.
Вот тут инфа не поможет?
http://baze.au.com/misc/z80bits.html
Ты натолкнул меня на одну идею, щас обмозгую, может как раз и получится компактно и быстро.
Добавлено через 5 минут
Есть переменная - один байт. По ходу дела её значение меняется в некотором диапазоне. Задача - регулярно выводить на экран в человеческом (десятичном) виде текущее значение. Например если переменная равна #10 то на экран нужно выводить 16, если #1F то 31 и т.д.
Добавлено через 7 минут
Спасибо за ссылку, я хоть и учил английский, но литературный, так что с трудом разбираю что там к чему, но сайт, без сомнения, полезный. Tnx.
Последний раз редактировалось valeron; 16.09.2008 в 11:16. Причина: Добавлено сообщение
Если я правильно понял, то вот вариант:Сообщение от valeron
Регистры B и C содержат соответственно старший и младший ASCII коды результирующего числа.Код:;**************************************************** ; a => bc ; [0..63h] => ['00'..'99'] ;**************************************************** bin2bcd: ld c,10 ld b,'0'-1 ; делить исходное число на 10 div10: inc b ;старший нибл sub c jr nc,div10 ; переполнение add a,c add a,'0' ld c,a ;младший нибл ret ;****************************************************
Последний раз редактировалось caro; 16.09.2008 в 12:40.
CARO, ну просто огромное спасибо. Такая короткая процедура что я потрясен. Вот для сравнения то что я сегодня родил, сохраню для истории, потом когда-нибудь прикольно будет почитать
org #7800tablDB #00 - таблица десятичных значений для старшего полубайта
DB #16 - для пересчета шестнадцатиричных чисел в десятичный
DB #32 - вид для диапазона от нуля до ста.
DB #48 - таблица не должна попадать на переход адресов через
DB #64 - круглое значение (например #7800, #7900,#7A00 и т.д)
DB #80
DB #96
HEX>DECLD C,A - сохранить исходное число
AND #0F - взять мл.полубайт
OR A - сбросить флаги
DAA - преобразовать в десятичный вид
LD B,A - запомнить в регистре В
LD HL,tabl - адрес начала таблицы для старшего полубайта
LD A,C - берем исходное число
RRCA - выделяем старший полубайт
RRCA -
RRCA -
RRCA -
AND #0F - и подготавливаем индексацию таблицы
ADD A,L - индексация
LD L,A -
LD A,(HL) - берем из таблицы десятичное значение ст.полубайта
ADD A,B - складываем с десятичным значение мл. полубайта
OR A - сбрасываем флаги
DAA - еще раз чтобы при сложении избавится от переполнения
RET мл.полубайта
Ну пожалуй эта процедура равномерна по времени исполнения и там где это критично вполне может подойти в качестве альтернативы.
Последний раз редактировалось valeron; 16.09.2008 в 23:08.
У меня совсем дурацкий вариант с 26-байтной таблицей
Код:; a - исходное число ;на выходе: ; b - первый символ ; с - второй символ HexToDec ld l, a ;определяем смещение в таблице srl l srl l res 0, l ld h, 0 ;если выровнять Table на 256 байт, ld de, Table ;то эти строки можно заменить на add hl, de ; ld h, Table / 256 ld b, (hl) ;старшая цифра inc hl and 7 add (hl) ;младшая цифра cp "9" + 1 jr c, EndHexToDec ;если > 9 inc b ;увеличиваем старшую sub 10 ;уменьшаем младшую EndHexToDec ld c, a ret Table db "00081624324048566472808896"
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)