VOC Optimation
[owSlave2.git] / programmer / programmer / programmer.asm
index d047da0..cccdd18 100644 (file)
-.def srbyte = r12  ;byty for search rom algorithm
-.def writelow = r13;  marker for send low
-.def zero =r14;  always zero 
-.def smode=r15; if 1 then send 
-.def temp = r16 ; 
-.def temp2 = r17; 
-.def mode = r18 ; 
-.def bitp = r19 ; bit counter ... shift...
-.def rwbyte = r21;
-.def param = r22;
-.def bytep = r23  ;byte counter
-#define spmcrval  param
-
-
-.equ OWM_READ_ROM_COMMAND=0 ; 0 wegen schnellen test ist dieser wert 0! Daturch wird die Sprungdabelle nicht verwendet
-.equ OWM_SLEEP=1 ; Warten auf Reset
-.equ OWM_MATCH_ROM=2
-.equ OWM_SEARCH_ROM_S=3  ;send bit
-.equ OWM_SEARCH_ROM_R=4  ;resive master
-.equ OWM_READ_COMMAND=5
-.equ OWM_WRITE_SCRATCHPAD=6
-.equ OWM_READ_SCRATCHPAD=7
-.equ OWM_PROGRAMM_PAGE=8
-.equ OWM_RECALL_FLASH=9
-
-
-.equ OW_DDR = DDRB 
-.equ OW_PIN = PORTB2
-.equ OW_PORT = PORTB 
-.equ OW_PINN = PINB 
-
-;.equ SRAM_START = 0x60
-
-.macro set_clock
-               ldi temp,0x80;
-               out CLKPR,temp
-               ldi temp,@0
-               out CLKPR,temp
-.endmacro 
-
-.macro owwl
-               sbic OW_PINN,OW_PIN
-               rjmp pc-1
-.endmacro 
-
-.macro owwh
-               sbis OW_PINN,OW_PIN
-               rjmp pc-1
-.endmacro 
-
-
-
-
- ;---------------------------------------------------
-; START of PROG 
-;---------------------------------------------------
-
-
-.CSEG 
-.ORG 0x000
-jreset:
-               rjmp start ; Reset-Vector 
-               reti ; 
-               reti ; 
-               reti ; 
-               reti ; 
-               reti ; 
-               reti ; 
-               reti ; 
-               reti ; 
-               reti ; 
-               reti ; 
-               reti ; 
-               reti ; 
-               reti ; 
-               reti ; 
-               reti ; 
-               reti ; 
-               reti ; 
-               reti ; 
-               reti ; 
-               reti ; 
-
-
-.ORG 0x0EC0
-
-start: 
-               cli
-               ldi temp,0
-               mov zero,temp
-               set_clock 0x00 ;8mhz
-               ldi mode,OWM_SLEEP
-               ldi temp,(1<<CS01) //1us
-               out TCCR0B,temp
-               ldi temp, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse 
-               out SPH, temp 
-               ldi temp, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse 
-               out SPL, temp 
-               ;ldi temp,1
-               ;out DDRB,temp
-               clr writelow
-               clr bitp
-       
-               ;sbi PORTB,0
-               ldi ZL,low(pro_owid*2) 
-               ldi ZH,high(pro_owid*2) 
-               ldi XL,low(sowid)
-               ldi XH,high(sowid)
-               ;ldi temp2,8
-pro_copy_loop: ;copy ID on SRAM for better handling
-               lpm temp,Z+
-               st X+,temp
-               cpi XL,SRAM_START+8
-               brlo pro_copy_loop
-pro_loop:
-               ;sbi PORTB,0
-               owwl                            ;wait for line goes low (polling)
-               sbrs writelow,0         ;test of zero send
-               rjmp pro_loop1          ;no ? goes next
-               sbi OW_DDR,OW_PIN       ;yes pull line to low
-               ldi param,45            ;wait for 50 us
-               rcall wait_time
-               clr writelow            ;reset write low indecator
-               cbi OW_DDR,OW_PIN   ;release line
-               owwh                            ;wait for line is high (it can takes some time cause of the capacity of line)
-pro_loop1:
-               tst smode                       ;smode=1 for slave sends to master
-               breq pro_loop_resv
-pro_loop_send:
-               tst bitp
-               brne pro_loop_send1
-               rcall pro_hb
-               tst smode
-               breq pro_loop_end ; now reading ... do nothing 
-pro_loop_send1:  ;prebare next bit
-               sbrs rwbyte ,0; if bit 0 set in rwbyte then skip next command
-               inc writelow
-               lsl bitp
-               ror rwbyte
-               rjmp pro_loop_end
-
-pro_loop_resv:
-               ldi param,15  ;wait 15us
-               rcall wait_time
-               lsr rwbyte
-               ;cbi PORTB,0
-               sbic OW_PINN,OW_PIN  ;test line
-               ori rwbyte,0x80
-               lsl bitp
-               brne pro_loop_end ;no handle need
-               rcall pro_hb
-               tst smode
-               brne pro_loop_send ; Nach dem Gelesen byte koennte gesendet werden muessen....
-pro_loop_end:
-               //owwh
-               out TCNT0,zero
-pro_loop_end_test_reset:
-               sbic OW_PINN,OW_PIN  //leitung wieder high
-               rjmp pro_loop
-               in temp,TCNT0
-               cpi temp,130
-               brlo pro_loop_end_test_reset
-               rcall pro_sleep_s2
-               rjmp pro_loop
-
-
-
-
-pro_sleep:
-               out TCNT0,zero
-pro_sleep_s1:
-               sbic OW_PINN,OW_PIN  //leitung wieder high
-               ret
-               in temp,TCNT0
-               cpi temp,200
-               brlo pro_sleep_s1
-               //leitung wieder high
-pro_sleep_s2:
-               owwh 
-               ldi param,40
-               rcall wait_time
-               //Presents Impuls
-               sbi OW_DDR,OW_PIN
-               ldi param,130
-               rcall wait_time
-               cbi OW_DDR,OW_PIN
-               //init read byte
-               ldi bitp,0x01
-               ldi rwbyte,0
-               clr smode
-               ldi mode,OWM_READ_ROM_COMMAND
-               //Wait for all other devices presents impuls finished
-               ldi param,40
-               rcall wait_time
-               ret
-
-
-
-pro_hb:
-               ldi ZL,low(pro_stable) 
-               ldi ZH,high(pro_stable) 
-               add ZL,mode 
-               adc ZH,zero
-               icall
-               ret
-
-pro_stable: 
-               rjmp pro_read_rom_command
-               rjmp pro_sleep 
-               rjmp pro_match_rom
-               rjmp pro_search_rom_s
-               rjmp pro_search_rom_r
-               rjmp pro_read_command
-               rjmp pro_write_scratchpad
-               rjmp pro_read_scratchpad
-               rjmp pro_programm_page
-               rjmp pro_recall_flash
-
-pro_read_rom_command:
-               ldi mode,OWM_SLEEP
-               cpi rwbyte,0xCC
-               brne pro_rcc_1
-               ldi mode,OWM_READ_COMMAND
-               rjmp pro_out_bitp1
-pro_rcc_1:
-               cpi rwbyte,0xF0 ;Searchrom
-               brne pro_rcc_2
-               ldi XL,low(sowid)  ;init sram pointer
-               ldi XH,high(sowid)
-               ld srbyte,X+
-               ldi bytep,0
-               rjmp pro_serchrom_next_bit
-pro_rcc_2:
-               cpi rwbyte,0x55 ;Matchrom
-               brne pro_rcc_3
-//             rcall pro_owidinit
-               ldi XL,low(sowid)  ;init sram pointer
-               ldi XH,high(sowid)
-               ldi mode,OWM_MATCH_ROM
-               rjmp pro_out_bytep0
-
-pro_rcc_3:
-               ret
-
-pro_match_rom:         
-               ld temp,X+
-               cp temp,rwbyte
-               breq pro_match_rom_next
-               ldi mode,OWM_SLEEP
-               ret
-pro_match_rom_next:                                    
-               cpi XL,SRAM_START+8
-               breq pro_match_rom_found
-               rjmp pro_out_bitp1
-pro_match_rom_found:
-           ldi mode,OWM_READ_COMMAND
-               rjmp pro_out_bitp1
-
-pro_read_command:
-               ldi mode,OWM_SLEEP
-               cpi rwbyte,0x0F ;; Write to Scratchpad
-               brne pro_rc_1
-               ldi mode,OWM_WRITE_SCRATCHPAD
-               ldi XL,low(scratchpad)  ;init sram pointer
-               ldi XH,high(scratchpad)
-               rjmp pro_out_bytep0
-pro_rc_1:
-               cpi rwbyte,0xAA
-               brne pro_rc_2
-               ldi mode,OWM_READ_SCRATCHPAD  ;;Read from Scratchpad
-               ldi XL,low(scratchpad)  ;init sram pointer
-               ldi XH,high(scratchpad)
-               inc smode
-               ld rwbyte,X+
-               rjmp pro_out_bytep0
-
-pro_rc_2:
-               cpi rwbyte,0xB8
-               brne pro_rc_3
-               ldi mode,OWM_RECALL_FLASH  ;; copy Flash page in Scratchpad
-               ldi XL,low(scratchpad)  ;init sram pointer
-               ldi XH,high(scratchpad)
-               rjmp pro_out_bytep0
-pro_rc_3:
-               cpi rwbyte,0x55 ; copy Scratchpad to Flash
-               brne pro_rc_4
-               ldi mode,OWM_SLEEP
-               rjmp pro_programm_page
-               
-pro_rc_4:
-               cpi rwbyte,0x89 ; Reset Device /Boot (new) Firmware
-               brne pro_rc_5
-               rjmp jreset             
-pro_rc_5:
-               cpi rwbyte,0x8B ; Clear the OWID saved in EEPROM / one ID1
-               brne pro_rc_6   
-               ldi temp,7
-pro_rc_5a:
-               ldi XL,low(E2END)
-               ldi XH,high(E2END)
-               sub XL,temp
-               out EEARH,XH
-               out EEARL,XL
-               ldi temp, (0<<EEPM1)|(0<<EEPM0)
-               out EECR, temp
-               ldi temp,0xFF
-               out EEDR, temp
-               sbi EECR, EEMPE
-               sbi EECR, EEPE
-               ret
-
-
-pro_rc_6:
-               cpi rwbyte,0x8C ; Clear the OWID saved in EEPROM / one ID2
-               brne pro_rc_7
-               ldi temp,7+8
-               rjmp pro_rc_5a
-
-pro_rc_7:
-               ret
-
-pro_write_scratchpad:
-               st X+,rwbyte
-               cpi XL,SRAM_START+8+66
-               brlo pro_write_scratchpad_next
-               ldi mode,OWM_SLEEP
-               ret             
-pro_write_scratchpad_next:
-               ldi bitp,1
-               ret
-
-pro_read_scratchpad:
-               cpi XL,SRAM_START+8+66
-               brlo pro_read_scratchpad_next
-               ldi mode,OWM_SLEEP
-               clr smode
-               ret
-pro_read_scratchpad_next:
-               ld rwbyte,X+
-               rjmp pro_out_bitp1
-
-
-pro_programm_page:
-.equ PAGESIZEB = PAGESIZE*2;PAGESIZEB is page size in BYTES, not words
-// .org SMALLBOOTSTART
-write_page:
-               ;transfer data from RAM to Flash page buffer
-               ldi bytep, PAGESIZEB ;init loop variable
-               ldi YL,low(scratchpad)  ;init sram pointer
-               ldi YH,high(scratchpad)
-               ld ZL,Y+
-               ld ZH,Y+
-               ;page erase
-               ldi spmcrval, (1<<PGERS) + (1<<SPMEN)
-               rcall do_spm
-wrloop:
-               ld r0, Y+
-               ld r1, Y+
-               ldi spmcrval, (1<<SPMEN)
-               rcall do_spm
-               adiw ZH:ZL, 2
-               subi bytep, 2;use subi for PAGESIZEB<=256
-               brne wrloop
-               ;execute page write
-               subi ZL, low(PAGESIZEB) ;restore pointer
-               sbci ZH, high(PAGESIZEB) ;not required for PAGESIZEB<=256
-               ldi spmcrval, (1<<PGWRT) + (1<<SPMEN)
-               rcall do_spm
-               ;read back and check, optional
-               ldi bytep, PAGESIZEB
-               subi YL, low(PAGESIZEB) ;restore pointer
-               sbci YH, high(PAGESIZEB)
-rdloop:
-               lpm r0, Z+
-               ld r1, Y+
-               cpse r0, r1
-               rjmp error
-               subi bytep, 2;use subi for PAGESIZEB<=256
-               brne rdloop
-               ;return
-               ret
-do_spm:
-                ;input: spmcrval determines SPM action
-               ;disable interrupts if enabled, store status
-               in temp2, SREG
-               cli
-               ;check for previous SPM complete
-wait:
-               in temp, SPMCSR
-               sbrc temp, SPMEN
-               rjmp wait
-               ;SPM timed sequence
-               out SPMCSR, spmcrval
-               spm
-               ;restore SREG (to enable interrupts if originally enabled)
-               out SREG, temp2
-               ret
-
-error:
-
-
-               ret
-
-pro_recall_flash:
-               st X+,rwbyte
-               ;inc bytep
-               cpi XL,SRAM_START+8+2
-               brlo pro_out_bitp1;pro_recall_flash_next
-               lds ZL,scratchpad
-               lds ZH,scratchpad+1
-pro_recall_flash_cl:
-               lpm temp,Z+
-               st X+,temp
-               cpi XL,SRAM_START+8+66
-               brne pro_recall_flash_cl
-               ldi mode,OWM_SLEEP
-               ret
-
-pro_out_read_command:
-               ldi mode,OWM_READ_COMMAND
-pro_out_bytep0:
-               ldi bytep,0
-pro_out_bitp1:
-               ldi bitp,1
-               ret             
-
-
-
-pro_serchrom_next_bit:
-               mov rwbyte,srbyte
-               mov temp2,rwbyte
-               com rwbyte
-               ror temp2  ;first bit in C
-               rol rwbyte ;C in first bit 
-               inc smode
-               ldi bitp,0x40
-               ldi mode,OWM_SEARCH_ROM_R  ;next mod Resive
-               ret
-
-
-pro_search_rom_s:
-               clr temp2
-               lsr srbyte ;shift in C lowest bit
-               ror temp2  ; shift in temp2 as highest bit
-               andi rwbyte,0x80  ;  clear other bits
-               eor temp2,rwbyte
-               breq pro_search_rom_s_goon
-               ldi mode,OWM_SLEEP
-               ret
-pro_search_rom_s_goon:
-               inc bytep
-               mov temp2,bytep
-               andi temp2,0x07
-               brne pro_serchrom_next_bit ;prepare next bit
-               mov temp2,bytep
-               andi temp2,0x40 ;;end
-               brne pro_search_rom_found
-               ;read next byte
-               ld srbyte,X+
-               rjmp pro_serchrom_next_bit
-
-pro_search_rom_found:
-               ldi mode,OWM_READ_COMMAND
-               rjmp pro_out_bytep0
-
-pro_search_rom_r:
-               clr smode
-               ldi mode,OWM_SEARCH_ROM_S
-               ldi bitp,0  ;go to searchrom_s after bit get
-               ret
-
-pro_owid: .DB  0xA3, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xFA
-
-
-
-
-
-wait_time:
-               out TCNT0,zero
-wait_time1:
-               in temp,TCNT0
-               cp temp,param
-               brlo wait_time1
-               ret
-
-
-.DSEG
-sowid: .BYTE 8
+.def srbyte = r12  ;byty for search rom algorithm\r
+.def writelow = r13;  marker for send low\r
+.def zero =r14;  always zero \r
+.def smode=r15; if 1 then send \r
+.def temp = r16 ; \r
+.def temp2 = r17; \r
+.def mode = r18 ; \r
+.def bitp = r19 ; bit counter ... shift...\r
+.def rwbyte = r21;\r
+.def param = r22;\r
+.def bytep = r23  ;byte counter\r
+#define spmcrval  param\r
+\r
+\r
+.equ OWM_READ_ROM_COMMAND=0 ; 0 wegen schnellen test ist dieser wert 0! Daturch wird die Sprungdabelle nicht verwendet\r
+.equ OWM_SLEEP=1 ; Warten auf Reset\r
+.equ OWM_MATCH_ROM=2\r
+.equ OWM_SEARCH_ROM_S=3  ;send bit\r
+.equ OWM_SEARCH_ROM_R=4  ;resive master\r
+.equ OWM_READ_COMMAND=5\r
+.equ OWM_WRITE_SCRATCHPAD=6\r
+.equ OWM_READ_SCRATCHPAD=7\r
+.equ OWM_PROGRAMM_PAGE=8\r
+.equ OWM_RECALL_FLASH=9\r
+\r
+\r
+.equ OW_DDR = DDRB \r
+.equ OW_PIN = PORTB2\r
+.equ OW_PORT = PORTB \r
+.equ OW_PINN = PINB \r
+\r
+;.equ SRAM_START = 0x60\r
+\r
+.macro set_clock\r
+               ldi temp,0x80;\r
+               out CLKPR,temp\r
+               ldi temp,@0\r
+               out CLKPR,temp\r
+.endmacro \r
+\r
+.macro owwl\r
+               sbic OW_PINN,OW_PIN\r
+               rjmp pc-1\r
+.endmacro \r
+\r
+.macro owwh\r
+               sbis OW_PINN,OW_PIN\r
+               rjmp pc-1\r
+.endmacro \r
+\r
+\r
+\r
+\r
+ ;---------------------------------------------------\r
+; START of PROG \r
+;---------------------------------------------------\r
+\r
+\r
+.CSEG \r
+.ORG 0x000\r
+jreset:\r
+               rjmp start ; Reset-Vector \r
+               reti ; \r
+               reti ; \r
+               reti ; \r
+               reti ; \r
+               reti ; \r
+               reti ; \r
+               reti ; \r
+               reti ; \r
+               reti ; \r
+               reti ; \r
+               reti ; \r
+               reti ; \r
+               reti ; \r
+               reti ; \r
+               reti ; \r
+               reti ; \r
+               reti ; \r
+               reti ; \r
+               reti ; \r
+               reti ; \r
+\r
+\r
+.ORG 0x0EC0\r
+\r
+start: \r
+               cli\r
+               ldi temp,0\r
+               mov zero,temp\r
+               set_clock 0x00 ;8mhz\r
+               ldi mode,OWM_SLEEP\r
+               ldi temp,(1<<CS01) //1us\r
+               out TCCR0B,temp\r
+               ldi temp, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse \r
+               out SPH, temp \r
+               ldi temp, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse \r
+               out SPL, temp \r
+               ;ldi temp,1\r
+               ;out DDRB,temp\r
+               clr writelow\r
+               clr bitp\r
+       \r
+               ;sbi PORTB,0\r
+               ldi ZL,low(pro_owid*2) \r
+               ldi ZH,high(pro_owid*2) \r
+               ldi XL,low(sowid)\r
+               ldi XH,high(sowid)\r
+               ;ldi temp2,8\r
+pro_copy_loop: ;copy ID on SRAM for better handling\r
+               lpm temp,Z+\r
+               st X+,temp\r
+               cpi XL,SRAM_START+8\r
+               brlo pro_copy_loop\r
+pro_loop:\r
+               ;sbi PORTB,0\r
+               owwl                            ;wait for line goes low (polling)\r
+               sbrs writelow,0         ;test of zero send\r
+               rjmp pro_loop1          ;no ? goes next\r
+               sbi OW_DDR,OW_PIN       ;yes pull line to low\r
+               ldi param,45            ;wait for 50 us\r
+               rcall wait_time\r
+               clr writelow            ;reset write low indecator\r
+               cbi OW_DDR,OW_PIN   ;release line\r
+               owwh                            ;wait for line is high (it can takes some time cause of the capacity of line)\r
+pro_loop1:\r
+               tst smode                       ;smode=1 for slave sends to master\r
+               breq pro_loop_resv\r
+pro_loop_send:\r
+               tst bitp\r
+               brne pro_loop_send1\r
+               rcall pro_hb\r
+               tst smode\r
+               breq pro_loop_end ; now reading ... do nothing \r
+pro_loop_send1:  ;prebare next bit\r
+               sbrs rwbyte ,0; if bit 0 set in rwbyte then skip next command\r
+               inc writelow\r
+               lsl bitp\r
+               ror rwbyte\r
+               rjmp pro_loop_end\r
+\r
+pro_loop_resv:\r
+               ldi param,15  ;wait 15us\r
+               rcall wait_time\r
+               lsr rwbyte\r
+               ;cbi PORTB,0\r
+               sbic OW_PINN,OW_PIN  ;test line\r
+               ori rwbyte,0x80\r
+               lsl bitp\r
+               brne pro_loop_end ;no handle need\r
+               rcall pro_hb\r
+               tst smode\r
+               brne pro_loop_send ; Nach dem Gelesen byte koennte gesendet werden muessen....\r
+pro_loop_end:\r
+               //owwh\r
+               out TCNT0,zero\r
+pro_loop_end_test_reset:\r
+               sbic OW_PINN,OW_PIN  //leitung wieder high\r
+               rjmp pro_loop\r
+               in temp,TCNT0\r
+               cpi temp,130\r
+               brlo pro_loop_end_test_reset\r
+               rcall pro_sleep_s2\r
+               rjmp pro_loop\r
+\r
+\r
+\r
+\r
+pro_sleep:\r
+               out TCNT0,zero\r
+pro_sleep_s1:\r
+               sbic OW_PINN,OW_PIN  //leitung wieder high\r
+               ret\r
+               in temp,TCNT0\r
+               cpi temp,200\r
+               brlo pro_sleep_s1\r
+               //leitung wieder high\r
+pro_sleep_s2:\r
+               owwh \r
+               ldi param,40\r
+               rcall wait_time\r
+               //Presents Impuls\r
+               sbi OW_DDR,OW_PIN\r
+               ldi param,130\r
+               rcall wait_time\r
+               cbi OW_DDR,OW_PIN\r
+               //init read byte\r
+               ldi bitp,0x01\r
+               ldi rwbyte,0\r
+               clr smode\r
+               ldi mode,OWM_READ_ROM_COMMAND\r
+               //Wait for all other devices presents impuls finished\r
+               ldi param,40\r
+               rcall wait_time\r
+               ret\r
+\r
+\r
+\r
+pro_hb:\r
+               ldi ZL,low(pro_stable) \r
+               ldi ZH,high(pro_stable) \r
+               add ZL,mode \r
+               adc ZH,zero\r
+               icall\r
+               ret\r
+\r
+pro_stable: \r
+               rjmp pro_read_rom_command\r
+               rjmp pro_sleep \r
+               rjmp pro_match_rom\r
+               rjmp pro_search_rom_s\r
+               rjmp pro_search_rom_r\r
+               rjmp pro_read_command\r
+               rjmp pro_write_scratchpad\r
+               rjmp pro_read_scratchpad\r
+               rjmp pro_programm_page\r
+               rjmp pro_recall_flash\r
+\r
+pro_read_rom_command:\r
+               ldi mode,OWM_SLEEP\r
+               cpi rwbyte,0xCC\r
+               brne pro_rcc_1\r
+               ldi mode,OWM_READ_COMMAND\r
+               rjmp pro_out_bitp1\r
+pro_rcc_1:\r
+               cpi rwbyte,0xF0 ;Searchrom\r
+               brne pro_rcc_2\r
+               ldi XL,low(sowid)  ;init sram pointer\r
+               ldi XH,high(sowid)\r
+               ld srbyte,X+\r
+               ldi bytep,0\r
+               rjmp pro_serchrom_next_bit\r
+pro_rcc_2:\r
+               cpi rwbyte,0x55 ;Matchrom\r
+               brne pro_rcc_3\r
+//             rcall pro_owidinit\r
+               ldi XL,low(sowid)  ;init sram pointer\r
+               ldi XH,high(sowid)\r
+               ldi mode,OWM_MATCH_ROM\r
+               rjmp pro_out_bytep0\r
+\r
+pro_rcc_3:\r
+               ret\r
+\r
+pro_match_rom:         \r
+               ld temp,X+\r
+               cp temp,rwbyte\r
+               breq pro_match_rom_next\r
+               ldi mode,OWM_SLEEP\r
+               ret\r
+pro_match_rom_next:                                    \r
+               cpi XL,SRAM_START+8\r
+               breq pro_match_rom_found\r
+               rjmp pro_out_bitp1\r
+pro_match_rom_found:\r
+           ldi mode,OWM_READ_COMMAND\r
+               rjmp pro_out_bitp1\r
+\r
+pro_read_command:\r
+               ldi mode,OWM_SLEEP\r
+               cpi rwbyte,0x0F ;; Write to Scratchpad\r
+               brne pro_rc_1\r
+               ldi mode,OWM_WRITE_SCRATCHPAD\r
+               ldi XL,low(scratchpad)  ;init sram pointer\r
+               ldi XH,high(scratchpad)\r
+               rjmp pro_out_bytep0\r
+pro_rc_1:\r
+               cpi rwbyte,0xAA\r
+               brne pro_rc_2\r
+               ldi mode,OWM_READ_SCRATCHPAD  ;;Read from Scratchpad\r
+               ldi XL,low(scratchpad)  ;init sram pointer\r
+               ldi XH,high(scratchpad)\r
+               inc smode\r
+               ld rwbyte,X+\r
+               rjmp pro_out_bytep0\r
+\r
+pro_rc_2:\r
+               cpi rwbyte,0xB8\r
+               brne pro_rc_3\r
+               ldi mode,OWM_RECALL_FLASH  ;; copy Flash page in Scratchpad\r
+               ldi XL,low(scratchpad)  ;init sram pointer\r
+               ldi XH,high(scratchpad)\r
+               rjmp pro_out_bytep0\r
+pro_rc_3:\r
+               cpi rwbyte,0x55 ; copy Scratchpad to Flash\r
+               brne pro_rc_4\r
+               ldi mode,OWM_SLEEP\r
+               rjmp pro_programm_page\r
+               \r
+pro_rc_4:\r
+               cpi rwbyte,0x89 ; Reset Device /Boot (new) Firmware\r
+               brne pro_rc_5\r
+               rjmp jreset             \r
+pro_rc_5:\r
+               cpi rwbyte,0x8B ; Clear the OWID saved in EEPROM / one ID1\r
+               brne pro_rc_6   \r
+               ldi temp,7\r
+pro_rc_5a:\r
+               ldi XL,low(E2END)\r
+               ldi XH,high(E2END)\r
+               sub XL,temp\r
+               out EEARH,XH\r
+               out EEARL,XL\r
+               ldi temp, (0<<EEPM1)|(0<<EEPM0)\r
+               out EECR, temp\r
+               ldi temp,0xFF\r
+               out EEDR, temp\r
+               sbi EECR, EEMPE\r
+               sbi EECR, EEPE\r
+               ret\r
+\r
+\r
+pro_rc_6:\r
+               cpi rwbyte,0x8C ; Clear the OWID saved in EEPROM / one ID2\r
+               brne pro_rc_7\r
+               ldi temp,7+8\r
+               rjmp pro_rc_5a\r
+\r
+pro_rc_7:\r
+               ret\r
+\r
+pro_write_scratchpad:\r
+               st X+,rwbyte\r
+               cpi XL,SRAM_START+8+66\r
+               brlo pro_write_scratchpad_next\r
+               ldi mode,OWM_SLEEP\r
+               ret             \r
+pro_write_scratchpad_next:\r
+               ldi bitp,1\r
+               ret\r
+\r
+pro_read_scratchpad:\r
+               cpi XL,SRAM_START+8+66\r
+               brlo pro_read_scratchpad_next\r
+               ldi mode,OWM_SLEEP\r
+               clr smode\r
+               ret\r
+pro_read_scratchpad_next:\r
+               ld rwbyte,X+\r
+               rjmp pro_out_bitp1\r
+\r
+\r
+pro_programm_page:\r
+.equ PAGESIZEB = PAGESIZE*2;PAGESIZEB is page size in BYTES, not words\r
+// .org SMALLBOOTSTART\r
+write_page:\r
+               ;transfer data from RAM to Flash page buffer\r
+               ldi bytep, PAGESIZEB ;init loop variable\r
+               ldi YL,low(scratchpad)  ;init sram pointer\r
+               ldi YH,high(scratchpad)\r
+               ld ZL,Y+\r
+               ld ZH,Y+\r
+               ;page erase\r
+               ldi spmcrval, (1<<PGERS) + (1<<SPMEN)\r
+               rcall do_spm\r
+wrloop:\r
+               ld r0, Y+\r
+               ld r1, Y+\r
+               ldi spmcrval, (1<<SPMEN)\r
+               rcall do_spm\r
+               adiw ZH:ZL, 2\r
+               subi bytep, 2;use subi for PAGESIZEB<=256\r
+               brne wrloop\r
+               ;execute page write\r
+               subi ZL, low(PAGESIZEB) ;restore pointer\r
+               sbci ZH, high(PAGESIZEB) ;not required for PAGESIZEB<=256\r
+               ldi spmcrval, (1<<PGWRT) + (1<<SPMEN)\r
+               rcall do_spm\r
+               ;read back and check, optional\r
+               ldi bytep, PAGESIZEB\r
+               subi YL, low(PAGESIZEB) ;restore pointer\r
+               sbci YH, high(PAGESIZEB)\r
+rdloop:\r
+               lpm r0, Z+\r
+               ld r1, Y+\r
+               cpse r0, r1\r
+               rjmp error\r
+               subi bytep, 2;use subi for PAGESIZEB<=256\r
+               brne rdloop\r
+               ;return\r
+               ret\r
+do_spm:\r
+                ;input: spmcrval determines SPM action\r
+               ;disable interrupts if enabled, store status\r
+               in temp2, SREG\r
+               cli\r
+               ;check for previous SPM complete\r
+wait:\r
+               in temp, SPMCSR\r
+               sbrc temp, SPMEN\r
+               rjmp wait\r
+               ;SPM timed sequence\r
+               out SPMCSR, spmcrval\r
+               spm\r
+               ;restore SREG (to enable interrupts if originally enabled)\r
+               out SREG, temp2\r
+               ret\r
+\r
+error:\r
+\r
+\r
+               ret\r
+\r
+pro_recall_flash:\r
+               st X+,rwbyte\r
+               ;inc bytep\r
+               cpi XL,SRAM_START+8+2\r
+               brlo pro_out_bitp1;pro_recall_flash_next\r
+               lds ZL,scratchpad\r
+               lds ZH,scratchpad+1\r
+pro_recall_flash_cl:\r
+               lpm temp,Z+\r
+               st X+,temp\r
+               cpi XL,SRAM_START+8+66\r
+               brne pro_recall_flash_cl\r
+               ldi mode,OWM_SLEEP\r
+               ret\r
+\r
+pro_out_read_command:\r
+               ldi mode,OWM_READ_COMMAND\r
+pro_out_bytep0:\r
+               ldi bytep,0\r
+pro_out_bitp1:\r
+               ldi bitp,1\r
+               ret             \r
+\r
+\r
+\r
+pro_serchrom_next_bit:\r
+               mov rwbyte,srbyte\r
+               mov temp2,rwbyte\r
+               com rwbyte\r
+               ror temp2  ;first bit in C\r
+               rol rwbyte ;C in first bit \r
+               inc smode\r
+               ldi bitp,0x40\r
+               ldi mode,OWM_SEARCH_ROM_R  ;next mod Resive\r
+               ret\r
+\r
+\r
+pro_search_rom_s:\r
+               clr temp2\r
+               lsr srbyte ;shift in C lowest bit\r
+               ror temp2  ; shift in temp2 as highest bit\r
+               andi rwbyte,0x80  ;  clear other bits\r
+               eor temp2,rwbyte\r
+               breq pro_search_rom_s_goon\r
+               ldi mode,OWM_SLEEP\r
+               ret\r
+pro_search_rom_s_goon:\r
+               inc bytep\r
+               mov temp2,bytep\r
+               andi temp2,0x07\r
+               brne pro_serchrom_next_bit ;prepare next bit\r
+               mov temp2,bytep\r
+               andi temp2,0x40 ;;end\r
+               brne pro_search_rom_found\r
+               ;read next byte\r
+               ld srbyte,X+\r
+               rjmp pro_serchrom_next_bit\r
+\r
+pro_search_rom_found:\r
+               ldi mode,OWM_READ_COMMAND\r
+               rjmp pro_out_bytep0\r
+\r
+pro_search_rom_r:\r
+               clr smode\r
+               ldi mode,OWM_SEARCH_ROM_S\r
+               ldi bitp,0  ;go to searchrom_s after bit get\r
+               ret\r
+\r
+pro_owid: .DB  0xA3, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xFA\r
+\r
+\r
+\r
+\r
+\r
+wait_time:\r
+               out TCNT0,zero\r
+wait_time1:\r
+               in temp,TCNT0\r
+               cp temp,param\r
+               brlo wait_time1\r
+               ret\r
+\r
+\r
+.DSEG\r
+sowid: .BYTE 8\r
 scratchpad: .BYTE 66
\ No newline at end of file