	list      p=16f628           
	#include <p16f628.inc>        
	
	__CONFIG _CP_OFF & _WDT_ON & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _MCLRE_ON & _LVP_OFF

#define	IDAT	PORTB,0 	; óïðàâëåíèå ñèãíàëîì DI
#define	ICLC	PORTB,1 	; óïðàâëåíèå ñèãíàëîì SK

#DEFINE	VHOD	PORTB,2		;ÂÕÎÄ ÎÒ ÐÀÑÏÐÅÄÅËÈÒÅËß
#DEFINE	BANK0	BCF	STATUS,RP0	;ÂÊËÞ×ÅÍÈÅ ÁÀÍÊÀ 0
#DEFINE	BANK1	BSF	STATUS,RP0	;ÂÊËÞ×ÅÍÈÅ ÁÀÍÊÀ 1
CARRY  	equ 	0X00     	
	CBLOCK	0X20
	CNT1			;ÌËÀÄØÀß ß×ÅÉÊÀ Ñ×ÅÒ×ÈÊÀ ÄËÈÍÛ ÈÌÏÓËÜÑÀ
	CNT2			;ÑÒÀÐØÀß ß×ÅÉÊÀ Ñ×ÅÒ×ÈÊÀ ÄËÈÍÛ ÈÌÏÓËÜÑÀ
	CNTZ1			;ÌËÀÄØÀß È ÑÒÀÐØÀß ß×ÅÉÊÈ Ñ×ÅÒ×ÈÊÀ ÂÐÅÌÅÍÈ
	CNTZ2			;ÇÀÄÅÐÆÊÈ ÏÅÐÅÄ ÇÀÌÅÐÎÌ ÄËÈÍÛ ÈÌÏÓËÜÑÀ
	ACCaLO 			;ÏÅÐÅÌÅÍÍÛÅ ÈÑÏÎËÜÇÓÅÌÛÅ ÏÎÄÏÐÎÃÐÀÌÌÎÉ ÑËÎÆÅÍÈß
	ACCaHI 	 
	ACCaHH 	 
	ACCbLO 	 
	ACCbHI 	 
	ACCbHH 	 
	ACCcLO			;ÏÅÐÅÌÅÍÍÛÅ ÈÑÏÎËÜÇÓÅÌÛÅ ÏÎÄÏÐÎÃÐÀÌÌÎÉ ÄÅËÅÍÈß
	ACCcHI  	
	ACCdLO  	
	ACCdHI  
	ACCdHH
	temp    
	sign    	
	count  	
	H_byte  	
	L_byte  
	R0      	        ; ÏÅÐÅÌÅÍÍÛÅ ÈÑÏÎËÜÇÓÅÌÛÅ ÏÎÄÏÐÎÃÐÀÌÌÎÉ 
	R1      		;ÏÐÅÎÁÐÀÇÎÂÀÍÈß Â ÄÂÎÈ×ÍÎÄÅÑßÒÈ×ÍÛÉ ÂÈÄ
	R2      	
	RBYTE		
	HSD			;ÏÅÐÅÌÅÍÍÛÅ ÈÑÏÎËÜÇÓÅÌÛÅ ÏÎÄÏÐÎÃÐÀÌÌÎÉ ÇÀÄÅÐÆÊÈ
	SD			
	LSD			
	Flags	
	ENDC
	ORG	0X00		;ÂÅÊÒÎÐ ÑÁÐÎÑÀ
	GOTO	START
	ORG	0X04		;ÂÅÊÒÎÐ ÏÐÅÐÛÂÀÍÈß
	GOTO	INTER
INTER	RETURN			;ÏÎÄÏÐÎÃÐÀÌÌÀ ÎÁÐÀÁÎÒÊÈ ÏÐÅÐÛÂÀÍÈß
				; (ÏÐÅÐÛÂÀÍÈß ÍÅ ÈÑÏÎËÜÇÓÞÒÑß)
;ÏÅÐÂÎÍÀ×ÀËÜÍÀß ÍÀÑÒÐÎÉÊÀ
START	CLRF	PORTB		;ÎÁÍÓËÈÒÜ ÏÎÐÒ B
	BANK1
	MOVLW	B'00000100'	;RB2 - ÂÕÎÄ , ÎÑÒÀËÜÍÛÅ ÂÛÕÎÄ
	MOVWF	TRISB
	BANK0
	CLRF	TMR0		;Î×ÈÑÒÊÀ ÏÐÅÄÄÅËÈÒÅËß È TMR0
	BANK1
	CLRWDT			;Î×ÈÑÒÊÀ ÏÐÅÄÄÅËÈÒÅËß È WDT
	MOVLW	B'11111110'	;ÊÎÝÔ. ÄÅËÅÍÈß 1:64
	MOVWF	OPTION_REG	;ÏÐÅÄÄÅËÈÒÅËÜ ÏÎÄÊËÞ×ÅÍ Ê WDT
	BANK0
	CALL	OCHIST		;ÎÁÐÀÙÅÍÈÅ Ê ÏÎÄÏÐÎÃÐÀÌÌÅ Î×ÈÑÒÊÈ ÄÈÑÏËÅß
NACH	CLRWDT			;Î×ÈÑÒÊÀ ÏÐÅÄÄÅËÈÒÅËß È WDT
	CALL	FRSCR		;ÂÛÂÎÄ ÍÀ ÄÈÑÏËÅÉ
	CALL	CMETER		;ÇÀÌÅÐ ÏÅÐÈÎÄÀ ÈÏÓËÜÑÀ
;ÒÅËÎ ÏÐÎÃÐÀÌÌÛ ÏÐÅÎÁÐÀÇÎÂÀÍÈß È ÂÛÂÎÄÀ ÍÀ ÈÍÄÈÊÀÒÎÐ
	MOVF	CNT2,W
	movwf   ACCaHI
	MOVF	CNT1,W		; ÇÀÃÐÓÇÊÀ: ACCa = CNT
	movwf   ACCaLO
;DIV=4476276/CNT
	movlw   0X44
	movwf   ACCbHH
	movlw   0X4D
	movwf   ACCbHI
	movlw   0X74           	; ÇÀÃÐÓÇÊÀ: ACCb=4476276
	movwf   ACCbLO
	CALL 	DIVIS
;BCD
 	MOVF	ACCbHI,W
	movwf   H_byte
	MOVF	ACCbLO,W
	movwf   L_byte         
	call    B2_BCD         
	MOVF	CNTZ1,W		;CNTZ--->ACCa
	MOVWF	ACCaLO
	MOVF	CNTZ2,W
	MOVWF	ACCaHI
	MOVF	CNT1,W		;CNT--->ACCb
	MOVWF	ACCbLO
	MOVF	CNT2,W
	MOVWF	ACCbHI
	CALL	ADDIT		;ÑËÎÆÅÍÈÅ - ÐÅÇÓËÜÒÀÒ Â ACCa
	CLRF	ACCbHI		;0006H ---> ACCb
	MOVLW	0X06
	MOVWF	ACCbLO
	CALL	DBL_MPYS	;ÓÌÍÎÆÅÍÈÅ - ÐÅÇÓËÜÒÀÒ Â ACCb,ACCc (32áèòà)
	MOVF	ACCcLO,W	;ÐÅÇÓËÜÒÀÒ ÓÌÍÎÆÅÍÈß --->ACCa
	MOVWF	ACCaLO
	MOVF	ACCcHI,W
	MOVWF	ACCaHI
	MOVF	ACCbLO,W
	MOVWF	ACCaHH
	MOVLW	0X0C		;ÏÐÈ 0C4B03 Â ACCB - ÎÁÍÎÂËÅÍÈÅ ÈÍÄÈÊÀÒÎÐÀ ÊÀÆÄÛÅ 0,9 ÑÅÊ
	MOVWF	ACCbHH
	MOVLW	0X4B
	MOVWF	ACCbHI
	MOVLW	0X03
	MOVWF	ACCbLO
	CALL	D_SUB		;ÐÅÇÓËÜÒÀÒ Â ACCb
	MOVLW	D'016'
	MOVWF	ACCaLO
	CLRF	ACCaHI
				;ÄÅËÅÍÈÅ ÏÐÅÄÛÄÓÙÅÃÎ ÐÅÇÓËÜÒÀÒÀ
	CALL	DIVIS		;ÍÀ 16 , ÐÅÇÓËÜÒÀÒ Â ACCb
	MOVF	ACCbLO,W	;ÏÐÅÄÛÄÓÙÈÉ ÐÅÇÓËÜÒÀÒ --->HSD ,LSD
	MOVWF	LSD
	MOVF	ACCbHI,W
	MOVWF	HSD
	CALL	DELAY
	GOTO 	NACH
CMETER	CLRF	CNT1 		;ÎÁÍÓËÅÍÈÅ Ñ×ÅÒ×ÈÊÎÂ
	CLRF	CNT2 	
	CLRF	CNTZ1 	
	CLRF	CNTZ2 	
	BTFSS 	VHOD
	GOTO	SIG0		;ÂÕ=0
	NOP
SIG1	INCFSZ	CNTZ1,F		;ÓÂÅËÈ×ÅÍÈÅ ÌËÀÄØÅÃÎ ÐÀÇÐßÄÀ Ñ×ÅÒ×ÈÊÀ ÍÀ 1 È
	GOTO	LOOP7		;ÏÐÎÂÅÐÊÀ ÅÃÎ ÍÀ ÏÅÐÅÏÎËÍÅÍÈÅ
	INCF	CNTZ2,F		;ÓÂÅËÈ×ÅÍÈÅ ÑÒÀÐØÅÃÎ ÐÀÇÐßÄÀ
LOOP7	BTFSC	VHOD		;ÏÎÈÑÊ ÎÒÐ. ÔÐÎÍÒÀ
	GOTO	SIG1		;ÍÅÒ
	NOP
LOOP3	INCFSZ	CNT1,F		;ÓÂÅËÈ×ÅÍÈÅ ÌËÀÄØÅÃÎ ÐÀÇÐßÄÀ Ñ×ÅÒ×ÈÊÀ ÍÀ 1 È
	GOTO	LOOP8		;ÏÐÎÂÅÐÊÀ ÅÃÎ ÍÀ ÏÅÐÅÏÎËÍÅÍÈÅ
	INCF	CNT2,F		;ÓÂÅËÈ×ÅÍÈÅ ÑÒÀÐØÅÃÎ ÐÀÇÐßÄÀ
LOOP8	BTFSS	VHOD		;Ñ×ÈÒÀÒÜ ÏÎÊÀ ÎÒÐ. ÑÈÃÍÀË
	GOTO	LOOP3
	NOP	
LOOP4	INCFSZ	CNT1,F		;ÓÂÅËÈ×ÅÍÈÅ ÌËÀÄØÅÃÎ ÐÀÇÐßÄÀ Ñ×ÅÒ×ÈÊÀ ÍÀ 1 È
	GOTO	LOOP9		;ÏÐÎÂÅÐÊÀ ÅÃÎ ÍÀ ÏÅÐÅÏÎËÍÅÍÈÅ
	INCF	CNT2,F		;ÓÂÅËÈ×ÅÍÈÅ ÑÒÀÐØÅÃÎ ÐÀÇÐßÄÀ
LOOP9	BTFSC	VHOD		;Ñ×ÈÒÀÒÜ ÏÎÊÀ ÏÎËÎÆ. ÑÈÃÍÀË
	GOTO	LOOP4	
	RETURN
SIG0	INCFSZ	CNTZ1,F		;ÓÂÅËÈ×ÅÍÈÅ ÌËÀÄØÅÃÎ ÐÀÇÐßÄÀ Ñ×ÅÒ×ÈÊÀ ÍÀ 1 È
	GOTO	LOOP1		;ÏÐÎÂÅÐÊÀ ÅÃÎ ÍÀ ÏÅÐÅÏÎËÍÅÍÈÅ
	INCF	CNTZ2,F		;ÓÂÅËÈ×ÅÍÈÅ ÑÒÀÐØÅÃÎ ÐÀÇÐßÄÀ
LOOP1	BTFSS	VHOD		;ÏÎÈÑÊ ÏÎËÎÆ. ÔÐÎÍÒÀ
	GOTO	SIG0		;ÍÅÒ
	NOP
LOOP2	INCFSZ	CNT1,F		;ÓÂÅËÈ×ÅÍÈÅ ÌËÀÄØÅÃÎ ÐÀÇÐßÄÀ Ñ×ÅÒ×ÈÊÀ ÍÀ 1 È
	GOTO	LOOP5		;ÏÐÎÂÅÐÊÀ ÅÃÎ ÍÀ ÏÅÐÅÏÎËÍÅÍÈÅ
	INCF	CNT2,F		;ÓÂÅËÈ×ÅÍÈÅ ÑÒÀÐØÅÃÎ ÐÀÇÐßÄÀ
LOOP5	BTFSC	VHOD		;Ñ×ÈÒÀÒÜ ÏÎÊÀ ÏÎËÎÆ. ÑÈÃÍÀË
	GOTO	LOOP2
	NOP	
LOOP6	INCFSZ	CNT1,F		;ÓÂÅËÈ×ÅÍÈÅ ÌËÀÄØÅÃÎ ÐÀÇÐßÄÀ Ñ×ÅÒ×ÈÊÀ ÍÀ 1 È
	GOTO	LOOP10		;ÏÐÎÂÅÐÊÀ ÅÃÎ ÍÀ ÏÅÐÅÏÎËÍÅÍÈÅ
	INCF	CNT2,F		;ÓÂÅËÈ×ÅÍÈÅ ÑÒÀÐØÅÃÎ ÐÀÇÐßÄÀ
LOOP10	BTFSS	VHOD		;Ñ×ÈÒÀÒÜ ÏÎÊÀ ÎÒÐ. ÑÈÃÍÀË
	GOTO	LOOP6	
	RETURN
FRSCR	MOVLW	0XAA
	CALL	INDC
	MOVLW	0XAA
	CALL	INDC
	MOVLW	0XAA
	CALL	INDC
	MOVF	R1,W
	CALL	INDC	
	SWAPF	R1,W
	CALL	INDC
	MOVF	R2,W
	CALL	INDC	
	SWAPF	R2,W
	CALL	INDC
	MOVLW	0XAA
	CALL	INDC
	MOVLW	0XAA
	CALL	INDC
	MOVLW	0XAA
	CALL	INDC
	RETURN
INDC	bsf 	ICLC		; CLK â íåàêòèâíîå ñîñòîÿíèå
	andlw	0xF0
	movwf 	temp		; ñîõðàíèì ïîêà...
	SWAPF	temp,F
	movlw 	0Ah
	xorwf 	temp,w		; temp=10 (ò.å. "ÏÓÑÒÎ")
	btfsc 	STATUS,Z	; W íå ðàâíî 10
	goto 	mwyw		; â W òåïåðü 0, ò.å. BLANK (ïóñòî)
	movf 	temp,w		; âîññòàíîâèëè W
	andlw 	0fh		; define Z (=0 ?)
	btfsc 	STATUS,Z
	movlw 	.10		; (1010) - ýòî îòîáðàæàåòñÿ êàê 0
mwyw	movwf 	temp		; åñëè çàìåíèëè 0 íà 10 òî ñìåíèì è temp 
	rlf 	temp,f		; òðåáóåìûé áèò (ñòàðøèé ïåðâûì) â ðàçðÿä 4 (---Â:----)
	call 	bitlcd		; âûâîä áèòà èç ðàçðÿäà 4 temp íà DI (bit3)
	rlf 	temp,f		; ñäâèã äëÿ ñëåäóþùåãî áèòà (2)
	call 	bitlcd	
	rlf 	temp,f		; next - bit1 
	call 	bitlcd
	rlf 	temp,f		; last - bit0
	call 	bitlcd
	call 	mks4		; ïàóçà ìåæäó ñèìâîëàìè íå ìåíåå 5 ìêñ
	goto 	mks4		; ...è âûõîä
bitlcd	bsf	ICLC		; íåàêòèâíîå ñîñòîÿíèå ICLC
	btfss 	temp,4		; ÂÛÎÄ ÈÇ 4 ÁÈÒÀ TEMP
	goto 	lowbit
	bsf	IDAT
	goto 	outclk
lowbit	bcf	IDAT
outclk	call 	mks4		; ïàóçà íå ìåíåå 2 ìêñ äëÿ óñòàíîâëåíèÿ äàííûõ
	bcf 	ICLC		; ñòðîáèðîâàíèå äàííûõ
	call 	mks4		; äëèíà ñòðîáà íå ìåíåå 2 ìêñ (Êâàðö=4MHz)
; clk õîòü â 0 õîòü â 1 îñòàâëÿé, íî áåç ïîâòîðÿþùåãîñÿ
; âûâîäà íà äèñïëåé - îí, ÷åðåç íåñêîëüêî ñåêóíä ïåðåõîäèò â ðåæèì
; âíóòðåííåãî òàéìåðà (???)
	goto mks4
; CLK îñòàåòñÿ â 0 (âñòðîåííûé â LCD òàéìåð êàê áû íå âêëþ÷åí)
;
; 		Çàäåðæêà íåìíîãî áîëüøå íîðìû 
;		Îêàçàëîñü âàæíî!
;		Ïðè 1 "nop" - áûëè ñáîè èíäèêàòîðà
mks4	nop
	nop
	return
OCHIST	MOVLW	0X00	;ÏÎÄÏÐÎÃÐÀÌÌÀ Î×ÈÑÒÊÈ ÄÈÑÏËÅß 
	MOVWF	R1	;ÂÛÂÎÄÈÒ :
	MOVWF	R2	;                         _ _ _ 0 0 0 0 _ _ _ 
	RETURN
;ÏÎÄÏÐÎÃÐÀÌÌÀ ÑËÎÆÅÍÈß ÄÂÓÕ ÁÀÉÒÎÂÛÕ ×ÈÑÅË :
;   ÑËÎÆÅÍÈÅ :  ACCb(16 bits) + ACCa(16 bits) -> ACCa(16 bits)
;   ÈÑÏÎËÍÅÍÈÅ :
;               Program Memory  :       07
;               Clock Cycles    :       08
ADDIT	movf    ACCbLO,w
	addwf   ACCaLO,F         ;add lsb
	btfsc   STATUS,CARRY 	 ;add in carry
	incf    ACCaHI,F
	movf    ACCbHI,w
	addwf   ACCaHI,F         ;add msb
	retlw   0
;ÏÎÄÏÐÎÃÐÀÌÌÀ ÄÅËÅÍÈß
;*******************************************************************;
;   ÄÅËÅÍÈÅ : ACCb(24 bits) / ACCa(16 bits) -> ACCb(24 bits) with
;                                               ÎÑÒÀÒÎÊ Â ACCc (16 bits)
;      (a) ÇÀÍÅÑÒÈ ÄÅËÈÒÅËÜ Â ACCaHI & ACCaLO ( 24 bits )
;      (b) ÇÀÍÅÑÒÈ ÄÅËÈÌÎÅ Â ACCbHH& ACCbHI & ACCbLO ( 16 bits )
;      (c) CALL D_div
;      (d) 24 ÁÈÒÍÛÉ ÐÅÇÓËÜÒÀÒ Â ACCbHH&ACCbHI & ACCbLO
;      (e) 16 ÁÈÒÍÛÉ ÎÑÒÀÒÎÊ  ACCcHI & ACCcLO
;   ÈÑÏÎËÍÅÍÈÅ :      
;               Clock Cycles    :  540     
;*******************************************************************;
DIVIS	call    setup
	clrf    ACCcHI
	clrf    ACCcLO
dloop   bcf     STATUS,C
	rlf    	ACCdLO, F
	rlf     ACCdHI, F
	rlf    	ACCdHH, F
	rlf    	ACCcLO, F
	rlf     ACCcHI, F
	movf    ACCaHI,W
	subwf   ACCcHI,W        ;ÏÐÎÂÅÐÊÀ a>c
	btfss   STATUS,Z
	goto    nochk
	movf    ACCaLO,W
	subwf   ACCcLO,W        ;if msb equal then check lsb
nochk   btfss   STATUS,C    	;carry set if c>a
	goto    nogo
	movf    ACCaLO,W        ;c-a into c
	subwf   ACCcLO, F
	btfss   STATUS,C
	decf    ACCcHI, F
	movf    ACCaHI,W
	subwf   ACCcHI, F
	bsf     STATUS,C    	;shift a 1 into b (result)
nogo    rlf     ACCbLO, F
	rlf     ACCbHI, F
	rlf     ACCbHH, F
	decfsz  temp, F         ;loop untill all bits checked
	goto    dloop
	retlw   0
setup   movlw   .24             ;for 24 shifts
	movwf   temp
	movf    ACCbHI,W        ;ACCb --> ACCd
	movwf   ACCdHI
	movf    ACCbLO,W
	movwf   ACCdLO
	movf    ACCbHH,W          	
	movwf   ACCdHH
	clrf    ACCbHH
	clrf    ACCbHI
	clrf    ACCbLO
	retlw   0
;ÏÎÄÏÐÎÃÐÀÌÌÀ ÏÐÅÎÁÐÀÇÎÂÀÍÈß Â ÄÂÎÈ×ÍÎÄÅÑßÒÈ×ÍÛÉ ÂÈÄ
;ÏÐÅÎÁÐÀÇÎÂÀÍÈÅ 16 ÁÈÒÍÎÃÎ ×ÈÑËÀ Â ÄÅÑßÒÈ×ÍÎÅ ÓÏÀÊÎÂÀÍÍÎÅ ×ÈÑËÎ Â 5 ÐÀÇÐßÄÎÂ
;   ÈÑÏÎËÍÅÍÈÅ :
;               Program Memory  :       35
;               Clock Cycles    :       885
B2_BCD  bcf     STATUS,0                
	movlw   .16
	movwf   count
	clrf    R0
	clrf    R1
	clrf    R2
loop16  rlf     L_byte,F
	rlf     H_byte,F
	rlf     R2,F
	rlf     R1,F
	rlf     R0,F
	decfsz  count,F
	goto    adjDEC
	RETLW   0
adjDEC  movlw   R2
	movwf   FSR
	call    adjBCD
	movlw   R1
	movwf   FSR
	call    adjBCD
	movlw   R0
	movwf   FSR
	call    adjBCD
	goto    loop16
adjBCD  movlw   3
	addwf   0,W
	movwf   temp
	btfsc   temp,3          ; test if result > 7
	movwf   0
	movlw   30
	addwf   0,W
	movwf   temp
	btfsc   temp,7         	; test if result > 7
	movwf   0               ; save as MSD
	RETLW   0
DELAY	NOP
DELAY1	NOP
	NOP
	NOP
	NOP
	MOVLW	0X00
	SUBWF	LSD,W
	BTFSC	STATUS,Z
	GOTO	DELAY2
	NOP
	NOP
	NOP
	NOP
	NOP
	DECF	LSD,F
	GOTO	DELAY1
DELAY2	MOVLW	D'255'
	MOVWF	SD
DELAY4	NOP
       	DECFSZ	SD,F
	GOTO 	DELAY4
	MOVLW	D'255'
	MOVWF	SD
DELAY5	NOP
        DECFSZ	SD,F
	GOTO 	DELAY5
	MOVLW	D'255'
	MOVWF	SD
DELAY6	NOP
        DECFSZ	SD,F
	GOTO 	DELAY6
	NOP
	NOP
	NOP
	NOP
	NOP
	MOVLW	D'255'
	MOVWF	SD
DELAY7	NOP
        DECFSZ	SD,F
	GOTO 	DELAY7
	MOVLW	0X00
	SUBWF	HSD,W
	BTFSC	STATUS,Z
	GOTO	DELAY3                                                                              
	DECF	HSD,F
	GOTO	DELAY2
DELAY3	RETURN
;*******************************************************************
;         ÂÛ×ÈÒÀÍÈÅ ÄÂÓÕÁÀÉÒÎÂÛÕ ×ÈÑÅË ( ACCb - ACCa -> ACCb )
D_SUB   call    neg_A           ; ÑÍÀ×ÀËÎ 0-ACCa;ÇÀÒÅÌ ÑËÎÆÅÍÈÅ 
;*******************************************************************
;       ÑËÎÆÅÍÈÅ ÄÂÓÕÁÀÉÒÎÂÛÕ ×ÈÑÅË ( ACCb + ACCa -> ACCb )
D_add1  movf    ACCaLO,W
	addwf   ACCbLO, F       ;add lsb
	btfsc   STATUS,C        ;add in carry
	incf    ACCbHI, F
	movf    ACCaHI,W
	addwf   ACCbHI, F       ;add msb
	btfsc   STATUS,C      
	incf    ACCbHH, F
	movf    ACCaHH,W
	addwf   ACCbHH, F 
	retlw   0
neg_A   comf    ACCaLO, F       ;( -ACCa -> ACCa )
	incf   	ACCaLO, F
	btfsc   STATUS,Z
	decf    ACCaHI, F
	comf    ACCaHI, F
	btfsc   STATUS,Z
	decf    ACCaHH, F
	comf    ACCaHH, F
	retlw   0
;   ÓÌÍÎÆÅÍÈÅ : ACCb(16 bits) * ACCa(16 bits) -> ACCb,ACCc ( 32 bits )
;               Program Memory  :       033
;               Clock Cycles    :       333
;         ÑËÎÆÅÍÈÅ ÄÂÓÕ ÁÀÉÒÎÂÛÕ ×ÈÑÅË ( ACCb + ACCa -> ACCb )
D_add   MOVF	ACCaLO,W
	ADDWF	ACCbLO,F
	BTFSC	STATUS,C
	INCF	ACCbHI,F
	MOVF	ACCaHI,W
	ADDWF	ACCbHI,F
	retlw   0
;*******************************************************************
;               ÄÂÓÕÁÀÉÒÎÂÎÅ ÓÌÍÎÆÅÍÈÅ ( 16x16 -> 32 )
;  ( ACCb*ACCa -> ACCb,ACCc ) :ÐÅÇÓËÜÒÀÒ 32 ÁÈÒÀ - ÑÒÀÐØÅÅ ÑËÎÂÎ 
;  Â ACCb ( ACCbHI,ACCbLO ) È ÌËÀÄØÅÅ ÑËÎÂÎ Â ACCc ( ACCcHI,ACCcLO ).
DBL_MPYS                        
	call    setup1
mloop   rrf     ACCdHI, F      
	rrf     ACCdLO, F
	btfsc   STATUS,C    	
	call    D_add
	rrf     ACCbHI, F
	rrf     ACCbLO, F
	rrf     ACCcHI, F
	rrf     ACCcLO, F
	decfsz  temp, F         
	goto    mloop
	retlw   0
setup1  movlw   .16      
	movwf   temp
	movf    ACCbHI,W      
	movwf   ACCdHI
	movf    ACCbLO,W
	movwf   ACCdLO
	clrf    ACCbHI
	clrf    ACCbLO
	retlw   0
	END
