Initial import of onewire-to-usb bridge
[onewire] / disassembly / listing.disasm
CommitLineData
bba33fe1
JM
1Disassembly Listing for uart test
2Generated From:
3/home/justin/MPLABXProjects/uart test.X/dist/XC8_12F1840/production/uart_test.X.production.cof
410-Jun-2013 16:52:45
5
6--- /home/justin/MPLABXProjects/uart test.X/user.c ----------------------------------------------------
71: /******************************************************************************/
82: /* Files to Include */
93: /******************************************************************************/
104:
115: #if defined(__XC)
126: #include <xc.h> /* XC8 General Include File */
137: #elif defined(HI_TECH_C)
148: #include <htc.h> /* HiTech General Include File */
159: #endif
1610:
1711: #include <stdint.h> /* For uint8_t definition */
1812: #include <stdbool.h> /* For true/false definition */
1913:
2014: #include "system.h"
2115: #include "user.h"
2216:
2317: /******************************************************************************/
2418: /* User Functions */
2519: /******************************************************************************/
2620:
2721: /* <Initialize variables in user.h and insert code for user algorithms.> */
2822:
2923: void InitApp(void)
3024: {
3125: /* TODO Initialize User Ports/Peripherals/Project here */
3226:
3327: /* configure 4MHz mode */
3428: OSCCONbits.SPLLEN = 0;
350BCE 0021 MOVLB 0x1
360BCF 1399 BCF T1GCON, 0x7
3729: OSCCONbits.IRCF = 0b1101;
380BD0 0819 MOVF T1GCON, W
390BD1 3987 ANDLW 0x87
400BD2 3868 IORLW 0x68
410BD3 0099 MOVWF T1GCON
4230: OSCCONbits.SCS = 0b00;
430BD4 30FC MOVLW 0xFC
440BD5 0599 ANDWF T1GCON, F
4531:
4632: /* Enabling transmitter 26.1.1.1 page 259 - TX/CK I/O pin */
4733: TXSTAbits.TXEN = 1;
480BD6 0023 MOVLB 0x3
490BD7 169E BSF CPSCON0, 0x5
5034: TXSTAbits.SYNC = 0;
510BD8 121E BCF CPSCON0, 0x4
5235: RCSTAbits.SPEN = 1;
530BD9 179D BSF 0x1D, 0x7
5436: /* Enabling receiver 26.1.2 page 262 - RX/DT I/O pin */
5537: RCSTAbits.CREN = 1;
560BDA 161D BSF 0x1D, 0x4
5738:
5839: /* 4MHz clock, 19k2 baud */
5940: TXSTAbits.BRGH = 0;
600BDB 111E BCF CPSCON0, 0x2
6141: BAUDCONbits.BRG16 = 1;
620BDC 159F BSF CPSCON1, 0x3
6342: SPBRG = 12;
640BDD 300C MOVLW 0xC
650BDE 009B MOVWF PR2
6643:
6744: /* Select pins 4&5 as the uart - page 102 */
6845: APFCONbits.RXDTSEL = 1; /* RX/DT on RA5 */
690BDF 0022 MOVLB 0x2
700BE0 179D BSF 0x1D, 0x7
7146: APFCONbits.TXCKSEL = 1; /* TX/CK on RA4 */
720BE1 151D BSF 0x1D, 0x2
7347: TRISAbits.TRISA5 = 1; /* RA5 as input */
740BE2 0021 MOVLB 0x1
750BE3 168C BSF PORTA, 0x5
7648: TRISAbits.TRISA4 = 0; /* RA4 as output */
770BE4 120C BCF PORTA, 0x4
7849:
7950: ANSELA = 0; /* no analog */
800BE5 0023 MOVLB 0x3
810BE6 018C CLRF PORTA
8251:
8352:
8453: /* enable weak pullups, clear them all */
8554: WPUA = 0;
860BE7 0024 MOVLB 0x4
870BE8 018C CLRF PORTA
8855: //WPUAbits.WPUA0 = 0x00000100; // RA0 pullup for 1-wire bus
8956: OPTION_REGbits.nWPUEN = 1;
900BE9 0021 MOVLB 0x1
910BEA 1795 BSF TMR0, 0x7
9257:
9358: /* Enable interrupts */
9459: INTCONbits.GIE = 1;
950BEB 178B BSF INTCON, 0x7
9660: INTCONbits.PEIE = 1;
970BEC 170B BSF INTCON, 0x6
9861:
9962: /* enable uart receiver interupt */
10063: PIE1bits.RCIE = 1;
1010BED 1691 BSF PIR1, 0x5
10264: }
1030BEE 0008 RETURN
10465:
105--- /home/justin/MPLABXProjects/uart test.X/system.c --------------------------------------------------
1061: /******************************************************************************/
1072: /* Files to Include */
1083: /******************************************************************************/
1094:
1105: #if defined(__XC)
1116: #include <xc.h> /* XC8 General Include File */
1127: #elif defined(HI_TECH_C)
1138: #include <htc.h> /* HiTech General Include File */
1149: #endif
11510:
11611: #include <stdint.h> /* For uint8_t definition */
11712: #include <stdbool.h> /* For true/false definition */
11813:
11914: #include "system.h"
12015:
12116: /* Refer to the device datasheet for information about available
12217: oscillator configurations and to compiler documentation for macro details. */
12318: void ConfigureOscillator(void)
12419: {
12520:
12621: /*If the PIC12 device has an OSCCAL value, the HiTech Compiler provides
12722: a macro called _READ_OSCCAL_DATA which can be loaded using this: */
12823:
12924: /* TODO Configure OSCCAL if the device has an OSCCAL register */
13025:
13126: #if 0
13227:
13328: OSCCAL=_READ_OSCCAL_DATA(); /* _READ_OSCCAL_DATA macro unloads cal memory */
13429:
13530: #endif
13631:
13732: /*Not all PIC12 devices require this.
13833:
13934: /* TODO Add clock switching code if appropriate. */
14035:
14136: /* Typical actions in this function are to tweak the oscillator tuning
14237: register, select new clock sources, and to wait until new clock sources
14338: are stable before resuming execution of the main project. */
14439:
14540: }
1460B1F 0008 RETURN
147--- /home/justin/MPLABXProjects/uart test.X/onewire.c -------------------------------------------------
1481: /* Dallas 1-Wire bus routines */
1492:
1503: #if defined(__XC)
1514: #include <xc.h> /* XC8 General Include File */
1525: #elif defined(HI_TECH_C)
1536: #include <htc.h> /* HiTech General Include File */
1547: #endif
1558:
1569: #include <stdint.h> /* For uint8_t definition */
15710: #include <stdbool.h> /* For true/false definition */
15811:
15912: #include "system.h"
16013: #include "user.h"
16114: #include "onewire.h"
16215:
16316: // fast way, macros
16417: #define OWLOW { PORTAbits.RA2 = 0; TRISAbits.TRISA2 = 0; }
16518: #define OWHIGH { PORTAbits.RA2 = 1; TRISAbits.TRISA2 = 0; }
16619: #define OWTRI { TRISAbits.TRISA2 = 1; }
16720: #define OWREAD (PORTAbits.RA2)
16821:
16922:
17023: // slow way, causes a function call
17124: inline void drive_OW_low(void)
17225: {
17326: PORTAbits.RA2 = 0;
1740B2D 0020 MOVLB 0x0
1750B2E 110C BCF PORTA, 0x2
17627: TRISAbits.TRISA2 = 0;
1770B2F 0021 MOVLB 0x1
1780B30 110C BCF PORTA, 0x2
17928: }
1800B31 0008 RETURN
18129:
18230: inline void drive_OW_high(void)
18331: {
18432: PORTAbits.RA2 = 1;
1850B28 0020 MOVLB 0x0
1860B29 150C BSF PORTA, 0x2
18733: TRISAbits.TRISA2 = 0;
1880B2A 0021 MOVLB 0x1
1890B2B 110C BCF PORTA, 0x2
19034: }
1910B2C 0008 RETURN
19235:
19336: inline void float_OW(void)
19437: {
19538: TRISAbits.TRISA2 = 1;
19604FD 0021 MOVLB 0x1
19704FE 150C BSF PORTA, 0x2
19839: }
19904FF 0008 RETURN
20040:
20141: inline bool read_OW(void)
20242: {
20343: TRISAbits.TRISA2 = 1;
2040B32 0021 MOVLB 0x1
2050B33 150C BSF PORTA, 0x2
20644: return PORTAbits.RA2;
2070B34 0020 MOVLB 0x0
2080B35 0C0C RRF PORTA, W
2090B36 0C89 RRF WREG, F
2100B37 3901 ANDLW 0x1
2110B38 2B39 GOTO 0x339
21245: }
2130B39 0008 RETURN
21446:
21547:
21648: /* start the 1-Wire bus
21749: *
21850: */
21951: void OW_start(void)
22052: {
22153: //drive_OW_high();
22254: float_OW();
2230B24 3184 MOVLP 0x4
2240B25 24FD CALL 0x4FD
2250B26 318B MOVLP 0xB
22655: }
2270B27 0008 RETURN
22856:
22957: /* reset the bus, test for presence signal */
23058: bool OW_reset(void)
23159: {
23260: bool presence = 0;
2330C37 01F5 CLRF presence
23461:
23562: OWLOW; //drive_OW_low();
2360C38 0020 MOVLB 0x0
2370C39 110C BCF PORTA, 0x2
2380C3A 0021 MOVLB 0x1
2390C3B 110C BCF PORTA, 0x2
24063: DelayUs(250);
2410C3C 3053 MOVLW 0x53
2420C3D 00F4 MOVWF i
2430C3E 0BF4 DECFSZ i, F
2440C3F 2C3E GOTO 0x43E
24564: DelayUs(250);
2460C40 3053 MOVLW 0x53
2470C41 00F4 MOVWF i
2480C42 0BF4 DECFSZ i, F
2490C43 2C42 GOTO 0x442
25065: OWTRI; //float_OW(); // let it float high
2510C44 0021 MOVLB 0x1
2520C45 150C BSF PORTA, 0x2
25366: DelayUs(70);
2540C46 3017 MOVLW 0x17
2550C47 00F4 MOVWF i
2560C48 0BF4 DECFSZ i, F
2570C49 2C48 GOTO 0x448
25867: presence = OWREAD; //read_OW(); // now sample
2590C4A 3000 MOVLW 0x0
2600C4B 0020 MOVLB 0x0
2610C4C 190C BTFSC PORTA, 0x2
2620C4D 3001 MOVLW 0x1
2630C4E 00F5 MOVWF presence
26468: DelayUs(215);
2650C4F 3047 MOVLW 0x47
2660C50 00F4 MOVWF i
2670C51 0BF4 DECFSZ i, F
2680C52 2C51 GOTO 0x451
2690C53 0000 NOP
27069: DelayUs(215);
2710C54 3047 MOVLW 0x47
2720C55 00F4 MOVWF i
2730C56 0BF4 DECFSZ i, F
2740C57 2C56 GOTO 0x456
2750C58 0000 NOP
27670:
27771: return ! presence;
2780C59 0875 MOVF presence, W
2790C5A 3A00 XORLW 0x0
2800C5B 3000 MOVLW 0x0
2810C5C 1903 BTFSC STATUS, 0x2
2820C5D 3001 MOVLW 0x1
2830C5E 2C5F GOTO 0x45F
28472: }
2850C5F 0008 RETURN
28673:
28774: void OW_write_bit(bool val)
28875: {
28976: #if 0 // Maxim dev note 2420
29077: drive_OW_low();
29178: DelayUs(3);
29279: if (val) float_OW();
29380: DelayUs(60);
29481: float_OW();
29582: DelayUs(2);
29683: #else
29784: OWLOW;
2980B5C 00F5 MOVWF presence
2990B5D 0020 MOVLB 0x0
3000B5E 110C BCF PORTA, 0x2
3010B5F 0021 MOVLB 0x1
3020B60 110C BCF PORTA, 0x2
30385: NOP();
3040B61 0000 NOP
30586: NOP();
3060B62 0000 NOP
30787: // NOP(); // doc one for other delays
30888: if (val) OWTRI;
3090B63 0875 MOVF presence, W
3100B64 1D03 BTFSS STATUS, 0x2
3110B65 2B67 GOTO 0x367
3120B66 2B6A GOTO 0x36A
3130B67 0021 MOVLB 0x1
3140B68 150C BSF PORTA, 0x2
3150B69 2B6A GOTO 0x36A
31689: DelayUs(60);
3170B6A 3013 MOVLW 0x13
3180B6B 00F4 MOVWF i
3190B6C 0BF4 DECFSZ i, F
3200B6D 2B6C GOTO 0x36C
3210B6E 2B6F GOTO 0x36F
32290: OWTRI;
3230B6F 0021 MOVLB 0x1
3240B70 150C BSF PORTA, 0x2
32591: NOP();
3260B71 0000 NOP
32792: NOP();
3280B72 0000 NOP
32993: #endif
33094: }
3310B73 0008 RETURN
33295:
33396: bool OW_read_bit()
33497: {
33598: bool val;
33699: #if 0 /* Maxim dev note 2420 */
337100: drive_OW_low();
338101: DelayUs(6);
339102: float_OW();
340103: DelayUs(4);
341104: val = read_OW();
342105: DelayUs(50);
343106: #else
344107: OWLOW;
3450B74 0020 MOVLB 0x0
3460B75 110C BCF PORTA, 0x2
3470B76 0021 MOVLB 0x1
3480B77 110C BCF PORTA, 0x2
349108: // NOP();
350109: NOP();
3510B78 0000 NOP
352110: NOP();
3530B79 0000 NOP
354111: NOP();
3550B7A 0000 NOP
356112: NOP();
3570B7B 0000 NOP
358113: NOP();
3590B7C 0000 NOP
360114: OWTRI;
3610B7D 0021 MOVLB 0x1
3620B7E 150C BSF PORTA, 0x2
363115: // NOP();
364116: NOP();
3650B7F 0000 NOP
366117: NOP();
3670B80 0000 NOP
368118: NOP();
3690B81 0000 NOP
370119: val = read_OW();
3710B82 318B MOVLP 0xB
3720B83 2332 CALL 0x332
3730B84 318B MOVLP 0xB
3740B85 00F4 MOVWF i
3750B86 0874 MOVF i, W
3760B87 00F5 MOVWF presence
377120: DelayUs(50);
3780B88 3010 MOVLW 0x10
3790B89 00F4 MOVWF i
3800B8A 0BF4 DECFSZ i, F
3810B8B 2B8A GOTO 0x38A
3820B8C 0000 NOP
383121:
384122: #endif
385123: return val;
3860B8D 0875 MOVF presence, W
3870B8E 2B8F GOTO 0x38F
388124: }
3890B8F 0008 RETURN
390125:
391126: void OW_write_byte(unsigned char byte)
392127: {
3930B90 0020 MOVLB 0x0
3940B91 00B6 MOVWF p
395128: for (char i=8; i!=0; i--)
3960B92 3008 MOVLW 0x8
3970B93 00B5 MOVWF in
3980B94 0835 MOVF in, W
3990B95 00B7 MOVWF i
4000B96 08B7 MOVF i, F
4010B97 1D03 BTFSS STATUS, 0x2
4020B98 2B9A GOTO 0x39A
4030B99 2B9B GOTO 0x39B
4040B9A 2B9D GOTO 0x39D
4050B9B 2BAD GOTO 0x3AD
4060B9C 2BAD GOTO 0x3AD
4070BA5 3001 MOVLW 0x1
4080BA6 02B7 SUBWF i, F
4090BA7 08B7 MOVF i, F
4100BA8 1D03 BTFSS STATUS, 0x2
4110BA9 2BAB GOTO 0x3AB
4120BAA 2BAC GOTO 0x3AC
4130BAB 2B9D GOTO 0x39D
4140BAC 2BAD GOTO 0x3AD
415129: {
416130: OW_write_bit( byte & 0x01 );
4170B9D 0836 MOVF p, W
4180B9E 3901 ANDLW 0x1
4190B9F 318B MOVLP 0xB
4200BA0 235C CALL 0x35C
4210BA1 318B MOVLP 0xB
422131: byte >>= 1;
4230BA2 1003 BCF STATUS, 0x0
4240BA3 0020 MOVLB 0x0
4250BA4 0CB6 RRF p, F
426132: }
427133: }
4280BAD 0008 RETURN
429134:
430135: unsigned char OW_read_byte(void)
431136: {
432137: unsigned char byte = 0;
4330C11 0020 MOVLB 0x0
4340C12 01B6 CLRF p
435138: for (char i=8; i!=0; i--)
4360C13 3008 MOVLW 0x8
4370C14 00B5 MOVWF in
4380C15 0835 MOVF in, W
4390C16 00B7 MOVWF i
4400C17 08B7 MOVF i, F
4410C18 1D03 BTFSS STATUS, 0x2
4420C19 2C1B GOTO 0x41B
4430C1A 2C1C GOTO 0x41C
4440C1B 2C1E GOTO 0x41E
4450C1C 2C34 GOTO 0x434
4460C1D 2C34 GOTO 0x434
4470C2B 3001 MOVLW 0x1
4480C2C 0020 MOVLB 0x0
4490C2D 02B7 SUBWF i, F
4500C2E 08B7 MOVF i, F
4510C2F 1D03 BTFSS STATUS, 0x2
4520C30 2C32 GOTO 0x432
4530C31 2C33 GOTO 0x433
4540C32 2C1E GOTO 0x41E
4550C33 2C34 GOTO 0x434
456139: {
457140: byte >>= 1;
4580C1E 1003 BCF STATUS, 0x0
4590C1F 0CB6 RRF p, F
460141: if (OW_read_bit())
4610C20 318B MOVLP 0xB
4620C21 2374 CALL 0x374
4630C22 318C MOVLP 0xC
4640C23 3A00 XORLW 0x0
4650C24 1903 BTFSC STATUS, 0x2
4660C25 2C27 GOTO 0x427
4670C26 2C28 GOTO 0x428
4680C27 2C2B GOTO 0x42B
469142: byte |= 0x80;
4700C28 0020 MOVLB 0x0
4710C29 17B6 BSF p, 0x7
4720C2A 2C2B GOTO 0x42B
473143:
474144: }
475145: return byte;
4760C34 0836 MOVF p, W
4770C35 2C36 GOTO 0x436
478146: }
4790C36 0008 RETURN
480147:
481148: static const unsigned char dscrc_table[] = {
482149: 0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
483150: 157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
484151: 35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
485152: 190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
486153: 70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
487154: 219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
488155: 101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
489156: 248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
490157: 140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
491158: 17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
492159: 175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
493160: 50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
494161: 202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
495162: 87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
496163: 233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
497164: 116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53
498165: };
499166:
500167: unsigned char romid[8];
501168: char LastDiscrepancy = 0;
502169: char LastFamilyDiscrepancy = 0;
503170: char LastDeviceFlag = false;
504171: unsigned char crc8;
505172:
506173: static unsigned char docrc8(unsigned char value)
507174: {
50804ED 00F5 MOVWF presence
509175: crc8 = dscrc_table[crc8 ^ value];
51004EE 0020 MOVLB 0x0
51104EF 082B MOVF crc8, W
51204F0 0675 XORWF presence, W
51304F1 3E01 ADDLW 0x1
51404F2 0084 MOVWF FSR0L
51504F3 3085 MOVLW 0x85
51604F4 1803 BTFSC STATUS, 0x0
51704F5 3E01 ADDLW 0x1
51804F6 0085 MOVWF FSR0H
51904F7 0800 MOVF INDF0, W
52004F8 00F4 MOVWF i
52104F9 0874 MOVF i, W
52204FA 00AB MOVWF crc8
52304FB 2CFC GOTO 0x4FC
524176: return crc8;
525177: }
52604FC 0008 RETURN
527178:
528179: /* enumerate the devices */
529180: bool OW_search()
530181: {
531182: char id_bit_number = 1;
5320F0C 0020 MOVLB 0x0
5330F0D 01BE CLRF id_bit_number
5340F0E 0ABE INCF id_bit_number, F
535183: char last_zero = 0;
5360F0F 01BC CLRF last_zero
537184: char rom_byte_number = 0;
5380F10 01C0 CLRF rom_byte_number
539185: char search_result = 0;
5400F11 01BA CLRF search_result
541186: unsigned char rom_byte_mask = 1;
5420F12 01BF CLRF rom_byte_mask
5430F13 0ABF INCF rom_byte_mask, F
544187: unsigned char search_direction;
545188:
546189: crc8 = 0;
5470F14 01AB CLRF crc8
548190:
549191: // do not interrupt us
550192: int_disable();
5510F15 318B MOVLP 0xB
5520F16 2322 CALL 0x322
5530F17 318F MOVLP 0xF
554193:
555194: // if the last call was not the last one
556195: if (!LastDeviceFlag) {
5570F18 0020 MOVLB 0x0
5580F19 08A8 MOVF LastDeviceFlag, F
5590F1A 1D03 BTFSS STATUS, 0x2
5600F1B 2F1D GOTO 0x71D
5610F1C 2F1E GOTO 0x71E
5620F1D 2FD2 GOTO 0x7D2
563196: if (!OW_reset())
5640F1E 318C MOVLP 0xC
5650F1F 2437 CALL 0x437
5660F20 318F MOVLP 0xF
5670F21 3800 IORLW 0x0
5680F22 1D03 BTFSS STATUS, 0x2
5690F23 2F25 GOTO 0x725
5700F24 2F26 GOTO 0x726
5710F25 2F37 GOTO 0x737
572197: {
573198: msg_write("Reset said nothing there.\r\n");
5740F26 3048 MOVLW 0x48
5750F27 00F4 MOVWF i
5760F28 3087 MOVLW 0x87
5770F29 00F5 MOVWF presence
5780F2A 318E MOVLP 0xE
5790F2B 2613 CALL 0x613
5800F2C 318F MOVLP 0xF
581199: // reset the search
582200: LastDiscrepancy = 0;
5830F2D 0020 MOVLB 0x0
5840F2E 01A9 CLRF LastDiscrepancy
585201: LastDeviceFlag = 0;
5860F2F 01A8 CLRF LastDeviceFlag
587202: LastFamilyDiscrepancy = 0;
5880F30 01AA CLRF LastFamilyDiscrepancy
589203: int_enable();
5900F31 318B MOVLP 0xB
5910F32 2320 CALL 0x320
5920F33 318F MOVLP 0xF
593204: return 0;
5940F34 3000 MOVLW 0x0
5950F35 2FFF GOTO 0x7FF
5960F36 2FFF GOTO 0x7FF
597205: }
598206:
599207: // issue the search command
600208: OW_write_byte(0xF0);
6010F37 30F0 MOVLW 0xF0
6020F38 318B MOVLP 0xB
6030F39 2390 CALL 0x390
6040F3A 318F MOVLP 0xF
605209:
606210: // loop to do the search
607211: do {
608212: // read a bit and its complement
609213: bool id_bit = OW_read_bit();
6100F3B 318B MOVLP 0xB
6110F3C 2374 CALL 0x374
6120F3D 318F MOVLP 0xF
6130F3E 0020 MOVLB 0x0
6140F3F 00B8 MOVWF bt
6150F40 0838 MOVF bt, W
6160F41 00BB MOVWF id_bit
617214: DelayUs(6);
6180F42 2F43 GOTO 0x743
6190F43 2F44 GOTO 0x744
6200F44 2F45 GOTO 0x745
621215: bool cmp_id_bit = OW_read_bit();
6220F45 318B MOVLP 0xB
6230F46 2374 CALL 0x374
6240F47 318F MOVLP 0xF
6250F48 0020 MOVLB 0x0
6260F49 00B8 MOVWF bt
6270F4A 0838 MOVF bt, W
6280F4B 00B9 MOVWF cmp_id_bit
629216:
630217: // check for no devices on bus
631218: if (id_bit && cmp_id_bit) {
6320F4C 083B MOVF id_bit, W
6330F4D 1D03 BTFSS STATUS, 0x2
6340F4E 2F50 GOTO 0x750
6350F4F 2F56 GOTO 0x756
6360F50 0839 MOVF cmp_id_bit, W
6370F51 1D03 BTFSS STATUS, 0x2
6380F52 2F54 GOTO 0x754
6390F53 2F56 GOTO 0x756
6400F54 2FD2 GOTO 0x7D2
641219: break;
6420F55 2FD2 GOTO 0x7D2
643220: }
644221:
645222: if (id_bit != cmp_id_bit) {
6460F56 083B MOVF id_bit, W
6470F57 0639 XORWF cmp_id_bit, W
6480F58 1903 BTFSC STATUS, 0x2
6490F59 2F5B GOTO 0x75B
6500F5A 2F5C GOTO 0x75C
6510F5B 2F61 GOTO 0x761
652223: // all devices have a 0 here, or they all have a 1
653224: search_direction = id_bit;
6540F5C 083B MOVF id_bit, W
6550F5D 00B8 MOVWF bt
6560F5E 0838 MOVF bt, W
6570F5F 00BD MOVWF search_direction
658225: } else {
6590F60 2F92 GOTO 0x792
660226: // both bits zero, so both 0 and 1 exist
661227:
662228: // if this discrepancy is before the Last Discrepancy
663229: // on a previous next then pick the same as last time
664230: if (id_bit_number < LastDiscrepancy) {
6650F61 0829 MOVF LastDiscrepancy, W
6660F62 023E SUBWF id_bit_number, W
6670F63 1803 BTFSC STATUS, 0x0
6680F64 2F66 GOTO 0x766
6690F65 2F67 GOTO 0x767
6700F66 2F74 GOTO 0x774
671231: search_direction = ((romid[rom_byte_number] & rom_byte_mask) > 0);
6720F67 0840 MOVF rom_byte_number, W
6730F68 3E20 ADDLW 0x20
6740F69 0086 MOVWF FSR1L
6750F6A 0187 CLRF FSR1H
6760F6B 0801 MOVF INDF1, W
6770F6C 053F ANDWF rom_byte_mask, W
6780F6D 3000 MOVLW 0x0
6790F6E 1D03 BTFSS STATUS, 0x2
6800F6F 3001 MOVLW 0x1
6810F70 00B8 MOVWF bt
6820F71 0838 MOVF bt, W
6830F72 00BD MOVWF search_direction
684232: } else {
6850F73 2F7D GOTO 0x77D
686233: // if equal to last pick 1, if not then pick 0
687234: search_direction = (id_bit_number == LastDiscrepancy);
6880F74 083E MOVF id_bit_number, W
6890F75 0629 XORWF LastDiscrepancy, W
6900F76 3000 MOVLW 0x0
6910F77 1903 BTFSC STATUS, 0x2
6920F78 3001 MOVLW 0x1
6930F79 00B8 MOVWF bt
6940F7A 0838 MOVF bt, W
6950F7B 00BD MOVWF search_direction
6960F7C 2F7D GOTO 0x77D
697235: }
698236:
699237: // if 0 was picked then record its position in LastZero
700238: if (search_direction == 0)
7010F7D 08BD MOVF search_direction, F
7020F7E 1D03 BTFSS STATUS, 0x2
7030F7F 2F81 GOTO 0x781
7040F80 2F82 GOTO 0x782
7050F81 2F92 GOTO 0x792
706239: {
707240: last_zero = id_bit_number;
7080F82 083E MOVF id_bit_number, W
7090F83 00B8 MOVWF bt
7100F84 0838 MOVF bt, W
7110F85 00BC MOVWF last_zero
712241: // check for last discrepancy in family
713242: if (last_zero < 9)
7140F86 3009 MOVLW 0x9
7150F87 023C SUBWF last_zero, W
7160F88 1803 BTFSC STATUS, 0x0
7170F89 2F8B GOTO 0x78B
7180F8A 2F8C GOTO 0x78C
7190F8B 2F92 GOTO 0x792
720243: LastFamilyDiscrepancy = last_zero;
7210F8C 083C MOVF last_zero, W
7220F8D 00B8 MOVWF bt
7230F8E 0838 MOVF bt, W
7240F8F 00AA MOVWF LastFamilyDiscrepancy
7250F90 2F92 GOTO 0x792
7260F91 2F92 GOTO 0x792
727244: }
728245: }
729246:
730247: // set or clear the bit in the ROM byte rom_byte_number
731248: // with mask rom_byte_mask
732249: if (search_direction == 1)
7330F92 083D MOVF search_direction, W
7340F93 3A01 XORLW 0x1
7350F94 1D03 BTFSS STATUS, 0x2
7360F95 2F97 GOTO 0x797
7370F96 2F98 GOTO 0x798
7380F97 2FA1 GOTO 0x7A1
739250: romid[rom_byte_number] |= rom_byte_mask;
7400F98 083F MOVF rom_byte_mask, W
7410F99 00B8 MOVWF bt
7420F9A 0840 MOVF rom_byte_number, W
7430F9B 3E20 ADDLW 0x20
7440F9C 0086 MOVWF FSR1L
7450F9D 0187 CLRF FSR1H
7460F9E 0838 MOVF bt, W
7470F9F 0481 IORWF INDF1, F
7480FA0 2FAA GOTO 0x7AA
749251: else
750252: romid[rom_byte_number] &= ~rom_byte_mask;
7510FA1 093F COMF rom_byte_mask, W
7520FA2 00B8 MOVWF bt
7530FA3 0840 MOVF rom_byte_number, W
7540FA4 3E20 ADDLW 0x20
7550FA5 0086 MOVWF FSR1L
7560FA6 0187 CLRF FSR1H
7570FA7 0838 MOVF bt, W
7580FA8 0581 ANDWF INDF1, F
7590FA9 2FAA GOTO 0x7AA
760253:
761254: // serial number search direction write bit
762255: OW_write_bit(search_direction);
7630FAA 083D MOVF search_direction, W
7640FAB 318B MOVLP 0xB
7650FAC 235C CALL 0x35C
7660FAD 318F MOVLP 0xF
767256:
768257: // increment the byte counter id_bit_number
769258: // and shift the mask rom_byte_mask
770259: id_bit_number++;
7710FAE 3001 MOVLW 0x1
7720FAF 0020 MOVLB 0x0
7730FB0 00B8 MOVWF bt
7740FB1 0838 MOVF bt, W
7750FB2 07BE ADDWF id_bit_number, F
776260: rom_byte_mask <<= 1;
7770FB3 1003 BCF STATUS, 0x0
7780FB4 0DBF RLF rom_byte_mask, F
779261:
780262: // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask
781263: if (rom_byte_mask == 0)
7820FB5 08BF MOVF rom_byte_mask, F
7830FB6 1D03 BTFSS STATUS, 0x2
7840FB7 2FB9 GOTO 0x7B9
7850FB8 2FBA GOTO 0x7BA
7860FB9 2FCA GOTO 0x7CA
787264: {
788265: docrc8(romid[rom_byte_number]); // accumulate the CRC
7890FBA 0840 MOVF rom_byte_number, W
7900FBB 3E20 ADDLW 0x20
7910FBC 0086 MOVWF FSR1L
7920FBD 0187 CLRF FSR1H
7930FBE 0801 MOVF INDF1, W
7940FBF 3184 MOVLP 0x4
7950FC0 24ED CALL 0x4ED
7960FC1 318F MOVLP 0xF
797266: rom_byte_number++;
7980FC2 3001 MOVLW 0x1
7990FC3 0020 MOVLB 0x0
8000FC4 00B8 MOVWF bt
8010FC5 0838 MOVF bt, W
8020FC6 07C0 ADDWF rom_byte_number, F
803267: rom_byte_mask = 1;
8040FC7 01BF CLRF rom_byte_mask
8050FC8 0ABF INCF rom_byte_mask, F
8060FC9 2FCA GOTO 0x7CA
807268: }
808269: } while (rom_byte_number < 8); // loop until all rom bytes 0-7
8090FCA 3008 MOVLW 0x8
8100FCB 0240 SUBWF rom_byte_number, W
8110FCC 1C03 BTFSS STATUS, 0x0
8120FCD 2FCF GOTO 0x7CF
8130FCE 2FD0 GOTO 0x7D0
8140FCF 2F3B GOTO 0x73B
8150FD0 2FD2 GOTO 0x7D2
8160FD1 2FD2 GOTO 0x7D2
817270: } // end of not-last-device
818271:
819272: // if the search was succesful then
820273: if (!(id_bit_number < 65 || crc8 != 0))
8210FD2 3041 MOVLW 0x41
8220FD3 023E SUBWF id_bit_number, W
8230FD4 1C03 BTFSS STATUS, 0x0
8240FD5 2FD7 GOTO 0x7D7
8250FD6 2FD8 GOTO 0x7D8
8260FD7 2FEB GOTO 0x7EB
8270FD8 08AB MOVF crc8, F
8280FD9 1D03 BTFSS STATUS, 0x2
8290FDA 2FDC GOTO 0x7DC
8300FDB 2FDD GOTO 0x7DD
8310FDC 2FEB GOTO 0x7EB
832274: {
833275: // search successful
834276: LastDiscrepancy = last_zero;
8350FDD 083C MOVF last_zero, W
8360FDE 00B8 MOVWF bt
8370FDF 0838 MOVF bt, W
8380FE0 00A9 MOVWF LastDiscrepancy
839277:
840278: // check for last device
841279: if (LastDiscrepancy == 0)
8420FE1 08A9 MOVF LastDiscrepancy, F
8430FE2 1D03 BTFSS STATUS, 0x2
8440FE3 2FE5 GOTO 0x7E5
8450FE4 2FE6 GOTO 0x7E6
8460FE5 2FE8 GOTO 0x7E8
847280: LastDeviceFlag = true;
8480FE6 01A8 CLRF LastDeviceFlag
8490FE7 0AA8 INCF LastDeviceFlag, F
850281:
851282: search_result = true;
8520FE8 01BA CLRF search_result
8530FE9 0ABA INCF search_result, F
8540FEA 2FEB GOTO 0x7EB
855283: }
856284:
857285: if (!search_result || !romid[0])
8580FEB 083A MOVF search_result, W
8590FEC 1D03 BTFSS STATUS, 0x2
8600FED 2FEF GOTO 0x7EF
8610FEE 2FF4 GOTO 0x7F4
8620FEF 08A0 MOVF romid, F
8630FF0 1D03 BTFSS STATUS, 0x2
8640FF1 2FF3 GOTO 0x7F3
8650FF2 2FF4 GOTO 0x7F4
8660FF3 2FF9 GOTO 0x7F9
867286: {
868287: LastDiscrepancy = 0;
8690FF4 01A9 CLRF LastDiscrepancy
870288: LastDeviceFlag = false;
8710FF5 01A8 CLRF LastDeviceFlag
872289: LastFamilyDiscrepancy = 0;
8730FF6 01AA CLRF LastFamilyDiscrepancy
874290: search_result = false;
8750FF7 01BA CLRF search_result
8760FF8 2FF9 GOTO 0x7F9
877291: }
878292:
879293: int_enable();
8800FF9 318B MOVLP 0xB
8810FFA 2320 CALL 0x320
8820FFB 318F MOVLP 0xF
883294: return search_result;
8840FFC 0020 MOVLB 0x0
8850FFD 083A MOVF search_result, W
8860FFE 2FFF GOTO 0x7FF
887295: }
888296:
889297:
890298: void OW_search_init()
891299: {
892300: LastDiscrepancy = 0;
8930C8C 0020 MOVLB 0x0
8940C8D 01A9 CLRF LastDiscrepancy
895301: LastDeviceFlag = false;
8960C8E 01A8 CLRF LastDeviceFlag
897302: LastFamilyDiscrepancy = 0;
8980C8F 01AA CLRF LastFamilyDiscrepancy
899303:
900304: for (int j=0; j<8; j++) romid[j]=0;
9010C90 01F4 CLRF i
9020C91 01F5 CLRF presence
9030C92 0875 MOVF presence, W
9040C93 3A80 XORLW 0x80
9050C94 00FF MOVWF 0x7F
9060C95 3080 MOVLW 0x80
9070C96 027F SUBWF 0x7F, W
9080C97 1D03 BTFSS STATUS, 0x2
9090C98 2C9B GOTO 0x49B
9100C99 3008 MOVLW 0x8
9110C9A 0274 SUBWF i, W
9120C9B 1C03 BTFSS STATUS, 0x0
9130C9C 2C9E GOTO 0x49E
9140C9D 2C9F GOTO 0x49F
9150C9E 2CA1 GOTO 0x4A1
9160C9F 2CB8 GOTO 0x4B8
9170CA0 2CB8 GOTO 0x4B8
9180CA1 0874 MOVF i, W
9190CA2 3E20 ADDLW 0x20
9200CA3 0086 MOVWF FSR1L
9210CA4 0187 CLRF FSR1H
9220CA5 0181 CLRF INDF1
9230CA6 3001 MOVLW 0x1
9240CA7 07F4 ADDWF i, F
9250CA8 3000 MOVLW 0x0
9260CA9 3DF5 ADDWFC presence, F
9270CAA 0875 MOVF presence, W
9280CAB 3A80 XORLW 0x80
9290CAC 00FF MOVWF 0x7F
9300CAD 3080 MOVLW 0x80
9310CAE 027F SUBWF 0x7F, W
9320CAF 1D03 BTFSS STATUS, 0x2
9330CB0 2CB3 GOTO 0x4B3
9340CB1 3008 MOVLW 0x8
9350CB2 0274 SUBWF i, W
9360CB3 1C03 BTFSS STATUS, 0x0
9370CB4 2CB6 GOTO 0x4B6
9380CB5 2CB7 GOTO 0x4B7
9390CB6 2CA1 GOTO 0x4A1
9400CB7 2CB8 GOTO 0x4B8
941305: }
9420CB8 0008 RETURN
943306:
944307:
945308: /* ask the (lone) device for its Serial number */
946309: void OW_identify()
947310: {
948311: int_disable();
9490D92 318B MOVLP 0xB
9500D93 2322 CALL 0x322
9510D94 318D MOVLP 0xD
952312: OW_reset();
9530D95 318C MOVLP 0xC
9540D96 2437 CALL 0x437
9550D97 318D MOVLP 0xD
956313: // read ROM command
957314: OW_write_byte(0x33);
9580D98 3033 MOVLW 0x33
9590D99 318B MOVLP 0xB
9600D9A 2390 CALL 0x390
9610D9B 318D MOVLP 0xD
962315: for (int j=0; j<8; j++)
9630D9C 0020 MOVLB 0x0
9640D9D 01B9 CLRF cmp_id_bit
9650D9E 01BA CLRF search_result
9660D9F 083A MOVF search_result, W
9670DA0 3A80 XORLW 0x80
9680DA1 00FF MOVWF 0x7F
9690DA2 3080 MOVLW 0x80
9700DA3 027F SUBWF 0x7F, W
9710DA4 1D03 BTFSS STATUS, 0x2
9720DA5 2DA8 GOTO 0x5A8
9730DA6 3008 MOVLW 0x8
9740DA7 0239 SUBWF cmp_id_bit, W
9750DA8 1C03 BTFSS STATUS, 0x0
9760DA9 2DAB GOTO 0x5AB
9770DAA 2DAC GOTO 0x5AC
9780DAB 2DAE GOTO 0x5AE
9790DAC 2DCB GOTO 0x5CB
9800DAD 2DCB GOTO 0x5CB
9810DB9 3001 MOVLW 0x1
9820DBA 07B9 ADDWF cmp_id_bit, F
9830DBB 3000 MOVLW 0x0
9840DBC 3DBA ADDWFC search_result, F
9850DBD 083A MOVF search_result, W
9860DBE 3A80 XORLW 0x80
9870DBF 00FF MOVWF 0x7F
9880DC0 3080 MOVLW 0x80
9890DC1 027F SUBWF 0x7F, W
9900DC2 1D03 BTFSS STATUS, 0x2
9910DC3 2DC6 GOTO 0x5C6
9920DC4 3008 MOVLW 0x8
9930DC5 0239 SUBWF cmp_id_bit, W
9940DC6 1C03 BTFSS STATUS, 0x0
9950DC7 2DC9 GOTO 0x5C9
9960DC8 2DCA GOTO 0x5CA
9970DC9 2DAE GOTO 0x5AE
9980DCA 2DCB GOTO 0x5CB
999316: romid[j] = OW_read_byte();
10000DAE 318C MOVLP 0xC
10010DAF 2411 CALL 0x411
10020DB0 318D MOVLP 0xD
10030DB1 0020 MOVLB 0x0
10040DB2 00B8 MOVWF bt
10050DB3 0839 MOVF cmp_id_bit, W
10060DB4 3E20 ADDLW 0x20
10070DB5 0086 MOVWF FSR1L
10080DB6 0187 CLRF FSR1H
10090DB7 0838 MOVF bt, W
10100DB8 0081 MOVWF INDF1
1011317: int_enable();
10120DCB 318B MOVLP 0xB
10130DCC 2320 CALL 0x320
10140DCD 318D MOVLP 0xD
1015318: }
10160DCE 0008 RETURN
1017319:
1018320: /* is anyone parasite powered ? */
1019321: bool OW_parasite(void)
1020322: {
1021323: int_disable();
10220BAE 318B MOVLP 0xB
10230BAF 2322 CALL 0x322
10240BB0 318B MOVLP 0xB
1025324: OW_reset();
10260BB1 318C MOVLP 0xC
10270BB2 2437 CALL 0x437
10280BB3 318B MOVLP 0xB
1029325: OW_write_byte(0xCC); // skip the rom command
10300BB4 30CC MOVLW 0xCC
10310BB5 318B MOVLP 0xB
10320BB6 2390 CALL 0x390
10330BB7 318B MOVLP 0xB
1034326: OW_write_byte(0xB4); // are you parasite powered ?
10350BB8 30B4 MOVLW 0xB4
10360BB9 318B MOVLP 0xB
10370BBA 2390 CALL 0x390
10380BBB 318B MOVLP 0xB
1039327: bool no = OW_read_bit();
10400BBC 318B MOVLP 0xB
10410BBD 2374 CALL 0x374
10420BBE 318B MOVLP 0xB
10430BBF 0020 MOVLB 0x0
10440BC0 00B8 MOVWF bt
10450BC1 0838 MOVF bt, W
10460BC2 00B9 MOVWF cmp_id_bit
1047328: int_enable();
10480BC3 318B MOVLP 0xB
10490BC4 2320 CALL 0x320
10500BC5 318B MOVLP 0xB
1051329: return !no;
10520BC6 0020 MOVLB 0x0
10530BC7 0839 MOVF cmp_id_bit, W
10540BC8 3A00 XORLW 0x0
10550BC9 3000 MOVLW 0x0
10560BCA 1903 BTFSC STATUS, 0x2
10570BCB 3001 MOVLW 0x1
10580BCC 2BCD GOTO 0x3CD
1059330: }
10600BCD 0008 RETURN
1061331:
1062332: /* select a specific device,
1063333: * if family==0 select all devices (skip rom)
1064334: */
1065335: static void OW_select_id(void)
1066336: {
1067337: if (romid[0] == 0) {
10680CE9 0020 MOVLB 0x0
10690CEA 08A0 MOVF romid, F
10700CEB 1D03 BTFSS STATUS, 0x2
10710CEC 2CEE GOTO 0x4EE
10720CED 2CEF GOTO 0x4EF
10730CEE 2CF4 GOTO 0x4F4
1074338: OW_write_byte(0xCC); // all devices for now
10750CEF 30CC MOVLW 0xCC
10760CF0 318B MOVLP 0xB
10770CF1 2390 CALL 0x390
10780CF2 318C MOVLP 0xC
1079339: } else {
10800CF3 2D19 GOTO 0x519
1081340: OW_write_byte(0x55); // match rom
10820CF4 3055 MOVLW 0x55
10830CF5 318B MOVLP 0xB
10840CF6 2390 CALL 0x390
10850CF7 318C MOVLP 0xC
1086341: for (int8_t j=0; j<8; j++) {
10870CF8 0020 MOVLB 0x0
10880CF9 01B9 CLRF cmp_id_bit
10890CFA 0839 MOVF cmp_id_bit, W
10900CFB 3A80 XORLW 0x80
10910CFC 3E78 ADDLW 0x78
10920CFD 1C03 BTFSS STATUS, 0x0
10930CFE 2D00 GOTO 0x500
10940CFF 2D01 GOTO 0x501
10950D00 2D03 GOTO 0x503
10960D01 2D19 GOTO 0x519
10970D02 2D19 GOTO 0x519
10980D0B 3001 MOVLW 0x1
10990D0C 0020 MOVLB 0x0
11000D0D 00B8 MOVWF bt
11010D0E 0838 MOVF bt, W
11020D0F 07B9 ADDWF cmp_id_bit, F
11030D10 0839 MOVF cmp_id_bit, W
11040D11 3A80 XORLW 0x80
11050D12 3E78 ADDLW 0x78
11060D13 1C03 BTFSS STATUS, 0x0
11070D14 2D16 GOTO 0x516
11080D15 2D17 GOTO 0x517
11090D16 2D03 GOTO 0x503
11100D17 2D19 GOTO 0x519
11110D18 2D19 GOTO 0x519
1112342: OW_write_byte(romid[j]);
11130D03 0839 MOVF cmp_id_bit, W
11140D04 3E20 ADDLW 0x20
11150D05 0086 MOVWF FSR1L
11160D06 0187 CLRF FSR1H
11170D07 0801 MOVF INDF1, W
11180D08 318B MOVLP 0xB
11190D09 2390 CALL 0x390
11200D0A 318C MOVLP 0xC
1121343: }
1122344: }
1123345: }
11240D19 0008 RETURN
1125346:
1126347:
1127348: /* read a memory block eg scratchpad 0xBE */
1128349: void OW_read_block(uint8_t code, uint8_t * data, uint8_t len)
1129350: {
11300D1A 0020 MOVLB 0x0
11310D1B 00BF MOVWF rom_byte_mask
1132351: int_disable();
11330D1C 318B MOVLP 0xB
11340D1D 2322 CALL 0x322
11350D1E 318D MOVLP 0xD
1136352: OW_reset();
11370D1F 318C MOVLP 0xC
11380D20 2437 CALL 0x437
11390D21 318D MOVLP 0xD
1140353: OW_select_id();
11410D22 318C MOVLP 0xC
11420D23 24E9 CALL 0x4E9
11430D24 318D MOVLP 0xD
1144354: OW_write_byte(code);
11450D25 0020 MOVLB 0x0
11460D26 083F MOVF rom_byte_mask, W
11470D27 318B MOVLP 0xB
11480D28 2390 CALL 0x390
11490D29 318D MOVLP 0xD
1150355: for (int8_t j=0; j<len; j++)
11510D2A 0020 MOVLB 0x0
11520D2B 01C0 CLRF rom_byte_number
11530D2C 2D3F GOTO 0x53F
11540D3A 3001 MOVLW 0x1
11550D3B 00BC MOVWF last_zero
11560D3C 083C MOVF last_zero, W
11570D3D 07C0 ADDWF rom_byte_number, F
11580D3E 2D3F GOTO 0x53F
11590D3F 0840 MOVF rom_byte_number, W
11600D40 00BC MOVWF last_zero
11610D41 01BD CLRF search_direction
11620D42 1BBC BTFSC last_zero, 0x7
11630D43 03BD DECF search_direction, F
11640D44 083D MOVF search_direction, W
11650D45 3A80 XORLW 0x80
11660D46 00BE MOVWF id_bit_number
11670D47 3080 MOVLW 0x80
11680D48 023E SUBWF id_bit_number, W
11690D49 1D03 BTFSS STATUS, 0x2
11700D4A 2D4D GOTO 0x54D
11710D4B 083B MOVF id_bit, W
11720D4C 023C SUBWF last_zero, W
11730D4D 1C03 BTFSS STATUS, 0x0
11740D4E 2D50 GOTO 0x550
11750D4F 2D51 GOTO 0x551
11760D50 2D2D GOTO 0x52D
11770D51 2D52 GOTO 0x552
1178356: data[j] = OW_read_byte();
11790D2D 318C MOVLP 0xC
11800D2E 2411 CALL 0x411
11810D2F 318D MOVLP 0xD
11820D30 0020 MOVLB 0x0
11830D31 00BC MOVWF last_zero
11840D32 0840 MOVF rom_byte_number, W
11850D33 073A ADDWF search_result, W
11860D34 00BD MOVWF search_direction
11870D35 083D MOVF search_direction, W
11880D36 0086 MOVWF FSR1L
11890D37 0187 CLRF FSR1H
11900D38 083C MOVF last_zero, W
11910D39 0081 MOVWF INDF1
1192357: int_enable();
11930D52 318B MOVLP 0xB
11940D53 2320 CALL 0x320
11950D54 318D MOVLP 0xD
1196358: }
11970D55 0008 RETURN
1198359:
1199360: /* write a memory block to device, eg scratchpad 0x4E */
1200361: void OW_write_block(uint8_t code, uint8_t * data, uint8_t len)
1201362: {
1202363: int_disable();
1203364: OW_reset();
1204365: OW_select_id();
1205366: OW_write_byte(code);
1206367: for (int8_t j=0; j<len; j++) {
1207368: OW_write_byte(data[j]);
1208369: }
1209370: int_enable();
1210371: }
1211372:
1212373:
1213374: // perform temperature conversion
1214375: void OW_convert()
1215376: {
1216377: // first see if anyone is parasitic
1217378: bool para = OW_parasite();
12180EA0 318B MOVLP 0xB
12190EA1 23AE CALL 0x3AE
12200EA2 318E MOVLP 0xE
12210EA3 0020 MOVLB 0x0
12220EA4 00BA MOVWF search_result
12230EA5 083A MOVF search_result, W
12240EA6 00BD MOVWF search_direction
1225379:
1226380: int_disable();
12270EA7 318B MOVLP 0xB
12280EA8 2322 CALL 0x322
12290EA9 318E MOVLP 0xE
1230381: OW_reset(); // all command start with reset
12310EAA 318C MOVLP 0xC
12320EAB 2437 CALL 0x437
12330EAC 318E MOVLP 0xE
1234382: OW_select_id();
12350EAD 318C MOVLP 0xC
12360EAE 24E9 CALL 0x4E9
12370EAF 318E MOVLP 0xE
1238383: //OW_write_byte(0xCC); // all devices
1239384: OW_write_byte(0x44); // convert
12400EB0 3044 MOVLW 0x44
12410EB1 318B MOVLP 0xB
12420EB2 2390 CALL 0x390
12430EB3 318E MOVLP 0xE
1244385: if (para) {
12450EB4 0020 MOVLB 0x0
12460EB5 083D MOVF search_direction, W
12470EB6 1D03 BTFSS STATUS, 0x2
12480EB7 2EB9 GOTO 0x6B9
12490EB8 2EF6 GOTO 0x6F6
1250386: // hard high for 750mS
1251387: OWHIGH;
12520EB9 150C BSF PORTA, 0x2
12530EBA 0021 MOVLB 0x1
12540EBB 110C BCF PORTA, 0x2
1255388: DelayUs(250000);
12560EBC 3002 MOVLW 0x2
12570EBD 0020 MOVLB 0x0
12580EBE 00BC MOVWF last_zero
12590EBF 3045 MOVLW 0x45
12600EC0 00BB MOVWF id_bit
12610EC1 30A9 MOVLW 0xA9
12620EC2 00BA MOVWF search_result
12630EC3 0BBA DECFSZ search_result, F
12640EC4 2EC3 GOTO 0x6C3
12650EC5 0BBB DECFSZ id_bit, F
12660EC6 2EC3 GOTO 0x6C3
12670EC7 0BBC DECFSZ last_zero, F
12680EC8 2EC3 GOTO 0x6C3
12690EC9 2ECA GOTO 0x6CA
1270389: DelayUs(250000);
12710ECA 3002 MOVLW 0x2
12720ECB 0020 MOVLB 0x0
12730ECC 00BC MOVWF last_zero
12740ECD 3045 MOVLW 0x45
12750ECE 00BB MOVWF id_bit
12760ECF 30A9 MOVLW 0xA9
12770ED0 00BA MOVWF search_result
12780ED1 0BBA DECFSZ search_result, F
12790ED2 2ED1 GOTO 0x6D1
12800ED3 0BBB DECFSZ id_bit, F
12810ED4 2ED1 GOTO 0x6D1
12820ED5 0BBC DECFSZ last_zero, F
12830ED6 2ED1 GOTO 0x6D1
12840ED7 2ED8 GOTO 0x6D8
1285390: DelayUs(250000);
12860ED8 3002 MOVLW 0x2
12870ED9 0020 MOVLB 0x0
12880EDA 00BC MOVWF last_zero
12890EDB 3045 MOVLW 0x45
12900EDC 00BB MOVWF id_bit
12910EDD 30A9 MOVLW 0xA9
12920EDE 00BA MOVWF search_result
12930EDF 0BBA DECFSZ search_result, F
12940EE0 2EDF GOTO 0x6DF
12950EE1 0BBB DECFSZ id_bit, F
12960EE2 2EDF GOTO 0x6DF
12970EE3 0BBC DECFSZ last_zero, F
12980EE4 2EDF GOTO 0x6DF
12990EE5 2EE6 GOTO 0x6E6
1300391: DelayUs(250000);
13010EE6 3002 MOVLW 0x2
13020EE7 0020 MOVLB 0x0
13030EE8 00BC MOVWF last_zero
13040EE9 3045 MOVLW 0x45
13050EEA 00BB MOVWF id_bit
13060EEB 30A9 MOVLW 0xA9
13070EEC 00BA MOVWF search_result
13080EED 0BBA DECFSZ search_result, F
13090EEE 2EED GOTO 0x6ED
13100EEF 0BBB DECFSZ id_bit, F
13110EF0 2EED GOTO 0x6ED
13120EF1 0BBC DECFSZ last_zero, F
13130EF2 2EED GOTO 0x6ED
13140EF3 2EF4 GOTO 0x6F4
1315392: } else {
13160EF4 2F08 GOTO 0x708
13170EF5 2EF6 GOTO 0x6F6
1318393: // keep polling until its done
1319394: // device will reply with 0 'pull low' whilst convert in progress
1320395: do {
1321396: DelayUs(1000);
13220EF6 30F9 MOVLW 0xF9
13230EF7 0020 MOVLB 0x0
13240EF8 00BA MOVWF search_result
13250EF9 0000 NOP
13260EFA 0BBA DECFSZ search_result, F
13270EFB 2EF9 GOTO 0x6F9
13280EFC 2EFD GOTO 0x6FD
13290EFD 0000 NOP
1330397: } while (!OW_read_bit());
13310EFE 318B MOVLP 0xB
13320EFF 2374 CALL 0x374
13330F00 318E MOVLP 0xE
13340F01 3A00 XORLW 0x0
13350F02 1903 BTFSC STATUS, 0x2
13360F03 2F05 GOTO 0x705
13370F04 2F06 GOTO 0x706
13380F05 2EF6 GOTO 0x6F6
13390F06 2F08 GOTO 0x708
13400F07 2F08 GOTO 0x708
1341398: }
1342399: int_enable();
13430F08 318B MOVLP 0xB
13440F09 2320 CALL 0x320
13450F0A 318E MOVLP 0xE
1346400: }
13470F0B 0008 RETURN
1348401:
1349402: /* Available commands :-
1350403: * 33h - read rom (sends 8 bytes)
1351404: * 55h - match rom (reads 8 bytes)
1352405: * F0h - search rom (enumeration mode)
1353406: * ECh - alarm search
1354407: * CC - skip rom command
1355408: *
1356409: * followed by....
1357410: * 44h - convert temperature
1358411: * 48h - copy scratchpad -> eeprom
1359412: * 4Eh - write scratchpad (send 3 bytes )
1360413: * BEh - read scratchpad ( 8 bytes + crc)
1361414: * B8h - recall EEPROM -> scratchpad
1362415: * B4h - read power supply (read 1 bit)
1363416: */
1364--- /home/justin/MPLABXProjects/uart test.X/main.c ----------------------------------------------------
13651: /******************************************************************************/
13662: /* Files to Include */
13673: /******************************************************************************/
13684:
13695: #if defined(__XC)
13706: #include <xc.h> /* XC8 General Include File */
13717: #elif defined(HI_TECH_C)
13728: #include <htc.h> /* HiTech General Include File */
13739: #endif
137410:
137511: #include <stdio.h>
137612:
137713: #include <stdint.h> /* For uint8_t definition */
137814: #include <stdbool.h> /* For true/false definition */
137915:
138016: #include "system.h" /* System funct/params, like osc/peripheral config */
138117: #include "user.h" /* User funct/params, such as InitApp */
138218:
138319: #include "onewire.h" /* 1-wire bus functions */
138420:
138521: /******************************************************************************/
138622: /* User Global Variable Declaration */
138723: /******************************************************************************/
138824:
138925: /* i.e. uint8_t <variable_name>; */
139026:
139127: char outbuff[100];
139228: char * outp = 0;
139329: uint8_t outlen = 0;
139430:
139531: char inbuff[10];
139632: uint8_t inlen = 0;
139733:
139834: /******************************************************************************/
139935: /* Main Program */
140036: /******************************************************************************/
140137:
140238: char prompt[9];
140339:
140440: const char * banner = "\r\n\n\nPIC 1-Wire Bridge system. Press 'H' for help.\r\n";
140541:
140642: void main(void)
140743: {
140844: prompt[0] = 'c';
1409002A 3063 MOVLW 0x63
1410002B 0020 MOVLB 0x0
1411002C 00C1 MOVWF 0x41
1412002D 0841 MOVF 0x41, W
1413002E 00AC MOVWF prompt
141445: prompt[1] = 'm';
1415002F 306D MOVLW 0x6D
14160030 00C1 MOVWF 0x41
14170031 0841 MOVF 0x41, W
14180032 00AD MOVWF 0x2D
141946: prompt[2] = 'd';
14200033 3064 MOVLW 0x64
14210034 00C1 MOVWF 0x41
14220035 0841 MOVF 0x41, W
14230036 00AE MOVWF 0x2E
142447: prompt[3] = ' ';
14250037 3020 MOVLW 0x20
14260038 00C1 MOVWF 0x41
14270039 0841 MOVF 0x41, W
1428003A 00AF MOVWF 0x2F
142948: prompt[4] = '?';
1430003B 303F MOVLW 0x3F
1431003C 00C1 MOVWF 0x41
1432003D 0841 MOVF 0x41, W
1433003E 00B0 MOVWF 0x30
143449: prompt[5] = '?';
1435003F 303F MOVLW 0x3F
14360040 00C1 MOVWF 0x41
14370041 0841 MOVF 0x41, W
14380042 00B1 MOVWF 0x31
143950: prompt[6] = '>';
14400043 303E MOVLW 0x3E
14410044 00C1 MOVWF 0x41
14420045 0841 MOVF 0x41, W
14430046 00B2 MOVWF 0x32
144451: prompt[7] = ' ';
14450047 3020 MOVLW 0x20
14460048 00C1 MOVWF 0x41
14470049 0841 MOVF 0x41, W
1448004A 00B3 MOVWF 0x33
144952: prompt[8] = 0;
1450004B 01B4 CLRF 0x34
145153:
145254: bool usermode = false;
1453004C 0021 MOVLB 0x1
1454004D 01CC CLRF 0x4C
145555:
145656: /* Configure the oscillator for the device */
145757: ConfigureOscillator();
1458004E 318B MOVLP 0xB
1459004F 231F CALL 0x31F
14600050 3180 MOVLP 0x0
146158:
146259: /* Initialize I/O and Peripherals for application */
146360: InitApp();
14640051 318B MOVLP 0xB
14650052 23CE CALL 0x3CE
14660053 3180 MOVLP 0x0
146761:
146862: OW_start();
14690054 318B MOVLP 0xB
14700055 2324 CALL 0x324
14710056 3180 MOVLP 0x0
147263: msg_write(banner);
14730057 0020 MOVLB 0x0
14740058 0844 MOVF 0x44, W
14750059 01F5 CLRF presence
1476005A 07F5 ADDWF presence, F
1477005B 0843 MOVF banner, W
1478005C 01F4 CLRF i
1479005D 07F4 ADDWF i, F
1480005E 318E MOVLP 0xE
1481005F 2613 CALL 0x613
14820060 3180 MOVLP 0x0
14830061 2862 GOTO 0x62
148464: //msg_write(prompt);
148565:
148666: while(1)
148704EA 2862 GOTO 0x62
148867: {
148968: if (TRISAbits.TRISA2 == 1) {
14900062 0021 MOVLB 0x1
14910063 1D0C BTFSS PORTA, 0x2
14920064 2866 GOTO 0x66
14930065 2867 GOTO 0x67
14940066 2881 GOTO 0x81
149569: prompt[4] = 'i';
14960067 3069 MOVLW 0x69
14970068 0020 MOVLB 0x0
14980069 00C1 MOVWF 0x41
1499006A 0841 MOVF 0x41, W
1500006B 00B0 MOVWF 0x30
150170: prompt[5] = PORTAbits.RA2 ? '1':'0';
1502006C 190C BTFSC PORTA, 0x2
1503006D 286F GOTO 0x6F
1504006E 2870 GOTO 0x70
1505006F 2876 GOTO 0x76
15060070 3030 MOVLW 0x30
15070071 0021 MOVLB 0x1
15080072 00B4 MOVWF 0x34
15090073 3000 MOVLW 0x0
15100074 00B5 MOVWF in
15110075 287B GOTO 0x7B
15120076 3031 MOVLW 0x31
15130077 0021 MOVLB 0x1
15140078 00B4 MOVWF 0x34
15150079 3000 MOVLW 0x0
1516007A 00B5 MOVWF in
1517007B 0834 MOVF 0x34, W
1518007C 0020 MOVLB 0x0
1519007D 00C1 MOVWF 0x41
1520007E 0841 MOVF 0x41, W
1521007F 00B1 MOVWF 0x31
152271: } else {
15230080 289B GOTO 0x9B
152472: prompt[4] = 'o';
15250081 306F MOVLW 0x6F
15260082 0020 MOVLB 0x0
15270083 00C1 MOVWF 0x41
15280084 0841 MOVF 0x41, W
15290085 00B0 MOVWF 0x30
153073: prompt[5] = PORTAbits.RA2 ? '1':'0';
15310086 190C BTFSC PORTA, 0x2
15320087 2889 GOTO 0x89
15330088 288A GOTO 0x8A
15340089 2890 GOTO 0x90
1535008A 3030 MOVLW 0x30
1536008B 0021 MOVLB 0x1
1537008C 00B6 MOVWF p
1538008D 3000 MOVLW 0x0
1539008E 00B7 MOVWF i
1540008F 2895 GOTO 0x95
15410090 3031 MOVLW 0x31
15420091 0021 MOVLB 0x1
15430092 00B6 MOVWF p
15440093 3000 MOVLW 0x0
15450094 00B7 MOVWF i
15460095 0836 MOVF p, W
15470096 0020 MOVLB 0x0
15480097 00C1 MOVWF 0x41
15490098 0841 MOVF 0x41, W
15500099 00B1 MOVWF 0x31
1551009A 289B GOTO 0x9B
155274: }
155375:
155476: if (!msg_empty()) continue;
1555009B 318B MOVLP 0xB
1556009C 2344 CALL 0x344
1557009D 3180 MOVLP 0x0
1558009E 3800 IORLW 0x0
1559009F 1D03 BTFSS STATUS, 0x2
156000A0 28A2 GOTO 0xA2
156100A1 28A3 GOTO 0xA3
156200A2 28A5 GOTO 0xA5
156300A3 2862 GOTO 0x62
156400A4 2862 GOTO 0x62
156577:
156678: if (!msg_recvready()) continue;
156700A5 318B MOVLP 0xB
156800A6 233A CALL 0x33A
156900A7 3180 MOVLP 0x0
157000A8 3800 IORLW 0x0
157100A9 1D03 BTFSS STATUS, 0x2
157200AA 28AC GOTO 0xAC
157300AB 28AD GOTO 0xAD
157400AC 28AF GOTO 0xAF
157500AD 2862 GOTO 0x62
157600AE 2862 GOTO 0x62
157779:
157880: char cmd = msg_recv();
157900AF 318D MOVLP 0xD
158000B0 2556 CALL 0x556
158100B1 3180 MOVLP 0x0
158200B2 0020 MOVLB 0x0
158300B3 00C1 MOVWF 0x41
158400B4 0841 MOVF 0x41, W
158500B5 0021 MOVLB 0x1
158600B6 00CB MOVWF 0x4B
158781:
158882: if (cmd == '\r' || cmd == '\n') {
158900B7 084B MOVF 0x4B, W
159000B8 3A0D XORLW 0xD
159100B9 1903 BTFSC STATUS, 0x2
159200BA 28BC GOTO 0xBC
159300BB 28BD GOTO 0xBD
159400BC 28C4 GOTO 0xC4
159500BD 084B MOVF 0x4B, W
159600BE 3A0A XORLW 0xA
159700BF 1D03 BTFSS STATUS, 0x2
159800C0 28C2 GOTO 0xC2
159900C1 28C3 GOTO 0xC3
160000C2 28D1 GOTO 0xD1
160100C3 28C4 GOTO 0xC4
160283: if (usermode) msg_write("\r\n");
160300C4 084C MOVF 0x4C, W
160400C5 1D03 BTFSS STATUS, 0x2
160500C6 28C8 GOTO 0xC8
160600C7 2CDC GOTO 0x4DC
160700C8 3059 MOVLW 0x59
160800C9 00F4 MOVWF i
160900CA 3086 MOVLW 0x86
161000CB 00F5 MOVWF presence
161100CC 318E MOVLP 0xE
161200CD 2613 CALL 0x613
161300CE 3180 MOVLP 0x0
161400CF 2CDC GOTO 0x4DC
161584: }else
161600D0 2CDC GOTO 0x4DC
161785: if (cmd == 'h' || cmd == 'H') {
161800D1 0021 MOVLB 0x1
161900D2 084B MOVF 0x4B, W
162000D3 3A68 XORLW 0x68
162100D4 1903 BTFSC STATUS, 0x2
162200D5 28D7 GOTO 0xD7
162300D6 28D8 GOTO 0xD8
162400D7 28DF GOTO 0xDF
162500D8 084B MOVF 0x4B, W
162600D9 3A48 XORLW 0x48
162700DA 1D03 BTFSS STATUS, 0x2
162800DB 28DD GOTO 0xDD
162900DC 28DE GOTO 0xDE
163000DD 2951 GOTO 0x151
163100DE 28DF GOTO 0xDF
163286: msg_write(banner);
163300DF 0020 MOVLB 0x0
163400E0 0844 MOVF 0x44, W
163500E1 01F5 CLRF presence
163600E2 07F5 ADDWF presence, F
163700E3 0843 MOVF banner, W
163800E4 01F4 CLRF i
163900E5 07F4 ADDWF i, F
164000E6 318E MOVLP 0xE
164100E7 2613 CALL 0x613
164200E8 3180 MOVLP 0x0
164387: msg_write("\nHelp:\r\n");
164400E9 3070 MOVLW 0x70
164500EA 00F4 MOVWF i
164600EB 3088 MOVLW 0x88
164700EC 00F5 MOVWF presence
164800ED 318E MOVLP 0xE
164900EE 2613 CALL 0x613
165000EF 3180 MOVLP 0x0
165188: while (!msg_empty());
165200F0 28F2 GOTO 0xF2
165300F1 28F2 GOTO 0xF2
165400F2 318B MOVLP 0xB
165500F3 2344 CALL 0x344
165600F4 3180 MOVLP 0x0
165700F5 3A00 XORLW 0x0
165800F6 1903 BTFSC STATUS, 0x2
165900F7 28F9 GOTO 0xF9
166000F8 28FA GOTO 0xFA
166100F9 28F2 GOTO 0xF2
166200FA 28FB GOTO 0xFB
166389: msg_write("E - Enumerate the Bus\r\n");
166400FB 30E2 MOVLW 0xE2
166500FC 00F4 MOVWF i
166600FD 3087 MOVLW 0x87
166700FE 00F5 MOVWF presence
166800FF 318E MOVLP 0xE
16690100 2613 CALL 0x613
16700101 3180 MOVLP 0x0
167190: msg_write("R - Reset Bus\r\n");
16720102 303F MOVLW 0x3F
16730103 00F4 MOVWF i
16740104 3088 MOVLW 0x88
16750105 00F5 MOVWF presence
16760106 318E MOVLP 0xE
16770107 2613 CALL 0x613
16780108 3180 MOVLP 0x0
167991: while (!msg_empty());
16800109 290B GOTO 0x10B
1681010A 290B GOTO 0x10B
1682010B 318B MOVLP 0xB
1683010C 2344 CALL 0x344
1684010D 3180 MOVLP 0x0
1685010E 3A00 XORLW 0x0
1686010F 1903 BTFSC STATUS, 0x2
16870110 2912 GOTO 0x112
16880111 2913 GOTO 0x113
16890112 290B GOTO 0x10B
16900113 2914 GOTO 0x114
169192: msg_write("0,1,3 - bus to Low, High, Tristate\r\n");
16920114 3082 MOVLW 0x82
16930115 00F4 MOVWF i
16940116 3086 MOVLW 0x86
16950117 00F5 MOVWF presence
16960118 318E MOVLP 0xE
16970119 2613 CALL 0x613
1698011A 3180 MOVLP 0x0
169993: msg_write("I - Read (one) Device ID\r\n");
1700011B 3064 MOVLW 0x64
1701011C 00F4 MOVWF i
1702011D 3087 MOVLW 0x87
1703011E 00F5 MOVWF presence
1704011F 318E MOVLP 0xE
17050120 2613 CALL 0x613
17060121 3180 MOVLP 0x0
170794: while (!msg_empty());
17080122 2924 GOTO 0x124
17090123 2924 GOTO 0x124
17100124 318B MOVLP 0xB
17110125 2344 CALL 0x344
17120126 3180 MOVLP 0x0
17130127 3A00 XORLW 0x0
17140128 1903 BTFSC STATUS, 0x2
17150129 292B GOTO 0x12B
1716012A 292C GOTO 0x12C
1717012B 2924 GOTO 0x124
1718012C 292D GOTO 0x12D
171995: msg_write("P - Any device parasitic powered?\r\n");
1720012D 30A7 MOVLW 0xA7
1721012E 00F4 MOVWF i
1722012F 3086 MOVLW 0x86
17230130 00F5 MOVWF presence
17240131 318E MOVLP 0xE
17250132 2613 CALL 0x613
17260133 3180 MOVLP 0x0
172796: msg_write("S - Read scratchpad memory\r\n");
17280134 302B MOVLW 0x2B
17290135 00F4 MOVWF i
17300136 3087 MOVLW 0x87
17310137 00F5 MOVWF presence
17320138 318E MOVLP 0xE
17330139 2613 CALL 0x613
1734013A 3180 MOVLP 0x0
173597: while (!msg_empty());
1736013B 293D GOTO 0x13D
1737013C 293D GOTO 0x13D
1738013D 318B MOVLP 0xB
1739013E 2344 CALL 0x344
1740013F 3180 MOVLP 0x0
17410140 3A00 XORLW 0x0
17420141 1903 BTFSC STATUS, 0x2
17430142 2944 GOTO 0x144
17440143 2945 GOTO 0x145
17450144 293D GOTO 0x13D
17460145 2946 GOTO 0x146
174798: msg_write("T - read temperature of all devices\r\n");
17480146 305C MOVLW 0x5C
17490147 00F4 MOVWF i
17500148 3086 MOVLW 0x86
17510149 00F5 MOVWF presence
1752014A 318E MOVLP 0xE
1753014B 2613 CALL 0x613
1754014C 3180 MOVLP 0x0
175599: usermode = true;
1756014D 0021 MOVLB 0x1
1757014E 01CC CLRF 0x4C
1758014F 0ACC INCF 0x4C, F
1759100: } else
17600150 2CDC GOTO 0x4DC
1761101: if (cmd == 'r' || cmd == 'R') {
17620151 084B MOVF 0x4B, W
17630152 3A72 XORLW 0x72
17640153 1903 BTFSC STATUS, 0x2
17650154 2956 GOTO 0x156
17660155 2957 GOTO 0x157
17670156 295E GOTO 0x15E
17680157 084B MOVF 0x4B, W
17690158 3A52 XORLW 0x52
17700159 1D03 BTFSS STATUS, 0x2
1771015A 295C GOTO 0x15C
1772015B 295D GOTO 0x15D
1773015C 298F GOTO 0x18F
1774015D 295E GOTO 0x15E
1775102: int_disable();
1776015E 318B MOVLP 0xB
1777015F 2322 CALL 0x322
17780160 3180 MOVLP 0x0
1779103: bool present = OW_reset();
17800161 318C MOVLP 0xC
17810162 2437 CALL 0x437
17820163 3180 MOVLP 0x0
17830164 0020 MOVLB 0x0
17840165 00C1 MOVWF 0x41
17850166 0841 MOVF 0x41, W
17860167 0021 MOVLB 0x1
17870168 00B2 MOVWF 0x32
1788104: int_enable();
17890169 318B MOVLP 0xB
1790016A 2320 CALL 0x320
1791016B 3180 MOVLP 0x0
1792105: if (usermode) msg_write("\r");
1793016C 0021 MOVLB 0x1
1794016D 084C MOVF 0x4C, W
1795016E 1D03 BTFSS STATUS, 0x2
1796016F 2971 GOTO 0x171
17970170 2979 GOTO 0x179
17980171 30B2 MOVLW 0xB2
17990172 00F4 MOVWF i
18000173 3088 MOVLW 0x88
18010174 00F5 MOVWF presence
18020175 318E MOVLP 0xE
18030176 2613 CALL 0x613
18040177 3180 MOVLP 0x0
18050178 2979 GOTO 0x179
1806106: if (present)
18070179 0021 MOVLB 0x1
1808017A 0832 MOVF 0x32, W
1809017B 1D03 BTFSS STATUS, 0x2
1810017C 297E GOTO 0x17E
1811017D 2986 GOTO 0x186
1812107: msg_write("RESET Device detected.\r\n");
1813017E 307F MOVLW 0x7F
1814017F 00F4 MOVWF i
18150180 3087 MOVLW 0x87
18160181 00F5 MOVWF presence
18170182 318E MOVLP 0xE
18180183 2613 CALL 0x613
18190184 3180 MOVLP 0x0
18200185 2CDC GOTO 0x4DC
1821108: else
1822109: msg_write("RESET No Devices detected.\r\n");
18230186 300E MOVLW 0xE
18240187 00F4 MOVWF i
18250188 3087 MOVLW 0x87
18260189 00F5 MOVWF presence
1827018A 318E MOVLP 0xE
1828018B 2613 CALL 0x613
1829018C 3180 MOVLP 0x0
1830018D 2CDC GOTO 0x4DC
1831110: } else
1832018E 2CDC GOTO 0x4DC
1833111: if (cmd == 'e' || cmd == 'E')
1834018F 0021 MOVLB 0x1
18350190 084B MOVF 0x4B, W
18360191 3A65 XORLW 0x65
18370192 1903 BTFSC STATUS, 0x2
18380193 2995 GOTO 0x195
18390194 2996 GOTO 0x196
18400195 299C GOTO 0x19C
18410196 084B MOVF 0x4B, W
18420197 3A45 XORLW 0x45
18430198 1D03 BTFSS STATUS, 0x2
18440199 299B GOTO 0x19B
1845019A 299C GOTO 0x19C
1846019B 2A25 GOTO 0x225
1847112: {
1848113: char count = 0;
1849019C 01C1 CLRF 0x41
1850114: if (usermode) msg_write("\r");
1851019D 084C MOVF 0x4C, W
1852019E 1D03 BTFSS STATUS, 0x2
1853019F 29A1 GOTO 0x1A1
185401A0 29A9 GOTO 0x1A9
185501A1 30B2 MOVLW 0xB2
185601A2 00F4 MOVWF i
185701A3 3088 MOVLW 0x88
185801A4 00F5 MOVWF presence
185901A5 318E MOVLP 0xE
186001A6 2613 CALL 0x613
186101A7 3180 MOVLP 0x0
186201A8 29A9 GOTO 0x1A9
1863115: OW_search_init();
186401A9 318C MOVLP 0xC
186501AA 248C CALL 0x48C
186601AB 3180 MOVLP 0x0
1867116: while (OW_search())
186801AC 2A00 GOTO 0x200
18690200 318F MOVLP 0xF
18700201 270C CALL 0x70C
18710202 3180 MOVLP 0x0
18720203 3800 IORLW 0x0
18730204 1D03 BTFSS STATUS, 0x2
18740205 2A07 GOTO 0x207
18750206 2A08 GOTO 0x208
18760207 29AD GOTO 0x1AD
18770208 2A09 GOTO 0x209
1878117: {
1879118: char val[3];
1880119: if (usermode) msg_write("ENUM ");
188101AD 0021 MOVLB 0x1
188201AE 084C MOVF 0x4C, W
188301AF 1D03 BTFSS STATUS, 0x2
188401B0 29B2 GOTO 0x1B2
188501B1 29BA GOTO 0x1BA
188601B2 309D MOVLW 0x9D
188701B3 00F4 MOVWF i
188801B4 3088 MOVLW 0x88
188901B5 00F5 MOVWF presence
189001B6 318E MOVLP 0xE
189101B7 2613 CALL 0x613
189201B8 3180 MOVLP 0x0
189301B9 29BA GOTO 0x1BA
1894120: for (char j=0; j<8; j++) {
189501BA 0021 MOVLB 0x1
189601BB 01C6 CLRF 0x46
189701BC 3008 MOVLW 0x8
189801BD 0246 SUBWF 0x46, W
189901BE 1C03 BTFSS STATUS, 0x0
190001BF 29C1 GOTO 0x1C1
190101C0 29C2 GOTO 0x1C2
190201C1 29C4 GOTO 0x1C4
190301C2 29E5 GOTO 0x1E5
190401C3 29E5 GOTO 0x1E5
190501D8 3001 MOVLW 0x1
190601D9 0020 MOVLB 0x0
190701DA 00C1 MOVWF 0x41
190801DB 0841 MOVF 0x41, W
190901DC 0021 MOVLB 0x1
191001DD 07C6 ADDWF 0x46, F
191101DE 3008 MOVLW 0x8
191201DF 0246 SUBWF 0x46, W
191301E0 1C03 BTFSS STATUS, 0x0
191401E1 29E3 GOTO 0x1E3
191501E2 29E4 GOTO 0x1E4
191601E3 29C4 GOTO 0x1C4
191701E4 29E5 GOTO 0x1E5
1918121: tohex(val, romid[j]);
191901C4 0846 MOVF 0x46, W
192001C5 3E20 ADDLW 0x20
192101C6 0086 MOVWF FSR1L
192201C7 0187 CLRF FSR1H
192301C8 0801 MOVF INDF1, W
192401C9 0020 MOVLB 0x0
192501CA 00C1 MOVWF 0x41
192601CB 0841 MOVF 0x41, W
192701CC 00F4 MOVWF i
192801CD 30B8 MOVLW 0xB8
192901CE 318E MOVLP 0xE
193001CF 2659 CALL 0x659
193101D0 3180 MOVLP 0x0
1932122: msg_write(val);
193301D1 30B8 MOVLW 0xB8
193401D2 00F4 MOVWF i
193501D3 3000 MOVLW 0x0
193601D4 00F5 MOVWF presence
193701D5 318E MOVLP 0xE
193801D6 2613 CALL 0x613
193901D7 3180 MOVLP 0x0
1940123: }
1941124: if (usermode) msg_write("\r\n"); else msg_write("\n");
194201E5 084C MOVF 0x4C, W
194301E6 1D03 BTFSS STATUS, 0x2
194401E7 29E9 GOTO 0x1E9
194501E8 29F1 GOTO 0x1F1
194601E9 3059 MOVLW 0x59
194701EA 00F4 MOVWF i
194801EB 3086 MOVLW 0x86
194901EC 00F5 MOVWF presence
195001ED 318E MOVLP 0xE
195101EE 2613 CALL 0x613
195201EF 3180 MOVLP 0x0
195301F0 29F9 GOTO 0x1F9
195401F1 305A MOVLW 0x5A
195501F2 00F4 MOVWF i
195601F3 3086 MOVLW 0x86
195701F4 00F5 MOVWF presence
195801F5 318E MOVLP 0xE
195901F6 2613 CALL 0x613
196001F7 3180 MOVLP 0x0
196101F8 29F9 GOTO 0x1F9
1962125: count++;
196301F9 3001 MOVLW 0x1
196401FA 0020 MOVLB 0x0
196501FB 00C1 MOVWF 0x41
196601FC 0841 MOVF 0x41, W
196701FD 0021 MOVLB 0x1
196801FE 07C1 ADDWF 0x41, F
196901FF 2A00 GOTO 0x200
1970126: }
1971127: if (usermode) {
19720209 0021 MOVLB 0x1
1973020A 084C MOVF 0x4C, W
1974020B 1D03 BTFSS STATUS, 0x2
1975020C 2A0E GOTO 0x20E
1976020D 2A1C GOTO 0x21C
1977128: if (count==0) msg_write("ERROR No devices found\r\n");
1978020E 08C1 MOVF 0x41, F
1979020F 1D03 BTFSS STATUS, 0x2
19800210 2A12 GOTO 0x212
19810211 2A13 GOTO 0x213
19820212 2CDC GOTO 0x4DC
19830213 3098 MOVLW 0x98
19840214 00F4 MOVWF i
19850215 3087 MOVLW 0x87
19860216 00F5 MOVWF presence
19870217 318E MOVLP 0xE
19880218 2613 CALL 0x613
19890219 3180 MOVLP 0x0
1990021A 2CDC GOTO 0x4DC
1991129: } else {
1992021B 2CDC GOTO 0x4DC
1993130: msg_write("END\n");
1994021C 30A3 MOVLW 0xA3
1995021D 00F4 MOVWF i
1996021E 3088 MOVLW 0x88
1997021F 00F5 MOVWF presence
19980220 318E MOVLP 0xE
19990221 2613 CALL 0x613
20000222 3180 MOVLP 0x0
20010223 2CDC GOTO 0x4DC
2002131: }
2003132: }else
20040224 2CDC GOTO 0x4DC
2005133: if (cmd == 'i' || cmd == 'I') {
20060225 0021 MOVLB 0x1
20070226 084B MOVF 0x4B, W
20080227 3A69 XORLW 0x69
20090228 1903 BTFSC STATUS, 0x2
20100229 2A2B GOTO 0x22B
2011022A 2A2C GOTO 0x22C
2012022B 2A33 GOTO 0x233
2013022C 084B MOVF 0x4B, W
2014022D 3A49 XORLW 0x49
2015022E 1D03 BTFSS STATUS, 0x2
2016022F 2A31 GOTO 0x231
20170230 2A32 GOTO 0x232
20180231 2A83 GOTO 0x283
20190232 2A33 GOTO 0x233
2020134: OW_identify();
20210233 318D MOVLP 0xD
20220234 2592 CALL 0x592
20230235 3180 MOVLP 0x0
2024135: char val[3];
2025136: if (usermode) msg_write("\rID ");
20260236 0021 MOVLB 0x1
20270237 084C MOVF 0x4C, W
20280238 1D03 BTFSS STATUS, 0x2
20290239 2A3B GOTO 0x23B
2030023A 2A43 GOTO 0x243
2031023B 30AD MOVLW 0xAD
2032023C 00F4 MOVWF i
2033023D 3088 MOVLW 0x88
2034023E 00F5 MOVWF presence
2035023F 318E MOVLP 0xE
20360240 2613 CALL 0x613
20370241 3180 MOVLP 0x0
20380242 2A43 GOTO 0x243
2039137: for (char j=0; j<8; j++) {
20400243 0021 MOVLB 0x1
20410244 01C7 CLRF 0x47
20420245 3008 MOVLW 0x8
20430246 0247 SUBWF 0x47, W
20440247 1C03 BTFSS STATUS, 0x0
20450248 2A4A GOTO 0x24A
20460249 2A4B GOTO 0x24B
2047024A 2A4D GOTO 0x24D
2048024B 2A6E GOTO 0x26E
2049024C 2A6E GOTO 0x26E
20500261 3001 MOVLW 0x1
20510262 0020 MOVLB 0x0
20520263 00C1 MOVWF 0x41
20530264 0841 MOVF 0x41, W
20540265 0021 MOVLB 0x1
20550266 07C7 ADDWF 0x47, F
20560267 3008 MOVLW 0x8
20570268 0247 SUBWF 0x47, W
20580269 1C03 BTFSS STATUS, 0x0
2059026A 2A6C GOTO 0x26C
2060026B 2A6D GOTO 0x26D
2061026C 2A4D GOTO 0x24D
2062026D 2A6E GOTO 0x26E
2063138: tohex(val, romid[j]);
2064024D 0847 MOVF 0x47, W
2065024E 3E20 ADDLW 0x20
2066024F 0086 MOVWF FSR1L
20670250 0187 CLRF FSR1H
20680251 0801 MOVF INDF1, W
20690252 0020 MOVLB 0x0
20700253 00C1 MOVWF 0x41
20710254 0841 MOVF 0x41, W
20720255 00F4 MOVWF i
20730256 30BB MOVLW 0xBB
20740257 318E MOVLP 0xE
20750258 2659 CALL 0x659
20760259 3180 MOVLP 0x0
2077139: msg_write(val);
2078025A 30BB MOVLW 0xBB
2079025B 00F4 MOVWF i
2080025C 3000 MOVLW 0x0
2081025D 00F5 MOVWF presence
2082025E 318E MOVLP 0xE
2083025F 2613 CALL 0x613
20840260 3180 MOVLP 0x0
2085140: }
2086141: if (usermode) msg_write("\r\n"); else msg_write("\n");
2087026E 084C MOVF 0x4C, W
2088026F 1D03 BTFSS STATUS, 0x2
20890270 2A72 GOTO 0x272
20900271 2A7A GOTO 0x27A
20910272 3059 MOVLW 0x59
20920273 00F4 MOVWF i
20930274 3086 MOVLW 0x86
20940275 00F5 MOVWF presence
20950276 318E MOVLP 0xE
20960277 2613 CALL 0x613
20970278 3180 MOVLP 0x0
20980279 2CDC GOTO 0x4DC
2099027A 305A MOVLW 0x5A
2100027B 00F4 MOVWF i
2101027C 3086 MOVLW 0x86
2102027D 00F5 MOVWF presence
2103027E 318E MOVLP 0xE
2104027F 2613 CALL 0x613
21050280 3180 MOVLP 0x0
21060281 2CDC GOTO 0x4DC
2107142: }else
21080282 2CDC GOTO 0x4DC
2109143: if (cmd == 'p' || cmd == 'P') {
21100283 0021 MOVLB 0x1
21110284 084B MOVF 0x4B, W
21120285 3A70 XORLW 0x70
21130286 1903 BTFSC STATUS, 0x2
21140287 2A89 GOTO 0x289
21150288 2A8A GOTO 0x28A
21160289 2A91 GOTO 0x291
2117028A 084B MOVF 0x4B, W
2118028B 3A50 XORLW 0x50
2119028C 1D03 BTFSS STATUS, 0x2
2120028D 2A8F GOTO 0x28F
2121028E 2A90 GOTO 0x290
2122028F 2AD5 GOTO 0x2D5
21230290 2A91 GOTO 0x291
2124144: if (usermode) msg_write("\r");
21250291 084C MOVF 0x4C, W
21260292 1D03 BTFSS STATUS, 0x2
21270293 2A95 GOTO 0x295
21280294 2A9D GOTO 0x29D
21290295 30B2 MOVLW 0xB2
21300296 00F4 MOVWF i
21310297 3088 MOVLW 0x88
21320298 00F5 MOVWF presence
21330299 318E MOVLP 0xE
2134029A 2613 CALL 0x613
2135029B 3180 MOVLP 0x0
2136029C 2A9D GOTO 0x29D
2137145: bool para = OW_parasite();
2138029D 318B MOVLP 0xB
2139029E 23AE CALL 0x3AE
2140029F 3180 MOVLP 0x0
214102A0 0020 MOVLB 0x0
214202A1 00C1 MOVWF 0x41
214302A2 0841 MOVF 0x41, W
214402A3 0021 MOVLB 0x1
214502A4 00C2 MOVWF 0x42
2146146: if (usermode) {
214702A5 084C MOVF 0x4C, W
214802A6 1D03 BTFSS STATUS, 0x2
214902A7 2AA9 GOTO 0x2A9
215002A8 2ABE GOTO 0x2BE
2151147: if (para)
215202A9 0842 MOVF 0x42, W
215302AA 1D03 BTFSS STATUS, 0x2
215402AB 2AAD GOTO 0x2AD
215502AC 2AB5 GOTO 0x2B5
2156148: msg_write("PARA A Device is parasite powered\r\n");
215702AD 30CB MOVLW 0xCB
215802AE 00F4 MOVWF i
215902AF 3086 MOVLW 0x86
216002B0 00F5 MOVWF presence
216102B1 318E MOVLP 0xE
216202B2 2613 CALL 0x613
216302B3 3180 MOVLP 0x0
216402B4 2CDC GOTO 0x4DC
2165149: else
2166150: msg_write("PARA No Device is parasite powered.\r\n");
216702B5 3036 MOVLW 0x36
216802B6 00F4 MOVWF i
216902B7 3086 MOVLW 0x86
217002B8 00F5 MOVWF presence
217102B9 318E MOVLP 0xE
217202BA 2613 CALL 0x613
217302BB 3180 MOVLP 0x0
217402BC 2CDC GOTO 0x4DC
2175151: } else {
217602BD 2CDC GOTO 0x4DC
2177152: if (para) msg_write("PARA\n"); else msg_write("DIRECT\n");
217802BE 0021 MOVLB 0x1
217902BF 0842 MOVF 0x42, W
218002C0 1D03 BTFSS STATUS, 0x2
218102C1 2AC3 GOTO 0x2C3
218202C2 2ACB GOTO 0x2CB
218302C3 3091 MOVLW 0x91
218402C4 00F4 MOVWF i
218502C5 3088 MOVLW 0x88
218602C6 00F5 MOVWF presence
218702C7 318E MOVLP 0xE
218802C8 2613 CALL 0x613
218902C9 3180 MOVLP 0x0
219002CA 2CDC GOTO 0x4DC
219102CB 3082 MOVLW 0x82
219202CC 00F4 MOVWF i
219302CD 3088 MOVLW 0x88
219402CE 00F5 MOVWF presence
219502CF 318E MOVLP 0xE
219602D0 2613 CALL 0x613
219702D1 3180 MOVLP 0x0
219802D2 2CDC GOTO 0x4DC
219902D3 2CDC GOTO 0x4DC
2200153: }
2201154: }else
220202D4 2CDC GOTO 0x4DC
2203155: if (cmd == 's' || cmd =='S') {
220402D5 0021 MOVLB 0x1
220502D6 084B MOVF 0x4B, W
220602D7 3A73 XORLW 0x73
220702D8 1903 BTFSC STATUS, 0x2
220802D9 2ADB GOTO 0x2DB
220902DA 2ADC GOTO 0x2DC
221002DB 2AE2 GOTO 0x2E2
221102DC 084B MOVF 0x4B, W
221202DD 3A53 XORLW 0x53
221302DE 1D03 BTFSS STATUS, 0x2
221402DF 2AE1 GOTO 0x2E1
221502E0 2AE2 GOTO 0x2E2
221602E1 2B44 GOTO 0x344
2217156: uint8_t scratch[9];
2218157: romid[0] = 0; // select all devices
221902E2 0020 MOVLB 0x0
222002E3 01A0 CLRF romid
2221158: OW_read_block(0xBE, scratch, 9);
222202E4 30A0 MOVLW 0xA0
222302E5 00C1 MOVWF 0x41
222402E6 0841 MOVF 0x41, W
222502E7 00BA MOVWF search_result
222602E8 3009 MOVLW 0x9
222702E9 00C2 MOVWF 0x42
222802EA 0842 MOVF 0x42, W
222902EB 00BB MOVWF id_bit
223002EC 30BE MOVLW 0xBE
223102ED 318D MOVLP 0xD
223202EE 251A CALL 0x51A
223302EF 3180 MOVLP 0x0
2234159: if (usermode) msg_write("\rSCRATCH");
223502F0 0021 MOVLB 0x1
223602F1 084C MOVF 0x4C, W
223702F2 1D03 BTFSS STATUS, 0x2
223802F3 2AF5 GOTO 0x2F5
223902F4 2AFD GOTO 0x2FD
224002F5 3079 MOVLW 0x79
224102F6 00F4 MOVWF i
224202F7 3088 MOVLW 0x88
224302F8 00F5 MOVWF presence
224402F9 318E MOVLP 0xE
224502FA 2613 CALL 0x613
224602FB 3180 MOVLP 0x0
224702FC 2AFD GOTO 0x2FD
2248160: for (char j=0; j<9; j++) {
224902FD 0021 MOVLB 0x1
225002FE 01C8 CLRF 0x48
225102FF 3009 MOVLW 0x9
22520300 0248 SUBWF 0x48, W
22530301 1C03 BTFSS STATUS, 0x0
22540302 2B04 GOTO 0x304
22550303 2B05 GOTO 0x305
22560304 2B07 GOTO 0x307
22570305 2B2F GOTO 0x32F
22580306 2B2F GOTO 0x32F
22590322 3001 MOVLW 0x1
22600323 0020 MOVLB 0x0
22610324 00C1 MOVWF 0x41
22620325 0841 MOVF 0x41, W
22630326 0021 MOVLB 0x1
22640327 07C8 ADDWF 0x48, F
22650328 3009 MOVLW 0x9
22660329 0248 SUBWF 0x48, W
2267032A 1C03 BTFSS STATUS, 0x0
2268032B 2B2D GOTO 0x32D
2269032C 2B2E GOTO 0x32E
2270032D 2B07 GOTO 0x307
2271032E 2B2F GOTO 0x32F
2272161: char val[3];
2273162: tohex(val, scratch[j]);
22740307 0848 MOVF 0x48, W
22750308 3EA0 ADDLW 0xA0
22760309 0086 MOVWF FSR1L
2277030A 0187 CLRF FSR1H
2278030B 0801 MOVF INDF1, W
2279030C 0020 MOVLB 0x0
2280030D 00C1 MOVWF 0x41
2281030E 0841 MOVF 0x41, W
2282030F 00F4 MOVWF i
22830310 30BE MOVLW 0xBE
22840311 318E MOVLP 0xE
22850312 2659 CALL 0x659
22860313 3180 MOVLP 0x0
2287163: msg_write(" ");
22880314 30B0 MOVLW 0xB0
22890315 00F4 MOVWF i
22900316 3088 MOVLW 0x88
22910317 00F5 MOVWF presence
22920318 318E MOVLP 0xE
22930319 2613 CALL 0x613
2294031A 3180 MOVLP 0x0
2295164: msg_write(val);
2296031B 30BE MOVLW 0xBE
2297031C 00F4 MOVWF i
2298031D 3000 MOVLW 0x0
2299031E 00F5 MOVWF presence
2300031F 318E MOVLP 0xE
23010320 2613 CALL 0x613
23020321 3180 MOVLP 0x0
2303165: }
2304166: if (usermode) msg_write("\r\n"); else msg_write("\n");
2305032F 084C MOVF 0x4C, W
23060330 1D03 BTFSS STATUS, 0x2
23070331 2B33 GOTO 0x333
23080332 2B3B GOTO 0x33B
23090333 3059 MOVLW 0x59
23100334 00F4 MOVWF i
23110335 3086 MOVLW 0x86
23120336 00F5 MOVWF presence
23130337 318E MOVLP 0xE
23140338 2613 CALL 0x613
23150339 3180 MOVLP 0x0
2316033A 2CDC GOTO 0x4DC
2317033B 305A MOVLW 0x5A
2318033C 00F4 MOVWF i
2319033D 3086 MOVLW 0x86
2320033E 00F5 MOVWF presence
2321033F 318E MOVLP 0xE
23220340 2613 CALL 0x613
23230341 3180 MOVLP 0x0
23240342 2CDC GOTO 0x4DC
2325167: }else
23260343 2CDC GOTO 0x4DC
2327168: if (cmd == 't' || cmd == 'T') {
23280344 0021 MOVLB 0x1
23290345 084B MOVF 0x4B, W
23300346 3A74 XORLW 0x74
23310347 1903 BTFSC STATUS, 0x2
23320348 2B4A GOTO 0x34A
23330349 2B4B GOTO 0x34B
2334034A 2B52 GOTO 0x352
2335034B 084B MOVF 0x4B, W
2336034C 3A54 XORLW 0x54
2337034D 1D03 BTFSS STATUS, 0x2
2338034E 2B50 GOTO 0x350
2339034F 2B51 GOTO 0x351
23400350 2C10 GOTO 0x410
23410351 2B52 GOTO 0x352
2342169: char val[3];
2343170: uint8_t scratch[9];
2344171:
2345172: // oddly, cant do a mass-convert with parasitic
2346173: // they seem to all reset when you try
2347174:
2348175: // now step through every unit and read the value
2349176: OW_search_init();
23500352 318C MOVLP 0xC
23510353 248C CALL 0x48C
23520354 3180 MOVLP 0x0
2353177: while (OW_search())
23540355 2BF8 GOTO 0x3F8
235503F8 318F MOVLP 0xF
235603F9 270C CALL 0x70C
235703FA 3180 MOVLP 0x0
235803FB 3800 IORLW 0x0
235903FC 1D03 BTFSS STATUS, 0x2
236003FD 2BFF GOTO 0x3FF
236103FE 2C00 GOTO 0x400
236203FF 2B56 GOTO 0x356
23630400 2C01 GOTO 0x401
2364178: {
2365179: // ask device to do conversion
2366180: OW_convert();
23670356 318E MOVLP 0xE
23680357 26A0 CALL 0x6A0
23690358 3180 MOVLP 0x0
2370181:
2371182: // empty the scratch pad
2372183: for (char j=0; j<9; j++) scratch[j]=0;
23730359 0021 MOVLB 0x1
2374035A 01C9 CLRF 0x49
2375035B 3009 MOVLW 0x9
2376035C 0249 SUBWF 0x49, W
2377035D 1C03 BTFSS STATUS, 0x0
2378035E 2B60 GOTO 0x360
2379035F 2B61 GOTO 0x361
23800360 2B63 GOTO 0x363
23810361 2B75 GOTO 0x375
23820362 2B75 GOTO 0x375
23830363 0849 MOVF 0x49, W
23840364 3EA9 ADDLW 0xA9
23850365 0086 MOVWF FSR1L
23860366 0187 CLRF FSR1H
23870367 0181 CLRF INDF1
23880368 3001 MOVLW 0x1
23890369 0020 MOVLB 0x0
2390036A 00C1 MOVWF 0x41
2391036B 0841 MOVF 0x41, W
2392036C 0021 MOVLB 0x1
2393036D 07C9 ADDWF 0x49, F
2394036E 3009 MOVLW 0x9
2395036F 0249 SUBWF 0x49, W
23960370 1C03 BTFSS STATUS, 0x0
23970371 2B73 GOTO 0x373
23980372 2B74 GOTO 0x374
23990373 2B63 GOTO 0x363
24000374 2B75 GOTO 0x375
2401184:
2402185: // read this devices scratch pad
2403186: OW_read_block(0xBE, scratch, 9);
24040375 30A9 MOVLW 0xA9
24050376 0020 MOVLB 0x0
24060377 00C1 MOVWF 0x41
24070378 0841 MOVF 0x41, W
24080379 00BA MOVWF search_result
2409037A 3009 MOVLW 0x9
2410037B 00C2 MOVWF 0x42
2411037C 0842 MOVF 0x42, W
2412037D 00BB MOVWF id_bit
2413037E 30BE MOVLW 0xBE
2414037F 318D MOVLP 0xD
24150380 251A CALL 0x51A
24160381 3180 MOVLP 0x0
2417187:
2418188: // print rom id and temperature
2419189: if (usermode) msg_write("\rTEMP ");
24200382 0021 MOVLB 0x1
24210383 084C MOVF 0x4C, W
24220384 1D03 BTFSS STATUS, 0x2
24230385 2B87 GOTO 0x387
24240386 2B8F GOTO 0x38F
24250387 308A MOVLW 0x8A
24260388 00F4 MOVWF i
24270389 3088 MOVLW 0x88
2428038A 00F5 MOVWF presence
2429038B 318E MOVLP 0xE
2430038C 2613 CALL 0x613
2431038D 3180 MOVLP 0x0
2432038E 2B8F GOTO 0x38F
2433190: for (char j=0;j<8;j++) {
2434038F 0021 MOVLB 0x1
24350390 01CA CLRF 0x4A
24360391 3008 MOVLW 0x8
24370392 024A SUBWF 0x4A, W
24380393 1C03 BTFSS STATUS, 0x0
24390394 2B96 GOTO 0x396
24400395 2B97 GOTO 0x397
24410396 2B99 GOTO 0x399
24420397 2BBA GOTO 0x3BA
24430398 2BBA GOTO 0x3BA
244403AD 3001 MOVLW 0x1
244503AE 0020 MOVLB 0x0
244603AF 00C1 MOVWF 0x41
244703B0 0841 MOVF 0x41, W
244803B1 0021 MOVLB 0x1
244903B2 07CA ADDWF 0x4A, F
245003B3 3008 MOVLW 0x8
245103B4 024A SUBWF 0x4A, W
245203B5 1C03 BTFSS STATUS, 0x0
245303B6 2BB8 GOTO 0x3B8
245403B7 2BB9 GOTO 0x3B9
245503B8 2B99 GOTO 0x399
245603B9 2BBA GOTO 0x3BA
2457191: tohex(val, romid[j]);
24580399 084A MOVF 0x4A, W
2459039A 3E20 ADDLW 0x20
2460039B 0086 MOVWF FSR1L
2461039C 0187 CLRF FSR1H
2462039D 0801 MOVF INDF1, W
2463039E 0020 MOVLB 0x0
2464039F 00C1 MOVWF 0x41
246503A0 0841 MOVF 0x41, W
246603A1 00F4 MOVWF i
246703A2 30C3 MOVLW 0xC3
246803A3 318E MOVLP 0xE
246903A4 2659 CALL 0x659
247003A5 3180 MOVLP 0x0
2471192: msg_write(val);
247203A6 30C3 MOVLW 0xC3
247303A7 00F4 MOVWF i
247403A8 3000 MOVLW 0x0
247503A9 00F5 MOVWF presence
247603AA 318E MOVLP 0xE
247703AB 2613 CALL 0x613
247803AC 3180 MOVLP 0x0
2479193: }
2480194: msg_write(" ");
248103BA 30B0 MOVLW 0xB0
248203BB 00F4 MOVWF i
248303BC 3088 MOVLW 0x88
248403BD 00F5 MOVWF presence
248503BE 318E MOVLP 0xE
248603BF 2613 CALL 0x613
248703C0 3180 MOVLP 0x0
2488195: tohex(val, scratch[1]);
248903C1 0021 MOVLB 0x1
249003C2 082A MOVF LastFamilyDiscrepancy, W
249103C3 0020 MOVLB 0x0
249203C4 00C1 MOVWF 0x41
249303C5 0841 MOVF 0x41, W
249403C6 00F4 MOVWF i
249503C7 30C3 MOVLW 0xC3
249603C8 318E MOVLP 0xE
249703C9 2659 CALL 0x659
249803CA 3180 MOVLP 0x0
2499196: msg_write(val);
250003CB 30C3 MOVLW 0xC3
250103CC 00F4 MOVWF i
250203CD 3000 MOVLW 0x0
250303CE 00F5 MOVWF presence
250403CF 318E MOVLP 0xE
250503D0 2613 CALL 0x613
250603D1 3180 MOVLP 0x0
2507197: tohex(val, scratch[0]);
250803D2 0021 MOVLB 0x1
250903D3 0829 MOVF LastDiscrepancy, W
251003D4 0020 MOVLB 0x0
251103D5 00C1 MOVWF 0x41
251203D6 0841 MOVF 0x41, W
251303D7 00F4 MOVWF i
251403D8 30C3 MOVLW 0xC3
251503D9 318E MOVLP 0xE
251603DA 2659 CALL 0x659
251703DB 3180 MOVLP 0x0
2518198: msg_write(val);
251903DC 30C3 MOVLW 0xC3
252003DD 00F4 MOVWF i
252103DE 3000 MOVLW 0x0
252203DF 00F5 MOVWF presence
252303E0 318E MOVLP 0xE
252403E1 2613 CALL 0x613
252503E2 3180 MOVLP 0x0
2526199: if (usermode) msg_write("\r\n"); else msg_write("\n");
252703E3 0021 MOVLB 0x1
252803E4 084C MOVF 0x4C, W
252903E5 1D03 BTFSS STATUS, 0x2
253003E6 2BE8 GOTO 0x3E8
253103E7 2BF0 GOTO 0x3F0
253203E8 3059 MOVLW 0x59
253303E9 00F4 MOVWF i
253403EA 3086 MOVLW 0x86
253503EB 00F5 MOVWF presence
253603EC 318E MOVLP 0xE
253703ED 2613 CALL 0x613
253803EE 3180 MOVLP 0x0
253903EF 2BF8 GOTO 0x3F8
254003F0 305A MOVLW 0x5A
254103F1 00F4 MOVWF i
254203F2 3086 MOVLW 0x86
254303F3 00F5 MOVWF presence
254403F4 318E MOVLP 0xE
254503F5 2613 CALL 0x613
254603F6 3180 MOVLP 0x0
254703F7 2BF8 GOTO 0x3F8
2548200: }
2549201:
2550202: if (!usermode) msg_write("END\n");
25510401 0021 MOVLB 0x1
25520402 08CC MOVF 0x4C, F
25530403 1D03 BTFSS STATUS, 0x2
25540404 2C06 GOTO 0x406
25550405 2C07 GOTO 0x407
25560406 2CDC GOTO 0x4DC
25570407 30A3 MOVLW 0xA3
25580408 00F4 MOVWF i
25590409 3088 MOVLW 0x88
2560040A 00F5 MOVWF presence
2561040B 318E MOVLP 0xE
2562040C 2613 CALL 0x613
2563040D 3180 MOVLP 0x0
2564040E 2CDC GOTO 0x4DC
2565203:
2566204: }else
2567040F 2CDC GOTO 0x4DC
2568205: if (cmd == '0')
25690410 0021 MOVLB 0x1
25700411 084B MOVF 0x4B, W
25710412 3A30 XORLW 0x30
25720413 1D03 BTFSS STATUS, 0x2
25730414 2C16 GOTO 0x416
25740415 2C17 GOTO 0x417
25750416 2C30 GOTO 0x430
2576206: {
2577207: drive_OW_low();
25780417 318B MOVLP 0xB
25790418 232D CALL 0x32D
25800419 3180 MOVLP 0x0
2581208: if (usermode)
2582041A 0021 MOVLB 0x1
2583041B 084C MOVF 0x4C, W
2584041C 1D03 BTFSS STATUS, 0x2
2585041D 2C1F GOTO 0x41F
2586041E 2C27 GOTO 0x427
2587209: msg_write("\rBUS 1-Wire set low\r\n");
2588041F 3029 MOVLW 0x29
25890420 00F4 MOVWF i
25900421 3088 MOVLW 0x88
25910422 00F5 MOVWF presence
25920423 318E MOVLP 0xE
25930424 2613 CALL 0x613
25940425 3180 MOVLP 0x0
25950426 2CDC GOTO 0x4DC
2596210: else
2597211: msg_write("LOW\n");
25980427 30A8 MOVLW 0xA8
25990428 00F4 MOVWF i
26000429 3088 MOVLW 0x88
2601042A 00F5 MOVWF presence
2602042B 318E MOVLP 0xE
2603042C 2613 CALL 0x613
2604042D 3180 MOVLP 0x0
2605042E 2CDC GOTO 0x4DC
2606212: }else
2607042F 2CDC GOTO 0x4DC
2608213: if (cmd == '1')
26090430 0021 MOVLB 0x1
26100431 084B MOVF 0x4B, W
26110432 3A31 XORLW 0x31
26120433 1D03 BTFSS STATUS, 0x2
26130434 2C36 GOTO 0x436
26140435 2C37 GOTO 0x437
26150436 2C50 GOTO 0x450
2616214: {
2617215: drive_OW_high();
26180437 318B MOVLP 0xB
26190438 2328 CALL 0x328
26200439 3180 MOVLP 0x0
2621216: if (usermode)
2622043A 0021 MOVLB 0x1
2623043B 084C MOVF 0x4C, W
2624043C 1D03 BTFSS STATUS, 0x2
2625043D 2C3F GOTO 0x43F
2626043E 2C47 GOTO 0x447
2627217: msg_write("\rBUS 1-wire set high\r\n");
2628043F 3012 MOVLW 0x12
26290440 00F4 MOVWF i
26300441 3088 MOVLW 0x88
26310442 00F5 MOVWF presence
26320443 318E MOVLP 0xE
26330444 2613 CALL 0x613
26340445 3180 MOVLP 0x0
26350446 2CDC GOTO 0x4DC
2636218: else
2637219: msg_write("HIGH\n");
26380447 3097 MOVLW 0x97
26390448 00F4 MOVWF i
26400449 3088 MOVLW 0x88
2641044A 00F5 MOVWF presence
2642044B 318E MOVLP 0xE
2643044C 2613 CALL 0x613
2644044D 3180 MOVLP 0x0
2645044E 2CDC GOTO 0x4DC
2646220: }else
2647044F 2CDC GOTO 0x4DC
2648221: if (cmd == '3')
26490450 0021 MOVLB 0x1
26500451 084B MOVF 0x4B, W
26510452 3A33 XORLW 0x33
26520453 1D03 BTFSS STATUS, 0x2
26530454 2C56 GOTO 0x456
26540455 2C57 GOTO 0x457
26550456 2C70 GOTO 0x470
2656222: {
2657223: float_OW();
26580457 3184 MOVLP 0x4
26590458 24FD CALL 0x4FD
26600459 3180 MOVLP 0x0
2661224: if (usermode)
2662045A 0021 MOVLB 0x1
2663045B 084C MOVF 0x4C, W
2664045C 1D03 BTFSS STATUS, 0x2
2665045D 2C5F GOTO 0x45F
2666045E 2C67 GOTO 0x467
2667225: msg_write("\rBUS 1-wire set to tri-state\r\n");
2668045F 30EF MOVLW 0xEF
26690460 00F4 MOVWF i
26700461 3086 MOVLW 0x86
26710462 00F5 MOVWF presence
26720463 318E MOVLP 0xE
26730464 2613 CALL 0x613
26740465 3180 MOVLP 0x0
26750466 2CDC GOTO 0x4DC
2676226: else
2677227: msg_write("TRISTATE\n");
26780467 3066 MOVLW 0x66
26790468 00F4 MOVWF i
26800469 3088 MOVLW 0x88
2681046A 00F5 MOVWF presence
2682046B 318E MOVLP 0xE
2683046C 2613 CALL 0x613
2684046D 3180 MOVLP 0x0
2685046E 2CDC GOTO 0x4DC
2686228: }else
2687046F 2CDC GOTO 0x4DC
2688229: if (cmd == '?')
26890470 0021 MOVLB 0x1
26900471 084B MOVF 0x4B, W
26910472 3A3F XORLW 0x3F
26920473 1D03 BTFSS STATUS, 0x2
26930474 2C76 GOTO 0x476
26940475 2C77 GOTO 0x477
26950476 2CAF GOTO 0x4AF
2696230: {
2697231: bool line = read_OW();
26980477 318B MOVLP 0xB
26990478 2332 CALL 0x332
27000479 3180 MOVLP 0x0
2701047A 0020 MOVLB 0x0
2702047B 00C1 MOVWF 0x41
2703047C 0841 MOVF 0x41, W
2704047D 0021 MOVLB 0x1
2705047E 00B3 MOVWF 0x33
2706232: if (line) {
2707047F 0833 MOVF 0x33, W
27080480 1D03 BTFSS STATUS, 0x2
27090481 2C83 GOTO 0x483
27100482 2C98 GOTO 0x498
2711233: if (usermode) msg_write("\rBUS HIGH\r\n");
27120483 084C MOVF 0x4C, W
27130484 1D03 BTFSS STATUS, 0x2
27140485 2C87 GOTO 0x487
27150486 2C8F GOTO 0x48F
27160487 304F MOVLW 0x4F
27170488 00F4 MOVWF i
27180489 3088 MOVLW 0x88
2719048A 00F5 MOVWF presence
2720048B 318E MOVLP 0xE
2721048C 2613 CALL 0x613
2722048D 3180 MOVLP 0x0
2723048E 2CDC GOTO 0x4DC
2724234: else
2725235: msg_write("HIGH\n");
2726048F 3097 MOVLW 0x97
27270490 00F4 MOVWF i
27280491 3088 MOVLW 0x88
27290492 00F5 MOVWF presence
27300493 318E MOVLP 0xE
27310494 2613 CALL 0x613
27320495 3180 MOVLP 0x0
27330496 2CDC GOTO 0x4DC
2734236: } else {
27350497 2CDC GOTO 0x4DC
2736237: if (usermode) msg_write("\rBUS LOW\r\n");
27370498 0021 MOVLB 0x1
27380499 084C MOVF 0x4C, W
2739049A 1D03 BTFSS STATUS, 0x2
2740049B 2C9D GOTO 0x49D
2741049C 2CA5 GOTO 0x4A5
2742049D 305B MOVLW 0x5B
2743049E 00F4 MOVWF i
2744049F 3088 MOVLW 0x88
274504A0 00F5 MOVWF presence
274604A1 318E MOVLP 0xE
274704A2 2613 CALL 0x613
274804A3 3180 MOVLP 0x0
274904A4 2CDC GOTO 0x4DC
2750238: else msg_write("LOW\n");
275104A5 30A8 MOVLW 0xA8
275204A6 00F4 MOVWF i
275304A7 3088 MOVLW 0x88
275404A8 00F5 MOVWF presence
275504A9 318E MOVLP 0xE
275604AA 2613 CALL 0x613
275704AB 3180 MOVLP 0x0
275804AC 2CDC GOTO 0x4DC
275904AD 2CDC GOTO 0x4DC
2760239: }
2761240: }else
276204AE 2CDC GOTO 0x4DC
2763241: {
2764242: if (usermode) {
276504AF 0021 MOVLB 0x1
276604B0 084C MOVF 0x4C, W
276704B1 1D03 BTFSS STATUS, 0x2
276804B2 2CB4 GOTO 0x4B4
276904B3 2CBC GOTO 0x4BC
2770243: msg_write("ERROR Press H for Help\n");
277104B4 30FA MOVLW 0xFA
277204B5 00F4 MOVWF i
277304B6 3087 MOVLW 0x87
277404B7 00F5 MOVWF presence
277504B8 318E MOVLP 0xE
277604B9 2613 CALL 0x613
277704BA 3180 MOVLP 0x0
2778244: } else {
277904BB 2CDC GOTO 0x4DC
2780245: msg_write("\rERROR Unknown command '");
278104BC 30B1 MOVLW 0xB1
278204BD 00F4 MOVWF i
278304BE 3087 MOVLW 0x87
278404BF 00F5 MOVWF presence
278504C0 318E MOVLP 0xE
278604C1 2613 CALL 0x613
278704C2 3180 MOVLP 0x0
2788246: msg_writebyte(cmd);
278904C3 0021 MOVLB 0x1
279004C4 084B MOVF 0x4B, W
279104C5 318D MOVLP 0xD
279204C6 25CF CALL 0x5CF
279304C7 3180 MOVLP 0x0
2794247: msg_write("' Press 'H' for help.\r\n");
279504C8 30CA MOVLW 0xCA
279604C9 00F4 MOVWF i
279704CA 3087 MOVLW 0x87
279804CB 00F5 MOVWF presence
279904CC 318E MOVLP 0xE
280004CD 2613 CALL 0x613
280104CE 3180 MOVLP 0x0
280204CF 2CDC GOTO 0x4DC
2803248: }
280404D0 2CDC GOTO 0x4DC
2805249: }
280604D1 2CDC GOTO 0x4DC
280704D2 2CDC GOTO 0x4DC
280804D3 2CDC GOTO 0x4DC
280904D4 2CDC GOTO 0x4DC
281004D5 2CDC GOTO 0x4DC
281104D6 2CDC GOTO 0x4DC
281204D7 2CDC GOTO 0x4DC
281304D8 2CDC GOTO 0x4DC
281404D9 2CDC GOTO 0x4DC
281504DA 2CDC GOTO 0x4DC
281604DB 2CDC GOTO 0x4DC
2817250:
2818251: if (usermode) msg_write(prompt);
281904DC 0021 MOVLB 0x1
282004DD 084C MOVF 0x4C, W
282104DE 1D03 BTFSS STATUS, 0x2
282204DF 2CE1 GOTO 0x4E1
282304E0 2862 GOTO 0x62
282404E1 302C MOVLW 0x2C
282504E2 00F4 MOVWF i
282604E3 3000 MOVLW 0x0
282704E4 00F5 MOVWF presence
282804E5 318E MOVLP 0xE
282904E6 2613 CALL 0x613
283004E7 3180 MOVLP 0x0
283104E8 2862 GOTO 0x62
283204E9 2862 GOTO 0x62
2833252: }
2834253: }
283504EB 3180 MOVLP 0x0
2836254:
2837255: /* make a hex string from a value
2838256: * expect 3 char array */
2839257: void tohex(char val[], char i)
2840258: {
28410E59 0020 MOVLB 0x0
28420E5A 00B7 MOVWF i
2843259: char bt = i >> 4;
28440E5B 0874 MOVF i, W
28450E5C 00B5 MOVWF in
28460E5D 3004 MOVLW 0x4
28470E5E 36B5 LSRF in, F
28480E5F 0B89 DECFSZ WREG, F
28490E60 2E5E GOTO 0x65E
28500E61 0835 MOVF in, W
28510E62 00B6 MOVWF p
28520E63 0836 MOVF p, W
28530E64 00B8 MOVWF bt
2854260: if (bt > 9)
28550E65 300A MOVLW 0xA
28560E66 0238 SUBWF bt, W
28570E67 1C03 BTFSS STATUS, 0x0
28580E68 2E6A GOTO 0x66A
28590E69 2E6B GOTO 0x66B
28600E6A 2E74 GOTO 0x674
2861261: val[0] = 'A' + (bt - 10);
28620E6B 0838 MOVF bt, W
28630E6C 3E37 ADDLW 0x37
28640E6D 00B5 MOVWF in
28650E6E 0837 MOVF i, W
28660E6F 0086 MOVWF FSR1L
28670E70 0187 CLRF FSR1H
28680E71 0835 MOVF in, W
28690E72 0081 MOVWF INDF1
28700E73 2E7D GOTO 0x67D
2871262: else
2872263: val[0] = '0' + bt;
28730E74 0838 MOVF bt, W
28740E75 3E30 ADDLW 0x30
28750E76 00B5 MOVWF in
28760E77 0837 MOVF i, W
28770E78 0086 MOVWF FSR1L
28780E79 0187 CLRF FSR1H
28790E7A 0835 MOVF in, W
28800E7B 0081 MOVWF INDF1
28810E7C 2E7D GOTO 0x67D
2882264: bt = i & 0x0F;
28830E7D 0874 MOVF i, W
28840E7E 390F ANDLW 0xF
28850E7F 00B5 MOVWF in
28860E80 0835 MOVF in, W
28870E81 00B8 MOVWF bt
2888265: if (bt > 9)
28890E82 300A MOVLW 0xA
28900E83 0238 SUBWF bt, W
28910E84 1C03 BTFSS STATUS, 0x0
28920E85 2E87 GOTO 0x687
28930E86 2E88 GOTO 0x688
28940E87 2E91 GOTO 0x691
2895266: val[1] = 'A' + (bt - 10);
28960E88 0838 MOVF bt, W
28970E89 3E37 ADDLW 0x37
28980E8A 00B5 MOVWF in
28990E8B 0A37 INCF i, W
29000E8C 0086 MOVWF FSR1L
29010E8D 0187 CLRF FSR1H
29020E8E 0835 MOVF in, W
29030E8F 0081 MOVWF INDF1
29040E90 2E9A GOTO 0x69A
2905267: else
2906268: val[1] = '0' + bt;
29070E91 0838 MOVF bt, W
29080E92 3E30 ADDLW 0x30
29090E93 00B5 MOVWF in
29100E94 0A37 INCF i, W
29110E95 0086 MOVWF FSR1L
29120E96 0187 CLRF FSR1H
29130E97 0835 MOVF in, W
29140E98 0081 MOVWF INDF1
29150E99 2E9A GOTO 0x69A
2916269: val[2] = 0;
29170E9A 0837 MOVF i, W
29180E9B 3E02 ADDLW 0x2
29190E9C 0086 MOVWF FSR1L
29200E9D 0187 CLRF FSR1H
29210E9E 0181 CLRF INDF1
2922270: }
29230E9F 0008 RETURN
2924271:
2925272:
2926273: /* is the queue empty yet */
2927274: bool msg_empty(void)
2928275: {
2929276: if (outp == 0) return 1;
29300B44 0877 MOVF 0x77, W
29310B45 0476 IORWF outp, W
29320B46 1D03 BTFSS STATUS, 0x2
29330B47 2B49 GOTO 0x349
29340B48 2B4A GOTO 0x34A
29350B49 2B4D GOTO 0x34D
29360B4A 3001 MOVLW 0x1
29370B4B 2B4F GOTO 0x34F
29380B4C 2B4F GOTO 0x34F
2939277: return 0;
29400B4D 3000 MOVLW 0x0
29410B4E 2B4F GOTO 0x34F
2942278: }
29430B4F 0008 RETURN
2944279:
2945280: /* new message in the queue */
2946281: void msg_write(const char *msg)
2947282: {
2948283: char * p = outbuff + outlen;
29490E13 0879 MOVF outlen, W
29500E14 3E8C ADDLW 0x8C
29510E15 0020 MOVLB 0x0
29520E16 00B6 MOVWF p
29530E17 01B7 CLRF i
29540E18 3020 MOVLW 0x20
29550E19 3DB7 ADDWFC i, F
2956284: while (outlen < sizeof(outbuff) && *msg != 0) {
29570E1A 2E34 GOTO 0x634
29580E34 3064 MOVLW 0x64
29590E35 0279 SUBWF outlen, W
29600E36 1803 BTFSC STATUS, 0x0
29610E37 2E39 GOTO 0x639
29620E38 2E3A GOTO 0x63A
29630E39 2E46 GOTO 0x646
29640E3A 0874 MOVF i, W
29650E3B 0084 MOVWF FSR0L
29660E3C 0875 MOVF presence, W
29670E3D 0085 MOVWF FSR0H
29680E3E 0800 MOVF INDF0, W
29690E3F 3800 IORLW 0x0
29700E40 1D03 BTFSS STATUS, 0x2
29710E41 2E43 GOTO 0x643
29720E42 2E44 GOTO 0x644
29730E43 2E1B GOTO 0x61B
29740E44 2E46 GOTO 0x646
29750E45 2E46 GOTO 0x646
2976285: *(p++) = *(msg++);
29770E1B 0874 MOVF i, W
29780E1C 0084 MOVWF FSR0L
29790E1D 0875 MOVF presence, W
29800E1E 0085 MOVWF FSR0H
29810E1F 0800 MOVF INDF0, W
29820E20 00B5 MOVWF in
29830E21 0836 MOVF p, W
29840E22 0086 MOVWF FSR1L
29850E23 0837 MOVF i, W
29860E24 0087 MOVWF FSR1H
29870E25 0835 MOVF in, W
29880E26 0081 MOVWF INDF1
29890E27 3001 MOVLW 0x1
29900E28 07F4 ADDWF i, F
29910E29 3000 MOVLW 0x0
29920E2A 3DF5 ADDWFC presence, F
29930E2B 3001 MOVLW 0x1
29940E2C 07B6 ADDWF p, F
29950E2D 3000 MOVLW 0x0
29960E2E 3DB7 ADDWFC i, F
2997286: outlen++;
29980E2F 3001 MOVLW 0x1
29990E30 00B5 MOVWF in
30000E31 0835 MOVF in, W
30010E32 07F9 ADDWF outlen, F
30020E33 2E34 GOTO 0x634
3003287: }
3004288: *p = 0;
30050E46 0836 MOVF p, W
30060E47 0086 MOVWF FSR1L
30070E48 0837 MOVF i, W
30080E49 0087 MOVWF FSR1H
30090E4A 0181 CLRF INDF1
3010289: if (outp == 0) {
30110E4B 0877 MOVF 0x77, W
30120E4C 0476 IORWF outp, W
30130E4D 1D03 BTFSS STATUS, 0x2
30140E4E 2E50 GOTO 0x650
30150E4F 2E51 GOTO 0x651
30160E50 2E58 GOTO 0x658
3017290: outp = outbuff;
30180E51 308C MOVLW 0x8C
30190E52 00F6 MOVWF outp
30200E53 3020 MOVLW 0x20
30210E54 00F7 MOVWF 0x77
3022291: PIE1bits.TXIE = 1;
30230E55 0021 MOVLB 0x1
30240E56 1611 BSF PIR1, 0x4
30250E57 2E58 GOTO 0x658
3026292: }
3027293: }
30280E58 0008 RETURN
3029294:
3030295: void msg_writebyte(const char msg)
3031296: {
30320DCF 00F4 MOVWF i
3033297: if (outlen+1 >= (uint8_t)sizeof(outbuff)) return;
30340DD0 0879 MOVF outlen, W
30350DD1 3E01 ADDLW 0x1
30360DD2 0020 MOVLB 0x0
30370DD3 00B5 MOVWF in
30380DD4 3000 MOVLW 0x0
30390DD5 1803 BTFSC STATUS, 0x0
30400DD6 3001 MOVLW 0x1
30410DD7 00B6 MOVWF p
30420DD8 0836 MOVF p, W
30430DD9 3A80 XORLW 0x80
30440DDA 00FF MOVWF 0x7F
30450DDB 3080 MOVLW 0x80
30460DDC 027F SUBWF 0x7F, W
30470DDD 1D03 BTFSS STATUS, 0x2
30480DDE 2DE1 GOTO 0x5E1
30490DDF 3064 MOVLW 0x64
30500DE0 0235 SUBWF in, W
30510DE1 1C03 BTFSS STATUS, 0x0
30520DE2 2DE4 GOTO 0x5E4
30530DE3 2DE5 GOTO 0x5E5
30540DE4 2DE7 GOTO 0x5E7
30550DE5 2E12 GOTO 0x612
30560DE6 2E12 GOTO 0x612
3057298: outbuff[outlen++] = msg;
30580DE7 0874 MOVF i, W
30590DE8 0020 MOVLB 0x0
30600DE9 00B5 MOVWF in
30610DEA 0879 MOVF outlen, W
30620DEB 3E8C ADDLW 0x8C
30630DEC 00B6 MOVWF p
30640DED 01B7 CLRF i
30650DEE 3020 MOVLW 0x20
30660DEF 3DB7 ADDWFC i, F
30670DF0 0836 MOVF p, W
30680DF1 0086 MOVWF FSR1L
30690DF2 0837 MOVF i, W
30700DF3 0087 MOVWF FSR1H
30710DF4 0835 MOVF in, W
30720DF5 0081 MOVWF INDF1
30730DF6 3001 MOVLW 0x1
30740DF7 00B5 MOVWF in
30750DF8 0835 MOVF in, W
30760DF9 07F9 ADDWF outlen, F
3077299: outbuff[outlen] = 0;
30780DFA 0879 MOVF outlen, W
30790DFB 3E8C ADDLW 0x8C
30800DFC 00B5 MOVWF in
30810DFD 01B6 CLRF p
30820DFE 3020 MOVLW 0x20
30830DFF 3DB6 ADDWFC p, F
30840E00 0835 MOVF in, W
30850E01 0086 MOVWF FSR1L
30860E02 0836 MOVF p, W
30870E03 0087 MOVWF FSR1H
30880E04 0181 CLRF INDF1
3089300: if (outp == 0) {
30900E05 0877 MOVF 0x77, W
30910E06 0476 IORWF outp, W
30920E07 1D03 BTFSS STATUS, 0x2
30930E08 2E0A GOTO 0x60A
30940E09 2E0B GOTO 0x60B
30950E0A 2E12 GOTO 0x612
3096301: outp = outbuff;
30970E0B 308C MOVLW 0x8C
30980E0C 00F6 MOVWF outp
30990E0D 3020 MOVLW 0x20
31000E0E 00F7 MOVWF 0x77
3101302: PIE1bits.TXIE = 1;
31020E0F 0021 MOVLB 0x1
31030E10 1611 BSF PIR1, 0x4
31040E11 2E12 GOTO 0x612
3105303: }
3106304: }
31070E12 0008 RETURN
3108305:
3109306: void putch(char data)
3110307: {
3111308: msg_writebyte(data);
3112309: }
3113310:
3114311: /* called from interrupt routine to send next char */
3115312: void msg_sendnext(void)
3116313: {
3117314: /* we have finished, turn off the iterrupt */
3118315: if (outp == 0 || *outp == 0) {
31190BEF 0877 MOVF 0x77, W
31200BF0 0476 IORWF outp, W
31210BF1 1903 BTFSC STATUS, 0x2
31220BF2 2BF4 GOTO 0x3F4
31230BF3 2BF5 GOTO 0x3F5
31240BF4 2BFE GOTO 0x3FE
31250BF5 0876 MOVF outp, W
31260BF6 0086 MOVWF FSR1L
31270BF7 0877 MOVF 0x77, W
31280BF8 0087 MOVWF FSR1H
31290BF9 0881 MOVF INDF1, F
31300BFA 1D03 BTFSS STATUS, 0x2
31310BFB 2BFD GOTO 0x3FD
31320BFC 2BFE GOTO 0x3FE
31330BFD 2C05 GOTO 0x405
3134316: PIE1bits.TXIE = 0;
31350BFE 0021 MOVLB 0x1
31360BFF 1211 BCF PIR1, 0x4
3137317: outp = 0;
31380C00 01F6 CLRF outp
31390C01 01F7 CLRF 0x77
3140318: outlen = 0;
31410C02 01F9 CLRF outlen
31420C03 2C10 GOTO 0x410
3143319: return;
31440C04 2C10 GOTO 0x410
3145320: }
3146321: TXREG = *outp;
31470C05 0876 MOVF outp, W
31480C06 0086 MOVWF FSR1L
31490C07 0877 MOVF 0x77, W
31500C08 0087 MOVWF FSR1H
31510C09 0801 MOVF INDF1, W
31520C0A 0023 MOVLB 0x3
31530C0B 009A MOVWF TMR2
3154322: outp++;
31550C0C 3001 MOVLW 0x1
31560C0D 07F6 ADDWF outp, F
31570C0E 3000 MOVLW 0x0
31580C0F 3DF7 ADDWFC 0x77, F
3159323: }
31600C10 0008 RETURN
3161324:
3162325: /* called from interrupt routine to receive next byte */
3163326: void msg_recvnext(void)
3164327: {
3165328: while (PIR1bits.RCIF) {
31660C60 2C85 GOTO 0x485
31670C85 0020 MOVLB 0x0
31680C86 1A91 BTFSC PIR1, 0x5
31690C87 2C89 GOTO 0x489
31700C88 2C8A GOTO 0x48A
31710C89 2C61 GOTO 0x461
31720C8A 2C8B GOTO 0x48B
3173329: bool err = RCSTAbits.FERR;
31740C61 3000 MOVLW 0x0
31750C62 0023 MOVLB 0x3
31760C63 191D BTFSC 0x1D, 0x2
31770C64 3001 MOVLW 0x1
31780C65 00F1 MOVWF err
3179330: char new = RCREG;
31800C66 0819 MOVF T1GCON, W
31810C67 00F0 MOVWF 0x70
31820C68 0870 MOVF 0x70, W
31830C69 00F2 MOVWF new
3184331:
3185332: /* bad char, skip it */
3186333: if (err) continue;
31870C6A 0871 MOVF err, W
31880C6B 1D03 BTFSS STATUS, 0x2
31890C6C 2C6E GOTO 0x46E
31900C6D 2C70 GOTO 0x470
31910C6E 2C85 GOTO 0x485
31920C6F 2C85 GOTO 0x485
3193334:
3194335: /* our input buffer has overflowed */
3195336: if (inlen > sizeof(inbuff)) return;
31960C70 300B MOVLW 0xB
31970C71 0278 SUBWF inlen, W
31980C72 1C03 BTFSS STATUS, 0x0
31990C73 2C75 GOTO 0x475
32000C74 2C76 GOTO 0x476
32010C75 2C78 GOTO 0x478
32020C76 2C8B GOTO 0x48B
32030C77 2C8B GOTO 0x48B
3204337:
3205338: /* keep this one */
3206339: inbuff[inlen++] = new;
32070C78 0872 MOVF new, W
32080C79 00F0 MOVWF 0x70
32090C7A 0878 MOVF inlen, W
32100C7B 3ECD ADDLW 0xCD
32110C7C 0086 MOVWF FSR1L
32120C7D 0187 CLRF FSR1H
32130C7E 0870 MOVF 0x70, W
32140C7F 0081 MOVWF INDF1
32150C80 3001 MOVLW 0x1
32160C81 00F0 MOVWF 0x70
32170C82 0870 MOVF 0x70, W
32180C83 07F8 ADDWF inlen, F
32190C84 2C85 GOTO 0x485
3220340: }
3221341: }
32220C8B 0008 RETURN
3223342:
3224343: bool msg_recvready(void)
3225344: {
3226345: if (inlen > 0) return 1;
32270B3A 0878 MOVF inlen, W
32280B3B 1D03 BTFSS STATUS, 0x2
32290B3C 2B3E GOTO 0x33E
32300B3D 2B41 GOTO 0x341
32310B3E 3001 MOVLW 0x1
32320B3F 2B43 GOTO 0x343
32330B40 2B43 GOTO 0x343
3234346: return 0;
32350B41 3000 MOVLW 0x0
32360B42 2B43 GOTO 0x343
3237347: }
32380B43 0008 RETURN
3239348:
3240349: char msg_recv(void)
3241350: {
3242351: if (inlen == 0) return 0;
32430D56 08F8 MOVF inlen, F
32440D57 1D03 BTFSS STATUS, 0x2
32450D58 2D5A GOTO 0x55A
32460D59 2D5B GOTO 0x55B
32470D5A 2D5E GOTO 0x55E
32480D5B 3000 MOVLW 0x0
32490D5C 2D91 GOTO 0x591
32500D5D 2D91 GOTO 0x591
3251352:
3252353: /* record and disable the interupt */
3253354: bool in = PIE1bits.RCIE;
32540D5E 3000 MOVLW 0x0
32550D5F 0021 MOVLB 0x1
32560D60 1A91 BTFSC PIR1, 0x5
32570D61 3001 MOVLW 0x1
32580D62 0020 MOVLB 0x0
32590D63 00B5 MOVWF in
3260355: PIE1bits.RCIE = 0;
32610D64 0021 MOVLB 0x1
32620D65 1291 BCF PIR1, 0x5
3263356:
3264357: char new = inbuff[0];
32650D66 084D MOVF 0x4D, W
32660D67 00F4 MOVWF i
32670D68 0874 MOVF i, W
32680D69 0020 MOVLB 0x0
32690D6A 00B6 MOVWF p
3270358: inlen--;
32710D6B 3001 MOVLW 0x1
32720D6C 02F8 SUBWF inlen, F
3273359:
3274360: /* shuffle them down one */
3275361: for (char i=0;i<inlen;i++)
32760D6D 01B7 CLRF i
32770D6E 2D81 GOTO 0x581
32780D7C 3001 MOVLW 0x1
32790D7D 00F4 MOVWF i
32800D7E 0874 MOVF i, W
32810D7F 07B7 ADDWF i, F
32820D80 2D81 GOTO 0x581
32830D81 0878 MOVF inlen, W
32840D82 0237 SUBWF i, W
32850D83 1C03 BTFSS STATUS, 0x0
32860D84 2D86 GOTO 0x586
32870D85 2D87 GOTO 0x587
32880D86 2D6F GOTO 0x56F
32890D87 2D88 GOTO 0x588
3290362: inbuff[i] = inbuff[i+1];
32910D6F 0837 MOVF i, W
32920D70 3E01 ADDLW 0x1
32930D71 3ECD ADDLW 0xCD
32940D72 0086 MOVWF FSR1L
32950D73 0187 CLRF FSR1H
32960D74 0801 MOVF INDF1, W
32970D75 00F4 MOVWF i
32980D76 0837 MOVF i, W
32990D77 3ECD ADDLW 0xCD
33000D78 0086 MOVWF FSR1L
33010D79 0187 CLRF FSR1H
33020D7A 0874 MOVF i, W
33030D7B 0081 MOVWF INDF1
3304363:
3305364: /* restore the interupt */
3306365: PIE1bits.RCIE = in;
33070D88 0835 MOVF in, W
33080D89 0021 MOVLB 0x1
33090D8A 1D03 BTFSS STATUS, 0x2
33100D8B 1691 BSF PIR1, 0x5
33110D8C 1903 BTFSC STATUS, 0x2
33120D8D 1291 BCF PIR1, 0x5
3313366: return new;
33140D8E 0020 MOVLB 0x0
33150D8F 0836 MOVF p, W
33160D90 2D91 GOTO 0x591
3317367: }
33180D91 0008 RETURN
3319368:
3320369:
3321370: void int_disable(void)
3322371: {
3323372: INTCONbits.GIE = 0;
33240B22 138B BCF INTCON, 0x7
3325373: }
33260B23 0008 RETURN
3327374:
3328375: void int_enable(void)
3329376: {
3330377: INTCONbits.GIE = 1;
33310B20 178B BSF INTCON, 0x7
3332378: }
33330B21 0008 RETURN
3334--- /home/justin/MPLABXProjects/uart test.X/interrupts.c ----------------------------------------------
33351: /******************************************************************************/
33362: /*Files to Include */
33373: /******************************************************************************/
33384:
33395: #if defined(__XC)
33406: #include <xc.h> /* XC8 General Include File */
33417: #elif defined(HI_TECH_C)
33428: #include <htc.h> /* HiTech General Include File */
33439: #endif
334410:
334511: #include <stdint.h> /* For uint8_t definition */
334612: #include <stdbool.h> /* For true/false definition */
334713: #include "user.h"
334814:
334915: /******************************************************************************/
335016: /* Interrupt Routines */
335117: /******************************************************************************/
335218:
335319: /* Baseline devices don't have interrupts. Unfortunately the baseline detection
335420: * macro is named _PIC12 */
335521:
335622: #ifndef _PIC12
335723:
335824: void interrupt isr(void)
335925: {
33600004 3180 MOVLP 0x0
33610005 0020 MOVLB 0x0
33620006 087F MOVF 0x7F, W
33630007 00F3 MOVWF 0x73
336426: /* This code stub shows general interrupt handling. Note that these
336527: conditional statements are not handled within 3 seperate if blocks.
336628: Do not use a seperate if block for each interrupt flag to avoid run
336729: time errors. */
336830:
336931: if (PIE1bits.TXIE && PIR1bits.TXIF)
33700008 0021 MOVLB 0x1
33710009 1E11 BTFSS PIR1, 0x4
3372000A 280C GOTO 0xC
3373000B 280D GOTO 0xD
3374000C 2816 GOTO 0x16
3375000D 0020 MOVLB 0x0
3376000E 1E11 BTFSS PIR1, 0x4
3377000F 2811 GOTO 0x11
33780010 2812 GOTO 0x12
33790011 2816 GOTO 0x16
338032: msg_sendnext();
33810012 318B MOVLP 0xB
33820013 23EF CALL 0x3EF
33830014 3180 MOVLP 0x0
33840015 2816 GOTO 0x16
338533:
338634: if (PIE1bits.RCIE && PIR1bits.RCIF)
33870016 0021 MOVLB 0x1
33880017 1E91 BTFSS PIR1, 0x5
33890018 281A GOTO 0x1A
33900019 281B GOTO 0x1B
3391001A 2824 GOTO 0x24
3392001B 0020 MOVLB 0x0
3393001C 1E91 BTFSS PIR1, 0x5
3394001D 281F GOTO 0x1F
3395001E 2820 GOTO 0x20
3396001F 2824 GOTO 0x24
339735: msg_recvnext();
33980020 318C MOVLP 0xC
33990021 2460 CALL 0x460
34000022 3180 MOVLP 0x0
34010023 2824 GOTO 0x24
340236:
340337: #if 0
340438:
340539: /* TODO Add interrupt routine code here. */
340640:
340741: /* Determine which flag generated the interrupt */
340842: if(<Interrupt Flag 1>)
340943: {
341044: <Interrupt Flag 1=0>; /* Clear Interrupt Flag 1 */
341145: }
341246: else if (<Interrupt Flag 2>)
341347: {
341448: <Interrupt Flag 2=0>; /* Clear Interrupt Flag 2 */
341549: }
341650: else
341751: {
341852: /* Unhandled interrupts */
341953: }
342054:
342155: #endif
342256:
342357: }
34240024 0873 MOVF 0x73, W
342558: #endif
342659:
342760: