;Binary to decimal conversion (0..999)
;
;Input: NumH:NumL
;Output Hund:Tens:Ones
;
;If Input > 999 Output will roll over, e.g.
;for input=5678 output=678.
;
;
;Size: 34 instructions
;Execution time (max) including return:
;22+5*9-1+5*6-1+4*3-1+2 = 108 cycles
;
;5-July-2000 by Nikolai Golovchenko
bin2dec999
movf NumH, w
addlw 241
addwf NumH, w
movwf Hund ;b_2 = 2a_2 - 15
addwf Hund, w
addwf Hund, w
addlw 253
movwf Tens
swapf NumL, w
andlw 0x0F
addwf Tens, f
addwf Tens, f ;b_1 = 6a_2 + 2a_1 - 48
addwf NumH, w
sublw 251
movwf Ones
addwf Ones, f
addwf Ones, f
addwf Ones, f
movf NumL, w
andlw 0x0F
addwf Ones, f ;b_0 = a_0 - 4(a_2 + a_1) - 20
movlw 10
bin2dec999a ;9 cycles max
addwf Ones, f
decf Tens, f
skpc
goto bin2dec999a
bin2dec999b ;6 cycles max
addwf Tens, f
decf Hund, f
skpc
goto bin2dec999b
bin2dec999c ;3 cycles max
addwf Hund, f
skpc
goto bin2dec999c
return
Comments:
movlw B'00110000' ; the extra MSB part makes the table work
iorwf Hund, F
iorwf Tens, F
iorwf Ones, F
movlw 0x30
addwf Hund,f
addwf Tens,f
addwf Ones,f
return