From: Scott Dattalo, notes
Translated and optimized for the Scenix SX by Nikolai Golovchenko
;********************************
;binary_to_bcd - 8-bits
;
;Input
; bin - 8-bit binary number
; A1*16+A0
;Outputs
; hundreds - the hundreds digit of the BCD conversion
; tens_and_ones - the tens and ones digits of the BCD conversion
binary_to_bcd:
clr hundreds
mov W, <>bin ;w = A0*16+A1
add W, bin ;w = A0+A1
and W, #00001111b ;w = A0+A1 % 16
mov tens_and_ones, W ;tens_and_ones = A0+A1 % 16
mov W, #$16
snb DC ;if A0+A1 > 16
add tens_and_ones, W ; tens_and_ones += 16
mov W, #$06
snb DC ;if tens_and_ones % 16 > 10
add tens_and_ones, W ; tens_and_ones += 6
add tens_and_ones, W ;tens_and_ones += 6
sb DC ;if tens_and_ones < 10
sub tens_and_ones, W ; tens_and_ones -= 6
mov W, #$16 - 1 + $6
snb bin.4
add tens_and_ones, W
mov W, #-$06
sb DC
add tens_and_ones, W
mov W, #$30
snb bin.5
add tens_and_ones, W
mov W, #$20
snb bin.7
add tens_and_ones, W
mov W, #$60
snb bin.6
add tens_and_ones, W
add tens_and_ones, W
rl hundreds
sb hundreds.0
sub tens_and_ones, W
snb bin.7
inc hundreds