Я вообще-то реал имел ввиду. Нету у меня на работе ПЦ, связист я. А спектрум есть, и даже иногда выкраиваю время на него.
Вид для печати
Подскажите, кому не лень, как перевести число из HEX в DEC. Переклинило меня не могу сообразить. Все что приходит в голову так это или составить таблицу или тупо отнимать по 10 и проверять на заём. Нужна компактная процедура перевода однобайтного числа в диапазоне #00-#63 в десятичные 0-99. Ну пожалуйста!:v2_blush:
Можно использовать "средний" вариант - держать таблицу из семи BCD-чисел (0,16,32,48,64,80,96), а потом корректировать. Т.е получается выборка из таблицы и одно или два вычитания (на 10 для младших разрядов) с инкрементами (для старших).
А.. ну и еще 1-3 сдвига на 4 бита (в зависимости от того, хранить в таблице упакованные числа или нет, и должно ли число на выходе быть упакованным). По-моему есть какая-то команда BCD-корректировки после сложения, с ее помощью можно немного соптимизировать.
Вот тут инфа не поможет?
http://baze.au.com/misc/z80bits.html
Ты натолкнул меня на одну идею, щас обмозгую, может как раз и получится компактно и быстро.
Добавлено через 5 минут
Есть переменная - один байт. По ходу дела её значение меняется в некотором диапазоне. Задача - регулярно выводить на экран в человеческом (десятичном) виде текущее значение. Например если переменная равна #10 то на экран нужно выводить 16, если #1F то 31 и т.д.
Добавлено через 7 минут
Спасибо за ссылку, я хоть и учил английский, но литературный, так что с трудом разбираю что там к чему, но сайт, без сомнения, полезный. Tnx.
Если я правильно понял, то вот вариант:Цитата:
Сообщение от 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, ну просто огромное спасибо. Такая короткая процедура что я потрясен. Вот для сравнения то что я сегодня родил, сохраню для истории, потом когда-нибудь прикольно будет почитать :)
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 мл.полубайта
Ну пожалуй эта процедура равномерна по времени исполнения и там где это критично вполне может подойти в качестве альтернативы.
У меня совсем дурацкий вариант с 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"