;
;          bspi_m.txt
;
;   
;     
; /    
;   
;     "/"
;   8  ( )
;
;    
;    !!!
;
;----------------------------------------------
;
; bus_dtr  equ N ;  / 
        ;  reset      +5 
        ;       0
        ;       
				;     
; bus_clc  equ N ;    
        ;  reset/cold init      +5 
        ;    ()  ()
        ;   0
; bus_qt   equ N ;  
        ;  reset/cold init      +5 
        ;   0
        ;   ,   
;
;----------------------------------------------
;
;  
;  
;    
;
; .define cntbit_t R2 ; r2 rb0  
; .define cnt_tm R3 ; r3 rb0   
; .define data_t R7 ; r7 rb0   
; .define txd_port P ;    /  


; data_key: .dbit 1 ;   /
           ; data_key=0 -   
           ; data_key=1 -   
;
;----------------------------------------------
;
;   data_key   
;        
; 
;      data_key
;(data_key=0 -   
; data_key=1 -   )
;     
;
  .cseg
 bspi_txd:
   xch a,data_t ;    data_t, R7  ACC
   push ACC ; R7  
   mov a,cnt_tm
   push ACC ; R3  
   mov a,cntbit_t
   push ACC ; R2  
  orl txd_port,#(1<<bus_dtr || 1<<bus_clc || 1<<bus_qt) ;  
      ;   at89s5x    
      ; bus_dtr=bus_clc=bus_qt=
 tx_on:
  mov cntbit_t,#8 ;
  mov c,data_key
  acall strob ;    
 data_tx:
   xch a,data_t
   rrc a ;   
   xch a,data_t
   acall strob ;   
  djnz cntbit_t,data_tx
 tx_off:
  setb txd_port.bus_dtr ;   bus_dtr
  ;   at89s5x    
	;  bus_dtr=bus_clcbus_qt=
  ;  bus_dtr=bus_clcbus_qt=1
   pop ACC
   mov cntbit_t,a ; R2 
   pop ACC
   mov cnt_tm,a ; R3 
   pop ACC
   xch a,data_t ;   R7 
               ;  ACC  
 ret
;----------------------------------------------------------
 strob:
  mov txd_port.bus_dtr,c ;   data_key  bus_dtr
  acall time ;   
  clr txd_port.bus_clc ;   
  acall time ;   
 tx_tp0:
   mov a,txd_port ;    1  
  jb ACC.bus_qt,tx_tp0 ;    (bus_qt=0)
   setb txd_port.bus_clc ;   
   acall time ;   
 tx_tp1:
   mov a,txd_port ;    1  
  jnb ACC.bus_qt,tx_tp1 ;    (bus_qt=1)
 ret
;
;--------------------*****---------------------
;
;             
;
;        
;    ,    
;       
;  
; ..    
;     
;
;         
;  data_key      (0  1)
;        
; 
;
 bspi_rxd:
   xch a,data_t
   push ACC ; R7  
   mov a,cnt_tm
   push ACC ; R3  
   mov a,cntbit_t
   push ACC ; R2  
  mov cntbit_t,#8 ;   
  orl txd_port,#(1<<bus_dtr || 1<<bus_clc || 1<<bus_qt) ;  
      ;   at89s5x    
      ; /bus_dtr=bus_clc=, bus_qt=/
      ; bus_dtr=bus_clc=bus_qt=
      ; bus_dtr=bus_clc=bus_qt=1
 rx_on:
  acall strobinp
  mov a,data_t
  rlc a ;  data_key  
  mov data_key,c ;      
 data_rx:
   acall strobinp
  djnz cntbit_t,data_rx
   pop ACC
   mov cntbit_t,a ; R2 
   pop ACC
   mov cnt_tm,a ; R3 
   pop ACC
   xch a,data_t ;    , R7 
  ret
;-------------------------------------------------------------
 strobinp:
   mov a,txd_port
  jb ACC.bus_clc,strobinp ;   
 rx_tp0:
  acall time ;   
  mov a,txd_port
  mov c,ACC.bus_dtr
  xch a,data_t
  rrc a
  xch a,data_t
  clr txd_port.bus_qt ;   
  acall time ;   
 rx_tp1:
   mov a,txd_port
  jnb ACC.bus_clc,rx_tp1 ;   
   setb txd_port.bus_qt ;   
   acall time ;   
 ret
;
;---------------------------------------------------------
;
;   
;   
; "  "smart vectors""
;     
;     -
;  bus_clc=0
;     bus_qt=0  
;    bus_clc=1  
; bus_qt=1     
;    
;    ,   
;   ,  
;     
;      
; 
; ( + ) - 
;   -  
;    
;   
; (  )
;
 smart_qt_slave:
    mov a,cnt_tm
    push ACC
   mov a,txd_port
  jb ACC.bus_clc,smart_qt_slave ;   
   clr txd_port.bus_qt ;   
   acall time ;   
 qt0_p:
   mov a,txd_port
  jnb ACC.bus_clc,qt0_p ;   
   setb txd_port.bus_qt ;   
   acall time ;   
    pop ACC
    mov cnt_tm,a
  ret
;
;----------------------------------------
;
;   "smart" 
;      
;
 smart_qt_master:
    mov a,cnt_tm
    push ACC
   clr txd_port.bus_clc ;    
            ;    
            ;  -  bus_clc=0
   acall time ;   
 qt2_p:
   mov a,txd_port
   jb ACC.bus_qt,qt2_p ;    
	          ; bus_qt=0  
	 setb txd_port.bus_clc ; 
	          ;  
	 acall time ;   
 qt3_p:
   mov a,txd_port
   jnb ACC.bus_qt,qt3_p ;    
	          ; bus_qt=1  
		pop ACC
    mov cnt_tm,a
	ret
;
;---------------------------------------------------------
;
;   
;
 time:
   mov cnt_tm,#8 ;  
  djnz cnt_tm,$ ;
 ret
;