;------------------------------------------------------------------------------
;
;	Подпрограмма BIN/BCD-преобразования числа, 32 бита. (569 циклов.)
;
;	DiGital Laboratory, 2005.
;	
;------------------------------------------------------------------------------
;	23h...20h - преобразуемое двоичное число.
;	28h...24h - рабочий буфер, хранит десятичные значения
;		    коэффициентов преобразования бит.
;	2Dh...29h - накопительный буфер,содержит упакованный BCD код.
;
$MOD51
$NOPAGING
binary_0_7	DATA	20h		; биты 0...7
binary_8_15	DATA	21h		; биты 8...15
binary_16_23	DATA	22h		; биты 16...23
binary_24_31	DATA	23h		; биты 24...32
worker_buff	DATA	30h		; начало рабочего буфера, 5-байт.
bcd_out_buff	DATA	35h		; начало накопительного буфера, 5-байт.
;
bin32_bcd:
	push	PSW			; сохраняем используемые
	push	ACC			; регистры.
	mov	bcd_out_buff,#00h	; обнулить буфер индикации.
	mov	bcd_out_buff+1,#00h
	mov	bcd_out_buff+2,#00h
	mov	bcd_out_buff+3,#00h
	mov	bcd_out_buff+4,#00h
	;
	jnb	binary_0_7.0,bits_1	; проверка бита 0.
	mov	worker_buff,#01h	; загрузить коэффициент для бита 0.
					; "00.000.001"
	call	bcd_add_buff
bits_1:
	jnb	binary_0_7.1,bits_2	; проверка бита 1.
	mov	worker_buff,#02h	; загрузить коэффициент для бита 1.
					; "00.000.002"
	call	bcd_add_buff
bits_2:
	jnb	binary_0_7.2,bits_3	; проверка бита 2.
	mov	worker_buff,#04h	; загрузить коэффициент для бита 2.
					; "00.000.004"
	call	bcd_add_buff
bits_3:
	jnb	binary_0_7.3,bits_4	; проверка бита 3.
	mov	worker_buff,#08h	; загрузить коэффициент для бита 3.
					; "00.000.008"
	call	bcd_add_buff
bits_4:
	jnb	binary_0_7.4,bits_5	; проверка бита 4.
	mov	worker_buff,#16h	; загрузить коэффициент для бита 4.
					; "00.000.016"
	call	bcd_add_buff
bits_5:
	jnb	binary_0_7.5,bits_6	; проверка бита 5.
	mov	worker_buff,#32h	; загрузить коэффициент для бита 5.
					; "00.000.032"
	call	bcd_add_buff
bits_6:
	jnb	binary_0_7.6,bits_7	; проверка бита 6.
	mov	worker_buff,#64h	; загрузить коэффициент для бита 6.
					; "00.000.064"
	call	bcd_add_buff
bits_7:
	jnb	binary_0_7.7,bits_8	; проверка бита 7.
	mov	worker_buff,#28h	; загрузить коэффициент для бита 7.
	mov	worker_buff+1,#01h	; "00.000.128"
	call	bcd_add_buff
bits_8:
	jnb	binary_8_15.0,bits_9	; проверка бита 8.
	mov	worker_buff,#56h	; загрузить коэффициент для бита 8.
	mov	worker_buff+1,#02h	; "00.000.256"
	call	bcd_add_buff
bits_9:
	jnb	binary_8_15.1,bits_10	; проверка бита 9.
	mov	worker_buff,#12h	; загрузить коэффициент для бита 9.
	mov	worker_buff+1,#05h	; "00.000.512"
	call	bcd_add_buff
bits_10:
	jnb	binary_8_15.2,bits_11	; проверка бита 10.
	mov	worker_buff,#24h	; загрузить коэффициент для бита 10.
	mov	worker_buff+1,#10h	; "00.001.024"
	call	bcd_add_buff
bits_11:
	jnb	binary_8_15.3,bits_12	; проверка бита 11.
	mov	worker_buff,#48h	; загрузить коэффициент для бита 11.
	mov	worker_buff+1,#20h	; "00.002.048"
	call	bcd_add_buff
bits_12:
	jnb	binary_8_15.4,bits_13	; проверка бита 12.
	mov	worker_buff,#96h	; загрузить коэффициент для бита 12.
	mov	worker_buff+1,#40h	; "00.004.096"
	call	bcd_add_buff
bits_13:
	jnb	binary_8_15.5,bits_14	; проверка бита 13.
	mov	worker_buff,#92h	; загрузить коэффициент для бита 13.
	mov	worker_buff+1,#81h	; "00.008.192"
	call	bcd_add_buff
bits_14:
	jnb	binary_8_15.6,bits_15	; проверка бита 14.
	mov	worker_buff,#84h	; загрузить коэффициент для бита 14.
	mov	worker_buff+1,#63h	; "00.016.384"
	mov	worker_buff+2,#01h
	call	bcd_add_buff
bits_15:
	jnb	binary_8_15.7,bits_16	; проверка бита 15.
	mov	worker_buff,#68h	; загрузить коэффициент для бита 15.
	mov	worker_buff+1,#27h	; "00.032.768"
	mov	worker_buff+2,#03h
	call	bcd_add_buff
bits_16:
	jnb	binary_16_23.0,bits_17	; проверка бита 16.
	mov	worker_buff,#36h	; загрузить коэффициент для бита 16.
	mov	worker_buff+1,#55h	; "00.065.536"
	mov	worker_buff+2,#06h
	call	bcd_add_buff
bits_17:
	jnb	binary_16_23.1,bits_18	; проверка бита 17.
	mov	worker_buff,#72h	; загрузить коэффициент для бита 17.
	mov	worker_buff+1,#10h	; "00.131.072"
	mov	worker_buff+2,#13h
	call	bcd_add_buff
bits_18:
	jnb	binary_16_23.2,bits_19	; проверка бита 18.
	mov	worker_buff,#44h	; загрузить коэффициент для бита 18.
	mov	worker_buff+1,#21h	; "00.262.144"
	mov	worker_buff+2,#26h
	call	bcd_add_buff
bits_19:
	jnb	binary_16_23.3,bits_20	; проверка бита 19.
	mov	worker_buff,#88h	; загрузить коэффициент для бита 19.
	mov	worker_buff+1,#42h	; "00.524.288"
	mov	worker_buff+2,#52h
	call	bcd_add_buff
bits_20:
	jnb	binary_16_23.4,bits_21	; проверка бита 20.
	mov	worker_buff,#76h	; загрузить коэффициент для бита 20.
	mov	worker_buff+1,#85h	; "01.048.576"
	mov	worker_buff+2,#04h
	mov	worker_buff+3,#01h
	call	bcd_add_buff
bits_21:
	jnb	binary_16_23.5,bits_22	; проверка бита 21.
	mov	worker_buff,#52h	; загрузить коэффициент для бита 21.
	mov	worker_buff+1,#71h	; "02.097.152"
	mov	worker_buff+2,#09h
	mov	worker_buff+3,#02h
	call	bcd_add_buff
bits_22:
	jnb	binary_16_23.6,bits_23	; проверка бита 22.
	mov	worker_buff,#04h	; загрузить коэффициент для бита 22.
	mov	worker_buff+1,#43h	; "04.194.304"
	mov	worker_buff+2,#19h
	mov	worker_buff+3,#04h
	call	bcd_add_buff
bits_23:
	jnb	binary_16_23.7,bits_24	; проверка бита 23.
	mov	worker_buff,#08h	; загрузить коэффициент для бита 23.
	mov	worker_buff+1,#86h	; "08.388.608"
	mov	worker_buff+2,#38h
	mov	worker_buff+3,#08h
	call	bcd_add_buff
bits_24:
	jnb	binary_24_31.0,bits_25	; проверка бита 24.
	mov	worker_buff,#16h	; загрузить коэффициент для бита 24.
	mov	worker_buff+1,#72h	; "16.777.216"
	mov	worker_buff+2,#77h
	mov	worker_buff+3,#16h
	call	bcd_add_buff
bits_25:
	jnb	binary_24_31.1,bits_26	; проверка бита 25.
	mov	worker_buff,#32h	; загрузить коэффициент для бита 25.
	mov	worker_buff+1,#44h	; "33.554.432"
	mov	worker_buff+2,#55h
	mov	worker_buff+3,#33h
	call	bcd_add_buff
bits_26:
	jnb	binary_24_31.2,bits_27	; проверка бита 26.
	mov	worker_buff,#64h	; загрузить коэффициент для бита 26.
	mov	worker_buff+1,#88h	; "67.108.864"
	mov	worker_buff+2,#10h
	mov	worker_buff+3,#67h
	call	bcd_add_buff
bits_27:
	jnb	binary_24_31.3,bits_28	; проверка бита 27.
	mov	worker_buff,#01h	; загрузить коэффициент для бита 27.
	mov	worker_buff+1,#34h	; "134.217.728"
	mov	worker_buff+2,#21h
	mov	worker_buff+3,#77h
	mov	worker_buff+4,#28h
	call	bcd_add_buff
bits_28:
	jnb	binary_24_31.4,bits_29	; проверка бита 28.
	mov	worker_buff,#02h	; загрузить коэффициент для бита 28.
	mov	worker_buff+1,#68h	; "268.435.456"
	mov	worker_buff+2,#43h
	mov	worker_buff+3,#54h
	mov	worker_buff+4,#56h
	call	bcd_add_buff
bits_29:
	jnb	binary_24_31.5,bits_30	; проверка бита 29.
	mov	worker_buff,#05h	; загрузить коэффициент для бита 29.
	mov	worker_buff+1,#36h	; "536.870.912"
	mov	worker_buff+2,#87h
	mov	worker_buff+3,#09h
	mov	worker_buff+4,#12h
	call	bcd_add_buff
bits_30:
	jnb	binary_24_31.6,bits_31	; проверка бита 30.
	mov	worker_buff,#10h	; загрузить коэффициент для бита 30.
	mov	worker_buff+1,#73h	; "1.073.741.824"
	mov	worker_buff+2,#74h
	mov	worker_buff+3,#18h
	mov	worker_buff+4,#24h
	call	bcd_add_buff
bits_31:
	jnb	binary_24_31.7,bits_off	; проверка бита 31.
	mov	worker_buff,#21h	; загрузить коэффициент для бита 31.
	mov	worker_buff+1,#47h	; "2.147.483.648"
	mov	worker_buff+2,#48h
	mov	worker_buff+3,#36h
	mov	worker_buff+4,#48h
	call	bcd_add_buff
bits_off:
	pop	ACC			; восстанавливаем используемые
	pop	PSW			; регистры.
	ret
;------------------------------------------------------------------------------
;	подпрограмма BCD-сложения двух буферов, рабочего и накопительного.
;------------------------------------------------------------------------------
;	производит сложение двух упакованных BCD чисел в рабочем и
;	накопительном буфере.
;	результат возвращает в накопительном буфере.
bcd_add_buff:
	mov	A,worker_buff		; BCD сложение с десятичной коррекцией
	add	A,bcd_out_buff		; 1 и 2 цифры.
	da	A
	mov	bcd_out_buff,A
	mov	A,worker_buff+1		; 3 и 4 цифры.
	addc	A,bcd_out_buff+1
	da	A
	mov	bcd_out_buff+1,A
	mov	A,worker_buff+2		; 5 и 6 цифры.
	addc	A,bcd_out_buff+2
	da	A
	mov	bcd_out_buff+2,A
	mov	A,worker_buff+3		; 7 и 8 цифры.
	addc	A,bcd_out_buff+3
	da	A
	mov	bcd_out_buff+3,A
	mov	A,worker_buff+4		; 9 и 10 цифры.
	addc	A,bcd_out_buff+4
	da	A
	mov	bcd_out_buff+4,A
	;
	mov	worker_buff,#00h	; обнулить рабочий буфер.
	mov	worker_buff+1,#00h
	mov	worker_buff+2,#00h
	mov	worker_buff+3,#00h
	mov	worker_buff+4,#00h
	ret
;
	END