bin16bcd5.asm 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. ;===================================================================
  2. ;"bin16BCD5"- преобразование 16-битного двоичного
  3. ;значения в упакованный BCD формат
  4. ;===================================================================
  5. ;Количество слов кода :25 + возврат
  6. ;Количество циклов :25/176 (Мин/Макс) + возврат
  7. ;Использованные младшие регистры :нет
  8. ;Использованные старшие регистры :4(fbinL,fbinH/tBCD0,tBCD1,tBCD2)
  9. ;Использованные указатели :нет
  10. ;Вход
  11. .def fbinL =r16 ;двоичное значение, младший байт
  12. .def fbinH =r17 ;двоичное значение, старший байт
  13. ;Выход
  14. .def tBCD0 =r17 ;BCD значение, цифры 1 и 0
  15. .def tBCD1 =r18 ;BCD значение, цифры 3 и 2
  16. .def tBCD2 =r19 ;BCD значение, цифра 4
  17. ;Примечание: Переменные fbinH и tBCD0 должны размещаться в одном
  18. ;регистре.
  19. bin16BCD5: ldi tBCD2,-1
  20. b16BCD5_l1: inc tBCD2
  21. subi fbinL,low(10000)
  22. sbci fbinH,high(10000)
  23. brsh b16BCD5_l1
  24. subi fbinL,low(-10000)
  25. sbci fbinH,high(-10000)
  26. ldi tBCD1,-0x11
  27. b16BCD5_l2: subi tBCD1,-0x10
  28. subi fbinL,low(1000)
  29. sbci fbinH,high(1000)
  30. brsh b16BCD5_l2
  31. subi fbinL,low(-1000)
  32. sbci fbinH,high(-1000)
  33. b16BCD5_l3: inc tBCD1
  34. subi fbinL,low(100)
  35. sbci fbinH,high(100)
  36. brsh b16BCD5_l3
  37. subi fbinL,-100
  38. ldi tBCD0,-0x10
  39. b16BCD5_l4: subi tBCD0,-0x10
  40. subi fbinL,10
  41. brsh b16BCD5_l4
  42. subi fbinL,-10
  43. add tBCD0,fbinL
  44. ret