+
+halloween_puff.elf: file format elf32-avr
+
+Sections:
+Idx Name Size VMA LMA File off Algn
+ 0 .data 00000000 00800100 00800100 00000b1c 2**0
+ ALLOC, LOAD, DATA
+ 1 .text 0000008a 00000000 00000000 000000b4 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 2 .comment 0000002f 00000000 00000000 00000b1c 2**0
+ CONTENTS, READONLY
+ 3 .stack.descriptors.hdr 00000062 00000000 00000000 00000b4b 2**0
+ CONTENTS, READONLY
+ 4 .debug_aranges 000000d8 00000000 00000000 00000bad 2**0
+ CONTENTS, READONLY, DEBUGGING
+ 5 .debug_info 00001650 00000000 00000000 00000c85 2**0
+ CONTENTS, READONLY, DEBUGGING
+ 6 .debug_abbrev 0000087b 00000000 00000000 000022d5 2**0
+ CONTENTS, READONLY, DEBUGGING
+ 7 .debug_line 000008a4 00000000 00000000 00002b50 2**0
+ CONTENTS, READONLY, DEBUGGING
+ 8 .debug_frame 000002c4 00000000 00000000 000033f4 2**2
+ CONTENTS, READONLY, DEBUGGING
+ 9 .debug_str 00000233 00000000 00000000 000036b8 2**0
+ CONTENTS, READONLY, DEBUGGING
+ 10 .debug_loc 00000df0 00000000 00000000 000038eb 2**0
+ CONTENTS, READONLY, DEBUGGING
+ 11 .debug_ranges 00000128 00000000 00000000 000046db 2**0
+ CONTENTS, READONLY, DEBUGGING
+ 12 .text 00000002 00000a5e 00000a5e 00000b12 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 13 .note.gnu.avr.deviceinfo 0000003c 00000000 00000000 00004804 2**2
+ CONTENTS, READONLY, DEBUGGING
+ 14 .text.i2c_init 00000012 000009d6 000009d6 00000a8a 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 15 .text.i2c_start 00000010 000009e8 000009e8 00000a9c 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 16 .text.i2c_write 00000014 000009ae 000009ae 00000a62 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 17 .text.i2c_stop 00000010 000009f8 000009f8 00000aac 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 18 .text.i2c_write_byte 0000001c 00000948 00000948 000009fc 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 19 .text.lcd_expander_write 0000000a 00000a4a 00000a4a 00000afe 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 20 .text.adc_sampling_init 0000003e 000007da 000007da 0000088e 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 21 .text.analyze_block 000003c6 00000142 00000142 000001f6 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 22 .text.get_column 0000002e 0000088e 0000088e 00000942 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 23 .text.get_row 0000003c 00000818 00000818 000008cc 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 24 .text.decode_key 00000070 000006fa 000006fa 000007ae 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 25 .text.lcd_pulse_enable 00000026 000008e6 000008e6 0000099a 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 26 .text.lcd_write4 00000016 00000998 00000998 00000a4c 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 27 .text.lcd_send 0000001c 00000964 00000964 00000a18 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 28 .text.lcd_data 00000006 00000a54 00000a54 00000b08 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 29 .text.lcd_putc 00000004 00000a5a 00000a5a 00000b0e 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 30 .text.lcd_print 0000002a 000008bc 000008bc 00000970 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 31 .text.lcd_print_uint 000000b6 00000508 00000508 000005bc 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 32 .text.lcd_command 0000001e 0000090c 0000090c 000009c0 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 33 .text.lcd_goto 0000000c 00000a26 00000a26 00000ada 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 34 .text.lcd_init 00000070 0000076a 0000076a 0000081e 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 35 .text.__vector_14 0000003a 00000854 00000854 00000908 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 36 .text.__vector_21 00000094 00000666 00000666 0000071a 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 37 .progmemx.data 00000029 0000010c 0000010c 000001c0 2**0
+ CONTENTS, ALLOC, LOAD, READONLY, PROGMEMX
+ 38 .text.main 000000a8 000005be 000005be 00000672 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 39 .progmemx.data.keypad.2090 0000000c 00000135 00000135 000001e9 2**0
+ CONTENTS, ALLOC, LOAD, READONLY, PROGMEMX
+ 40 .bss.adc_count 00000002 00800300 00800300 00000b1c 2**0
+ ALLOC
+ 41 .progmemx.data.coeff 00000082 0000008a 0000008a 0000013e 2**0
+ CONTENTS, ALLOC, LOAD, READONLY, PROGMEMX
+ 42 .bss.block_ready 00000001 00800304 00800304 00000b1c 2**0
+ ALLOC
+ 43 .bss.sample_index 00000002 00800302 00800302 00000b1c 2**0
+ ALLOC
+ 44 .bss.samples 00000200 00800100 00800100 00000b1c 2**0
+ ALLOC
+ 45 .text.libgcc.mul 0000001e 0000092a 0000092a 000009de 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 46 .text.libgcc.mul 00000018 00000980 00000980 00000a34 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 47 .text.libgcc.mul 0000000c 00000a32 00000a32 00000ae6 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 48 .text.libgcc.mul 00000014 000009c2 000009c2 00000a76 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 49 .text.libgcc.mul 0000000c 00000a3e 00000a3e 00000af2 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 50 .text.libgcc 00000010 00000a08 00000a08 00000abc 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 51 .text.__dummy_fini 00000002 00000a60 00000a60 00000b14 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 52 .text.__dummy_funcs_on_exit 00000002 00000a62 00000a62 00000b16 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 53 .text.__dummy_simulator_exit 00000002 00000a64 00000a64 00000b18 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 54 .text.exit 0000000e 00000a18 00000a18 00000acc 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 55 .text._Exit 00000002 00000a66 00000a66 00000b1a 2**1
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+
+Disassembly of section .text:
+
+00000000 <__vectors>:
+ 0: 1c c0 rjmp .+56 ; 0x3a <__ctors_end>
+ 2: 2d c5 rjmp .+2650 ; 0xa5e <__bad_interrupt>
+ 4: 2c c5 rjmp .+2648 ; 0xa5e <__bad_interrupt>
+ 6: 2b c5 rjmp .+2646 ; 0xa5e <__bad_interrupt>
+ 8: 2a c5 rjmp .+2644 ; 0xa5e <__bad_interrupt>
+ a: 29 c5 rjmp .+2642 ; 0xa5e <__bad_interrupt>
+ c: 28 c5 rjmp .+2640 ; 0xa5e <__bad_interrupt>
+ e: 27 c5 rjmp .+2638 ; 0xa5e <__bad_interrupt>
+ 10: 26 c5 rjmp .+2636 ; 0xa5e <__bad_interrupt>
+ 12: 25 c5 rjmp .+2634 ; 0xa5e <__bad_interrupt>
+ 14: 24 c5 rjmp .+2632 ; 0xa5e <__bad_interrupt>
+ 16: 23 c5 rjmp .+2630 ; 0xa5e <__bad_interrupt>
+ 18: 22 c5 rjmp .+2628 ; 0xa5e <__bad_interrupt>
+ 1a: 21 c5 rjmp .+2626 ; 0xa5e <__bad_interrupt>
+ 1c: 1b c4 rjmp .+2102 ; 0x854 <__vector_14>
+ 1e: 1f c5 rjmp .+2622 ; 0xa5e <__bad_interrupt>
+ 20: 1e c5 rjmp .+2620 ; 0xa5e <__bad_interrupt>
+ 22: 1d c5 rjmp .+2618 ; 0xa5e <__bad_interrupt>
+ 24: 1c c5 rjmp .+2616 ; 0xa5e <__bad_interrupt>
+ 26: 1b c5 rjmp .+2614 ; 0xa5e <__bad_interrupt>
+ 28: 1a c5 rjmp .+2612 ; 0xa5e <__bad_interrupt>
+ 2a: 1d c3 rjmp .+1594 ; 0x666 <__vector_21>
+ 2c: 18 c5 rjmp .+2608 ; 0xa5e <__bad_interrupt>
+ 2e: 17 c5 rjmp .+2606 ; 0xa5e <__bad_interrupt>
+ 30: 16 c5 rjmp .+2604 ; 0xa5e <__bad_interrupt>
+ 32: 15 c5 rjmp .+2602 ; 0xa5e <__bad_interrupt>
+
+00000034 <.dinit>:
+ 34: 01 00 .word 0x0001 ; ????
+ 36: 03 05 cpc r16, r3
+ 38: 80 00 .word 0x0080 ; ????
+
+0000003a <__ctors_end>:
+ 3a: 11 24 eor r1, r1
+ 3c: 1f be out 0x3f, r1 ; 63
+ 3e: cf ef ldi r28, 0xFF ; 255
+ 40: d4 e0 ldi r29, 0x04 ; 4
+ 42: de bf out 0x3e, r29 ; 62
+ 44: cd bf out 0x3d, r28 ; 61
+
+00000046 <__do_copy_data>:
+ 46: e4 e3 ldi r30, 0x34 ; 52
+ 48: f0 e0 ldi r31, 0x00 ; 0
+ 4a: 40 e0 ldi r20, 0x00 ; 0
+ 4c: 17 c0 rjmp .+46 ; 0x7c <__do_clear_bss+0x8>
+ 4e: b5 91 lpm r27, Z+
+ 50: a5 91 lpm r26, Z+
+ 52: 35 91 lpm r19, Z+
+ 54: 25 91 lpm r18, Z+
+ 56: 05 91 lpm r16, Z+
+ 58: 07 fd sbrc r16, 7
+ 5a: 0c c0 rjmp .+24 ; 0x74 <__do_clear_bss>
+ 5c: 95 91 lpm r25, Z+
+ 5e: 85 91 lpm r24, Z+
+ 60: ef 01 movw r28, r30
+ 62: f9 2f mov r31, r25
+ 64: e8 2f mov r30, r24
+ 66: 05 90 lpm r0, Z+
+ 68: 0d 92 st X+, r0
+ 6a: a2 17 cp r26, r18
+ 6c: b3 07 cpc r27, r19
+ 6e: d9 f7 brne .-10 ; 0x66 <__do_copy_data+0x20>
+ 70: fe 01 movw r30, r28
+ 72: 04 c0 rjmp .+8 ; 0x7c <__do_clear_bss+0x8>
+
+00000074 <__do_clear_bss>:
+ 74: 1d 92 st X+, r1
+ 76: a2 17 cp r26, r18
+ 78: b3 07 cpc r27, r19
+ 7a: e1 f7 brne .-8 ; 0x74 <__do_clear_bss>
+ 7c: e9 33 cpi r30, 0x39 ; 57
+ 7e: f4 07 cpc r31, r20
+ 80: 31 f7 brne .-52 ; 0x4e <__do_copy_data+0x8>
+ 82: 9d d2 rcall .+1338 ; 0x5be <main>
+ 84: c9 c4 rjmp .+2450 ; 0xa18 <exit>
+
+00000086 <_exit>:
+ 86: f8 94 cli
+
+00000088 <__stop_program>:
+ 88: ff cf rjmp .-2 ; 0x88 <__stop_program>
+
+Disassembly of section .text:
+
+00000a5e <__bad_interrupt>:
+ a5e: d0 ca rjmp .-2656 ; 0x0 <__TEXT_REGION_ORIGIN__>
+
+Disassembly of section .text.i2c_init:
+
+000009d6 <i2c_init>:
+// I2C / TWI driver
+// ============================================================
+
+static void i2c_init(void)
+{
+ TWSR = 0;
+ 9d6: 10 92 b9 00 sts 0x00B9, r1 ; 0x8000b9 <__TEXT_REGION_LENGTH__+0x7fe0b9>
+ TWBR = (uint8_t)((F_CPU / I2C_FREQ - 16) / 2);
+ 9da: 88 e4 ldi r24, 0x48 ; 72
+ 9dc: 80 93 b8 00 sts 0x00B8, r24 ; 0x8000b8 <__TEXT_REGION_LENGTH__+0x7fe0b8>
+ TWCR = (1 << TWEN);
+ 9e0: 84 e0 ldi r24, 0x04 ; 4
+ 9e2: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+ 9e6: 08 95 ret
+
+Disassembly of section .text.i2c_start:
+
+000009e8 <i2c_start>:
+}
+
+static void i2c_start(void)
+{
+ TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
+ 9e8: 84 ea ldi r24, 0xA4 ; 164
+ 9ea: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+
+ while (!(TWCR & (1 << TWINT)))
+ 9ee: 80 91 bc 00 lds r24, 0x00BC ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+ 9f2: 88 23 and r24, r24
+ 9f4: e4 f7 brge .-8 ; 0x9ee <i2c_start+0x6>
+ ;
+}
+ 9f6: 08 95 ret
+
+Disassembly of section .text.i2c_write:
+
+000009ae <i2c_write>:
+
+static void i2c_write(uint8_t data)
+{
+ TWDR = data;
+ 9ae: 80 93 bb 00 sts 0x00BB, r24 ; 0x8000bb <__TEXT_REGION_LENGTH__+0x7fe0bb>
+ TWCR = (1 << TWINT) | (1 << TWEN);
+ 9b2: 84 e8 ldi r24, 0x84 ; 132
+ 9b4: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+
+ while (!(TWCR & (1 << TWINT)))
+ 9b8: 80 91 bc 00 lds r24, 0x00BC ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+ 9bc: 88 23 and r24, r24
+ 9be: e4 f7 brge .-8 ; 0x9b8 <i2c_write+0xa>
+ ;
+}
+ 9c0: 08 95 ret
+
+Disassembly of section .text.i2c_stop:
+
+000009f8 <i2c_stop>:
+
+static void i2c_stop(void)
+{
+ TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);
+ 9f8: 84 e9 ldi r24, 0x94 ; 148
+ 9fa: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+
+ while (TWCR & (1 << TWSTO))
+ 9fe: 80 91 bc 00 lds r24, 0x00BC ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7fe0bc>
+ a02: 84 fd sbrc r24, 4
+ a04: fc cf rjmp .-8 ; 0x9fe <i2c_stop+0x6>
+ ;
+}
+ a06: 08 95 ret
+
+Disassembly of section .text.i2c_write_byte:
+
+00000948 <i2c_write_byte>:
+
+static void i2c_write_byte(uint8_t address, uint8_t data)
+{
+ 948: cf 93 push r28
+ 94a: df 93 push r29
+ 94c: d8 2f mov r29, r24
+ 94e: c6 2f mov r28, r22
+ i2c_start();
+ 950: 4b d0 rcall .+150 ; 0x9e8 <i2c_start>
+ i2c_write((address << 1) | 0);
+ 952: 8d 2f mov r24, r29
+ 954: 88 0f add r24, r24
+ 956: 2b d0 rcall .+86 ; 0x9ae <i2c_write>
+ i2c_write(data);
+ 958: 8c 2f mov r24, r28
+ 95a: 29 d0 rcall .+82 ; 0x9ae <i2c_write>
+ i2c_stop();
+ 95c: 4d d0 rcall .+154 ; 0x9f8 <i2c_stop>
+}
+ 95e: df 91 pop r29
+ 960: cf 91 pop r28
+ 962: 08 95 ret
+
+Disassembly of section .text.lcd_expander_write:
+
+00000a4a <lcd_expander_write>:
+// LCD driver: HD44780 + PCF8574 I2C backpack
+// ============================================================
+
+static void lcd_expander_write(uint8_t data)
+{
+ i2c_write_byte(LCD_ADDR, data | LCD_BACKLIGHT);
+ a4a: 68 2f mov r22, r24
+ a4c: 68 60 ori r22, 0x08 ; 8
+ a4e: 87 e2 ldi r24, 0x27 ; 39
+ a50: 7b df rcall .-266 ; 0x948 <i2c_write_byte>
+ a52: 08 95 ret
+
+Disassembly of section .text.adc_sampling_init:
+
+000007da <adc_sampling_init>:
+// ============================================================
+
+static void adc_sampling_init(void)
+{
+ // ADC0 / PC0 input
+ DDRC &= ~(1 << DDC0);
+ 7da: 87 b1 in r24, 0x07 ; 7
+ 7dc: 8e 7f andi r24, 0xFE ; 254
+ 7de: 87 b9 out 0x07, r24 ; 7
+ PORTC &= ~(1 << PORTC0);
+ 7e0: 88 b1 in r24, 0x08 ; 8
+ 7e2: 8e 7f andi r24, 0xFE ; 254
+ 7e4: 88 b9 out 0x08, r24 ; 8
+ DIDR0 |= (1 << ADC0D);
+ 7e6: ee e7 ldi r30, 0x7E ; 126
+ 7e8: f0 e0 ldi r31, 0x00 ; 0
+ 7ea: 80 81 ld r24, Z
+ 7ec: 81 60 ori r24, 0x01 ; 1
+ 7ee: 80 83 st Z, r24
+
+ // AVcc reference, ADC0
+ ADMUX = (1 << REFS0);
+ 7f0: 80 e4 ldi r24, 0x40 ; 64
+ 7f2: 80 93 7c 00 sts 0x007C, r24 ; 0x80007c <__TEXT_REGION_LENGTH__+0x7fe07c>
+
+ // ADC enabled, interrupt enabled, prescaler 128
+ // No auto-trigger: software starts each conversion
+ ADCSRA = (1 << ADEN) |
+ 7f6: 8f e8 ldi r24, 0x8F ; 143
+ 7f8: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7fe07a>
+ (1 << ADPS2) |
+ (1 << ADPS1) |
+ (1 << ADPS0);
+
+ // Timer0 CTC: 16 MHz / 8 / (249 + 1) = 8 kHz
+ TCCR0A = (1 << WGM01);
+ 7fc: 82 e0 ldi r24, 0x02 ; 2
+ 7fe: 84 bd out 0x24, r24 ; 36
+ TCCR0B = 0;
+ 800: 15 bc out 0x25, r1 ; 37
+ TCNT0 = 0;
+ 802: 16 bc out 0x26, r1 ; 38
+ OCR0A = 249;
+ 804: 99 ef ldi r25, 0xF9 ; 249
+ 806: 97 bd out 0x27, r25 ; 39
+
+ // Clear pending Timer0 compare flag
+ TIFR0 = (1 << OCF0A);
+ 808: 85 bb out 0x15, r24 ; 21
+
+ // Enable Timer0 compare interrupt
+ TIMSK0 |= (1 << OCIE0A);
+ 80a: ee e6 ldi r30, 0x6E ; 110
+ 80c: f0 e0 ldi r31, 0x00 ; 0
+ 80e: 90 81 ld r25, Z
+ 810: 92 60 ori r25, 0x02 ; 2
+ 812: 90 83 st Z, r25
+
+ // Start Timer0 with prescaler 8
+ TCCR0B = (1 << CS01);
+ 814: 85 bd out 0x25, r24 ; 37
+ 816: 08 95 ret
+
+Disassembly of section .text.analyze_block:
+
+00000142 <analyze_block>:
+
+static void analyze_block(
+volatile uint16_t *data,
+uint16_t *freq1,
+uint16_t *freq2)
+{
+ 142: 2f 92 push r2
+ 144: 3f 92 push r3
+ 146: 4f 92 push r4
+ 148: 5f 92 push r5
+ 14a: 6f 92 push r6
+ 14c: 7f 92 push r7
+ 14e: 8f 92 push r8
+ 150: 9f 92 push r9
+ 152: af 92 push r10
+ 154: bf 92 push r11
+ 156: cf 92 push r12
+ 158: df 92 push r13
+ 15a: ef 92 push r14
+ 15c: ff 92 push r15
+ 15e: 0f 93 push r16
+ 160: 1f 93 push r17
+ 162: cf 93 push r28
+ 164: df 93 push r29
+ 166: cd b7 in r28, 0x3d ; 61
+ 168: de b7 in r29, 0x3e ; 62
+ 16a: cf 50 subi r28, 0x0F ; 15
+ 16c: d1 40 sbci r29, 0x01 ; 1
+ 16e: 0f b6 in r0, 0x3f ; 63
+ 170: f8 94 cli
+ 172: de bf out 0x3e, r29 ; 62
+ 174: 0f be out 0x3f, r0 ; 63
+ 176: cd bf out 0x3d, r28 ; 61
+ 178: 5c 01 movw r10, r24
+ 17a: c4 5f subi r28, 0xF4 ; 244
+ 17c: de 4f sbci r29, 0xFE ; 254
+ 17e: 79 83 std Y+1, r23 ; 0x01
+ 180: 68 83 st Y, r22
+ 182: cc 50 subi r28, 0x0C ; 12
+ 184: d1 40 sbci r29, 0x01 ; 1
+ 186: c2 5f subi r28, 0xF2 ; 242
+ 188: de 4f sbci r29, 0xFE ; 254
+ 18a: 59 83 std Y+1, r21 ; 0x01
+ 18c: 48 83 st Y, r20
+ 18e: ce 50 subi r28, 0x0E ; 14
+ 190: d1 40 sbci r29, 0x01 ; 1
+ uint32_t sum = 0;
+
+ for (uint16_t i = 0; i < N_SAMPLES; i++)
+ 192: 80 e0 ldi r24, 0x00 ; 0
+ 194: 90 e0 ldi r25, 0x00 ; 0
+static void analyze_block(
+volatile uint16_t *data,
+uint16_t *freq1,
+uint16_t *freq2)
+{
+ uint32_t sum = 0;
+ 196: 40 e0 ldi r20, 0x00 ; 0
+ 198: 50 e0 ldi r21, 0x00 ; 0
+ 19a: ba 01 movw r22, r20
+
+ for (uint16_t i = 0; i < N_SAMPLES; i++)
+ 19c: 0c c0 rjmp .+24 ; 0x1b6 <analyze_block+0x74>
+ sum += data[i];
+ 19e: fc 01 movw r30, r24
+ 1a0: ee 0f add r30, r30
+ 1a2: ff 1f adc r31, r31
+ 1a4: ea 0d add r30, r10
+ 1a6: fb 1d adc r31, r11
+ 1a8: 20 81 ld r18, Z
+ 1aa: 31 81 ldd r19, Z+1 ; 0x01
+ 1ac: 42 0f add r20, r18
+ 1ae: 53 1f adc r21, r19
+ 1b0: 61 1d adc r22, r1
+ 1b2: 71 1d adc r23, r1
+uint16_t *freq1,
+uint16_t *freq2)
+{
+ uint32_t sum = 0;
+
+ for (uint16_t i = 0; i < N_SAMPLES; i++)
+ 1b4: 01 96 adiw r24, 0x01 ; 1
+ 1b6: 8f 3f cpi r24, 0xFF ; 255
+ 1b8: 91 05 cpc r25, r1
+ 1ba: 89 f3 breq .-30 ; 0x19e <analyze_block+0x5c>
+ 1bc: 80 f3 brcs .-32 ; 0x19e <analyze_block+0x5c>
+ sum += data[i];
+
+ int16_t mean = (int16_t)(sum / N_SAMPLES);
+ 1be: 45 2f mov r20, r21
+ 1c0: 56 2f mov r21, r22
+ 1c2: 67 2f mov r22, r23
+ 1c4: 77 27 eor r23, r23
+ 1c6: ca 5f subi r28, 0xFA ; 250
+ 1c8: de 4f sbci r29, 0xFE ; 254
+ 1ca: 59 83 std Y+1, r21 ; 0x01
+ 1cc: 48 83 st Y, r20
+ 1ce: c6 50 subi r28, 0x06 ; 6
+ 1d0: d1 40 sbci r29, 0x01 ; 1
+
+ uint32_t power[NUM_BINS];
+
+ for (uint8_t b = 0; b < NUM_BINS; b++) {
+ 1d2: cb 5f subi r28, 0xFB ; 251
+ 1d4: de 4f sbci r29, 0xFE ; 254
+ 1d6: 18 82 st Y, r1
+ 1d8: c5 50 subi r28, 0x05 ; 5
+ 1da: d1 40 sbci r29, 0x01 ; 1
+ 1dc: da c0 rjmp .+436 ; 0x392 <__EEPROM_REGION_LENGTH__+0x192>
+ int32_t q1 = 0;
+ int32_t q2 = 0;
+
+ for (uint16_t i = 0; i < N_SAMPLES; i++) {
+ int32_t x = ((int32_t)data[i] - mean) / 8;
+ 1de: f8 01 movw r30, r16
+ 1e0: ee 0f add r30, r30
+ 1e2: ff 1f adc r31, r31
+ 1e4: ea 0d add r30, r10
+ 1e6: fb 1d adc r31, r11
+ 1e8: 80 81 ld r24, Z
+ 1ea: 91 81 ldd r25, Z+1 ; 0x01
+ 1ec: a0 e0 ldi r26, 0x00 ; 0
+ 1ee: b0 e0 ldi r27, 0x00 ; 0
+ 1f0: ca 5f subi r28, 0xFA ; 250
+ 1f2: de 4f sbci r29, 0xFE ; 254
+ 1f4: 28 81 ld r18, Y
+ 1f6: 39 81 ldd r19, Y+1 ; 0x01
+ 1f8: c6 50 subi r28, 0x06 ; 6
+ 1fa: d1 40 sbci r29, 0x01 ; 1
+ 1fc: a9 01 movw r20, r18
+ 1fe: 33 0f add r19, r19
+ 200: 66 0b sbc r22, r22
+ 202: 77 0b sbc r23, r23
+ 204: 84 1b sub r24, r20
+ 206: 95 0b sbc r25, r21
+ 208: a6 0b sbc r26, r22
+ 20a: b7 0b sbc r27, r23
+ 20c: ac 01 movw r20, r24
+ 20e: bd 01 movw r22, r26
+ 210: 22 f4 brpl .+8 ; 0x21a <__EEPROM_REGION_LENGTH__+0x1a>
+ 212: 49 5f subi r20, 0xF9 ; 249
+ 214: 5f 4f sbci r21, 0xFF ; 255
+ 216: 6f 4f sbci r22, 0xFF ; 255
+ 218: 7f 4f sbci r23, 0xFF ; 255
+ 21a: 6a 01 movw r12, r20
+ 21c: 7b 01 movw r14, r22
+ 21e: 68 94 set
+ 220: 12 f8 bld r1, 2
+ 222: f5 94 asr r15
+ 224: e7 94 ror r14
+ 226: d7 94 ror r13
+ 228: c7 94 ror r12
+ 22a: 16 94 lsr r1
+ 22c: d1 f7 brne .-12 ; 0x222 <__EEPROM_REGION_LENGTH__+0x22>
+
+ int32_t q0 = x
+ + (((int32_t)coeff[b] * q1) >> 14)
+ 22e: cb 5f subi r28, 0xFB ; 251
+ 230: de 4f sbci r29, 0xFE ; 254
+ 232: 38 81 ld r19, Y
+ 234: c5 50 subi r28, 0x05 ; 5
+ 236: d1 40 sbci r29, 0x01 ; 1
+ 238: 83 2f mov r24, r19
+ 23a: 90 e0 ldi r25, 0x00 ; 0
+ 23c: 88 0f add r24, r24
+ 23e: 99 1f adc r25, r25
+ 240: 09 2e mov r0, r25
+ 242: 00 0c add r0, r0
+ 244: aa 0b sbc r26, r26
+ 246: 86 57 subi r24, 0x76 ; 118
+ 248: 9f 4f sbci r25, 0xFF ; 255
+ 24a: af 4f sbci r26, 0xFF ; 255
+ 24c: fc 01 movw r30, r24
+ 24e: 5a 2f mov r21, r26
+ 250: db d3 rcall .+1974 ; 0xa08 <__xload_2>
+ 252: db 01 movw r26, r22
+ 254: 22 2d mov r18, r2
+ 256: 33 2d mov r19, r3
+ 258: 48 2d mov r20, r8
+ 25a: 59 2d mov r21, r9
+ 25c: f0 d3 rcall .+2016 ; 0xa3e <__mulshisi3>
+ 25e: dc 01 movw r26, r24
+ 260: cb 01 movw r24, r22
+ 262: 07 2e mov r0, r23
+ 264: 7e e0 ldi r23, 0x0E ; 14
+ 266: b5 95 asr r27
+ 268: a7 95 ror r26
+ 26a: 97 95 ror r25
+ 26c: 87 95 ror r24
+ 26e: 7a 95 dec r23
+ 270: d1 f7 brne .-12 ; 0x266 <__EEPROM_REGION_LENGTH__+0x66>
+ 272: 70 2d mov r23, r0
+ 274: 8c 0d add r24, r12
+ 276: 9d 1d adc r25, r13
+ 278: ae 1d adc r26, r14
+ 27a: bf 1d adc r27, r15
+ int32_t q2 = 0;
+
+ for (uint16_t i = 0; i < N_SAMPLES; i++) {
+ int32_t x = ((int32_t)data[i] - mean) / 8;
+
+ int32_t q0 = x
+ 27c: 84 19 sub r24, r4
+ 27e: 95 09 sbc r25, r5
+ 280: a6 09 sbc r26, r6
+ 282: b7 09 sbc r27, r7
+
+ for (uint8_t b = 0; b < NUM_BINS; b++) {
+ int32_t q1 = 0;
+ int32_t q2 = 0;
+
+ for (uint16_t i = 0; i < N_SAMPLES; i++) {
+ 284: 0f 5f subi r16, 0xFF ; 255
+ 286: 1f 4f sbci r17, 0xFF ; 255
+
+ int32_t q0 = x
+ + (((int32_t)coeff[b] * q1) >> 14)
+ - q2;
+
+ q2 = q1;
+ 288: 42 2c mov r4, r2
+ 28a: 53 2c mov r5, r3
+ 28c: 68 2c mov r6, r8
+ 28e: 79 2c mov r7, r9
+ q1 = q0;
+ 290: 28 2e mov r2, r24
+ 292: 39 2e mov r3, r25
+ 294: 8a 2e mov r8, r26
+ 296: 9b 2e mov r9, r27
+ 298: 09 c0 rjmp .+18 ; 0x2ac <__EEPROM_REGION_LENGTH__+0xac>
+ 29a: 00 e0 ldi r16, 0x00 ; 0
+ 29c: 10 e0 ldi r17, 0x00 ; 0
+ 29e: 41 2c mov r4, r1
+ 2a0: 51 2c mov r5, r1
+ 2a2: 32 01 movw r6, r4
+ 2a4: 21 2c mov r2, r1
+ 2a6: 31 2c mov r3, r1
+ 2a8: 81 2c mov r8, r1
+ 2aa: 91 2c mov r9, r1
+
+ for (uint8_t b = 0; b < NUM_BINS; b++) {
+ int32_t q1 = 0;
+ int32_t q2 = 0;
+
+ for (uint16_t i = 0; i < N_SAMPLES; i++) {
+ 2ac: 0f 3f cpi r16, 0xFF ; 255
+ 2ae: 11 05 cpc r17, r1
+ 2b0: 09 f0 breq .+2 ; 0x2b4 <__EEPROM_REGION_LENGTH__+0xb4>
+ 2b2: 08 f4 brcc .+2 ; 0x2b6 <__EEPROM_REGION_LENGTH__+0xb6>
+ 2b4: 94 cf rjmp .-216 ; 0x1de <analyze_block+0x9c>
+
+ q2 = q1;
+ q1 = q0;
+ }
+
+ int32_t term = ((int32_t)coeff[b] * q1) >> 14;
+ 2b6: cb 5f subi r28, 0xFB ; 251
+ 2b8: de 4f sbci r29, 0xFE ; 254
+ 2ba: 48 81 ld r20, Y
+ 2bc: c5 50 subi r28, 0x05 ; 5
+ 2be: d1 40 sbci r29, 0x01 ; 1
+ 2c0: 04 2f mov r16, r20
+ 2c2: 10 e0 ldi r17, 0x00 ; 0
+ 2c4: c8 01 movw r24, r16
+ 2c6: 88 0f add r24, r24
+ 2c8: 99 1f adc r25, r25
+ 2ca: 09 2e mov r0, r25
+ 2cc: 00 0c add r0, r0
+ 2ce: aa 0b sbc r26, r26
+ 2d0: 86 57 subi r24, 0x76 ; 118
+ 2d2: 9f 4f sbci r25, 0xFF ; 255
+ 2d4: af 4f sbci r26, 0xFF ; 255
+ 2d6: fc 01 movw r30, r24
+ 2d8: 5a 2f mov r21, r26
+ 2da: 96 d3 rcall .+1836 ; 0xa08 <__xload_2>
+ 2dc: db 01 movw r26, r22
+ 2de: 22 2d mov r18, r2
+ 2e0: 33 2d mov r19, r3
+ 2e2: 48 2d mov r20, r8
+ 2e4: 59 2d mov r21, r9
+ 2e6: ab d3 rcall .+1878 ; 0xa3e <__mulshisi3>
+ 2e8: 9b 01 movw r18, r22
+ 2ea: ac 01 movw r20, r24
+ 2ec: 01 2e mov r0, r17
+ 2ee: 1e e0 ldi r17, 0x0E ; 14
+ 2f0: 55 95 asr r21
+ 2f2: 47 95 ror r20
+ 2f4: 37 95 ror r19
+ 2f6: 27 95 ror r18
+ 2f8: 1a 95 dec r17
+ 2fa: d1 f7 brne .-12 ; 0x2f0 <__EEPROM_REGION_LENGTH__+0xf0>
+ 2fc: 10 2d mov r17, r0
+ 2fe: c8 5f subi r28, 0xF8 ; 248
+ 300: de 4f sbci r29, 0xFE ; 254
+ 302: 28 83 st Y, r18
+ 304: 39 83 std Y+1, r19 ; 0x01
+ 306: 4a 83 std Y+2, r20 ; 0x02
+ 308: 5b 83 std Y+3, r21 ; 0x03
+ 30a: c8 50 subi r28, 0x08 ; 8
+ 30c: d1 40 sbci r29, 0x01 ; 1
+ int32_t p = q1 * q1 + q2 * q2 - term * q2;
+ 30e: 22 2d mov r18, r2
+ 310: 33 2d mov r19, r3
+ 312: 48 2d mov r20, r8
+ 314: 59 2d mov r21, r9
+ 316: 62 2d mov r22, r2
+ 318: 73 2d mov r23, r3
+ 31a: 88 2d mov r24, r8
+ 31c: 99 2d mov r25, r9
+ 31e: 05 d3 rcall .+1546 ; 0x92a <__mulsi3>
+ 320: 6b 01 movw r12, r22
+ 322: 7c 01 movw r14, r24
+ 324: a3 01 movw r20, r6
+ 326: 92 01 movw r18, r4
+ 328: c3 01 movw r24, r6
+ 32a: b2 01 movw r22, r4
+ 32c: fe d2 rcall .+1532 ; 0x92a <__mulsi3>
+ 32e: c6 0e add r12, r22
+ 330: d7 1e adc r13, r23
+ 332: e8 1e adc r14, r24
+ 334: f9 1e adc r15, r25
+ 336: c8 5f subi r28, 0xF8 ; 248
+ 338: de 4f sbci r29, 0xFE ; 254
+ 33a: 68 81 ld r22, Y
+ 33c: 79 81 ldd r23, Y+1 ; 0x01
+ 33e: 8a 81 ldd r24, Y+2 ; 0x02
+ 340: 9b 81 ldd r25, Y+3 ; 0x03
+ 342: c8 50 subi r28, 0x08 ; 8
+ 344: d1 40 sbci r29, 0x01 ; 1
+ 346: f1 d2 rcall .+1506 ; 0x92a <__mulsi3>
+
+ power[b] = (p > 0) ? (uint32_t)p : 0;
+ 348: a7 01 movw r20, r14
+ 34a: 96 01 movw r18, r12
+ 34c: 26 1b sub r18, r22
+ 34e: 37 0b sbc r19, r23
+ 350: 48 0b sbc r20, r24
+ 352: 59 0b sbc r21, r25
+ 354: da 01 movw r26, r20
+ 356: c9 01 movw r24, r18
+ 358: 1a f4 brpl .+6 ; 0x360 <__EEPROM_REGION_LENGTH__+0x160>
+ 35a: 80 e0 ldi r24, 0x00 ; 0
+ 35c: 90 e0 ldi r25, 0x00 ; 0
+ 35e: dc 01 movw r26, r24
+ 360: 00 0f add r16, r16
+ 362: 11 1f adc r17, r17
+ 364: 00 0f add r16, r16
+ 366: 11 1f adc r17, r17
+ 368: e1 e0 ldi r30, 0x01 ; 1
+ 36a: f0 e0 ldi r31, 0x00 ; 0
+ 36c: ec 0f add r30, r28
+ 36e: fd 1f adc r31, r29
+ 370: e0 0f add r30, r16
+ 372: f1 1f adc r31, r17
+ 374: 80 83 st Z, r24
+ 376: 91 83 std Z+1, r25 ; 0x01
+ 378: a2 83 std Z+2, r26 ; 0x02
+ 37a: b3 83 std Z+3, r27 ; 0x03
+
+ int16_t mean = (int16_t)(sum / N_SAMPLES);
+
+ uint32_t power[NUM_BINS];
+
+ for (uint8_t b = 0; b < NUM_BINS; b++) {
+ 37c: cb 5f subi r28, 0xFB ; 251
+ 37e: de 4f sbci r29, 0xFE ; 254
+ 380: 38 81 ld r19, Y
+ 382: c5 50 subi r28, 0x05 ; 5
+ 384: d1 40 sbci r29, 0x01 ; 1
+ 386: 3f 5f subi r19, 0xFF ; 255
+ 388: cb 5f subi r28, 0xFB ; 251
+ 38a: de 4f sbci r29, 0xFE ; 254
+ 38c: 38 83 st Y, r19
+ 38e: c5 50 subi r28, 0x05 ; 5
+ 390: d1 40 sbci r29, 0x01 ; 1
+ 392: cb 5f subi r28, 0xFB ; 251
+ 394: de 4f sbci r29, 0xFE ; 254
+ 396: 48 81 ld r20, Y
+ 398: c5 50 subi r28, 0x05 ; 5
+ 39a: d1 40 sbci r29, 0x01 ; 1
+ 39c: 41 34 cpi r20, 0x41 ; 65
+ 39e: 08 f4 brcc .+2 ; 0x3a2 <__EEPROM_REGION_LENGTH__+0x1a2>
+ 3a0: 7c cf rjmp .-264 ; 0x29a <__EEPROM_REGION_LENGTH__+0x9a>
+ 3a2: 81 e0 ldi r24, 0x01 ; 1
+ 3a4: 30 e0 ldi r19, 0x00 ; 0
+ 3a6: 93 2f mov r25, r19
+ 3a8: 27 c0 rjmp .+78 ; 0x3f8 <__EEPROM_REGION_LENGTH__+0x1f8>
+ }
+
+ uint8_t best1 = 0;
+
+ for (uint8_t b = 1; b < NUM_BINS; b++) {
+ if (power[b] > power[best1])
+ 3aa: e8 2f mov r30, r24
+ 3ac: f0 e0 ldi r31, 0x00 ; 0
+ 3ae: ee 0f add r30, r30
+ 3b0: ff 1f adc r31, r31
+ 3b2: ee 0f add r30, r30
+ 3b4: ff 1f adc r31, r31
+ 3b6: 21 e0 ldi r18, 0x01 ; 1
+ 3b8: 30 e0 ldi r19, 0x00 ; 0
+ 3ba: 2c 0f add r18, r28
+ 3bc: 3d 1f adc r19, r29
+ 3be: e2 0f add r30, r18
+ 3c0: f3 1f adc r31, r19
+ 3c2: 00 81 ld r16, Z
+ 3c4: 11 81 ldd r17, Z+1 ; 0x01
+ 3c6: 22 81 ldd r18, Z+2 ; 0x02
+ 3c8: 33 81 ldd r19, Z+3 ; 0x03
+ 3ca: e9 2f mov r30, r25
+ 3cc: f0 e0 ldi r31, 0x00 ; 0
+ 3ce: ee 0f add r30, r30
+ 3d0: ff 1f adc r31, r31
+ 3d2: ee 0f add r30, r30
+ 3d4: ff 1f adc r31, r31
+ 3d6: 41 e0 ldi r20, 0x01 ; 1
+ 3d8: 50 e0 ldi r21, 0x00 ; 0
+ 3da: 4c 0f add r20, r28
+ 3dc: 5d 1f adc r21, r29
+ 3de: e4 0f add r30, r20
+ 3e0: f5 1f adc r31, r21
+ 3e2: 40 81 ld r20, Z
+ 3e4: 51 81 ldd r21, Z+1 ; 0x01
+ 3e6: 62 81 ldd r22, Z+2 ; 0x02
+ 3e8: 73 81 ldd r23, Z+3 ; 0x03
+ 3ea: 40 17 cp r20, r16
+ 3ec: 51 07 cpc r21, r17
+ 3ee: 62 07 cpc r22, r18
+ 3f0: 73 07 cpc r23, r19
+ 3f2: 08 f4 brcc .+2 ; 0x3f6 <__EEPROM_REGION_LENGTH__+0x1f6>
+ best1 = b;
+ 3f4: 98 2f mov r25, r24
+ power[b] = (p > 0) ? (uint32_t)p : 0;
+ }
+
+ uint8_t best1 = 0;
+
+ for (uint8_t b = 1; b < NUM_BINS; b++) {
+ 3f6: 8f 5f subi r24, 0xFF ; 255
+ 3f8: 81 34 cpi r24, 0x41 ; 65
+ 3fa: b8 f2 brcs .-82 ; 0x3aa <__EEPROM_REGION_LENGTH__+0x1aa>
+ 3fc: 39 2f mov r19, r25
+ 3fe: 20 e0 ldi r18, 0x00 ; 0
+ 400: 4f ef ldi r20, 0xFF ; 255
+ 402: 38 c0 rjmp .+112 ; 0x474 <__DATA_REGION_LENGTH__+0x74>
+ }
+
+ uint8_t best2 = 255;
+
+ for (uint8_t b = 0; b < NUM_BINS; b++) {
+ if ((b + 1 >= best1) && (b <= best1 + 1))
+ 404: 82 2f mov r24, r18
+ 406: 90 e0 ldi r25, 0x00 ; 0
+ 408: fc 01 movw r30, r24
+ 40a: 31 96 adiw r30, 0x01 ; 1
+ 40c: 63 2f mov r22, r19
+ 40e: 70 e0 ldi r23, 0x00 ; 0
+ 410: e6 17 cp r30, r22
+ 412: f7 07 cpc r31, r23
+ 414: 2c f0 brlt .+10 ; 0x420 <__DATA_REGION_LENGTH__+0x20>
+ 416: 6f 5f subi r22, 0xFF ; 255
+ 418: 7f 4f sbci r23, 0xFF ; 255
+ 41a: 68 17 cp r22, r24
+ 41c: 79 07 cpc r23, r25
+ 41e: 4c f5 brge .+82 ; 0x472 <__DATA_REGION_LENGTH__+0x72>
+ continue;
+
+ if (best2 == 255 || power[b] > power[best2])
+ 420: 4f 3f cpi r20, 0xFF ; 255
+ 422: 21 f1 breq .+72 ; 0x46c <__DATA_REGION_LENGTH__+0x6c>
+ 424: 88 0f add r24, r24
+ 426: 99 1f adc r25, r25
+ 428: 88 0f add r24, r24
+ 42a: 99 1f adc r25, r25
+ 42c: e1 e0 ldi r30, 0x01 ; 1
+ 42e: f0 e0 ldi r31, 0x00 ; 0
+ 430: ec 0f add r30, r28
+ 432: fd 1f adc r31, r29
+ 434: e8 0f add r30, r24
+ 436: f9 1f adc r31, r25
+ 438: c0 80 ld r12, Z
+ 43a: d1 80 ldd r13, Z+1 ; 0x01
+ 43c: e2 80 ldd r14, Z+2 ; 0x02
+ 43e: f3 80 ldd r15, Z+3 ; 0x03
+ 440: e4 2f mov r30, r20
+ 442: f0 e0 ldi r31, 0x00 ; 0
+ 444: ee 0f add r30, r30
+ 446: ff 1f adc r31, r31
+ 448: ee 0f add r30, r30
+ 44a: ff 1f adc r31, r31
+ 44c: 81 e0 ldi r24, 0x01 ; 1
+ 44e: 90 e0 ldi r25, 0x00 ; 0
+ 450: 8c 0f add r24, r28
+ 452: 9d 1f adc r25, r29
+ 454: e8 0f add r30, r24
+ 456: f9 1f adc r31, r25
+ 458: 80 81 ld r24, Z
+ 45a: 91 81 ldd r25, Z+1 ; 0x01
+ 45c: a2 81 ldd r26, Z+2 ; 0x02
+ 45e: b3 81 ldd r27, Z+3 ; 0x03
+ 460: 8c 15 cp r24, r12
+ 462: 9d 05 cpc r25, r13
+ 464: ae 05 cpc r26, r14
+ 466: bf 05 cpc r27, r15
+ 468: 18 f0 brcs .+6 ; 0x470 <__DATA_REGION_LENGTH__+0x70>
+ 46a: 03 c0 rjmp .+6 ; 0x472 <__DATA_REGION_LENGTH__+0x72>
+ best2 = b;
+ 46c: 42 2f mov r20, r18
+ 46e: 01 c0 rjmp .+2 ; 0x472 <__DATA_REGION_LENGTH__+0x72>
+ 470: 42 2f mov r20, r18
+ best1 = b;
+ }
+
+ uint8_t best2 = 255;
+
+ for (uint8_t b = 0; b < NUM_BINS; b++) {
+ 472: 2f 5f subi r18, 0xFF ; 255
+ 474: 21 34 cpi r18, 0x41 ; 65
+ 476: 30 f2 brcs .-116 ; 0x404 <__DATA_REGION_LENGTH__+0x4>
+
+ if (best2 == 255 || power[b] > power[best2])
+ best2 = b;
+ }
+
+ *freq1 = ((uint32_t)(best1 + MIN_BIN) * SAMPLE_RATE
+ 478: a3 2f mov r26, r19
+ 47a: b0 e0 ldi r27, 0x00 ; 0
+ 47c: 50 96 adiw r26, 0x10 ; 16
+ 47e: 20 e4 ldi r18, 0x40 ; 64
+ 480: 3f e1 ldi r19, 0x1F ; 31
+ 482: d7 d2 rcall .+1454 ; 0xa32 <__usmulhisi3>
+ + N_SAMPLES / 2) / N_SAMPLES;
+ 484: dc 01 movw r26, r24
+ 486: cb 01 movw r24, r22
+ 488: 80 58 subi r24, 0x80 ; 128
+ 48a: 9f 4f sbci r25, 0xFF ; 255
+ 48c: af 4f sbci r26, 0xFF ; 255
+ 48e: bf 4f sbci r27, 0xFF ; 255
+ 490: 89 2f mov r24, r25
+ 492: 9a 2f mov r25, r26
+ 494: ab 2f mov r26, r27
+ 496: bb 27 eor r27, r27
+
+ if (best2 == 255 || power[b] > power[best2])
+ best2 = b;
+ }
+
+ *freq1 = ((uint32_t)(best1 + MIN_BIN) * SAMPLE_RATE
+ 498: c4 5f subi r28, 0xF4 ; 244
+ 49a: de 4f sbci r29, 0xFE ; 254
+ 49c: e8 81 ld r30, Y
+ 49e: f9 81 ldd r31, Y+1 ; 0x01
+ 4a0: cc 50 subi r28, 0x0C ; 12
+ 4a2: d1 40 sbci r29, 0x01 ; 1
+ 4a4: 91 83 std Z+1, r25 ; 0x01
+ 4a6: 80 83 st Z, r24
+ + N_SAMPLES / 2) / N_SAMPLES;
+
+ *freq2 = ((uint32_t)(best2 + MIN_BIN) * SAMPLE_RATE
+ 4a8: 50 e0 ldi r21, 0x00 ; 0
+ 4aa: da 01 movw r26, r20
+ 4ac: 50 96 adiw r26, 0x10 ; 16
+ 4ae: c1 d2 rcall .+1410 ; 0xa32 <__usmulhisi3>
+ + N_SAMPLES / 2) / N_SAMPLES;
+ 4b0: dc 01 movw r26, r24
+ 4b2: cb 01 movw r24, r22
+ 4b4: 80 58 subi r24, 0x80 ; 128
+ 4b6: 9f 4f sbci r25, 0xFF ; 255
+ 4b8: af 4f sbci r26, 0xFF ; 255
+ 4ba: bf 4f sbci r27, 0xFF ; 255
+ 4bc: 89 2f mov r24, r25
+ 4be: 9a 2f mov r25, r26
+ 4c0: ab 2f mov r26, r27
+ 4c2: bb 27 eor r27, r27
+ }
+
+ *freq1 = ((uint32_t)(best1 + MIN_BIN) * SAMPLE_RATE
+ + N_SAMPLES / 2) / N_SAMPLES;
+
+ *freq2 = ((uint32_t)(best2 + MIN_BIN) * SAMPLE_RATE
+ 4c4: c2 5f subi r28, 0xF2 ; 242
+ 4c6: de 4f sbci r29, 0xFE ; 254
+ 4c8: e8 81 ld r30, Y
+ 4ca: f9 81 ldd r31, Y+1 ; 0x01
+ 4cc: ce 50 subi r28, 0x0E ; 14
+ 4ce: d1 40 sbci r29, 0x01 ; 1
+ 4d0: 91 83 std Z+1, r25 ; 0x01
+ 4d2: 80 83 st Z, r24
+ + N_SAMPLES / 2) / N_SAMPLES;
+}
+ 4d4: c1 5f subi r28, 0xF1 ; 241
+ 4d6: de 4f sbci r29, 0xFE ; 254
+ 4d8: 0f b6 in r0, 0x3f ; 63
+ 4da: f8 94 cli
+ 4dc: de bf out 0x3e, r29 ; 62
+ 4de: 0f be out 0x3f, r0 ; 63
+ 4e0: cd bf out 0x3d, r28 ; 61
+ 4e2: df 91 pop r29
+ 4e4: cf 91 pop r28
+ 4e6: 1f 91 pop r17
+ 4e8: 0f 91 pop r16
+ 4ea: ff 90 pop r15
+ 4ec: ef 90 pop r14
+ 4ee: df 90 pop r13
+ 4f0: cf 90 pop r12
+ 4f2: bf 90 pop r11
+ 4f4: af 90 pop r10
+ 4f6: 9f 90 pop r9
+ 4f8: 8f 90 pop r8
+ 4fa: 7f 90 pop r7
+ 4fc: 6f 90 pop r6
+ 4fe: 5f 90 pop r5
+ 500: 4f 90 pop r4
+ 502: 3f 90 pop r3
+ 504: 2f 90 pop r2
+ 506: 08 95 ret
+
+Disassembly of section .text.get_column:
+
+0000088e <get_column>:
+// Frequency matching tolerance in Hz
+#define FREQ_TOLERANCE 20
+
+static int8_t get_column(uint16_t f)
+{
+ if (f >= 1219 - FREQ_TOLERANCE &&
+ 88e: 9c 01 movw r18, r24
+ 890: 2f 5a subi r18, 0xAF ; 175
+ 892: 34 40 sbci r19, 0x04 ; 4
+ 894: 29 32 cpi r18, 0x29 ; 41
+ 896: 31 05 cpc r19, r1
+ 898: 58 f0 brcs .+22 ; 0x8b0 <get_column+0x22>
+ f <= 1219 + FREQ_TOLERANCE)
+ return 0;
+
+ if (f >= 1344 - FREQ_TOLERANCE &&
+ 89a: 2d 57 subi r18, 0x7D ; 125
+ 89c: 31 09 sbc r19, r1
+ 89e: 29 32 cpi r18, 0x29 ; 41
+ 8a0: 31 05 cpc r19, r1
+ 8a2: 40 f0 brcs .+16 ; 0x8b4 <get_column+0x26>
+ f <= 1344 + FREQ_TOLERANCE)
+ return 1;
+
+ if (f >= 1469 - FREQ_TOLERANCE &&
+ 8a4: 89 5a subi r24, 0xA9 ; 169
+ 8a6: 95 40 sbci r25, 0x05 ; 5
+ 8a8: 89 97 sbiw r24, 0x29 ; 41
+ 8aa: 30 f4 brcc .+12 ; 0x8b8 <get_column+0x2a>
+ f <= 1469 + FREQ_TOLERANCE)
+ return 2;
+ 8ac: 82 e0 ldi r24, 0x02 ; 2
+ 8ae: 08 95 ret
+
+static int8_t get_column(uint16_t f)
+{
+ if (f >= 1219 - FREQ_TOLERANCE &&
+ f <= 1219 + FREQ_TOLERANCE)
+ return 0;
+ 8b0: 80 e0 ldi r24, 0x00 ; 0
+ 8b2: 08 95 ret
+
+ if (f >= 1344 - FREQ_TOLERANCE &&
+ f <= 1344 + FREQ_TOLERANCE)
+ return 1;
+ 8b4: 81 e0 ldi r24, 0x01 ; 1
+ 8b6: 08 95 ret
+
+ if (f >= 1469 - FREQ_TOLERANCE &&
+ f <= 1469 + FREQ_TOLERANCE)
+ return 2;
+
+ return -1;
+ 8b8: 8f ef ldi r24, 0xFF ; 255
+}
+ 8ba: 08 95 ret
+
+Disassembly of section .text.get_row:
+
+00000818 <get_row>:
+
+static int8_t get_row(uint16_t f)
+{
+ if (f >= 688 - FREQ_TOLERANCE &&
+ 818: 9c 01 movw r18, r24
+ 81a: 2c 59 subi r18, 0x9C ; 156
+ 81c: 32 40 sbci r19, 0x02 ; 2
+ 81e: 29 32 cpi r18, 0x29 ; 41
+ 820: 31 05 cpc r19, r1
+ 822: 80 f0 brcs .+32 ; 0x844 <get_row+0x2c>
+ f <= 688 + FREQ_TOLERANCE)
+ return 0;
+
+ if (f >= 781 - FREQ_TOLERANCE &&
+ 824: 2d 55 subi r18, 0x5D ; 93
+ 826: 31 09 sbc r19, r1
+ 828: 29 32 cpi r18, 0x29 ; 41
+ 82a: 31 05 cpc r19, r1
+ 82c: 68 f0 brcs .+26 ; 0x848 <get_row+0x30>
+ f <= 781 + FREQ_TOLERANCE)
+ return 1;
+
+ if (f >= 844 - FREQ_TOLERANCE &&
+ 82e: 2f 53 subi r18, 0x3F ; 63
+ 830: 31 09 sbc r19, r1
+ 832: 29 32 cpi r18, 0x29 ; 41
+ 834: 31 05 cpc r19, r1
+ 836: 50 f0 brcs .+20 ; 0x84c <get_row+0x34>
+ f <= 844 + FREQ_TOLERANCE)
+ return 2;
+
+ if (f >= 938 - FREQ_TOLERANCE &&
+ 838: 86 59 subi r24, 0x96 ; 150
+ 83a: 93 40 sbci r25, 0x03 ; 3
+ 83c: 89 97 sbiw r24, 0x29 ; 41
+ 83e: 40 f4 brcc .+16 ; 0x850 <get_row+0x38>
+ f <= 938 + FREQ_TOLERANCE)
+ return 3;
+ 840: 83 e0 ldi r24, 0x03 ; 3
+ 842: 08 95 ret
+
+static int8_t get_row(uint16_t f)
+{
+ if (f >= 688 - FREQ_TOLERANCE &&
+ f <= 688 + FREQ_TOLERANCE)
+ return 0;
+ 844: 80 e0 ldi r24, 0x00 ; 0
+ 846: 08 95 ret
+
+ if (f >= 781 - FREQ_TOLERANCE &&
+ f <= 781 + FREQ_TOLERANCE)
+ return 1;
+ 848: 81 e0 ldi r24, 0x01 ; 1
+ 84a: 08 95 ret
+
+ if (f >= 844 - FREQ_TOLERANCE &&
+ f <= 844 + FREQ_TOLERANCE)
+ return 2;
+ 84c: 82 e0 ldi r24, 0x02 ; 2
+ 84e: 08 95 ret
+
+ if (f >= 938 - FREQ_TOLERANCE &&
+ f <= 938 + FREQ_TOLERANCE)
+ return 3;
+
+ return -1;
+ 850: 8f ef ldi r24, 0xFF ; 255
+}
+ 852: 08 95 ret
+
+Disassembly of section .text.decode_key:
+
+000006fa <decode_key>:
+
+static char decode_key(uint16_t f1, uint16_t f2)
+{
+ 6fa: ef 92 push r14
+ 6fc: ff 92 push r15
+ 6fe: 0f 93 push r16
+ 700: 1f 93 push r17
+ 702: cf 93 push r28
+ 704: 8c 01 movw r16, r24
+ 706: 7b 01 movw r14, r22
+ {'4', '5', '6'},
+ {'7', '8', '9'},
+ {'*', '0', '#'}
+ };
+
+ int8_t col = get_column(f1);
+ 708: c2 d0 rcall .+388 ; 0x88e <get_column>
+ 70a: c8 2f mov r28, r24
+ int8_t row = get_row(f2);
+ 70c: c7 01 movw r24, r14
+ 70e: 84 d0 rcall .+264 ; 0x818 <get_row>
+
+ // The two strongest frequencies may appear in either order.
+ if (col < 0 || row < 0) {
+ 710: cc 23 and r28, r28
+ 712: 14 f0 brlt .+4 ; 0x718 <decode_key+0x1e>
+ 714: 88 23 and r24, r24
+ 716: 2c f4 brge .+10 ; 0x722 <decode_key+0x28>
+ col = get_column(f2);
+ 718: c7 01 movw r24, r14
+ 71a: b9 d0 rcall .+370 ; 0x88e <get_column>
+ 71c: c8 2f mov r28, r24
+ row = get_row(f1);
+ 71e: c8 01 movw r24, r16
+ 720: 7b d0 rcall .+246 ; 0x818 <get_row>
+ }
+
+ if (col < 0 || row < 0)
+ 722: cc 23 and r28, r28
+ 724: cc f0 brlt .+50 ; 0x758 <decode_key+0x5e>
+ 726: 88 23 and r24, r24
+ 728: cc f0 brlt .+50 ; 0x75c <decode_key+0x62>
+ return '\0';
+
+ return keypad[row][col];
+ 72a: 08 2e mov r0, r24
+ 72c: 00 0c add r0, r0
+ 72e: 99 0b sbc r25, r25
+ 730: 9c 01 movw r18, r24
+ 732: 22 0f add r18, r18
+ 734: 33 1f adc r19, r19
+ 736: 82 0f add r24, r18
+ 738: 93 1f adc r25, r19
+ 73a: 8c 0f add r24, r28
+ 73c: 91 1d adc r25, r1
+ 73e: c7 fd sbrc r28, 7
+ 740: 9a 95 dec r25
+ 742: 09 2e mov r0, r25
+ 744: 00 0c add r0, r0
+ 746: aa 0b sbc r26, r26
+ 748: 8b 5c subi r24, 0xCB ; 203
+ 74a: 9e 4f sbci r25, 0xFE ; 254
+ 74c: af 4f sbci r26, 0xFF ; 255
+ 74e: fc 01 movw r30, r24
+ 750: 84 91 lpm r24, Z
+ 752: a7 fd sbrc r26, 7
+ 754: 80 81 ld r24, Z
+ 756: 03 c0 rjmp .+6 ; 0x75e <decode_key+0x64>
+ col = get_column(f2);
+ row = get_row(f1);
+ }
+
+ if (col < 0 || row < 0)
+ return '\0';
+ 758: 80 e0 ldi r24, 0x00 ; 0
+ 75a: 01 c0 rjmp .+2 ; 0x75e <decode_key+0x64>
+ 75c: 80 e0 ldi r24, 0x00 ; 0
+
+ return keypad[row][col];
+}
+ 75e: cf 91 pop r28
+ 760: 1f 91 pop r17
+ 762: 0f 91 pop r16
+ 764: ff 90 pop r15
+ 766: ef 90 pop r14
+ 768: 08 95 ret
+
+Disassembly of section .text.lcd_pulse_enable:
+
+000008e6 <lcd_pulse_enable>:
+{
+ i2c_write_byte(LCD_ADDR, data | LCD_BACKLIGHT);
+}
+
+static void lcd_pulse_enable(uint8_t data)
+{
+ 8e6: cf 93 push r28
+ 8e8: c8 2f mov r28, r24
+ lcd_expander_write(data | LCD_EN);
+ 8ea: 84 60 ori r24, 0x04 ; 4
+ 8ec: ae d0 rcall .+348 ; 0xa4a <lcd_expander_write>
+ #else
+ //round up by default
+ __ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
+ #endif
+
+ __builtin_avr_delay_cycles(__ticks_dc);
+ 8ee: 85 e0 ldi r24, 0x05 ; 5
+ 8f0: 8a 95 dec r24
+ 8f2: f1 f7 brne .-4 ; 0x8f0 <lcd_pulse_enable+0xa>
+ 8f4: 00 00 nop
+ _delay_us(1);
+
+ lcd_expander_write(data & ~LCD_EN);
+ 8f6: 8c 2f mov r24, r28
+ 8f8: 8b 7f andi r24, 0xFB ; 251
+ 8fa: a7 d0 rcall .+334 ; 0xa4a <lcd_expander_write>
+ 8fc: 87 ec ldi r24, 0xC7 ; 199
+ 8fe: 90 e0 ldi r25, 0x00 ; 0
+ 900: 01 97 sbiw r24, 0x01 ; 1
+ 902: f1 f7 brne .-4 ; 0x900 <lcd_pulse_enable+0x1a>
+ 904: 00 c0 rjmp .+0 ; 0x906 <lcd_pulse_enable+0x20>
+ 906: 00 00 nop
+ _delay_us(50);
+}
+ 908: cf 91 pop r28
+ 90a: 08 95 ret
+
+Disassembly of section .text.lcd_write4:
+
+00000998 <lcd_write4>:
+
+static void lcd_write4(uint8_t nibble, uint8_t mode)
+{
+ 998: cf 93 push r28
+ uint8_t data = (nibble & 0xF0) | mode | LCD_BACKLIGHT;
+ 99a: 80 7f andi r24, 0xF0 ; 240
+ 99c: 68 2b or r22, r24
+ 99e: c6 2f mov r28, r22
+ 9a0: c8 60 ori r28, 0x08 ; 8
+
+ lcd_expander_write(data);
+ 9a2: 8c 2f mov r24, r28
+ 9a4: 52 d0 rcall .+164 ; 0xa4a <lcd_expander_write>
+ lcd_pulse_enable(data);
+ 9a6: 8c 2f mov r24, r28
+ 9a8: 9e df rcall .-196 ; 0x8e6 <lcd_pulse_enable>
+}
+ 9aa: cf 91 pop r28
+ 9ac: 08 95 ret
+
+Disassembly of section .text.lcd_send:
+
+00000964 <lcd_send>:
+
+static void lcd_send(uint8_t value, uint8_t mode)
+{
+ 964: cf 93 push r28
+ 966: df 93 push r29
+ 968: c8 2f mov r28, r24
+ 96a: d6 2f mov r29, r22
+ lcd_write4(value & 0xF0, mode);
+ 96c: 80 7f andi r24, 0xF0 ; 240
+ 96e: 14 d0 rcall .+40 ; 0x998 <lcd_write4>
+ lcd_write4((value << 4) & 0xF0, mode);
+ 970: 6d 2f mov r22, r29
+ 972: 8c 2f mov r24, r28
+ 974: 82 95 swap r24
+ 976: 80 7f andi r24, 0xF0 ; 240
+ 978: 0f d0 rcall .+30 ; 0x998 <lcd_write4>
+}
+ 97a: df 91 pop r29
+ 97c: cf 91 pop r28
+ 97e: 08 95 ret
+
+Disassembly of section .text.lcd_data:
+
+00000a54 <lcd_data>:
+ _delay_ms(2);
+}
+
+static void lcd_data(uint8_t data)
+{
+ lcd_send(data, LCD_RS);
+ a54: 61 e0 ldi r22, 0x01 ; 1
+ a56: 86 df rcall .-244 ; 0x964 <lcd_send>
+ a58: 08 95 ret
+
+Disassembly of section .text.lcd_putc:
+
+00000a5a <lcd_putc>:
+}
+
+static void lcd_putc(char c)
+{
+ lcd_data((uint8_t)c);
+ a5a: fc df rcall .-8 ; 0xa54 <lcd_data>
+ a5c: 08 95 ret
+
+Disassembly of section .text.lcd_print:
+
+000008bc <lcd_print>:
+}
+
+static void lcd_print(const char *str)
+{
+ 8bc: cf 92 push r12
+ 8be: df 92 push r13
+ 8c0: ef 92 push r14
+ 8c2: 6b 01 movw r12, r22
+ 8c4: e8 2e mov r14, r24
+ while (*str)
+ 8c6: 05 c0 rjmp .+10 ; 0x8d2 <lcd_print+0x16>
+ lcd_putc(*str++);
+ 8c8: 9f ef ldi r25, 0xFF ; 255
+ 8ca: c9 1a sub r12, r25
+ 8cc: d9 0a sbc r13, r25
+ 8ce: e9 0a sbc r14, r25
+ 8d0: c4 d0 rcall .+392 ; 0xa5a <lcd_putc>
+ lcd_data((uint8_t)c);
+}
+
+static void lcd_print(const char *str)
+{
+ while (*str)
+ 8d2: f6 01 movw r30, r12
+ 8d4: 84 91 lpm r24, Z
+ 8d6: e7 fc sbrc r14, 7
+ 8d8: 80 81 ld r24, Z
+ 8da: 81 11 cpse r24, r1
+ 8dc: f5 cf rjmp .-22 ; 0x8c8 <lcd_print+0xc>
+ lcd_putc(*str++);
+}
+ 8de: ef 90 pop r14
+ 8e0: df 90 pop r13
+ 8e2: cf 90 pop r12
+ 8e4: 08 95 ret
+
+Disassembly of section .text.lcd_print_uint:
+
+00000508 <lcd_print_uint>:
+
+static void lcd_print_uint(uint16_t value, uint8_t width)
+{
+ 508: 0f 93 push r16
+ 50a: 1f 93 push r17
+ 50c: cf 93 push r28
+ 50e: df 93 push r29
+ 510: 00 d0 rcall .+0 ; 0x512 <lcd_print_uint+0xa>
+ 512: 00 d0 rcall .+0 ; 0x514 <lcd_print_uint+0xc>
+ 514: 0f 92 push r0
+ 516: cd b7 in r28, 0x3d ; 61
+ 518: de b7 in r29, 0x3e ; 62
+ 51a: ac 01 movw r20, r24
+ 51c: 06 2f mov r16, r22
+ char digits[5];
+ uint8_t n = 0;
+ 51e: e0 e0 ldi r30, 0x00 ; 0
+
+ do {
+ digits[n++] = '0' + (value % 10);
+ 520: 11 e0 ldi r17, 0x01 ; 1
+ 522: 1e 0f add r17, r30
+ 524: 9a 01 movw r18, r20
+ 526: ad ec ldi r26, 0xCD ; 205
+ 528: bc ec ldi r27, 0xCC ; 204
+ 52a: 2a d2 rcall .+1108 ; 0x980 <__umulhisi3>
+ 52c: 96 95 lsr r25
+ 52e: 87 95 ror r24
+ 530: 96 95 lsr r25
+ 532: 87 95 ror r24
+ 534: 96 95 lsr r25
+ 536: 87 95 ror r24
+ 538: 9c 01 movw r18, r24
+ 53a: 22 0f add r18, r18
+ 53c: 33 1f adc r19, r19
+ 53e: 88 0f add r24, r24
+ 540: 99 1f adc r25, r25
+ 542: 88 0f add r24, r24
+ 544: 99 1f adc r25, r25
+ 546: 88 0f add r24, r24
+ 548: 99 1f adc r25, r25
+ 54a: 82 0f add r24, r18
+ 54c: 93 1f adc r25, r19
+ 54e: 9a 01 movw r18, r20
+ 550: 28 1b sub r18, r24
+ 552: 39 0b sbc r19, r25
+ 554: c9 01 movw r24, r18
+ 556: 21 e0 ldi r18, 0x01 ; 1
+ 558: 30 e0 ldi r19, 0x00 ; 0
+ 55a: 2c 0f add r18, r28
+ 55c: 3d 1f adc r19, r29
+ 55e: 2e 0f add r18, r30
+ 560: 31 1d adc r19, r1
+ 562: f9 01 movw r30, r18
+ 564: 80 5d subi r24, 0xD0 ; 208
+ 566: 80 83 st Z, r24
+ value /= 10;
+ 568: 9a 01 movw r18, r20
+ 56a: 0a d2 rcall .+1044 ; 0x980 <__umulhisi3>
+ 56c: ac 01 movw r20, r24
+ 56e: 56 95 lsr r21
+ 570: 47 95 ror r20
+ 572: 56 95 lsr r21
+ 574: 47 95 ror r20
+ 576: 56 95 lsr r21
+ 578: 47 95 ror r20
+ } while (value && n < 5);
+ 57a: 41 15 cp r20, r1
+ 57c: 51 05 cpc r21, r1
+ 57e: 39 f0 breq .+14 ; 0x58e <lcd_print_uint+0x86>
+{
+ char digits[5];
+ uint8_t n = 0;
+
+ do {
+ digits[n++] = '0' + (value % 10);
+ 580: e1 2f mov r30, r17
+ value /= 10;
+ } while (value && n < 5);
+ 582: 15 30 cpi r17, 0x05 ; 5
+ 584: 68 f2 brcs .-102 ; 0x520 <lcd_print_uint+0x18>
+ 586: 03 c0 rjmp .+6 ; 0x58e <lcd_print_uint+0x86>
+
+ while (n < width) {
+ lcd_putc(' ');
+ 588: 80 e2 ldi r24, 0x20 ; 32
+ 58a: 67 d2 rcall .+1230 ; 0xa5a <lcd_putc>
+ width--;
+ 58c: 01 50 subi r16, 0x01 ; 1
+ do {
+ digits[n++] = '0' + (value % 10);
+ value /= 10;
+ } while (value && n < 5);
+
+ while (n < width) {
+ 58e: 10 17 cp r17, r16
+ 590: d8 f3 brcs .-10 ; 0x588 <lcd_print_uint+0x80>
+ 592: 09 c0 rjmp .+18 ; 0x5a6 <lcd_print_uint+0x9e>
+ lcd_putc(' ');
+ width--;
+ }
+
+ while (n > 0)
+ lcd_putc(digits[--n]);
+ 594: 11 50 subi r17, 0x01 ; 1
+ 596: e1 e0 ldi r30, 0x01 ; 1
+ 598: f0 e0 ldi r31, 0x00 ; 0
+ 59a: ec 0f add r30, r28
+ 59c: fd 1f adc r31, r29
+ 59e: e1 0f add r30, r17
+ 5a0: f1 1d adc r31, r1
+ 5a2: 80 81 ld r24, Z
+ 5a4: 5a d2 rcall .+1204 ; 0xa5a <lcd_putc>
+ while (n < width) {
+ lcd_putc(' ');
+ width--;
+ }
+
+ while (n > 0)
+ 5a6: 11 11 cpse r17, r1
+ 5a8: f5 cf rjmp .-22 ; 0x594 <lcd_print_uint+0x8c>
+ lcd_putc(digits[--n]);
+}
+ 5aa: 0f 90 pop r0
+ 5ac: 0f 90 pop r0
+ 5ae: 0f 90 pop r0
+ 5b0: 0f 90 pop r0
+ 5b2: 0f 90 pop r0
+ 5b4: df 91 pop r29
+ 5b6: cf 91 pop r28
+ 5b8: 1f 91 pop r17
+ 5ba: 0f 91 pop r16
+ 5bc: 08 95 ret
+
+Disassembly of section .text.lcd_command:
+
+0000090c <lcd_command>:
+ lcd_write4(value & 0xF0, mode);
+ lcd_write4((value << 4) & 0xF0, mode);
+}
+
+static void lcd_command(uint8_t cmd)
+{
+ 90c: cf 93 push r28
+ 90e: c8 2f mov r28, r24
+ lcd_send(cmd, 0);
+ 910: 60 e0 ldi r22, 0x00 ; 0
+ 912: 28 d0 rcall .+80 ; 0x964 <lcd_send>
+
+ if (cmd == 0x01 || cmd == 0x02)
+ 914: c1 50 subi r28, 0x01 ; 1
+ 916: c2 30 cpi r28, 0x02 ; 2
+ 918: 30 f4 brcc .+12 ; 0x926 <lcd_command+0x1a>
+ #else
+ //round up by default
+ __ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
+ #endif
+
+ __builtin_avr_delay_cycles(__ticks_dc);
+ 91a: 8f e3 ldi r24, 0x3F ; 63
+ 91c: 9f e1 ldi r25, 0x1F ; 31
+ 91e: 01 97 sbiw r24, 0x01 ; 1
+ 920: f1 f7 brne .-4 ; 0x91e <lcd_command+0x12>
+ 922: 00 c0 rjmp .+0 ; 0x924 <lcd_command+0x18>
+ 924: 00 00 nop
+ _delay_ms(2);
+}
+ 926: cf 91 pop r28
+ 928: 08 95 ret
+
+Disassembly of section .text.lcd_goto:
+
+00000a26 <lcd_goto>:
+ lcd_command(0x01);
+}
+
+static void lcd_goto(uint8_t row, uint8_t col)
+{
+ uint8_t address = (row == 0) ? 0x00 : 0x40;
+ a26: 81 11 cpse r24, r1
+ a28: 80 e4 ldi r24, 0x40 ; 64
+ lcd_command(0x80 | (address + col));
+ a2a: 86 0f add r24, r22
+ a2c: 80 68 ori r24, 0x80 ; 128
+ a2e: 6e df rcall .-292 ; 0x90c <lcd_command>
+ a30: 08 95 ret
+
+Disassembly of section .text.lcd_init:
+
+0000076a <lcd_init>:
+ 76a: 2f ef ldi r18, 0xFF ; 255
+ 76c: 80 e7 ldi r24, 0x70 ; 112
+ 76e: 92 e0 ldi r25, 0x02 ; 2
+ 770: 21 50 subi r18, 0x01 ; 1
+ 772: 80 40 sbci r24, 0x00 ; 0
+ 774: 90 40 sbci r25, 0x00 ; 0
+ 776: e1 f7 brne .-8 ; 0x770 <lcd_init+0x6>
+ 778: 00 c0 rjmp .+0 ; 0x77a <lcd_init+0x10>
+ 77a: 00 00 nop
+static void lcd_init(void)
+{
+ _delay_ms(50);
+
+ // Standard HD44780 startup sequence
+ lcd_write4(0x30, 0);
+ 77c: 60 e0 ldi r22, 0x00 ; 0
+ 77e: 80 e3 ldi r24, 0x30 ; 48
+ 780: 0b d1 rcall .+534 ; 0x998 <lcd_write4>
+ 782: 8f e1 ldi r24, 0x1F ; 31
+ 784: 9e e4 ldi r25, 0x4E ; 78
+ 786: 01 97 sbiw r24, 0x01 ; 1
+ 788: f1 f7 brne .-4 ; 0x786 <lcd_init+0x1c>
+ 78a: 00 c0 rjmp .+0 ; 0x78c <lcd_init+0x22>
+ 78c: 00 00 nop
+ _delay_ms(5);
+
+ lcd_write4(0x30, 0);
+ 78e: 60 e0 ldi r22, 0x00 ; 0
+ 790: 80 e3 ldi r24, 0x30 ; 48
+ 792: 02 d1 rcall .+516 ; 0x998 <lcd_write4>
+ #else
+ //round up by default
+ __ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
+ #endif
+
+ __builtin_avr_delay_cycles(__ticks_dc);
+ 794: 87 e5 ldi r24, 0x57 ; 87
+ 796: 92 e0 ldi r25, 0x02 ; 2
+ 798: 01 97 sbiw r24, 0x01 ; 1
+ 79a: f1 f7 brne .-4 ; 0x798 <lcd_init+0x2e>
+ 79c: 00 c0 rjmp .+0 ; 0x79e <lcd_init+0x34>
+ 79e: 00 00 nop
+ _delay_us(150);
+
+ lcd_write4(0x30, 0);
+ 7a0: 60 e0 ldi r22, 0x00 ; 0
+ 7a2: 80 e3 ldi r24, 0x30 ; 48
+ 7a4: f9 d0 rcall .+498 ; 0x998 <lcd_write4>
+ 7a6: 87 e5 ldi r24, 0x57 ; 87
+ 7a8: 92 e0 ldi r25, 0x02 ; 2
+ 7aa: 01 97 sbiw r24, 0x01 ; 1
+ 7ac: f1 f7 brne .-4 ; 0x7aa <lcd_init+0x40>
+ 7ae: 00 c0 rjmp .+0 ; 0x7b0 <lcd_init+0x46>
+ 7b0: 00 00 nop
+ _delay_us(150);
+
+ lcd_write4(0x20, 0);
+ 7b2: 60 e0 ldi r22, 0x00 ; 0
+ 7b4: 80 e2 ldi r24, 0x20 ; 32
+ 7b6: f0 d0 rcall .+480 ; 0x998 <lcd_write4>
+ 7b8: 87 e5 ldi r24, 0x57 ; 87
+ 7ba: 92 e0 ldi r25, 0x02 ; 2
+ 7bc: 01 97 sbiw r24, 0x01 ; 1
+ 7be: f1 f7 brne .-4 ; 0x7bc <lcd_init+0x52>
+ 7c0: 00 c0 rjmp .+0 ; 0x7c2 <lcd_init+0x58>
+ 7c2: 00 00 nop
+ _delay_us(150);
+
+ lcd_command(0x28); // 4-bit mode, 2 lines
+ 7c4: 88 e2 ldi r24, 0x28 ; 40
+ 7c6: a2 d0 rcall .+324 ; 0x90c <lcd_command>
+ lcd_command(0x08); // Display off
+ 7c8: 88 e0 ldi r24, 0x08 ; 8
+ 7ca: a0 d0 rcall .+320 ; 0x90c <lcd_command>
+ lcd_command(0x01); // Clear display
+ 7cc: 81 e0 ldi r24, 0x01 ; 1
+ 7ce: 9e d0 rcall .+316 ; 0x90c <lcd_command>
+ lcd_command(0x06); // Increment cursor
+ 7d0: 86 e0 ldi r24, 0x06 ; 6
+ 7d2: 9c d0 rcall .+312 ; 0x90c <lcd_command>
+ lcd_command(0x0C); // Display on, cursor off
+ 7d4: 8c e0 ldi r24, 0x0C ; 12
+ 7d6: 9a d0 rcall .+308 ; 0x90c <lcd_command>
+ 7d8: 08 95 ret
+
+Disassembly of section .text.__vector_14:
+
+00000854 <__vector_14>:
+}
+
+volatile uint16_t adc_count = 0;
+
+ISR(TIMER0_COMPA_vect)
+{
+ 854: 1f 92 push r1
+ 856: 0f 92 push r0
+ 858: 0f b6 in r0, 0x3f ; 63
+ 85a: 0f 92 push r0
+ 85c: 11 24 eor r1, r1
+ 85e: 8f 93 push r24
+ 860: ef 93 push r30
+ 862: ff 93 push r31
+ if (!(ADCSRA & (1 << ADSC)) && !block_ready) {
+ 864: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7fe07a>
+ 868: 86 fd sbrc r24, 6
+ 86a: 09 c0 rjmp .+18 ; 0x87e <__vector_14+0x2a>
+ 86c: 80 91 04 03 lds r24, 0x0304 ; 0x800304 <block_ready>
+ 870: 81 11 cpse r24, r1
+ 872: 05 c0 rjmp .+10 ; 0x87e <__vector_14+0x2a>
+ ADCSRA |= (1 << ADSC);
+ 874: ea e7 ldi r30, 0x7A ; 122
+ 876: f0 e0 ldi r31, 0x00 ; 0
+ 878: 80 81 ld r24, Z
+ 87a: 80 64 ori r24, 0x40 ; 64
+ 87c: 80 83 st Z, r24
+ }
+}
+ 87e: ff 91 pop r31
+ 880: ef 91 pop r30
+ 882: 8f 91 pop r24
+ 884: 0f 90 pop r0
+ 886: 0f be out 0x3f, r0 ; 63
+ 888: 0f 90 pop r0
+ 88a: 1f 90 pop r1
+ 88c: 18 95 reti
+
+Disassembly of section .text.__vector_21:
+
+00000666 <__vector_21>:
+
+ISR(ADC_vect)
+{
+ 666: 1f 92 push r1
+ 668: 0f 92 push r0
+ 66a: 0f b6 in r0, 0x3f ; 63
+ 66c: 0f 92 push r0
+ 66e: 11 24 eor r1, r1
+ 670: 2f 93 push r18
+ 672: 3f 93 push r19
+ 674: 8f 93 push r24
+ 676: 9f 93 push r25
+ 678: ef 93 push r30
+ 67a: ff 93 push r31
+ adc_count++;
+ 67c: 80 91 00 03 lds r24, 0x0300 ; 0x800300 <adc_count>
+ 680: 90 91 01 03 lds r25, 0x0301 ; 0x800301 <adc_count+0x1>
+ 684: 01 96 adiw r24, 0x01 ; 1
+ 686: 90 93 01 03 sts 0x0301, r25 ; 0x800301 <adc_count+0x1>
+ 68a: 80 93 00 03 sts 0x0300, r24 ; 0x800300 <adc_count>
+
+ if (!block_ready) {
+ 68e: 80 91 04 03 lds r24, 0x0304 ; 0x800304 <block_ready>
+ 692: 81 11 cpse r24, r1
+ 694: 27 c0 rjmp .+78 ; 0x6e4 <__vector_21+0x7e>
+ uint16_t i = sample_index;
+ 696: 80 91 02 03 lds r24, 0x0302 ; 0x800302 <sample_index>
+ 69a: 90 91 03 03 lds r25, 0x0303 ; 0x800303 <sample_index+0x1>
+ samples[i] = ADC;
+ 69e: 20 91 78 00 lds r18, 0x0078 ; 0x800078 <__TEXT_REGION_LENGTH__+0x7fe078>
+ 6a2: 30 91 79 00 lds r19, 0x0079 ; 0x800079 <__TEXT_REGION_LENGTH__+0x7fe079>
+ 6a6: fc 01 movw r30, r24
+ 6a8: ee 0f add r30, r30
+ 6aa: ff 1f adc r31, r31
+ 6ac: e0 50 subi r30, 0x00 ; 0
+ 6ae: ff 4f sbci r31, 0xFF ; 255
+ 6b0: 31 83 std Z+1, r19 ; 0x01
+ 6b2: 20 83 st Z, r18
+ i++;
+ 6b4: 01 96 adiw r24, 0x01 ; 1
+
+ if (i >= N_SAMPLES) {
+ 6b6: 8f 3f cpi r24, 0xFF ; 255
+ 6b8: 91 05 cpc r25, r1
+ 6ba: 81 f0 breq .+32 ; 0x6dc <__vector_21+0x76>
+ 6bc: 78 f0 brcs .+30 ; 0x6dc <__vector_21+0x76>
+ sample_index = N_SAMPLES;
+ 6be: 80 e0 ldi r24, 0x00 ; 0
+ 6c0: 91 e0 ldi r25, 0x01 ; 1
+ 6c2: 90 93 03 03 sts 0x0303, r25 ; 0x800303 <sample_index+0x1>
+ 6c6: 80 93 02 03 sts 0x0302, r24 ; 0x800302 <sample_index>
+ block_ready = 1;
+ 6ca: 81 e0 ldi r24, 0x01 ; 1
+ 6cc: 80 93 04 03 sts 0x0304, r24 ; 0x800304 <block_ready>
+ TIMSK0 &= ~(1 << OCIE0A);
+ 6d0: ee e6 ldi r30, 0x6E ; 110
+ 6d2: f0 e0 ldi r31, 0x00 ; 0
+ 6d4: 80 81 ld r24, Z
+ 6d6: 8d 7f andi r24, 0xFD ; 253
+ 6d8: 80 83 st Z, r24
+ 6da: 04 c0 rjmp .+8 ; 0x6e4 <__vector_21+0x7e>
+ } else {
+ sample_index = i;
+ 6dc: 90 93 03 03 sts 0x0303, r25 ; 0x800303 <sample_index+0x1>
+ 6e0: 80 93 02 03 sts 0x0302, r24 ; 0x800302 <sample_index>
+ }
+ }
+}
+ 6e4: ff 91 pop r31
+ 6e6: ef 91 pop r30
+ 6e8: 9f 91 pop r25
+ 6ea: 8f 91 pop r24
+ 6ec: 3f 91 pop r19
+ 6ee: 2f 91 pop r18
+ 6f0: 0f 90 pop r0
+ 6f2: 0f be out 0x3f, r0 ; 63
+ 6f4: 0f 90 pop r0
+ 6f6: 1f 90 pop r1
+ 6f8: 18 95 reti
+
+Disassembly of section .text.main:
+
+000005be <main>:
+// ============================================================
+// Main
+// ============================================================
+
+int main(void)
+{
+ 5be: cf 93 push r28
+ 5c0: df 93 push r29
+ 5c2: 00 d0 rcall .+0 ; 0x5c4 <main+0x6>
+ 5c4: 00 d0 rcall .+0 ; 0x5c6 <main+0x8>
+ 5c6: cd b7 in r28, 0x3d ; 61
+ 5c8: de b7 in r29, 0x3e ; 62
+ uint16_t f1, f2;
+
+ i2c_init();
+ 5ca: 05 d2 rcall .+1034 ; 0x9d6 <i2c_init>
+ lcd_init();
+ 5cc: ce d0 rcall .+412 ; 0x76a <lcd_init>
+ adc_sampling_init();
+ 5ce: 05 d1 rcall .+522 ; 0x7da <adc_sampling_init>
+
+ sei();
+ 5d0: 78 94 sei
+
+ lcd_goto(0, 0);
+ 5d2: 60 e0 ldi r22, 0x00 ; 0
+ 5d4: 80 e0 ldi r24, 0x00 ; 0
+ 5d6: 27 d2 rcall .+1102 ; 0xa26 <lcd_goto>
+ lcd_print("Finding tones");
+ 5d8: 6c e0 ldi r22, 0x0C ; 12
+ 5da: 71 e0 ldi r23, 0x01 ; 1
+ 5dc: 80 e0 ldi r24, 0x00 ; 0
+ 5de: 6e d1 rcall .+732 ; 0x8bc <lcd_print>
+
+ while (1) {
+ if (block_ready) {
+ 5e0: 80 91 04 03 lds r24, 0x0304 ; 0x800304 <block_ready>
+ 5e4: 88 23 and r24, r24
+ 5e6: e1 f3 breq .-8 ; 0x5e0 <main+0x22>
+ // Analyze the collected samples
+ analyze_block(samples, &f1, &f2);
+ 5e8: ae 01 movw r20, r28
+ 5ea: 4d 5f subi r20, 0xFD ; 253
+ 5ec: 5f 4f sbci r21, 0xFF ; 255
+ 5ee: be 01 movw r22, r28
+ 5f0: 6f 5f subi r22, 0xFF ; 255
+ 5f2: 7f 4f sbci r23, 0xFF ; 255
+ 5f4: 80 e0 ldi r24, 0x00 ; 0
+ 5f6: 91 e0 ldi r25, 0x01 ; 1
+ 5f8: a4 dd rcall .-1208 ; 0x142 <analyze_block>
+
+ // Decode the keypad character
+ char key = decode_key(f1, f2);
+ 5fa: 6b 81 ldd r22, Y+3 ; 0x03
+ 5fc: 7c 81 ldd r23, Y+4 ; 0x04
+ 5fe: 89 81 ldd r24, Y+1 ; 0x01
+ 600: 9a 81 ldd r25, Y+2 ; 0x02
+ 602: 7b d0 rcall .+246 ; 0x6fa <decode_key>
+ 604: 18 2f mov r17, r24
+
+ // Display the detected character when a valid pair is found
+ if (key != '\0') {
+ 606: 88 23 and r24, r24
+ 608: 69 f0 breq .+26 ; 0x624 <main+0x66>
+ lcd_goto(0, 0);
+ 60a: 60 e0 ldi r22, 0x00 ; 0
+ 60c: 80 e0 ldi r24, 0x00 ; 0
+ 60e: 0b d2 rcall .+1046 ; 0xa26 <lcd_goto>
+ lcd_print("Key: ");
+ 610: 6a e1 ldi r22, 0x1A ; 26
+ 612: 71 e0 ldi r23, 0x01 ; 1
+ 614: 80 e0 ldi r24, 0x00 ; 0
+ 616: 52 d1 rcall .+676 ; 0x8bc <lcd_print>
+ lcd_putc(key);
+ 618: 81 2f mov r24, r17
+ 61a: 1f d2 rcall .+1086 ; 0xa5a <lcd_putc>
+ lcd_print(" ");
+ 61c: 60 e2 ldi r22, 0x20 ; 32
+ 61e: 71 e0 ldi r23, 0x01 ; 1
+ 620: 80 e0 ldi r24, 0x00 ; 0
+ 622: 4c d1 rcall .+664 ; 0x8bc <lcd_print>
+ }
+
+ // Show detected frequencies for debugging
+ lcd_goto(1, 0);
+ 624: 60 e0 ldi r22, 0x00 ; 0
+ 626: 81 e0 ldi r24, 0x01 ; 1
+ 628: fe d1 rcall .+1020 ; 0xa26 <lcd_goto>
+ lcd_print("F1:");
+ 62a: 6c e2 ldi r22, 0x2C ; 44
+ 62c: 71 e0 ldi r23, 0x01 ; 1
+ 62e: 80 e0 ldi r24, 0x00 ; 0
+ 630: 45 d1 rcall .+650 ; 0x8bc <lcd_print>
+ lcd_print_uint(f1, 4);
+ 632: 64 e0 ldi r22, 0x04 ; 4
+ 634: 89 81 ldd r24, Y+1 ; 0x01
+ 636: 9a 81 ldd r25, Y+2 ; 0x02
+ 638: 67 df rcall .-306 ; 0x508 <lcd_print_uint>
+ lcd_print(" F2:");
+ 63a: 60 e3 ldi r22, 0x30 ; 48
+ 63c: 71 e0 ldi r23, 0x01 ; 1
+ 63e: 80 e0 ldi r24, 0x00 ; 0
+ 640: 3d d1 rcall .+634 ; 0x8bc <lcd_print>
+ lcd_print_uint(f2, 4);
+ 642: 64 e0 ldi r22, 0x04 ; 4
+ 644: 8b 81 ldd r24, Y+3 ; 0x03
+ 646: 9c 81 ldd r25, Y+4 ; 0x04
+ 648: 5f df rcall .-322 ; 0x508 <lcd_print_uint>
+
+ // Restart sampling atomically
+ cli();
+ 64a: f8 94 cli
+
+ sample_index = 0;
+ 64c: 10 92 03 03 sts 0x0303, r1 ; 0x800303 <sample_index+0x1>
+ 650: 10 92 02 03 sts 0x0302, r1 ; 0x800302 <sample_index>
+ block_ready = 0;
+ 654: 10 92 04 03 sts 0x0304, r1 ; 0x800304 <block_ready>
+ TIMSK0 |= (1 << OCIE0A);
+ 658: ee e6 ldi r30, 0x6E ; 110
+ 65a: f0 e0 ldi r31, 0x00 ; 0
+ 65c: 80 81 ld r24, Z
+ 65e: 82 60 ori r24, 0x02 ; 2
+ 660: 80 83 st Z, r24
+
+ sei();
+ 662: 78 94 sei
+ 664: bd cf rjmp .-134 ; 0x5e0 <main+0x22>
+
+Disassembly of section .text.libgcc.mul:
+
+0000092a <__mulsi3>:
+ 92a: db 01 movw r26, r22
+ 92c: 8f 93 push r24
+ 92e: 9f 93 push r25
+ 930: 48 d0 rcall .+144 ; 0x9c2 <__muluhisi3>
+ 932: bf 91 pop r27
+ 934: af 91 pop r26
+ 936: a2 9f mul r26, r18
+ 938: 80 0d add r24, r0
+ 93a: 91 1d adc r25, r1
+ 93c: a3 9f mul r26, r19
+ 93e: 90 0d add r25, r0
+ 940: b2 9f mul r27, r18
+ 942: 90 0d add r25, r0
+ 944: 11 24 eor r1, r1
+ 946: 08 95 ret
+
+Disassembly of section .text.libgcc.mul:
+
+00000980 <__umulhisi3>:
+ 980: a2 9f mul r26, r18
+ 982: b0 01 movw r22, r0
+ 984: b3 9f mul r27, r19
+ 986: c0 01 movw r24, r0
+ 988: a3 9f mul r26, r19
+ 98a: 01 d0 rcall .+2 ; 0x98e <__umulhisi3+0xe>
+ 98c: b2 9f mul r27, r18
+ 98e: 70 0d add r23, r0
+ 990: 81 1d adc r24, r1
+ 992: 11 24 eor r1, r1
+ 994: 91 1d adc r25, r1
+ 996: 08 95 ret
+
+Disassembly of section .text.libgcc.mul:
+
+00000a32 <__usmulhisi3>:
+ a32: a6 df rcall .-180 ; 0x980 <__umulhisi3>
+
+00000a34 <__usmulhisi3_tail>:
+ a34: b7 ff sbrs r27, 7
+ a36: 08 95 ret
+ a38: 82 1b sub r24, r18
+ a3a: 93 0b sbc r25, r19
+ a3c: 08 95 ret
+
+Disassembly of section .text.libgcc.mul:
+
+000009c2 <__muluhisi3>:
+ 9c2: de df rcall .-68 ; 0x980 <__umulhisi3>
+ 9c4: a5 9f mul r26, r21
+ 9c6: 90 0d add r25, r0
+ 9c8: b4 9f mul r27, r20
+ 9ca: 90 0d add r25, r0
+ 9cc: a4 9f mul r26, r20
+ 9ce: 80 0d add r24, r0
+ 9d0: 91 1d adc r25, r1
+ 9d2: 11 24 eor r1, r1
+ 9d4: 08 95 ret
+
+Disassembly of section .text.libgcc.mul:
+
+00000a3e <__mulshisi3>:
+ a3e: b7 ff sbrs r27, 7
+ a40: c0 cf rjmp .-128 ; 0x9c2 <__muluhisi3>
+
+00000a42 <__mulohisi3>:
+ a42: bf df rcall .-130 ; 0x9c2 <__muluhisi3>
+ a44: 82 1b sub r24, r18
+ a46: 93 0b sbc r25, r19
+ a48: 08 95 ret
+
+Disassembly of section .text.libgcc:
+
+00000a08 <__xload_2>:
+ a08: 57 fd sbrc r21, 7
+ a0a: 03 c0 rjmp .+6 ; 0xa12 <__xload_2+0xa>
+ a0c: 65 91 lpm r22, Z+
+ a0e: 75 91 lpm r23, Z+
+ a10: 08 95 ret
+ a12: 61 91 ld r22, Z+
+ a14: 71 91 ld r23, Z+
+ a16: 08 95 ret
+
+Disassembly of section .text.__dummy_fini:
+
+00000a60 <_fini>:
+ a60: 08 95 ret
+
+Disassembly of section .text.__dummy_funcs_on_exit:
+
+00000a62 <__funcs_on_exit>:
+ a62: 08 95 ret
+
+Disassembly of section .text.__dummy_simulator_exit:
+
+00000a64 <__simulator_exit>:
+ a64: 08 95 ret
+
+Disassembly of section .text.exit:
+
+00000a18 <exit>:
+ a18: ec 01 movw r28, r24
+ a1a: 23 d0 rcall .+70 ; 0xa62 <__funcs_on_exit>
+ a1c: 21 d0 rcall .+66 ; 0xa60 <_fini>
+ a1e: ce 01 movw r24, r28
+ a20: 21 d0 rcall .+66 ; 0xa64 <__simulator_exit>
+ a22: ce 01 movw r24, r28
+ a24: 20 d0 rcall .+64 ; 0xa66 <_Exit>
+
+Disassembly of section .text._Exit:
+
+00000a66 <_Exit>:
+ a66: 0f db rcall .-2530 ; 0x86 <_exit>