	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
