[an error occurred while processing this directive]
Таблицы забыл, да и в тексте механический огрех исправил
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено BLACKEAGLE 24 декабря 2002 г. 01:55
В ответ на: Возвращаясь к теме урезанных sprintf отправлено BLACKEAGLE 24 декабря 2002 г. 01:37


//int=FF FF для примера
bcd0=bcd1=bcd2=0
a=high_byte
jz convert_low_byte
a=high_nibble_of_high_byte //0fh=15
jz convert_low_nibble_of_high_byte
a=a*3 //таблица из 15 элементов по 3 байта
bcd0=hitable[a+2] //15-й элемент таблицы=06h 14h 40h, т.е. bcd-представление F000h
bcd1=hitable[a+1]
bcd2=hitable[a+0] //bcd210=061440h, т.е. = F000h


convert_low_nibble_of_high_byte:
a=low_nibble_of_high_byte //0fh=15
jz convert_low_byte
a=a*2 //таблица из 15 элементов по 2 байта
bcd0=da(bcd0+lotable[a+1]) //15-й элемент таблицы=38h 40h, т.е. bcd-представление 0F00h. DA=команда decimal adjust
bcd1=da(bcd1+lotable[a+0])+carry
bcd2=bcd2+carry //bcd2:1:0=065280h, т.е. = FF00h


convert_low_byte:
a=low_byte //FFh=255
jz all_done
b=100
div ab //a=сотни=2, b=остаток=55
temp=a //temp=сотни=2


convert_low_nibble:
a=b //55(dec)
b=10
div ab //a=десятки=5, b=единицы=5
swap a
orl a,b //a=55h
bcd0=da(bcd0+a)
bcd1=da(bcd1+temp+carry)
bcd2=bcd2+carry //для bcd2 da не нужно, т.к. bcd2 всегда меньше или равно 6


all_done:
ret


hitable: db 00h,40h,96h //bcd 4096*1=4096
db 00h,81h,92h //bcd 4096*2=8192
db 01h,22h,88h //bcd 4096*3=12288
db 01h,63h,84h //bcd 4096*4=16384
db 02h,04h,80h //bcd 4096*5=20480
.
.
db 06h,14h,40h //bcd 4096*15=61440


lotable: db 02h,56h //bcd 256*1=256
db 05h,12h //bcd 256*2=512
db 07h,68h //bcd 256*3=768
db 10h,24h //bcd 256*4=1024
db 12h,80h //bcd 256*5=1280
.
.
db 38h,40h //bcd 256*15=3840


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru