;
;         "upgm_m0.txt"      " "
;
;         
 waiting_request:
       sbic PINA,bus_clc
      rjmp waiting_request
    rcall pspi_rxd
    sbis GPIOR0,data_key ;    
       ;     data_key=1
   rjmp waiting_request
 qt_sel:
    clr tmp0
    ldwi z,read_hid ;  
		   ;     
    add zl,data_t ;    
    adc zh,tmp0 ;  Zh   
;  Z  icall/ijmp  
;   .. ...
  ijmp ;    
;------------------------------------------------
 read_hid:
   rjmp read_hid_p ; 0    /  
       ;      
 upg_on:
   rjmp upg_on_p ; 1    +12 
       ;    
       ;   
 upg_off:
   rjmp upg_off_p ; 2    +12 
       ;    
       ;   
 rezet_on:
   rjmp rezet_on_p ; 3    
       ;     ZIF  reset = 0
       ;   
 rezet_off:
   rjmp rezet_off_p ; 4    
       ;     ZIF  reset = 1
       ;   
 oll_clear:
   rjmp oll_clear_p ; 5  "    "
       ;        0FF 
			 ;    
			 ;   
 rd_sign:
   rjmp rd_sign_p ; 6  " "  
       ;   clr_ptr_p
       ;       
 rd_data:
   rjmp rd_data_p ; 7  " "    
       ;    clr_ptr_p
       ;      
       ; max_ptrh:max_ptrl  
       ;        data_key
       ;        max_ptrh:max_ptrl
 purity:
   rjmp purity_p ; 8 ;  "  """ (checking for purity)
       ;     
       ;   clr_ptr_p
       ;        
       ; cnt_erwl
       ; cnt_erwh -   
       ; erad_0l
       ; erad_0h  -    
       ; erdt_0   -    
       ;
       ;     data_key=1  
       ;      
       ;    
       ; (       max_ptrh:max_ptrl)
 wrv_data:
   rjmp wrv_data_p ; 9  " "   
       ; 
       ;       
       ;     max_ptrh:max_ptrl
       ;     
       ;
       ; 1.     data_key=1  
       ;     
       ;    
       ;         
       ;
       ; 2.     data_key=0
       ;     
       ;
       ;     
       ;   rptr_proc
       ;   
       ;     max_ptrh:max_ptrl  
       ;        
       ; cnt_erwl
       ; cnt_erwh -   
       ; erad_0l
       ; erad_0h  -    
       ; erdt_0   -    
       ;
 wr_lb1:
   rjmp wr_lb1_p ; 0x0A  "   LB1"
       ;   
 wr_lb2:
   rjmp wr_lb2_p ; 0x0B  "   LB2"
       ;   
 wr_hpcnt:
   rjmp wr_hpcnt_p ; 0x0C  "    PCNT"
       ;   
			 ;   ,    
			 ;  PCNT      
			 ;  
       ;   
 boot_key:
  rjmp boot_key_p ; 0x0D  "      ZIF "
       ;   
;-------------------------------------------------------------------------
 time2:
     ldi tmp1,6 ;    ~30uS
 time2_tp0:
     nop ;      N
     nop ;  ~ N*5uS
     dec tmp1
     brne time2_tp0
    ret
;
;------------------------------------------------------------------------
;
;    " "
; (...  ...)
;
 end_qtl:
   cbi GPIOR0,data_key ; GPIOR0.data_key=0 ()
 end_qtle:
   ldi tmp0,qt_list ;   qt_list
   mov data_t,tmp0 ; data_t     
   rcall time2 ;  ~30uS
   rcall pspi_txd ;   
  rjmp waiting_request ;   waiting_request
;
;------------------------------------------------------------------------
;
;
;    0 
;   
;    
;    ,  
;   
;
 rptr_proc:
   ldi tmp1,102 ;    ~512uS
    ;    PORTD.key_z=0
   cbi DDRD,key_u ;   PORTD.key_u = 1
   rcall time2 ;  ~30uS
   rcall time2 ;  ~30uS
 ropt1:
   sbi DDRD,key_z ;    (key_z=0)
    ;    PORTD.key_z=0
    rcall time2_tp0 ;   
     cbi DDRD,key_z ;   key_z  Z-
      ;   PORTD.key_z=0
   ret
;
;------------------------------------------------------------------------
;
;    
;     
;
 clc_pptr:
   nop
   nop ;   1uS
   sbi PORTD,ptr_clc
   nop ;   => 200nS
   nop
   cbi PORTD,ptr_clc
   nop
  ret
;
;------------------------------------------------------------------------
;
;    /PROG
;     
;  - (    60uS)
;
 clc_prog:
    ldi tmp1,2 ;   10uS
    rcall time2_tp0 ;   
     sbi DDRD,pgm_line ; PORTD.pgm_line=0  
      ldi tmp1,12 ;  60uS
      rcall time2_tp0 ;   
      sbi PORTD,pgm_line ;  
     cbi DDRD,pgm_line ;
     cbi PORTD,pgm_line
    ldi tmp1,2 ;   10uS
    rcall time2_tp0 ;   
   ret
;
;------------------------------------------------------------------------
;
;    /PROG
;    " "
;   10 mS
;
 clc_erased:
      ldi tmp1,2 ;   10uS
    rcall time2_tp0 ;   
     sbi DDRD,pgm_line ; PORTD.pgm_line=0  
     ldi tmp2,10
 clc_tp0:
      ldi tmp1,200
 clc_tp1:
      rcall time2_tp0 ;   
      dec tmp2
      brne clc_tp0 ;  10mS
     sbi PORTD,pgm_line ;  
     cbi DDRD,pgm_line ;
     cbi PORTD,pgm_line
    ldi tmp1,2 ;   10uS
    rcall time2_tp0 ;   
   ret
;
;------------------------------------------------------------------------
;
;    
; "  "
; "takedown of the target microcontroller"
;
 tkdn_target:
  ldi tmp0,1<<ptr_clc
  out DDRD,tmp0
  clr tmp0
  out DDRA,tmp0
  out DDRB,tmp0
  out PORTA,tmp0
  out PORTB,tmp0
  out PORTD,tmp0
  out GPIOR0,tmp0 ;   
 ret
;
;------------------------------------------------------------------------
;
;      
;  PTR  
; ( )
;  
; combus_3, combus_5  combus_7
;       (pgx)
; combus_4 = 0   
; (  combus_4 = 1  
;  )
;
;    combas_4 = 1
;     data_r
;
  rdb_lu:
    nop
    nop
    in data_r,PINB ;     PORTB
    nop
    nop
 endrd:
    cpse pcntl,max_ptrl ;    
   rjmp normend
    cpse pcnth,max_ptrh
   rjmp normend
 end_arr:
     sbi GPIOR0,arrey_end ;  
          ; "    "
    ret
 normend:
   adiw pcntl,1 ;     PCNT
    rcall clc_pptr ;   
   ret
;
;------------------------------------------------------------------------
;
;   
;    
;    tmp0
;    tmp0
;  tmp2
;
  byte_swap:
   push tmp2
   push tmp1
   ldi tmp2,8
  pt_swap:
   ror tmp0
   rol tmp1
   dec tmp2
   brne pt_swap
   mov tmp0,tmp1 ;    tmp0
   pop tmp1
   pop tmp2
  ret
;
;------------------------------------------------------------------------
;
;   
;      
;
 read_hid_p:
   rcall time2 ;  ~30uS
   ldwi z,stiks<<1 ;    
   ldi tmp2,7 ;    
   cbi GPIOR0,data_key ; GPIOR0.data_key=0 ()
 re_trs:
    lpm data_t,z+ ;   
    rcall pspi_txd ;   
    dec tmp2
    brne re_trs ;    
    rcall time2 ;  ~30uS
  rjmp waiting_request ;   waiting_request
 stiks:
   .db "Px051v0",0 ;   7  ASCII
;
;------------------------------------------------------------------------
;
;    +12 
;    
;   
;
 upg_on_p:
   cbi DDRD,key_z ;   PORTD.key_z = 1
   rcall time2 ;  ~30uS
   rcall time2 ;  ~30uS
 uopt0:
   sbi DDRD,key_u ;    (key_u=0)
    ;    PORTD.key_u=0
    rcall time2 ;  ~30uS
   rjmp end_qtl
;
;------------------------------------------------------------------------
;
;     +12 
;    
;   
;
 upg_off_p:
   cbi DDRD,key_u ;    (key_u=Z)
    ;   PORTD.key_u=0
    rcall time2 ;  ~30uS
   rjmp end_qtl
;
;------------------------------------------------------------------------
;
;    
;     ZIF  reset = 0
;   
;
 rezet_on_p:
   cbi DDRD,key_u ;   PORTD.key_u = 1
   rcall time2 ;  ~30uS
   rcall time2 ;  ~30uS
 ropt0:
   sbi DDRD,key_z ;    (key_z=0)
    ;    PORTD.key_z=0
    rcall time2 ;  ~30uS
   rjmp end_qtl
;
;------------------------------------------------------------------------
;
;    
;     ZIF  reset = 1
;   
;
 rezet_off_p:
   cbi DDRD,key_z ;    (key_z=Z)
    ;   PORTD.key_z=0
    rcall time2 ;  ~30uS
   rjmp end_qtl
;
;------------------------------------------------------------------------
;
;
;  " "
;     
;    
;
;   ZIF-  
; combus_7=combus_5=0 combas_3=1  
; combus_4=0  PAVR
;
;
 oll_clear_p:
   sbi DDRD,combus_4 ; combus_4=0
	 cbi DDRD,key_z ;   PORTD.key_z = 1
   rcall time2 ;  ~30uS
   rcall time2 ;  ~30uS
 uopt2:
   sbi DDRD,key_u ;    (key_u=0)
   rcall time2 ;  ~30uS
    ;    PORTD.key_u=0
    rcall clc_erased ;  10mS
    rcall time2 ;  ~30uS
    rcall time2 ;  ~30uS
    cbi DDRD,key_u ;    (key_u=1)
    rcall time2 ;  ~30uS
    rcall time2 ;  ~30uS
    cbi DDRD,combus_4 ; combus_4=1
    rjmp end_qtl ;    
;
;------------------------------------------------------------------------
;
;  " "
;       
;    
;      pgx  
;   ASCII !!!
;
;   ZIF-  
; combus_7:combus_5:combas_3  
; combus_4  PAVR
;
;
 rd_sign_p:
  sbi DDRD,combus_4 ; combus_4=0
  rcall time2 ;  ~30uS
  rcall rptr_proc ;    PTR
  rcall time2 ;  ~30uS
  in tmp0,PINB ;    00000
  rcall byte_swap
  mov data_t,tmp0
  rcall pspi_txd ;     pgx
  rcall clc_pptr ;  ptr  00001
  rcall time2 ;  ~30uS
  in tmp0,PINB ;    00001
  rcall byte_swap
  mov data_t,tmp0
  rcall pspi_txd ;     pgx
  rcall time2 ;  ~30uS
  rcall clc_pptr ;  ptr  00002 (?)
  rcall time2 ;  ~30uS
  cbi DDRD,combus_4 ; combus_4=1
   rjmp waiting_request ;    
	        ;   waiting_request
;
;------------------------------------------------------------------------
;
;  " " 
;      
; max_ptrh:max_ptrl  
;
;   ZIF-  
; combus_7=combus_5=1 combas_3=0  PGX051
; combus_4=0  PAVR
;
;   PGX051    (data_key=0)
;     data_key=1  ,
;        
; (  max_ptrh:max_ptrl = GPIOR0.pcnt_set =0)
;
;
;
 rd_data_p:
   sbic GPIOR0,pcnt_set ;    
              ;  max_ptrh:max_ptrl
    rjmp rdm_on
    sbi GPIOR0,data_key ; GPIOR0.data_key=1 (/)
   rjmp end_qtle ;     
              ;   data_key
 rdm_on:
      cbi GPIOR0,data_key ; GPIOR0.data_key=0 ()
      cbi GPIOR0,arrey_end ;  
          ; "    "
      rcall rptr_proc ;   PTR  
      ldi pcntl,0
      mov pcnth,pcntl ;   
  pirat:
      rcall rdb_lu ;  
      mov tmp0,data_r
      rcall byte_swap ;     ()
      mov data_t,tmp0
      rcall pspi_txd ;    PGX051
      sbis GPIOR0,arrey_end ;    
			         ;   
			rjmp pirat
    rjmp waiting_request ;   waiting_request
;
;------------------------------------------------------------------------
;
;  "  """ (checking for purity)
;     
;   clr_ptr_p
;        
; cnt_erwl
; cnt_erwh -   
; erad_0l
; erad_0h  -    
; erdt_0   -    
;
;     data_key=1  
;      
;    
;
;   ZIF-  
; combus_7=combus_5=1 combas_3=0  
; combus_4=0 (/)  PAVR
;
;
 purity_p:
    sbic GPIOR0,pcnt_set ;    
              ;  max_ptrh:max_ptrl
    rjmp pur_on2
    sbi GPIOR0,data_key ; GPIOR0.data_key=1 (/)
   rjmp end_qtle ;     
              ;   data_key
 pur_on2:
      rcall ercnt_on
 pur_verif:
		 sbi DDRD,combus_4 ;  combus_4=0 /
 pur_loop:
      ser tmp1
      in tmp0,PINB ;    PINB  tmp0
      cpse tmp0,tmp1 ;    data_t
			rjmp pur_error ;     wr_error
 pur_goproc:
      cpse pcntl,max_ptrl ;   pcntl   max_ptrl
      rjmp inc_pcnt_p ;   inc_pcnt
      cpse pcnth,max_ptrh ;   pcnth   max_ptrh
      rjmp inc_pcnt_p ;   inc_pcnt
      sbi GPIOR0,arrey_end ;  arrey_end=1
      cbi DDRD,combus_4 ;  combus_4=1 
     rjmp wr_pur_off ;     5 
 inc_pcnt_p:
      adiw pcntl,1 ; pcnth:pcntl = pcnth:pcntl+1
      rcall clc_pptr ;   clc_pptr   
      rjmp pur_loop ;   wr_loop
 pur_error:
     sbic GPIOR0,wr_der0 ;  GPIOR0.wr_der0 = 1 ?
     rjmp pur_herr ;     wr_herr
                  ;  
     sbi GPIOR0,wr_der0 ;  GPIOR0.wr_der0 = 1
     movw erad_0l,pcntl ;   pcnth:pcntl  erad_0h:erad_0l
     rcall byte_swap ; tmp0 
     mov erdt_0,tmp0 ;   data_r  erdt_0
 pur_herr:
     adiw Xl,1 ;  cnt_erwh:cnt_erwl=X
     rjmp pur_goproc ;   wr_goproc
;
;------------------------------------------------------------------------
;
 ercnt_on:
      cbi GPIOR0,data_key ; GPIOR0.data_key=0 ()
      cbi GPIOR0,arrey_end ;  
          ; "    "
      clr pcntl
      clr pcnth ;   
  ;    
      cbi GPIOR0,wr_der0 ; (GPIOR0)  " 
           ;   " 
      clr xl
      clr xh ;   
      clr erad_0l
      clr erad_0h ;      
      rcall rptr_proc ;   PTR  
      rcall time2 ;  ~30uS
      rcall time2 ;  ~30uS
    ret
;
;------------------------------------------------------------------------
;
;
;  " "   
; 
;       
;     max_ptrh:max_ptrl
;     
;
; 1.     data_key=1  
;     
;    
;         
;
; 2.     data_key=0
;     
;
;     
;   rptr_proc
;   
;     max_ptrh:max_ptrl  
;        
; cnt_erwl
; cnt_erwh -   
; erad_0l
; erad_0h  -    
; erdt_0   -    
;
;   ZIF-  
; combus_7=combus_5=1 combas_3=0  
; combus_4  PAVR
; combus_4=1 
; combus_4=0 /
;
;------------------------------------------------------
;   pcnt_set    data_key
 wrv_data_p:
    cbi GPIOR0,data_key ; GPIOR0.data_key=0   
    sbis GPIOR0,pcnt_set ;  pcnt_set=0
    sbi GPIOR0,data_key ;    ERROR
    ldi tmp0,qt_list ;   qt_list
    mov data_t,tmp0 ; data_t     
    rcall time2 ;  ~30uS
   rcall pspi_txd ;      
         ;   data_key (1=ERROR, 0= )
;    pcnt_set    
     sbis GPIOR0,pcnt_set ;  pcnt_set=0
    rjmp waiting_request ;    
        ;   data_key    waiting_request
     rcall ercnt_on ;     
      cbi DDRD,key_z ;   PORTD.key_z = 1
      rcall time2 ;  ~30uS
      rcall time2 ;  ~30uS
;--------------------------------------------------------------
 wr_loop:
      rcall pspi_rxd ;    data_t
      ser tmp0 ; tmp0=0xFF
      cpse tmp0,data_t ;
      rjmp wr_fier ;  data_t   0FF   wr_fier
      rjmp wr_verif ;     wr_verif
 wr_fier:
      mov tmp0,data_t ;  data_t  tmp0
      rcall byte_swap ; tmp0 
      mov data_w,tmp0 ;    data_w
      cbi DDRD,combus_4 ;  combus_4=1 
      nop
			nop
      sbi DDRD,key_u ;    (key_u=0)
      rcall time2 ;  ~30uS
      nop
      nop
      nop
      nop
      nop
      nop
      ser tmp0
      out PORTB,data_w ;    PORTB
      out DDRB,tmp0 ;  PORTB  
      nop
      nop
      nop
      nop ;   10uS
      rcall clc_prog ;    clc_prog
      clr tmp0
      out DDRB,tmp0 ;  PORTB  
      out PORTB,tmp0 ;  PORTB
      nop
      nop
      nop
      nop
      nop
      nop
      nop
      nop
      nop
      nop ;   10uS
      cbi DDRD,key_u ;    (key_u=1)
      rcall time2 ;  ~30uS
 wait_qt:
      sbis PIND,rdy_bsy ;  PIND.rdy_bsy =1 (rdy_bsy=0  50nS
			rjmp wait_qt ;     )
 wr_verif:
			sbi DDRD,combus_4 ;  combus_4=0 /
      nop
			in tmp0,PINB ;    PINB  tmp0
			rcall byte_swap ; tmp0 
	    mov data_r,tmp0 ;    data_r
			cpse data_r,data_t ;    data_t
	; *!*   0xFF      *!*
			rjmp wr_error ;     wr_error
 wr_goproc:
      cpse pcntl,max_ptrl ;   pcntl   max_ptrl
      rjmp inc_pcnt ;   inc_pcnt
      cpse pcnth,max_ptrh ;   pcnth   max_ptrh
      rjmp inc_pcnt ;   inc_pcnt
      sbi GPIOR0,arrey_end ;  arrey_end=1
     ;     5 
 wr_pur_off:
      mov data_t,Xl ; cnt_erwl=Xl
      rcall pspi_txd
      mov data_t,Xh ; cnt_erwh=Xh -   
      rcall pspi_txd
      mov data_t,erad_0l ; erad_0l
      rcall pspi_txd
      mov data_t,erad_0h ; erad_0h -    
      rcall pspi_txd
      mov data_t,erdt_0 ; erdt_0 -    
      rcall pspi_txd
     rjmp waiting_request ;    
	        ;   waiting_request/  
 inc_pcnt:
      adiw pcntl,1 ; pcnth:pcntl = pcnth:pcntl+1
      rcall clc_pptr ;   clc_pptr   
      rjmp wr_loop ;   wr_loop
 wr_error:
     sbic GPIOR0,wr_der0 ;  GPIOR0.wr_der0 = 1 ?
     rjmp wr_herr ;     wr_herr
                  ;  
     sbi GPIOR0,wr_der0 ;  GPIOR0.wr_der0 = 1
     movw erad_0l,pcntl ;   pcnth:pcntl  erad_0h:erad_0l
     mov erdt_0,data_r ;   data_r  erdt_0
      ;     (,   )
 wr_herr:
     adiw Xl,1 ;  cnt_erwh:cnt_erwl=X
     rjmp wr_goproc ;   wr_goproc
;
;------------------------------------------------------------------------
;
;  "   LB1"
;   
;
;   ZIF-  
; combus_7=combus_5=1 combas_3=1  
; combus_4=1  PAVR
;
;
 wr_lb1_p:
     cbi DDRD,combus_4 ; combus_4=1
     rcall time2 ;  ~30uS
   cbi DDRD,key_z ;   PORTD.key_z = 1
   rcall time2 ;  ~30uS
   rcall time2 ;  ~30uS
 uopt1:
   sbi DDRD,key_u ;    (key_u=0)
    ;    PORTD.key_u=0
    rcall time2 ;  ~30uS
    rcall time2 ;  ~30uS
    rcall clc_prog
    rcall time2 ;  ~30uS
    rcall time2 ;  ~30uS
    cbi DDRD,key_u ;    (key_u=1)
    rcall time2 ;  ~30uS
    rcall time2 ;  ~30uS
     rjmp end_qtl ;   
;
;------------------------------------------------------------------------
;
;  "   LB2"
;   
;
;   ZIF-  
; combus_7:combus_5:combas_3  
; combus_4=1  PAVR
;
;   "   LB1"   
; combus_7=combus_5=0  combas_3=1   (pgx)
;
;
 wr_lb2_p:
   rjmp wr_lb1_p ;   wr_lb1_p
;
;------------------------------------------------------------------------
;
;  "    PCNT"
;   
;
;    L   H 
;       
;     
;
;  
;   ZIF-  
; combus_7:combus_5:combus_4:combas_3
;  Z-    1
;      
;
 wr_hpcnt_p:
    rcall pspi_rxd
    mov max_ptrl,data_t ;   
    rcall pspi_rxd
    mov max_ptrh,data_t ;   
    sbi GPIOR0,pcnt_set ; GPIOR0.pcnt_set=1
          ; "    "
    rjmp end_qtl ;   
;
;------------------------------------------------------------------------
;
;  "      ZIF "
;   
;
;  
;   ZIF-  
; combus_7:combus_5:combus_4:combas_3
;  Z-    1
;
;     PAVR   
; "  Z-     1"
;  PORTD.ptr_clc =  = 0
;
 boot_key_p:
    rcall tkdn_target
    rjmp end_qtl ;   
;    