;Stukje code om een 16-bits getal om te zetten naar BCD (binary coded decimal)

;Je kunt een 16-bits binair getal laden in lbin en hbin, om het vervolgens om te zetten naar BCD. Het resultaatvan het
;omzetten staat in de registers digit1 tot en met digit5.
;Hoelang een conversie duurt is afhankelijk van het getal. Ik schat dat een conversie grofweg maximaal zo'n 700 instructies
;kan duren. En er worden maximaal 2 levels van de hardware stack gebruikt, vanaf het hoofdprogramma.






;*****Variabelen instellen*****


;GPR-registers

lbin	equ	0x0??		;LSB (least signifisant bits) van 16-bits te converteren getal
hbin	equ	0x0??		;MSB van 16-bits te converteren getal
tlbin	equ	0x0??		;Tijdelijk register voor lbin
thbin	equ	0x0??		;Tijdelijk register voor hbin
digit	equ	0x0??		;Tijdelijk register voor resultaat van conversie
digit1	equ	0x0??		;eenheden na conversie
digit2	equ	0x0??		;tientallen na conversie
digit3	equ	0x0??		;honderdtallen na conversie
digit4	equ	0x0??		;duizendtallen na conversie
digit5	equ	0x0??		;tienduizendtallen na conversie
lbyte	equ	0x0??		;LSB van 16-bits te laden getal
hbyte	equ	0x0??		;MSB van 16-bits te ladengetal


;********Begin programma*******

	movlw	0x0??		;LSB van 16-bits binair getal laden
	movwf	lbin
	movlw	0x0??		;MSB van 16-bits binair getal laden
	movwf	hbin
	call	get_bcd		;Conversie code oproepen
	xxx			;Na conversie gaat hij hier verder, met resultaat in registers digit1 t/m digit5


;*********Subroutines**********


;---------------------

get_bcd:			;Converteert 16-bits getal naar BCD-getal.

	movlw	0x010		;0x2710 = d'10000'
	movwf	lbyte
	movlw	0x027
	movwf	hbyte
	call	get_digit
	movf	digit,w
	movwf	digit5

	movlw	0x0E8		;0x03E8 = d'1000'
	movwf	lbyte
	movlw	0x003
	movwf	hbyte
	call	get_digit
	movf	digit,w
	movwf	digit4

	movlw	0x064		;0x0064 = d'100'
	movwf	lbyte
	movlw	0x000
	movwf	hbyte
	call	get_digit
	movf	digit,w
	movwf	digit3

	movlw	0x00A		;0x000A = d'10'
	movwf	lbyte
	movlw	0x000
	movwf	hbyte
	call	get_digit
	movf	digit,w
	movwf	digit2

	movf	lbin,w		;Wat overblijft zijn eenheden. Deze hoeven niet meer uitgerekend te worden en kan zo in digit1 worden geladen.
	movwf	digit1
	return


get_digit:			;Rekent uit hoevaak ingestelde 16-bit getal, van get_bcd, in het 16-bit nack-getal past en plaatst dit in register "digit".

	clrf	digit
	movf	hbin,w
	movwf	thbin
	movf	lbin,w
	movwf	tlbin

	movf	lbyte,w
	subwf	tlbin,f
	btfsc	status,c	;Kijken of tlbin negatief is. Zo ja, thbin - 1 -> thbin
	goto	$+d'5'
	movlw	0x001
	subwf	thbin,f
	btfss	status,c
	return			;Als thbin negatief is, naar volgende digit gaan. Anders verder kijken welke waarde deze digit heeft.

	movf	hbyte,w
	subwf	thbin,f
	btfss	status,c
	return

	incf	digit,f
	movf	tlbin,w
	movwf	lbin
	movf	thbin,w
	movwf	hbin
	goto	$-d'17'


;---------------------