VOC Optimation
[owSlave2.git] / common / OWRomFunctionsDual.s
1 // Copyright (c) 2015, Tobias Mueller tm(at)tm3d.de\r
2 // All rights reserved. \r
3 // \r
4 // Redistribution and use in source and binary forms, with or without \r
5 // modification, are permitted provided that the following conditions are \r
6 // met: \r
7 // \r
8 //  * Redistributions of source code must retain the above copyright \r
9 //    notice, this list of conditions and the following disclaimer. \r
10 //  * Redistributions in binary form must reproduce the above copyright \r
11 //    notice, this list of conditions and the following disclaimer in the \r
12 //    documentation and/or other materials provided with the \r
13 //    distribution. \r
14 //  * All advertising materials mentioning features or use of this \r
15 //    software must display the following acknowledgement: This product \r
16 //    includes software developed by tm3d.de and its contributors. \r
17 //  * Neither the name of tm3d.de nor the names of its contributors may \r
18 //    be used to endorse or promote products derived from this software \r
19 //    without specific prior written permission. \r
20 // \r
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR \r
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY \r
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \r
32 \r
33 \r
34 \r
35 .macro cjmp val,addr\r
36         cpi r_rwbyte,\val\r
37         breq \addr\r
38 .endm\r
39 .macro cljmp val,addr; Weiter sprung, wenn das ziel zu weit entfernt fuer brxx\r
40         cpi r_rwbyte,\val\r
41         brne 1f\r
42         rjmp \addr\r
43 1:\r
44 .endm\r
45 \r
46 .macro cset val,mod ;Nur der Mode wird gesetzt. Abkuerzung da oft nur das noch bleibt\r
47         cpi r_rwbyte,\val\r
48         brne 1f\r
49         ldi r_mode,\mod\r
50         rjmp handle_end\r
51 1:\r
52 .endm\r
53 \r
54 \r
55 \r
56 \r
57 #define OW_SLEEP 0\r
58 #define OW_READ_ROM_COMMAND 1\r
59 #define OW_MATCHROM 2\r
60 #define OW_SEARCHROMS 3  ;next send two bit\r
61 #define OW_SEARCHROMR 4  ; next resive master answer\r
62 #define OW_READ_COMMAND1 5\r
63 #define OW_READ_COMMAND2 6\r
64 #define OW_FWCONFIGINFO1 7\r
65 #define OW_FWCONFIGINFO2 8\r
66 \r
67 .comm idtable,64\r
68 \r
69 #ifdef _CHANGEABLE_ID_\r
70 #define OW_WRITE_NEWID 9\r
71 #define OW_READ_NEWID 10\r
72 #define OW_SET_NEWID 11\r
73 #define OW_FIRST_COMMAND 12\r
74 .comm newid,8\r
75        \r
76 .macro CHANGE_ID_COMMANDS\r
77         cset 0x75,OW_WRITE_NEWID\r
78         cljmp 0xA7,hrc_set_readid\r
79         cljmp 0x79,hrc_set_setid\r
80 .endm\r
81 \r
82 \r
83 #else\r
84 #define OW_FIRST_COMMAND 9\r
85 #endif\r
86 \r
87 #ifndef _DIS_FLASH_\r
88 ; test auf run flasher command 0x88 in h_readcommand\r
89 .macro FLASH_COMMANDS\r
90         cpi r_rwbyte,0x88\r
91         brne 1f\r
92         rjmp hrc_jmp_flasher\r
93 1: ldi r_temp,0 ;Anderes Kommando flashmarker zuruecksetzen...\r
94         sts flashmarker,r_temp\r
95 .endm\r
96 #endif\r
97 \r
98 \r
99 .macro FW_CONFIG_INFO1\r
100         cljmp 0x85,hrc_fw_configinfo1\r
101 .endm\r
102 .macro FW_CONFIG_INFO2\r
103         cljmp 0x85,hrc_fw_configinfo2\r
104 .endm\r
105 \r
106 #ifdef _CHANGEABLE_ID_\r
107 ; lesen der ID aus dem EEPROM beim Start\r
108 read_EEPROM_ID1:  \r
109         ldi r_temp2,lo8(E2END)\r
110         ldi zh,hi8(E2END)\r
111         subi r_temp2,7\r
112         out _SFR_IO_ADDR(EEARH), zh\r
113         ldi r_bytep,0\r
114         ldi  zl,lo8(owid1)       \r
115     ldi  zh,hi8(owid1)\r
116         rjmp read_EEPROM_ID_loop\r
117 read_EEPROM_ID2:  \r
118         ldi r_temp2,lo8(E2END)\r
119         ldi zh,hi8(E2END)\r
120         subi r_temp2,15\r
121         out _SFR_IO_ADDR(EEARH), zh\r
122         ldi r_bytep,0\r
123         ldi  zl,lo8(owid2)       \r
124     ldi  zh,hi8(owid2)\r
125 read_EEPROM_ID_loop:\r
126         sbic _SFR_IO_ADDR(EECR), EEPE\r
127         rjmp read_EEPROM_ID_loop\r
128         out _SFR_IO_ADDR(EEARL),r_temp2\r
129         sbi _SFR_IO_ADDR(EECR), EERE\r
130         in r_rwbyte,_SFR_IO_ADDR(EEDR)\r
131         cpi r_rwbyte,0xFF\r
132         breq read_EEPROM_ID_end\r
133         st Z+,r_rwbyte\r
134         inc r_bytep\r
135         inc r_temp2\r
136         cpi r_bytep,8\r
137         brne read_EEPROM_ID_loop\r
138 read_EEPROM_ID_end:\r
139         ret\r
140 #endif\r
141 \r
142 \r
143 \r
144 \r
145 \r
146 \r
147 \r
148 handle_stable: \r
149                 rjmp handle_end_no_bcount // sleep eventuell reset, nichts tun und auf Timeout warten\r
150                 rjmp h_readromcommand \r
151                 rjmp h_matchrom \r
152                 rjmp h_searchroms \r
153                 rjmp h_searchromr\r
154                 rjmp h_readcommand1 \r
155                 rjmp h_readcommand2\r
156                 rjmp h_fwconfiginfo1\r
157                 rjmp h_fwconfiginfo2\r
158 #ifdef _CHANGEABLE_ID_\r
159                 rjmp h_writeid\r
160                 rjmp h_readid\r
161                 rjmp h_setid\r
162 #endif\r
163                 COMMAND_TABLE\r
164 \r
165 \r
166 \r
167 h_readromcommand:\r
168         clr r_bytep\r
169         cjmp 0x55,hrc_set_matchrom\r
170         cjmp 0xF0,hrc_set_searchrom\r
171         cjmp 0xEC,hrc_set_alarm_search\r
172         \r
173         rjmp handle_end_sleep\r
174 \r
175 #ifndef _DIS_FLASH_\r
176 ;sprung zum flasher\r
177 hrc_jmp_flasher:\r
178         lds r_temp,flashmarker\r
179         cpi r_temp,2\r
180         brne hrc_jmp_flasher_inc\r
181         ldi r_temp,0xC0\r
182         push r_temp\r
183         ldi r_temp,0x0E\r
184         push r_temp\r
185         ret ; Direkter Sprung zum Bootloader\r
186 hrc_jmp_flasher_inc:\r
187         inc r_temp\r
188         sts flashmarker,r_temp\r
189         rjmp handle_end_sleep\r
190 #endif\r
191 \r
192 hrc_set_matchrom:\r
193         ldi r_temp,3\r
194         sts srbyte,r_temp ; Beide geraete nehmen an searchrom teil\r
195         ldi r_mode,OW_MATCHROM\r
196         rjmp handle_end\r
197 \r
198 \r
199 \r
200 hrc_set_searchrom:      \r
201         ldi r_temp,3\r
202         sts srbyte,r_temp ; Beide geraete nehmen an searchrom teil\r
203         configZ idtable,r_bytep\r
204         rjmp h_searchrom_next_bit\r
205 \r
206 hrc_start_read_command: ;Skip rom und Matchrom ok...\r
207         lds r_temp,srbyte\r
208         cpi r_temp,1\r
209         breq hrc_start_read_command1\r
210         cpi r_temp,2\r
211         breq hrc_start_read_command2\r
212         rjmp handle_end_sleep\r
213         CRCInit1\r
214 hrc_start_read_command1:\r
215         ldi r_mode,OW_READ_COMMAND1\r
216         rjmp handle_end\r
217 hrc_start_read_command2:\r
218         ldi r_mode,OW_READ_COMMAND2\r
219         rjmp handle_end\r
220 \r
221 \r
222 hrc_set_alarm_search:\r
223         lds r_temp,alarmflag\r
224         tst r_temp\r
225         brne hrc_set_searchrom ;alarm flag nicht 0 also gehe zu searchrom\r
226         ; sonst tue nichts\r
227         rjmp handle_end_sleep\r
228 \r
229 hrc_fw_configinfo1:\r
230         ldi r_mode,OW_FWCONFIGINFO1\r
231         ldi r_sendflag,1\r
232         CRCInit2\r
233         rjmp h_fwconfiginfo1\r
234 \r
235 hrc_fw_configinfo2:\r
236         ldi r_mode,OW_FWCONFIGINFO2\r
237         ldi r_sendflag,1\r
238         CRCInit2\r
239         rjmp h_fwconfiginfo2\r
240 \r
241 \r
242 ;---------------------------------------------------\r
243 ;   MATCH ROM\r
244 ;---------------------------------------------------\r
245         \r
246 \r
247 h_matchrom:\r
248         lds r_bcount,srbyte\r
249         sbrs r_bcount,0 ;ueberspringe wenn bit 1 =0 also geraet 1 nich mehr im rennen\r
250         rjmp h_matchrom_id2\r
251         configZ owid1,r_bytep\r
252         ld r_temp2,Z\r
253         cp r_temp2,r_rwbyte\r
254         breq h_matchrom_id2\r
255         cbr r_bcount,1 ; loesche geraet\r
256         breq h_matchrom_sleep\r
257 h_matchrom_id2:\r
258         configZ owid2,r_bytep\r
259         ld r_temp2,Z\r
260         cp r_temp2,r_rwbyte\r
261         breq hmr_next_byte\r
262         cbr r_bcount,2 ; loesche geraet\r
263         breq h_matchrom_sleep\r
264 \r
265 hmr_next_byte:\r
266         sts srbyte,r_bcount\r
267         cpi r_bytep,7\r
268         breq hrc_start_read_command ;Starten von Read Command\r
269         rjmp handle_end_inc\r
270 \r
271 h_matchrom_sleep:\r
272         sts srbyte,r_bcount\r
273         rjmp handle_end_sleep\r
274 \r
275 \r
276 ;---------------------------------------------------\r
277 ;   SEARCH ROM\r
278 ;---------------------------------------------------\r
279 \r
280 \r
281 h_searchrom_next_bit:  ;Setup next Bit of ID\r
282         ld r_temp2,Z\r
283         lds r_temp,srbyte  ;srbyte ist ein zeiger auf die bits fuer ein bit im Table\r
284 h_searchrom_next_bit_l2:\r
285         cpi r_temp,3\r
286         breq h_searchrom_next_bit_l1\r
287         lsr r_temp2\r
288         lsr r_temp2\r
289         inc r_temp\r
290         rjmp h_searchrom_next_bit_l2\r
291 h_searchrom_next_bit_l1:\r
292         lsr r_temp2\r
293         rol r_rwbyte  ; negiertes bit in rwbyte\r
294         lsr r_temp2\r
295         rol r_rwbyte  ; bit in rwbyte\r
296         ldi r_sendflag,1\r
297         ldi r_bcount,0x40 ; zwei bits sensden dann zu Searchromr \r
298         ldi r_mode,OW_SEARCHROMR\r
299         rjmp handle_end_no_bcount\r
300 \r
301 \r
302 \r
303 h_searchroms:  ; Modus Send zwei bit\r
304         configZ idtable,r_bytep\r
305         ld r_temp2,Z+\r
306         lds r_temp,srbyte\r
307         cpi r_temp,3\r
308         breq h_searchroms_idd\r
309         cpi r_temp,1\r
310         breq h_searchroms_id1\r
311         cpi r_temp,2\r
312         breq h_searchroms_id2\r
313         rjmp handle_end_sleep ; zur Sicherheit.....\r
314 h_searchroms_idd:\r
315         andi r_rwbyte,0x80\r
316         breq h_searchroms_idd_zero\r
317         ; Master send 1\r
318         sbrc r_temp2,0 ;springe wenn nicht beide bits 0 (id 1 negiert und id 2 negiert)\r
319         rjmp handle_end_sleep ;\r
320         sbrc r_temp2,4  ;id1 set? then skip\r
321         cbr r_temp,1  ; loesche bit 1 in srbyte\r
322         sbrc r_temp2,2 ; springe wenn id 2 gesetzt ist\r
323         cbr r_temp,2 ;  loesche bit 2 in srbyte \r
324         sts srbyte,r_temp\r
325         rjmp h_searchroms_idX_end\r
326 h_searchroms_idd_zero:\r
327         sbrc r_temp2,1 ;springe wenn nicht beide 1 (id 1  und id 2 )\r
328         rjmp handle_end_sleep ;beide 1 gehe schlafen\r
329         sbrs r_temp2,4  ;id1 0? then skip\r
330         cbr r_temp,1  ; loesche bit 1 in srbyte\r
331         sbrs r_temp2,2 ; springe wenn id 2  null ist\r
332         cbr r_temp,2  ; loesche bit 2 in srbyte\r
333         sts srbyte,r_temp\r
334         rjmp h_searchroms_idX_end\r
335 h_searchroms_id1:\r
336         andi r_rwbyte,0x80\r
337         breq h_searchroms_id1_zero\r
338         ; Master send 1\r
339         sbrs r_temp2,5  ;id1 set? then skip\r
340         rjmp handle_end_sleep ;\r
341         rjmp h_searchroms_idX_end\r
342 h_searchroms_id1_zero:          \r
343         sbrs r_temp2,4  ;id1 set? then skip\r
344         rjmp handle_end_sleep ;\r
345         rjmp h_searchroms_idX_end\r
346 h_searchroms_id2:\r
347         andi r_rwbyte,0x80\r
348         breq h_searchroms_id2_zero\r
349         ; Master send 1\r
350         sbrs r_temp2,3  ;id1 set? then skip\r
351         rjmp handle_end_sleep ;\r
352         rjmp h_searchroms_idX_end\r
353 h_searchroms_id2_zero:          \r
354         sbrs r_temp2,2  ;id1 set? then skip\r
355         rjmp handle_end_sleep ;\r
356         rjmp h_searchroms_idX_end\r
357 h_searchroms_idX_end:\r
358         lds r_temp,srbyte\r
359         tst r_temp\r
360         brne h_searchroms_idX_end1\r
361         rjmp handle_end_sleep\r
362 h_searchroms_idX_end1:\r
363         inc r_bytep\r
364         cpi r_bytep,64\r
365         breq h_searchrom_end_ok  ;unterschied nur das letzt bit wird wohl nie vorkommen\r
366         rjmp h_searchrom_next_bit\r
367 \r
368 h_searchrom_end_ok:\r
369         clr r_sendflag\r
370         rjmp hrc_start_read_command\r
371 \r
372 h_searchromr:  ; stelle um auf empfangen\r
373         clr r_sendflag\r
374         ldi r_mode,OW_SEARCHROMS\r
375         ldi r_bcount,0  ;gehe nach einem bit zu SEARCHROMS\r
376         rjmp handle_end_no_bcount\r
377 \r
378 \r
379 ;---------------------------------------------------\r
380 ;   FW_CONFIG_INFO\r
381 ;---------------------------------------------------\r
382 \r
383 h_fwconfiginfo1:\r
384         configZ config_info1,r_bytep\r
385         rjmp h_fwconfiginfo_go\r
386 h_fwconfiginfo2:\r
387         configZ config_info2,r_bytep\r
388 \r
389 h_fwconfiginfo_go:\r
390         cpi  r_bytep,16\r
391         breq h_fwconfiginfo_crc\r
392 #ifdef _CRC8_\r
393         cpi  r_bytep,17\r
394         breq h_fwconfiginfo_all\r
395 #elif defined _CRC16_\r
396         cpi  r_bytep,17\r
397         breq h_fwconfiginfo_crc2\r
398         cpi  r_bytep,18\r
399         breq h_fwconfiginfo_all\r
400 #else\r
401         cpi  r_bytep,16\r
402         breq h_fwconfiginfo_all\r
403 #warning No CRC known code implemented\r
404 #endif\r
405         ld   r_rwbyte,Z\r
406         rjmp handle_end_inc\r
407 h_fwconfiginfo_crc:\r
408         lds r_rwbyte,crc\r
409         rjmp handle_end_inc\r
410 h_fwconfiginfo_crc2:\r
411         lds r_rwbyte,crc+1\r
412         rjmp handle_end_inc\r
413 h_fwconfiginfo_all:\r
414         rjmp handle_end_sleep\r
415 \r
416 \r
417 ;---------------------------------------------------\r
418 ;   CHANGE ROM FUNCTIONS\r
419 ;---------------------------------------------------\r
420 \r
421 \r
422 #ifdef _CHANGEABLE_ID_\r
423 \r
424 h_writeid:\r
425         configZ newid,r_bytep\r
426         st   Z,r_rwbyte\r
427         cpi  r_bytep,7\r
428         breq h_writeid_all\r
429         rjmp handle_end_inc\r
430 h_writeid_all:\r
431         rjmp handle_end_sleep\r
432 \r
433 \r
434 hrc_set_readid:\r
435         ldi r_mode,OW_READ_NEWID\r
436         ldi r_sendflag,1\r
437 h_readid:\r
438         cpi  r_bytep,8\r
439         breq h_readid_all\r
440         configZ newid,r_bytep\r
441         ld   r_rwbyte,Z\r
442         rjmp handle_end_inc\r
443 h_readid_all:\r
444         clr  r_sendflag\r
445         rjmp handle_end_sleep\r
446 \r
447 hrc_set_setid:\r
448         ldi r_mode,OW_SET_NEWID\r
449         ;ldi r_bytep,1 ;start to write in 2\r
450         rjmp handle_end_inc ;set r_bytep to 1!!!\r
451 \r
452 h_setid:\r
453         lds r_bcount,srbyte\r
454         cpi r_bcount,2\r
455         breq h_setid2\r
456 h_setid1:\r
457         configZ owid1,r_bytep\r
458         rjmp h_setido\r
459 h_setid2:\r
460         configZ owid2,r_bytep\r
461 h_setido:\r
462         ld r_temp,Z\r
463         cp r_rwbyte,r_temp\r
464         brne h_setid_bad_code_all\r
465         cpi r_bytep,1\r
466         breq h_setid_set2\r
467         cpi r_bytep,5 \r
468         breq h_setid_set3\r
469         cpi r_bytep,6\r
470         breq h_setid_copy_id\r
471         rjmp h_setid_bad_code_all ;sollte eigentlich nicht passieren\r
472 h_setid_set2:\r
473         ldi r_temp,3\r
474         add r_bytep,r_temp\r
475 h_setid_set3:\r
476         inc r_bytep\r
477         rjmp handle_end\r
478 h_setid_copy_id:\r
479         ldi r_temp2,lo8(E2END)\r
480         ldi zh,hi8(E2END)\r
481         ldi r_temp,7\r
482         sbrc r_bcount,1\r
483         ldi r_temp,15\r
484         sub r_temp2,r_temp\r
485         ;ldi r_temp,0 ;kommt nicht vor das ein E2ROM genau n*256+(0 bis 7) byte gross ist\r
486         ;sbc zh\r
487         out _SFR_IO_ADDR(EEARH),zh\r
488         ldi zl,lo8(newid)\r
489         ldi zh,hi8(newid)\r
490         ldi r_bytep,0\r
491 h_setid_EEPROM_write:\r
492         sbic _SFR_IO_ADDR(EECR), EEPE   \r
493         rjmp h_setid_EEPROM_write\r
494         ldi r_temp, (0<<EEPM1)|(0<<EEPM0)\r
495         out _SFR_IO_ADDR(EECR), r_temp\r
496         ;nur adresse L schreiben H bleibt aus oben genannten grund gleich.\r
497         out _SFR_IO_ADDR(EEARL),r_temp2\r
498         ld  r_rwbyte,Z+\r
499         out _SFR_IO_ADDR(EEDR), r_rwbyte\r
500         sbi _SFR_IO_ADDR(EECR), EEMPE\r
501         sbi _SFR_IO_ADDR(EECR), EEPE\r
502         inc r_bytep\r
503         inc r_temp2\r
504         cpi r_bytep,8\r
505         brne h_setid_EEPROM_write\r
506         //rcall read_EEPROM_ID1\r
507         //rcall read_EEPROM_ID2\r
508         push r_idm1\r
509         push r_idm2\r
510         push xl\r
511         push xh\r
512         rcall init_idtable\r
513         pop xh\r
514         pop xl\r
515         pop r_idm2\r
516         pop r_idm1\r
517 h_setid_bad_code_all:\r
518         rjmp handle_end_sleep\r
519 \r
520 \r
521 \r
522 #endif\r
523 \r
524 \r
525 spause:\r
526         nop\r
527         nop\r
528         nop\r
529         nop\r
530         ret\r
531 \r
532 \r
533 .global OWINIT\r
534 OWINIT:\r
535         \r
536 #ifndef _DIS_FLASH_\r
537 ; check for bootloader jumper\r
538         ;vor allen anderen Registerconfigs\r
539         push r_temp\r
540 \r
541         ldi r_temp,(1<<PUD) ;enable pullup \r
542         out _SFR_IO_ADDR(MCUCR) ,r_temp\r
543         sbi _SFR_IO_ADDR(PORTA),PINA5 ;internal pullup on PINA5\r
544         sbi _SFR_IO_ADDR(PORTA),PINA4 ;internal pullup on PINA4\r
545         rcall spause\r
546         sbis _SFR_IO_ADDR(PINA),PINA5\r
547         rjmp owinit_botest_end  ;PinA5 nicht auf 1\r
548         sbis _SFR_IO_ADDR(PINA),PINA4\r
549         rjmp owinit_botest_end ;PinA4 nicht auf 1\r
550         cbi _SFR_IO_ADDR(PORTA),PINA4 \r
551         sbi _SFR_IO_ADDR(DDRA),PINA4  ;PINA4 AUSGANG und 0\r
552         rcall spause\r
553         sbic _SFR_IO_ADDR(PINA),PINA5 \r
554         rjmp owinit_botest_end ;PINA5 nicht 0.... nicht verbunden\r
555         cbi _SFR_IO_ADDR(DDRA),PINA4\r
556         ldi r_temp,0xC0\r
557         push r_temp\r
558         ldi r_temp,0x0E\r
559         push r_temp\r
560         ret ; Direkter Sprung zum Bootloader*/\r
561 owinit_botest_end:\r
562 #endif\r
563         HW_INIT  //Microcontroller specific\r
564         CHIP_INIT //1-Wire device specific\r
565         pop r_temp\r
566 init_idtable:\r
567         push yl\r
568         push yh\r
569         push r_temp\r
570         push r_rwbyte\r
571         push r_idn1\r
572         push r_idn2\r
573 #ifdef _CHANGEABLE_ID_\r
574         rcall read_EEPROM_ID1\r
575         rcall read_EEPROM_ID2\r
576 #endif\r
577         ldi r_bytep,8\r
578         ldi r_temp,0\r
579         ldi  zl,lo8(idtable)\r
580     ldi  zh,hi8(idtable)\r
581         ldi  xl,lo8(owid1)\r
582         ldi  xh,hi8(owid1)\r
583         ldi      yl,lo8(owid2)\r
584         ldi  yh,hi8(owid2)\r
585 owinit_odgen1:\r
586         ld r_idm1,X+\r
587         ld r_idm2,Y+\r
588         mov r_idn1,r_idm1\r
589         com r_idn1\r
590         mov r_idn2,r_idm2\r
591         com r_idn2\r
592         ldi r_bcount,8\r
593         mov r_temp,r_idm1\r
594         and r_temp,r_idm2\r
595         mov r_temp2,r_idn1\r
596         and r_temp2,r_idn2\r
597 owinit_odgen2:\r
598         ldi r_mode,0\r
599         lsr r_idm1\r
600         rol r_mode  ;6. Bit id1 \r
601         lsr r_idn1  \r
602         rol r_mode ; 5. Bit id1negiert\r
603         lsr r_idm2\r
604         rol r_mode  ;;4. Bit id2 \r
605         lsr r_idn2  \r
606         rol r_mode  ;3. Bit id2 negiert\r
607         lsr r_temp \r
608         rol r_mode ;zweites bit  id1 und id2\r
609         lsr r_temp2\r
610         rol r_mode   ;erstes bit id1 negiert und id2  negiert\r
611         st  Z+,r_mode\r
612         dec r_bcount\r
613         brne owinit_odgen2\r
614         dec r_bytep\r
615         brne owinit_odgen1\r
616         ;copy ids in config bytes\r
617         ldi  xl,lo8(owid1)\r
618         ldi  xh,hi8(owid1)\r
619         ldi      yl,lo8(config_info2+9)\r
620         ldi  yh,hi8(config_info2+9)\r
621         ldi r_temp,7\r
622 owinit_cpconfig1:\r
623         ld r_rwbyte,X+\r
624         st Y+,r_rwbyte\r
625         dec r_temp\r
626         brne owinit_cpconfig1\r
627         ldi  xl,lo8(owid2)\r
628         ldi  xh,hi8(owid2)\r
629         ldi      yl,lo8(config_info1+9)\r
630         ldi  yh,hi8(config_info1+9)\r
631         ldi r_temp,7\r
632 owinit_cpconfig2:\r
633         ld r_rwbyte,X+\r
634         st Y+,r_rwbyte\r
635         dec r_temp\r
636         brne owinit_cpconfig2\r
637 \r
638 \r
639         ldi r_temp,0\r
640         sts mode,r_temp\r
641         sts bcount,r_temp\r
642         sts alarmflag,r_temp\r
643         RESETZEROMARKER\r
644         pop r_idn2\r
645         pop r_idn1\r
646         pop r_rwbyte\r
647         pop r_temp\r
648         pop yh\r
649         pop yl\r
650         \r
651         ret\r
652 \r
653 .global EXTERN_SLEEP\r
654 EXTERN_SLEEP:\r
655         cli\r
656         push r_temp\r
657         ldi r_temp,0\r
658         sts mode,r_temp ;SLEEP\r
659         sts gcontrol,r_temp\r
660         sts sendflag,r_temp\r
661         sts bcount,r_temp\r
662         RESETZEROMARKER\r
663         pop r_temp\r
664         sei\r
665         ret