Initial import of onewire-to-usb bridge
[onewire] / disassembly / listing.disasm
1 Disassembly Listing for uart test
2 Generated From:
3 /home/justin/MPLABXProjects/uart test.X/dist/XC8_12F1840/production/uart_test.X.production.cof
4 10-Jun-2013 16:52:45
5
6 ---  /home/justin/MPLABXProjects/uart test.X/user.c  ----------------------------------------------------
7 1:             /******************************************************************************/
8 2:             /* Files to Include                                                           */
9 3:             /******************************************************************************/
10 4:             
11 5:             #if defined(__XC)
12 6:                 #include <xc.h>         /* XC8 General Include File */
13 7:             #elif defined(HI_TECH_C)
14 8:                 #include <htc.h>        /* HiTech General Include File */
15 9:             #endif
16 10:            
17 11:            #include <stdint.h>         /* For uint8_t definition */
18 12:            #include <stdbool.h>        /* For true/false definition */
19 13:            
20 14:            #include "system.h"
21 15:            #include "user.h"
22 16:            
23 17:            /******************************************************************************/
24 18:            /* User Functions                                                             */
25 19:            /******************************************************************************/
26 20:            
27 21:            /* <Initialize variables in user.h and insert code for user algorithms.> */
28 22:            
29 23:            void InitApp(void)
30 24:            {
31 25:                /* TODO Initialize User Ports/Peripherals/Project here */
32 26:                
33 27:                /* configure 4MHz mode */
34 28:                OSCCONbits.SPLLEN = 0;
35 0BCE  0021     MOVLB 0x1
36 0BCF  1399     BCF T1GCON, 0x7
37 29:                OSCCONbits.IRCF = 0b1101;
38 0BD0  0819     MOVF T1GCON, W
39 0BD1  3987     ANDLW 0x87
40 0BD2  3868     IORLW 0x68
41 0BD3  0099     MOVWF T1GCON
42 30:                OSCCONbits.SCS = 0b00;
43 0BD4  30FC     MOVLW 0xFC
44 0BD5  0599     ANDWF T1GCON, F
45 31:                
46 32:                /* Enabling transmitter 26.1.1.1 page 259 - TX/CK I/O pin */
47 33:                TXSTAbits.TXEN = 1;
48 0BD6  0023     MOVLB 0x3
49 0BD7  169E     BSF CPSCON0, 0x5
50 34:                TXSTAbits.SYNC = 0;
51 0BD8  121E     BCF CPSCON0, 0x4
52 35:                RCSTAbits.SPEN = 1;
53 0BD9  179D     BSF 0x1D, 0x7
54 36:                /* Enabling receiver 26.1.2 page 262 - RX/DT I/O pin */
55 37:                RCSTAbits.CREN = 1;
56 0BDA  161D     BSF 0x1D, 0x4
57 38:            
58 39:                /* 4MHz clock, 19k2 baud */
59 40:                TXSTAbits.BRGH = 0;
60 0BDB  111E     BCF CPSCON0, 0x2
61 41:                BAUDCONbits.BRG16 = 1;
62 0BDC  159F     BSF CPSCON1, 0x3
63 42:                SPBRG = 12;
64 0BDD  300C     MOVLW 0xC
65 0BDE  009B     MOVWF PR2
66 43:            
67 44:                /* Select pins 4&5 as the uart - page 102 */
68 45:                APFCONbits.RXDTSEL = 1; /* RX/DT on RA5 */
69 0BDF  0022     MOVLB 0x2
70 0BE0  179D     BSF 0x1D, 0x7
71 46:                APFCONbits.TXCKSEL = 1; /* TX/CK on RA4 */
72 0BE1  151D     BSF 0x1D, 0x2
73 47:                TRISAbits.TRISA5 = 1;   /* RA5 as input  */
74 0BE2  0021     MOVLB 0x1
75 0BE3  168C     BSF PORTA, 0x5
76 48:                TRISAbits.TRISA4 = 0;   /* RA4 as output */
77 0BE4  120C     BCF PORTA, 0x4
78 49:            
79 50:                ANSELA = 0; /* no analog */
80 0BE5  0023     MOVLB 0x3
81 0BE6  018C     CLRF PORTA
82 51:            
83 52:            
84 53:                /* enable weak pullups, clear them all */
85 54:                WPUA = 0;
86 0BE7  0024     MOVLB 0x4
87 0BE8  018C     CLRF PORTA
88 55:                //WPUAbits.WPUA0 = 0x00000100; // RA0 pullup for 1-wire bus
89 56:                OPTION_REGbits.nWPUEN = 1;
90 0BE9  0021     MOVLB 0x1
91 0BEA  1795     BSF TMR0, 0x7
92 57:            
93 58:                /* Enable interrupts */
94 59:                INTCONbits.GIE = 1;
95 0BEB  178B     BSF INTCON, 0x7
96 60:                INTCONbits.PEIE = 1;
97 0BEC  170B     BSF INTCON, 0x6
98 61:            
99 62:                /* enable uart receiver interupt */
100 63:                PIE1bits.RCIE = 1;
101 0BED  1691     BSF PIR1, 0x5
102 64:            }
103 0BEE  0008     RETURN
104 65:            
105 ---  /home/justin/MPLABXProjects/uart test.X/system.c  --------------------------------------------------
106 1:             /******************************************************************************/
107 2:             /* Files to Include                                                           */
108 3:             /******************************************************************************/
109 4:             
110 5:             #if defined(__XC)
111 6:                 #include <xc.h>         /* XC8 General Include File */
112 7:             #elif defined(HI_TECH_C)
113 8:                 #include <htc.h>        /* HiTech General Include File */
114 9:             #endif
115 10:            
116 11:            #include <stdint.h>        /* For uint8_t definition */
117 12:            #include <stdbool.h>       /* For true/false definition */
118 13:            
119 14:            #include "system.h"
120 15:            
121 16:            /* Refer to the device datasheet for information about available
122 17:            oscillator configurations and to compiler documentation for macro details. */
123 18:            void ConfigureOscillator(void)
124 19:            {
125 20:            
126 21:                /*If the PIC12 device has an OSCCAL value, the HiTech Compiler provides
127 22:                a macro called _READ_OSCCAL_DATA which can be loaded using this: */
128 23:            
129 24:                /* TODO Configure OSCCAL if the device has an OSCCAL register */
130 25:            
131 26:            #if 0
132 27:            
133 28:                OSCCAL=_READ_OSCCAL_DATA(); /* _READ_OSCCAL_DATA macro unloads cal memory */
134 29:            
135 30:            #endif
136 31:            
137 32:                /*Not all PIC12 devices require this.
138 33:            
139 34:                /* TODO Add clock switching code if appropriate.  */
140 35:            
141 36:                /* Typical actions in this function are to tweak the oscillator tuning
142 37:                register, select new clock sources, and to wait until new clock sources
143 38:                are stable before resuming execution of the main project. */
144 39:            
145 40:            }
146 0B1F  0008     RETURN
147 ---  /home/justin/MPLABXProjects/uart test.X/onewire.c  -------------------------------------------------
148 1:             /* Dallas 1-Wire bus routines */
149 2:             
150 3:             #if defined(__XC)
151 4:                 #include <xc.h>         /* XC8 General Include File */
152 5:             #elif defined(HI_TECH_C)
153 6:                 #include <htc.h>        /* HiTech General Include File */
154 7:             #endif
155 8:             
156 9:             #include <stdint.h>         /* For uint8_t definition */
157 10:            #include <stdbool.h>        /* For true/false definition */
158 11:            
159 12:            #include "system.h"
160 13:            #include "user.h"
161 14:            #include "onewire.h"
162 15:            
163 16:            // fast way, macros
164 17:            #define OWLOW { PORTAbits.RA2 = 0; TRISAbits.TRISA2 = 0; }
165 18:            #define OWHIGH { PORTAbits.RA2 = 1; TRISAbits.TRISA2 = 0; }
166 19:            #define OWTRI { TRISAbits.TRISA2 = 1; }
167 20:            #define OWREAD (PORTAbits.RA2)
168 21:            
169 22:            
170 23:            // slow way, causes a function call
171 24:            inline void drive_OW_low(void)
172 25:            {
173 26:                PORTAbits.RA2 = 0;
174 0B2D  0020     MOVLB 0x0
175 0B2E  110C     BCF PORTA, 0x2
176 27:                TRISAbits.TRISA2 = 0;
177 0B2F  0021     MOVLB 0x1
178 0B30  110C     BCF PORTA, 0x2
179 28:            }
180 0B31  0008     RETURN
181 29:            
182 30:            inline void drive_OW_high(void)
183 31:            {
184 32:                PORTAbits.RA2 = 1;
185 0B28  0020     MOVLB 0x0
186 0B29  150C     BSF PORTA, 0x2
187 33:                TRISAbits.TRISA2 = 0;
188 0B2A  0021     MOVLB 0x1
189 0B2B  110C     BCF PORTA, 0x2
190 34:            }
191 0B2C  0008     RETURN
192 35:            
193 36:            inline void float_OW(void)
194 37:            {
195 38:                TRISAbits.TRISA2 = 1;
196 04FD  0021     MOVLB 0x1
197 04FE  150C     BSF PORTA, 0x2
198 39:            }
199 04FF  0008     RETURN
200 40:            
201 41:            inline bool read_OW(void)
202 42:            {
203 43:                TRISAbits.TRISA2 = 1;
204 0B32  0021     MOVLB 0x1
205 0B33  150C     BSF PORTA, 0x2
206 44:                return PORTAbits.RA2;
207 0B34  0020     MOVLB 0x0
208 0B35  0C0C     RRF PORTA, W
209 0B36  0C89     RRF WREG, F
210 0B37  3901     ANDLW 0x1
211 0B38  2B39     GOTO 0x339
212 45:            }
213 0B39  0008     RETURN
214 46:            
215 47:            
216 48:            /* start the 1-Wire bus
217 49:             *
218 50:             */
219 51:            void OW_start(void)
220 52:            {
221 53:                //drive_OW_high();
222 54:                float_OW();
223 0B24  3184     MOVLP 0x4
224 0B25  24FD     CALL 0x4FD
225 0B26  318B     MOVLP 0xB
226 55:            }
227 0B27  0008     RETURN
228 56:            
229 57:            /* reset the bus, test for presence signal */
230 58:            bool OW_reset(void)
231 59:            {
232 60:                bool presence = 0;
233 0C37  01F5     CLRF presence
234 61:            
235 62:                OWLOW; //drive_OW_low();
236 0C38  0020     MOVLB 0x0
237 0C39  110C     BCF PORTA, 0x2
238 0C3A  0021     MOVLB 0x1
239 0C3B  110C     BCF PORTA, 0x2
240 63:                DelayUs(250);
241 0C3C  3053     MOVLW 0x53
242 0C3D  00F4     MOVWF i
243 0C3E  0BF4     DECFSZ i, F
244 0C3F  2C3E     GOTO 0x43E
245 64:                DelayUs(250);
246 0C40  3053     MOVLW 0x53
247 0C41  00F4     MOVWF i
248 0C42  0BF4     DECFSZ i, F
249 0C43  2C42     GOTO 0x442
250 65:                OWTRI; //float_OW(); // let it float high
251 0C44  0021     MOVLB 0x1
252 0C45  150C     BSF PORTA, 0x2
253 66:                DelayUs(70);
254 0C46  3017     MOVLW 0x17
255 0C47  00F4     MOVWF i
256 0C48  0BF4     DECFSZ i, F
257 0C49  2C48     GOTO 0x448
258 67:                presence = OWREAD; //read_OW(); // now sample
259 0C4A  3000     MOVLW 0x0
260 0C4B  0020     MOVLB 0x0
261 0C4C  190C     BTFSC PORTA, 0x2
262 0C4D  3001     MOVLW 0x1
263 0C4E  00F5     MOVWF presence
264 68:                DelayUs(215);
265 0C4F  3047     MOVLW 0x47
266 0C50  00F4     MOVWF i
267 0C51  0BF4     DECFSZ i, F
268 0C52  2C51     GOTO 0x451
269 0C53  0000     NOP
270 69:                DelayUs(215);
271 0C54  3047     MOVLW 0x47
272 0C55  00F4     MOVWF i
273 0C56  0BF4     DECFSZ i, F
274 0C57  2C56     GOTO 0x456
275 0C58  0000     NOP
276 70:                
277 71:                return ! presence;
278 0C59  0875     MOVF presence, W
279 0C5A  3A00     XORLW 0x0
280 0C5B  3000     MOVLW 0x0
281 0C5C  1903     BTFSC STATUS, 0x2
282 0C5D  3001     MOVLW 0x1
283 0C5E  2C5F     GOTO 0x45F
284 72:            }
285 0C5F  0008     RETURN
286 73:            
287 74:            void OW_write_bit(bool val)
288 75:            {
289 76:            #if 0  // Maxim dev note 2420
290 77:                drive_OW_low();
291 78:                DelayUs(3);
292 79:                if (val) float_OW();
293 80:                DelayUs(60);
294 81:                float_OW();
295 82:                DelayUs(2);
296 83:            #else
297 84:                OWLOW;
298 0B5C  00F5     MOVWF presence
299 0B5D  0020     MOVLB 0x0
300 0B5E  110C     BCF PORTA, 0x2
301 0B5F  0021     MOVLB 0x1
302 0B60  110C     BCF PORTA, 0x2
303 85:                NOP();
304 0B61  0000     NOP
305 86:                NOP();
306 0B62  0000     NOP
307 87:            //    NOP();  // doc one for other delays
308 88:                if (val) OWTRI;
309 0B63  0875     MOVF presence, W
310 0B64  1D03     BTFSS STATUS, 0x2
311 0B65  2B67     GOTO 0x367
312 0B66  2B6A     GOTO 0x36A
313 0B67  0021     MOVLB 0x1
314 0B68  150C     BSF PORTA, 0x2
315 0B69  2B6A     GOTO 0x36A
316 89:                DelayUs(60);
317 0B6A  3013     MOVLW 0x13
318 0B6B  00F4     MOVWF i
319 0B6C  0BF4     DECFSZ i, F
320 0B6D  2B6C     GOTO 0x36C
321 0B6E  2B6F     GOTO 0x36F
322 90:                OWTRI;
323 0B6F  0021     MOVLB 0x1
324 0B70  150C     BSF PORTA, 0x2
325 91:                NOP();
326 0B71  0000     NOP
327 92:                NOP();
328 0B72  0000     NOP
329 93:            #endif
330 94:            }
331 0B73  0008     RETURN
332 95:            
333 96:            bool OW_read_bit()
334 97:            {
335 98:                bool val;
336 99:            #if 0  /* Maxim dev note 2420 */
337 100:               drive_OW_low();
338 101:               DelayUs(6);
339 102:               float_OW();
340 103:               DelayUs(4);
341 104:               val = read_OW();
342 105:               DelayUs(50);
343 106:           #else
344 107:               OWLOW;
345 0B74  0020     MOVLB 0x0
346 0B75  110C     BCF PORTA, 0x2
347 0B76  0021     MOVLB 0x1
348 0B77  110C     BCF PORTA, 0x2
349 108:           //    NOP();
350 109:               NOP();
351 0B78  0000     NOP
352 110:               NOP();
353 0B79  0000     NOP
354 111:               NOP();
355 0B7A  0000     NOP
356 112:               NOP();
357 0B7B  0000     NOP
358 113:               NOP();
359 0B7C  0000     NOP
360 114:               OWTRI;
361 0B7D  0021     MOVLB 0x1
362 0B7E  150C     BSF PORTA, 0x2
363 115:           //    NOP();
364 116:               NOP();
365 0B7F  0000     NOP
366 117:               NOP();
367 0B80  0000     NOP
368 118:               NOP();
369 0B81  0000     NOP
370 119:               val = read_OW();
371 0B82  318B     MOVLP 0xB
372 0B83  2332     CALL 0x332
373 0B84  318B     MOVLP 0xB
374 0B85  00F4     MOVWF i
375 0B86  0874     MOVF i, W
376 0B87  00F5     MOVWF presence
377 120:               DelayUs(50);
378 0B88  3010     MOVLW 0x10
379 0B89  00F4     MOVWF i
380 0B8A  0BF4     DECFSZ i, F
381 0B8B  2B8A     GOTO 0x38A
382 0B8C  0000     NOP
383 121:               
384 122:           #endif
385 123:               return val;
386 0B8D  0875     MOVF presence, W
387 0B8E  2B8F     GOTO 0x38F
388 124:           }
389 0B8F  0008     RETURN
390 125:           
391 126:           void OW_write_byte(unsigned char byte)
392 127:           {
393 0B90  0020     MOVLB 0x0
394 0B91  00B6     MOVWF p
395 128:               for (char i=8; i!=0; i--)
396 0B92  3008     MOVLW 0x8
397 0B93  00B5     MOVWF in
398 0B94  0835     MOVF in, W
399 0B95  00B7     MOVWF i
400 0B96  08B7     MOVF i, F
401 0B97  1D03     BTFSS STATUS, 0x2
402 0B98  2B9A     GOTO 0x39A
403 0B99  2B9B     GOTO 0x39B
404 0B9A  2B9D     GOTO 0x39D
405 0B9B  2BAD     GOTO 0x3AD
406 0B9C  2BAD     GOTO 0x3AD
407 0BA5  3001     MOVLW 0x1
408 0BA6  02B7     SUBWF i, F
409 0BA7  08B7     MOVF i, F
410 0BA8  1D03     BTFSS STATUS, 0x2
411 0BA9  2BAB     GOTO 0x3AB
412 0BAA  2BAC     GOTO 0x3AC
413 0BAB  2B9D     GOTO 0x39D
414 0BAC  2BAD     GOTO 0x3AD
415 129:               {
416 130:                   OW_write_bit( byte & 0x01 );
417 0B9D  0836     MOVF p, W
418 0B9E  3901     ANDLW 0x1
419 0B9F  318B     MOVLP 0xB
420 0BA0  235C     CALL 0x35C
421 0BA1  318B     MOVLP 0xB
422 131:                   byte >>= 1;
423 0BA2  1003     BCF STATUS, 0x0
424 0BA3  0020     MOVLB 0x0
425 0BA4  0CB6     RRF p, F
426 132:               }
427 133:           }
428 0BAD  0008     RETURN
429 134:           
430 135:           unsigned char OW_read_byte(void)
431 136:           {
432 137:               unsigned char byte = 0;
433 0C11  0020     MOVLB 0x0
434 0C12  01B6     CLRF p
435 138:               for (char i=8; i!=0; i--)
436 0C13  3008     MOVLW 0x8
437 0C14  00B5     MOVWF in
438 0C15  0835     MOVF in, W
439 0C16  00B7     MOVWF i
440 0C17  08B7     MOVF i, F
441 0C18  1D03     BTFSS STATUS, 0x2
442 0C19  2C1B     GOTO 0x41B
443 0C1A  2C1C     GOTO 0x41C
444 0C1B  2C1E     GOTO 0x41E
445 0C1C  2C34     GOTO 0x434
446 0C1D  2C34     GOTO 0x434
447 0C2B  3001     MOVLW 0x1
448 0C2C  0020     MOVLB 0x0
449 0C2D  02B7     SUBWF i, F
450 0C2E  08B7     MOVF i, F
451 0C2F  1D03     BTFSS STATUS, 0x2
452 0C30  2C32     GOTO 0x432
453 0C31  2C33     GOTO 0x433
454 0C32  2C1E     GOTO 0x41E
455 0C33  2C34     GOTO 0x434
456 139:               {
457 140:                   byte >>= 1;
458 0C1E  1003     BCF STATUS, 0x0
459 0C1F  0CB6     RRF p, F
460 141:                   if (OW_read_bit())
461 0C20  318B     MOVLP 0xB
462 0C21  2374     CALL 0x374
463 0C22  318C     MOVLP 0xC
464 0C23  3A00     XORLW 0x0
465 0C24  1903     BTFSC STATUS, 0x2
466 0C25  2C27     GOTO 0x427
467 0C26  2C28     GOTO 0x428
468 0C27  2C2B     GOTO 0x42B
469 142:                       byte |= 0x80;
470 0C28  0020     MOVLB 0x0
471 0C29  17B6     BSF p, 0x7
472 0C2A  2C2B     GOTO 0x42B
473 143:           
474 144:               }
475 145:               return byte;
476 0C34  0836     MOVF p, W
477 0C35  2C36     GOTO 0x436
478 146:           }
479 0C36  0008     RETURN
480 147:           
481 148:           static const unsigned char dscrc_table[] = {
482 149:                0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
483 150:                 157,195, 33,127,252,162, 64, 30, 95,  1,227,189, 62, 96,130,220,
484 151:                  35,125,159,193, 66, 28,254,160,225,191, 93,  3,128,222, 60, 98,
485 152:                 190,224,  2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
486 153:                  70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89,  7,
487 154:                 219,133,103, 57,186,228,  6, 88, 25, 71,165,251,120, 38,196,154,
488 155:                 101, 59,217,135,  4, 90,184,230,167,249, 27, 69,198,152,122, 36,
489 156:                 248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91,  5,231,185,
490 157:                 140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
491 158:                  17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
492 159:                 175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
493 160:                  50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
494 161:                 202,148,118, 40,171,245, 23, 73,  8, 86,180,234,105, 55,213,139,
495 162:                  87,  9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
496 163:                 233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
497 164:                 116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53
498 165:           };
499 166:           
500 167:           unsigned char romid[8];
501 168:           char LastDiscrepancy = 0;
502 169:           char LastFamilyDiscrepancy = 0;
503 170:           char LastDeviceFlag = false;
504 171:           unsigned char crc8;
505 172:           
506 173:           static unsigned char docrc8(unsigned char value)
507 174:           {
508 04ED  00F5     MOVWF presence
509 175:               crc8 = dscrc_table[crc8 ^ value];
510 04EE  0020     MOVLB 0x0
511 04EF  082B     MOVF crc8, W
512 04F0  0675     XORWF presence, W
513 04F1  3E01     ADDLW 0x1
514 04F2  0084     MOVWF FSR0L
515 04F3  3085     MOVLW 0x85
516 04F4  1803     BTFSC STATUS, 0x0
517 04F5  3E01     ADDLW 0x1
518 04F6  0085     MOVWF FSR0H
519 04F7  0800     MOVF INDF0, W
520 04F8  00F4     MOVWF i
521 04F9  0874     MOVF i, W
522 04FA  00AB     MOVWF crc8
523 04FB  2CFC     GOTO 0x4FC
524 176:               return crc8;
525 177:           }
526 04FC  0008     RETURN
527 178:           
528 179:           /* enumerate the devices */
529 180:           bool OW_search()
530 181:           {
531 182:               char id_bit_number = 1;
532 0F0C  0020     MOVLB 0x0
533 0F0D  01BE     CLRF id_bit_number
534 0F0E  0ABE     INCF id_bit_number, F
535 183:               char last_zero = 0;
536 0F0F  01BC     CLRF last_zero
537 184:               char rom_byte_number = 0;
538 0F10  01C0     CLRF rom_byte_number
539 185:               char search_result = 0;
540 0F11  01BA     CLRF search_result
541 186:               unsigned char rom_byte_mask = 1;
542 0F12  01BF     CLRF rom_byte_mask
543 0F13  0ABF     INCF rom_byte_mask, F
544 187:               unsigned char search_direction;
545 188:           
546 189:               crc8 = 0;
547 0F14  01AB     CLRF crc8
548 190:           
549 191:               // do not interrupt us
550 192:               int_disable();
551 0F15  318B     MOVLP 0xB
552 0F16  2322     CALL 0x322
553 0F17  318F     MOVLP 0xF
554 193:           
555 194:               // if the last call was not the last one
556 195:               if (!LastDeviceFlag) {
557 0F18  0020     MOVLB 0x0
558 0F19  08A8     MOVF LastDeviceFlag, F
559 0F1A  1D03     BTFSS STATUS, 0x2
560 0F1B  2F1D     GOTO 0x71D
561 0F1C  2F1E     GOTO 0x71E
562 0F1D  2FD2     GOTO 0x7D2
563 196:                   if (!OW_reset())
564 0F1E  318C     MOVLP 0xC
565 0F1F  2437     CALL 0x437
566 0F20  318F     MOVLP 0xF
567 0F21  3800     IORLW 0x0
568 0F22  1D03     BTFSS STATUS, 0x2
569 0F23  2F25     GOTO 0x725
570 0F24  2F26     GOTO 0x726
571 0F25  2F37     GOTO 0x737
572 197:                   {
573 198:                       msg_write("Reset said nothing there.\r\n");
574 0F26  3048     MOVLW 0x48
575 0F27  00F4     MOVWF i
576 0F28  3087     MOVLW 0x87
577 0F29  00F5     MOVWF presence
578 0F2A  318E     MOVLP 0xE
579 0F2B  2613     CALL 0x613
580 0F2C  318F     MOVLP 0xF
581 199:                       // reset the search
582 200:                       LastDiscrepancy = 0;
583 0F2D  0020     MOVLB 0x0
584 0F2E  01A9     CLRF LastDiscrepancy
585 201:                       LastDeviceFlag = 0;
586 0F2F  01A8     CLRF LastDeviceFlag
587 202:                       LastFamilyDiscrepancy = 0;
588 0F30  01AA     CLRF LastFamilyDiscrepancy
589 203:                       int_enable();
590 0F31  318B     MOVLP 0xB
591 0F32  2320     CALL 0x320
592 0F33  318F     MOVLP 0xF
593 204:                       return 0;
594 0F34  3000     MOVLW 0x0
595 0F35  2FFF     GOTO 0x7FF
596 0F36  2FFF     GOTO 0x7FF
597 205:                   }
598 206:           
599 207:                   // issue the search command
600 208:                   OW_write_byte(0xF0);
601 0F37  30F0     MOVLW 0xF0
602 0F38  318B     MOVLP 0xB
603 0F39  2390     CALL 0x390
604 0F3A  318F     MOVLP 0xF
605 209:           
606 210:                   // loop to do the search
607 211:                   do {
608 212:                       // read a bit and its complement
609 213:                       bool id_bit = OW_read_bit();
610 0F3B  318B     MOVLP 0xB
611 0F3C  2374     CALL 0x374
612 0F3D  318F     MOVLP 0xF
613 0F3E  0020     MOVLB 0x0
614 0F3F  00B8     MOVWF bt
615 0F40  0838     MOVF bt, W
616 0F41  00BB     MOVWF id_bit
617 214:                       DelayUs(6);
618 0F42  2F43     GOTO 0x743
619 0F43  2F44     GOTO 0x744
620 0F44  2F45     GOTO 0x745
621 215:                       bool cmp_id_bit = OW_read_bit();
622 0F45  318B     MOVLP 0xB
623 0F46  2374     CALL 0x374
624 0F47  318F     MOVLP 0xF
625 0F48  0020     MOVLB 0x0
626 0F49  00B8     MOVWF bt
627 0F4A  0838     MOVF bt, W
628 0F4B  00B9     MOVWF cmp_id_bit
629 216:           
630 217:                       // check for no devices on bus
631 218:                       if (id_bit && cmp_id_bit) {
632 0F4C  083B     MOVF id_bit, W
633 0F4D  1D03     BTFSS STATUS, 0x2
634 0F4E  2F50     GOTO 0x750
635 0F4F  2F56     GOTO 0x756
636 0F50  0839     MOVF cmp_id_bit, W
637 0F51  1D03     BTFSS STATUS, 0x2
638 0F52  2F54     GOTO 0x754
639 0F53  2F56     GOTO 0x756
640 0F54  2FD2     GOTO 0x7D2
641 219:                           break;
642 0F55  2FD2     GOTO 0x7D2
643 220:                       }
644 221:           
645 222:                       if (id_bit != cmp_id_bit) {
646 0F56  083B     MOVF id_bit, W
647 0F57  0639     XORWF cmp_id_bit, W
648 0F58  1903     BTFSC STATUS, 0x2
649 0F59  2F5B     GOTO 0x75B
650 0F5A  2F5C     GOTO 0x75C
651 0F5B  2F61     GOTO 0x761
652 223:                           // all devices have a 0 here, or they all have a 1
653 224:                           search_direction = id_bit;
654 0F5C  083B     MOVF id_bit, W
655 0F5D  00B8     MOVWF bt
656 0F5E  0838     MOVF bt, W
657 0F5F  00BD     MOVWF search_direction
658 225:                       } else {
659 0F60  2F92     GOTO 0x792
660 226:                           // both bits zero, so both 0 and 1 exist
661 227:           
662 228:                           // if this discrepancy is before the Last Discrepancy
663 229:                           // on a previous next then pick the same as last time
664 230:                           if (id_bit_number < LastDiscrepancy) {
665 0F61  0829     MOVF LastDiscrepancy, W
666 0F62  023E     SUBWF id_bit_number, W
667 0F63  1803     BTFSC STATUS, 0x0
668 0F64  2F66     GOTO 0x766
669 0F65  2F67     GOTO 0x767
670 0F66  2F74     GOTO 0x774
671 231:                               search_direction = ((romid[rom_byte_number] & rom_byte_mask) > 0);
672 0F67  0840     MOVF rom_byte_number, W
673 0F68  3E20     ADDLW 0x20
674 0F69  0086     MOVWF FSR1L
675 0F6A  0187     CLRF FSR1H
676 0F6B  0801     MOVF INDF1, W
677 0F6C  053F     ANDWF rom_byte_mask, W
678 0F6D  3000     MOVLW 0x0
679 0F6E  1D03     BTFSS STATUS, 0x2
680 0F6F  3001     MOVLW 0x1
681 0F70  00B8     MOVWF bt
682 0F71  0838     MOVF bt, W
683 0F72  00BD     MOVWF search_direction
684 232:                           } else {
685 0F73  2F7D     GOTO 0x77D
686 233:                               // if equal to last pick 1, if not then pick 0
687 234:                               search_direction = (id_bit_number == LastDiscrepancy);
688 0F74  083E     MOVF id_bit_number, W
689 0F75  0629     XORWF LastDiscrepancy, W
690 0F76  3000     MOVLW 0x0
691 0F77  1903     BTFSC STATUS, 0x2
692 0F78  3001     MOVLW 0x1
693 0F79  00B8     MOVWF bt
694 0F7A  0838     MOVF bt, W
695 0F7B  00BD     MOVWF search_direction
696 0F7C  2F7D     GOTO 0x77D
697 235:                           }
698 236:           
699 237:                           // if 0 was picked then record its position in LastZero
700 238:                           if (search_direction == 0)
701 0F7D  08BD     MOVF search_direction, F
702 0F7E  1D03     BTFSS STATUS, 0x2
703 0F7F  2F81     GOTO 0x781
704 0F80  2F82     GOTO 0x782
705 0F81  2F92     GOTO 0x792
706 239:                           {
707 240:                               last_zero = id_bit_number;
708 0F82  083E     MOVF id_bit_number, W
709 0F83  00B8     MOVWF bt
710 0F84  0838     MOVF bt, W
711 0F85  00BC     MOVWF last_zero
712 241:                               // check for last discrepancy in family
713 242:                               if (last_zero < 9)
714 0F86  3009     MOVLW 0x9
715 0F87  023C     SUBWF last_zero, W
716 0F88  1803     BTFSC STATUS, 0x0
717 0F89  2F8B     GOTO 0x78B
718 0F8A  2F8C     GOTO 0x78C
719 0F8B  2F92     GOTO 0x792
720 243:                                   LastFamilyDiscrepancy = last_zero;
721 0F8C  083C     MOVF last_zero, W
722 0F8D  00B8     MOVWF bt
723 0F8E  0838     MOVF bt, W
724 0F8F  00AA     MOVWF LastFamilyDiscrepancy
725 0F90  2F92     GOTO 0x792
726 0F91  2F92     GOTO 0x792
727 244:                           }
728 245:                       }
729 246:           
730 247:                       // set or clear the bit in the ROM byte rom_byte_number
731 248:                       // with mask rom_byte_mask
732 249:                       if (search_direction == 1)
733 0F92  083D     MOVF search_direction, W
734 0F93  3A01     XORLW 0x1
735 0F94  1D03     BTFSS STATUS, 0x2
736 0F95  2F97     GOTO 0x797
737 0F96  2F98     GOTO 0x798
738 0F97  2FA1     GOTO 0x7A1
739 250:                           romid[rom_byte_number] |= rom_byte_mask;
740 0F98  083F     MOVF rom_byte_mask, W
741 0F99  00B8     MOVWF bt
742 0F9A  0840     MOVF rom_byte_number, W
743 0F9B  3E20     ADDLW 0x20
744 0F9C  0086     MOVWF FSR1L
745 0F9D  0187     CLRF FSR1H
746 0F9E  0838     MOVF bt, W
747 0F9F  0481     IORWF INDF1, F
748 0FA0  2FAA     GOTO 0x7AA
749 251:                       else
750 252:                           romid[rom_byte_number] &= ~rom_byte_mask;
751 0FA1  093F     COMF rom_byte_mask, W
752 0FA2  00B8     MOVWF bt
753 0FA3  0840     MOVF rom_byte_number, W
754 0FA4  3E20     ADDLW 0x20
755 0FA5  0086     MOVWF FSR1L
756 0FA6  0187     CLRF FSR1H
757 0FA7  0838     MOVF bt, W
758 0FA8  0581     ANDWF INDF1, F
759 0FA9  2FAA     GOTO 0x7AA
760 253:           
761 254:                       // serial number search direction write bit
762 255:                       OW_write_bit(search_direction);
763 0FAA  083D     MOVF search_direction, W
764 0FAB  318B     MOVLP 0xB
765 0FAC  235C     CALL 0x35C
766 0FAD  318F     MOVLP 0xF
767 256:           
768 257:                       // increment the byte counter id_bit_number
769 258:                       // and shift the mask rom_byte_mask
770 259:                       id_bit_number++;
771 0FAE  3001     MOVLW 0x1
772 0FAF  0020     MOVLB 0x0
773 0FB0  00B8     MOVWF bt
774 0FB1  0838     MOVF bt, W
775 0FB2  07BE     ADDWF id_bit_number, F
776 260:                       rom_byte_mask <<= 1;
777 0FB3  1003     BCF STATUS, 0x0
778 0FB4  0DBF     RLF rom_byte_mask, F
779 261:           
780 262:                       // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask
781 263:                       if (rom_byte_mask == 0)
782 0FB5  08BF     MOVF rom_byte_mask, F
783 0FB6  1D03     BTFSS STATUS, 0x2
784 0FB7  2FB9     GOTO 0x7B9
785 0FB8  2FBA     GOTO 0x7BA
786 0FB9  2FCA     GOTO 0x7CA
787 264:                       {
788 265:                           docrc8(romid[rom_byte_number]); // accumulate the CRC
789 0FBA  0840     MOVF rom_byte_number, W
790 0FBB  3E20     ADDLW 0x20
791 0FBC  0086     MOVWF FSR1L
792 0FBD  0187     CLRF FSR1H
793 0FBE  0801     MOVF INDF1, W
794 0FBF  3184     MOVLP 0x4
795 0FC0  24ED     CALL 0x4ED
796 0FC1  318F     MOVLP 0xF
797 266:                           rom_byte_number++;
798 0FC2  3001     MOVLW 0x1
799 0FC3  0020     MOVLB 0x0
800 0FC4  00B8     MOVWF bt
801 0FC5  0838     MOVF bt, W
802 0FC6  07C0     ADDWF rom_byte_number, F
803 267:                           rom_byte_mask = 1;
804 0FC7  01BF     CLRF rom_byte_mask
805 0FC8  0ABF     INCF rom_byte_mask, F
806 0FC9  2FCA     GOTO 0x7CA
807 268:                       }
808 269:                   } while (rom_byte_number < 8); // loop until all rom bytes 0-7
809 0FCA  3008     MOVLW 0x8
810 0FCB  0240     SUBWF rom_byte_number, W
811 0FCC  1C03     BTFSS STATUS, 0x0
812 0FCD  2FCF     GOTO 0x7CF
813 0FCE  2FD0     GOTO 0x7D0
814 0FCF  2F3B     GOTO 0x73B
815 0FD0  2FD2     GOTO 0x7D2
816 0FD1  2FD2     GOTO 0x7D2
817 270:               } // end of not-last-device
818 271:           
819 272:               // if the search was succesful then
820 273:               if (!(id_bit_number < 65 || crc8 != 0))
821 0FD2  3041     MOVLW 0x41
822 0FD3  023E     SUBWF id_bit_number, W
823 0FD4  1C03     BTFSS STATUS, 0x0
824 0FD5  2FD7     GOTO 0x7D7
825 0FD6  2FD8     GOTO 0x7D8
826 0FD7  2FEB     GOTO 0x7EB
827 0FD8  08AB     MOVF crc8, F
828 0FD9  1D03     BTFSS STATUS, 0x2
829 0FDA  2FDC     GOTO 0x7DC
830 0FDB  2FDD     GOTO 0x7DD
831 0FDC  2FEB     GOTO 0x7EB
832 274:               {
833 275:                   // search successful
834 276:                   LastDiscrepancy = last_zero;
835 0FDD  083C     MOVF last_zero, W
836 0FDE  00B8     MOVWF bt
837 0FDF  0838     MOVF bt, W
838 0FE0  00A9     MOVWF LastDiscrepancy
839 277:           
840 278:                   // check for last device
841 279:                   if (LastDiscrepancy == 0)
842 0FE1  08A9     MOVF LastDiscrepancy, F
843 0FE2  1D03     BTFSS STATUS, 0x2
844 0FE3  2FE5     GOTO 0x7E5
845 0FE4  2FE6     GOTO 0x7E6
846 0FE5  2FE8     GOTO 0x7E8
847 280:                       LastDeviceFlag = true;
848 0FE6  01A8     CLRF LastDeviceFlag
849 0FE7  0AA8     INCF LastDeviceFlag, F
850 281:           
851 282:                   search_result = true;
852 0FE8  01BA     CLRF search_result
853 0FE9  0ABA     INCF search_result, F
854 0FEA  2FEB     GOTO 0x7EB
855 283:               }
856 284:           
857 285:               if (!search_result || !romid[0])
858 0FEB  083A     MOVF search_result, W
859 0FEC  1D03     BTFSS STATUS, 0x2
860 0FED  2FEF     GOTO 0x7EF
861 0FEE  2FF4     GOTO 0x7F4
862 0FEF  08A0     MOVF romid, F
863 0FF0  1D03     BTFSS STATUS, 0x2
864 0FF1  2FF3     GOTO 0x7F3
865 0FF2  2FF4     GOTO 0x7F4
866 0FF3  2FF9     GOTO 0x7F9
867 286:               {
868 287:                   LastDiscrepancy = 0;
869 0FF4  01A9     CLRF LastDiscrepancy
870 288:                   LastDeviceFlag = false;
871 0FF5  01A8     CLRF LastDeviceFlag
872 289:                   LastFamilyDiscrepancy = 0;
873 0FF6  01AA     CLRF LastFamilyDiscrepancy
874 290:                   search_result = false;
875 0FF7  01BA     CLRF search_result
876 0FF8  2FF9     GOTO 0x7F9
877 291:               }
878 292:           
879 293:               int_enable();
880 0FF9  318B     MOVLP 0xB
881 0FFA  2320     CALL 0x320
882 0FFB  318F     MOVLP 0xF
883 294:               return search_result;
884 0FFC  0020     MOVLB 0x0
885 0FFD  083A     MOVF search_result, W
886 0FFE  2FFF     GOTO 0x7FF
887 295:           }
888 296:           
889 297:           
890 298:           void OW_search_init()
891 299:           {
892 300:               LastDiscrepancy = 0;
893 0C8C  0020     MOVLB 0x0
894 0C8D  01A9     CLRF LastDiscrepancy
895 301:               LastDeviceFlag = false;
896 0C8E  01A8     CLRF LastDeviceFlag
897 302:               LastFamilyDiscrepancy = 0;
898 0C8F  01AA     CLRF LastFamilyDiscrepancy
899 303:           
900 304:               for (int j=0; j<8; j++) romid[j]=0;
901 0C90  01F4     CLRF i
902 0C91  01F5     CLRF presence
903 0C92  0875     MOVF presence, W
904 0C93  3A80     XORLW 0x80
905 0C94  00FF     MOVWF 0x7F
906 0C95  3080     MOVLW 0x80
907 0C96  027F     SUBWF 0x7F, W
908 0C97  1D03     BTFSS STATUS, 0x2
909 0C98  2C9B     GOTO 0x49B
910 0C99  3008     MOVLW 0x8
911 0C9A  0274     SUBWF i, W
912 0C9B  1C03     BTFSS STATUS, 0x0
913 0C9C  2C9E     GOTO 0x49E
914 0C9D  2C9F     GOTO 0x49F
915 0C9E  2CA1     GOTO 0x4A1
916 0C9F  2CB8     GOTO 0x4B8
917 0CA0  2CB8     GOTO 0x4B8
918 0CA1  0874     MOVF i, W
919 0CA2  3E20     ADDLW 0x20
920 0CA3  0086     MOVWF FSR1L
921 0CA4  0187     CLRF FSR1H
922 0CA5  0181     CLRF INDF1
923 0CA6  3001     MOVLW 0x1
924 0CA7  07F4     ADDWF i, F
925 0CA8  3000     MOVLW 0x0
926 0CA9  3DF5     ADDWFC presence, F
927 0CAA  0875     MOVF presence, W
928 0CAB  3A80     XORLW 0x80
929 0CAC  00FF     MOVWF 0x7F
930 0CAD  3080     MOVLW 0x80
931 0CAE  027F     SUBWF 0x7F, W
932 0CAF  1D03     BTFSS STATUS, 0x2
933 0CB0  2CB3     GOTO 0x4B3
934 0CB1  3008     MOVLW 0x8
935 0CB2  0274     SUBWF i, W
936 0CB3  1C03     BTFSS STATUS, 0x0
937 0CB4  2CB6     GOTO 0x4B6
938 0CB5  2CB7     GOTO 0x4B7
939 0CB6  2CA1     GOTO 0x4A1
940 0CB7  2CB8     GOTO 0x4B8
941 305:           }
942 0CB8  0008     RETURN
943 306:           
944 307:           
945 308:           /* ask the (lone) device for its Serial number */
946 309:           void OW_identify()
947 310:           {
948 311:               int_disable();
949 0D92  318B     MOVLP 0xB
950 0D93  2322     CALL 0x322
951 0D94  318D     MOVLP 0xD
952 312:               OW_reset();
953 0D95  318C     MOVLP 0xC
954 0D96  2437     CALL 0x437
955 0D97  318D     MOVLP 0xD
956 313:               // read ROM command
957 314:               OW_write_byte(0x33);
958 0D98  3033     MOVLW 0x33
959 0D99  318B     MOVLP 0xB
960 0D9A  2390     CALL 0x390
961 0D9B  318D     MOVLP 0xD
962 315:               for (int j=0; j<8; j++)
963 0D9C  0020     MOVLB 0x0
964 0D9D  01B9     CLRF cmp_id_bit
965 0D9E  01BA     CLRF search_result
966 0D9F  083A     MOVF search_result, W
967 0DA0  3A80     XORLW 0x80
968 0DA1  00FF     MOVWF 0x7F
969 0DA2  3080     MOVLW 0x80
970 0DA3  027F     SUBWF 0x7F, W
971 0DA4  1D03     BTFSS STATUS, 0x2
972 0DA5  2DA8     GOTO 0x5A8
973 0DA6  3008     MOVLW 0x8
974 0DA7  0239     SUBWF cmp_id_bit, W
975 0DA8  1C03     BTFSS STATUS, 0x0
976 0DA9  2DAB     GOTO 0x5AB
977 0DAA  2DAC     GOTO 0x5AC
978 0DAB  2DAE     GOTO 0x5AE
979 0DAC  2DCB     GOTO 0x5CB
980 0DAD  2DCB     GOTO 0x5CB
981 0DB9  3001     MOVLW 0x1
982 0DBA  07B9     ADDWF cmp_id_bit, F
983 0DBB  3000     MOVLW 0x0
984 0DBC  3DBA     ADDWFC search_result, F
985 0DBD  083A     MOVF search_result, W
986 0DBE  3A80     XORLW 0x80
987 0DBF  00FF     MOVWF 0x7F
988 0DC0  3080     MOVLW 0x80
989 0DC1  027F     SUBWF 0x7F, W
990 0DC2  1D03     BTFSS STATUS, 0x2
991 0DC3  2DC6     GOTO 0x5C6
992 0DC4  3008     MOVLW 0x8
993 0DC5  0239     SUBWF cmp_id_bit, W
994 0DC6  1C03     BTFSS STATUS, 0x0
995 0DC7  2DC9     GOTO 0x5C9
996 0DC8  2DCA     GOTO 0x5CA
997 0DC9  2DAE     GOTO 0x5AE
998 0DCA  2DCB     GOTO 0x5CB
999 316:                   romid[j] = OW_read_byte();
1000 0DAE  318C     MOVLP 0xC
1001 0DAF  2411     CALL 0x411
1002 0DB0  318D     MOVLP 0xD
1003 0DB1  0020     MOVLB 0x0
1004 0DB2  00B8     MOVWF bt
1005 0DB3  0839     MOVF cmp_id_bit, W
1006 0DB4  3E20     ADDLW 0x20
1007 0DB5  0086     MOVWF FSR1L
1008 0DB6  0187     CLRF FSR1H
1009 0DB7  0838     MOVF bt, W
1010 0DB8  0081     MOVWF INDF1
1011 317:               int_enable();
1012 0DCB  318B     MOVLP 0xB
1013 0DCC  2320     CALL 0x320
1014 0DCD  318D     MOVLP 0xD
1015 318:           }
1016 0DCE  0008     RETURN
1017 319:           
1018 320:           /* is anyone parasite powered ? */
1019 321:           bool OW_parasite(void)
1020 322:           {
1021 323:               int_disable();
1022 0BAE  318B     MOVLP 0xB
1023 0BAF  2322     CALL 0x322
1024 0BB0  318B     MOVLP 0xB
1025 324:               OW_reset();
1026 0BB1  318C     MOVLP 0xC
1027 0BB2  2437     CALL 0x437
1028 0BB3  318B     MOVLP 0xB
1029 325:               OW_write_byte(0xCC); // skip the rom command
1030 0BB4  30CC     MOVLW 0xCC
1031 0BB5  318B     MOVLP 0xB
1032 0BB6  2390     CALL 0x390
1033 0BB7  318B     MOVLP 0xB
1034 326:               OW_write_byte(0xB4); // are you parasite powered ?
1035 0BB8  30B4     MOVLW 0xB4
1036 0BB9  318B     MOVLP 0xB
1037 0BBA  2390     CALL 0x390
1038 0BBB  318B     MOVLP 0xB
1039 327:               bool no = OW_read_bit();
1040 0BBC  318B     MOVLP 0xB
1041 0BBD  2374     CALL 0x374
1042 0BBE  318B     MOVLP 0xB
1043 0BBF  0020     MOVLB 0x0
1044 0BC0  00B8     MOVWF bt
1045 0BC1  0838     MOVF bt, W
1046 0BC2  00B9     MOVWF cmp_id_bit
1047 328:               int_enable();
1048 0BC3  318B     MOVLP 0xB
1049 0BC4  2320     CALL 0x320
1050 0BC5  318B     MOVLP 0xB
1051 329:               return !no;
1052 0BC6  0020     MOVLB 0x0
1053 0BC7  0839     MOVF cmp_id_bit, W
1054 0BC8  3A00     XORLW 0x0
1055 0BC9  3000     MOVLW 0x0
1056 0BCA  1903     BTFSC STATUS, 0x2
1057 0BCB  3001     MOVLW 0x1
1058 0BCC  2BCD     GOTO 0x3CD
1059 330:           }
1060 0BCD  0008     RETURN
1061 331:           
1062 332:           /* select a specific device,
1063 333:            * if family==0 select all devices (skip rom)
1064 334:            */
1065 335:           static void OW_select_id(void)
1066 336:           {
1067 337:               if (romid[0] == 0) {
1068 0CE9  0020     MOVLB 0x0
1069 0CEA  08A0     MOVF romid, F
1070 0CEB  1D03     BTFSS STATUS, 0x2
1071 0CEC  2CEE     GOTO 0x4EE
1072 0CED  2CEF     GOTO 0x4EF
1073 0CEE  2CF4     GOTO 0x4F4
1074 338:                   OW_write_byte(0xCC); // all devices for now
1075 0CEF  30CC     MOVLW 0xCC
1076 0CF0  318B     MOVLP 0xB
1077 0CF1  2390     CALL 0x390
1078 0CF2  318C     MOVLP 0xC
1079 339:               } else {
1080 0CF3  2D19     GOTO 0x519
1081 340:                   OW_write_byte(0x55); // match rom
1082 0CF4  3055     MOVLW 0x55
1083 0CF5  318B     MOVLP 0xB
1084 0CF6  2390     CALL 0x390
1085 0CF7  318C     MOVLP 0xC
1086 341:                   for (int8_t j=0; j<8; j++) {
1087 0CF8  0020     MOVLB 0x0
1088 0CF9  01B9     CLRF cmp_id_bit
1089 0CFA  0839     MOVF cmp_id_bit, W
1090 0CFB  3A80     XORLW 0x80
1091 0CFC  3E78     ADDLW 0x78
1092 0CFD  1C03     BTFSS STATUS, 0x0
1093 0CFE  2D00     GOTO 0x500
1094 0CFF  2D01     GOTO 0x501
1095 0D00  2D03     GOTO 0x503
1096 0D01  2D19     GOTO 0x519
1097 0D02  2D19     GOTO 0x519
1098 0D0B  3001     MOVLW 0x1
1099 0D0C  0020     MOVLB 0x0
1100 0D0D  00B8     MOVWF bt
1101 0D0E  0838     MOVF bt, W
1102 0D0F  07B9     ADDWF cmp_id_bit, F
1103 0D10  0839     MOVF cmp_id_bit, W
1104 0D11  3A80     XORLW 0x80
1105 0D12  3E78     ADDLW 0x78
1106 0D13  1C03     BTFSS STATUS, 0x0
1107 0D14  2D16     GOTO 0x516
1108 0D15  2D17     GOTO 0x517
1109 0D16  2D03     GOTO 0x503
1110 0D17  2D19     GOTO 0x519
1111 0D18  2D19     GOTO 0x519
1112 342:                       OW_write_byte(romid[j]);
1113 0D03  0839     MOVF cmp_id_bit, W
1114 0D04  3E20     ADDLW 0x20
1115 0D05  0086     MOVWF FSR1L
1116 0D06  0187     CLRF FSR1H
1117 0D07  0801     MOVF INDF1, W
1118 0D08  318B     MOVLP 0xB
1119 0D09  2390     CALL 0x390
1120 0D0A  318C     MOVLP 0xC
1121 343:                   }
1122 344:               }
1123 345:           }
1124 0D19  0008     RETURN
1125 346:           
1126 347:           
1127 348:           /* read a memory block eg scratchpad 0xBE */
1128 349:           void OW_read_block(uint8_t code, uint8_t * data, uint8_t len)
1129 350:           {
1130 0D1A  0020     MOVLB 0x0
1131 0D1B  00BF     MOVWF rom_byte_mask
1132 351:               int_disable();
1133 0D1C  318B     MOVLP 0xB
1134 0D1D  2322     CALL 0x322
1135 0D1E  318D     MOVLP 0xD
1136 352:               OW_reset();
1137 0D1F  318C     MOVLP 0xC
1138 0D20  2437     CALL 0x437
1139 0D21  318D     MOVLP 0xD
1140 353:               OW_select_id();
1141 0D22  318C     MOVLP 0xC
1142 0D23  24E9     CALL 0x4E9
1143 0D24  318D     MOVLP 0xD
1144 354:               OW_write_byte(code);
1145 0D25  0020     MOVLB 0x0
1146 0D26  083F     MOVF rom_byte_mask, W
1147 0D27  318B     MOVLP 0xB
1148 0D28  2390     CALL 0x390
1149 0D29  318D     MOVLP 0xD
1150 355:               for (int8_t j=0; j<len; j++)
1151 0D2A  0020     MOVLB 0x0
1152 0D2B  01C0     CLRF rom_byte_number
1153 0D2C  2D3F     GOTO 0x53F
1154 0D3A  3001     MOVLW 0x1
1155 0D3B  00BC     MOVWF last_zero
1156 0D3C  083C     MOVF last_zero, W
1157 0D3D  07C0     ADDWF rom_byte_number, F
1158 0D3E  2D3F     GOTO 0x53F
1159 0D3F  0840     MOVF rom_byte_number, W
1160 0D40  00BC     MOVWF last_zero
1161 0D41  01BD     CLRF search_direction
1162 0D42  1BBC     BTFSC last_zero, 0x7
1163 0D43  03BD     DECF search_direction, F
1164 0D44  083D     MOVF search_direction, W
1165 0D45  3A80     XORLW 0x80
1166 0D46  00BE     MOVWF id_bit_number
1167 0D47  3080     MOVLW 0x80
1168 0D48  023E     SUBWF id_bit_number, W
1169 0D49  1D03     BTFSS STATUS, 0x2
1170 0D4A  2D4D     GOTO 0x54D
1171 0D4B  083B     MOVF id_bit, W
1172 0D4C  023C     SUBWF last_zero, W
1173 0D4D  1C03     BTFSS STATUS, 0x0
1174 0D4E  2D50     GOTO 0x550
1175 0D4F  2D51     GOTO 0x551
1176 0D50  2D2D     GOTO 0x52D
1177 0D51  2D52     GOTO 0x552
1178 356:                   data[j] = OW_read_byte();
1179 0D2D  318C     MOVLP 0xC
1180 0D2E  2411     CALL 0x411
1181 0D2F  318D     MOVLP 0xD
1182 0D30  0020     MOVLB 0x0
1183 0D31  00BC     MOVWF last_zero
1184 0D32  0840     MOVF rom_byte_number, W
1185 0D33  073A     ADDWF search_result, W
1186 0D34  00BD     MOVWF search_direction
1187 0D35  083D     MOVF search_direction, W
1188 0D36  0086     MOVWF FSR1L
1189 0D37  0187     CLRF FSR1H
1190 0D38  083C     MOVF last_zero, W
1191 0D39  0081     MOVWF INDF1
1192 357:               int_enable();
1193 0D52  318B     MOVLP 0xB
1194 0D53  2320     CALL 0x320
1195 0D54  318D     MOVLP 0xD
1196 358:           }
1197 0D55  0008     RETURN
1198 359:           
1199 360:           /* write a memory block to device, eg scratchpad 0x4E */
1200 361:           void OW_write_block(uint8_t code, uint8_t * data, uint8_t len)
1201 362:           {
1202 363:               int_disable();
1203 364:               OW_reset();
1204 365:               OW_select_id();
1205 366:               OW_write_byte(code);
1206 367:               for (int8_t j=0; j<len; j++) {
1207 368:                   OW_write_byte(data[j]);
1208 369:               }
1209 370:               int_enable();
1210 371:           }
1211 372:           
1212 373:           
1213 374:           // perform temperature conversion
1214 375:           void OW_convert()
1215 376:           {
1216 377:               // first see if anyone is parasitic
1217 378:               bool para = OW_parasite();
1218 0EA0  318B     MOVLP 0xB
1219 0EA1  23AE     CALL 0x3AE
1220 0EA2  318E     MOVLP 0xE
1221 0EA3  0020     MOVLB 0x0
1222 0EA4  00BA     MOVWF search_result
1223 0EA5  083A     MOVF search_result, W
1224 0EA6  00BD     MOVWF search_direction
1225 379:           
1226 380:               int_disable();
1227 0EA7  318B     MOVLP 0xB
1228 0EA8  2322     CALL 0x322
1229 0EA9  318E     MOVLP 0xE
1230 381:               OW_reset(); // all command start with reset
1231 0EAA  318C     MOVLP 0xC
1232 0EAB  2437     CALL 0x437
1233 0EAC  318E     MOVLP 0xE
1234 382:               OW_select_id();
1235 0EAD  318C     MOVLP 0xC
1236 0EAE  24E9     CALL 0x4E9
1237 0EAF  318E     MOVLP 0xE
1238 383:               //OW_write_byte(0xCC); // all devices
1239 384:               OW_write_byte(0x44); // convert
1240 0EB0  3044     MOVLW 0x44
1241 0EB1  318B     MOVLP 0xB
1242 0EB2  2390     CALL 0x390
1243 0EB3  318E     MOVLP 0xE
1244 385:               if (para) {
1245 0EB4  0020     MOVLB 0x0
1246 0EB5  083D     MOVF search_direction, W
1247 0EB6  1D03     BTFSS STATUS, 0x2
1248 0EB7  2EB9     GOTO 0x6B9
1249 0EB8  2EF6     GOTO 0x6F6
1250 386:                   // hard high for 750mS
1251 387:                   OWHIGH;
1252 0EB9  150C     BSF PORTA, 0x2
1253 0EBA  0021     MOVLB 0x1
1254 0EBB  110C     BCF PORTA, 0x2
1255 388:                   DelayUs(250000);
1256 0EBC  3002     MOVLW 0x2
1257 0EBD  0020     MOVLB 0x0
1258 0EBE  00BC     MOVWF last_zero
1259 0EBF  3045     MOVLW 0x45
1260 0EC0  00BB     MOVWF id_bit
1261 0EC1  30A9     MOVLW 0xA9
1262 0EC2  00BA     MOVWF search_result
1263 0EC3  0BBA     DECFSZ search_result, F
1264 0EC4  2EC3     GOTO 0x6C3
1265 0EC5  0BBB     DECFSZ id_bit, F
1266 0EC6  2EC3     GOTO 0x6C3
1267 0EC7  0BBC     DECFSZ last_zero, F
1268 0EC8  2EC3     GOTO 0x6C3
1269 0EC9  2ECA     GOTO 0x6CA
1270 389:                   DelayUs(250000);
1271 0ECA  3002     MOVLW 0x2
1272 0ECB  0020     MOVLB 0x0
1273 0ECC  00BC     MOVWF last_zero
1274 0ECD  3045     MOVLW 0x45
1275 0ECE  00BB     MOVWF id_bit
1276 0ECF  30A9     MOVLW 0xA9
1277 0ED0  00BA     MOVWF search_result
1278 0ED1  0BBA     DECFSZ search_result, F
1279 0ED2  2ED1     GOTO 0x6D1
1280 0ED3  0BBB     DECFSZ id_bit, F
1281 0ED4  2ED1     GOTO 0x6D1
1282 0ED5  0BBC     DECFSZ last_zero, F
1283 0ED6  2ED1     GOTO 0x6D1
1284 0ED7  2ED8     GOTO 0x6D8
1285 390:                   DelayUs(250000);
1286 0ED8  3002     MOVLW 0x2
1287 0ED9  0020     MOVLB 0x0
1288 0EDA  00BC     MOVWF last_zero
1289 0EDB  3045     MOVLW 0x45
1290 0EDC  00BB     MOVWF id_bit
1291 0EDD  30A9     MOVLW 0xA9
1292 0EDE  00BA     MOVWF search_result
1293 0EDF  0BBA     DECFSZ search_result, F
1294 0EE0  2EDF     GOTO 0x6DF
1295 0EE1  0BBB     DECFSZ id_bit, F
1296 0EE2  2EDF     GOTO 0x6DF
1297 0EE3  0BBC     DECFSZ last_zero, F
1298 0EE4  2EDF     GOTO 0x6DF
1299 0EE5  2EE6     GOTO 0x6E6
1300 391:                   DelayUs(250000);
1301 0EE6  3002     MOVLW 0x2
1302 0EE7  0020     MOVLB 0x0
1303 0EE8  00BC     MOVWF last_zero
1304 0EE9  3045     MOVLW 0x45
1305 0EEA  00BB     MOVWF id_bit
1306 0EEB  30A9     MOVLW 0xA9
1307 0EEC  00BA     MOVWF search_result
1308 0EED  0BBA     DECFSZ search_result, F
1309 0EEE  2EED     GOTO 0x6ED
1310 0EEF  0BBB     DECFSZ id_bit, F
1311 0EF0  2EED     GOTO 0x6ED
1312 0EF1  0BBC     DECFSZ last_zero, F
1313 0EF2  2EED     GOTO 0x6ED
1314 0EF3  2EF4     GOTO 0x6F4
1315 392:               } else {
1316 0EF4  2F08     GOTO 0x708
1317 0EF5  2EF6     GOTO 0x6F6
1318 393:                   // keep polling until its done
1319 394:                   // device will reply with 0 'pull low' whilst convert in progress
1320 395:                   do {
1321 396:                       DelayUs(1000);
1322 0EF6  30F9     MOVLW 0xF9
1323 0EF7  0020     MOVLB 0x0
1324 0EF8  00BA     MOVWF search_result
1325 0EF9  0000     NOP
1326 0EFA  0BBA     DECFSZ search_result, F
1327 0EFB  2EF9     GOTO 0x6F9
1328 0EFC  2EFD     GOTO 0x6FD
1329 0EFD  0000     NOP
1330 397:                   } while (!OW_read_bit());
1331 0EFE  318B     MOVLP 0xB
1332 0EFF  2374     CALL 0x374
1333 0F00  318E     MOVLP 0xE
1334 0F01  3A00     XORLW 0x0
1335 0F02  1903     BTFSC STATUS, 0x2
1336 0F03  2F05     GOTO 0x705
1337 0F04  2F06     GOTO 0x706
1338 0F05  2EF6     GOTO 0x6F6
1339 0F06  2F08     GOTO 0x708
1340 0F07  2F08     GOTO 0x708
1341 398:               }
1342 399:               int_enable();
1343 0F08  318B     MOVLP 0xB
1344 0F09  2320     CALL 0x320
1345 0F0A  318E     MOVLP 0xE
1346 400:           }
1347 0F0B  0008     RETURN
1348 401:           
1349 402:           /* Available commands :-
1350 403:            * 33h - read rom  (sends 8 bytes)
1351 404:            * 55h - match rom (reads 8 bytes)
1352 405:            * F0h - search rom (enumeration mode)
1353 406:            * ECh - alarm search
1354 407:            * CC  - skip rom command
1355 408:            *
1356 409:            * followed by....
1357 410:            * 44h - convert temperature
1358 411:            * 48h - copy scratchpad -> eeprom
1359 412:            * 4Eh - write scratchpad (send 3 bytes )
1360 413:            * BEh - read scratchpad ( 8 bytes + crc)
1361 414:            * B8h - recall EEPROM -> scratchpad
1362 415:            * B4h - read power supply (read 1 bit)
1363 416:            */
1364 ---  /home/justin/MPLABXProjects/uart test.X/main.c  ----------------------------------------------------
1365 1:             /******************************************************************************/
1366 2:             /* Files to Include                                                           */
1367 3:             /******************************************************************************/
1368 4:             
1369 5:             #if defined(__XC)
1370 6:                 #include <xc.h>         /* XC8 General Include File */
1371 7:             #elif defined(HI_TECH_C)
1372 8:                 #include <htc.h>        /* HiTech General Include File */
1373 9:             #endif
1374 10:            
1375 11:            #include <stdio.h>
1376 12:            
1377 13:            #include <stdint.h>        /* For uint8_t definition */
1378 14:            #include <stdbool.h>       /* For true/false definition */
1379 15:            
1380 16:            #include "system.h"        /* System funct/params, like osc/peripheral config */
1381 17:            #include "user.h"          /* User funct/params, such as InitApp */
1382 18:            
1383 19:            #include "onewire.h"        /* 1-wire bus functions */
1384 20:            
1385 21:            /******************************************************************************/
1386 22:            /* User Global Variable Declaration                                           */
1387 23:            /******************************************************************************/
1388 24:            
1389 25:            /* i.e. uint8_t <variable_name>; */
1390 26:            
1391 27:            char outbuff[100];
1392 28:            char * outp = 0;
1393 29:            uint8_t outlen = 0;
1394 30:            
1395 31:            char inbuff[10];
1396 32:            uint8_t inlen = 0;
1397 33:            
1398 34:            /******************************************************************************/
1399 35:            /* Main Program                                                               */
1400 36:            /******************************************************************************/
1401 37:            
1402 38:            char prompt[9];
1403 39:            
1404 40:            const char * banner = "\r\n\n\nPIC 1-Wire Bridge system.  Press 'H' for help.\r\n";
1405 41:            
1406 42:            void main(void)
1407 43:            {
1408 44:                prompt[0] = 'c';
1409 002A  3063     MOVLW 0x63
1410 002B  0020     MOVLB 0x0
1411 002C  00C1     MOVWF 0x41
1412 002D  0841     MOVF 0x41, W
1413 002E  00AC     MOVWF prompt
1414 45:                prompt[1] = 'm';
1415 002F  306D     MOVLW 0x6D
1416 0030  00C1     MOVWF 0x41
1417 0031  0841     MOVF 0x41, W
1418 0032  00AD     MOVWF 0x2D
1419 46:                prompt[2] = 'd';
1420 0033  3064     MOVLW 0x64
1421 0034  00C1     MOVWF 0x41
1422 0035  0841     MOVF 0x41, W
1423 0036  00AE     MOVWF 0x2E
1424 47:                prompt[3] = ' ';
1425 0037  3020     MOVLW 0x20
1426 0038  00C1     MOVWF 0x41
1427 0039  0841     MOVF 0x41, W
1428 003A  00AF     MOVWF 0x2F
1429 48:                prompt[4] = '?';
1430 003B  303F     MOVLW 0x3F
1431 003C  00C1     MOVWF 0x41
1432 003D  0841     MOVF 0x41, W
1433 003E  00B0     MOVWF 0x30
1434 49:                prompt[5] = '?';
1435 003F  303F     MOVLW 0x3F
1436 0040  00C1     MOVWF 0x41
1437 0041  0841     MOVF 0x41, W
1438 0042  00B1     MOVWF 0x31
1439 50:                prompt[6] = '>';
1440 0043  303E     MOVLW 0x3E
1441 0044  00C1     MOVWF 0x41
1442 0045  0841     MOVF 0x41, W
1443 0046  00B2     MOVWF 0x32
1444 51:                prompt[7] = ' ';
1445 0047  3020     MOVLW 0x20
1446 0048  00C1     MOVWF 0x41
1447 0049  0841     MOVF 0x41, W
1448 004A  00B3     MOVWF 0x33
1449 52:                prompt[8] = 0;
1450 004B  01B4     CLRF 0x34
1451 53:            
1452 54:                bool usermode = false;
1453 004C  0021     MOVLB 0x1
1454 004D  01CC     CLRF 0x4C
1455 55:            
1456 56:                /* Configure the oscillator for the device */
1457 57:                ConfigureOscillator();
1458 004E  318B     MOVLP 0xB
1459 004F  231F     CALL 0x31F
1460 0050  3180     MOVLP 0x0
1461 58:            
1462 59:                /* Initialize I/O and Peripherals for application */
1463 60:                InitApp();
1464 0051  318B     MOVLP 0xB
1465 0052  23CE     CALL 0x3CE
1466 0053  3180     MOVLP 0x0
1467 61:            
1468 62:                OW_start();
1469 0054  318B     MOVLP 0xB
1470 0055  2324     CALL 0x324
1471 0056  3180     MOVLP 0x0
1472 63:                msg_write(banner);
1473 0057  0020     MOVLB 0x0
1474 0058  0844     MOVF 0x44, W
1475 0059  01F5     CLRF presence
1476 005A  07F5     ADDWF presence, F
1477 005B  0843     MOVF banner, W
1478 005C  01F4     CLRF i
1479 005D  07F4     ADDWF i, F
1480 005E  318E     MOVLP 0xE
1481 005F  2613     CALL 0x613
1482 0060  3180     MOVLP 0x0
1483 0061  2862     GOTO 0x62
1484 64:                //msg_write(prompt);
1485 65:            
1486 66:                while(1)
1487 04EA  2862     GOTO 0x62
1488 67:                {
1489 68:                    if (TRISAbits.TRISA2 == 1) {
1490 0062  0021     MOVLB 0x1
1491 0063  1D0C     BTFSS PORTA, 0x2
1492 0064  2866     GOTO 0x66
1493 0065  2867     GOTO 0x67
1494 0066  2881     GOTO 0x81
1495 69:                        prompt[4] = 'i';
1496 0067  3069     MOVLW 0x69
1497 0068  0020     MOVLB 0x0
1498 0069  00C1     MOVWF 0x41
1499 006A  0841     MOVF 0x41, W
1500 006B  00B0     MOVWF 0x30
1501 70:                        prompt[5] = PORTAbits.RA2 ? '1':'0';
1502 006C  190C     BTFSC PORTA, 0x2
1503 006D  286F     GOTO 0x6F
1504 006E  2870     GOTO 0x70
1505 006F  2876     GOTO 0x76
1506 0070  3030     MOVLW 0x30
1507 0071  0021     MOVLB 0x1
1508 0072  00B4     MOVWF 0x34
1509 0073  3000     MOVLW 0x0
1510 0074  00B5     MOVWF in
1511 0075  287B     GOTO 0x7B
1512 0076  3031     MOVLW 0x31
1513 0077  0021     MOVLB 0x1
1514 0078  00B4     MOVWF 0x34
1515 0079  3000     MOVLW 0x0
1516 007A  00B5     MOVWF in
1517 007B  0834     MOVF 0x34, W
1518 007C  0020     MOVLB 0x0
1519 007D  00C1     MOVWF 0x41
1520 007E  0841     MOVF 0x41, W
1521 007F  00B1     MOVWF 0x31
1522 71:                    } else {
1523 0080  289B     GOTO 0x9B
1524 72:                        prompt[4] = 'o';
1525 0081  306F     MOVLW 0x6F
1526 0082  0020     MOVLB 0x0
1527 0083  00C1     MOVWF 0x41
1528 0084  0841     MOVF 0x41, W
1529 0085  00B0     MOVWF 0x30
1530 73:                        prompt[5] = PORTAbits.RA2 ? '1':'0';
1531 0086  190C     BTFSC PORTA, 0x2
1532 0087  2889     GOTO 0x89
1533 0088  288A     GOTO 0x8A
1534 0089  2890     GOTO 0x90
1535 008A  3030     MOVLW 0x30
1536 008B  0021     MOVLB 0x1
1537 008C  00B6     MOVWF p
1538 008D  3000     MOVLW 0x0
1539 008E  00B7     MOVWF i
1540 008F  2895     GOTO 0x95
1541 0090  3031     MOVLW 0x31
1542 0091  0021     MOVLB 0x1
1543 0092  00B6     MOVWF p
1544 0093  3000     MOVLW 0x0
1545 0094  00B7     MOVWF i
1546 0095  0836     MOVF p, W
1547 0096  0020     MOVLB 0x0
1548 0097  00C1     MOVWF 0x41
1549 0098  0841     MOVF 0x41, W
1550 0099  00B1     MOVWF 0x31
1551 009A  289B     GOTO 0x9B
1552 74:                    }
1553 75:            
1554 76:                    if (!msg_empty()) continue;
1555 009B  318B     MOVLP 0xB
1556 009C  2344     CALL 0x344
1557 009D  3180     MOVLP 0x0
1558 009E  3800     IORLW 0x0
1559 009F  1D03     BTFSS STATUS, 0x2
1560 00A0  28A2     GOTO 0xA2
1561 00A1  28A3     GOTO 0xA3
1562 00A2  28A5     GOTO 0xA5
1563 00A3  2862     GOTO 0x62
1564 00A4  2862     GOTO 0x62
1565 77:            
1566 78:                    if (!msg_recvready()) continue;
1567 00A5  318B     MOVLP 0xB
1568 00A6  233A     CALL 0x33A
1569 00A7  3180     MOVLP 0x0
1570 00A8  3800     IORLW 0x0
1571 00A9  1D03     BTFSS STATUS, 0x2
1572 00AA  28AC     GOTO 0xAC
1573 00AB  28AD     GOTO 0xAD
1574 00AC  28AF     GOTO 0xAF
1575 00AD  2862     GOTO 0x62
1576 00AE  2862     GOTO 0x62
1577 79:            
1578 80:                    char cmd = msg_recv();
1579 00AF  318D     MOVLP 0xD
1580 00B0  2556     CALL 0x556
1581 00B1  3180     MOVLP 0x0
1582 00B2  0020     MOVLB 0x0
1583 00B3  00C1     MOVWF 0x41
1584 00B4  0841     MOVF 0x41, W
1585 00B5  0021     MOVLB 0x1
1586 00B6  00CB     MOVWF 0x4B
1587 81:                    
1588 82:                    if (cmd == '\r' || cmd == '\n') {
1589 00B7  084B     MOVF 0x4B, W
1590 00B8  3A0D     XORLW 0xD
1591 00B9  1903     BTFSC STATUS, 0x2
1592 00BA  28BC     GOTO 0xBC
1593 00BB  28BD     GOTO 0xBD
1594 00BC  28C4     GOTO 0xC4
1595 00BD  084B     MOVF 0x4B, W
1596 00BE  3A0A     XORLW 0xA
1597 00BF  1D03     BTFSS STATUS, 0x2
1598 00C0  28C2     GOTO 0xC2
1599 00C1  28C3     GOTO 0xC3
1600 00C2  28D1     GOTO 0xD1
1601 00C3  28C4     GOTO 0xC4
1602 83:                        if (usermode) msg_write("\r\n");
1603 00C4  084C     MOVF 0x4C, W
1604 00C5  1D03     BTFSS STATUS, 0x2
1605 00C6  28C8     GOTO 0xC8
1606 00C7  2CDC     GOTO 0x4DC
1607 00C8  3059     MOVLW 0x59
1608 00C9  00F4     MOVWF i
1609 00CA  3086     MOVLW 0x86
1610 00CB  00F5     MOVWF presence
1611 00CC  318E     MOVLP 0xE
1612 00CD  2613     CALL 0x613
1613 00CE  3180     MOVLP 0x0
1614 00CF  2CDC     GOTO 0x4DC
1615 84:                    }else
1616 00D0  2CDC     GOTO 0x4DC
1617 85:                    if (cmd == 'h' || cmd == 'H') {
1618 00D1  0021     MOVLB 0x1
1619 00D2  084B     MOVF 0x4B, W
1620 00D3  3A68     XORLW 0x68
1621 00D4  1903     BTFSC STATUS, 0x2
1622 00D5  28D7     GOTO 0xD7
1623 00D6  28D8     GOTO 0xD8
1624 00D7  28DF     GOTO 0xDF
1625 00D8  084B     MOVF 0x4B, W
1626 00D9  3A48     XORLW 0x48
1627 00DA  1D03     BTFSS STATUS, 0x2
1628 00DB  28DD     GOTO 0xDD
1629 00DC  28DE     GOTO 0xDE
1630 00DD  2951     GOTO 0x151
1631 00DE  28DF     GOTO 0xDF
1632 86:                        msg_write(banner);
1633 00DF  0020     MOVLB 0x0
1634 00E0  0844     MOVF 0x44, W
1635 00E1  01F5     CLRF presence
1636 00E2  07F5     ADDWF presence, F
1637 00E3  0843     MOVF banner, W
1638 00E4  01F4     CLRF i
1639 00E5  07F4     ADDWF i, F
1640 00E6  318E     MOVLP 0xE
1641 00E7  2613     CALL 0x613
1642 00E8  3180     MOVLP 0x0
1643 87:                        msg_write("\nHelp:\r\n");
1644 00E9  3070     MOVLW 0x70
1645 00EA  00F4     MOVWF i
1646 00EB  3088     MOVLW 0x88
1647 00EC  00F5     MOVWF presence
1648 00ED  318E     MOVLP 0xE
1649 00EE  2613     CALL 0x613
1650 00EF  3180     MOVLP 0x0
1651 88:                        while (!msg_empty());
1652 00F0  28F2     GOTO 0xF2
1653 00F1  28F2     GOTO 0xF2
1654 00F2  318B     MOVLP 0xB
1655 00F3  2344     CALL 0x344
1656 00F4  3180     MOVLP 0x0
1657 00F5  3A00     XORLW 0x0
1658 00F6  1903     BTFSC STATUS, 0x2
1659 00F7  28F9     GOTO 0xF9
1660 00F8  28FA     GOTO 0xFA
1661 00F9  28F2     GOTO 0xF2
1662 00FA  28FB     GOTO 0xFB
1663 89:                        msg_write("E - Enumerate the Bus\r\n");
1664 00FB  30E2     MOVLW 0xE2
1665 00FC  00F4     MOVWF i
1666 00FD  3087     MOVLW 0x87
1667 00FE  00F5     MOVWF presence
1668 00FF  318E     MOVLP 0xE
1669 0100  2613     CALL 0x613
1670 0101  3180     MOVLP 0x0
1671 90:                        msg_write("R - Reset Bus\r\n");
1672 0102  303F     MOVLW 0x3F
1673 0103  00F4     MOVWF i
1674 0104  3088     MOVLW 0x88
1675 0105  00F5     MOVWF presence
1676 0106  318E     MOVLP 0xE
1677 0107  2613     CALL 0x613
1678 0108  3180     MOVLP 0x0
1679 91:                        while (!msg_empty());
1680 0109  290B     GOTO 0x10B
1681 010A  290B     GOTO 0x10B
1682 010B  318B     MOVLP 0xB
1683 010C  2344     CALL 0x344
1684 010D  3180     MOVLP 0x0
1685 010E  3A00     XORLW 0x0
1686 010F  1903     BTFSC STATUS, 0x2
1687 0110  2912     GOTO 0x112
1688 0111  2913     GOTO 0x113
1689 0112  290B     GOTO 0x10B
1690 0113  2914     GOTO 0x114
1691 92:                        msg_write("0,1,3 - bus to Low, High, Tristate\r\n");
1692 0114  3082     MOVLW 0x82
1693 0115  00F4     MOVWF i
1694 0116  3086     MOVLW 0x86
1695 0117  00F5     MOVWF presence
1696 0118  318E     MOVLP 0xE
1697 0119  2613     CALL 0x613
1698 011A  3180     MOVLP 0x0
1699 93:                        msg_write("I - Read (one) Device ID\r\n");
1700 011B  3064     MOVLW 0x64
1701 011C  00F4     MOVWF i
1702 011D  3087     MOVLW 0x87
1703 011E  00F5     MOVWF presence
1704 011F  318E     MOVLP 0xE
1705 0120  2613     CALL 0x613
1706 0121  3180     MOVLP 0x0
1707 94:                        while (!msg_empty());
1708 0122  2924     GOTO 0x124
1709 0123  2924     GOTO 0x124
1710 0124  318B     MOVLP 0xB
1711 0125  2344     CALL 0x344
1712 0126  3180     MOVLP 0x0
1713 0127  3A00     XORLW 0x0
1714 0128  1903     BTFSC STATUS, 0x2
1715 0129  292B     GOTO 0x12B
1716 012A  292C     GOTO 0x12C
1717 012B  2924     GOTO 0x124
1718 012C  292D     GOTO 0x12D
1719 95:                        msg_write("P - Any device parasitic powered?\r\n");
1720 012D  30A7     MOVLW 0xA7
1721 012E  00F4     MOVWF i
1722 012F  3086     MOVLW 0x86
1723 0130  00F5     MOVWF presence
1724 0131  318E     MOVLP 0xE
1725 0132  2613     CALL 0x613
1726 0133  3180     MOVLP 0x0
1727 96:                        msg_write("S - Read scratchpad memory\r\n");
1728 0134  302B     MOVLW 0x2B
1729 0135  00F4     MOVWF i
1730 0136  3087     MOVLW 0x87
1731 0137  00F5     MOVWF presence
1732 0138  318E     MOVLP 0xE
1733 0139  2613     CALL 0x613
1734 013A  3180     MOVLP 0x0
1735 97:                        while (!msg_empty());
1736 013B  293D     GOTO 0x13D
1737 013C  293D     GOTO 0x13D
1738 013D  318B     MOVLP 0xB
1739 013E  2344     CALL 0x344
1740 013F  3180     MOVLP 0x0
1741 0140  3A00     XORLW 0x0
1742 0141  1903     BTFSC STATUS, 0x2
1743 0142  2944     GOTO 0x144
1744 0143  2945     GOTO 0x145
1745 0144  293D     GOTO 0x13D
1746 0145  2946     GOTO 0x146
1747 98:                        msg_write("T - read temperature of all devices\r\n");
1748 0146  305C     MOVLW 0x5C
1749 0147  00F4     MOVWF i
1750 0148  3086     MOVLW 0x86
1751 0149  00F5     MOVWF presence
1752 014A  318E     MOVLP 0xE
1753 014B  2613     CALL 0x613
1754 014C  3180     MOVLP 0x0
1755 99:                        usermode = true;
1756 014D  0021     MOVLB 0x1
1757 014E  01CC     CLRF 0x4C
1758 014F  0ACC     INCF 0x4C, F
1759 100:                   } else
1760 0150  2CDC     GOTO 0x4DC
1761 101:                   if (cmd == 'r' || cmd == 'R') {
1762 0151  084B     MOVF 0x4B, W
1763 0152  3A72     XORLW 0x72
1764 0153  1903     BTFSC STATUS, 0x2
1765 0154  2956     GOTO 0x156
1766 0155  2957     GOTO 0x157
1767 0156  295E     GOTO 0x15E
1768 0157  084B     MOVF 0x4B, W
1769 0158  3A52     XORLW 0x52
1770 0159  1D03     BTFSS STATUS, 0x2
1771 015A  295C     GOTO 0x15C
1772 015B  295D     GOTO 0x15D
1773 015C  298F     GOTO 0x18F
1774 015D  295E     GOTO 0x15E
1775 102:                       int_disable();
1776 015E  318B     MOVLP 0xB
1777 015F  2322     CALL 0x322
1778 0160  3180     MOVLP 0x0
1779 103:                       bool present = OW_reset();
1780 0161  318C     MOVLP 0xC
1781 0162  2437     CALL 0x437
1782 0163  3180     MOVLP 0x0
1783 0164  0020     MOVLB 0x0
1784 0165  00C1     MOVWF 0x41
1785 0166  0841     MOVF 0x41, W
1786 0167  0021     MOVLB 0x1
1787 0168  00B2     MOVWF 0x32
1788 104:                       int_enable();
1789 0169  318B     MOVLP 0xB
1790 016A  2320     CALL 0x320
1791 016B  3180     MOVLP 0x0
1792 105:                       if (usermode) msg_write("\r");
1793 016C  0021     MOVLB 0x1
1794 016D  084C     MOVF 0x4C, W
1795 016E  1D03     BTFSS STATUS, 0x2
1796 016F  2971     GOTO 0x171
1797 0170  2979     GOTO 0x179
1798 0171  30B2     MOVLW 0xB2
1799 0172  00F4     MOVWF i
1800 0173  3088     MOVLW 0x88
1801 0174  00F5     MOVWF presence
1802 0175  318E     MOVLP 0xE
1803 0176  2613     CALL 0x613
1804 0177  3180     MOVLP 0x0
1805 0178  2979     GOTO 0x179
1806 106:                       if (present)
1807 0179  0021     MOVLB 0x1
1808 017A  0832     MOVF 0x32, W
1809 017B  1D03     BTFSS STATUS, 0x2
1810 017C  297E     GOTO 0x17E
1811 017D  2986     GOTO 0x186
1812 107:                           msg_write("RESET Device detected.\r\n");
1813 017E  307F     MOVLW 0x7F
1814 017F  00F4     MOVWF i
1815 0180  3087     MOVLW 0x87
1816 0181  00F5     MOVWF presence
1817 0182  318E     MOVLP 0xE
1818 0183  2613     CALL 0x613
1819 0184  3180     MOVLP 0x0
1820 0185  2CDC     GOTO 0x4DC
1821 108:                       else
1822 109:                           msg_write("RESET No Devices detected.\r\n");
1823 0186  300E     MOVLW 0xE
1824 0187  00F4     MOVWF i
1825 0188  3087     MOVLW 0x87
1826 0189  00F5     MOVWF presence
1827 018A  318E     MOVLP 0xE
1828 018B  2613     CALL 0x613
1829 018C  3180     MOVLP 0x0
1830 018D  2CDC     GOTO 0x4DC
1831 110:                   } else
1832 018E  2CDC     GOTO 0x4DC
1833 111:                   if (cmd == 'e' || cmd == 'E')
1834 018F  0021     MOVLB 0x1
1835 0190  084B     MOVF 0x4B, W
1836 0191  3A65     XORLW 0x65
1837 0192  1903     BTFSC STATUS, 0x2
1838 0193  2995     GOTO 0x195
1839 0194  2996     GOTO 0x196
1840 0195  299C     GOTO 0x19C
1841 0196  084B     MOVF 0x4B, W
1842 0197  3A45     XORLW 0x45
1843 0198  1D03     BTFSS STATUS, 0x2
1844 0199  299B     GOTO 0x19B
1845 019A  299C     GOTO 0x19C
1846 019B  2A25     GOTO 0x225
1847 112:                   {
1848 113:                       char count = 0;
1849 019C  01C1     CLRF 0x41
1850 114:                       if (usermode) msg_write("\r");
1851 019D  084C     MOVF 0x4C, W
1852 019E  1D03     BTFSS STATUS, 0x2
1853 019F  29A1     GOTO 0x1A1
1854 01A0  29A9     GOTO 0x1A9
1855 01A1  30B2     MOVLW 0xB2
1856 01A2  00F4     MOVWF i
1857 01A3  3088     MOVLW 0x88
1858 01A4  00F5     MOVWF presence
1859 01A5  318E     MOVLP 0xE
1860 01A6  2613     CALL 0x613
1861 01A7  3180     MOVLP 0x0
1862 01A8  29A9     GOTO 0x1A9
1863 115:                       OW_search_init();
1864 01A9  318C     MOVLP 0xC
1865 01AA  248C     CALL 0x48C
1866 01AB  3180     MOVLP 0x0
1867 116:                       while (OW_search())
1868 01AC  2A00     GOTO 0x200
1869 0200  318F     MOVLP 0xF
1870 0201  270C     CALL 0x70C
1871 0202  3180     MOVLP 0x0
1872 0203  3800     IORLW 0x0
1873 0204  1D03     BTFSS STATUS, 0x2
1874 0205  2A07     GOTO 0x207
1875 0206  2A08     GOTO 0x208
1876 0207  29AD     GOTO 0x1AD
1877 0208  2A09     GOTO 0x209
1878 117:                       {
1879 118:                           char val[3];
1880 119:                           if (usermode) msg_write("ENUM ");
1881 01AD  0021     MOVLB 0x1
1882 01AE  084C     MOVF 0x4C, W
1883 01AF  1D03     BTFSS STATUS, 0x2
1884 01B0  29B2     GOTO 0x1B2
1885 01B1  29BA     GOTO 0x1BA
1886 01B2  309D     MOVLW 0x9D
1887 01B3  00F4     MOVWF i
1888 01B4  3088     MOVLW 0x88
1889 01B5  00F5     MOVWF presence
1890 01B6  318E     MOVLP 0xE
1891 01B7  2613     CALL 0x613
1892 01B8  3180     MOVLP 0x0
1893 01B9  29BA     GOTO 0x1BA
1894 120:                           for (char j=0; j<8; j++) {
1895 01BA  0021     MOVLB 0x1
1896 01BB  01C6     CLRF 0x46
1897 01BC  3008     MOVLW 0x8
1898 01BD  0246     SUBWF 0x46, W
1899 01BE  1C03     BTFSS STATUS, 0x0
1900 01BF  29C1     GOTO 0x1C1
1901 01C0  29C2     GOTO 0x1C2
1902 01C1  29C4     GOTO 0x1C4
1903 01C2  29E5     GOTO 0x1E5
1904 01C3  29E5     GOTO 0x1E5
1905 01D8  3001     MOVLW 0x1
1906 01D9  0020     MOVLB 0x0
1907 01DA  00C1     MOVWF 0x41
1908 01DB  0841     MOVF 0x41, W
1909 01DC  0021     MOVLB 0x1
1910 01DD  07C6     ADDWF 0x46, F
1911 01DE  3008     MOVLW 0x8
1912 01DF  0246     SUBWF 0x46, W
1913 01E0  1C03     BTFSS STATUS, 0x0
1914 01E1  29E3     GOTO 0x1E3
1915 01E2  29E4     GOTO 0x1E4
1916 01E3  29C4     GOTO 0x1C4
1917 01E4  29E5     GOTO 0x1E5
1918 121:                               tohex(val, romid[j]);
1919 01C4  0846     MOVF 0x46, W
1920 01C5  3E20     ADDLW 0x20
1921 01C6  0086     MOVWF FSR1L
1922 01C7  0187     CLRF FSR1H
1923 01C8  0801     MOVF INDF1, W
1924 01C9  0020     MOVLB 0x0
1925 01CA  00C1     MOVWF 0x41
1926 01CB  0841     MOVF 0x41, W
1927 01CC  00F4     MOVWF i
1928 01CD  30B8     MOVLW 0xB8
1929 01CE  318E     MOVLP 0xE
1930 01CF  2659     CALL 0x659
1931 01D0  3180     MOVLP 0x0
1932 122:                               msg_write(val);
1933 01D1  30B8     MOVLW 0xB8
1934 01D2  00F4     MOVWF i
1935 01D3  3000     MOVLW 0x0
1936 01D4  00F5     MOVWF presence
1937 01D5  318E     MOVLP 0xE
1938 01D6  2613     CALL 0x613
1939 01D7  3180     MOVLP 0x0
1940 123:                           }
1941 124:                           if (usermode) msg_write("\r\n"); else msg_write("\n");
1942 01E5  084C     MOVF 0x4C, W
1943 01E6  1D03     BTFSS STATUS, 0x2
1944 01E7  29E9     GOTO 0x1E9
1945 01E8  29F1     GOTO 0x1F1
1946 01E9  3059     MOVLW 0x59
1947 01EA  00F4     MOVWF i
1948 01EB  3086     MOVLW 0x86
1949 01EC  00F5     MOVWF presence
1950 01ED  318E     MOVLP 0xE
1951 01EE  2613     CALL 0x613
1952 01EF  3180     MOVLP 0x0
1953 01F0  29F9     GOTO 0x1F9
1954 01F1  305A     MOVLW 0x5A
1955 01F2  00F4     MOVWF i
1956 01F3  3086     MOVLW 0x86
1957 01F4  00F5     MOVWF presence
1958 01F5  318E     MOVLP 0xE
1959 01F6  2613     CALL 0x613
1960 01F7  3180     MOVLP 0x0
1961 01F8  29F9     GOTO 0x1F9
1962 125:                           count++;
1963 01F9  3001     MOVLW 0x1
1964 01FA  0020     MOVLB 0x0
1965 01FB  00C1     MOVWF 0x41
1966 01FC  0841     MOVF 0x41, W
1967 01FD  0021     MOVLB 0x1
1968 01FE  07C1     ADDWF 0x41, F
1969 01FF  2A00     GOTO 0x200
1970 126:                       }
1971 127:                       if (usermode) {
1972 0209  0021     MOVLB 0x1
1973 020A  084C     MOVF 0x4C, W
1974 020B  1D03     BTFSS STATUS, 0x2
1975 020C  2A0E     GOTO 0x20E
1976 020D  2A1C     GOTO 0x21C
1977 128:                           if (count==0) msg_write("ERROR No devices found\r\n");
1978 020E  08C1     MOVF 0x41, F
1979 020F  1D03     BTFSS STATUS, 0x2
1980 0210  2A12     GOTO 0x212
1981 0211  2A13     GOTO 0x213
1982 0212  2CDC     GOTO 0x4DC
1983 0213  3098     MOVLW 0x98
1984 0214  00F4     MOVWF i
1985 0215  3087     MOVLW 0x87
1986 0216  00F5     MOVWF presence
1987 0217  318E     MOVLP 0xE
1988 0218  2613     CALL 0x613
1989 0219  3180     MOVLP 0x0
1990 021A  2CDC     GOTO 0x4DC
1991 129:                       } else {
1992 021B  2CDC     GOTO 0x4DC
1993 130:                           msg_write("END\n");
1994 021C  30A3     MOVLW 0xA3
1995 021D  00F4     MOVWF i
1996 021E  3088     MOVLW 0x88
1997 021F  00F5     MOVWF presence
1998 0220  318E     MOVLP 0xE
1999 0221  2613     CALL 0x613
2000 0222  3180     MOVLP 0x0
2001 0223  2CDC     GOTO 0x4DC
2002 131:                       }
2003 132:                   }else
2004 0224  2CDC     GOTO 0x4DC
2005 133:                   if (cmd == 'i' || cmd == 'I') {
2006 0225  0021     MOVLB 0x1
2007 0226  084B     MOVF 0x4B, W
2008 0227  3A69     XORLW 0x69
2009 0228  1903     BTFSC STATUS, 0x2
2010 0229  2A2B     GOTO 0x22B
2011 022A  2A2C     GOTO 0x22C
2012 022B  2A33     GOTO 0x233
2013 022C  084B     MOVF 0x4B, W
2014 022D  3A49     XORLW 0x49
2015 022E  1D03     BTFSS STATUS, 0x2
2016 022F  2A31     GOTO 0x231
2017 0230  2A32     GOTO 0x232
2018 0231  2A83     GOTO 0x283
2019 0232  2A33     GOTO 0x233
2020 134:                       OW_identify();
2021 0233  318D     MOVLP 0xD
2022 0234  2592     CALL 0x592
2023 0235  3180     MOVLP 0x0
2024 135:                       char val[3];
2025 136:                       if (usermode) msg_write("\rID ");
2026 0236  0021     MOVLB 0x1
2027 0237  084C     MOVF 0x4C, W
2028 0238  1D03     BTFSS STATUS, 0x2
2029 0239  2A3B     GOTO 0x23B
2030 023A  2A43     GOTO 0x243
2031 023B  30AD     MOVLW 0xAD
2032 023C  00F4     MOVWF i
2033 023D  3088     MOVLW 0x88
2034 023E  00F5     MOVWF presence
2035 023F  318E     MOVLP 0xE
2036 0240  2613     CALL 0x613
2037 0241  3180     MOVLP 0x0
2038 0242  2A43     GOTO 0x243
2039 137:                       for (char j=0; j<8; j++) {
2040 0243  0021     MOVLB 0x1
2041 0244  01C7     CLRF 0x47
2042 0245  3008     MOVLW 0x8
2043 0246  0247     SUBWF 0x47, W
2044 0247  1C03     BTFSS STATUS, 0x0
2045 0248  2A4A     GOTO 0x24A
2046 0249  2A4B     GOTO 0x24B
2047 024A  2A4D     GOTO 0x24D
2048 024B  2A6E     GOTO 0x26E
2049 024C  2A6E     GOTO 0x26E
2050 0261  3001     MOVLW 0x1
2051 0262  0020     MOVLB 0x0
2052 0263  00C1     MOVWF 0x41
2053 0264  0841     MOVF 0x41, W
2054 0265  0021     MOVLB 0x1
2055 0266  07C7     ADDWF 0x47, F
2056 0267  3008     MOVLW 0x8
2057 0268  0247     SUBWF 0x47, W
2058 0269  1C03     BTFSS STATUS, 0x0
2059 026A  2A6C     GOTO 0x26C
2060 026B  2A6D     GOTO 0x26D
2061 026C  2A4D     GOTO 0x24D
2062 026D  2A6E     GOTO 0x26E
2063 138:                           tohex(val, romid[j]);
2064 024D  0847     MOVF 0x47, W
2065 024E  3E20     ADDLW 0x20
2066 024F  0086     MOVWF FSR1L
2067 0250  0187     CLRF FSR1H
2068 0251  0801     MOVF INDF1, W
2069 0252  0020     MOVLB 0x0
2070 0253  00C1     MOVWF 0x41
2071 0254  0841     MOVF 0x41, W
2072 0255  00F4     MOVWF i
2073 0256  30BB     MOVLW 0xBB
2074 0257  318E     MOVLP 0xE
2075 0258  2659     CALL 0x659
2076 0259  3180     MOVLP 0x0
2077 139:                           msg_write(val);
2078 025A  30BB     MOVLW 0xBB
2079 025B  00F4     MOVWF i
2080 025C  3000     MOVLW 0x0
2081 025D  00F5     MOVWF presence
2082 025E  318E     MOVLP 0xE
2083 025F  2613     CALL 0x613
2084 0260  3180     MOVLP 0x0
2085 140:                       }
2086 141:                       if (usermode) msg_write("\r\n"); else msg_write("\n");
2087 026E  084C     MOVF 0x4C, W
2088 026F  1D03     BTFSS STATUS, 0x2
2089 0270  2A72     GOTO 0x272
2090 0271  2A7A     GOTO 0x27A
2091 0272  3059     MOVLW 0x59
2092 0273  00F4     MOVWF i
2093 0274  3086     MOVLW 0x86
2094 0275  00F5     MOVWF presence
2095 0276  318E     MOVLP 0xE
2096 0277  2613     CALL 0x613
2097 0278  3180     MOVLP 0x0
2098 0279  2CDC     GOTO 0x4DC
2099 027A  305A     MOVLW 0x5A
2100 027B  00F4     MOVWF i
2101 027C  3086     MOVLW 0x86
2102 027D  00F5     MOVWF presence
2103 027E  318E     MOVLP 0xE
2104 027F  2613     CALL 0x613
2105 0280  3180     MOVLP 0x0
2106 0281  2CDC     GOTO 0x4DC
2107 142:                   }else
2108 0282  2CDC     GOTO 0x4DC
2109 143:                   if (cmd == 'p' || cmd == 'P') {
2110 0283  0021     MOVLB 0x1
2111 0284  084B     MOVF 0x4B, W
2112 0285  3A70     XORLW 0x70
2113 0286  1903     BTFSC STATUS, 0x2
2114 0287  2A89     GOTO 0x289
2115 0288  2A8A     GOTO 0x28A
2116 0289  2A91     GOTO 0x291
2117 028A  084B     MOVF 0x4B, W
2118 028B  3A50     XORLW 0x50
2119 028C  1D03     BTFSS STATUS, 0x2
2120 028D  2A8F     GOTO 0x28F
2121 028E  2A90     GOTO 0x290
2122 028F  2AD5     GOTO 0x2D5
2123 0290  2A91     GOTO 0x291
2124 144:                       if (usermode) msg_write("\r");
2125 0291  084C     MOVF 0x4C, W
2126 0292  1D03     BTFSS STATUS, 0x2
2127 0293  2A95     GOTO 0x295
2128 0294  2A9D     GOTO 0x29D
2129 0295  30B2     MOVLW 0xB2
2130 0296  00F4     MOVWF i
2131 0297  3088     MOVLW 0x88
2132 0298  00F5     MOVWF presence
2133 0299  318E     MOVLP 0xE
2134 029A  2613     CALL 0x613
2135 029B  3180     MOVLP 0x0
2136 029C  2A9D     GOTO 0x29D
2137 145:                       bool para = OW_parasite();
2138 029D  318B     MOVLP 0xB
2139 029E  23AE     CALL 0x3AE
2140 029F  3180     MOVLP 0x0
2141 02A0  0020     MOVLB 0x0
2142 02A1  00C1     MOVWF 0x41
2143 02A2  0841     MOVF 0x41, W
2144 02A3  0021     MOVLB 0x1
2145 02A4  00C2     MOVWF 0x42
2146 146:                       if (usermode) {
2147 02A5  084C     MOVF 0x4C, W
2148 02A6  1D03     BTFSS STATUS, 0x2
2149 02A7  2AA9     GOTO 0x2A9
2150 02A8  2ABE     GOTO 0x2BE
2151 147:                           if (para)
2152 02A9  0842     MOVF 0x42, W
2153 02AA  1D03     BTFSS STATUS, 0x2
2154 02AB  2AAD     GOTO 0x2AD
2155 02AC  2AB5     GOTO 0x2B5
2156 148:                               msg_write("PARA A Device is parasite powered\r\n");
2157 02AD  30CB     MOVLW 0xCB
2158 02AE  00F4     MOVWF i
2159 02AF  3086     MOVLW 0x86
2160 02B0  00F5     MOVWF presence
2161 02B1  318E     MOVLP 0xE
2162 02B2  2613     CALL 0x613
2163 02B3  3180     MOVLP 0x0
2164 02B4  2CDC     GOTO 0x4DC
2165 149:                           else
2166 150:                               msg_write("PARA No Device is parasite powered.\r\n");
2167 02B5  3036     MOVLW 0x36
2168 02B6  00F4     MOVWF i
2169 02B7  3086     MOVLW 0x86
2170 02B8  00F5     MOVWF presence
2171 02B9  318E     MOVLP 0xE
2172 02BA  2613     CALL 0x613
2173 02BB  3180     MOVLP 0x0
2174 02BC  2CDC     GOTO 0x4DC
2175 151:                       } else {
2176 02BD  2CDC     GOTO 0x4DC
2177 152:                           if (para) msg_write("PARA\n"); else msg_write("DIRECT\n");
2178 02BE  0021     MOVLB 0x1
2179 02BF  0842     MOVF 0x42, W
2180 02C0  1D03     BTFSS STATUS, 0x2
2181 02C1  2AC3     GOTO 0x2C3
2182 02C2  2ACB     GOTO 0x2CB
2183 02C3  3091     MOVLW 0x91
2184 02C4  00F4     MOVWF i
2185 02C5  3088     MOVLW 0x88
2186 02C6  00F5     MOVWF presence
2187 02C7  318E     MOVLP 0xE
2188 02C8  2613     CALL 0x613
2189 02C9  3180     MOVLP 0x0
2190 02CA  2CDC     GOTO 0x4DC
2191 02CB  3082     MOVLW 0x82
2192 02CC  00F4     MOVWF i
2193 02CD  3088     MOVLW 0x88
2194 02CE  00F5     MOVWF presence
2195 02CF  318E     MOVLP 0xE
2196 02D0  2613     CALL 0x613
2197 02D1  3180     MOVLP 0x0
2198 02D2  2CDC     GOTO 0x4DC
2199 02D3  2CDC     GOTO 0x4DC
2200 153:                       }
2201 154:                   }else
2202 02D4  2CDC     GOTO 0x4DC
2203 155:                   if (cmd == 's' || cmd =='S') {
2204 02D5  0021     MOVLB 0x1
2205 02D6  084B     MOVF 0x4B, W
2206 02D7  3A73     XORLW 0x73
2207 02D8  1903     BTFSC STATUS, 0x2
2208 02D9  2ADB     GOTO 0x2DB
2209 02DA  2ADC     GOTO 0x2DC
2210 02DB  2AE2     GOTO 0x2E2
2211 02DC  084B     MOVF 0x4B, W
2212 02DD  3A53     XORLW 0x53
2213 02DE  1D03     BTFSS STATUS, 0x2
2214 02DF  2AE1     GOTO 0x2E1
2215 02E0  2AE2     GOTO 0x2E2
2216 02E1  2B44     GOTO 0x344
2217 156:                       uint8_t scratch[9];
2218 157:                       romid[0] = 0; // select all devices
2219 02E2  0020     MOVLB 0x0
2220 02E3  01A0     CLRF romid
2221 158:                       OW_read_block(0xBE, scratch, 9);
2222 02E4  30A0     MOVLW 0xA0
2223 02E5  00C1     MOVWF 0x41
2224 02E6  0841     MOVF 0x41, W
2225 02E7  00BA     MOVWF search_result
2226 02E8  3009     MOVLW 0x9
2227 02E9  00C2     MOVWF 0x42
2228 02EA  0842     MOVF 0x42, W
2229 02EB  00BB     MOVWF id_bit
2230 02EC  30BE     MOVLW 0xBE
2231 02ED  318D     MOVLP 0xD
2232 02EE  251A     CALL 0x51A
2233 02EF  3180     MOVLP 0x0
2234 159:                       if (usermode) msg_write("\rSCRATCH");
2235 02F0  0021     MOVLB 0x1
2236 02F1  084C     MOVF 0x4C, W
2237 02F2  1D03     BTFSS STATUS, 0x2
2238 02F3  2AF5     GOTO 0x2F5
2239 02F4  2AFD     GOTO 0x2FD
2240 02F5  3079     MOVLW 0x79
2241 02F6  00F4     MOVWF i
2242 02F7  3088     MOVLW 0x88
2243 02F8  00F5     MOVWF presence
2244 02F9  318E     MOVLP 0xE
2245 02FA  2613     CALL 0x613
2246 02FB  3180     MOVLP 0x0
2247 02FC  2AFD     GOTO 0x2FD
2248 160:                       for (char j=0; j<9; j++) {
2249 02FD  0021     MOVLB 0x1
2250 02FE  01C8     CLRF 0x48
2251 02FF  3009     MOVLW 0x9
2252 0300  0248     SUBWF 0x48, W
2253 0301  1C03     BTFSS STATUS, 0x0
2254 0302  2B04     GOTO 0x304
2255 0303  2B05     GOTO 0x305
2256 0304  2B07     GOTO 0x307
2257 0305  2B2F     GOTO 0x32F
2258 0306  2B2F     GOTO 0x32F
2259 0322  3001     MOVLW 0x1
2260 0323  0020     MOVLB 0x0
2261 0324  00C1     MOVWF 0x41
2262 0325  0841     MOVF 0x41, W
2263 0326  0021     MOVLB 0x1
2264 0327  07C8     ADDWF 0x48, F
2265 0328  3009     MOVLW 0x9
2266 0329  0248     SUBWF 0x48, W
2267 032A  1C03     BTFSS STATUS, 0x0
2268 032B  2B2D     GOTO 0x32D
2269 032C  2B2E     GOTO 0x32E
2270 032D  2B07     GOTO 0x307
2271 032E  2B2F     GOTO 0x32F
2272 161:                           char val[3];
2273 162:                           tohex(val, scratch[j]);
2274 0307  0848     MOVF 0x48, W
2275 0308  3EA0     ADDLW 0xA0
2276 0309  0086     MOVWF FSR1L
2277 030A  0187     CLRF FSR1H
2278 030B  0801     MOVF INDF1, W
2279 030C  0020     MOVLB 0x0
2280 030D  00C1     MOVWF 0x41
2281 030E  0841     MOVF 0x41, W
2282 030F  00F4     MOVWF i
2283 0310  30BE     MOVLW 0xBE
2284 0311  318E     MOVLP 0xE
2285 0312  2659     CALL 0x659
2286 0313  3180     MOVLP 0x0
2287 163:                           msg_write(" ");
2288 0314  30B0     MOVLW 0xB0
2289 0315  00F4     MOVWF i
2290 0316  3088     MOVLW 0x88
2291 0317  00F5     MOVWF presence
2292 0318  318E     MOVLP 0xE
2293 0319  2613     CALL 0x613
2294 031A  3180     MOVLP 0x0
2295 164:                           msg_write(val);
2296 031B  30BE     MOVLW 0xBE
2297 031C  00F4     MOVWF i
2298 031D  3000     MOVLW 0x0
2299 031E  00F5     MOVWF presence
2300 031F  318E     MOVLP 0xE
2301 0320  2613     CALL 0x613
2302 0321  3180     MOVLP 0x0
2303 165:                       }
2304 166:                       if (usermode) msg_write("\r\n"); else msg_write("\n");
2305 032F  084C     MOVF 0x4C, W
2306 0330  1D03     BTFSS STATUS, 0x2
2307 0331  2B33     GOTO 0x333
2308 0332  2B3B     GOTO 0x33B
2309 0333  3059     MOVLW 0x59
2310 0334  00F4     MOVWF i
2311 0335  3086     MOVLW 0x86
2312 0336  00F5     MOVWF presence
2313 0337  318E     MOVLP 0xE
2314 0338  2613     CALL 0x613
2315 0339  3180     MOVLP 0x0
2316 033A  2CDC     GOTO 0x4DC
2317 033B  305A     MOVLW 0x5A
2318 033C  00F4     MOVWF i
2319 033D  3086     MOVLW 0x86
2320 033E  00F5     MOVWF presence
2321 033F  318E     MOVLP 0xE
2322 0340  2613     CALL 0x613
2323 0341  3180     MOVLP 0x0
2324 0342  2CDC     GOTO 0x4DC
2325 167:                   }else
2326 0343  2CDC     GOTO 0x4DC
2327 168:                   if (cmd == 't' || cmd == 'T') {
2328 0344  0021     MOVLB 0x1
2329 0345  084B     MOVF 0x4B, W
2330 0346  3A74     XORLW 0x74
2331 0347  1903     BTFSC STATUS, 0x2
2332 0348  2B4A     GOTO 0x34A
2333 0349  2B4B     GOTO 0x34B
2334 034A  2B52     GOTO 0x352
2335 034B  084B     MOVF 0x4B, W
2336 034C  3A54     XORLW 0x54
2337 034D  1D03     BTFSS STATUS, 0x2
2338 034E  2B50     GOTO 0x350
2339 034F  2B51     GOTO 0x351
2340 0350  2C10     GOTO 0x410
2341 0351  2B52     GOTO 0x352
2342 169:                       char val[3];
2343 170:                       uint8_t scratch[9];
2344 171:           
2345 172:                       // oddly, cant do a mass-convert with parasitic
2346 173:                       // they seem to all reset when you try
2347 174:                       
2348 175:                       // now step through every unit and read the value
2349 176:                       OW_search_init();
2350 0352  318C     MOVLP 0xC
2351 0353  248C     CALL 0x48C
2352 0354  3180     MOVLP 0x0
2353 177:                       while (OW_search())
2354 0355  2BF8     GOTO 0x3F8
2355 03F8  318F     MOVLP 0xF
2356 03F9  270C     CALL 0x70C
2357 03FA  3180     MOVLP 0x0
2358 03FB  3800     IORLW 0x0
2359 03FC  1D03     BTFSS STATUS, 0x2
2360 03FD  2BFF     GOTO 0x3FF
2361 03FE  2C00     GOTO 0x400
2362 03FF  2B56     GOTO 0x356
2363 0400  2C01     GOTO 0x401
2364 178:                       {
2365 179:                           // ask device to do conversion
2366 180:                           OW_convert();
2367 0356  318E     MOVLP 0xE
2368 0357  26A0     CALL 0x6A0
2369 0358  3180     MOVLP 0x0
2370 181:           
2371 182:                           // empty the scratch pad
2372 183:                           for (char j=0; j<9; j++) scratch[j]=0;
2373 0359  0021     MOVLB 0x1
2374 035A  01C9     CLRF 0x49
2375 035B  3009     MOVLW 0x9
2376 035C  0249     SUBWF 0x49, W
2377 035D  1C03     BTFSS STATUS, 0x0
2378 035E  2B60     GOTO 0x360
2379 035F  2B61     GOTO 0x361
2380 0360  2B63     GOTO 0x363
2381 0361  2B75     GOTO 0x375
2382 0362  2B75     GOTO 0x375
2383 0363  0849     MOVF 0x49, W
2384 0364  3EA9     ADDLW 0xA9
2385 0365  0086     MOVWF FSR1L
2386 0366  0187     CLRF FSR1H
2387 0367  0181     CLRF INDF1
2388 0368  3001     MOVLW 0x1
2389 0369  0020     MOVLB 0x0
2390 036A  00C1     MOVWF 0x41
2391 036B  0841     MOVF 0x41, W
2392 036C  0021     MOVLB 0x1
2393 036D  07C9     ADDWF 0x49, F
2394 036E  3009     MOVLW 0x9
2395 036F  0249     SUBWF 0x49, W
2396 0370  1C03     BTFSS STATUS, 0x0
2397 0371  2B73     GOTO 0x373
2398 0372  2B74     GOTO 0x374
2399 0373  2B63     GOTO 0x363
2400 0374  2B75     GOTO 0x375
2401 184:           
2402 185:                           // read this devices scratch pad
2403 186:                           OW_read_block(0xBE, scratch, 9);
2404 0375  30A9     MOVLW 0xA9
2405 0376  0020     MOVLB 0x0
2406 0377  00C1     MOVWF 0x41
2407 0378  0841     MOVF 0x41, W
2408 0379  00BA     MOVWF search_result
2409 037A  3009     MOVLW 0x9
2410 037B  00C2     MOVWF 0x42
2411 037C  0842     MOVF 0x42, W
2412 037D  00BB     MOVWF id_bit
2413 037E  30BE     MOVLW 0xBE
2414 037F  318D     MOVLP 0xD
2415 0380  251A     CALL 0x51A
2416 0381  3180     MOVLP 0x0
2417 187:           
2418 188:                           // print rom id and temperature
2419 189:                           if (usermode) msg_write("\rTEMP ");
2420 0382  0021     MOVLB 0x1
2421 0383  084C     MOVF 0x4C, W
2422 0384  1D03     BTFSS STATUS, 0x2
2423 0385  2B87     GOTO 0x387
2424 0386  2B8F     GOTO 0x38F
2425 0387  308A     MOVLW 0x8A
2426 0388  00F4     MOVWF i
2427 0389  3088     MOVLW 0x88
2428 038A  00F5     MOVWF presence
2429 038B  318E     MOVLP 0xE
2430 038C  2613     CALL 0x613
2431 038D  3180     MOVLP 0x0
2432 038E  2B8F     GOTO 0x38F
2433 190:                           for (char j=0;j<8;j++) {
2434 038F  0021     MOVLB 0x1
2435 0390  01CA     CLRF 0x4A
2436 0391  3008     MOVLW 0x8
2437 0392  024A     SUBWF 0x4A, W
2438 0393  1C03     BTFSS STATUS, 0x0
2439 0394  2B96     GOTO 0x396
2440 0395  2B97     GOTO 0x397
2441 0396  2B99     GOTO 0x399
2442 0397  2BBA     GOTO 0x3BA
2443 0398  2BBA     GOTO 0x3BA
2444 03AD  3001     MOVLW 0x1
2445 03AE  0020     MOVLB 0x0
2446 03AF  00C1     MOVWF 0x41
2447 03B0  0841     MOVF 0x41, W
2448 03B1  0021     MOVLB 0x1
2449 03B2  07CA     ADDWF 0x4A, F
2450 03B3  3008     MOVLW 0x8
2451 03B4  024A     SUBWF 0x4A, W
2452 03B5  1C03     BTFSS STATUS, 0x0
2453 03B6  2BB8     GOTO 0x3B8
2454 03B7  2BB9     GOTO 0x3B9
2455 03B8  2B99     GOTO 0x399
2456 03B9  2BBA     GOTO 0x3BA
2457 191:                               tohex(val, romid[j]);
2458 0399  084A     MOVF 0x4A, W
2459 039A  3E20     ADDLW 0x20
2460 039B  0086     MOVWF FSR1L
2461 039C  0187     CLRF FSR1H
2462 039D  0801     MOVF INDF1, W
2463 039E  0020     MOVLB 0x0
2464 039F  00C1     MOVWF 0x41
2465 03A0  0841     MOVF 0x41, W
2466 03A1  00F4     MOVWF i
2467 03A2  30C3     MOVLW 0xC3
2468 03A3  318E     MOVLP 0xE
2469 03A4  2659     CALL 0x659
2470 03A5  3180     MOVLP 0x0
2471 192:                               msg_write(val);
2472 03A6  30C3     MOVLW 0xC3
2473 03A7  00F4     MOVWF i
2474 03A8  3000     MOVLW 0x0
2475 03A9  00F5     MOVWF presence
2476 03AA  318E     MOVLP 0xE
2477 03AB  2613     CALL 0x613
2478 03AC  3180     MOVLP 0x0
2479 193:                           }
2480 194:                           msg_write(" ");
2481 03BA  30B0     MOVLW 0xB0
2482 03BB  00F4     MOVWF i
2483 03BC  3088     MOVLW 0x88
2484 03BD  00F5     MOVWF presence
2485 03BE  318E     MOVLP 0xE
2486 03BF  2613     CALL 0x613
2487 03C0  3180     MOVLP 0x0
2488 195:                           tohex(val, scratch[1]);
2489 03C1  0021     MOVLB 0x1
2490 03C2  082A     MOVF LastFamilyDiscrepancy, W
2491 03C3  0020     MOVLB 0x0
2492 03C4  00C1     MOVWF 0x41
2493 03C5  0841     MOVF 0x41, W
2494 03C6  00F4     MOVWF i
2495 03C7  30C3     MOVLW 0xC3
2496 03C8  318E     MOVLP 0xE
2497 03C9  2659     CALL 0x659
2498 03CA  3180     MOVLP 0x0
2499 196:                           msg_write(val);
2500 03CB  30C3     MOVLW 0xC3
2501 03CC  00F4     MOVWF i
2502 03CD  3000     MOVLW 0x0
2503 03CE  00F5     MOVWF presence
2504 03CF  318E     MOVLP 0xE
2505 03D0  2613     CALL 0x613
2506 03D1  3180     MOVLP 0x0
2507 197:                           tohex(val, scratch[0]);
2508 03D2  0021     MOVLB 0x1
2509 03D3  0829     MOVF LastDiscrepancy, W
2510 03D4  0020     MOVLB 0x0
2511 03D5  00C1     MOVWF 0x41
2512 03D6  0841     MOVF 0x41, W
2513 03D7  00F4     MOVWF i
2514 03D8  30C3     MOVLW 0xC3
2515 03D9  318E     MOVLP 0xE
2516 03DA  2659     CALL 0x659
2517 03DB  3180     MOVLP 0x0
2518 198:                           msg_write(val);
2519 03DC  30C3     MOVLW 0xC3
2520 03DD  00F4     MOVWF i
2521 03DE  3000     MOVLW 0x0
2522 03DF  00F5     MOVWF presence
2523 03E0  318E     MOVLP 0xE
2524 03E1  2613     CALL 0x613
2525 03E2  3180     MOVLP 0x0
2526 199:                           if (usermode) msg_write("\r\n"); else msg_write("\n");
2527 03E3  0021     MOVLB 0x1
2528 03E4  084C     MOVF 0x4C, W
2529 03E5  1D03     BTFSS STATUS, 0x2
2530 03E6  2BE8     GOTO 0x3E8
2531 03E7  2BF0     GOTO 0x3F0
2532 03E8  3059     MOVLW 0x59
2533 03E9  00F4     MOVWF i
2534 03EA  3086     MOVLW 0x86
2535 03EB  00F5     MOVWF presence
2536 03EC  318E     MOVLP 0xE
2537 03ED  2613     CALL 0x613
2538 03EE  3180     MOVLP 0x0
2539 03EF  2BF8     GOTO 0x3F8
2540 03F0  305A     MOVLW 0x5A
2541 03F1  00F4     MOVWF i
2542 03F2  3086     MOVLW 0x86
2543 03F3  00F5     MOVWF presence
2544 03F4  318E     MOVLP 0xE
2545 03F5  2613     CALL 0x613
2546 03F6  3180     MOVLP 0x0
2547 03F7  2BF8     GOTO 0x3F8
2548 200:                       }
2549 201:           
2550 202:                       if (!usermode) msg_write("END\n");
2551 0401  0021     MOVLB 0x1
2552 0402  08CC     MOVF 0x4C, F
2553 0403  1D03     BTFSS STATUS, 0x2
2554 0404  2C06     GOTO 0x406
2555 0405  2C07     GOTO 0x407
2556 0406  2CDC     GOTO 0x4DC
2557 0407  30A3     MOVLW 0xA3
2558 0408  00F4     MOVWF i
2559 0409  3088     MOVLW 0x88
2560 040A  00F5     MOVWF presence
2561 040B  318E     MOVLP 0xE
2562 040C  2613     CALL 0x613
2563 040D  3180     MOVLP 0x0
2564 040E  2CDC     GOTO 0x4DC
2565 203:           
2566 204:                   }else
2567 040F  2CDC     GOTO 0x4DC
2568 205:                   if (cmd == '0')
2569 0410  0021     MOVLB 0x1
2570 0411  084B     MOVF 0x4B, W
2571 0412  3A30     XORLW 0x30
2572 0413  1D03     BTFSS STATUS, 0x2
2573 0414  2C16     GOTO 0x416
2574 0415  2C17     GOTO 0x417
2575 0416  2C30     GOTO 0x430
2576 206:                   {
2577 207:                       drive_OW_low();
2578 0417  318B     MOVLP 0xB
2579 0418  232D     CALL 0x32D
2580 0419  3180     MOVLP 0x0
2581 208:                       if (usermode)
2582 041A  0021     MOVLB 0x1
2583 041B  084C     MOVF 0x4C, W
2584 041C  1D03     BTFSS STATUS, 0x2
2585 041D  2C1F     GOTO 0x41F
2586 041E  2C27     GOTO 0x427
2587 209:                           msg_write("\rBUS 1-Wire set low\r\n");
2588 041F  3029     MOVLW 0x29
2589 0420  00F4     MOVWF i
2590 0421  3088     MOVLW 0x88
2591 0422  00F5     MOVWF presence
2592 0423  318E     MOVLP 0xE
2593 0424  2613     CALL 0x613
2594 0425  3180     MOVLP 0x0
2595 0426  2CDC     GOTO 0x4DC
2596 210:                       else
2597 211:                           msg_write("LOW\n");
2598 0427  30A8     MOVLW 0xA8
2599 0428  00F4     MOVWF i
2600 0429  3088     MOVLW 0x88
2601 042A  00F5     MOVWF presence
2602 042B  318E     MOVLP 0xE
2603 042C  2613     CALL 0x613
2604 042D  3180     MOVLP 0x0
2605 042E  2CDC     GOTO 0x4DC
2606 212:                   }else
2607 042F  2CDC     GOTO 0x4DC
2608 213:                   if (cmd == '1')
2609 0430  0021     MOVLB 0x1
2610 0431  084B     MOVF 0x4B, W
2611 0432  3A31     XORLW 0x31
2612 0433  1D03     BTFSS STATUS, 0x2
2613 0434  2C36     GOTO 0x436
2614 0435  2C37     GOTO 0x437
2615 0436  2C50     GOTO 0x450
2616 214:                   {
2617 215:                       drive_OW_high();
2618 0437  318B     MOVLP 0xB
2619 0438  2328     CALL 0x328
2620 0439  3180     MOVLP 0x0
2621 216:                       if (usermode) 
2622 043A  0021     MOVLB 0x1
2623 043B  084C     MOVF 0x4C, W
2624 043C  1D03     BTFSS STATUS, 0x2
2625 043D  2C3F     GOTO 0x43F
2626 043E  2C47     GOTO 0x447
2627 217:                           msg_write("\rBUS 1-wire set high\r\n");
2628 043F  3012     MOVLW 0x12
2629 0440  00F4     MOVWF i
2630 0441  3088     MOVLW 0x88
2631 0442  00F5     MOVWF presence
2632 0443  318E     MOVLP 0xE
2633 0444  2613     CALL 0x613
2634 0445  3180     MOVLP 0x0
2635 0446  2CDC     GOTO 0x4DC
2636 218:                       else
2637 219:                           msg_write("HIGH\n");
2638 0447  3097     MOVLW 0x97
2639 0448  00F4     MOVWF i
2640 0449  3088     MOVLW 0x88
2641 044A  00F5     MOVWF presence
2642 044B  318E     MOVLP 0xE
2643 044C  2613     CALL 0x613
2644 044D  3180     MOVLP 0x0
2645 044E  2CDC     GOTO 0x4DC
2646 220:                   }else
2647 044F  2CDC     GOTO 0x4DC
2648 221:                   if (cmd == '3')
2649 0450  0021     MOVLB 0x1
2650 0451  084B     MOVF 0x4B, W
2651 0452  3A33     XORLW 0x33
2652 0453  1D03     BTFSS STATUS, 0x2
2653 0454  2C56     GOTO 0x456
2654 0455  2C57     GOTO 0x457
2655 0456  2C70     GOTO 0x470
2656 222:                   {
2657 223:                       float_OW();
2658 0457  3184     MOVLP 0x4
2659 0458  24FD     CALL 0x4FD
2660 0459  3180     MOVLP 0x0
2661 224:                       if (usermode)
2662 045A  0021     MOVLB 0x1
2663 045B  084C     MOVF 0x4C, W
2664 045C  1D03     BTFSS STATUS, 0x2
2665 045D  2C5F     GOTO 0x45F
2666 045E  2C67     GOTO 0x467
2667 225:                           msg_write("\rBUS 1-wire set to tri-state\r\n");
2668 045F  30EF     MOVLW 0xEF
2669 0460  00F4     MOVWF i
2670 0461  3086     MOVLW 0x86
2671 0462  00F5     MOVWF presence
2672 0463  318E     MOVLP 0xE
2673 0464  2613     CALL 0x613
2674 0465  3180     MOVLP 0x0
2675 0466  2CDC     GOTO 0x4DC
2676 226:                       else
2677 227:                           msg_write("TRISTATE\n");
2678 0467  3066     MOVLW 0x66
2679 0468  00F4     MOVWF i
2680 0469  3088     MOVLW 0x88
2681 046A  00F5     MOVWF presence
2682 046B  318E     MOVLP 0xE
2683 046C  2613     CALL 0x613
2684 046D  3180     MOVLP 0x0
2685 046E  2CDC     GOTO 0x4DC
2686 228:                   }else
2687 046F  2CDC     GOTO 0x4DC
2688 229:                   if (cmd == '?')
2689 0470  0021     MOVLB 0x1
2690 0471  084B     MOVF 0x4B, W
2691 0472  3A3F     XORLW 0x3F
2692 0473  1D03     BTFSS STATUS, 0x2
2693 0474  2C76     GOTO 0x476
2694 0475  2C77     GOTO 0x477
2695 0476  2CAF     GOTO 0x4AF
2696 230:                   {
2697 231:                       bool line = read_OW();
2698 0477  318B     MOVLP 0xB
2699 0478  2332     CALL 0x332
2700 0479  3180     MOVLP 0x0
2701 047A  0020     MOVLB 0x0
2702 047B  00C1     MOVWF 0x41
2703 047C  0841     MOVF 0x41, W
2704 047D  0021     MOVLB 0x1
2705 047E  00B3     MOVWF 0x33
2706 232:                       if (line) {
2707 047F  0833     MOVF 0x33, W
2708 0480  1D03     BTFSS STATUS, 0x2
2709 0481  2C83     GOTO 0x483
2710 0482  2C98     GOTO 0x498
2711 233:                           if (usermode) msg_write("\rBUS HIGH\r\n");
2712 0483  084C     MOVF 0x4C, W
2713 0484  1D03     BTFSS STATUS, 0x2
2714 0485  2C87     GOTO 0x487
2715 0486  2C8F     GOTO 0x48F
2716 0487  304F     MOVLW 0x4F
2717 0488  00F4     MOVWF i
2718 0489  3088     MOVLW 0x88
2719 048A  00F5     MOVWF presence
2720 048B  318E     MOVLP 0xE
2721 048C  2613     CALL 0x613
2722 048D  3180     MOVLP 0x0
2723 048E  2CDC     GOTO 0x4DC
2724 234:                           else
2725 235:                               msg_write("HIGH\n");
2726 048F  3097     MOVLW 0x97
2727 0490  00F4     MOVWF i
2728 0491  3088     MOVLW 0x88
2729 0492  00F5     MOVWF presence
2730 0493  318E     MOVLP 0xE
2731 0494  2613     CALL 0x613
2732 0495  3180     MOVLP 0x0
2733 0496  2CDC     GOTO 0x4DC
2734 236:                       } else {
2735 0497  2CDC     GOTO 0x4DC
2736 237:                           if (usermode) msg_write("\rBUS LOW\r\n");
2737 0498  0021     MOVLB 0x1
2738 0499  084C     MOVF 0x4C, W
2739 049A  1D03     BTFSS STATUS, 0x2
2740 049B  2C9D     GOTO 0x49D
2741 049C  2CA5     GOTO 0x4A5
2742 049D  305B     MOVLW 0x5B
2743 049E  00F4     MOVWF i
2744 049F  3088     MOVLW 0x88
2745 04A0  00F5     MOVWF presence
2746 04A1  318E     MOVLP 0xE
2747 04A2  2613     CALL 0x613
2748 04A3  3180     MOVLP 0x0
2749 04A4  2CDC     GOTO 0x4DC
2750 238:                           else msg_write("LOW\n");
2751 04A5  30A8     MOVLW 0xA8
2752 04A6  00F4     MOVWF i
2753 04A7  3088     MOVLW 0x88
2754 04A8  00F5     MOVWF presence
2755 04A9  318E     MOVLP 0xE
2756 04AA  2613     CALL 0x613
2757 04AB  3180     MOVLP 0x0
2758 04AC  2CDC     GOTO 0x4DC
2759 04AD  2CDC     GOTO 0x4DC
2760 239:                       }
2761 240:                   }else
2762 04AE  2CDC     GOTO 0x4DC
2763 241:                   {
2764 242:                       if (usermode) {
2765 04AF  0021     MOVLB 0x1
2766 04B0  084C     MOVF 0x4C, W
2767 04B1  1D03     BTFSS STATUS, 0x2
2768 04B2  2CB4     GOTO 0x4B4
2769 04B3  2CBC     GOTO 0x4BC
2770 243:                           msg_write("ERROR Press H for Help\n");
2771 04B4  30FA     MOVLW 0xFA
2772 04B5  00F4     MOVWF i
2773 04B6  3087     MOVLW 0x87
2774 04B7  00F5     MOVWF presence
2775 04B8  318E     MOVLP 0xE
2776 04B9  2613     CALL 0x613
2777 04BA  3180     MOVLP 0x0
2778 244:                       } else {
2779 04BB  2CDC     GOTO 0x4DC
2780 245:                           msg_write("\rERROR Unknown command '");
2781 04BC  30B1     MOVLW 0xB1
2782 04BD  00F4     MOVWF i
2783 04BE  3087     MOVLW 0x87
2784 04BF  00F5     MOVWF presence
2785 04C0  318E     MOVLP 0xE
2786 04C1  2613     CALL 0x613
2787 04C2  3180     MOVLP 0x0
2788 246:                           msg_writebyte(cmd);
2789 04C3  0021     MOVLB 0x1
2790 04C4  084B     MOVF 0x4B, W
2791 04C5  318D     MOVLP 0xD
2792 04C6  25CF     CALL 0x5CF
2793 04C7  3180     MOVLP 0x0
2794 247:                           msg_write("' Press 'H' for help.\r\n");
2795 04C8  30CA     MOVLW 0xCA
2796 04C9  00F4     MOVWF i
2797 04CA  3087     MOVLW 0x87
2798 04CB  00F5     MOVWF presence
2799 04CC  318E     MOVLP 0xE
2800 04CD  2613     CALL 0x613
2801 04CE  3180     MOVLP 0x0
2802 04CF  2CDC     GOTO 0x4DC
2803 248:                       }
2804 04D0  2CDC     GOTO 0x4DC
2805 249:                   }
2806 04D1  2CDC     GOTO 0x4DC
2807 04D2  2CDC     GOTO 0x4DC
2808 04D3  2CDC     GOTO 0x4DC
2809 04D4  2CDC     GOTO 0x4DC
2810 04D5  2CDC     GOTO 0x4DC
2811 04D6  2CDC     GOTO 0x4DC
2812 04D7  2CDC     GOTO 0x4DC
2813 04D8  2CDC     GOTO 0x4DC
2814 04D9  2CDC     GOTO 0x4DC
2815 04DA  2CDC     GOTO 0x4DC
2816 04DB  2CDC     GOTO 0x4DC
2817 250:           
2818 251:                   if (usermode) msg_write(prompt);
2819 04DC  0021     MOVLB 0x1
2820 04DD  084C     MOVF 0x4C, W
2821 04DE  1D03     BTFSS STATUS, 0x2
2822 04DF  2CE1     GOTO 0x4E1
2823 04E0  2862     GOTO 0x62
2824 04E1  302C     MOVLW 0x2C
2825 04E2  00F4     MOVWF i
2826 04E3  3000     MOVLW 0x0
2827 04E4  00F5     MOVWF presence
2828 04E5  318E     MOVLP 0xE
2829 04E6  2613     CALL 0x613
2830 04E7  3180     MOVLP 0x0
2831 04E8  2862     GOTO 0x62
2832 04E9  2862     GOTO 0x62
2833 252:               }
2834 253:           }
2835 04EB  3180     MOVLP 0x0
2836 254:           
2837 255:           /* make a hex string from a value
2838 256:            * expect 3 char array */
2839 257:           void tohex(char val[], char i)
2840 258:           {
2841 0E59  0020     MOVLB 0x0
2842 0E5A  00B7     MOVWF i
2843 259:               char bt = i >> 4;
2844 0E5B  0874     MOVF i, W
2845 0E5C  00B5     MOVWF in
2846 0E5D  3004     MOVLW 0x4
2847 0E5E  36B5     LSRF in, F
2848 0E5F  0B89     DECFSZ WREG, F
2849 0E60  2E5E     GOTO 0x65E
2850 0E61  0835     MOVF in, W
2851 0E62  00B6     MOVWF p
2852 0E63  0836     MOVF p, W
2853 0E64  00B8     MOVWF bt
2854 260:               if (bt > 9)
2855 0E65  300A     MOVLW 0xA
2856 0E66  0238     SUBWF bt, W
2857 0E67  1C03     BTFSS STATUS, 0x0
2858 0E68  2E6A     GOTO 0x66A
2859 0E69  2E6B     GOTO 0x66B
2860 0E6A  2E74     GOTO 0x674
2861 261:                   val[0] = 'A' + (bt - 10);
2862 0E6B  0838     MOVF bt, W
2863 0E6C  3E37     ADDLW 0x37
2864 0E6D  00B5     MOVWF in
2865 0E6E  0837     MOVF i, W
2866 0E6F  0086     MOVWF FSR1L
2867 0E70  0187     CLRF FSR1H
2868 0E71  0835     MOVF in, W
2869 0E72  0081     MOVWF INDF1
2870 0E73  2E7D     GOTO 0x67D
2871 262:               else
2872 263:                   val[0] = '0' + bt;
2873 0E74  0838     MOVF bt, W
2874 0E75  3E30     ADDLW 0x30
2875 0E76  00B5     MOVWF in
2876 0E77  0837     MOVF i, W
2877 0E78  0086     MOVWF FSR1L
2878 0E79  0187     CLRF FSR1H
2879 0E7A  0835     MOVF in, W
2880 0E7B  0081     MOVWF INDF1
2881 0E7C  2E7D     GOTO 0x67D
2882 264:               bt = i & 0x0F;
2883 0E7D  0874     MOVF i, W
2884 0E7E  390F     ANDLW 0xF
2885 0E7F  00B5     MOVWF in
2886 0E80  0835     MOVF in, W
2887 0E81  00B8     MOVWF bt
2888 265:               if (bt > 9)
2889 0E82  300A     MOVLW 0xA
2890 0E83  0238     SUBWF bt, W
2891 0E84  1C03     BTFSS STATUS, 0x0
2892 0E85  2E87     GOTO 0x687
2893 0E86  2E88     GOTO 0x688
2894 0E87  2E91     GOTO 0x691
2895 266:                   val[1] = 'A' + (bt - 10);
2896 0E88  0838     MOVF bt, W
2897 0E89  3E37     ADDLW 0x37
2898 0E8A  00B5     MOVWF in
2899 0E8B  0A37     INCF i, W
2900 0E8C  0086     MOVWF FSR1L
2901 0E8D  0187     CLRF FSR1H
2902 0E8E  0835     MOVF in, W
2903 0E8F  0081     MOVWF INDF1
2904 0E90  2E9A     GOTO 0x69A
2905 267:               else
2906 268:                   val[1] = '0' + bt;
2907 0E91  0838     MOVF bt, W
2908 0E92  3E30     ADDLW 0x30
2909 0E93  00B5     MOVWF in
2910 0E94  0A37     INCF i, W
2911 0E95  0086     MOVWF FSR1L
2912 0E96  0187     CLRF FSR1H
2913 0E97  0835     MOVF in, W
2914 0E98  0081     MOVWF INDF1
2915 0E99  2E9A     GOTO 0x69A
2916 269:               val[2] = 0;
2917 0E9A  0837     MOVF i, W
2918 0E9B  3E02     ADDLW 0x2
2919 0E9C  0086     MOVWF FSR1L
2920 0E9D  0187     CLRF FSR1H
2921 0E9E  0181     CLRF INDF1
2922 270:           }
2923 0E9F  0008     RETURN
2924 271:           
2925 272:           
2926 273:           /* is the queue empty yet */
2927 274:           bool msg_empty(void)
2928 275:           {
2929 276:               if (outp == 0) return 1;
2930 0B44  0877     MOVF 0x77, W
2931 0B45  0476     IORWF outp, W
2932 0B46  1D03     BTFSS STATUS, 0x2
2933 0B47  2B49     GOTO 0x349
2934 0B48  2B4A     GOTO 0x34A
2935 0B49  2B4D     GOTO 0x34D
2936 0B4A  3001     MOVLW 0x1
2937 0B4B  2B4F     GOTO 0x34F
2938 0B4C  2B4F     GOTO 0x34F
2939 277:               return 0;
2940 0B4D  3000     MOVLW 0x0
2941 0B4E  2B4F     GOTO 0x34F
2942 278:           }
2943 0B4F  0008     RETURN
2944 279:           
2945 280:           /* new message in the queue */
2946 281:           void msg_write(const char *msg)
2947 282:           {
2948 283:               char * p = outbuff + outlen;
2949 0E13  0879     MOVF outlen, W
2950 0E14  3E8C     ADDLW 0x8C
2951 0E15  0020     MOVLB 0x0
2952 0E16  00B6     MOVWF p
2953 0E17  01B7     CLRF i
2954 0E18  3020     MOVLW 0x20
2955 0E19  3DB7     ADDWFC i, F
2956 284:               while (outlen < sizeof(outbuff) && *msg != 0) {
2957 0E1A  2E34     GOTO 0x634
2958 0E34  3064     MOVLW 0x64
2959 0E35  0279     SUBWF outlen, W
2960 0E36  1803     BTFSC STATUS, 0x0
2961 0E37  2E39     GOTO 0x639
2962 0E38  2E3A     GOTO 0x63A
2963 0E39  2E46     GOTO 0x646
2964 0E3A  0874     MOVF i, W
2965 0E3B  0084     MOVWF FSR0L
2966 0E3C  0875     MOVF presence, W
2967 0E3D  0085     MOVWF FSR0H
2968 0E3E  0800     MOVF INDF0, W
2969 0E3F  3800     IORLW 0x0
2970 0E40  1D03     BTFSS STATUS, 0x2
2971 0E41  2E43     GOTO 0x643
2972 0E42  2E44     GOTO 0x644
2973 0E43  2E1B     GOTO 0x61B
2974 0E44  2E46     GOTO 0x646
2975 0E45  2E46     GOTO 0x646
2976 285:                   *(p++) = *(msg++);
2977 0E1B  0874     MOVF i, W
2978 0E1C  0084     MOVWF FSR0L
2979 0E1D  0875     MOVF presence, W
2980 0E1E  0085     MOVWF FSR0H
2981 0E1F  0800     MOVF INDF0, W
2982 0E20  00B5     MOVWF in
2983 0E21  0836     MOVF p, W
2984 0E22  0086     MOVWF FSR1L
2985 0E23  0837     MOVF i, W
2986 0E24  0087     MOVWF FSR1H
2987 0E25  0835     MOVF in, W
2988 0E26  0081     MOVWF INDF1
2989 0E27  3001     MOVLW 0x1
2990 0E28  07F4     ADDWF i, F
2991 0E29  3000     MOVLW 0x0
2992 0E2A  3DF5     ADDWFC presence, F
2993 0E2B  3001     MOVLW 0x1
2994 0E2C  07B6     ADDWF p, F
2995 0E2D  3000     MOVLW 0x0
2996 0E2E  3DB7     ADDWFC i, F
2997 286:                   outlen++;
2998 0E2F  3001     MOVLW 0x1
2999 0E30  00B5     MOVWF in
3000 0E31  0835     MOVF in, W
3001 0E32  07F9     ADDWF outlen, F
3002 0E33  2E34     GOTO 0x634
3003 287:               }
3004 288:               *p = 0;
3005 0E46  0836     MOVF p, W
3006 0E47  0086     MOVWF FSR1L
3007 0E48  0837     MOVF i, W
3008 0E49  0087     MOVWF FSR1H
3009 0E4A  0181     CLRF INDF1
3010 289:               if (outp == 0) {
3011 0E4B  0877     MOVF 0x77, W
3012 0E4C  0476     IORWF outp, W
3013 0E4D  1D03     BTFSS STATUS, 0x2
3014 0E4E  2E50     GOTO 0x650
3015 0E4F  2E51     GOTO 0x651
3016 0E50  2E58     GOTO 0x658
3017 290:                   outp = outbuff;
3018 0E51  308C     MOVLW 0x8C
3019 0E52  00F6     MOVWF outp
3020 0E53  3020     MOVLW 0x20
3021 0E54  00F7     MOVWF 0x77
3022 291:                   PIE1bits.TXIE = 1;
3023 0E55  0021     MOVLB 0x1
3024 0E56  1611     BSF PIR1, 0x4
3025 0E57  2E58     GOTO 0x658
3026 292:               }
3027 293:           }
3028 0E58  0008     RETURN
3029 294:           
3030 295:           void msg_writebyte(const char msg)
3031 296:           {
3032 0DCF  00F4     MOVWF i
3033 297:               if (outlen+1 >= (uint8_t)sizeof(outbuff)) return;
3034 0DD0  0879     MOVF outlen, W
3035 0DD1  3E01     ADDLW 0x1
3036 0DD2  0020     MOVLB 0x0
3037 0DD3  00B5     MOVWF in
3038 0DD4  3000     MOVLW 0x0
3039 0DD5  1803     BTFSC STATUS, 0x0
3040 0DD6  3001     MOVLW 0x1
3041 0DD7  00B6     MOVWF p
3042 0DD8  0836     MOVF p, W
3043 0DD9  3A80     XORLW 0x80
3044 0DDA  00FF     MOVWF 0x7F
3045 0DDB  3080     MOVLW 0x80
3046 0DDC  027F     SUBWF 0x7F, W
3047 0DDD  1D03     BTFSS STATUS, 0x2
3048 0DDE  2DE1     GOTO 0x5E1
3049 0DDF  3064     MOVLW 0x64
3050 0DE0  0235     SUBWF in, W
3051 0DE1  1C03     BTFSS STATUS, 0x0
3052 0DE2  2DE4     GOTO 0x5E4
3053 0DE3  2DE5     GOTO 0x5E5
3054 0DE4  2DE7     GOTO 0x5E7
3055 0DE5  2E12     GOTO 0x612
3056 0DE6  2E12     GOTO 0x612
3057 298:               outbuff[outlen++] = msg;
3058 0DE7  0874     MOVF i, W
3059 0DE8  0020     MOVLB 0x0
3060 0DE9  00B5     MOVWF in
3061 0DEA  0879     MOVF outlen, W
3062 0DEB  3E8C     ADDLW 0x8C
3063 0DEC  00B6     MOVWF p
3064 0DED  01B7     CLRF i
3065 0DEE  3020     MOVLW 0x20
3066 0DEF  3DB7     ADDWFC i, F
3067 0DF0  0836     MOVF p, W
3068 0DF1  0086     MOVWF FSR1L
3069 0DF2  0837     MOVF i, W
3070 0DF3  0087     MOVWF FSR1H
3071 0DF4  0835     MOVF in, W
3072 0DF5  0081     MOVWF INDF1
3073 0DF6  3001     MOVLW 0x1
3074 0DF7  00B5     MOVWF in
3075 0DF8  0835     MOVF in, W
3076 0DF9  07F9     ADDWF outlen, F
3077 299:               outbuff[outlen] = 0;
3078 0DFA  0879     MOVF outlen, W
3079 0DFB  3E8C     ADDLW 0x8C
3080 0DFC  00B5     MOVWF in
3081 0DFD  01B6     CLRF p
3082 0DFE  3020     MOVLW 0x20
3083 0DFF  3DB6     ADDWFC p, F
3084 0E00  0835     MOVF in, W
3085 0E01  0086     MOVWF FSR1L
3086 0E02  0836     MOVF p, W
3087 0E03  0087     MOVWF FSR1H
3088 0E04  0181     CLRF INDF1
3089 300:               if (outp == 0) {
3090 0E05  0877     MOVF 0x77, W
3091 0E06  0476     IORWF outp, W
3092 0E07  1D03     BTFSS STATUS, 0x2
3093 0E08  2E0A     GOTO 0x60A
3094 0E09  2E0B     GOTO 0x60B
3095 0E0A  2E12     GOTO 0x612
3096 301:                   outp = outbuff;
3097 0E0B  308C     MOVLW 0x8C
3098 0E0C  00F6     MOVWF outp
3099 0E0D  3020     MOVLW 0x20
3100 0E0E  00F7     MOVWF 0x77
3101 302:                   PIE1bits.TXIE = 1;
3102 0E0F  0021     MOVLB 0x1
3103 0E10  1611     BSF PIR1, 0x4
3104 0E11  2E12     GOTO 0x612
3105 303:               }
3106 304:           }
3107 0E12  0008     RETURN
3108 305:           
3109 306:           void putch(char data)
3110 307:           {
3111 308:               msg_writebyte(data);
3112 309:           }
3113 310:           
3114 311:           /* called from interrupt routine to send next char */
3115 312:           void msg_sendnext(void)
3116 313:           {
3117 314:               /* we have finished, turn off the iterrupt */
3118 315:               if (outp == 0 || *outp == 0) {
3119 0BEF  0877     MOVF 0x77, W
3120 0BF0  0476     IORWF outp, W
3121 0BF1  1903     BTFSC STATUS, 0x2
3122 0BF2  2BF4     GOTO 0x3F4
3123 0BF3  2BF5     GOTO 0x3F5
3124 0BF4  2BFE     GOTO 0x3FE
3125 0BF5  0876     MOVF outp, W
3126 0BF6  0086     MOVWF FSR1L
3127 0BF7  0877     MOVF 0x77, W
3128 0BF8  0087     MOVWF FSR1H
3129 0BF9  0881     MOVF INDF1, F
3130 0BFA  1D03     BTFSS STATUS, 0x2
3131 0BFB  2BFD     GOTO 0x3FD
3132 0BFC  2BFE     GOTO 0x3FE
3133 0BFD  2C05     GOTO 0x405
3134 316:                   PIE1bits.TXIE = 0;
3135 0BFE  0021     MOVLB 0x1
3136 0BFF  1211     BCF PIR1, 0x4
3137 317:                   outp = 0;
3138 0C00  01F6     CLRF outp
3139 0C01  01F7     CLRF 0x77
3140 318:                   outlen = 0;
3141 0C02  01F9     CLRF outlen
3142 0C03  2C10     GOTO 0x410
3143 319:                   return;
3144 0C04  2C10     GOTO 0x410
3145 320:               }
3146 321:               TXREG = *outp;
3147 0C05  0876     MOVF outp, W
3148 0C06  0086     MOVWF FSR1L
3149 0C07  0877     MOVF 0x77, W
3150 0C08  0087     MOVWF FSR1H
3151 0C09  0801     MOVF INDF1, W
3152 0C0A  0023     MOVLB 0x3
3153 0C0B  009A     MOVWF TMR2
3154 322:               outp++;
3155 0C0C  3001     MOVLW 0x1
3156 0C0D  07F6     ADDWF outp, F
3157 0C0E  3000     MOVLW 0x0
3158 0C0F  3DF7     ADDWFC 0x77, F
3159 323:           }
3160 0C10  0008     RETURN
3161 324:           
3162 325:           /* called from interrupt routine to receive next byte */
3163 326:           void msg_recvnext(void)
3164 327:           {
3165 328:               while (PIR1bits.RCIF) {
3166 0C60  2C85     GOTO 0x485
3167 0C85  0020     MOVLB 0x0
3168 0C86  1A91     BTFSC PIR1, 0x5
3169 0C87  2C89     GOTO 0x489
3170 0C88  2C8A     GOTO 0x48A
3171 0C89  2C61     GOTO 0x461
3172 0C8A  2C8B     GOTO 0x48B
3173 329:                   bool err = RCSTAbits.FERR;
3174 0C61  3000     MOVLW 0x0
3175 0C62  0023     MOVLB 0x3
3176 0C63  191D     BTFSC 0x1D, 0x2
3177 0C64  3001     MOVLW 0x1
3178 0C65  00F1     MOVWF err
3179 330:                   char new = RCREG;
3180 0C66  0819     MOVF T1GCON, W
3181 0C67  00F0     MOVWF 0x70
3182 0C68  0870     MOVF 0x70, W
3183 0C69  00F2     MOVWF new
3184 331:           
3185 332:                   /* bad char, skip it */
3186 333:                   if (err) continue;
3187 0C6A  0871     MOVF err, W
3188 0C6B  1D03     BTFSS STATUS, 0x2
3189 0C6C  2C6E     GOTO 0x46E
3190 0C6D  2C70     GOTO 0x470
3191 0C6E  2C85     GOTO 0x485
3192 0C6F  2C85     GOTO 0x485
3193 334:           
3194 335:                   /* our input buffer has overflowed */
3195 336:                   if (inlen > sizeof(inbuff)) return;
3196 0C70  300B     MOVLW 0xB
3197 0C71  0278     SUBWF inlen, W
3198 0C72  1C03     BTFSS STATUS, 0x0
3199 0C73  2C75     GOTO 0x475
3200 0C74  2C76     GOTO 0x476
3201 0C75  2C78     GOTO 0x478
3202 0C76  2C8B     GOTO 0x48B
3203 0C77  2C8B     GOTO 0x48B
3204 337:           
3205 338:                   /* keep this one */
3206 339:                   inbuff[inlen++] = new;
3207 0C78  0872     MOVF new, W
3208 0C79  00F0     MOVWF 0x70
3209 0C7A  0878     MOVF inlen, W
3210 0C7B  3ECD     ADDLW 0xCD
3211 0C7C  0086     MOVWF FSR1L
3212 0C7D  0187     CLRF FSR1H
3213 0C7E  0870     MOVF 0x70, W
3214 0C7F  0081     MOVWF INDF1
3215 0C80  3001     MOVLW 0x1
3216 0C81  00F0     MOVWF 0x70
3217 0C82  0870     MOVF 0x70, W
3218 0C83  07F8     ADDWF inlen, F
3219 0C84  2C85     GOTO 0x485
3220 340:               }
3221 341:           }
3222 0C8B  0008     RETURN
3223 342:           
3224 343:           bool msg_recvready(void)
3225 344:           {
3226 345:               if (inlen > 0) return 1;
3227 0B3A  0878     MOVF inlen, W
3228 0B3B  1D03     BTFSS STATUS, 0x2
3229 0B3C  2B3E     GOTO 0x33E
3230 0B3D  2B41     GOTO 0x341
3231 0B3E  3001     MOVLW 0x1
3232 0B3F  2B43     GOTO 0x343
3233 0B40  2B43     GOTO 0x343
3234 346:               return 0;
3235 0B41  3000     MOVLW 0x0
3236 0B42  2B43     GOTO 0x343
3237 347:           }
3238 0B43  0008     RETURN
3239 348:           
3240 349:           char msg_recv(void)
3241 350:           {
3242 351:               if (inlen == 0) return 0;
3243 0D56  08F8     MOVF inlen, F
3244 0D57  1D03     BTFSS STATUS, 0x2
3245 0D58  2D5A     GOTO 0x55A
3246 0D59  2D5B     GOTO 0x55B
3247 0D5A  2D5E     GOTO 0x55E
3248 0D5B  3000     MOVLW 0x0
3249 0D5C  2D91     GOTO 0x591
3250 0D5D  2D91     GOTO 0x591
3251 352:           
3252 353:               /* record and disable the interupt */
3253 354:               bool in = PIE1bits.RCIE;
3254 0D5E  3000     MOVLW 0x0
3255 0D5F  0021     MOVLB 0x1
3256 0D60  1A91     BTFSC PIR1, 0x5
3257 0D61  3001     MOVLW 0x1
3258 0D62  0020     MOVLB 0x0
3259 0D63  00B5     MOVWF in
3260 355:               PIE1bits.RCIE = 0;
3261 0D64  0021     MOVLB 0x1
3262 0D65  1291     BCF PIR1, 0x5
3263 356:           
3264 357:               char new = inbuff[0];
3265 0D66  084D     MOVF 0x4D, W
3266 0D67  00F4     MOVWF i
3267 0D68  0874     MOVF i, W
3268 0D69  0020     MOVLB 0x0
3269 0D6A  00B6     MOVWF p
3270 358:               inlen--;
3271 0D6B  3001     MOVLW 0x1
3272 0D6C  02F8     SUBWF inlen, F
3273 359:           
3274 360:               /* shuffle them down one */
3275 361:               for (char i=0;i<inlen;i++)
3276 0D6D  01B7     CLRF i
3277 0D6E  2D81     GOTO 0x581
3278 0D7C  3001     MOVLW 0x1
3279 0D7D  00F4     MOVWF i
3280 0D7E  0874     MOVF i, W
3281 0D7F  07B7     ADDWF i, F
3282 0D80  2D81     GOTO 0x581
3283 0D81  0878     MOVF inlen, W
3284 0D82  0237     SUBWF i, W
3285 0D83  1C03     BTFSS STATUS, 0x0
3286 0D84  2D86     GOTO 0x586
3287 0D85  2D87     GOTO 0x587
3288 0D86  2D6F     GOTO 0x56F
3289 0D87  2D88     GOTO 0x588
3290 362:                   inbuff[i] = inbuff[i+1];
3291 0D6F  0837     MOVF i, W
3292 0D70  3E01     ADDLW 0x1
3293 0D71  3ECD     ADDLW 0xCD
3294 0D72  0086     MOVWF FSR1L
3295 0D73  0187     CLRF FSR1H
3296 0D74  0801     MOVF INDF1, W
3297 0D75  00F4     MOVWF i
3298 0D76  0837     MOVF i, W
3299 0D77  3ECD     ADDLW 0xCD
3300 0D78  0086     MOVWF FSR1L
3301 0D79  0187     CLRF FSR1H
3302 0D7A  0874     MOVF i, W
3303 0D7B  0081     MOVWF INDF1
3304 363:           
3305 364:               /* restore the interupt */
3306 365:               PIE1bits.RCIE = in;
3307 0D88  0835     MOVF in, W
3308 0D89  0021     MOVLB 0x1
3309 0D8A  1D03     BTFSS STATUS, 0x2
3310 0D8B  1691     BSF PIR1, 0x5
3311 0D8C  1903     BTFSC STATUS, 0x2
3312 0D8D  1291     BCF PIR1, 0x5
3313 366:               return new;
3314 0D8E  0020     MOVLB 0x0
3315 0D8F  0836     MOVF p, W
3316 0D90  2D91     GOTO 0x591
3317 367:           }
3318 0D91  0008     RETURN
3319 368:           
3320 369:           
3321 370:           void int_disable(void)
3322 371:           {
3323 372:               INTCONbits.GIE = 0;
3324 0B22  138B     BCF INTCON, 0x7
3325 373:           }
3326 0B23  0008     RETURN
3327 374:           
3328 375:           void int_enable(void)
3329 376:           {
3330 377:               INTCONbits.GIE = 1;
3331 0B20  178B     BSF INTCON, 0x7
3332 378:           }
3333 0B21  0008     RETURN
3334 ---  /home/justin/MPLABXProjects/uart test.X/interrupts.c  ----------------------------------------------
3335 1:             /******************************************************************************/
3336 2:             /*Files to Include                                                            */
3337 3:             /******************************************************************************/
3338 4:             
3339 5:             #if defined(__XC)
3340 6:                 #include <xc.h>         /* XC8 General Include File */
3341 7:             #elif defined(HI_TECH_C)
3342 8:                 #include <htc.h>        /* HiTech General Include File */
3343 9:             #endif
3344 10:            
3345 11:            #include <stdint.h>         /* For uint8_t definition */
3346 12:            #include <stdbool.h>        /* For true/false definition */
3347 13:            #include "user.h"
3348 14:            
3349 15:            /******************************************************************************/
3350 16:            /* Interrupt Routines                                                         */
3351 17:            /******************************************************************************/
3352 18:            
3353 19:            /* Baseline devices don't have interrupts. Unfortunately the baseline detection 
3354 20:             * macro is named _PIC12 */
3355 21:            
3356 22:            #ifndef _PIC12
3357 23:            
3358 24:            void interrupt isr(void)
3359 25:            {
3360 0004  3180     MOVLP 0x0
3361 0005  0020     MOVLB 0x0
3362 0006  087F     MOVF 0x7F, W
3363 0007  00F3     MOVWF 0x73
3364 26:                /* This code stub shows general interrupt handling.  Note that these
3365 27:                conditional statements are not handled within 3 seperate if blocks.
3366 28:                Do not use a seperate if block for each interrupt flag to avoid run
3367 29:                time errors. */
3368 30:            
3369 31:                if (PIE1bits.TXIE && PIR1bits.TXIF)
3370 0008  0021     MOVLB 0x1
3371 0009  1E11     BTFSS PIR1, 0x4
3372 000A  280C     GOTO 0xC
3373 000B  280D     GOTO 0xD
3374 000C  2816     GOTO 0x16
3375 000D  0020     MOVLB 0x0
3376 000E  1E11     BTFSS PIR1, 0x4
3377 000F  2811     GOTO 0x11
3378 0010  2812     GOTO 0x12
3379 0011  2816     GOTO 0x16
3380 32:                    msg_sendnext();
3381 0012  318B     MOVLP 0xB
3382 0013  23EF     CALL 0x3EF
3383 0014  3180     MOVLP 0x0
3384 0015  2816     GOTO 0x16
3385 33:            
3386 34:                if (PIE1bits.RCIE && PIR1bits.RCIF)
3387 0016  0021     MOVLB 0x1
3388 0017  1E91     BTFSS PIR1, 0x5
3389 0018  281A     GOTO 0x1A
3390 0019  281B     GOTO 0x1B
3391 001A  2824     GOTO 0x24
3392 001B  0020     MOVLB 0x0
3393 001C  1E91     BTFSS PIR1, 0x5
3394 001D  281F     GOTO 0x1F
3395 001E  2820     GOTO 0x20
3396 001F  2824     GOTO 0x24
3397 35:                    msg_recvnext();
3398 0020  318C     MOVLP 0xC
3399 0021  2460     CALL 0x460
3400 0022  3180     MOVLP 0x0
3401 0023  2824     GOTO 0x24
3402 36:                
3403 37:            #if 0
3404 38:            
3405 39:                /* TODO Add interrupt routine code here. */
3406 40:            
3407 41:                /* Determine which flag generated the interrupt */
3408 42:                if(<Interrupt Flag 1>)
3409 43:                {
3410 44:                    <Interrupt Flag 1=0>; /* Clear Interrupt Flag 1 */
3411 45:                }
3412 46:                else if (<Interrupt Flag 2>)
3413 47:                {
3414 48:                    <Interrupt Flag 2=0>; /* Clear Interrupt Flag 2 */
3415 49:                }
3416 50:                else
3417 51:                {
3418 52:                    /* Unhandled interrupts */
3419 53:                }
3420 54:            
3421 55:            #endif
3422 56:            
3423 57:            }
3424 0024  0873     MOVF 0x73, W
3425 58:            #endif
3426 59:            
3427 60: